Yuhang Zheng

104x的emmc和SD启动的电平问题

N 人看过

问题描述:

对于ls104x的核心板,其支持两种启动方式,一种是Qspi启动,一种是emmc启动,然后根据客户实际使用需求拓展出了SD卡启动的方式。但实际上,SD卡启动的原理是插入SD卡之后,直接将SOC上的emmc引脚引到SD卡上,直接抢掉了emmc的引脚。

这样做的问题是,由于SD卡的引脚电平为3.3v,emmc的引脚电平是1.8v,所以如果我们将SD卡和emmc启动的镜像使用同一个,按照SD卡的电平来进行设置的的时候,在emmc启动的时候,给emmc的芯片的电压就是3.3v,会使其更容易损坏,emmc输出的引脚电平为1.8v,会被SOC使用3.3v电平域读取的时候误将高电平信号读成低电平信号,导致emmc无法启动或者出现其他不稳定的现象。

所以,我们需要寻找一个新的解决方法。

已知启动顺序:

QSPI启动时,硬件最早介入1.8v——>RCW介入变成3.3v——>uboot的emmc驱动介入(mmc rescan的时候)——>内核驱动介入1.8v

此过程的uboot是由emmc默认配置读入到RAM的

emmc启动时,硬件最早介入1.8v——>RCW介入变成3.3v——>SPL阶段uboot的emmc驱动介入——>内核驱动介入1.8v

此过程的uboot是由SPL中uboot的emmc驱动配置读入到RAM的。

涉及到的引脚和寄存器为:

image_20200426135836

此引脚为SPI_PCS0引脚,由RCW[SPI_BASE]和RCW[SPI_EXT]控制其PinMux功能

image_20200426140042

其引脚描述为:

image_20200426140156

可见,当用作SDHC_VS功能时,它是一个输出引脚,复位状态为0,其作用为将SD组的引脚上的电压控制为高电压(约3.0V)或低电压(约1.8V)。0代表高电压范围

在核心板原理图中,这个的引脚连接为:

image_20200426135625

可见,此引脚和SDHC_CD_B共同作用着EVDD的电平

SDHC_CD_B EVDD_SEL EVDD
0(插入SD卡) 0 3.3V
0(插入SD卡) 1 1.8V
0(插入SD卡) 不控 3.3V
1(未插入SD卡) 0 3.3V
1(未插入SD卡) 1 1.8V
1(未插入SD卡) 不控 1.8V

相关寄存器为:

image_20200426143728

SDHC_VS是用于控制外部SD总线电源电压的输出信号

我们可以看到第31位作用为:

image_20200426143801

SCFG的影子镜像位,此位不能直接控制,由SDHC的VOLT_SEL位映射控制,即此位随着VOLT_SEL改变
0 将 SD 总线电源电压改为高电压范围,3.3V
1 将SD总线供电电压改为低压范围,1.8V。

所以我们转到SDHC的VOLT_SEL寄存器所在实际位置:

image_20200426145158

image_20200426145241

image_20200426145338

VOLT_SEL位是一个电压选择位。更改输出信号SDHC_VS的值,以控制外部卡的SD总线电源电压。 eSDHC之外必须有一个控制电路才能更改电压,即此位只会改SDHC_VS引脚的值,还需要外部硬件电路来实现具体功能。

涉及到的RCW为:

image_20200426150614

此位为EVDD IO的电压域,

EVDD在示波器上的表现:

EVDD

在未插入SD卡启动时,EVDD电平测试点TP8先从0V变为1.8V,此时SOC在硬复位状态,EVDD_SEL引脚为不可控状态,此时SOC会读取emmc上的RCW。之后RCW读取完成之后,SOC完成硬复位,EVDD_SEL引脚变为低电平,TP8也就从1.8V变为3.3V,目前这一电平过程不可控。

关于复位的描述见下面:Image_20200426165048

软件上可以介入的时间为uboot的emmc初始化时,代码位置为:

packages/firmware/u-boot/drivers/mmc/fsl_esdhc.c
static int esdhc_init_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
{
...
/* Put the PROCTL reg back to the default */
        esdhc_write32(&regs->proctl, 0x420);
...
}

此行代码用于将PROCTL寄存器的第21位置1,来实现对EVDD_SEL引脚输出1.8V的设置