• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# SENSOR<a name="ZH-CN_TOPIC_0000001078401780"></a>
2
3-   [概述](#section3634112111)
4    -   [接口说明](#section188213414114)
5
6-   [开发指导](#section1140943382)
7    -   [开发步骤](#section7893102915819)
8
9-   [开发实例](#section257750691)
10-   [测试指导](#section106021256121219)
11
12## 概述<a name="section3634112111"></a>
13
14Sensor(传感器)驱动模块为上层Sensor服务系统提供稳定的Sensor基础能力API,包括Sensor列表查询、Sensor启停、Sensor订阅及去订阅,Sensor参数配置等功能;基于HDF(**H**ardware  **D**river  **F**oundation)驱动框架开发的Sensor驱动模型,实现跨操作系统迁移,器件差异配置等功能。Sensor驱动模型如下图1所示:
15
16**图 1**  Sensor驱动模型图<a name="fig10451455446"></a>
17![](figure/Sensor驱动模型图.png "Sensor驱动模型图")
18
19Sensor驱动模型对外开放的API接口能力如下:
20
21-   提供Sensor HDI(**H**ardware  **D**river  **I**nterface)能力接口,简化服务开发。
22-   提供Sensor驱动模型能力接口:依赖HDF驱动框架实现Sensor器件驱动的注册,加载,去注册,器件探测等能力,提供同一类型Sensor器件驱动归一接口, 寄存器配置解析操作接口,总线访问抽象接口,平台抽象接口。
23-   提供开发者实现的能力接口:依赖HDF驱动框架的HCS\(**H**DF  **C**onfiguration  **S**ource\)配置管理,根据同类型Sensor差异化配置,实现Sensor器件参数序列化配置和器件部分操作接口,简化Sensor器件驱动开发。
24
25### 接口说明<a name="section188213414114"></a>
26
27Sensor驱动模型对HDI开放的API接口功能,参考表1。
28
29**表 1**  Sensor驱动模型对外API接口功能介绍
30
31<a name="table203963834718"></a>
32<table><thead align="left"><tr id="row173964834716"><th class="cellrowborder" valign="top" width="8.260000000000002%" id="mcps1.2.4.1.1"><p id="p17401913133218"><a name="p17401913133218"></a><a name="p17401913133218"></a>功能分类</p>
33</th>
34<th class="cellrowborder" valign="top" width="45.4%" id="mcps1.2.4.1.2"><p id="p20921103144918"><a name="p20921103144918"></a><a name="p20921103144918"></a>接口名</p>
35</th>
36<th class="cellrowborder" valign="top" width="46.339999999999996%" id="mcps1.2.4.1.3"><p id="p109216317495"><a name="p109216317495"></a><a name="p109216317495"></a>功能描述</p>
37</th>
38</tr>
39</thead>
40<tbody><tr id="row4397198154712"><td class="cellrowborder" valign="top" width="8.260000000000002%" headers="mcps1.2.4.1.1 "><p id="p8437193673211"><a name="p8437193673211"></a><a name="p8437193673211"></a>查询操作</p>
41</td>
42<td class="cellrowborder" valign="top" width="45.4%" headers="mcps1.2.4.1.2 "><p id="p11001322173912"><a name="p11001322173912"></a><a name="p11001322173912"></a>int32_t <strong id="b935414557240"><a name="b935414557240"></a><a name="b935414557240"></a>GetAllSensors</strong>(struct SensorInformation **sensorInfo, int32_t *count)</p>
43</td>
44<td class="cellrowborder" valign="top" width="46.339999999999996%" headers="mcps1.2.4.1.3 "><p id="p199227318499"><a name="p199227318499"></a><a name="p199227318499"></a>获取系统中注册的所有传感器信息,一种类型传感器信息包括传感器名字、设备厂商、固件版本号、硬件版本号、传感器类型编号、传感器标识、最大量程、精度、功耗。</p>
45</td>
46</tr>
47<tr id="row1839716854716"><td class="cellrowborder" rowspan="5" valign="top" width="8.260000000000002%" headers="mcps1.2.4.1.1 "><p id="p06071477324"><a name="p06071477324"></a><a name="p06071477324"></a>配置操作</p>
48</td>
49<td class="cellrowborder" valign="top" width="45.4%" headers="mcps1.2.4.1.2 "><p id="p38874252376"><a name="p38874252376"></a><a name="p38874252376"></a>int32_t <strong id="b199602219271"><a name="b199602219271"></a><a name="b199602219271"></a>Enable</strong>(int32_t sensorId)</p>
50</td>
51<td class="cellrowborder" valign="top" width="46.339999999999996%" headers="mcps1.2.4.1.3 "><p id="p5922331114916"><a name="p5922331114916"></a><a name="p5922331114916"></a>使能一种传感器设备,只有数据订阅者使能传感器后,才能获取订阅的传感器数据。</p>
52</td>
53</tr>
54<tr id="row6397138134713"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p6923143184914"><a name="p6923143184914"></a><a name="p6923143184914"></a>int32_t <strong id="b84601875330"><a name="b84601875330"></a><a name="b84601875330"></a>Disable</strong>(int32_t sensorId)</p>
55</td>
56<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p139231531184912"><a name="p139231531184912"></a><a name="p139231531184912"></a>去使能一种传感器设备。</p>
57</td>
58</tr>
59<tr id="row43981283476"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p992473112496"><a name="p992473112496"></a><a name="p992473112496"></a>int32_t <strong id="b16691194511438"><a name="b16691194511438"></a><a name="b16691194511438"></a>SetBatch</strong>(iint32_t sensorId, int64_t samplingInterval, int64_t reportInterval)</p>
60</td>
61<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p14924203134910"><a name="p14924203134910"></a><a name="p14924203134910"></a>设置一种传感器的数据采样间隔和数据上报间隔。</p>
62</td>
63</tr>
64<tr id="row439813812472"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p170411511281"><a name="p170411511281"></a><a name="p170411511281"></a>int32_t <strong id="b170414153284"><a name="b170414153284"></a><a name="b170414153284"></a>SetMode</strong>(int32_t sensorTypeId, SensorUser *user, int32_t mode)</p>
65</td>
66<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p107051159281"><a name="p107051159281"></a><a name="p107051159281"></a>设置一种传感器的工作模式,不同的工作模式,上报数据方式不同。</p>
67</td>
68</tr>
69<tr id="row123998813470"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p492513120494"><a name="p492513120494"></a><a name="p492513120494"></a>int32_t <strong id="b7501191019330"><a name="b7501191019330"></a><a name="b7501191019330"></a>SetOption</strong>(int32_t sensorId, uint32_t option)</p>
70</td>
71<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p5926031124914"><a name="p5926031124914"></a><a name="p5926031124914"></a>设置一种传感器量程,精度等可选配置。</p>
72</td>
73</tr>
74<tr id="row939914814478"><td class="cellrowborder" rowspan="2" valign="top" width="8.260000000000002%" headers="mcps1.2.4.1.1 "><p id="p1039815743211"><a name="p1039815743211"></a><a name="p1039815743211"></a>数据订阅操作</p>
75</td>
76<td class="cellrowborder" valign="top" width="45.4%" headers="mcps1.2.4.1.2 "><p id="p11530101054411"><a name="p11530101054411"></a><a name="p11530101054411"></a>int32_t <strong id="b0569161217334"><a name="b0569161217334"></a><a name="b0569161217334"></a>Register</strong>(RecordDataCallback cb)</p>
77</td>
78<td class="cellrowborder" valign="top" width="46.339999999999996%" headers="mcps1.2.4.1.3 "><p id="p892633118493"><a name="p892633118493"></a><a name="p892633118493"></a>订阅者注册传感器数据回调函数,系统会将获取到的传感器数据上报给订阅者。</p>
79</td>
80</tr>
81<tr id="row10716713314"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p196491214133110"><a name="p196491214133110"></a><a name="p196491214133110"></a>int32_t <strong id="b13758151483317"><a name="b13758151483317"></a><a name="b13758151483317"></a>Unregister</strong>(void)</p>
82</td>
83<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p5817133119"><a name="p5817133119"></a><a name="p5817133119"></a>订阅者去注册传感器数据回调函数。</p>
84</td>
85</tr>
86<tr id="row15679121655614"><td class="cellrowborder" rowspan="2" valign="top" width="8.260000000000002%" headers="mcps1.2.4.1.1 "><p id="p6596162112564"><a name="p6596162112564"></a><a name="p6596162112564"></a>接口实例</p>
87</td>
88<td class="cellrowborder" valign="top" width="45.4%" headers="mcps1.2.4.1.2 "><p id="p13679191616561"><a name="p13679191616561"></a><a name="p13679191616561"></a>const struct SensorInterface *<strong id="b292451515"><a name="b292451515"></a><a name="b292451515"></a>NewSensorInterfaceInstance</strong>(void)</p>
89</td>
90<td class="cellrowborder" valign="top" width="46.339999999999996%" headers="mcps1.2.4.1.3 "><p id="p19679181612563"><a name="p19679181612563"></a><a name="p19679181612563"></a>创建传感器接口实例。</p>
91</td>
92</tr>
93<tr id="row9680191675612"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p15680111655611"><a name="p15680111655611"></a><a name="p15680111655611"></a>int32_t <strong id="b1144297156"><a name="b1144297156"></a><a name="b1144297156"></a>FreeSensorInterfaceInstance</strong>(void)</p>
94</td>
95<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p18680916165620"><a name="p18680916165620"></a><a name="p18680916165620"></a>释放传感器接口实例。</p>
96</td>
97</tr>
98</tbody>
99</table>
100
101Sensor驱动模型对驱动开发者开放的功能接口,驱动开发者无需实现,直接使用,参考表2:
102
103**表 2**  Sensor驱动模型对驱动开发者开放的功能接口列表
104
105<a name="table1156812588320"></a>
106<table><thead align="left"><tr id="row756817584327"><th class="cellrowborder" valign="top" width="8.550855085508552%" id="mcps1.2.4.1.1"><p id="p7568125873219"><a name="p7568125873219"></a><a name="p7568125873219"></a>功能分类</p>
107</th>
108<th class="cellrowborder" valign="top" width="45.53455345534553%" id="mcps1.2.4.1.2"><p id="p1756812582328"><a name="p1756812582328"></a><a name="p1756812582328"></a>接口名</p>
109</th>
110<th class="cellrowborder" valign="top" width="45.91459145914592%" id="mcps1.2.4.1.3"><p id="p35681558183210"><a name="p35681558183210"></a><a name="p35681558183210"></a>功能描述</p>
111</th>
112</tr>
113</thead>
114<tbody><tr id="row756875811329"><td class="cellrowborder" rowspan="3" valign="top" width="8.550855085508552%" headers="mcps1.2.4.1.1 "><p id="p5974193991911"><a name="p5974193991911"></a><a name="p5974193991911"></a>设备管理操作接口</p>
115</td>
116<td class="cellrowborder" valign="top" width="45.53455345534553%" headers="mcps1.2.4.1.2 "><p id="p18569158173210"><a name="p18569158173210"></a><a name="p18569158173210"></a>int32_t <strong id="b4994112595516"><a name="b4994112595516"></a><a name="b4994112595516"></a>AddSensorDevice</strong>(const struct SensorDeviceInfo *deviceInfo)</p>
117</td>
118<td class="cellrowborder" valign="top" width="45.91459145914592%" headers="mcps1.2.4.1.3 "><p id="p356935816328"><a name="p356935816328"></a><a name="p356935816328"></a>添加当前类型的传感器设备到传感器设备管理。</p>
119</td>
120</tr>
121<tr id="row195691858113219"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1156945883215"><a name="p1156945883215"></a><a name="p1156945883215"></a>int32_t <strong id="b1736762975518"><a name="b1736762975518"></a><a name="b1736762975518"></a>DeleteSensorDevice</strong>(int32_t sensorId)</p>
122</td>
123<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p2569145833214"><a name="p2569145833214"></a><a name="p2569145833214"></a>删除传感器设备管理里指定的传感器设备。</p>
124</td>
125</tr>
126<tr id="row15699589321"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p6569105811328"><a name="p6569105811328"></a><a name="p6569105811328"></a>int32_t <strong id="b1174510321555"><a name="b1174510321555"></a><a name="b1174510321555"></a>ReportSensorEvent</strong>(const struct SensorReportEvent *events)</p>
127</td>
128<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p15691858193220"><a name="p15691858193220"></a><a name="p15691858193220"></a>上报指定类型传感器的数据到用户侧。</p>
129</td>
130</tr>
131<tr id="row17569145814329"><td class="cellrowborder" rowspan="4" valign="top" width="8.550855085508552%" headers="mcps1.2.4.1.1 "><p id="p10589113932619"><a name="p10589113932619"></a><a name="p10589113932619"></a>Sensor抽象总线和平台操作接口</p>
132</td>
133<td class="cellrowborder" valign="top" width="45.53455345534553%" headers="mcps1.2.4.1.2 "><p id="p145705585322"><a name="p145705585322"></a><a name="p145705585322"></a>int32_t <strong id="b15560203515558"><a name="b15560203515558"></a><a name="b15560203515558"></a>ReadSensor</strong>(struct SensorBusCfg *busCfg, uint16_t regAddr, uint8_t *data, uint16_t dataLen)</p>
134</td>
135<td class="cellrowborder" valign="top" width="45.91459145914592%" headers="mcps1.2.4.1.3 "><p id="p1657018586322"><a name="p1657018586322"></a><a name="p1657018586322"></a>按照配置的总线方式,读取传感器寄存器配置数据。</p>
136</td>
137</tr>
138<tr id="row28712021112011"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p38722218200"><a name="p38722218200"></a><a name="p38722218200"></a>int32_t <strong id="b573774595514"><a name="b573774595514"></a><a name="b573774595514"></a>WriteSensor</strong>(struct SensorBusCfg *busCfg, uint8_t *writeData, uint16_t len)</p>
139</td>
140<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p6872112112201"><a name="p6872112112201"></a><a name="p6872112112201"></a>按照配置的总线方式,将传感器配置数据写入寄存器。</p>
141</td>
142</tr>
143<tr id="row1667512682014"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p146751426192014"><a name="p146751426192014"></a><a name="p146751426192014"></a>int32_t <strong id="b4725135865517"><a name="b4725135865517"></a><a name="b4725135865517"></a>CreateSensorThread</strong>(struct OsalThread *thread, OsalThreadEntry threadEntry, char *name, void *entryPara)</p>
144</td>
145<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p10676112612013"><a name="p10676112612013"></a><a name="p10676112612013"></a>创建指定传感器的定时线程,用于传感器数据上报处理。</p>
146</td>
147</tr>
148<tr id="row1594017462410"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p49401442414"><a name="p49401442414"></a><a name="p49401442414"></a>void <strong id="b17586316565"><a name="b17586316565"></a><a name="b17586316565"></a>DestroySensorThread</strong>(struct OsalThread *thread, uint8_t *status);</p>
149</td>
150<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p69406415243"><a name="p69406415243"></a><a name="p69406415243"></a>销毁传感器创建的定时线程。</p>
151</td>
152</tr>
153<tr id="row19401042245"><td class="cellrowborder" valign="top" width="8.550855085508552%" headers="mcps1.2.4.1.1 "><p id="p694020492417"><a name="p694020492417"></a><a name="p694020492417"></a>通用配置操作接口</p>
154</td>
155<td class="cellrowborder" valign="top" width="45.53455345534553%" headers="mcps1.2.4.1.2 "><p id="p1794064142418"><a name="p1794064142418"></a><a name="p1794064142418"></a>int32_t <strong id="b1740939195611"><a name="b1740939195611"></a><a name="b1740939195611"></a>SetSensorRegCfgArray</strong>(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group);</p>
156</td>
157<td class="cellrowborder" valign="top" width="45.91459145914592%" headers="mcps1.2.4.1.3 "><p id="p49409417249"><a name="p49409417249"></a><a name="p49409417249"></a>根据传感器总线类型信息,下发寄存器分组配置。</p>
158</td>
159</tr>
160<tr id="row1494015418246"><td class="cellrowborder" rowspan="5" valign="top" width="8.550855085508552%" headers="mcps1.2.4.1.1 "><p id="p185291624202618"><a name="p185291624202618"></a><a name="p185291624202618"></a>配置解析操作接口</p>
161<p id="p978482418524"><a name="p978482418524"></a><a name="p978482418524"></a></p>
162</td>
163<td class="cellrowborder" valign="top" width="45.53455345534553%" headers="mcps1.2.4.1.2 "><p id="p994194132410"><a name="p994194132410"></a><a name="p994194132410"></a>int32_t <strong id="b109631149171514"><a name="b109631149171514"></a><a name="b109631149171514"></a>GetSensorBaseConfigData</strong>(const struct DeviceResourceNode *node, struct SensorCfgData *config)</p>
164</td>
165<td class="cellrowborder" valign="top" width="45.91459145914592%" headers="mcps1.2.4.1.3 "><p id="p79411640248"><a name="p79411640248"></a><a name="p79411640248"></a>根据传感器设备HCS资源配置,获取传感器信息,总线配置信息,属性配置等基本配置信息,并初始化对应的基本配置数据结构体。</p>
166</td>
167</tr>
168<tr id="row1171817565518"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p7718165615113"><a name="p7718165615113"></a><a name="p7718165615113"></a>int32_t <strong id="b14392155271515"><a name="b14392155271515"></a><a name="b14392155271515"></a>ParseSensorRegConfig</strong>(struct SensorCfgData *config)</p>
169</td>
170<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p171885685120"><a name="p171885685120"></a><a name="p171885685120"></a>根据传感器设备HCS资源配置,解析寄存器分组信息,并初始化配置数据结构体。</p>
171</td>
172</tr>
173<tr id="row394144192414"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p99411144241"><a name="p99411144241"></a><a name="p99411144241"></a>void <strong id="b1322165619152"><a name="b1322165619152"></a><a name="b1322165619152"></a>ReleaseSensorAllRegConfig</strong>(struct SensorCfgData *config)</p>
174</td>
175<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p17941154152419"><a name="p17941154152419"></a><a name="p17941154152419"></a>释放传感器配置数据结构体里分配的资源。</p>
176</td>
177</tr>
178<tr id="row10589154102611"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p4557141217521"><a name="p4557141217521"></a><a name="p4557141217521"></a>int32_t <strong id="b1206195914157"><a name="b1206195914157"></a><a name="b1206195914157"></a>GetSensorBusHandle</strong>(struct SensorBusCfg *busCfg)</p>
179</td>
180<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p953821245219"><a name="p953821245219"></a><a name="p953821245219"></a>获取传感器总线句柄信息。</p>
181</td>
182</tr>
183<tr id="row6784142455212"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p478492410522"><a name="p478492410522"></a><a name="p478492410522"></a>int32_t <strong id="b9443344101610"><a name="b9443344101610"></a><a name="b9443344101610"></a>ReleaseSensorBusHandle</strong>(struct SensorBusCfg *busCfg)</p>
184</td>
185<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p1878422485212"><a name="p1878422485212"></a><a name="p1878422485212"></a>释放传感器句柄信息。</p>
186</td>
187</tr>
188</tbody>
189</table>
190
191Sensor驱动模型要求驱动开发者实现的接口功能,参考表3
192
193**表 3**  Sensor驱动模型要求驱动开发者实现的接口列表
194
195<a name="table1083014911336"></a>
196<table><thead align="left"><tr id="row208301997332"><th class="cellrowborder" valign="top" width="8.41084108410841%" id="mcps1.2.4.1.1"><p id="p1777364318152"><a name="p1777364318152"></a><a name="p1777364318152"></a>功能分类</p>
197</th>
198<th class="cellrowborder" valign="top" width="45.77457745774577%" id="mcps1.2.4.1.2"><p id="p5773174317157"><a name="p5773174317157"></a><a name="p5773174317157"></a>接口名</p>
199</th>
200<th class="cellrowborder" valign="top" width="45.81458145814582%" id="mcps1.2.4.1.3"><p id="p1777319437155"><a name="p1777319437155"></a><a name="p1777319437155"></a>功能描述</p>
201</th>
202</tr>
203</thead>
204<tbody><tr id="row1880425111572"><td class="cellrowborder" rowspan="8" valign="top" width="8.41084108410841%" headers="mcps1.2.4.1.1 "><p id="p598171454520"><a name="p598171454520"></a><a name="p598171454520"></a>基本功能操作</p>
205</td>
206<td class="cellrowborder" valign="top" width="45.77457745774577%" headers="mcps1.2.4.1.2 "><p id="p880485195711"><a name="p880485195711"></a><a name="p880485195711"></a>int32_t <strong id="b16497123107"><a name="b16497123107"></a><a name="b16497123107"></a>init</strong>(void)</p>
207</td>
208<td class="cellrowborder" valign="top" width="45.81458145814582%" headers="mcps1.2.4.1.3 "><p id="p1480465165710"><a name="p1480465165710"></a><a name="p1480465165710"></a>传感器设备探测成功后,需要对传感器设备初始化配置。</p>
209</td>
210</tr>
211<tr id="row10831296333"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1783115910333"><a name="p1783115910333"></a><a name="p1783115910333"></a>int32_t <strong id="b146831650010"><a name="b146831650010"></a><a name="b146831650010"></a>GetInfo</strong>(struct SensorBasicInfo *info)</p>
212</td>
213<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p4831139153316"><a name="p4831139153316"></a><a name="p4831139153316"></a>从传感器设备的HCS配置里,获取当前传感器设备的基本信息。</p>
214</td>
215</tr>
216<tr id="row178311493339"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p208318963320"><a name="p208318963320"></a><a name="p208318963320"></a>int32_t <strong id="b189921571402"><a name="b189921571402"></a><a name="b189921571402"></a>Enable</strong>(void)</p>
217</td>
218<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p68310953312"><a name="p68310953312"></a><a name="p68310953312"></a>根据当前传感器设备的HCS配置,下发传感器设备使能操作组的寄存器配置。</p>
219</td>
220</tr>
221<tr id="row0831129153318"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p0831169183314"><a name="p0831169183314"></a><a name="p0831169183314"></a>int32_t <strong id="b13541291106"><a name="b13541291106"></a><a name="b13541291106"></a>Disable</strong>(void)</p>
222</td>
223<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p138314912336"><a name="p138314912336"></a><a name="p138314912336"></a>根据当前传感器设备的HCS配置,下发传感器设备去使能操作组的寄存器配置。</p>
224</td>
225</tr>
226<tr id="row178311093334"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p583118920338"><a name="p583118920338"></a><a name="p583118920338"></a>int32_t <strong id="b111117118017"><a name="b111117118017"></a><a name="b111117118017"></a>SetBatch</strong>(int64_t samplingInterval, int64_t reportInterval)</p>
227</td>
228<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p08311903315"><a name="p08311903315"></a><a name="p08311903315"></a>根据数据采样率和数据上报间隔,配置当前传感器设备的数据上报线程处理时间。</p>
229</td>
230</tr>
231<tr id="row1356419421422"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p9565174218421"><a name="p9565174218421"></a><a name="p9565174218421"></a>int32_t <strong id="b13702551143412"><a name="b13702551143412"></a><a name="b13702551143412"></a>SetMode</strong>(int32_t mode)</p>
232</td>
233<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p356524224213"><a name="p356524224213"></a><a name="p356524224213"></a>配置当前传感器设备数据上报方式。</p>
234</td>
235</tr>
236<tr id="row12565104264215"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p17565104210429"><a name="p17565104210429"></a><a name="p17565104210429"></a>int32_t <strong id="b96811512011"><a name="b96811512011"></a><a name="b96811512011"></a>SetOption</strong>(uint32_t option)</p>
237</td>
238<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p4565104214213"><a name="p4565104214213"></a><a name="p4565104214213"></a>根据可选配置、下发量程和精度等寄存器配置。</p>
239</td>
240</tr>
241<tr id="row380240111218"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1181184016120"><a name="p1181184016120"></a><a name="p1181184016120"></a>void <strong id="b1613451717016"><a name="b1613451717016"></a><a name="b1613451717016"></a>ReadSensorData</strong>(void)</p>
242</td>
243<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p7815401121"><a name="p7815401121"></a><a name="p7815401121"></a>实现传感器的数据读取函数。</p>
244</td>
245</tr>
246</tbody>
247</table>
248
249接口实现参考[SENSOR](#section257750691)章节。
250
251## 开发指导<a name="section1140943382"></a>
252
253Sensor驱动是基于HDF框架、PLATFORM和OSAL基础接口进行开发,不区分操作系统和芯片平台,为不同Sensor器件提供统一的驱动模型。本篇开发指导以加速度计传感器为例,介绍传感器驱动开发。
254
255### 开发步骤<a name="section7893102915819"></a>
256
2571.  加速度计传感器驱动注册。HDF驱动框架会提供统一的驱动管理模型,通过加速计传感器模块配置信息,识别并加载对应模块驱动。
2582.  加速度计传感器驱动初始化和去初始化。HDF驱动框架通过init入口函数,依次启动传感器设备驱动加载和分配传感器设备数据配置资源。HDF驱动框架通过release函数,释放驱动加载的资源和配置。
2593.  加速度计传感器寄存器组配置解析。不同类型传感器需要在hcs里配置器件对应的HCS配置文件,然后再设备驱动启动过程中探测器件是否在位,然后加载对应的配置文件,生成配置的结构体对象。
2604.  加速度计传感器驱动操作接口实现。实现各个类型传感器归一化驱动接口,如init,GetInfo,Enable,Disable,SetBatch,SetMode,SetOption,ReadSensorData等函数,完成传感器驱动配置下发和数据上报功能。
261
262>![](../public_sys-resources/icon-note.gif) **说明:**
263>传感器驱动模型已经提供一部分能力集,包括驱动设备管理能力,抽象总线和平台操作接口能力,通用配置操作接口能力,配置解析操作接口能力,接口参考[表2](#table1156812588320)。需要开发人员实现部分有:1、传感器部分操作接口([表3](#table1083014911336));2、传感器HCS差异化数据配置;3、驱动基本功能验证。
264
265## 开发实例<a name="section257750691"></a>
266
267基于HDF驱动模型,加载启动加速度计传感器驱动,代码形式如下,具体原理可参考[HDF驱动开发指南](driver-hdf-development.md)。加速度传感器选择通讯接口方式为I2C,厂家选择博世BMI160加速度传感器。
268
2691.  加速度计传感器驱动入口注册
270
271-   加速度计传感器驱动入口函数实现
272
273```
274/* 注册加速度计传感器入口数据结构体对象 */
275struct HdfDriverEntry g_sensorAccelDevEntry = {
276    .moduleVersion = 1, /* 加速度计传感器模块版本号 */
277    .moduleName = "HDF_SENSOR_ACCEL", /* 加速度计传感器模块名,要与device_info.hcs文件里的加速度计moduleName字段值一样*/
278    .Bind = BindAccelDriver, /* 加速度计传感器绑定函数 */
279    .Init = InitAccelDriver, /* 加速度计传感器初始化函数 */
280    .Release = ReleaseAccelDriver, /* 加速度计传感器资源释放函数 */
281};
282
283/* 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出 */
284HDF_INIT(g_sensorAccelDevEntry);
285```
286
287-   加速度计传感器设备配置描述
288
289加速度传感器模型使用HCS作为配置描述源码,HCS配置字段详细介绍参考[配置管理](driver-hdf-manage.md)介绍。
290
291```
292/* 加速度计传感器设备HCS配置 */
293device_sensor_accel :: device {
294    device0 :: deviceNode {
295        policy = 1; /* policy字段是驱动服务发布的策略 */
296        priority = 105; /* 驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序 */
297        preload = 2; /* 驱动按需加载字段,0表示加载,2表示不加载 */
298        permission = 0664; /* 驱动创建设备节点权限 */
299        moduleName = "HDF_SENSOR_ACCEL"; /* 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 */
300        serviceName = "sensor_accel"; /* 驱动对外发布服务的名称,必须唯一 */
301        deviceMatchAttr = "hdf_sensor_accel_driver"; /* 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 */
302    }
303}
304```
305
3061.  加速度计传感器驱动初始化和去初始化
307
308-   初始化入口函数init
309
310```
311/* 加速度计传感器驱动对外提供的服务绑定到HDF框架 */
312int32_t BindAccelDriver(struct HdfDeviceObject *device)
313{
314    CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM);
315
316    static struct IDeviceIoService service = {
317        .object = {0},
318        .Dispatch = DispatchAccel,
319    };
320    device->service = &service;
321
322    return HDF_SUCCESS;
323}
324/*在探测到器件在位后,需要调用RegisterAccelChipOps注册差异化适配函数*/
325int32_t RegisterAccelChipOps(struct AccelOpsCall *ops)
326{
327    struct AccelDrvData *drvData = NULL;
328
329    CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM);
330
331    drvData = AccelGetDrvData();
332    drvData->ops.Init = ops->Init;
333    drvData->ops.ReadData = ops->ReadData;
334    return HDF_SUCCESS;
335}
336/* 挂载加速度计传感器驱动归一化的接口函数 */
337static int32_t InitAccelOps(struct SensorDeviceInfo *deviceInfo)
338{
339    struct AccelDrvData *drvData = AccelGetDrvData();
340
341    (void)memset_s((void *)deviceInfo, sizeof(*deviceInfo), 0, sizeof(*deviceInfo));
342    deviceInfo->ops.GetInfo = SetAccelInfo;
343    deviceInfo->ops.Enable = SetAccelEnable;
344    deviceInfo->ops.Disable = SetAccelDisable;
345    deviceInfo->ops.SetBatch = SetAccelBatch;
346    deviceInfo->ops.SetMode = SetAccelMode;
347    deviceInfo->ops.SetOption = SetAccelOption;
348
349    if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo),
350        &drvData->accelCfg->sensorInfo, sizeof(drvData->accelCfg->sensorInfo)) != EOK) {
351        HDF_LOGE("%s: copy sensor info failed", __func__);
352        return HDF_FAILURE;
353    }
354    /* 传感器类型标识可以在数据HCS配置文件里面配置,也可以在此处 */
355    drvData->accelCfg->sensorInfo.sensorTypeId = SENSOR_TAG_ACCELEROMETER;
356    drvData->accelCfg->sensorInfo.sensorId = SENSOR_TAG_ACCELEROMETER;
357
358    return HDF_SUCCESS;
359}
360/* 传感器寄存器初始化操作 */
361static int32_t InitAccelAfterConfig(void)
362{
363    struct SensorDeviceInfo deviceInfo;
364
365    if (InitAccelConfig() != HDF_SUCCESS) {
366        HDF_LOGE("%s: init accel config failed", __func__);
367        return HDF_FAILURE;
368    }
369
370    if (InitAccelOps(&deviceInfo) != HDF_SUCCESS) {
371        HDF_LOGE("%s: init accel ops failed", __func__);
372        return HDF_FAILURE;
373    }
374
375    if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) {
376        HDF_LOGE("%s: add accel device failed", __func__);
377        return HDF_FAILURE;
378    }
379
380    return HDF_SUCCESS;
381}
382/*通过器件探测函数,挂载器件差异化函数接口*/
383static int32_t DetectAccelChip(void)
384{
385    int32_t num;
386    int32_t ret;
387    int32_t loop;
388    struct AccelDrvData *drvData = AccelGetDrvData();
389    CHECK_NULL_PTR_RETURN_VALUE(drvData->accelCfg, HDF_ERR_INVALID_PARAM);
390
391    num = sizeof(g_accelDetectIfList) / sizeof(g_accelDetectIfList[0]);
392    for (loop = 0; loop < num; ++loop) {
393        if (g_accelDetectIfList[loop].DetectChip != NULL) {
394            ret = g_accelDetectIfList[loop].DetectChip(drvData->accelCfg);
395            if (ret == HDF_SUCCESS) {
396                drvData->detectFlag = true;
397                break;
398            }
399        }
400    }
401
402    if (loop == num) {
403        HDF_LOGE("%s: detect accel device failed", __func__);
404        drvData->detectFlag = false;
405        return HDF_FAILURE;
406    }
407    return HDF_SUCCESS;
408}
409/* 加速度计传感器驱动初始化入口函数,主要功能为对传感器私有数据的结构体对象进行初始化,传感器HCS数据配置对象空间分配,传感器HCS数据配置初始化入口函数调用,传感器设备探测是否在位功能,传感器数据上报定时器创建,传感器归一化接口挂载,传感器设备注册功能 */
410int32_t InitAccelDriver(struct HdfDeviceObject *device)
411{
412    /* 获取传感器私有数据结构体对象 */
413    struct AccelDrvData *drvData = AccelGetDrvData();
414
415   /* 同类型传感器不同厂家设备探测时,判断此类型传感器是否已经在位,若已经在位,无需再继续探测,直接返回 */
416    if (drvData->detectFlag) {
417        HDF_LOGE("%s: accel sensor have detected", __func__);
418        return HDF_SUCCESS;
419    }
420
421    CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM);
422    /* 分配存放传感器数据配置的私有结构体数据对象,需要在驱动释放时释放分配的资源空间 */
423        drvData->accelCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*cfg));
424        if (drvData->accelCfg == NULL) {
425            HDF_LOGE("%s: malloc sensor config data failed", __func__);
426            return HDF_FAILURE;
427        }
428
429    drvData->accelCfg->regCfgGroup = &g_regCfgGroup[0];
430    /* 初始化传感器配置数据主要是解析传感器通讯总线配置类型信息,传感器基本信息,传感器属性信息,传感器是否在位信息,寄存器分组信息 */
431    if (GetSensorBaseConfigData(device->property, drvData->accelCfg) != HDF_SUCCESS) {
432        HDF_LOGE("%s: get sensor base config failed", __func__);
433        goto Base_CONFIG_EXIT;
434    }
435
436    if (DetectAccelChip() != HDF_SUCCESS) {
437        HDF_LOGE("%s: accel sensor detect device no exist", __func__);
438        goto DETECT_CHIP_EXIT;
439    }
440    drvData->detectFlag = true;
441    if (ParseSensorRegConfig(drvData->accelCfg) != HDF_SUCCESS) {
442        HDF_LOGE("%s: detect sensor device failed", __func__);
443        goto REG_CONFIG_EXIT;
444    }
445
446    if (InitAccelAfterConfig() != HDF_SUCCESS) {
447        HDF_LOGE("%s: init accel after config failed", __func__);
448        goto INIT_EXIT;
449    }
450
451    HDF_LOGI("%s: init accel driver success", __func__);
452    return HDF_SUCCESS;
453
454INIT_EXIT:
455    DestroySensorThread(&drvData->thread, &drvData->threadStatus);
456    (void)DeleteSensorDevice(SENSOR_TAG_ACCELEROMETER);
457REG_CONFIG_EXIT:
458    ReleaseSensorAllRegConfig(drvData->accelCfg);
459    (void)ReleaseSensorBusHandle(&drvData->accelCfg->busCfg);
460DETECT_CHIP_EXIT:
461    drvData->detectFlag = false;
462BASE_CONFIG_EXIT:
463    drvData->accelCfg->root = NULL;
464    drvData->accelCfg->regCfgGroup = NULL;
465    OsalMemFree(drvData->accelCfg);
466    drvData->accelCfg = NULL;
467    return HDF_FAILURE;
468}
469
470/* 释放驱动初始化时分配的资源 */
471void ReleaseAccelDriver(struct HdfDeviceObject *device)
472{
473    (void)device;
474    struct AccelDrvData *drvData = NULL;
475
476    drvData = AccelGetDrvData();
477    (void)DestroySensorThread(&drvData->thread, &drvData->threadStatus);
478    (void)DeleteSensorDevice(SENSOR_TAG_ACCELEROMETER);
479    drvData->detectFlag = false;
480
481    if (drvData->accelCfg != NULL) {
482        drvData->accelCfg->root = NULL;
483        drvData->accelCfg->regCfgGroup = NULL;
484        ReleaseSensorAllRegConfig(drvData->accelCfg);
485        (void)ReleaseSensorBusHandle(&drvData->accelCfg->busCfg);
486        OsalMemFree(drvData->accelCfg);
487        drvData->accelCfg = NULL;
488    }
489
490    drvData->initStatus = false;
491}
492```
493
4941.  加速度计传感器寄存器组配置信息
495
496加速度计传感器数据配置只需要按照模板配置即可,基于模板配置的解析功能已经在**InitSensorConfigData**函数完成,只需初始化时调用即可。如果有新增配置项,需要同步修改此函数。
497
498```
499加速度传感器数据配置模板(accel_config.hcs)
500root {
501    sensorAccelConfig {
502        accelChipConfig {
503            /* 传感器设备信息模板 */
504            template sensorInfo {
505                sensorName = "accelerometer"; /* 加速度计名字,字符最大长度16字节 */
506                vendorName = "borsh_bmi160"; /* 传感器设备厂商,字符最大长度16字节 */
507                firmwareVersion = "1.0"; /* 传感器固件版本号,默认1.0,字符最大长度16字节 */
508                hardwareVersion = "1.0"; /* 传感器硬件版本号,默认1.0,字符最大长度16字节 */
509                sensorTypeId = 1; /* 传感器类型编号,详见{@link SensorTypeTag} */
510                sensorId = 1; /* 传感器的标识号,有传感器驱动开发者定义,推荐用{@link SensorTypeTag}枚举 */
511                maxRange = 8; /* 传感器的最大量程,根据开发者需要配置 */
512                precision = 0; /* 传感器的精度,与上报数据配合使用,上报数据结构体{@link SensorEvents } */
513                power = 230; /* 传感器的功耗 */
514            }
515            /* 传感器使用的总线类型和配置信息模板 */
516            template sensorBusConfig {
517                busType = 0; /* 0:i2c 1:spi */
518                busNum = 6; /* 芯片上分配给传感器的器件号 */
519                busAddr = 0; /* 芯片上分配给传感器的地址 */
520                regWidth = 1; /* 传感器寄存器地址宽度 */
521                regBigEndian = 0; /* 传感器寄存器大小端 */
522            }
523            /* 传感器设备属性模板 */
524            template sensorAttr {
525                chipName = ""; /* 传感器芯片名字 */
526                chipIdRegister = 0xf; /* 传感器在位检测寄存器地址 */
527                chipIdValue = 0xd1; /* 校验传感器在位检测寄存器值 */
528            }
529        }
530    }
531}
532
533/* 根据不同器件硬件差异,修改模板配置,不修改的就会默认采用模板配置 */
534root {
535    sensorAccelConfig {
536        accel_bmi160_chip_config : accelChipConfig {
537            match_attr = "hdf_sensor_accel_driver"; /* 需要和加速度传感器设备配置match_attr字段保持一致 */
538            accelInfo :: sensorInfo {
539                vendorName = "borsh_bmi160";
540                sensorTypeId = 1;
541                sensorId = 1;
542            }
543            accelBusConfig :: sensorBusConfig {
544                busType = 0; /* i2c通讯方式 */
545                busNum = 6;
546                busAddr = 0x68;
547                regWidth = 1; /* 1字节位宽 */
548            }
549            accelAttr :: sensorAttr {
550                chipName = "bmi160";
551                chipIdRegister = 0x00;
552                chipIdValue = 0xd1;
553            }
554            accelRegConfig {
555                /*  regAddr: 寄存器地址
556                    value: 寄存器值
557                    mask: 寄存器值的掩码
558                    len: 寄存器值的数据长度(字节)
559                    delay: 配置寄存器延时(ms)
560                    opsType:操作类型 0-无 1-读 2-写 3-读并检查 4-位更新
561                    calType: 计算类型 0-无 1-写 2-取反 3-异或 4-左移 5-右移
562                    shiftNum: 移动位数
563                    debug: 调试开关,0-调试关闭 1-调试打开
564                    save: 保存数据开关,0-不保存数据 1-保存数据
565                */
566                /* 传感器寄存器操作分组,按照分组进行有序配置 */
567                /* 寄存器地址, 寄存器值, 寄存器值的掩码, 寄存器值的数据长度, 配置寄存器延时, 操作类型, 计算类型, 移动位数, 调试开关, 保存开关 */
568                /* 初始化寄存器组 */
569                initSeqConfig = [
570                    0x7e,    0xb6, 0xff,   1,     5,       2,       0,        0,     0,    0,
571                    0x7e,    0x10, 0xff,   1,     5,       2,       0,        0,     0,    0
572                ];
573                /* 使能寄存器组 */
574                enableSeqConfig = [
575                    0x7e,    0x11, 0xff,   1,     5,       2,       0,        0,     0,    0,
576                    0x41,    0x03, 0xff,   1,     0,       2,       0,        0,     0,    0,
577                    0x40,    0x08, 0xff,   1,     0,       2,       0,        0,     0,    0
578                ];
579                /* 去使能寄存器组 */
580                disableSeqConfig = [
581                    0x7e,    0x10, 0xff,   1,     5,       2,       0,        0,     0,    0
582                ];
583            }
584        }
585    }
586}
587```
588
5891.  加速度计传感器驱动操作接口实现
590
591开发者需要根据每种类型的传感器实现归一化接口。
592
593```
594/* 不使用函数暂时置空 */
595static int32_t SetAccelInfo(struct SensorBasicInfo *info)
596{
597    (void)info;
598
599    return HDF_ERR_NOT_SUPPORT;
600}
601/* 下发使能寄存器组的配置 */
602static int32_t SetAccelEnable(void)
603{
604    int32_t ret;
605    struct AccelDrvData *drvData = AccelGetDrvData();
606
607    CHECK_NULL_PTR_RETURN_VALUE(drvData->accelCfg, HDF_ERR_INVALID_PARAM);
608    ret = SetSensorRegCfgArray(&drvData->accelCfg->busCfg, drvData->accelCfg->regCfgGroup[SENSOR_ENABLE_GROUP]);
609    if (ret != HDF_SUCCESS) {
610        HDF_LOGE("%s: accel sensor disable config failed", __func__);
611        return HDF_FAILURE;
612    }
613
614    drvData->threadStatus = SENSOR_THREAD_RUNNING;
615
616    return HDF_SUCCESS;
617}
618/* 下发去使能寄存器组的配置 */
619static int32_t SetAccelDisable(void)
620{
621    int32_t ret;
622    struct AccelDrvData *drvData = AccelGetDrvData();
623
624    CHECK_NULL_PTR_RETURN_VALUE(drvData->accelCfg, HDF_ERR_INVALID_PARAM);
625
626    ret = SetSensorRegCfgArray(&drvData->accelCfg->busCfg, drvData->accelCfg->regCfgGroup[SENSOR_DISABLE_GROUP]);
627    if (ret != HDF_SUCCESS) {
628        HDF_LOGE("%s: accel sensor disable config failed", __func__);
629        return HDF_FAILURE;
630        }
631
632    drvData->threadStatus = SENSOR_THREAD_STOPPED;
633
634    return HDF_SUCCESS;
635}
636/* 配置传感器采样率和数据上报间隔 */
637static int32_t SetAccelBatch(int64_t samplingInterval, int64_t interval)
638{
639    (void)interval;
640
641    struct AccelDrvData *drvData = AccelGetDrvData();
642    drvData->interval = samplingInterval;
643
644    return HDF_SUCCESS;
645}
646/* 设置传感器工作模式,当前支持实时模式 */
647static int32_t SetAccelMode(int32_t mode)
648{
649    return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE;
650}
651/* 设置传感器可选配置 */
652static int32_t SetAccelOption(uint32_t option)
653{
654    (void)option;
655    return HDF_ERR_NOT_SUPPORT;
656}
657```
658
659-   差异化处理接口
660
661    ```
662    /* 器件探测时,如果探测成功,则注册差异化处理函数到accel驱动模型里 */
663    int32_t DetectAccelBim160Chip(struct SensorCfgData *data)
664    {
665        int32_t ret;
666        struct AccelOpsCall ops;
667        CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM);
668
669        if (strcmp(ACCEL_CHIP_NAME_BMI160, data->sensorAttr.chipName) != 0) {
670            return HDF_SUCCESS;
671        }
672        ret = InitAccelPreConfig();
673        if (ret != HDF_SUCCESS) {
674            HDF_LOGE("%s: init  BMI160 bus mux config", __func__);
675            return HDF_FAILURE;
676        }
677        if (DetectSensorDevice(data) != HDF_SUCCESS) {
678            return HDF_FAILURE;
679        }
680
681       /* 差异化处理函数 */
682        ops.Init = InitBmi160;
683        ops.ReadData = ReadBmi160Data;
684        ret = RegisterAccelChipOps(&ops);
685        if (ret != HDF_SUCCESS) {
686            HDF_LOGE("%s: register BMI160 accel failed", __func__);
687            (void)ReleaseSensorBusHandle(&data->busCfg);
688            return HDF_FAILURE;
689        }
690        return HDF_SUCCESS;
691    }
692    /* 初始化处理函数 */
693    static int32_t InitBmi160(struct SensorCfgData *data)
694    {
695        int32_t ret;
696
697        CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM);
698        ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]);
699        if (ret != HDF_SUCCESS) {
700            HDF_LOGE("%s: bmi160 sensor init config failed", __func__);
701            return HDF_FAILURE;
702        }
703        return HDF_SUCCESS;
704    }
705    /* 数据处理函数 */
706    int32_t ReadBmi160Data(struct SensorCfgData *data)
707    {
708        int32_t ret;
709        struct AccelData  rawData = { 0, 0, 0 };
710        int32_t tmp[ACCEL_AXIS_NUM];
711        struct SensorReportEvent event;
712
713        (void)memset_s(&event, sizeof(event), 0, sizeof(event));
714
715        ret = ReadBmi160RawData(data, &rawData, &event.timestamp);
716        if (ret != HDF_SUCCESS) {
717            return HDF_FAILURE;
718        }
719
720        event.sensorId = SENSOR_TAG_ACCELEROMETER;
721        event.option = 0;
722        event.mode = SENSOR_WORK_MODE_REALTIME;
723
724        rawData.x = rawData.x * BMI160_ACC_SENSITIVITY_2G;
725        rawData.y = rawData.y * BMI160_ACC_SENSITIVITY_2G;
726        rawData.z = rawData.z * BMI160_ACC_SENSITIVITY_2G;
727
728        tmp[ACCEL_X_AXIS] = (rawData.x * SENSOR_1K_UNIT) / SENSOR_CONVERT_UNIT;
729        tmp[ACCEL_Y_AXIS] = (rawData.y * SENSOR_1K_UNIT) / SENSOR_CONVERT_UNIT;
730        tmp[ACCEL_Z_AXIS] = (rawData.z * SENSOR_1K_UNIT) / SENSOR_CONVERT_UNIT;
731
732        event.dataLen = sizeof(tmp);
733        event.data = (uint8_t *)&tmp;
734        ret = ReportSensorEvent(&event);
735        return ret;
736    }
737    ```
738
739-   数据处理函数
740
741创建传感器定时器,按照配置的采样率定时采样,并上报给数据订阅者。
742
743```
744/* 传感器定时工作线程 */
745static int32_t ReadAccelDataThreadWorker(void *arg)
746{
747    (void)arg;
748    int64_t interval;
749    struct AccelDrvData *drvData = AccelGetDrvData();
750
751    drvData->threadStatus = SENSOR_THREAD_START;
752    while (true) {
753        if (drvData->threadStatus == SENSOR_THREAD_RUNNING) {
754            if (drvData->ops.ReadData != NULL) {
755                (void)drvData->ops.ReadData(drvData->accelCfg);
756            }
757            interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT));
758            OsalMSleep(interval);
759        } else if (drvData->threadStatus == SENSOR_THREAD_DESTROY) {
760            break;
761        } else {
762            OsalMSleep(ACC_DEFAULT_SAMPLING_200_MS / SENSOR_CONVERT_UNIT / SENSOR_CONVERT_UNIT);
763        }
764
765        if ((!drvData->initStatus) || (drvData->interval < 0) || drvData->threadStatus != SENSOR_THREAD_RUNNING) {
766            continue;
767        }
768    }
769
770    return HDF_SUCCESS;
771}
772/* 创建传感器定时器和器件初始化 */
773static int32_t InitAccelConfig(void)
774{
775    int32_t ret;
776    struct AccelDrvData *drvData = AccelGetDrvData();
777
778    if (drvData->threadStatus != SENSOR_THREAD_NONE && drvData->threadStatus != SENSOR_THREAD_DESTROY) {
779        HDF_LOGE("%s: accel thread have created", __func__);
780        return HDF_SUCCESS;
781    }
782
783    ret = CreateSensorThread(&drvData->thread, ReadAccelDataThreadWorker, "hdf_sensor_accel", drvData);
784    if (ret != HDF_SUCCESS) {
785        HDF_LOGE("%s: accel create thread failed", __func__);
786        drvData->threadStatus = SENSOR_THREAD_NONE;
787        return HDF_FAILURE;
788    }
789
790    CHECK_NULL_PTR_RETURN_VALUE(drvData->ops.Init, HDF_ERR_INVALID_PARAM);
791
792    ret = drvData->ops.Init(drvData->accelCfg);
793    if (ret != HDF_SUCCESS) {
794        HDF_LOGE("%s: accel create thread failed", __func__);
795        drvData->threadStatus = SENSOR_THREAD_NONE;
796        return HDF_FAILURE;
797    }
798    drvData->initStatus = true;
799    return HDF_SUCCESS;
800}
801```
802
803-   主要的数据结构
804
805```
806/* 传感器转换单位*/
807#define SENSOR_CONVERT_UNIT             1000
808#define SENSOR_1K_UNIT                  1024
809/* 传感器2g对应灵敏度转换值 */
810#define BMI160_ACC_SENSITIVITY_2G       61
811/* 传感器数据采样寄存器地址 */
812#define BMI160_ACCEL_X_LSB_ADDR              0X12
813#define BMI160_ACCEL_X_MSB_ADDR              0X13
814#define BMI160_ACCEL_Y_LSB_ADDR              0X14
815#define BMI160_ACCEL_Y_MSB_ADDR              0X15
816#define BMI160_ACCEL_Z_LSB_ADDR              0X16
817#define BMI160_ACCEL_Z_MSB_ADDR              0X17
818/* 传感器数据维度 */
819enum AccelAxisNum {
820    ACCEL_X_AXIS   = 0,
821    ACCEL_Y_AXIS   = 1,
822    ACCEL_Z_AXIS   = 2,
823    ACCEL_AXIS_NUM = 3,
824};
825/* 传感器每个维度值 */
826struct AccelData {
827    int32_t x;
828    int32_t y;
829    int32_t z;
830};
831/* 传感器私有数据结构体 */
832struct AccelDrvData {
833    bool detectFlag;
834    uint8_t threadStatus;
835    uint8_t initStatus;
836    int64_t interval;
837    struct SensorCfgData *accelCfg;
838    struct OsalThread thread;
839    struct AccelOpsCall ops;
840};
841/* 差异化适配函数 */
842struct AccelOpsCall {
843    int32_t (*Init)(struct SensorCfgData *data);
844    int32_t (*ReadData)(struct SensorCfgData *data);
845};
846```
847
848## 测试指导<a name="section106021256121219"></a>
849
850驱动开发完成后,在传感器单元测试里面开发自测试用例,验证驱动基本功能。测试环境采用开发者自测试平台。
851
852```
853/* 标识是否上报传感器数据 */
854static int32_t g_sensorDataFlag = 0;
855/* 保持获取的传感器接口实例地址 */
856static const struct SensorInterface *g_sensorDev = nullptr;
857
858/* 订阅者注册数据上报函数 */
859static int SensorTestDataCallback(struct SensorEvents *event)
860{
861    if (event == nullptr) {
862        return -1;
863    }
864    float *data = (float*)event->data;
865    printf("time [%lld] sensor id [%d] x-[%f] y-[%f] z-[%f]\n\r", event->timestamp,
866        event->sensorId, (*data), *(data + 1), *(data + g_axisZ));
867    if (*data > 1e-5) {
868        g_sensorDataFlag = 1;
869    }
870    return 0;
871}
872/* 用例执行前,初始化传感器接口实例 */
873void HdfSensorTest::SetUpTestCase()
874{
875    g_sensorDev = NewSensorInterfaceInstance();
876    if (g_sensorDev == nullptr) {
877        printf("test sensorHdi get Module instace failed\n\r");
878    }
879}
880/* 用例资源释放 */
881void HdfSensorTest::TearDownTestCase()
882{
883    if (g_sensorDev != nullptr) {
884        FreeSensorInterfaceInstance();
885        g_sensorDev = nullptr;
886    }
887}
888/* 传感器驱动测试验证 */
889HWTEST_F(HdfSensorTest,TestAccelDriver_001, TestSize.Level0)
890{
891    int32_t sensorInterval = 1000000000; /* 数据采样率单位纳秒 */
892    int32_t pollTime = 5; /* 数据采样时间单位秒 */
893    int32_t accelSensorId = 1; /* 加速度传感器类型标识为1 */
894    int32_t count = 0;
895    int ret;
896    struct SensorInformation *sensorInfo = nullptr;
897
898    ret = g_sensorDev->Register(SensorTestDataCallback)
899    EXPECT_EQ(SENSOR_NULL_PTR, ret);
900
901    ret = g_sensorDev->GetAllSensors(&sensorInfo, &count);
902    EXPECT_EQ(0, ret);
903    if (sensorInfo == nullptr) {
904        EXPECT_NE(nullptr, sensorInfo);
905        return;
906    }
907    /* 打印获取的传感器列表 */
908    for (int i = 0; i < count; i++) {
909        printf("get sensoriId[%d], info name[%s]\n\r", sensorInfo[i]->sensorId, sensorInfo[i]->sensorName);
910    }
911    ret = g_sensorDev->Enable(accelSensorId);
912    EXPECT_EQ(0, ret);
913    g_sensorDataFlag = 0;
914
915    ret = g_sensorDev->SetBatch(accelSensorId, sensorInterval, pollTime);
916    EXPECT_EQ(0, ret);
917    /* 在时间pollTime内,观察输出打印数据 */
918    OsalSleep(pollTime);
919    EXPECT_EQ(1, g_sensorDataFlag);
920
921    ret = g_sensorDev->Disable(accelSensorId);
922    g_sensorDataFlag = 0;
923    EXPECT_EQ(0, ret);
924
925    ret = g_sensorDev->Unregister();
926    EXPECT_EQ(0, ret);
927}
928```
929
930