开发日志[第二周]:在实体开发板上跑通测例,整理StarryOS对librknnrt.so闭源库的逆向成果和官方TRM手册中RKNN章节到文档中,搭建了基础rknn-npu驱动骨架和drm框架 #2
Dirinkbottle
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
第二周开发日志(2.1-2.7)
工作总结
librknnrt.so逆向成果、完整寄存器语义、模型推理全链条,发布至 GitHub Pagesaxnpu-rknn独立 crate,编写 DTB 设备探测代码,通过rdrive框架自动匹配 NPU 设备axdrmcrate,实现 GEM 内存对象管理和 ioctl 编码解析与分发机制开发板验证
搭载 RK3588 芯片的 OrangePi 5 Plus 开发板到了之后,将带有 NPU 支持的 StarryOS 版本(atomgit 仓库)部署到开发板上,成功跑通测例,验证了 NPU 驱动在 StarryOS 上的可行性。
闭源库逆向与文档整理
花了 3 天时间系统整理了以下内容:
librknnrt.so闭源库逆向成果 — 梳理了用户态库的内部调用流程、ioctl 命令、内存管理机制rknn_init到rknn_destroy的完整生命周期,包括任务提交流程、状态机、DMA Fence 路径等这份文档不仅方便自己开发时查阅,也相当于一份社区参考文档,我也会一直维护和验证的,方便更多对 RKNN NPU 驱动感兴趣的开发者查阅和使用。
驱动骨架编写
最初尝试直接在
arceos/modules/下创建axnpu-rknn驱动模块,但遇到了 workspace 循环依赖问题——ArceOS 的axdriver_block锁定的版本缺少ahcifeature,而 Cargo workspace 会全量解析所有 members 的依赖,导致整个 workspace 编译失败。参考 StarryOS(NPU 版本)的做法,将驱动模块移动到 Starry 根目录下独立开发,等完善后再集成回 arceos。
编写了
dtbparse.rs,利用 ArceOS 的rdrive框架通过设备树(DTB)自动探测 NPU 设备:module_driver!宏会将驱动自动注册到rdrive框架,内核启动时遍历 DTB,匹配compatible = "rockchip,rk3588-rknn"后自动调用probe_rknpu,无需手动调用。DRM 框架搭建
创建了
driver/axdrmcrate,作为用户态接口适配层:GEM 内存对象管理 — 实现了
GemNumberAllocator(handle 编号分配/回收)、GemObject(物理地址、虚拟地址、fake offset)、GemHandle(自动回收的 RAII handle)ioctl 编码解析 — 实现了 DRM ioctl 命令的解码函数:
ioctl_nr(cmd)ioctl_type(cmd)'d'= 0x64)ioctl_size(cmd)is_driver_ioctl(cmd)ioctl 分发机制 — 驱动通过
register_driver()注册自己的 ioctl handler,dispatch_ioctl()根据命令编号自动分发到对应驱动。NPU 驱动只需注册一个回调函数即可处理私有 ioctl。Beta Was this translation helpful? Give feedback.
All reactions