• 【转】Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植


    原文网址: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
     
    1. kernal_path/drivers/misc/lsm303d.c  
    2. kernal_path/drivers/misc/l3gd20_gyr.c  
    3. kernal_path/include/linux/i2c/l3gd20.h  
    4. kernal/include/linux/input/lsm303d.h  

    限于对公司负责的态度,给出相对的文件路径。接下来肯定要修改Makefile:

    kernal_path/drivers/misc/Makefile:

    [html] view plaincopy
     
    1. obj-$(CONFIG_SENSORS_LSM303D)   += lsm303d.o  
    2. obj-$(CONFIG_ST_L3GD20_GYR) += l3gd20_gyr.o  

    修改Kconfig:

    kernal_path/drivers/misc/Kconfig:

    [html] view plaincopy
     
    1. config SENSORS_LSM303D  
    2.         tristate "LSM303 sensor driver"  
    3.        depends on I2C=y  
    4.         help  
    5.           Say yes here to support the sensor  
    6. config ST_L3GD20_GYR  
    7.         tristate "L3GD20_GYR gyroscope sensor support"  
    8.         depends on I2C=y  
    9.         help  
    10.           If you say yes here you get support for ST's  
    11.           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
     
    1. CONFIG_SENSORS_LSM303D=y  
    2. CONFIG_ST_L3GD20_GYR=y  

    注册I2C:

    上面Kconfig中提到depends on I2C =y,它既然依赖I2C,那肯定需要让I2C知道的它的存在,现向I2C注册LSM303D,L3GD2信息。

    [html] view plaincopy
     
    1. #ifdef CONFIG_SENSORS_LSM303D  
    2.         {  
    3.                 I2C_BOARD_INFO("lsm303d",  0x1d),  
    4.         },  
    5. #endif  
    6. #ifdef CONFIG_ST_L3GD20_GYR  
    7.         {  
    8.                 I2C_BOARD_INFO("l3gd20_gyr",  0x6a),  
    9.         },  
    10. #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
     
    1. PRODUCT_PACKAGES +=   
    2.         sensors.amlogic  

    这里提出如下两个文件:

    hardware/sensors/ST_lsm303d/AccSensor.cpp

    hardware/sensors/ST_lsm303d/GyroSensor.cpp

    打开后有个宏定义:

    [html] view plaincopy
     
    1. <pre name="code" class="html">#define INPUT_SYSFS_PATH_ACC "/sys/devices/i2c-1/1-001d/accelerometer/"  
    2. #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
     
    1. chmod 0666 /dev/mpu  
    2. chmod 0666 /dev/mpuirq  
    3. chmod 0666 /dev/timerirq  
    4.   
    5. chown system system /sys/devices/i2c-1/1-001d/magnetometer/pollrate_us  
    6. chown system system /sys/devices/i2c-1/1-001d/accelerometer/enable_device  
    7. chown system system /sys/devices/i2c-1/1-001d/accelerometer/pollrate_us  
    8. chown system system /sys/devices/i2c-1/1-001d/magnetometer/enable_device  
    9.   
    10. chown system system /sys/devices/i2c-1/1-006a/pollrate_ms  
    11. chown system system /sys/devices/i2c-1/1-006a/enable_device  
    12. chown system system /sys/devices/i2c-1/1-006a/range  
    13. chown system system /sys/devices/i2c-1/1-006a/enable_polling  

    在这里也提到了1-001d,1-006a,关于这点,后面在细说(注1-3)。

    在进行Android CTS测试时,会有sensor的features项目。这时也需要配置些文件:

    [html] view plaincopy
     
    1. PRODUCT_COPY_FILES +=   
    2.         frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:system/etc/permissions/android.hardware.sensor.accelerometer.xml  
    3.        frameworks/native/data/etc/android.hardware.sensor.compass.xml:system/etc/permissions/android.hardware.sensor.compass.xml   
    4.        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
     
    1. <!-- Feature for devices with an accelerometer sensor. -->  
    2. <permissions>  
    3.     <feature name="android.hardware.sensor.accelerometer" />  
    4. </permissions>  

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

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

  • 相关阅读:
    TOPCoder(一)Time
    highchart柱状图 series中data的数据构造
    (转)myeclipse工程 junit不能运行 ClassNotFoundException
    reserve和resize区别
    ++ fatal error C1083: 无法打开预编译头文件:“.Debug outer.pch”
    初学lua --lua嵌入c++的一个问题(初始化lua出错,版本问题)
    .NET中字符串split的C++实现
    成员函数指针与高效C++委托 (delegate)
    Android.mk 用法介绍
    cocos2d-x学习之旅(五):1.5 使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4613576.html
Copyright © 2020-2023  润新知