当前位置: 首页 > news >正文

Petalinux驱动开发

1. Petalinux开发流程

  1. 创建工程
    petalinux-create -t project -n petalinux --template zynq

    -t 代表类型
    -n 工程的名称
    –template 选择工程的模板
    请添加图片描述
    工程创建成功

  2. 更新硬件xsa
    petalinux-config --get-hw-description ../hardware/xx.xsa
    petalinux-config --get-hw-description ../hardware/system_wrapper_dma.xsa

  3. 设置外部的u-boot和内核(可选)
    请添加图片描述

  4. 设置Auto Config Settings
    请添加图片描述

    默认Device tree autoconfig是打开的,这个不要动
    Kernel autoconfig默认关闭,这里打开
    u-boot autoconfig默认关闭,这里打开

  5. 修改设备树
    请添加图片描述

    这两个设备树修改哪个都可以
    请添加图片描述

  6. build
    petalinux-build工程编译
    会生成image/linux下的boot.scr和image.ub

  7. 打包到BOOT.BIN
    petalinux-package --boot --u-boot --fpga --force

  8. 复制文件到SD卡的第一启动镜像
    请添加图片描述

  9. 清理工程
    petalinux-build -x distclean

    这种会保留image/linux内部的东西
    petalinux-build -x mrproper -f
    这种会清理掉image/linux内部的东西

2. Petalinux工程目录说明

请添加图片描述

  1. build就是一些编译过程的文件
  2. image是编译的结果
  3. project-spec是一些配置文件

3. Petalinux创建应用,驱动,开机启动脚本

1. 添加应用

petalinux-create -t apps --template c --name first-app --enable
添加–enable是为了默认在rootfs加载该first-app

  1. 在first-app/file

    1. 添加源文件(.c文件)操作
      请添加图片描述

    添加.c文件比较简单
    1. 修改Makefile 添加a.c
    2. 修改first-app.c 声明a.c中定义的函数
    2. 添加头文件(.h)文件操作
    请添加图片描述

    注意,对于应用的make不需要什么指定编译的路径-C,直接make即可,但是对于下面驱动的make,要用-C指定编译的路径

  2. 在first-app下
    请添加图片描述

    修改.bb文件,.bb文件是bitbake的基础单元
    由于在file中添加了.c .h文件 但是在.bb里面不会自动去添加,需要用户手动去添加
    如果不添加,petalinux-build就会报错
    请添加图片描述

2. 添加驱动

  1. 创建驱动模块
    petalinux-create -t modules --name first-mod --enable
    请添加图片描述

    生成了对应的modules

  2. README会讲驱动树如何添加,这部分会在Linux驱动中会讲
    请添加图片描述

  3. 工程编译
    petalinux-build就会生成对应的.ko文件
    请添加图片描述

    能搜到对应的.ko文件,说明驱动生成成功了

  4. 添加a.c 在first-mod.c进行声明和引用
    请添加图片描述

  5. 修改Makefile
    请添加图片描述

  6. 修改.bb文件
    请添加图片描述

  7. 添加a.h文件
    请添加图片描述

  8. petalinux-build

  9. 但是如果仅仅是为了获取.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来添加驱动了,我们可以随便建立一个文件夹来生成对应的驱动

  10. 单独编译.ko文件
    随便找个目录创建一个文件夹(这里是driver),使用上述的8获取的内核编译路径和编译器
    请添加图片描述

  11. 配合9制作开机自启动脚本
    petalinux-create -t apps --template install --name <APPS-NAME> --enable
    请添加图片描述

    通过修改.bb文件,来实现开机启动
    请添加图片描述

    需要填写的内容太多,这里把代码贴出来

    1. 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"
    
    1. 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`
http://www.lryc.cn/news/609695.html

相关文章:

  • Redis 常用数据结构以及单线程模型
  • Apache Camel 中 ProducerTemplate
  • 哪些第三方 Crate 可以直接用?
  • 深入解析 Apache Tomcat 配置文件
  • RK Android14 新建分区恢复出厂设置分区数据不擦除及开机动画自定义(一)
  • PHP-分支语句、while循环、for循环
  • Android 分析底电流高即功耗大的几个方面
  • 开疆智能ModbusTCP转Profient网关连接ER机器人配置案例
  • LeetCode 140:单词拆分 II
  • 机械设备制造企业:大型设备采购流程与注意事项
  • 百度翻译详解:包括PaddleNLP、百度AI开放平台、接口逆向(包括完整代码)
  • 晨控CK-GW08S与汇川AC系列PLC配置Ethernet/IP通讯连接手册
  • 【学习笔记】Manipulate-Anything(基于视觉-语言模型的机器人自动化操控系统)
  • Spark SQL:用SQL玩转大数据
  • ROS2机器人编程新书推荐-2025-精通ROS 2机器人编程:使用ROS 2进行复杂机器人的设计、构建、仿真与原型开发(第四版)
  • 力扣热题100——滑动窗口
  • Axure日期日历高保真动态交互原型
  • MySQL 约束知识体系:八大约束类型详细讲解
  • Java项目:基于SSM框架实现的电子病历管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • Android 15.0 启动app时设置密码锁
  • 安卓264和265编码器回调编码数据写入文件的方法
  • Android进程基础:Zygote
  • 2025-08-04-零成本搭建 AI 应用!Hugging Face 免费 CPU 资源实战指南
  • Android Telephony 框架与横向支撑层
  • 如何选择一个容易被搜索引擎发现的域名?
  • 计算机网络:详解网络地址的计算步骤
  • 2.4- WPF中非 UI 线程上安全地更新 UI 控件方法
  • JVM学习日记(十六)Day16——性能监控与调优(三)
  • SpringBoot格式化数据库表格字段时间戳
  • vcpkg在vs/vscode下用法