泰坦科技网站建设网站搜索排名优化软件
1、什么是pinctrl子系统
在 Linux 内核中,pinctrl子系统是一个专门用于管理和控制 SoC引脚复用和配置的子系统。SoC 通常具有大量的引脚(pin),这些引脚可以被配置为不同的功能,比如 GPIO(通用输入输出)、I2C、SPI、UART 等。而 pinctrl 子系统的任务就是为这些引脚提供一个统一的配置接口。
2、pinctrl子系统的3大功能
- 引脚枚举与命名(Enumerating and naming)
- 引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能
- 引脚配置(Configuration):比如上拉、下拉、open drain、驱动强度等
而在linux内核驱动里面也是使用了面向对象的思想来使用了3个结构体来描述了这三个功能,分别是pinctrl_ops,pinmux_ops,pinconf_ops、
这3个结构体又分别对应了上面所说的3个功能
struct pinctrl_ops:实现了pinctrl子系统的操作函数,包括获取引脚组数量、获取引脚组名称、获取引脚组引脚、调试显示引脚、设备树节点映射到引脚组以及释放映射。
struct pinmux_ops:实现了pinmux子系统的操作函数,包括获取功能数量、获取功能名称、获取功能对应的引脚组以及设置引脚的复用功能
struct pinconf_ops:实现了pinconf子系统的操作函数,包括获取引脚配置、设置引脚配置、调试显示引脚配置以及调试显示引脚组配置。
下面是设备树里面描述一个io多路复用控制器的字段
&iomuxc {pinctrl-names = "default";pinctrl-0 = <&BOARD_InitPins>;imx6ull-board {i2c1_pins: i2c1_pins { /*!< Function assigned for the core: Cortex-A7[ca7] */fsl,pins = <MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x000018B0MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x000018B0>;};};
};&i2c1 {clock-frequency = <100000>;pinctrl-names = "default";pinctrl-0 = <&i2c1_pins>;status = "okay";
};
pinctrl子系统里面,是怎么注册他的驱动的,他也是依靠设备总线模型来操控的,pinctrl_dev直接由设备树来生成,pincrl_desc是需要由驱动程序员来完成的,而这个pincrl_desc这个结构体里面就包含了上面那个3个结构体。一旦iomux控制器被设备树描述过后,我们就可以使用他比如像上面的i2c1把他复用成i2c设备控制器,而i2c控制器又可以被i2c client引用描述i2c设备