首页 > 技术 > 内容

Zynq UltraScale+ MPSoC 上的多个Linux UIO设计

时间:2025-12-02  作者:Diven  阅读:0

这里的 UIO 即 Userspace I/O,本文中 UIO 泛指 UIO 设备和 UIO 驱动。在 Linux kernel 的世界里比较小众,主要是一些定制设备和相应的驱动。UIO内核驱动指负责将中断和设备内存暴露给用户空间,再由UIO用户态驱动(ApplICation)来实现具体的业务,随心所欲的玩。学术点叫做高度定制化,柔性设计。

那怎么和 FPGA 扯上了关系呢?是的,FPGA在硬件世界里也是随心所欲的玩,这一硬一软还真是登对,在一起啊在一起。

本实验工程将介绍如何利在赛灵思异构多处理器产品系列 Zynq UtralScale+ MPSoC  ZCU102 嵌入式评估板上实现多个 UIO,同时借助赛灵思的工具完成硬件工程和 linux BSP 的开发,最后通过测试应用程序完成测试。

ZCU102上的 MPSoC 集成固化了四核 ARM Cortex-A53,双核Cortex-R5 以及 Mali-400 MP2 GPU,这部分官方称为PS(Processing System)。另外一部分就是FPGA,即 PL(ProgRAMmable LogIC)。PS端实现控制,PL用来实现应用加速,两者通过AXI连接。跑这个小实验,呵呵,大材小用。只是本人手头正好有这个板子不得不装。筒子们可以去买了个Zybo 或者ZedBoard 开发板, 在板子试试身手。

实 验 报 告
实验材料:
 


硬件设计
建立Vivado工程,适配 ZCU102 EVB。通过 IP Integrator 加入PS,在 PL 侧加入5个UIO输入,其中1个是GPIO模块(包含中断输出和设备内存),另外4个是PIN连接到ZCU102 EVB上的DIP开关,作为中断输入通过一个concat IP连接到PS的ps_pl_irq管脚。板级细节请参考[1] UG1182,芯片资料参考[2] UG1085
 


添加PIN约束文件,
set_property PACKAGE_PIN AN13 [get_ports pl_irq_ll]
set_property IOSTANDARD LVCMOS33 [get_ports pl_irq_ll]
set_property PACKAGE_PIN AM14 [get_ports pl_irq_lh]
set_property IOSTANDARD LVCMOS33 [get_ports pl_irq_lh]
set_property PACKAGE_PIN AP14 [get_ports pl_irq_ef]
set_property IOSTANDARD LVCMOS33 [get_ports pl_irq_ef]
set_property PACKAGE_PIN AN14 [get_ports pl_irq_er]
set_property IOSTANDARD LVCMOS33 [get_ports pl_irq_er]

Vivado的图形化的模块设计,丰富的IP库,加上可以上天的智能连接。有点数字电路设计的基础,很快就能完成这个小设计。整个设计如下图。
 


软件设计
这里用到 Xilinx 针对 Linux BSP 开发的 Petalinux。基于Yocto,加入Xilinx的Layers实现硬件工程的导入,将复杂的Yocto的设计流程打包简化,支持一定的用户自定义功能,如QEMU仿真运行,增加 out-of-tree 的驱动,Device tree 修改,应用程序编译打包,等等。具体信息请移步 https://china.xilinx.com/products/design-tools/embedded-software/petalinux-sdk.html

这里简单展示一下具体的命令过程。
$petalinux-create -t project --template zynqMP -n zcu102-pl2ps_irq
$cd ./ zcu102-pl2ps_irq
$petalinux-config --get-hw-description
$petalinux-config -c kernel
Enable UIO_PDRV_GENIRQ driver
CONFIG_UIO=y
# CONFIG_UIO_CIF is not set
CONFIG_UIO_PDRV_GENIRQ=y
$petalinux-build -c device-tree

PL侧的dtsi文件生成与./components/plnx_workspace/device-tree-generation/pl.dtsi
 


这里只有GPIO UIO。 PIN UIO因为不是IP,所以相关信息无法由工具自动生成。所以要做如下修改:
1. 修改GPIO UIO设备端点
    1) 将中断号改为93
    2) 将compatible改成“generic-uio” //我们后面要用 Linux 自带的 UIO_PDRV_GENIRQ 驱动
2. 增加 DIP UIO 端点
    1) 将compatible改成“generic-uio”
    2) 依次设置中断值89到93
    3) 按照每个 DIP PIN 的 interrupt trigger type 设置属性值
*DTS里的中断号与硬件中断号有32的 offset。

Petalinux 提供了自定义DTS文件./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi,将以上修改定义到system-user.dtsi.


有两个方法来适配UIO端点和 UIO_PDRV_GENIRQ 驱动
1. boOTArgs use “uio_pdrv_genirq.of_id=generic-uio”,可以通过DTS定义。
2. insmod uio_pdrv_genirq.ko of_id=generic-uio when install the driver

修改完后,编译出Image.
$petalinu-build
$cd ./images/linux
$petalinux-package --boot --fsbl zynqmp_fsbl.elf --fpga --atf --pmufw --u-boot --force

将生成的BOOT.bin(bootloader)和image.ub(FIT uImage)拷贝到SD卡用于启动。\

