一、前言

上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。

 Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于 GPIO的配置推出了 gpio 子系统。

本节先讲解 pinctrl 子系统。


二、pinctrl子系统

1、pinctrl简介

传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl 子系统就是为了解决这个问题而引入的,pinctrl 子系统主要工作内容如下:

①、获取设备树中 pin 信息。 
②、根根据获取到的 pin 信息来设置 pin 的复用功能 
③、据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。

对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成。

2、I.MX6ULL 的 pinctrl 子系统驱动

<1> PIN 设备树配置

pinctrl 子系统要根据你提供的信息来配置 PIN 功能,因此,如果要使用 pinctrl 子系统,我们需要在设备树里面创建一个节点来描述 PIN 的配置信息。

打开 imx6ull.dtsi 文件,找到一个叫做 iomuxc 的节点:

iomuxc: iomuxc@020e0000 { compatible = "fsl,imx6ul-iomuxc"; reg = <0x020e0000 0x4000>;
}; 

打开 imx6ull.dts 文件,找到 iomuxc 节点的追加内容:

&iomuxc { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_hog_1>; imx6ul-evk { pinctrl_hog_1: hoggrp-1 { fsl,pins = < MX6UL_PAD_UART1_RTS_B__GPIO1_IO19      0x17059  MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT   0x17059  MX6UL_PAD_GPIO1_IO09__GPIO1_IO09       0x17059  MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID   0x13058  >; };
...... pinctrl_wdog: wdoggrp { fsl,pins = < MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY    0x30b0 >; };
};

不同的外设使用的 PIN 不同、其配置也不同,因此一个萝卜一个坑,将某个外设所使用的所有 PIN 都组织在一个子节点里面。

这些外设子节点是没有compatible属性的,因此需要使用父节点的compatible属性 (.dtsi文件中) 对应的驱动文件对子节点进行处理。compatible 属性值为“fsl,imx6ul-iomuxc”,我们在 Linux 内核源码中全局搜索字符串“fsl,imx6ul-iomuxc”就会找到 I.MX6ULL 这颗 SOC 的 pinctrl 驱动文件。

<2> PIN 设备树配置信息详解

pinctrl 子系统如何添加 PIN 的配制信息呢?我们以 imx6ull.dts 文件中UART1_RTS_B 这个PIN为例说明:

MX6UL_PAD_UART1_RTS_B__GPIO1_IO19    0x17059

配置信息分为两部分:
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19(复用功能) 和 0x17059(电气属性)

【Linux驱动开发】010 pinctrl子系统相关推荐

  1. linux pinctl 分析,Linux驱动架构之pinctrl子系统分析(一)

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

  2. 【Linux驱动开发】Linux 自带按键驱动

    一.基础 1.以下介绍了 input 子系统的基础,使用的自己编的按键驱动.实际上内核自带了按键驱动(一般默认使能). [Linux驱动开发]INPUT 子系统实验 2.内核自带按键驱动简介 Linu ...

  3. Linux驱动开发:platform总线驱动

    目录 1.为什么需要platform总线 2.设备端:platform_device 2.1 platform_device结构体 2.2 注册 2.3 注销 3.驱动端:platform_drive ...

  4. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用

    文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...

  5. Linux驱动开发(十)---树莓派输入子系统学习(红外接收)

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  6. 如何学习Linux驱动开发?

    原文链接:https://blog.csdn.net/hwunion/article/details/41621655 Linux驱动开发,看起来是一份很高大上的职业,毕竟从事上层应用开发人员太多,而 ...

  7. 最全Linux驱动开发全流程详细解析(持续更新)

    Linux驱动开发详细解析 一.驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁. 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询.中断处理.DMA通信(CPU与外设通信 ...

  8. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  9. Linux驱动开发(外传)---驱动开发调试方法

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  10. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. 28自定义View 模仿联系人字母侧栏
  2. 手把手 | Python代码和贝叶斯理论告诉你,谁是最好的棒球选手
  3. Linux源代码编译安装详解
  4. python全球购代码_理解python的unicode字符串
  5. SQL SERVER 中identity
  6. Linux Redis 安装
  7. c语言中删除有序数组中重复元素,去除有序列表中的重复元素
  8. hdfs如何查找指定目录是否文件_在shell中如何判断HDFS中的文件目录是否存在
  9. c语言标准化考试程序报告,在线考试系统-c语言报告.doc
  10. Day4:python之文件操作、函数初识(2)
  11. cuBLAS矩阵乘法性能分析(附代码示例)
  12. 【Henu ACM Round#19 A】 Vasya the Hipster
  13. 巧用.bat批处理文件
  14. python爬虫-book118
  15. Xposed 模块开发入门
  16. html怎么将背景设为黑色,文字设为白色
  17. 视觉显著性python_OpenCV中的显著性检测(Saliency Detection)
  18. 股市投资必修课二十六--商业竞争决定生死
  19. C#组件系列——又一款Excel处理神器Spire.XLS(二)
  20. 系统分析师上午题-第 8 章 企业信息化战略与实施

热门文章

  1. 信息化幼儿园解决方案
  2. Speeding up Graph Edit Distance Computation with a Bipartite Heuristic 使用二部图匹配寻找顶点的最佳映射
  3. UE4 RHI(2)
  4. LaTeX详细安装+电子科大模板运行
  5. 安卓玩机搞机----移植第三方rom修复 第三方GSI系统修复bug综合解析【一】
  6. 十年OI一场空,不开long long见祖宗
  7. 【0基础到精通】Web渗透测试学习路线
  8. Win7无法识别Vive focus问题
  9. C++控制台坦克大战
  10. 【python numpy】a.cumsum()、np.interp()、np.maximum.accumulate()、np.trapz()