如何理解Sensor架构 - 华清远见 - 图文

frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java 如果需要旋转, MyOrientationListener则会调用以下代码进行窗口旋转: mWindowManager.setRotation(rotation, false, mFancyRotationAnimation); 问题总结:

1.将lis302 G-sensor driver从spi总线移植到lis331 i2c总线时遇到的一些问题:

a).lis331用的中断管脚与lis302不同,通过硬件原理图可知lis331用的是GPN3.故需要在driver的probe中设置 writel((readl(S3C64XX_GPNCON) & ~(0xc0)) | (0x80), S3C64XX_GPNCON); b).通过硬件原理图可知lis331的时钟线和数据线用的是i2c chanel1。故需要在

/kernel/arch/arm/mach-s3c6410/mach-ur6410.c文件中i2c chanel1即结构变量i2c_devs1[] __initdata中

添加G-sensor的设备信息,以使driver成功加载。

c).lis331 driver是中断驱动的,每次G-sensor搜集到新数据都会产生中断,driver要在中断中通过i2cbus将数据从G-sensor中取回。由 于i2cbus的读写操作是可能休眠的,而中断中不允许调用可能休眠的函数,故通过linux提供的延迟机制work_queue来解决。 问题b)的原理:

i2c驱动包括总线驱动和设备驱动

总线驱动只是提供对一条特定总线的读写机制,本身并不会去做通信。通过i2c总线驱动提供的函数,设备驱动可以忽略不同总线控制器的差异,不考虑其细节的与硬件设备通讯。

一个总线驱动通常需要2个模块:struct i2c_adapter和struct i2c_algorithm 定义在include/linux/i2c.h中

struct i2c_algorithm是为了i2c总线驱动和具体的i2c总线能够对话。很多i2c总线驱动定义和使用它们自己的algorithm.对于一些i2c总线驱动来说,很多algorithm已经写好了。

drivers/i2c/buses中包含所有的i2c总线驱动,drivers/i2c/algos中包含了所有的algorithm. 设备驱动通过总线驱动中的读写函数同具体的i2c设备通信,一个设备驱动用两个模块来描述:struct i2c_driver 和struct i2c_client.

i2c_client代表着位于adapter总线上地址为address,使用driver来驱动的一个设备。它将总线驱动,设备驱动以及设备地址绑定到了一起。

2.实现sensor.so与driver之间的ioctl时遇到的问题:

sensor.so中pull数据时打开的文件是input子系统中逻辑input设备的表示层即event handler层中的evdev.c创建的,如果通过此文件描述符实现ioctl,则只能实现与event handler通信,无法实际控制 Gsnsor driver. event handler层与物理设备的实际driver是通过input.c联系起来的,但input.c中没有实现将event handler层的ioctl传递到实际driver中。

故采用另创建一个设备节点用来实现sensor.so与driver之间的ioctl. 下面关于sensor转自:

http://blog.csdn.net/myarrow/article/details/9044689 1. 简介

在了解Sensor工作流程以前,一直以为其事件是通过Event Hub来进行输送的,可是研究完Android4.0代码之后,才发现自己错了。 其主要框架如下图所示:

2.功能模块

2.1 SensorManager.java 与下层接口功能:

1) 在SensorManager函数中

(1) 调用native sensors_module_init初始化sensor list,即实例化native中的SensorManager (2) 创建SensorThread线程 2) 在类SensorThread中

(1) 调用native sensors_create_queue创建队列

(2) 在线程中dead loop地调用native sensors_data_poll以从队列sQueue中获取事件(float[] values = new float[3];)

(3) 收到事件之后,报告sensor event给所有注册且关心此事件的listener 与上层的接口功能:

1) 在onPause时取消listener注册 2) 在onResume时注册listener 3) 把收到的事件报告给注册的listener 2.2 android_hardware_SensorManager.cpp

实现SensorManager.java中的native函数,它主要调用SenrsorManager.cpp和SensorEventQueue.cpp中的类来完成相关的工作。 2.3 SensorManager.cpp [cpp]

view plaincopyclass SensorManager : public ASensorManager, public Singleton { public:

SensorManager(); //调用assertStateLocked ~SensorManager();

//调用assertStateLocked,并返回mSensorList

ssize_t getSensorList(Sensor const* const** list) const; // 返回mSensorList中第一个类型与type一致的sensor Sensor const* getDefaultSensor(int type);

// 调用mSensorServer->createSensorEventConnection创建一个连接(ISensorEventConnection) // 并用此连接做为参数创建一个SensorEventQueue对象并返回

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4