Linux学习笔记--Pinctrl子系统示例
Pinctrl:Pin Controller,顾名思义,就是用来控制引脚的:
-
引脚枚举与命名(Enumerating and naming)
-
引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能
-
引脚配置(Configuration):比如上拉、下来、open drain、驱动强度等
Pinctrl驱动由芯片厂家的BSP工程师提供,一般的驱动工程师只需要在设备树里:
-
指明使用那些引脚
-
复用为哪些功能
-
配置为哪些状态
针对 i.MX6ULL 处理器的设备树节点,用于配置 IOMUXC(输入输出多路复用控制器)
&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>;};};
};解释
1. 外层节点
&iomuxc {pinctrl-names = "default";pinctrl-0 = <&BOARD_InitPins>;
-
&iomuxc
:引用 iomuxc 节点进行覆盖/扩展 -
pinctrl-names
:定义引脚控制状态名称,这里只有"default"状态 -
pinctrl-0
:引用BOARD_InitPins
节点作为默认引脚配置
2. 板级特定配置节点
imx6ull-board {i2c1_pins: i2c1_pins {fsl,pins = <MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x000018B0MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x000018B0>;};
};
引脚功能复用
-
MX6UL_PAD_UART4_RX_DATA__I2C1_SDA
:将 UART4_RX_DATA 引脚复用为 I2C1_SDA 功能 -
MX6UL_PAD_UART4_TX_DATA__I2C1_SCL
:将 UART4_TX_DATA 引脚复用为 I2C1_SCL 功能
配置值 0x000018B0 解析
这个32位配置值控制引脚的电气特性:
位域 | 值 | 功能说明 |
---|---|---|
SRE | 0 | 压摆率:慢速压摆率 |
DSE | 0x3 (011) | 驱动强度:R0/3 (约40欧姆) |
SPEED | 0x2 (10) | 速度:中速(100MHz) |
ODE | 0 | 开漏输出:禁用 |
PKE | 1 | 引脚保持器:启用 |
PUE | 1 | 上拉/下拉选择:上拉 |
PUS | 0x2 (10) | 上拉/下拉强度:22K欧姆上拉 |
HYS | 1 | 滞回器:启用 |
这个配置:
-
复用 UART4 引脚为 I2C1 功能
-
配置适当的电气特性用于 I2C 通信
-
启用上拉电阻(I2C 总线需要上拉)
-
设置中速驱动适合 I2C 通信速度
完整的 i2c1 节点配置
&i2c1 {clock-frequency = <100000>; /* I2C 时钟频率:100kHz */pinctrl-names = "default"; /* 引脚控制状态名称 */pinctrl-0 = <&i2c1_pins>; /* 使用之前定义的 i2c1_pins 引脚配置 */status = "okay"; /* 启用该控制器 *//* 可选的 I2C 设备子节点 */eeprom: eeprom@50 {compatible = "atmel,24c02";reg = <0x50>;pagesize = <16>;};touchscreen: touch@38 {compatible = "edt,edt-ft5406";reg = <0x38>;interrupt-parent = <&gpio1>;interrupts = <9 IRQ_TYPE_EDGE_FALLING>;};
};
属性详解
1. clock-frequency = <100000>
-
作用:设置 I2C 总线时钟频率
-
值:100,000 Hz = 100 kHz
-
说明:这是 I2C 标准模式的速度,常见值还有:
-
100000
= 100 kHz(标准模式) -
400000
= 400 kHz(快速模式) -
1000000
= 1 MHz(高速模式)
-
2. pinctrl-names = "default"
-
作用:定义引脚控制状态名称
-
值:只有 "default" 状态
-
说明:表示这个引脚配置用于默认状态
3. pinctrl-0 = <&i2c1_pins>
-
作用:引用具体的引脚配置
-
值:指向之前定义的
i2c1_pins
节点 -
说明:将物理引脚与 I2C1 功能关联起来
4. status = "okay"
-
作用:启用该外设控制器
-
值:
-
"okay"
或"ok"
:启用 -
"disabled"
:禁用
-
-
说明:必须设置为 "okay" 才能使用 I2C1 控制器
eeprom@50 {compatible = "atmel,24c02";reg = <0x50>;pagesize = <16>; /* 页大小 */size = <256>; /* 总大小 */address-width = <8>; /* 地址宽度 */
};
节点名称:eeprom@50
-
eeprom
:设备类型标识 -
@50
:I2C 设备地址(16进制),表示设备地址为 0x50
compatible = "atmel,24c02"
-
作用:用于设备驱动匹配
-
值:
-
"atmel,24c02"
:指定设备兼容 Atmel 的 24C02 EEPROM -
内核会根据这个字符串找到对应的驱动程序
-
reg = <0x50>
-
作用:设备的 I2C 从地址
-
值:
0x50
(7位地址) -
说明:在 I2C 总线中,这个地址用于寻址该设备