您的位置:首页 > 其它

高通平台工作总结(二)

2016-02-16 20:08 459 查看
1. 修改I2C_4的驱动能力解决I2C通信不稳定问题。

由于I2C_4的通信不稳定导致SMB1360充电功能不正常,

解决方案是修改文件msm8916-pinctrl.dtsi 中代码:

i2c_4_active: i2c_4_active {

drive-strength = <4>;/* 4 MA */

bias-disable = <0>;/* No PULL */

};

把驱动电流改成4mA, 基本可以解决I2C通信不稳定问题。

2. 功耗相关NV项:

1027 = 0

1895 = 0

1892 = 0

1962 = 0

4679 = 16

4201 = 0

3851 = 0

3852 = 6

7157 = 1

69745 rxd_enable = 0

3. 修改系统默认时间,现在默认时间是1970-1-1, 可以改成别的时间,比如:2010-1-1

修改内核代码中文件 Rtc-lib.c 中的函数 rtc_time_to_tm ,把1970改成2010即可。

8916平台的内核rtc控制文件为 qpnp-rtc.c

4. 解决项目P9388睡眠底电流过大问题。

测试发现睡眠时底电流有9.3mA,跟踪发现系统睡眠时陀螺仪没有进入睡眠模式,

即函数 mpu3050_suspend 没有调用 mpu3050_set_power_mode 进入睡眠模式,

修改函数 mpu3050_suspend, 屏蔽掉语句if (sensor->enable) ,

调用 mpu3050_set_power_mode(client, 0); 让陀螺仪进入睡眠,

底电流可以达到3mA以下。

5. 解决接近传感器睡眠唤醒后不能工作问题。

跟踪代码发现这个问题跟接近传感器tmd2772驱动的suspend/resume的电源控制有关,

原代码并没有实现电源控制的代码,需要在睡眠/唤醒函数 taos_suspend/taos_resume 加上disable/enable vreg_l17的代码。

调用的核心函数为:regulator_disable(data->vdd); regulator_enable(data->vdd);

在resume函数里面还需要调用函数 flush_regs 来恢复 tmd2772 到初始状态。

6. 在内核里面测试一个函数的调用时间。

(1). 先在函数的开头调用 ktime_t starttime = ktime_get(); 得到开始时间。

(2). 在函数的末尾再调用函数 calltime = ktime_get(); 得到结束时间。

(3). 调用函数 ktime_sub(calltime, starttime) 得到时间差。

(4). 用函数 ktime_to_ns 把时间差的单位转成nS级别。

(5). 再用函数 do_div(usecs64, NSEC_PER_USEC); 转成微秒级。

(6). 调用printk打印时间。具体的可以参考函数 dpm_show_time

(7). 完整的例子代码:

ktime_t starttime;

ktime_t endtime;

u64 usecs64;

int usecs;

starttime = ktime_get();

//you call your function here

...

endtime = ktime_get();

usecs64 = ktime_to_ns(ktime_sub(endtime, starttime));

do_div(usecs64, NSEC_PER_USEC);

usecs = usecs64;

if (usecs == 0)

usecs = 1;

printk("%s: after %ld.%03ld msecs\n", __FUNCTION__, usecs / USEC_PER_MSEC, usecs % USEC_PER_MSEC);

7. 把函数改为宏定义,并在宏定义中打印文件名,函数名及行数,

可以确定函数是在哪个文件,函数中调用。

比如把函数 dpm_resume 原来定义的函数名改为 _dpm_resume,

然后在声明的文件 pm.h 中 把声明函数也改为 _dpm_resume,

并且在这个文件中定义宏 #define dpm_resume(state)do{printk("file = %s, func = %s, line = %d\n", __FILE__, __FUNCTION__, __LINE__); _dpm_resume(state);}while(0)

通过打印的LOG就可以确定是在 main.c 的函数 dpm_resume_end 的 866 行调用了这个函数。

8. 按20点所说的方法定位到内核睡眠/唤醒的调用函数为:

state_store->pm_suspend(/kernel/kernel/power/suspend.c)->enter_state->suspend_devices_and_enter->dpm_resume_end->dpm_resume->device_resume

睡眠函数调用流程:

(1). suspend_devices_and_enter (kernel/kernel/power/suspend.c)

(2). suspend_enter (kernel/kernel/power/suspend.c)

(3). error = suspend_ops->enter(state); (suspend_ops-->lpm_suspend_ops)

(4). lpm_suspend_enter (kernel/drivers/cpuidle/lpm_levels.c)

(5). lpm_enter_low_power (kernel/drivers/cpuidle/lpm_levels.c)

(6). msm_cpu_pm_enter_sleep (kernel/drivers/power/qcom/msm-pm.c)

(7). exit_stat = execute[mode](from_idle); (mode=3, execute[mode]=msm_pm_power_collapse)

(8). msm_pm_power_collapse (kernel/drivers/power/qcom/msm-pm.c)

(9). msm_pm_spm_power_collapse (kernel/drivers/power/qcom/msm-pm.c)

(10). cpu_suspend (kernel/arch/arm/kernel/suspend.c)

(11). __cpu_suspend (kernel/arch/arm/kernel/sleep.s)

9. 恢复某个文件的老的版本,比如恢复文件 frameworks/base/api/current.txt 的 744 版本。

(1). cd msm8916/branches/LA1.1-CS-r113502.2/LINUX/android/frameworks/base

(2). svn co -r 744 svn+ssh://10.20.30.18/svn-repos/msm8916/branches/LA1.1-CS-r113502.2/LINUX/android/frameworks/base/api

10. 改变USB组合配置,使手机能用DIAG口抓QXDM LOG

1. 登陆ADB

adb shell

su

2. 修改USB配置属性

setprop persist.sys.usb.config mtp,diag,adb

需要组合值需要参考文件 init.qcom.usb.rc, 需要找到这个文件里面定义的值。

11. 设置虚拟电池电量, 比如设置90%的电量

修改文件 init.qcom.post_boot.sh,加上这行代码:

echo 90 > /sys/module/qpnp_bms/parameters/bms_fake_battery

12. 在应用层修改代码调整重力传感器的工作频率。

修改文件 SensorManager.java中的方法 getDelay, 一般用的是 SENSOR_DELAY_UI 对应的值。

13. 控制背光API接口调用流程:

LightsService(LightsService.java) ---> setBrightness(JAVA api 方法) ---> setLightLocked(JAVA api 方法)

---> setLight_native(JNI 接口) ---> set_light(HAL 层接口) ---> set_light_backlight(HAL 层接口)

---> write_int(LCD_FILE, brightness);(打开文件 /sys/class/leds/lcd-backlight/brightness,写相应的值)

14. 修改电池参数配置,使项目能显示线性充电的电量百分比.

(1). 修改项目的配置dtsi文件,加上battery-data, 比如hy506项目的文件 msm8916-qrd-506.dtsi, 加上代码:

/ {

hy506_batterydata: qcom,battery-data {

qcom,rpull-up-kohm = <100>;

qcom,vref-batt-therm = <1800000>;

#include "batterydata-hy506-4v2-2000mah.dtsi"

};

};

(2). 修改项目 dts 文件,比如 msm8916-qrd-506.dts 在 pm8916_bms 里面加上 battery-data, 代码如下:

&pm8916_bms {

status = "ok";

qcom,force-bms-active-on-charger;

qcom,battery-data = <&hy506_batterydata>;

};

15. 用SVN查看版本1到版本2之间的修改的文件.

svn log -r v1:v2 -v

比如查看 r867 到 r1152之间的修改:

svn log -r 867:1152 -v
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: