Android屏幕背光调整机制
2013-06-26 22:58
429 查看
扩展一个硬件(比如LED、蓝牙、传感器等),至少需要硬件、驱动、驱动交互模块。至于系统的层面如何把系统库加入自己的体系里面去,就是操作系统自己的事了。这里分析一下以背光调整为例Android。
源码在这里:
flying_2011.6.211.zip
(14.47 KB, 下载次数: 35)
2011-8-26 14:28 上传
点击文件名下载附件
下载积分: 下载豆 -2
要调整背光,第一步是搜索并加载驱动交互模块(一个.so库),然后打开设备。看一下这个函数:
void openDevice() {
hw_module_t* module;
int err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID,
(hw_module_t const**) &module);
assert(!err);
hw_device_t* device;
err = module->methods->open(module, LIGHT_ID_BACKLIGHT, &device);
assert(!err);
light = (light_device_t*) device;
}
复制代码
方法中的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值相同的颜色值。看下面的代码:
void setLight(int brightness) {
//亮度转化成RGB值,R、G、B的值始终相同。
int color = brightness & 0x000000ff;
color = 0xff000000 | (color << 16) | (color << 8) | color;
setLight(color, 0, 0, 0, 0);
}
复制代码
最后,把这个颜色值写入驱动:
void setLight(int colorARGB, int flashMode, int onMS, int offMS,
int brightnessMode) {
light_state_t state;
memset(&state, 0, sizeof(light_state_t));
state.color = colorARGB;
state.flashMode = flashMode;
state.flashOnMS = onMS;
state.flashOffMS = offMS;
state.brightnessMode = brightnessMode;
light->set_light(light, &state);
}
复制代码
至于set_light方法,可以看一下/hardware/msm7k/liblights/lights.c中的 set_light_backlight方法,这个方法就是把一个颜色值写进了文件/sys/class/leds/lcd-backlight /brightness。一个简单的字符设备。
源码在这里:
flying_2011.6.211.zip
(14.47 KB, 下载次数: 35)
2011-8-26 14:28 上传
点击文件名下载附件
下载积分: 下载豆 -2
要调整背光,第一步是搜索并加载驱动交互模块(一个.so库),然后打开设备。看一下这个函数:
void openDevice() {
hw_module_t* module;
int err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID,
(hw_module_t const**) &module);
assert(!err);
hw_device_t* device;
err = module->methods->open(module, LIGHT_ID_BACKLIGHT, &device);
assert(!err);
light = (light_device_t*) device;
}
复制代码
方法中的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值相同的颜色值。看下面的代码:
void setLight(int brightness) {
//亮度转化成RGB值,R、G、B的值始终相同。
int color = brightness & 0x000000ff;
color = 0xff000000 | (color << 16) | (color << 8) | color;
setLight(color, 0, 0, 0, 0);
}
复制代码
最后,把这个颜色值写入驱动:
void setLight(int colorARGB, int flashMode, int onMS, int offMS,
int brightnessMode) {
light_state_t state;
memset(&state, 0, sizeof(light_state_t));
state.color = colorARGB;
state.flashMode = flashMode;
state.flashOnMS = onMS;
state.flashOffMS = offMS;
state.brightnessMode = brightnessMode;
light->set_light(light, &state);
}
复制代码
至于set_light方法,可以看一下/hardware/msm7k/liblights/lights.c中的 set_light_backlight方法,这个方法就是把一个颜色值写进了文件/sys/class/leds/lcd-backlight /brightness。一个简单的字符设备。
相关文章推荐
- Android屏幕背光调整机制
- Android屏幕背光调整机制
- Android屏幕背光调整机制
- Android屏幕背光调整机制
- Android应用: 改变当前屏幕背光亮度
- Android 支持多屏幕机制
- Android 支持多屏幕机制
- Android重写getResources规避用户调整系统字体大小影响Android屏幕适配
- Android 支持多屏幕机制
- Android 播放电影时滑动屏幕调整屏幕亮度(转)
- android屏幕刷新显示机制
- Android 播放电影时滑动屏幕调整屏幕亮度
- Android tips一:调整屏幕亮度的方法
- Android绘图机制(一)--屏幕尺寸信息
- 调整android手机屏幕亮度
- Android屏幕、键盘背光Framework和Linux led_classdev
- S5PV210+android4.0.4+linux3.0.8环境调整背光默认最大亮度
- android 自动调整屏幕分辨率
- ubuntu安装Android开发环境配置exit code = 13错误安装中文输入法及调整屏幕大小及添加快捷键到右边栏
- ArchLinux上使用acpi事件自动调整屏幕背光