上次在社区看见有小伙伴问,使用官方系统固件无法开启并正常使用NPU进行rknn_ssd_demo的测试,官方小伙伴更新了内核,但是还是在最后SUBMIT的时候失败。。。
昨天自己研究了一下,并成功在官方固件下开启NPU并正常运行了DEMO。
方法如下:
1.下载radxa的kernel按照教程编译内核
2.如果成功了说明你的环境没问题了
3.修改rock3a分支下的dts文件,[rk3568-rock-3-a.dts]
4.将里面的reserved_memory节点删除,注意是与npu相关的节点
5.将rknpu节点下的预设节点引用删除,只保留supply和status
6.重新编译内核,完成后会生成rk3568-rock-3-a.dtb
7.将编译好的文件使用root权限覆盖3A里/boot/dtbs/同名文件
8.重启设备----大功告成
原理:
应该是官方为NPU预设保留内存时内核报错,导致预设内存失败节点失效,从而使得NPU节点引用内存也失败,所以NPU无法使用,以上代码是参考firefly的3568设备树文件,发现firefly没有使用预设内存,但是可以成功,所以试试,结果真成功了!
希望这个文档能帮助到大家,谢谢,圣诞快乐!!!!!
更新:
具体原因已经找到,基于Linux rock3a 4.19.193-16-rockchip-g0cca7bdf9cdb内核,在rk3568-rock-3-a.dts文件的reserved-memory节点中,关于“shared-dma-pool”属性参数官方写入了错误的格式:
原文如下:
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
rknpu_reserved: rknpu {
compatible = "shared-dma-pool";
reusable;
size = <0x0 0x08000000>;
alignment = <0x0 0x1000>;
};
};
修改:应该将其中的
size属性参数改为<0x08000000>
alignment属性改为<0x1000>
然后启动时npu报内存资源分配失败,是因为npu的静态内存地址和npu_iommu分配地址冲突了,这个部分是在rk3568.dtsi文件中,我临时将npu_iommu的地址从fde4b000改为了fde5b000【查阅iomem表发现这个地址未被使用】,因为npu分配内存地址为fde40000正好与npu_iommu冲突,导致npu初始化时分配失败。。。。
修改后保存编译,一切正常了~ 这样可以不用删除预留内存节点。。。
正常启动的Console日志:
[ 3.008604] iommu: Adding device fde40000.npu to group 0
[ 3.011693] RKNPU fde40000.npu: Linked as a consumer to fde5b000.iommu
[ 3.015241] RKNPU fde40000.npu: RKNPU: rknpu iommu is enabled, using iommu mode
[ 3.018467] RKNPU fde40000.npu: Linked as a consumer to regulator.15
[ 3.022020] [drm] Initialized rknpu 0.4.2 20210701 for fde40000.npu on minor 1
[ 3.025205] RKNPU fde40000.npu: leakage=4
[ 3.028747] RKNPU fde40000.npu: avs=0
[ 3.032448] RKNPU fde40000.npu: l=0 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0
最新修改的dtb文件
链接:https://pan.baidu.com/s/1B9jFAhdmAz5V54FiPkt8wA
提取码:GRMX