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值变化而改变背光亮度。