LCD Backlight 的分析

LCD Backlight 的分析,第1张

概述一、backlight cannot work (STE Riogrande Platform) 1. ADB Command: /sys/class/leds/lcd-backlight/brightness ,实际路径/sys/devices/i2c-0/2-0040/leds/lcd-backlight     echo 0 > brightness \n     echo 100 >bri 一、backlight cannot work (STE Riogrande Platform)
1. ADB Command: /sys/class/leds/lcd-backlight/brightness,实际路径/sys/devices/i2c-0/2-0040/leds/lcd-backlight
echo 0 > brightness \n
echo 100 >brightness
cat brightness
2. Check system/core/rootdir/init.rc 关于lcd-backlight的权限是否设置正确
3. Check LCD_BACKliGHT driver: /kernel/drivers/leds/leds-as3677.c (wrong: ./drivers/leds/leds-lm3530.c,和./arch/arm/mach-ux500/leds-lotus.c)
4. Check PDP schematic(Circuit_Diagram_1243-3693_4_2.pdf),LCD backlight 的供电 BMU_DCDC_OUT,发现 Keypad_backlight和LCD backlight共用 一路电源,而实际Lotus的硬件设计是没有Keypad_backlight的,估计会彼此有影响。导致LCD backlight的控制不正常。
5. Check /kernel/arch/arm/configs/semc_lotus_defconfig,定义了 CONfig_LEDS_AS3677
6. Check /kernel/drivers/leds/leds-as3677.c,LCD backlight电源供电芯片 的驱动
7. Check lightsensor 初始的设置,./device/semc/riogrande_pdp/files/hw_config.sh,hw_config.sh 设置了部分硬件设备的初始状态。 hw_config.sh会在projectname.mk中拷贝到system/etc,然后在init进程中分析执行init.semc.rc,从而完成硬件的初始化
8. Check lightseneor 是否调整为自动背光,用ADB 查看/sys/devices/i2c-0/0-0040/leds/lcd-backlight/als/enable (mogami平台),/sys/devices/platform/nmk-i2c.2/i2c-2/2-0040/(Rio Grande平台)
[
开机阶段 外围硬件参数设置: 只是针对mogami平台
1). mogami.mk 中如下设置把 文件拷贝到system
PRODUCT_copY_fileS += \
device/semc/$(TARGET_PRODUCT)/files/hw_config.sh:system/etc/hw_config.sh \
device/semc/$(TARGET_PRODUCT)/files/pre_hw_config.sh:system/etc/pre_hw_config.sh

