设备驱动外传感器Word格式.docx
- 文档编号:3297703
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:10
- 大小:422.50KB
设备驱动外传感器Word格式.docx
《设备驱动外传感器Word格式.docx》由会员分享,可在线阅读,更多相关《设备驱动外传感器Word格式.docx(10页珍藏版)》请在冰点文库上搜索。
∙第三层次AndroidJavaFramwork框架层
∙第四层次Java应用程序
本文重点关注硬件抽象层,JNI以及Framework。
1.1硬件抽象层
硬件抽象层通过例如open(),read(),write(),ioctl(),poll()等函数调用的方式,与底层设备驱动程序进行交互,而这些函数调用是底层设备驱动程序事先准备好的。
用于交互的关键是文件描述符fd,fd通过open()打开G-sensor设备节点而得到,即fd=open("
/dev/bma220"
O_RDONLY);
而/dev/bma220这个设备节点是在底层设备驱动中注册完成的。
其他的函数调用如read(),write()等都通过该文件描述符fd对G-sensor设备进行操作。
1.2JNI(JavaNativeInterface)
JNI层可以认为是整个体系结构中的配角,概括地讲,它就完成了一项任务,既实现从C++语言到Java语言的转换。
JNI层为JavaFramework层提供一系列接口,而这些接口函数的具体实现中,利用例如module->
methods->
open(),sSensorDevice->
data_open(),
sSensorDevice->
poll()等回调函数与硬件抽象层进行交互。
而这些open(),poll()回调函数在硬件抽象层中具体实现。
1.3JavaFramework
Framework层提供各种类和类的对象,可作为系统的守护进程运行,也可供上层应用程序的使用。
例如类SensorManager,它作为系统的守护进程在初始化的时候开始运行,其子类SensorThread中的子类SensorThreadRunnable通过sensors_data_poll()实现了对G-sensor数据的轮训访问,而sensors_data_poll()通过JNI层转换到硬件抽象层去具体实现poll()。
2数据结构
一般境况下,硬件抽象层对硬件的描述都分为control和data两大类。
2.1sensors_control_context_t
structsensors_control_context_t{
structsensors_control_device_tdevice;
intfd;
};
structsensors_control_device_t{
structhw_device_tcommon;
int(*open_data_source)(structsensors_control_device_t*dev);
int(*activate)(structsensors_control_device_t*dev,
inthandle,intenabled);
int(*set_delay)(structsensors_control_device_t*dev,int32_tms);
int(*wake)(structsensors_control_device_t*dev);
2.2sensors_data_context_t
structsensors_data_context_t{
structsensors_data_device_tdevice;
structsensors_data_device_t{
int(*data_open)(structsensors_data_device_t*dev,intfd);
int(*data_close)(structsensors_data_device_t*dev);
int(*poll)(structsensors_data_device_t*dev,
sensors_data_t*data);
}
structhw_device_t{
uint32_ttag;
uint32_tversion;
structhw_module_t*module;
int(*close)(structhw_device_t*device);
structhw_module_t{
uint16_tversion_major;
uint16_tversion_minor;
constchar*id;
constchar*name;
constchar*author;
structhw_module_methods_t*methods;
structhw_module_methods_t{
int(*open)(conststructhw_module_t*module,constchar*id,
structhw_device_t**device);
下文将通过对(*open),(*open_data_source),(*data_open)和(*poll)的代码分析,探索Android的各层次架构。
3四大函数
3.1module->
open()
1)Framework
SensorService作为系统守护进程运行,其类的构造函数实现_sensors_control_init()。
2)JNI
为_sensors_control_init()提供接口android_init(),并执行回调函数module->
open();
3)硬件抽象层
具体实现(*open),该函数为所有G-sensor回调函数的指针赋值。
3.2sSensorDevice->
open_data_source()
SensorService作为系统守护进程运行,其类的一个公有成员ParcelFileDescriptor通过实现_sensors_control_open()得到设备的文件描述符。
为_sensors_control_open()提供接口android_open(),并执行回调函数sSensorDevice->
open_data_source();
具体实现(*open_data_source),该函数通过打开G-sensor的设备节点得到文件描述符fd=open("
4)设备驱动层
通过misc_register()对G-sensor设备进行注册,建立设备节点。
3.3sSensorDevice->
data_open()
SensorManager作为系统守护进程运行,其子类SensorThreadRunnable的行为函数run()实现sensors_data_open()。
为sensors_data_open()提供接口sensors_data_open(),并执行回调函数sSensorDevice->
data_open();
具体实现(*data_open),该函数的功能就是将已经得到的文件描述符fd复制一份到sensors_data_context结构体中的dev->
fd,以便为处理数据的回调函数如(*poll)使用。
3.4sSensorDevice->
poll()
SensorManager作为系统守护进程运行,其子类SensorThreadRunnable的行为函数run()实现sensors_data_poll(values,status,timestamp),其目的是通过此函数得到从底层传上来的有关G-sensor的数据values,status和timestamp,再通过此类的一个行为函数listener.onSensorChangedLocked(sensorObject,values,timestamp,accuracy);
为上层应用程序提供了得到G-sensor设备数据的接口函数。
为sensors_data_poll()提供接口sensors_data_poll(),并执行回调函数sSensorDevice->
poll(sSensorDevice,&
data);
其中,得到的data就是从底层传上来的G-sensor数据,然后通过下图的方式将data中对应的数据分别赋给values,status和timestamp。
具体实现(*poll),该函数通过ioctl()实现与底层驱动程序的交互。
ioctl(dev->
fd,BMA220_GET_ORIENTATION,&
orient_value);
其中,dev->
fd即刚才由(*data_open)得到的文件描述符,BMA220_GET_ORIENTATION为ioctl的一个命令,具体实现由底层驱动程序完成,orient_value即得到的G-sensor数据,它通过下图的方式将相对应的数据赋给了data结构体中的values,status和time,从而最终实现了从底层到上层的数据通信。
与硬件抽象层交互的read(),write(),ioctl()函数由设备驱动实现。
以ioctl()的一条命令BMA220_GET_ORIENTATION为例,
通过bma220_get_orientation(data)得到G-sensor的数据data,然后将其从内核空间上传到用户空间的arg.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设备 驱动 外传