雨山的Blog

雨山的Blog

OrangePi5pro更新npu驱动

450
2025-01-12

部署环境

CPU:RK3588s

内存大小:8G

使用 emmc 作为存储,额定大小 32G

Linux 版本:Debian11

Linux 内核:Linux 6.1.43-rockchip-rk3588

RKNPU driver: v0.9.6

kllm-runtime version: 1.1.4

此外,另外需要一台电脑运行 Ubuntu22.04,当然可以使用 VMware!

步骤

检查 NPU 驱动!

目前 RKNPU driver: v0.9.8 经过测试,kllm-runtime version: 1.1.4 可以完美运行。截至目前,官方给出的镜像里 RKNPU driver: v0.9.6 经过验证,不能兼容,运行出错!

sudo cat /sys/kernel/debug/rknpu/version

应当出现

orangepi@orangepi5pro:~$ sudo cat /sys/kernel/debug/rknpu/version

[sudo] password for orangepi:

RKNPU driver: v0.9.8

编译新内核

如果你的驱动版本在 kllm-runtime version: 1.1.4 支持的 v0.9.8,则不需要这一步,直接跳下一步!

这一步我们需要重新在另一台电脑 Ubuntu 编译 Linux 内核,并把它安装到 orangePi 上。

在 Ubuntu 主机上:lsb_release -a 查看 Ubuntu 版本;

切记!orangePi 给出的编译库及工具链仅支持 22.04. 我尝试就在 debian 上编译结果出错了

安装编译内核库及工具链 Linux sdk:

sudo apt-get update

sudo apt-get install -y git

git clone https://github.com/orangepi-xunlong/orangepi-build.git -b next

orangepi-build 第一次运行的时候会去下载交叉编译工具链、u-boot 和 linux 内核

源码,成功编译完一次 linux 镜像后在 orangepi-build 中可以看到的文件和文件夹有

a. build.sh: 编译启动脚本range Pi 用户手册

深圳市迅龙软件有限公司版权所有

492

b. external: 包含编译镜像需要用的配置文件、特定功能的脚本以及部分程序

的源码,编译镜像过程中缓存的 rootfs 压缩包也存放在 external 中

c. kernel: 存放 linux 内核的源码,里面名为 orange-pi-5.10-rk35xx 的文件夹

存放的就是 RK3588/RK3588S 系列开发板 legacy 分支的内核源码,内核源

码的文件夹的名字请不要手动修改,如果修改了,编译系统运行时会重新下

载内核源码

d. LICENSE: GPL 2 许可证文件

e. README.md: orangepi-build 说明文件

f. output: 存放编译生成的 u-boot、linux 等 deb 包、编译日志以及编译生成的

镜像等文件

g. scripts: 编译 linux 镜像的通用脚本

h. toolchains: 存放交叉编译工具链

i. u-boot: 存放 u-boot 的源码,里面名为 v2017.09-rk3588 的文件夹存放的就

是 RK3588/RK3588S 系列开发板 legacy 分支的 u-boot 源码,u-boot 源码的

文件夹的名字请不要手动修改,如果修改了,编译系统运行时会重新下载

u-boot 源码

j. userpatches: 存放编译脚本需要用到的配置文件

之后:

cd ./orangepi-build

运行 bash 脚本

sudo ./build.sh

选择 Kernel package,然后回车

接着选择开发板的型号

按需选择是否更改内核参数,这里我就不改

开始第一次编译!(等下还要重新再来一次)

编译时间因 Ubuntu 主机的 cpu 决定!

编译完成后进入输出目录 output 可以发现已经有几个镜像文件了

a.linux-dtb-legacy-rockchip-rk3588_1.0.6_arm64.deb 包含内核使用的 dtb 文件

b. linux-headers-legacy-rockchip-rk3588_1.0.6_arm64.deb 包含内核头文件

c. linux-image-legacy-rockchip-rk3588_1.0.6_arm64.deb 包含内核镜像和内核模块

删掉!由于编译的内核版本还是 0.9.6,我们需要更换驱动文件,重新编译 -

找到 npu 的最新驱动文件压缩包

该压缩包在 rknn-llm 源码下。/rknn-llm/drivers

解压缩替换内核驱动!

找到编译后 /linux-rockchip-rk3588-legacy 的 drivers 文件夹,将解压后的新驱动 rknpu 文件夹替换掉原来的即可。

注意!

在 0.9.8 下(截至目前测试),我们还需要对其它几个驱动文件进行修改!

打开编译源码目录下 include/linux/mm.h ,在 include 引用下面添加:

static inline void vm_flags_set(struct vm_area_struct *vma, vm_flags_t flags)
{
    vma->vm_flags |= flags;
}
static inline void vm_flags_clear(struct vm_area_struct *vma, vm_flags_t flags)
{
     vma->vm_flags &= ~flags;
}

新的 rknpu 驱动文件里 rknpu_devfreq.c

注释掉://.set_soc_info = rockchip_opp_set_low_length,

取消同步

orangepi-bulid 编译系统编译 linux 内核源码时首先会将 linux 内核源码和 github 服务器的 linux 内核源码进行同步,所以如果想修改 linux 内核的源码,首先需要关闭源码的更新功能(需要完整编译过一次 linux 内核源码后才能关闭这个功能,否则会提示找不到 linux 内核的源码,如果是从百度云盘下载的源码压缩包,则没有这个问题,因为 linux 的源码都已缓存好了),否则所作的修改都会被还原

userpatches/config-default.conf 中的 IGNORE_UPDATES 变量为“yes”

Ok,不出意外,不漏步骤的话,可以重新编译了

cd /your/path/orangepi-build
sudo ./build.sh

重新按照源步骤选择即可。

一顿输出,会得到

a.linux-dtb-legacy-rockchip-rk3588_1.0.6_arm64.deb 包含内核使用的 dtb 文件

b. linux-headers-legacy-rockchip-rk3588_1.0.6_arm64.deb 包含内核头文件

c. linux-image-legacy-rockchip-rk3588_1.0.6_arm64.deb 包含内核镜像和内核模块

d.linux-image-legacy-rockchip-rk3588_deg_1.0.6_arm64.deb

安装新内核

1. 用 sftp 或者 rz 命令上传到 OrangePi 板子上

2.cd 到上传到的文件夹 : cd /your/path

3.4 个 deb 包都在一个文件夹的话, 直接安装 deb 内核;

sudo dpkg -i *.deb

大功告成!

重启!

sudo reboot

之后你可以重新查看内核版本,是否已经更新:

sudo cat /sys/kernel/debug/rknpu/version