Pinctrl 子系统架构与源码总览

Pinctrl 子系统架构与源码总览

1. 三项职责

1
2
3
pinctrl: 描述 pin和group
pinmux : 在GPIO/外设function之间选择
pinconf: 配置pull/drive/input/output/schmitt等电气属性

GPIO负责读写和中断;Pinctrl负责 pad复用/电气状态,二者通过 gpio-ranges连接。

2. 对象

  • pinctrl_dev:控制器实例;
  • pinctrl_desc:pins、ops、owner;
  • pinctrl:consumer handle;
  • pinctrl_state:default/sleep等状态;
  • pinctrl_setting:mux/config设置;
  • pinctrl_map:consumer、state到 controller/group/function/config的映射;
  • pinctrl_gpio_range:GPIO offset到 pin number。

3. Controller注册

1
2
3
4
5
6
7
8
devm_pinctrl_register(desc, driver_data)
-> pinctrl_register
-> pinctrl_init_controller
-> register pins
-> create pinctrl_dev
-> pinctrl_enable
-> hog maps
-> add controller list/debugfs

新驱动更推荐 devm_pinctrl_register_and_init()后在硬件准备完成时显式pinctrl_enable();本树Rockchip仍使用上述旧的一体式接口。

4. Consumer

1
2
3
4
5
6
7
8
devm_pinctrl_get(dev)
-> create handle
-> parse DT mappings
-> states/settings
pinctrl_lookup_state("default")
pinctrl_select_state()
-> mux enable
-> pinconf apply

Driver Core在 probe前由 pinctrl_bind_pins()自动选择 init/default。

5. Device Tree

Consumer:

1
2
3
pinctrl-names = "default", "sleep";
pinctrl-0 = <&uart2m0_xfer>;
pinctrl-1 = <&uart2_sleep>;

Rockchip group:

1
rockchip,pins = <bank pin mux &config>;

6. RK3588

RK3588由两个驱动协作:

  • pinctrl-rockchip.c:pinctrl、IOMUX、pull/drive/schmitt;
  • drivers/gpio/gpio-rockchip.c:五个GPIO bank、方向/数据、IRQ和GPIO PM。

IOMUX和pad config位于IOC syscon区域,GPIO data/IRQ位于各bank MMIO。RK3588没有route/recalced/slew表;GPIO0 B4–D7的高mux功能由PMU2/BUS双IOMUX路径表达。

7. 配置

PINCTRL_ROCKCHIP默认随 ARCH_ROCKCHIP启用,并 select GPIOLIB、PINMUX、GENERIC_PINCONF、OF_GPIO和 IRQ support。RK805/RK806 PMIC还有独立 pinctrl/GPIO driver。

8. 风险

错误 mux可失去 console、存储、PMIC、PCIe reset或显示;错误 pull/drive/IO voltage可能造成信号完整性问题甚至硬件损伤。

文章互动

阅读 --

留言

0 条留言

正在加载留言…