核心主宰差异:为何 eMMC 截然不同?
SD 卡的设计初衷是为了"热插拔便携",强调宽容度和动态防抖。 而 eMMC 是直接经过 SMT 贴片工艺焊死在开发板上的核心闪存"启动盘"。因此在 Kernel 中,eMMC 系统更看稳、求最快冷启动、要求极限的 8-Bit 宽带并发。
第一阶段:探测与硬核复位流 (Detect & Power Sequence)
- 唤醒与专属电源时序 (
pwrseq_emmc.c): 一上电,核心并没有急着发命令盲猜,而是专门去呼叫针对性打造的pwrseq。 在pwrseq_emmc.c中,它会去找设备树上绑定的名为reset的 GPIO(这是焊死芯片的特权)。向该物理管脚施加长达几毫秒的极限低电平脉冲,将 eMMC 的内部状态机强行物理归零 (硬件 Reset)。 - 专属身份鉴别试探 (
CMD1): 执行mmc_rescan开始发送频段探测。 这里排除了需要热切特性的SDIO(MD5)和SD(ACMD41)以后,向总线压上专属于 eMMC 的CMD1(SEND_OP_COND)。只有芯片返回有效 OCR,内核立刻确信这就是那块启动盘,从而唤醒其专属执行流mmc_attach_mmc。
第二阶段:专属超高速初始化与波形对准 (eMMC Init & Fast Optimization)
进入 mmc_attach_mmc(),这里是包含海思 310B NPU 自我保护与性能优化的深水区。
1. 固定寻址与庞大扩展信息拉取 (Ext_CSD)
- 固定 RCA (Relative Card Address): 系统不再像对待 SD 卡那样等它自己报到,而是直接一记
CMD3,粗暴将 eMMC 门牌号赋值为固定数字(通常为 1)。 CMD8(获取 512 Bytes Ext_CSD): 读取决定 eMMC 命脉的超大寄存器Ext_CSD。这张表指明了该芯片能不能跑 HS400、有没有写缓存 (Cache)、开启没开启硬件 RPMB (安全分区,多供 TrustZone 使用)。
2. eMMC 特工宽位总线协商 (8-Bit BUS)
- 从细管子转成大水管 :标准 SD 最多支持 4 根数据线,但在此步系统会解析
Ext_CSD并在探测支持后,下放CMD6(SWITCH) 瞬间把芯片的 I/O 工作信道扩展为全规格的 8-Bit 宽体双向通路 (BUS_WIDTH_8),瞬间运力翻倍。
3. 冲击巅峰性能:HS200 / HS400 时序跳跃机制
到了这里,标准 50MHz 时钟早已被抛弃,开始启动针对 Ascend 优化的极速协议:
Ascend 310B 深度定制拦截点:ZODIAC_EMMC_MODE
- 驱动
sdhci_zodiac_mmc.c检测到操作对象是ZODIAC_EMMC_MODE时,会执行独占动作sdhci_combo_phy_init()。 - 在系统发出调向高速的要求后,Host 劫持了频率切换瞬间,使用
hisi_subctrl_emmc_phy_clkgate_disable/enable冻结骨干网络时钟(ICG)。
- 进入 HS200 (200MHz SDR): 系统开启超高单边沿协议。此刻硬件自动完成高速 Tuning(相位寻址)。
- 极速超频爆发 HS400 (200MHz DDR, 加装数据选通 Strobe): 这是 eMMC 目前能达到最强的王者形态。如果是跑向 HS400:
- 系统会很取巧地把模式先退回到低速的 HS 模式(这是协议要求,避免跳频死机)。
- 然后通过底层的
sdhci_phy_delay_measurement()校准出 eMMC PHY 通道最佳延迟(针对mmc_hs400_tx_delay裕量进行注入对齐),避免 PCB 线路高温偏移。 - 执行终极一跳切至 HS400。之后系统会依赖 eMMC 芯片自己吐出的 Enhanced Strobe 选通同步脉冲进行数据捕获。完全避免了环境温度变化引起的信号乱码(即免 Tuning 在线运行)。
第三阶段:向 Linux 系统块暴露与启动挂载 (Add Card)
经历完严酷的超频,剩下的就是与 Linux 无缝接轨了。
- 实体建立及分区展开 (
mmc_add_card) :core.c最后把已是满血状态的 eMMC 信息封包为一个内核标准的struct device提交注册。 - 主设备探查 (
block.c::mmc_blk_probe/ eMMC 新生) : 区别于 SD 卡只有一个单独体,eMMC 被block层匹配上以后:- 将向
/dev/下抛出通用存储空间主设备(如/dev/mmcblk0)。 - 启动敏感项 :如果是包含 Boot 启动扇区特征的 eMMC,系统会额外生成
/dev/mmcblk0boot0和/dev/mmcblk0boot1这样特殊的写保护引导分区块。这对于 Ascend 固件引导更新和出厂恢复是极为重要的更新底座。 - 安全存储区 :还会暴露
/dev/mmcblk0rpmb(Replay Protected Memory Block) 接口节点。在实际的华为 NPU 开发中,很多带 TEE(安全执行环境)的关键密钥/模型校验都会绑定在受底层物理防护的 RPMB 区域中。
- 将向
针对在 eMMC 根区开发或 Ascend 板级调试场景:
- 刷机后不开机或者 Kernel Panic (找不着 eMMC 主区) : 第一步去量测复位物理引脚
Reset_N是不是有按序完成低电平脉冲,这是pwrseq_emmc.c管控区域如果被 DeviceTree 指错 GPIO,芯片始终在僵死休眠状态。 - 加载海量大模型速度极慢,甚至报错 I/O Error : 极大情况是系统停留在只使用了
HS200甚至老式 High-Speed 下。去查kernel/out/跑出来的dmesg是否卡在了 8-Bit 切换报错,或者看看sdhci_zodiac_mmc.c里面的broken_hs200标记有没有被错误置位true关闭了性能大门。 - 特定高低温挂测下的系统死机 : 在设备树(DTS)微调送给
sdhci_combo_phy_delay_measurement的mmc_hs400_tx_delay等发射前置缓冲裕量。这是 eMMC 与 SOC 经过 PCB 长线走板必将引发的电学漂移调校黑匣子。