Petalinux驱动开发
1. Petalinux开发流程
-
创建工程
petalinux-create -t project -n petalinux --template zynq
-t 代表类型
-n 工程的名称
–template 选择工程的模板
工程创建成功 -
更新硬件xsa
petalinux-config --get-hw-description ../hardware/xx.xsa
petalinux-config --get-hw-description ../hardware/system_wrapper_dma.xsa
-
设置外部的u-boot和内核(可选)
-
设置Auto Config Settings
默认Device tree autoconfig是打开的,这个不要动
Kernel autoconfig默认关闭,这里打开
u-boot autoconfig默认关闭,这里打开 -
修改设备树
这两个设备树修改哪个都可以
-
build
petalinux-build
工程编译
会生成image/linux下的boot.scr和image.ub -
打包到BOOT.BIN
petalinux-package --boot --u-boot --fpga --force
-
复制文件到SD卡的第一启动镜像
-
清理工程
petalinux-build -x distclean
这种会保留image/linux内部的东西
petalinux-build -x mrproper -f
这种会清理掉image/linux内部的东西
2. Petalinux工程目录说明
- build就是一些编译过程的文件
- image是编译的结果
- project-spec是一些配置文件
3. Petalinux创建应用,驱动,开机启动脚本
1. 添加应用
petalinux-create -t apps --template c --name first-app --enable
添加–enable是为了默认在rootfs加载该first-app
-
在first-app/file
- 添加源文件(.c文件)操作
添加.c文件比较简单
1. 修改Makefile 添加a.c
2. 修改first-app.c 声明a.c中定义的函数
2. 添加头文件(.h)文件操作
注意,对于应用的make不需要什么指定编译的路径-C,直接make即可,但是对于下面驱动的make,要用-C指定编译的路径
- 添加源文件(.c文件)操作
-
在first-app下
修改.bb文件,.bb文件是bitbake的基础单元
由于在file中添加了.c .h文件 但是在.bb里面不会自动去添加,需要用户手动去添加
如果不添加,petalinux-build
就会报错
2. 添加驱动
-
创建驱动模块
petalinux-create -t modules --name first-mod --enable
生成了对应的modules
-
README会讲驱动树如何添加,这部分会在Linux驱动中会讲
-
工程编译
petalinux-build就会生成对应的.ko文件
能搜到对应的.ko文件,说明驱动生成成功了
-
添加a.c 在first-mod.c进行声明和引用
-
修改Makefile
-
修改.bb文件
-
添加a.h文件
-
petalinux-build
-
但是如果仅仅是为了获取.ko文件就
petalinux-build
,会花费很长的时间,我们能不能像app那样,直接在file文件夹内直接make的方式生成.ko文件呢?
报错
修改file下面的Makefile
注意位置的获取,上图左侧是原来的Makefile的文件(备份为了.tmp),右侧是修改后的Makefile文件
这里要借助错误的a.c代码,可以把printf(“%s\n”,AA);修改为printf(“%s\n”,AAA);
从而在petalinux-build
的时候出现错误,然后看错误信息来获取地址和编译器的类型
把上图中信息填写进Makefile即可即可,注意修改上述的Makefile后,上述过程会导致petalinux-build失败,要想
petalinux-build
成功,必须要用原来的Makefile文件,也就是把Makefile.tmp重命名为Makefile实际上,有了上述修改后的Makefile后就可以不使用
petalinux-create -t modules --name first-mod --enable
来添加驱动了,我们可以随便建立一个文件夹来生成对应的驱动 -
单独编译.ko文件
随便找个目录创建一个文件夹(这里是driver),使用上述的8获取的内核编译路径和编译器
-
配合9制作开机自启动脚本
petalinux-create -t apps --template install --name <APPS-NAME> --enable
通过修改.bb文件,来实现开机启动
需要填写的内容太多,这里把代码贴出来
- autostart.bb
inherit update-rc.dINITSCRIPT_NAME = "autostart" INITSCRIPT_PARAMS = "start 99 5 ."do_install() {install -d ${D}${sysconfdir}/init.dinstall -m 0755 ${S}/autostart ${D}${sysconfdir}/init.d/autostart }RDEPENDS_${PN}_append += "bash"
- file/autostart
#!/bin/shecho "Hello PetaLinux World"USERHOOK_SD0=/media/sd-mmcblk0p1/autostart.sh USERHOOK_SD1=/media/sd-mmcblk1p1/autostart.sh if [ -f $USERHOOK_SD0 ];thensh $USERHOOK_SD0 & fi if [ -f $USERHOOK_SD1 ];thensh $USERHOOK_SD1 & fi
之后,运行petalinux-build
,把boot.scr BOOT.BIN image.ub 写入SD的FAT分区
在串口助手上,能够打印出由petalinux生成的autostart脚本的内容
此外,为了因为在autostart脚本中预留了
USERHOOK_SD0=/media/sd-mmcblk0p1/autostart.sh
USERHOOK_SD1=/media/sd-mmcblk1p1/autostart.sh
这两个新的自动化运行脚本,在板卡(7020)上通过串口助手可以创建脚本,用户可以自定义运行在的板卡上的脚本
touch /media/sd-mmcblk0p1/autostart.sh
vi /media/sd-mmcblk0p1/autostart.sh
#!/bin/sh
echo "Hello ZYNQ7020!!!"
查询应用的位置
find / -name first-app
/usr/bin/first-app
查询驱动的位置
find / -name first-mod.ko
/lib/modules/5.4.0-xilinx/extra/first-mod.ko
添加到/media/sd-mmcblk0p1/autostart.sh
echo "Hello DXY"/usr/bin/first-app
insmod /lib/modules/5.4.0-xilinx/extra/first-mod.ko
可以看出,分别运行了来自autostart产生的
Hello DXY
来自应用程序打印的
insmod /lib/modules/5.4.0-xilinx/extra/first-mod.ko
[外链图片转存中...(img-yk3lpsCJ-1754305473158)]
可以看出,分别运行了来自autostart产生的
`Hello DXY`
来自应用程序打印的
`AAAAAAA`