【Linux驱动开发】010 pinctrl子系统
一、前言
上一章我们编写了基于设备树的 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(电气属性)
1.前言 在嵌入式系统中,许多SoC的内部都包含了pin控制器,通过芯片内部的pin控制器,我们可以配置一个或者一组引脚的状态和功能特性,Linux内核为了统一各SoC厂商的引脚管理,提供了pinct ... 一.基础 1.以下介绍了 input 子系统的基础,使用的自己编的按键驱动.实际上内核自带了按键驱动(一般默认使能). [Linux驱动开发]INPUT 子系统实验 2.内核自带按键驱动简介 Linu ... 目录 1.为什么需要platform总线 2.设备端:platform_device 2.1 platform_device结构体 2.2 注册 2.3 注销 3.驱动端:platform_drive ... 文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ... 前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ... 原文链接:https://blog.csdn.net/hwunion/article/details/41621655 Linux驱动开发,看起来是一份很高大上的职业,毕竟从事上层应用开发人员太多,而 ... Linux驱动开发详细解析 一.驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁. 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询.中断处理.DMA通信(CPU与外设通信 ... Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ... 前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ... 1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...【Linux驱动开发】010 pinctrl子系统相关推荐
最新文章
热门文章