【转】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查找。结果找到如下的驱动相关的文件:
- 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
打开后有个宏定义:
- <pre name="code" class="html">#define INPUT_SYSFS_PATH_ACC "/sys/devices/i2c-1/1-001d/accelerometer/"
- #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中改变这两个文件的权限:
- 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这个值是怎么来的,暂时还不知道。
【转】Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植的更多相关文章
- AM335x(TQ335x)学习笔记——GPIO关键驱动移植
或按照S5PV210学习秩序.我们首先解决的关键问题.TQ335x有六个用户按钮,每个上.下.剩下.对.Enter和ESC. 我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏 ...
- AM335x(TQ335x)学习笔记——GPIO按键驱动移植
还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题 ...
- AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植
移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...
- AM335x(TQ335x)学习笔记——WM8960声卡驱动移植
经过一段时间的调试,终于调好了TQ335x的声卡驱动.TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法.Linux声卡驱动架构有OSS和ALSA两 ...
- Android开发者指南-方位传感器-Position Sensor
Android开发者指南-方位传感器-Position Sensor 转载自:http://blog.sina.com.cn/s/blog_48d4913001010zsu.html Position ...
- Android命令行工具学习总结
15.setting命令 setting命令可以很方便的更改系统设置中的参数(如修改系统默认输入法) 安卓Settings模块浅析:https://www.jianshu.com/p/ed8508fe ...
- Android接口和框架学习
Android接口和框架学习 缩写: HAL:HardwareAbstraction Layer.硬件抽象层 CTS:CompatibilityTest Suite,兼容性測试套件 Android让你 ...
- Android 开源项目及其学习
Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...
- Android自动化测试之Monkeyrunner学习笔记(一)
Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...
随机推荐
- 解决比较Oracle中CLOB字段问题
解决比较Oracle中CLOB字段问题 Oracle中CLOB和BLOB字段虽说在开发中满足了存放超大内容的要求,但是在一些简单使用中确频频带来麻烦.CLOB中存放的是指针,并不能直接取到实际值. ...
- C(m,n)%P
program1 n!%P(P为质数) 我们发现n! mod P的计算过程是以P为周期的的,举例如下: n = 10, P = 3 n! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 ...
- 支持多文件上传,预览,拖拽,基于bootstra的上传插件fileinput 的ajax异步上传
首先需要导入一些js和css文件 <link href="__PUBLIC__/CSS/bootstrap.css" rel="stylesheet"&g ...
- 基于PCA和SVM的人脸识别
程序中采用的数据集是ORL人脸库,该人脸库共有400副人脸图像,40人,每人10幅,大小为112*92像素,同一个人的表情,姿势有少许变化. 程序的流程主要分为三部分,数据的预处理(PCA降维和规格化 ...
- sql获取每门课程成绩最好的学生信息
1.相关数据表 Score表 [User]表 SQL语句例如以下: --查询出各科成绩最好的学生信息 --自连接 --SELECT TOP 1 * FROM Score B WHERE B.Score ...
- Java小项目--坦克大战(version1.0)
Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...
- spring+hibernate整合:报错org.hibernate.HibernateException: No Session found for current thread
spring+hibernate整合:报错信息如下 org.hibernate.HibernateException: No Session found for current thread at o ...
- 浪潮服务器通过ipmitool获取mac地址
一.GPU服务器 #配置两个主板集成千兆四个外插PCI万兆网卡# 板载网卡可以使用命令获取到:RAW 0X30 0X21 就可以读取到第一块网卡的MAC,就是以下返回值的后6位. 0c,c4,7a,5 ...
- FineUI模拟树下拉列表
模拟树的下拉列表 很多时候,我们希望在下拉列表中显示简单树状的层次结构,在菜单设置.机构设置等场景下这个需求尤为突出.也是基于项目需求的考虑,FineUI增加了模拟树的下拉列表的功能,显示效果如下所示 ...
- html5新特性--音频视频,拖放
1.音频 <audio controls> <source src="aaa.ogg" type="audio/ogg"> <so ...