Sigmastar eMMC_debugsop手册
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 02/21/2024 |
1. 无法正常识别eMMC设备¶

流程 | 方法 | 出口条件 | 下一步 | 需提供给FAE的资料 | 相关可参考FAQ |
---|---|---|---|---|---|
A | 1.使用万用表确认eMMC的vcc电压初始化阶段是否3.3v 2.确认缺省情况下clk-line为低电平,cmd/data-line为高电平 3.确认eMMC的vccq(IO)电压是否为1.8/3.3v范围,EMMC跑HS200或HS400模式,vccq电压必须为1.8V |
出口条件1: 1.初始化阶段eMMC的vcc供电与3.3v差距较大, 2.或bus-line的缺省状态不对, 3.或eMMC的vccq供电未在1.8/3.3v有效范围内 > 供电问题 出口条件2: 供电正常>无问题 |
出口条件1: >流程结束 出口条件2: >B |
出口条件1: ==>寻求硬件协助 |
|
B | 1.确认eMMC的padmux配置是否与开发板对应,pad是否与其他mode有冲突方法: cd vim pcupid_xxxx-padmux.dtsi emmc padmux mode会带有'EMMC8B_BOOT'关键字,对应的gpio pad需要重点确认与其他模块是否存在复用的情况 2.确认eMMC的dts相关配置是否和当前使用槽位配套方法: cd vim pcupid.dtsi 相关配置项含义请参阅《eMMC使用参考》,重点关注: 2.1 no-sdio/no-sd/no-mmc,此三项配置接入哪种类型设备则注释对应项,并配置另外两种,比如:接入emmc卡,则注释no-mmc,并配置no-sdio/no-sd |
出口条件1: 1.padmux未正确配置或者存在与其他mode冲突情况 2.dts中eMMC的相关配置项与当前使用的槽位不匹配 > 配置错误问题 出口条件2: 配置正常> 无问题 |
出口条件1: >流程结束 出口条件2: >C |
出口条件1: ==>寻求硬件FAE确认当前开发板使用的padmux情况,然后按照实际情况配置正确的padmux和dts |
|
C | 1.更换相同规格eMMC再次测试是否正常识别 2.更换开发板测试相同规格eMMC是否正常识别 3.在其他平台测试相同规格eMMC是否正常识别 |
出口条件1: 更换相同规格eMMC后可以正常识别 > eMMC设备问题 出口条件2: 更换开发板测试后可以正常识别 > 开发板问题 出口条件3: 在其他平台测试后可以正常识别 ==>驱动存在问题 |
出口条件1: >流程结束 出口条件2: >流程结束 出口条件3: ==>流程结束 |
出口条件3: >1.提供串口log >2.使用LA或者示波器抓取初始化整个过程的波形 ==>3.在linux控制台下通过riu命令dump eMMC IP的相关bank信息: 0x1410/0x1038/0x103C/0x103E |
2. eMMC读写失败问题¶

