diff --git a/zh-cn/device-dev/driver/Readme-CN.md b/zh-cn/device-dev/driver/Readme-CN.md index 652a8c588ef50fd0c118b2c931661162cd779b6c..0a3ef42249ef30a21979b2d1611b4a8f502b41fd 100755 --- a/zh-cn/device-dev/driver/Readme-CN.md +++ b/zh-cn/device-dev/driver/Readme-CN.md @@ -1,55 +1,54 @@ # 驱动使用指南 -- [HDF驱动框架](driver-hdf.md) +- HDF驱动框架 - [HDF开发概述](driver-hdf-overview.md) - [驱动开发](driver-hdf-development.md) - [驱动服务管理](driver-hdf-servicemanage.md) - [驱动消息机制管理](driver-hdf-message-management.md) - [配置管理](driver-hdf-manage.md) - [HDF开发实例](driver-hdf-sample.md) -- [平台驱动开发](driver-develop.md) +- 平台驱动开发 - [ADC](driver-platform-adc-develop.md) - [DAC](driver-platform-dac-develop.md) - [GPIO](driver-platform-gpio-develop.md) - [HDMI](driver-platform-hdmi-develop.md) - [I2C](driver-platform-i2c-develop.md) - [I3C](driver-platform-i3c-develop.md) - - [MIPI-CSI](driver-platform-mipicsi-develop.md) - - [MIPI-DSI](driver-platform-mipidsi-develop.md) + - [MIPI CSI](driver-platform-mipicsi-develop.md) + - [MIPI DSI](driver-platform-mipidsi-develop.md) - [MMC](driver-platform-mmc-develop.md) - [PIN](driver-platform-pin-develop.md) - [PWM](driver-platform-pwm-develop.md) - - [REGULATOR](driver-platform-regulator-develop.md) + - [Regulator](driver-platform-regulator-develop.md) - [RTC](driver-platform-rtc-develop.md) - [SDIO](driver-platform-sdio-develop.md) - [SPI](driver-platform-spi-develop.md) - [UART](driver-platform-uart-develop.md) - [WatchDog](driver-platform-watchdog-develop.md) -- [平台驱动使用](driver-platform.md) +- 平台驱动使用 - [ADC](driver-platform-adc-des.md) - [DAC](driver-platform-dac-des.md) - [GPIO](driver-platform-gpio-des.md) - [HDMI](driver-platform-hdmi-des.md) - [I2C](driver-platform-i2c-des.md) - [I3C](driver-platform-i3c-des.md) - - [MIPI-CSI](driver-platform-mipicsi-des.md) - - [MIPI-DSI](driver-platform-mipidsi-des.md) + - [MIPI CSI](driver-platform-mipicsi-des.md) + - [MIPI DSI](driver-platform-mipidsi-des.md) - [PIN](driver-platform-pin-des.md) - [PWM](driver-platform-pwm-des.md) - - [REGULATOR](driver-platform-regulator-des.md) + - [Regulator](driver-platform-regulator-des.md) - [RTC](driver-platform-rtc-des.md) - [SDIO](driver-platform-sdio-des.md) - [SPI](driver-platform-spi-des.md) - [UART](driver-platform-uart-des.md) - - [WATCHDOG](driver-platform-watchdog-des.md) -- [外设驱动使用](driver-peripherals.md) + - [WatchDog](driver-platform-watchdog-des.md) +- 外设驱动使用 - [LCD](driver-peripherals-lcd-des.md) - - [TOUCHSCREEN](driver-peripherals-touch-des.md) - - [SENSOR](driver-peripherals-sensor-des.md) + - [Touchscreen](driver-peripherals-touch-des.md) + - [Sensor](driver-peripherals-sensor-des.md) - [WLAN](driver-peripherals-external-des.md) - - [AUDIO](driver-peripherals-audio-des.md) + - [Audio](driver-peripherals-audio-des.md) - [USB](driver-peripherals-usb-des.md) - - [CAMERA](driver-peripherals-camera-des.md) - - [VIBRATOR](driver-peripherals-vibrator-des.md) - - [LIGHT](driver-peripherals-light-des.md) - + - [Camera](driver-peripherals-camera-des.md) + - [Vibrator](driver-peripherals-vibrator-des.md) + - [Light](driver-peripherals-light-des.md) \ No newline at end of file diff --git a/zh-cn/device-dev/driver/driver-develop.md b/zh-cn/device-dev/driver/driver-develop.md index bb2cff55133ce0f076a67d747ce13db2c2c2ee3b..4bfb18822cfb09d7e6bcc9eba7dabcc2d5924286 100644 --- a/zh-cn/device-dev/driver/driver-develop.md +++ b/zh-cn/device-dev/driver/driver-develop.md @@ -1,31 +1,25 @@ -# 平台驱动开发 +# 平台驱动开发 -- **[ADC](driver-platform-adc-develop.md)** -- **[DAC](driver-platform-dac-develop.md)** -- **[GPIO](driver-platform-gpio-develop.md)** +- **[ADC](driver-platform-adc-develop.md)** -- **[HDMI](driver-platform-hdmi-develop.md)** +- **[GPIO](driver-platform-gpio-develop.md)** -- **[I2C](driver-platform-i2c-develop.md)** +- **[I2C](driver-platform-i2c-develop.md)** -- **[I3C](driver-platform-i3c-develop.md)** +- **[MIPI DSI](driver-platform-mipidsi-develop.md)** -- **[MIPI-CSI](driver-platform-mipicsi-develop.md)** +- **[MMC](driver-platform-mmc-develop.md)** -- **[MIPI-DSI](driver-platform-mipidsi-develop.md)** +- **[PWM](driver-platform-pwm-develop.md)** -- **[MMC](driver-platform-mmc-develop.md)** +- **[RTC](driver-platform-rtc-develop.md)** -- **[PWM](driver-platform-pwm-develop.md)** +- **[SDIO](driver-platform-sdio-develop.md)** -- **[RTC](driver-platform-rtc-develop.md)** +- **[SPI](driver-platform-spi-develop.md)** -- **[SDIO](driver-platform-sdio-develop.md)** +- **[UART](driver-platform-uart-develop.md)** -- **[SPI](driver-platform-spi-develop.md)** - -- **[UART](driver-platform-uart-develop.md)** - -- **[WatchDog](driver-platform-watchdog-develop.md)** +- **[WatchDog](driver-platform-watchdog-develop.md)** \ No newline at end of file diff --git a/zh-cn/device-dev/driver/driver-hdf-development.md b/zh-cn/device-dev/driver/driver-hdf-development.md index f5ed1cc265b9c66adb0a668bea64b002dec0ea39..08b088a444793c24a1a2a4a0dbeed817a7ac7d90 100755 --- a/zh-cn/device-dev/driver/driver-hdf-development.md +++ b/zh-cn/device-dev/driver/driver-hdf-development.md @@ -1,253 +1,231 @@ -# 驱动开发 +# 驱动开发 -- [驱动模型介绍](#section157425168112) -- [驱动开发步骤](#section1969312275533) -## 驱动模型介绍 +## 驱动模型介绍 HDF框架以组件化的驱动模型作为核心设计思路,为开发者提供更精细化的驱动管理,让驱动开发和部署更加规范。HDF框架将一类设备驱动放在同一个host里面,开发者也可以将驱动功能分层独立开发和部署,支持一个驱动多个node,HDF驱动模型如下图所示: -**图 1** HDF驱动模型 -![](figures/HDF驱动模型.png "HDF驱动模型") + **图1** HDF驱动模型 -## 驱动开发步骤 + ![zh-cn_image_0000001153947412](figures/zh-cn_image_0000001153947412.png) -基于HDF框架进行驱动的开发主要分为两个部分,驱动实现和驱动配置,详细开发流程如下所示: -1. 驱动实现 +## 驱动开发步骤 - 驱动实现包含驱动业务代码和驱动入口注册,具体写法如下: +基于HDF框架进行驱动的开发主要分为两个部分,驱动实现和驱动配置,详细开发流程如下所示: - - 驱动业务代码 +1. 驱动实现 + 驱动实现包含驱动业务代码和驱动入口注册,具体写法如下: - ``` - #include "hdf_device_desc.h" // HDF框架对驱动开放相关能力接口的头文件 - #include "hdf_log.h" // HDF 框架提供的日志接口头文件 - - #define HDF_LOG_TAG "sample_driver" // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签 - - //驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架 - int32_t HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) - { - HDF_LOGD("Sample driver bind success"); - return 0; - } - - // 驱动自身业务初始的接口 - int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) - { - HDF_LOGD("Sample driver Init success"); - return 0; - } + - 驱动业务代码 - // 驱动资源释放的接口 - void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) - { - HDF_LOGD("Sample driver release success"); - return; - } - ``` - - - 驱动入口注册到HDF框架 - - ``` - // 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量 - struct HdfDriverEntry g_sampleDriverEntry = { - .moduleVersion = 1, - .moduleName = "sample_driver", - .Bind = HdfSampleDriverBind, - .Init = HdfSampleDriverInit, - .Release = HdfSampleDriverRelease, - }; + ``` + #include "hdf_device_desc.h" // HDF框架对驱动开发相关能力接口的头文件 + #include "hdf_log.h" // HDF 框架提供的日志接口头文件 + + #define HDF_LOG_TAG "sample_driver" // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签 + + //驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架 + int32_t HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) + { + HDF_LOGD("Sample driver bind success"); + return 0; + } + + // 驱动自身业务初始的接口 + int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) + { + HDF_LOGD("Sample driver Init success"); + return 0; + } + + // 驱动资源释放的接口 + void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) + { + HDF_LOGD("Sample driver release success"); + return; + } + ``` + - 驱动入口注册到HDF框架 - // 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 - HDF_INIT(g_sampleDriverEntry); - ``` + ``` + // 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量 + struct HdfDriverEntry g_sampleDriverEntry = { + .moduleVersion = 1, + .moduleName = "sample_driver", + .Bind = HdfSampleDriverBind, + .Init = HdfSampleDriverInit, + .Release = HdfSampleDriverRelease, + }; + + // 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + HDF_INIT(g_sampleDriverEntry); + ``` 2. 驱动编译 - - liteos + 涉及makefile和BUILD.gn修改: + + - makefile部分: + 驱动代码的编译必须要使用HDF框架提供的Makefile模板进行编译。 + + + ``` + include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk #导入hdf预定义内容,必需 + MODULE_NAME := #生成的结果文件 + LOCAL_INCLUDE := #本驱动的头文件目录 + LOCAL_SRCS := #本驱动的源代码文件 + LOCAL_CFLAGS := #自定义的编译选项 + include $(HDF_DRIVER) #导入模板makefile完成编译 + ``` + + 编译结果文件链接到内核镜像,添加到drivers/adapter/khdf/liteos目录下的hdf_lite.mk里面,示例如下: + + + ``` + LITEOS_BASELIB += -lxxx #链接生成的静态库 + LIB_SUBDIRS += #驱动代码Makefile的目录 + ``` + + - BUILD.gn部分: + 添加模块BUILD.gn参考定义如下内容: + + + ``` + import("//build/lite/config/component/lite_component.gni") + import("//drivers/adapter/khdf/liteos/hdf.gni") + module_switch = defined(LOSCFG_DRIVERS_HDF_xxx) + module_name = "xxx" + hdf_driver(module_name) { + sources = [ + "xxx/xxx/xxx.c", #模块要编译的源码文件 + ] + public_configs = [ ":public" ] #使用依赖的头文件配置 + } + config("public") { #定义依赖的头文件配置 + include_dirs = [ + "xxx/xxx/xxx", #依赖的头文件目录 + ] + } + ``` + + 把新增模块的BUILD.gn所在的目录添加到/drivers/adapter/khdf/liteos/BUILD.gn里面: + + + ``` + group("liteos") { + public_deps = [ ":$module_name" ] + deps = [ + "xxx/xxx", #新增模块BUILD.gn所在的目录,目录结构相对于/drivers/adapter/khdf/liteos + ] + } + ``` + - linux + 如果需要定义模块控制宏,需要在模块目录xxx里面添加Kconfig文件,并把Kconfig文件路径添加到drivers/adapter/khdf/linux/Kconfig里面: - 涉及makefile和BUILD.gn修改: - - * makefile部分: - - 驱动代码的编译必须要使用HDF框架提供的Makefile模板进行编译。 - - ``` - include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk #导入hdf预定义内容,必需 - MODULE_NAME := #生成的结果文件 - LOCAL_INCLUDE := #本驱动的头文件目录 - LOCAL_SRCS := #本驱动的源代码文件 - LOCAL_CFLAGS := #自定义的编译选项 - include $(HDF_DRIVER) #导入模板makefile完成编译 - ``` - - 编译结果文件链接到内核镜像,添加到drivers/adapter/khdf/liteos目录下的hdf_lite.mk里面,示例如下: - - ``` - LITEOS_BASELIB += -lxxx #链接生成的静态库 - LIB_SUBDIRS += #驱动代码Makefile的目录 - ``` - - * BUILD.gn部分: - - 添加模块BUILD.gn参考定义如下内容: - - ``` - import("//build/lite/config/component/lite_component.gni") - import("//drivers/adapter/khdf/liteos/hdf.gni") - module_switch = defined(LOSCFG_DRIVERS_HDF_xxx) - module_name = "xxx" - hdf_driver(module_name) { - sources = [ - "xxx/xxx/xxx.c", #模块要编译的源码文件 - ] - public_configs = [ ":public" ] #使用依赖的头文件配置 - } - config("public") { #定义依赖的头文件配置 - include_dirs = [ - "xxx/xxx/xxx", #依赖的头文件目录 - ] - } - ``` - - 把新增模块的BUILD.gn所在的目录添加到/drivers/adapter/khdf/liteos/BUILD.gn里面: - - ``` - group("liteos") { - public_deps = [ ":$module_name" ] - deps = [ - "xxx/xxx", #新增模块BUILD.gn所在的目录,目录结构相对于/drivers/adapter/khdf/liteos - ] - } - ``` + + ``` + source "drivers/hdf/khdf/xxx/Kconfig" #目录为hdf模块软链接到kernel里面的目录 + ``` - - linux + 添加模块目录到drivers/adapter/khdf/linux/Makefile: - 如果需要定义模块控制宏,需要在模块目录xxx里面添加Kconfig文件,并把Kconfig文件路径添加到drivers/adapter/khdf/linux/Kconfig里面: - - ``` - source "drivers/hdf/khdf/xxx/Kconfig" #目录为hdf模块软链接到kernel里面的目录 - ``` - - 添加模块目录到drivers/adapter/khdf/linux/Makefile: - - ``` - obj-$(CONFIG_DRIVERS_HDF) += xxx/ - ``` + + ``` + obj-$(CONFIG_DRIVERS_HDF) += xxx/ + ``` + + 在模块目录xxx里面添加Makefile文件,在Makefile文件里面添加模块代码编译规则: - 在模块目录xxx里面添加Makefile文件,在Makefile文件里面添加模块代码编译规则: + + ``` + obj-y += xxx.o + ``` - ``` - obj-y += xxx.o - ``` +3. 驱动配置 + HDF使用HCS作为配置描述源码,HCS详细介绍参考[配置管理](../driver/driver-hdf-manage.md)介绍。 + 驱动配置包含两部分,HDF框架定义的驱动设备描述和驱动的私有配置信息,具体写法如下: - - -3. 驱动配置 - - HDF使用HCS作为配置描述源码,HCS详细介绍参考[配置管理](driver-hdf-manage.md)介绍。 - - 驱动配置包含两部分,HDF框架定义的驱动设备描述和驱动的私有配置信息,具体写法如下: - - - 驱动设备描述(必选) - - HDF框架加载驱动所需要的信息来源于HDF框架定义的驱动设备描述,因此基于HDF框架开发的驱动必须要在HDF框架定义的device\_info.hcs配置文件中添加对应的设备描述,驱动的设备描述填写如下所示: - - ``` - root { - device_info { - match_attr = "hdf_manager"; - template host { // host模板,继承该模板的节点(如下sample_host)如果使用模板中的默认值,则节点字段可以缺省 - hostName = ""; - priority = 100; - template device { - template deviceNode { - policy = 0; - priority = 100; - preload = 0; - permission = 0664; - moduleName = ""; - serviceName = ""; - deviceMatchAttr = ""; - } - } - } - sample_host :: host{ - hostName = "host0"; // host名称,host节点是用来存放某一类驱动的容器 - priority = 100; // host启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证host的加载顺序 - device_sample :: device { // sample设备节点 - device0 :: deviceNode { // sample驱动的DeviceNode节点 - policy = 1; // policy字段是驱动服务发布的策略,在驱动服务管理章节有详细介绍 - priority = 100; // 驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序 - preload = 0; // 驱动按需加载字段,在本章节最后的说明有详细介绍 - permission = 0664; // 驱动创建设备节点权限 - moduleName = "sample_driver"; // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 - serviceName = "sample_service"; // 驱动对外发布服务的名称,必须唯一 - deviceMatchAttr = "sample_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 - } - } - } - } - } - ``` - - - 驱动私有配置信息(可选) - - 如果驱动有私有配置,则可以添加一个驱动的配置文件,用来填写一些驱动的默认配置信息,HDF框架在加载驱动的时候,会将对应的配置信息获取并保存在HdfDeviceObject 中的property里面,通过Bind和Init(参考[驱动开发](#li35182436435))传递给驱动,驱动的配置信息示例如下: - - ``` - root { - SampleDriverConfig { - sample_version = 1; - sample_bus = "I2C_0"; - match_attr = "sample_config"; //该字段的值必须和device_info.hcs中的deviceMatchAttr值一致 - } - } - ``` - - 配置信息定义之后,需要将该配置文件添加到板级配置入口文件hdf.hcs(这一块可以通过OpenHarmony驱动子系统在DevEco集成驱动开发套件工具一键式配置,具体使用方法参考驱动开发套件中的介绍),示例如下: - - ``` - #include "device_info/device_info.hcs" - #include "sample/sample_config.hcs" - ``` - -4. 用户态驱动服务启动配置 - - 用户态需要把驱动服务配置到文件drivers/adapter/uhdf2/host/hdf_devhostmusl.cfg中,如下: - - ``` - { - "name" : "sample_host", //驱动服务进程名字,和device_info.hcs中配置的hostName对应 - "dynamic" : true, //动态加载,目前驱动服务只支持动态加载,即由hdf_devmgr在初始化时调用init模块接口启动 - "path" : ["/vendor/bin/hdf_devhost"],//hdf_devhost所在的目录 - "uid" : "sample_host",//进程的用户ID - "gid" : ["sample_host"],//进程的组ID - "caps" : ["DAC_OVERRIDE", "DAC_READ_SEARCH"]//进程的Linux capabilities配置 - } - ``` - - 进程的用户ID在文件base/startup/init_lite/services/etc/passwd中配置,进程的组ID在文件base/startup/init_lite/services/etc/group中配置,进程用户ID和组ID配置参考:[系统服务用户组添加方法](https://gitee.com/openharmony/startup_init_lite/wikis)。 - - - - - ->![](../public_sys-resources/icon-note.gif) **说明:** ->驱动加载方式支持按需加载和按序加载两种方式,具体使用方法如下: ->- 按需加载 -> ``` -> typedef enum { -> DEVICE_PRELOAD_ENABLE = 0, -> DEVICE_PRELOAD_ENABLE_STEP2, -> DEVICE_PRELOAD_DISABLE, -> DEVICE_PRELOAD_INVALID -> } DevicePreload; -> ``` -> 配置文件中preload 字段配成 0 (DEVICE\_PRELOAD\_ENABLE ),则系统启动过程中默认加载;配成1(DEVICE\_PRELOAD\_ENABLE\_STEP2),当系统支持快启的时候,则在系统完成之后再加载这一类驱动,否则和DEVICE\_PRELOAD\_ENABLE 含义相同;配成2(DEVICE\_PRELOAD\_DISABLE),则系统启动过程中默认不加载,支持后续动态加载,当用户态获取驱动服务(参考[消息机制](driver-hdf-message-management.md))时,如果驱动服务不存在时,HDF框架会尝试动态加载该驱动。 ->- 按序加载(需要驱动为默认加载) -> 配置文件中的priority(取值范围为整数0到200)是用来表示host和驱动的优先级,不同的host内的驱动,host的priority值越小,驱动加载优先级越高;同一个host内驱动的priority值越小,加载优先级越高。 - + - 驱动设备描述(必选) + HDF框架加载驱动所需要的信息来源于HDF框架定义的驱动设备描述,因此基于HDF框架开发的驱动必须要在HDF框架定义的device_info.hcs配置文件中添加对应的设备描述,驱动的设备描述填写如下所示: + + + ``` + root { + device_info { + match_attr = "hdf_manager"; + template host { // host模板,继承该模板的节点(如下sample_host)如果使用模板中的默认值,则节点字段可以缺省 + hostName = ""; + priority = 100; + template device { + template deviceNode { + policy = 0; + priority = 100; + preload = 0; + permission = 0664; + moduleName = ""; + serviceName = ""; + deviceMatchAttr = ""; + } + } + } + sample_host :: host{ + hostName = "host0"; // host名称,host节点是用来存放某一类驱动的容器 + priority = 100; // host启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证host的加载顺序 + device_sample :: device { // sample设备节点 + device0 :: deviceNode { // sample驱动的DeviceNode节点 + policy = 1; // policy字段是驱动服务发布的策略,在驱动服务管理章节有详细介绍 + priority = 100; // 驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序 + preload = 0; // 驱动按需加载字段,在本章节最后的说明有详细介绍 + permission = 0664; // 驱动创建设备节点权限 + moduleName = "sample_driver"; // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 + serviceName = "sample_service"; // 驱动对外发布服务的名称,必须唯一 + deviceMatchAttr = "sample_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 + } + } + } + } + } + ``` + - 驱动私有配置信息(可选) + 如果驱动有私有配置,则可以添加一个驱动的配置文件,用来填写一些驱动的默认配置信息,HDF框架在加载驱动的时候,会将对应的配置信息获取并保存在HdfDeviceObject 中的property里面,通过Bind和Init(参考步骤1)传递给驱动,驱动的配置信息示例如下: + + + ``` + root { + SampleDriverConfig { + sample_version = 1; + sample_bus = "I2C_0"; + match_attr = "sample_config"; //该字段的值必须和device_info.hcs中的deviceMatchAttr值一致 + } + } + ``` + + 配置信息定义之后,需要将该配置文件添加到板级配置入口文件hdf.hcs(这一块可以通过OpenHarmony驱动子系统在DevEco集成驱动开发套件工具一键式配置,具体使用方法参考驱动开发套件中的介绍),示例如下: + + + ``` + #include "device_info/device_info.hcs" + #include "sample/sample_config.hcs" + ``` + + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** +> 驱动加载方式支持按需加载和按序加载两种方式,具体使用方法如下: +> +> - 按需加载 +> +> ``` +> typedef enum { +> DEVICE_PRELOAD_ENABLE = 0, +> DEVICE_PRELOAD_ENABLE_STEP2, +> DEVICE_PRELOAD_DISABLE, +> DEVICE_PRELOAD_INVALID +> } DevicePreload; +> ``` +> +> 配置文件中preload 字段配成 0(DEVICE_PRELOAD_ENABLE),则系统启动过程中默认加载;配成1(DEVICE_PRELOAD_ENABLE_STEP2),当系统支持快启的时候,则在系统完成之后再加载这一类驱动,否则和DEVICE_PRELOAD_ENABLE含义相同;配成2(DEVICE_PRELOAD_DISABLE),则系统启动过程中默认不加载,支持后续动态加载,当用户态获取驱动服务(参考[消息机制](../driver/driver-hdf-message-management.md))时,如果驱动服务不存在,HDF框架会尝试动态加载该驱动。 +> +> - 按序加载(需要驱动为默认加载) +> 配置文件中的priority(取值范围为整数0到200)是用来表示host和驱动的优先级,不同的host内的驱动,host的priority值越小,驱动加载优先级越高;同一个host内驱动的priority值越小,加载优先级越高。 diff --git a/zh-cn/device-dev/driver/driver-hdf-manage.md b/zh-cn/device-dev/driver/driver-hdf-manage.md index 9b591965f4bb551eaac376cbc622aa92ef3c4dd1..ffc6f115a4f1f787125410ee355c662d72a29fbf 100644 --- a/zh-cn/device-dev/driver/driver-hdf-manage.md +++ b/zh-cn/device-dev/driver/driver-hdf-manage.md @@ -1,125 +1,73 @@ -# 配置管理 +# 配置管理 -- [配置概述](#section59914284576) -- [配置语法](#section533713333580) - - [关键字](#section4522107333) - - [基本结构](#section853042911312) - - [数据类型](#section177001259134) - - [预处理](#section14867121641) - - [注释](#section1323412417) - - [引用修改](#section193708571145) - - [节点复制](#section1487792020513) - - [删除](#section1096515391155) - - [属性引用](#section20271317611) - - [模板](#section958819191063) -- [配置生成](#section106152531919) - - [hc-gen介绍](#section359734416616) +## 配置概述 +HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。 -## 配置概述 +HC-GEN(HDF Configuration Generator)是HCS配置转换工具,可以将HDF配置文件转换为软件可读取的文件格式: -HCS\(**H**DF **C**onfiguration **S**ource\)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。 +- 在弱性能环境中,转换为配置树源码或配置树宏定义,驱动可直接调用C代码或宏式APIs获取配置。 -HC-GEN**\(H**DF **C**onfiguration **G**enerator**\)**是HCS配置转换工具,可以将HDF配置文件转换为软件可读取的文件格式: - -- 在弱性能环境中,转换为配置树源码或配置树宏定义,驱动可直接调用C代码或宏式APIs获取配置。 -- 在高性能环境中,转换为HCB\(**H**DF **C**onfiguration **B**inary\)二进制文件,驱动可使用HDF框架提供的配置解析接口获取配置。 +- 在高性能环境中,转换为HCB(HDF Configuration Binary)二进制文件,驱动可使用HDF框架提供的配置解析接口获取配置。 以下是使用HCB模式的典型应用场景: -**图 1** 配置使用流程图 -![](figures/配置使用流程图.png "配置使用流程图") + **图1** 配置使用流程图 + + ![zh-cn_image_0000001154105768](figures/zh-cn_image_0000001154105768.png) HCS经过HC-GEN编译生成HCB文件,HDF驱动框架中的HCS Parser模块会从HCB文件中重建配置树,HDF驱动模块使用HCS Parser提供的配置读取接口获取配置内容。 -## 配置语法 + +## 配置语法 HCS的语法介绍如下: -### 关键字 + +### 关键字 HCS配置语法保留了以下关键字。 -**表 1** HCS配置语法保留关键字 - - -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
int32_t (*setMacAddr)(struct NetDevice *netDev, void *addr); - |
-- | -|
- | -- | -|
- | -- | -|
- | -- | -
- | -- | -- | -- | -- | -
---|---|---|---|---|
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -- | -- | -- | -
---|---|---|---|---|
- | -- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -- | -- | -- | -
---|---|---|---|---|
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -- | -
---|---|---|---|
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
功能分类 | -接口名 | -描述 | -
PWM句柄操作 | -PwmOpen | -获取PWM设备驱动句柄 | -
PwmClose | -释放PWM设备驱动句柄 | -|
使能/禁用PWM | -PwmEnable | -使能PWM | -
PwmDisable | -禁用PWM | -|
PWM配置操作 | -PwmSetPeriod | -设置PWM周期 | -
PwmSetDuty | -设置PWM占空时间 | -|
PwmSetPolarity | -设置PWM极性 | -|
设置/获取PWM配置信息 | -PwmSetConfig | -设置PWM设备参数 | -
PwmGetConfig | -获取PWM设备参数 | -
- | -- | -- | -- | -
---|---|---|---|
- | -- - | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -- | -
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- - | -- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -- | -
---|---|---|---|
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- - | -- | -- | -
- | -- | -|
- - | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- - | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -- | -- | -- | -
---|---|---|---|---|
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -- | -
---|---|---|---|
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -