From ff12a5b9adcf051193b1932f9372db7e6cde877b Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Thu, 17 Mar 2022 11:14:28 +0800 Subject: [PATCH 1/5] modify sensor/vibrator/light file Signed-off-by: sunxuejiao --- .../driver/driver-peripherals-light-des.md | 2 +- .../driver/driver-peripherals-sensor-des.md | 18 ++++++++++++ .../driver/driver-peripherals-vibrator-des.md | 26 ++++++++++++++++-- ...0\350\277\220\350\241\214\345\233\276.png" | Bin 33408 -> 14650 bytes ...0\350\277\220\350\241\214\345\233\276.png" | Bin 22971 -> 23882 bytes ...0\350\277\220\350\241\214\345\233\276.png" | Bin 20372 -> 21925 bytes 6 files changed, 43 insertions(+), 3 deletions(-) diff --git a/zh-cn/device-dev/driver/driver-peripherals-light-des.md b/zh-cn/device-dev/driver/driver-peripherals-light-des.md index 3c640be72bd..ff5c7c4e5f8 100644 --- a/zh-cn/device-dev/driver/driver-peripherals-light-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-light-des.md @@ -30,7 +30,7 @@ **图 2** Light驱动运行图 -![Light驱动运行图](figures/Light驱动运行图.png) +![Light驱动运行图](figures/Light%E9%A9%B1%E5%8A%A8%E8%BF%90%E8%A1%8C%E5%9B%BE.png) Light驱动模型以标准系统Hi3516DV300为例,介绍整个驱动加载及运行流程: diff --git a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md index c579765da6b..8186db866b2 100755 --- a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md @@ -2,9 +2,11 @@ - [概述](##概述) - [功能简介](###功能简介) + - [基本概念](###基本概念) - [运作机制](###运作机制) - [开发指导](##开发指导) + - [场景介绍](###场景介绍) - [接口说明](#section188213414114) - [开发步骤](#section7893102915819) - [开发实例](#section257750691) @@ -20,6 +22,14 @@ Sensor驱动模型屏蔽硬件器件差异,为上层Sensor服务系统提供 **图 1** Sensor驱动模型图 ![Sensor驱动模型图](figures/Sensor驱动模型图.png) +### 基本概念 + +目前根据sensorId将Sensor分为医学类Sensor、传统类Sensor两种。 + +- 医学类Sensor:已订阅的sensorId枚举值在128-160范围的为医学类Sensor。 + +- 传统类Sensor:已订阅的sensorId枚举值不在128-160范围的为传统类Sensor。 + ### 运作机制 通过介绍Sensor驱动模型的加载以及运行流程,对模型内部关键组件以及关联组件之间的关系进行了划分,整体加载流程如[图2](#Sensor驱动运行图)所示: @@ -43,6 +53,14 @@ Sensor驱动模型以标准系统Hi3516DV300产品中的加速度传感器驱动 ## 开发指导 +### 场景介绍 + +- 通过重力和陀螺仪传感器数据,能感知设备倾斜和旋转量,提高用户在游戏场景中的体验。 +- 通过接近光传感器数据,感知距离遮挡物的距离,使设备能够自动亮灭屏,达到防误触目的。例如:通话时,当靠近手机时,关闭屏幕,达到降低功耗的作用。 +- 通过气压计传感器数据,可以准确的判断设备当前所处的海拔。 +- 通过环境光传感器数据,设备能够实现背光自动调节。 +- 通过霍尔传感器数据,设备可以实现皮套功能,皮套合上,手机上开一个小窗口,可降低功耗。 + ### 接口说明 Sensor驱动模型对外开放的API接口能力如下: diff --git a/zh-cn/device-dev/driver/driver-peripherals-vibrator-des.md b/zh-cn/device-dev/driver/driver-peripherals-vibrator-des.md index cdedea1f158..e92fd0ab496 100755 --- a/zh-cn/device-dev/driver/driver-peripherals-vibrator-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-vibrator-des.md @@ -1,8 +1,14 @@ +--- + +--- + # Vibrator - [概述](##概述) - [功能简介](###功能简介) + - [基本概念](###基本概念) - [运作机制](###运作机制) - [开发指导](##开发指导) + - [场景介绍](###场景介绍) - [接口说明](###接口说明) - [开发步骤](###开发步骤) - [开发实例](###开发实例) @@ -15,7 +21,19 @@ **图 1** 马达驱动模型图 -![Vibrator驱动模型图](figures/Vibrator驱动模型图.png) +![Vibrator驱动模型图](figures/Vibrator%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9E%8B%E5%9B%BE.png) + +### 基本概念 + +系统通过调用马达实现对设备的振动控制。目前,马达只有两种振动方式: + +- 单次振动 + + 单次振动是指按照指定的时间控制振动时长。 + +- 周期振动 + + 周期振动是指按照预置的效果模式控制振动。例如: 预置效果为“haptic.clock.timer” = [600, 600, 200, 600],等待600ms,振动600ms,等待200ms,振动600ms。 ### 运作机制 @@ -23,7 +41,7 @@ **图2** 马达驱动运行图 -![Vibrator驱动运行图](figures/马达驱动运行图.png) +![Vibrator驱动运行图](figures/Vibrator%E9%A9%B1%E5%8A%A8%E8%BF%90%E8%A1%8C%E5%9B%BE.png) 马达驱动模型以标准系统Hi3516DV300产品为例,介绍整个驱动加载及运行流程: @@ -40,6 +58,10 @@ ## 开发指导 +### 场景介绍 + +当设备需要设置不同的振动效果时,可以调用 Vibrator 模块,例如,设备的按键可以设置不同强度和时长的振动,闹钟和来电可以设置不同强度和时长的单次或周期性振动。 + ### 接口说明 马达驱动模型支持静态HCS配置和动态参数两种振动效果配置能力。马达硬件服务调用StartOnce接口动态配置持续振动;调用Start接口启动静态配置的振动效果。马达驱动模型对HDI开放的API接口能力,参考[表1](马达驱动模型对外API接口能力介绍)。 diff --git "a/zh-cn/device-dev/driver/figures/Light\351\251\261\345\212\250\350\277\220\350\241\214\345\233\276.png" "b/zh-cn/device-dev/driver/figures/Light\351\251\261\345\212\250\350\277\220\350\241\214\345\233\276.png" index e845adca92ab627fc669e7d39c40a97f4352faec..78ef2b335f486d9861f94b5b0b5f53ac29226fc6 100644 GIT binary patch literal 14650 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 VaIwS~aNm(lPuJ*J{*g=n{2x*-rY-;g literal 33408 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%0A+$R6=4rhmJp|HRi8kgnx?cXXrLR}@} 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 diff --git "a/zh-cn/device-dev/driver/figures/Sensor\351\251\261\345\212\250\350\277\220\350\241\214\345\233\276.png" "b/zh-cn/device-dev/driver/figures/Sensor\351\251\261\345\212\250\350\277\220\350\241\214\345\233\276.png" index 59a2a2b083fcd31291011a96fa092da2da38e99c..027afc7b1965dbd9749eb1375ce835e5a9ebe547 100755 GIT binary patch literal 23882 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 P`67a;l}V1#p$q>2S=Z$I literal 22971 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 RKx@@QGPe~Z^CS$P{9gwGVE+IB literal 20372 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 Date: Thu, 17 Mar 2022 11:27:47 +0800 Subject: [PATCH 2/5] modify sensor/vibrator/light file Signed-off-by: sunxuejiao --- .../driver/driver-peripherals-light-des.md | 2 +- .../driver/driver-peripherals-sensor-des.md | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/zh-cn/device-dev/driver/driver-peripherals-light-des.md b/zh-cn/device-dev/driver/driver-peripherals-light-des.md index ff5c7c4e5f8..fa38732ca3b 100644 --- a/zh-cn/device-dev/driver/driver-peripherals-light-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-light-des.md @@ -22,7 +22,7 @@ **图 1** Light驱动模型图 -![Light驱动模型图](figures/Light驱动模型图.png) +![Light驱动模型图](figures/Light%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9E%8B%E5%9B%BE.png) ### 运作机制 diff --git a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md index 8186db866b2..df1a8f8c4e9 100755 --- a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md @@ -20,7 +20,7 @@ Sensor驱动模型屏蔽硬件器件差异,为上层Sensor服务系统提供稳定的Sensor基础能力接口,包括Sensor列表查询、Sensor启停、Sensor订阅及取消订阅,Sensor参数配置等功能;Sensor设备驱动的开发是基于HDF驱动框架基础上,结合操作系统适配层(OSAL)和平台驱动接口(比如I2C/SPI/UART总线等平台资源)能力,屏蔽不同操作系统和平台总线资源差异,实现Sensor驱动“一次开发,多系统部署”的目标。Sensor驱动模型如[图1](#fig10451455446)所示: **图 1** Sensor驱动模型图 -![Sensor驱动模型图](figures/Sensor驱动模型图.png) +![Sensor驱动模型图](figures/Sensor%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9E%8B%E5%9B%BE.png) ### 基本概念 @@ -36,7 +36,7 @@ Sensor驱动模型屏蔽硬件器件差异,为上层Sensor服务系统提供 **图 2** Sensor驱动运行图 -![Sensor驱动运行图](figures/Sensor驱动运行图.png) +![Sensor驱动运行图](figures/Sensor%E9%A9%B1%E5%8A%A8%E8%BF%90%E8%A1%8C%E5%9B%BE.png) Sensor驱动模型以标准系统Hi3516DV300产品中的加速度传感器驱动为例,介绍整个驱动加载及运行流程: @@ -121,14 +121,14 @@ Sensor驱动模型对外开放的API接口能力的具体实现参考[表1](#tab

