[实战] Petalinux驱动开发以及代码框架解读

该文章已生成可运行项目,

Petalinux驱动开发以及代码框架解读

一、引言

Petalinux是Xilinx提供的Linux开发工具链。通过Petalinux,可以很轻松的完成Xilinx SOC的Linux系统定制,驱动和应用开发。本文主要从驱动开发角度,基于petalinux2022.2版本,介绍如何同通过Petalinux开发自己的驱动。


二、步骤

安装Petalinux以及使用Vivado创建SOC工程,这些基础步骤,网上由太多教程,这里就不累述了。这里假设大家已经安装好了Vivado,Petalinux,并已经通过Vivado工程导出了硬件描述文件(.xsa文件)。

2.1 创建PetaLinux工程

petalinux-create -t project --name zynq_gpio_demo --template zynq
cd zynq_gpio_demo

2.2 配置硬件描述文件

  1. 将Vivado生成的system.xsa文件复制到工程目录。
  2. 导入硬件配置:
    petalinux-config --get-hw-description=.
    

2.3 设备树配置

project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi中添加GPIO节点:

/ {
    custom_gpios {
        compatible = "customGpioExport";
        status = "okay";
        gpios = <&gpio0 54 GPIO_ACTIVE_HIGH>,  // EMIO GPIO0
                <&gpio0 55 GPIO_ACTIVE_HIGH>; // EMIO GPIO1
    };
};
  • 关键属性
    • compatible:驱动匹配标识符。
    • gpios:指定GPIO控制器、引脚号和激活电平。

2.4 建立驱动框架

petalinux为用户开发自己的驱动建立了完整易用的驱动框架,可以通过petalinux-create -t modules命令创建,如下所示:

petalinux-create -t modules --name customGpioExport --enable

通过上述指令,就会在{petalinux project}/project-spec/meta-user/recipes-modules/目录下生成custom_gpio_export 目录,在该目录下,自动生成了custom_gpio_export .bb文件以及files文件加,在files文件夹下,成了驱动框架文件customGpioExport .c以及Makefile,以下是目录结构图:

{petalinux project}/
└── project-spec/
    └── meta-user/
        └── recipes-modules/
            └── customGpioExport/
                ├── customGpioExport.bb
                └── files/
                    ├── customGpioExport.c
                    └── Makefile

2.5 编辑 .bb 文件

打开{petalinux project}/project-spec/meta-user/recipes-modules/customGpioExport下的customGpioExport.bb文件并修改内容如下:

# 配方基础配置
SUMMARY = "Custom GPIO Export Driver"
LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6"

# 定义模块名称和源码路径
MODULE_NAME = "customGpioExport"
SRC_URI = " \
    file://${MODULE_NAME}.c \
    file://Makefile \
"

# 指定源码目录(默认为当前目录)
S = "${WORKDIR}"

# 继承内核模块构建类
inherit module

# 定义模块编译参数
EXTRA_OEMAKE:append = " \
    KERNEL_SRC=${STAGING_KERNEL_DIR} \
    KERNEL_VERSION=${KERNEL_VERSION} \
"

# 安装目标(将模块复制到 rootfs 的 /lib/modules/ 目录)
do_install() {
    install -d ${D}/lib/modules/${KERNEL_VERSION}/extra
    install -m 0644 ${B}/${MODULE_NAME}.ko ${D}/lib/modules/${KERNEL_VERSION}/extra/
}

# 定义模块依赖(可选)
# DEPENDS = "virtual/kernel"

关键配置解释

  • SRC_URI
    指定驱动源码路径。此处假设源码文件为 customGpioExport.cMakefile,位于 files 子目录。
    若源码文件名为 customGpioExport.c,需同步修改:

    SRC_URI = " \
        file://customGpioExport.c \
        file://Makefile \
    "
    
  • inherit module
    继承内核模块构建类,自动处理模块编译和签名(如需 Secure Boot)。

  • EXTRA_OEMAKE
    make 命令传递额外参数:

    • KERNEL_SRC:指向内核源码目录。
    • KERNEL_VERSION:内核版本号(自动填充)。
  • do_install
    定义模块安装逻辑,将生成的 .ko 文件复制到 rootfs 的 /lib/modules/$(uname -r)/extra/ 目录。


2.6 编写驱动文件

根据自己需要以customGpioExport.c为基础框架,增加自己模块需要的功能实现即可,不在这里累述。

2.7 编写 Makefile

确保 files/Makefile 内容如下(适配内核模块编译):

obj-m := custom_gpio_export.o

KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:
    $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules

clean:
    $(MAKE) -C $(KERNEL_SRC) M=$(PWD) clean
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客不孤独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值