1. 第一次petalinux-build完成之后,创建KMD驱动模块
petalinux-create -t modules -n opendla --enable
2. 将github官方nvdla/sw/kmd/下的所有.c,.h文件拷贝到<prj>/project-spec/meta-user/recipes-modules/opendla/files/目录下,并将目录下的opendla.c文件删除。
3. 0 修改驱动源文件,之前提到不同版本的kernel,对应的API有所不同,需要根据自己的内核版本修改驱动源码中的调用函数. (vivi使用4.9内核,需做如下修改。但我们不用改,因为我们版本高(petalinux2019.1对应Linux内核版本4.19)。nvdla/sw/kmd/port/linux/nvdla_gem.c,line 332的drm_gem_object_put_unlocked()函数是在v4.12之后版本中才出现,其替代了之前版本中的drm_gem_object_unreference_unlocked,vivi改了,我们不用改)
332: //drm_gem_object_put_unlocked(dobj);
333: drm_gem_object_unreference_unlocked(dobj);
3. 1 修改files中拷贝过来的驱动文件nvdla_gem.c 。line 439: dma_declare_coherent_memory(drm->dev, 0xC0000000, 0xC0000000,0x40000000, DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
改为自己真实地址空间对应的基址
dma=dma_declare_coherent_memory(drm->dev, 0x40000000, 0x40000000,0x40000000, DMA_MEMORY_EXCLUSIVE);
line 439: dma_declare_coherent_memory(drm->dev, 0xC0000000, 0xC0000000,0x40000000, DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);该函数表示需要在PS DDR中保留一块不被kernel支配,大小为0x40000000的地址空间,以便nvdla core使用DMA方式对CNN输入图像和处理结果在Cache与DDR间进行数据搬移,不知为何官方源码采用了硬编码方式处理物理地址,总线地址和存储块尺寸参数. 按照源码中的注释/* TODO Register separate driver for memory and use DT node to read memory range */, 表明官方不希望我们修改函数中的参数信息,而是根据参数值去修改device tree中对应的Node属性值.但在Vivado BD工程中,PS DDR的有效地址为0x00000000 ~ 0x7FFFFFFF, 显然,参数列表中的物理地址和总线地址不在PL的有效访问范围内,必须对此进行修改,至于具体改为什么值,可自行选择,只要是page size整数倍便可,如256 MiB,那么便可将0xC0000000修改为0x70000000(为何取高位地址,感兴趣的可参考Memory Mapping and DMA,老司机请略过), 同时,存储块尺寸不需要修改. 作者保留了1G空间,
439: //dma=dma_declare_coherent_memory(drm->d

本文记录了在ZCU02开发板上使用petalinux添加NVDLA驱动的过程,包括修改驱动源文件以适配不同内核版本,配置设备树,核对地址和设备名称,以及编译和验证驱动的安装。同时,文中还提及了如何在Ubuntu根文件系统中集成驱动,并进行了网络配置和UMD的编译与运行。
最低0.47元/天 解锁文章
265

被折叠的 条评论
为什么被折叠?