数据订阅操作

-

int32_t Register(sensorId, RecordDataCallback cb);

+

int32_t Register(int32_t groupId, RecordDataCallback cb);

-

订阅者根据不同sensorId注册传感器数据回调函数,系统会将获取到的传感器数据上报给订阅者。

+

订阅者根据不同groupId注册传感器数据回调函数,系统会将获取到的传感器数据上报给订阅者。

-

int32_t Unregister(sensorId, RecordDataCallback cb)

+

int32_t Unregister(int32_t groupId, RecordDataCallback cb)

-

订阅者根据sensorId和回调函数注销对应订阅者的传感器数据回调函数。

+

订阅者根据groupId和回调函数注销对应订阅者的传感器数据回调函数。

-- Gitee From 6d958c98cddb5912990fbc7d21b0ff470e1b81b0 Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Thu, 17 Mar 2022 18:55:42 +0800 Subject: [PATCH 3/5] modify sensor/vibrator/light file Signed-off-by: sunxuejiao --- .../driver/driver-peripherals-light-des.md | 110 ++-- .../driver/driver-peripherals-sensor-des.md | 571 +++++++----------- .../driver/driver-peripherals-vibrator-des.md | 30 +- 3 files changed, 255 insertions(+), 456 deletions(-) diff --git a/zh-cn/device-dev/driver/driver-peripherals-light-des.md b/zh-cn/device-dev/driver/driver-peripherals-light-des.md index fa38732ca3b..2e0ba1e5c9c 100644 --- a/zh-cn/device-dev/driver/driver-peripherals-light-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-light-des.md @@ -10,7 +10,6 @@ - [接口说明](###接口说明) - [开发步骤](###开发步骤) - - [开发实例](###开发实例) - [调测验证](###调测验证) @@ -60,20 +59,12 @@ Light驱动模型支持获取系统中所有灯的信息,动态配置闪烁模 | int32_t (*TurnOffLight)(uint32_t type) | 根据指定的灯类型关闭灯列表中可用的灯。 | ### 开发步骤 -1. 基于HDF驱动框架,按照驱动Driver Entry程序,完成Light抽象驱动开发(主要由Bind、Init、Release、Dispatch函数接口实现),资源配置及HCS解析。完成Light驱动的设备信息配置。 -3. 调用配置解析接口,完成器件属性信息解析,器件寄存器解析,并注册到Light设备管理中。 -3. 完成Light获取类型、闪烁和停止接口开发,会根据闪烁模式创建和销毁定时器。 - -### 开发实例 - -基于HDF驱动模型,加载启动Light驱动,代码形式如下,具体原理可参考[HDF驱动开发指南](driver-hdf-development.md)。本例中Light驱动通讯接口方式选择GPIO。 - -1. Light驱动的初始化和去初始化 +1. 基于HDF驱动框架,按照驱动Driver Entry程序,完成Light抽象驱动开发(主要由Bind、Init、Release、Dispatch函数接口实现),资源配置及HCS解析。完成Light驱动的设备信息配置。 - 调用HDF_INIT将驱动入口注册到HDF框架中。在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 Light驱动模型使用HCS作为配置描述源码,HCS配置字段详细介绍请参考[配置管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-hdf-manage.md)。 其Driver Entry入口函数定义如下: - + ```c /* 注册灯入口数据结构体对象 */ struct HdfDriverEntry g_lightDriverEntry = { @@ -86,7 +77,7 @@ Light驱动模型支持获取系统中所有灯的信息,动态配置闪烁模 /* 调用HDF_INIT将驱动入口注册到HDF框架中。在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release函数释放驱动资源并退出 */ HDF_INIT(g_lightDriverEntry); ``` - + - 基于HDF驱动框架,按照驱动Driver Entry程序,完成Light抽象驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现。 ```c @@ -172,12 +163,11 @@ Light驱动模型支持获取系统中所有灯的信息,动态配置闪烁模 (void)OsalMemFree(drvData); g_lightDrvData = NULL; } - ``` - Light设备管理模块负责系统中Light器件接口发布,在系统启动过程中,HDF框架机制通过灯Host里设备HCS配置信息,加载设备管理驱动。 - ```hcs + ``` /* 灯设备HCS配置 */ device_light :: device { device0 :: deviceNode { @@ -189,70 +179,42 @@ Light驱动模型支持获取系统中所有灯的信息,动态配置闪烁模 serviceName = "hdf_light"; // Light驱动对外发布服务的名称,必须唯一 deviceMatchAttr = "hdf_light_driver"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 } - } ``` -2. 分配资源,解析灯HCS配置。 +2. 调用配置解析接口,完成器件属性信息解析,器件寄存器解析,并注册到Light设备管理中。 - - 解析HCS配置文件。 - - ```c - /* 分配资源,解析灯HCS配置 */ - static int32_t ParseLightInfo(const struct DeviceResourceNode *node) - { - ..... - /* 从HCS获取支持灯的类型个数 */ - drvData->lightNum = parser->GetElemNum(light, "lightType"); - .... - for (i = 0; i < drvData->lightNum; ++i) { - /* 获取类型 */ - ret = parser->GetUint32ArrayElem(light, "lightType", i, &temp, 0); - CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "lightType"); - } - - for (i = 0; i < drvData->lightNum; ++i) { - ..... - /* 类型作为下标开辟空间 */ - drvData->info[temp] = (struct LightDeviceInfo *)OsalMemCalloc(sizeof(struct LightDeviceInfo)); - ..... - /* 将Light设备信息进行填充 */ - ret = parser->GetUint32(light, "busRNum", &drvData->info[temp]->busRNum, 0); - CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busRNum"); - ret = parser->GetUint32(light, "busGNum", &drvData->info[temp]->busGNum, 0); - CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busGNum"); - ret = parser->GetUint32(light, "busBNum", &drvData->info[temp]->busBNum, 0); - CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busBNum"); - ..... - return HDF_SUCCESS; - - } - ``` - - - 灯效果模型使用HCS作为配置描述源码,HCS配置字段详细介绍参考[配置管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-hdf-manage.md)介绍。 - - ```hcs - /* 灯数据配置模板(light_config.hcs) */ - root { - lightConfig { - boardConfig { - match_attr = "hdf_light_driver"; - lightAttr { - light01 { - lightType = [1, 2]; // 灯类型 - busRNum = 31; // 红色对应的GPIO管脚 - busGNum = 30; // 绿色对应的GPIO管脚 - busBNum = 29; // 蓝色对应的GPIO管脚 - lightBrightness = 0X80000000;// RGB: R:16-31bit、G:8-15bit、B:0-7bit - onTime = 50; // 一个闪烁周期内亮灯时长(ms) - offTime = 50; // 一个闪烁周期内熄灯时长(ms) - } - } - } - } - } - ``` + ```c + /* 分配资源,解析灯HCS配置 */ + static int32_t ParseLightInfo(const struct DeviceResourceNode *node) + { + ..... + /* 从HCS获取支持灯的类型个数 */ + drvData->lightNum = parser->GetElemNum(light, "lightType"); + .... + for (i = 0; i < drvData->lightNum; ++i) { + /* 获取类型 */ + ret = parser->GetUint32ArrayElem(light, "lightType", i, &temp, 0); + CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "lightType"); + } + + for (i = 0; i < drvData->lightNum; ++i) { + ..... + /* 类型作为下标开辟空间 */ + drvData->info[temp] = (struct LightDeviceInfo *)OsalMemCalloc(sizeof(struct LightDeviceInfo)); + ..... + /* 将Light设备信息进行填充 */ + ret = parser->GetUint32(light, "busRNum", &drvData->info[temp]->busRNum, 0); + CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busRNum"); + ret = parser->GetUint32(light, "busGNum", &drvData->info[temp]->busGNum, 0); + CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busGNum"); + ret = parser->GetUint32(light, "busBNum", &drvData->info[temp]->busBNum, 0); + CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busBNum"); + ..... + return HDF_SUCCESS; + } + ``` -3. 完成获取灯类型,闪烁和停止接口开发,会根据闪烁模式创建和销毁定时器。 +3. 完成Light获取类型、闪烁和停止接口开发,会根据闪烁模式创建和销毁定时器。 ```c /* Light驱动服务调用GetAllLightInfo获取灯类型,Enable接口启动闪烁模式, diff --git a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md index df1a8f8c4e9..6122876321f 100755 --- a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md @@ -9,7 +9,6 @@ - [场景介绍](###场景介绍) - [接口说明](#section188213414114) - [开发步骤](#section7893102915819) - - [开发实例](#section257750691) - [调测验证](#section106021256121219) @@ -271,29 +270,11 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab 接口实现参考[开发实例](#section257750691)章节。 ### 开发步骤 -1. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度抽象驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现。 -2. 完成加速度传感器驱动的设备信息配置。 -3. 完成加速度传感器抽象驱动内部接口开发,包括Enable、Disable、SetBatch、SetMode、SetOption、AccelCreateCfgData、AccelReleaseCfgData、AccelRegisterChipOps接口实现。 -4. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度传感器差异化驱动开发,主要有Bind、Init、Release、Dispatch函数接口实现。 -5. 完成加速度传感器差异化驱动中差异化接口ReadData函数实现。 -6. 新增文件脚本适配。 - ->![](../public_sys-resources/icon-note.gif) **说明:** -> ->- 传感器驱动模型已经提供一部分能力集,包括驱动设备管理能力、抽象总线和平台操作接口能力、通用配置操作接口能力、配置解析操作接口能力,接口参考[表2](#table1156812588320)。 -> ->- 需要开发人员实现部分有:传感器部分操作接口([表3](#table1083014911336))和传感器HCS差异化数据配置。 -> - 驱动基本功能验证。 - -### 开发实例 - -基于HDF驱动模型,加载启动加速度计传感器驱动,代码形式如下,具体原理可参考[HDF驱动开发指南](driver-hdf-development.md)。本例中加速度传感器选择博世BMI160,其通讯接口方式选择I2C。 - -1. 加速度传感器驱动入口注册 +1. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度抽象驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现。 - 加速度传感器驱动入口函数实现 - ``` + ```c /* 注册加速度计传感器入口数据结构体对象 */ struct HdfDriverEntry g_sensorAccelDevEntry = { .moduleVersion = 1, //加速度计传感器模块版本号 @@ -307,9 +288,144 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab HDF_INIT(g_sensorAccelDevEntry); ``` - - 加速度传感器设备配置描述 + - 加速度传感器驱动操作接口实现 + + ```c + /* 加速度计传感器驱动对外提供的服务绑定到HDF框架 */ + int32_t AccelBindDriver(struct HdfDeviceObject *device) + { + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct AccelDrvData *drvData = (struct AccelDrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc accel drv data fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchAccel; + drvData->device = device; + device->service = &drvData->ioService; + g_accelDrvData = drvData; + return HDF_SUCCESS; + } + + /* 注册加速度计传感器驱动归一化的接口函数 */ + static int32_t InitAccelOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) + { + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + deviceInfo->ops.Enable = SetAccelEnable; + deviceInfo->ops.Disable = SetAccelDisable; + deviceInfo->ops.SetBatch = SetAccelBatch; + deviceInfo->ops.SetMode = SetAccelMode; + deviceInfo->ops.SetOption = SetAccelOption; + + if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), + &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { + HDF_LOGE("%s: Copy sensor info failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; + } + /* 提供给差异化驱动的初始化接口,完成加速度器件基本配置信息解析(加速度信息,加速度总线配置,加速度器件探测寄存器配置),器件探测,器件寄存器解析 */ + static int32_t InitAccelAfterDetected(struct SensorCfgData *config) + { + struct SensorDeviceInfo deviceInfo; + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + /* 初始化加速度计接口函数 */ + if (InitAccelOps(config, &deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Init accel ops failed", __func__); + return HDF_FAILURE; + } + /* 注册加速度计设备到传感器管理模块 */ + if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Add accel device failed", __func__); + return HDF_FAILURE; + } + /* 器件寄存器解析 */ + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse sensor register failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorAllRegConfig(config); + return HDF_FAILURE; + } + return HDF_SUCCESS; + } + struct SensorCfgData *AccelCreateCfgData(const struct DeviceResourceNode *node) + { + …… + /* 如果探测不到器件在位,返回进行下个器件探测 */ + if (drvData->detectFlag) { + HDF_LOGE("%s: Accel sensor have detected", __func__); + return NULL; + } + if (drvData->accelCfg == NULL) { + HDF_LOGE("%s: Accel accelCfg pointer NULL", __func__); + return NULL; + } + /* 设备基本配置信息解析 */ + if (GetSensorBaseConfigData(node, drvData->accelCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Get sensor base config failed", __func__); + goto BASE_CONFIG_EXIT; + } + /* 如果探测不到器件在位,返回进行下个器件探测 */ + if (DetectSensorDevice(drvData->accelCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Accel sensor detect device no exist", __func__); + drvData->detectFlag = false; + goto BASE_CONFIG_EXIT; + } + drvData->detectFlag = true; + /* 器件寄存器解析 */ + if (InitAccelAfterDetected(drvData->accelCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Accel sensor detect device no exist", __func__); + goto INIT_EXIT; + } + return drvData->accelCfg; + …… + } + /* 加速度计传感器驱动初始化入口函数,主要功能为对传感器私有数据的结构体对象进行初始化,传感器HCS数据配置对象空间分配,传感器HCS数据配置初始化入口函数调用,传感器设备探测是否在位功能,传感器数据上报定时器创建,传感器归一化接口注册,传感器设备注册功能 */ + int32_t AccelInitDriver(struct HdfDeviceObject *device) + { + …… + /* 工作队列资源初始化 */ + if (InitAccelData(drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Init accel config failed", __func__); + return HDF_FAILURE; + } + /* 分配加速度配置信息资源 */ + drvData->accelCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->accelCfg)); + if (drvData->accelCfg == NULL) { + HDF_LOGE("%s: Malloc accel config data failed", __func__); + return HDF_FAILURE; + } + /* 注册寄存器分组信息 */ + drvData->accelCfg->regCfgGroup = &g_regCfgGroup[0]; + …… + return HDF_SUCCESS; + } + /* 释放驱动初始化时分配的资源 */ + void AccelReleaseDriver(struct HdfDeviceObject *device) + { + CHECK_NULL_PTR_RETURN(device); + struct AccelDrvData *drvData = (struct AccelDrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + /* 器件在位,释放已分配资源 */ + if (drvData->detectFlag) { + AccelReleaseCfgData(drvData->accelCfg); + } + OsalMemFree(drvData->accelCfg); + drvData->accelCfg = NULL; + /* 器件在位,销毁工作队列资源 */ + HdfWorkDestroy(&drvData->accelWork); + HdfWorkQueueDestroy(&drvData->accelWorkQueue); + OsalMemFree(drvData); + } + ``` + +2. 完成加速度传感器驱动的设备信息配置。 - 加速度传感器模型使用HCS作为配置描述源码,HCS配置字段请参考[配置管理](driver-hdf-manage.md)介绍。 + - 加速度传感器模型使用HCS作为配置描述源码,HCS配置字段请参考[配置管理](driver-hdf-manage.md)介绍。 ``` /* 加速度计传感器设备HCS配置 */ @@ -326,11 +442,9 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab } ``` -2. 加速度传感器驱动操作接口实现 +3. 完成加速度传感器抽象驱动内部接口开发,包括Enable、Disable、SetBatch、SetMode、SetOption、AccelCreateCfgData、AccelReleaseCfgData、AccelRegisterChipOps接口实现。 - 开发者需要根据每种类型的传感器实现归一化接口。 - - ``` + ```c /* 不使用函数暂时置空 */ static int32_t SetAccelInfo(struct SensorBasicInfo *info) { @@ -427,7 +541,6 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab (void)option; return HDF_SUCCESS; } - /* 设置传感器可选配置 */ static int32_t SetAccelOption(uint32_t option) { @@ -436,329 +549,100 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab } ``` -3. 加速度传感器驱动初始化和去初始化 +4. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度传感器差异化驱动开发,主要有Bind、Init、Release、Dispatch函数接口实现。 - ``` - /* 加速度计传感器驱动对外提供的服务绑定到HDF框架 */ - int32_t AccelBindDriver(struct HdfDeviceObject *device) + ```c + /* 加速度计传感器差异化驱动消息交互 */ + static int32_t DispatchBMI160(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) + { + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; + } + /* 加速度计传感器差异化驱动对外提供的服务绑定到HDF框架 */ + int32_t Bmi160BindDriver(struct HdfDeviceObject *device) { CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - struct AccelDrvData *drvData = (struct AccelDrvData *)OsalMemCalloc(sizeof(*drvData)); + struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)OsalMemCalloc(sizeof(*drvData)); if (drvData == NULL) { - HDF_LOGE("%s: Malloc accel drv data fail!", __func__); + HDF_LOGE("%s: Malloc Bmi160 drv data fail", __func__); return HDF_ERR_MALLOC_FAIL; } - drvData->ioService.Dispatch = DispatchAccel; + drvData->ioService.Dispatch = DispatchBMI160; drvData->device = device; device->service = &drvData->ioService; - g_accelDrvData = drvData; + g_bmi160DrvData = drvData; + return HDF_SUCCESS; } - - /* 注册加速度计传感器驱动归一化的接口函数 */ - static int32_t InitAccelOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) + /* 加速度计传感器差异化驱动初始化 */ + int32_t Bmi160InitDriver(struct HdfDeviceObject *device) { - CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + int32_t ret; + struct AccelOpsCall ops; - deviceInfo->ops.Enable = SetAccelEnable; - deviceInfo->ops.Disable = SetAccelDisable; - deviceInfo->ops.SetBatch = SetAccelBatch; - deviceInfo->ops.SetMode = SetAccelMode; - deviceInfo->ops.SetOption = SetAccelOption; + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), - &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { - HDF_LOGE("%s: Copy sensor info failed", __func__); + ret = InitAccelPreConfig(); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init BMI160 bus mux config", __func__); return HDF_FAILURE; } - return HDF_SUCCESS; - } - /* 提供给差异化驱动的初始化接口,完成加速度器件基本配置信息解析(加速度信息,加速度总线配置,加速度器件探测寄存器配置),器件探测,器件寄存器解析 */ - static int32_t InitAccelAfterDetected(struct SensorCfgData *config) - { - struct SensorDeviceInfo deviceInfo; - CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); - /* 初始化加速度计接口函数 */ - if (InitAccelOps(config, &deviceInfo) != HDF_SUCCESS) { - HDF_LOGE("%s: Init accel ops failed", __func__); - return HDF_FAILURE; - } - /* 注册加速度计设备到传感器管理模块 */ - if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { - HDF_LOGE("%s: Add accel device failed", __func__); - return HDF_FAILURE; - } - /* 器件寄存器解析 */ - if (ParseSensorRegConfig(config) != HDF_SUCCESS) { - HDF_LOGE("%s: Parse sensor register failed", __func__); - (void)DeleteSensorDevice(&config->sensorInfo); - ReleaseSensorAllRegConfig(config); - return HDF_FAILURE; - } - return HDF_SUCCESS; - } - struct SensorCfgData *AccelCreateCfgData(const struct DeviceResourceNode *node) - { - …… - /* 如果探测不到器件在位,返回进行下个器件探测 */ - if (drvData->detectFlag) { - HDF_LOGE("%s: Accel sensor have detected", __func__); - return NULL; - } - if (drvData->accelCfg == NULL) { - HDF_LOGE("%s: Accel accelCfg pointer NULL", __func__); - return NULL; - } - /* 设备基本配置信息解析 */ - if (GetSensorBaseConfigData(node, drvData->accelCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: Get sensor base config failed", __func__); - goto BASE_CONFIG_EXIT; - } - /* 如果探测不到器件在位,返回进行下个器件探测 */ - if (DetectSensorDevice(drvData->accelCfg) != HDF_SUCCESS) { - HDF_LOGI("%s: Accel sensor detect device no exist", __func__); - drvData->detectFlag = false; - goto BASE_CONFIG_EXIT; + drvData->sensorCfg = AccelCreateCfgData(device->property); + if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) { + HDF_LOGD("%s: Creating accelcfg failed because detection failed", __func__); + return HDF_ERR_NOT_SUPPORT; } - drvData->detectFlag = true; - /* 器件寄存器解析 */ - if (InitAccelAfterDetected(drvData->accelCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: Accel sensor detect device no exist", __func__); - goto INIT_EXIT; - } - return drvData->accelCfg; - …… - } - /* 加速度计传感器驱动初始化入口函数,主要功能为对传感器私有数据的结构体对象进行初始化,传感器HCS数据配置对象空间分配,传感器HCS数据配置初始化入口函数调用,传感器设备探测是否在位功能,传感器数据上报定时器创建,传感器归一化接口注册,传感器设备注册功能 */ - int32_t InitAccelDriver(struct HdfDeviceObject *device) - { - int32_t AccelInitDriver(struct HdfDeviceObject *device) - { - …… - /* 工作队列资源初始化 */ - if (InitAccelData(drvData) != HDF_SUCCESS) { - HDF_LOGE("%s: Init accel config failed", __func__); + + ops.Init = NULL; + ops.ReadData = ReadBmi160Data; + ret = AccelRegisterChipOps(&ops); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Register BMI160 accel failed", __func__); return HDF_FAILURE; } - /* 分配加速度配置信息资源 */ - drvData->accelCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->accelCfg)); - if (drvData->accelCfg == NULL) { - HDF_LOGE("%s: Malloc accel config data failed", __func__); + + ret = InitBmi160(drvData->sensorCfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init BMI160 accel failed", __func__); return HDF_FAILURE; } - /* 注册寄存器分组信息 */ - drvData->accelCfg->regCfgGroup = &g_regCfgGroup[0]; - …… + return HDF_SUCCESS; } - /* 释放驱动初始化时分配的资源 */ - void AccelReleaseDriver(struct HdfDeviceObject *device) + void Bmi160ReleaseDriver(struct HdfDeviceObject *device) { - CHECK_NULL_PTR_RETURN(device); - struct AccelDrvData *drvData = (struct AccelDrvData *)device->service; - CHECK_NULL_PTR_RETURN(drvData); - /* 器件在位,释放已分配资源 */ - if (drvData->detectFlag) { - AccelReleaseCfgData(drvData->accelCfg); + ...... + if (drvData->sensorCfg != NULL) { + AccelReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; } - OsalMemFree(drvData->accelCfg); - drvData->accelCfg = NULL; - /* 器件在位,销毁工作队列资源 */ - HdfWorkDestroy(&drvData->accelWork); - HdfWorkQueueDestroy(&drvData->accelWorkQueue); OsalMemFree(drvData); } + /* 加速度传感器差异化驱动对应的HdfDriverEntry对象 */ + struct HdfDriverEntry g_accelBmi160DevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_ACCEL_BMI160", + .Bind = Bmi160BindDriver, + .Init = Bmi160InitDriver, + .Release = Bmi160ReleaseDriver, + }; + HDF_INIT(g_accelBmi160DevEntry); ``` -4. 加速度传感器差异化驱动私有HCS配置实现 - - - 为了方便开发者使用传感器HCS私有配置,在sensor_common.hcs里面定义通用的传感器配置模板。 - - ``` - accel sensor common config template - root { - sensorAccelConfig { - accelChipConfig { - /* 传感器设备信息模板 */ - template sensorInfo { - sensorName = "accelerometer"; // 加速度计名字,字符最大长度16字节 - vendorName = "borsh_bmi160"; // 传感器设备厂商,字符最大长度16字节 - firmwareVersion = "1.0"; // 传感器固件版本号,默认1.0,字符最大长度16字节 - hardwareVersion = "1.0"; // 传感器硬件版本号,默认1.0,字符最大长度16字节 - sensorTypeId = 1; // 传感器类型编号,详见{@link SensorTypeTag} - sensorId = 1; // 传感器的标识号,有传感器驱动开发者定义,推荐用{@link SensorTypeTag}枚举 - maxRange = 8; // 传感器的最大量程,根据开发者需要配置 - accuracy = 0; // 传感器的精度,与上报数据配合使用,上报数据结构体{@link SensorEvents } - power = 230; // 传感器的功耗 - } - /* 传感器使用的总线类型和配置信息模板 */ - template sensorBusConfig { - busType = 0; // 0:i2c 1:spi - busNum = 6; // 芯片上分配给传感器的器件号 - busAddr = 0; // 芯片上分配给传感器的地址 - regWidth = 1; // 传感器寄存器地址宽度 - regBigEndian = 0; // 传感器寄存器大小端 - } - /* 传感器设备属性模板 */ - template sensorAttr { - chipName = ""; // 传感器芯片名字 - chipIdRegister = 0xf; // 传感器在位检测寄存器地址 - chipIdValue = 0xd1; // 校验传感器在位检测寄存器值 - } - } - } - } - ``` - - - 开发者配置accel_bmi160_config.hcs文件时,引用加速度传感器的模板,并根据需要修改模板中继承的字段。如果需要新增寄存器配置字段,在配置传感器HCS后扩展。 - - ``` - /* 根据不同器件硬件差异,修改模板配置,不修改的就会默认采用模板配置 */ - #include "accel_config.hcs" - root { - accel_bmi160_chip_config : sensorConfig { - match_attr = "hdf_sensor_accel_bmi160_driver"; - sensorInfo :: sensorDeviceInfo { - vendorName = "borsh_bmi160"; // max string length is 16 bytes - sensorTypeId = 1; // enum SensorTypeTag - sensorId = 1; // user define sensor id - } - sensorBusConfig:: sensorBusInfo { - busType = 0; // 0:i2c 1:spi - busNum = 6; - busAddr = 0x68; - regWidth = 1; // 1 btye - } - sensorIdAttr :: sensorIdInfo{ - chipName = "bmi160"; - chipIdRegister = 0x00; - chipIdValue = 0xd1; - } - sensorRegConfig { - /* regAddr: register address - value: config register value - len: size of value - mask: mask of value - delay: config register delay time (ms) - opsType: enum SensorOpsType 0-none 1-read 2-write 3-read_check 4-update_bit - calType: enum SensorBitCalType 0-none 1-set 2-revert 3-xor 4-left shift 5-right shift - shiftNum: shift bits - debug: 0-no debug 1-debug - save: 0-no save 1-save - */ - /* regAddr, value, mask, len, delay, opsType, calType, shiftNum, debug, save */ - /* 初始化寄存器组 */ - initSeqConfig = [ - 0x7e, 0xb6, 0xff, 1, 5, 2, 0, 0, 0, 0, - 0x7e, 0x10, 0xff, 1, 5, 2, 0, 0, 0, 0 - ]; - /* 使能寄存器组 */ - enableSeqConfig = [ - 0x7e, 0x11, 0xff, 1, 5, 2, 0, 0, 0, 0, - 0x41, 0x03, 0xff, 1, 0, 2, 0, 0, 0, 0, - 0x40, 0x08, 0xff, 1, 0, 2, 0, 0, 0, 0 - ]; - /* 去使能寄存器组 */ - disableSeqConfig = [ - 0x7e, 0x10, 0xff, 1, 5, 2, 0, 0, 0, 0 - ]; - } - } - } - ``` - -5. 加速度传感器差异化驱动实现 - - - 定义加速度传感器差异化驱动对应的HdfDriverEntry对象,其中Driver Entry入口函数定义如下: - - ``` - struct HdfDriverEntry g_accelBmi160DevEntry = { - .moduleVersion = 1, - .moduleName = "HDF_SENSOR_ACCEL_BMI160", - .Bind = Bmi160BindDriver, - .Init = Bmi160InitDriver, - .Release = Bmi160ReleaseDriver, - }; - HDF_INIT(g_accelBmi160DevEntry); - ``` - - - Bind驱动接口实例化。 - - ``` - int32_t Bmi160BindDriver(struct HdfDeviceObject *device) - { - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)OsalMemCalloc(sizeof(*drvData)); - if (drvData == NULL) { - HDF_LOGE("%s: Malloc Bmi160 drv data fail", __func__); - return HDF_ERR_MALLOC_FAIL; - } - drvData->ioService.Dispatch = DispatchBMI160; - drvData->device = device; - device->service = &drvData->ioService; - g_bmi160DrvData = drvData; - return HDF_SUCCESS; - } - ``` - - - Init驱动接口实例化。 - - ``` - int32_t Bmi160InitDriver(struct HdfDeviceObject *device) - { - …… - /* 加速度计差异化初始化配置 */ - ret = InitAccelPreConfig(); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Init BMI160 bus mux config", __func__); - return HDF_FAILURE; - } - /* 创建传感器配置数据接口,完成器件探测,私有数据配置解析 */ - drvData->sensorCfg = AccelCreateCfgData(device->property); - if (drvData->sensorCfg == NULL) { - return HDF_ERR_NOT_SUPPORT; - } - /* 注册差异化接口 */ - ops.Init = NULL; - ops.ReadData = ReadBmi160Data; - ret = AccelRegisterChipOps(&ops); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Register BMI160 accel failed", __func__); - return HDF_FAILURE; - } - /* 初始化器件配置 */ - ret = InitBmi160(drvData->sensorCfg); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Init BMI160 accel failed", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; - } - ``` - - - Release驱动接口实例化。 - - ``` - void Bmi160ReleaseDriver(struct HdfDeviceObject *device) - { - CHECK_NULL_PTR_RETURN(device); - struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)device->service; - CHECK_NULL_PTR_RETURN(drvData); - AccelReleaseCfgData(drvData->sensorCfg); - drvData->sensorCfg = NULL; - OsalMemFree(drvData); - } - ``` - -6. 加速度传感器差异化函数接口实现 - - 需要开发者实现的ReadBmi160Data接口函数,在Bmi160InitDriver函数里面注册此函数。 +5. 完成加速度传感器差异化驱动中差异化接口ReadData函数实现。 - ``` + ```c int32_t ReadBmi160Data(struct SensorCfgData *data) { int32_t ret; @@ -783,51 +667,12 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab } ``` -7. 主要的数据结构 - - ``` - /* 传感器2g对应灵敏度转换值 */ - #define BMI160_ACC_SENSITIVITY_2G 61 - /* 传感器数据采样寄存器地址 */ - #define BMI160_ACCEL_X_LSB_ADDR 0X12 - #define BMI160_ACCEL_X_MSB_ADDR 0X13 - #define BMI160_ACCEL_Y_LSB_ADDR 0X14 - #define BMI160_ACCEL_Y_MSB_ADDR 0X15 - #define BMI160_ACCEL_Z_LSB_ADDR 0X16 - #define BMI160_ACCEL_Z_MSB_ADDR 0X17 - #define BMI160_STATUS_ADDR 0X1B - /* 传感器数据维度 */ - enum AccelAxisNum { - ACCEL_X_AXIS = 0, - ACCEL_Y_AXIS = 1, - ACCEL_Z_AXIS = 2, - ACCEL_AXIS_NUM = 3, - }; - /* 传感器每个维度值 */ - struct AccelData { - int32_t x; - int32_t y; - int32_t z; - }; - /* 传感器私有数据结构体 */ - struct AccelDrvData { - struct IDeviceIoService ioService; - struct HdfDeviceObject *device; - HdfWorkQueue accelWorkQueue; - HdfWork accelWork; - OsalTimer accelTimer; - bool detectFlag; - bool enable; - int64_t interval; - struct SensorCfgData *accelCfg; - struct AccelOpsCall ops; - }; - /* 差异化适配函数 */ - struct AccelOpsCall { - int32_t (*Init)(struct SensorCfgData *data); - int32_t (*ReadData)(struct SensorCfgData *data); - }; - ``` +>![](../public_sys-resources/icon-note.gif) **说明:** +> +>- 传感器驱动模型已经提供一部分能力集,包括驱动设备管理能力、抽象总线和平台操作接口能力、通用配置操作接口能力、配置解析操作接口能力,接口参考[表2](#table1156812588320)。 +> +>- 需要开发人员实现部分有:传感器部分操作接口([表3](#table1083014911336))和传感器HCS差异化数据配置。 +> - 驱动基本功能验证。 ### 调测验证 diff --git a/zh-cn/device-dev/driver/driver-peripherals-vibrator-des.md b/zh-cn/device-dev/driver/driver-peripherals-vibrator-des.md index e92fd0ab496..50aab041315 100755 --- a/zh-cn/device-dev/driver/driver-peripherals-vibrator-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-vibrator-des.md @@ -11,7 +11,6 @@ - [场景介绍](###场景介绍) - [接口说明](###接口说明) - [开发步骤](###开发步骤) - - [开发实例](###开发实例) ## 概述 @@ -79,17 +78,10 @@ Vibrator驱动模型为上层马达硬件服务层提供稳定的马达控制能力接口,包括马达一次振动、马达效果配置震动、马达停止。基于HDF(Hardware Driver Foundation)驱动框架开发的马达驱动模型,实现跨操作系统迁移、器件差异配置等功能。马达具体的开发步骤如下: 1. 基于HDF驱动框架,按照驱动Driver Entry程序,完成马达抽象驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现,配置资源和HCS解析。 -2. 创建马达效果模型,解析马达效果HCS配置。 -3. 完成马达振动和停止接口开发,会根据振动效果的模式创建和销毁定时器。 -4. 马达驱动模型提供给开发者马达驱动差异化接口,开发者实现差异化接口。 - -### 开发实例 - -1. 马达驱动的初始化和去初始化 - 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出马达驱动模型,使用HCS作为配置描述源码。HCS配置字段详细介绍参考[配置管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-hdf-manage.md)。其中Driver Entry入口函数定义如下: - ``` + ```c /* 注册马达抽象驱动入口数据结构体对象 */ struct HdfDriverEntry g_vibratorDriverEntry = { .moduleVersion = 1, //马达模块版本号 @@ -99,12 +91,12 @@ Vibrator驱动模型为上层马达硬件服务层提供稳定的马达控制能 .Release = ReleaseVibratorDriver, //马达资源释放函数 }; - HDF_INIT(g_vibratorDriverEntry); + HDF_INIT(g_vibratorDriverEntry); ``` - 基于HDF驱动框架,按照驱动Driver Entry程序,完成马达抽象驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现。 - ``` + ```c /* 马达驱动对外发布的能力 */ static int32_t DispatchVibrator(struct HdfDeviceIoClient *client, int32_t cmd, struct HdfSBuf *data, struct HdfSBuf *reply) @@ -164,10 +156,10 @@ Vibrator驱动模型为上层马达硬件服务层提供稳定的马达控制能 g_vibratorDrvData = NULL; } ``` - + - 在系统启动过程中,HDF设备管理模块通过设备HCS配置信息,加载马达抽象驱动,并对外发布马达驱动接口。 - - ``` + + ```c /* 马达设备HCS配置 */ vibrator :: host { hostName = "vibrator_host"; @@ -183,12 +175,12 @@ Vibrator驱动模型为上层马达硬件服务层提供稳定的马达控制能 } } ``` - + 2. 创建马达效果模型,解析马达效果HCS配置。 - 创建马达效果模型。 - ``` + ```hcs /* 创建马达效果模型,分配资源,解析马达效果HCS配置 */ int32_t CreateVibratorHaptic(struct HdfDeviceObject *device) { @@ -254,7 +246,7 @@ Vibrator驱动模型为上层马达硬件服务层提供稳定的马达控制能 马达硬件服务调用StartOnce接口动态配置持续振动时间;调用StartEffect接口启动静态配置的振动效果,为驱动开发者提供抽象的配置接口能力。 - ``` + ```c /* 按照指定持续时间触发振动马达,duration为振动持续时长 */ static int32_t StartOnce(struct HdfSBuf *data, struct HdfSBuf *reply) { @@ -326,7 +318,7 @@ Vibrator驱动模型为上层马达硬件服务层提供稳定的马达控制能 - 在差异化器件驱动初始化成功时,注册差异实现接口,方便实现器件差异的驱动接口。 - ``` + ```c /* 注册马达差异化实现接口 */ int32_t RegisterVibrator(struct VibratorOps *ops) { @@ -347,7 +339,7 @@ Vibrator驱动模型为上层马达硬件服务层提供稳定的马达控制能 - 马达驱动模型提供给开发者马达驱动差异化接口,具体实现如下: - ``` + ```c /* 按照指定持续时间触发线性马达的振动 */ static int32_t StartLinearVibrator() { -- Gitee From 48033158fcf45850a3dcebc467406f4cd449c9ee Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Thu, 17 Mar 2022 19:03:08 +0800 Subject: [PATCH 4/5] modify sensor/vibrator/light file Signed-off-by: sunxuejiao --- zh-cn/device-dev/driver/driver-peripherals-sensor-des.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md index 6122876321f..9114c4ad0d3 100755 --- a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md @@ -132,6 +132,8 @@ Sensor驱动模型对外开放的API接口能力的具体实现参考[表1](#tab + + Sensor驱动模型对驱动开发者开放的功能接口,驱动开发者无需实现,直接使用,参考[表2](#table1156812588320): **表2** Sensor驱动模型对驱动开发者开放的功能接口列表 @@ -213,6 +215,8 @@ Sensor驱动模型对驱动开发者开放的功能接口,驱动开发者无 + + Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#table1083014911336): **表 3** Sensor驱动模型要求驱动开发者实现的接口列表 @@ -267,6 +271,8 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab + + 接口实现参考[开发实例](#section257750691)章节。 ### 开发步骤 -- Gitee From 75002f11272dc6bd11077bb094ee6074643c9b05 Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Fri, 18 Mar 2022 09:22:45 +0800 Subject: [PATCH 5/5] modify sensor/vibrator/light file Signed-off-by: sunxuejiao --- .../driver/driver-peripherals-sensor-des.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md index 9114c4ad0d3..65c872e1415 100755 --- a/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-sensor-des.md @@ -273,7 +273,7 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab -接口实现参考[开发实例](#section257750691)章节。 +接口实现参考[开发步骤](#section7893102915819)章节。 ### 开发步骤 1. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度抽象驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现。 @@ -431,22 +431,22 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab 2. 完成加速度传感器驱动的设备信息配置。 - - 加速度传感器模型使用HCS作为配置描述源码,HCS配置字段请参考[配置管理](driver-hdf-manage.md)介绍。 + 加速度传感器模型使用HCS作为配置描述源码,HCS配置字段请参考[配置管理](driver-hdf-manage.md)介绍。 - ``` - /* 加速度计传感器设备HCS配置 */ - device_sensor_accel :: device { - device0 :: deviceNode { - policy = 1; // 驱动服务发布的策略 - priority = 110; // 驱动启动优先级(0-200),值越大优先级越低,建议配置为100,优先级相同则不保证device的加载顺序 - preload = 0; // 驱动按需加载字段,0表示加载,2表示不加载 - permission = 0664; // 驱动创建设备节点权限 - moduleName = "HDF_SENSOR_ACCEL"; // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 - serviceName = "sensor_accel"; // 驱动对外发布服务的名称,必须唯一 - deviceMatchAttr = "hdf_sensor_accel_driver"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 - } - } - ``` + ``` + /* 加速度计传感器设备HCS配置 */ + device_sensor_accel :: device { + device0 :: deviceNode { + policy = 1; // 驱动服务发布的策略 + priority = 110; // 驱动启动优先级(0-200),值越大优先级越低,建议配置为100,优先级相同则不保证device的加载顺序 + preload = 0; // 驱动按需加载字段,0表示加载,2表示不加载 + permission = 0664; // 驱动创建设备节点权限 + moduleName = "HDF_SENSOR_ACCEL"; // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 + serviceName = "sensor_accel"; // 驱动对外发布服务的名称,必须唯一 + deviceMatchAttr = "hdf_sensor_accel_driver"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 + } + } + ``` 3. 完成加速度传感器抽象驱动内部接口开发,包括Enable、Disable、SetBatch、SetMode、SetOption、AccelCreateCfgData、AccelReleaseCfgData、AccelRegisterChipOps接口实现。 @@ -555,7 +555,7 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考[表3](#tab } ``` -4. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度传感器差异化驱动开发,主要有Bind、Init、Release、Dispatch函数接口实现。 +4. 基于HDF驱动框架,按照驱动Driver Entry程序,完成加速度传感器差异化驱动开发,主要由Bind、Init、Release、Dispatch函数接口实现。 ```c /* 加速度计传感器差异化驱动消息交互 */ -- Gitee