1. Firmware 整体架构
1.1 软件分层架构
1 | ┌─────────────────────────────────────────────────────────────────────┐ |
1.2 Firmware 核心职责
| 模块 | 功能 | 协议依据 |
|---|---|---|
| NVMe 协议处理 | Admin/IO 命令解析与执行 | NVMe 1.4 Spec |
| eMMC 控制 | Command Queuing 读写操作 | eMMC 5.1 Spec |
| 数据流调度 | Host ↔ Controller ↔ eMMC 流水线 | - |
| 电源管理 | PCIe L1.2、APST 状态机 | NVMe 1.4 Chapter 8 |
| 中断处理 | MSI/MSI-X 中断派发 | NVMe 1.4 Chapter 7 |
2. Main 函数主循环
2.1 Firmware 初始化流程
1 | ┌─────────────────────┐ |
2.2 主循环处理流程
1 | ┌─────────────────────────────────────────────────────────────────────┐ |
2.3 关键代码片段
1 | while (1) { |
3. NVMe 命令处理流程
3.1 命令获取流程(符合 NVMe 1.4 Spec Figure 90)
1 | ┌────────────────────────────────────────────────────────────────────────┐ |
3.2 Admin 命令列表(NVMe 1.4 Spec Figure 139)
| Opcode | 命令名称 | 功能说明 |
|---|---|---|
| 0x00 | Delete I/O SQ | 删除 IO 提交队列 |
| 0x01 | Create I/O SQ | 创建 IO 提交队列 |
| 0x02 | Get Log Page | 获取日志页(Error, SMART, FW Slot) |
| 0x04 | Delete I/O CQ | 删除 IO 完成队列 |
| 0x05 | Create I/O CQ | 创建 IO 完成队列 |
| 0x06 | Identify | 获取 Controller/Namespace 信息 |
| 0x09 | Set Features | 设置功能参数(Power Mgmt, LBA Range) |
| 0x0A | Get Features | 获取功能参数 |
| 0x0C | Async Event Req | 异步事件请求(标记进入 OS 阶段) |
| 0x10 | FW Commit | 固件激活 |
| 0x11 | FW Download | 固件下载 |
| 0x80 | Format NVM | 格式化 Namespace |
3.3 IO 命令列表(NVMe 1.4 Spec Figure 186)
| Opcode | 命令名称 | 功能说明 |
|---|---|---|
| 0x00 | Flush | 刷新易失性写缓存到非易失介质 |
| 0x01 | Write | 写数据到 LBA 地址 |
| 0x02 | Read | 从 LBA 地址读数据 |
| 0x09 | Dataset Mgmt | TRIM/Deallocate 命令 |
3.4 命令解析代码
1 | int command_parse(void) |
4. Read/Write 命令处理
4.1 NVMe 到 eMMC 的地址映射
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
4.2 Read/Write 处理流程
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
4.3 任务信息结构
1 | typedef struct { |
5. eMMC Command Queuing 模式
5.1 CQ 模式流程(eMMC 5.1 Spec Section 6.6.40-44)
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
5.2 任务状态机
1 | ┌─────────────────────────────────────────────────────────┐ |
5.3 CQ 模式核心代码
1 | int emmc_read_write_cq_mode() |
6. Completion 发送机制
6.1 NVMe Completion 流程(NVMe 1.4 Spec Figure 91)
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
6.2 中断聚合策略
1 | void send_complete(u16 cmd_id, byte queue_id, u32 spec, u16 status) |
7. 数据传输流程
7.1 Host ↔ Controller ↔ eMMC 数据流
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
7.2 PRP 处理(NVMe 1.4 Spec Section 4.4)
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
8. 总结
8.1 设计要点
| 特性 | 实现方式 | 优势 |
|---|---|---|
| 事件驱动 | 主循环轮询 + 中断配合 | 响应速度与功耗平衡 |
| 三级流水 | NVMe Fetch → Task Queue → eMMC Execute | 并行处理提升吞吐 |
| 双 Buffer | CMD Buffer 0/1 Ping-Pong | 避免 Fetch 阻塞 |
| CQ 模式 | eMMC Command Queuing | 随机性能提升 |
| 错误恢复 | CMD/Data 错误自动重试 | 系统可靠性 |
8.2 关键性能参数
| 参数 | 典型值 | 说明 |
|---|---|---|
| Task Table 深度 | 32 | 每个 eMMC 通道 |
| CQ 深度 | 32 | 硬件 Command Queue |
| CMD Buffer | 2 x 1KB | 双 Buffer 交替 |
| Data Buffer | 4KB | Admin 命令数据 |
| FW Status 切换 | ~10ms | 约 263200 Loop |
参考资料
- NVM Express Base Specification 1.4
- JEDEC Standard JESD84-B51 (eMMC 5.1)
- SPARC V8 Architecture Manual