標籤:
原文網址:http://blog.csdn.net/nxh_love/article/details/11804841
本人對驅動可謂是一點不懂,鑒於公司目前高驅動的人手不夠,所以我也只能兩眼一抹黑硬上咯,最原來Android 4.1上的正常使用的驅動完整的移植到Android 4.2上。這篇檔案講記錄自己一步一步移植過程,已備不時之需。在移植前,先來高明白android 支援那些Sensors,即Sensors種類和功能。
Sensors 種類和功能
從Android 官方的API可以找到Android 支援的sensor類型如下:
| 類型 |
描述 |
ACCELEROMETER (加速度感應器) |
又名G-sersor,偵測物體的加速度,利用裝置內配置的兩個電容點,並在電容點之間放置一個導電且可晃動物質,通過偵測導電物質的移動改變電容點間的電壓,藉此計算感應器的狀態。 |
GRAVITY (重力感應器)
|
又名GV-sensor。 |
GYROSCOPE (陀螺儀感應器) |
又名Gyro-sensor角速度器,利用內部震動機械結構偵測物體轉動所產生的角速度,進而計算出物體移動的角度。偵測水平改變的狀態,但無法計算移動的激烈程度。 |
LIGHT (光線感應器) |
偵測光線的強弱 |
MAGNETIC_FIELD (磁力感應器) |
又名M-sensor。 |
PRESSURE (壓力感應器) |
返回當前的壓強。 |
PROXIMITY (距離感應器) |
偵測物體與感應器之間的距離。 |
HUMIDITY (濕度感應器) |
返回當前的濕度 |
ROTATION (方向感應器) |
又名O-sensor |
TEMPERATURE (溫度感應器) |
返回當前的溫度 |
以上加速度感應器,重力感應器,陀螺儀感應器,光線感應器 是Android中最長用的Sensor了。下面介紹下G-sensor,Gyroscope驅動的移植。
G-sensor驅動code
通過諮詢硬體同事,知道我們當前用的G-sensor是LSM303D,Gyroscope是L3GD2。接下來按照這兩個關鍵grep尋找。結果找到如下的驅動相關的檔案:
[html] view plaincopy
- kernal_path/drivers/misc/lsm303d.c
- kernal_path/drivers/misc/l3gd20_gyr.c
- kernal_path/include/linux/i2c/l3gd20.h
- kernal/include/linux/input/lsm303d.h
限於對公司負責的態度,給出相對的檔案路徑。接下來肯定要修改Makefile:
kernal_path/drivers/misc/Makefile:
[html] view plaincopy
- obj-$(CONFIG_SENSORS_LSM303D) += lsm303d.o
- obj-$(CONFIG_ST_L3GD20_GYR) += l3gd20_gyr.o
修改Kconfig:
kernal_path/drivers/misc/Kconfig:
[html] view plaincopy
- config SENSORS_LSM303D
- tristate "LSM303 sensor driver"
- depends on I2C=y
- help
- Say yes here to support the sensor
- config ST_L3GD20_GYR
- tristate "L3GD20_GYR gyroscope sensor support"
- depends on I2C=y
- help
- If you say yes here you get support for ST‘s
- gyroscope sensors L3GD20_GYR.
關於Makefile中CONFIG_SENSORS_LSM303D,CONFIG_ST_L3GD20_GYR它是編譯產生.config中讀取的。關於Makefile,Kconfig,.config請參見Kconfig,Makefile 和 .config 。找到編譯產生.config的原設定檔defconfig。
修改defconfig:
kernal_path/configs/XXX_defconfig:
[html] view plaincopy
- CONFIG_SENSORS_LSM303D=y
- CONFIG_ST_L3GD20_GYR=y
註冊I2C:
上面Kconfig中提到depends on I2C =y,它既然依賴I2C,那肯定需要讓I2C知道的它的存在,現向I2C註冊LSM303D,L3GD2資訊。
[html] view plaincopy
- #ifdef CONFIG_SENSORS_LSM303D
- {
- I2C_BOARD_INFO("lsm303d", 0x1d),
- },
- #endif
- #ifdef CONFIG_ST_L3GD20_GYR
- {
- I2C_BOARD_INFO("l3gd20_gyr", 0x6a),
- },
- #endif
這裡面的0x1d,0x6a是I2C中註冊的節點。關於這點,我們後面在細說(注1-1)。
G-sensor HAL
這一部分直接從android4.1 copy到android 4.2,路徑放在hardware/sensors/ST_lsm303d/,查看它的Makefile發現它最後編譯產生一個sensor.so的檔案,存在在system/lib/hw中以供上層條用。要把這個sensor.so包含到img檔案中,需要在
[html] view plaincopy
- PRODUCT_PACKAGES += \
- sensors.amlogic
這裡提出如下兩個檔案:
hardware/sensors/ST_lsm303d/AccSensor.cpp
hardware/sensors/ST_lsm303d/GyroSensor.cpp
開啟後有個宏定義:
[html] view plaincopy
- <pre name="code" class="html">#define INPUT_SYSFS_PATH_ACC "/sys/devices/i2c-1/1-001d/accelerometer/"
- #define INPUT_SYSFS_PATH_GYRO "/sys/devices/i2c-1/1-006a/"</pre>
這裡有1-001d,1-006a,關於這點,我們後面在細說(注1-2)。
sensor許可權
從上面兩個宏定義可以看出,它要訪問的sys/devices/i2c-1/的檔案,那就需要給它一個許可權啦。在init.rc中改變這兩個檔案的許可權:
[html] view plaincopy
- chmod 0666 /dev/mpu
- chmod 0666 /dev/mpuirq
- chmod 0666 /dev/timerirq
-
- chown system system /sys/devices/i2c-1/1-001d/magnetometer/pollrate_us
- chown system system /sys/devices/i2c-1/1-001d/accelerometer/enable_device
- chown system system /sys/devices/i2c-1/1-001d/accelerometer/pollrate_us
- chown system system /sys/devices/i2c-1/1-001d/magnetometer/enable_device
-
- chown system system /sys/devices/i2c-1/1-006a/pollrate_ms
- chown system system /sys/devices/i2c-1/1-006a/enable_device
- chown system system /sys/devices/i2c-1/1-006a/range
- chown system system /sys/devices/i2c-1/1-006a/enable_polling
在這裡也提到了1-001d,1-006a,關於這點,後面在細說(注1-3)。
在進行Android CTS測試時,會有sensor的features項目。這時也需要配置些檔案:
[html] view plaincopy
- PRODUCT_COPY_FILES += \
- frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:system/etc/permissions/android.hardware.sensor.accelerometer.xml
- frameworks/native/data/etc/android.hardware.sensor.compass.xml:system/etc/permissions/android.hardware.sensor.compass.xml \
- frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:system/etc/permissions/android.hardware.sensor.gyroscope.xml \
它不僅是Android CTS feature,同時也決定這運行於此平台上APPS有沒有這些相關的許可權。開啟檔案android.hardware.sensor.accelerometer.xml:
[html] view plaincopy
- <!-- Feature for devices with an accelerometer sensor. -->
- <permissions>
- <feature name="android.hardware.sensor.accelerometer" />
- </permissions>
注1-1,注1-2,注1-3
這三個地方的1-001d,1-006a必須一樣。否則sensor沒功能。至於1-001d,1-006a這個值是怎麼來的,暫時還不知道。
【轉】Android(4.2) Sensors 學習——G-sensor,Gyroscope驅動移植