• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 器件驱动移植
2
3
4本章节讲解如何移植各类器件驱动。
5
6
7## LCD驱动移植
8
9移植LCD驱动的主要工作是编写一个驱动,在驱动中生成模型的实例,并完成注册。
10
11这些LCD的驱动被放置在源码目录//drivers/framework/model/display/driver/panel中。
12
131. 创建Panel驱动
14   创建HDF驱动,在驱动初始化中调用RegisterPanel接口注册模型实例。如:
15
16
17   ```
18   int32_t LCDxxEntryInit(struct HdfDeviceObject *object)
19   {
20       struct PanelData *panel = CreateYourPanel();
21       // 注册模型实例
22       if (RegisterPanel(panel) != HDF_SUCCESS) {
23           HDF_LOGE("%s: RegisterPanel failed", __func__);
24           return HDF_FAILURE;
25       }
26       return HDF_SUCCESS;
27   }
28
29   struct HdfDriverEntry g_xxxxDevEntry = {
30       .moduleVersion = 1,
31       .moduleName = "LCD_XXXX",
32       .Init = LCDxxEntryInit,
33   };
34
35   HDF_INIT(g_xxxxDevEntry);
36   ```
37
382. 配置加载panel驱动
39   产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在display的host中,名为device_lcd的device中增加配置。
40
41   > ![icon-caution.gif](public_sys-resources/icon-caution.gif) **注意:**
42   > moduleName 要与panel驱动中的moduleName相同。
43
44
45   ```
46   root {
47       ...
48       display :: host {
49           device_lcd :: device {
50                   deviceN :: deviceNode {
51                       policy = 0;
52                       priority = 100;
53                       preload = 2;
54                       moduleName = "LCD_XXXX";
55                   }
56           }
57       }
58   }
59   ```
60
61
62## TP驱动移植
63
64本节描述如何移植触摸屏驱动。触摸屏的器件驱动被放置在源码目录//drivers/framework/model/input/driver/touchscreen中。 移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。
65
66详细的驱动开发指导,请参考 [TOUCHSCREEN开发指导](../driver/driver-peripherals-touch-des.md)。
67
681. 创建触摸屏器件驱动
69   在上述touchscreen目录中创建名为touch_ic_name.c的文件。编写如下内容
70
71
72   ```
73   #include "hdf_touch.h"
74
75   static int32_t HdfXXXXChipInit(struct HdfDeviceObject *device)
76   {
77       ChipDevice *tpImpl = CreateXXXXTpImpl();
78       if(RegisterChipDevice(tpImpl) != HDF_SUCCESS) { // 注册ChipDevice模型
79           ReleaseXXXXTpImpl(tpImpl);
80           return HDF_FAILURE;
81       }
82       return HDF_SUCCESS;
83   }
84
85   struct HdfDriverEntry g_touchXXXXChipEntry = {
86       .moduleVersion = 1,
87       .moduleName = "HDF_TOUCH_XXXX", // 注意这里的moduleName要与后续的配置完全一致
88       .Init = HdfXXXXChipInit,
89   };
90
91   HDF_INIT(g_touchXXXXChipEntry);
92   ```
93
94   其中ChipDevice中要实现如下方法:
95
96     | 方法 | 实现说明 |
97   | -------- | -------- |
98   | int32_t (\*Init)(ChipDevice \*device) | 实现器件初始化 |
99   | int32_t (\*Detect)(ChipDevice \*device) | 实现器件探测 |
100   | int32_t (\*Suspend)(ChipDevice \*device) | 实现器件休眠 |
101   | int32_t (\*Resume)(ChipDevice \*device) | 实现器件唤醒 |
102   | int32_t (\*DataHandle)(ChipDevice \*device) | 需要实现从器件读取数据,将触摸点数据填写入device->driver->frameData中 |
103   | int32_t (\*UpdateFirmware)(ChipDevice \*device) | 实现固件升级 |
104
1052. 配置产品,加载器件驱动
106   产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在名为input的host中,名为device_touch_chip的device中增加配置。
107
108   > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
109   > moduleName 要与触摸屏驱动中的moduleName相同。
110
111
112   ```
113                   deviceN :: deviceNode {
114                       policy = 0;
115                       priority = 130;
116                       preload = 0;
117                       permission = 0660;
118                       moduleName = "HDF_TOUCH_XXXX";
119                       deviceMatchAttr = "touch_XXXX_configs";
120                   }
121   ```
122
123
124## WLAN驱动移植
125
126WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负责处理WLAN流量。
127
128  **图1** OpenHarmony WLAN结构示意图
129  ![zh-cn_image_0000001207756867](figures/zh-cn_image_0000001207756867.png)
130
131如图1,左半部分负责管理WLAN设备,右半部分负责WLAN流量。HDF WLAN分别为这两部分做了抽象,驱动的移植过程可以看做分别实现这两部分所需接口。这些接口有:
132
133  | 接口 | 定义头文件 | 接口说明 |
134| -------- | -------- | -------- |
135| HdfChipDriverFactory | drivers\framework\include\wifi\hdf_wlan_chipdriver_manager.h | ChipDriver的Factory,用于支持一个芯片多个WLAN端口 |
136| HdfChipDriver | drivers\framework\include\wifi\wifi_module.h | 每个WLAN端口对应一个HdfChipDriver,用来管理一个特定端口 |
137| NetDeviceInterFace | drivers\framework\include\wifi\net_device.h | 与协议栈之间的接口,如发送数据、设置网络接口状态等 |
138
139> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
140> 详细的接口开发指导,请参考[WLAN开发](../driver/driver-peripherals-external-des.md)。
141
142具体的移植步骤如下:
143
1441. 创建HDF WLAN 芯片驱动
145   在目录/device/vendor_name/peripheral/wifi/chip_name/ 创建文件 hdf_wlan_chip_name.c。内容模板如下:
146
147
148   ```
149   static int32_t HdfWlanHisiChipDriverInit(struct HdfDeviceObject *device) {
150       static struct HdfChipDriverFactory factory = CreateChipDriverFactory(); // 需要移植者实现的方法
151       struct HdfChipDriverManager *driverMgr = HdfWlanGetChipDriverMgr();
152       if (driverMgr->RegChipDriver(&factory) != HDF_SUCCESS) { // 注册驱动工厂
153           HDF_LOGE("%s fail: driverMgr is NULL!", __func__);
154           return HDF_FAILURE;
155       }
156       return HDF_SUCCESS;
157   }
158
159   struct HdfDriverEntry g_hdfXXXChipEntry = {
160       .moduleVersion = 1,
161       .Init = HdfWlanXXXChipDriverInit,
162       .Release = HdfWlanXXXChipRelease,
163       .moduleName = "HDF_WIFI_CHIP_XXX" // 注意:这个名字要与配置一致
164   };
165
166   HDF_INIT(g_hdfXXXChipEntry);
167   ```
168
169   在上述代码的CreateChipDriverFactory方法中,需要创建一个HdfChipDriverFactory类型的对象。该对象提供如下方法
170
171     | 接口 | 说明 |
172   | -------- | -------- |
173   | const char \*driverName | 当前driverName |
174   | int32_t (\*InitChip)(struct HdfWlanDevice \*device) | 初始化芯片 |
175   | int32_t (\*DeinitChip)(struct HdfWlanDevice \*device) | 去初始化芯片 |
176   | void (\*ReleaseFactory)(struct HdfChipDriverFactory \*factory) | 释放HdfChipDriverFactory对象 |
177   | struct HdfChipDriver \*(\*Build)(struct HdfWlanDevice \*device, uint8_t ifIndex) | 创建一个HdfChipDriver;输入参数中,device是设备信息,ifIndex是当前创建的接口在这个芯片中的序号 |
178   | void (\*Release)(struct HdfChipDriver \*chipDriver) | 释放chipDriver |
179   | uint8_t (\*GetMaxIFCount)(struct HdfChipDriverFactory \*factory) | 获取当前芯片支持的最大接口数 |
180
181   其中Build方法负责创建一个管理指定网络接口的对象HdfChipDriver 。该对象需要提供方法:
182
183     | 接口 | 说明 |
184   | -------- | -------- |
185   | int32_t (\*init)(struct HdfChipDriver \*chipDriver, NetDevice \*netDev) | 初始化当前网络接口,这里需要向netDev提供接口NetDeviceInterFace |
186   | int32_t (\*deinit)(struct HdfChipDriver \*chipDriver, NetDevice \*netDev) | 去初始化当前网络接口 |
187   | struct HdfMac80211BaseOps \*ops | WLAN基础能力接口集 |
188   | struct HdfMac80211STAOps \*staOps | 支持STA模式所需的接口集 |
189   | struct HdfMac80211APOps \*apOps | 支持AP模式所需要的接口集 |
190
1912. 编写配置文件描述驱动支持的芯片
192   在产品配置目录下创建芯片的配置文件,保存至源码路径//vendor/vendor_name/product_name/config/wifi/wlan_chip_chip_name.hcs
193
194   该文件模板如下:
195
196
197   ```
198   root {
199       wlan_config {
200           chip_name :& chipList {
201               chip_name :: chipInst {
202                   match_attr = "hdf_wlan_chips_chip_name"; /* 这是配置匹配属性,用于提供驱动的配置根 */
203                   driverName = "driverName"; /* 需要与HdfChipDriverFactory中的driverName相同*/
204                   sdio {
205                       vendorId = 0xXXXX; /* your vendor id */
206                       deviceId = [0xXXXX]; /*your supported devices */
207                   }
208               }
209           }
210       }
211   }
212   ```
213
214   > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
215   > 路径和文件中的vendor_name、product_name、chip_name请替换成实际名称
216   >
217   > vendorId 和 deviceId需要根据实际芯片的识别码进行填写。
218
2193. 编写配置文件,加载驱动
220   产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在名为network的host中,名为device_wlan_chips的device中增加配置。模板如下:
221
222
223   ```
224                   deviceN :: deviceNode {
225                       policy = 0;
226                       preload = 2;
227                       moduleName = "HDF_WLAN_CHIPS";
228                       deviceMatchAttr = "hdf_wlan_chips_chip_name";
229                       serviceName = "driverName";
230                   }
231   ```
232
233   > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
234   > moduleName 要与HDF WLAN 芯片驱动中的moduleName相同。
235
2364. 修改Kconfig文件,让移植的WLAN模组出现再内核配置中
237device/vendor_name/drivers/Kconfig中增加配置菜单,模板如下
238
239
240   ```
241   config DRIVERS_HDF_WIFI_chip_name
242       bool "Enable chip_name Host driver"
243       default n
244       depends on DRIVERS_HDF_WLAN   help
245         Answer Y to enable chip_name Host driver.
246   ```
247
248   > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
249   > 请替换模板中的chip_name为实际的芯片名称
250
2515. 修改构建脚本,让驱动参与内核构建
252   在源码文件//device/vendor_name/drivers/lite.mk末尾追加如下内容
253
254
255   ```
256   ifeq ($(LOSCFG_DRIVERS_HDF_WIFI_chip_name), y)
257       # 构建完成要链接一个叫hdf_wlan_chipdriver_chip_name的对象,建议按这个命名,防止冲突
258       LITEOS_BASELIB += -lhdf_wlan_chipdriver_chip_name
259       # 增加构建目录gpio
260       LIB_SUBDIRS    += ../peripheral/wifi/chip_name
261   endif
262   ```
263
264   > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
265   > 请替换模板中的chip_name为实际的芯片名称
266