Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2883671
  • 博文数量: 674
  • 博客积分: 17881
  • 博客等级: 上将
  • 技术积分: 4849
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 10:15
文章分类

全部博文(674)

文章存档

2013年(34)

2012年(146)

2011年(197)

2010年(297)

分类: LINUX

2011-08-29 20:58:13

基于android 2.2 添加Light Sensor支持:

1) UI部分

2) framework部分

3) HAL 部分

4) Driver 部分

 

下面分别讨论:

1) UI部分

    a) 打开亮度设置菜单的自动调整亮度checkbox

        frameworks/base/core/res/res/values/config.xml :

        -  false

        + true

    b) 同时设置Lux级,亮度级,以5级亮度为例

       

 

+    1000
+    2000
+    3000
+    4000    
     
     
+    20
+    80  
+    120
+    160   
+    250  
          
     
     autoBrightnessLevels 随便设,HAL层传上来的数据落在这几个值之间以区分级别
     LcdBacklightValues 是5级亮度的实际值
 2) framework部分
     a) framework层的相关文件
./core/java/android/hardware/SensorEvent.java
./core/java/android/hardware/SensorListener.java
./core/java/android/hardware/ISensorService.aidl
./core/java/android/hardware/Sensor.java
./core/java/android/hardware/SensorEventListener.java
./core/jni/android_hardware_SensorManager.cpp     //SensorManager JNI
./core/java/android/hardware/SensorManager.java    //SensorManager
./services/jni/com_android_server_SensorService.cpp //SensorSersvice JNI
./services/java/com/android/server/SensorService.java //SensorService
        ./services/java/com/android/server/PowerManagerService.java
       Sensor系统相对比较简单,我们需要修改的更少:
       添加Light Sensor只需要修改SensorManager.java, PowerManagerService.java两个文件
      b) SensorManager.java:
      
  1. @@ -582,6 +582,8 @@ public class SensorManager  
  2.                  return SENSOR_ORIENTATION_RAW;  
  3.              case Sensor.TYPE_TEMPERATURE:  
  4.                  return SENSOR_TEMPERATURE;  
  5. +            case Sensor.TYPE_LIGHT:  
  6. +                return SENSOR_LIGHT;                  
  7.          }  
  8.          return 0;  
  9.      }  
  10. @@ -606,6 +608,9 @@ public class SensorManager  
  11.                      result |= SensorManager.SENSOR_ORIENTATION |  
  12.                                      SensorManager.SENSOR_ORIENTATION_RAW;  
  13.                      break;  
  14. +                case Sensor.TYPE_LIGHT:  
  15. +                    result |= SensorManager.SENSOR_LIGHT;  
  16. +                    break;  
  17.              }  
  18.          }  
  19.          return result;  
  20. @@ -707,6 +712,8 @@ public class SensorManager  
  21.                  listener, sensors, rate) || result;  
  22.          result = registerLegacyListener(SENSOR_TEMPERATURE, Sensor.TYPE_TEMPERATURE,  
  23.                  listener, sensors, rate) || result;  
  24. +        result = registerLegacyListener(SENSOR_LIGHT, Sensor.TYPE_LIGHT,  
  25. +                listener, sensors, rate) || result;  
  26.          return result;  
  27.      }  
  28.    
  29. @@ -766,6 +773,8 @@ public class SensorManager  
  30.                  listener, sensors);  
  31.          unregisterLegacyListener(SENSOR_TEMPERATURE, Sensor.TYPE_TEMPERATURE,  
  32.                  listener, sensors);  
  33. +        unregisterLegacyListener(SENSOR_LIGHT, Sensor.TYPE_LIGHT,  
  34. +                listener, sensors);  
  35.      }  
