前言

参考文档:

建议配合 GPIO 子系统使用。

建议,复制 原文链接观看,排版清晰,便于学习

10. pinctrl子系统

pinctrl子系统 用于引脚的配置。如复用为那种引脚,电器特性等等。

gpio子系统 用于引脚的控制。如配置输出,输出高低电平等等。

pinctrl子系统配置引脚为GPIO模式后,才能用gpio子系统控制引脚。

(pinctrl子系统可以把引脚配置为 GPIO模式I2C模式* 等等*)

10.1 参考路径

pinctrl子系统内核文档:Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt

pinctrl子系统源码路径:drivers/pinctrl

10.2 pinctrl子系统主要工作

pinctrl子系统 主要工作内容(内核实现):

  • 获取设备树中用户配置的 PIN 信息。
  • 根据获取到的信息,配置 PIN 的复用功能、电气特性。

以上工作内容都是内核实现的,用户不需要自己编写代码,只需要配置好设备树即可。

10.2 pinctrl子系统格式说明

pin controller 子节点格式是由芯片厂商自定义的,即每家芯片pin controller子节点格式都是不一样的。

各个厂商的 pinctrl 使用说明可以参考厂商提供的文档或去内核源码路径 Documentation/devicetree/bindings/pinctrl 目录下找到对应厂商的使用说明。

格式规范如:

imx6ull格式

//client端:
@节点名字 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_自定义名字A>;
status = "okay";
}; //pincontroller服务端
pinctrl_自定义名字A: 自定义名字B {
fsl,pins = <
引脚复用宏定义 PAD(引脚)属性, // 引脚 A
引脚复用宏定义 PAD(引脚)属性; // 引脚 B
>;
};

rk3288实例

//client端
@uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>; //它使用三个节点来表示三组引脚。
status = "okay";
}; //pincontroller服务端
gpio4_uart0 {
// 引脚 A
uart0_xfer: uart0-xfer {
rockchip,pins = <UART0BT_SIN>, <UART0BT_SOUT>; //使用rockchip,pins来指定使用哪些引脚,就等效于groups
rockchip,pull = <VALUE_PULL_DISABLE>; //引脚的参数
rockchip,drive = <VALUE_DRV_DEFAULT>; //引脚的参数
};
// 引脚 B
uart0_cts: uart0-cts {
rockchip,pins = <UART0BT_CTSN>;
rockchip,pull = <VALUE_PULL_DISABLE>;
rockchip,drive = <VALUE_DRV_DEFAULT>;
};
// 引脚 C
uart0_rts: uart0-rts {
rockchip,pins = <UART0BT_RTSN>;
rockchip,pull = <VALUE_PULL_DISABLE>;
rockchip,drive = <VALUE_DRV_DEFAULT>;
};
uart0_rts_gpio: uart0-rts-gpio {
rockchip,pins = <FUNC_TO_GPIO(UART0BT_RTSN)>;
rockchip,drive = <VALUE_DRV_DEFAULT>;
};
};

10.3 概念

上面例子中说到 pin controllerclient device,这两个节点说明都在文件 pinctrl-bindings.txt 中有说明。

pin controller

  • 服务端。
  • 提供引脚的配置信息。

client device

  • 客户端。
  • 声明需要使用哪个引脚。(使用来自客户端提供的引脚信息)
  • 客户端其实就是需要使用该引脚的设备树节点。
/* For a client device requiring named states */
device {
pinctrl-names = "active", "idle"; // 该设备有两种状态,分别对应 pinctrl-0 和 pinctrl-1
pinctrl-0 = <&state_0_node_a>; // 第 0 个状态的名字为 active。对应的引脚在 pinctrl-0 里。
pinctrl-1 = <&state_1_node_a &state_1_node_b>; // 第 1 个状态的名字为 idle。对应的引脚在 pinctrl-1 里。
};

function

  • 功能。

groups

  • 使用 function 功能的 N 组引脚。

如:

state_0_node_a
{
uart0
{
function = "uart0";
groups = "u0rxtx", "u0rtscts";
};
};

10.4 实例分析

以 IMX6UL 为例子分析。

参考 NXP 提供的关于 pinctrl 文档或去 Documentation/devicetree/bindings/pinctrl 下找到文档 fsl,imx6ul-pinctrl.txtfsl,imx-pinctrl.txt

工具相应文档编写 pinctrl 配置信息。

根据文档得出以下几点关于 IMX6ULL pinctrl 子系统开发的要求:

  1. 节点 iomux 汇总所需引脚的配置信息。即是 pinctrl 子系统存储使用着 iomux 节点信息。
  2. 要在特定功能上工作的 pin ,应该在该特定功能节点下定义。
  3. 驱动程序可以使用客户节点的名称和服务节点的名称来描述引脚功能和组层次结构。
    • 例如,Linux IMX pinctrl驱动程序以客户节点的名称作为函数名,服务节点的名称作为组名来创建映射表。
  4. 每个管脚配置节点都应该有一个phandle(即是pinctrl-0),设备可以通过引用该管脚配置节点的phandle 来设置管脚配置。

10.4.1 pin controller服务端

有些SoC 把 PINPAD

格式有芯片厂商定义

引脚复用宏 & 引脚属性值

引脚复用宏定义 如 MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX内核源码/arch/arm/boot/dts/imx6ul-pinfunc.h 文件中定义,由芯片厂商编写。

