gsensor驱动调用框架流程

一、首先建立这样一个全局的观念:

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.

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