xilinx linux AXI GPIO 驱动学习

vivado工程

vivado 配置一个 AXI GPIO, 全输出,宽度为1
在这里插入图片描述

设备树解读

生成的对应pl.dtsi设备树文件如下

		axi_gpio: gpio@40020000 {#gpio-cells = <2>;clock-names = "s_axi_aclk";clocks = <&clkc 15>;compatible = "xlnx,axi-gpio-2.0", "xlnx,xps-gpio-1.00.a";gpio-controller ;reg = <0x40020000 0x10000>;xlnx,all-inputs = <0x0>;xlnx,all-inputs-2 = <0x0>;xlnx,all-outputs = <0x1>;xlnx,all-outputs-2 = <0x1>;xlnx,dout-default = <0x00000000>;xlnx,dout-default-2 = <0x00000000>;xlnx,gpio-width = <0x1>;xlnx,gpio2-width = <0x1>;xlnx,interrupt-present = <0x0>;xlnx,is-dual = <0x1>;xlnx,tri-default = <0xFFFFFFFF>;xlnx,tri-default-2 = <0xFFFFFFFF>;};

根据 compatible = “xlnx,xps-gpio-1.00.a” 找到内核文档 Documentaion/devicetree/bindings/gpio/gpio-xilinx.txt

关注以下部分

- #gpio-cells : Should be two or three. The first cell is the pin number,The second cell is used to specify channel offset:0 - first channel8 - second channelThe third cell is optional and used to specify flags. Use the macrosdefined in include/dt-bindings/gpio/gpio.h
- gpio-controller : Marks the device node as a GPIO controller.

意思是需要至少两个参数,第一个是引脚号,第二个是用来指定通道,第三个参数可有可无,只是一个flag
而对于刚才生成的双通道axi gpio,引脚号从0开始,而第一个通道号为0,第二个为8

例如,可以这样访问

	name1-gpios = <&axi_gpio 0 0 GPIO_ACTIVE_LOW>;	name2-gpios = <&axi_gpio 0 8 GPIO_ACTIVE_HIGH>;

gpio驱动

先去看文档 Documentaion/gpio/consumer.txt
首先要 #include <linux/gpio/consumer.h>,定义了几个flags和重要的函数

The flags parameter is used to optionally specify a direction and initial value
for the GPIO. Values can be:
* GPIOD_IN to initialize the GPIO as input.
* GPIOD_OUT_LOW to initialize the GPIO as output with a value of 0.
* GPIOD_OUT_HIGH to initialize the GPIO as output with a value of 1.

flags 讲的就很清楚,设置flags 可以指定方向和初始值

使用GPIOs 部分解读

按照以前的理解,GPIO肯定要先初始化,再设置方向,再设置高低电平

Obtaining and Disposing GPIOs
=============================
Like many other kernel subsystems, gpiod_get() takes the
device that will use the GPIO and the function the requested GPIO is supposed to
fulfill:struct gpio_desc *gpiod_get(struct device *dev, const char *con_id,enum gpiod_flags flags)

也就是可以调用gpiod_get()函数来请求使用GPIO并实现某种功能
然后根据指示,通过 see Documentation/gpio/board.txt 来理解 the con_id parameter in the DeviceTree

假设有个设备树

	foo_device {compatible = "acme,foo";...led-gpios = <&gpio 15 GPIO_ACTIVE_HIGH>, /* red */<&gpio 16 GPIO_ACTIVE_HIGH>, /* green */<&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */power-gpios = <&gpio 1 GPIO_ACTIVE_LOW>;};

可以使用以下函数访问

struct gpio_desc *red, *green, *blue, *power;red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);
blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);

但是gpiod_get()还需要其他函数搭配使用吗?继续看

Using GPIOs
===========
Setting Direction
-----------------
The first thing a driver must do with a GPIO is setting its direction. If no
direction-setting flags have been given to gpiod_get*(), this is done by
invoking one of the gpiod_direction_*() functions:int gpiod_direction_input(struct gpio_desc *desc)int gpiod_direction_output(struct gpio_desc *desc, int value)

但是这里说,如果没有在调用gpiod_get*()函数时给一个 direction-setting flags,那就需要调用gpiod_direction_*() 这两个函数之一

