在设备树中pinctrl的简单使用

news2024/12/25 0:35:46

目录

1 关于引脚的几个概念

2 设备树中pinctrl节点

2.1 定义各种pin bank

2.2 定义各种group

    3 设备节点中要使用某一个 pin group

4 platform_device, platform_driver匹配

5 驱动中想选择、设置某个状态的引脚

6 总结 

7 参考文档


1 关于引脚的几个概念

Bank: 以引脚名为依据, 这些引脚分为若干组, 每组称为一个Bank
      比如s3c2440里有GPA、GPB、GPC等Bank,
      每个Bank中有若干个引脚, 比如GPA0,GPA1, ..., GPC0, GPC1,...等引脚

Group: 以功能为依据, 具有相同功能的引脚称为一个Group
       比如s3c2440中串口0的TxD、RxD引脚使用 GPH2,GPH3, 那这2个引脚可以列为一组
       比如s3c2440中串口0的流量控制引脚使用 GPH0,GPH1, 那这2个引脚也可以列为一组

State: 设备的某种状态, 比如内核自己定义的"default","init","idel","sleep"状态;
       也可以是其他自己定义的状态, 比如串口的"flow_ctrl"状态(使用流量控制)
       设备处于某种状态时, 它可以使用若干个Group引脚

2 设备树中pinctrl节点

2.1 定义各种pin bank

它定义了各种 pin bank, 比如s3c2440有GPA,GPB,GPC,...,GPB各种BANK, 每个BANK中有若干引脚:
    pinctrl_0: pinctrl@56000000 {
        reg = <0x56000000 0x1000>;

        gpa: gpa {
            gpio-controller;
            #gpio-cells = <2>;  /* 以后想使用gpa bank中的引脚时, 需要2个u32来指定引脚 */
        };

        gpb: gpb {
            gpio-controller;
            #gpio-cells = <2>;
        };

        gpc: gpc {
            gpio-controller;
            #gpio-cells = <2>;
        };

        gpd: gpd {
            gpio-controller;
            #gpio-cells = <2>;
        };
    };

2.2 定义各种group

它还定义了各种group(组合), 某种功能所涉及的引脚称为group,比如串口0要用到2个引脚: gph0, gph1:

    uart0_data: uart0-data {
        samsung,pins = "gph-0", "gph-0";
        samsung,pin-function = <2>;   /* 这里的2其实就是寄存器要设置的值,在GPHCON寄存器中gph0,gph1可以设置以下值:
                                             0 --- 输入功能
                                             1 --- 输出功能
                                             2 --- 串口功能
                                          我们要使用串口功能,  
                                          samsung,pin-function 设置为2
                                       */
    };

    uart0_sleep: uart0_sleep {
        samsung,pins = "gph-0", "gph-1";
        samsung,pin-function = <0>;   /* 这里的0其实就是寄存器要设置的值,在GPHCON寄存器中gph0,gph1可以设置以下值:
                                             0 --- 输入功能
                                             1 --- 输出功能
                                             2 --- 串口功能
                                          我们要使用输入功能,  
                                          samsung,pin-function 设置为0
                                       */
    };

    
3 设备节点中要使用某一个 pin group

    serial@50000000 {
        ......
        pinctrl-names = "default", "sleep";  /* 既是名字, 也称为state(状态) */
        pinctrl-0 = <&uart0_data>;
        pinctrl-1 = <&uart0_sleep>;
    };
    
    pinctrl-names中定义了2种state: default 和 sleep,
    default 对应的引脚是: pinctrl-0, 它指定了使用哪些pin group: uart0_data
    sleep   对应的引脚是: pinctrl-1, 它指定了使用哪些pin group: uart0_sleep

4 platform_device, platform_driver匹配

"第3课第06节_platform_device跟platform_driver的匹配" 中讲解了platform_device和platform_driver的匹配过程,
最终都会调用到 really_probe (drivers/base/dd.c)

