T507之自动调亮度实现(ltr303als驱动)

本文介绍如何通过光照传感器ltr303als实现平板电脑的自动调亮度功能,包括内核驱动配置、安卓层配置及HAL层修改等步骤。

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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值