前面我们使用设备树来驱动LED灯,其实就是将LED寄存器地址写入到设备树的属性reg中,通过OF函数 ,读取到LED灯的寄存器信息,从而操作寄存器来控制LED灯。在操作LED灯时候,我们使用到GPIO这个引脚,通过对这个GPIO的控制来实现LED灯的控制。
一、pinctrl子系统
pinctrl子系统,用来设置pin(引脚)的复用功能和配置这个pin的电气属性。主要体现:
- 获取设备树中pin信息。
- 根据获取到的pin信息来设备pin的复用功能。
- 根据获取到的pin信息来设备pin的电气属性,比如上/下拉、速度、驱动能力等。
对于我们来说,只需要在设备树里面设置好某个pin的相关属性,其他的初始化工作pinctrl子系统来完成,pinctrl子系统源码目录为drivers/pinctrl
pin配置信息详解
要使用 pinctrl 子系统,我们需要在设备树里面设置 PIN 的配置信息,毕竟 pinctrl 子系统要
根据你提供的信息来配置 PIN 功能,一般会在设备树里面创建一个节点来描述 PIN 的配置信
息。在imx6ull.dtsi中有者三个节点表示imx6ull的pin引脚:
iomuxc: iomuxc@020e0000 {
compatible = "fsl,imx6ul-iomuxc";
reg = <0x020e0000 0x4000>;
};
gpr: iomuxc-gpr@020e4000 {
compatible = "fsl,imx6ul-iomuxc-gpr",
"fsl,imx6q-iomuxc-gpr", "syscon";
reg = <0x020e4000 0x4000>;
};
iomuxc_snvs: iomuxc-snvs@02290000 {
compatible = "fsl,imx6ull-iomuxc-snvs";
reg = <0x02290000 0x10000>;
};
imx6ull的参考手册
在imx6ull-alientek-emmc.dts中,对pin进行追加信息比如:
不同的外设使用的 PIN 不同、其配置也不同,因此一个萝卜一个坑,将某个外设所使用的所有 PIN 都组织在一个子节点里面。其中,在iomux节点下有个imx6ul-evk的子结点,这个节点就是用来描述evk这个开发板外设所使用到的pin。简单来说就是在这个节点来表示出来evk开发板的各个功能使用到哪些引脚和引脚是哪一个。比如:hoggrp-1这个evk节点下面的子结点,表示热插拔功能所需要的引脚。
关于MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 含义:
这是一个宏定义,定义在文件arch/arm/boot/dts/imx6ul-pinfunc.h 中, imx6ull.dtsi 会引用 imx6ull-pinfunc.h 这个头文件,而imx6ull-pinfunc.h 又会引用 imx6ul-pinfunc.h 这个头文件,
在imx6ull参考手册中我们可以看出来MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 这个宏就是表示UART1_RTS_B这个引脚复用为GPIO1_IO19功能 。
<mux_reg conf_reg input_reg mux_mode input_val>
0x0090 0x031C 0x0000 0x5 0x0
0x0090:mux_reg寄存器偏移地址,复用功能寄存器地址。
0x031C: