Sigmastar eMMC_debugsop手册

REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 02/21/2024

    1. 无法正常识别eMMC设备

    图1-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读写失败问题

    图2-1 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中数据存在问题

    图3-1 eMMC读写成功但内存数据异常定位思维导图

    流程 方法 出口条件 下一步 需提供给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问题

    图4-1 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状态

    初始化会重新上下电,设备进入idle state


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

    in idle state,host会获取OCR寄存器,并等待卡完成power up routine finish,即
    cmd1响应的bit31置为1代表卡已ready


    >>>获取CID寄存器信息


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

    根据RCA选择emmc卡后,会使卡进入trans-state状态


    >>>设置EMMC block长度


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


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

    读取ext-csd信息后是一系列cmd6+cmd13搭配的switch操作,注意cmd6 rsp是r1b类型,device status反映在其后面的cmd13 rsp。
    有时也会搭配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

    host已经发出cmd request并且clock正常打出,但是在8T时间内没有等到device响应
    驱动会印出SD_STS:0x0F08错误码


    >>>cmd crc

    host正常发出cmd17/18/24/25写命令后,data line有数据响应回复,写命令dat0的最后5个bit是device标识的CRC状态确认。正确为'00101',错误为'01011'
    读命令的CRC为IP内部校验
    驱动会印出SD_STS:0x0F01(读CRC)/SD_STS:0x0F02(写CRC)错误码


    >>>cmd timeout


    cmd超时,是驱动层面的判断,所以波形一般是正常的,主要体现在驱动的debug err log上
    驱动会印出(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

    cmd6命令比较特殊,其rsp是r1b类型,cmd6命令本身执行出错,需要紧接着的cmd13响应反馈错误状态
    图中便是switch error,cmd13 rsp状态显示为'980',即device switch error


    >>>emmc boot

    spec规定emmc boot使用cmd0(ARG:0xfffffffa)请求boot data,需要在规定的1s时间内回传数据给host,否则判定为发生异常


    >>>emmc isptool

    老版本的isptool会需要人为选择bus width,这里应该和开发板上boot strap的盖帽选择保持一致,新版本tool已经自动保持一致


    >>>emmc boot ack

    emmc boot ack enable情况下,device会在cmd0发出后的50ms内发送acknowledge pattern '010'来标识卡已经进入boot mode


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


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


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


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

    timing问题,一般比较复杂,需要硬件FAE介入提供方案,常见的sw手段一般包括调节phase,改善驱动能力,展频等