上次文章中 我以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

设备树和pinctrl粗解相关推荐

  1. 设备树 之pinctrl[通俗易懂]

    设备树 之pinctrl[通俗易懂]三个重要概念bank:gpa0,gpa1,gpa31等group:以功能划分,比如uart的tx和rxstate:设备的某种状态,比如"default&q ...

  2. dts 编译过程_linux设备树dts移植详解

    [转] 摘 要:设备树的引入减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux 支持包的开发,使得单个内核镜像能支持多个系统.作为U-Boot 和Linux 内核之间的动态 接口,本文 ...

  3. linux设备树dts文件详解

    1.什么是设备树? (1)设备树(dt:device tree)是linux内核采用的参数表示和传递技术,在系统引导启动阶段进行设备初始化的时候,将设备树中描述的硬件信息传递给操作系统: (2)dts ...

  4. 设备树Device Tree详解

    原文:https://www.cnblogs.com/aaronLinux/p/5496559.html 目录 1. 设备树(Device  Tree)基本概念及作用 2. 设备树的组成和使用 2.1 ...

  5. 设备树 之pinctrl

    三个重要概念 bank : gpa0, gpa1, gpa31等 group: 以功能划分,比如uart的tx和rx state: 设备的某种状态,比如"default", &qu ...

  6. 设备树学习之(二)点灯【转】

    本文转载自:http://blog.csdn.net/lizuobin2/article/details/54563829 开发板:tiny4412SDK + S702 + 4GB Flash  要移 ...

  7. Linux pinctrl子系统框架流程详解(基于Kernel 3.16,arm,设备树)

    以下讲的pinctrl子系统框架包括3点,1. pinctrl子系统简介:2.pinctrl子系统的注册:3. 设备驱动匹配时,probe执行前的管脚自动配置.写博客不易,如若转载,请注明出处. 一. ...

  8. Android 驱动(12)---Linux DTS(Device Tree Source)设备树详解

    Linux DTS(Device Tree Source)设备树详解 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) Linux DTS(Device Tr ...

  9. echarts树状图点击展开子节点_CPU眼里的结构设备树节点及属性详解

    1 设备树(device tree)简介DTSpec定义一个devicetree的约束来描述硬件设备,boot引导程序将设备树传递给用户程序的内存空间中,并传递给用户相应设备树的指针.设备树为一个树形 ...

最新文章

  1. react 项目实战(六)提取布局组件
  2. Winform下的地图开发控件(GMap.NET)使用心得之二
  3. 人工智能写散文之错位时空
  4. Python 技术篇-requests发送post请求传文件给flask服务端报405、400问题解决方法
  5. linux nand 坏块_Nand Flash 中的坏块(Bad Block)
  6. 几种常见的电话光端机连接图以及电话光端机的连接方式
  7. php替换指定函数,PHP替换指定字符函数str_replace()的用法
  8. IDEA初使用:解决搜狗输入法不跟随BUG
  9. python双层for循环实现全排列_Python循环实现n的全排列功能
  10. 矩阵的迹tr运算及矩阵求导公式
  11. 确定你的台式计算机支持的内存类型,如何区分内存类型及查看内存的兼容性
  12. 传统蓝牙HCI搜索流程介绍(bluetooth inquiry)
  13. 星际争霸2的AI环境搭建
  14. 少儿重疾险排名的选择与注意事项
  15. 用友ERP-NC用户常见的问题
  16. OSI 7层的简单讲解
  17. python写入中文json
  18. 各CCF期刊点评网站/学术论坛的信息汇总及个人评价
  19. 《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第5章 总体设计
  20. 了解transparent,用transparent透明实现箭头绘制

热门文章

  1. 【转载】ASP.NET应用程序与页面生命周期
  2. ios CGRec用法
  3. 杭电1262--寻找素数对(打表)
  4. fortinate防火墙使用本地用户三步开通PPTP ***
  5. ComboBox自动补全小技巧
  6. 流星,刹那间划过天际
  7. C# 数值和字符串之间的相互转换
  8. 【error】深度优先搜索TypeError: unhashable type: ‘list‘
  9. 可以进行单元测试么_前端与单元测试
  10. Doxygen从零学起———安装和配置