如图:

  • 引脚复用宏 由5个参数组成,分别为:

    • mux_reg:复用选择寄存器的偏移地址。
    • conf_reg:引脚属性控制的偏移地址。
    • input_reg:输入选择寄存器偏移地址。(用于输入的引脚)
    • mux_mode:复用选择寄存器模式选择位的值。
    • input_val:输入选择寄存器的值。

前面三个均为 寄存器地址偏移值,后面两个为对应要写入寄存器的值

对应规则:

  • mux_reg <-- mux_mode
  • conf_reg <-- 引脚属性值宏后面的参数
    • 因为引脚属性配置比较多样灵活,所以由用户决定该值,便提出到宏外。
  • input_reg <-- input_val

10.4.2 client device客户端

格式规范由设备树规定

客户端其实就是需要使用该引脚的设备树节点。

客户端必须至少有一个 pinctrl-0 状态。

【linux】驱动-10-pinctrl子系统的更多相关文章

  1. Linux 驱动框架---input子系统框架

    前面从具体(Linux 驱动框架---input子系统)的工作过程学习了Linux的input子系统相关的架构知识,但是前面的学习比较实际缺少总结,所以今天就来总结一下输入子系统的架构分层,站到远处来 ...

  2. Linux 驱动框架---input子系统

    input 子系统也是作为内核的一个字符设备模块存在的,所以他也是字符设备自然也会有字符设备的文件接口.input子系统的注册过程主要分为两步,先注册了一个input class然后再注册一个字符设备 ...

  3. linux驱动模型<输入子系统>

    在linux中提供一种输入子系统的驱动模型,其主要是实现在input.c中. 在输入子系统这套模型中,他把驱动分层分类.首先分为上下两层,上层为input.c .下层为驱动的实现,下层分为两部分,一部 ...

  4. Linux驱动之输入子系统简析

    输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动.键盘按下等通过Driver->Inputcore->Event handler->userspac ...

  5. Linux驱动架构之pinctrl子系统分析(一)

    1.前言在嵌入式系统中,许多SoC的内部都包含了pin控制器,通过芯片内部的pin控制器,我们可以配置一个或者一组引脚的状态和功能特性,Linux内核为了统一各SoC厂商的引脚管理,提供了pinctr ...

  6. Linux设备驱动之IIO子系统——IIO框架及IIO数据结构

    由于需要对ADC进行驱动设计,因此学习了一下Linux驱动的IIO子系统.本文翻译自<Linux Device Drivers Development >--John Madieu,本人水 ...

  7. Linux驱动之一个简单的输入子系统程序编写

    的在Linux驱动之输入子系统简析已经分析过了输入子系统的构成,它是由设备层.核心层.事件层共同组成的.其中核心层提供一些设备层与事件层公用的函数,比如说注册函数.反注册函数.事件到来的处理函数等等: ...

  8. Linux内核驱动之GPIO子系统API接口概述

    1.前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制 ...

  9. Linux驱动之触摸屏程序编写

    本篇博客分以下几部分讲解 1.介绍电阻式触摸屏的原理 2.介绍触摸屏驱动的框架(输入子系统) 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍电阻式触摸屏的原理 ...

  10. Linux驱动之GPIO子系统和pinctrl子系统

    前期知识   1.如何编写一个简单的Linux驱动(一)--驱动的基本框架   2.如何编写一个简单的Linux驱动(二)--设备操作集file_operations   3.如何编写一个简单的Lin ...

随机推荐

  1. c++ 获取兄弟窗口

    // 返回给定窗口上方窗口的句柄. HWND prevSibling = GetWindow((HWND)0x1011C, GW_HWNDPREV); printf("%x\n", ...

  2. PriorityQueue使用介绍

    这玩意儿叫优先级队列,是一个类,继承了AbstractQueue类,实现了Serializable接口. jdk文档里是这么描述这玩意的: 基于优先级堆的无限优先级queue . 优先级队列的元素根据 ...

  3. servlet内置对象(传递数据)

    一个servlet向另一个servlet发送数据,可以将数据放置在一个容器中(io.数据库.servlet的内置对象),servlet的内置对象成本最小. 一共有三个内置对象. 名字 类型 reque ...

  4. 构建Docker私有仓库

    一.Docker私有仓库   上一篇说了如何利用Dockerfile在已有镜像的基础上构建自己的镜像,那么如果需要让镜像在一个团队中使用,就需要一个仓库,有几种方式可以共享私有镜像. 1.将镜像上传至 ...

  5. 微信小程序(六)-项目实例(原生框架 MINA基配搭建)==01-头搜索框tabbar

    项目实例(原生框架 MINA) 1.新建小程序项目 1.用自已的小程序APPID 2.清除整理项目中初建默认无关的代码 1.app.json 中删除logs,同时删除pages下的losgs文件夹 2 ...

  6. eclipse修改默认的代码注释

    在使用Eclipse编写Java代码时,自动生成的注释信息都是默认是使用的当前登录系统用户名,实际上是可以修改的. 选择Window → Preference → Java → Code Style  ...

  7. 看完了进程同步与互斥机制,我终于彻底理解了 PV 操作

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...

  8. JUnit5学习之五:标签(Tag)和自定义注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. Java常用类:Arrays类

    一.简介 全类名:java.util.Arrays 描述: 此类包含用来操作数组(比如排序和搜索)的各种方法. 此类还包含一个允许将数组作为列表来查看的静态工厂. 注意: 除非特别注明,否则如果指定数 ...

  10. Java基础语法:JavaDoc

    一.简介 JavaDoc是一种将注释生成HTML文档的技术,它从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档. 也就是说,只要在编写程序时以一套特定的标签作注释,在程序编写 ...