Android屏幕背光调整机制

http://blog.youkuaiyun.com/a345017062/article/details/6420239

扩展一个硬件(比如LED、蓝牙、传感器等),至少需要硬件、驱动、驱动交互模块。至于系统的层面如何把系统库加入自己的体系里面去,就是操作系统自己的事了。这里分析一下以背光调整为例Android。

 

源码在这里:http://code.google.com/p/flying-on-android/

 

 

要调整背光,第一步是搜索并加载驱动交互模块(一个.so库),然后打开设备。看一下这个函数:

  1. void openDevice() {  
  2. hw_module_t* module;  
  3. int err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID,  
  4. (hw_module_t const**) &module);  
  5. assert(!err);  
  6. hw_device_t* device;  
  7. err = module->methods->open(module, LIGHT_ID_BACKLIGHT, &device);  
  8. assert(!err);  
  9. light = (light_device_t*) device;  
  10. }  
 

 

方法中的hw_get_module函数来自libhardware库,它会根据要加载的模块名字(这里是一个宏定义LIGHTS_HARDWARE_MODULE_ID,宏定义的值是"backlight"),去搜索lights.xxx.so,找到之后把这个.so加载到内存中,并把其中包含的模块信息填充进hw_module_t结构体。

 

Android中与传感器、LED、GPS、ALSA、GRALLOC等硬件交互的.so库都在/system/lib/hw目录下面,搜索是在这个目录下面进行的。lights.xxx.so中的xxx一般代表板子的型号,依次取"ro.hardware","ro.product.board","ro.board.platform","ro.arch"这几个系统属性中的一个。比如,在msm7k平台就是lights.msm7k.so。如果搜索不到,最后就会尝试加载lights.default.so。

 

模块加载完毕后,再知道一个设备名字,就可以打开这个设备了。具体打开设备的代码是:

module->methods->open(module, LIGHT_ID_BACKLIGHT, &device);

 

这样,得到device句柄之后,我们就可以操作这个设备了。

 

Android在应用层中调整背光时只需要一个值,就是brightness,系统会把这个值转化成一个R、G、B值相同的颜色值。看下面的代码:

  1. void setLight(int brightness) {  
  2. //亮度转化成RGB值,R、G、B的值始终相同。  
  3. int color = brightness & 0x000000ff;  
  4. color = 0xff000000 | (color << 16) | (color << 8) | color;  
  5. setLight(color, 0, 0, 0, 0);  
  6. }  
 

最后,把这个颜色值写入驱动:

  1. void setLight(int colorARGB, int flashMode, int onMS, int offMS,  
  2. int brightnessMode) {  
  3. light_state_t state;  
  4. memset(&state, 0, sizeof(light_state_t));  
  5. state.color = colorARGB;  
  6. state.flashMode = flashMode;  
  7. state.flashOnMS = onMS;  
  8. state.flashOffMS = offMS;  
  9. state.brightnessMode = brightnessMode;  
  10. light->set_light(light, &state);  
  11. }  
 

至于set_light方法,可以看一下/hardware/msm7k/liblights/lights.c中的set_light_backlight方法,这个方法就是把一个颜色值写进了文件/sys/class/leds/lcd-backlight/brightness。一个简单的字符设备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值