换句话说,如果在调用gpiod_get*()函数时给一个 direction-setting flag,就不需要设置其他函数了

所以,gpiod_get*()函数 完成了三件事:申请使用GPIO,通过flags设置了方向并初始化值

重要函数

struct gpio_desc *devm_gpiod_get_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)
很多驱动文件里在用,文档里只提到了是一个变体函数,调用关系如下

devm_gpiod_get_optional -> devm_gpiod_get_index_optional -> //index为0 devm_gpiod_get_index -> gpiod_get_index

本质就是 gpiod_get_index

因此,对于我们的设备树

	name1-gpios = <&axi_gpio 0 0 GPIO_ACTIVE_LOW>;	name2-gpios = <&axi_gpio 0 8 GPIO_ACTIVE_HIGH>;

可以这么用

struct i2c_client *client;
struct gpio_desc name1_gpio;
name1_gpio = devm_gpiod_get_optional(&client->dev, "name1", GPIOD_OUT_HIGH);
if(IS_ERR(name1_gpio)){dev_err(&client->dev, "can't get %s name1 GPIO in DT\n", "name1");return PTR_ERR(name1_gpio);
}

做了几件事:

  1. 寻找设备树中有没有 name1-gpios
  2. 申请GPIO使用
  3. 通过 flag 初始化方向并设置高低电平

结束语

多看内核文档,多看参考驱动代码,多理解

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

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

相关文章

巧用cpl文件维权和免杀(上)

cpl文件 CPL文件&#xff0c;是Windows控制面板扩展项&#xff0c;CPL全拼为Control Panel Item在system32目录下有一系列的cpl文件,分别对应着各种控制面板的子选项 列入我们winR输入main.cpl 将会打开控制面板中的鼠标属性 cpl文件本质是属于PE文件 但cpl并不像exe,更像是dl…

SQL107 将两个 SELECT 语句结合起来(二)(不用union,在where里用or)

select prod_id,quantity from OrderItems where quantity 100 or prod_id like BNBG% order by prod_id;在where子句里使用or

金蝶云星空和管易云单据接口对接

金蝶云星空和管易云单据接口对接 对接系统&#xff1a;管易云 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌&#xff0c;先后开发了C-ERP、EC-OMS、EC-WMS、E店管家、BBC、B2B、B2C商城网站建设等产品和服务&#xff0c;涵盖电商业务全流程。 写入目标:金蝶云星空 金…

CentOS7安装mysql-5.7.44单机和主从复制

官网下载地址&#xff1a; https://downloads.mysql.com/archives/community/ 1、单机安装 安装依赖 yum -y install libaio 解压安装 tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gzmv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysqlcd /usr/local/mysql…

文件上传一-WEB攻防-PHP应用文件上传函数缺陷条件竞争二次渲染黑白名单JS绕过9

演示案例&#xff1a; PHP-原生态-文件上传-前后端验证PHP-原生态-文件上传-类型文件头验证PHP-原生态-文件上传-后缀黑白名单验证PHP-原生态-文件上传-解析配置&二次渲染PHP-原生态-文件上传-逻辑缺陷&函数缺陷 #学习前必读&#xff1a; 1、课前一定要明白&#xff1a…

蓝桥杯基础练习详细解析一(代码实现、解题思路、Python)

试题 基础练习 数列排序 资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第…

MySQL事务(超详细!!!)

目录 一、MySQL事务的概念 二、事务的ACID特点 1、原子性&#xff08;Atomicity&#xff09; 2、持久性 3、隔离性&#xff08;Isolation&#xff09; 3.1 事务的并发问题 ①、脏读(读取未提交数据) ②读已提交、不可重复读(前后多次读取&#xff0c;数据内容不一致) …

【Redis主从架构。主从工作原理psync、bgsave、部分数据复制、主从复制风暴解决方案】【Redis哨兵高可用架构。sentinel】

Redis主从架构 Redis主从工作原理数据部分复制 Redis哨兵高可用架构client连接哨兵规则主节点挂了&#xff0c;集群从新选择主节点&#xff0c;并且同步给sentinel 转自图灵课堂 redis主从架构搭建&#xff0c;配置从节点步骤&#xff1a; 1、复制一份redis.conf文件2、将相关…

美易官方:除了散户,对冲基金也在重返加密市场

