【Linux驱动】pinctrl 和 gpio子系统(一)—— pinctrl 节点解析,引入gpio子系统

裸机开发时,如果要点亮一个 LED,我们要做如下内容:

  1. 初始化时钟
  2. 设置引脚复用为哪个功能,配置引脚的电气属性
  3. 设置引脚的 IO 方向初始值

有了设备树以后,我们可以通过 pinctrl gpio 子系统来配置上述内容。

  • pinctrl 子系统:控制引脚的复用、电气属性
  • gpio 子系统:控制GPIO初始化(如设置 IO 方向、初始值)

一、pinctrl 配置节点

pinctrl 子系统用于配置复用为不同功能时的电气属性,这就需要找到一个名为  iomuxc 的节点,这个节点会在两个地方出现:一个是通用 dtsi 设备树文件(如 imx6ull.dtsi),一个是板级设备对应的 dts 文件(如imx6ull-alientek-emmc.dts)。

1、iomuxc 通用节点

在 imx6ull.dtsi 中定义了一个 iomuxc 通用节点,该节点包含了 iomuxc 控制器的基地址,一般用于控制引脚复用。但光从这里似乎看不出来,可以复用为哪些外设,不同板级设备的外设不一样,所以外设相关的具体内容不会放在这里。

注意:IOMUXC 除了 iomuxc 外,还包含 iomuxc_snvs、gpr

2、iomuxc 外设节点

具体的外设节点会放到对应板级设备的 .dts 文件中。&iomuxc 会找到通用节点中的 iomuxc,然后实际编译的时候会将两者的内容合并。后续将在这里为不同功能对应的引脚配置电气属性

二、添加 pinctrl 节点

1、创建节点

首先在板级设备的 dts 文件中找到 &iomuxc,这里板级设备对应的 dts 文件是 imx6ull-alientek-emmc.dts。我们在 imx6ul-evk 下创建一个节点,在其他地方我们将以 " &别名 " 的方式引用节点。 

&iomuxc {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_hog_1>;
	imx6ul-evk {
        // "别名:节点名 {}" 的格式目的是为了在其他地方通过别名引用这个节点
        // "节点名 {}" 的格式目的仅仅只是为了描述一些信息,无法在其他地方引用
        pinctrl_gpiotest: testgrp {
            // ... 
		};
    }
}

2、添加配置属性

配置属性解析

接下来我们要添加的属性名为  "fsl,pins" 。以 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 为例,MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 是一个属性名,也是宏定义,定义在 xxx-pinfunc.h 文件中(这里是 imx6ul-pinfunc.h),而 0x17059属性值

  • 前半部分 MX6UL_PAD_UART1_RTS_B 是需要配置的寄存器名称
  • 后半部分 GPIO1_IO19 是要复用成哪个功能,这里是复用成 GPIO1_IO19 功能来使用。

可以在 imx6ul-pinfunc.h 文件中找到 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 的宏定义,可以看到宏定义的内容分为了五部分:

#define MX6UL_PAD_UART1_RTS_B__GPIO1_IO19          0x0090 0x031C 0x0000 0x5 0x0
宏定义各个字段宏定义各个字段的值代表含义
<mux_reg>0x0090IOMUXC_SW_MUX_CTL 寄存器的偏移量
<conf_reg>0x031CIOMUXC_SW_PAD_CTL 寄存器的偏移量
<input_reg>0x0000input_reg 寄存器(若无该寄存器,默认为 0x0)
<mux_mode>0x5

IOMUXC_SW_MUX_CTL 寄存器的值

(即选择复用为哪个功能)

<input_val>0x0input_reg 寄存器的值

添加复用引脚配置属性

现在我们要复用为 GPIO1_IO03,因此需要在 imx6ul-pinfunc.h 文件中找到与 GPIO1_IO03 结尾的宏定义。赋予的电气属性值为 0x10b0。

&iomuxc {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_hog_1>;
	imx6ul-evk {
        pinctrl_gpiotest: testgrp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO03__GPIO1_IO03	0x10b0 		/* GPIO1_IO03 */
			>;
		};
    }
}

三、设备树引用 pinctrl 节点

1、pinctrl-names、pinctrl-x 解析

