【发明内容】
本发明要解决的技术问题,在于提供一种在安卓系统上实现支持各种传感器的输入子系统,让用户能体验到更多类型的传感器带来的功能和乐趣。
本发明是这样实现的:一种在安卓系统上实现支持各种传感器的输入子系统,所述输入子系统位于所述安卓系统的内核驱动层上,所述输入子系统包括:设备驱动层模块、核心层模块以及事件处理层模块;所述设备驱动层模块中包括一传感器驱动单元;
所述设备驱动层模块提供对传感器各寄存器的读写访问,并根据安卓系统的硬件抽象层的命令打开、关闭、设置传感器;
所述传感器驱动单元驱动所述传感器采集信号,然后将信号的数值、类型信息上报给核心层;所述传感器驱动单元还负责配置一抽象输入设备模块,安卓系统的硬件抽象层可以通过所述抽象输入设备模块的接口监听、读取传感器处理的事件;
所述核心层模块为所述设备驱动层模块提供了各种编程接口;所述核心层模块将所述传感器驱动单元驱动上报的信号的数值、类型信息转换为安卓系统能识别的输入事件,并将此输入事件转发所述抽象输入设备模块进行存储;
所述事件处理层模块在安卓系统内核中注册所述抽象输入设备模块,并为安卓系统的硬件抽象层提供了访问抽象输入设备模块的接口,安卓系统的硬件抽象层便能从抽象输入设备模块中读取所述输入事件。
本发明具有如下优点:本发明的输入子系统包括:设备驱动层模块、核心层模块以及事件处理层模块;其中设备驱动层模块中包括传感器驱动单元;传感器驱动单元驱动所述传感器采集信号,然后将信号的数值、类型信息上报给核心层,并负责配置一抽象输入设备模块;核心层模块将传感器驱动单元上报的信号信息转换为安卓系统可识别的输入事件,并将输入事件转发给抽象输入设备模块进行存储;事件处理层模块为安卓系统的硬件抽象层提供了访问抽象输入设备模块的接口,从而实现在安卓系统上支持各种传感器,其输入子系统扩展性强,系统可以支持1到8种传感器,可移植性好;让用户能体验到更多类型的传感器带来的功能和乐趣。
【具体实施方式】
如图2所示,本发明的一种在安卓系统上实现支持各种传感器的输入子系统,所述输入子系统位于所述安卓系统的内核驱动层上,所述输入子系统包括:设备驱动层模块、核心层模块以及事件处理层模块;所述设备驱动层模块中包括一传感器驱动单元;
所述设备驱动层模块提供对传感器各寄存器的读写访问,并根据安卓系统的硬件抽象层的命令打开、关闭、设置传感器;
所述传感器驱动单元驱动所述传感器采集信号,然后将信号的数值、类型信息上报给核心层;所述传感器驱动单元还负责配置一抽象输入设备模块,安卓系统的硬件抽象层可以通过所述抽象输入设备模块的接口监听、读取传感器处理的事件;
所述核心层模块为所述设备驱动层模块提供了各种编程接口;所述核心层模块将所述传感器驱动单元驱动上报的信号的数值、类型信息转换为安卓系统能识别的输入事件,并将此输入事件转发所述抽象输入设备模块进行存储;其中,所述设备驱动层使用到的核心层的各种编程接口包括:input_allocate_device()接口、set_bit()接口、input_set_abs_params()接口、input_register_device()接口、input_report_abs()接口、input_report_rel()接口、input_sync()、input_unregister_device()接口;
所述事件处理层模块在安卓系统内核中注册所述抽象输入设备模块,并为安卓系统的硬件抽象层提供了访问抽象输入设备模块的接口,安卓系统的硬件抽象层便能从抽象输入设备模块中读取所述输入事件。
其中,所述传感器驱动单元负责配置一抽象输入设备模块,并驱动所述各种传感器采集信号的过程,具体为:
一、所述传感器驱动单元在设备驱动层模块加载函数中,调用所述input_allocate_device()接口分配抽象输入设备模块并初始化;
设置所述抽象输入设备模块的名称;调用所述set_bit()接口告知所述输入子系统该抽象设备模块支持的事件类型,所述事件类型包括同步事件EV_SYN、绝对坐标EV_ABS、相对坐标EV_REL事件;其中若是支持绝对坐标EV_ABS事件还需要调用所述input_set_abs_params()接口设置绝对坐标EV_ABS事件的绝对值坐标的范围;
调用所述input_register_device()接口注册所述抽象输入设备模块,注册之后在安卓系统内核驱动层的/dev/input路径下将出现该抽象输入设备模块,安卓系统的硬件抽象层通过读取所述路径的抽象输入设备模块获取各传感器的上报的输入事件;
二、在所述设备驱动层模块的中断处理函数中,调用所述input_report_abs()接口或input_report_rel()接口上报各传感器采集的信号的数值、类型信息,接着调用所述input_sync()接口向核心层模块发出一同步事件EV_SYN,此时表示设备驱动模块已经发出了一个完整的报告,各传感器采集的信号的数值、类型信息通过核心层的转换为输入事件、输入事件通过事件处理层的传递,最终送达传感器硬件抽象层;
三、当采集完毕各传感器的数值后,在设备驱动层模块的模块卸载函数中调用input_unregister_device()接口注销抽象输入设备模块。
这里值得一提的是:为了使系统能够更完善地支持8种传感器,本发明还对现有技术中传感器的硬件抽象层的sensor.c中实现了:1、传感器信息的添加;2、数据结构的重定义;3、函数接口的实现。
1、传感器信息的添加具体为:在硬件抽象层的参考代码sensors_qemu.c中的struct sensor_t sSensorListInit[]中,列出了支持的几款传感器的信息;在sensor.c的struct sensor_t sSensorListInit[]中,需要添加所有支持的传感器的信息,其中最为关键的是每个传感器的sensor_t.handle和sensor_t.type这两个参数必须和安卓系统的JAVA框架层中定义的一致。
本发明采用一种简便的方法使不同的产品可以共用相同的硬件抽象层代码:方法如下:在安卓系统的device目录下的BoardConfig.mk中定义产品对各种传感器的支持情况;在sensor.c的同级目录下的Android.mk中根据BoardConfig.mk中的对传感器的支持情况定义宏,每个宏代表产品支持某种传感器;sensor.c中定义一个字符型全局变量,该全局变量的值根据Android.mk中定义的宏来设置,每一个比特表示对某种传感器的支持情况,这样该变量就可以表示对所有8种类型传感器的支持情况,sensor.c中根据此变量的值及Android.mk中定义的宏控制代码分支和循环体次数;若产品不支持某种传感器,那么与该传感器相关的分支语句就会根据宏定义而关闭,有效避免了代码中的冗余逻辑。
2、数据结构的重定义具体为:传感器的硬件抽象层有两个抽象的概念:控制设备和数据设备。控制设备即传感器驱动单元,其句柄作为ioctl函数的参数,向传感器发出使能、禁用等命令;数据设备文件即抽象输入设备模块,其句柄在读取传感器数据时作为read函数的参数。在使用控制设备或数据设备的句柄前必须先打开设备获得句柄,使用完后要关闭设备。打开和关闭控制设备是由传感器系统服务类SensorService调用下来的,而打开、读取和关闭数据设备是由实现传感器系统核心的管理类SensorManager调用下来的。
其中一般用struct_sensors_control_device_t表征传感器抽象控制设备的数据类型,struct SensorControl是对struct sensors_control_device_t的扩展。sensors_qemu.c中对struct SensorControl的定义如下:
一般用struct sensors_data_device_t表征传感器抽象数据设备的数据类型,struct SensorData是对struct sensors_data_device_t的扩展。sensors_qemu.c中对struct SensorData的定义如下:
SensorControl.fd和SensorData.events_fd都只能保存一个设备句柄。为了在硬件抽象层中支持多个传感器,需要保存多个传感器的控制设备句柄和数据设备句柄,因此本发明在sensor.c中将SensorControl.fd和SensorData.events_fd相应地扩展成数组,例如将SensorControl.fd扩展为SensorControl.fd[MAX_NUM_SENSORS],将SensorData.events_fd扩展为SensorData.events_fd[MAX_NUM_SENSORS]。
3、函数接口的实现具体为:sensors.h中定义了传感器硬件抽象层为JAVA框架层提供的函数接口,如:
sensors_module_t.get_sensors_list()
sensors_control_device_t.open_data_source()
sensors_control_device_t.activate()
sensors_control_device_t.set_delay()
sensors_control_device_t.wake()
sensors_data_device_t.data_open()
sensors_data_device_t.data_close()
sensors_data_device_t.poll()
sensors_control_open()
sensors_control_close()
sensors_data_open()
sensors_data_close()这些函数需要在sensor.c中实现。
为了使系统能支持所有8种传感器,本发明还对现有技术中传感器的JAVA框架层进行了完善;具体为:
在SensorManager.java这个类中SensorManager的构造函数中调用SensorManager.getLegacySensorType()函数获取Sensor类对象的传感器类型并将其转换为SensorManager所识别的传感器类型。getLegacySensorType()函数中已有针对加速度、磁力等类型传感器的判断分支,本发明在函数中增加对其余类型传感器的判断分支,每个判断分支中返回相应的SensorManager所识别的传感器类型。通过这样的修改SensorManager便可支持所有8种传感器。
SensorManager.registerListener()函数提供了为指定的传感器注册传感器事件监听者(SensorEventListener)的功能,在函数中根据输入参数传感器上报速率rate的不同值,设置传感器的采样延时时间,该采样延时时间将传给硬件抽象层并通过set_delay()函数去设置传感器;从而完善支持8种传感器。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。