高盛&#xff1a;除了散户&#xff0c;对冲基金也在重返加密市场 随着加密货币市场的逐渐成熟和技术的不断进步&#xff0c;越来越多的机构投资者开始重新审视加密货币市场。除了散户投资者外&#xff0c;对冲基金也在重返加密市场&#xff0c;成为市场的重要参与者之一。高盛作…

苹果手机强制重启方法大揭秘!不同机型多种方法一网打尽

随着苹果手机的普及&#xff0c;越来越多的人选择使用这款优秀的智能手机。然而&#xff0c;就像任何其他设备一样&#xff0c;苹果手机也可能会出现各种问题&#xff0c;例如系统崩溃、应用程序冻结或其他错误。在这种情况下&#xff0c;强制重启手机是解决问题的一个有效方法…

Pygame基础3-动画

3.动画 原理 动画是连续播放的图片。 使用精灵显示动画只需要在update()方法中改变精灵的图片。 需要注意的是播放速度&#xff0c;可以 通过pygame.time.get_ticks()来控制时间&#xff0c;但是这样比较复杂。最直接的方式是根据帧数来控制播放。每过n帧就切换一次图片。 …

linux系统--------------mysql数据库管理

目录 一、SQL语句 1.1SQL语言分类 1.2查看数据库信息 1.3登录到你想登录的库 1.4查看数据库中的表信息 1.5显示数据表的结构&#xff08;字段&#xff09; 1.5.1数据表的结构 1.5.2常用的数据类型: 二、关系型数据库的四种语言 2.1DDL&#xff1a;数据定义语言&am…

Web安全基础入门+信息收集篇

教程介绍 学习信息收集&#xff0c;针对域名信息,解析信息,网站信息,服务器信息等&#xff1b;学习端口扫描&#xff0c;针对端口进行服务探针,理解服务及端口对应关系&#xff1b;学习WEB扫描&#xff0c;主要针对敏感文件,安全漏洞,子域名信息等&#xff1b;学习信息收集方法…

SpringMVC | SpringMVC中的 “文件上传和下载”

目录: 一、文件上传1.1 文件上传“概述”1.2 文件上传“具体配置” :“前端”中配置“文件上传” ( type“file” 满足3个条件 )“后端”中配置“文件上传” ( 配置id为“CommonsMultipartResolver”的bean 配置“文件上传”的“约束条件” 通过“MultipartFile接口”参数接…

RabbitMQ 的高阶应用及可靠性保证

目录 一、RabbitMQ 高阶应用 1.1 消息何去何从 1.2 过期时间 1.3 死信队列 1.4 延迟队列 1.5 优先级队列 1.6 消费质量保证&#xff08;QOS&#xff09; 二、持久化 三、生产者确认 四、消息可靠性和重复消费 4.1 消息可靠性 4.2 重复消费问题 上篇文章介绍了 Rabb…

流畅的 Python 第二版(GPT 重译)(三)

第五章&#xff1a;数据类构建器 数据类就像孩子一样。它们作为一个起点是可以的&#xff0c;但要作为一个成熟的对象参与&#xff0c;它们需要承担一些责任。 马丁福勒和肯特贝克 Python 提供了几种构建简单类的方法&#xff0c;这些类只是一组字段&#xff0c;几乎没有额外功…

Linux 安装 JDK、MySQL、Tomcat(图文并茂)

所需资料 下载 1.1 软件安装方式 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照re…

美易官方:科技巨头涨势好标普指数年底前有望升至6000点

高盛&#xff0c;作为全球领先的金融机构之一&#xff0c;近日发布了一份报告&#xff0c;预测在科技巨头的涨势推动下&#xff0c;标普500指数年底前有望升至6000点。这一预测引起了市场的广泛关注&#xff0c;投资者们纷纷开始重新评估自己的投资策略。 David Kostin等策略师…

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习&#xff0c;切勿用于非法犯罪活动&#xff0c;对于恶…

202基于matlab的曲柄滑块机构的运动学仿真分析

基于matlab的曲柄滑块机构的运动学仿真分析&#xff0c;分析各个杆的速度、位移、加速度曲线&#xff0c;以及曲柄滑块机构的动画。程序已调通&#xff0c;可直接运行。 202 matlab 曲柄滑块机构 运动学仿真分析 - 小红书 (xiaohongshu.com)