【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 引脚的初始值(即初始状态为低电平还是高电平)

基本格式为:

属性名 = <&引脚组  引脚编号 初始状态>

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

led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>
  •  led-gpio:自定义属性名,后续在驱动代码会通过内核提供的 API 来获取到该属性
  • gpio1: 引脚所属组,定义在 imx6ull.dtsi 文件中。

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

五、代码整合

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

gpio-led {pinctrl-names = "default";                // pinctrl 子系统pinctrl-0 = <&pinctrl_gpio_leds>;led-gpio = <&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 */>;};}
}

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

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

相关文章

基于深度学习的森林火焰烟雾检测系统(含UI界面,yolov8、Python代码,数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主干c…

听GPT 讲Rust源代码--src/tools(18)

File: rust/src/tools/rust-analyzer/crates/ide-ssr/src/from_comment.rs 在Rust源代码中的from_comment.rs文件位于Rust分析器&#xff08;rust-analyzer&#xff09;工具的ide-ssr库中&#xff0c;它的作用是将注释转换为Rust代码。 具体来说&#xff0c;该文件实现了从注…

Django(二)

1.django框架 1.1 安装 pip install django3.21.2 命令行 创建项目 cd 指定目录 django-admin startproject 项目名mysite ├── manage.py [项目的管理工具] └── mysite├── __init__.py├── settings.py 【配置文件&#xff0c;只有一部分…

基于SpringBoot的考研专业课程管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

Docker命令集

一、常用命令: run run 从映像创建并运行新容器 $ docker run -it -v $(pwd):/home/zhangsan --name ohos ubuntu:20.04说明&#xff1a;命令表示创建一个名为ohos&#xff0c;系统镜像为ubuntu 20.04的容器&#xff1b;这个容器运行在交互模式下&#xff0c;并且将当前目录…

Mybatis Flex 常见用法

文章目录 Mybatis Flex 常见用法一、枚举二、自动填充2.1 方式一&#xff1a;Table 配置2.2 方式二&#xff1a;Column 配置 三、分页3.1 分页统一接口3.2 实现分页接口3.3 使用 四、关联查询4.1 RelationOneToOne&#xff1a;一对一4.1.1 单向关联4.1.2 双向关联 4.2 Relation…

在laravel 项目中 composer.json 中 autoload 配置是什么作用

在 Laravel 项目中&#xff0c;composer.json 文件是一个重要的文件&#xff0c;它用于定义项目依赖以及一些 Composer 的配置。其中 autoload 是一个键&#xff08;key&#xff09;&#xff0c;其下定义了如何自动加载 PHP 类库。 autoload 的作用是告诉 Composer 和 PHP 解释…

【krita】实时绘画 入门到精通 海报+电商+装修+修复手部

安装插件 首先打开comfyUI&#xff0c;再打开krita&#xff0c;出现问题提示&#xff0c; 打开 cd custom_nodes 输入命令 安装控件 git clone https://github.com/Acly/comfyui-tooling-nodes.git krita基础设置 设置模型 设置lora &#xff08;可设置lora强度 增加更多…

华纳云:怎么用python实现进程,线程和协程

在Python中&#xff0c;可以使用multiprocessing模块来创建进程&#xff0c;使用threading模块来创建线程&#xff0c;以及使用asyncio模块来创建协程。以下是简单的示例代码演示如何使用Python实现进程、线程和协程&#xff1a; 进程&#xff08;multiprocessing&#xff09;…

网站使用https认证

随着网络的普及和依赖程度的增加&#xff0c;网站安全性问题也日益凸显。为了确保用户和网站之间的数据传输安全&#xff0c;采用HTTPS认证已经变得至关重要。 1.数据安全是首要任务 在互联网上&#xff0c;信息传输是网站运作的基础。然而&#xff0c;未加密的传输容易受到中…

嵌入式中的基本定时器

学习目标 理解基本定时器的作用掌握定时器开发流程掌握基本定时器中断处理的操作流程掌握AHB和APB时钟查询方式理解周期,分频系数,周期计数,分频计数。掌握调试策略学习内容 基本定时器 只能用于定时计时操作,没有输出引脚通道的定时器,在GD32中, TIMER5和TIMER6为基本…

电子科大软件测试~第三次作业

第三次作业 第一题 采用JUnit软件测试框架进行测试程序编程&#xff0c;实现对下面java程序进行单元测试&#xff0c;找出其中缺陷。然后修改缺陷&#xff0c;直到通过单元测试&#xff0c;给出测试程序脚本和运行结果界面。 public class getMax {public int get_max(int x…

读取导入的excel表格内容,插入到表格,同时做去重,j前端通过js实现模糊查询

1.导入的excel模版 2.点击导入&#xff0c;显示excel导入弹窗 3.点击选择文件&#xff0c;会调用本地文件夹里面的excel文件 4.选中文件&#xff0c;点击 导入 html部分 <a-button type"primary" click"onImportXls">导入</a-button><…

初识Python之Networkx模块

初识Python之Networkx模块 文章目录 初识Python之Networkx模块简介安装Networkx导入模块、查看版本信息一些基本操作创建Graph添加边&#xff08;节点&#xff09;获取Graph的基本信息Graph的基本绘图 简单应用案例使用内置的Graph数据创建一个无向图创建一个有向图在计算机网络…

leetCode算法—14. 最长公共前缀

14.编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 难度&#xff1a;简单 * 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a…

LeetCode239. Sliding Window Maximum

文章目录 一、题目二、题解 一、题目 You are given an array of integers nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window m…

【halcon深度学习之那些封装好的库函数】find_dl_samples

函数简介 find_dl_samples 是一个用于检索满足特定条件的深度学习数据集样本索引的过程。让我们逐步详细解释它的输入参数和功能&#xff1a; Samples: 这是包含样本字典或样本字典元组的输入参数。这些样本是将要被搜索的对象。 KeyName: 用于指定要查找的条目的键名。在样本…

关于“Python”的核心知识点整理大全35

目录 13.3.4 重构 create_fleet() game_functions.py 13.3.5 添加行 game_functions.py alien_invasion.py 13.4 让外星人群移动 13.4.1 向右移动外星人 settings.py alien.py alien_invasion.py game_functions.py 13.4.2 创建表示外星人移动方向的设置 13.4.3 检…

【第七在线】可持续时尚与商品计划:减少库存浪费的方法

随着可持续时尚的崭露头角&#xff0c;服装企业越来越重视减少库存浪费。库存浪费不仅对环境造成负面影响&#xff0c;还对企业的经济可持续性产生负面影响。本文将深入探讨可持续时尚与商品计划之间的关系&#xff0c;以及一些减少库存浪费的方法&#xff0c;有助于改进商品计…

源码订货系统的优势

源码订货系统是一种企业购买后可以获得源代码的订货系统&#xff0c;它可以不受软件厂商的规模、发展而修改和使用。与SaaS订货系统相比&#xff0c;核货宝为您分享源码订货系统的四大优势&#xff1a; 一是开放性&#xff1a;源码订货系统是开源的&#xff0c;用户可以掌握源代…