内容发布更新时间 : 2024/12/24 0:34:14星期一 下面是文章的全部内容请认真阅读。
一、首先建立这样一个全局的观念:
Android中sensor在Android系统架构中的位置及其工作。方框图如下:
从以上方框图中,可以看出Android中sensor在系统分为四层:驱动层(Sensor
Driver)、硬件抽象层(Native)、中间层(Framework)、应用层(Java)。硬件抽象层与中间层可以合并一起作为Framework层。
针对我们xx这里一个具体的Gsensor,下面将以具体的源码形式来讲解以上的这个系统框图。
二、驱动层(Sensor Driver Layer)
芯片ADXL345为GSensor,至于硬件的具体工作原理,须分析ADXL345的DataSheet。驱动源码位于:xx\\custom\\common\\kernel\\accelerometer\\adxl345目录。
由于ADXL345是以I2C形式接口挂接到Linux系统,因此同时需要分析Linux的I2C子系统架构(略)。其源码位于:
1、 xx\\platform\\xx\\kernel\\drivers\\i2c 2、 kernel\\drivers\\i2c
查看ADXL345.c文件,分析针对于其硬件工作原理的几个函数。硬件初始化:
[cpp] view plaincopy
1. static int adxl345_init_client(struct i2c_client *client, int reset_cali) 2. 3. { 4.
5. struct adxl345_i2c_data *obj = i2c_get_clientdata(client); 6.
7. int res = 0; 8. 9. 10.
11. adxl345_gpio_config();//配置GPIO口,这里由于不使用中断,所以将中断引脚配置成输入输出口。 12. 13. 14.
15. res = ADXL345_CheckDeviceID(client); //检测设备ID,通过读ADXL345的DEVID寄存器 16.
17. if(res != ADXL345_SUCCESS) 18.
19. {
20.
21. return res; 22.
23. } 24. 25. 26.
27. res = ADXL345_SetPowerMode(client, false);//设置电源模式,ADXL345有几种电源模式,这里设置false值指不让芯片处于messure模式 28.
29. if(res != ADXL345_SUCCESS) 30.
31. { 32.
33. return res; 34.
35. } 36. 37. 38. 39. 40.
41. res = ADXL345_SetBWRate(client, ADXL345_BW_100HZ);//设置带宽,100Hz 42.
43. if(res != ADXL345_SUCCESS ) //0x2C->BW=100Hz 44.
45. { 46.
47. return res; 48.
49. } 50. 51. 52.
53. //设置数据格式,具体见datasheet 54.
55. res = ADXL345_SetDataFormat(client, ADXL345_FULL_RES|ADXL345_RANGE_2G); 56.
57. if(res != ADXL345_SUCCESS) //0x2C->BW=100Hz 58.
59. { 60.
61. return res; 62.
63. }
64. 65. 66.
67. gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = obj->reso->sensitivity; 68. 69. 70.
71. //设置中断寄存器,关闭中断 72.
73. res = ADXL345_SetIntEnable(client, 0x00);//disable INT 74.
75. if(res != ADXL345_SUCCESS) 76.
77. { 78.
79. return res; 80.
81. } 82. 83. 84.
85. if(0 != reset_cali) 86.
87. { 88.
89. /*reset calibration only in power on*/ 90.
91. res = ADXL345_ResetCalibration(client); 92.
93. if(res != ADXL345_SUCCESS) 94.
95. { 96.
97. return res; 98.
99. } 100.
101. } 102. 103. 104.
105. #ifdef CONFIG_ADXL345_LOWPASS 106.
107. memset(&obj->fir, 0x00, sizeof(obj->fir)); 108.