Pinctrl子系统_05_Pincontroller构造过程情景分析

上一节我们了解了Pinctrl子系统主要的数据结构,要想更好的掌握Pinctrl子系统,还需要知道他的构造过程

本节我们就来分析一下Pinctrl子系统的构造过程。

以内核面向对象的思想,设备树可以分为两部分,左边是Pinctrl子系统节点,用来描述Pincontroller,右边是使用Pincontroller的设备,本节我们就来分析左边Pinctrller的构造过程

学习Pinctrl子系统时,抓住他的三大作用,就可以比较清楚的分析。

  1. 引脚的枚举与命名;
  2. 引脚复用;
  3. 引脚配置;

本节主要说明引脚的枚举与命名,他会涉及两种情况:单个引脚多个引脚(group)

以imx6ull为例。

单个引脚

根据 imx6ull 设备树中,Pinctrl 节点的 compatible 属性,可以找到对应的驱动文件。

对应的驱动文件是 pinctrl-imx6ul.c,对应的probe函数是 imx6ul_pinctrl_probe 函数。

从probe函数开始,分析一下处理流程:

data 如下,他有 pins npins 成员,分表描述 单个引脚 引脚个数

imx6ul_pinctrl_pads 是一个结构体数组,结构体类型为 pinctrl_pin_desc

可以看到,imx6ul_pinctrl_pads 的每一个元素,都描述了一个引脚。

接着上面的流程,imx6ul_pinctrl_probe 函数会调用 imx_pinctrl_probe 函数,并且会传入data数据(引脚数据)。

引脚的数据会被存入 pinctrl_desc 结构体 的 pins 和 npins 成员,这样 pinctrl_desc 就保存了单个引脚的信息。

也可以在开发板中查看描述的引脚个数:

cat /sys/kernel/debug/pinctrl/20e0000.iomuxc/pins

0~128,共描述了 129 个引脚。

多个引脚

对于多个引脚(group),情况则略有不同。

通常,我们有两种方法来描述多个引脚(group):

  1. 代码中写死;
  2. 设备树中描述;

对于 imx6ull 来说,是在设备树中描述,由代码分析设备树,来动态的构造这些 group 的信息。

imx_pinctrl_probe 函数中,会调用 imx_pinctrl_probe_dt 函数,这个函数就会解析设备树,动态的构造 group 信息。

先不分析源码,先来看一下板子中的group信息:

cat /sys/kernel/debug/pinctrl/20e0000.iomuxc/pingroups

可以看到,有很多组group,这些group的信息就来自设备树。

然后,我们需要当前使用的设备树文件。

在 arch/arm/boot/dts 路径下,有一个 100ask_imx6ull-14x14.dtb,这个就是我们当前使用的 dtb 文件:

使用 dtc 工具,根据 dtb 文件,反编译生成 dts 文件:

dtc -I dtb -O dts 100ask_imx6ull-14x14.dtb > test.dts

在 dts 文件中,根据 compatible "fsl,imx6ul-iomuxc",可以找到对应的 pinctrl 节点:

可以看到,设备树和设备中的 group 信息是一一对应的:

我们之前说,一组引脚可以用作功能A(function A),也可以用作功能B(function B)。

但是在imx6ull中,查看 /sys/kernel/debug/pinctrl/20e0000.iomuxc/pinmux-functions 文件,只显示了一种 functiono,imx6ul-evk,意思为 imx6ull 评估板,而不是具体说明功能的意思,这一点需要注意一下。(关于pinctrl的使用,每家厂商都各有不同,具体以代码实现为准。)

下面我们来看一下 imx_pinctrl_probe_dt 函数,imx_pinctrl_probe 函数中会调用 imx_pinctrl_probe_dt 函数,用来解析设备树,构造 group 信息,并且解析获得的信息都会存入一个 info 变量中,他是一个结构体指针,指向 imx_pinctrl_soc_info 结构体:

根据设备树信息,解析 imx_pinctrl_probe_dt 函数流程。

