Added support for light sensor based on Android 2.2:
1) UI
2) Framework section
3) Hal part
4) Driver
The following are discussed respectively:
1) UI
A) Enable the brightness setting menu to automatically adjust the brightness checkbox.
Frameworks/base/CORE/RES/values/config. xml:
-<Bool name = "config_automatic_brightness_available"> false </bool>
+ <Bool name = "config_automatic_brightness_available"> true </bool>
B) set both the Lux level and the brightness level. Take the 5-level brightness as an example.
<Integer-array name = "config_autobrightnesslevels">
+ <Item> 1000 </item> + <item> 2000 </item> + <item> 3000 </item> + <item> 4000 </item> </integer- array> <integer-array name = "config_autobrightnesslcdbacklightvalues"> + <item> 20 </item> + <item> 80 </item> + <item> 120 </item> + <item> 160 </item> + <item> 250 </item> </integer-array> autobrightnesslevels, the data transmitted by the Hal layer falls between these values to distinguish the lcdbacklightvalues from the actual value of the 5-level brightness.
2) Framework sectionA) files related to the framework layer. /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. the Java sensor system is relatively simple, so we need to modify less: to add light sensor, we only need to modify sensormanager. java, powermanagerservice. java two files B) sensormanager. java: @-582,6 + 582,8 @ public class sensormanager <br/> return sensor_orientation_raw; <br/> case sensor. type_temperature: <br/> return sensor_temperature; <br/> + case sensor. type_light: <br/> + return sensor_light; <br/>}< br/> return 0; <br/>}< br/> @-606,6 + 608,9 @ public class sensormanager <br/> result | = sensormanager. sensor_orientation | <br/> sensormanager. sensor_orientation_raw; <br/> break; <br/> + case sensor. type_light: <br/> + Result | = sensormanager. sensor_light; <br/> + break; <br/>}< br/> return result; <br/> @-707,6 + 712,8 @ public class sensormanager <br/> listener, sensors, rate) | result; <br/> result = registerlegacylistener (sensor_temperature, sensor. type_temperature, <br/> listener, sensors, rate) | result; <br/> + Result = registerlegacylistener (sensor_light, sensor. type_light, <br/> + listener, sensors, rate) | result; <br/> return result; <br/>}</P> <p> @-766,6 + 773,8 @ public class sensormanager <br/> listener, sensors); <br/> unregisterlegacylistener (sensor_temperature, sensor. type_temperature, <br/> listener, sensors); <br/> + unregisterlegacylistener (sensor_light, sensor. type_light, <br/> + listener, sensors); <br/>}C) powermanagerservice. Java: It seems to be a system bug. Int lcdvalue = getautobrightnessvalue (<br/>-(misdocked? Value: mhighestlightsensorvalue), <br/>-mlcdbacklightvalues); <br/> + (true? Value: mhighestlightsensorvalue), <br/> + mlcdbacklightvalues );
3) Hal partImplement hardware/libhardware/include/hardware/sensor. H Interface, write a Hal layer. For this part, please refer to my previous article: Android sensor Hal example. If that example is well written, it must be noted that, all Android sensor files share a Hal file, therefore, if your system already has other sensor, you need to add the light sensor Hal layer to the Hal implementation of other sensor to generate/system/lib/HW/sensors. xxx. so
4) DriverWhatever the light sensor of the interface, write it as an input device and provide data through/dev/input/eventx so that nread = read (ls_fd, & event, sizeof (event )); If (Event-> type = ev_abs) {<br/> logv ("light-level type: % d code: % d value: %-5d time: % ds ", <br/> event-> type, event-> code, event-> value, <br/> (INT) Event-> time. TV _sec); <br/> If (Event-> code = event_type_light) {<br/> struct input_absinfo absinfo; <br/> int index; <br/> If (! IOCTL (FD, eviocgabs (abs_distance), & absinfo) {<br/> Index = event-> value; <br/> If (index> = 0) {<br/> new_sensors | = sensors_light; <br/> If (index> = array_size (sluxvalues) {<br/> Index = array_size (sluxvalues)-1; <br/>}< br/> Dev-> sensors [id_l]. light = sluxvalues [Index]; <br/>}< br/>}. Light is finally passed to powermanager. powermanager obtains the specific Brightness Value of config_autobrightnesslcdbacklightvalues Based on the config_autobrightnessnevels array, and then adjusts the brightness, for example,. Light = 2500.0 3000.0 <2500.0 <4000.0 corresponds to lcdbacklightvalues is --