流程 | 方法 | 出口条件 | 下一步 | 需提供给FAE的资料 | 相关可参考FAQ |
---|---|---|---|---|---|
A | 出错时根据关键字"[sdmmc"检索debug log,主要关注error num: 1.(E: 0x0001):读CRC 2.(E: 0x0002):写CRC 3.(E: 0x0010):CMD CRC 3.(E: 0x0100):驱动报Timeout 4.(E: 0x0008):IP报Device No Rsp |
出口条件1: 1.cmd 12/13/17/18/23/24/25等读写相关命令,执行报CRC错误 出口条件2: 1.cmd 12/13/17/18/23/24/25等读写相关命令,执行报Timeout错误 出口条件3: 1.cmd 12/13/17/18/23/24/25等读写相关命令,执行报device不响应错误 |
出口条件1: >B 出口条件2: >C 出口条件3: ==>D |
||
B | CRC问题本质是信号质量差,可根据CRC报错类型并结合调整driving(0-7)选择pad最佳驱动能力 | 出口条件1: 1.CRC报错类型是RX CRC,即读取时报错 出口条件2: 1.CRC报错类型是TX CRC,即写入时报错 出口条件3: 1.其他CRC报错类型 |
出口条件1: >E 出口条件2: >F 出口条件3: ==>G |
||
C | 1.驱动读写操作报超时问题,第一时间抓取波形确认是否传输性能存在问题 2.查阅波形并无问题情况下,判断eMMC MIE中断是否正常上报或接收,判断方法见<附录5> 3.检查eMMC Timing是否存在异常,常见Timing问题见<附录5> 4.以上情况均无问题,考虑eMMC Device是否异常 |
出口条件1: 1.根据波形查看当前工作频率低于预期 出口条件2: 1.检查bus width是与预期不符 出口条件3: 1.根据Debug log显示出错时相关event没有正常触发 出口条件4: 1.eMMC Timing异常 出口条件5: 1.eMMC Device原因 导致card busy情况 |
出口条件1: >I 出口条件2: >J 出口条件3: >K 出口条件4: >G 出口条件5: ==>L |
||
D | 1.eMMC IP报Device 无响应问题,可以抓取波形确认是否CMD发出后没有收到响应 2.参考<1:无法正常识别eMMC设备>,检查相关配置是否正确 3.优先检查硬件电气通路是否正常,运行环境是否加干扰测试(比如打静电、高低温等) 4.检索Debug log查找"SAR1 SDMMC WARN trigger"关键字,判断是否存在掉电保护被误触发情况 5.检查eMMC Timing是否存在异常 6.以上情况均无问题,考虑eMMC Device是否异常 |
出口条件1: 1.检查配置无问题,波形显示CMD发出后,未接收到Device响应 出口条件2: 1.检查CHIP到eMMC 子板之间的电气通路存在明显信号衰减 出口条件3: 1.运行环境当前正在进行打静电或高低温等压力测试 出口条件4: 1.检索Log,发现eMMC在未断电情况下,出现掉电保护被触发现象 出口条件5: 1.eMMC Timing异常 出口条件6: 1.eMMC Device原因导致不响应情况 出口条件7: 1.波形显示Device有响应,但是IP判断为未响应 |
出口条件1: >流程结束 出口条件2: 1.请硬件协助排查问题 出口条件3: >流程结束 出口条件4: >流程结束 出口条件5: >G 出口条件6: >L 出口条件7: >流程结束 |
出口条件1: 1.dump debug log以及DTS配置文件 出口条件3: 出口条件4: 1.dump debug log |
|
E | 调整driving(0-7) | 出口条件1: 1.根据实际情况设置data driving档位后恢复正常 出口条件2: 1.尝试所有data driving档位后仍然报CRC错误 |
出口条件1: >流程结束 出口条件2: >G |
||
F | 调整driving(0-7)> | 同"E" | 同"E" | ||
G | 1.调整driving(0-7) 综合调节CLK/CMD line的驱动能力 2.调节CLK相位 3.根据TMUX表以及eMMC REG表调整时钟信号采样模式 4.trans-mode使用DMA时,需要设置reg_dma_rd_clk_stop避免造成丢数据 5.使用LA或示波器抓取出问题阶段的完整波形 |
出口条件1: 1.通过综合调节信号线的驱动档位后恢复正常 出口条件2: 1.通过调节CLK的四相位或八相位后恢复正常 出口条件3: 1.通过调节时钟信号采样模式后恢复正常 出口条件4: 1.DMA Mode传输模式场景下,设置offset:0xb bit7后恢复正常 出口条件5: 1.以上措施均无效果,波形与正常情况下的波形存在差异,比如上升沿采样锁定时间不达标、cmd overlap、cmd 最小interval不达标等 出口条件6: 1.确认以上设定均正常,波形无异常 |
出口条件1: 出口条件2: 出口条件3: 出口条件4: >流程结束 出口条件5: >流程结束 出口条件6: ==>H/L |
出口条件5: 1.dump整个过程的完整debug log,包括从emmc init开始到出现问题期间的日志 2.抓取异常场景的完整波形,最好有相同条件下正常场景的波形作为对比 3.在linux控制台下通过riu命令dump eMMC IP的相关bank信息: 0x1410/0x1038/0x103C/0x103E/0x141A |
|
H | 1.根据手册明确当前槽位eMMC IP使用的版本 1.1 eMMC4.3最高支持48MHz 1.2 eMMC5.0 HS200/HS400最高支持200MHz 2.在IP允许的频率范围内确认是否已经是最高一档 3.读取bank 0x1038 offset 0x43/bank 0x42 offset 0x24确认CLK是否按照预期设置成功 |
出口条件1: 1.调整CLK到最高档,通信恢复正常 出口条件2: 1.调整CLK无效果或者已经是最高档 出口条件3: 1.CLK设定与寄存器读取数值不符 |
出口条件1: >流程结束 出口条件2: >J 出口条件3: ==>流程结束 |
出口条件3: 1.dump 0x1038/0x1133寄存器信息 2.提供dts配置文件 3.提供Debug Log |
|
I | 1.根据SPEC文档,对于不同的速率模式有对应支持的总线位宽 1.1 eMMC4.3 可使用1bit/4bit/8bit Buswidth 1.2 eMMC5.0 HS200可使用4bit/8bit位宽 1.3 eMMC5.0 HS400仅支持8bit位宽 2.读取bank 0x1410 offset 0xb[2:1]确认 |
出口条件1: 1.调整Buswidth到对应速率模式的最大位宽,通信恢复正常 出口条件2: 1.调整Buswidth无效果或者已经是该速率模式下最大位宽 出口条件3: 1.Buswidth设定与寄存器读取数值不符 |
出口条件1: >流程结束 出口条件2: >K 出口条件3: ==>流程结束 |
出口条件3: 1.dump 0x1410寄存器信息 2.提供dts配置文件 3.提供Debug Log |
|
J | 1.读取bank 0x1410 0ffset 0x0[1:0]判断读写完成event是否举起 2. 如果event已经被触发但是驱动仍然报超时,优先检查CPU Loading和中断触发次数情况 |
出口条件1: 1. 在驱动超时时间内,event没有被举起 出口条件2: 1.event已经被举起,且CPU Loading高或中断大量触发 出口条件3: 1.event正常举起,且环境无其他异常 |
出口条件1: >流程结束 出口条件2: 排查CPU Loading高的进程是哪个,尝试将eMMC MIE中断处理绑核到CPU1 出口条件3: >G |
出口条件1: 1.提供公版复现手法 |
|
K | 1.先确认eMMC使用寿命是否已到: cd /sys/kernel/debug/mmc/mmc:xxxx cat ext_csd 其中第537~538位标识life time,具体参阅SPEC 2.参考<1:无法正常识别eMMC设备>的交叉验证章节 3.重新补焊eMMC颗粒 |
出口条件1: 1.eMMC life time已经超过最大值或者使用寿命接近最大值 出口条件2: 1.交叉验证或补焊后,通信恢复正常 出口条件3: 1.确认eMMC设备正常 |
出口条件1: >更换eMMC 出口条件2: >流程结束 出口条件3: ==>流程结束 |
出口条件3: 1.提供公版复现手法 |
|
M | 1.使用万用表或示波器对CHIP到eMMC 子板整个通路进行点测,主要观测近CHIP端与eMMC子板端信号是否存在较大差异 | 出口条件1: 1.近CHIP端与eMMC子板端电信号有明显衰减现象 出口条件2: 1.电气通路正常 |
出口条件1: 1.请硬件协助排查 出口条件2: ==>N |
||
N | 1.与客户明确运行环境是否存在外界干扰,比如正在进行打静电、高低温等压测 | 出口条件1: 1.正在进行压测,附加有打静电、高低温等手段 出口条件2: 1.无外界干扰,正常运行环境 |
出口条件1: >流程结束 出口条件2: >O |
出口条件1: 1.抓取Debug log和波形 2.协调硬件一同定位 |
|
O | 1.在明确运行环境非断电情况下,检测Debug log中是否存在"SAR1 SDMMC WARN trigger"关键字 2.检测过滤是否包含与eMMC驱动相关的"retry"、"reset"关键字 |
出口条件1: 1.检测Debug log,存在eMMC触发掉电保护或者retry操作 出口条件2: 1.环境未被重置或者误触发eMMC掉电保护情况 |
出口条件1: >流程结束 出口条件2: >G |
出口条件1: 1.eMMC误触发掉电保护 2.如果环境有被触发重置操作,则抓取Debug log |
3. eMMC读写过程成功,但BUF中数据存在问题¶

