ROHM BH1710 light sensor调试

light sensor厂家ROHM给的bh1710的驱动是一个简单的单片机控制的驱动,为了能够集成到android2.3.7中来,还是费了一番工夫来调试。

1. 首先是驱动的问题,由于没有相应的android驱动,所以只能自己找类似的来改。 
先找到一个 drivers/misc/isl29003.c  , 不过看起来很旧了,也不适合android系统,
不过好歹有个样子,可以省很多敲键盘的时间,拿来改吧。 
    由于android2.3.7中的HAL层是读取的input设备的数据然后上报的,所以这里也应该做成一个input设备。
        input_dev->name = "bh1710";
        input_set_capability(input_dev, EV_ABS, ABS_MISC);
        input_set_abs_params(input_dev, ABS_MISC, 0, 1, 0, 0);
        input_register_device(input_dev);
这两个设置很重要,不然会读不到event。而且ABS_MISC要和libsensors.so中对应,
#define EVENT_TYPE_LIGHT            ABS_MISC

    做到可以读出lightsensor的lux值时,还需要增加poll_delay,enable等sysfs文件,然后找到一个更加符合android平台的驱动: drivers/input/misc/gp2a.c 这个驱动是samsung release的这份libsensors里默认支持的,真好。 于是将gp2a.c中一些内容搬过来,驱动算是告一段落。

2. libsensors
由于只有一个sensor,所以在sensors.cpp中删掉除LIGHT SENSOR外其他的sensor。
LightSensor.cpp中,
LightSensor::LightSensor()
    : SensorBase(NULL, "lightsensor-level"),
改为:
LightSensor::LightSensor()
    : SensorBase(NULL, "bh1710"),
这个名称跟驱动中input_dev->name对应。
然后这个文件中还有修正CRESPO的lightsensor的一个bug,而bh1710不需要,所以删掉
FIRST_GOOD_EVENT相关的部分。
float LightSensor::indexToValue(size_t index) const
{
    /* Driver gives a rolling average sensor value.  We convert it lux levels. */
    static const struct sensorToLux {
        size_t sensor_value;
        float  lux_value;
    } sensorToLux[] = {
        {  20,   50.0 },  /* from    0 -  100 sensor, we map to    50.0 lux */
        {  100,  200.0 },  /* from  101 -  300 sensor, we map to   200.0 lux */
        {  300,  400.0 },  /* from  301 -  500 sensor, we map to   400.0 lux */
        {  500,  600.0 },  /* from  501 -  800 sensor, we map to   600.0 lux */
        {  800, 1000.0 },  /* from  801 - 1000 sensor, we map to  1000.0 lux */
    };
这里是对应的值转换。
要和device/samsung/smdkv210/overlay/frameworks/base/core/res/res/values/config.xml中的值对应起来比较的。

    <integer-array name="config_autoBrightnessLevels">
        <item>100</item>
        <item>300</item>
        <item>500</item>
        <item>800</item>
    </integer-array>
    <integer-array name=" config_autoBrightnessLcdBacklightValues ">
        <item>50</item>
        <item>100</item>
        <item>130</item>
        <item>180</item>
        <item>250</item>
    </integer-array>

这样固定lux_value和config_autoBrightnessLevels后,就可以只修改sensor_value和config_autoBrightnessLcdBacklightValues对应就可以了。

3. frameworks/base/services/java/com/android/server/PowerManagerService.java中
private void lightSensorChangedLocked(int value) {
                int lcdValue = getAutoBrightnessValue(
                        (/*mIsDocked jeff.*/ true  ? value : mHighestLightSensorValue),
                        mLcdBacklightValues);
mIsDocked永远也不会变,因为我们的板子上没有dock,所以修改为 true。


修改后,屏幕亮度就可以根据sensor的lux值变化而改变背光亮度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值