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

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.mzph.cn/news/658535.shtml

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

相关文章

计算机网络_1.4 计算机网络的定义和分类

1.4 计算机网络的定义和分类 一、计算机网络的定义&#xff08;无唯一定义&#xff09;二、计算机网络的分类&#xff08;从不同角度分类&#xff09;1、交换方式2、使用者3、传输介质4、覆盖范围5、拓扑结构 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 一、计算机…

【MySQL】学习并使用聚合函数和DQL进行分组查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-t8K8tl6eNwqdFmcD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

飞桨大模型分布式训练技术

今天我为大家介绍飞桨大模型分布式训练技术&#xff0c;内容分为以下几个部分&#xff1a; 首先&#xff0c;我会介绍大模型训练面临的重点难题&#xff1b;然后&#xff0c;为大家介绍飞桨在大模型训练领域的特色分布式训练技术和优化方案&#xff1b;最后&#xff0c;伴随着…

ONLYOFFICE | 免费开源办公神器新选择

目录 前言&#xff1a; 1、什么是ONLYOFFICE&#xff1f; 2、ONLYOFFICE下载使用 3、ONLYOFFICE团队协作云办公功能 4、ONLYOFFICE 8.0新版本的亮点功能 4.1、显示协作者头像 4.2、插件 UI 界面更新 4.3、可填写的 PDF 表单 5、最后 前言&#xff1a; 一个好的开发工具…

blender关于几何接近(geometry proximity)节点的理解

如图&#xff0c;可以见到&#xff0c;我输入了一个立方体&#xff0c;一个圆锥体&#xff0c;为了便于区分 &#xff0c;将原生的立方体与圆锥转为了曲线&#xff0c;而进行了几何接近处理的网格不进行此转换。 几何接近的输入端&#xff0c;分为target&#xff08;目标&…

Adobe Photoshop 2024 v25.4.0 - 专业的图片设计软件

Adobe Photoshop 2024 v25.4.0更新了&#xff0c;从照片编辑和合成到数字绘画、动画和图形设计&#xff0c;任何您能想象到的内容都能通过PS2024轻松实现。 利用人工智能技术进行快速编辑。学习新技能并与社区分享您的工作。借助我们的最新版本&#xff0c;做令人惊叹的事情从未…

更改远程桌面网关端口和远程Web应用程序端口

很多玩Home-Lab的小伙伴会使用远程桌面网关&#xff08;Remote Desktop Gateway&#xff09;来安全远程家庭内网的计算机&#xff0c;但由于国内电信法律法规的原因&#xff0c;普通家庭宽带并不能使用默认的443端口&#xff08;TCP&#xff09;和3391端口&#xff08;UDP&…

qt-C++笔记之QStringList、QList<QString>、QString、QChar、QList<QChar>区别

qt-C笔记之QStringList、QList、QString、QChar、QList区别 —— 杭州 2024-01-30 凌晨0:27 参考博文&#xff1a;qt-C笔记之QStringList code review! 文章目录 qt-C笔记之QStringList、QList<QString>、QString、QChar、QList<QChar>区别1.Qt的字符容器类1.QSt…

postgresql 查询缓慢原因分析

pg_stat_activity 最近发现系统运行缓慢&#xff0c;查询数据老是超时&#xff0c;于是排查下pg_stat_activity 系统表&#xff0c;看看有没有耗时的查询sql SELECT pid, state, query, query_start, backend_type FROM pg_stat_activity WHERE state active AND query LIK…

Android 使用高德地图

一、获取高德平台key 【1】基于application包名&sha1值在高德控制台获取key值&#xff0c;详情参考&#xff1a; 获取Key-创建工程-开发指南-Android 地图SDK | 高德地图API 【2】在manifest中声明权限 【3】将拿到的key值在manifest中进行声明 <!--允许程序打开网络…

git clone常见问题一览及解决方法

在使用Ubuntu下&#xff0c;终端运行git clone命令时会遇见许多问题&#xff0c;本文主要针对一些常见的问题进行整理。关于换源问题&#xff0c;推荐使用小鱼的一键换源。 1.git clone 速度过慢 1.1 魔法 这个方法不做过多赘述&#xff0c;ubuntu下个人使用发现体验良好&am…

【Java】创建一个SpringBoot项目

软件版本&#xff1a;IDE专业版 一、创建 创建项目时&#xff0c;要注意的有下面几点 1、 为了使用JDK1.8&#xff0c;我们在创建时用阿里云国服&#xff0c;将Server URL &#xff1a; https://start.spring.io/ 或者http://start.springboot.io/更改为&#xff1a;https:/…

Roxlabs全球IP代理服务:解锁高效数据采集与网络应用新境界

引言 在这个数字化迅速发展的时代&#xff0c;数据采集和网络应用的重要性显得愈发突出。江苏阿克索网络科技有限公司旗下的Roxlabs&#xff0c;以其卓越的全球IP代理服务&#xff0c;正引领着这一领域的创新和发展。Roxlabs不仅提供遍及200多个国家和地区的高质量动态住宅IP资…

Java基础—面向对象—19static关键字详解、抽象类、接口、N种内部类

1、static关键字 匿名代码块、静态代码块、构造方法 静态代码块是在类加载的时候执行&#xff0c;仅执行一次 匿名代码块在调用构造函数之前 验证如下图&#xff1a; 2、静态导入包&#xff08;可能很多人听都没听过&#xff09; 3、Math是用final关键字的&#xff0c;fina…

日调用量超千万,超低查询延迟!跨越速运基于Flink + OceanBase的实时分析解决方案与实践

跨越速运成立于 2007 年&#xff0c;是一家在物流行业颇具影响力的大型综合速运企业。随着国内经济的持续增长&#xff0c;消费者的购物习惯也在不断变化&#xff0c;对物流行业的需求呈现爆发式增长。目前&#xff0c;跨越速运的服务已经覆盖全国 99% 的城市&#xff0c;年服务…

边缘计算第二版——第5章 边缘计算系统平台

5.3 面向智能家居的边缘计算系统 5.3.1 为什么要用EdgeOsH 智能家居的定义&#xff1a;一个自动化且智能的家居环境&#xff0c;使得居住者能够享受更健康、更舒适的生活。为了满足和改善居住者的生活方式&#xff0c;智能家居应该同时具备自我意识、自我管理、自我学习的能力…

【项目管理】整合管理

一、管理基础 1、项目整合管理由项目经理负责&#xff0c;项目经理负责整合所有其他知识领域的成果&#xff0c;并掌握项目总体情况。项目整合管理的责任不能被授权或转移&#xff0c;项目经理必须对整个项目承担最终责任。整合是项目经理的一项关键技能。执行项目整合时项目经…

java学习_数组

数组的储存原理 java内存分配数组名.length动态初始化数组的初始化 静态初始化 数组的长度eg. b.应用举例 c.在java中多个数组之间是可以相互赋值的。 eg. int []arr2 {1,2,3,4,5,6,7} int [] arr1arr2; 数组案例&#xff1a; 数组的初始化数组的访问数组的遍历 importjava.…

AIGC项目——Meta:根据对话音频生成带动作和手势的3d逼真数字人

From Audio to Photoreal Embodiment: Synthesizing Humans in Conversations From Audio to Photoreal Embodiment:Synthesizing Humans in Conversations 从二元对话的音频中&#xff0c;我们生成相应的逼真的面部、身体和手势。 概括性:角色是由作者的声音驱动的(而不是模…