流程 | 方法 | 出口条件 | 下一步 | 需提供给FAE的资料 | 相关可参考FAQ |
---|---|---|---|---|---|
A | 1.查阅规格文档确认eMMC IP可使用的Dram地址空间,进而确认传递到eMMC IP的物理地址偏移是否合法,即bank 1410 offset 0x3/0x4组成的地址. 2.Linux 可用地址空间是从0x20000000开始,eMMC IP是使用减去了0x20000000地址偏移的物理地址,也就是0ffset 0x3/0x4是填充的物理地址,从0开始到最大可用偏移,该偏移需要向FAE确认 |
出口条件1: 1.传递到eMMC IP的物理地址偏移超出了有效范围 出口条件2: 1.传递给eMMC IP的物理地址偏移合法有效 |
出口条件1: >流程结束 出口条件2: >B |
出口条件1: 1.使用系统提供的标准地址空间分配接口申请buf |
|
B | 1.构造测试pattern,确认source pattern与读/写得到的pattern差异是否存在规律性,参考《SD_EMMC压力测试参考》,利用fio工具指定pattern | 出口条件1: 1.pattern错误明显具有规律性,总是以eMMC驱动 Cache-line大小出错 出口条件2: 1.pattern出错并无明显规律 |
出口条件1: >流程结束 出口条件2: >C |
出口条件1: 1.确认是否使用eMMC标准读写接口,若否,进一步确认buf是否non-cache 2.提供公板复现环境 |
|
C | eMMC驱动读写过程正常,在IP内部搬运数据过程出现异常,主要考虑以下几点: 1. dma burst length是否设置到8,即bank 1410 offset 0x2[5:4] 2.读写是否未考虑Cache操作或者处理不正确 3.现代CPU乱序执行导致的数据同步问题 |
出口条件1: 1.dma burst length未设置到最大 出口条件2: 1.运行环境Cache-on情况下,buf读写时未进行invalid和flush操作,导致取到的数据不一致 出口条件3: 1.对于需要同步调用的逻辑未进行内存屏障处理,导致乱序执行 出口条件4: 1.其他问题 |
出口条件1: 1.尝试手动设置dma burst到最大值8 出口条件2: 1.尝试在写操作执行flush操作,在读操作后执行invalid操作 出口条件3: 出口条件4: ==>流程结束 |
出口条件3: 出口条件4: 1.确认客户分支以及打过的patch现状 2.提供公板复现环境 |
4. eMMC Boot问题¶

