设备树和pinctrl粗解

上次文章中 我以DS18b20为例,在设备树中定义了ds18b20的资源(device),当时是依葫芦画瓢,没有深入探究,本文主要探讨下pin在设备树中的描述

参考文章:Linux内核中的GPIO系统之(3):pin controller driver代码分析 、fsl,imx6q-pinctrl.txt、fsl,imx-pinctrl.txt

先看我上一篇文章对ds18b20的描述

    my-ds18b20 {compatible = "ds18b20";gpios = <&gpio2 3 1>;   //有更改,以这里为准};

其实这是不完整的描述,因为我们仅仅指定了哪个引脚,而作为GPIO是这个引脚的功能之一,也许他还可以作为UART1_TX_DATA等等。那为何我们这个驱动可以成功呢?因为这个引脚在其他地方进行了初始化配置为了普通GPIO。

所以完整的描述应该这样:

        //myimx6ek314-iomux.dtsipinctrl_nandf_pad: nandfpadgrp {fsl,pins = </* All in U14 */MX6QDL_PAD_NANDF_CS0__GPIO6_IO11    0x80000000MX6QDL_PAD_NANDF_CS3__GPIO6_IO16    0x80000000MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09   0x80000000MX6QDL_PAD_NANDF_D0__GPIO2_IO00     0x80000000MX6QDL_PAD_NANDF_D2__GPIO2_IO02     0x80000000MX6QDL_PAD_NANDF_D3__GPIO2_IO03     0x40000000MX6QDL_PAD_NANDF_D4__GPIO2_IO04     0x80000000MX6QDL_PAD_NANDF_D5__GPIO2_IO05     0x80000000MX6QDL_PAD_NANDF_D6__GPIO2_IO06     0x80000000MX6QDL_PAD_NANDF_D7__GPIO2_IO07     0x80000000>;};//myimx6ek314.dtsimy-ds18b20 {compatible = "ds18b20"; pinctrl-names = "default";pinctrl-0 = <&pinctrl_nandf_pad>;gpios = <&gpio2 3 1>;  status = "okay";};

gpios = <&gpio2 3 1>; 对应了MX6QDL_PAD_NANDF_D3__GPIO2_IO03 (宏定义) 的pin configuration,我们具体来看看这个宏定arch\arm\boot\dts\imx6dl-pinfunc.h

                                          //<mux_reg  conf_reg input_reg mux_mode input_val>
#define MX6QDL_PAD_NANDF_D3__GPIO2_IO03       0x290   0x678    0x000     0x5       0x0

这个宏定义由5个数组成,我们主要关心第四个,mux_mode 0x5,这决定了这个引脚配置为什么功能,我们现在查询下芯片手册,在芯片手册中搜索关键词“GPIO2_IO03”
这里写图片描述
我们配置他为GPIO模式,不开启SION,那么后应该配置为0101 = 0x5,与我们宏定义相对应,其实从从这个宏定义的名字我们也能看出来他配置为了GPIO模式,MX6QDL_PAD_NANDF_D3__GPIO2_IO03 这个引脚原本功能为nand的data3引脚,我们复用为了GPIO2_3,我们在看看这个宏定义的源文件
这里写图片描述
这里可以看出,NANDF_D3 还可以复用为SD1_DATA7、NAND_DATA3。

我们再来说说pinctrl-names 和pinctrl-x。(以下两段摘自WOWO科技)

(1)pinctrl-names定义了一个state列表。那么什么是state呢?具体说应该是pin state,对于一个client device,它使用了一组pin,这一组pin应该同时处于某种状态,毕竟这些pin是属于一个具体的设备功能。state的定义和电源管理关系比较紧密,例如当设备active的时候,我们需要pin controller将相关的一组pin设定为具体的设备功能,而当设备进入sleep状态的时候,需要pin controller将相关的一组pin设定为普通GPIO,并精确的控制GPIO状态以便节省系统的功耗。state有两种,标识,一种就是pinctrl-names定义的字符串列表,另外一种就是ID。ID从0开始,依次加一。根据例子中的定义,state ID等于0(名字是active)的state对应pinctrl-0属性,state ID等于1(名字是idle)的state对应pinctrl-1属性。具体设备state的定义和各个设备相关,具体参考在自己的device bind。

(2)pinctrl-x的定义。pinctrl-x是一个句柄(phandle)列表,每个句柄指向一个pin configuration。有时候,一个state对应多个pin configure。例如在active的时候,I2C功能有两种配置,一种是从pin ID{7,8}引出,另外一个是从pin ID{69,103}引出。

下面我再给一段,供大家分析练手

             //myimx6ek314-iomux.dtsi   pinctrl_nandf_keys: nandfkeysgrp {fsl,pins = <MX6QDL_PAD_NANDF_CS2__GPIO6_IO15    0x80000000  /* KEY_VOLUMEUP */MX6QDL_PAD_NANDF_RB0__GPIO6_IO10    0x80000000  /* KEY_VOLUMEDOWN */>;};  pinctrl_gpio_keys: gpiokeysgrp {fsl,pins = <MX6QDL_PAD_GPIO_4__GPIO1_IO04       0x80000000  /* KEY_POWER */>;};//myimx6ek314.dtsigpio-keys {compatible = "gpio-keys";pinctrl-names = "default";pinctrl-0 = <&pinctrl_nandf_keys &pinctrl_gpio_keys>;    //配置pin 为gpiopower {label = "Power Button";gpios = <&gpio1 4 1>;gpio-key,wakeup;linux,code = <KEY_POWER>;};volume-up {label = "Volume Up";gpios = <&gpio6 15 1>;gpio-key,wakeup;linux,code = <KEY_VOLUMEUP>;};volume-down {label = "Volume Down";gpios = <&gpio6 10 1>;gpio-key,wakeup;linux,code = <KEY_VOLUMEDOWN>;};};

2017-11-09

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

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

相关文章

八大排序算法(C语言实现)

摘自&#xff1a;八大排序算法&#xff08;C语言实现&#xff09; 作者&#xff1a;2021dragon 发布时间&#xff1a; 2021-05-16 10:46:37 网址&#xff1a;https://blog.csdn.net/chenlong_cxy/article/details/116563972 目录 直接插入排序希尔排序选择排序堆排序冒泡排序快…

python qq签到_Yii Framework 中文网每天签到 Python 脚本

Yii 春节前的重磅新闻&#xff1a;Yii 2.0.16 版本发布了经过国内 Yii 使用者坚持不懈的进行国际化翻译&#xff0c;以及在中国进行大量的宣传和推广&#xff0c;Yii China 目前已经成为全球最大的 Yii 中文社区也就是 Yii Framework 中文网&#xff0c;地址为 www.yiichina.co…

codeforces 1060 A

https://codeforces.com/contest/1060/problem/A 题意&#xff1a;电话号码是以8开头的11位数&#xff0c;给你n 个数问最多可以有多少个电话号码 题解&#xff1a;min&#xff08;8的个数&#xff0c;n/11&#xff09; 代码如下&#xff1a; #include <map> #include &l…

嵌入式linux 自动获取IP 及 自动校时

最近要调用百度人脸识别API做个东西&#xff0c;发现百度API在桌面端QT程序跑的贼溜&#xff0c;可以到了嵌入式板子上发现就post没了返回信息。 一、嵌入式端udhcpc自动获取IP 1.在开发板建立文件夹#mkdir /usr/share/udhcpc/ -p 2.先拷贝busybox 源码目录下的 busybox-1.27…

MYSQL MVCC实现及其机制

多版本并发控制 Multiversion Concurrency Control 大部分的MySQL的存储 引擎&#xff0c;比如InnoDB&#xff0c;Falcon&#xff0c;以及PBXT并不是简简单单的使用行锁机制。它们都使用了行锁结合一种提高并发的技术&#xff0c;被称为MVCC&#xff08;多版本并 发控制&#x…

树莓派外设开发之控制继电器(组)

目录控制继电器控制继电器组控制继电器 选择7号引脚作为继电器信号输出控制端。 代码&#xff1a; #include <wiringPi.h> #include <stdio.h> #define SWITCHER 7 // 7为树莓派物理引脚编码和wiringPi编码。在树莓派功能名为GPIO.7int main() {int cmd;if( wiri…

piovt table python_python – Pandas:pivot和pivot_table之间的区别...

我有以下数据帧.df.head(30)struct_id resNum score_type_name score_value0 4294967297 1 omega 0.0648401 4294967297 1 fa_dun 2.1856182 4294967297 1 fa_dun_dev 0.0000273 4294967297 1 fa_dun_semi 2.1855914 4294967297 1 ref -1.1911805 4294967297 2 rama -0.7951616…

读《系统虚拟化-原理与实现》-第一章

一、虚拟化的实现: 在系统中加入一个虚拟化层&#xff0c;虚拟化层将下层资源抽象成另一形式的资源&#xff0c;提供给上层使用 1. 是虚拟化迁移的基础 2. 提高了移植性 二、几种虚拟化 1.硬件抽象层上的虚拟化 通过虚拟硬件抽象层来实现虚拟机 2.操作系统层上的虚拟化 操…

怎样查看电脑开机记录

在Windows XP中&#xff0c;我们可以通过“事件查看器”的事件日志服务查看计算机的开、关机时间。因为事件日志服务会随计算机一起启动和关闭&#xff0c;并在事件日志中留下记录。 在这里有必要介绍两个ID号&#xff1a;6006和6005。在事件查看器里ID号为6006的事件表示事件日…

[BZOJ2725/Violet 6]故乡的梦

Description Input Output Sample Input 6 7 1 2 1 2 3 1 3 4 2 4 5 1 5 6 1 1 3 3 4 6 3 1 6 4 1 2 1 3 4 3 6 5 Sample Output 7 6 Infinity 7 HINT 其实这题和[TJOI2012]桥基本差不多&#xff0c;如果不是最短路径上的边&#xff0c;那直接输出最短路即可。否则就按照[TJOI2…

智能家居 (3) ——智能家居工厂模式介绍实现继电器控制灯

目录智能家居工厂模式整体设计框架继电器控制灯代码contrlEquipments.h 文件&#xff08;设备类&#xff09;mainPro.c 文件&#xff08;主函数&#xff09;bathroomLight.c 文件&#xff08;浴室灯&#xff09;secondfloorLight.c 文件&#xff08;二楼灯&#xff09;livingro…

机器人离线编程画圆误差解决方案_工业机器人离线编程-误差分析和解决方案...

编&#xff1a;张山发&#xff1a;03/03/2019按&#xff1a;为便于更多读者朋友了解工业机器人离线编程/仿真&#xff0c;本文中尽量规避专业名词和深入的专业讲解。——————————————————————————————————国内工业机器人应用领域越来越广&…

读《系统虚拟化-原理与实现》-第二章

x86构架及操作系统概述 x86内存构架 地址空间和地址 物理地址空间&#xff1a;内存和其他硬件资源组合到一起&#xff0c;分布在CPU的物理地址空间内&#xff0c;CPU使用物理地址索引这些资源 线性地址空间&#xff1a;一个平台只有一个物理地址空间&#xff0c;但每个程序都…

SCCM OS播发

SCCM OS播发1.在分发点启用PXE支持2.将启动映像包分发到分发点:需要将x86和x64都分发到分发点&#xff0c;如果只分发x64&#xff0c;在客户端pxe启动时会出现 no response from wds server.3.安装好模板机4.使用驱动精灵将驱动备份出来后&#xff0c;导入到SCCM中5.创建任务序…

crm——stark组件核心原理

关于stark组件的简要介绍&#xff1a;启动后、路由加载前定制一段代码。a. 创建一个 stark app 组件b. 编写ready方法1 from django.apps import AppConfig2 3 4 class StarkConfig(AppConfig):5 name stark6 7 def ready(self):8 from django.utils.module_…

智能家居 (4) ——工厂模式火焰报警

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

tplink软件升级有用吗_tp-link路由器固件怎么升级更新

展开全部升级TP-LINK路由器32313133353236313431303231363533e58685e5aeb931333433623061软件方法分为如下三种&#xff0c;请结合实际情况选择升级方法&#xff1a;类型一、云服务器自动推送升级软件路由器WAN口联网成功后&#xff0c;在路由器管理界面登录TP-LINK ID&#xf…

java-多线程操作全(Thread)-Timer简单使用

一、 多线程概念和作用 线程指进程中的一个执行场景&#xff0c;也就是执行流程&#xff0c;那么进程和线程的区别是什么 1.每个进程是一个应用程序&#xff0c;都有独立的内存空间 2.同一个进程中的线程共享其进程中的内存和资源 (共享的内存是堆内存和方法内存&#xff0c;栈…

Apache http强制转为https页面访问(转)

1在httpd.conf文件里使下面模块生效LoadModule rewrite_module modules/mod_rewrite.so2httpd.conf配置文件或者是在httpd-vhost.conf文件里修改<Directory "C:/Apache2.2/docs/1.com">Options Indexes FollowSymLinksAllowOverride All# 上面是http-https时需…

读《系统虚拟化-原理与实现》-第三章

虚拟化概述 概念&#xff1a; 在虚拟环境里&#xff0c;虚拟机监控器&#xff08;VMM&#xff09;抢占了操作系统的位置&#xff0c;编程的物理机的管理者&#xff0c;同时向上层的软件呈现出虚拟的硬件平台&#xff0c;欺骗着上层的操作系统 虚拟机可以看做是物理机的一种高…