Kernel 5.10 针对 eMMC 的 Detect、Power、Add 及深度优化解析

核心主宰差异:为何 eMMC 截然不同?

SD 卡的设计初衷是为了"热插拔便携",强调宽容度和动态防抖。 而 eMMC 是直接经过 SMT 贴片工艺焊死在开发板上的核心闪存"启动盘"。因此在 Kernel 中,eMMC 系统更看稳、求最快冷启动、要求极限的 8-Bit 宽带并发。


第一阶段:探测与硬核复位流 (Detect & Power Sequence)

  1. 唤醒与专属电源时序 (pwrseq_emmc.c): 一上电,核心并没有急着发命令盲猜,而是专门去呼叫针对性打造的 pwrseq。 在 pwrseq_emmc.c 中,它会去找设备树上绑定的名为 reset 的 GPIO(这是焊死芯片的特权)。向该物理管脚施加长达几毫秒的极限低电平脉冲,将 eMMC 的内部状态机强行物理归零 (硬件 Reset)。
  2. 专属身份鉴别试探 (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:
    1. 系统会很取巧地把模式先退回到低速的 HS 模式(这是协议要求,避免跳频死机)。
    2. 然后通过底层的 sdhci_phy_delay_measurement() 校准出 eMMC PHY 通道最佳延迟(针对 mmc_hs400_tx_delay 裕量进行注入对齐),避免 PCB 线路高温偏移。
    3. 执行终极一跳切至 HS400。之后系统会依赖 eMMC 芯片自己吐出的 Enhanced Strobe 选通同步脉冲进行数据捕获。完全避免了环境温度变化引起的信号乱码(即免 Tuning 在线运行)。

第三阶段:向 Linux 系统块暴露与启动挂载 (Add Card)

经历完严酷的超频,剩下的就是与 Linux 无缝接轨了。

  1. 实体建立及分区展开 (mmc_add_card) : core.c 最后把已是满血状态的 eMMC 信息封包为一个内核标准的 struct device 提交注册。
  2. 主设备探查 (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 板级调试场景:

  1. 刷机后不开机或者 Kernel Panic (找不着 eMMC 主区) : 第一步去量测复位物理引脚 Reset_N 是不是有按序完成低电平脉冲,这是 pwrseq_emmc.c 管控区域如果被 DeviceTree 指错 GPIO,芯片始终在僵死休眠状态。
  2. 加载海量大模型速度极慢,甚至报错 I/O Error : 极大情况是系统停留在只使用了 HS200 甚至老式 High-Speed 下。去查 kernel/out/ 跑出来的 dmesg 是否卡在了 8-Bit 切换报错,或者看看 sdhci_zodiac_mmc.c 里面的 broken_hs200 标记有没有被错误置位 true 关闭了性能大门。
  3. 特定高低温挂测下的系统死机 : 在设备树(DTS)微调送给 sdhci_combo_phy_delay_measurementmmc_hs400_tx_delay 等发射前置缓冲裕量。这是 eMMC 与 SOC 经过 PCB 长线走板必将引发的电学漂移调校黑匣子。
相关推荐
charlie1145141912 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(4)从零构建 STM32 构建系统
linux·开发语言·c++·stm32·单片机·学习·嵌入式
刘瑜澄2 小时前
[邪修方法]ubuntu 25 wayland窗口协议下使用utools
linux·运维·ubuntu·wayland·utools
魔都吴所谓2 小时前
【Linux】Ubuntu22.04 Docker+四大数据库(挂载本地)一键安装脚本
linux·数据库·docker
木下~learning2 小时前
初学Linux之设备树的使用| RK3399上实操
linux·设备树·rk3568·rk3399·平台总线和外设总线
Yupureki3 小时前
《Linux系统编程》19.线程同步与互斥
java·linux·服务器·c语言·开发语言·数据结构·c++
又来敲代码了3 小时前
Zrlog博客的系统部署
java·linux·运维·mysql·apache·tornado
feng_you_ying_li3 小时前
linux开发工具的介绍(5)
linux·运维·centos
Lugas Luo3 小时前
Kernel 5.10 SD卡专属探测、上电与注册流程分析 (Detect -> Power Up -> Add)
linux·嵌入式硬件
艾莉丝努力练剑3 小时前
【Linux信号】Linux进程信号(下):可重入函数、Volatile关键字、SIGCHLD信号
linux·运维·服务器·c++·人工智能·后端·学习