Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
9da41759
D
Docs
项目概览
OpenHarmony
/
Docs
大约 2 年 前同步成功
通知
161
Star
293
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
9da41759
编写于
8月 11, 2023
作者:
O
openharmony_ci
提交者:
Gitee
8月 11, 2023
浏览文件
操作
浏览文件
下载
差异文件
!22232 同步master,修改显示格式问题
Merge pull request !22232 from liyan/OpenHarmony-3.2-Release
上级
89fde4df
deb6d2ea
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
296 addition
and
268 deletion
+296
-268
zh-cn/device-dev/porting/porting-smallchip-driver-oom.md
zh-cn/device-dev/porting/porting-smallchip-driver-oom.md
+45
-33
zh-cn/device-dev/porting/porting-smallchip-kernel-linux.md
zh-cn/device-dev/porting/porting-smallchip-kernel-linux.md
+32
-15
zh-cn/device-dev/porting/porting-smallchip-prepare-building.md
.../device-dev/porting/porting-smallchip-prepare-building.md
+10
-6
zh-cn/device-dev/porting/standard-system-porting-guide.md
zh-cn/device-dev/porting/standard-system-porting-guide.md
+209
-214
未找到文件。
zh-cn/device-dev/porting/porting-smallchip-driver-oom.md
浏览文件 @
9da41759
...
@@ -8,9 +8,10 @@
...
@@ -8,9 +8,10 @@
移植LCD驱动的主要工作是编写一个驱动,在驱动中生成模型的实例,并完成注册。
移植LCD驱动的主要工作是编写一个驱动,在驱动中生成模型的实例,并完成注册。
这些LCD的驱动被放置在源码目录
//drivers/hdf_core/framework/model/display/driver/panel
中。
这些LCD的驱动被放置在源码目录
`//drivers/hdf_core/framework/model/display/driver/panel`
中。
1.
创建Panel驱动
1.
创建Panel驱动
创建HDF驱动,在驱动初始化中调用RegisterPanel接口注册模型实例。如:
创建HDF驱动,在驱动初始化中调用RegisterPanel接口注册模型实例。如:
...
@@ -36,7 +37,8 @@
...
@@ -36,7 +37,8 @@
```
```
2.
配置加载panel驱动
2.
配置加载panel驱动
产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在display的host中,名为device_lcd的device中增加配置。
产品的所有设备信息被定义在源码文件
`//vendor/vendor_name/product_name/config/device_info/device_info.hcs`
中。修改该文件,在display的host中,名为device_lcd的device中增加配置。
>  **注意:**
>  **注意:**
> moduleName 要与panel驱动中的moduleName相同。
> moduleName 要与panel驱动中的moduleName相同。
...
@@ -61,12 +63,13 @@
...
@@ -61,12 +63,13 @@
## TP驱动移植
## TP驱动移植
本节描述如何移植触摸屏驱动。触摸屏的器件驱动被放置在源码目录
//drivers/hdf_core/framework/model/input/driver/touchscreen
中。 移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。
本节描述如何移植触摸屏驱动。触摸屏的器件驱动被放置在源码目录
`//drivers/hdf_core/framework/model/input/driver/touchscreen`
中。 移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。
详细的驱动开发指导,请参考
[
TOUCHSCREEN开发指导
](
../driver/driver-peripherals-touch-des.md
)
。
详细的驱动开发指导,请参考
[
TOUCHSCREEN开发指导
](
../driver/driver-peripherals-touch-des.md
)
。
1.
创建触摸屏器件驱动
1.
创建触摸屏器件驱动
在上述touchscreen目录中创建名为touch_ic_name.c的文件。编写如下内容
在上述touchscreen目录中创建名为
`touch_ic_name.c`
的文件。编写如下内容:
```
```
...
@@ -103,7 +106,8 @@
...
@@ -103,7 +106,8 @@
| int32_t
(\*UpdateFirmware)(ChipDevice
\*
device) | 实现固件升级 |
| int32_t
(\*UpdateFirmware)(ChipDevice
\*
device) | 实现固件升级 |
2.
配置产品,加载器件驱动
2.
配置产品,加载器件驱动
产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在名为input的host中,名为device_touch_chip的device中增加配置。
产品的所有设备信息被定义在源码文件
`//vendor/vendor_name/product_name/config/device_info/device_info.hcs`
中。修改该文件,在名为input的host中,名为device_touch_chip的device中增加配置。
>  **说明:**
>  **说明:**
> moduleName 要与触摸屏驱动中的moduleName相同。
> moduleName 要与触摸屏驱动中的moduleName相同。
...
@@ -126,6 +130,7 @@
...
@@ -126,6 +130,7 @@
WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负责处理WLAN流量。
WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负责处理WLAN流量。
**图1**
OpenHarmony WLAN结构示意图
**图1**
OpenHarmony WLAN结构示意图
!
[
zh-cn_image_0000001207756867
](
figures/zh-cn_image_0000001207756867.png
)
!
[
zh-cn_image_0000001207756867
](
figures/zh-cn_image_0000001207756867.png
)
如图1,左半部分负责管理WLAN设备,右半部分负责WLAN流量。HDF WLAN分别为这两部分做了抽象,驱动的移植过程可以看做分别实现这两部分所需接口。这些接口有:
如图1,左半部分负责管理WLAN设备,右半部分负责WLAN流量。HDF WLAN分别为这两部分做了抽象,驱动的移植过程可以看做分别实现这两部分所需接口。这些接口有:
...
@@ -141,8 +146,9 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
...
@@ -141,8 +146,9 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
具体的移植步骤如下:
具体的移植步骤如下:
1.
创建HDF WLAN 芯片驱动
1.
创建HDF WLAN芯片驱动
在目录/device/vendor_name/peripheral/wifi/chip_name/ 创建文件 hdf_wlan_chip_name.c。内容模板如下:
在目录
`/device/vendor_name/peripheral/wifi/chip_name/`
创建文件
`hdf_wlan_chip_name.c`
。内容模板如下:
```
```
...
@@ -166,7 +172,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
...
@@ -166,7 +172,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
HDF_INIT(g_hdfXXXChipEntry);
HDF_INIT(g_hdfXXXChipEntry);
```
```
在上述代码的CreateChipDriverFactory方法中,需要创建一个HdfChipDriverFactory类型的对象。该对象提供如下方法
在上述代码的CreateChipDriverFactory方法中,需要创建一个HdfChipDriverFactory类型的对象。该对象提供如下方法
:
| 接口 | 说明 |
| 接口 | 说明 |
| -------- | -------- |
| -------- | -------- |
...
@@ -178,7 +184,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
...
@@ -178,7 +184,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
| void
(\*Release)(struct
HdfChipDriver
\*
chipDriver) | 释放chipDriver |
| void
(\*Release)(struct
HdfChipDriver
\*
chipDriver) | 释放chipDriver |
| uint8_t
(\*GetMaxIFCount)(struct
HdfChipDriverFactory
\*
factory) | 获取当前芯片支持的最大接口数 |
| uint8_t
(\*GetMaxIFCount)(struct
HdfChipDriverFactory
\*
factory) | 获取当前芯片支持的最大接口数 |
其中Build方法负责创建一个管理指定网络接口的对象HdfChipDriver
。该对象需要提供方法:
其中Build方法负责创建一个管理指定网络接口的对象HdfChipDriver。该对象需要提供方法:
| 接口 | 说明 |
| 接口 | 说明 |
| -------- | -------- |
| -------- | -------- |
...
@@ -189,7 +195,9 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
...
@@ -189,7 +195,9 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
| struct
HdfMac80211APOps
\*
apOps | 支持AP模式所需要的接口集 |
| struct
HdfMac80211APOps
\*
apOps | 支持AP模式所需要的接口集 |
2.
编写配置文件描述驱动支持的芯片
2.
编写配置文件描述驱动支持的芯片
在产品配置目录下创建芯片的配置文件,保存至源码路径//vendor/vendor_name/product_name/config/wifi/wlan_chip_chip_name.hcs
在产品配置目录下创建芯片的配置文件,保存至源码路径
`//vendor/vendor_name/product_name/config/wifi/wlan_chip_chip_name.hcs`
。
该文件模板如下:
该文件模板如下:
...
@@ -212,12 +220,14 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
...
@@ -212,12 +220,14 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
```
```
>  **说明:**
>  **说明:**
> 路径和文件中的vendor_name、product_name、chip_name请替换成实际名称
>
> 路径和文件中的vendor_name、product_name、chip_name请替换成实际名称。
>
>
> vendorId 和 deviceId需要根据实际芯片的识别码进行填写。
> vendorId 和 deviceId需要根据实际芯片的识别码进行填写。
3.
编写配置文件,加载驱动
3.
编写配置文件,加载驱动
产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在名为network的host中,名为device_wlan_chips的device中增加配置。模板如下:
产品的所有设备信息被定义在源码文件
`//vendor/vendor_name/product_name/config/device_info/device_info.hcs`
中。修改该文件,在名为network的host中,名为device_wlan_chips的device中增加配置。模板如下:
```
```
...
@@ -231,10 +241,11 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
...
@@ -231,10 +241,11 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
```
```
>  **说明:**
>  **说明:**
> moduleName
要与HDF WLAN
芯片驱动中的moduleName相同。
> moduleName
要与HDF WLAN
芯片驱动中的moduleName相同。
4.
修改Kconfig文件,让移植的WLAN模组出现再内核配置中
4.
修改Kconfig文件,让移植的WLAN模组出现再内核配置中
在device/vendor_name/drivers/Kconfig中增加配置菜单,模板如下
在
`device/vendor_name/drivers/Kconfig`
中增加配置菜单,模板如下:
```
```
...
@@ -246,10 +257,11 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
...
@@ -246,10 +257,11 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
```
```
>  **说明:**
>  **说明:**
> 请替换模板中的chip_name为实际的芯片名称
> 请替换模板中的chip_name为实际的芯片名称
。
5.
修改构建脚本,让驱动参与内核构建
5.
修改构建脚本,让驱动参与内核构建
在源码文件//device/vendor_name/drivers/lite.mk末尾追加如下内容
在源码文件
`//device/vendor_name/drivers/lite.mk`
末尾追加如下内容:
```
```
...
@@ -262,4 +274,4 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
...
@@ -262,4 +274,4 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负
```
```
>  **说明:**
>  **说明:**
> 请替换模板中的chip_name为实际的芯片名称
> 请替换模板中的chip_name为实际的芯片名称
。
zh-cn/device-dev/porting/porting-smallchip-kernel-linux.md
浏览文件 @
9da41759
...
@@ -8,7 +8,7 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后
...
@@ -8,7 +8,7 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后
### 基本信息
### 基本信息
当前Linux内核基线是基于Linux社区 4.19 LTS版本演进,合入CVE及bugfix补丁。具体信息参考
[
代码库
](
https://gitee.com/openharmony/kernel_linux
)
,对应repo工程代码路径为
kernel/linux-4.19
。
当前Linux内核基线是基于Linux社区 4.19 LTS版本演进,合入CVE及bugfix补丁。具体信息参考
[
代码库
](
https://gitee.com/openharmony/kernel_linux
)
,对应repo工程代码路径为
`kernel/linux-4.19`
。
### Bootloader
### Bootloader
...
@@ -19,17 +19,20 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后
...
@@ -19,17 +19,20 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后
## 适配编译和烧录启动
## 适配编译和烧录启动
1.
准备内核config(特别是芯片相关的config)。
1.
准备内核config(特别是芯片相关的config)。
config文件所在源码目录:kernel/linux/config/
以hi3516dv300芯片为例,可在对应的linux-4.19/arch/arm/configs/目录下新建
<
YOUR_CHIP
>
_small_
defconfig,如hi3516dv300_small_defconfig表示针对hi3516dv300小型系统的defconfig。该config文件可以由基础defconfig文件small_common_defconfig与该芯片相关的config组合生成。
config文件所在源码目录:
`kernel/linux/config/`
以hi3516dv300芯片为例,可在对应的
`linux-4.19/arch/arm/configs/`
目录下新建
<
YOUR_CHIP
>
_small_
defconfig,如
`hi3516dv300_small_defconfig`
表示针对hi3516dv300小型系统的defconfig。该config文件可以由基础defconfig文件
`small_common_defconfig`
与该芯片相关的config组合生成。
2.
准备芯片补丁。
2.
准备芯片补丁。
补丁文件所在源码目录:kernel/linux/patches/linux-4.19
以hi3516dv300芯片为例,参考已有的patch目录hi3516dv300_small_patch目录,新建
<
YOUR_CHIP
>
_patch目录,放置相关芯片补丁,注意hdf.patch等驱动补丁。
补丁文件所在源码目录:
`kernel/linux/patches/linux-4.19`
以hi3516dv300芯片为例,参考已有的patch目录
`hi3516dv300_small_patch`
目录,新建
<
YOUR_CHIP
>
_patch目录,放置相关芯片补丁,注意hdf.patch等驱动补丁。
3.
编译。
3.
编译。
具体内核编译入口脚本位于工程目录kernel/linux/patches/下面,版本级整编命令会通过BUILD.gn进入kernel_module_build.sh和kernel.mk,需要在这2个文件中针对性进行patch及defconfig文件路径、编译器、芯片架构、内核Image格式等的适配。
具体内核编译入口脚本位于工程目录
`kernel/linux/patches/`
下面,版本级整编命令会通过
`BUILD.gn`
进入
`kernel_module_build.sh`
和
`kernel.mk`
,需要在这2个文件中针对性进行patch及defconfig文件路径、编译器、芯片架构、内核Image格式等的适配。
通过编译错误日志调整补丁,典型错误场景:
通过编译错误日志调整补丁,典型错误场景:
...
@@ -38,11 +41,12 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后
...
@@ -38,11 +41,12 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后
(2)编译失败,内核版本差异(函数实现调整等)需要针对性进行内核适配。
(2)编译失败,内核版本差异(函数实现调整等)需要针对性进行内核适配。
>  **注意:**
>  **注意:**
> - 参考
kernel.mk,在OpenHarmony工程的编译构建流程中会拷贝kernel/linux-4.19的代码环境后进行打补丁动作,在使用版本级编译命令前,需要kernel/linux-4.19
保持原代码环境。
> - 参考
`kernel.mk`,在OpenHarmony工程的编译构建流程中会拷贝`kernel/linux-4.19`的代码环境后进行打补丁动作,在使用版本级编译命令前,需要`kernel/linux-4.19`
保持原代码环境。
>
>
> - 对应拷贝后的目录位于:
out/<\*\*\*>/kernel/linux-4.19
,可以在该目录下进行补丁的修改适配。
> - 对应拷贝后的目录位于:
`out/<***>/kernel/linux-4.19`
,可以在该目录下进行补丁的修改适配。
4.
烧录启动。
4.
烧录启动。
由于不同芯片的开发板的烧录方式不一样,此处不表述具体的烧录方式。需要注意烧录的各镜像的大小及启动参数的配置,参考hi3516dv300采用uboot启动参数:
由于不同芯片的开发板的烧录方式不一样,此处不表述具体的烧录方式。需要注意烧录的各镜像的大小及启动参数的配置,参考hi3516dv300采用uboot启动参数:
...
@@ -56,42 +60,55 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后
...
@@ -56,42 +60,55 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后
调试init进程、启动shell和运行简单的用户态程序,验证内核移植是否成功。OpenHarmony小型系统的OS镜像结构以及linux用户态的启动流程如下图1所示:
调试init进程、启动shell和运行简单的用户态程序,验证内核移植是否成功。OpenHarmony小型系统的OS镜像结构以及linux用户态的启动流程如下图1所示:
**图1**
基于linux内核的OS镜像结构和用户态程序启动流程
**图1**
基于linux内核的OS镜像结构和用户态程序启动流程
!
[
zh-cn_image_0000001154372318
](
figures/zh-cn_image_0000001154372318.png
)
!
[
zh-cn_image_0000001154372318
](
figures/zh-cn_image_0000001154372318.png
)
基于上述流程,推荐按以下步骤完成验证:
基于上述流程,推荐按以下步骤完成验证:
1.
制作根文件系统镜像。
1.
制作根文件系统镜像。
请参考
[
新建芯片解决方案和产品解决方案
](
../subsystems/subsys-build-all.md
)
生成根文件系统镜像rootfs.img。从上图可以看到启动过程与产品配置强相关,在制作rootfs.img过程中请完成如下四种配置:
请参考
[
新建芯片解决方案和产品解决方案
](
../subsystems/subsys-build-all.md
)
生成根文件系统镜像rootfs.img。从上图可以看到启动过程与产品配置强相关,在制作rootfs.img过程中请完成如下四种配置:
-
组件配置
-
组件配置
产品组件配置文件vendor/{company}/{product}/config.json需配置启动恢复子系统(startup)的init_lite组件和内核子系统的linux_4_1_9组件。
产品组件配置文件
`vendor/{company}/{product}/config.json`
需配置启动恢复子系统(startup)的init_lite组件和内核子系统的linux_4_1_9组件。
-
系统服务配置
-
系统服务配置
系统服务配置文件vendor/{company}/{product}/init_configs/init_xxx.cfg需要启动shell服务。
系统服务配置文件`vendor/{company}/{product}/init_configs/init_xxx.cfg`需要启动shell服务。
-
文件系统配置
-
文件系统配置
文件系统配置vendor/{company}/{product}/fs.yml中需要创建“/bin/sh -
>
mksh“和“/lib/ld-musl-arm.so.1 -
>
libc.so“软连接,这两个文件分别是shell可执行程序和可执行程序依赖的c库。
文件系统配置`vendor/{company}/{product}/fs.yml`中需要创建“/bin/sh -> mksh“和“/lib/ld-musl-arm.so.1 -> libc.so“软连接,这两个文件分别是shell可执行程序和可执行程序依赖的c库。
-
启动配置
-
启动配置
启动配置在vendor/{company}/{product}/init_configs/etc目录下,包括fstab、rsS和Sxxx文件,请按开发板实际情况配置。
编译完成后,可通过检查产品编译输出目录下的rootfs内容,确认rootfs.img文件生成是否符合预期。
启动配置在`vendor/{company}/{product}/init_configs/etc`目录下,包括fstab、rsS和Sxxx文件,请按开发板实际情况配置。
编译完成后,可通过检查产品编译输出目录下的rootfs内容,确认
`rootfs.img`
文件生成是否符合预期。
2.
调试init进程和shell。
2.
调试init进程和shell。
烧录rootfs.img并调试init进程和shell,不同厂商的开发板的烧录工具和流程可能不同,请按芯片解决方案提供的流程进行烧录。烧录rootfs.img前请确认bootloader和linux内核启动正常。如果rootfs.img被内核正常挂载,接着将运行/bin/init程序,init进程为用户态的第一个应用程序,它的运行意味着用户态的开始。
init程序首先会调用/etc/init.d/rcS脚本,rcS脚本执行第一条命令为"/bin/mount -a”,该命令会加载fstab文件,在fstab中的命令执行完后rcS将顺序调用Sxxx脚本完成设备节点创建和扫描、文件权限配置等操作。
烧录
`rootfs.img`
并调试init进程和shell,不同厂商的开发板的烧录工具和流程可能不同,请按芯片解决方案提供的流程进行烧录。烧录
`rootfs.img`
前请确认bootloader和linux内核启动正常。如果
`rootfs.img`
被内核正常挂载,接着将运行
`/bin/init`
程序,init进程为用户态的第一个应用程序,它的运行意味着用户态的开始。
init程序首先会调用
`/etc/init.d/rcS`
脚本,rcS脚本执行第一条命令为"/bin/mount -a”,该命令会加载fstab文件,在fstab中的命令执行完后rcS将顺序调用Sxxx脚本完成设备节点创建和扫描、文件权限配置等操作。
最后,init程序会读取init.cfg系统服务配置文件。根据步骤1中的设置,init程序将会启动shell。如果上述流程运行正常,系统则会进入shell。
最后,init程序会读取init.cfg系统服务配置文件。根据步骤1中的设置,init程序将会启动shell。如果上述流程运行正常,系统则会进入shell。
若串口有如下版本号日志打印,则表示init程序启动正常:
若串口有如下版本号日志打印,则表示init程序启动正常:
**图2** init启动正常日志
**图2** init启动正常日志


