ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

芯参谋(30):EMMC eMCP 软件设计规范

芯参谋(30):EMMC eMCP 软件设计规范 面向eMMC 5.0/5.1 LPDDR3/4/4X 合封221 / 254 / 297-ball FBGA的固件与底层软件设计约定 —— 覆盖双器件独立初始化、不可颠倒的冷启动链路、LPDDR 训练流水线、五路电源与复位协同、继电保护、热耦合温控与休眠 / 唤醒逐条给出可落地的序列、判据、超时预算与失败处置。文档编号eMCP-SW-SPEC-001版本 / 状态V1.0 · 正式发布适用器件JEDEC 标准 eMCPeMMC 5.0 / 5.1HS200 / HS400 LPDDR3 / LPDDR4 / LPDDR4X封装 221-ball / 254-ball / 297-ball FBGA0.5 mm pitch参考标准JESD84-B50/B51eMMC 5.0/5.1· JESD209-4CLPDDR4/4X· JEDEC No.21 · SoC Vendor Bring-up Guide · PMIC Datasheet容量范围eMMC 8 GB ~ 256 GBLPDDR 4 Gb ~ 64 Gb4 Gb ~ 8 GB配套文档eMCP_电路设计指南.html电源 / 上电时序 / Layout / 热设计 / 焊接0. 目的与范围本规范约束 eMCP 器件eMMC LPDDR 合封在固件与底层驱动中的软件行为 启动链路分工、两侧初始化序列、训练流程与判据、电源与复位协同、读写规范、掉电保护、休眠唤醒、热管理与寿命监控。 凡本文与器件 datasheet 或 SoC BootROM 手册冲突以器件 datasheet 与 SoC 手册为准。统一启动链路固化「BootROM → eMMC 取 SPL → SPL 初始化 LPDDR → 加载 bootloader / OS」这条不可颠倒的顺序并给出每一跳的检查点与超时。统一两侧初始化eMMC 侧走标准 CMD 序列 EXT_CSD 配置LPDDR 侧走电源 → 时钟 → 解复位 → MRW → ZQ → 训练的流水线。统一电源与复位语义明确五路电源的归属、软件可观测性与可控制点禁止用一根复位线同时复位两侧。统一掉电与休眠协议给出写窗口、提交协议、flush 顺序与自刷新进出序列。统一热与健康管理给出温度采样点、分级温控动作、寿命字段阈值与巡检周期。不在本规范范围原理图与 PCB 布线 / 上电时序硬件实现 / 0.5 mm HDI 扇出见《eMCP 电路设计指南》 文件系统自身算法ext4 / f2fs / littlefs 的压缩与 GC 策略独立 eMMC 器件的完整寄存器与命令语义细节 参见《eMMC 电路设计指南》第 11 章与本系列 eMMC 软件设计规范Linux / RTOS 内核的内存管理算法本身。一句话结论eMCP 的软件难点不在「怎么读写」而在「两颗异质器件怎么协同」—— 封装内一侧是要CMD CMD1轮询、忙态可达百毫秒以上的存储另一侧是要tINIT等待、ZQ校准、多级训练之后才敢跑的内存。没取到 SPL 就先初始化 DRAM会卡在只有 SRAM 可跑的状态里DRAM 没训练通过就切高主频会在高低温随机崩 eMMC 没 flush 就进自刷新会让未落盘的数据永远丢失。文档使用说明本文是《eMCP 电路设计指南》的软件配套篇硬件篇解决「五路电源怎么上、0.5 mm 球怎么扇、热量怎么散」本文解决「驱动怎么写、序列怎么排、训练怎么验、异常怎么救」。命令码、EXT_CSD 偏移、时序值取自JESD84-B51eMMC 5.1与JESD209-4CLPDDR4/4X不同厂商 / 不同世代器件尤其是 LPDDR3 与 LPDDR4X差异很大移植前必须逐条核对 datasheet。文中 C 代码为协议骨架伪代码用于表达流程、判据与超时预算而非某平台上可直接编译的完整实现mmc_send_cmd()、dwc_ddrphy_*、pmic_set_voltage()、now_ms()等均为平台相关底层。凡标注 硬性 的条款为不可协商项标注 建议 的条款可按项目剪裁但剪裁结果必须写入项目《Bring-up 记录》。贯穿全文的四条铁律①先存储、后内存BootROM 只能用片内 SRAM必须先把 SPL 从 eMMC 取出来才有代码去初始化 DRAM ②训练不过一律降速重试绝不「跳过训练直接跑」常温能跑不代表四角能跑 ③busy / training 未就绪一律等待或超时报错绝不用固定 sleep 代替状态轮询触发内部 GC 或高磨损时的单次写耗时随使用情况增长 ④任何进入低功耗的动作之前先 flush再进自刷新顺序反了会丢数据。1 · 器件定位与双总线架构eMCP 把「一颗完整 eMMCNAND 阵列 控制器 片内 FTL」和「一颗低功耗 DRAM」封进同一个 BGA。 它对外暴露的是两套互不相干的总线、五路电源和两组复位。软件的第一要务是把这两套东西当作两个独立器件各写一套驱动再在上面加一层协调层而不是试图找一个「统一设备模型」。1.1 器件定位与关键参数项目eMMC 侧LPDDR 侧协议基础JESD84-B51eMMC 5.1向后兼容 5.0 / 4.5JESD209-4CLPDDR4 / 4X部分器件为 JESD209-3LPDDR3对外总线CMD CLK DAT[7:0]11 根信号CK_t/c、CS_n、CA[5:0]、DQ[x]、DQS_t/c、DMI、RESET_n、CKE约 40~60 根数据宽度1 / 4 / 8 bit×16 或 ×32每通道最高速率HS400DDR 200 MHz理论 400 MB/sLPDDR4X-42664266 Mbps/pin访问粒度512 B 扇区逻辑区块地址字节地址突发长度 16 / 32寻址方式主机给 LBA器件内 FTL 转换为物理页主机控制器给 bank / row / col线性地址由 SoC 转换易失性非易失掉电保留写入窗口内的除外易失掉电全丢坏管理 / ECC器件内 FTL 全权负责主机不可见部分 SoC 支持 DRAM ECC若使能则主机可见典型时延读 ~0.1 ms 量级写 busy 可达数十 ~ 数百 ms几十 ns 量级对软件近似于「立即」容量范围8 GB ~ 256 GB4 Gb ~ 64 Gb512 MB ~ 8 GB电源轨VCCNAND 核心、VCCQI/OVDD1、VDD2、VDDQ1.2 合封内部结构与对外接口封装内的两颗 die没有任何内部互联总线eMMC 不知道 DRAM 的存在DRAM 也不知道旁边有颗 NAND。 它们只共享三样东西 ——封装基板、接地VSS与工作环境温度。由此直接推出三条软件结论CONCLUSION 01两侧互不可见不需要握手eMMC 侧发什么命令、DRAM 侧知都不知道。因此不要设计任何跨侧同步协议也不必担心命令串扰除了共模电源噪声。两侧只需共享同一个温度读数与同一个调频 / 降频决策。协调层职责调度与温控而非握手CONCLUSION 02一侧失效不等于另一侧失效eMMC 挂了不影响 DRAM 训练结果DRAM 训练失败也不影响 eMMC 枚举。两侧必须有独立的超时、独立的错误上报和独立的降级路径禁止「任一失败就整机变砖」的粗暴处理。典型坑DRAM 训练失败后没有任何打印无从定位CONCLUSION 03热量是唯一真实的耦合一侧持续高速工作会通过封装基板加热另一侧NAND 温度升高降低数据保持能力DRAM 温度升高要求更高刷新率。这是第 10 章的全部内容。软件可见温度传感器位置决定策略有效性1.3 两套总线的地址空间差异同一份 SoC 地址映射表里这两块资源的语义完全不同。软件最容易犯的错误是把内存的用法搬到存储上、或反过来。维度eMMC块设备LPDDR内存CPU 可见性不可直接按地址访问只能通过 DMA / 寄存器搬运可直接 load / store有 Cache 参与写的最小单位512 B 扇区内部实际按页 / 块操作1 B但推荐按 cacheline 对齐写是否立即生效返回 ≠ 落盘可能还在 cache / cache buffer返回 已进 DRAM是否需要擦除不需要显式擦Trim / Discard 即可不适用越界访问后果返回 errors器件不受损可能覆写其它数据或触发总线错误顺序性保证只有发出 barrier / flush 后才保证同一个核上有程序序弱内存序架构需显式 barrier最容易混淆的一件事「写返回」在两个世界里含义不同往 DRAM 写完甚至只是进了 Cache就可以认为数据在当前供电周期内是可见的 往 eMMC 写完哪怕是命令成功返回也不能认为数据已经持久。只有 flush 成功返回、且器件确认 cache 已清空之后才可以宣告一次提交完成。1.4 相对分立方案的关键差异移植必读从「分立式 eMMC 分立式 DRAM」移植过来的项目下面几项是必然会变的其余基本可以按原驱动直接复用。维度分立方案eMCP 合封软件要改什么上电顺序由各自的 PMIC 轨独立控制容错宽受 boot 链路约束VCC / VCCQ 必须先于或同时于 DRAM 侧就绪PMIC 初始化脚本必须重写并实测复位线各自独立通常也只对一侧供电复位球位密集易被 Layout 「合并」确认原理图上RST_n与RESET_n不是同一网络热环境两颗芯片分置热量各自散掉11.5 × 13 mm 封装内互相加热新增温控策略与刷新率动态调节替换与调试可单独换器件、单独飞线测量不可单独替换问题器件只能连整颗一起换必须依赖日志与寄存器读数做远程诊断软件初始化顺序相对自由强依赖先从 eMMC 取 SPL才有代码初始化 DRAMSPL 的生成、打包、烧录位置必须按 BootROM 要求驱动本体标准 eMMC 驱动 标准 DDR 驱动同样那两套驱动不需改写几乎不用改改的是上层编排移植的心法eMCP 移植基本不需要动两个外围驱动的本体改的是三件事① 电源编排脚本② 启动阶段的顺序与分工③ 温控与调度策略。把这三件事做成独立模块同一个 SDK 就能同时支持分立与合封两种形态。2 · 术语与缩写2.1 接口与协议术语缩写全称 / 含义在本规范中的所指eMCPembedded Multi-Chip PackageeMMC LPDDR 合封器件本文对象FTLFlash Translation Layer位于 eMCP 内部 eMMC die 上负责坏块、磨损均衡、映射主机不可见EXT_CSDExtended CSDeMMC 的 512 B 扩展配置寄存器通过 CMD8 读取、CMD6 写入RCARelative Card AddresseMMC 的 16 bit 相对地址由 CMD3 分配HS200 / HS400High Speed 200 / 400eMMC 高速模式HS400 需 prior HS200 tuning 并启用 DSDSData StrobeHS400 下由器件返回的选通信号替代主机采样时钟RPMBReplay Protected Memory Block带 MAC 校验的安全分区密钥一次性烧写BKOPSBackground Operation器件内部后台操作需主机留出空闲窗口PONPower Off Notification主机提前告知器件即将下电让器件有时间收尾MRW / MRRMode Register Write / ReadLPDDR 的模式寄存器写入 / 读取命令ZQZQ Calibration以 240 Ω ±1% 外置电阻为基准的输出阻抗校准CA TrainingCommand/Address Bus Training校准 VREF(CA) 并把 CA/CS 与 CK 对齐Write Leveling—补偿 CK 到 DQS 的飞行时间差异DQS Gate—在读前导期间确定 DQS 的有效采样窗tINIT1/2/4/5初始化定时参数LPDDR 上电后解复位、时钟稳定、发 MRS 之前必须等待的时间SR / Self RefreshSelf RefreshDRAM 自刷新状态休眠期间数据保持的最低必要条件PVTProcess / Voltage / Temperature训练结果有效性的三个影响因素DVFSDynamic Voltage and Frequency ScalingDRAM 频率切换常需重建 params 或重训barrier / flush—barrier 保证命令顺序flush 保证数据离开器件 cache 落到介质2.2 本文书写约定数值中的k / M / G按器件惯例eMMC 容量用十进制GBDRAM 容量用二进制位宽Gb / GB。命令一律写成CMDn形式扩展区的写入统一写作CMD6(ACCESSWRITE_BYTE, index..., value...)。时间参数统一按tXXX引用 JEDEC 原文本规范只给出「谁更大」「谁必须先满足」的关系具体数值以 datasheet 为准。“存储侧”“eMMC 侧”指 eMMC die“内存侧”“DRAM 侧”指 LPDDR die两者合称「两侧」。3 · 软件分层与冷启动链路eMCP 的启动有一个物理上不可颠倒的顺序它直接决定了电源时序与软件框架的分层 BootROM 只能用片内 SRAM必须先把 SPL 从 eMMC 读出来才有代码去初始化 DRAM。3.1 分层职责层级运行位置必须完成的事禁止做的事BootROMSoC 片内固件 SRAM配置最简引脚、跑 400 kHz 以下的 MMC 总线、从 Boot 分区读 SPL 到片内 SRAM、校验后跳转不要尝试初始化 DRAM代码放不下且没必要SPL片内 SRAM再补齐 PMIC 各轨、打开必要的电源、完成 LPDDR 全部初始化与训练、把下一级镜像载入 DRAM不要做复杂业务SRAM 有限日志要极简UART 轮询模式即可bootloaderDRAM切换到高速HS200/HS400、读分区表、做镜像 A/B 选择、加载内核、把约定格式的参数传给内核不要在此时做全量文件系统 fsck会很慢KernelDRAM挂载文件系统、跑掉电恢复、启动健康巡检与温控守护、管理休闲 / 休眠不要在不知道之前发生过什么的情况下直接写业务数据为什么这套分层不能压平有人会问能不能把 DRAM 初始化放到 bootloader 里答案是不能 ——bootloader 本身就在 DRAM 里跑构成循环依赖。 唯一能打破循环的就是「必须在 SRAM 里跑完 DRAM 初始化」的 SPL。SPL 越小、越不做多余的事Bring-up 越好调。3.2 冷启动全链路eMCP 冷启动全链路每一跳的执行位置、判据与超时预算阶段① 电源与保持阶段② BootROM 取 SPLSRAM 域无 DRAM阶段③ SPL 初始化 LPDDRSRAM 域阶段④ DRAM 可用后的其余引导① PMIC 上电编排由 SPL / PMU FW 执行VCC → VCCQ 先就绪VDD1 → VDD2 → VDDQ 后就绪判据实测电压 单调斜升② BootROM 读 SPLSoC 固件≤ 400 kHz读 Boot 分区首地址签名 / CRC 校验后跳转判据CMD1 就绪 bit 置位③ DRAM 初始化与训练tINIT 等待 → 解复位ZQ → CA → WL → Gate → RW失败则降速重试判据全内存区读写回校通过④ 加载 bootloader 到 DRAM提速至 HS200 / HS400EXT_CSD 配置 tuning读分区表与 A/B 槽位判据tuning 通过 回读一致⑤ 启动内核挂载文件系统上电自检与掉电恢复启动巡检 / 温控守护判据用户可用态达成每一跳都必须有的三样东西• 明确的等待对象状态 bit / 训练结果寄存器 / 回读校验而不是 sleep• 明确的超时预算按 datasheet max 以上留裕量超时即上报并记录• 明确的失败出口降速 / 换槽 / 进下载模式绝不静默继续不可颠倒的原因BootROM 只有几十 ~ 几百 KB SRAM装不下完整 DRAM 初始化代码它必须先把 SPL 从 eMMC 读到 SRAM再由 SPL 完成 DRAM 训练。一旦电源时序让 DRAM 先于 eMMC 上电整板会卡在无任何打印的状态。推荐超时预算起手值需按平台实测校正电源稳定等待 ≤ 20 ms 硬性 · CMD1 轮询总额度 1 s单次间隔 10 ms最多 100 次LPDDR tINIT 系列按 datasheet max ×1.2 · 单次训练阶段 200 ms · 全套训练总额度 3 s超三次全降档重试eMMC 单次写 busy单块 500 ms / 多块 GC 场景 3 s / 擦除 5 s —— 均按最坏情况留裕量图 1 · eMCP 冷启动全链路的软件分工、判据与超时预算电源编排SPL / PMU 固件按 §6.2 的顺序开放五路电源实测每路达到目标值且保持稳定后才继续。BootROM 取 SPLSoC 固件驱动 MMC 总线≤ 400 kHz从 Boot 分区读取 SPL 到片内 SRAM验证签名/CRC 后跳转。SPL 补齐时钟与引脚配置 DRAM PHY 相关 IO、PLL使能 DRAM 侧时钟。DRAM 初始化与训练按 §5 的流水线走完 ZQ、CA、Write Leveling、DQS Gate、读写训练做一次全内存回校。切换到 DRAM 栈运行设置堆栈与重定位跳到 bootloader。eMMC 提速bootloader 阶段读 EXT_CSD、切 8 bit、切 HS200 并 tuning必要时再进 HS400。分区与分区选择读取分区表 / A/B 槽位元数据选择有效槽位。加载内核并移交把设备树 / 内存布局 / 训练参数摘要通过约定方式交给内核。SPL 阶段的日志能力值得提前投资SPL 里哪怕只有一个轮询模式的 UART 打印Bring-up 的调试成本也能下降一个数量级。建议在 SPL 最开头就初始化串口并把「已进入 XXX 阶段、等待 XXX bit/令牌」逐句打出来。 DRAM 训练失败而没有日志是最难排查的一类问题。3.3 Bring-up 阶段判据与降级阶段通过判据失败后的降级 / 处置是否允许继续S0 · 电源五路电压实测在窗口内、斜升单调、纹波达标停止检查 PMIC 配置与原理图的上电编排否S1 · eMMC 低速枚举CMD1 就绪、CID/CSD 读到、能读 Boot 分区重试 N 次后进下载模式否S2 · eMMC 提速HS200 tuning 通过且回读一致停在 HS / Default Speed性能降级但可用降级继续S3 · DRAM 训练全阶段训练通过 全内存回校通过降速重试 ≥ 3 次仍失败则停并告警否S4 · OS 启动挂上文件系统、自检通过、守护进程起来进入恢复系统 / 换 A/B 槽重试回滚重试带未初始化的 DRAM 继续跑 随机崩溃的开始DRAM 训练失败却选择「继续跑」表现出来会是位置完全随机的崩溃某一处、某一次、某块数据极难与 DRAM 关联起来。宁可停在下载模式点灯也不要带病运行。4 · eMMC 侧初始化eMMC 侧的行为完全由 JEDEC 定义主机能做的裁量不多照标准序列走、把 EXT_CSD 读全、把该配的配上。 真正的差异体现在失败时的降级策略和稳态之外的掉电处理。4.1 标准命令序列CMD0GO_IDLE_STATE复位到 Idle。硬件复位使能时也可走RST_n信号。CMD1SEND_OP_COND带工作电压条件轮询直到 busy bit 置位表示 ready。轮询间隔 10 ms 级总额度建议 ≥ 1 s。CMD2ALL_SEND_CID读 128 bit CID厂商、产品名、版本、序列号。CMD3SET_RELATIVE_ADDR分配 RCA进入 Standby。CMD9SEND_CSD读 CSD得到容量、擦除组大小等关键参数。CMD7SELECT_CARD选中器件进入 Transfer 状态 ——之后才允许数据命令。CMD8SEND_EXT_CSD读 512 B EXT_CSD这是后续所有配置的依据。CMD6 配置总线宽度BUS_WIDTH[183]、高速时序HS_TIMING[185]、分区PARTITION_CONFIG[179]等。提速 tuningHS200 / HS400 模式下执行 tuning 流程并回读校验。/* eMMC 初始化骨架协议示意非平台实现 */ int emmc_init(host_t *h) { mmc_send_cmd(h, CMD0, 0, 0); /* 进 Idle */ uint32_t ocr OCR_VDD_27_36 | OCR_ACCESS_MODE_HS; /* 按板卡供电别写死 */ for (int i 0; i 100; i) { uint32_t r3 mmc_send_cmd(h, CMD1, ocr, /* busy check */ 1); if (r3 OCR_BUSY) break; /* ready */ mdelay(10); if (i 99) return -ETIMEDOUT; /* 超时必须上报 */ } cid mmc_send_cmd(h, CMD2, 0, 0); rca mmc_send_cmd(h, CMD3, 1, 0) 16; csd mmc_send_cmd(h, CMD9, rca 16, 0); mmc_send_cmd(h, CMD7, rca 16, 0); /* 选中 */ ext_csd mmc_read_ext_csd(h); /* CMD8 数据块 */ return emmc_apply_config(h, ext_csd); /* CMD6 系列 */ }CMD1 的 OCR 不要写死常见缺陷是把 CMD1 的 OCR 电压窗口硬编码成别的项目的取值而不是跟随板卡的实际供电 VCCQ 走 1.8 V 的板子和走 3.3 V 的板子OCR 必须不同。OCR 不匹配的表现是 CMD1 永远等不到 ready且没有任何其它报错排查时会完全无从下手。4.2 EXT_CSD 必读字段字段偏移初始化阶段为何必须读EXT_CSD_REV192判断器件版本决定后续哪些字段有效CARD_TYPE196判断支持 HS200 / HS400 及所需驱动强度SEC_COUNT212:215实际可用扇区总数不能只依赖 CSD 推算BUS_WIDTH183当前总线宽度配置前后都要确认HS_TIMING185当前速率模式切档后再读回验证PARTITION_CONFIG179Boot 分区使能、BOOT_ACK、当前访问分区BOOT_SIZE_MULTI226Boot 分区实际大小决定 SPL 能写多大RPMB_SIZE_MULT168RPMB 大小安全方案必须知道CACHE_SIZE249:252非空说明 Cache 存在且可能已使能决定 flush 策略BKOPS_EN / BKOPS_START163 / 164后台操作的自动 / 手动开关DEVICE_LIFE_TIME_EST_TYP / A / B268 / 269 / 270寿命估计健康监控数据来源PRE_EOL_INFO267寿命预警达到 Warning / Urgent 必须上报4.3 总线宽度与速率模式模式总线宽度时钟理论带宽要求Backward Compatible1/4/8≤ 26 MHz≤ 26 MB/s无特殊要求High Speed1/4/8≤ 52 MHz≤ 52 MB/sVCCQ 稳定HS2004/8SDR≤ 200 MHz≤ 200 MB/s必须 tuningVCCQ 1.8 VHS4008DDR≤ 200 MHz≤ 400 MB/s先切 HS200 并 tuning再启用 DS 进 HS400HS400 的提速路径不能跳步必须缺省 → HS → HS200tuning→ HS400启用 DS。直接写 HS400 到HS_TIMING会失败部分器件的表现为莫名其妙的数据错误而非报错。 若平台对稳定性要求高于峰值带宽停在 HS200 是完全可以接受的工程选择200 MB/s 与 400 MB/s 在多数嵌入式场景里不构成瓶颈而 HS400 对等长与参考平面的要求严苛得多。4.4 分区、Boot 与 RPMB区域用途软件约束Boot1 / Boot2存放 SPL / 一级引导通过PARTITION_CONFIG[179]的 BOOT_PARTITION_ENABLE 位选择支持双份冗余时建议A/B 轮换RPMB安全数据、防回滚计数Auth Key 一次性烧写写错不可挽回Write Counter 必须与掉电保护一起设计GPP通用分区可选RTOS / Recovery / 日志等分区一旦建好改动需要擦除产线流程要确认User Area文件系统主区域容量使用率约束见 §13.2Boot 分区会被器件「自动替换」成访问目标上电初期器件自动指向 Boot 分区供 BootROM 读取BootROM 结束后软件需要显式切换分区写PARTITION_CONFIG的 PARTITION_ACCESS 位才能访问 User Area。 忘记切换的表现是「能启动、但挂载文件系统失败」。4.5 初始化失败与降级路径失败点现象处置CMD1 等不到 ready初始化卡在第一句核对 OCR 电压窗口确认 VCC/VCCQ继续应 insure SRAM→SPL 已成功否则板子本身不通CMD2 / CMD3 超时CID 读不到CMD 线上拉缺失或时钟极慢示波器看波形EXT_CSD 读回全 0 / 全 FF配置无从下手多为供电不足或时序裕量不够降速重试切 8 bit 后读写错误低速行、高速不行退回 4 bit 或 1 bit检查 DAT1~DAT3 等长HS200 tuning 失败提速即错停在 HS / Default Speed 降级使用同时记录门限用于后续分析后续章节请下载「芯参谋」查看……篇幅原因, 还有17章· 详见芯参谋→方案设计当前分享仅开放前5章正文。详细资料请在芯参谋客户端中打开完整文档。打开路径解决方案应用市场分析 - 原理方案设计 - eMCP_软件设计规范 下载芯参谋客户端
返回列表