pinctrl/gpio子系统(1)-pinctrl子系统介绍及驱动源码分析

news2024/9/20 5:51:24

1.简介

在如今的驱动开发工作中,实际上已经很少去对着寄存器手册进行驱动开发了,一般板子拿到手,已经有原厂的驱动开发工程师,在gpio子系统、pinctrl子系统中将自家芯片的引脚适配好了。
我们直接基于设备树已配置好的寄存器值,去使用子系统对应的API函数,就能快速完成驱动开发,不需要再那么关心IO寄存器的值,借助这种驱动分层的思想,快速完成驱动开发。

其中配置一个GPIO最重要的几点就是配置IO的MUX复用属性,PAD电气属性,输入及输出

pinctrl 子系统作用:从设备树中获取PIN 的复用(MUX)和电气属性(PAD),并完成初始化等,PIN 可复用为 I2C、SPI、GPIO,当复用为gpio的时候,就需要用到gpio子系统
gpio 子系统作用:方便开发者使用gpio,负责初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO 为输入输出,读取 GPIO 的值

1.1 pinctrl和gpio子系统分层思想

在加入gpio子系统和pinctrl系统后,对gpio的操作,将通过pinctrl子系统设置IO复用及电气属性配置,gpio子系统控制输入/输出,读取gpio值等。当原厂bsp工程师适配好设备树后,借助子系统去完成驱动开发将变的十分简单。
image.png
其中gpio子系统和pinctrl子系统的关系如下图,相互依赖密不可分。
image.png

2.pinctrl子系统

2.1驱动源码分析

那么以MX6UL_PAD_UART1_RTS_B__GPIO1_IO19这个引脚为例子,来解析如何使用设备树+设备驱动完成引脚配置。
例如,arch/arm/boot/dts/imx6ull.dtsi中,子节点iomuxc为:

iomuxc: iomuxc@020e0000 {
    compatible = "fsl,imx6ul-iomuxc";
    reg = <0x020e0000 0x4000>;
};

而在arch/arm/boot/dts/imx6ull-alientek-emmc.dts中,对iomuxc子节点进行修改

