当前位置: 首页 > news >正文

13_pinctrl子系统

总结

pinctrl作为驱动
iomuxc节点在设备树里面 存储全部所需的引脚配置信息

iomux节点匹配pinctrl子系统

控制硬件外设的时候 要知道有哪些gpio 再看gpio有哪些服用寄存器
接着在程序配置gpio相关寄存器 这样搞效率很低
所以用iomux节点保存所有的引脚组 pinctrl驱动起来的时候获得所有引脚信息 保存在内存

pinctrl子系统预先确定引脚的数量和名字

  • 为每个引脚的配置信息分配内存
  • pinctrl子系统统一管理每个引脚的使用状态
    -iomux节点存放了各种引脚属性,pinctrl驱动解析iomux节点,存放引脚信息进入内存

iomux节点里如何填写

//iomuxc节点
//imx6ull.dtsi
iomuxc: iomuxc@20e0000 {compatible = "fsl,imx6ul-iomuxc";reg = <0x20e0000 0x4000>;};
//继续扩展 引用iomux节点 **imx6ull-seeed-npi.dts**
&iomuxc {pinctrl-names = "default""init","sleep";  //选定引脚状态pinctrl-0 = <&pinctrl_uart1>;  //一个状态就是一组引脚,比如对应下面pinctrl-1 =<&xxx>;pinctrl-2 =<&yyy>;
...pinctrl_uart1: uart1grp {fsl,pins = <MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1>;};...
}

上面 引脚里面的宏是什么意思

MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX
#define MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x0084 0x0310 0x0000 0 0
< mux_reg conf_reg input_reg mux_mode input_val >0x0084    0x0310    0x0000     0x0      0x0

mux_reg:引脚复用设置寄存器 基地址+mux_reg 就是 PIN 的复用寄存器地址。
conf_reg : 设置这个引脚的电气属性的寄存器地址 基地址+conf_reg =设置pin的电气属性地址
input_reg:引脚输入设置寄存器 有些外设有 input_reg 寄存器
引脚需要输入功能时设置
mux_mode:复用寄存器设置值
设置引脚复用
input_val:输入寄存器设置值
设置引脚输入特性

宏的最后跟随了一串数字 用来设置PIN的电气属性值 比如IO 的上/下拉、驱动能力和速度等
在这里插入图片描述
在这里插入图片描述

引脚状态初始化

在设备树里面节点 会变成plantform_dev 会执行probe进行匹配驱动
但是执行probe和drv配对之前 先回执行really_porbe() 这个函数和下面的引脚状态关系很大
用来初始化引脚值

//iomuxc节点
//imx6ull.dtsi
iomuxc: iomuxc@20e0000 {compatible = "fsl,imx6ul-iomuxc";reg = <0x20e0000 0x4000>;};
//继续扩展 引用iomux节点 **imx6ull-seeed-npi.dts**
&iomuxc {pinctrl-names = "default""init","sleep";  //选定引脚状态pinctrl-0 = <&pinctrl_uart1>;  //一个状态就是一组引脚,比如对应下面pinctrl-1 =<&xxx>;pinctrl-2 =<&yyy>;
...pinctrl_uart1: uart1grp {fsl,pins = <MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1>;};...
}

还是用上一个设备树举例 看了下面的例子
就知道驱动的引脚其实在 probe之前就已经初始化好了电气属性了

drivers/base/dd.c
static int really_probe(struct device *dev, struct device_driver *drv)
{int ret = -EPROBE_DEFER;
...
re_probe:dev->driver = drv;ret = pinctrl_bind_pins(dev);  //这里根据iomux节点的 几个引脚状态来初始化引脚组
...if (dev->bus->probe) {ret = dev->bus->probe(dev);if (ret)goto probe_failed;} else if (drv->probe) {ret = drv->probe(dev); //这个是熟悉的probeif (ret)goto probe_failed;}...}
int pinctrl_bind_pins(struct device *dev)dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_DEFAULT);//从设备节点状态找到指定状态//本次是default状态dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_INIT); /这次找init状态if (IS_ERR(dev->pins->init_state))pinctrl_select_state(dev->pins->p,dev->pins->default_state);//没有init状态变成default状态elseret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);//有的话引脚变成init状态

相关文章:

13_pinctrl子系统

总结 pinctrl作为驱动 iomuxc节点在设备树里面 存储全部所需的引脚配置信息 iomux节点匹配pinctrl子系统 控制硬件外设的时候 要知道有哪些gpio 再看gpio有哪些服用寄存器 接着在程序配置gpio相关寄存器 这样搞效率很低 所以用iomux节点保存所有的引脚组 pinctrl驱动起来的时…...

Linux系统对于实施人员的价值

Linux系统对于实施人员的价值 随着互联网的发展&#xff0c;linux系统越来越突显了巨大的作用&#xff0c;很多互联网公司&#xff0c;政府企业&#xff0c;只要用到服务器的地方几乎都能看到linux系统的身影&#xff0c;可以说服务是不是在linux系统跑的代表了企业的技术水平&…...

ForkJoin 和 Stream并行流

还在用 for 循环计算两个数之间所有数的和吗&#xff1f;下面提供两种新方法&#xff01; 1. ForkJoin 1.1 背景 要知道&#xff0c;在一个方法中&#xff0c;如果没有做特殊的处理&#xff0c;那么在方法开始到结束使用的都是同一个线程&#xff0c;无论你的业务有多复杂 那…...

逻辑优化-cofactor

1. 简介 逻辑综合中的Cofactor优化方法是一种重要的逻辑优化技术。它通过提取逻辑电路中的共同部分&#xff0c;从而简化电路、减小面积和延迟。该方法广泛应用于电子设计自动化&#xff08;EDA&#xff09;领域中的逻辑综合、等价转换和优化等方面。 Cofactor优化方法最早由…...

车道线检测CondLaneNet论文和源码解读

CondLaneNet: a Top-to-down Lane Detection Framework Based on Conditional Convolution Paper&#xff1a;https://arxiv.org/pdf/2105.05003.pdf code&#xff1a;GitHub - aliyun/conditional-lane-detection 论文解读&#xff1a; 一、摘要 这项工作作为车道线检测任…...

vue3的插槽slots

文章目录普通插槽Test.vueFancyButton.vue具名插槽Test.vueBaseLayout.vue作用域插槽默认插槽Test.vueBaseLayout.vue具名作用域插槽Test.vueBaseLayout.vue普通插槽 父组件使用子组件时&#xff0c;在子组件闭合标签中提供内容模板&#xff0c;插入到子组件定义的出口的地方 …...

docker学校服务器管理

docker 学校服务器管理使用docker&#xff0c;docker使用go语言编写。对于docker的理解&#xff0c;需要知道几个关键字docker, scp&#xff0c;images, container。 docker-码头工人scp-传输命令images/repository-镜像container-容器 docker是码头工人&#xff0c;scp相当…...

pv和pvc

一、PV和PVC详解当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就…...

k8s篇之Pod 干预与 PDB

文章目录自愿干预和非自愿干预PDBPDB 示例分离集群所有者和应用程序所有者角色如何在集群上执行中断操作自愿干预和非自愿干预 Pod 不会消失&#xff0c;除非有人&#xff08;用户或控制器&#xff09;将其销毁&#xff0c;或者出现了不可避免的硬件或软件系统错误。 我们把这…...

Django学习17 -- ManytoManyField

1. ManyToManyField &#xff08;参考&#xff1a;Django Documentation Release 4.1.4&#xff09; 类定义 class ManyToManyField(to, **options)使用说明 A many-to-many relationship. Requires a positional argument: the class to which the model is related, which w…...

既然有MySQL了,为什么还要有Redis?

目录专栏导读一、同样是缓存&#xff0c;用map不行吗&#xff1f;二、Redis为什么是单线程的&#xff1f;三、Redis真的是单线程的吗&#xff1f;四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…...

RSTP基础要点(上)

RSTP基础RSTP引入背景STP所存在的问题RSTP对于STP的改进端口角色重新划分端口状态重新划分快速收敛机制&#xff1a;PA机制端口快速切换边缘端口的引入RSTP引入背景 STP协议虽然能够解决环路问题&#xff0c;但是由于网络拓扑收敛较慢&#xff0c;影响了用户通信质量&#xff…...

Linux操作系统学习(信号处理)

文章目录进程信号信号的产生方式&#xff08;信号产生前&#xff09;1. 硬件产生2.调用系统函数向进程发信号3.软件产生4.定位进程崩溃的代码&#xff08;进程异常退出产生信号&#xff09;信号保存的方式&#xff08;信号产生中&#xff09;获取pending表&&修改block表…...

CopyOnWriteArrayList 源码解读

一、CopyOnWriteArrayList 源码解读 在 JUC 中&#xff0c;对于 ArrayList 的线程安全用法&#xff0c;比较推崇于使用 CopyOnWriteArrayList &#xff0c;那 CopyOnWriteArrayList是怎么解决线程安全问题的呢&#xff0c;本文带领大家一起解读下 CopyOnWriteArrayList 的源码…...

方法

方法方法&#xff08;函数&#xff09;一、课前问答二、方法和函数三、方法的参数3.1 单个参数3.2 多个参数四、方法的返回值五、方法的多级调用六、递归方法&#xff08;函数&#xff09; 一、课前问答 1、break和continue的区别 2、嵌套循环的执行流程 3、二进制有哪些运算&…...

C/C++实现发送邮件功能(附源码)

C++常用功能源码系列 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务于工作实践。 专栏介绍:专栏讲本人近10年后端开发常用的案例,以高质量的代码提取出来,并对其进行了介绍。…...

Java虚拟机JVM-运行时数据区域说明

及时编译器 HotSpot虚拟机中含有两个即时编译器&#xff0c;分别是编译耗时短但输出代码优化程度较低的客户端编译器&#xff08;简称为C1&#xff09;以及编译耗时长但输出代码优化质量也更高的服务端编译器&#xff08;简称为C2&#xff09;&#xff0c;通常它们会在分层编译…...

修复电子管

年前在咸鱼捡漏买到了10根1G4G电子管&#xff0c;这是一种直热三极管&#xff0c;非常的少见。买回来的时候所有的灯丝都是通的&#xff0c;卖家说都是新的&#xff0c;库存货&#xff0c;但是外观实在是太糟糕了&#xff0c;看着就像被埋在垃圾场埋了几十年的那种&#xff0c;…...

【Java】反射机制和代理机制

目录一、反射1. 反射概念2. 反射的应用场景3. 反射机制的优缺点4. 反射实战获取 Class 对象的四种方式二、代理机制1. 代理模式2. 静态代理3. 动态代理3.1 JDK动态代理机制1. 介绍2.JDK 动态代理类使用步骤3. 代码示例3.2 CGLIB 动态代理机制1.介绍2.CGLIB 动态代理类使用步骤3…...

synchronized底层

Monitor概念一、Java对象头二、Monitor2.1、Monitor—工作原理2.2、Monitor工作原理—字节码角度2.2、synchronized进阶原理&#xff08;优化&#xff09;2.3、synchronized优化原理——轻量级锁2.4、synchronized优化原理——锁膨胀2.5、synchronized优化原理——自旋优化2.6、…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...