手头上的板子,am335x 通过 mmc0 接口接了个 4G 的emmc 芯片 KE44B-26BN/4GB,无法上电时从 mmc0 启动板子。
上电时量了下 mmc0 的各个管脚信号,发现 mmc0_cmd 和 mmc0_clk 都有信号,但 mmc0_data0 却一直没信号。
看了 TRM的26.7.1.5.2 以及之前和 ti 的工程师交流过,只要 emmc 芯片是兼容 V4.41 规范,那么从 mmc0 接口启动时没问题,这边已经确认了 KE44B-26BN/4GB 这个芯片是兼容 emmc 的 V4.41 规范的,但 目前看好像没有启动成功,
只是比较奇怪的是,使用mmc1 + sd 卡的方式让板子启动到linux,然后再去读写 mmc0 下挂接的emmc芯片,则一切正常;甚至在 将boot文件烧入emmc芯片后,修改uboot里的spl_boot_device 函数让板子在SPL 阶段去读取放在 emmc 芯片上的uboot来启动,也是可以成功启动。这样看来,硬件连线是没问题的。
现在想请问下,ti的工程师,像这样的上电无法从mmc0 接口启动的问题,其最大的可能原因是什么?
Yaoming Qin:
1. 起来后,可以读写MMC0 这个和能不能启动是两码事,因为起来后,是Linux的驱动,而eMMC启动的限制主要是rom code里面的驱动的限制
2. 起不来,有可能是sysboo设置不正确,或者eMMC的内容没有烧写正确,可以分别排查下
quan liang:
回复 Yaoming Qin:
sysboot 设置不正确是可以排除的,因为用示波器去量板子上电时 mmc0 的 cmd 和 clk 信号,得到的前几个波形跟 Beaglebone black 的 mmc1 接口一样(BBB上是用 mmc1 连接emmc芯片);而且我们将第一个时钟周期的波形抓下来对着 MMC4.41 协议去分析,发现cpu 应该是发了一 个CMD0 命令给 emmc芯片(这点也比较奇怪,按照 335X TRM 26.1.7.5.4 ,cpu发的第一个命令应该是 CMD1)。也就是说,CPU是有去轮询mmc0 接口的。
现在正在排除eMMC 的内容没有烧写正确。只是我们也量了 mmc0 data0 管脚的波形,发现从上电起一直是高电平,是不是就可以认为mmc芯片没有回任何数据给cpu? 因为,我在uboot下用 mmc read命令去读取emmc芯片的内容,发现如果没有去初始化emmc芯片,其中内容的默认值是全零。
除了测量mmc0 的data管脚,Qin 工有没什么好办法来确认emmc的内容是否烧写正确?
此外,TRM 26.1.7.5.3 上说,335x的mmc接口如果接的是 eMMc/eSD embeded memory, 则只支持 raw mode;这个有没影响? 我觉得最起码,mmc芯片应该有数据返回给cpu,然后cpu再去判断这个数据是不是 “raw mode” 的数据;目前看,mmc0_data0 管脚上似乎是没数据发给cpu
Yaoming Qin:
回复 quan liang:
eMMC上还是用fat32吧,您可以先用sd卡起linux,然后在linux中用命令格式化这个eMMC,放入MLO u-boot.img等,再看能不能启动。
另外,sysboot最好从硬件上看看。
quan liang:
回复 Yaoming Qin:
之前已经用你说的方法去格式化eMMC了;然后先用串口起SPL,再通过修改SPL 中的 spl_boot_device 接口,让板子从eMMC启动 uboot 和 kernel,是成功的;
就是从eMMC 启动 MLO失败了。
sysboot 用仿真器确认了 是 11100;启动顺序是MMC1 –> MMC0 –> UART0 –> USB0 。
Yaoming Qin:
回复 quan liang:
起不来的时候,串口会打印CCC吗
quan liang:
回复 Yaoming Qin:
会打印CCC; 这个说明啥?
Jian Zhou:
回复 quan liang:
这个说明启动的时候跳过了MMC1和MMC0,去UART启动了。
我们spec上说4G以上的EMMC要接在MMC1上的。
fulin chen:
回复 Jian Zhou:
你好, 我遇到一个跟楼主很相似的情况,就是我的是用MMC0 接口接的SD卡, sd卡已经启动成功了, 但是我的MMC1接的是eMMC 4g的, 现在我想让我的板子从emmc启动,我start.S里面加了汇编代码亮一个灯, 在SD里面能顺利的亮起来, 但是把MLO烧到EMMC里面就完全没有反应。不知道这是一个什么情况,能不能给点提示。我的SYSBOOT 在EMMC启动的是11100b 是没有问题,这是硬件上检查过了的。
Jian Zhou:
回复 fulin chen:
eMMC你是通过什么方式烧写的。
fulin chen:
回复 Jian Zhou:
我是通过启动MMC0 的SD, 进了系统之后,dd if=/dev/mmcblk1 …. 分区, 第一个分区是fat32 , 然后把我改过参数后的u-boot 已经MLO 放进去了, 其实就改了一个那个MMC的那个地址。 然后启动的完全没有输出,也没有CCC