流程 | 方法 | 出口条件 | 下一步 | 需提供给FAE的资料 | 相关可参考FAQ |
---|---|---|---|---|---|
A | 首先检索Debug Log判断eMMC Boot出错时卡在哪个阶段 1. 在ROM阶段就失败则Log不会出现IPL及之后阶段的关键字 2.在ROM阶段之后失败,可以根据最后一个出现的关键字判断是IPL/IPL_CUST/UBOOT的哪个阶段,然后具体分析问题 |
出口条件1: 1.eMMC Boot在ROM阶段失败 出口条件2: 1.eMMC Boot在ROM之后的阶段失败 |
出口条件1: >B 出口条件2: >G |
||
B | 在ROM启动阶段就失败,首先检查开发板上boot strap是否和isptool烧录时选择一致,当前最新版isptool已经可以自动匹配,对于老版本工具,需要注意选项板的'Bus Width'和开发板的boot strap选择一致 | 出口条件1: 1.isptool烧录时选择的Bus width与boot strap选择的类型不一致 出口条件2: 1.两者配置一致 |
出口条件1: 修正isptool烧录时Bus width 出口条件2: ==>C |
||
C | SPEC规定,Boot Ack机制在cmd0发出后最大50ms内会在Dat0 line回复Ack信息,抓取波形确认是否有开启Boot Ack机制或者有违背SPEC规定的现象,一般可以通过uboot烧录命令'mmc partconf'第一个参数确定,为0- disable Ack; 1- enable Ack | 出口条件1: 1.Boot ACK机制开启,且Ack信息出现在其他data line 出口条件2: 1.Boot Ack未配置开启 |
出口条件1: 关闭Boot Ack机制,即 ExtCSD[179]bit6置为0 出口条件2: ==>D |
||
D | 抓取eMMC Boot波形,确认波形是否有响应Boot分区数据 | 出口条件1: 1.cmd0发送后未响应Boot分区数据,查询ECSD[179]bit[5:3]发现卡未使能Boot mode 出口条件2: 1.cmd0发送后未响应Boot分区数据,且根据波形看不满足进入Boot mode条件 |
出口条件1: >E 出口条件2: >F |
||
E | 读取ECSD[179]bit[5:3]寄存器,并根据SPEC解析eMMC卡是否使能Boot mode | 出口条件1: 1.eMMC卡未使能Boot mode 出口条件2: 1.eMMC卡已使能Boot mode |
出口条件1: 1.使用isptool重新烧录,并且不勾选disable part 出口条件2: ==>F |
||
F | SPEC规定,eMMC卡Boot mode包含三个状态: 1.pre-idle state,有三种方式可以进入该状态: 1.1 power on后; 1.2 cmd0(arg:0xf0f0f0f0)命令 1.3 hw reset by host 2.pre-boot state: power on或reset后且在发送第一个命令cmd1之前,cmd line至少保持74个clock周期低电平 3.boot state: 进行boot分区数据读取,主要方式: 3.1 cmd line低电平 3.2 cmd0(arg:0xfffffffa),当前eMMC使用的方式 |
出口条件1: 1.进入pre-idle state失败,即当前eMMC使用的HW reset或者cmd0(arg:0xf0f0f0f0)对eMMC卡无效 出口条件2: 1.eMMC Timing时序有问题 |
出口条件1: 1.尝试切换HW reset/SW reset方式解决 出口条件2: ==>流程结束 |
出口条件2: 1.抓取eMMC Boot波形及Dump log 2.提供公板复现环境 |
|
G | 检查eMMC Padmux配置是否正确 | 出口条件1: 1.eMMC Padmux配置有问题 出口条件2: 1.eMMC Padmux配置正确 |
出口条件1: 1.根据实际运行环境配置正确 出口条件2: ==>F |
5. 附录¶
5.1 eMMC设备High speed mode初始化流程¶