2). init.mogami.rc中 启动设置/dev/block/vold/179:33 /mnt/usbdisk vfat rw,
service hw_config /system/bin/sh /system/etc/hw_config.sh
user root
oneshot
]
9. ADB /dev/block,/proc/partitions,/proc/mounts,df 可查看分块信息
10. 用 adb root 首先获取adb root权限(root权限重新启动 adb的守护进程),然后就可以adb remount,从而可以自由 *** 作系统文件了。
11. AndroID 不同partition 之间不能 移动文件,会出现Cross-device link错误, 比较好的方法是通过 /sdcard 来中转移动。
12.每天代码更新编译连接
http://androID-ci-platform.sonyeriCSSon.net/vIEw/CM/job/daily_build_ginger-ste-dev/379/artifact/result-dir/
13.更新s1boot 和重新创建 ta,重新flash,手机可以启动了,但system crash.
14.修改AS3677 chip(LCD backlight的供电),设置固定的curr1或curr6回路。
15. 修改 待机时间 frameworks/base/services/java/com/androID/server/PowerManagerService.java
private static final int DEFAulT_SCREEN_OFF_TIMEOUT = 15000;
然后查找DEFAulT_SCREEN_OFF_TIMEOUT ,系统读取该值得地方,直接赋值即可; 实际上所有setting的default value都保存在frameworks/base/packages/SettingsProvIDer/res/values/defaults.xml
另外还可以直接修改其数据库文件,如下
adb shell
cd /data/data/com.androID.provIDers.settings/databases
sqlite3 settings.db
select * from system where name = 'screen_off_timeout';//; 很重要,必须有
update system set value='-1' where name='screen_off_timeout';
或者 sqlite3 /data/data/com.androID.provIDers.settings/databases/settings.db "UPDATE system SET value='-1' WHERE name = 'screen_off_timeout'";
sqlite3 /data/data/com.androID.provIDers.settings/databases/settings.db "SELECT * FROM system WHERE name = 'screen_off_timeout'";
对其数据库 *** 作的代码位于/frameworks/base/packages/settingprovIDer/src/com/androID/provIDers/settings/databasehelper.java;
17. [JAVA APP层] 位于/packages/apps/Settings/src/com/androID/settings,其中BrightnessPreference.java 有函数setBrightness(int brightness)-->power.setBacklightBrightness(brightness);
18. [JAVA Framework层 ManagerService]frameworks/base/services/java/com/androID/server/PowerManagerService.java,中有函数setBacklightBrightness-->mLcdlight.setBrightness(brightness); mLcdlight会在init()函数中赋值mLcdlight = lights.getlight(lightsService.liGHT_ID_BACKliGHT);
19. [JAVA Framework层Service] framework/base/services/java/com/androID/server/lightsservice.java 中( lightsService.light).setBrightness-->setlightLocked-->setlight_native
20. [JAVA Framework层Native] frameworks/base/services/jni/com_androID_server_lightsservice.cpp 中有init_native--> hw_get_module(liGHTS_HARDWARE_MODulE_ID,(hw_module_t const**)&module)-->load(ID,path,module);其中path指向lights.st-eriCSSon.so;和setlight_native
21. [HAL 层]/vendor/semc/harDWare/lights/lights_core.c; 中函数leds_core_init-->get_link_table
22. [HAL 层]/vendor/semc/harDWare/lights/hw/as3677.c中有as3677_set函数-->set_simple-->write_int
23. [HAL 层]/vendor/semc/harDWare/lights/utils.c中有函数write_int-->write_str-->write_to_path-->write
24. [HAL 层]/vendor/semc/harDWare/lights/illumination_service.c; 会被编译成BUILD_EXECUtable,可执行程序会最终放在 手机/system/bin/illumination_service; 利用init.st-eriCSSon.rc 中service illumination /system/bin/illumination_service 启动,其中的main函数会一直读取文件 #define soc_path "/data/lightservice.soc"的内容,通过该读写文件进行数据传递
25. [HAL 层]/vendor/semc/harDWare/lights/lights_module.c; 中函数open_lights会设置好set_light(该函数会向文件/data/lightservice.soc 写入内容)
26. [HAL 层]在vendor/semc/harDWare/lights/AndroID.mk中,有Build HW lib module部分,把lights_module.c编译成LOCAL_MODulE := $(SEMC_CFG_liGHTS_MODulE_name),其中SEMC_CFG_liGHTS_MODulE_name在device/semc/lotus/lotus_cfg.mk中定义为SEMC_CFG_liGHTS_MODulE_name := lights.st-eriCSSon,所以最后Build 的HW lib module 位于手机/system/lib/hw/lights.st-eriCSSon.so;
27. [HAL 层]HAL 是如何被调用的 harDWare/libharDWare/include/harDWare/harDWare.h [中注释 Every harDWare module must have a data structure named HAL_MODulE_INFO_SYM and the fIElds of this data structure must begin with hw_module_t],还定义了#define HAL_MODulE_INFO_SYM HMI
28. [HAL 层]harDWare/libharDWare/harDWare.c中有函数hw_get_module(const char *ID,const struct hw_module_t **module),负责得到对应的硬件模块,其中 ID 是关键,通过ID 会找到对应的hw module,例如 backlight 的ID 是#define liGHTS_HARDWARE_MODulE_ID "lights" 在/harDWare/libharDWare/include/harDWare/lights.h被定义,hw_get_module函数会在com_androID_server_lightservice.cpp中调用
29. [HAL 层]/device/semc/lotus/lights/leds.c 中as3677_led as3677_lcd,并且定义了关联到"/sys/bus/i2c/drivers/as3677/2-0040",还关联了as3677_set函数, 这些都靠get_link_table 初始化
30. [Kernel 层]关于backlight的kernel driver在 kernel/drivers/leds/leds-as3677.c --> as3677_set_led_brightness 和led-class.c-->led_class_attrs[]
31. User Space如何调用到kernel Space,比如 *** 作 /sys/class/leds/lcd-backlight/brightness,用户空间可以直接写入该文件值,然后产生系统调用的软中断(0x80)exception: ret_fast_syscall(asm)->sys_write->vfs_write->sysfs_write_file->dev_attr_store->led_brightness_store->as3677_set_led_brightness