&iomuxc {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_hog_1>;
	imx6ul-evk {
		pinctrl_hog_1: hoggrp-1 {
			fsl,pins = <
				MX6UL_PAD_UART1_RTS_B__GPIO1_IO19	0x17059 /* SD1 CD */
				MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT	0x17059 /* SD1 VSELECT */
				MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID    0x13058 /* USB_OTG1_ID */
			>;
		};

其中MX6UL_PAD_UART1_RTS_B__GPIO1_IO19宏定义的具体含义,可以参考下下面的pinctrl配置信息,先不放这个章节

其中的compatible属性为fsl,imx6ul-iomuxc,那么Linux内核就会根据这个字段,查找相应的驱动文件。
全局搜索后找到drivers/pinctrl/freescale/pinctrl-imx6ul.c中的OF表有匹配的属性

static struct of_device_id imx6ul_pinctrl_of_match[] = {
	{ .compatible = "fsl,imx6ul-iomuxc", .data = &imx6ul_pinctrl_info, },
	{ .compatible = "fsl,imx6ull-iomuxc-snvs", .data = &imx6ull_snvs_pinctrl_info, },
	{ /* sentinel */ }
};

当设备和驱动匹配的时候,就会调用对应的probe成员函数,在其中完成PIN配置
image.png
随后调用pinctrl_register向Linux内核注册一个PIN控制器

imx_pinctrl_desc->name = dev_name(&pdev->dev);
imx_pinctrl_desc->pins = info->pins;
imx_pinctrl_desc->npins = info->npins;
imx_pinctrl_desc->pctlops = &imx_pctrl_ops;
imx_pinctrl_desc->pmxops = &imx_pmx_ops;
imx_pinctrl_desc->confops = &imx_pinconf_ops;
imx_pinctrl_desc->owner = THIS_MODULE;

ret = imx_pinctrl_probe_dt(pdev, info);
if (ret) {
    dev_err(&pdev->dev, "fail to probe dt properties\n");
    return ret;
}

ipctl->info = info;
ipctl->dev = info->dev;
platform_set_drvdata(pdev, ipctl);
ipctl->pctl = pinctrl_register(imx_pinctrl_desc, &pdev->dev, ipctl);
if (!ipctl->pctl) {
    dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
    return -EINVAL;
}

在其中的pctlops,pmxops,confops都是PIN的配置函数,借助这些函数来完成PIN 配置,其他的就留着之后再分析啦~

2.2pinctrl配置信息

宏定义MX6UL_PAD_UART1_RTS_B__GPIO1_IO19为:

#define MX6UL_PAD_UART1_RTS_B__GPIO1_IO19          0x0090 0x031C 0x0000 0x5 0x0

分别对应的值为:<mux_reg conf_reg input_reg mux_mode input_val>

则代表:
mux_reg:IO复用寄存器地址(MUX类) = 0x0090
conf_reg:io配置寄存器地址(PAD类)= 0x031C
input_reg:输入寄存器地址 = 0x0000
mux_mode:mux_reg寄存器值 = 0x5
input_val:input_reg值 = 0x0
0x17059:conf_reg寄存器值

如上面iomuxc节点的reg地址为0x020e0000,则代表MX6UL_PAD_UART1_RTS_B__GPIO1_IO19的复用寄存器地址为0x020e0000+0x0090=0x020e0090
image.png
mux_mode = 0x5 则代表io复用为GPIO1_IO19
image.png
conf_reg = 0x020e031C,寄存器地址为0x020e031C,值为0x17059

2.3添加pinctrl节点过程

多说不如多做,实战添加外设的pin信息。
iomuxc下imx6ul-evk节点添加pinctrl test子节点

pinctrl_test : testgrp {
    fsl,pins = <
        MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 config //待结合gpio子系统来添加具体值,这里先不写
        >;
};

这样就完成了一个gpio的pinctrl子系统配置。这里因为复用为gpio,所以需要用到gpio子系统,gpio子系统中再继续完成这个实战~

3.最后

哈喽~我是徐章鑫,沪漂嵌入式开发工程师一枚,立志成为嵌入式全栈开发工程师,成为优秀博客创作者,共同学习进步。
以上代码全部放在我私人的github地址,其中有许多自己辛苦敲的例程源码,供大家参考、批评指正,有兴趣还可以直接提patch修改我的仓库~:
https://github.com/Xuzhangxin
觉得不错的话可以点个收藏和star~

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

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

相关文章

jsonpath相关---JSONPath - 用于 JSON 的 XPath

一.简介 XML 的一个经常强调的优点是提供了大量工具来分析、转换和有选择地从 XML 文档中提取数据。XPath 就是这些强大的工具之一。 现在是时候想知道&#xff0c;是否需要像 XPath4JSON 这样的东西&#xff0c;以及它可以解决哪些问题。 无需特殊脚本&#xff0c;即可以交…

阿赵UE学习笔记——14、LOD

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的用法。这次看看虚幻引擎的Level Of Detail(LOD)的用法。 一、测试场景准备 用植物系统&#xff0c;在地形上面刷了好多草&#xff1a; 这个时候看一下网格&#xff0c;会发现网格比较多和密集。 …

中国的茶文化:历史、传统与生活

中国的茶文化&#xff1a;历史、传统与生活 一、引言 茶&#xff0c;这一神奇而古老的饮品&#xff0c;与中国的历史、文化和生活方式紧密相连。中国的茶文化&#xff0c;源远流长&#xff0c;博大精深&#xff0c;是中华文明的重要组成部分。它不仅是一种饮料&#xff0c;更是…

阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势

作者&#xff1a;张铭辉、泮圣伟 前言 随着春节大促即将到来&#xff0c;为了确保线上业务高效稳定地运行&#xff0c;电商企业大多会对旗下关键业务应用进行多轮测试。通过模拟线上较高流量的请求&#xff0c;来观察服务性能的实际表现。以某企业的业务测试报告举例&#xf…

vue-cli初始化项目很慢?

第一种情况 大部分是由于npm的镜像源不是淘宝的 cmd输入npm config get registry查看是不是淘宝的&#xff0c;是的话看第二种情况试试不是的话输入npm config set registry https://registry.npm.taobao.org 第二种情况 vue-cli配置文件不是使用淘宝镜像源的 找到文件.vue…

sklearn 计算 tfidf 得到每个词分数

from sklearn.feature_extraction.text import TfidfVectorizer# 语料库 可以换为其它同样形式的单词 corpus [list(range(-5, 5)),list(range(-6,4)),list(range(12)),list(range(13))]# corpus [ # [Two, wrongs, don\t, make, a, right, .], # [The, pen, is, might…

深入浅出HBase:一文理解HBase基础概念(列存储、时间戳、key-value)、架构特点以及适合的使用场景

文章目录 一. HBase 数据模型1. 行存储与列式存储1.1. 行存储1.2. 列存储 2. HBase 数据模型2.1. 模型概览2.2. 列与列族2.3. 时间戳&#xff1a;定义数据版本2.4. HBase的Key-Value 三. HBase架构1. HBase读写流程简述2. HRegionServer内部内部数据流转&#xff1a;HRegion &l…

SparkStreaming---入门

文章目录 1.SparkStreaming简介1.1 流处理和批处理1.2 实时和离线1.3 SparkStreaming是什么1.4 SparkStreaming架构图 2.背压机制3.DStream案例实操 1.SparkStreaming简介 1.1 流处理和批处理 流处理和批处理是两种不同的数据处理方式&#xff0c;它们在处理数据的方式和特点…

【GameFramework框架】一、框架介绍

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog…

Flink 读取 Kafka 消息写入 Hudi 表无报错但没有写入任何记录的解决方法

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

node,node-sass,sass-loader之间的版本关系

前言 安装配置node-sass 以及 sass-loader想必是很多前端的噩梦–一不小心又不成功还得装个半天。 下面说一下这个问题。 当然&#xff0c;你肯定遇到过&#xff1a; Node Sass version 9.0.0 is incompatible with ^4.0.0-这样的问题&#xff0c;这个也是因为三者关系对不上…

【HTML 基础】表单标签

文章目录 1. <form>2. <input>3. <select> 和 <option>4. <textarea>5. <button>结语 HTML 表单是互联网上交互性最强的元素之一&#xff0c;它允许用户输入、选择和提交数据。在这篇博客中&#xff0c;我们将介绍 HTML 中一些关键的表单标…

手把手教你写架构(java)篇

领取资源在文章末尾。 架构部分&#xff1a; 1. 分层架构&#xff08;Layered Architecture&#xff09;&#xff1a;将应用程序分解为多个逻辑层&#xff0c;每个层都有明确的职责。常见的分层包括表示层&#xff08;Presentation Layer&#xff09;、业务逻辑层&#xff08…

torchvision.models._utils.IntermediateLayerGetter()使用

torchvision.models._utils.IntermediateLayerGetter&#xff08;&#xff09;使用 源码如下&#xff1a; from collections import OrderedDictimport torch from torch import nnclass IntermediateLayerGetter(nn.ModuleDict):"""Module wrapper that ret…

电脑配置在哪里看?别错过这四个方法

在使用电脑的日常操作中&#xff0c;了解电脑的硬件和软件配置是解决问题、优化性能以及购买新硬件的关键。然而&#xff0c;对于一些用户来说&#xff0c;查看电脑配置可能是一个看似复杂的任务。幸运的是&#xff0c;有多种简便而直观的方法&#xff0c;让您能够轻松获取电脑…

【python】在python中使用单元测试unittest

在python中使用单元测试unittest 大家好&#xff0c;欢迎来到我的技术乐园&#xff01;今天&#xff0c;我们将一起踏入Python单元测试的奇妙旅程&#xff0c;探索这个让我们的代码更可靠、更强壮的令人愉快的世界。 前言&#xff1a;为什么单元测试如此重要&#xff1f; 在我…

如何访问 Oracle OKE 集群

OKE是Oracle Cloud提供的托管Kubernetes服务&#xff0c;为用户提供强大而灵活的容器编排平台。在本文中&#xff0c;我们将详细介绍如何有效地与OKE集群进行交互&#xff0c;包括访问集群的不同方式、管理访问权限以及执行常见操作的步骤。 1 安装oci命令 1.1 在Oracle Linux…

智慧城市行业盛会:2024北京国际智慧城市展览会(世亚智博会)

随着科技的飞速进步和人们生活水平的不断提高&#xff0c;智慧城市建设已经逐渐成为当今社会的重要议题。为了展示和推广国内外数字技术与新应用成果&#xff0c;引领数字产业发展新方向&#xff0c;积极推动5G、人工智能、大数据、云计算、物联网、移动互联网、元宇宙等新型数…

Java编程练习之类的封装

1.把一个Student类封装起来&#xff0c;模拟一个转校生转入新学校后为其制作学生信息的过程。运行结果如下&#xff1a; package zhtestdemo; import java.util.Scanner; import java.text.DecimalFormat; public class demo { //创建类&#xff0c;类名叫demo; private Stud…

Transformer 自然语言处理(二)

原文&#xff1a;Natural Language Processing with Transformers 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第五章&#xff1a;文本生成 基于 Transformer 的语言模型最令人不安的特点之一是它们生成的文本几乎无法与人类写的文本区分开。一个著名的例子是 Ope…