1# Sensor 2 3 4## 概述 5 6### 功能简介 7 8Sensor驱动模型屏蔽硬件器件差异,为上层Sensor服务系统提供稳定的Sensor基础能力接口,包括Sensor列表查询、Sensor启停、Sensor订阅及取消订阅,Sensor参数配置等功能。Sensor设备驱动的开发是基于HDF驱动框架基础上,结合操作系统适配层(OSAL)和平台驱动接口(比如I2C/SPI/UART总线等平台资源)能力,屏蔽不同操作系统和平台总线资源差异,实现Sensor驱动“一次开发,多系统部署”的目标。Sensor驱动模型如图1所示。 9 10**图 1** Sensor驱动模型图 11 12![Sensor驱动模型图](figures/Sensor驱动模型图.png) 13 14### 基本概念 15 16目前根据sensorId将Sensor分为医学类Sensor、传统类Sensor两种。 17 18- 医学类Sensor:已订阅的sensorId枚举值在128-160范围的为医学类Sensor。 19 20- 传统类Sensor:已订阅的sensorId枚举值不在128-160范围的为传统类Sensor。 21 22### 运作机制 23 24通过介绍Sensor驱动模型的加载以及运行流程,对模型内部关键组件以及关联组件之间的关系进行了划分,整体加载流程如图2所示: 25 26**图 2** Sensor驱动运行图 27 28![Sensor驱动运行图](figures/Sensor驱动运行图.png) 29 30Sensor驱动模型以标准系统Hi3516DV300产品中的加速度传感器驱动为例,介绍整个驱动加载及运行流程: 31 321. 从device_info.hcs配置文件中的Sensor Host读取到Sensor设备管理配置信息。 332. HDF配置框架从HCB数据库中解析Sensor设备管理配置信息,并关联对应设备驱动。 343. 加载并初始化Sensor设备管理驱动。 354. Sensor设备管理驱动向HDI发布Sensor基础能力接口。 365. 从device_info.hcs配置文件中的Sensor Host读取到加速度传感器驱动配置信息。 376. 加载加速度传感器抽象驱动,调用初始化接口,完成Sensor器件的驱动资源分配和数据处理队列的创建。 387. 从accel_xxx_config.hcs配置文件中读取到加速度传感器差异化驱动配置和私有化配置信息。 398. 加速度传感器芯片差异化驱动,调用通用配置解析接口,完成器件属性信息解析,器件寄存器解析。 409. 加速度传感器芯片差异化驱动完成器件的探测,并分配加速度传感器配置资源和加速度传感器差异化接口注册。 4110. 加速度传感器成功探测到器件之后,加速度传感器芯片差异化驱动通知加速度传感器抽象驱动,注册加速度传感器设备到Sensor设备管理中。 42 43## 开发指导 44 45### 场景介绍 46 47- 通过重力和陀螺仪传感器数据,能感知设备倾斜和旋转量,提高用户在游戏场景中的体验。 48- 通过接近光传感器数据,感知距离遮挡物的距离,使设备能够自动亮灭屏,达到防误触目的。例如,手机通话时,如屏幕距离人脸过近,则自动关闭屏幕,防止误触的同时降低功耗。 49- 通过气压计传感器数据,可以准确的判断设备当前所处的海拔。 50- 通过环境光传感器数据,设备能够实现背光自动调节。 51- 通过霍尔传感器数据,设备可以实现皮套功能,皮套合上,手机上开一个小窗口,可降低功耗。 52 53### 接口说明 54 55Sensor驱动模型对外开放的API接口能力如下: 56 57- 提供Sensor HDI(Hardware Device Interface)能力接口,简化服务开发。 58- 提供Sensor驱动模型能力接口: 59 - 依赖HDF驱动框架实现Sensor器件驱动的加载、器件探测、注册和去注册等能力。 60 - 提供同一类型Sensor器件驱动归一接口、寄存器配置解析操作接口、总线访问抽象接口和平台抽象接口。 61- 提供开发者实现的能力接口:依赖HDF驱动框架的HCS(HDF Configuration Source)配置管理,根据同类型Sensor差异化配置,实现Sensor器件参数序列化配置和器件部分操作接口,简化Sensor器件驱动开发。 62 63Sensor驱动模型对外开放的API接口能力的具体实现请参考: 64 65**表 1** Sensor驱动模型对外API接口功能介绍 66 67| 接口名 | 功能描述 | 68| ----- | -------- | 69| int32_t GetAllSensors(struct SensorInformation **sensorInfo, int32_t *count) | 获取系统中注册的所有传感器信息,一组完整传感器信息包括传感器名字、设备厂商、固件版本号、硬件版本号、传感器类型编号、传感器标识、最大量程、精度、功耗。 | 70| int32_t Enable(int32_t sensorId) | 使能指定传感器设备,只有数据订阅者使能传感器后,才能获取订阅的传感器数据。 | 71| int32_t Disable(int32_t sensorId) | 去使能指定传感器设备。 | 72| int32_t SetBatch(int32_t sensorId, int64_t samplingInterval, int64_t reportInterval) | 设置指定传感器的数据采样间隔和数据上报间隔。 | 73| int32_t SetMode(int32_t sensorId, int32_t mode) | 设置指定传感器的工作模式,不同的工作模式,上报数据方式不同。 | 74| int32_t SetOption(int32_t sensorId, uint32_t option) | 设置指定传感器量程,精度等可选配置。 | 75| int32_t Register(int32_t groupId, RecordDataCallback cb) | 订阅者根据不同groupId注册传感器数据回调函数,系统会将获取到的传感器数据上报给订阅者。 | 76| int32_t Unregister(int32_t groupId, RecordDataCallback cb) | 订阅者根据groupId和回调函数注销对应订阅者的传感器数据回调函数。 | 77 78 79 80Sensor驱动模型对驱动开发者开放的功能接口,驱动开发者无需实现,直接使用,请参考: 81 82 **表2** Sensor驱动模型对驱动开发者开放的功能接口列表 83 84| 接口名 | 功能描述 | 85| ----- | -------- | 86| int32_t AddSensorDevice(const struct SensorDeviceInfo *deviceInfo) | 添加当前类型的传感器设备到传感器设备管理。 | 87| int32_t DeleteSensorDevice(const struct SensorBasicInfo *sensorBaseInfo) | 删除传感器设备管理里指定的传感器设备。 | 88| int32_t ReportSensorEvent(const struct SensorReportEvent *events) | 上报指定类型传感器的数据到用户侧。 | 89| int32_t ReadSensor(struct SensorBusCfg *busCfg, uint16_t regAddr, uint8_t *data, uint16_t dataLen) | 按照配置的总线方式,读取传感器寄存器配置数据。 | 90| int32_t WriteSensor(struct SensorBusCfg *busCfg, uint8_t *writeData, uint16_t len) | 按照配置的总线方式,将传感器配置数据写入寄存器。 | 91| int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group); | 根据传感器总线类型信息,下发寄存器分组配置。 | 92| int32_t GetSensorBaseConfigData(const struct DeviceResourceNode *node, struct SensorCfgData *config) | 根据传感器设备HCS资源配置,获取传感器信息,总线配置信息,属性配置等基本配置信息,并初始化对应的基本配置数据结构体。 | 93| int32_t ParseSensorRegConfig(struct SensorCfgData *config) | 根据传感器设备HCS资源配置,解析寄存器分组信息,并初始化配置数据结构体。 | 94| void ReleaseSensorAllRegConfig(struct SensorCfgData *config) | 释放传感器配置数据结构体里分配的资源。 | 95| int32_t GetSensorBusHandle(struct SensorBusCfg *busCfg) | 获取传感器总线句柄信息。 | 96| int32_t ReleaseSensorBusHandle(struct SensorBusCfg *busCfg) | 释放传感器句柄信息。 | 97 98 99 100Sensor驱动模型要求驱动开发者实现的接口功能,请参考: 101 102**表 3** Sensor驱动模型要求驱动开发者实现的接口列表 103 104| 接口名 | 功能描述 | 105| ----- | -------- | 106| int32_t init(void) | 传感器设备探测成功后,需要对传感器设备初始化配置。 | 107| int32_t Enable(void) | 根据当前传感器设备的HCS配置,下发传感器设备使能操作组的寄存器配置。 | 108| int32_t Disable(void) | 根据当前传感器设备的HCS配置,下发传感器设备去使能操作组的寄存器配置。 | 109| int32_t SetBatch(int64_t samplingInterval, int64_t reportInterval) | 根据数据采样率和数据上报间隔,配置当前传感器设备的数据上报线程处理时间。 | 110| int32_t SetMode(int32_t mode) | 配置当前传感器设备数据上报方式。 | 111| int32_t SetOption(uint32_t option) | 根据可选配置、下发量程和精度等寄存器配置。 | 112| void ReadSensorData(void) | 实现传感器的数据读取函数。 | 113 114 115接口实现参考[开发步骤](#开发步骤)章节。 116 117### 开发步骤 1181. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度抽象驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现。 119 120 - 加速度传感器驱动入口函数实现 121 122 ```c 123 /* 注册加速度计传感器入口数据结构体对象 */ 124 struct HdfDriverEntry g_sensorAccelDevEntry = { 125 .moduleVersion = 1, // 加速度计传感器模块版本号 126 .moduleName = "HDF_SENSOR_ACCEL", // 加速度计传感器模块名,要与device_info.hcs文件里的加速度计moduleName字段值一样 127 .Bind = BindAccelDriver, // 加速度计传感器绑定函数 128 .Init = InitAccelDriver, // 加速度计传感器初始化函数 129 .Release = ReleaseAccelDriver, // 加速度计传感器资源释放函数 130 }; 131 132 /* 调用HDF_INIT将驱动入口注册到HDF框架中。在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出 */ 133 HDF_INIT(g_sensorAccelDevEntry); 134 ``` 135 136 - 加速度传感器驱动操作接口实现 137 138 ```c 139 /* 加速度计传感器驱动对外提供的服务绑定到HDF框架 */ 140 int32_t AccelBindDriver(struct HdfDeviceObject *device) 141 { 142 CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); 143 144 struct AccelDrvData *drvData = (struct AccelDrvData *)OsalMemCalloc(sizeof(*drvData)); 145 if (drvData == NULL) { 146 HDF_LOGE("%s: Malloc accel drv data fail!", __func__); 147 return HDF_ERR_MALLOC_FAIL; 148 } 149 150 drvData->ioService.Dispatch = DispatchAccel; 151 drvData->device = device; 152 device->service = &drvData->ioService; 153 g_accelDrvData = drvData; 154 return HDF_SUCCESS; 155 } 156 157 /* 注册加速度计传感器驱动归一化的接口函数 */ 158 static int32_t InitAccelOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) 159 { 160 CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); 161 162 deviceInfo->ops.Enable = SetAccelEnable; 163 deviceInfo->ops.Disable = SetAccelDisable; 164 deviceInfo->ops.SetBatch = SetAccelBatch; 165 deviceInfo->ops.SetMode = SetAccelMode; 166 deviceInfo->ops.SetOption = SetAccelOption; 167 168 if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), 169 &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { 170 HDF_LOGE("%s: Copy sensor info failed", __func__); 171 return HDF_FAILURE; 172 } 173 174 return HDF_SUCCESS; 175 } 176 /* 提供给差异化驱动的初始化接口,完成加速度器件基本配置信息解析(加速度信息、加速度总线配置、加速度器件探测寄存器配置)、器件探测、器件寄存器解析 */ 177 static int32_t InitAccelAfterDetected(struct SensorCfgData *config) 178 { 179 struct SensorDeviceInfo deviceInfo; 180 CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); 181 /* 初始化加速度计接口函数 */ 182 if (InitAccelOps(config, &deviceInfo) != HDF_SUCCESS) { 183 HDF_LOGE("%s: Init accel ops failed", __func__); 184 return HDF_FAILURE; 185 } 186 /* 注册加速度计设备到传感器管理模块 */ 187 if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { 188 HDF_LOGE("%s: Add accel device failed", __func__); 189 return HDF_FAILURE; 190 } 191 /* 器件寄存器解析 */ 192 if (ParseSensorRegConfig(config) != HDF_SUCCESS) { 193 HDF_LOGE("%s: Parse sensor register failed", __func__); 194 (void)DeleteSensorDevice(&config->sensorInfo); 195 ReleaseSensorAllRegConfig(config); 196 return HDF_FAILURE; 197 } 198 return HDF_SUCCESS; 199 } 200 struct SensorCfgData *AccelCreateCfgData(const struct DeviceResourceNode *node) 201 { 202 …… 203 /* 如果探测不到器件在位,返回进行下个器件探测 */ 204 if (drvData->detectFlag) { 205 HDF_LOGE("%s: Accel sensor have detected", __func__); 206 return NULL; 207 } 208 if (drvData->accelCfg == NULL) { 209 HDF_LOGE("%s: Accel accelCfg pointer NULL", __func__); 210 return NULL; 211 } 212 /* 设备基本配置信息解析 */ 213 if (GetSensorBaseConfigData(node, drvData->accelCfg) != HDF_SUCCESS) { 214 HDF_LOGE("%s: Get sensor base config failed", __func__); 215 goto BASE_CONFIG_EXIT; 216 } 217 /* 如果探测不到器件在位,返回进行下个器件探测 */ 218 if (DetectSensorDevice(drvData->accelCfg) != HDF_SUCCESS) { 219 HDF_LOGI("%s: Accel sensor detect device no exist", __func__); 220 drvData->detectFlag = false; 221 goto BASE_CONFIG_EXIT; 222 } 223 drvData->detectFlag = true; 224 /* 器件寄存器解析 */ 225 if (InitAccelAfterDetected(drvData->accelCfg) != HDF_SUCCESS) { 226 HDF_LOGE("%s: Accel sensor detect device no exist", __func__); 227 goto INIT_EXIT; 228 } 229 return drvData->accelCfg; 230 …… 231 } 232 /* 加速度计传感器驱动初始化入口函数,主要功能为对传感器私有数据的结构体对象进行初始化,传感器HCS数据配置对象空间分配,传感器HCS数据配置初始化入口函数调用,传感器设备探测是否在位功能,传感器数据上报定时器创建,传感器归一化接口注册,传感器设备注册功能 */ 233 int32_t AccelInitDriver(struct HdfDeviceObject *device) 234 { 235 …… 236 /* 工作队列资源初始化 */ 237 if (InitAccelData(drvData) != HDF_SUCCESS) { 238 HDF_LOGE("%s: Init accel config failed", __func__); 239 return HDF_FAILURE; 240 } 241 /* 分配加速度配置信息资源 */ 242 drvData->accelCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->accelCfg)); 243 if (drvData->accelCfg == NULL) { 244 HDF_LOGE("%s: Malloc accel config data failed", __func__); 245 return HDF_FAILURE; 246 } 247 /* 注册寄存器分组信息 */ 248 drvData->accelCfg->regCfgGroup = &g_regCfgGroup[0]; 249 …… 250 return HDF_SUCCESS; 251 } 252 /* 释放驱动初始化时分配的资源 */ 253 void AccelReleaseDriver(struct HdfDeviceObject *device) 254 { 255 CHECK_NULL_PTR_RETURN(device); 256 struct AccelDrvData *drvData = (struct AccelDrvData *)device->service; 257 CHECK_NULL_PTR_RETURN(drvData); 258 /* 器件在位,释放已分配资源 */ 259 if (drvData->detectFlag) { 260 AccelReleaseCfgData(drvData->accelCfg); 261 } 262 OsalMemFree(drvData->accelCfg); 263 drvData->accelCfg = NULL; 264 /* 器件在位,销毁工作队列资源 */ 265 HdfWorkDestroy(&drvData->accelWork); 266 HdfWorkQueueDestroy(&drvData->accelWorkQueue); 267 OsalMemFree(drvData); 268 } 269 ``` 270 2712. 完成加速度传感器驱动的设备信息配置。 272 273 加速度传感器模型使用HCS作为配置描述源码,HCS配置字段请参考[配置管理](driver-hdf-manage.md)介绍。 274 275 ```hcs 276 /* 加速度计传感器设备HCS配置 */ 277 device_sensor_accel :: device { 278 device0 :: deviceNode { 279 policy = 1; // 驱动服务发布的策略 280 priority = 110; // 驱动启动优先级(0-200),值越大优先级越低,建议配置为100,优先级相同则不保证device的加载顺序 281 preload = 0; // 驱动按需加载字段,0表示加载,2表示不加载 282 permission = 0664; // 驱动创建设备节点权限 283 moduleName = "HDF_SENSOR_ACCEL"; // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 284 serviceName = "sensor_accel"; // 驱动对外发布服务的名称,必须唯一 285 deviceMatchAttr = "hdf_sensor_accel_driver"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 286 } 287 } 288 ``` 289 2903. 完成加速度传感器抽象驱动内部接口开发,包括Enable、Disable、SetBatch、SetMode、SetOption、AccelCreateCfgData、AccelReleaseCfgData、AccelRegisterChipOps接口实现。 291 292 ```c 293 /* 不使用函数暂时置空 */ 294 static int32_t SetAccelInfo(struct SensorBasicInfo *info) 295 { 296 (void)info; 297 298 return HDF_ERR_NOT_SUPPORT; 299 } 300 /* 下发使能寄存器组的配置 */ 301 static int32_t SetAccelEnable(void) 302 { 303 int32_t ret; 304 struct AccelDrvData *drvData = AccelGetDrvData(); 305 306 CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); 307 CHECK_NULL_PTR_RETURN_VALUE(drvData->accelCfg, HDF_ERR_INVALID_PARAM); 308 309 if (drvData->enable) { 310 HDF_LOGE("%s: Accel sensor is enabled", __func__); 311 return HDF_SUCCESS; 312 } 313 314 ret = SetSensorRegCfgArray(&drvData->accelCfg->busCfg, drvData->accelCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); 315 if (ret != HDF_SUCCESS) { 316 HDF_LOGE("%s: Accel sensor enable config failed", __func__); 317 return ret; 318 } 319 320 ret = OsalTimerCreate(&drvData->accelTimer, SENSOR_TIMER_MIN_TIME, AccelTimerEntry, (uintptr_t)drvData); 321 if (ret != HDF_SUCCESS) { 322 HDF_LOGE("%s: Accel create timer failed[%d]", __func__, ret); 323 return ret; 324 } 325 326 ret = OsalTimerStartLoop(&drvData->accelTimer); 327 if (ret != HDF_SUCCESS) { 328 HDF_LOGE("%s: Accel start timer failed[%d]", __func__, ret); 329 return ret; 330 } 331 drvData->enable = true; 332 333 return HDF_SUCCESS; 334 } 335 /* 下发去使能寄存器组的配置 */ 336 static int32_t SetAccelDisable(void) 337 { 338 int32_t ret; 339 struct AccelDrvData *drvData = AccelGetDrvData(); 340 341 CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); 342 CHECK_NULL_PTR_RETURN_VALUE(drvData->accelCfg, HDF_ERR_INVALID_PARAM); 343 344 if (!drvData->enable) { 345 HDF_LOGE("%s: Accel sensor had disable", __func__); 346 return HDF_SUCCESS; 347 } 348 349 ret = SetSensorRegCfgArray(&drvData->accelCfg->busCfg, drvData->accelCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); 350 if (ret != HDF_SUCCESS) { 351 HDF_LOGE("%s: Accel sensor disable config failed", __func__); 352 return ret; 353 } 354 355 ret = OsalTimerDelete(&drvData->accelTimer); 356 if (ret != HDF_SUCCESS) { 357 HDF_LOGE("%s: Accel delete timer failed", __func__); 358 return ret; 359 } 360 drvData->enable = false; 361 362 return HDF_SUCCESS; 363 } 364 /* 配置传感器采样率和数据上报间隔 */ 365 static int32_t SetAccelBatch(int64_t samplingInterval, int64_t interval) 366 { 367 (void)interval; 368 369 struct AccelDrvData *drvData = NULL; 370 371 drvData = AccelGetDrvData(); 372 CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); 373 374 drvData->interval = samplingInterval; 375 376 return HDF_SUCCESS; 377 } 378 /* 设置传感器工作模式,当前支持实时模式 */ 379 static int32_t SetAccelMode(int32_t mode) 380 { 381 return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; 382 } 383 384 static int32_t SetAccelOption(uint32_t option) 385 { 386 (void)option; 387 return HDF_SUCCESS; 388 } 389 /* 设置传感器可选配置 */ 390 static int32_t SetAccelOption(uint32_t option) 391 { 392 (void)option; 393 return HDF_ERR_NOT_SUPPORT; 394 } 395 ``` 396 3974. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度传感器差异化驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现。 398 399 ```c 400 /* 加速度计传感器差异化驱动消息交互 */ 401 static int32_t DispatchBMI160(struct HdfDeviceIoClient *client, 402 int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) 403 { 404 (void)client; 405 (void)cmd; 406 (void)data; 407 (void)reply; 408 409 return HDF_SUCCESS; 410 } 411 /* 加速度计传感器差异化驱动对外提供的服务绑定到HDF框架 */ 412 int32_t Bmi160BindDriver(struct HdfDeviceObject *device) 413 { 414 CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); 415 416 struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)OsalMemCalloc(sizeof(*drvData)); 417 if (drvData == NULL) { 418 HDF_LOGE("%s: Malloc Bmi160 drv data fail", __func__); 419 return HDF_ERR_MALLOC_FAIL; 420 } 421 422 drvData->ioService.Dispatch = DispatchBMI160; 423 drvData->device = device; 424 device->service = &drvData->ioService; 425 g_bmi160DrvData = drvData; 426 427 return HDF_SUCCESS; 428 } 429 /* 加速度计传感器差异化驱动初始化 */ 430 int32_t Bmi160InitDriver(struct HdfDeviceObject *device) 431 { 432 int32_t ret; 433 struct AccelOpsCall ops; 434 435 CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); 436 struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)device->service; 437 CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); 438 439 ret = InitAccelPreConfig(); 440 if (ret != HDF_SUCCESS) { 441 HDF_LOGE("%s: Init BMI160 bus mux config", __func__); 442 return HDF_FAILURE; 443 } 444 445 drvData->sensorCfg = AccelCreateCfgData(device->property); 446 if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) { 447 HDF_LOGD("%s: Creating accelcfg failed because detection failed", __func__); 448 return HDF_ERR_NOT_SUPPORT; 449 } 450 451 ops.Init = NULL; 452 ops.ReadData = ReadBmi160Data; 453 ret = AccelRegisterChipOps(&ops); 454 if (ret != HDF_SUCCESS) { 455 HDF_LOGE("%s: Register BMI160 accel failed", __func__); 456 return HDF_FAILURE; 457 } 458 459 ret = InitBmi160(drvData->sensorCfg); 460 if (ret != HDF_SUCCESS) { 461 HDF_LOGE("%s: Init BMI160 accel failed", __func__); 462 return HDF_FAILURE; 463 } 464 465 return HDF_SUCCESS; 466 } 467 /* 释放驱动初始化时分配的资源 */ 468 void Bmi160ReleaseDriver(struct HdfDeviceObject *device) 469 { 470 ...... 471 if (drvData->sensorCfg != NULL) { 472 AccelReleaseCfgData(drvData->sensorCfg); 473 drvData->sensorCfg = NULL; 474 } 475 OsalMemFree(drvData); 476 } 477 /* 加速度传感器差异化驱动对应的HdfDriverEntry对象 */ 478 struct HdfDriverEntry g_accelBmi160DevEntry = { 479 .moduleVersion = 1, 480 .moduleName = "HDF_SENSOR_ACCEL_BMI160", 481 .Bind = Bmi160BindDriver, 482 .Init = Bmi160InitDriver, 483 .Release = Bmi160ReleaseDriver, 484 }; 485 HDF_INIT(g_accelBmi160DevEntry); 486 ``` 487 4885. 完成加速度传感器差异化驱动中差异化接口ReadData函数实现。 489 490 ```c 491 int32_t ReadBmi160Data(struct SensorCfgData *data) 492 { 493 int32_t ret; 494 struct AccelData rawData = { 0, 0, 0 }; 495 int32_t tmp[ACCEL_AXIS_NUM]; 496 struct SensorReportEvent event; 497 (void)memset_s(&event, sizeof(event), 0, sizeof(event)); 498 ret = ReadBmi160RawData(data, &rawData, &event.timestamp); 499 if (ret != HDF_SUCCESS) { 500 HDF_LOGE("%s: BMI160 read raw data failed", __func__); 501 return HDF_FAILURE; 502 } 503 event.sensorId = SENSOR_TAG_ACCELEROMETER; 504 event.option = 0; 505 event.mode = SENSOR_WORK_MODE_REALTIME; 506 …… 507 ret = ReportSensorEvent(&event); 508 if (ret != HDF_SUCCESS) { 509 HDF_LOGE("%s: BMI160 report data failed", __func__); 510 } 511 return ret; 512 } 513 ``` 514 515### 调测验证 516 517驱动开发完成后,在传感器单元测试里面开发自测试用例,验证驱动基本功能。测试环境采用开发者自测试平台。 518 519```c++ 520static int32_t g_sensorDataFlag = 0; // 标识是否上报传感器数据 521static const struct SensorInterface *g_sensorDev = nullptr; // 保持获取的传感器接口实例地址 522 523/* 订阅者注册数据上报函数 */ 524static int SensorTestDataCallback(struct SensorEvents *event) 525{ 526 if (event == nullptr) { 527 return -1; 528 } 529 float *data = (float*)event->data; 530 printf("time [%lld] sensor id [%d] x-[%f] y-[%f] z-[%f]\n\r", event->timestamp, 531 event->sensorId, (*data), *(data + 1), *(data + g_axisZ)); 532 if (*data > 1e-5) { 533 g_sensorDataFlag = 1; 534 } 535 return 0; 536} 537/* 用例执行前,初始化传感器接口实例 */ 538void HdfSensorTest::SetUpTestCase() 539{ 540 g_sensorDev = NewSensorInterfaceInstance(); 541 if (g_sensorDev == nullptr) { 542 printf("test sensor get module instance failed\n\r"); 543 } 544} 545/* 用例资源释放 */ 546void HdfSensorTest::TearDownTestCase() 547{ 548 if (g_sensorDev != nullptr) { 549 FreeSensorInterfaceInstance(); 550 g_sensorDev = nullptr; 551 } 552} 553/* 传感器驱动测试验证 */ 554HWTEST_F(HdfSensorTest,TestAccelDriver_001, TestSize.Level0) 555{ 556 int32_t sensorInterval = 1000000000; // 数据采样率单位纳秒 557 int32_t pollTime = 5; // 数据采样时间单位秒 558 int32_t accelSensorId = 1; // 加速度传感器类型标识为1 559 int32_t count = 0; 560 int ret; 561 struct SensorInformation *sensorInfo = nullptr; 562 563 ret = g_sensorDev->Register(0, TraditionSensorTestDataCallback) 564 EXPECT_EQ(SENSOR_NULL_PTR, ret); 565 566 ret = g_sensorDev->GetAllSensors(&sensorInfo, &count); 567 EXPECT_EQ(0, ret); 568 if (sensorInfo == nullptr) { 569 EXPECT_NE(nullptr, sensorInfo); 570 return; 571 } 572 /* 打印获取的传感器列表 */ 573 for (int i = 0; i < count; i++) { 574 printf("get sensorId[%d], info name[%s]\n\r", sensorInfo[i]->sensorId, sensorInfo[i]->sensorName); 575 } 576 ret = g_sensorDev->Enable(accelSensorId); 577 EXPECT_EQ(0, ret); 578 g_sensorDataFlag = 0; 579 580 ret = g_sensorDev->SetBatch(accelSensorId, sensorInterval, pollTime); 581 EXPECT_EQ(0, ret); 582 /* 在时间pollTime内,观察输出打印数据 */ 583 OsalSleep(pollTime); 584 EXPECT_EQ(1, g_sensorDataFlag); 585 586 ret = g_sensorDev->Disable(accelSensorId); 587 g_sensorDataFlag = 0; 588 EXPECT_EQ(0, ret); 589 590 ret = g_sensorDev->Unregister(0, TraditionSensorTestDataCallback); 591 EXPECT_EQ(0, ret); 592} 593``` 594 595