二、Backlight 的ASL不起作用,基于ICS版本-->LCD 亮度不够(STE Riogrande Platform) 1. 查看 寄存器的值 /sys/class/leds/lcd-backlight/device/deBUG,ALS_control的寄存器值没有变化(0x01,表示打开ALS)。 2. 用I2C工具,读写通过I2C *** 作的寄存器 a. ls /sys/class/leds/lcd-backlight/device/driver,查看到2-0040 (I2C Bus-addRSS) b. adb push i2ctest /system/bin; #chmod 777 /system/bin/i2ctest c. #i2ctest -b 2 -a 0x40 -w 0x94 0x00 ;disable ALS,d. #i2ctest -b 2 -a 0x40 -w 0x94 0x01 ;enable ALS,e. check ALS_control的值,#cat /sys/class/leds/lcd-backlight/device/deBUG 3. [HAL 层]updated@device/semc/lotus/lights/leds.c 该函数会设置als_group,正常逻辑应该是 当设置als功能时才需要设置als_group. 变量static struct as367x_light_curve lcb_bl_curves 定义了不同的亮度区间对应设置不同的als_group参数。 update-->as3677_set_light_curve-->写入/sys/bus/i2c/drivers/as3677/2-0040/als_group1-->[Kernel 层]as3677_als_group_n_store@kernel/drivers/leds/leds-as3677.c; 4. 在as3677_platform_data as3677_pdata@/kernel/arch/arm/maNone - no ambIEnt light sensor controlch-ux500/leds-lotus.c 中设置了背光限流 5. 测试 关掉ALS功能-->ALS_curr12_group 94: 0x00(None - no ambIEnt light sensor control);可以改变LCD的背光-->设置Curr1_current 09: 0xff的值[0x0,0xff],从Lotus的schematic可以看到LCD的backlight电源用的是curr1 这一路cathode。 6. 在手机上 /sys/bus/i2c/drivers/as3677/2-0040 下可以获取当前Backlight的状态,如 als_on,als_group1等;路径/sys/bus/i2c/drivers/as3677/2-0040/leds/lcd-backlight 是user space *** 作驱动的sys fs. 7. 谁调用的update@device/semc/lotus/lights/leds.c? 首先set_led@vendor/semc/harDWare/lights/lights_core.c这个函数会在main@vendor/semc/harDWare/lights/illumination_service.c,然后在vendor/semc/harDWare/lights/lights_core.c中函数set_led->set_led_locked或led_set_theme->led_set_state->apply_swled_state???->set_swled_interfaces[ight_state_t const *state转化成hw_st->brightness]->set_intf_state->set_hw_state->hwled_updated->set_hw_led->API->updated[update@device/semc/lotus/lights/leds.c] 然后执行API->set[as3677_set@vendor/semc/harDWare/lights/hw/as3677.c] ;

总结

以上是内存溢出为你收集整理的LCD Backlight 的分析全部内容,希望文章能够帮你解决LCD Backlight 的分析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1175585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存