Pinmux、功能组与 GPIO 所有权
1. Pin、Group、Function
1 | function "uart2" |
Core选择 function+group,controller把每个 pin写成对应 mux value。
2. Request
Mux setting enable时,Core为 group pins申请 mux ownership。Disable时释放。debugfs可显示 owner。
3. Strict
strict=true的 controller禁止同一 pin同时由 GPIO和 mux function申请。它防止两个使用者并发控制,但无法发现未通过框架的 bootloader/firmware寄存器修改。
本树 Rockchip pinmux_ops没有设置 strict,也没有 gpio_request_enable;GPIO direction callback会检查当前 mux,若发现已有 mux owner且非GPIO则首次 WARN,随后仍强制切换到 GPIO。故不能把 Core ownership当作 RK3588上的强冲突阻断机制。
4. GPIO range
1 | gpio-ranges = <&pinctrl gpio_offset pin_offset count>; |
RK3588:
- gpio0:pin 0–31;
- gpio1:32–63;
- gpio2:64–95;
- gpio3:96–127;
- gpio4:128–159。
GPIOLIB方向设置会进入 Rockchip gpio_set_direction callback,将 pin切为 GPIO mux 0。
5. Direction
GPIO direction/output在 GPIO bank寄存器;pinconf的 output-high/output-low可能在 mux/config阶段预置 GPIO输出,避免 glitch。
6. Multiple mux routes
同一 peripheral可有 M0/M1/M2多套 pins。只能选择与板级布线一致的一组。某些 mux值还需 route寄存器选择内部信号路径。
7. Conflicts
常见:
- UART debug与 PWM/IR;
- I2C与 GPIO reset;
- SPI与 camera/control;
- SDMMC与 JTAG;
- HDMI/DP辅助信号;
- PCIe reset/clkreq;
- PMIC interrupt;
- USB VBUS control。
8. Dynamic switching
运行时在两个 states间切换时,外设应先 quiesce:
1 | disable IRQ/DMA |
只改 mux而不停止硬件会造成毛刺和总线争用。
正在加载留言…