1. Zynq-7000双SD卡控制器应用背景
在嵌入式系统开发中,Zynq-7000系列SoC因其ARM+FPGA的异构架构而广受欢迎。其PS端(Processing System)内置两个SDHCI控制器(sdhci0和sdhci1),这为需要多存储介质的应用场景提供了硬件基础。实际项目中,我们常遇到以下典型需求:
- 双卡冗余备份:工业设备中通过两张SD卡存储相同数据提升可靠性
- 主从存储分离:系统镜像存储在主卡(sdhci0),用户数据存储在从卡(sdhci1)
- 大容量扩展:通过两张SD卡突破单卡容量限制
关键提示:Zynq-7000的sdhci0通常连接至SD卡槽,sdhci1多用于eMMC芯片。若硬件设计未引出sdhci1信号线,需先确认板级原理图。
2. U-Boot下的SDHCI驱动框架分析
2.1 控制器初始化流程
Zynq-7000的SDHCI驱动位于drivers/mmc/zynq_sdhci.c,初始化过程涉及:
- 时钟配置(通过SLCR寄存器设置IOU_SLCR_SDIO_CTRL)
- 引脚复用设置(MIO或EMIO模式选择)
- 电源域使能(PS_PWR_SUPPLY寄存器组)
- 控制器寄存器基地址映射(sdhci0: 0xE0100000, sdhci1: 0xE0101000)
2.2 双控制器共存条件
要使两个控制器同时工作,必须确保:
- 不同的设备树节点(sdhci0和sdhci1)
- 独立的DMA通道配置
- 不冲突的GPIO引脚分配
- 足够的电源供应(尤其使用高速卡时)
3. 设备树(DTS)关键配置
3.1 基础节点定义
dts复制/ {
amba {
sdhci0: sdhci@e0100000 {
compatible = "arasan,sdhci-8.9a";
status = "okay";
clock-names = "clk_xin", "clk_ahb";
clocks = <&clkc 21>, <&clkc 32>;
interrupt-parent = <&intc>