really_probe:
    /* If using pinctrl, bind pins now before probing */
    ret = pinctrl_bind_pins(dev);
                dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,
                                PINCTRL_STATE_DEFAULT);  /* 获得"default"状态的pinctrl */
                dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,
                                PINCTRL_STATE_INIT);    /* 获得"init"状态的pinctrl */

                ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);    /* 优先设置"init"状态的引脚 */
                ret = pinctrl_select_state(dev->pins->p, dev->pins->default_state); /* 如果没有init状态, 则设置"default"状态的引脚 */
                                
    ......
    ret = drv->probe(dev);

所以: 如果设备节点中指定了pinctrl, 在对应的probe函数被调用之前, 先"bind pins", 即先绑定、设置引脚

5 驱动中想选择、设置某个状态的引脚

   devm_pinctrl_get_select_default(struct device *dev);      // 使用"default"状态的引脚
   pinctrl_get_select(struct device *dev, const char *name); // 根据name选择某种状态的引脚
   
   pinctrl_put(struct pinctrl *p);   // 不再使用, 退出时调用

6 总结 

7 参考文档

内核 Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt

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

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

相关文章

NKOJ-P1327【NOIP 2011 DAY2-1】计算系数

希望这篇文章可以带我突破10000访问………… 题目描述 给定一个多项式 (axby)k(axby)^k(axby)k&#xff0c;请求出多项式展开后xnymx^ny^mxnym项的系数; 共一行&#xff0c;包含5 个整数&#xff0c;分别为a,b,k,n,ma,b,k,n,ma,b,k,n,m&#xff0c;每两个整数之间用一个空格隔…

趣谈网络协议-课程介绍

技能收获 掌握网络协议的知识框架&#xff1b;应对大厂面试的协议难题&#xff1b;驾驭网络协议的实用场景。 讲师介绍 刘超&#xff0c;前网易研究院云计算技术部首席架构师&#xff0c;15 年云计算领域研发及架构经验。曾在 EMC 做过类似 GFS 的分布式存储开发&#xff0c;…

【遥感科学】第三章 遥感成像原理

第三章 遥感成像原理与遥感图像特征 一、遥感平台 遥感平台是搭载传感器的工具&#xff0c;按照位置可以分为地面、航空航天航宇&#xff0c;按照作用可分为气象、陆地、海洋等。这里我们主要按照作用领域进行讨论 1.1 气象卫星 气象卫星发展的三个阶段&#xff1a; 20世纪6…

【MySQL】-索引以及树的常用数据结构分析

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【MySQL】 分享&#xff1a;纵一苇之所如&#xff0c;凌万顷之茫然。——《赤壁赋》 主要内容&#xff1a;MySQL中索引的介绍、创建索引、使用索引&#xff1b;索引背后的数据结构…

计算存储分离在京东云消息中间件JCQ上的应用

作者&#xff1a;田寄远 JCQ 全名 JD Cloud Message Queue&#xff0c;是京东云自研、具有 CloudNative 特性的分布式消息中间件。 JCQ 设计初衷即为适应云特性的消息中间件&#xff1b;具有高可用、数据可靠性、副本物理隔离、服务自治、健康状态汇报、少运维或无运维、容器部…

LeetCode代码随想录算法训练营第十一天-C++队列的应用

_11LeetCode代码随想录算法训练营第十一天-C队列的应用 239.滑动窗口最大值347.前K个高频元素 239.滑动窗口最大值 整体思路 要实现一个单调递减队列&#xff1a; 对于滑动窗口的滑动&#xff0c;移除前面的元素&#xff0c;加入后面的元素。当移除前面的元素时&#xff0…

彻底弄清SpringSecurity登录原理及开发步骤

SpringBootVue之SpringSecurity登录与授权(一) 工具&#xff1a;idea2018&#xff0c;springboot 2.1.4&#xff0c;springsecurity 5.1.5 简介 SpringSecurity是Spring下的一个安全框架&#xff0c;与shiro 类似&#xff0c;一般用于用户认证(Authentication)和用户授权(Autho…

【案例教程】MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估及论文写作技巧

