【PetaLinux】使用PetaLinux编译驱动模组,添加多个文件至模组

请添加图片描述
【零】为什么使用Petalinux编译模组
主要原因:insmod: can’t insert ‘asm330.ko’: invalid module format
即便我采用了一样的开发SDK并使用内核源码目录编译生成ko文件,但是加载时仍然会报错。
报错的原因细品非常离谱,我也一一排除过,到最后我发现这是无解的事情。
(1)一开始认为是Format的问题,所以我检查了自己编译使用的SDK,tools,发现确实有问题,之前用的是Zynq7000系列的SDK,所以现在换了个环境,用了ZynqMp的开发套件。为了以防万一,我在那个环境编译生成了APP,在板子上成功运行了。这说明,至少不是SDK/Tools的问题。然而,等我生成.ko去加载时,发现仍然有问题。
(2)有博客指出是内核配置的问题,参考博客:解决不能加载驱动模组,设置了,然而并没有什么用,仍然报错。
(3)最后只能是编译内核和实际内核不一样了,可是我使用的内核源码是一样的,但内容稍有区别,这个区别不是我造成的,而是Petalinux造成的,为什么这么说呢?因为,我这边始终使用petalinux去编译kernel,而不是单独用内核源码的目录去make镜像。在使用内核源码目录单独去编译驱动模组时,它会提示你这个内核没有进行配置,所以你需要手动的在源码目录下进行make config等一系列操作。但是如果这样做,你的Petalinux可能又会用不了你这个内核源码目录。并且,Petalinux的对于内核的配置什么都会存在它的项目目录下,这就是为什么使用了petalinux-config -c kernel,但内核源码目录下没有设置。所以这就形成了一个矛盾的闭环,除非你已经不再更改xsa,直接使用单独的源码进行手动生成镜像了,否则就无法使用。
结合以上3点,那目前最为有效的办法就是使用petalinux编译模组了,这样可以有效的避免以上的问题,唯一的缺点就是petalinux时不时就卡住。
【一】使用PetaLinux编译模组
(1)前提条件:
已经使用petalinux建立好了工程,并使用xsa文件对工程进行了设置,同时可以正常生成镜像、设备树、BOOT.BIN等文件。
(2)创建模组项目(以创建aht20驱动为例):

petalinux-create -t modules --name aht20 --enable

输入这个命令后,在项目文件夹下生成对应的目录:/project-spec/meta-user/recipes-modules/aht20
打到这个目录,会有以下文件:
在这里插入图片描述
在files文件下会有系统为你生成的aht20.c文件,然后就需要开始你的表演了。
(3)在整完aht20.c之后,就可以编译了,输入命令:

petalinux-build -c aht20

