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

news2024/11/16 12:28:32

上一节我们了解了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 结构体:

大致总结如下图:

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

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

相关文章

nodejs+vue高校师资管理系统python-flask-django-php

快速发展的社会中,人们的生活水平都在提高,生活节奏也在逐渐加快。为了节省时间和提高工作效率,越来越多的人选择利用互联网进行线上打理各种事务,然后线上管理系统也就相继涌现。与此同时,人们开始接受方便的生活方式…

002- 用 AutoCoder 添加和修改代码

实际上 AutoCoder 最适合的场景是修改代码,因为它最原始的功能是把源码你指定的文档搜索引擎搜集到的资料和你的需求生成一个prompt给到大模型。 此外纠正大家一个观点, AutoCoder 不是一句话给你创建一个网站抑或一个大型的项目。我们是帮助研发或者产品…

移植 Zephyr 到 Art-Pi

背景 ​ 最近工作中接触到了 Zephyr,不由觉得 Zephyr 是个很强大、全面、优秀的实时操作系统,但同时是有一定的上手难度的,其复杂的构建系统让小编倒吸一口凉气。为了深入研究并完全掌控 Zephyr,小编决定把它移植到手头的开发板上…

Java八股文(SpringCloud)

Java八股文のSpringCloud SpringCloud SpringCloud 什么是Spring Cloud? Spring Cloud是一个用于构建分布式系统的开发工具箱,它基于Spring Boot框架,提供了一系列的组件和工具,用于帮助开发者快速搭建和管理分布式系统中的各种常…

Spring相关框架八股

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

Android 你遇到的无障碍onGesture不执行

你是不是和我一样,在开发无障碍应用的时候,翻边了Android的AccessibilityService源码 但是就是发现不了onGesture不执行的原因? 你是不是和我一样,在好多测试手机之间徘徊,发现还是不执行? 你是不是和我一…

2024内蒙古等保备案办理流程指引

网络安全已成为国家、企业和个人共同关注的焦点。所以积极办理等保备案是非常重要的。本文将详细介绍办理内蒙古企业办理等保备案的流程,帮助读者了解并顺利完成相关手续。仅供参考哦! 2024内蒙古等保备案办理流程指引 办理时间:周一到周五工…

PostgreSQL11 | Windows系统安装PostgreSQL

本教程选取与参考书籍《PostgreSql11 从入门到精通》(清华大学出版社)的11大版本最新小版本11.22的安装作为教程案例 下载 下载PostgreSQL installer 下载到本地 安装 运行安装引导器 中国地区语言选项(暂时) Chinese(Simplifie…

OpenHarmony IDL工具规格及使用说明书(仅对系统应用开放)

IDL接口描述语言简介 当客户端和服务器进行IPC通信时,需要定义双方都认可的接口,以保障双方可以成功通信,OpenHarmony IDL(OpenHarmony Interface Definition Language)则是一种定义此类接口的工具。OpenHarmony IDL先…

io流的学习4

字符缓冲流 原理:底层自带了长度为8192的缓冲区提高性能。 import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class BufferedStringdemo01 {public static void main(String…

【旅游景点项目日记 | 第二篇】基于Selenium爬取携程网景点详细数据

文章目录 3.基于Selenium爬取携程网景点详细数据3.1前提环境3.2思路3.3代码详讲3.3.1查询指定城市的所有景点3.3.2获取详细景点的访问路径3.3.3获取景点的详细信息 3.4数据库设计3.5全部代码3.6效果图 3.基于Selenium爬取携程网景点详细数据 3.1前提环境 确保安装python3.x环…

HCIP的学习(4)

GRE和MGRE VPN---虚拟专用网络。指依靠ISP或其他公有网络基础设施上构建的专用的安全数据通信网络。该网络是属于逻辑上的。​ 核心机制—隧道机制(封装技术) GRE—通用路由封装 ​ 三层隧道技术,并且是属于点到点的隧道。 [r1]interface T…

1+x中级题目练习复盘(九)

注解和注释是两种完全不同的语法,注解可以为程序增加额外的功能,或为程序添加元数据。 函数式接口是指有且只有一个抽象方法的接口; 函数式接口可以使用 FunctionalInterface 进行标注,但不是必须的。除了 “java.util.function…

zabbix安装及使用(错误及解决方案)

安装zabbix 常见错误: Zabbix下载错误 6.0与5.0版本冲突 解决方法 yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-get --skip-broken zabbix6.0-web 自己有数据库,使用以下命令 pid找不到 /var/log/zabbix/zabbix_server.log 错误&a…

[AutoSar]BSW_Com020 Handle_ID,Global_PDU,Local_PDU的联系

目录 关键词平台说明一、概念二、API的使用和形参三、Handle ID 唯一性特例四、PDU和handle ID关联用例 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector , EB芯片厂商TI 英飞凌编程语言C,C编译器HighTec (…

电子电器架构 —— 诊断数据DTC具体故障

电子电器架构 —— 诊断数据DTC具体故障 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣…

Windows 7 静态 IP 地址

Windows 7 静态 IP 地址 References 静态 IP 地址设置为 192.168.1.198 控制面板 -> 查看网络状态和任务 更改适配器设置 网络连接 -> 属性 TCP / IPv4 警告 - 已计划将多个默认网关用于提供单一网络 (例如 intranet 或者 Internet) 的冗余。 6.1. 关闭 redundancy VMw…

【stable diffusion扩散模型】一篇文章讲透

目录 一、引言 二、Stable Diffusion的基本原理 1 扩散模型 2 Stable Diffusion模型架构 3 训练过程与算法细节 三、Stable Diffusion的应用领域 1 图像生成与艺术创作 2 图像补全与修复 3 其他领域 四、Stable Diffusion的优势与挑战 👉优势 &#x1f…

WSL下Ubuntu+RTX4090安装CUDA+cuDnn+Pytorch

安装驱动 首先需要明确的是,在WSL下安装Ubuntu,如果要使用主机的GPU卡,只需要在主机Windows上安装驱动,Linux中不需要安装驱动,可以在Linux中使用nvidia-smi命令查看驱动版本。 安装CUDA 避坑注意事项:如…

C++初阶:STL容器list的使用与初版自实现

目录 1. list的接口与使用1.1 默认成员函数1.2 迭代器与容量相关成员函数1.3 存储数据操作相关成员函数1.4 其他list操作成员函数 2. list的自实现2.1 list的自实现功能2.2 list的结点结构2.3 list的迭代器2.3 list的结构2.4 list迭代器的运算符重载2.5 list的成员函数 3. cons…