原文网址: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查找。结果找到如下的驱动相关的文件:

  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:

  1. obj-$(CONFIG_SENSORS_LSM303D)   += lsm303d.o
  2. obj-$(CONFIG_ST_L3GD20_GYR) += l3gd20_gyr.o

修改Kconfig:

kernal_path/drivers/misc/Kconfig:

  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:

  1. CONFIG_SENSORS_LSM303D=y
  2. CONFIG_ST_L3GD20_GYR=y

注册I2C:

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

  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文件中,需要在

  1. PRODUCT_PACKAGES += \
  2. sensors.amlogic

这里提出如下两个文件:

hardware/sensors/ST_lsm303d/AccSensor.cpp

hardware/sensors/ST_lsm303d/GyroSensor.cpp

打开后有个宏定义:

  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中改变这两个文件的权限:

  1. chmod 0666 /dev/mpu
  2. chmod 0666 /dev/mpuirq
  3. chmod 0666 /dev/timerirq
  4. chown system system /sys/devices/i2c-1/1-001d/magnetometer/pollrate_us
  5. chown system system /sys/devices/i2c-1/1-001d/accelerometer/enable_device
  6. chown system system /sys/devices/i2c-1/1-001d/accelerometer/pollrate_us
  7. chown system system /sys/devices/i2c-1/1-001d/magnetometer/enable_device
  8. chown system system /sys/devices/i2c-1/1-006a/pollrate_ms
  9. chown system system /sys/devices/i2c-1/1-006a/enable_device
  10. chown system system /sys/devices/i2c-1/1-006a/range
  11. chown system system /sys/devices/i2c-1/1-006a/enable_polling

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

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

  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:

  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这个值是怎么来的,暂时还不知道。

【转】Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植的更多相关文章

  1. AM335x(TQ335x)学习笔记——GPIO关键驱动移植

    或按照S5PV210学习秩序.我们首先解决的关键问题.TQ335x有六个用户按钮,每个上.下.剩下.对.Enter和ESC. 我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏 ...

  2. AM335x(TQ335x)学习笔记——GPIO按键驱动移植

    还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题 ...

  3. AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植

    移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...

  4. AM335x(TQ335x)学习笔记——WM8960声卡驱动移植

    经过一段时间的调试,终于调好了TQ335x的声卡驱动.TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法.Linux声卡驱动架构有OSS和ALSA两 ...

  5. Android开发者指南-方位传感器-Position Sensor

    Android开发者指南-方位传感器-Position Sensor 转载自:http://blog.sina.com.cn/s/blog_48d4913001010zsu.html Position ...

  6. Android命令行工具学习总结

    15.setting命令 setting命令可以很方便的更改系统设置中的参数(如修改系统默认输入法) 安卓Settings模块浅析:https://www.jianshu.com/p/ed8508fe ...

  7. Android接口和框架学习

    Android接口和框架学习 缩写: HAL:HardwareAbstraction Layer.硬件抽象层 CTS:CompatibilityTest Suite,兼容性測试套件 Android让你 ...

  8. Android 开源项目及其学习

    Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...

  9. Android自动化测试之Monkeyrunner学习笔记(一)

    Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...

随机推荐

  1. eclipse3.7 安装maven插件与scm

    转自:http://blacksonny.iteye.com/blog/1900275 最近要使用maven进行开发,之前的eclipse3.7 使用一下两个地址安装好了插件,如下: maven插件 ...

  2. jsonp+handler 的实现

    //参考 http://www.cnblogs.com/yuwensong/archive/2013/05/28/3103064.html 后台: public void ProcessRequest ...

  3. c++读取ccbi

    loader类文件: 需要定义CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(ButtonTestLayerLoader, loader); 这个宏定义是定义静态的l ...

  4. Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  5. Android无法导入下载好的项目(和Eclipse中已经存在的项目命名一样导致冲突)解决办法

    错误提示: 在我们到导入从网络下载的项目时,经常会出现如下问题(选择的项目变灰,并且提示要选择至少一个项目): 错误原因: 出现这样的错误主要是因为你的Eclipse已经存在了和上图中New Proj ...

  6. Linux命令vi/vim编辑

    一.vi的基本概念基本上vi可以分为三种状态,分别是命令模式(command mode).插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:a) 命令 ...

  7. VMware SphereESXi上传系统镜像

    VMware SphereESXi上传系统镜像 打开右侧[摘要]选项卡 在[资源]中选择存储器中的存储,右键[浏览数据库存储] 选择工具栏[创建文件夹]图标,命名后保存 这样随后找到存储设备,浏览刚才 ...

  8. [转] iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)

    转自: 在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都 ...

  9. .net framework版本以及服务器部署问题

    自己做了个官网,部署到服务器很多问题,发现targetframework为4.0,但是公司服务器的版本为:2.0.50727,但是公司一个项目用的lambda和linq就没有事,发现这个是3.5支持的 ...

  10. Java数据结构漫谈-Vector

    List除了ArrayList和LinkedList之外,还有一个最常用的就是Vector. Vector在中文的翻译是矢量,向量,所以大家喜欢把Vector叫做矢量数组,或者向量数组. 其实就底层实 ...