这个命令表示单独编译aht20,另外如果直接使用petalinunx-build的话也是会编译的,因为在之前的命令中:–enable表示自动添加至rootfs并启用,因此在编译rootfs时会顺便编译到。
(4)在目标文件夹中找到生成的模组:/build/tmp/sysroots-components/zynqmp_generic/aht20/lib/modules/5.4.0/extra
如果你是Zynq7000,则可能需要在sysroots-components下的另外的一个目录里寻找。
(5)如果我的驱动需要多个文件怎么办?
第一点:如果需要编译的模组需要多个.C文件配合,则需要修改/project-spec/meta-user/recipes-modules/aht20/files下的Makefile,规则和一般的编译相同。
以之前学习IMX6ULL中的Led灯为例:
在这里插入图片描述
这里就是利用led.c与board_demo.c来生成led_modules.ko.
第二点:修改.bb文件,从而让Yocto能找到你设定的文件。
在SRC_URI中添加你需要的文件,例如楼主这里是添加.h头文件,添加头文件不需要修改Makefile,因为Makefile原本就是按照你当前的目录去寻找头文件的,但是我不知道为什么不修改.bb文件,它似乎也定位不到,总而言之就是修改.bb文件。
在这里插入图片描述
参照上一点,如果你需要多添加.c,也是一样的格式写到这个SRC_URI中。
【二】删除模组
现在我已经调试好了,将驱动模组弄到内核代码里去了,现在这个驱动模组留着也占空间,怎么删呢?很简单。
第一步:使用petalinux-config -c rootfs,进入user modules,然后把之前的模组的选定取消掉,然后保存退出。
第二步:进入/project-spec/meta-user/recipes-modules/目录,将对应的模组文件夹删除。
至于其编译生成的一些临时文件,可以通过petalinux自带的清理临时文件命令去清除:
#工程编译过程清理
petalinux-build -x distclean
#工程编译彻底清理
petalinux-build -x mrproper -f
【三】值得一提的例子:AXI_DMA的驱动编译
PL的设置以及设备树、内核的调整请参考博客:linux系统移植及AXI DMA配置
原博客是使用Petalinux里编译的临时文件夹来一举解决编译模组的问题,然而UP还是无法使用,为啥?因为我的Petalinux工程是在Ubuntu18.04版本的虚拟机上实现,同时还完成了Vivado/Vitis的安装并可以对Cotex-R5、A53核进行一些裸机开发。而应用开发是在另一个Ubuntu20.04版本的虚拟机上实现的。为什么要分开呢,主要还是因为管理起来比较方便,并且之前有几次也是统一用Ubuntu18.04去做,但是发现总是弄着弄着环境坏了,因此就分开了。
下面进入正题:
第一步-》建立模组:

petalinux-create -t modules --name axidma --enable

第二步-》复制代码:
复制之前先看看源代码结构,怎么看呢?主要是关注dirver目录下的driver.mk,主目录下的makefile。
经过揣摩后,发现驱动代码需要这样几个文件:
请添加图片描述
首先删除创建模板中生成的axidma.c,然后将源代码中的而这些文件复制到file目录下。
第三步-》修改代码:
具体操作参考我上面分享的博客,这里不多做赘述。
PS:如果编译报错:error: array type has incomplete element type ‘struct of_device_id’,说明第一步忘记改了,即:
axi_dma.c (add in line 18):增加 #include <linux/of_address.h>
第四步-》修改Makefile:
在这里插入图片描述
这里需要注意一下axidma_of.o一定要放在axidma_dma.o前面,因为从代码结构上来说是axidma_of.c声明了一个函数,而axidma_dma.c中使用了这个函数,同样在.bb文件中,我们也需要注意这个顺序。
第五步-》修改.bb文件:
请添加图片描述
第六步-》编译模组:

petalinux-build -c axidma
  • 18
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PetaLinux是一个基于嵌入式Linux的开发工具链,用于构建嵌入式系统。它提供了许多可定制的组件和功能,其中包括对JFFS2文件系统的支持。 JFFS2(Journaling Flash File System 2)是一种针对闪存存储设备设计的文件系统。它具有很好的压缩率和高度可靠性,适用于嵌入式系统。在嵌入式系统中,闪存是一种常见的存储设备,它通常具有较小的存储容量和有限的周期寿命。因此,选择合适的文件系统对于确保系统的可靠性和性能至关重要。 使用PetaLinux时选择使用JFFS2文件系统有几个优点。首先,JFFS2具有较好的压缩率,可以节省存储空间。这在嵌入式系统中特别重要,因为闪存的容量通常有限。其次,JFFS2采用了日志技术,可以确保数据的完整性和一致性。它可以通过将修改的数据写入日志中,然后再写入闪存中来提供数据持久性。这有助于防止数据损坏和错误。 另外,PetaLinux提供了对JFFS2文件系统的内建支持和集成工具。这些工具使得在构建嵌入式系统时轻松地添加和配置JFFS2文件系统成为可能。开发人员可以使用PetaLinux提供的命令和选项设置文件系统的参数和属性,以满足特定的需求。 综上所述,使用PetaLinux来构建嵌入式系统并选择JFFS2文件系统能够提供较好的存储空间利用率和数据的可靠性。这使得嵌入式系统在具有有限存储容量和闪存设备的情况下,能够更好地运行和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值