要引用  pinctrl 节点主要用到 pinctrl-names 属性和 pinctrl-x 属性。pinctrl-names 代表当前外设状态的名字,pinctrl-0 表示了当前状态下的配置方案。以下面这个为例

  • pinctrl-names 代表状态名为 "default"
  • pinctrl-0 代表 "default" 状态下对应的配置方案选择 pinctrl_hog_1,pinctrl_hog_1 就是在 iomuxc 下的一个 pinctrl 节点

当然,一次可以根据状态不同,配置不同的方案,以下面这个为例:

  • pinctrl-names 现在有三种状态,分别是 "default"、"state_100mhz"、"state_200mhz"
  • pinctrl-0 对应 "default" 状态的配置方案
  • pinctrl-1 对应 "state_100mhz" 状态的配置方案
  • pinctrl-2 对应 "state_200mhz" 状态的配置方案

2、引用节点

我们在根节点下新增一个 gpio-led 节点,在该节点中引入 pinctrl 节点

gpio-led {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_gpio_leds>;        // pinctrl_gpio_leds 是 iomuxc下添加的节点别名
	status = "okay";
};

四、设备树引入 gpio 子系统

上面已经通过 pinctrl 子系统快速配置引脚复用,而gpio 子系统的主要目的是快捷设置 gpio 引脚的初始值(即初始状态为低电平还是高电平)

基本格式为:

cd-gpios = <&引脚组  引脚编号 初始状态>

假设要将 gpio1 的第 3 号引脚设置为低电平,具体写法为: 

cd-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>
  • gpio1: 引脚所属组,定义在 imx6ull.dtsi 文件中。

  • GPIO_ACTIVE_LOW: 引脚状态的宏定义,表示低电平。高电平对应的宏定义为 GPIO_ACTIVE_HIGH

五、代码整合

最终引入 pinctrl 子系统和 gpio 子系统的节点模板为

gpio-led {
	pinctrl-names = "default";                // pinctrl 子系统
	pinctrl-0 = <&pinctrl_gpio_leds>;
	cd-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;    // gpio 子系统
	status = "okay";
};

其中 pinctrl_gpio_leds 的定义为: 