正常进入shell后执行ls命令,串口打印信息如下图:
正常进入shell后执行ls命令,串口打印信息如下图:
**图3** 正常进入shell后输入ls命令串口打印
**图3** 正常进入shell后输入ls命令串口打印


3.
配置NFS。
3.
配置NFS。
init进程和shell正常启动后,以服务端IP为192.168.1.22、客户端IP为192.168.1.4为例,可在根目录执行如下命令开启NFS:
init进程和shell正常启动后,以服务端IP为192.168.1.22、客户端IP为192.168.1.4为例,可在根目录执行如下命令开启NFS:
```
```
...
...
zh-cn/device-dev/porting/porting-smallchip-prepare-building.md
浏览文件 @
9da41759
...
@@ -20,7 +20,8 @@ sudo apt-get install gcc-arm-linux-gnueabi
...
@@ -20,7 +20,8 @@ sudo apt-get install gcc-arm-linux-gnueabi
了解编译框架和搭建完编译环境后,请参考如下步骤新建芯片解决方案:
了解编译框架和搭建完编译环境后,请参考如下步骤新建芯片解决方案:
1.
新建目录
1.
新建目录
芯片解决方案的目录规则为:device/{芯片解决方案厂商}/{开发板}。以海思的hispark_taurus开发板为例,在代码根目录执行如下命令建立目录:
芯片解决方案的目录规则为:
`device/{芯片解决方案厂商}/{开发板}`
。以海思的hispark_taurus开发板为例,在代码根目录执行如下命令建立目录:
```
```
...
@@ -59,7 +60,8 @@ sudo apt-get install gcc-arm-linux-gnueabi
...
@@ -59,7 +60,8 @@ sudo apt-get install gcc-arm-linux-gnueabi
目录树建立后开发板相关的源码放到hispark_taurus目录下。
目录树建立后开发板相关的源码放到hispark_taurus目录下。
2.
配置开发板编译选项
2.
配置开发板编译选项
步骤1中的config.gni可配置开发板相关的编译选项,编译构建框架将会遵照该配置文件中的参数编译所有用户态OS组件。其中关键的字段说明如下:
步骤1中的
`config.gni`
可配置开发板相关的编译选项,编译构建框架将会遵照该配置文件中的参数编译所有用户态OS组件。其中关键的字段说明如下:
```
```
...
@@ -75,7 +77,7 @@ sudo apt-get install gcc-arm-linux-gnueabi
...
@@ -75,7 +77,7 @@ sudo apt-get install gcc-arm-linux-gnueabi
board_ld_flags: 开发板配置的链接选项。
board_ld_flags: 开发板配置的链接选项。
```
```
还以海思的hispark_taurus开发板为例,对应的
device/hisilicon/hispark_taurus/config.gni
内容如下:
还以海思的hispark_taurus开发板为例,对应的
`device/hisilicon/hispark_taurus/config.gni`
内容如下:
```
```
# Board CPU type, e.g. "cortex-a7", "riscv32".
# Board CPU type, e.g. "cortex-a7", "riscv32".
...
@@ -121,9 +123,10 @@ sudo apt-get install gcc-arm-linux-gnueabi
...
@@ -121,9 +123,10 @@ sudo apt-get install gcc-arm-linux-gnueabi
```
```
3.
编写开发板编译脚本
3.
编写开发板编译脚本
步骤1中的BUILD.gn为新增的开发板的编译入口,主要用于编译开发板相关的代码,主要为设备侧驱动、设备侧接口适配(媒体,图形等)和开发板的SDK等等。
海思的hispark_taurus开发板的device/hisilicon/hispark_taurus/BUILD.gn可写成:
步骤1中的
`BUILD.gn`
为新增的开发板的编译入口,主要用于编译开发板相关的代码,主要为设备侧驱动、设备侧接口适配(媒体,图形等)和开发板的SDK等等。
海思的hispark_taurus开发板的
`device/hisilicon/hispark_taurus/BUILD.gn`
可写成:
```
```
...
@@ -137,4 +140,5 @@ sudo apt-get install gcc-arm-linux-gnueabi
...
@@ -137,4 +140,5 @@ sudo apt-get install gcc-arm-linux-gnueabi
```
```
4.
编译调试
4.
编译调试
在开发板目录下执行hb set和hb build即可启动芯片解决方案的编译,编译框架会以开发板下的BUILD.gn为入口启动编译。
在开发板目录下执行
`hb set`
和
`hb build`
即可启动芯片解决方案的编译,编译框架会以开发板下的
`BUILD.gn`
为入口启动编译。
zh-cn/device-dev/porting/standard-system-porting-guide.md
浏览文件 @
9da41759
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
### 定义产品
### 定义产品
在
“//vendor/MyProductVendor/{product_name}名称的目录下创建一个config.json文件,该文件用于描述产品所使用的SOC
以及所需的子系统。配置如下:
在
`//vendor/MyProductVendor/{product_name}`
名称的目录下创建一个
`config.json`
文件,该文件用于描述产品所使用的SOC
以及所需的子系统。配置如下:
//vendor/MyProductVendor/MyProduct/config.json
//vendor/MyProductVendor/MyProduct/config.json
...
@@ -41,34 +41,25 @@
...
@@ -41,34 +41,25 @@
```
```
主要的配置内容
主要的配置内容
product_name:产品名称 必填
| 配置项 | 说明 |
|-------|----------|
|product_name |(必填)产品名称|
|version|(必填)版本 |
|type|(必填)配置的系统级别,包含(small、standard等) |
|target_cpu |(必填)设备的CPU类型(根据实际情况,这里的target_cpu也可能是arm64 、riscv、 x86等)|
|ohos_version|(选填)操作系统版本|
|device_company|(必填)device厂商名|
|board|(必填)开发板名称|
|enable_ramdisk|(必填)是否启动ramdisk|
|kernel_type|(选填)内核类型|
|kernel_version|(选填)kernel_type与kernel_version在standard是固定的不需要写|
|subsystems|(必填)系统需要启用的子系统。子系统可以简单理解为一块独立构建的功能块。|
|product_company|不体现在配置中,而是目录名,vendor下一级目录就是product_company,BUILD.gn脚本依然可以访问。|
version:版本 必填
type:配置的系统级别,包含(small,standard …) 必填
已定义的子系统可以在
`//build/subsystem_config.json`
中找到。当然你也可以定制子系统。
target_cpu :设备的CPU类型(根据实际情况,这里的target_cpu也可能是arm64 、riscv、 x86等。) 必填
这里建议先拷贝Hi3516DV300开发板的配置文件,删除掉hisilicon_products这个子系统。这个子系统为Hi3516DV300 SOC编译内核,显然不适合MySOC。
ohos_version:操作系统版本 选填
device_company:device厂商名 必填
board:开发板名称 必填
enable_ramdisk:是否启动ramdisk 必填
kernel_type 选填
kernel_version 选填 kernel_type与 kernel_version在 standard 是固定的不需要写。
subsystems:系统需要启用的子系统。子系统可以简单理解为一块独立构建的功能块。必填
product_company:不体现在配置中,而是目录名,vendor下一级目录就是product_company,BUILD.gn脚本依然可以访问。
已定义的子系统可以在“//build/subsystem_config.json”中找到。当然你也可以定制子系统。
这里建议先拷贝Hi3516DV300 开发板的配置文件,删除掉 hisilicon_products 这个子系统。这个子系统为Hi3516DV300 SOC编译内核,显然不适合MySOC。
### 移植验证
### 移植验证
...
@@ -79,7 +70,7 @@ product_company:不体现在配置中,而是目录名,vendor下一级目
...
@@ -79,7 +70,7 @@ product_company:不体现在配置中,而是目录名,vendor下一级目
./build.sh --product-name MyProduct
./build.sh --product-name MyProduct
```
```
构建完成后,可以在
“//out/{device_name}/packages/phone/images”
目录下看到构建出来的OpenHarmony镜像文件。
构建完成后,可以在
`//out/{device_name}/packages/phone/images`
目录下看到构建出来的OpenHarmony镜像文件。
## 内核移植
## 内核移植
...
@@ -89,7 +80,7 @@ product_company:不体现在配置中,而是目录名,vendor下一级目
...
@@ -89,7 +80,7 @@ product_company:不体现在配置中,而是目录名,vendor下一级目
### 为SOC添加内核构建的子系统
### 为SOC添加内核构建的子系统
修改文件
//build/subsystem_config.json
增加一个子系统. 配置如下:
修改文件
`//build/subsystem_config.json`
增加一个子系统. 配置如下:
```
```
...
@@ -101,12 +92,12 @@ product_company:不体现在配置中,而是目录名,vendor下一级目
...
@@ -101,12 +92,12 @@ product_company:不体现在配置中,而是目录名,vendor下一级目
},
},
```
```
接着需要修改定义产品的配置文件
//vendor/MyProductVendor/MyProduct/config.json
,将刚刚定义的子系统加入到产品中。
接着需要修改定义产品的配置文件
`//vendor/MyProductVendor/MyProduct/config.json`
,将刚刚定义的子系统加入到产品中。
### 编译内核
### 编译内核
源码中提供了Linux 4.19的内核,归档在
//kernel/linux-4.19
。本节以该内核版本为例,讲解如何编译内核。
源码中提供了Linux 4.19的内核,归档在
`//kernel/linux-4.19`
。本节以该内核版本为例,讲解如何编译内核。
在子系统的定义中,描述了子系统构建的路径path,即
`//device/MySOCVendor/MySOC/build`
。这一节会在这个目录创建构建脚本,告诉构建系统如何构建内核。
在子系统的定义中,描述了子系统构建的路径path,即
`//device/MySOCVendor/MySOC/build`
。这一节会在这个目录创建构建脚本,告诉构建系统如何构建内核。
...
@@ -126,9 +117,8 @@ BUILD.gn是subsystem构建的唯一入口。
...
@@ -126,9 +117,8 @@ BUILD.gn是subsystem构建的唯一入口。
期望的构建结果
期望的构建结果
| | |
| -------- | -------- |
| 文件 | 文件说明 |
| 文件 | 文件说明 |
| -------- | -------- |
| $root_build_dir/packages/phone/images/uImage | 内核镜像 |
| $root_build_dir/packages/phone/images/uImage | 内核镜像 |
| $root_build_dir/packages/phone/images/uboot | bootloader镜像 |
| $root_build_dir/packages/phone/images/uboot | bootloader镜像 |
...
@@ -156,13 +146,13 @@ BUILD.gn是subsystem构建的唯一入口。
...
@@ -156,13 +146,13 @@ BUILD.gn是subsystem构建的唯一入口。
2.
init。
2.
init。
init启动引导组件配置文件包含了所有需要由init进程启动的系统关键服务的服务名、可执行文件路径、权限和其他信息。每个系统服务各自安装其启动脚本到
/system/etc/init
目录下。
init启动引导组件配置文件包含了所有需要由init进程启动的系统关键服务的服务名、可执行文件路径、权限和其他信息。每个系统服务各自安装其启动脚本到
`/system/etc/init`
目录下。
新芯片平台移植时,平台相关的初始化配置需要增加平台相关的初始化配置文件
/vendor/etc/init/init.{hardware}.cfg;该文件完成平台相关的初始化设置,如安装ko驱动,设置平台相关的/proc
节点信息。
新芯片平台移植时,平台相关的初始化配置需要增加平台相关的初始化配置文件
`/vendor/etc/init/init.{hardware}.cfg`
;该文件完成平台相关的初始化设置,如安装ko驱动,设置平台相关的
`/proc`
节点信息。
init相关进程代码在
//base/startup/init_lite
目录下,该进程是系统第一个进程,无其它依赖。
init相关进程代码在
`//base/startup/init_lite`
目录下,该进程是系统第一个进程,无其它依赖。
初始化配置文件具体的开发指导请参考
[
init启动子系统概述
](
../subsystems/subsys-boot-overview.md
)
。
初始化配置文件具体的开发指导请参考
[
init启动子系统概述
](
../subsystems/subsys-boot-overview.md
)
。
## HDF驱动移植
## HDF驱动移植
...
@@ -172,16 +162,16 @@ BUILD.gn是subsystem构建的唯一入口。
...
@@ -172,16 +162,16 @@ BUILD.gn是subsystem构建的唯一入口。
HDF为LCD设计了驱动模型。支持一块新的LCD,需要编写一个驱动,在驱动中生成模型的实例,并完成注册。
HDF为LCD设计了驱动模型。支持一块新的LCD,需要编写一个驱动,在驱动中生成模型的实例,并完成注册。
这些LCD的驱动被放置在
//drivers/hdf_core/framework/model/display/driver/panel
目录中。
这些LCD的驱动被放置在
`//drivers/hdf_core/framework/model/display/driver/panel`
目录中。
-
创建Panel驱动
1.
创建Panel驱动
在驱动的Init方法中,需要调用RegisterPanel接口注册模型实例。如:
在驱动的Init方法中,需要调用RegisterPanel接口注册模型实例。如:
```
```
int32_t XXXInit(struct HdfDeviceObject *object)
int32_t XXXInit(struct HdfDeviceObject *object)
{
{
struct PanelData *panel = CreateYourPanel();
struct PanelData *panel = CreateYourPanel();
// 注册
// 注册
...
@@ -190,21 +180,23 @@ int32_t XXXInit(struct HdfDeviceObject *object)
...
@@ -190,21 +180,23 @@ int32_t XXXInit(struct HdfDeviceObject *object)
return HDF_FAILURE;
return HDF_FAILURE;
}
}
return HDF_SUCCESS;
return HDF_SUCCESS;
}
}
struct HdfDriverEntry g_xxxxDevEntry = {
struct HdfDriverEntry g_xxxxDevEntry = {
.moduleVersion = 1,
.moduleVersion = 1,
.moduleName = "LCD_XXXX",
.moduleName = "LCD_XXXX",
.Init = XXXInit,
.Init = XXXInit,
};
};
HDF_INIT(g_xxxxDevEntry);
HDF_INIT(g_xxxxDevEntry);
```
```
-
配置加载panel驱动产品的所有设备信息被定义在文件//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs中。修改该文件,在display的host中,名为device_lcd的device中增加配置。注意:moduleName 要与panel驱动中的moduleName相同
。
2.
配置加载panel驱动产品的所有设备信息被定义在文件
`//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs`
中。修改该文件,在display的host中,名为device_lcd的device中增加配置
。
```
注意:moduleName 要与panel驱动中的moduleName相同。
root {
```
root {
...
...
display :: host {
display :: host {
device_lcd :: device {
device_lcd :: device {
...
@@ -216,60 +208,62 @@ root {
...
@@ -216,60 +208,62 @@ root {
}
}
}
}
}
}
}
}
```
```
更详细的驱动开发指导,请参考
[
LCD
](
../driver/driver-peripherals-lcd-des.md
)
。
更详细的驱动开发指导,请参考
[
LCD
](
../driver/driver-peripherals-lcd-des.md
)
。
### 触摸屏
### 触摸屏
本节描述如何移植触摸屏驱动。触摸屏的驱动被放置在
//drivers/hdf_core/framework/model/input/driver/touchscreen
目录中。移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。
本节描述如何移植触摸屏驱动。触摸屏的驱动被放置在
`//drivers/hdf_core/framework/model/input/driver/touchscreen`
目录中。移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。
-
创建触摸屏器件驱动
1.
创建触摸屏器件驱动
在目录中创建名为touch_ic_name.c的文件。代码模板如下:注意:请替换ic_name为你所适配芯片的名称。
在目录中创建名为
`touch_ic_name.c`
的文件。代码模板如下:
注意:请替换ic_name为你所适配芯片的名称。
```
#include "hdf_touch.h"
static int32_t HdfXXXXChipInit(struct HdfDeviceObject *device)
```
{
#include "hdf_touch.h"
static int32_t HdfXXXXChipInit(struct HdfDeviceObject *device)
{
ChipDevice *tpImpl = CreateXXXXTpImpl();
ChipDevice *tpImpl = CreateXXXXTpImpl();
if(RegisterChipDevice(tpImpl) != HDF_SUCCESS) {
if(RegisterChipDevice(tpImpl) != HDF_SUCCESS) {
ReleaseXXXXTpImpl(tpImpl);
ReleaseXXXXTpImpl(tpImpl);
return HDF_FAILURE;
return HDF_FAILURE;
}
}
return HDF_SUCCESS;
return HDF_SUCCESS;
}
}
struct HdfDriverEntry g_touchXXXXChipEntry = {
struct HdfDriverEntry g_touchXXXXChipEntry = {
.moduleVersion = 1,
.moduleVersion = 1,
.moduleName = "HDF_TOUCH_XXXX",
.moduleName = "HDF_TOUCH_XXXX",
.Init = HdfXXXXChipInit,
.Init = HdfXXXXChipInit,
};
};
HDF_INIT(g_touchXXXXChipEntry);
HDF_INIT(g_touchXXXXChipEntry);
```
```
其中ChipDevice中要提供若干方法。
其中ChipDevice中要提供若干方法。
| | |
| 方法 | 实现说明 |
| -------- | -------- |
| -------- | -------- |
| 方法 | 实现说明 |
| int32_t
(\*Init)(ChipDevice
\*
device) | 器件初始化 |
| int32_t
(\*Init)(ChipDevice
\*
device) | 器件初始化 |
| int32_t
(\*Detect)(ChipDevice
\*
device) | 器件探测 |
| int32_t
(\*Detect)(ChipDevice
\*
device) | 器件探测 |
| int32_t
(\*Suspend)(ChipDevice
\*
device) | 器件休眠 |
| int32_t
(\*Suspend)(ChipDevice
\*
device) | 器件休眠 |
| int32_t
(\*Resume)(ChipDevice
\*
device) | 器件唤醒 |
| int32_t
(\*Resume)(ChipDevice
\*
device) | 器件唤醒 |
| int32_t
(\*DataHandle)(ChipDevice
\*
device) | 从器件读取数据,将触摸点数据填写入device-
>
driver-
>
frameData中 |
| int32_t
(\*DataHandle)(ChipDevice
\*
device) | 从器件读取数据,将触摸点数据填写入device-
>
driver-
>
frameData中 |
| int32_t
(\*UpdateFirmware)(ChipDevice
\*
device) | 固件升级 |
| int32_t
(\*UpdateFirmware)(ChipDevice
\*
device) | 固件升级 |
-
配置产品,加载器件驱动
2.
配置产品,加载器件驱动
产品的所有设备信息被定义在文件//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs中。修改该文件,在名为input的host中,名为device_touch_chip的device中增加配置。注意:moduleName 要与触摸屏驱动中的moduleName相同。
产品的所有设备信息被定义在文件
`//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs`
中。修改该文件,在名为input的host中,名为device_touch_chip的device中增加配置。注意:moduleName 要与触摸屏驱动中的moduleName相同。
```
```
deviceN :: deviceNode {
deviceN :: deviceNode {
policy = 0;
policy = 0;
priority = 130;
priority = 130;
...
@@ -278,9 +272,9 @@ HDF_INIT(g_touchXXXXChipEntry);
...
@@ -278,9 +272,9 @@ HDF_INIT(g_touchXXXXChipEntry);
moduleName = "HDF_TOUCH_XXXX";
moduleName = "HDF_TOUCH_XXXX";
deviceMatchAttr = "touch_XXXX_configs";
deviceMatchAttr = "touch_XXXX_configs";
}
}
```
```
更详细的驱动开发指导,请参考
[
TOUCHSCREEN
](
../driver/driver-peripherals-touch-des.md
)
。
更详细的驱动开发指导,请参考
[
TOUCHSCREEN
](
../driver/driver-peripherals-touch-des.md
)
。
### WLAN
### WLAN
...
@@ -293,20 +287,20 @@ Wi-Fi驱动分为两部分,一部分负责管理WLAN设备,另一个部分
...
@@ -293,20 +287,20 @@ Wi-Fi驱动分为两部分,一部分负责管理WLAN设备,另一个部分
支持一款芯片的主要工作是实现一个ChipDriver驱动。实现HDF_WLAN_CORE和NetDevice提供的接口。主要需要实现的接口有:
支持一款芯片的主要工作是实现一个ChipDriver驱动。实现HDF_WLAN_CORE和NetDevice提供的接口。主要需要实现的接口有:
| | | |
| -------- | -------- | -------- |
| 接口 | 定义头文件 | 说明 |
| 接口 | 定义头文件 | 说明 |
| -------- | -------- | -------- |
| HdfChipDriverFactory | //drivers/hdf_core/framework/include/wifi/hdf_wlan_chipdriver_manager.h | ChipDriver的Factory,用于支持一个芯片多个Wi-Fi端口 |
| HdfChipDriverFactory | //drivers/hdf_core/framework/include/wifi/hdf_wlan_chipdriver_manager.h | ChipDriver的Factory,用于支持一个芯片多个Wi-Fi端口 |
| HdfChipDriver | //drivers/hdf_core/framework/include/wifi/wifi_module.h | 每个WLAN端口对应一个HdfChipDriver,用来管理一个特定的WLAN端口 |
| HdfChipDriver | //drivers/hdf_core/framework/include/wifi/wifi_module.h | 每个WLAN端口对应一个HdfChipDriver,用来管理一个特定的WLAN端口 |
| NetDeviceInterFace | //drivers/hdf_core/framework/include/net/net_device.h | 与协议栈之间的接口,如发送数据、设置网络接口状态等 |
| NetDeviceInterFace | //drivers/hdf_core/framework/include/net/net_device.h | 与协议栈之间的接口,如发送数据、设置网络接口状态等 |
建议适配按如下步骤操作:
建议适配按如下步骤操作:
1.
创建HDF驱动建议将代码放置在//device/MySoCVendor/peripheral/wifi/chip_name/
,文件模板如下:
1.
创建HDF驱动建议将代码放置在
`//device/MySoCVendor/peripheral/wifi/chip_name/`
,文件模板如下:
```
```
static int32_t HdfWlanXXXChipDriverInit(struct HdfDeviceObject *device) {
static int32_t HdfWlanXXXChipDriverInit(struct HdfDeviceObject *device) {
static struct HdfChipDriverFactory factory = CreateChipDriverFactory();
static struct HdfChipDriverFactory factory = CreateChipDriverFactory();
struct HdfChipDriverManager *driverMgr = HdfWlanGetChipDriverMgr();
struct HdfChipDriverManager *driverMgr = HdfWlanGetChipDriverMgr();
if (driverMgr->RegChipDriver(&factory) != HDF_SUCCESS) {
if (driverMgr->RegChipDriver(&factory) != HDF_SUCCESS) {
...
@@ -314,53 +308,51 @@ static int32_t HdfWlanXXXChipDriverInit(struct HdfDeviceObject *device) {
...
@@ -314,53 +308,51 @@ static int32_t HdfWlanXXXChipDriverInit(struct HdfDeviceObject *device) {
return HDF_FAILURE;
return HDF_FAILURE;
}
}
return HDF_SUCCESS;
return HDF_SUCCESS;
}
}
struct HdfDriverEntry g_hdfXXXChipEntry = {
struct HdfDriverEntry g_hdfXXXChipEntry = {
.moduleVersion = 1,
.moduleVersion = 1,
.Init = HdfWlanXXXChipDriverInit,
.Init = HdfWlanXXXChipDriverInit,
.Release = HdfWlanXXXChipRelease,
.Release = HdfWlanXXXChipRelease,
.moduleName = "HDF_WIFI_CHIP_XXX"
.moduleName = "HDF_WIFI_CHIP_XXX"
};
};
HDF_INIT(g_hdfXXXChipEntry);
HDF_INIT(g_hdfXXXChipEntry);
```
```
在CreateChipDriverFactory中,需要创建一个HdfChipDriverFactory,接口如下:
在CreateChipDriverFactory中,需要创建一个HdfChipDriverFactory,接口如下:
| | |
| 接口 | 说明 |
| -------- | -------- |
| -------- | -------- |
| 接口 | 说明 |
| const
char
\*
driverName | 当前driverName |
| const
char
\*
driverName | 当前driverName |
| int32_t
(\*InitChip)(struct
HdfWlanDevice
\*
device) | 初始化芯片 |
| int32_t
(\*InitChip)(struct
HdfWlanDevice
\*
device) | 初始化芯片 |
| int32_t
(\*DeinitChip)(struct
HdfWlanDevice
\*
device) | 去初始化芯片 |
| int32_t
(\*DeinitChip)(struct
HdfWlanDevice
\*
device) | 去初始化芯片 |
| void
(_ReleaseFactory)(struct
HdfChipDriverFactory
_factory) | 释放HdfChipDriverFactory对象 |
| void
(_ReleaseFactory)(struct
HdfChipDriverFactory
_factory) | 释放HdfChipDriverFactory对象 |
| struct
HdfChipDriver
_(_Build)(struct
HdfWlanDevice
\*device,
uint8_t
ifIndex) | 创建一个HdfChipDriver;输入参数中,device是设备信息,ifIndex是当前创建的接口在这个芯片中的序号 |
| struct
HdfChipDriver
_(_Build)(struct
HdfWlanDevice
\*device,
uint8_t
ifIndex) | 创建一个HdfChipDriver;输入参数中,device是设备信息,ifIndex是当前创建的接口在这个芯片中的序号 |
| void
(_Release)(struct
HdfChipDriver
_chipDriver) | 释放chipDriver |
| void
(_Release)(struct
HdfChipDriver
_chipDriver) | 释放chipDriver |
| uint8_t
(\*GetMaxIFCount)(struct
HdfChipDriverFactory
\*
factory) | 获取当前芯片支持的最大接口数 |
| uint8_t
(\*GetMaxIFCount)(struct
HdfChipDriverFactory
\*
factory) | 获取当前芯片支持的最大接口数 |
HdfChipDriver需要实现的接口有
| | |
| -------- | -------- |
| 接口 | 说明 |
| int32_t
(\*init)(struct
HdfChipDriver
\*chipDriver,
NetDevice
\*
netDev) | 初始化当前网络接口,这里需要向netDev提供接口NetDeviceInterFace |
| int32_t
(\*deinit)(struct
HdfChipDriver
\*chipDriver,
NetDevice
\*
netDev) | 去初始化当前网络接口 |
| struct
HdfMac80211BaseOps
\*
ops | WLAN基础能力接口集 |
| struct
HdfMac80211STAOps
\*
staOps | 支持STA模式所需的接口集 |
| struct
HdfMac80211APOps
\*
apOps | 支持AP模式所需要的接口集 |
2.
编写配置文件,描述驱动支持的设备
HdfChipDriver需要实现的接口有:
在产品配置目录下创建芯片的配置文件//vendor/MyProductVendor/MyProduct/config/wifi/wlan_chip_chip_name.hcs。
| 接口 | 说明 |
| -------- | -------- |
| int32_t
(\*init)(struct
HdfChipDriver
\*chipDriver,
NetDevice
\*
netDev) | 初始化当前网络接口,这里需要向netDev提供接口NetDeviceInterFace |
| int32_t
(\*deinit)(struct
HdfChipDriver
\*chipDriver,
NetDevice
\*
netDev) | 去初始化当前网络接口 |
| struct
HdfMac80211BaseOps
\*
ops | WLAN基础能力接口集 |
| struct
HdfMac80211STAOps
\*
staOps | 支持STA模式所需的接口集 |
| struct
HdfMac80211APOps
\*
apOps | 支持AP模式所需要的接口集 |
注意: 路径中的vendor_name、product_name、chip_name请替换成实际名称
。
2.
编写配置文件,描述驱动支持的设备
。
模板如下:
在产品配置目录下创建芯片的配置文件
`//vendor/MyProductVendor/MyProduct/config/wifi/wlan_chip_chip_name.hcs`
。
注意: 路径中的vendor_name、product_name、chip_name请替换成实际名称。
```
模板如下:
root {
```
root {
wlan_config {
wlan_config {
chip_name :& chipList {
chip_name :& chipList {
chip_name :: chipInst {
chip_name :: chipInst {
...
@@ -373,15 +365,17 @@ root {
...
@@ -373,15 +365,17 @@ root {
}
}
}
}
}
}
}
}
```
```
3.
编写配置文件,加载驱动
3.
编写配置文件,加载驱动。
产品的所有设备信息被定义在文件//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs中。修改该文件,在名为network的host中,名为device_wlan_chips的device中增加配置。注意:moduleName 要与触摸屏驱动中的moduleName相同
。
产品的所有设备信息被定义在文件
`//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs`
中。修改该文件,在名为network的host中,名为device_wlan_chips的device中增加配置
。
注意:moduleName 要与触摸屏驱动中的moduleName相同。
```
```
deviceN :: deviceNode {
deviceN :: deviceNode {
policy = 0;
policy = 0;
preload = 2;
preload = 2;
...
@@ -389,39 +383,40 @@ root {
...
@@ -389,39 +383,40 @@ root {
deviceMatchAttr = "hdf_wlan_chips_chip_name";
deviceMatchAttr = "hdf_wlan_chips_chip_name";
serviceName = "driverName";
serviceName = "driverName";
}
}
```
```
4.
构建驱动
4.
构建驱动
-
创建内核菜单在//device/MySoCVendor/peripheral
目录中创建Kconfig文件,内容模板如下:
-
创建内核菜单在
`//device/MySoCVendor/peripheral`
目录中创建Kconfig文件,内容模板如下:
```
```
config DRIVERS_WLAN_XXX
config DRIVERS_WLAN_XXX
bool "Enable XXX WLAN Host driver"
bool "Enable XXX WLAN Host driver"
default n
default n
depends on DRIVERS_HDF_WIFI
depends on DRIVERS_HDF_WIFI
help
help
Answer Y to enable XXX Host driver. Support chip xxx
Answer Y to enable XXX Host driver. Support chip xxx
```
```
接着修改文件//drivers/hdf_core/adapter/khdf/linux/model/network/wifi/Kconfig,
在文件末尾加入如下代码将配置菜单加入内核中,如:
接着修改文件`//drivers/hdf_core/adapter/khdf/linux/model/network/wifi/Kconfig`,
在文件末尾加入如下代码将配置菜单加入内核中,如:
```
```
source "../../../../../device/MySoCVendor/peripheral/Kconfig"
source "../../../../../device/MySoCVendor/peripheral/Kconfig"
```
```
-
创建构建脚本
-
创建构建脚本
在//drivers/hdf_core/adapter/khdf/linux/model/network/wifi/Makefile文件末尾增加配置,模板如下:
在
`//drivers/hdf_core/adapter/khdf/linux/model/network/wifi/Makefile`
文件末尾增加配置,模板如下:
```
HDF_DEVICE_ROOT := $(HDF_DIR_PREFIX)/../device
obj-$(CONFIG_DRIVERS_WLAN_XXX) += $(HDF_DEVICE_ROOT)/MySoCVendor/peripheral/build/standard/
```
当在内核中开启DRIVERS_WLAN_XXX开关时,会调用//device/MySoCVendor/peripheral/build/standard/中的makefile。更多详细的开发手册,请参考
[
WLAN开发
](
../guide/device-wlan-led-control.md
)
。
```
HDF_DEVICE_ROOT := $(HDF_DIR_PREFIX)/../device
obj-$(CONFIG_DRIVERS_WLAN_XXX) += $(HDF_DEVICE_ROOT)/MySoCVendor/peripheral/build/standard/
```
当在内核中开启DRIVERS_WLAN_XXX开关时,会调用`//device/MySoCVendor/peripheral/build/standard/`中的makefile。更多详细的开发手册,请参考[WLAN开发](../guide/device-wlan-led-control.md)。
### 开发移植示例
### 开发移植示例
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录