>>>emmc go idle: cmd0让卡进入idle状态

>>>获取OCR寄存器信息: 获取卡的OCR信息并等待卡ready


cmd1响应的bit31置为1代表卡已ready
>>>获取CID寄存器信息

>>>cmd3/cmd7: host获取emmc card RCA地址并使卡进入trans-state状态


>>>设置EMMC block长度

>>>获取EXT-CSD寄存器信息: emmc重要扩展寄存器信息

>>>cmd6+cmd13 switch操作: 进行一系列设置和开启功能操作


有时也会搭配assert busy signal(data0 拉低) + r1方式响应cmd6,如上图,switch操作主要包括以下:
1. enable erase group
2. ext-csd[179] boot partion enable
3. Switch to high-speed, 此步骤后clock为48MHz
4. Switch bus width 并通过发送cmd8获取一遍确认
5. Select power class 确认供电电压
6. Switch cache ctrl 开启cache功能
以上步骤完成后,因为card device生成,会和card driver匹配,生成block设备节点。
>>>emmc card识别成功

5.2 eMMC常见错误波形及日志¶
>>>cmd no rsp


驱动会印出SD_STS:0x0F08错误码
>>>cmd crc



读命令的CRC为IP内部校验
驱动会印出SD_STS:0x0F01(读CRC)/SD_STS:0x0F02(写CRC)错误码
>>>cmd timeout


驱动会印出(FAIL)= 0100错误码,为驱动设定的等待时间已经到达,但event未能接收
此处可以关注驱动预埋的关键信息打印,'eventnum=3'标识需要等待带data的读cmd,'MIE_EVENT[00]=0x42'标识只等到cmd rsp,但是dat_end事件没有等到
另外还可以关注'SD_STS[0D]=0xe00'即sd status寄存器的高8位,如果是非全1状态,代表data line有拉低情况,一般是data还在传输或被拉低
>>>cmd6 执行switch func error

图中便是switch error,cmd13 rsp状态显示为'980',即device switch error
>>>emmc boot


>>>emmc isptool

>>>emmc boot ack

>>>常见timing问题1: cmd打出时,clk被关闭

>>>常见timing问题2: cmd打出时,clk异常,导致cmd不能被正常识别

>>>常见timing问题3: 打静电/高低温等外界干扰,导致clk异常

>>>常见timing问题4: clk几乎无采样建立时间,容易造成误判
