【MMC Core + hc16 Host(WiFi SDIO 如何落到控制器)】

发布时间:2026/10/11 10:13:20
【MMC Core + hc16 Host(WiFi SDIO 如何落到控制器)】 第 5 课MMC Core hc16 HostWiFi SDIO 如何落到控制器接第 14 课。前四课站在8733 WiFi 驱动视角本课下沉到MMC/SDIO 子系统 hc16 Host。目标任意一次sdio_readb/memcpy_toio/ DAT1 中断都能点名到dw_mci_request/mmc_signal_sdio_irq。正文自包含不必翻代码。对应源码备查MMCmmcdriver-*/drivers/mmc/core/core.crescansdio.cattach/initsdio_ops.c/sdio_io.c/sdio_irq.c/sdio_bus.c/sdio_cis.cHostmmcdriver-*/drivers/mmc/host/hc16/dw_mmc.c、dw_mmc-pltfm-hc.c头文件linux/mmc/host.h、sdio.h、sdio_func.h0. 本课总画面把整条栈再叠一层第14课RTL8733BS WiFi 驱动 │ sdio_* API ▼ 本课上半MMC SDIO Core协议与总线模型 │ mmc_host_ops.request / enable_sdio_irq / set_ios ▼ 本课下半hc16 DW MMC Host控制器驱动 │ ▼ SDIO 物理线CMD / CLK / DAT0-3DAT1 兼中断一句话8733 是客户MMC core 是翻译官hc16 是干活的硬件管家。1. 启动顺序谁先谁后结合第 1 课完整顺序应是1. Host 驱动 probehc16 → mmc_alloc_host → 填 mmc-ops → mmc_add_host → mmc_start_host 2. MMC core rescan → mmc_rescan → mmc_rescan_try_freq → 优先 mmc_attach_sdioWiFi 场景 3. SDIO 识卡成功 → 读 CCCR/CIS创建 sdio_func → sdio_register_bus 上的驱动 match 4. 8733 驱动已 register 或稍后 register → match 0x024c:0xB733/B73A → rtw_drv_init第 1 课关键结论WiFiprobe之前MMC 往往已经用 CMD5/CMD52 等把卡识别完了所以第 1 课说sdio_register_driver时“本驱动”未必读过寄存器但MMC 可能已经读过2. MMC 对象模型本课必记对象含义mmc_host一个 SDIO/MMC 控制器抽象mmc_host_opsHost 回调表request/set_ios/enable_sdio_irq…mmc_card已识别的卡sdio_func卡上某个 FunctionWiFi 通常 Func1mmc_request一次完整请求命令 可选数据mmc_command一条命令含 opcode/arg/respmmc_data数据阶段读/写、block、sgmmc_ios时钟、位宽、电压、时序等 IO 设置WiFi 驱动拿到的是sdio_func *它内部挂着func-card再挂着card-host最终打到host-ops-request。sdio_func → mmc_card → mmc_host → ops-request(host, mrq) // hc16: dw_mci_request3. 识卡路径mmc_attach_sdioWiFi 能 probe 的前提3.1 rescan 入口mmc_start_host → detect work → mmc_rescan → mmc_rescan_try_freq power_up sdio_reset / go_idle / CMD8(if_cond) 依次尝试 mmc_attach_sdio mmc_attach_sd mmc_attach_mmcWiFi 模组走mmc_attach_sdio。3.2mmc_sdio_init_card做什么概念顺序CMD5IO OCR—— 询问/设定工作电压 分配 mmc_card类型 SDIO 可选1.8V/UHS 切换 —— 本树可能被关掉 读 RCA、select card 读 CCCR能力、速度、总线宽度等 读 CISvendor/device供驱动 match 切高速 / 4bit若双方支持 为每个 Function 建 sdio_func读 FBR/CIS mmc_add_card → sdio_add_func → 总线 match → 调用 WiFi probe3.3 和第 1 课的衔接点MMC 已完成8733 probe 再做认出卡、建sdio_funcenable_func确保 Function 开着读出 CIS IDid_tablematch可能已设总线宽度/时钟set_block_size(512)尚未挂 WiFi 业务中断 handlerclaim_irq(sd_sync_int_hdl)4. 命令路径从 WiFi API 到dw_mci_request4.1 CMD52sdio_readb等8733: sdio_readb / sdio_writeb / sdio_f0_readb → MMC: mmc_io_rw_direct 构造 mmc_command opcode SD_IO_RW_DIRECT (CMD52) arg 写方向 | fn | addr | data → mmc_wait_for_cmd(host, cmd) → host-ops-request(host, mrq) // 实际常包在 wait 路径里 → hc16: dw_mci_request → 控制器发命令等响应 → mmc_request_doneCMD52通常没有 data 阶段只有命令 响应里带 1 字节。4.2 CMD53sdio_memcpy_*/readsb/writesb8733: sdio_memcpy_fromio / toio / readsb / writesb → MMC: mmc_io_rw_extended 构造 mrq: cmd.opcode SD_IO_RW_EXTENDED (CMD53) cmd.arg 含写方向、fn、addr、是否递增、byte/block data: 读或写、blksz、blocks、sg 缓冲区 → mmc_wait_for_req(host, mrq) → dw_mci_request → 命令 数据可用 DMA → mmc_request_doneWiFi/内核 APIincr_addr模式直觉memcpy_fromio/toio1递增连续地址窗readsb/writesb0固定FIFO 口第 2/4 课提过8733 主路径常fixed0走memcpy_*但 TX/RX 地址是特殊编码。4.3mmc_request长什么样概念mrq ├─ cmd : opcode/arg/flags/resp/error ├─ data : blksz/blocks/flags/sg/...CMD52 常无 └─ stop : 某些传输才有SDIO 常见路径未必用Host 驱动只认mrq不关心上面是 WiFi 还是存储。5. hc16 Hostdw_mci_ops与dw_mci_request5.1 Host 注册时挂上的 ops概念dw_mci_ops: .request dw_mci_request ← 所有命令入口 .set_ios dw_mci_set_ios ← 时钟/位宽/电压时序 .get_cd ... .enable_sdio_irq dw_mci_enable_sdio_irq .execute_tuning ... .start_signal_voltage_switch ... ...平台文件dw_mmc-pltfm-hc.c负责从 FDT/DTS 取基址、时钟、pinmux、相位延迟等调用dw_mci_pltfm_register→dw_mci_probemmc_alloc_host/mmc_add_host5.2dw_mci_request做什么dw_mci_request(mmc, mrq) 若卡不在 → mrq-cmd-error -ENOMEDIUM; request_done; 返回 加锁 把 mrq 排入该 slot 队列或立刻启动 解锁 后续在状态机/中断里发 CMD、搬数据、完成后 mmc_request_done完成路径控制器中断命令完成 / 数据完成 / 错误 → 填 cmd-error />5.3set_ios何时出现MMC core 在识卡、切高速、改总线宽度、调时钟时调用mmc_set_clock / mmc_set_bus_width / mmc_set_timing ... → host-ops-set_ios → dw_mci_set_iosWiFi 驱动一般不直接调set_ios它改的是芯片寄存器。总线时钟/位宽多在 MMC 识卡或电源管理路径里改。6. 中断路径从 DAT1 到第 3 课回调这是把第 3 课和下层钉死的关键图。6.1 Host 硬件中断芯片拉 DAT1 → DW MMC 产生 SDIO 中断状态位INT_SDIO → dw_mci IRQ handler → 清 RINTSTS 对应位 → mmc_signal_sdio_irq(slot-mmc)6.2 MMC SDIO IRQ 线程mmc_signal_sdio_irq → 唤醒 sdio_irq_threadksdioirqd/... → 线程里 claim_host process_sdio_pending_irqs 可读 CCCR INTx或单功能直调 handler 调用 func-irq_handler → 8733: sd_sync_int_hdl release_host → enable_sdio_irq(1) 再等下一次sdio_claim_irq第 1 课时写 CCCR 中断使能IENxsdio_card_irq_get→ 创建/引用 IRQ 线程保存func-irq_handler sd_sync_int_hdl6.3 为何处理中常enable_sdio_irq(0/1)收到 DAT1 → 先关 SDIO IRQ → 处理 → 再开防止处理期间中断风暴8733 在 handler 里还会读 HISR、搬 FIFO第 3 课这段时间 Host 侧通常保持“已消费本次门铃”的状态。7. 一张总对照表8733 ↔ MMC ↔ Host8733 / 内核 APIMMC Corehc16 Hostsdio_register_driversdio_busmatch/probe卡已由 hostcore 建好sdio_enable_func写 CCCR IOExCMD52dw_mci_requestsdio_set_block_size写 FBR/相关CMD52dw_mci_requestsdio_readb/writebmmc_io_rw_directCMD52dw_mci_requestmemcpy_*/readsb/writesbmmc_io_rw_extendedCMD53dw_mci_request DMA/FIFOsdio_claim_irqsdio_irq.c CCCR IENxenable_sdio_irqDAT1 来临mmc_signal_sdio_irq→ handlerIRQ 里看INT_SDIO间接改时钟位宽set_ios路径dw_mci_set_ios8. 三条端到端路径请背8.1 识卡到 WiFi probehc16 probe → mmc_add_host → mmc_start_host → mmc_rescan → mmc_attach_sdio → mmc_sdio_init_card → CIS 得到 0x024c:0xB733 → sdio_add_func → match → rtw_drv_init8.2 TX 一帧落到线接第 4 课write_cmd53 → raw_write → sdio_memcpy_toio/writesb → mmc_io_rw_extended(CMD53) → mmc_wait_for_req → dw_mci_request → DMA/FIFO 写出 → mmc_request_done → 返回 87338.3 RX 中断落到 8733接第 3 课DAT1 → dw_mci IRQ → mmc_signal_sdio_irq → sdio_irq_thread → sd_sync_int_hdl → sd_int_hdl → read_port → 再次 dw_mci_request(CMD53 读)注意一次 RX 至少两段 Host 事务——先可能有寄存器读HISR再有 FIFO CMD53 读都走dw_mci_request。9. 平台相关hc16 上你还该知道的点9.1 能力与限制Host 的caps/f_max/ocr_avail决定能否 4bit最高时钟是否声明支持 SDIO IRQ电压范围这些来自平台数据 / DTS在dw_mmc-pltfm-hc.c一类文件配置。9.2 Tuning / 1.8V高速 SDIO 可能涉及execute_tuningstart_signal_voltage_switch本树 SDIO 1.8V UHS 路径可能被裁掉#if 0。若 WiFi 只能跑在 3.3V HS排障时先确认实际 ios.timing / clock不要假设一定进了 UHS。9.3 和存储卡共享认知同一套dw_mci_request既服务 SD 存储也服务 SDIO WiFi。差别在 core 上层协议SD 命令集 vs CMD52/53不在 Host 入口。10. 排障从 WiFi 症状定位到哪一层现象优先怀疑根本没有 WiFi probeHost 没扫到卡 / attach_sdio 失败 / CIS ID 不匹配probe 到但 enable_func 失败电源、F0/CCCR、claim_host 异常能读写寄存器不能收包DAT1 /enable_sdio_irq/ HIMR / claim_irqCMD53 大数据总超时时钟、相位/tuning、DMA、对齐、信号完整性TX 很慢但 CMD 成功多半仍在 8733tx_allowed/聚合第 4 课不是 Host 发不出去偶发 -ENOMEDIUM掉电、复位、接触、surprise remove分层口诀probe 问题先看 MMC 识卡中断问题看 DAT1快慢问题先分清是 page 门禁还是 SDIO 线。11. 五课总串联图[第1课] register/probe/enable_func/claim_irq [第2课] CMD52/53 与 raw_read/write [第3课] DAT1 → HISR → read_port(CMD53) [第4课] enqueue → tx_allowed → write_port(CMD53) [第5课] 以上全部经 MMC core 落到 dw_mci_request / SDIO IRQ应用/协议栈 │ ▼ RTL8733BS第14课 │ sdio_* ▼ MMC SDIO Core本课 │ mmc_host_ops ▼ hc16 DW MMC本课 │ ▼ SDIO 物理总线 ↔ 8733 芯片12. 本课关键名词名词一句话mmc_host控制器抽象mmc_host_opsHost 回调表mmc_request一次命令数据请求mmc_io_rw_directCMD52 实现mmc_io_rw_extendedCMD53 实现mmc_attach_sdioSDIO 识卡入口CCCR/CIS公共控制与识别信息dw_mci_requesthc16 接收 mrq 的入口set_ios配时钟/位宽/时序mmc_signal_sdio_irqHost 把 DAT1 事件交给 SDIO 核心sdio_irq_thread调用各 func handler 的线程INT_SDIODW MMC 的 SDIO 中断状态位13. 本课必须记住的 8 句话WiFi 驱动是 SDIO 客户MMC core 先识卡再建 func。所有 CMD52/53 最终变成mmc_request交给host-ops-request。hc16 入口是dw_mci_request出口是mmc_request_done。CMD52 基本无 dataCMD53 有 data可 DMA。DAT1 → Host IRQ →mmc_signal_sdio_irq→sd_sync_int_hdl。claim_irq同时动 CCCR 与 Hostenable_sdio_irq。set_ios管总线参数不是 8733 自己的 WiFi 寄存器。排障先分层识卡 / 中断 / 命令超时 / 驱动 page 门禁。14. 自测题题 1为什么说 8733 的rtw_drv_init能被调用通常意味着 MMC 已经成功attach_sdio题 2sdio_readb与sdio_memcpy_toio分别对应 MMC 里哪两个函数命令号是什么题 3dw_mci_request如果不存在或卡住对 8733 的 TX/RX 会有什么影响题 4画出从 DAT1 到sd_sync_int_hdl的 Host/MMC 关键字链。题 5TX 很慢但抓到 CMD53 都成功返回更应先查第 4 课的哪一环还是先查 Host tuning题 6mmc_rescan_try_freq里为何优先attach_sdio再attach_sd题 7enable_sdio_irq(0)和 8733 的rtw_hal_disable_interrupt是同一层吗题 8按层列出一次 RX 收包会触发的两类或更多dw_mci_request事务。15. 自测题标准答案题 1rtw_drv_init是sdio_driver.probe只有总线里已经有匹配的sdio_func才会调用而sdio_func是mmc_attach_sdio/mmc_sdio_init_card创建并sdio_add_func的。题 2sdio_readb→mmc_io_rw_direct→CMD52sdio_memcpy_toio→mmc_io_rw_extended→CMD53题 3所有 SDIO 命令含 enable、寄存器、FIFO都无法真正下到硬件TX/RX 会超时失败最终可能 surprise_removed。题 4参考DAT1 → DW MMC INT_SDIO → mmc_signal_sdio_irq → sdio_irq_thread / process_sdio_pending_irqs → sd_sync_int_hdl题 5更应先查第 4 课tx_allowed/ 聚合 / page 分配。CMD53 都成功说明 Host 传输大体健康瓶颈常在“等 FIFO 空间/软件调度”。题 6同一槽位可能是 SDIO、SD 或 MMCWiFi 模组是 SDIO优先 SDIO 可更快正确识别避免按存储卡流程误判。代码注释也写Order’s important: SDIO, then SD, then MMC。题 7不是。enable_sdio_irqHost/MMC 层管 DAT1 中断路由rtw_hal_disable_interrupt芯片 HIMR 层管芯片上报哪些事件题 8参考读 HISR/长度寄存器CMD52 或短读→ 一次 requestread_port读 RX FIFOCMD53→ 又一次 request若循环收多包CMD53 可能多次。16. 学完五课后你应具备的能力能讲述 WiFi SDIO 从上电到 probe 的顺序能区分 CMD52/CMD53/F0/FIFO能讲清 RX 三层中断与 TXtx_allowed能把任意sdio_*调用映射到mmc_io_rw_*与dw_mci_request能按层排障识卡 / 中断 / 总线超时 / 驱动门禁附录 A关键调用链速查识卡dw_mci_probe → mmc_add_host → mmc_start_host → mmc_rescan → mmc_attach_sdio → mmc_sdio_init_card → sdio_add_func → rtw_drv_initCMD52sdio_readb → mmc_io_rw_direct → mmc_wait_for_cmd → dw_mci_request → mmc_request_doneCMD53sdio_memcpy_toio / fromio / writesb / readsb → mmc_io_rw_extended → mmc_wait_for_req → dw_mci_request → mmc_request_doneSDIO IRQINT_SDIO → mmc_signal_sdio_irq → sdio_irq_thread → sd_sync_int_hdl → sd_int_hdl

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询