测试
这里引用下关于uio_pdrv_genirq驱动的介绍
https://01.org/linuxgraphics/gfx-docs/drm/driver-api/uio-howto.html

结合驱动代码./drviver/uio/uio_pdrv_genirq.c)可知,每个UIO设备会有对应的/dev/uioX的设备节点。用户态驱动程序的读操作会阻塞直到UIO硬件中断发生。UIO的中断处理程序uio_pdrv_denirq_handler()会关闭该硬件中断。用户态驱动程序需要通过write函数来触发uio_pdrv_genirq_irqcontrol()以完成中断的使能和关闭。代码如下,
 


启动内核及加载uio_pdrv_genirq驱动
 


检查/proc/interrupts
 


细心的你一定发现了一个坑,少了2个UIO中断(IRQ122和IRQ124),原来是硬件不支持Edge falling和Level Low的触发模式。kernel log如下。
 


测试DIP UIO方法一
通过拨动2个DIP,观察到
 


2个DIP中断发生了,可是不论怎么再拨动DIP开关,始终是1。前文铺垫过,这个中断在驱动的中断处理程序里会被关掉,需要通过应用程序调用write()来打开。这里有个easy way,使用万能的echo命令“echo 0x1 > /dev/uioX”,再配合DIP可以触发多次中断。
 


测试DIP UIO方法二
前面的方法比较low,这里有稍微高级的享受。写个简单的用户态驱动程序,上代码。
 


借助petalinux提供的交叉编译工具编译出bin文件,拷贝到启动SD卡。

运行测试程序并配合DIP开关测试。(为了更好的体现测试运行情况,在UIO内核驱动里增加了irqcontrol的调用打印)
 


测试GPIO UIO
UIO驱动会将设备内存(寄存器)空间枚举出来,由用户态驱动程序通过mmap导出进行读写控制。参见AXI_GPIO IP的文档pg144-axi-gpio.pdf,其寄存器如下。
 


测试应用程序会通过设置GIER和IP_IER来使能中断。上代码。
 


测试过程

或许你觉得这么贴图代码不厚道而不能施展复制黏贴大法,可不知我拙与WORD,没try出好排版。莫急莫急,这里有GIT,https://gitenterprise.xilinx.com/AlexHe/UIO_Linux_Demo

硬件资源文件和Image,测试代码一个都不能少,统统献上。酸爽否?

实 验 结 论
UIO这种可高度自定义的设备结合Xilinx的MPSoC可以实现非常灵活的应用。Xilinx提供的完备的工具集,给用户带来了高效的开发体验。本例虽然简单,但Xilinx所推崇的All ProgRAMmable的概念和实际的FPGA加速应用的的确确是建立在这些软硬件协同技术之上。忘周知!

猜您喜欢


电路保护元件的重要性日益凸显。作为关键的过流保护元件,自恢复保险丝因其自动断路和恢复功能,受到众多行业的青睐。中熔电气作为国内知名的电气元器件品牌,其自恢复保险...
2021-07-12 09:59:30
现代电子设备中,连接器的设计和性能对整个系统的稳定性和效率非常重要。CONN_60X2MM_TM是新型连接器,凭借其独特的结构和优越的性能,正在逐步成为市场上的...
2025-04-19 23:30:09
电阻器是非常关键的基础元件。作为全球知名的电子品牌,Panasonic(松下)凭借其高品质的产品和技术创新,赢得了广大工程师和电子制造商的认可。长电极电阻作为特...
2017-12-10 12:10:30
贴片电阻,电子电路中不可或缺的元件,其字母标识和型号往往让初学者感到困惑。其实,掌握其规律并不难。本文将带您快速了解贴片电阻字母识别及型号。首先,贴片电阻的字母...
2024-11-26 11:29:48
贴片电阻,这种在电子电路中常见的元件,虽然体积微小,却扮演着重要的角色。它通过将电流转化为热能来限制电流,确保电路的稳定运行。而贴片电阻功率,则是衡量其承受电流...
2025-04-14 15:02:17
热风拆焊台高效、精准的操作体验,成为电子维修领域的得力助手。其独特优势在于:一、高效加热,快速溶解焊锡,大大缩短拆焊时间;二、温度控制精准,可针对不同元件调节,...
2008-06-20 00:00:00
近日,深圳市华众自动化工程有限公司(简称“华众自动化”)正式签约入驻国内领先的大数据科创管理平台——企知道科创空间。华众自动化成立于2013年,是一家专注于...
2024-01-23 09:36:00
汽车保险丝作为保护电路安全的重要元件,其质量和品牌选择显得尤为重要。好利来(HOLLYLAND)作为汽车保险丝领域的知名品牌,因其性能稳定、品质可靠而受到消费者...
2022-06-30 15:52:30
现代电子产品的设计与制造过程中,连接器的选择非常重要。CONN_16.3x14.66MM_SM是应用于各类设备中的连接器,其独特的尺寸和结构设计使其在连接稳定性...
2025-04-23 10:30:08
现今的FPGA设计规模越来越庞大,功能越来越复杂,因此FPGA设计的每个部分都从头开始着手是不切实际的。为了解决这一问题,可以采用复用现有通用模块的方法,将主要...
2023-05-22 14:35:00