【MMC驱动分析】

mmcdriver 源码全面分析文档

生成说明:基于 mmcdriver 源码树(HC15/HC16 Host + MMC Core + Card/Block)静态分析整理。

源码根目录:drivers/mmc/

公共头文件:linux/include/linux/mmc/(内核 third_party)

函数清单由源码扫描得到(约 800+ 函数定义),关键路径辅以人工解读。

目录

  1. 总体架构
  2. 关键流程图
  3. 全局变量分析
  4. 结构体分析
  5. [Host 驱动(HC15/HC16)](#Host 驱动(HC15/HC16))
  6. [Core 层](#Core 层)
  7. [Card/Block 层](#Card/Block 层)
  8. 全量函数目录

1. 总体架构

本驱动是 Linux MMC 子系统向 HCRTOS 的裁剪移植,产物:

内容
libmmc.a drivers/mmc/core + card
libmmchosthc16.a Synopsys DW MMC + HiChip 平台 glue
libmmchosthc15.a HiChip 自研 HC15 MMC Host

分层关系:

text 复制代码
应用 / WiFi(SDIO) / 文件系统
        │
   card/  block、queue、sdio_uart   ← 块设备与专用卡驱动
        │
   core/  core、sdio、sd、mmc...      ← 协议、请求调度、枚举
        │
   host/  hc16/dw_mmc 或 hc15/hc_mmc ← 寄存器与 DMA/IRQ

2. 关键流程图

2.1 驱动挂载 / Probe

#mermaid-svg-Vs8sPWq5OFlDiExP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Vs8sPWq5OFlDiExP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Vs8sPWq5OFlDiExP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Vs8sPWq5OFlDiExP .error-icon{fill:#552222;}#mermaid-svg-Vs8sPWq5OFlDiExP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Vs8sPWq5OFlDiExP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Vs8sPWq5OFlDiExP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Vs8sPWq5OFlDiExP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Vs8sPWq5OFlDiExP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Vs8sPWq5OFlDiExP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Vs8sPWq5OFlDiExP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Vs8sPWq5OFlDiExP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Vs8sPWq5OFlDiExP .marker.cross{stroke:#333333;}#mermaid-svg-Vs8sPWq5OFlDiExP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Vs8sPWq5OFlDiExP p{margin:0;}#mermaid-svg-Vs8sPWq5OFlDiExP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Vs8sPWq5OFlDiExP .cluster-label text{fill:#333;}#mermaid-svg-Vs8sPWq5OFlDiExP .cluster-label span{color:#333;}#mermaid-svg-Vs8sPWq5OFlDiExP .cluster-label span p{background-color:transparent;}#mermaid-svg-Vs8sPWq5OFlDiExP .label text,#mermaid-svg-Vs8sPWq5OFlDiExP span{fill:#333;color:#333;}#mermaid-svg-Vs8sPWq5OFlDiExP .node rect,#mermaid-svg-Vs8sPWq5OFlDiExP .node circle,#mermaid-svg-Vs8sPWq5OFlDiExP .node ellipse,#mermaid-svg-Vs8sPWq5OFlDiExP .node polygon,#mermaid-svg-Vs8sPWq5OFlDiExP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Vs8sPWq5OFlDiExP .rough-node .label text,#mermaid-svg-Vs8sPWq5OFlDiExP .node .label text,#mermaid-svg-Vs8sPWq5OFlDiExP .image-shape .label,#mermaid-svg-Vs8sPWq5OFlDiExP .icon-shape .label{text-anchor:middle;}#mermaid-svg-Vs8sPWq5OFlDiExP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Vs8sPWq5OFlDiExP .rough-node .label,#mermaid-svg-Vs8sPWq5OFlDiExP .node .label,#mermaid-svg-Vs8sPWq5OFlDiExP .image-shape .label,#mermaid-svg-Vs8sPWq5OFlDiExP .icon-shape .label{text-align:center;}#mermaid-svg-Vs8sPWq5OFlDiExP .node.clickable{cursor:pointer;}#mermaid-svg-Vs8sPWq5OFlDiExP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Vs8sPWq5OFlDiExP .arrowheadPath{fill:#333333;}#mermaid-svg-Vs8sPWq5OFlDiExP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Vs8sPWq5OFlDiExP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Vs8sPWq5OFlDiExP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Vs8sPWq5OFlDiExP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Vs8sPWq5OFlDiExP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Vs8sPWq5OFlDiExP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Vs8sPWq5OFlDiExP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Vs8sPWq5OFlDiExP .cluster text{fill:#333;}#mermaid-svg-Vs8sPWq5OFlDiExP .cluster span{color:#333;}#mermaid-svg-Vs8sPWq5OFlDiExP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Vs8sPWq5OFlDiExP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Vs8sPWq5OFlDiExP rect.text{fill:none;stroke-width:0;}#mermaid-svg-Vs8sPWq5OFlDiExP .icon-shape,#mermaid-svg-Vs8sPWq5OFlDiExP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Vs8sPWq5OFlDiExP .icon-shape p,#mermaid-svg-Vs8sPWq5OFlDiExP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Vs8sPWq5OFlDiExP .icon-shape .label rect,#mermaid-svg-Vs8sPWq5OFlDiExP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Vs8sPWq5OFlDiExP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Vs8sPWq5OFlDiExP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Vs8sPWq5OFlDiExP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} HC16
HC15
module_platform_driver 注册
module_driver_late
按路径探测 FDT 节点

/hcrtos/mmc*
of_platform_device_register_simple
platform 匹配驱动名
HC16 / HC15
dw_mci_hichip_pltfm_probe
dw_mci_pltfm_register
dw_mci_probe
dw_mci_parse_dt + hc1600_init
dw_mci_init_slot
mmc_of_parse + mmc_add_host
hc_mmc_probe
hc15_mci_parse_dt + init_slot
mmc_start_host → mmc_rescan

2.2 卡枚举

#mermaid-svg-zvsCamwG9WTOpdJx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zvsCamwG9WTOpdJx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zvsCamwG9WTOpdJx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zvsCamwG9WTOpdJx .error-icon{fill:#552222;}#mermaid-svg-zvsCamwG9WTOpdJx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zvsCamwG9WTOpdJx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zvsCamwG9WTOpdJx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zvsCamwG9WTOpdJx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zvsCamwG9WTOpdJx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zvsCamwG9WTOpdJx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zvsCamwG9WTOpdJx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zvsCamwG9WTOpdJx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zvsCamwG9WTOpdJx .marker.cross{stroke:#333333;}#mermaid-svg-zvsCamwG9WTOpdJx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zvsCamwG9WTOpdJx p{margin:0;}#mermaid-svg-zvsCamwG9WTOpdJx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zvsCamwG9WTOpdJx .cluster-label text{fill:#333;}#mermaid-svg-zvsCamwG9WTOpdJx .cluster-label span{color:#333;}#mermaid-svg-zvsCamwG9WTOpdJx .cluster-label span p{background-color:transparent;}#mermaid-svg-zvsCamwG9WTOpdJx .label text,#mermaid-svg-zvsCamwG9WTOpdJx span{fill:#333;color:#333;}#mermaid-svg-zvsCamwG9WTOpdJx .node rect,#mermaid-svg-zvsCamwG9WTOpdJx .node circle,#mermaid-svg-zvsCamwG9WTOpdJx .node ellipse,#mermaid-svg-zvsCamwG9WTOpdJx .node polygon,#mermaid-svg-zvsCamwG9WTOpdJx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zvsCamwG9WTOpdJx .rough-node .label text,#mermaid-svg-zvsCamwG9WTOpdJx .node .label text,#mermaid-svg-zvsCamwG9WTOpdJx .image-shape .label,#mermaid-svg-zvsCamwG9WTOpdJx .icon-shape .label{text-anchor:middle;}#mermaid-svg-zvsCamwG9WTOpdJx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zvsCamwG9WTOpdJx .rough-node .label,#mermaid-svg-zvsCamwG9WTOpdJx .node .label,#mermaid-svg-zvsCamwG9WTOpdJx .image-shape .label,#mermaid-svg-zvsCamwG9WTOpdJx .icon-shape .label{text-align:center;}#mermaid-svg-zvsCamwG9WTOpdJx .node.clickable{cursor:pointer;}#mermaid-svg-zvsCamwG9WTOpdJx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zvsCamwG9WTOpdJx .arrowheadPath{fill:#333333;}#mermaid-svg-zvsCamwG9WTOpdJx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zvsCamwG9WTOpdJx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zvsCamwG9WTOpdJx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zvsCamwG9WTOpdJx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zvsCamwG9WTOpdJx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zvsCamwG9WTOpdJx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zvsCamwG9WTOpdJx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zvsCamwG9WTOpdJx .cluster text{fill:#333;}#mermaid-svg-zvsCamwG9WTOpdJx .cluster span{color:#333;}#mermaid-svg-zvsCamwG9WTOpdJx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zvsCamwG9WTOpdJx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zvsCamwG9WTOpdJx rect.text{fill:none;stroke-width:0;}#mermaid-svg-zvsCamwG9WTOpdJx .icon-shape,#mermaid-svg-zvsCamwG9WTOpdJx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zvsCamwG9WTOpdJx .icon-shape p,#mermaid-svg-zvsCamwG9WTOpdJx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zvsCamwG9WTOpdJx .icon-shape .label rect,#mermaid-svg-zvsCamwG9WTOpdJx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zvsCamwG9WTOpdJx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zvsCamwG9WTOpdJx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zvsCamwG9WTOpdJx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败
失败
mmc_rescan
mmc_rescan_try_freq
mmc_power_up
mmc_go_idle / if_cond
mmc_attach_sdio
mmc_attach_sd
mmc_attach_mmc
mmc_add_card / sdio_add_func
上层 mmc_driver / sdio_driver probe

2.3 一笔请求完成(SDIO CMD53 示例)

dw_mmc.c core.c sdio_io.c SDIO 驱动 dw_mmc.c core.c sdio_io.c SDIO 驱动 #mermaid-svg-qT9EClcsghn9Oo8H{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qT9EClcsghn9Oo8H .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qT9EClcsghn9Oo8H .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qT9EClcsghn9Oo8H .error-icon{fill:#552222;}#mermaid-svg-qT9EClcsghn9Oo8H .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qT9EClcsghn9Oo8H .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qT9EClcsghn9Oo8H .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qT9EClcsghn9Oo8H .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qT9EClcsghn9Oo8H .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qT9EClcsghn9Oo8H .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qT9EClcsghn9Oo8H .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qT9EClcsghn9Oo8H .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qT9EClcsghn9Oo8H .marker.cross{stroke:#333333;}#mermaid-svg-qT9EClcsghn9Oo8H svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qT9EClcsghn9Oo8H p{margin:0;}#mermaid-svg-qT9EClcsghn9Oo8H .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-qT9EClcsghn9Oo8H text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-qT9EClcsghn9Oo8H .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-qT9EClcsghn9Oo8H .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-qT9EClcsghn9Oo8H .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-qT9EClcsghn9Oo8H .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-qT9EClcsghn9Oo8H #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-qT9EClcsghn9Oo8H .sequenceNumber{fill:white;}#mermaid-svg-qT9EClcsghn9Oo8H #sequencenumber{fill:#333;}#mermaid-svg-qT9EClcsghn9Oo8H #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-qT9EClcsghn9Oo8H .messageText{fill:#333;stroke:none;}#mermaid-svg-qT9EClcsghn9Oo8H .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-qT9EClcsghn9Oo8H .labelText,#mermaid-svg-qT9EClcsghn9Oo8H .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-qT9EClcsghn9Oo8H .loopText,#mermaid-svg-qT9EClcsghn9Oo8H .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-qT9EClcsghn9Oo8H .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-qT9EClcsghn9Oo8H .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-qT9EClcsghn9Oo8H .noteText,#mermaid-svg-qT9EClcsghn9Oo8H .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-qT9EClcsghn9Oo8H .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-qT9EClcsghn9Oo8H .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-qT9EClcsghn9Oo8H .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-qT9EClcsghn9Oo8H .actorPopupMenu{position:absolute;}#mermaid-svg-qT9EClcsghn9Oo8H .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-qT9EClcsghn9Oo8H .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-qT9EClcsghn9Oo8H .actor-man circle,#mermaid-svg-qT9EClcsghn9Oo8H line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-qT9EClcsghn9Oo8H :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} sdio_memcpy_toio/fromio mmc_io_rw_extended(CMD53) mmc_wait_for_req ops->>request start_request 写寄存器 IRQ → tasklet dw_mci_request_end mmc_request_done wait 返回 完成

2.4 块读写

#mermaid-svg-CEXNRTvGAIghpitF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CEXNRTvGAIghpitF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CEXNRTvGAIghpitF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CEXNRTvGAIghpitF .error-icon{fill:#552222;}#mermaid-svg-CEXNRTvGAIghpitF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CEXNRTvGAIghpitF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CEXNRTvGAIghpitF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CEXNRTvGAIghpitF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CEXNRTvGAIghpitF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CEXNRTvGAIghpitF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CEXNRTvGAIghpitF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CEXNRTvGAIghpitF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CEXNRTvGAIghpitF .marker.cross{stroke:#333333;}#mermaid-svg-CEXNRTvGAIghpitF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CEXNRTvGAIghpitF p{margin:0;}#mermaid-svg-CEXNRTvGAIghpitF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CEXNRTvGAIghpitF .cluster-label text{fill:#333;}#mermaid-svg-CEXNRTvGAIghpitF .cluster-label span{color:#333;}#mermaid-svg-CEXNRTvGAIghpitF .cluster-label span p{background-color:transparent;}#mermaid-svg-CEXNRTvGAIghpitF .label text,#mermaid-svg-CEXNRTvGAIghpitF span{fill:#333;color:#333;}#mermaid-svg-CEXNRTvGAIghpitF .node rect,#mermaid-svg-CEXNRTvGAIghpitF .node circle,#mermaid-svg-CEXNRTvGAIghpitF .node ellipse,#mermaid-svg-CEXNRTvGAIghpitF .node polygon,#mermaid-svg-CEXNRTvGAIghpitF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CEXNRTvGAIghpitF .rough-node .label text,#mermaid-svg-CEXNRTvGAIghpitF .node .label text,#mermaid-svg-CEXNRTvGAIghpitF .image-shape .label,#mermaid-svg-CEXNRTvGAIghpitF .icon-shape .label{text-anchor:middle;}#mermaid-svg-CEXNRTvGAIghpitF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CEXNRTvGAIghpitF .rough-node .label,#mermaid-svg-CEXNRTvGAIghpitF .node .label,#mermaid-svg-CEXNRTvGAIghpitF .image-shape .label,#mermaid-svg-CEXNRTvGAIghpitF .icon-shape .label{text-align:center;}#mermaid-svg-CEXNRTvGAIghpitF .node.clickable{cursor:pointer;}#mermaid-svg-CEXNRTvGAIghpitF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CEXNRTvGAIghpitF .arrowheadPath{fill:#333333;}#mermaid-svg-CEXNRTvGAIghpitF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CEXNRTvGAIghpitF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CEXNRTvGAIghpitF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CEXNRTvGAIghpitF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CEXNRTvGAIghpitF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CEXNRTvGAIghpitF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CEXNRTvGAIghpitF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CEXNRTvGAIghpitF .cluster text{fill:#333;}#mermaid-svg-CEXNRTvGAIghpitF .cluster span{color:#333;}#mermaid-svg-CEXNRTvGAIghpitF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CEXNRTvGAIghpitF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CEXNRTvGAIghpitF rect.text{fill:none;stroke-width:0;}#mermaid-svg-CEXNRTvGAIghpitF .icon-shape,#mermaid-svg-CEXNRTvGAIghpitF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CEXNRTvGAIghpitF .icon-shape p,#mermaid-svg-CEXNRTvGAIghpitF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CEXNRTvGAIghpitF .icon-shape .label rect,#mermaid-svg-CEXNRTvGAIghpitF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CEXNRTvGAIghpitF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CEXNRTvGAIghpitF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CEXNRTvGAIghpitF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 文件系统/块接口
request_queue
mmcqd 线程
mmc_blk_issue_*
mmc_wait_for_req
Host ops.request


3. 全局变量分析

变量 位置 作用
use_spi_crc core/core.c SPI 模式是否使用 CRC
workqueue (kmmcd) core/core.c detect/rescan 等工作队列
mmc_sdio_hang_dbg core/core.c SDIO 挂死调试开关
mmc_sdio_fr_* core/core.c SDIO 飞行中 claim/请求调试记录
freqs[] core/core.c rescan 尝试频率表
perdev_minors card/block.c 每盘次设备数
dev_use / name_use card/block.c 设备号/名字位图
max_devices card/block.c 最大块设备数
g_sd_offset card/block.c FAT 调试偏移
block_mutex / open_lock card/block.c 块驱动互斥
dw_mci_fr_* host/hc16/dw_mmc.c Host 飞行调试状态
dw_mci_ops dw_mmc.c 注册到 mmc_host 的 ops
hc1600_data dw_mmc-pltfm-hc.c HC16 SoC 回调集
hc1600_dts_* dw_mmc-pltfm-hc.c DTS 时序参数缓存
mmc_clk_cfg_table dw_mmc-pltfm-hc.c 时钟分频/相位配置表
tuning_blk_pattern_* dw_mmc-pltfm-hc.c 调谐参考图案
mmc_node_path[] pltfm-hc / hc_mmc FDT 节点搜索路径
dw_mci_pltfm_driver / hc_mmc_driver Host platform_driver 实例
mmc_host_idr core/host.c host 索引分配
sd_type 等 device_type sd.c/mmc.c 设备类型属性
blk_max_low_pfn card/blk_req.c bounce 相关上限

4. 结构体分析

4.1 请求三件套(linux/mmc/core.h

结构体 作用 关键成员
mmc_command 一条命令 opcode/arg/resp/flags/error/retries/data/mrq
mmc_data 数据段 blksz/blocks/flags/sg/bytes_xfered/stop/error
mmc_request 一笔完整请求 sbc/cmd/data/stop/completion/done/host

4.2 Host(linux/mmc/host.h

结构体 作用
mmc_ios 时钟、总线宽、电源、timing、信号电压等当前 IO 状态
mmc_host_ops Host 驱动回调:request/set_ios/get_cd/get_ro/enable_sdio_irq/execute_tuning/...
mmc_host Host 实例:caps、OCR、card、claim、detect work、ops、ios
mmc_slot CD IRQ 等插槽辅助
mmc_context_info 块层异步上下文同步
mmc_async_req 异步请求包装(含 err_check)

4.3 Card / SDIO

结构体 作用
mmc_card 已识别卡:类型、CID/CSD、host 指针、sdio_func 等
sdio_func SDIO 功能号设备,WiFi 等驱动绑定对象
sdio_driver SDIO 驱动(id_table + probe/remove)
mmc_bus_ops 按卡类型的 detect/suspend/reset 策略

4.4 DW MMC Host(dw_mmc.h / linux/mmc/dw_mmc.h

结构体/枚举 作用
enum dw_mci_state IDLE/SENDING_CMD/SENDING_DATA/... 状态机
struct dw_mci 控制器:regs、mrq、DMA、tasklet、queue、slot\[\]、时钟
struct dw_mci_slot 每插槽:mmc_host、clock、flags、queue_node
struct dw_mci_drv_data SoC 扩展:init/setup_clock/parse_dt/execute_tuning/...
struct dw_mci_board 平台数据:num_slots、bus_hz、fifo_depth、quirks、caps
struct idmac_desc / idmac_desc_64addr 内部 DMA 描述符
struct dw_mci_dma_ops DMA init/start/stop/cleanup
struct dw_mci_tuning_data / range_t HC16 调谐

4.5 HC15 Host(hc_mmc.h

结构体 作用
hc_mmc_host HC15 控制器状态
hc_mmc_host_ops 寄存器级硬件操作(发命令、清 IRQ、DMA 等)
hc_mmc_platform_data 平台/DT 解析结果

4.6 Block 层

结构体 作用
mmc_blk_data 每盘实例:gendisk、queue、分区链表、flags
mmc_queue mmcqd 线程 + 双缓冲 mqrq
mmc_queue_req 块 request ↔ MMC brq/sg/bounce
mmc_blk_request 组装好的 mrq+cmd+data
gendisk / request / request_queue HCRTOS 精简块层抽象(blk_req.h
sddisk_partition_s 逻辑分区节点

4.7 其它

结构体 作用
mmc_pwrseq / *_simple / *_emmc 上电时序
mmc_gpio CD/WP GPIO
cis_tpl SDIO CIS tuple
sdio_uart_port SDIO UART
mmc_test_* mmc_test 测试框架

5. Host 驱动(HC15/HC16)

本章说明 HC15/HC16 Host 文件职责、结构体、关键函数与 probe/请求流程。

总览

系列 IP 核心文件 Platform 兼容字符串 平台驱动名
HC16 Synopsys DesignWare MSHC dw_mmc.c + dw_mmc.h hichip,dw-mshc dw_mmc_hc
HC16 通用注册(上游,本树中 probe 已 #if 0 dw_mmc-pltfm.c snps,dw-mshc 等(未启用) dw_mmc
HC16 HiChip 时钟/相位/调谐 dw_mmc-pltfm-hc.c + dw_mmc-pltfm-hc16.h 同上 与 HC glue 同模块
HC15 HiChip 自研 SD/MMC 控制器 hc_mmc.c + hc_mmc.h hichip,mmc hc-mmc
HC15 寄存器级 HW ops hc15_mmc-pltfm-hc.c --- 实现 hc_mmc_host_hw_ops

HC16 走 DW 状态机 + IDMAC/PIO ;HC15 走 命令/数据分离 + DMA/PIO + 双 tasklet


HCRTOS 特有入口(两系列相同模式)

1. 正常 Linux 式平台驱动
  • HC16module_platform_driver(dw_mci_pltfm_driver)driver.name = "dw_mmc_hc"of_match_tablecompatible = "hichip,dw-mshc"probedw_mci_pltfm_register()dw_mci_probe()
  • HC15module_platform_driver(hc_mmc_driver)driver.name = "hc-mmc"compatible = "hichip,mmc"probehc_mmc_probe()

在标准 Linux 上,设备树里带上述 compatible 的节点会由 OF 自动绑定 platform device。

2. 晚绑定:module_driver_late

HCRTOS 无完整 OF 自动枚举时,用 late init 从扁平 DT(FDT)按固定路径找节点,再手工注册 platform device:

c 复制代码
char *mmc_node_path[] = {
    "/hcrtos/mmcv20intf0",
    "/hcrtos/mmcv20intf1",
    "/hcrtos/mmcv30",
    "/hcrtos/mmc",
    NULL,
};
  • HC16module_driver_late(hcmmc_device, hcmmc_device_probe, ...)

    • get_mmc_node()fdt_node_probe_by_path(path) 依次尝试
    • 成功则 of_platform_device_register_simple(of_node, "dw_mmc_hc", ...)
    • 触发 dw_mci_hichip_pltfm_probedw_mci_pltfm_register
  • HC15module_driver_late(hc15_mmc_device, hc15_mmc_device_probe, ...)

    • 同样 get_mmc_node()
    • of_platform_device_register_simple(of_node, DRIVER_NAME /* "hc-mmc" */, ...)

注意(HCRTOS OF 约定)

  1. FDT 节点挂在 /hcrtos/... 路径下(由 fdt_node_probe_by_path 查找);
  2. 板级 DTS 写 hcrtos-compatible (不是标准 Linux compatible);of_device_is_compatible()fdt_api.c 中读该属性。取值仍为 hichip,dw-mshc(HC16)或 hichip,mmc(HC15);
  3. register_simpledriver 名字 必须与 platform_driver.driver.name 一致(dw_mmc_hc / hc-mmc)。
3. Probe 总流程(Mermaid)

#mermaid-svg-BZY6AsQCpBSVFHFd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BZY6AsQCpBSVFHFd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BZY6AsQCpBSVFHFd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BZY6AsQCpBSVFHFd .error-icon{fill:#552222;}#mermaid-svg-BZY6AsQCpBSVFHFd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BZY6AsQCpBSVFHFd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BZY6AsQCpBSVFHFd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BZY6AsQCpBSVFHFd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BZY6AsQCpBSVFHFd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BZY6AsQCpBSVFHFd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BZY6AsQCpBSVFHFd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BZY6AsQCpBSVFHFd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BZY6AsQCpBSVFHFd .marker.cross{stroke:#333333;}#mermaid-svg-BZY6AsQCpBSVFHFd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BZY6AsQCpBSVFHFd p{margin:0;}#mermaid-svg-BZY6AsQCpBSVFHFd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BZY6AsQCpBSVFHFd .cluster-label text{fill:#333;}#mermaid-svg-BZY6AsQCpBSVFHFd .cluster-label span{color:#333;}#mermaid-svg-BZY6AsQCpBSVFHFd .cluster-label span p{background-color:transparent;}#mermaid-svg-BZY6AsQCpBSVFHFd .label text,#mermaid-svg-BZY6AsQCpBSVFHFd span{fill:#333;color:#333;}#mermaid-svg-BZY6AsQCpBSVFHFd .node rect,#mermaid-svg-BZY6AsQCpBSVFHFd .node circle,#mermaid-svg-BZY6AsQCpBSVFHFd .node ellipse,#mermaid-svg-BZY6AsQCpBSVFHFd .node polygon,#mermaid-svg-BZY6AsQCpBSVFHFd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BZY6AsQCpBSVFHFd .rough-node .label text,#mermaid-svg-BZY6AsQCpBSVFHFd .node .label text,#mermaid-svg-BZY6AsQCpBSVFHFd .image-shape .label,#mermaid-svg-BZY6AsQCpBSVFHFd .icon-shape .label{text-anchor:middle;}#mermaid-svg-BZY6AsQCpBSVFHFd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BZY6AsQCpBSVFHFd .rough-node .label,#mermaid-svg-BZY6AsQCpBSVFHFd .node .label,#mermaid-svg-BZY6AsQCpBSVFHFd .image-shape .label,#mermaid-svg-BZY6AsQCpBSVFHFd .icon-shape .label{text-align:center;}#mermaid-svg-BZY6AsQCpBSVFHFd .node.clickable{cursor:pointer;}#mermaid-svg-BZY6AsQCpBSVFHFd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BZY6AsQCpBSVFHFd .arrowheadPath{fill:#333333;}#mermaid-svg-BZY6AsQCpBSVFHFd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BZY6AsQCpBSVFHFd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BZY6AsQCpBSVFHFd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BZY6AsQCpBSVFHFd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BZY6AsQCpBSVFHFd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BZY6AsQCpBSVFHFd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BZY6AsQCpBSVFHFd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BZY6AsQCpBSVFHFd .cluster text{fill:#333;}#mermaid-svg-BZY6AsQCpBSVFHFd .cluster span{color:#333;}#mermaid-svg-BZY6AsQCpBSVFHFd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BZY6AsQCpBSVFHFd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BZY6AsQCpBSVFHFd rect.text{fill:none;stroke-width:0;}#mermaid-svg-BZY6AsQCpBSVFHFd .icon-shape,#mermaid-svg-BZY6AsQCpBSVFHFd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BZY6AsQCpBSVFHFd .icon-shape p,#mermaid-svg-BZY6AsQCpBSVFHFd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BZY6AsQCpBSVFHFd .icon-shape .label rect,#mermaid-svg-BZY6AsQCpBSVFHFd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BZY6AsQCpBSVFHFd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BZY6AsQCpBSVFHFd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BZY6AsQCpBSVFHFd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败
成功
模块加载
module_platform_driver 注册 platform_driver
module_driver_late hcmmc_device / hc15_mmc_device
get_mmc_node: 遍历 /hcrtos/mmc* 路径
返回 0 不注册
of_platform_device_register_simple
platform probe
HC16: dw_mci_pltfm_register
HC15: hc_mmc_probe
dw_mci_probe
mmc_add_host
dw_mci_init_slot + mmc_add_host


HC16:DesignWare MMC

dw_mmc.h

用途 :DW MSHC 寄存器偏移/位域 、FIFO 访问宏、struct dw_mci_slot / struct dw_mci_drv_data 声明,以及 dw_mci_probe/remove 导出。

主要类型struct dw_mci / struct dw_mci_boardlinux/mmc/dw_mmc.h):

结构体 含义
struct dw_mci_slot 单 slot:mmc/hostctypemrqqueue_nodeclock/__clk_oldflagsDW_MMC_CARD_PRESENT 等)、idsdio_id
struct dw_mci_drv_data 平台回调:initsetup_clocksetup_clock_for_slotprepare_commandset_iosparse_dtexecute_tuningprepare_hs400_tuningswitch_voltage
struct dw_mci 控制器全局:锁、MMIO、cur_slot/mrq/cmd/data、DMA、tasklet、pending_events/state/queuebus_hzslot[]quirks、定时器 cmd11/cto/dto
struct dw_mci_board num_slotsquirksbus_hzcaps/caps2fifo_depthdetect_delay_msdma_ops
enum dw_mci_state STATE_IDLESENDING_CMDSENDING_DATADATA_BUSYSENDING_STOP

导出 APIdw_mci_probe(host)dw_mci_remove(host)、可选 suspend/resume。


dw_mmc.c

用途 :DW MMC 核心驱动 ------请求队列、命令/数据传输、IDMAC/EDMAC/PIO、IRQ + tasklet 状态机、mmc_host_ops、DT 解析、dw_mci_probe

mmc_host_opsdw_mci_ops
回调 函数 作用
request dw_mci_request 卡存在检查 → dw_mci_queue_request
pre_req / post_req dw_mci_pre_req / dw_mci_post_req DMA 映射预准备
set_ios dw_mci_set_ios 总线宽、UHS/DDR、slot->clockdw_mci_setup_bus、电源/调压
get_ro / get_cd dw_mci_get_ro / dw_mci_get_cd GPIO/控制器 CD
hw_reset dw_mci_hw_reset 硬件复位
enable_sdio_irq dw_mci_enable_sdio_irq SDIO 中断掩码
execute_tuning dw_mci_execute_tuning drv_data->execute_tuning
card_busy dw_mci_card_busy STATUS.BUSY
start_signal_voltage_switch dw_mci_switch_voltage 转平台 switch_voltage
init_card dw_mci_init_card 卡初始化钩子
prepare_hs400_tuning dw_mci_prepare_hs400_tuning HS400 调谐准备
关键函数(详)
函数 作用 参数/返回
dw_mci_probe 时钟、可选 drv_data->init/setup_clock、复位、DMA、IRQ、slot、dw_mci_enable_cd host;0 或负 errno
dw_mci_pltfm_register(在 pltfm.c) 分配 dw_mci、ioremap、IRQ、dw_mci_probe pdev, drv_data
dw_mci_request MMC 核心入口 mmc, mrq
dw_mci_queue_request IDLE 则 dw_mci_start_request,否则入 host->queue host->lock
__dw_mci_start_request 填 BLKSIZ/BYTCNT、DMA、dw_mci_start_command
dw_mci_setup_bus 时钟:优先 setup_clock_for_slot(HC 用),否则 CLKDIV
dw_mci_interrupt MINTSTS:CMD/DATA 错误、DATA_OVER、RXDR/TXDR、CMD_DONE、CD、SDIO;IDMAC TI/RI → dma_ops->complete IRQ_HANDLED
dw_mci_tasklet_func 状态机:CMD 完成 → DATA → STOP → dw_mci_request_end
dw_mci_request_end 出队下一请求或 IDLE,mmc_request_done
dw_mci_idmac_* / dw_mci_edmac_* 内部/外部 DMA
dw_mci_parse_dt num-slotsbroken-cdfifo-depthclock-frequency、可选 drv_data->parse_dt dw_mci_board
dw_mci_init_slot mmc_alloc_hostdw_mci_opsclock-freq-min-maxmmc_add_host

HCRTOS 调试dw_mci_hang_dumpdw_mci_fr_* 冻结请求时间线。

其余函数(简表)

dw_mci_resetdw_mci_ctrl_resetmci_send_cmddw_mci_prepare_commanddw_mci_submit_data/dw_mci_submit_data_dmadw_mci_*_piodw_mci_command_complete/dw_mci_data_completedw_mci_cto_timer/dw_mci_dto_timer/dw_mci_cmd11_timerdw_mci_remove/suspend/resumedw_mci_init_dma、debugfs 等。

HC16 请求完成流程(Mermaid)

#mermaid-svg-I7L86H4wBMmw5Dr2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-I7L86H4wBMmw5Dr2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-I7L86H4wBMmw5Dr2 .error-icon{fill:#552222;}#mermaid-svg-I7L86H4wBMmw5Dr2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-I7L86H4wBMmw5Dr2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-I7L86H4wBMmw5Dr2 .marker.cross{stroke:#333333;}#mermaid-svg-I7L86H4wBMmw5Dr2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-I7L86H4wBMmw5Dr2 p{margin:0;}#mermaid-svg-I7L86H4wBMmw5Dr2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-I7L86H4wBMmw5Dr2 .cluster-label text{fill:#333;}#mermaid-svg-I7L86H4wBMmw5Dr2 .cluster-label span{color:#333;}#mermaid-svg-I7L86H4wBMmw5Dr2 .cluster-label span p{background-color:transparent;}#mermaid-svg-I7L86H4wBMmw5Dr2 .label text,#mermaid-svg-I7L86H4wBMmw5Dr2 span{fill:#333;color:#333;}#mermaid-svg-I7L86H4wBMmw5Dr2 .node rect,#mermaid-svg-I7L86H4wBMmw5Dr2 .node circle,#mermaid-svg-I7L86H4wBMmw5Dr2 .node ellipse,#mermaid-svg-I7L86H4wBMmw5Dr2 .node polygon,#mermaid-svg-I7L86H4wBMmw5Dr2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-I7L86H4wBMmw5Dr2 .rough-node .label text,#mermaid-svg-I7L86H4wBMmw5Dr2 .node .label text,#mermaid-svg-I7L86H4wBMmw5Dr2 .image-shape .label,#mermaid-svg-I7L86H4wBMmw5Dr2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-I7L86H4wBMmw5Dr2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-I7L86H4wBMmw5Dr2 .rough-node .label,#mermaid-svg-I7L86H4wBMmw5Dr2 .node .label,#mermaid-svg-I7L86H4wBMmw5Dr2 .image-shape .label,#mermaid-svg-I7L86H4wBMmw5Dr2 .icon-shape .label{text-align:center;}#mermaid-svg-I7L86H4wBMmw5Dr2 .node.clickable{cursor:pointer;}#mermaid-svg-I7L86H4wBMmw5Dr2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-I7L86H4wBMmw5Dr2 .arrowheadPath{fill:#333333;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-I7L86H4wBMmw5Dr2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-I7L86H4wBMmw5Dr2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-I7L86H4wBMmw5Dr2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-I7L86H4wBMmw5Dr2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-I7L86H4wBMmw5Dr2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-I7L86H4wBMmw5Dr2 .cluster text{fill:#333;}#mermaid-svg-I7L86H4wBMmw5Dr2 .cluster span{color:#333;}#mermaid-svg-I7L86H4wBMmw5Dr2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-I7L86H4wBMmw5Dr2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-I7L86H4wBMmw5Dr2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-I7L86H4wBMmw5Dr2 .icon-shape,#mermaid-svg-I7L86H4wBMmw5Dr2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-I7L86H4wBMmw5Dr2 .icon-shape p,#mermaid-svg-I7L86H4wBMmw5Dr2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-I7L86H4wBMmw5Dr2 .icon-shape .label rect,#mermaid-svg-I7L86H4wBMmw5Dr2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-I7L86H4wBMmw5Dr2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-I7L86H4wBMmw5Dr2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-I7L86H4wBMmw5Dr2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CMD_DONE / CMD_ERR
DATA_OVER / IDMAC complete
PIO RXDR/TXDR
CMD OK 无 data
有 data
DATA_COMPLETE
需 STOP


mmc core: dw_mci_request
dw_mci_queue_request
__dw_mci_start_request: DMA + 发 CMD
dw_mci_interrupt
dw_mci_tasklet_func
读/写 FIFO → EVENT_XFER_COMPLETE
STATE_SENDING_CMD
dw_mci_request_end → mmc_request_done
STATE_SENDING_DATA / DATA_BUSY
STATE_SENDING_STOP
queue 非空?
STATE_IDLE


dw_mmc-pltfm.h

用途 :声明 dw_mci_pltfm_registerdw_mci_pltfm_removedw_mci_pltfm_pmops


dw_mmc-pltfm.c

用途 :通用 platform 封装devm_kzalloc(dw_mci)platform_get_irq/MEMdw_mci_probe)。

  • dw_mci_pltfm_prepare_command:设置 SDMMC_CMD_USE_HOLD_REG(socfpga/pistachio drv_data)。
  • #if 0 包住标准 module_platform_driver(dw_mci_pltfm_driver)snps,dw-mshc 匹配表------本 HCRTOS 构建 用此入口,仅用 dw_mmc-pltfm-hc.chichip,dw-mshc 驱动。
函数 作用
dw_mci_pltfm_register 填充 hostdw_mci_probe
dw_mci_pltfm_suspend/resume dw_mci_suspend/resume

dw_mmc-pltfm-hc16.h

用途 :HiChip 系统寄存器地址/位偏移 (门控 0xB8800060、复位 0xB8800084、源时钟 0xB8800074、LDO 0xB8800184、TX/RX 相位延迟 0xB8800410 等)、H1600_SDIO_SRC_CLK_*CONFIG_SDIO_PHASE_*,以及 dwmci_set_clkout_invert 等声明。

(文件内 #define H17xx 为调试遗留,实际用于 HC16/17 系 SoC 寄存器布局。)


dw_mmc-pltfm-hc.c(用户所称 dw_mmc-pltfm-hc.c,构建名为 dw_mmc-pltfm-hc.o

用途HiChip HC16/17 DW MSHC 胶水层 :系统时钟、pinmux、hc_clk_enable(SDIO_CLK)、模块复位、时钟分档表 mmc_clk_cfg_tabledw_mci_hc1600_set_clkexecute_tuning(相位/延迟扫描)、switch_voltage0x18800184 LDO)、hc1600_datadw_mci_drv_data,以及 module_platform_driver + module_driver_late(hcmmc_device)

hc1600_data 钩子
回调 实现
init dw_mci_hc1600_init:源钟、3.3V、pinmux active、hc_clk_enable、复位、解析 DTS 时序
setup_clock_for_slot dw_mci_hc1600_setup_clock_for_slotdw_mci_hc1600_set_clk
execute_tuning dw_mci_hc1600_execute_tuning
switch_voltage dw_mci_hc1600_switch_voltage
DTS 时序属性(节点 host->dev->of_node
属性 映射寄存器 0xB8800410 语义
rx-dly RX 延迟链 bit4:0
rx-phase-sel bit7:6
tx-dly bit12:8
tx-phase-sel bit14:13

dw_mci_hc1600_parse_dts_timing 解析;dw_mci_hc1600_apply_dts_timing 可写硬件(init 里 apply 当前被注释)。set_clkios->clock > 400kHz 时优先 DTS 覆盖表内相位/延迟。

时钟表 mmc_clk_cfg_table 列含义

sd_clk, src_clk_sel, sdc_internal_div, tx_phase, tx_uhr, clkout_invert, rx_phase_en, rx_dly_en --- 从 100kHz 到 200MHz 分档。

主要函数
函数 作用
mmc_clk_cfg_table_get_index 按目标频率查表
hc_sys_mmc_* 门控、复位、源钟、LDO、TX/RX 相位/反相/延迟
dwmci_set_internal_div / dwmci_control_clken DW CLKDIV + CLKENA
dwmci_set_clkout_invert SDMMC_CCLKCTRL
dw_mci_hichip_pltfm_probe OF 匹配 hc1600_datadw_mci_pltfm_register
hcmmc_device_probe FDT 路径注册 dw_mmc_hc

HC15:自研 MMC 主机

hc_mmc.h

用途hc_mmc_hosthc_mmc_platform_datahc_mmc_host_ops、事件位、寄存器访问宏。

结构体/符号 字段含义
hc_mmc_platform_data num_slotsquirksbus_hzdetect_delay_msmax_frequencycapscd_gpios/wp_gpiospin_group
hc_mmc_host_ops set_clockset_bus_widthset_timingset_cmd/start_cmd/get_cmd_status/get_response、块/DMA/PIO、IRQ、复位、时钟门控
hc_mmc_host base/irqmmc/req/cmdopsvirt_buf/phys_buf、锁、tasklet、pending_events
hc_mmc_host_hw_ops hc15_mmc-pltfm-hc.c 中定义

hc_mmc.c

用途 :MMC 核心对接、请求路径、IRQ、tasklet/worker、DT、hc_mmc_probemodule_driver_late(hc15_mmc_device)

mmc_host_opshc_mmc_ops
回调 函数
request hc_mmc_request
set_ios hc_mmc_set_iosops->set_clock/set_bus_width/set_timing
get_ro / get_cd hc_mmc_get_ro / hc_mmc_get_cd
enable_sdio_irq hc_mmc_enable_sdio_irq + sdio_timer
关键函数
函数 作用
hc_mmc_probe ioremap、DMA coherent 缓冲、hc15_mci_parse_dtrequest_irqhc_mmc_host_hw_ops、pinmux、mmc_add_host
hc_mmc_request CD 检查 → hc_mmc_prepare_data + hc_mmc_start_command(支持 sbc
hc_mmc_start_command 配置 CMD、PIO 同步路径或开 rto_timer、调度 cmd_tasklet
hc_mmc_interrupt get_and_clear_irq → DATA_END → tasklet;可选 CMD_END → cmd_tasklet;SDIO → mmc_signal_sdio_irq
hc_mci_tasklet_func 数据完成、DMA unmap、非对齐缓冲拷贝、STOP 或 hc_mmc_request_done
hc_cmd_mci_tasklet_func 纯命令完成、链式 sbc→主命令
hc_mmc_prepare_dma / hc_mmc_prepare_pio 数据路径
hc15_mci_parse_dt 同 DW:num-slotsbroken-cdclock-frequency
hc15_mmc_device_probe FDT + register_simple("hc-mmc")
HC15 请求完成流程(Mermaid)

#mermaid-svg-z870yx42wzabmRJ1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-z870yx42wzabmRJ1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-z870yx42wzabmRJ1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-z870yx42wzabmRJ1 .error-icon{fill:#552222;}#mermaid-svg-z870yx42wzabmRJ1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z870yx42wzabmRJ1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-z870yx42wzabmRJ1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z870yx42wzabmRJ1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z870yx42wzabmRJ1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-z870yx42wzabmRJ1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z870yx42wzabmRJ1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z870yx42wzabmRJ1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z870yx42wzabmRJ1 .marker.cross{stroke:#333333;}#mermaid-svg-z870yx42wzabmRJ1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z870yx42wzabmRJ1 p{margin:0;}#mermaid-svg-z870yx42wzabmRJ1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-z870yx42wzabmRJ1 .cluster-label text{fill:#333;}#mermaid-svg-z870yx42wzabmRJ1 .cluster-label span{color:#333;}#mermaid-svg-z870yx42wzabmRJ1 .cluster-label span p{background-color:transparent;}#mermaid-svg-z870yx42wzabmRJ1 .label text,#mermaid-svg-z870yx42wzabmRJ1 span{fill:#333;color:#333;}#mermaid-svg-z870yx42wzabmRJ1 .node rect,#mermaid-svg-z870yx42wzabmRJ1 .node circle,#mermaid-svg-z870yx42wzabmRJ1 .node ellipse,#mermaid-svg-z870yx42wzabmRJ1 .node polygon,#mermaid-svg-z870yx42wzabmRJ1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-z870yx42wzabmRJ1 .rough-node .label text,#mermaid-svg-z870yx42wzabmRJ1 .node .label text,#mermaid-svg-z870yx42wzabmRJ1 .image-shape .label,#mermaid-svg-z870yx42wzabmRJ1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-z870yx42wzabmRJ1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-z870yx42wzabmRJ1 .rough-node .label,#mermaid-svg-z870yx42wzabmRJ1 .node .label,#mermaid-svg-z870yx42wzabmRJ1 .image-shape .label,#mermaid-svg-z870yx42wzabmRJ1 .icon-shape .label{text-align:center;}#mermaid-svg-z870yx42wzabmRJ1 .node.clickable{cursor:pointer;}#mermaid-svg-z870yx42wzabmRJ1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-z870yx42wzabmRJ1 .arrowheadPath{fill:#333333;}#mermaid-svg-z870yx42wzabmRJ1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-z870yx42wzabmRJ1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-z870yx42wzabmRJ1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z870yx42wzabmRJ1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-z870yx42wzabmRJ1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z870yx42wzabmRJ1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-z870yx42wzabmRJ1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-z870yx42wzabmRJ1 .cluster text{fill:#333;}#mermaid-svg-z870yx42wzabmRJ1 .cluster span{color:#333;}#mermaid-svg-z870yx42wzabmRJ1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-z870yx42wzabmRJ1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-z870yx42wzabmRJ1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-z870yx42wzabmRJ1 .icon-shape,#mermaid-svg-z870yx42wzabmRJ1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z870yx42wzabmRJ1 .icon-shape p,#mermaid-svg-z870yx42wzabmRJ1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-z870yx42wzabmRJ1 .icon-shape .label rect,#mermaid-svg-z870yx42wzabmRJ1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z870yx42wzabmRJ1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-z870yx42wzabmRJ1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-z870yx42wzabmRJ1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PIO
DMA
有 stop
无 stop
hc_mmc_request
hc_mmc_start_command
hc_mmc_pio_transfer 同步
hc_mmc_request_done → mmc_request_done
硬件传输
hc_mmc_interrupt DATA_END
hc_mci_tasklet_func
hc_mmc_start_command stop
hc_cmd_mci_tasklet_func

其余(简)

hc_mmc_resethc_mmc_rto_timerhc_mmc_sdio_timerhc_mmc_cmd53_special_prochc_mmc_io_rw_extendedhc_mmc_remove、桩函数 hc_get_cur_voltage/hc_set_gpio_drv(HC15 不支持)。


hc15_mmc-pltfm-hc.c

用途HC15 硬件寄存器实现REG_CMD_CTRL 等),填充 const struct hc_mmc_host_ops hc_mmc_host_hw_ops

类别 代表函数
时钟/总线 hc_mmc_host_hw_set_clockbus_hz 分频)、set_bus_widthset_timingREG_BUS_MODE UHS)
命令 set_cmdstart_cmdget_cmd_statusget_response(含 R2 patch
数据 set_blockset_dmapio_read/write/cleanup
IRQ enable_irqenable_sdio_irqget_and_clear_irq
SoC hc_mmc_ip_reset0x18800084 bit18)、hc_mmc_clock_gate0x18800060
导出 wait_again_cmd(等 DATA_BUSY + DMA DONE)

设备树示例要点(HCRTOS)

text 复制代码
/hcrtos/mmc {                    // 或 mmcv20intf0 / mmcv30 等
    hcrtos-compatible = "hichip,dw-mshc";   // HC16
    // 或 hcrtos-compatible = "hichip,mmc";  // HC15
    reg = <...>;
    interrupts = <...>;
    clock-frequency = <...>;
    clock-freq-min-max = <min max>;
    num-slots = <1>;
    // HC16 可选:
    rx-dly = <n>;
    rx-phase-sel = <0-3>;
    tx-dly = <n>;
    tx-phase-sel = <0-3>;
    // pinmux: active 属性由 fdt_get_property_pinmux 读取
};

两架构对比(速查)

项目 HC16 DW HC15 自研
完成模型 IRQ 置位 + 单 tasklet 状态机 IRQ + cmd/data 双 tasklet(或 workqueue)
DMA IDMAC 环描述(主路径) 片上 DMA 寄存器 REG_DMA_*
时钟 dw_mci_setup_bus + 表驱动 SoC 相位 pdata->bus_hz 分频
SDIO 高速 tuning + 1.8V switch_voltage UHS REG_BUS_MODE,无 DW 式 tuning
Late probe hcmmc_devicedw_mmc_hc hc15_mmc_devicehc-mmc

以上内容可直接作为仓库内 docs/ 下的 Markdown 章节使用;若需落盘到 ATBM_SDIO_DW_MMC_PACKET_FLOW.md 同级文件,可指定目标路径。

REDACTED


代码路径drivers/mmc/core/

公共头文件components/kernel/source/third_party/linux/include/linux/mmc/core.hhost.hcard.hmmc.hsd.hsdio.hsdio_func.hdw_mmc.h 等)

本树基于 Linux MMC 子系统移植到 HCRTOS(FreeRTOS 任务名、printf 调试、module_system 等)。Host 控制器典型为 DesignWare MMCdw_mmc.h / dw_mmc.c),core 通过 mmc_host_ops.request 下发 mmc_request


6. Core 层

本章说明 MMC Core:请求调度、枚举、SDIO IO、电源与总线。

一、核心数据结构与分层

层次 主要类型 说明
请求 mmc_command / mmc_data / mmc_request 命令、数据、完成回调(core.h
Host mmc_host + mmc_host_ops 时钟/总线/电源 IOS、requestset_iosenable_sdio_irq 等(host.h
mmc_card CID/CSD/SCR/ext_csd、类型 MMC/SD/SDIO(card.h
SDIO 功能 sdio_func 每 Function 一设备,驱动通过 sdio_driver 绑定(sdio_func.h
总线策略 mmc_bus_opscore/core.h 按卡类型挂接 remove/detect/suspend/reset 等

mmc_bus_ops (core 内部):removedetectpre_suspendsuspendresumeruntime_suspend/resumepower_save/restorealiveshutdownreset


二、主调用流程

2.1 Host 探测 → 扫描 → 挂载 SD/MMC/SDIO
复制代码
Host 驱动 probe
  → mmc_alloc_host()          // host.c:IDR、detect work、GPIO 槽
  → [mmc_of_parse()]          // DT:bus-width、CD/WP、pwrseq
  → mmc_add_host()            // device_add → mmc_start_host()
       → mmc_gpiod_request_cd_irq()
       → _mmc_detect_change() → 调度 delayed work
  → mmc_rescan()              // core.c:detect.work 回调

mmc_rescan 逻辑概要

  1. 若已有 bus_ops 且可移除卡:调用 bus_ops->detect() 检测拔卡。
  2. mmc_bus_put() 可能在卡已移除时释放 bus。
  3. 无卡且 CD 显示空槽:mmc_power_off()
  4. 否则 mmc_claim_host(),按 freqs[](400k→100k)循环 mmc_rescan_try_freq()
    • mmc_power_up → 可选 mmc_hw_reset_for_init
    • sdio_reset()(CMD52,SD/eMMC 可忽略)
    • mmc_go_idlemmc_send_if_cond
    • 探测顺序(固定)mmc_attach_sdiommc_attach_sdmmc_attach_mmc
  5. MMC_CAP_NEEDS_POLL 时结束;否则每秒再调度 detect。

各 attach 入口(均需 host 已 claim):

函数 文件 要点
mmc_attach_sdio sdio.c mmc_send_io_op_condmmc_attach_bus(&mmc_sdio_ops)mmc_sdio_init_cardmmc_add_card → 各 sdio_add_func
mmc_attach_sd sd.c mmc_send_app_op_condmmc_attach_bus(&mmc_sd_ops)mmc_sd_init_cardmmc_add_card
mmc_attach_mmc mmc.c 开漏总线 → mmc_send_op_condmmc_attach_bus(&mmc_ops)mmc_init_cardmmc_add_card

mmc_add_card()bus.c)注册 mmc 总线设备,触发块设备或其它 mmc_driverprobe

2.2 SDIO IO 路径:sdio_memcpy_*mmc_wait_for_req
复制代码
sdio_memcpy_fromio / sdio_memcpy_toio / sdio_readsb / sdio_writesb
  → sdio_io_rw_ext_helper()           // sdio_io.c:按块/字节拆分
       → mmc_io_rw_extended()         // sdio_ops.c:组 CMD53 + scatterlist
            → mmc_set_data_timeout()
            → mmc_wait_for_req(host, &mrq)   // core.c
                 → __mmc_start_req()
                      → mmc_start_request()
                           → mmc_retune()
                           → [SDIO IO 时 card_busy 等待]
                           → host->ops->request(host, mrq)  // 如 dw_mmc
                 → mmc_wait_for_req_done()    // 完成/重试

字节/单寄存器sdio_readb 等 → mmc_io_rw_directmmc_wait_for_cmd(不经 data 阶段)。

Host 占用 :驱动应 sdio_claim_host(func) → 内部 mmc_claim_host(card->host)


三、公共头文件要点(摘要)

  • core.hmmc_command/mmc_data/mmc_request;导出 mmc_wait_for_reqmmc_claim_hostmmc_erasemmc_switch 等。
  • host.hmmc_iosmmc_host_opsmmc_host(caps、OCR、claim、detect work、bus_opscontext_info);mmc_alloc_host / mmc_add_host
  • card.hmmc_card、CID/CSD/ext_csd/SD 能力位、mmc_dev_to_card
  • sdio_func.hsdio_funcsdio_driversdio_claim_irq 等声明。
  • dw_mmc.h :DW 控制器状态机、dw_mci;与 core 通过标准 mmc_host_ops 衔接;mmc_sdio_hang_dump 会调用 dw_mci_hang_dump

四、按源文件说明

4.1 core.c(核心:请求、电源、扫描、总线引用)

用途:MMC 子系统中枢------请求下发/完成、host 互斥、IOS/电源/调压、擦除、卡检测与 rescan、attach 频率尝试、模块初始化。

HCRTOS 特有

  • mmc_sdio_hang_dbg:非零时打印 CMD52/53 等待路径。
  • mmc_sdio_hang_dump():飞行记录(claimer 任务名、pcTaskGetName)、联动 dw_mci_hang_dump
  • __mmc_claim_host / mmc_wait_for_req 记录 SDIO 命令面包屑。
  • mmc_start_req:相对上游 Linux 改为同步等待路径(含 BKOPS 异常重发 printf)。
  • 引入 FreeRTOS、CONFIG_OF 本地定义。

重要全局/静态workqueuekmmcd)、freqs[]use_spi_crcsd_max_clkmmc_sdio_fr_* 飞行记录字段。

主要函数(节选):

函数 作用 返回值
mmc_request_done Host 驱动完成回调:LED、retune、调用 mrq->done void
mmc_start_request 校验 SG/块数,调 __mmc_start_request 0 或 -ENOMEDIUM
__mmc_start_request retune;SDIO IO 前 card_busyops->request void
mmc_wait_for_req 阻塞完成一条 mrq(含 CMD52/53 调试) void
mmc_wait_for_cmd 仅命令、无 data 错误码
mmc_start_req 异步块层路径(本树偏同步化) 上一 mmc_async_req
__mmc_claim_host / mmc_release_host Host 独占与嵌套计数 abort 时非 0
mmc_get_card / mmc_put_card PM + claim 组合 void
mmc_set_clock/bus_width/timing/... 更新 host->iosmmc_set_ios void
mmc_power_up/off/cycle 电源序列 + pwrseq/regulator void
mmc_select_voltage OCR 与 VDD 匹配 选中 OCR
mmc_attach_bus / mmc_detach_bus 绑定 mmc_bus_ops(需 claimed) void
mmc_bus_get/put 引用计数;put 到 0 调 remove void
mmc_rescan / mmc_rescan_try_freq 热插拔与枚举 void / 0 成功
mmc_start_host / mmc_stop_host 上电策略、禁用 rescan、拔卡 void
mmc_detect_card_removed 运行中拔卡检测 1=已移除
mmc_erasemmc_can_* 擦除/trim/discard 能力 int/bool
mmc_init 注册 mmc/sdio bus、workqueue 模块入口

主要结构 :使用 mmc_requestmmc_hostmmc_card;内部 mmc_context_info 供块层异步等待。


4.2 host.c(Host 对象生命周期)

用途 :分配/注册 mmc_host、DT 解析、retune 定时器、与 pwrseq/GPIO 槽协作。

函数 作用
mmc_register_host_class HCRTOS 中空实现(class 注册被 #if 0
mmc_retune_enable/disable/hold/release HS200/HS400 周期性重调谐
mmc_retune 必要时 HS400→HS200→tuning→回 HS400
mmc_of_parse bus-width、max-frequency、CD/WP GPIO、cap、调用 mmc_pwrseq_alloc
mmc_alloc_host kzalloc、idr_allocINIT_DELAYED_WORK(detect, mmc_rescan)
mmc_add_host device_add、debugfs、mmc_start_host、PM notifier
mmc_remove_host / mmc_free_host 停 host、释放 pwrseq

静态mmc_host_idrmmc_host_lock


4.3 bus.c(MMC 卡设备模型)

用途mmc 总线、mmc_card 注册/注销、对接 mmc_driver(如 mmcblk)。

函数 作用
mmc_register_bus / unregister 注册 bus_type mmc
mmc_register_driver / unregister_driver 媒体驱动
mmc_alloc_card 分配 card,dev.bus = mmc_bus_type
mmc_add_card 命名、打印卡信息、debugfs、device_add
mmc_remove_card device_del、释放 CIS

说明 :部分 sysfs/uevent/PM 在 #if 0 中裁剪;mmc_bus_match 恒返回 1。


4.4 mmc.c(原生 MMC/eMMC)

用途 :eMMC 初始化、ext_csd、HS/HS200/HS400、分区/增强区、挂 mmc_ops 总线。

函数 作用
mmc_decode_ext_csd / mmc_read_ext_csd 解析扩展 CSD
mmc_select_bus_width / mmc_select_timing 宽度与时序协商
mmc_select_hs200 / mmc_hs200_tuning / mmc_select_hs400 高速模式
mmc_init_card 上电识别、CID/CSD、模式切换
mmc_attach_mmc 入口:mmc_send_op_cond + attach
mmc_remove / mmc_detect / mmc_suspend / mmc_resume / mmc_reset mmc_bus_ops 实现
mmc_hs200_to_hs400 / mmc_hs400_to_hs200 retune 辅助(导出)
mmc_can_reset 是否支持硬件复位

静态mmc_type(device_type)、mmc_opsmmc_bus_ops)。


4.5 mmc_ops.c(MMC 协议命令)

用途 :标准 MMC 命令封装,底层均 mmc_wait_for_cmd 或带 data 的 mrq。

函数 作用
mmc_go_idle CMD0
mmc_send_op_cond CMD1
mmc_all_send_cid / mmc_send_cid / mmc_send_csd CID/CSD
mmc_set_relative_addr CMD3
mmc_select_card / mmc_deselect_cards 选卡
mmc_send_status CMD13
mmc_get_ext_csd CMD8 ADTC
__mmc_switch / mmc_switch CMD6 切换
mmc_send_tuning 调谐块传输
mmc_bus_test 总线测试模式
mmc_send_hpi_cmd HPI
mmc_spi_read_ocr / mmc_spi_set_crc SPI 模式

4.6 sd.c(SD 卡)

用途 :SD 识别、SCR/SSR、UHS、挂 mmc_sd_ops

函数 作用
mmc_decode_cid 解码 CID(导出)
mmc_sd_get_cid / mmc_sd_get_csd 获取 CID/CSD
mmc_sd_setup_card SCR、SSR、switch
mmc_sd_switch_hs / mmc_sd_init_uhs_card 高速与 UHS
mmc_sd_init_card 完整 SD 初始化
mmc_sd_get_max_clock 最大时钟
mmc_attach_sd mmc_send_app_op_cond + init + mmc_add_card
mmc_sd_remove/detect/suspend/resume/reset 总线操作
sd_type device_type

4.7 sd_ops.c(SD 应用命令)
函数 作用
mmc_app_cmd CMD55
mmc_wait_for_app_cmd 带重试的 ACMD
mmc_send_app_op_cond ACMD41
mmc_send_if_cond CMD8(电压/接口条件)
mmc_send_relative_addr CMD3
mmc_app_send_scr ACMD51
mmc_sd_switch CMD6(SD switch)
mmc_app_sd_status ACMD13 SSR
mmc_app_set_bus_width ACMD6 总线宽度

4.8 sdio.c(SDIO 卡枚举)

用途:CCCR/FBR、宽总线、高速/UHS、创建 function、注册卡与 function 设备。

函数 作用
sdio_read_cccr / sdio_read_fbr 读 CCCR/FBR
sdio_init_func 分配 sdio_func、读 CIS
sdio_enable_4bit_bus / sdio_enable_hs 总线与速度
mmc_sdio_init_card OCR、RCA、上电 function 0、CIS、时钟
mmc_sdio_init_uhs_card UHS SDIO
mmc_sdio_get_max_clock 限速
mmc_attach_sdio 完整 attach 链
mmc_sdio_remove/detect/suspend/resume/power_restore/reset mmc_sdio_ops
mmc_sdio_ops 静态 mmc_bus_ops

4.9 sdio_ops.c(SDIO 命令 52/53)
函数 参数要点 返回
mmc_send_io_op_cond CMD5,循环至 BUSY 0/-ETIMEDOUT
mmc_io_rw_direct fn、addr、写/读单字节 CMD52 R5 错误 → -EIO 等
mmc_io_rw_direct_host 无 card 包装(reset 用) 同上
mmc_io_rw_extended blocks=0 为字节模式;否则块模式 CMD53 mmc_wait_for_req
sdio_reset CCCR ABORT 置 RES 扫描前调用

4.10 sdio_io.c(SDIO 驱动 API)
函数 作用
sdio_claim_host / sdio_release_host 封装 mmc_claim/release
sdio_enable_func / sdio_disable_func IOEx/IORx
sdio_set_block_size 写 FBR blksize
sdio_align_size 结合 host->ops->multi_io_quirk 对齐传输长度
sdio_io_rw_ext_helper 大块拆成多个 extended
sdio_readb/writeb/writeb_readb 寄存器字节
sdio_memcpy_fromio/toio 任意长度内存拷贝
sdio_readsb/writesb 基于 cur_blksize 的块流
sdio_readw/writew/readl/writel 多字节组合(多次 direct 或 helper)
sdio_f0_readb/writeb Function 0
sdio_get_host_pm_caps / sdio_set_host_pm_flags PM 能力

4.11 sdio_irq.c(SDIO 中断)
函数 作用
process_sdio_pending_irqs SDIO_CCCR_INTx,分发各 function irq_handler
sdio_run_irqs 导出:claim 后处理 pending(供无线程 IRQ 路径)
sdio_irq_thread ksdioirqd:claim → process → 睡眠/轮询
sdio_card_irq_get/put 首/末 function 注册 IRQ 时启停线程或 enable_sdio_irq
sdio_single_irq_set 单 handler 快速路径
sdio_claim_irq / sdio_release_irq 写 IENx、注册 handler

4.12 sdio_bus.c(SDIO function 驱动模型)
函数 作用
sdio_register_bus sdio bus_type
sdio_register_driver / unregister WiFi 等 sdio_driver
sdio_bus_match/probe/remove id_table 匹配、drv->probe
sdio_alloc_func 创建 function 设备
sdio_add_func / sdio_remove_func device_add/del
sdio_device_add/remove 中间层注册

4.13 sdio_cis.c(CIS 元数据)
函数 作用
cistpl_* 解析 manufacturer/vers/funce 等元组
sdio_read_cis 从 FBR 指针读 CIS 链
sdio_read_common_cis / sdio_free_common_cis 卡级 CIS
sdio_read_func_cis / sdio_free_func_cis 每 function CIS

结构cis_tplcis_tpl_list


4.14 quirks.c(设备修正表)
函数 作用
mmc_fixup_device 按 manufacturer/product 应用 mmc_fixup 标志(如 broken IRQ polling)

静态mmc_fixup_methods[](表驱动)。


4.15 pwrseq.c / pwrseq_simple.c / pwrseq_emmc.c(上电时序)
模块 作用
pwrseq.c DT 匹配 mmc-pwrseq-simple / mmc-pwrseq-emmcmmc_pwrseq_alloc/freepre_power_on/post_power_on/power_off
pwrseq_simple.c GPIO reset/电源脚时序
pwrseq_emmc.c eMMC 硬件复位线 + reboot notifier

结构mmc_pwrseqmmc_pwrseq_ops


4.16 slot-gpio.c(卡检测 / 写保护 GPIO)
函数 作用
mmc_gpio_alloc host->slot.handler_priv
mmc_gpio_request_ro/cd 申请 GPIO
mmc_gpio_get_ro/get_cd 读 RO/CD
mmc_gpiod_request_cd_irq CD 边沿 → mmc_detect_change
mmc_gpio_cd_irqt IRQ 处理

结构mmc_gpioslot-gpio.h)。


4.17 debugfs.c(调试接口)
函数 作用
mmc_ios_show 导出当前 IOS
mmc_add/remove_host_debugfs host 调试节点
mmc_add/remove_card_debugfs ext_csd、card status
fault injection fail_request(可选故障注入)

在 HCRTOS 上依赖 CONFIG_DEBUGFS 是否启用。


五、与 WiFi(ATBM SDIO)相关的阅读线索

  1. 枚举mmc_rescanmmc_attach_sdiosdio_add_funcsdio_register_driver 的 WiFi probe
  2. 数据面 :驱动 sdio_memcpy_* / sdio_readbmmc_wait_for_reqdw_mmc request
  3. 中断sdio_claim_irq → IRQ 线程或 sdio_run_irqs + host enable_sdio_irq
  4. 挂死分析 :置 mmc_sdio_hang_dbg,或调用 mmc_sdio_hang_dump() 查看 claim/CMD53 与 dw_mci_hang_dump

六、模块初始化顺序(core.c mmc_init

  1. alloc_ordered_workqueue("kmmcd")
  2. mmc_register_bus()
  3. mmc_register_host_class()(空)
  4. sdio_register_bus()

Host 驱动在自身 probe 中完成 mmc_add_host,不由此模块直接注册控制器。


以上内容均依据当前 HCRTOS 构建树中 drivers/mmc/core/*.clinux/mmc/*.h 源码整理;与上游 Linux 的差异以本树中的 #if 0、FreeRTOS 与 SDIO hang 调试改动为准。

REDACTED


源码路径:Z:\hcrtos-2025.07y\hcrtos\output\build\mmcdriver-e25cdc35f27e19acbe27b1d103f80b3c8c73c68f\drivers\mmc\card\

本树为 HCRTOS/NuttX 裁剪块层blk_req.h/c 提供精简版 request/request_queueblock.c 通过 register_blockdriver + struct block_operations 对接上层,而非完整 Linux block_device


7. Card/Block 层

本章说明块设备队列、mmcblk、以及 sdio_uart / mmc_test。

1. 各文件职责

文件 职责
block.c MMC/SD 块设备主驱动mmc_drivermmcblk)probe/remove、每卡 mmc_blk_data、分区(EXT_CSD 物理分区 + MBR/GPT 逻辑分区)、mmc_blk_issue_rq 下发读写/discard/flush、错误恢复、RPMB 访问判断、可选 MBR 扇区解密;NuttX 侧 mmc_bdops 读写/geometry/ioctl。
queue.c 请求队列与内核线程mmc_init_queue 创建 request_queue + mmcqd 线程、mmc_request_fn 唤醒线程、mmc_prep_request 过滤、双缓冲 mqrq[2]、scatter-gather 映射与 bounce、packed 辅助、队列 suspend/resume。
queue.h 队列相关结构体与对外 API 声明(mmc_queuemmc_blk_requestmmc_queue_req 等)。
blk_req.c 精简块请求子系统 实现:队列初始化/启停、入队 add_acct_requestblk_fetch_request/blk_peek_requestblk_rq_map_sg(基于 request.data_buf)、完成 blk_end_request*、队列 limit 与 blk_cleanup_queue
blk_req.h 块层类型与常量:gendiskrequestrequest_queuequeue_limits、REQ/QUEUE 标志、blk_* 内联与导出声明。
sdio_uart.c SDIO UART/GPS 串口驱动(16550 寄存器经 SDIO 访问),与块设备无关;ttySDIO + sdio_driver
mmc_test.c MMC/SD 主机测试驱动 :debugfs 触发大量读写/性能/边界用例;probe 时注册 debugfs,直接 mmc_wait_for_req 发命令。

构建Makefilequeue.oblock.oblk_req.o 链成 mmc_block.o


2. 关键结构体与全局量

2.1 queue.h
名称 说明
struct mmc_blk_request 单次 MMC 传输:mrq + sbc/cmd/stop + data + retune_retry_done
enum mmc_packed_type MMC_PACKED_NONE / MMC_PACKED_WRITE(packed 写,本树 block.c 中 packed 路径多为 #if 0)。
struct mmc_packed packed 命令头与请求链表(可选)。
struct mmc_queue_req request ↔ MMC:brqsg、bounce 缓冲、mmc_active(含 err_check)、cmd_typepacked
struct mmc_queue cardthreadthread_semflagsMMC_QUEUE_SUSPENDED / MMC_QUEUE_NEW_REQUEST)、issue_fndata(通常为 mmc_blk_data *)、queuemqrq[2]mqrq_cur/mqrq_prev
2.2 blk_req.h(块抽象)
名称 说明
struct gendisk 盘描述:carddisk_name__partscapacityqueuesector_sizewrite_protmedia_present 等。
struct request __sector__data_lensector_nsdata_bufcmd_flagsrq_diskqcompletiondoneerrordone_data_len
struct request_queue request_fnqueue_headqueue_lockqueuedataprep_rq_fnlimitsqueue_flagsrequest_fn_active
struct queue_limits 段数、扇区/段大小、discard 等限制。
2.3 block.c
名称 说明
struct mmc_blk_data 每槽/每分区队列实例:lockdiskqueuepart 链表、flags(CMD23/REL_WR/PACKED)、usageread_onlypart_typepart_currname_idxreset_donearea_typeretry_cnt
struct sddisk_partition_s NuttX 分区节点:firstblock/nblocksdisk_nameregister_blockdriveri_private
struct mmc_blk_ioc_data Linux 风格 MMC_IOC_* ioctl 内核缓冲(本树若未启用完整 bdev 路径则仅编译保留)。

全局/静态(block.c)

  • block_mutexopen_lock
  • perdev_minors(默认 CONFIG_MMC_BLOCK_MINORS = 8)
  • max_devicesdev_use[]name_use[](设备号分配)
  • encrypt_data_tmp(可选 MBR 解密)
  • g_sd_offsetFAT_DEBUG
  • mmc_driverprobe/remove/shutdownmodule_driver_late(mmc_blk, ...)
2.4 blk_req.c
  • unsigned long blk_max_low_pfn = 1 --- bounce 上限相关。
2.5 sdio_uart.c
  • sdio_uart_table[UART_NR]sdio_uart_table_lock
  • sdio_uart_tty_driversdio_uart_driver
2.6 mmc_test.c
  • mmc_test_card 及结果/debugfs 链表(probe 时按卡挂接)
  • mmc_driver"mmc_test"mmc_test_init/exit(模块入口在注释中)

3. 重要函数(参数 / 返回值)

3.1 queue.c(全覆盖)
函数 参数 返回 作用
mmc_prep_request q, req BLKPREP_OK / BLKPREP_KILL 仅接受 REQ_TYPE_FSREQ_DISCARD;卡移除或 RPMB 队列则 kill。
mmc_queue_thread mq 0 mmcqd 主循环:blk_fetch_requestissue_fn → 交换 cur/prev mqrq
mmc_request_fn q void 块层入队后唤醒 mmcqd;若上一请求等待完成且有新请求则 context_info.is_new_req
mmc_init_queue mq, card, lock, subname 0 / 负 errno blk_init_queue、prep、bounce 或 host 限制、分配 sg、kthread_run(mmcqd/...)
mmc_cleanup_queue mq void resume、停线程、清空 queuedata、释放 sg/bounce。
mmc_queue_suspend mq void MMC_QUEUE_SUSPENDEDblk_stop_queuedown(thread_sem)
mmc_queue_resume mq void 清除挂起、up(thread_sem)blk_start_queue
mmc_queue_map_sg mq, mqrq sg 条数 无 bounce:blk_rq_map_sg 或 packed map;有 bounce:映射到 bounce_sgsg_init_onebounce_buf
mmc_queue_bounce_pre mqrq void 写:SG → bounce 缓冲。
mmc_queue_bounce_post mqrq void 读:bounce → SG。
mmc_packed_init / mmc_packed_clean mq , `card` 0/-ENOMEM / void 为两个 mqrq 分配/释放 mmc_packed
mmc_access_rpmb mq true/false 定义在 block.cmd->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB 时 prep 拒绝普通块请求。
3.2 blk_req.c / blk_req.h(全覆盖)
函数 参数 返回 作用
blk_queue_bounce_limit q, max_addr void 设置 limits.bounce_pfn
blk_init_queue rfn, lock request_queue * / NULL 分配并初始化队列。
blk_start_queue q void 清 STOPPED 并 __blk_run_queue
blk_stop_queue q void 置 STOPPED。
__blk_run_queue q void 若未 stopped 则调用 request_fn
add_acct_request q, rq, where void 持锁入队并 __blk_run_queue
__elv_add_request q, rq, where void INSERT_FRONT/BACK/REQUEUE 等挂到 queue_head
blk_peek_request q request * / NULL 队首 + 可选 prep_rq_fn;KILL 则 blk_end_request_all(-EIO)
blk_fetch_request q request * / NULL peek + blk_start_request(出队)。
blk_dequeue_request / blk_start_request rq void queuelist 删除。
blk_rq_map_sg queue, rq, sg_list 段数 data_buf/__data_lenmax_segment_size 切 SG。
blk_end_request rq, error, nr_bytes bool(恒 false errordone_data_lenrequest_wait_done
blk_end_request_all rq, error void 完成当前并清空队列中后续请求。
blk_queue_prep_rq q, pfn void 注册 mmc_prep_request 等。
blk_queue_max_* / blk_queue_logical_block_size 见头文件 void 设置队列限制。
blk_set_queue_dying / blk_cleanup_queue q void 标记 DYING、drain、DEAD、kfree(q)
request_wait_done req void 实现在 block.ccomplete(&req->completion)

内联rq_data_dir(rq)queue_max_segment_sizeblk_queue_* 状态位测试等见 blk_req.h

3.3 block.c(主路径)
模块与探测
函数 返回 作用
mmc_blk_init 0 / 负值 max_devices、可选分配 encrypt_data_tmpmmc_register_driver(&mmc_driver)
mmc_blk_exit 0 反注册、释放加密缓冲。
mmc_blk_probe 0 / -ENODEV 检查 CCC_BLOCK_READblk_fixupsmmc_blk_alloc、物理分区、mmc_add_disk、runtime PM。
mmc_blk_remove void 卸分区、mmc_blk_remove_req、清 drvdata
mmc_blk_alloc / mmc_blk_alloc_req mmc_blk_data * 算容量、mmc_init_queueissue_fn = mmc_blk_issue_rqdisk_name = mmcblkN
mmc_blk_alloc_parts 0 / 负 errno eMMC 引导/GP/RPMB 等子 mmc_blk_data
mmc_add_disk(NuttX) 0 / 负 errno 注册 /dev/mmcblkNparse_block_partitionsddisk_partition_handler 注册 p1...
sddisk_partition_handler void 为每个分区 register_blockdriver + SDMMC_NOTIFY_CONNECT
NuttX 块操作(mmc_bdops
函数 返回 作用
mmc_blk_open / release 0 / -ENXIO mmc_blk_get、分区 crefs
mmc_blk_read / write 扇区数 / 错误 分段(maxseg 256/1024)、可选 MBR 解密;调用 __mmc_blk_*
__mmc_blk_read / __mmc_blk_write 完成扇区数 构造栈上 requestadd_acct_requestwait_for_completion
mmc_blk_geometry OK / -ENODEV BIOC_GEOMETRY
mmc_blk_ioctl(inode) OK / -ENOTTY 当前仅 BIOC_GEOMETRY
请求下发(核心)
函数 返回 作用
mmc_blk_issue_rq 0/1 首请求 mmc_get_cardmmc_blk_part_switch;discard/secure discard/flush 或 mmc_blk_issue_rw_rq;结束时 mmc_put_card
mmc_blk_issue_rw_rq 0/1 mmc_blk_rw_rq_prepmmc_start_req 循环;按 mmc_blk_err_check 状态重试、blk_end_request、packed 分支(多禁用)。
mmc_blk_rw_rq_prep void brq(单/多块 CMD、CMD23、rel write、timeout)、mmc_queue_map_sgbounce_premmc_active.err_check = mmc_blk_err_check
mmc_blk_issue_discard_rq / secdiscard / flush 0/1 mmc_erase / mmc_flush_cache + blk_end_request
mmc_blk_part_switch 0 / 负 errno 切换 EXT_CSD_PART_CONFIG 访问分区;更新 main_md->part_curr
mmc_blk_err_check enum mmc_blk_status 解析 cmd/data/stop 错误 → SUCCESS/PARTIAL/CMD_ERR/...
mmc_blk_reset / mmc_blk_cmd_recovery 错误码 卡复位与 CMD12 等恢复。
IOCTL(Linux block_device 路径,#if 0 旁路保留)
函数 作用
mmc_blk_ioctl MMC_IOC_CMD / MMC_IOC_MULTI_CMD
__mmc_blk_ioctl_cmd mrqmmc_wait_for_req(card->host, &mrq) 同步完成。
其它
函数 作用
mmc_access_rpmb queue prep 与 RPMB 分区隔离。
get_config_mmc_decrypt_mbr_blk weak,平台可选 MBR 解密。
3.4 sdio_uart.c(概览)
  • 模块 :SDIO UART/GPS 类设备 → ttySDIO
  • 入口sdio_uart_init --- alloc_tty_drivertty_register_driversdio_register_driversdio_uart_exit 反注册。
  • probe/removesdio_uart_probe(解析 tuple 0x91、sdio_uart_add_porttty_port_register_device)、sdio_uart_remove
  • 数据面sdio_uart_irqsdio_uart_receive_chars / transmit_charssdio_uart_write 等 tty 操作集。
3.5 mmc_test.c(概览)
  • 模块mmc_test MMC 驱动,通过 debugfsmmc_test_register_dbgfs_file)运行用例,不注册块设备。
  • 入口mmc_test_initmmc_register_drivermmc_test_probe 仅 SD/MMC 卡 + 注册 debugfs;mmc_test_remove 释放结果与 debugfs。
  • 传输mmc_test_buffer_transfer 等内部 mmc_wait_for_req(test->card->host, &mrq) ;大量 mmc_test_* 用例(basic/multi/perf/trim/async 等)。

4. 块 I/O 流程(Mermaid)

说明:

  • 上层 同步等待__mmc_blk_read/writewait_for_completion
  • 常规读写经 mmc_start_req → core 内 __mmc_start_data_req + mmc_wait_for_data_req_done (与 mmc_wait_for_req 同属 core 等待完成机制;mmc_wait_for_req 用于 ioctl/测试等直接提交 mrq 的路径)。

#mermaid-svg-9TtJL491MyBn6A6c{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9TtJL491MyBn6A6c .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9TtJL491MyBn6A6c .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9TtJL491MyBn6A6c .error-icon{fill:#552222;}#mermaid-svg-9TtJL491MyBn6A6c .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9TtJL491MyBn6A6c .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9TtJL491MyBn6A6c .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9TtJL491MyBn6A6c .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9TtJL491MyBn6A6c .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9TtJL491MyBn6A6c .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9TtJL491MyBn6A6c .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9TtJL491MyBn6A6c .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9TtJL491MyBn6A6c .marker.cross{stroke:#333333;}#mermaid-svg-9TtJL491MyBn6A6c svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9TtJL491MyBn6A6c p{margin:0;}#mermaid-svg-9TtJL491MyBn6A6c .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9TtJL491MyBn6A6c .cluster-label text{fill:#333;}#mermaid-svg-9TtJL491MyBn6A6c .cluster-label span{color:#333;}#mermaid-svg-9TtJL491MyBn6A6c .cluster-label span p{background-color:transparent;}#mermaid-svg-9TtJL491MyBn6A6c .label text,#mermaid-svg-9TtJL491MyBn6A6c span{fill:#333;color:#333;}#mermaid-svg-9TtJL491MyBn6A6c .node rect,#mermaid-svg-9TtJL491MyBn6A6c .node circle,#mermaid-svg-9TtJL491MyBn6A6c .node ellipse,#mermaid-svg-9TtJL491MyBn6A6c .node polygon,#mermaid-svg-9TtJL491MyBn6A6c .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9TtJL491MyBn6A6c .rough-node .label text,#mermaid-svg-9TtJL491MyBn6A6c .node .label text,#mermaid-svg-9TtJL491MyBn6A6c .image-shape .label,#mermaid-svg-9TtJL491MyBn6A6c .icon-shape .label{text-anchor:middle;}#mermaid-svg-9TtJL491MyBn6A6c .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9TtJL491MyBn6A6c .rough-node .label,#mermaid-svg-9TtJL491MyBn6A6c .node .label,#mermaid-svg-9TtJL491MyBn6A6c .image-shape .label,#mermaid-svg-9TtJL491MyBn6A6c .icon-shape .label{text-align:center;}#mermaid-svg-9TtJL491MyBn6A6c .node.clickable{cursor:pointer;}#mermaid-svg-9TtJL491MyBn6A6c .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9TtJL491MyBn6A6c .arrowheadPath{fill:#333333;}#mermaid-svg-9TtJL491MyBn6A6c .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9TtJL491MyBn6A6c .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9TtJL491MyBn6A6c .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9TtJL491MyBn6A6c .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9TtJL491MyBn6A6c .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9TtJL491MyBn6A6c .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9TtJL491MyBn6A6c .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9TtJL491MyBn6A6c .cluster text{fill:#333;}#mermaid-svg-9TtJL491MyBn6A6c .cluster span{color:#333;}#mermaid-svg-9TtJL491MyBn6A6c div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9TtJL491MyBn6A6c .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9TtJL491MyBn6A6c rect.text{fill:none;stroke-width:0;}#mermaid-svg-9TtJL491MyBn6A6c .icon-shape,#mermaid-svg-9TtJL491MyBn6A6c .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9TtJL491MyBn6A6c .icon-shape p,#mermaid-svg-9TtJL491MyBn6A6c .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9TtJL491MyBn6A6c .icon-shape .label rect,#mermaid-svg-9TtJL491MyBn6A6c .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9TtJL491MyBn6A6c .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9TtJL491MyBn6A6c .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9TtJL491MyBn6A6c :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} mmc/core/core.c
block.c
queue.c / mmcqd
blk_req.c
上层 FS / NuttX block
READ/WRITE
DISCARD/FLUSH
同步单 mrq
mmc_blk_read / mmc_blk_write
__mmc_blk_read / __mmc_blk_write
构造 struct request

data_buf / sector / flags
add_acct_request
wait_for_completion
__elv_add_request + __blk_run_queue
mmc_request_fn
唤醒 mmc_queue_thread
blk_fetch_request + mmc_prep_request
issue_fn = mmc_blk_issue_rq
mmc_get_card + mmc_blk_part_switch
req 类型?
mmc_blk_issue_rw_rq
discard / secdiscard / flush
mmc_blk_rw_rq_prep

map_sg + bounce_pre
mmc_start_req
__mmc_start_data_req
mmc_start_request → host->ops
mmc_wait_for_data_req_done
mmc_blk_err_check
blk_end_request → request_wait_done
mmc_wait_for_req

ioctl / mmc_test 等

双请求流水线mmc_queue 维护 mqrq_cur / mqrq_prevmmc_start_req 可在上一 MMC 传输完成前由块层提交下一 mmc_async_reqMMC_QUEUE_NEW_REQUEST 时线程不交换 cur/prev 并重新取队。REQ_FLUSH/REQ_DISCARD 会先 mmc_blk_issue_rw_rq(mq, NULL) 排空进行中的异步读写的 host areq


5. 与上游 Linux 的差异(阅读代码时注意)

  1. 无完整 biorequest.data_buf__mmc_blk_* 直接填入;blk_rq_map_sg 按连续缓冲切段。
  2. 块设备注册register_blockdriver("/dev/mmcblkN", &mmc_bdops, ...),分区名为 mmcblkNpM
  3. 完成回调request_wait_doneblock.c ,不在 blk_req.c
  4. Packed 写queue.c/block.c 中部分 packed 逻辑被 #if 0 关掉,运行时以单请求读写为主。
  5. mmc_test / sdio_uart:模块 init 宏多为注释,是否链接进镜像取决于平台 Kconfig/构建脚本。

如需把本文落盘为仓库内 docs/*.md 或补充 core.cmmc_start_request 与具体 host(如 dw_mmc)的衔接,可以说明目标路径。

REDACTED


8. 全量函数目录(按文件)

说明:下表覆盖源码扫描到的 809 个函数定义。

  • 作用:结合命名与模块惯例推断,关键函数在第 5--7 章有更细说明。
  • 传参:摘自函数签名。
  • 返回值:按返回类型约定概括。

drivers\mmc\card\blk_req.c

行号 函数名 作用 主要传参 返回值
37 blk_queue_bounce_limit 队列 struct request_queue *q, u64 max_addr 无(void)
52 queue_flag_clear 队列 unsigned int flag, struct request_queue *q 结构体指针,失败常为 NULL/ERR_PTR
57 queue_flag_set 队列 unsigned int flag, struct request_queue *q 结构体指针,失败常为 NULL/ERR_PTR
62 __blk_run_queue_uncond 队列 struct request_queue *q 结构体指针,失败常为 NULL/ERR_PTR
79 __blk_run_queue 队列 struct request_queue *q 无(void)
104 blk_start_queue 队列 struct request_queue *q 无(void)
110 blk_stop_queue 队列 struct request_queue *q 无(void)
115 blk_rq_map_sg 块层请求辅助 struct request_queue *queue, struct request *rq, struct scatterlist *sg_list 0 成功,负 errno 失败(除非另有约定)
170 __elv_add_request 处理请求 struct request_queue *q, struct request *rq, int where 无(void)
208 add_acct_request 处理请求 struct request_queue *q, struct request *rq, int where 无(void)
222 blk_dequeue_request 处理请求 / 队列 struct request *rq 无(void)
228 blk_start_request 处理请求 struct request *req 无(void)
233 blk_end_request_all 处理请求 struct request *rq, int error 无(void)
248 blk_end_request 处理请求 struct request *rq, int error, unsigned int nr_bytes true/false
325 blk_queue_prep_rq 队列 struct request_queue *q, prep_rq_fn *pfn 无(void)
335 blk_queue_max_discard_sectors 队列 struct request_queue *q, unsigned int max_discard_sectors 无(void)
342 blk_queue_max_hw_sectors 队列 struct request_queue *q, unsigned int max_hw_sectors 无(void)
360 blk_queue_max_segments 队列 struct request_queue *q, unsigned short max_segments 无(void)
371 blk_queue_max_segment_size 队列 struct request_queue *q, unsigned int max_size 无(void)
381 blk_queue_logical_block_size 队列 / 块设备 struct request_queue *q, unsigned short size 无(void)
392 blk_set_queue_dying 队列 struct request_queue *q 无(void)
398 __blk_drain_queue 队列 struct request_queue *q, bool drain_all 结构体指针,失败常为 NULL/ERR_PTR
425 blk_cleanup_queue 队列 struct request_queue *q 无(void)

drivers\mmc\card\blk_req.h

行号 函数名 作用 主要传参 返回值
313 queue_flag_set_unlocked 队列 unsigned int flag, struct request_queue *q 结构体指针,失败常为 NULL/ERR_PTR
319 queue_flag_clear_unlocked 队列 unsigned int flag, struct request_queue *q 结构体指针,失败常为 NULL/ERR_PTR
325 queue_max_segment_size 队列 struct request_queue *q 结构体指针,失败常为 NULL/ERR_PTR
330 blk_rq_cur_bytes 块层请求辅助 const struct request *rq 结构体指针,失败常为 NULL/ERR_PTR

drivers\mmc\card\block.c

行号 函数名 作用 主要传参 返回值
198 __attribute__ 见源码实现 (weak)) get_config_mmc_decrypt_mbr_blk(void 0 成功,负 errno 失败(除非另有约定)
203 mmc_get_devidx MMC Core/协议辅助 struct gendisk *disk 结构体指针,失败常为 NULL/ERR_PTR
210 sddisk_unregister_blockdriver_work 块设备 struct work_struct *work 结构体指针,失败常为 NULL/ERR_PTR
251 del_gendisk 见源码实现 struct gendisk *disk 结构体指针,失败常为 NULL/ERR_PTR
266 request_wait_done 处理请求 struct request *req 无(void)
271 mmc_blk_clear_packed MMC Core/协议辅助 struct mmc_queue_req *mqrq 结构体指针,失败常为 NULL/ERR_PTR
301 mmc_blk_put MMC Core/协议辅助 struct mmc_blk_data *md 结构体指针,失败常为 NULL/ERR_PTR
317 power_ro_lock_show debugfs 显示 struct device *dev, struct device_attribute *attr, char *buf 结构体指针,失败常为 NULL/ERR_PTR
337 power_ro_lock_store 见源码实现 struct device *dev, struct device_attribute *attr, const char *buf, size_t count 结构体指针,失败常为 NULL/ERR_PTR
383 force_ro_show debugfs 显示 struct device *dev, struct device_attribute *attr, char *buf 结构体指针,失败常为 NULL/ERR_PTR
396 force_ro_store 见源码实现 struct device *dev, struct device_attribute *attr, const char *buf, size_t count 结构体指针,失败常为 NULL/ERR_PTR
416 mmc_blk_open 打开 struct inode *inode 结构体指针,失败常为 NULL/ERR_PTR
433 mmc_blk_release 释放 struct inode *inode 结构体指针,失败常为 NULL/ERR_PTR
447 __mmc_blk_read struct inode *inode, unsigned char *buffer, blkcnt_t start_sector, unsigned int nsectors 结构体指针,失败常为 NULL/ERR_PTR
508 check_is_encrypt_sector 见源码实现 struct inode *inode, blkcnt_t start_sector 结构体指针,失败常为 NULL/ERR_PTR
519 check_is_blk_read_len_larger struct inode *inode,unsigned int nsectors 结构体指针,失败常为 NULL/ERR_PTR
532 decrypt_sector_data 见源码实现 unsigned char *buffer,unsigned int len 字符串/缓冲区指针
550 mmc_blk_read struct inode *inode, unsigned char *buffer, blkcnt_t start_sector, unsigned int nsectors 结构体指针,失败常为 NULL/ERR_PTR
626 __mmc_blk_write struct inode *inode, const unsigned char *buffer, blkcnt_t start_sector, unsigned int nsectors 结构体指针,失败常为 NULL/ERR_PTR
687 mmc_blk_write struct inode *inode, const unsigned char *buffer, blkcnt_t start_sector, unsigned int nsectors 结构体指针,失败常为 NULL/ERR_PTR
734 mmc_blk_geometry MMC Core/协议辅助 struct inode *inode, struct geometry *geometry 结构体指针,失败常为 NULL/ERR_PTR
758 mmc_blk_ioctl ioctl struct inode *inode, int cmd, unsigned long arg 结构体指针,失败常为 NULL/ERR_PTR
769 mmc_blk_unlink MMC Core/协议辅助 struct inode *inode 结构体指针,失败常为 NULL/ERR_PTR
838 mmc_blk_ioctl_copy_to_user ioctl struct mmc_ioc_cmd __user *ic_ptr, struct mmc_blk_ioc_data *idata 结构体指针,失败常为 NULL/ERR_PTR
856 ioctl_rpmb_card_status_poll ioctl struct mmc_card *card, u32 *status, u32 retries_max 结构体指针,失败常为 NULL/ERR_PTR
888 ioctl_do_sanitize ioctl struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
916 __mmc_blk_ioctl_cmd ioctl struct mmc_card *card, struct mmc_blk_data *md, struct mmc_blk_ioc_data *idata 结构体指针,失败常为 NULL/ERR_PTR
1040 mmc_blk_ioctl_cmd ioctl struct block_device *bdev, struct mmc_ioc_cmd __user *ic_ptr 结构体指针,失败常为 NULL/ERR_PTR
1088 mmc_blk_ioctl_multi_cmd ioctl struct block_device *bdev, struct mmc_ioc_multi_cmd __user *user 结构体指针,失败常为 NULL/ERR_PTR
1158 mmc_blk_ioctl ioctl struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg 结构体指针,失败常为 NULL/ERR_PTR
1174 mmc_blk_compat_ioctl ioctl struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg 结构体指针,失败常为 NULL/ERR_PTR
1203 mmc_blk_part_switch MMC Core/协议辅助 struct mmc_card *card, struct mmc_blk_data *md 结构体指针,失败常为 NULL/ERR_PTR
1231 mmc_sd_num_wr_blocks 块设备 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1286 get_card_status 见源码实现 struct mmc_card *card, u32 *status, int retries 结构体指针,失败常为 NULL/ERR_PTR
1301 card_busy_detect 总线 struct mmc_card *card, unsigned int timeout_ms, bool hw_busy_detect, struct request *req, int *ge... 结构体指针,失败常为 NULL/ERR_PTR
1349 send_stop 见源码实现 struct mmc_card *card, unsigned int timeout_ms, struct request *req, int *gen_err, u32 *stop_status 结构体指针,失败常为 NULL/ERR_PTR
1399 mmc_blk_cmd_error MMC Core/协议辅助 struct request *req, const char *name, int error, bool status_valid, u32 status 结构体指针,失败常为 NULL/ERR_PTR
1455 mmc_blk_cmd_recovery MMC Core/协议辅助 struct mmc_card *card, struct request *req, struct mmc_blk_request *brq, int *ecc_err, int *gen_err 结构体指针,失败常为 NULL/ERR_PTR
1561 mmc_blk_reset 复位 struct mmc_blk_data *md, struct mmc_host *host, int type 结构体指针,失败常为 NULL/ERR_PTR
1590 mmc_blk_reset_success 复位 struct mmc_blk_data *md, int type 结构体指针,失败常为 NULL/ERR_PTR
1595 mmc_access_rpmb MMC Core/协议辅助 struct mmc_queue *mq 0 成功,负 errno 失败(除非另有约定)
1607 mmc_blk_issue_discard_rq MMC Core/协议辅助 struct mmc_queue *mq, struct request *req 结构体指针,失败常为 NULL/ERR_PTR
1650 mmc_blk_issue_secdiscard_rq MMC Core/协议辅助 struct mmc_queue *mq, struct request *req 结构体指针,失败常为 NULL/ERR_PTR
1717 mmc_blk_issue_flush MMC Core/协议辅助 struct mmc_queue *mq, struct request *req 结构体指针,失败常为 NULL/ERR_PTR
1739 mmc_apply_rel_rw MMC Core/协议辅助 struct mmc_blk_request *brq, struct mmc_card *card, struct request *req 结构体指针,失败常为 NULL/ERR_PTR
1763 mmc_blk_err_check MMC Core/协议辅助 struct mmc_card *card, struct mmc_async_req *areq 结构体指针,失败常为 NULL/ERR_PTR
1888 mmc_blk_packed_err_check MMC Core/协议辅助 struct mmc_card *card, struct mmc_async_req *areq 结构体指针,失败常为 NULL/ERR_PTR
1942 mmc_blk_rw_rq_prep MMC Core/协议辅助 struct mmc_queue_req *mqrq, struct mmc_card *card, int disable_multi, struct mmc_queue *mq 结构体指针,失败常为 NULL/ERR_PTR
2103 mmc_calc_packed_hdr_segs MMC Core/协议辅助 struct request_queue *q, struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
2120 mmc_blk_prep_packed_list MMC Core/协议辅助 struct mmc_queue *mq, struct request *req 结构体指针,失败常为 NULL/ERR_PTR
2234 mmc_blk_packed_hdr_wrq_prep MMC Core/协议辅助 struct mmc_queue_req *mqrq, struct mmc_card *card, struct mmc_queue *mq 结构体指针,失败常为 NULL/ERR_PTR
2322 mmc_blk_cmd_err MMC Core/协议辅助 struct mmc_blk_data *md, struct mmc_card *card, struct mmc_blk_request *brq, struct request *req,... 结构体指针,失败常为 NULL/ERR_PTR
2355 mmc_blk_end_packed_req MMC Core/协议辅助 struct mmc_queue_req *mq_rq 结构体指针,失败常为 NULL/ERR_PTR
2392 mmc_blk_abort_packed_req MMC Core/协议辅助 struct mmc_queue_req *mq_rq 结构体指针,失败常为 NULL/ERR_PTR
2412 mmc_blk_revert_packed_req MMC Core/协议辅助 struct mmc_queue *mq, struct mmc_queue_req *mq_rq 结构体指针,失败常为 NULL/ERR_PTR
2440 mmc_blk_issue_rw_rq MMC Core/协议辅助 struct mmc_queue *mq, struct request *rqc 结构体指针,失败常为 NULL/ERR_PTR
2652 mmc_blk_issue_rq MMC Core/协议辅助 struct mmc_queue *mq, struct request *req 结构体指针,失败常为 NULL/ERR_PTR
2710 mmc_blk_readonly struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
2870 mmc_blk_alloc_part MMC Core/协议辅助 struct mmc_card *card, struct mmc_blk_data *md, unsigned int part_type, sector_t size, bool defau... 结构体指针,失败常为 NULL/ERR_PTR
2902 mmc_blk_alloc_parts MMC Core/协议辅助 struct mmc_card *card, struct mmc_blk_data *md 结构体指针,失败常为 NULL/ERR_PTR
2925 mmc_blk_remove_req 设备移除 struct mmc_blk_data *md 结构体指针,失败常为 NULL/ERR_PTR
2952 mmc_blk_remove_parts 设备移除 struct mmc_card *card, struct mmc_blk_data *md 结构体指针,失败常为 NULL/ERR_PTR
2966 mmc_add_disk MMC Core/协议辅助 struct mmc_blk_data *md 结构体指针,失败常为 NULL/ERR_PTR
3021 sddisk_partition_handler 见源码实现 struct partition_s *part, void *arg 结构体指针,失败常为 NULL/ERR_PTR
3068 mmc_add_disk MMC Core/协议辅助 struct mmc_blk_data *md 结构体指针,失败常为 NULL/ERR_PTR
3181 mmc_blk_probe struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
3240 mmc_blk_remove 设备移除 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
3258 _mmc_blk_suspend 挂起 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
3272 mmc_blk_shutdown MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
3278 mmc_blk_suspend 挂起 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
3285 mmc_blk_resume 恢复 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR

drivers\mmc\card\mmc_test.c

行号 函数名 作用 主要传参 返回值
189 mmc_test_set_blksize MMC Core/协议辅助 struct mmc_test_card *test, unsigned size 结构体指针,失败常为 NULL/ERR_PTR
197 mmc_test_prepare_mrq MMC Core/协议辅助 struct mmc_test_card *test, struct mmc_request *mrq, struct scatterlist *sg, unsigned sg_len, uns... 结构体指针,失败常为 NULL/ERR_PTR
234 mmc_test_busy 总线 struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
243 mmc_test_wait_busy 总线 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
275 mmc_test_buffer_transfer_ex MMC Core/协议辅助 struct mmc_test_card *test, u8 *buffer, unsigned addr, unsigned blknum,unsigned blksz, int write 结构体指针,失败常为 NULL/ERR_PTR
307 mmc_test_buffer_transfer MMC Core/协议辅助 struct mmc_test_card *test, u8 *buffer, unsigned addr, unsigned blksz, int write 结构体指针,失败常为 NULL/ERR_PTR
335 mmc_test_free_mem MMC Core/协议辅助 struct mmc_test_mem *mem 结构体指针,失败常为 NULL/ERR_PTR
427 mmc_test_map_sg MMC Core/协议辅助 struct mmc_test_mem *mem, unsigned long size, struct scatterlist *sglist, int repeat, unsigned in... 结构体指针,失败常为 NULL/ERR_PTR
478 mmc_test_map_sg_max_scatter MMC Core/协议辅助 struct mmc_test_mem *mem, unsigned long sz, struct scatterlist *sglist, unsigned int max_segs, un... 结构体指针,失败常为 NULL/ERR_PTR
529 mmc_test_rate MMC Core/协议辅助 uint64_t bytes, struct timespec *ts 结构体指针,失败常为 NULL/ERR_PTR
555 mmc_test_save_transfer_result MMC Core/协议辅助 struct mmc_test_card *test, unsigned int count, unsigned int sectors, struct timespec ts, unsigne... 结构体指针,失败常为 NULL/ERR_PTR
580 mmc_test_print_rate MMC Core/协议辅助 struct mmc_test_card *test, uint64_t bytes, struct timespec *ts1, struct timespec *ts2 结构体指针,失败常为 NULL/ERR_PTR
604 mmc_test_print_avg_rate MMC Core/协议辅助 struct mmc_test_card *test, uint64_t bytes, unsigned int count, struct timespec *ts1, struct time... 结构体指针,失败常为 NULL/ERR_PTR
632 mmc_test_capacity MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
648 __mmc_test_prepare 见源码实现 struct mmc_test_card *test, int write 结构体指针,失败常为 NULL/ERR_PTR
672 mmc_test_prepare_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
677 mmc_test_prepare_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
682 mmc_test_cleanup MMC Core/协议辅助 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
708 mmc_test_prepare_broken_mrq MMC Core/协议辅助 struct mmc_test_card *test, struct mmc_request *mrq, int write 结构体指针,失败常为 NULL/ERR_PTR
726 mmc_test_check_result MMC Core/协议辅助 struct mmc_test_card *test, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
751 mmc_test_check_result_async MMC Core/协议辅助 struct mmc_card *card, struct mmc_async_req *areq 结构体指针,失败常为 NULL/ERR_PTR
765 mmc_test_check_broken_result MMC Core/协议辅助 struct mmc_test_card *test, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
799 mmc_test_nonblock_reset 复位 / 块设备 struct mmc_request *mrq, struct mmc_command *cmd, struct mmc_command *stop, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
813 mmc_test_nonblock_transfer 块设备 struct mmc_test_card *test, struct scatterlist *sg, unsigned sg_len, unsigned dev_addr, unsigned ... 结构体指针,失败常为 NULL/ERR_PTR
876 mmc_test_simple_transfer MMC Core/协议辅助 struct mmc_test_card *test, struct scatterlist *sg, unsigned sg_len, unsigned dev_addr, unsigned ... 结构体指针,失败常为 NULL/ERR_PTR
902 mmc_test_broken_transfer MMC Core/协议辅助 struct mmc_test_card *test, unsigned blocks, unsigned blksz, int write 结构体指针,失败常为 NULL/ERR_PTR
933 mmc_test_transfer MMC Core/协议辅助 struct mmc_test_card *test, struct scatterlist *sg, unsigned sg_len, unsigned dev_addr, unsigned ... 结构体指针,失败常为 NULL/ERR_PTR
1029 mmc_test_basic_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1043 mmc_test_basic_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1057 mmc_test_verify_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1066 mmc_test_verify_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1078 mmc_test_multi_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1115 mmc_test_multi_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1136 mmc_test_pow2_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1154 mmc_test_pow2_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1172 mmc_test_weird_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1190 mmc_test_weird_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1208 mmc_test_align_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1223 mmc_test_align_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1238 mmc_test_align_multi_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1265 mmc_test_align_multi_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1292 mmc_test_xfersize_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1303 mmc_test_xfersize_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1314 mmc_test_multi_xfersize_write struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1328 mmc_test_multi_xfersize_read struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1344 mmc_test_write_high struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1354 mmc_test_read_high struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1364 mmc_test_multi_write_high struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1386 mmc_test_multi_read_high struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1410 mmc_test_no_highmem MMC Core/协议辅助 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1422 mmc_test_area_map MMC Core/协议辅助 struct mmc_test_card *test, unsigned long sz, int max_scatter, int min_sg_len 结构体指针,失败常为 NULL/ERR_PTR
1447 mmc_test_area_transfer MMC Core/协议辅助 struct mmc_test_card *test, unsigned int dev_addr, int write 结构体指针,失败常为 NULL/ERR_PTR
1459 mmc_test_area_io_seq MMC Core/协议辅助 struct mmc_test_card *test, unsigned long sz, unsigned int dev_addr, int write, int max_scatter, ... 结构体指针,失败常为 NULL/ERR_PTR
1512 mmc_test_area_io MMC Core/协议辅助 struct mmc_test_card *test, unsigned long sz, unsigned int dev_addr, int write, int max_scatter, ... 结构体指针,失败常为 NULL/ERR_PTR
1523 mmc_test_area_fill MMC Core/协议辅助 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1533 mmc_test_area_erase 擦除 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1547 mmc_test_area_cleanup MMC Core/协议辅助 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1564 mmc_test_area_init 初始化 struct mmc_test_card *test, int erase, int fill 结构体指针,失败常为 NULL/ERR_PTR
1636 mmc_test_area_prepare MMC Core/协议辅助 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1644 mmc_test_area_prepare_erase 擦除 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1652 mmc_test_area_prepare_fill MMC Core/协议辅助 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1665 mmc_test_best_performance MMC Core/协议辅助 struct mmc_test_card *test, int write, int max_scatter 结构体指针,失败常为 NULL/ERR_PTR
1677 mmc_test_best_read_performance struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1685 mmc_test_best_write_performance struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1693 mmc_test_best_read_perf_max_scatter struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1701 mmc_test_best_write_perf_max_scatter struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1709 mmc_test_profile_read_perf struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1730 mmc_test_profile_write_perf struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1757 mmc_test_profile_trim_perf MMC Core/协议辅助 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1790 mmc_test_seq_read_perf struct mmc_test_card *test, unsigned long sz 结构体指针,失败常为 NULL/ERR_PTR
1814 mmc_test_profile_seq_read_perf struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1829 mmc_test_seq_write_perf struct mmc_test_card *test, unsigned long sz 结构体指针,失败常为 NULL/ERR_PTR
1856 mmc_test_profile_seq_write_perf struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1874 mmc_test_profile_seq_trim_perf MMC Core/协议辅助 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
1913 mmc_test_rnd_num MMC Core/协议辅助 unsigned int rnd_cnt 见签名
1922 mmc_test_rnd_perf MMC Core/协议辅助 struct mmc_test_card *test, int write, int print, unsigned long sz 结构体指针,失败常为 NULL/ERR_PTR
1957 mmc_test_random_perf MMC Core/协议辅助 struct mmc_test_card *test, int write 结构体指针,失败常为 NULL/ERR_PTR
1995 mmc_test_random_read_perf struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2003 mmc_test_random_write_perf struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2008 mmc_test_seq_perf MMC Core/协议辅助 struct mmc_test_card *test, int write, unsigned int tot_sz, int max_scatter 结构体指针,失败常为 NULL/ERR_PTR
2055 mmc_test_large_seq_perf MMC Core/协议辅助 struct mmc_test_card *test, int write 结构体指针,失败常为 NULL/ERR_PTR
2081 mmc_test_large_seq_read_perf struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2089 mmc_test_large_seq_write_perf struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2094 mmc_test_rw_multiple MMC Core/协议辅助 struct mmc_test_card *test, struct mmc_test_multiple_rw *tdata, unsigned int reqsize, unsigned in... 结构体指针,失败常为 NULL/ERR_PTR
2144 mmc_test_rw_multiple_size MMC Core/协议辅助 struct mmc_test_card *test, struct mmc_test_multiple_rw *rw 结构体指针,失败常为 NULL/ERR_PTR
2166 mmc_test_rw_multiple_sg_len MMC Core/协议辅助 struct mmc_test_card *test, struct mmc_test_multiple_rw *rw 结构体指针,失败常为 NULL/ERR_PTR
2184 mmc_test_profile_mult_write_blocking_perf 写 / 块设备 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2203 mmc_test_profile_mult_write_nonblock_perf 写 / 块设备 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2222 mmc_test_profile_mult_read_blocking_perf 读 / 块设备 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2241 mmc_test_profile_mult_read_nonblock_perf 读 / 块设备 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2260 mmc_test_profile_sglen_wr_blocking_perf 块设备 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2279 mmc_test_profile_sglen_wr_nonblock_perf 块设备 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2298 mmc_test_profile_sglen_r_blocking_perf 块设备 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2317 mmc_test_profile_sglen_r_nonblock_perf 块设备 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2336 mmc_test_reset 复位 struct mmc_test_card *test 结构体指针,失败常为 NULL/ERR_PTR
2684 mmc_test_run MMC Core/协议辅助 struct mmc_test_card *test, int testcase 结构体指针,失败常为 NULL/ERR_PTR
2779 mmc_test_free_result MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
2805 mtf_test_show debugfs 显示 struct seq_file *sf, void *data 结构体指针,失败常为 NULL/ERR_PTR
2834 mtf_test_open 打开 struct inode *inode, struct file *file 结构体指针,失败常为 NULL/ERR_PTR
2839 mtf_test_write struct file *file, const char __user *buf, size_t count, loff_t *pos 结构体指针,失败常为 NULL/ERR_PTR
2903 mtf_testlist_show debugfs 显示 struct seq_file *sf, void *data 结构体指针,失败常为 NULL/ERR_PTR
2917 mtf_testlist_open 打开 struct inode *inode, struct file *file 结构体指针,失败常为 NULL/ERR_PTR
2929 mmc_test_free_dbgfs_file MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
2946 __mmc_test_register_dbgfs_file 见源码实现 struct mmc_card *card, const char *name, umode_t mode, const struct file_operations *fops 结构体指针,失败常为 NULL/ERR_PTR
2978 mmc_test_register_dbgfs_file MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
3000 mmc_test_probe 设备探测入口 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
3016 mmc_test_remove 设备移除 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
3022 mmc_test_shutdown MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR

drivers\mmc\card\queue.c

行号 函数名 作用 主要传参 返回值
33 mmc_prep_request 处理请求 struct request_queue *q, struct request *req 结构体指针,失败常为 NULL/ERR_PTR
53 mmc_queue_thread 读 / 线程 / 队列 void *d 见签名
115 mmc_request_fn 处理请求 struct request_queue *q 结构体指针,失败常为 NULL/ERR_PTR
162 mmc_queue_setup_discard 队列 struct request_queue *q, struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
192 mmc_init_queue struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock, const char *subname 0 成功,负 errno 失败(除非另有约定)
325 mmc_cleanup_queue 队列 struct mmc_queue *mq 无(void)
366 mmc_packed_init 初始化 struct mmc_queue *mq, struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
398 mmc_packed_clean MMC Core/协议辅助 struct mmc_queue *mq 无(void)
417 mmc_queue_suspend 挂起 / 队列 struct mmc_queue *mq 无(void)
437 mmc_queue_resume 恢复 / 队列 struct mmc_queue *mq 无(void)
453 mmc_queue_packed_map_sg 队列 struct mmc_queue *mq, struct mmc_packed *packed, struct scatterlist *sg, enum mmc_packed_type cmd... 结构体指针,失败常为 NULL/ERR_PTR
491 mmc_queue_map_sg 队列 struct mmc_queue *mq, struct mmc_queue_req *mqrq 无符号整型(常为长度/频率)
532 mmc_queue_bounce_pre 队列 struct mmc_queue_req *mqrq 无(void)
548 mmc_queue_bounce_post 队列 struct mmc_queue_req *mqrq 无(void)

drivers\mmc\card\sdio_uart.c

行号 函数名 作用 主要传参 返回值
90 sdio_uart_add_port SDIO 协议/功能辅助 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
129 sdio_uart_port_put SDIO 协议/功能辅助 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
134 sdio_uart_port_remove 设备移除 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
167 sdio_uart_claim_func 占用 host struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
180 sdio_uart_release_func 释放 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
186 sdio_in SDIO 协议/功能辅助 struct sdio_uart_port *port, int offset 结构体指针,失败常为 NULL/ERR_PTR
193 sdio_out SDIO 协议/功能辅助 struct sdio_uart_port *port, int offset, int value 结构体指针,失败常为 NULL/ERR_PTR
198 sdio_uart_get_mctrl SDIO 协议/功能辅助 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
219 sdio_uart_write_mctrl struct sdio_uart_port *port, unsigned int mctrl 结构体指针,失败常为 NULL/ERR_PTR
238 sdio_uart_update_mctrl SDIO 协议/功能辅助 struct sdio_uart_port *port, unsigned int set, unsigned int clear 结构体指针,失败常为 NULL/ERR_PTR
252 sdio_uart_change_speed SDIO 协议/功能辅助 struct sdio_uart_port *port, struct ktermios *termios, struct ktermios *old 结构体指针,失败常为 NULL/ERR_PTR
353 sdio_uart_start_tx SDIO 协议/功能辅助 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
361 sdio_uart_stop_tx SDIO 协议/功能辅助 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
369 sdio_uart_stop_rx SDIO 协议/功能辅助 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
376 sdio_uart_receive_chars SDIO 协议/功能辅助 struct sdio_uart_port *port, unsigned int *status 结构体指针,失败常为 NULL/ERR_PTR
430 sdio_uart_transmit_chars SDIO 协议/功能辅助 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
469 sdio_uart_check_modem_status SDIO 协议/功能辅助 struct sdio_uart_port *port 结构体指针,失败常为 NULL/ERR_PTR
518 sdio_uart_irq 中断相关 struct sdio_func *func 结构体指针,失败常为 NULL/ERR_PTR
548 uart_carrier_raised 见源码实现 struct tty_port *tport 结构体指针,失败常为 NULL/ERR_PTR
571 uart_dtr_rts 见源码实现 struct tty_port *tport, int onoff 结构体指针,失败常为 NULL/ERR_PTR
600 sdio_uart_activate SDIO 协议/功能辅助 struct tty_port *tport, struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
683 sdio_uart_shutdown SDIO 协议/功能辅助 struct tty_port *tport 结构体指针,失败常为 NULL/ERR_PTR
715 sdio_uart_port_destroy SDIO 协议/功能辅助 struct tty_port *tport 结构体指针,失败常为 NULL/ERR_PTR
732 sdio_uart_install SDIO 协议/功能辅助 struct tty_driver *driver, struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
754 sdio_uart_cleanup SDIO 协议/功能辅助 struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
765 sdio_uart_open 打开 struct tty_struct *tty, struct file *filp 结构体指针,失败常为 NULL/ERR_PTR
771 sdio_uart_close SDIO 协议/功能辅助 struct tty_struct *tty, struct file * filp 结构体指针,失败常为 NULL/ERR_PTR
777 sdio_uart_hangup SDIO 协议/功能辅助 struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
783 sdio_uart_write struct tty_struct *tty, const unsigned char *buf, int count 结构体指针,失败常为 NULL/ERR_PTR
806 sdio_uart_write_room struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
812 sdio_uart_chars_in_buffer SDIO 协议/功能辅助 struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
818 sdio_uart_send_xchar SDIO 协议/功能辅助 struct tty_struct *tty, char ch 结构体指针,失败常为 NULL/ERR_PTR
832 sdio_uart_throttle SDIO 协议/功能辅助 struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
854 sdio_uart_unthrottle SDIO 协议/功能辅助 struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
880 sdio_uart_set_termios SDIO 协议/功能辅助 struct tty_struct *tty, struct ktermios *old_termios 结构体指针,失败常为 NULL/ERR_PTR
920 sdio_uart_break_ctl SDIO 协议/功能辅助 struct tty_struct *tty, int break_state 结构体指针,失败常为 NULL/ERR_PTR
939 sdio_uart_tiocmget SDIO 协议/功能辅助 struct tty_struct *tty 结构体指针,失败常为 NULL/ERR_PTR
953 sdio_uart_tiocmset SDIO 协议/功能辅助 struct tty_struct *tty, unsigned int set, unsigned int clear 结构体指针,失败常为 NULL/ERR_PTR
968 sdio_uart_proc_show debugfs 显示 struct seq_file *m, void *v 结构体指针,失败常为 NULL/ERR_PTR
1013 sdio_uart_proc_open 打开 struct inode *inode, struct file *file 结构体指针,失败常为 NULL/ERR_PTR
1055 sdio_uart_probe 设备探测入口 struct sdio_func *func, const struct sdio_device_id *id 结构体指针,失败常为 NULL/ERR_PTR
1129 sdio_uart_remove 设备移除 struct sdio_func *func 结构体指针,失败常为 NULL/ERR_PTR

drivers\mmc\core\bus.c

行号 函数名 作用 主要传参 返回值
32 type_show debugfs 显示 struct device *dev, struct device_attribute *attr, char *buf 结构体指针,失败常为 NULL/ERR_PTR
64 mmc_bus_match 总线 struct device *dev, struct device_driver *drv 结构体指针,失败常为 NULL/ERR_PTR
112 mmc_bus_probe 总线 / 设备探测入口 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
120 mmc_bus_remove 总线 / 设备移除 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
130 mmc_bus_shutdown 总线 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
149 mmc_bus_suspend 挂起 / 总线 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
166 mmc_bus_resume 总线 / 恢复 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
184 mmc_runtime_suspend 挂起 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
192 mmc_runtime_resume 恢复 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
218 mmc_register_bus 总线 0 成功,负 errno 失败(除非另有约定)
223 mmc_unregister_bus 总线 无(void)
232 mmc_register_driver MMC Core/协议辅助 struct mmc_driver *drv 0 成功,负 errno 失败(除非另有约定)
244 mmc_unregister_driver MMC Core/协议辅助 struct mmc_driver *drv 无(void)
252 mmc_release_card 释放 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
289 mmc_add_card MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
372 mmc_remove_card 设备移除 struct mmc_card *card 无(void)

drivers\mmc\core\core.c

行号 函数名 作用 主要传参 返回值
83 mmc_sdio_hang_dump MMC Core/协议辅助 const char *tag 无(void)
102 mmc_sdio_fr_note_claimer 占用 host struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
141 mmc_schedule_delayed_work MMC Core/协议辅助 struct delayed_work *work, unsigned long delay 结构体指针,失败常为 NULL/ERR_PTR
150 mmc_flush_scheduled_work MMC Core/协议辅助 见签名
161 mmc_should_fail_request 处理请求 struct mmc_host *host, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
185 mmc_should_fail_request 处理请求 struct mmc_host *host, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
200 mmc_request_done struct mmc_host *host, struct mmc_request *mrq 无(void)
264 __mmc_start_request 处理请求 struct mmc_host *host, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
296 mmc_start_request 处理请求 struct mmc_host *host, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
378 mmc_start_bkops MMC Core/协议辅助 struct mmc_card *card, bool from_exception 无(void)
444 mmc_wait_data_done MMC Core/协议辅助 struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
452 mmc_wait_done MMC Core/协议辅助 struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
465 __mmc_start_data_req 见源码实现 struct mmc_host *host, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
481 __mmc_start_req 见源码实现 struct mmc_host *host, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
508 mmc_wait_for_data_req_done MMC Core/协议辅助 struct mmc_host *host, struct mmc_request *mrq, struct mmc_async_req *next_req 结构体指针,失败常为 NULL/ERR_PTR
554 mmc_wait_for_req_done MMC Core/协议辅助 struct mmc_host *host, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
608 mmc_pre_req MMC Core/协议辅助 struct mmc_host *host, struct mmc_request *mrq, bool is_first_req 结构体指针,失败常为 NULL/ERR_PTR
624 mmc_post_req MMC Core/协议辅助 struct mmc_host *host, struct mmc_request *mrq, int err 结构体指针,失败常为 NULL/ERR_PTR
788 mmc_wait_for_req struct mmc_host *host, struct mmc_request *mrq 无(void)
826 mmc_interrupt_hpi 中断处理 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
896 mmc_wait_for_cmd MMC Core/协议辅助 struct mmc_host *host, struct mmc_command *cmd, int retries 0 成功,负 errno 失败(除非另有约定)
924 mmc_stop_bkops MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
945 mmc_read_bkops_status struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
971 mmc_set_data_timeout MMC Core/协议辅助 struct mmc_data *data, const struct mmc_card *card 无(void)
1079 mmc_align_data_size MMC Core/协议辅助 struct mmc_card *card, unsigned int sz 无符号整型(常为长度/频率)
1102 __mmc_claim_host 占用 host / 主机 struct mmc_host *host, atomic_t *abort 0 成功,负 errno 失败(除非另有约定)
1149 mmc_release_host 释放 / 主机 struct mmc_host *host 无(void)
1176 mmc_get_card MMC Core/协议辅助 struct mmc_card *card 无(void)
1187 mmc_put_card MMC Core/协议辅助 struct mmc_card *card 无(void)
1199 mmc_set_ios MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1215 mmc_set_chip_select MMC Core/协议辅助 struct mmc_host *host, int mode 无(void)
1221 set_sd_max_clk 见源码实现 unsigned int max_clk 无(void)
1230 mmc_set_clock 时钟 struct mmc_host *host, unsigned int hz 无(void)
1242 mmc_execute_tuning 调谐 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
1269 mmc_set_bus_mode 总线 struct mmc_host *host, unsigned int mode 无(void)
1278 mmc_set_bus_width 总线 struct mmc_host *host, unsigned int width 无(void)
1287 mmc_set_initial_state 初始化 struct mmc_host *host 无(void)
1318 mmc_vdd_to_ocrbitnum MMC Core/协议辅助 int vdd, bool low_bits 见签名
1352 mmc_vddrange_to_ocrmask MMC Core/协议辅助 int vdd_min, int vdd_max 32 位值
1387 mmc_of_parse_voltage 电压 / 解析 struct device_node *np, u32 *mask 0 成功,负 errno 失败(除非另有约定)
1424 mmc_of_get_func_num MMC Core/协议辅助 struct device_node *node 结构体指针,失败常为 NULL/ERR_PTR
1463 mmc_ocrbitnum_to_vdd MMC Core/协议辅助 int vdd_bit, int *min_uV, int *max_uV 见签名
1497 mmc_regulator_get_ocrmask MMC Core/协议辅助 struct regulator *supply 0 成功,负 errno 失败(除非另有约定)
1543 mmc_regulator_set_ocr MMC Core/协议辅助 struct mmc_host *mmc, struct regulator *supply, unsigned short vdd_bit 0 成功,负 errno 失败(除非另有约定)
1572 mmc_regulator_set_voltage_if_supported 电压 struct regulator *regulator, int min_uV, int target_uV, int max_uV 结构体指针,失败常为 NULL/ERR_PTR
1604 mmc_regulator_set_vqmmc MMC Core/协议辅助 struct mmc_host *mmc, struct mmc_ios *ios 0 成功,负 errno 失败(除非另有约定)
1652 mmc_regulator_get_supply MMC Core/协议辅助 struct mmc_host *mmc 0 成功,负 errno 失败(除非另有约定)
1686 mmc_select_voltage 电压 struct mmc_host *host, u32 ocr 32 位值
1720 __mmc_set_signal_voltage 电压 struct mmc_host *host, int signal_voltage 0 成功,负 errno 失败(除非另有约定)
1736 mmc_set_signal_voltage 电压 struct mmc_host *host, int signal_voltage, u32 ocr 0 成功,负 errno 失败(除非另有约定)
1826 mmc_set_timing MMC Core/协议辅助 struct mmc_host *host, unsigned int timing 无(void)
1835 mmc_set_driver_type MMC Core/协议辅助 struct mmc_host *host, unsigned int drv_type 无(void)
1841 mmc_select_drive_strength MMC Core/协议辅助 struct mmc_card *card, unsigned int max_dtr, int card_drv_type, int *drv_type 0 成功,负 errno 失败(除非另有约定)
1885 mmc_power_up MMC Core/协议辅助 struct mmc_host *host, u32 ocr 无(void)
1925 mmc_power_off MMC Core/协议辅助 struct mmc_host *host 无(void)
1947 mmc_power_cycle MMC Core/协议辅助 struct mmc_host *host, u32 ocr 无(void)
1958 __mmc_release_bus 释放 / 总线 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1970 mmc_bus_get 总线 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1983 mmc_bus_put 总线 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1998 mmc_attach_bus 总线 / 挂载卡类型 struct mmc_host *host, const struct mmc_bus_ops *ops 无(void)
2022 mmc_detach_bus 总线 / 卸载 struct mmc_host *host 无(void)
2040 _mmc_detect_change 见源码实现 struct mmc_host *host, unsigned long delay, bool cd_irq 结构体指针,失败常为 NULL/ERR_PTR
2072 mmc_detect_change MMC Core/协议辅助 struct mmc_host *host, unsigned long delay 无(void)
2078 mmc_init_erase 初始化 / 擦除 struct mmc_card *card 无(void)
2128 mmc_mmc_erase_timeout 擦除 struct mmc_card *card, unsigned int arg, unsigned int qty 结构体指针,失败常为 NULL/ERR_PTR
2192 mmc_sd_erase_timeout 擦除 struct mmc_card *card, unsigned int arg, unsigned int qty 结构体指针,失败常为 NULL/ERR_PTR
2217 mmc_erase_timeout 擦除 struct mmc_card *card, unsigned int arg, unsigned int qty 结构体指针,失败常为 NULL/ERR_PTR
2227 mmc_do_erase 擦除 struct mmc_card *card, unsigned int from, unsigned int to, unsigned int arg 结构体指针,失败常为 NULL/ERR_PTR
2353 mmc_erase 擦除 struct mmc_card *card, unsigned int from, unsigned int nr, unsigned int arg 0 成功,负 errno 失败(除非另有约定)
2428 mmc_can_erase 擦除 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
2437 mmc_can_trim MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
2446 mmc_can_discard MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
2458 mmc_can_sanitize MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
2468 mmc_can_secure_erase_trim 擦除 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
2477 mmc_erase_group_aligned 擦除 struct mmc_card *card, unsigned int from, unsigned int nr 0 成功,负 errno 失败(除非另有约定)
2488 mmc_do_calc_max_discard MMC Core/协议辅助 struct mmc_card *card, unsigned int arg 结构体指针,失败常为 NULL/ERR_PTR
2546 mmc_calc_max_discard MMC Core/协议辅助 struct mmc_card *card 无符号整型(常为长度/频率)
2576 mmc_set_blocklen 块设备 struct mmc_card *card, unsigned int blocklen 0 成功,负 errno 失败(除非另有约定)
2590 mmc_set_blockcount 块设备 struct mmc_card *card, unsigned int blockcount, bool is_rel_write 0 成功,负 errno 失败(除非另有约定)
2604 mmc_hw_reset_for_init 复位 / 初始化 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
2611 mmc_hw_reset 复位 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
2634 mmc_rescan_try_freq 重新扫描 struct mmc_host *host, unsigned freq 结构体指针,失败常为 NULL/ERR_PTR
2672 _mmc_detect_card_removed 设备移除 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
2704 mmc_detect_card_removed 设备移除 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
2739 mmc_rescan struct work_struct *work 无(void)
2811 mmc_start_host 主机 struct mmc_host *host 无(void)
2828 mmc_stop_host 主机 struct mmc_host *host 无(void)
2866 mmc_power_save_host 主机 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
2892 mmc_power_restore_host 主机 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
2919 mmc_flush_cache MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
2943 mmc_pm_notify MMC Core/协议辅助 struct notifier_block *notify_block, unsigned long mode, void *unused 0 成功,负 errno 失败(除非另有约定)
3009 mmc_init_context_info 初始化 struct mmc_host *host 无(void)

drivers\mmc\core\core.h

行号 函数名 作用 主要传参 返回值
58 mmc_delay MMC Core/协议辅助 unsigned int ms 见签名

drivers\mmc\core\debugfs.c

行号 函数名 作用 主要传参 返回值
34 mmc_ios_show debugfs 显示 struct seq_file *s, void *data 结构体指针,失败常为 NULL/ERR_PTR
197 mmc_ios_open 打开 struct inode *inode, struct file *file 结构体指针,失败常为 NULL/ERR_PTR
209 mmc_clock_opt_get 时钟 void *data, u64 *val 见签名
218 mmc_clock_opt_set 时钟 void *data, u64 val 见签名
236 mmc_add_host_debugfs 主机 struct mmc_host *host 无(void)
276 mmc_remove_host_debugfs 设备移除 / 主机 struct mmc_host *host 无(void)
281 mmc_dbg_card_status_get MMC Core/协议辅助 void *data, u64 *val 见签名
302 mmc_ext_csd_open 打开 struct inode *inode, struct file *filp 结构体指针,失败常为 NULL/ERR_PTR
334 mmc_ext_csd_read struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos 结构体指针,失败常为 NULL/ERR_PTR
343 mmc_ext_csd_release 释放 struct inode *inode, struct file *file 结构体指针,失败常为 NULL/ERR_PTR
356 mmc_add_card_debugfs MMC Core/协议辅助 struct mmc_card *card 无(void)
396 mmc_remove_card_debugfs 设备移除 struct mmc_card *card 无(void)

drivers\mmc\core\host.c

行号 函数名 作用 主要传参 返回值
41 mmc_host_classdev_release 释放 / 主机 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
56 mmc_register_host_class 主机 0 成功,负 errno 失败(除非另有约定)
62 mmc_unregister_host_class 主机 无(void)
67 mmc_retune_enable 使能 struct mmc_host *host 无(void)
75 mmc_retune_disable 关闭 struct mmc_host *host 无(void)
83 mmc_retune_timer_stop MMC Core/协议辅助 struct mmc_host *host 无(void)
89 mmc_retune_hold MMC Core/协议辅助 struct mmc_host *host 无(void)
96 mmc_retune_release 释放 struct mmc_host *host 无(void)
104 mmc_retune MMC Core/协议辅助 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
144 mmc_retune_timer MMC Core/协议辅助 unsigned long data 见签名
160 mmc_of_parse struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
389 mmc_add_host struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
422 mmc_remove_host 设备移除 / 主机 struct mmc_host *host 无(void)
444 mmc_free_host 主机 struct mmc_host *host 无(void)

drivers\mmc\core\mmc.c

行号 函数名 作用 主要传参 返回值
68 mmc_decode_cid MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
120 mmc_set_erase_size 擦除 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
133 mmc_decode_csd MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
185 mmc_select_card_type MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
246 mmc_manage_enhanced_area MMC Core/协议辅助 struct mmc_card *card, u8 *ext_csd 结构体指针,失败常为 NULL/ERR_PTR
295 mmc_manage_gp_partitions MMC Core/协议辅助 struct mmc_card *card, u8 *ext_csd 结构体指针,失败常为 NULL/ERR_PTR
345 mmc_decode_ext_csd MMC Core/协议辅助 struct mmc_card *card, u8 *ext_csd 结构体指针,失败常为 NULL/ERR_PTR
603 mmc_read_ext_csd struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
641 mmc_compare_ext_csds MMC Core/协议辅助 struct mmc_card *card, unsigned bus_width 结构体指针,失败常为 NULL/ERR_PTR
735 mmc_fwrev_show debugfs 显示 struct device *dev, struct device_attribute *attr, char *buf 结构体指针,失败常为 NULL/ERR_PTR
784 __mmc_select_powerclass 见源码实现 struct mmc_card *card, unsigned int bus_width 结构体指针,失败常为 NULL/ERR_PTR
847 mmc_select_powerclass MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
881 mmc_set_bus_speed 总线 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
901 mmc_select_bus_width 总线 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
970 mmc_select_hs MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
987 mmc_select_hs_ddr MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1056 mmc_switch_status MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1068 mmc_select_hs400 MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1153 mmc_hs200_to_hs400 MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
1158 mmc_hs400_to_hs200 MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
1231 mmc_select_driver_type MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1255 mmc_select_hs200 MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1320 mmc_select_timing MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1356 mmc_hs200_tuning 调谐 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1378 mmc_init_card 初始化 struct mmc_host *host, u32 ocr, struct mmc_card *oldcard 结构体指针,失败常为 NULL/ERR_PTR
1688 mmc_can_sleep MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1693 mmc_sleep MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1742 mmc_can_poweroff_notify MMC Core/协议辅助 const struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1749 mmc_poweroff_notify MMC Core/协议辅助 struct mmc_card *card, unsigned int notify_type 结构体指针,失败常为 NULL/ERR_PTR
1774 mmc_remove 设备移除 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1786 mmc_alive MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1794 mmc_detect MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1820 _mmc_suspend 挂起 struct mmc_host *host, bool is_suspend 结构体指针,失败常为 NULL/ERR_PTR
1864 mmc_suspend 挂起 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1881 _mmc_resume 恢复 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1905 mmc_shutdown MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1926 mmc_resume 恢复 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1943 mmc_runtime_suspend 挂起 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1961 mmc_runtime_resume 恢复 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1976 mmc_can_reset 复位 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
1987 mmc_reset 复位 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
2022 mmc_attach_mmc struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\core\mmc_ops.c

行号 函数名 作用 主要传参 返回值
59 __mmc_send_status 见源码实现 struct mmc_card *card, u32 *status, bool ignore_crc 结构体指针,失败常为 NULL/ERR_PTR
88 mmc_send_status MMC Core/协议辅助 struct mmc_card *card, u32 *status 0 成功,负 errno 失败(除非另有约定)
93 _mmc_select_card 见源码实现 struct mmc_host *host, struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
117 mmc_select_card MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
124 mmc_deselect_cards MMC Core/协议辅助 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
137 mmc_set_dsr MMC Core/协议辅助 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
149 mmc_go_idle MMC Core/协议辅助 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
186 mmc_send_op_cond MMC Core/协议辅助 struct mmc_host *host, u32 ocr, u32 *rocr 0 成功,负 errno 失败(除非另有约定)
226 mmc_all_send_cid MMC Core/协议辅助 struct mmc_host *host, u32 *cid 0 成功,负 errno 失败(除非另有约定)
247 mmc_set_relative_addr MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
342 mmc_send_csd MMC Core/协议辅助 struct mmc_card *card, u32 *csd 0 成功,负 errno 失败(除非另有约定)
367 mmc_send_cid MMC Core/协议辅助 struct mmc_host *host, u32 *cid 0 成功,负 errno 失败(除非另有约定)
395 mmc_get_ext_csd MMC Core/协议辅助 struct mmc_card *card, u8 **new_ext_csd 0 成功,负 errno 失败(除非另有约定)
425 mmc_spi_read_ocr struct mmc_host *host, int highcap, u32 *ocrp 0 成功,负 errno 失败(除非另有约定)
440 mmc_spi_set_crc MMC Core/协议辅助 struct mmc_host *host, int use_crc 0 成功,负 errno 失败(除非另有约定)
455 mmc_switch_status_error MMC Core/协议辅助 struct mmc_host *host, u32 status 0 成功,负 errno 失败(除非另有约定)
484 __mmc_switch 见源码实现 struct mmc_card *card, u8 set, u8 index, u8 value, unsigned int timeout_ms, bool use_busy_signal,... 0 成功,负 errno 失败(除非另有约定)
585 mmc_switch MMC Core/协议辅助 struct mmc_card *card, u8 set, u8 index, u8 value, unsigned int timeout_ms 0 成功,负 errno 失败(除非另有约定)
593 mmc_send_tuning 调谐 struct mmc_host *host, u32 opcode, int *cmd_error 0 成功,负 errno 失败(除非另有约定)
739 mmc_bus_test 总线 struct mmc_card *card, u8 bus_width 0 成功,负 errno 失败(除非另有约定)
761 mmc_send_hpi_cmd MMC Core/协议辅助 struct mmc_card *card, u32 *status 0 成功,负 errno 失败(除非另有约定)
795 mmc_can_ext_csd MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\core\pwrseq.c

行号 函数名 作用 主要传参 返回值
50 mmc_pwrseq_alloc 上电时序 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
88 mmc_pwrseq_pre_power_on 上电时序 struct mmc_host *host 无(void)
96 mmc_pwrseq_post_power_on 上电时序 struct mmc_host *host 无(void)
104 mmc_pwrseq_power_off 上电时序 struct mmc_host *host 无(void)
112 mmc_pwrseq_free 上电时序 struct mmc_host *host 无(void)
122 hcmmc_pwrseq_probe 设备探测入口 / 上电时序 见签名

drivers\mmc\core\pwrseq.h

行号 函数名 作用 主要传参 返回值
37 mmc_pwrseq_alloc 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
38 mmc_pwrseq_pre_power_on 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
39 mmc_pwrseq_post_power_on 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
40 mmc_pwrseq_power_off 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
41 mmc_pwrseq_free 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR

drivers\mmc\core\pwrseq_emmc.c

行号 函数名 作用 主要传参 返回值
28 __mmc_pwrseq_emmc_reset 复位 / 上电时序 struct mmc_pwrseq_emmc *pwrseq 结构体指针,失败常为 NULL/ERR_PTR
36 mmc_pwrseq_emmc_reset 复位 / 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
44 mmc_pwrseq_emmc_free 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
59 mmc_pwrseq_emmc_reset_nb 复位 / 上电时序 struct notifier_block *this, unsigned long mode, void *cmd 结构体指针,失败常为 NULL/ERR_PTR

drivers\mmc\core\pwrseq_simple.c

行号 函数名 作用 主要传参 返回值
32 mmc_pwrseq_simple_set_gpios_value GPIO / 上电时序 struct mmc_pwrseq_simple *pwrseq, int value 结构体指针,失败常为 NULL/ERR_PTR
49 mmc_pwrseq_simple_pre_power_on 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
62 mmc_pwrseq_simple_post_power_on 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
70 mmc_pwrseq_simple_power_off 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
83 mmc_pwrseq_simple_free 上电时序 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR

drivers\mmc\core\quirks.c

行号 函数名 作用 主要传参 返回值
54 mmc_fixup_device MMC Core/协议辅助 struct mmc_card *card, const struct mmc_fixup *table 无(void)

drivers\mmc\core\sd.c

行号 函数名 作用 主要传参 返回值
75 mmc_decode_cid MMC Core/协议辅助 struct mmc_card *card 无(void)
104 mmc_decode_csd MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
192 mmc_decode_scr MMC Core/协议辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
235 mmc_read_ssr struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
290 mmc_read_switch struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
353 mmc_sd_switch_hs MMC Core/协议辅助 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
395 sd_select_driver_type 见源码实现 struct mmc_card *card, u8 *status 结构体指针,失败常为 NULL/ERR_PTR
426 sd_update_bus_speed_mode 总线 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
459 sd_set_bus_speed_mode 总线 struct mmc_card *card, u8 *status 结构体指针,失败常为 NULL/ERR_PTR
505 sd_get_host_max_current 主机 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
529 sd_set_current_limit 见源码实现 struct mmc_card *card, u8 *status 结构体指针,失败常为 NULL/ERR_PTR
585 mmc_sd_init_uhs_card 初始化 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
706 mmc_sd_get_cid MMC Core/协议辅助 struct mmc_host *host, u32 ocr, u32 *cid, u32 *rocr 0 成功,负 errno 失败(除非另有约定)
784 mmc_sd_get_csd MMC Core/协议辅助 struct mmc_host *host, struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
802 mmc_sd_get_ro MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
822 mmc_sd_setup_card MMC Core/协议辅助 struct mmc_host *host, struct mmc_card *card, bool reinit 0 成功,负 errno 失败(除非另有约定)
886 mmc_sd_get_max_clock 时钟 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
906 mmc_sd_init_card 初始化 struct mmc_host *host, u32 ocr, struct mmc_card *oldcard 结构体指针,失败常为 NULL/ERR_PTR
1028 mmc_sd_remove 设备移除 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1040 mmc_sd_alive MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1048 mmc_sd_detect MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1074 _mmc_sd_suspend 挂起 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1102 mmc_sd_suspend 挂起 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1119 _mmc_sd_resume 恢复 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1143 mmc_sd_resume 恢复 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1160 mmc_sd_runtime_suspend 挂起 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1178 mmc_sd_runtime_resume 恢复 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1193 mmc_sd_reset 复位 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1214 mmc_attach_sd struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\core\sd_ops.c

行号 函数名 作用 主要传参 返回值
27 mmc_app_cmd MMC Core/协议辅助 struct mmc_host *host, struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
70 mmc_wait_for_app_cmd MMC Core/协议辅助 struct mmc_host *host, struct mmc_card *card, struct mmc_command *cmd, int retries 0 成功,负 errno 失败(除非另有约定)
123 mmc_app_set_bus_width 总线 struct mmc_card *card, int width 0 成功,负 errno 失败(除非另有约定)
152 mmc_send_app_op_cond MMC Core/协议辅助 struct mmc_host *host, u32 ocr, u32 *rocr 0 成功,负 errno 失败(除非另有约定)
198 mmc_send_if_cond MMC Core/协议辅助 struct mmc_host *host, u32 ocr 0 成功,负 errno 失败(除非另有约定)
229 mmc_send_relative_addr MMC Core/协议辅助 struct mmc_host *host, unsigned int *rca 0 成功,负 errno 失败(除非另有约定)
250 mmc_app_send_scr MMC Core/协议辅助 struct mmc_card *card, u32 *scr 0 成功,负 errno 失败(除非另有约定)
309 mmc_sd_switch MMC Core/协议辅助 struct mmc_card *card, int mode, int group, u8 value, u8 *resp 0 成功,负 errno 失败(除非另有约定)
354 mmc_app_sd_status MMC Core/协议辅助 struct mmc_card *card, void *ssr 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\core\sdio.c

行号 函数名 作用 主要传参 返回值
33 sdio_read_fbr struct sdio_func *func 结构体指针,失败常为 NULL/ERR_PTR
63 sdio_init_func 初始化 struct mmc_card *card, unsigned int fn 结构体指针,失败常为 NULL/ERR_PTR
103 sdio_read_cccr struct mmc_card *card, u32 ocr 结构体指针,失败常为 NULL/ERR_PTR
208 sdio_enable_wide 使能 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
244 sdio_disable_cd 关闭 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
265 sdio_disable_wide 关闭 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
296 sdio_enable_4bit_bus 总线 / 使能 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
325 mmc_sdio_switch_hs MMC Core/协议辅助 struct mmc_card *card, int enable 结构体指针,失败常为 NULL/ERR_PTR
355 sdio_enable_hs 使能 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
370 mmc_sdio_get_max_clock 时钟 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
408 sdio_select_driver_type SDIO 协议/功能辅助 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
445 sdio_set_bus_speed_mode 总线 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
517 mmc_sdio_init_uhs_card 初始化 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
556 mmc_sdio_init_card 初始化 struct mmc_host *host, u32 ocr, struct mmc_card *oldcard, int powered_resume 结构体指针,失败常为 NULL/ERR_PTR
797 mmc_sdio_remove 设备移除 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
818 mmc_sdio_alive MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
826 mmc_sdio_detect MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
881 mmc_sdio_pre_suspend 挂起 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
903 mmc_sdio_suspend 挂起 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
922 mmc_sdio_resume 恢复 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
976 mmc_sdio_power_restore MMC Core/协议辅助 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1021 mmc_sdio_runtime_suspend 挂起 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1031 mmc_sdio_runtime_resume 恢复 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1044 mmc_sdio_reset 复位 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1067 mmc_attach_sdio struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\core\sdio_bus.c

行号 函数名 作用 主要传参 返回值
58 modalias_show debugfs 显示 struct device *dev, struct device_attribute *attr, char *buf 结构体指针,失败常为 NULL/ERR_PTR
107 sdio_bus_match 总线 struct device *dev, struct device_driver *drv 结构体指针,失败常为 NULL/ERR_PTR
140 sdio_bus_probe 总线 / 设备探测入口 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
188 sdio_bus_remove 总线 / 设备移除 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
242 sdio_register_bus 总线 0 成功,负 errno 失败(除非另有约定)
247 sdio_unregister_bus 总线 无(void)
256 sdio_register_driver SDIO 协议/功能辅助 struct sdio_driver *drv 0 成功,负 errno 失败(除非另有约定)
268 sdio_unregister_driver SDIO 协议/功能辅助 struct sdio_driver *drv 无(void)
275 sdio_release_func 释放 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
319 sdio_acpi_set_handle SDIO 协议/功能辅助 struct sdio_func *func 结构体指针,失败常为 NULL/ERR_PTR
327 sdio_acpi_set_handle SDIO 协议/功能辅助 struct sdio_func *func 结构体指针,失败常为 NULL/ERR_PTR
330 sdio_set_of_node SDIO 协议/功能辅助 struct sdio_func *func 结构体指针,失败常为 NULL/ERR_PTR
348 sdio_device_add SDIO 协议/功能辅助 struct sdio_func *func 无(void)
370 sdio_add_func SDIO 协议/功能辅助 struct sdio_func *func 0 成功,负 errno 失败(除非另有约定)
387 sdio_device_remove 设备移除 struct sdio_func *func 无(void)
410 sdio_remove_func 设备移除 struct sdio_func *func 无(void)

drivers\mmc\core\sdio_cis.c

行号 函数名 作用 主要传参 返回值
28 cistpl_vers_1 CIS 解析 struct mmc_card *card, struct sdio_func *func, const unsigned char *buf, unsigned size 结构体指针,失败常为 NULL/ERR_PTR
75 cistpl_manfid CIS 解析 struct mmc_card *card, struct sdio_func *func, const unsigned char *buf, unsigned size 结构体指针,失败常为 NULL/ERR_PTR
112 cis_tpl_parse 解析 / CIS 解析 struct mmc_card *card, struct sdio_func *func, const char *tpl_descr, const struct cis_tpl *tpl, ... 结构体指针,失败常为 NULL/ERR_PTR
147 cistpl_funce_common CIS 解析 struct mmc_card *card, struct sdio_func *func, const unsigned char *buf, unsigned size 结构体指针,失败常为 NULL/ERR_PTR
164 cistpl_funce_func CIS 解析 struct mmc_card *card, struct sdio_func *func, const unsigned char *buf, unsigned size 结构体指针,失败常为 NULL/ERR_PTR
209 cistpl_funce CIS 解析 struct mmc_card *card, struct sdio_func *func, const unsigned char *buf, unsigned size 结构体指针,失败常为 NULL/ERR_PTR
229 sdio_read_cis 读 / CIS 解析 struct mmc_card *card, struct sdio_func *func 结构体指针,失败常为 NULL/ERR_PTR
347 sdio_read_common_cis 读 / CIS 解析 struct mmc_card *card 0 成功,负 errno 失败(除非另有约定)
352 sdio_free_common_cis CIS 解析 struct mmc_card *card 无(void)
367 sdio_read_func_cis 读 / CIS 解析 struct sdio_func *func 0 成功,负 errno 失败(除非另有约定)
393 sdio_free_func_cis CIS 解析 struct sdio_func *func 无(void)

drivers\mmc\core\sdio_io.c

行号 函数名 作用 主要传参 返回值
37 sdio_claim_host 占用 host / 主机 struct sdio_func *func 无(void)
55 sdio_release_host 释放 / 主机 struct sdio_func *func 无(void)
71 sdio_enable_func 使能 struct sdio_func *func 0 成功,负 errno 失败(除非另有约定)
122 sdio_disable_func 关闭 struct sdio_func *func 0 成功,负 errno 失败(除非另有约定)
171 sdio_set_block_size 块设备 struct sdio_func *func, unsigned blksz 0 成功,负 errno 失败(除非另有约定)
201 sdio_max_byte_size SDIO 协议/功能辅助 struct sdio_func *func 结构体指针,失败常为 NULL/ERR_PTR
230 sdio_align_size SDIO 协议/功能辅助 struct sdio_func *func, unsigned int sz 无符号整型(常为长度/频率)
315 sdio_io_rw_ext_helper SDIO 协议/功能辅助 struct sdio_func *func, int write, unsigned addr, int incr_addr, u8 *buf, unsigned size 结构体指针,失败常为 NULL/ERR_PTR
377 sdio_readb struct sdio_func *func, unsigned int addr, int *err_ret 8 位数据或状态
409 sdio_writeb struct sdio_func *func, u8 b, unsigned int addr, int *err_ret 无(void)
434 sdio_writeb_readb 写 / 读 struct sdio_func *func, u8 write_byte, unsigned int addr, int *err_ret 8 位数据或状态
461 sdio_memcpy_fromio struct sdio_func *func, void *dst, unsigned int addr, int count 0 成功,负 errno 失败(除非另有约定)
483 sdio_memcpy_toio struct sdio_func *func, unsigned int addr, void *src, int count 0 成功,负 errno 失败(除非另有约定)
505 sdio_readsb struct sdio_func *func, void *dst, unsigned int addr, int count 0 成功,负 errno 失败(除非另有约定)
522 sdio_writesb struct sdio_func *func, unsigned int addr, void *src, int count 0 成功,负 errno 失败(除非另有约定)
539 sdio_readw struct sdio_func *func, unsigned int addr, int *err_ret 16 位值
568 sdio_writew struct sdio_func *func, u16 b, unsigned int addr, int *err_ret 无(void)
591 sdio_readl struct sdio_func *func, unsigned int addr, int *err_ret 32 位值
635 sdio_writel struct sdio_func *func, u32 b, unsigned int addr, int *err_ret 无(void)
710 sdio_f0_writeb struct sdio_func *func, unsigned char b, unsigned int addr, int *err_ret 无(void)
760 sdio_set_host_pm_flags 主机 struct sdio_func *func, mmc_pm_flag_t flags 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\core\sdio_irq.c

行号 函数名 作用 主要传参 返回值
32 process_sdio_pending_irqs 中断相关 struct mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
93 sdio_run_irqs 中断相关 struct mmc_host *host 无(void)
102 sdio_irq_thread 读 / 中断相关 / 线程 void *_host 见签名
188 sdio_card_irq_get 中断相关 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
213 sdio_card_irq_put 中断相关 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
233 sdio_single_irq_set 中断相关 struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
260 sdio_claim_irq struct sdio_func *func, sdio_irq_handler_t *handler 0 成功,负 errno 失败(除非另有约定)
303 sdio_release_irq 释放 / 中断相关 struct sdio_func *func 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\core\sdio_ops.c

行号 函数名 作用 主要传参 返回值
24 mmc_send_io_op_cond MMC Core/协议辅助 struct mmc_host *host, u32 ocr, u32 *rocr 0 成功,负 errno 失败(除非另有约定)
70 mmc_io_rw_direct_host 主机 struct mmc_host *host, int write, unsigned fn, unsigned addr, u8 in, u8 *out 结构体指针,失败常为 NULL/ERR_PTR
116 mmc_io_rw_direct struct mmc_card *card, int write, unsigned fn, unsigned addr, u8 in, u8 *out 0 成功,负 errno 失败(除非另有约定)
123 mmc_io_rw_extended struct mmc_card *card, int write, unsigned fn, unsigned addr, int incr_addr, u8 *buf, unsigned bl... 0 成功,负 errno 失败(除非另有约定)
209 sdio_reset 复位 struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\core\sdio_ops.h

行号 函数名 作用 主要传参 返回值
24 mmc_is_io_op MMC Core/协议辅助 u32 opcode 见签名

drivers\mmc\core\slot-gpio.c

行号 函数名 作用 主要传参 返回值
34 mmc_gpio_cd_irqt GPIO / 中断相关 int irq, void *dev_id 见签名
45 mmc_gpio_alloc GPIO struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
62 mmc_gpio_get_ro GPIO struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
77 mmc_gpio_get_cd GPIO struct mmc_host *host 0 成功,负 errno 失败(除非另有约定)
102 mmc_gpio_request_ro 处理请求 / GPIO struct mmc_host *host, unsigned int gpio 0 成功,负 errno 失败(除非另有约定)
122 mmc_gpiod_request_cd_irq 处理请求 / GPIO / 中断相关 struct mmc_host *host 无(void)
161 mmc_gpio_set_cd_isr GPIO struct mmc_host *host, irqreturn_t (*isr)(int irq, void *dev_id) 无(void)
186 mmc_gpio_request_cd 处理请求 / GPIO struct mmc_host *host, unsigned int gpio, unsigned int debounce 0 成功,负 errno 失败(除非另有约定)
231 mmc_gpiod_request_cd 处理请求 / GPIO struct mmc_host *host, const char *con_id, unsigned int idx, bool override_active_level, unsigned... 0 成功,负 errno 失败(除非另有约定)
277 mmc_gpiod_request_ro 处理请求 / GPIO struct mmc_host *host, const char *con_id, unsigned int idx, bool override_active_level, unsigned... 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\host\hc15\hc_mmc.c

行号 函数名 作用 主要传参 返回值
67 hc_mmc_reset 复位 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
76 hc_mmc_get_cd HC15 MMC Host 内部辅助 struct mmc_host *mmc 结构体指针,失败常为 NULL/ERR_PTR
98 hc_mmc_check_status HC15 MMC Host 内部辅助 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
134 hc_mmc_check_status_ex HC15 MMC Host 内部辅助 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
161 hc_mmc_request_done 处理请求 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
185 hc_mmc_rto_timer HC15 MMC Host 内部辅助 unsigned long watchdog_data 见签名
234 hc_mmc_sdio_timer HC15 MMC Host 内部辅助 unsigned long timer_data 见签名
252 hc_mmc_prepare_pio HC15 MMC Host 内部辅助 struct hc_mmc_host *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
259 hc_mmc_pio_transfer HC15 MMC Host 内部辅助 struct hc_mmc_host *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
268 hc_mmc_send_cmd16 HC15 MMC Host 内部辅助 struct hc_mmc_host *host,u32 block_len 结构体指针,失败常为 NULL/ERR_PTR
283 hc_mmc_prepare_dma DMA struct hc_mmc_host *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
325 hc_mmc_prepare_data HC15 MMC Host 内部辅助 struct hc_mmc_host *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
352 hc_mmc_clear_pending_cmd_complete HC15 MMC Host 内部辅助 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
374 hc_mmc_start_command HC15 MMC Host 内部辅助 struct hc_mmc_host *host, struct mmc_command *cmd, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
546 hc_mmc_io_rw_extended HC15 MMC Host 内部辅助 struct mmc_host *host, int write, unsigned fn, unsigned addr, int incr_addr, u8 *buf, unsigned bl... 结构体指针,失败常为 NULL/ERR_PTR
626 hc_mmc_cmd53_special_proc HC15 MMC Host 内部辅助 struct mmc_host *mmc, struct mmc_request *req 结构体指针,失败常为 NULL/ERR_PTR
685 hc_mmc_request 处理请求 struct mmc_host *mmc, struct mmc_request *req 结构体指针,失败常为 NULL/ERR_PTR
706 hc_mmc_set_ios HC15 MMC Host 内部辅助 struct mmc_host *mmc, struct mmc_ios *ios 结构体指针,失败常为 NULL/ERR_PTR
726 hc_mmc_get_ro HC15 MMC Host 内部辅助 struct mmc_host *mmc 结构体指针,失败常为 NULL/ERR_PTR
739 hc_mmc_enable_sdio_irq 使能 / 中断相关 struct mmc_host *mmc, int enable 结构体指针,失败常为 NULL/ERR_PTR
759 hc_mmc_cmdwork HC15 MMC Host 内部辅助 struct work_struct *work 结构体指针,失败常为 NULL/ERR_PTR
782 hc_mmc_datawork HC15 MMC Host 内部辅助 struct work_struct *work 结构体指针,失败常为 NULL/ERR_PTR
840 hc_cmd_mci_tasklet_func 软中断/tasklet unsigned long priv 见签名
862 hc_mci_tasklet_func 软中断/tasklet unsigned long priv 见签名
934 hc_mmc_interrupt 中断处理 int irq, void *dev_id 见签名
1052 hc_get_cur_voltage 电压 unsigned char index 无(void)
1057 hc_set_gpio_drv GPIO unsigned char index,unsigned char clk_drv,unsigned char data_drv 无(void)
1062 hc_mmc_init_slot 插槽 / 初始化 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
1083 hc_mmc_probe 设备探测入口 struct platform_device *pdev 结构体指针,失败常为 NULL/ERR_PTR
1200 hc_mmc_remove 设备移除 struct platform_device *pdev 结构体指针,失败常为 NULL/ERR_PTR
1217 hc_mmc_suspend 挂起 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
1222 hc_mmc_resume 恢复 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
1262 get_mmc_node 见源码实现 结构体指针,失败常为 NULL/ERR_PTR
1276 hc15_mmc_device_probe 设备探测入口 见签名

drivers\mmc\host\hc15\hc15_mmc-pltfm-hc.c

行号 函数名 作用 主要传参 返回值
128 hc_mmc_host_hw_set_clock 时钟 / 主机 struct hc_mmc_host *host,unsigned int clock 结构体指针,失败常为 NULL/ERR_PTR
160 hc_mmc_host_hw_set_bus_width 总线 / 主机 struct hc_mmc_host *host, unsigned char bus_width 结构体指针,失败常为 NULL/ERR_PTR
180 wait_again_cmd 见源码实现 struct hc_mmc_host *host 0 成功,负 errno 失败(除非另有约定)
208 hc_mmc_host_hw_set_timing 主机 struct hc_mmc_host *host, unsigned char timing 结构体指针,失败常为 NULL/ERR_PTR
239 hc_mmc_host_hw_enable_force_clock 时钟 / 使能 / 主机 struct hc_mmc_host *host, int enable 结构体指针,失败常为 NULL/ERR_PTR
249 hc_mmc_cmd_type HC15 MMC Host 内部辅助 struct mmc_command *cmd, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
263 hc_mmc_resp_type HC15 MMC Host 内部辅助 struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
280 hc_mmc_host_hw_set_cmd 主机 struct hc_mmc_host *host, struct mmc_command *cmd, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
312 hc_mmc_host_hw_start_cmd 主机 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
317 hc_mmc_host_hw_get_cmd_status 主机 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
363 hc_mmc_host_hw_R2_patch 主机 struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
405 hc_mmc_host_hw_get_response 主机 struct hc_mmc_host *host, struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
428 hc_mmc_host_hw_set_block 主机 / 块设备 struct hc_mmc_host *host, unsigned int num_of_blocks, unsigned int block_length 结构体指针,失败常为 NULL/ERR_PTR
436 hc_mmc_host_hw_set_dma DMA / 主机 struct hc_mmc_host *host, dma_addr_t addr, unsigned int length, enum dma_data_direction direction 结构体指针,失败常为 NULL/ERR_PTR
451 hc_mmc_host_hw_set_pio 主机 struct hc_mmc_host *host, u32 direction 结构体指针,失败常为 NULL/ERR_PTR
464 hc_mmc_host_hw_pio_write 写 / 主机 struct hc_mmc_host *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
492 hc_mmc_host_hw_pio_read 读 / 主机 struct hc_mmc_host *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
520 hc_mmc_host_hw_pio_cleanup 主机 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
534 hc_mmc_host_hw_enable_irq 使能 / 中断相关 / 主机 struct hc_mmc_host *host, struct mmc_data *data, int enable 结构体指针,失败常为 NULL/ERR_PTR
545 hc_mmc_host_hw_enable_sdio_irq 使能 / 中断相关 / 主机 struct hc_mmc_host *host, int enable 结构体指针,失败常为 NULL/ERR_PTR
551 hc_mmc_host_hw_get_and_clear_irq 中断相关 / 主机 struct hc_mmc_host *host 结构体指针,失败常为 NULL/ERR_PTR
585 hc_mmc_ip_reset 复位 struct hc_mmc_host *host 无(void)
600 hc_mmc_clock_gate 时钟 struct hc_mmc_host *host, bool clock_gated 无(void)

drivers\mmc\host\hc16\dw_mmc.c

行号 函数名 作用 主要传参 返回值
76 dw_mci_hang_dump DW MMC Host 内部辅助 const char *tag 无(void)
121 dw_mci_fr_note_start DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
217 dw_mci_req_show debugfs 显示 struct seq_file *s, void *v 结构体指针,失败常为 NULL/ERR_PTR
257 dw_mci_req_open 打开 struct inode *inode, struct file *file 结构体指针,失败常为 NULL/ERR_PTR
270 dw_mci_regs_show debugfs 显示 struct seq_file *s, void *v 结构体指针,失败常为 NULL/ERR_PTR
288 dw_mci_regs_open 打开 struct inode *inode, struct file *file 结构体指针,失败常为 NULL/ERR_PTR
301 dw_mci_init_debugfs 初始化 struct dw_mci_slot *slot 结构体指针,失败常为 NULL/ERR_PTR
343 dw_mci_ctrl_reset 复位 struct dw_mci *host, u32 reset 结构体指针,失败常为 NULL/ERR_PTR
364 dw_mci_wait_while_busy 总线 struct dw_mci *host, u32 cmd_flags 结构体指针,失败常为 NULL/ERR_PTR
386 mci_send_cmd 见源码实现 struct dw_mci_slot *slot, u32 cmd, u32 arg 结构体指针,失败常为 NULL/ERR_PTR
405 dw_mci_prepare_command DW MMC Host 内部辅助 struct mmc_host *mmc, struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
475 dw_mci_prep_stop_abort DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
514 dw_mci_set_cto DW MMC Host 内部辅助 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
554 dw_mci_start_command DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_command *cmd, u32 cmd_flags 结构体指针,失败常为 NULL/ERR_PTR
573 send_stop_abort 见源码实现 struct dw_mci *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
581 dw_mci_stop_dma DMA struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
592 dw_mci_get_dma_dir DMA struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
599 mmc_get_dma_dir DMA struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
604 dw_mci_dma_cleanup DMA struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
616 dw_mci_idmac_reset 复位 / DMA struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
624 dw_mci_idmac_stop_dma DMA struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
641 dw_mci_dmac_complete_dma DMA void *arg 见签名
668 dw_mci_idmac_init DMA / 初始化 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
746 dw_mci_prepare_desc64 DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_data *data, unsigned int sg_len 结构体指针,失败常为 NULL/ERR_PTR
818 dw_mci_prepare_desc32 DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_data *data, unsigned int sg_len 结构体指针,失败常为 NULL/ERR_PTR
891 dw_mci_idmac_start_dma DMA struct dw_mci *host, unsigned int sg_len 结构体指针,失败常为 NULL/ERR_PTR
939 dw_mci_edmac_stop_dma DMA struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
944 dw_mci_edmac_start_dma DMA struct dw_mci *host, unsigned int sg_len 结构体指针,失败常为 NULL/ERR_PTR
1000 dw_mci_edmac_init DMA / 初始化 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
1017 dw_mci_edmac_exit DMA / 退出/清理 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
1042 dw_mci_pre_dma_transfer DMA struct dw_mci *host, struct mmc_data *data, bool next 结构体指针,失败常为 NULL/ERR_PTR
1081 dw_mci_pre_req DW MMC Host 内部辅助 struct mmc_host *mmc, struct mmc_request *mrq, bool is_first_req 结构体指针,失败常为 NULL/ERR_PTR
1100 dw_mci_post_req DW MMC Host 内部辅助 struct mmc_host *mmc, struct mmc_request *mrq, int err 结构体指针,失败常为 NULL/ERR_PTR
1118 dw_mci_adjust_fifoth DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
1161 dw_mci_ctrl_thld DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
1214 dw_mci_submit_data_dma DMA struct dw_mci *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
1273 dw_mci_submit_data DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
1341 dw_mci_setup_bus 总线 struct dw_mci_slot *slot, bool force_clkinit 结构体指针,失败常为 NULL/ERR_PTR
1448 __dw_mci_start_request 处理请求 struct dw_mci *host, struct dw_mci_slot *slot, struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
1517 dw_mci_start_request 处理请求 struct dw_mci *host, struct dw_mci_slot *slot 结构体指针,失败常为 NULL/ERR_PTR
1528 dw_mci_queue_request 处理请求 / 队列 struct dw_mci *host, struct dw_mci_slot *slot, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
1555 dw_mci_request struct mmc_host *mmc, struct mmc_request *mrq 结构体指针,失败常为 NULL/ERR_PTR
1580 dw_mci_set_ios DW MMC Host 内部辅助 struct mmc_host *mmc, struct mmc_ios *ios 结构体指针,失败常为 NULL/ERR_PTR
1685 dw_mci_card_busy 总线 struct mmc_host *mmc 结构体指针,失败常为 NULL/ERR_PTR
1699 dw_mci_switch_voltage 电压 struct mmc_host *mmc, struct mmc_ios *ios 结构体指针,失败常为 NULL/ERR_PTR
1736 dw_mci_get_ro DW MMC Host 内部辅助 struct mmc_host *mmc 结构体指针,失败常为 NULL/ERR_PTR
1755 dw_mci_hw_reset 复位 struct mmc_host *mmc 结构体指针,失败常为 NULL/ERR_PTR
1784 dw_mci_get_cd DW MMC Host 内部辅助 struct mmc_host *mmc 结构体指针,失败常为 NULL/ERR_PTR
1815 dw_mci_init_card 初始化 struct mmc_host *mmc, struct mmc_card *card 结构体指针,失败常为 NULL/ERR_PTR
1849 __dw_mci_enable_sdio_irq 使能 / 中断相关 struct dw_mci_slot *slot, int enb 结构体指针,失败常为 NULL/ERR_PTR
1868 dw_mci_enable_sdio_irq 使能 / 中断相关 struct mmc_host *mmc, int enb 结构体指针,失败常为 NULL/ERR_PTR
1882 dw_mci_ack_sdio_irq 中断相关 struct mmc_host *mmc 结构体指针,失败常为 NULL/ERR_PTR
1889 dw_mci_execute_tuning 调谐 struct mmc_host *mmc, u32 opcode 结构体指针,失败常为 NULL/ERR_PTR
1901 dw_mci_prepare_hs400_tuning 调谐 struct mmc_host *mmc, struct mmc_ios *ios 结构体指针,失败常为 NULL/ERR_PTR
1930 dw_mci_request_end struct dw_mci *host, struct mmc_request *mrq) __releases(&host->lock) __acquires(&host->lock 结构体指针,失败常为 NULL/ERR_PTR
1966 dw_mci_command_complete DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_command *cmd 结构体指针,失败常为 NULL/ERR_PTR
2005 dw_mci_data_complete DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_data *data 结构体指针,失败常为 NULL/ERR_PTR
2048 dw_mci_set_drto DW MMC Host 内部辅助 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
2075 dw_mci_clear_pending_cmd_complete DW MMC Host 内部辅助 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
2093 dw_mci_clear_pending_data_complete DW MMC Host 内部辅助 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
2106 dw_mci_tasklet_func unsigned long priv 见签名
2336 dw_mci_set_part_bytes DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2343 dw_mci_push_part_bytes DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2352 dw_mci_pull_part_bytes DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2365 dw_mci_pull_final_bytes DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2372 dw_mci_push_data16 DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2422 dw_mci_pull_data16 DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2455 dw_mci_push_data32 DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2510 dw_mci_pull_data32 DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2543 dw_mci_push_data64 DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2594 dw_mci_pull_data64 DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2628 dw_mci_pull_data DW MMC Host 内部辅助 struct dw_mci *host, void *buf, int cnt 结构体指针,失败常为 NULL/ERR_PTR
2643 dw_mci_read_data_pio struct dw_mci *host, bool dto 结构体指针,失败常为 NULL/ERR_PTR
2697 dw_mci_write_data_pio struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
2751 dw_mci_cmd_interrupt 中断处理 struct dw_mci *host, u32 status 结构体指针,失败常为 NULL/ERR_PTR
2764 dw_mci_handle_cd DW MMC Host 内部辅助 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
2781 dw_mci_interrupt int irq, void *dev_id 见签名
2951 dw_mci_slot_of_parse 插槽 / 解析 struct dw_mci_slot *slot 结构体指针,失败常为 NULL/ERR_PTR
2965 dw_mci_slot_of_parse 插槽 / 解析 struct dw_mci_slot *slot 结构体指针,失败常为 NULL/ERR_PTR
2970 dw_mci_init_slot struct dw_mci *host, unsigned int id 结构体指针,失败常为 NULL/ERR_PTR
3076 dw_mci_cleanup_slot 插槽 struct dw_mci_slot *slot, unsigned int id 结构体指针,失败常为 NULL/ERR_PTR
3084 dw_mci_init_dma DMA / 初始化 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
3176 dw_mci_reset 复位 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
3246 dw_mci_cmd11_timer DW MMC Host 内部辅助 unsigned long arg 见签名
3260 dw_mci_cto_timer DW MMC Host 内部辅助 unsigned long arg 见签名
3316 dw_mci_dto_timer DW MMC Host 内部辅助 unsigned long arg 见签名
3435 dw_mci_enable_cd 使能 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
3463 dw_mci_probe struct dw_mci *host 0 成功,负 errno 失败(除非另有约定)
3709 dw_mci_remove 设备移除 struct dw_mci *host 无(void)
3743 dw_mci_suspend 挂起 struct dw_mci *host 0 成功,负 errno 失败(除非另有约定)
3752 dw_mci_resume 恢复 struct dw_mci *host 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\host\hc16\dw_mmc-pltfm.c

行号 函数名 作用 主要传参 返回值
30 dw_mci_pltfm_prepare_command DW MMC Host 内部辅助 struct dw_mci *host, u32 *cmdr 结构体指针,失败常为 NULL/ERR_PTR
43 dw_mci_pltfm_register struct platform_device *pdev, const struct dw_mci_drv_data *drv_data 0 成功,负 errno 失败(除非另有约定)
79 dw_mci_pltfm_suspend 挂起 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
86 dw_mci_pltfm_resume 恢复 struct device *dev 结构体指针,失败常为 NULL/ERR_PTR
108 dw_mci_pltfm_probe 设备探测入口 struct platform_device *pdev 结构体指针,失败常为 NULL/ERR_PTR
121 dw_mci_pltfm_remove 设备移除 struct platform_device *pdev 0 成功,负 errno 失败(除非另有约定)

drivers\mmc\host\hc16\dw_mmc-pltfm-hc.c

行号 函数名 作用 主要传参 返回值
124 hc_set_gpio_drv GPIO unsigned char index,unsigned char clk_drv,unsigned char data_drv 无(void)
144 hc_get_cur_voltage 电压 unsigned char index 无(void)
164 hc_sys_mmc_src_clk_sel 见源码实现 struct dw_mci *host, u32 src_clk_sel 结构体指针,失败常为 NULL/ERR_PTR
189 hc_sys_mmc_clk_disable 关闭 struct dw_mci *host, u8 disable 结构体指针,失败常为 NULL/ERR_PTR
208 hc_sys_mmc_module_reset_sel 复位 struct dw_mci *host, u8 sel 结构体指针,失败常为 NULL/ERR_PTR
222 hc_sys_mmc_ldo_vol_sel 见源码实现 struct dw_mci *host, u8 sel 结构体指针,失败常为 NULL/ERR_PTR
241 hc_sys_mmc_ldo_mode_sel 见源码实现 struct dw_mci *host, u8 sel 结构体指针,失败常为 NULL/ERR_PTR
262 hc_sys_mmc_tx_drv_clk_phase_sel 见源码实现 struct dw_mci *host, u32 sel 结构体指针,失败常为 NULL/ERR_PTR
278 hc_sys_mmc_tx_drv_clk_inv_sel 见源码实现 struct dw_mci *host, u32 sel 结构体指针,失败常为 NULL/ERR_PTR
296 hc_sys_mmc_tx_drv_clk_dly_sel 见源码实现 struct dw_mci *host, u32 sel 结构体指针,失败常为 NULL/ERR_PTR
312 hc_sys_mmc_rx_sample_clk_phase_sel 见源码实现 struct dw_mci *host, u32 sel 结构体指针,失败常为 NULL/ERR_PTR
328 hc_sys_mmc_rx_sample_clk_inv_sel 见源码实现 struct dw_mci *host, u32 sel 结构体指针,失败常为 NULL/ERR_PTR
345 hc_sys_mmc_rx_sample_clk_dly_sel 见源码实现 struct dw_mci *host, u32 sel 结构体指针,失败常为 NULL/ERR_PTR
363 mmc_clk_cfg_table_get_index MMC Core/协议辅助 uint clock 见签名
406 dwmci_control_clken 见源码实现 struct dw_mci *host, bool on 结构体指针,失败常为 NULL/ERR_PTR
428 dwmci_set_internal_div 见源码实现 struct dw_mci *host, u32 sdc_internal_div 结构体指针,失败常为 NULL/ERR_PTR
448 dwmci_set_use_hold_register 见源码实现 struct dw_mci *host, u32 sdc_uhr 结构体指针,失败常为 NULL/ERR_PTR
460 dwmci_set_clkout_invert 见源码实现 struct dw_mci *host, u32 val 无(void)
472 dwmci_set_sample_clk_sel 见源码实现 struct dw_mci *host, u32 val 结构体指针,失败常为 NULL/ERR_PTR
484 dw_mci_hc1600_parse_dts_timing 解析 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
515 dw_mci_hc1600_apply_dts_timing DW MMC Host 内部辅助 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
541 dw_mci_hc1600_init struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
592 dw_mci_hc1600_set_ios DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_ios *ios 结构体指针,失败常为 NULL/ERR_PTR
597 dw_mci_hc1600_set_clk DW MMC Host 内部辅助 struct dw_mci *host, struct mmc_ios *ios 无符号整型(常为长度/频率)
651 dw_mci_hc1600_parse_dt 解析 struct dw_mci *host 结构体指针,失败常为 NULL/ERR_PTR
655 hc_mmc_set_phase HC15 MMC Host 内部辅助 struct dw_mci_slot *slot, int degrees 结构体指针,失败常为 NULL/ERR_PTR
690 hc_mmc_set_phase_ex HC15 MMC Host 内部辅助 struct dw_mci_slot *slot, int degrees,int num_p 结构体指针,失败常为 NULL/ERR_PTR
726 dw_mci_tuning_test 调谐 struct dw_mci_slot *slot, u32 opcode, struct dw_mci_tuning_data *tuning_data, u8 *blk_test 结构体指针,失败常为 NULL/ERR_PTR
793 find_one_ranges 见源码实现 const u8 *arr, int n, struct range_t *out, int out_cap 结构体指针,失败常为 NULL/ERR_PTR
820 hc_mmc_set_phase_dly HC15 MMC Host 内部辅助 struct dw_mci_slot *slot, int phase,int dly 结构体指针,失败常为 NULL/ERR_PTR
846 hc_mmc_set_phase_dly_by_range HC15 MMC Host 内部辅助 struct dw_mci_slot *slot,u8 phase_try_cnt,u8 delay_try_cnt,u8 real_combined_mid 结构体指针,失败常为 NULL/ERR_PTR
887 dw_mci_hc1600_execute_tuning 调谐 struct dw_mci_slot *slot, u32 opcode 结构体指针,失败常为 NULL/ERR_PTR
1065 dw_mci_hc1600_switch_voltage 电压 struct mmc_host *mmc, struct mmc_ios *ios 结构体指针,失败常为 NULL/ERR_PTR
1102 dw_mci_hc1600_setup_clock_for_slot 时钟 / 插槽 struct dw_mci *host, struct dw_mci_slot *slot, struct mmc_ios *ios 结构体指针,失败常为 NULL/ERR_PTR
1128 dw_mci_hichip_pltfm_probe struct platform_device *pdev 结构体指针,失败常为 NULL/ERR_PTR
1142 dw_mci_hichip_pltfm_remove 设备移除 struct platform_device *pdev 结构体指针,失败常为 NULL/ERR_PTR
1175 get_mmc_node 见源码实现 结构体指针,失败常为 NULL/ERR_PTR
1188 hcmmc_device_probe 见签名

附录 A. 建议阅读顺序

  1. 本文第 2 章流程图
  2. Host:dw_mmc-pltfm-hc.cdw_mmc-pltfm.cdw_mmc.c(probe + request_end)
  3. Core:host.c(add_host)→ core.c(rescan / wait_for_req)→ sdio_io.c / sdio_ops.c
  4. Card:queue.cblock.c(若做存储)
  5. 对照板级 DTS mmc { hcrtos-compatible = "hichip,dw-mshc"; ... }

附录 B. 相关文档

  • docs/ATBM_SDIO_DW_MMC_PACKET_FLOW.md:ATBM WiFi 与 DW MMC 收发包包路径

附录 C. 统计

  • 扫描函数定义数:809
  • 扫描结构体定义数:40
  • 源文件范围:drivers/mmc/{core,card,host} .c/.h\
相关推荐
fhq_fn_jgd2 小时前
51单片机(中断,定时器)
stm32·单片机·嵌入式硬件
hahaha60162 小时前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
云泽8083 小时前
STM32 USART 详解(六):HAL库初始化及阻塞式收发源码拆解
stm32·单片机·嵌入式硬件
linx2953 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
无忧.芙桃3 小时前
嵌入式(一):嵌入式历史与计算机基础:从 ENIAC 到 MCU 四大技术方向
c语言·单片机·嵌入式硬件·计算机
嵌入式er4 小时前
经纬恒润(成都)嵌入式一面 + 二面
单片机·嵌入式硬件
POMAGTOR4 小时前
【磁吸 POGOPIN 连接器 汽车医疗机器人弹簧顶针】
嵌入式硬件·机器人·汽车
clear sky .5 小时前
内存8字节对齐是什么?
c语言·stm32·嵌入式硬件
辰域电子5 小时前
STM32项目开源:智能安防与燃气监测系统(代码+原理图+仿真)
stm32·单片机·嵌入式硬件·开源·毕业设计·proteus