由于 iomuxc 节点下没有"fsl,pins",而 iomuxc  节点的子节点,imx6ul-evk 节点的子节点中有 "fsl,pins",所以 imx_pinctrl_dt_is_flat_functions 会返回 false,所以 nfuncs = 1,即 function 数量为1。

保存 funtion 数量:

计算所有 function 中的 group 总数,并且为这些 group 分配内存空间,由于只有一个function imx6ul-evk,所以这里实际就是计算 imx6ul-evk 节点的子节点数

分配完空间,对于每个 function,调用 imx_pinctrl_parse_functions 函数,根据节点数据,解析funtion 信息:

解析一下 imx_pinctrl_parse_functions 函数,在 imx_pinctrl_parse_functions 函数中,最终会调用 imx_pinctrl_parse_groups 函数,来解析获取 group 信息:

imx_pinctrl_parse_groups 函数中,类似的,最终会调用 imx_pinctrl_parse_pin_mem 函数来解析引脚:

imx_pinctrl_parse_pin_mem 函数中,则会根据 "fsl,pins"属性的值,来填充 imx_pin_memmap 结构体:

大致总结如下图:

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

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

相关文章

毕业论文降重(gpt+完美降重指令),sci论文降重gpt指令——超级好用,重复率低于4%

1. 降重方法:gpt降重指令 2. gpt网站 https://yiyan.baidu.com/ https://chat.openai.com/ 3. 降重指令——非常好用!!sci论文,本硕大论文都可使用! 请帮我把下面句子重新组织,通过调整句子逻辑&#xff0…

牛客NC218 检测循环依赖【中等 图 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/8dc02ad98553432a90affc3a0484910b 思路 图的基本知识要理解,一般用Map来表示 图解决拓扑排序,依赖之类的问题 感觉课程数在这道题里面可以不用,因为没有规定所有课程都得有先…

解决方案Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.

文章目录 一、现象二、解决方案 一、现象 当安装好JDK跟neo4j,用neo4j.bat console来启动neo4却报错: 部分报错信息: Starting Neo4j. WARNING! You are using an unsupported Java runtime. Please use Oracle Java™ 11, OpenJDK™ 11 t…

Jenkins中使用Generic Webhook Trigger插件实现持续集成

项目环境 宝塔Linux面板DockerJenkinsgitee 目的 实现每次push推送dev分支到gitee上,Jenkins自动构建项目;push其它分支时,不运行。 实现方法 1.在Jenkins上安装Generic Webhook Trigger插件 在“系统设置–插件管理–可选插件”界面搜…

jmeter中参数加密

加密接口常用的方式有: MD5,SHA,HmacSHA RSA AES,DES,Base64 压测中有些参数需要进行加密,加密方式已接口文档为主。 MD5加密 比如MD5加密的接口文档: 请求URL:http://101.34.221…

STM32 | Systick定时器(第四天源码解析)

STM32 | Systick定时器(第四天)STM32 | STM32F407ZE中断、按键、灯(续第三天)1、参考delay_us代码,完成delay_ms的程序 定时器频率换算单位:1GHZ=1000MHZ=1000 000KHZ = 1000 000 000HZ 定时器定时时间:计数个数/f(频率) 或者 (1/f(频率))*计数的个数 500/1MHZ = 500/1…

Spring相关框架八股

单例bean是线程安全的吗? AOP 事务失效 Bean生命周期 Bean循环依赖解决 MVC执行流程 自动装配原理 Spring常见注解 SpringMVC注解 SpringBoot注解 MyBatis执行流程 MyBatis延迟加载 MyBatis缓存 SpringCloud五大组件 注册中心Nacos、Eureka 负载均衡Ribbon 服务雪崩…

Godot.NET C# 工程化开发(1):通用Nuget 导入+ 模板文件导出,包含随机数生成,日志管理,数据库连接等功能