@@ -582,6 +582,8 @@ public class SensorManager return SENSOR_ORIENTATION_RAW; case Sensor.TYPE_TEMPERATURE: return SENSOR_TEMPERATURE; + case Sensor.TYPE_LIGHT: + return SENSOR_LIGHT; } return 0; } @@ -606,6 +608,9 @@ public class SensorManager result |= SensorManager.SENSOR_ORIENTATION | SensorManager.SENSOR_ORIENTATION_RAW; break; + case Sensor.TYPE_LIGHT: + result |= SensorManager.SENSOR_LIGHT; + break; } } return result; @@ -707,6 +712,8 @@ public class SensorManager listener, sensors, rate) || result; result = registerLegacyListener(SENSOR_TEMPERATURE, Sensor.TYPE_TEMPERATURE, listener, sensors, rate) || result; + result = registerLegacyListener(SENSOR_LIGHT, Sensor.TYPE_LIGHT, + listener, sensors, rate) || result; return result; } @@ -766,6 +773,8 @@ public class SensorManager listener, sensors); unregisterLegacyListener(SENSOR_TEMPERATURE, Sensor.TYPE_TEMPERATURE, listener, sensors); + unregisterLegacyListener(SENSOR_LIGHT, Sensor.TYPE_LIGHT, + listener, sensors); } 
     c) PowerManagerService.java:
       这里似乎一个系统bug
      
  1.                  int lcdValue = getAutoBrightnessValue(  
  2. -                        (mIsDocked ? value : mHighestLightSensorValue),  
  3. -                        mLcdBacklightValues);  
  4. +                        (true ? value : mHighestLightSensorValue),  
  5. +                        mLcdBacklightValues);     
int lcdValue = getAutoBrightnessValue( - (mIsDocked ? value : mHighestLightSensorValue), - mLcdBacklightValues); + (true ? value : mHighestLightSensorValue), + mLcdBacklightValues);  
  3) HAL 部分      
      实现hardware/libhardware/include/hardware/sensor.h接口,写一个HAL层,
      这部分请参考我上一篇文章: android sensor HAL范例,那个例子写的好级啦
      需要说明的一点是,android系统的所有sensor公用一个HAL层文件,所以如果你的系统已有其他sensor那么需要在其他
      sensor的HAL实现中添加light sensor
      HAL层最终生成 /system/lib/hw/sensors.xxx.so 
  4) Driver 部分
      不管啥接口的light sensor,请把它写成一个input设备,
      通过/dev/input/eventX来提供数据
      这样在HAL层polling的时候就可以
      nread = read(ls_fd, &event, sizeof(event));
      
  1. if (event->type == EV_ABS) {  
  2.     LOGV("light-level type: %d code: %d value: %-5d time: %ds",  
  3.          event->type, event->code, event->value,  
  4.          (int)event->time.tv_sec);  
  5.     if (event->code == EVENT_TYPE_LIGHT) {  
  6.         struct input_absinfo absinfo;  
  7.         int index;  
  8.         if (!ioctl(fd, EVIOCGABS(ABS_DISTANCE), &absinfo)) {  
  9.             index = event->value;  
  10.             if (index >= 0) {  
  11.                 new_sensors |= SENSORS_LIGHT;  
  12.                 if (index >= ARRAY_SIZE(sLuxValues)) {  
  13.                     index = ARRAY_SIZE(sLuxValues) - 1;  
  14.                 }  
  15.                 dev->sensors[ID_L].light = sLuxValues[index];  
  16.             }  
  17.         }  
  18.     }  
  19. }  
if (event->type == EV_ABS) { LOGV("light-level type: %d code: %d value: %-5d time: %ds", event->type, event->code, event->value, (int)event->time.tv_sec); if (event->code == EVENT_TYPE_LIGHT) { struct input_absinfo absinfo; int index; if (!ioctl(fd, EVIOCGABS(ABS_DISTANCE), &absinfo)) { index = event->value; if (index >= 0) { new_sensors |= SENSORS_LIGHT; if (index >= ARRAY_SIZE(sLuxValues)) { index = ARRAY_SIZE(sLuxValues) - 1; } dev->sensors[ID_L].light = sLuxValues[index]; } } } } 
      .light 最终传给 PowerManager, PowerManager根据config_autoBrightnessLevels数组
      得到config_autoBrightnessLcdBacklightValues数据具体亮度值,然后调整亮度
      比如 .light = 2500.0
         3000.0  <  2500.0 < 4000.0 对应的LcdBacklightValues 就是160
      -- THE END --
阅读(1094) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~