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 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> **说明:** 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