Android(4.2) Sensors 學習——G-sensor,Gyroscope驅動移植
本人對驅動可謂是一點不懂,鑑於公司目前高驅動的人手不夠,所以我也只能兩眼一抹黑硬上咯,最原來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 (溫度感測器) |
返回當前的溫度 |
G-sensor驅動code
通過諮詢硬體同事,知道我們當前用的G-sensor是LSM303D,Gyroscope是L3GD2。接下來按照這兩個關鍵grep查詢。結果找到如下的驅動相關的檔案:
限於對公司負責的態度,給出相對的檔案路徑。接下來肯定要修改Makefile: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
kernal_path/drivers/misc/Makefile:
obj-$(CONFIG_SENSORS_LSM303D) += lsm303d.o
obj-$(CONFIG_ST_L3GD20_GYR) += l3gd20_gyr.o
修改Kconfig:
kernal_path/drivers/misc/Kconfig:
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:
CONFIG_SENSORS_LSM303D=y
CONFIG_ST_L3GD20_GYR=y
註冊I2C:
上面Kconfig中提到depends on I2C =y,它既然依賴I2C,那肯定需要讓I2C知道的它的存在,現向I2C註冊LSM303D,L3GD2資訊。
#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檔案中,需要在
PRODUCT_PACKAGES += \
sensors.amlogic
這裡提出如下兩個檔案:
hardware/sensors/ST_lsm303d/AccSensor.cpp
hardware/sensors/ST_lsm303d/GyroSensor.cpp
開啟後有個巨集定義:
#define INPUT_SYSFS_PATH_ACC "/sys/devices/i2c-1/1-001d/accelerometer/" #define INPUT_SYSFS_PATH_GYRO "/sys/devices/i2c-1/1-006a/"這裡有1-001d,1-006a,關於這點,我們後面在細說(注1-2)。
sensor許可權
從上面兩個巨集定義可以看出,它要訪問的sys/devices/i2c-1/的檔案,那就需要給它一個許可權啦。在init.rc中改變這兩個檔案的許可權:
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專案。這時也需要配置些檔案:
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:
<!-- 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這個值是怎麼來的,暫時還不知道。