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 长线走板必将引发的电学漂移调校黑匣子。
相关推荐
ShineWinsu6 小时前
对于Linux:动静态库的制作与原理的解析—下
linux·运维·服务器·进程·链接·虚拟地址空间·
RH2312117 小时前
2026.4.16Linux 管道
java·linux·服务器
charlie1145141917 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler017 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
liuyukuan7 小时前
如何在win11上打开 WSL2(Windows 的 Linux 子系统)?
linux·windows
橙子也要努力变强8 小时前
Linux信号机制
linux·服务器·网络
shughui8 小时前
FinalShell / Xshell 完整教程(下载+安装+使用,2026最新版)
linux·fiddler·xshell·xftp·finalshell·远程连接工具
程序猿编码8 小时前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
pengyi8710158 小时前
私网IP映射公网基础原理,搭配代理IP远程访问入门
linux·服务器·网络
深圳市九鼎创展科技9 小时前
MT8883 vs RK3588 开发板全面对比:选型与场景落地指南
大数据·linux·人工智能·嵌入式硬件·ubuntu