1、MMC error: The cmd index is 16, ret is -110
2、blk_update_request: I/O error, dev mmcblk1
3、mmcblk1: error -110 transferring data, sector 11670176, nr 192, cmd response 0x900, card status 0x0
1、先更新EMMC驱动确认,下载地址:https://redmine.rock-chips.com/documents/50
注意: UBOOT驱动更新后,重新编译需要加"--spl-new"选项才会使用新编译的SPL,否则还是使用rkbin仓库预编译好的SPL。
2、更新驱动后还有问题,(非SDHCI控制器,DTS里面没有sdhic节点)可以配置一下DTS和修改超时时间:
2.1 EMMC(SDMMC)的dts节点配置:rockchip,default-sample-phase = <90>; 或者rockchip,default-sample-phase = <180>;
2.2 把rockchip,use-v2-tuning;删除掉,用全空间扫描的tuning(全空间扫描可以确认可以设置的最佳相位,如果还要用V2 tuning,可以把最佳相位配置成rockchip,default-sample-phase)
2.3 个别EMMC颗粒读特定位置数据很慢,会出现-110超时,可以更新附件补丁改大dto和xfer的超时时间。
2.4 查看一下EMMC的寿命,在控制台输入:find .|grep life_time,cat找到节点,比如:cat ./sys/devices/platform/2a330000.mmc/mmc_host/mmc0/mmc0:0001/life_time
0x01 0x01 (SLC区域的寿命,TLC区域的寿命)
寿命信息:
值 0x0 :不支持寿命信息
值 0x1-0xA: 0%-10%, 10%-20%,...90%-100%
值 0xB: 寿命已经使用完
2.5 HS400/HS400ES模式读数据出错(sdhci控制器),可以下载DS测试脚本测试有效窗口,然后查看驱动代码中对应平台的DS配置,".hs400_strbin_tap",确认是否在有效窗口内,如果uboot下就出错,可以先手动修改(可以配置值0-12),能够启动到kernel后再测试。脚本下载地址:https://redmine.rock-chips.com/documents/50
2.6 dts里面去掉HS400、HS200模式或者SDR104
2.7 dts里面降低接口频率(修改max-frequency)
3、如果还有问题,硬件先确认:
3.1 VCCQ/VCC供电是否正常(没有出现电源塌陷),如果需要跑HS200或者HS400模式,VCCQ电压需要1.8V(flash_sel也需要匹配配置)。
3.2 RK356X,RK3588,RK3399,RK3528和RK3562平台发布SDK的升级代码默认启用了HS200以上模式,因此只能支持VCCQ 1.8V。如果布错成3.3v,可以先飞线调试,后续改版解决。
3.3 VDDI电容容值在1uF以上,如果跑HS400模式,电容容值需要在2.2uf。
3.4 EMMC DS是否有接下拉电阻,如果有,可以去掉试试。
3.5 如果一直报错,还有可能是软件问题,把IOMUX配置修改了,可以下载https://redmine.rock-chips.com/documents/108 pin_debug_tool_v1.12_20230310_win工具读取芯片的IOMUX配置。
3.6 uboot下加载完kenrel dtb后或者uboot控制一些电源后出现通信报错(MMC error: The cmd index is 16, ret is -110),原因是emmc的供电出现塌陷,造成emmc颗粒异常,比如WIFI上电。硬件先解决,软件还可以注释掉mmc_set_blocklen函数的调用,读写出错时会重新初始化EMMC,可能也可以绕过。
3.7 VCC(3V)供电存在电源塌陷,比如和WIFI模块或者HDMI共用电源,kerenl下(或者Uboot下)WIFI开启瞬间有电源塌陷,出现EMMC颗粒或者TF卡异常,重新初始化可能也没法恢复。(可以禁用其他模块或者拆除确认)
3.8 主控端EMMC IO的供电上接的电容没有贴或者贴的离脚位很远,也可能造成EMMC通信时报错。
4、硬件也没有发现问题,做以下试验后把情况提交redmine,同时提供原理图和PCB(只提供EMMC部分也可以)。
注意: UBOOT驱动更新后,重新编译需要加"--spl-new"选项才会使用新编译的SPL,否则还是使用rkbin仓库预编译好的SPL。
2、更新驱动后还有问题,(非SDHCI控制器,DTS里面没有sdhic节点)可以配置一下DTS和修改超时时间:
2.1 EMMC(SDMMC)的dts节点配置:rockchip,default-sample-phase = <90>; 或者rockchip,default-sample-phase = <180>;
2.2 把rockchip,use-v2-tuning;删除掉,用全空间扫描的tuning(全空间扫描可以确认可以设置的最佳相位,如果还要用V2 tuning,可以把最佳相位配置成rockchip,default-sample-phase)
2.3 个别EMMC颗粒读特定位置数据很慢,会出现-110超时,可以更新附件补丁改大dto和xfer的超时时间。
2.4 查看一下EMMC的寿命,在控制台输入:find .|grep life_time,cat找到节点,比如:cat ./sys/devices/platform/2a330000.mmc/mmc_host/mmc0/mmc0:0001/life_time
0x01 0x01 (SLC区域的寿命,TLC区域的寿命)
寿命信息:
值 0x0 :不支持寿命信息
值 0x1-0xA: 0%-10%, 10%-20%,...90%-100%
值 0xB: 寿命已经使用完
2.5 HS400/HS400ES模式读数据出错(sdhci控制器),可以下载DS测试脚本测试有效窗口,然后查看驱动代码中对应平台的DS配置,".hs400_strbin_tap",确认是否在有效窗口内,如果uboot下就出错,可以先手动修改(可以配置值0-12),能够启动到kernel后再测试。脚本下载地址:https://redmine.rock-chips.com/documents/50
2.6 dts里面去掉HS400、HS200模式或者SDR104
2.7 dts里面降低接口频率(修改max-frequency)
3、如果还有问题,硬件先确认:
3.1 VCCQ/VCC供电是否正常(没有出现电源塌陷),如果需要跑HS200或者HS400模式,VCCQ电压需要1.8V(flash_sel也需要匹配配置)。
3.2 RK356X,RK3588,RK3399,RK3528和RK3562平台发布SDK的升级代码默认启用了HS200以上模式,因此只能支持VCCQ 1.8V。如果布错成3.3v,可以先飞线调试,后续改版解决。
3.3 VDDI电容容值在1uF以上,如果跑HS400模式,电容容值需要在2.2uf。
3.4 EMMC DS是否有接下拉电阻,如果有,可以去掉试试。
3.5 如果一直报错,还有可能是软件问题,把IOMUX配置修改了,可以下载https://redmine.rock-chips.com/documents/108 pin_debug_tool_v1.12_20230310_win工具读取芯片的IOMUX配置。
3.6 uboot下加载完kenrel dtb后或者uboot控制一些电源后出现通信报错(MMC error: The cmd index is 16, ret is -110),原因是emmc的供电出现塌陷,造成emmc颗粒异常,比如WIFI上电。硬件先解决,软件还可以注释掉mmc_set_blocklen函数的调用,读写出错时会重新初始化EMMC,可能也可以绕过。
3.7 VCC(3V)供电存在电源塌陷,比如和WIFI模块或者HDMI共用电源,kerenl下(或者Uboot下)WIFI开启瞬间有电源塌陷,出现EMMC颗粒或者TF卡异常,重新初始化可能也没法恢复。(可以禁用其他模块或者拆除确认)
3.8 主控端EMMC IO的供电上接的电容没有贴或者贴的离脚位很远,也可能造成EMMC通信时报错。
4、硬件也没有发现问题,做以下试验后把情况提交redmine,同时提供原理图和PCB(只提供EMMC部分也可以)。

