外部并行总线与板级扩展
1. 共性
WEIM、EBI2、GMI、MBUS、UniPhier System Bus和IXP4xx Expansion Bus连接NOR、SRAM、FPGA、LCD、网卡等板级器件。核心任务是把CPU地址窗口映射到chip select,并配置时序。
1 | CPU address |
2. i.MX WEIM
imx-weim.c:
- 从DT child读取
fsl,weim-cs-timing; - 根据SoC寄存器布局写每个CS timing;
- 处理burst clock;
- 调用
of_platform_populate()创建外设。
时序数组长度必须与SoC data一致,错误值可能造成总线锁死或外部器件损坏。
3. Qualcomm EBI2
qcom-ebi2.c配置CS mode和设备timing,支持NAND、SRAM等。Parent完成寄存器配置后populate child。
EBI2 pinctrl、电压域和外部总线宽度必须与板级原理图一致。
4. Tegra GMI
tegra-gmi.c管理clock、reset、chip select、bus width和timing。Runtime/system PM需要确保外设操作期间GMI clock保持。
5. Marvell MBUS
mvebu-mbus.c管理地址decode windows:
- target/attribute;
- base/size;
- remap;
- DRAM window;
- PCIe等master可见范围。
Window必须按硬件粒度对齐且不可重叠。错误窗口可能让DMA访问错误外设或越过内存边界。
6. UniPhier System Bus
uniphier-system-bus.c解析每个bank的地址、宽度和timing,将纳秒转换为时钟周期并写控制器,然后populate child。
若目标timing超过字段范围,driver应报错而不是截断。
7. IXP4xx Expansion Bus
intel-ixp4xx-eb.c通过syscon配置CS,支持flash及板级扩展器件。它必须先于child discovery完成,防止child driver以bootloader遗留时序访问。
8. HiSilicon LPC
hisi_lpc.c不同于memory-mapped并行总线:它为ARM64提供ISA I/O port到LPC transaction的间接PIO映射,处理I/O cycle和错误。
使用者调用inb/outb风格接口,底层并非普通MMIO load/store。
9. MOXTET与TS-NBUS
- MOXTET通过SPI串行探测Turris MOX模块链,注册自定义module devices并控制GPIO/IRQ;
- TS-NBUS通过GPIO和PWM产生FPGA NBUS时序。
它们是特定板级产品总线,不是通用SPI/GPIO替代层。
10. Device Tree要点
外部总线parent通常提供:
reg和clock/reset;#address-cells/#size-cells;ranges;- chip-select timing;
- bus width;
- pinctrl;
- child device compatible。
DT地址转换错误时,child虽然probe成功,也可能访问错误物理地址。
11. 安全与可靠性
- 不允许用户态随意修改timing/syscon;
- 外部FPGA/NOR窗口不应映射到非特权进程;
- DMA-capable child需IOMMU或受限DMA mask;
- suspend前停止child I/O;
- reset后必须恢复timing再恢复children。
12. RK3588
RK3588没有使用这些控制器。其外部存储、PCIe和低速外设由专用drivers目录负责;不能选择一个“类似AXI/并行总线”驱动来替代Rockchip控制器。
正在加载留言…