zynq+linux固化程序,如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计

原标题:如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计

简介

作者: Alex He (何晔), 赛灵思高级嵌入式应用工程师

这里的 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 开发板, 在板子试试身手。

实 验 报 告

实验人员:本人

实验材料:

97d2511a3104808b49086b1f0cd71011.png

硬件设计

建立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

b5ce816a83f924463a1f5a6f4d36f317.png

添加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库,加上可以上天的智能连接。有点数字电路设计的基础,很快就能完成这个小设计。整个设计如下图。

8031aa8a1ce079b59347b0846461a1e6.png

软件设计

这里用到 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-deion

$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

21c127769ef29d01f38d48fa80f00cb0.png

这里只有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.

df298fb36f1e3da946249a92e6862337.png

有两个方法来适配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()以完成中断的使能和关闭。代码如下,

4cef84253d2c37c1df4481de0909c8fe.png

启动内核及加载uio_pdrv_genirq驱动

466f410dbefa4616c4cdf2ceaa58ae11.png

检查/proc/interrupts

5692906c3d4f10e255c73ab83572f94c.png

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

b02bec2828e25799b6e9049c204d065f.png

测试DIP UIO方法一

通过拨动2个DIP,观察到

0aacf863e799c3dadadae360f944da7d.png

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

25472169a891aabf75e6892a747ce2a3.png

测试DIP UIO方法二

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

0cd899a14a307ba00e5d33b2bf0cdcf4.png

ccffdf6eecf6c2d45c966e953333a878.png

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

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

d0717e0903922f1f75e60abfddb73e72.png

测试GPIO UIO

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

a75e51cfcf9e23d0e80d3e6dd04087c8.png

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

3dcd51a970526d4255e6575980cdb1ff.png

86854768cd95bff18c151123f640add7.png

测试过程

ad67531040f35b06f4cde67233521a83.png

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

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

实 验 结 论

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

参考文献

The Userspace I/O HOWTO https://01.org/linuxgraphics/gfx-docs/drm/driver-api/uio-howto.html

[Xilinx Document]

[1] UG1182 - ZCU102 评估板用户指南

[2] UG1085 - Zynq UltraScale+ MPSoC 技术参考手册

[3] UG1144 - PetaLinux 工具文档:参考指南

[4] UG940 - Vivado Design Suite 培训: 嵌入式处理器硬件设计

[5] PG144 - AXI GPIO v2.0 产品指南返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python初学者代码示例_Selenium 快速入门笔记和代码示例(Python版)

链接 文档链接: 安装 selenium 模块和 Chrome 浏览器驱动 步骤: 安装 Selenium 模块: pip install selenium 下载浏览器驱动(下载即可,无需安装,使用时要指定它的路径):请参考 https…

用例描述

用例名称:简要说明/描述, 优先级: 参与者: 事件流:就是用例执行时,由一序列活动组成的控制流。 基本事件流:对用例中常规、预期路径的描述。 扩展事件流:主要是对一些异常情况、选…

thinkpad笔记本散热风扇_极致的散热体验,ORICO 全铝DIY双风扇笔记本散热垫评测...

电脑的出现,极大的改变了人类的生活。娱乐、办公、游戏、电子竞技等等都需要用到电脑。而电脑也慢慢的在升级着。电脑的体积也由最开始的的占据几间屋子的庞大体积,到后来的台式机、台式一体机、电脑的体积慢慢的变的越来越小。而便携式笔记本电脑的出现…

清除java_如何在Java地毯下有效地清除问题

清除java因为软件错误可能使我们在开发人员面前看起来很糟糕,并导致其他人对我们的想法减少,所以最好避免编写错误,快速识别和修复错误或掩盖我们的错误。 有许多博客文章和文章讨论如何避免错误以及如何识别和修复错误,因此&…

Web产品的交互说明文档应该怎么写?

经常与开发同学聊天,他们说有一个详细的说明文档可以帮助他们更准确的进行工时评估,还可以帮助他们提高工作效率,减少多余的思考时间。因此在这里分享一些制作交互说明文档的经验。 我先说说说交互原型包含哪些部分? 版本说明及更…

linux类似360软件,linux下有什么类似鲁大师查看电脑配置的软

满意答案drqyna2017.05.26采纳率:40% 等级:11已帮助:5455人linux如何查看系统的硬件配置如何在linux系统下查看系统配置?在图形模式下我们可以很方便的利用Linux的图形工具,点击几下就可以查看到Linux系统的的硬件信…

java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势