文章目录 前言Github项目地址,包含模板文件后期思考补充项目设置编写失误环境visual studio 配置详细的配置看我这篇文章 Nuget 推荐NewtonSoft 成功Bogus 成功Github文档地址随机生成构造器生成构造器接口(推荐) 文件夹设置Nlog 成功!Nlog.configNlogHe…

2025汤家凤考研数学视频,基础网课百度网盘课程+PDF讲义资料

2025汤家凤大神及数学全程 docs.qq.com/doc/DTmtOa0Fzc0V3WElI 复制粘贴到浏览器,可以见所有的Ke 第一轮 夯实基础 1.阅读大纲考查要求,明确每章的学习目标; 2.按节学习数学理论基础知识,吃透书中例题; 3.学习每章…

红外遥控器的使用和详细解释

infrared.c #include "infrared.h"/* 红外 --- PA8*/void Infrared_Init(void) {GPIO_InitTypeDef GPIO_InitStruct; EXTI_InitTypeDef EXTI_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;//使能SYSCFG时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, E…

【数据结构】五分钟自测主干知识(十)

上一节,我们讲述了二叉树的概念,二叉树又有什么基本操作呢?今天我们来讲述二叉树的应用~ 话不多说,书继上回 5.3二叉树的遍历及应用 二叉树由三个基本部分组成:根结点(D),左子树&a…

ForkJoinPool在生产环境中使用遇到的一个问题

1、背景 在我们的项目中有这么一个场景,需要消费kafka中的消息,并生成对应的工单数据。早些时候程序运行的好好的,但是有一天,我们升级了容器的配置,结果导致部分消息无法消费。而消费者的代码是使用CompletableFutur…

综合知识篇21-项目管理考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

数据结构:插入排序,希尔排序(缩小增量排序)

1.直接插入排序 当插入第 i 个元素时,前面的数据已经排好序了,将后续的数据按大小插入到前面已经排好序的数组中,就是插入排序 特点 1.元素集合越接近有序,时间效率越高 2.时间复杂度O(N^2) 3.空间复杂度O(1) //插入排序 void InsertSort(int* a, int length) {for (int …

2021年XX省赛职业院校技能大赛”高职组 计算机网络应用赛项 网络构建模块竞赛真题

“2021年XX省赛职业院校技能大赛”高职组 计算机网络应用赛项 网络构建模块竞赛真题 目录 一.考试说明 1 二.模块B网络构建 2 (一)任务描述 2 (二)任务清单 9 一.考试说明 本模块比赛时间为…

腾讯云服务器价格查询系统,2024年1年、3年和5年活动价格表

腾讯云服务器多少钱一年?61元一年起。2024年最新腾讯云服务器优惠价格表,腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

windows11 openssh服务开启;第三方ping不通局域网windows电脑;ssh连接内部ubuntu系统

参考:https://blog.csdn.net/2301_77554343/article/details/134328867 1、windows11 openssh开启 1)我这边可选功能在设置-系统里面;其他网上看在应用下;添加可选openssh服务器安装 2)安装后打开,管理员…

vscode的一些技巧

技巧1:调试时传参数 在launch.json的configuration中"pwd"或者"program"选项之后添加如下选项: “--args”:["参数1", "参数2", ..., "参数3] 参数之间使用逗号隔开 技巧2:断点 普通断点使…

数据结构:选择排序,快速排序

1.选择排序 直接遍历数组,找出最大值和最小值,记录下标,将最大值和最小值分别与首位交换 但是由于当begin maxi时,会导致出错,因此需要 if 特殊判断 void Swap(int* a, int* b) {int temp *a;*a *b;*b temp; }void SelectSort(int* a, int n) {int begin 0;int end n …

谷歌地球三维模型下载软件更新

收费软件,白嫖党勿扰 收费金额2000元 1 概述 之前写过一篇《谷歌模型下载》的文章,反馈特别好。我也很欣慰,能够帮到一些同学。但是,有同学反应,软件确实帮了大忙,就是使用起来较麻烦,于是&…