OpenHarmony开发者论坛

标题: OpenHarmony标准系统上实现对rk系列芯片NPU的支持(驱动移植) [打印本页]

作者: 离北况归    时间: 2024-9-27 23:51
标题: OpenHarmony标准系统上实现对rk系列芯片NPU的支持(驱动移植)
[md]## 1.将RKNPU驱动移植到OpenHarmony内核

本文以rk3568为例,将RKNPU驱动移植到OpenHarmony使用的kernel 5.10中

> 开发环境
>
> - DAYU200 rk3568开发板
> - OpenHarmony 4.1 Release 64位系统

> 文档约定:
> 4.1r_3568为OpenHarmony标准系统源码根目录

### 1.0 环境准备

1.搭建OpenHarmony标准系统开发环境:https://forums.openharmony.cn/fo ... wthread&tid=897

2.hdc工具:https://forums.openharmony.cn/fo ... thread&tid=1458

- 下载地址:http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist

### 1.1 移植准备:得到一份完整的kernel代码

OpenHarmony标准系统4.1r使用的是kernel 5.10的内核,在此基线基础上,回合CVE补丁及OpenHarmony特性,作为OpenHarmony Common Kernel基线。针对不同的芯片,各厂商合入对应的板级驱动补丁,完成对OpenHarmony的基线适配。

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_624,h_307)

所以要把npu驱动移植到kernel 5.10,首先得有一份完整的rk3568 kernel5.10代码。所以我们需要手动把4.1r_3568/kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch打进/4.1r_3568/kernel/linux/linux-5.10内核中

```
cd 4.1r_3568/kernel/linux/linux-5.10

patch -p1 < /home/jiajiahao/OpenHarmony/4.1r_3568/kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch
```

2.然后注释掉/4.1r_3568/device/board/hihope/rk3568/kernel/build_kernel.sh中的 `patch -p1 < ${KERNEL_PATCH}`

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_556)

然后就可以在4.1r_3568/kernel/linux/linux-5.10中得到一份完整的rk3568 kernel 5.10代码,在此内核代码基础上进行修改,移植npu的驱动.

### 1.2 内核移植

1.获取npu驱动源码:https://github.com/rockchip-linux/kernel 选择5.10分支,NPU驱动位于:drivers/rknpu

本样例使用的npu驱动,请查看本目录[rknpu](https://gitee.com/OpenHarmony_rk ... 6%85%E6%A0%B8/rknpu)

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_289)

2.修改//kernel/linux/config/linux-5.10/rk3568/arch/arm64_defconfig文件,添加RKNPU的CONFIG配置

```
#
# RKNPU
#
CONFIG_ROCKCHIP_RKNPU=y
CONFIG_ROCKCHIP_RKNPU_DEBUG_FS=y
CONFIG_ROCKCHIP_RKNPU_DRM_GEM=y
```

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_762)

3.将驱动代码[drivers/rknpu](https://gitee.com/OpenHarmony_rk ... 6%85%E6%A0%B8/rknpu)移植到4.1r_3568/kernel/linux/linux-5.10/drivers目录中

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_642,h_451)

4.修改drivers目录下的Makefile文件,添加如下内容

```
source "drivers/rknpu/Kconfig"
```

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_658,h_538)

5.修改drivers目录下的Kconfig文件,添加如下内容

```
obj-$(CONFIG_ROCKCHIP_RKNPU)        += rknpu/
```

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_295)

6.修改kernel/linux/linux-5.10/drivers/iommu/rockchip-iommu.h,修改好的rockchip_iommu.h位于本目录下:[rockchip_iommu.h](./https://gitee.com/OpenHarmony_rk_equipment_transplantation/OpenHarmony_rk_npu/blob/master/doc/1.%E5%B0%86RKNPU%E9%A9%B1%E5%8A%A8%E7%A7%BB%E6%A4%8D%E5%88%B0Openharmony%E5%86%85%E6%A0%B8/rockchip_iommu.h)

7.修改kernel/linux/linux-5.10/include/soc/rockchip/rockchip_iommu.c,修改好的rockchip_iommu.c位于本目录下:[rockchip-iommu.c](https://gitee.com/OpenHarmony_rk ... B8/rockchip-iommu.c)

8.修改kernel/linux/linux-5.10/drivers/soc/rockchip/rockchip_opp_select.c,修改好的rockchip_opp_select.c位于本目录下:[rockchip_opp_select.c](https://gitee.com/OpenHarmony_rk ... ckchip_opp_select.c)

9.修改kernel/linux/linux-5.10/include/soc/rockchip/rockchip_opp_select.h,修改好的rockchip_opp_select.h位于本目录下:[rockchip_opp_select.h](https://gitee.com/OpenHarmony_rk ... ckchip_opp_select.h)

10.kernel/linux/linux-5.10/drivers/rknpu/rknpu_drv.c中将 `MONITOR_TYPE_DEV`改为 `MONITOR_TPYE_DEV`

11.修改kernel/linux/linux-5.10/drivers/rknpu/rknpu_devfreq.c

```

static int rk3588_npu_set_read_margin(struct device *dev,
                                      struct rockchip_opp_info *opp_info,
                                      u32 rm)
修改为
static int rk3588_npu_set_read_margin(struct device *dev,
                                      struct rockchip_opp_info *opp_info,
                                      unsigned long rm)
```

12.在kernel/linux/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi设备树文件中将npu注释打开

```
                        /* These power domains are grouped by VD_NPU */
                        /*pd_npu@RK3568_PD_NPU {
                                reg = <RK3568_PD_NPU>;
                                clocks = <&cru ACLK_NPU_PRE>,
                                         <&cru HCLK_NPU_PRE>,
                                         <&cru PCLK_NPU_PRE>;
                                pm_qos = <&qos_npu>;
                        };*/
```

改为

```
                        /* These power domains are grouped by VD_NPU */
                        pd_npu@RK3568_PD_NPU {
                                reg = <RK3568_PD_NPU>;
                                clocks = <&cru ACLK_NPU_PRE>,
                                         <&cru HCLK_NPU_PRE>,
                                         <&cru PCLK_NPU_PRE>;
                                pm_qos = <&qos_npu>;
                        };
```

### 1.2 npu移植简单验证

1.编译arm64的带有npu驱动的rk3568镜像

```
./build.sh --product-name rk3568 --ccache --no-prebuilt-sdk--target-cpu arm64
```

2.编译好的镜像位于/out/rk3568/packages/phone/images下

3.使用RKDevTool工具烧录镜像到DAYU200后,查看开机内核打印,有如下输出则内核npu驱动移植成功。

内核打印太多,通过 `hdc shell dmesg | grep "RKNPU"`可能看不到以下输出

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_294)

```
[    7.675214] RKNPU fde40000.npu: Adding to iommu group 0
[    7.676593] RKNPU fde40000.npu: RKNPU: rknpu iommu is enabled, using iommu mode
[    7.677428] RKNPU fde40000.npu: can't request region for resource [mem 0xfde40000-0xfde4ffff]
[    7.679266] [drm] Initialized rknpu 0.8.2 20220829 for fde40000.npu on minor 1
[    7.679856] RKNPU fde40000.npu: Failed to get npu_leakage
[    7.682441] RKNPU fde40000.npu: avs=0
[    7.683024] RKNPU fde40000.npu: l=0 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0
[    7.683835] RKNPU fde40000.npu: failed to find power_model node
[    7.683881] RKNPU fde40000.npu: RKNPU: failed to initialize power model
[    7.683912] RKNPU fde40000.npu: RKNPU: failed to get dynamic-coefficient

```
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5