1,概述:
自动调亮度,即平板根据环境光线的亮度自动调节屏幕亮度。当然是需要使用到光照传感器,本篇示例光感是ltr303als。
2,内核驱动实现
a, 配置设备树, 添加ltr303设备,这样就不用在i2c总线上注册设备了,只需要注册驱动即可。
我这里的ltr303是接在了twi2接口上,配置如下:
longan/device/product/configs/demo2.0/board.dts


b, 实现ltr303驱动,驱动代码待上传。
c,编译好的ltr_303als.ko拷贝到
android/device/softwinner/mercury-demo/modules/modules/
d, 修改以下文件,以在开机启动时加载ltr_303als.ko
android/device/softwinner/mercury-common/init.sun50iw9p1.rc

e, 权限修改
ltr303驱动加载之后,输入系统子节点权限为660 root root,而驱动的使用者PowerManagerService所属用户组为 system system。需要修改节点权限才能访问。
在某开机脚本中追加权限修改指令,如
device/softwinner/mercury-demo/configs/ecar507/init.gpioset.rc
chmod 0666 /sys/devices/virtual/input/input2/enable
chmod 0666 /sys/devices/virtual/input/input2/ls_poll_delay
chmod 0666 /sys/devices/virtual/input/input2/lux
3, 安卓层配置
a, 配置config_automatic_brightness_available
修改
android/frameworks/base/core/res/res/values/config.xml
设置config_automatic_brightness_available为true。
编译固件后烧录,在安卓系统“设置”->“显示”->“亮度设置”中的界面上会多出一个“自动调整亮度”选项。
b, 配置config_autoBrightnessLevels
同样修改文件:android/frameworks/base/core/res/res/values/config.xml
查找到config_autoBrightnessLevels位置修改如下:
<integer-array name="config_autoBrightnessLevels">
<item>10</item>
<item>100</item>
<item>500</item>
<item>1000</item>
<item>5000</item>
<item>10000</item>
<item>25000</item>
</integer-array>
c, 配置config_autoBrightnessLcdBacklightValues
同样修改文件:android/frameworks/base/core/res/res/values/config.xml
查找到config_autoBrightnessLcdBacklightValues位置修改如下:
<integer-array name="config_autoBrightnessLcdBacklightValues">
<item>10</item>
<item>20</item>
<item>40</item>
<item>80</item>
<item>120</item>
<item>160</item>
<item>200</item>
<item>255</item>
</integer-array>
d,设置默认开启自动调光功能
修改
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
将def_screen_brightness_automatic_mode的值改为true
- <bool name="def_screen_brightness_automatic_mode">false</bool>
+ <bool name="def_screen_brightness_automatic_mode">true</bool>
e,如果有需要,也可以在config.xml中修改按键背光亮度config_autoBrightnessButtonBacklightValues,我这里没设置。
f,增加hal层增加ltr303设备
修改hardware/aw/sensors/aw_sensors/2.0/hal/sensorDetect.cpp文件中ligSensorList数组
struct sensor_extend_t ligSensorList[] = {
{
{
"lightsensor", 0,
}, {
"LTR-C216R-14 sensor LIGHT",
"LTR ",
1,
SENSORS_LIGHT_HANDLE,
SENSOR_TYPE_LIGHT,
20000.0f, 20.0f,
0.2f, 0,
0,0,SENSOR_STRING_TYPE_LIGHT,
0,0,SENSOR_FLAG_ON_CHANGE_MODE,
{ },
},
+ }, {
+ {//struct sensors_data描述信息
+ "ltr303", 0,
+ },{
+ "LTR-303 sensor LIGHT",
+ "LTR ",
+ 1,
+ SENSORS_LIGHT_HANDLE,
+ SENSOR_TYPE_LIGHT,
+ 20000.0f, 20.0f,
+ 0.2f, 0,
+ 0,0,SENSOR_STRING_TYPE_LIGHT,
+ 0,0,SENSOR_FLAG_ON_CHANGE_MODE,
+ { },
+ },
}, {
{
"stk3x1x_ls", 0,
}, {
"stk3x1x Ambient Light Sensor",
"sensortek ",
1,
SENSORS_LIGHT_HANDLE,
SENSOR_TYPE_LIGHT,
4096.0f, 1.0f,
0.09f, 50000,
0,0,SENSOR_STRING_TYPE_LIGHT,
0,1000000,SENSOR_FLAG_ON_CHANGE_MODE,
{ },
},
},
};
g, 安卓hal层修改LightSensor::processEvent方法,对来自内核驱动层的光照数据做转换,与config.xml中的config_autoBrightnessLevels数组对应。(如果linux内核驱动层上报数据与config_autoBrightnessLevels可以适配,这里不做数据转换也可以,就省略了本步骤)
android/hardware/aw/sensors/aw_sensors/2.0/hal/LightSensor.cpp
#define LUX_LEVEL 7
static const int sAdcValues[LUX_LEVEL] = {
10,
100,
500,
1000,
5000,
10000,
25000,
};
void LightSensor::processEvent(int code, int value) {
ALOGD("---->code= %d value=%d classPath=%s\n", code, value, ligSensorInfo.classPath);
if (code == EVENT_TYPE_LIGHT) {
mPendingMask = 1;
mPendingEvent.light = sAdcValues[value];
#ifdef SENSOR_DEBUG
ALOGD("---->light value: %f\n", mPendingEvent.light);
#endif
//setIntLux();
}
}
本文介绍如何通过光照传感器ltr303als实现平板电脑的自动调亮度功能,包括内核驱动配置、安卓层配置及HAL层修改等步骤。
&spm=1001.2101.3001.5002&articleId=121020020&d=1&t=3&u=755aa110c8af421ea972eebbb3f81097)
1313

被折叠的 条评论
为什么被折叠?



