如何理解Sensor架构华清远见.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何理解Sensor架构? 本篇文章来自华清远见嵌入式学院讲师:倪键树。主要给大家讲解如何理解如何理解Sensor架构,希望看完后对新手有一定的帮助。 1、Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 (accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temperature)和距离传感器(proximity)等。 Android实现传感器系统包括以下几个部分: 各部分之间架构图如下: 2、Sensor HAL层接口 Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,Android中Sensor的HAL接口定义在:hardware/libhardware/include/hardware/sensors.h 对传感器类型的定义: 传感器模块的定义结构体如下: 该接口的定义实际上是对标准的硬件模块hw_module_t的一个扩展,增加了一个get_sensors_list函数,用于获取传感器的列表。 对任意一个sensor设备都会有一个sensor_t结构体,其定义如下: 每个传感器的数据由sensors_event_t结构体表示,定义如下: 其中,sensor为传感器的标志符,而不同的传感器则采用union方式来表示,sensors_vec_t结构体用来表示不同传感器的数据,sensors_vec_t定义如下: Sensor设备结构体sensors_poll_device_t,对标准硬件设备 hw_device_t结构体的扩展,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t结构体中,poll函数用来获取底层数据,调用时将被阻塞定义如下: 控制设备打开/关闭结构体定义如下: 3、Sensor HAL实现(以LM75温度传感器为例子) (1)打开设备流程图 (2)实现代码分析 在代码中含有两个传感器ADC电位器和LM75温度传感器,所以在sensor.c中,首先需要定义传感器数组device_sensor_list[],其实就是初始化struct sensor_t结构体,初始化如下: 定义open_sensors函数,来打开Sensor模块,代码如下: 在这个方法中,首先需要为hw_device_t分配内存空间,并对其初始化,设置重要方法的实现。 control_open_data_source()打开传感器并使能设备: 调用sensor__data_poll方法读取数据: /*轮询读取数据*/ static int sensors__data_poll(struct sensors_data_context_t *dev, sensors_data_t * values) { int n; int mag; float temp; char buf[10]; while (1) { if(count % 3 == 2) // 读取ADC值 { if( read(dev-event_fd[0], mag, sizeof(mag)) 0) { LOGE(read adc error); }else{ dev-sensors[ID_MAGNETIC_FIELD].magnetic.v[0] =(float)mag; LOGE(read adc %f\n,(float)mag); *values = dev-sensors[ID_MAGNETIC_FIELD]; values-sensor = ID_MAGNETIC_FIELD; count++; } usleep(500000); return ID_MAGNETIC_FIELD; } else if(count%3 == 1) //读取温度传感器值 { memset(buf, 0 ,sizeof(buf)); if((n = read(dev-event_fd[1], buf, 10)) 0) { LOGE(read temp error); }else{ buf[n - 1] = \0; temp =(float) (atoi(buf) / 1000); dev-sensors[ID_TEMPERATURE].temperature = temp; LOGE(read temp %f\n,temp); *values = dev-sensors[ID_TEMPERATURE]; values-sensor = ID_TEMPERATURE; co

文档评论(0)

xina171127 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档