1. 程式人生 > >Android(4.2) Sensors 學習——G-sensor,Gyroscope驅動移植

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
(溫度感測器)

返回當前的溫度
       以上加速度感測器,重力感測器,陀螺儀感測器,光線感測器 是Android中最長用的Sensor了。下面介紹下G-sensor,Gyroscope驅動的移植。

G-sensor驅動code 

       通過諮詢硬體同事,知道我們當前用的G-sensor是LSM303D,Gyroscope是L3GD2。接下來按照這兩個關鍵grep查詢。結果找到如下的驅動相關的檔案:

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:

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這個值是怎麼來的,暫時還不知道。