pinctrl(Pin Control)子系统是Linux内核中的一个模块化子系统,用于管理和控制硬件引脚(Pin)的配置和功能。它提供了一种统一的接口,使驱动程序可以对硬件引脚进行灵活的配置和控制。
pinctrl子系统的主要目的是将引脚的配置和控制与设备驱动程序的实现分离开来,从而提高驱动程序的可移植性和可重用性。通过使用pinctrl子系统,设备驱动程序可以独立于特定的硬件平台,并在不同的平台上共享或重新使用。
pinctrl子系统的核心是pinctrl核心层和pinctrl驱动程序两个部分:
pinctrl核心层:提供了pinctrl子系统的核心功能,包括设备引脚的注册、配置和控制等。它负责管理所有的pinctrl驱动程序和设备引脚配置数据,并为设备驱动程序提供统一的接口。
pinctrl驱动程序:每个特定的硬件平台都需要相应的pinctrl驱动程序来管理和控制硬件引脚。这些驱动程序负责与硬件平台的引脚控制器交互,执行引脚的配置和控制操作。每个pinctrl驱动程序通常与特定的硬件平台或芯片系列相关联。
i.MX6ULL的pinctrl子系统具有以下特点和功能:
一、引脚配置:pinctrl子系统允许驱动程序对每个引脚进行灵活的配置。它提供了一组接口,允许驱动程序选择引脚的功能、复用模式和电气属性。通过配置pinctrl,驱动程序可以将引脚用于不同的外设接口,例如UART、SPI、I2C、GPIO等。
二、引脚复用:i.MX6ULL支持引脚的多功能复用,即一个引脚可以用于多种不同的功能。pinctrl子系统允许驱动程序将引脚设置为特定功能的输入或输出,以适应不同的外设连接需求。
三、中断控制:对于支持中断的引脚,pinctrl 子系统提供了接口用于配置中断模式和触发方式。这使得 i.MX6ULL 能够与外部设备进行有效的中断信号传递和处理。
四、状态保存和恢复:pinctrl 子系统支持状态的保存和恢复,以便在系统休眠和唤醒过程中保持引脚配置的一致性。
i.MX6ULL的引脚描述使用设备树来定义。设备树中定义了引脚的功能选项、复用模式、电气属性等信息。通过设备树,可以将引脚与相应的功能关联起来。也就是前面将的IOMUX。
在设备树中的体现形式如下:
&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 /* SD1 CD */ MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059 /* SD1 VSELECT */ MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059 /* SD1 RESET */ >; }; ...... pinctrl_i2c1: i2c1grp { fsl,pins = < MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0 MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0 >; }; ...... pinctrl_uart1: uart1grp { fsl,pins = < MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1 MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1 >; }; ..... } |
可以看出在iomux节点中定义了各个引脚的复用功能,需要注意的是一个引脚只能复用成一种功能,所以在添加引脚复用时一定要检查,其它地方有没有用到选用的引脚,如果选用了要将其屏蔽掉,避免复用冲突。