【查看原文】基于MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估及论文写作技巧 随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自…

ruoyi导入数据,第二次导入相同文件时,覆盖原数据;

考勤记录表——在导入时——应该做判断——避免重复导入成功报错 1.现在是&#xff0c;可以多次成功导入同一个文档&#xff0c;导致数据展示出错 期望&#xff1a; 导入文件时&#xff0c;如果这个文件名内数据select值不为0&#xff0c;那么覆盖表数据&#xff08;update&…

vue组件库搭建报错问题(vue-loader报错、gulp打包css报错,包含组件库打包文件webpack及gulp)

1、vue-loader报错 报错详情 vue-loader 17.0.0运行webpack打包命令时会报错&#xff1a; 解决方法&#xff1a; 需适配版本&#xff1a;将package.json&#xff0c;vue-loader版本修改为 “vue-loader”: “^15.10.0”&#xff0c;删除本地node_modules文件夹&#xff0c;重…

这让人眼前一亮的MySQL14个小玩意

前言 我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中…

整个网页设置为全灰

前段时间&#xff0c;不是全网变灰色了嘛&#xff0c;整个网页的按钮、文本框、图片、文字等等都变成了灰蒙蒙的了&#xff0c;这是怎么做到的呢&#xff1f; 案例如下&#xff1a; 我就随便写个普通的html网页吧&#xff0c;在网页里随便写点文字和随便放几张图片(大概意思下…

TensorFlow安装与配置教程(2022.12)

1. TensorFlow的安装 首先需要安装 Anaconda 环境&#xff0c;可以转至&#xff1a;Anaconda3安装与配置教程&#xff08;2022.11&#xff09;。 然后我们打开 Anaconda&#xff0c;创建一个 TensorFlow 环境&#xff1a; conda create -n TensorFlow python3.9进入 TensorF…

API接口相关设计及基础知识

接口开发 API接口是什么 接口&#xff1a;预先定义的函数逻辑&#xff0c;供其他系统请求&#xff0c;然后返回结果 为什么需要API接口 核心需求&#xff1a;利用现有接口降低开发成本&#xff0c;缩短开发时间 API接口的核心是什么 接口地址请求参数&#xff08;报文&am…

OPEN ALLIANCE TC2和TC9线束以太网测试标准?何种设备可以满足测试?除了矢量网分之外

OPEN ALLIANCE TC2和TC9线束以太网测试标准&#xff1f; 联盟中TC2汽车线束以太网线束定义标准&#xff1a; 100BASE-T1 Ethernet Channel & Components 100BASE-T1 offers a way to introduce modern signal processing in automotive, which allows optimal usage of th…

Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控Springboot服务

1. Spring Boot 工程集成 Micrometer 1.1引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer&l…

JVM简单介绍

JVMJVM内存区域划分JVM类加载机制JVM垃圾回收机制【哪些内存需要被JVM中垃圾回收机制回收】【JVM中垃圾回收机制的基本单位】【JVM中垃圾回收机制是如何判断对象是否是垃圾】【如何回收垃圾】JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。虚拟机是指通过软…

电巢:半导体ATE国产化产业探究(附国内外厂家汇总)

前言 2022年10月7日&#xff0c;美国BIS发布近年来范围最大半导体管制举措&#xff0c;管控范围包括芯片、设备、零部件、人员等。 12月6日下午&#xff0c;全球最大晶圆代工厂台积电&#xff0c;在美国亚利桑那州凤凰城高调举行了首批机台设备迁机仪式。 据联合早报12月8日报道…

分蛋糕

题目描述 SYCSYC在每个阶段结束(语言阶段、基础算法、提高算法)后,都会切蛋糕 现在MasMas有一个蛋糕,他希望将蛋糕分成nn份 规定一刀合法的蛋糕切法为符合以下两种条件之一 一刀的切痕迹是一条线段,线段两个端点在圆上,且线段经过圆心(切痕为圆的直径) 一刀的切痕迹是一条线…

[附源码]计算机毕业设计Python电商小程序(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…