在ZYNQ-Linux下操作GPIO和VDMA

这篇具有很好参考价值的文章主要介绍了在ZYNQ-Linux下操作GPIO和VDMA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 概述

此前的文章介绍如何利用petalinux定制ZYNQ-Linux操作系统。当ZYNQ-Linux系统搭建完毕后,需要在这个系统上开发应用程序以完成特定任务,这里面就涉及到如何在ZYNQ-Linux系统上去操作系统硬件资源的问题。目前,网上介绍的比较多的是需要改写Linux操作系统底层的设备树,并编写设备的驱动程序,这样的好处是可以提供一个统一的硬件接口,做到软硬件分离,可以更好地去保护硬件资源,但是实际操作对于初学者来说比较复杂。
本文将介绍一种简单的操作硬件方法,对于一些简单应用,可以直接操作系统的硬件资源,读写寄存器,不需要改写设备树和编写驱动程序。本文将以操作GPIO和操作VDMA两个例子做说明。

2. GPIO操作

本次操作利用GPIO实现LED的点亮及熄灭。硬件如下图所示,LED和ZYNQ的MIO7引脚进行相连。
vdma驱动,fpga开发,linux

2.1 确定编号

在目标板的系统中进行入/sys/class/gpio​中查看第一个IO设备的编号,从下图可以看出笔者的目标板第一个IO设备的编号为906
vdma驱动,fpga开发,linux

2.2 初始化

初始化的代码如下

FILE *fp = NULL;
char path[64];
int led_num = 913;

fp = fopen("/sys/class/gpio/export", "w");
if (fp == NULL)
	perror("export open filed");
else
	fprintf(fp, "%d", led_num); //创建接口
fclose(fp);

memset(path, 0, sizeof path);
snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction", led_num); //将可变参数格式化成字符串存入path[]

fp = fopen(path, "w");
fprintf(fp, "out"); //设置为输出
fclose(fp);

初始化过程完成了两件事,一个是创建了接口,一个是设置了接口的输入和输出特性。

2.3 操作GPIO

操作GPIO,控制LED灯的亮灭。

FILE *fp = NULL;
int led_num = 913;
char path[50] = {
   "\0"};

sprintf(path, "/sys/class/gpio/gpio%d/value", led_num);
fp = fopen(path, "w");
fprintf(fp, "%d", 1); // LED亮
//fprintf(fp, "%d", 0); // LED灭
fclose(fp);

跟前面设置GPIO特性一样,对于GPIO的操作,同样也是基于一个文件操作。

3. VDMA操作

本次操作利用VDMA将LMH0341接收到视频写入到DDR内存中,再从内存从读取并通过LMH0340进行输出。ZYNQ的模块连接图如下图所示。
vdma驱动,fpga开发,linux

3.1 设置VDMA

首先需要确认VDMA地址,可以利用vivado软件查看VDMA,打开vivado软件并选择Address Editor选项卡可以看到VDMA的地址。如下图。
vdma驱动,fpga开发,linux
VDMA的设置如下
vdma驱动,fpga开发,linux
LMH0341接收的数据是10Bit的宽度,一个像素值的数据长度是20Bit,所以stream data width设置为24,内部memory map data width设置32。帧缓存的深度设置为3帧。

3.2 VDMA操作代码

VDMA实现视频数据搬运的代码如下。文章来源地址https://www.toymoban.com/news/detail-757459.html

#include <QCoreApplication>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <pthread.h>

/* Register offsets */
#define OFFSET_PARK_PTR_REG                     0x28
#define OFFSET_VERSION                          0x2c

#define OFFSET_VDMA_MM2S_CONTROL_REGISTER       0x00
#

