Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 562|回复: 0

[实例教程]Android屏幕背光调整机制

[复制链接]

该用户从未签到

发表于 2011-10-22 12:43:54 | 显示全部楼层 |阅读模式
扩展一个硬件(比如LED、蓝牙、传感器等),至少需要硬件、驱动、驱动交互模块。至于系统的层面如何把系统库加入自己的体系里面去,就是操作系统自己的事了。这里分析一下以背光调整为例Android


源码在这里:
flying_2011.6.211.zip (14.47 KB, 下载次数: 5)

要调整背光,第一步是搜索并加载驱动交互模块(一个.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。一个简单的字符设备。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-18 22:10 , Processed in 0.372859 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表