&iomuxc {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_hog_1>;
	imx6ul-evk {
        pinctrl_gpiotest: testgrp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO03__GPIO1_IO03	0x10b0 		/* GPIO1_IO03 */
			>;
		};
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++——C++11(2)

我在我的C异常博客中曾提到&#xff0c;对于异常的处理经常会导致内存泄漏问题&#xff0c; 一种解决方法是异常的重新抛出&#xff0c;还有一种就是RAII&#xff0c;那么RAII的思想体现 在C中就是智能指针&#xff0c;所以接下来我将简单的介绍&#xff0c;什么是RAII&#xf…

Day67力扣打卡

打卡记录 美丽塔 II&#xff08;前缀和 单调栈&#xff09; 链接 class Solution:def maximumSumOfHeights(self, maxHeights: List[int]) -> int:n len(maxHeights)stack collections.deque()pre, suf [0] * n, [0] * nfor i in range(n):while stack and maxHeights…

【Date对象】js中的日期类型Date对象的使用详情

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

LeetCode 热题100——单调栈

​ 个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 写在前面&#xff1a; 递增单调栈&#xff1a;栈中元素从栈底到栈顶依次增大 递减单调栈…

7-1 单身狗(PTA - 数据结构)

由于这道题在留的作业中&#xff0c;排序和查找都有&#xff0c;所以我先写这道题&#xff08;图的先放放&#xff09; “单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人&#xff0c;以便给予特殊关爱。 输入格式&#xff1a; 输入第一行…

Linux笔记---文件查看和编辑

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 cat (Concatenate and Display): more 和 less: nano 和 vim (文本编辑器): 结语 我的其他博客 前言 学习Linux命令行和文件…

C++实现位图

目录 一、什么是位图 二、位图类 1.参数及构造函数 2.set函数设置为1&#xff08;代表存在&#xff09; 3.reset函数设置为0&#xff08;代表不存在&#xff09; 4.test函数查看状态&#xff08;0还是1&#xff09; 三、位图的变形 一、什么是位图 位图这个词汇比较少见…

im6ull学习归纳总结(一)APP——04_文件IO

4.1文件从何而来 如图所示文件可以是 1真实文件保存在设备上 2内核提供的虚拟文件 3设备节点 4.2文件的访问方式 4.2.1通用IO模型&#xff1a;open/read/write/lseek/close 实验1 copy文件 代码 #include <sys/types.h> #include <sys/stat.h> #include <fc…

10 个顶级免费 Android 数据恢复软件可帮助恢复已删除的文件

不小心删除了手机上的一些重要数据或文件&#xff1f;这很不幸&#xff0c;但不要悲伤或放弃希望&#xff0c;因为仍有机会恢复它们。 10 个顶级免费 Android 数据恢复软件 虽然 Android 手机没有像 Windows 那样的回收站可以自动存储您删除的数据&#xff0c;但是有很多功能强…

大模型时代下的因果推断

导读&#xff1a;在数字化建设不断推进的今天&#xff0c;随着技术的不断发展&#xff0c;从统计学、机器学习、深度学习&#xff0c;再到因果学习&#xff0c;以及最新的热门大模型方向&#xff0c;九章云极DataCanvas始终紧贴最前沿的、最能助力企业和落地实践的方向&#xf…

合伙企业的优缺点是什么

合伙企业的优缺点是什么 一、合伙企业的优点 合伙企业在资本扩张方面较个人独资企业更有优势。个人独资企业仅有一个投资人&#xff0c;尽管存在整个家庭财产成为个人独资企业资本来源的情形&#xff0c;但该类企业资本规模相对较小、抗风险能力较弱。为扩张资本&#xff0c;单…

通过U盘:将电脑进行重装电脑

目录 一.老毛桃制作winPE镜像 1.制作准备 2.具体制作 下载老毛桃工具 插入U盘 选择制作模式 正式配置U盘 安装提醒 安装成功 具体操作 二.使用ultrasio制作U盘 1.具体思路 2.图片操作 三.硬盘安装系统 具体操作 示例图 ​编辑 一.老毛桃制作winPE镜像 1.制作准…

基本数据类型变量间的运算规则、基本数据类型与String的运算

目录 一、自动类型提升 二、强制类型转换 三、基本数据类型与String的运算 1 字符串类型&#xff1a;String 2 运算规则 在Java程序中&#xff0c;不同的基本数据类型&#xff08;只有7种&#xff0c;不包含boolean类型&#xff09;变量的值经常需要进行相互转换。转换的方…

产品原型设计软件 Axure RP 9 mac支持多人写作设计

axure rp 9 mac是一款产品原型设计软件&#xff0c;它可以让你在上面任意构建草图、框线图、流程图以及产品模型&#xff0c;还能够注释一些重要地方&#xff0c;axure rp汉化版可支持同时多人写作设计和版本管理控制&#xff0c;这款交互式原型设计工具可以帮助设计者制作出高…

playbook变量的使用(二)

接上一章&#xff1a; 内置变量 变量的过滤器 31.9 内置变量hostvars hostvars用来显示指定主机的 fact变量,用法如下。 1 hostvars[ 主机名 ].键值 此变量一般用于&#xff0c;当某个play的 hosts 中只写了A主机组&#xff0c;但是同时想在此play中显示B 主机组中的信息,这…

Gradle中 Implementation 与API 声明依赖方式的对比

在Gradle中&#xff0c;implementation和api是声明依赖的两种方式&#xff0c;它们在如何暴露依赖关系方面有所不同&#xff1a; Implementation: 当一个模块使用implementation声明依赖时&#xff0c;该依赖仅对声明它的模块可见。这意味着该依赖对于该模块的消费者是隐藏的。…

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#…

如何通过ssh管道传输文件到ubuntu

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 如何在window系统中&#xff0c;通过ssh将指定的文件传输到ubuntu中呢&#xff1f; 比较常用的有以下种方式&#xff1a; 共享文件夹借助工具&#xff0c; FileZillaMobaxtermWinSCPXshell XFTP samba互传PuTTY pscp 今天主要…

【Mode Management】CanSM详细介绍

1. Introduction and functional overview AUTOSAR BSW栈为每个通信总线指定一个总线特定的状态管理器。CANSM实现CAN总线的数据流控制。CanSM隶属于通信服务层。CanSM和通信硬件抽象层以及系统服务层交互。 CanSM只用用于控制CAN通信。CanSM的任务就是操作CanIf模块去控制一个…

Python中abstractmethod的使用教程

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;抽象类和抽象方法提供了一种强制子类实现特定方法的机制。abstractmethod是abc&#xff08;Abstract Base Classes&#xff09;模块中的一部分&#xff0c;它允许定义抽象方法&#xff0c…