到了这里,关于在ZYNQ-Linux下操作GPIO和VDMA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux驱动开发】011 gpio子系统

    前面我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。   Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于

    2024年02月03日
    浏览(45)
  • 【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

    代码自取 【14.key_tree_pinctrl_gpios_interrupt】: https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数: 1. of_gpio_count (获得GPIO的数量) 2. kzalloc (向内核申请空间) 3. of_get_gpio (获取GPIO子系统标号) 4. gpio_to_irq (根据GPIO子系统标号得到软件中断号) 5. request_irq (根据软件中断号

    2024年02月12日
    浏览(49)
  • <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的beep驱动

    <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的beep驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分) <Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分

    2024年02月13日
    浏览(38)
  • 【Linux驱动开发】012 gpio子系统API函数

    设置好设备树以后, 在驱动程序中就可以使用 gpio 子系统提供的 API 函数来操作指定的 GPIO, gpio 子系统向驱动开发人员屏蔽了具体的读写寄存器过程。这就是驱动分层与分离的好处,大家各司其职,做好自己的本职工作即可。 gpio 子系统提供的常用的 API 函数有下面几个:

    2023年04月18日
    浏览(40)
  • Linux驱动开发之【pinctrl和gpio子系统】

    目录 一、 pinctrl和gpio子系统 1.pinctrl子系统 1.1 pinctrl子系统简介 1.2 pinctrl子系统驱动 1.3 设备树中添加pinctrl节点模版 2. gpio子系统 2.1 gpio子系统简介 2.2 gpio子系统驱动 2.3 gpio子系统API函数 2.4 设备树中添加gpio节点模板 2.5 与gpio相关的OF函数 3. 驱动程序编写 3.1 驱动入口函数 3

    2024年02月06日
    浏览(42)
  • 【Linux驱动开发】013 与gpio相关的OF函数 一、前言

    在上节,我们提供了驱动中gpio子系统相关的API函数,主要用来申请释放gpio、设置gpio输入输出、获取设置gpio的值。 我们进行上述设置的前提是:在驱动程序中需要读取 gpio 属性内容。为此,Linux 内核提供了几个与 GPIO 有关的 OF 函数。 用于统计设备树某个属性里面定义了几个

    2024年02月14日
    浏览(47)
  • 【IMX6ULL驱动开发学习】09.Linux驱动之GPIO中断(附SR501人体红外感应驱动代码)

    Linux驱动的GPIO中断编程主要有以下几个步骤: 1、 通过GPIO号获取 软件中断号 (中断编程不需要设置GPIO输入输出,当然申请GPIO,设置输入也没问题) 参数 含义 gpio GPIO引脚编号 2、 注册 中断处理函数 ,设置中断 触发方式 (上升沿、下降沿等) 参数 含义 irq 软件中断号(通过

    2024年02月11日
    浏览(53)
  • zynq 使用AXI_dma 传输==pl到ps,linux驱动开发,应用层处理DMA数据

    在使用zynq输出处理时,会使用到pl和ps的数据传输,可供使用的方案有多种,由于我们的数据量较大打算,因此使用用以下两种方案处理: 1.使用pl直接写ddr3, 2.使用dma, 本次详细介绍使用axi_dma如何将pl的数据在linux应用层接收数据并处理,以及遇到的问题 fpga工程,我们使用

    2024年02月03日
    浏览(54)
  • 【嵌入式Linux内核驱动】04_Jetson nano GPIO应用 | 驱动开发 | 官方gpiolib、设备树与chip_driver

    0.暴露给应用层 应用 解决调试目录为空的问题 调试信息 1.最简读写文件(在/SYS下) 设备树 验证测试 编译文件 驱动 of_get_named_gpio_flags //获取设备树节点的属性 gpio_is_valid //判断是否合法 devm_gpio_request //申请使用gpio,并调用设置pinctrl device_create_file //根据设备树节点属性,创建

    2024年02月07日
    浏览(57)
  • Zynq和FPGA区别——快速认识Zynq开发

    ZYNQ包含了2个部分,双核的ARM和FPGA。根据Xilinx提供的手册,用ARM实现的模块被称为PS,而用FPGA实现的模块被称为PL。简单的说FPA更偏向于逻辑,不跑系统。 ZYNQ内部包含PS和PL两部分,ZYNQ开发有一下四种方式: ZYNQ是赛灵思公司(Xilinx)推出的新一代全可编程片上系统,它将处

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包