android sensor驱动移植
发布日期:2021-09-27 14:12:43 浏览次数:5 分类:技术文章

本文共 5221 字,大约阅读时间需要 17 分钟。

Sensor作为Android系统的一个输入设备,对Android设备来说是必不可少的。Sensor主要报告G-Sensor、LightsSensor、ProximitySensor、TemperatureSensor等。由于各个Sensor的移植大同小异。本文就主要对G-Sensor和LightSensor进行说明。 Sensor的移植主要包括三部分的工作:Linux Kernel中相关设备的驱动开发、Android中HAL中相关库的开发以及Android中应用层中测试程序的开发。 一、Linux Kernel中相关设备的驱动的开发。      对于Sensor驱动的开发,主要分为两部分:Sensor数据的采集以及上报和Sensor的控制。      1、Sensor数据的采集和上报。           a、Sensor数据的采集是指从硬件设备读出相关的数据。                数据的采集主要有两种方式:                     通过注册中断,当有中断发生时,驱动去采集数据;                通过轮询主动去采集数据。主要是通过定时器定期采集数据。           b、Sensor数据的上报                由于Sensor是属于输入设备,所以Sensor的数据上报要上报到Linux Kernel输入子系统里面。上层只要到相应的子系统里面                读数据就可以了。                需要把数据上报的Linux Kernel输入子系统的设备还有TouchScreen,Keyboard,Mouse,Sensor等。                上报数据的code大致是                static void report_abs(void)                {                     short x,y,z,tilt;                     if(read_data(&x,&y,&z,&tilt) != 0) {                     /* report the absulate sensor data to input device */                     input_report_abs(idev, ABS_X, y);                     input_report_abs(idev, ABS_Y, x);                     input_report_abs(idev, ABS_Z, z);                     input_sync(idev);                }        2、Sensor的控制。            Sensor的控制包括设备的打开、关闭、设置才数据采集的频率、enable/disable,等等。            Sensor的控制主要通过IOCTL方式来实现的。      对于驱动的开发,其实都是大同小异的,只要实现相应的回调函数就行了,另外注意以上两点就行了。       二、Android中HAL层相关库的开发。      Android中Framework对Sensor的相关支持,Android中已经弄好了。但是由于HAL层是很硬件密切相连的,与每个硬件相对应的HAL中的东西都有所不同,所以Anroid中HAL层对Sensor的支持是没有的。所以需要开发。只要变出的库的名字“libsensor.so”,然后放到固定的目录下就可以了。       本文一下的关于libsensor.so的开发是基于Android2.2的,在Android2.3上代码的整体结构有所不同,但是也是大同小异的东西。只要知道核心内容就可以了。       对于libsensor.so库的开发,只要写个C程序,然后编译成库就行了。对于Android2.2来说,我们不需要自己一点点的开发这个库,因为Android2.2里面提供了htc相关的源文件,我们只要拿过来把里面关键的几点改一下就行了。       以下对关键的几点加以说明。参考android目录下 device/htc/passion-common/libsensors/Sensors.c      1、open_sensors(...)           这个函数比较重要。在Sensors.c文件里面实现的函数大多是系统的回调函数。在这个函数里面主要的作用就是把自己写的函数,注           册成系统用的回调函数。            2、定义支持的sensors                      /*****************************************************************************/            #define MAX_NUM_SENSORS 6           //定义主持的sensors的个数            #define SUPPORTED_SENSORS  ((1<
=0) { char name[80]; if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) { name[0] = '/0'; } //以下定义的compass,promixity,lightsensor-level是三个硬件设备在kernel的input子系统中的名字,这个要 和驱动里面的名字想匹配 if (!strcmp(name, "compass")) { LOGV("using %s (name=%s)", devname, name); *akm_fd = fd; } else if (!strcmp(name, "proximity")) { LOGV("using %s (name=%s)", devname, name); *p_fd = fd; } else if (!strcmp(name, "lightsensor-level")) { LOGV("using %s (name=%s)", devname, name); *l_fd = fd; } else close(fd); } if(dir == NULL) return -1; memset(devname,0,sizeof(devname)); //这行是后加的,否则libsensor.so运行之后会crash strcpy(devname, dirname); 7、对Android.mk进行修改。 对编译出来的libsensor.so库需要编译到指定的位置/system/lib/hw下系统才能加载,但是遗憾的是用device/htc/passion- common/libsensors/Sensors.c进行编译,编译之后的库不能被编译到指定的位置,对Android.mk进行修改,强制将 libsensor.so拷到指定的目录。 PRODUCT_COPY_FILES := / out/target/product/ARMv7/obj/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so:system/lib/hw/sensors.default.so 这样就可以强制的将制定目录下的文件拷到指定的目录。 对以上的关键点进行修改,就可以实现自己的libsensor.so了 三、Android中应用层中相关测试程序的开发。 对Android中各个sensors的测试有很多方法。可以下载各种应用程序对sensors进行测试。本人比较喜欢自己动手,所以就自己做了 一个应用程序对sensor进行测试。 在Android应用层要实现Sensor的相关功能功能。 在Android中,和Sensor相关的几个类是: SensorManager : 通过它实现系统对Sensor的相关调用。 SensorEvent :对各个Sensor数据的封装,具体可以参考Android的开发文档。 SensorEventListener :对Sensor数据的监视,一旦有数据,就会调相应的函数。 Sensor : 对Sensor的封装。 为了实现Sensor的相关功能。 1、定义要监控的Sensor。 sensor = Sensor.TYPE_ACCELEROMETER; 2、实现SensorEvenetListener。 private SensorEventListener mListener = new SensorEventListener() { public void onSensorChanged(SensorEvent event) { ... ... handle sensor data code ... ... } } public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } }; 3、向系统注册SensorEventListener。 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = (mSensorManager.getSensorList(sensor)).get(0); mSensorManager.registerListener(mListener, mSensor,SensorManager.SENSOR_DELAY_NORMAL); 用完之后,记得注销 mSensorManager.unregisterListener(mListener); 这样就可以用Sensor了,当sensor的数据发生变化时,就会传过来。

 

http://blog.csdn.net/qiaoshouliang/article/details/9210949

 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/4109620.html

转载地址:https://blog.csdn.net/FLY_THINK2012/article/details/101840956 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android Sensor Driver(一)——概述
下一篇:Bluez HID分析--Linux kernel部分

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月10日 21时58分40秒