1# 驱动子系统<a name="ZH-CN_TOPIC_0000001052619216"></a> 2 3- [简介](#section11660541593) 4- [架构](#section101721227145613) 5- [目录](#section1464106163817) 6- [使用](#section8496817141616) 7- [安装](#section14778154275818) 8- [相关仓](#section134812226297) 9 10## 简介<a name="section11660541593"></a> 11 12OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。 13 14为了缩减驱动开发者的驱动开发周期,降低三方设备驱动集成难度,OpenHarmony驱动子系统支持以下关键特性和能力。 15 16- 弹性化的框架能力: 17 18 在传统的驱动框架能力的基础上,OpenHarmony驱动子系统通过构建弹性化的框架能力,可支持在百K级别到百兆级容量的终端产品形态部署。 19 20 21- 规范化的驱动接口: 22 23 定义了常见驱动接口,为驱动开发者和使用者提供丰富、稳定接口,并和未来开放的面向手机、平板、智慧屏等设备驱动接口保持API兼容性。 24 25 26- 组件化的驱动模型: 27 28 支持组件化的驱动模型,为开发者提供更精细化的驱动管理,开发者可以对驱动进行组件化拆分,使得驱动开发者可以更多关注驱动与硬件交互部分。 29 30 同时系统也预置了部分模板化的驱动模型组件,如网络设备模型等。 31 32 33- 归一化的配置界面: 34 35 提供统一的配置界面,构建跨平台的配置转换和生成工具,实现跨平台的无缝切换 36 37 38为了方便驱动开发者更易于开发OpenHarmony驱动程序,OpenHarmony驱动子系统在DevEco集成了驱动开发套件工具,支持驱动工程管理,驱动模板生成、配置管理等界面化的操作。 39 40## 架构<a name="section101721227145613"></a> 41 42OpenHarmony驱动框架采用主从架构设计模式,围绕着框架、模型、能力库和工具四个维度能力展开构建。 43 44**图 1** 驱动架构图<a name="fig1077923710115"></a> 45![](figures/驱动架构图.png "驱动架构图") 46 47- 驱动框架 -位于framework/core目录 48 - 提供驱动框架能力,主要完成驱动加载和启动功能。 49 - 通过对象管理器方式可实现驱动框架的弹性化部署和扩展。 50 51- 驱动模型 - 位于framework/model目录 52 - 提供了模型化驱动能力,如网络设备模型。 53 54- 驱动能力库 - 位于framework/ability目录 55 - 提供基础驱动能力模型,如IO通信能力模型。 56 57- 驱动工具 - 位于framework/tools目录 58 - 提供HDI接口转换、驱动配置编译等工具。 59 60- 驱动接口 - 位于lite/hdi目录 61 - 提供规范化的驱动接口。 62 63- Support - 位于framework/support目录 64 - 提供规范化的平台驱动接口和系统接口抽象能力。 65 66 67## 目录<a name="section1464106163817"></a> 68 69``` 70drivers 71├── adapter #适配平台差异性的代码 72├── framework #驱动框架核心代码 73└── peripheral #外设驱动代码 74``` 75 76## 使用<a name="section8496817141616"></a> 77 78**图 2** 驱动框架交互流程<a name="fig1356181413429"></a> 79![](figures/驱动框架交互流程.png "驱动框架交互流程") 80 81驱动框架完成大部分驱动加载的动作,用户只需注册自己所需的接口和配置,然后驱动框架就会解析配置的内容,完成驱动加载和初始化动作。 82 83开发者基于HDF驱动框架开发的驱动主要包含三大部分: 84 851、驱动程序部分 - 完成驱动的功能逻辑。 86 872、驱动配置信息 - 指示驱动的加载信息内容。 88 893、驱动资源配置 - 配置驱动的硬件配置信息。 90 91驱动程序主要是完成驱动功能的开发部分: 92 93对于开发者首先看到的是驱动入口部分,驱动入口部分通过DriverEntry对其进行描述。 94 95其中主要包含bind, init 和release三个接口。 96 97``` 98struct HdfDriverEntry g_deviceSample = { 99 .moduleVersion = 1, 100 .moduleName = "sample_driver", 101 .Bind = SampleDriverBind, 102 .Init = SampleDriverInit, 103 .Release = SampleDriverRelease, 104}; 105``` 106 107Bind接口描述:该接口的作用主要是完成驱动设备和设备服务接口的bind动作。 108 109``` 110int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject) 111{ 112 // TODO: Bind device service to device object. 113 // And you can also initialize device resources here. 114 return HDF_SUCCESS; 115} 116``` 117 118Init接口描述:当框架完成设备绑定动作后,就开始调用驱动初始化接口,当初始化成功后,驱动框架根据配置文件决定是否对外创建设备服务接口,还是只是对当前服务接口可见。如果Init初始化失败的话,驱动框架就会主动释放创建的设备接口等信息。 119 120``` 121int32_t SampleDriverInit(struct HdfDeviceObject *deviceObject) 122{ 123 // TODO: Init hardware or other resources here. 124 return HDF_SUCCESS; 125} 126``` 127 128Release接口描述:当用户需要卸载驱动时,驱动框架先通过该接口通知驱动程序释放资源。然后在执行其他内部资源释放。 129 130``` 131void SampleDriverRelease(struct HdfDeviceObject *deviceObject) 132{ 133 // Release all resources. 134 return; 135} 136``` 137 138## 安装<a name="section14778154275818"></a> 139 140OpenHarmony驱动主要部署在内核态,当前主要采用静态链接方式,随内核子系统编译和系统镜像打包。 141 142**图 3** 驱动安装部署图<a name="fig20119729154211"></a> 143![](figures/驱动安装部署图.png "驱动安装部署图") 144 145## 相关仓<a name="section134812226297"></a> 146 147**驱动子系统** 148 149[drivers\_framework](https://gitee.com/openharmony/drivers_framework/blob/master/README_zh.md) 150 151[drivers\_adapter](https://gitee.com/openharmony/drivers_adapter/blob/master/README_zh.md) 152 153[drivers\_adapter\_khdf\_linux](https://gitee.com/openharmony/drivers_adapter_khdf_linux/blob/master/README_zh.md) 154 155[drivers\_peripheral](https://gitee.com/openharmony/drivers_peripheral/blob/master/README_zh.md) 156 157