本人对驱动可谓是一点不懂,鉴于公司目前高驱动的人手不够,所以我也只能两眼一抹黑硬上咯,最原来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.ckernal_path/drivers/misc/l3gd20_gyr.ckernal_path/include/linux/i2c/l3gd20.hkernal/include/linux/input/lsm303d.h
限于对公司负责的态度,给出相对的文件路径。接下来肯定要修改Makefile:

kernal_path/drivers/misc/Makefile:

obj-$(CONFIG_SENSORS_LSM303D)   += lsm303d.oobj-$(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 sensorconfig 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=yCONFIG_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:

    

注1-1,注1-2,注1-3

       这三个地方的1-001d,1-006a必须一样。否则sensor没功能。至于1-001d,1-006a这个值是怎么来的,暂时还不知道。

更多相关文章

  1. Android按钮的点击效果的总结
  2. 使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支
  3. Android(安卓)应用开发笔记 - Android的系统构架
  4. Android(安卓)So简单加固
  5. Android覆盖升级以及apk签名
  6. Android中图片实现按钮点击效果
  7. 在Android中调用WebService
  8. Android8.1以及5.1版本识别sdcard和U盘并创建文件解决办法
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android多渠道打包解决方案(兰贝壳儿)
  2. Android安全检查之网络环境检测
  3. Android解决暴力点击方案
  4. android menu,activity,AlertDialog...
  5. android OkHttp3.0
  6. android 设置activity通用的全局变量(新手
  7. 用ant编译Android程序
  8. android webview加载String类型html
  9. Android涉及到的网址都记录在这把~~~~
  10. android 全屏、隐藏标题、横屏显示方法