java 编写代码2016年最有趣的Java相关主题 关于代码,有很多热门话题,而要跟上所有事情,这是一项全职的工作。 如果您想知道如何从谷壳中分离出小麦,我们已经为您完成了工作。 在下面的文章中,我们将介绍2016年最热门…

thinkphp json_原创干货 | Thinkphp序列化合总

听说转发文章会给你带来好运最近Thinkphp几个版本都出了反序列化利用链,这里集结在一起,下面是复现文章,poc会放在最后01Thinkphp5.1.37环境搭建composercreate-project topthink/think5.1.37 v5.1.37poc演示截图调用链单步调试漏洞起点在\th…

linux安java,Linux安装Java

从人类社会的角度看OO(独家视角)引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...include与require的区别&a…

前端和后端的区别

后端工程师负责服务器端应用程序的编写开发(业务逻辑、方法、函数、数据库代码等) 前端工程师负责UI的html代码编写和设计,所以前端工程师一般指网页工程师 前端部分是和用户直接交互的,包括前台和后台部分 客户端其实就是属于前端…

笔记本能安装联想智能云教室吗_挑战Jupyter Notebook:云协作、云硬件,上云的Notebook编程环境...

对全世界的 Python 高手而言,Jupyter Notebook 是目前最流行的编程环境,但它也有一些令人难以忍受的缺点。为此,一个位于旧金山的小团队开发了一款名为 Deepnote 的笔记本工具,这是一种云协作、云硬件,上云的 Notebook…

java自动生成类_自动生成优化的Java类专业知识

java自动生成类如果您今年访问过JavaOne,您可能已经参加了我的演讲“如何从数据库生成定制的Java 8代码”。 在那次演讲中,我展示了如何使用Speedment Open Source工具包使用数据库作为域模型来生成各种Java代码。 我们没有时间要考虑的一件事是&#xf…

在Linux中su和sudo区别,Linux中su和sudo的用法和区别

目录sudosudo:暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码。缺点是每次执行超级用户权限都要在命令前加上 sudo ,优点是在当前终端再使用 sudo 不要再重复输入密码(只对…

neo4j 添加属性_Neo4j:动态添加属性/设置动态属性

neo4j 添加属性我一直在研究一个具有英国国家铁路时刻表的数据集,它们以文本格式为您提供每列火车的出发和到达时间。 例如,可以这样创建代表停止的节点: CREATE (stop:Stop {arrival: "0802", departure: "0803H"})该…

python 提升效率_@Python 程序员,如何最大化提升编码效率?

作者 | Enoch CK 译者 | 刘畅 整理 | Jane 出品 | Python大本营 【导语】无论你是一位高级的AI工程师还是学生,你都会在工作或学习过程中需要用到 Python。自 1991 年首次发布后,Python 很快就成为了程序员和技术人员最喜欢的语言。作为一种拥有相对简单…

linux tar -xvf命令,linux下tar命令详解

2011-11-28 13:03朋友你好!我刚开始搞linux,碰到了很多问题,想问你下,希望能帮我解答下。下面是我的一段shell 程序#!/bin/shwhile [ 0 ]doread scoreif [ $score -lt 60 ];thenecho " you must work hard!"…

linux下如何查看主机是否安装了ftp server

常用的发行版的软件包管理系统有Debian系(包括Debian,Ubuntu,Mint等)和Red Hat系(包括RHEL,Fedora,CentOs,Scientific),前者查看是否安装了ftp的命令是&#…

spring boot rabbitmq_Spring Boot+RabbitMQ 实现延迟消息实现完整版,实用!

本文同步Java知音社区,专注于Java作者:Sam哥哥http://blog.csdn.net/linsongbin1/article/details/80178122概述曾经去网易面试的时候,面试官问了我一个问题,说下完订单后,如果用户未支付,需要取消订单&…

jax-rs jax-ws_信守承诺:针对JAX-RS API的基于合同的测试

jax-rs jax-ws自从我们谈论测试和应用有效的TDD做法以来,已经有一段时间了,特别是与REST(ful) Web服务和API有关的做法。 但是,这个主题永远都不应忘记,特别是在每个人都在做微服务的世界中,无论…

手机流量共享 linux,linux – 通过HTB共享带宽和优先处理实时流量,哪种方案更好?...

我想在我们的互联网线路上添加一些流量管理.在阅读了大量文档之后,我认为HFSC对我来说太复杂了(我不了解所有曲线的东西,我担心我永远不会把它弄好),CBQ不推荐,基本上HTB就是通往适合大多数人.我们的内部网络有三个“段”,我想在这些段之间或多或少地分享带宽(至少在开始时).此…