问题描述:eMMC设备无法识别
基于Intel ATOM平台的E3950的嵌入式主板,存储搭配三星64GB的eMMC:KLMCG2KCTA-B041
bug描述:
从U盘BOOT进入系统后,找不到eMMC。无法安装系统至eMMC。
Debug过程:
1,首先在设计中搭配该CPU的eMMC分别有Sandisk,ISSI以及Samsung。唯独Samsung的eMMC会出现这种找不到设备的现象。
2,从linnux的打印中可以看出Samsung的eMMC初始化失败。
3,量测eMMC的cmd,复位,以及clk发现samsung Fail时会有如下特征:
a:Samsung eMMC的CMD在reset的推high后,会拉低一段时间再释放,正常板子的情况是CMD在复位之前推high,而且不会拉低。
b:正常能boot的eMMC,是能够在boot过程中抓到50Mhz的clk的,先是390KHZ的Fpp,然后是50MHZ的Fod,最后是200MHZ的clk。而Samsung的eMMC在量测到390khz的clk后,没有50mhz,直接跳到100khz,而这个时候也是无法识别eMMC device。
4,实验:
a:在eMMC clk的末端加22PF电容到GND。发现可以识别Samsung的eMMC。后面发现有的板子需要上到33pf才能设别到eMMC。
b:CPU端的eMMC Rcomp,调节该补偿电阻,增大至350ohm,发现有效果。有的板子需要增大Rcomp到470ohm,才能识别eMMC。但是重启会有概率丢失。5,参看apollolake的PDG关于eMMC的design guide,在CLK/CMD/DATA上都有串接10ohm的Rs,旨在抑制overshoot,undershoot。
Root Cause:
在打cmd 初始化device的时候,clk的波形overshoot,undershoot过大。但是基于经验增加20~33pf在1.8v电平的clk上,对于50MHZ左右的波形,会有帮助。而对于390khz的波形不会有大的影响。
待测量:
1, cmd第一次推high的时候,clk的频率。
如果没有clk或者频率为390khz,
如果推测是root cause是cmd初始化的时候fail的,也就是刚开始推high的时候。那么增加电容改善了此时CLK 的波形。
那么我继续增大电容,会不会有反作用。
正常能识别eMMC主板的CMD以及CLK的波形:
正常能识别eMMC主板的触发CMD的下降沿,抓到如下图示:
Fail主板的CMD动作的波形与上附图一样。说明33PF电容影响的是50MHZ CLK的overshoot以及undershoot。只要50MHZ CLK能推出来,就能抓到eMMC,如下是在clk末端对地接15PF电容的波形:
这张50MHZ的eMMC CLK可能就处在Fail的边缘。Overshoot,undershoot过大。
下图是将Rcomp改为470ohm,pass的主板的50mhz clk:
10片里面会有一半的板子,重启会找不到eMMC。所以如上图的50mhz,fail的概率也很大。
总结:
eMMC clk属于单端CLK,而且频率能到50MHZ,200MHZ,所以必须注意其信号完整性的问题。即在eMMC CLK/CMD/DATA处必须预留电阻来抑制信号的overshoot,undershoot。本次案例由于在CPU与eMMC clk之间是直连的,所以只能在eMMC device端,在CLK的过孔处对地接33PF电容。暂时解除主板无法识别Samsung eMMC的bug。
HS200就是最好200M clock,Single data rate,数据速率也是200MB/s
HS400也是最高200M clock,Dual data rate,数据速率400MB/s
DAT0-7
在eMMC上电或者软复位后,只有DAT0可以进行数据传输,完成初始化后,可配置DAT0-3或者DAT0-7进行数据传输,即数据总线可以配置为4bits或者8bits模式。
Data Strobe
Data strobe时钟信号由eMMC发送给Host,频率与CLK信号相同,用于Host端进行数据接收的同步。Data strobe信号只能在HS400模式下配置启用,启用后可以提高数据传输的稳定性,省去总线tuning过程。
怀疑:E3845的eMMC clk的驱动强度弱,而E3950的驱动强度强,导致E3950对于三星eMMC的不兼容?