mmcdriver 源码全面分析文档
生成说明:基于
mmcdriver源码树(HC15/HC16 Host + MMC Core + Card/Block)静态分析整理。源码根目录:
drivers/mmc/公共头文件:
linux/include/linux/mmc/(内核 third_party)函数清单由源码扫描得到(约 800+ 函数定义),关键路径辅以人工解读。
目录
- 总体架构
- 关键流程图
- 全局变量分析
- 结构体分析
- [Host 驱动(HC15/HC16)](#Host 驱动(HC15/HC16))
- [Core 层](#Core 层)
- [Card/Block 层](#Card/Block 层)
- 全量函数目录
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 式平台驱动
- HC16 :
module_platform_driver(dw_mci_pltfm_driver),driver.name = "dw_mmc_hc",of_match_table→compatible = "hichip,dw-mshc",probe→dw_mci_pltfm_register()→dw_mci_probe()。 - HC15 :
module_platform_driver(hc_mmc_driver),driver.name = "hc-mmc",compatible = "hichip,mmc",probe→hc_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,
};
-
HC16 :
module_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_probe→dw_mci_pltfm_register
-
HC15 :
module_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 约定):
- FDT 节点挂在
/hcrtos/...路径下(由fdt_node_probe_by_path查找); - 板级 DTS 写
hcrtos-compatible(不是标准 Linuxcompatible);of_device_is_compatible()在fdt_api.c中读该属性。取值仍为hichip,dw-mshc(HC16)或hichip,mmc(HC15); register_simple的 driver 名字 必须与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_board 在 linux/mmc/dw_mmc.h):
| 结构体 | 含义 |
|---|---|
struct dw_mci_slot |
单 slot:mmc/host、ctype、mrq、queue_node、clock/__clk_old、flags(DW_MMC_CARD_PRESENT 等)、id、sdio_id |
struct dw_mci_drv_data |
平台回调:init、setup_clock、setup_clock_for_slot、prepare_command、set_ios、parse_dt、execute_tuning、prepare_hs400_tuning、switch_voltage |
struct dw_mci |
控制器全局:锁、MMIO、cur_slot/mrq/cmd/data、DMA、tasklet、pending_events/state/queue、bus_hz、slot[]、quirks、定时器 cmd11/cto/dto 等 |
struct dw_mci_board |
num_slots、quirks、bus_hz、caps/caps2、fifo_depth、detect_delay_ms、dma_ops |
enum dw_mci_state |
STATE_IDLE → SENDING_CMD → SENDING_DATA → DATA_BUSY → SENDING_STOP 等 |
导出 API :dw_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_ops(dw_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->clock、dw_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-slots、broken-cd、fifo-depth、clock-frequency、可选 drv_data->parse_dt |
→ dw_mci_board |
dw_mci_init_slot |
mmc_alloc_host、dw_mci_ops、clock-freq-min-max、mmc_add_host |
HCRTOS 调试 :dw_mci_hang_dump、dw_mci_fr_* 冻结请求时间线。
其余函数(简表)
dw_mci_reset、dw_mci_ctrl_reset、mci_send_cmd、dw_mci_prepare_command、dw_mci_submit_data/dw_mci_submit_data_dma、dw_mci_*_pio、dw_mci_command_complete/dw_mci_data_complete、dw_mci_cto_timer/dw_mci_dto_timer/dw_mci_cmd11_timer、dw_mci_remove/suspend/resume、dw_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_register、dw_mci_pltfm_remove、dw_mci_pltfm_pmops。
dw_mmc-pltfm.c
用途 :通用 platform 封装 (devm_kzalloc(dw_mci)、platform_get_irq/MEM、dw_mci_probe)。
dw_mci_pltfm_prepare_command:设置SDMMC_CMD_USE_HOLD_REG(socfpga/pistachiodrv_data)。#if 0包住标准module_platform_driver(dw_mci_pltfm_driver)与snps,dw-mshc匹配表------本 HCRTOS 构建不 用此入口,仅用dw_mmc-pltfm-hc.c的hichip,dw-mshc驱动。
| 函数 | 作用 |
|---|---|
dw_mci_pltfm_register |
填充 host 并 dw_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_table、dw_mci_hc1600_set_clk、execute_tuning(相位/延迟扫描)、switch_voltage(0x18800184 LDO)、hc1600_data → dw_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_slot → dw_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_clk 在 ios->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_data → dw_mci_pltfm_register |
hcmmc_device_probe |
FDT 路径注册 dw_mmc_hc |
HC15:自研 MMC 主机
hc_mmc.h
用途 :hc_mmc_host、hc_mmc_platform_data、hc_mmc_host_ops、事件位、寄存器访问宏。
| 结构体/符号 | 字段含义 |
|---|---|
hc_mmc_platform_data |
num_slots、quirks、bus_hz、detect_delay_ms、max_frequency、caps、cd_gpios/wp_gpios、pin_group |
hc_mmc_host_ops |
set_clock、set_bus_width、set_timing、set_cmd/start_cmd/get_cmd_status/get_response、块/DMA/PIO、IRQ、复位、时钟门控 |
hc_mmc_host |
base/irq、mmc/req/cmd、ops、virt_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_probe、module_driver_late(hc15_mmc_device)。
mmc_host_ops(hc_mmc_ops)
| 回调 | 函数 |
|---|---|
request |
hc_mmc_request |
set_ios |
hc_mmc_set_ios → ops->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_dt、request_irq、hc_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-slots、broken-cd、clock-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_reset、hc_mmc_rto_timer、hc_mmc_sdio_timer、hc_mmc_cmd53_special_proc、hc_mmc_io_rw_extended、hc_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_clock(bus_hz 分频)、set_bus_width、set_timing(REG_BUS_MODE UHS) |
| 命令 | set_cmd、start_cmd、get_cmd_status、get_response(含 R2 patch) |
| 数据 | set_block、set_dma、pio_read/write/cleanup |
| IRQ | enable_irq、enable_sdio_irq、get_and_clear_irq |
| SoC | hc_mmc_ip_reset(0x18800084 bit18)、hc_mmc_clock_gate(0x18800060) |
| 导出 | 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_device → dw_mmc_hc |
hc15_mmc_device → hc-mmc |
以上内容可直接作为仓库内 docs/ 下的 Markdown 章节使用;若需落盘到 ATBM_SDIO_DW_MMC_PACKET_FLOW.md 同级文件,可指定目标路径。
REDACTED
代码路径 :drivers/mmc/core/
公共头文件 :components/kernel/source/third_party/linux/include/linux/mmc/(core.h、host.h、card.h、mmc.h、sd.h、sdio.h、sdio_func.h、dw_mmc.h 等)
本树基于 Linux MMC 子系统移植到 HCRTOS(FreeRTOS 任务名、printf 调试、module_system 等)。Host 控制器典型为 DesignWare MMC (dw_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、request、set_ios、enable_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_ops(core/core.h) |
按卡类型挂接 remove/detect/suspend/reset 等 |
mmc_bus_ops (core 内部):remove、detect、pre_suspend、suspend、resume、runtime_suspend/resume、power_save/restore、alive、shutdown、reset。
二、主调用流程
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 逻辑概要:
- 若已有
bus_ops且可移除卡:调用bus_ops->detect()检测拔卡。 mmc_bus_put()可能在卡已移除时释放 bus。- 无卡且 CD 显示空槽:
mmc_power_off()。 - 否则
mmc_claim_host(),按freqs[](400k→100k)循环mmc_rescan_try_freq():mmc_power_up→ 可选mmc_hw_reset_for_initsdio_reset()(CMD52,SD/eMMC 可忽略)mmc_go_idle→mmc_send_if_cond- 探测顺序(固定) :
mmc_attach_sdio→mmc_attach_sd→mmc_attach_mmc
- 非
MMC_CAP_NEEDS_POLL时结束;否则每秒再调度 detect。
各 attach 入口(均需 host 已 claim):
| 函数 | 文件 | 要点 |
|---|---|---|
mmc_attach_sdio |
sdio.c |
mmc_send_io_op_cond → mmc_attach_bus(&mmc_sdio_ops) → mmc_sdio_init_card → mmc_add_card → 各 sdio_add_func |
mmc_attach_sd |
sd.c |
mmc_send_app_op_cond → mmc_attach_bus(&mmc_sd_ops) → mmc_sd_init_card → mmc_add_card |
mmc_attach_mmc |
mmc.c |
开漏总线 → mmc_send_op_cond → mmc_attach_bus(&mmc_ops) → mmc_init_card → mmc_add_card |
mmc_add_card()(bus.c)注册 mmc 总线设备,触发块设备或其它 mmc_driver 的 probe。
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_direct → mmc_wait_for_cmd(不经 data 阶段)。
Host 占用 :驱动应 sdio_claim_host(func) → 内部 mmc_claim_host(card->host)。
三、公共头文件要点(摘要)
core.h:mmc_command/mmc_data/mmc_request;导出mmc_wait_for_req、mmc_claim_host、mmc_erase、mmc_switch等。host.h:mmc_ios、mmc_host_ops、mmc_host(caps、OCR、claim、detect work、bus_ops、context_info);mmc_alloc_host/mmc_add_host。card.h:mmc_card、CID/CSD/ext_csd/SD 能力位、mmc_dev_to_card。sdio_func.h:sdio_func、sdio_driver、sdio_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本地定义。
重要全局/静态 :workqueue(kmmcd)、freqs[]、use_spi_crc、sd_max_clk、mmc_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_busy;ops->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->ios 并 mmc_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_erase 及 mmc_can_* |
擦除/trim/discard 能力 | int/bool |
mmc_init |
注册 mmc/sdio bus、workqueue | 模块入口 |
主要结构 :使用 mmc_request、mmc_host、mmc_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_alloc、INIT_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_idr、mmc_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_ops(mmc_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_tpl、cis_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-emmc;mmc_pwrseq_alloc/free;pre_power_on/post_power_on/power_off |
pwrseq_simple.c |
GPIO reset/电源脚时序 |
pwrseq_emmc.c |
eMMC 硬件复位线 + reboot notifier |
结构 :mmc_pwrseq、mmc_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_gpio(slot-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)相关的阅读线索
- 枚举 :
mmc_rescan→mmc_attach_sdio→sdio_add_func→sdio_register_driver的 WiFiprobe。 - 数据面 :驱动
sdio_memcpy_*/sdio_readb→mmc_wait_for_req→ dw_mmcrequest。 - 中断 :
sdio_claim_irq→ IRQ 线程或sdio_run_irqs+ hostenable_sdio_irq。 - 挂死分析 :置
mmc_sdio_hang_dbg,或调用mmc_sdio_hang_dump()查看 claim/CMD53 与dw_mci_hang_dump。
六、模块初始化顺序(core.c mmc_init)
alloc_ordered_workqueue("kmmcd")mmc_register_bus()mmc_register_host_class()(空)sdio_register_bus()
Host 驱动在自身 probe 中完成 mmc_add_host,不由此模块直接注册控制器。
以上内容均依据当前 HCRTOS 构建树中 drivers/mmc/core/*.c 与 linux/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_queue;block.c通过register_blockdriver+struct block_operations对接上层,而非完整 Linuxblock_device。
7. Card/Block 层
本章说明块设备队列、mmcblk、以及 sdio_uart / mmc_test。
1. 各文件职责
| 文件 | 职责 |
|---|---|
| block.c | MMC/SD 块设备主驱动 :mmc_driver(mmcblk)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_queue、mmc_blk_request、mmc_queue_req 等)。 |
| blk_req.c | 精简块请求子系统 实现:队列初始化/启停、入队 add_acct_request、blk_fetch_request/blk_peek_request、blk_rq_map_sg(基于 request.data_buf)、完成 blk_end_request*、队列 limit 与 blk_cleanup_queue。 |
| blk_req.h | 块层类型与常量:gendisk、request、request_queue、queue_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 发命令。 |
构建 :Makefile 将 queue.o、block.o、blk_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:brq、sg、bounce 缓冲、mmc_active(含 err_check)、cmd_type、packed。 |
struct mmc_queue |
card、thread、thread_sem、flags(MMC_QUEUE_SUSPENDED / MMC_QUEUE_NEW_REQUEST)、issue_fn、data(通常为 mmc_blk_data *)、queue、mqrq[2]、mqrq_cur/mqrq_prev。 |
2.2 blk_req.h(块抽象)
| 名称 | 说明 |
|---|---|
struct gendisk |
盘描述:card、disk_name、__parts、capacity、queue、sector_size、write_prot、media_present 等。 |
struct request |
__sector、__data_len、sector_ns、data_buf、cmd_flags、rq_disk、q、completion、done、error、done_data_len。 |
struct request_queue |
request_fn、queue_head、queue_lock、queuedata、prep_rq_fn、limits、queue_flags、request_fn_active。 |
struct queue_limits |
段数、扇区/段大小、discard 等限制。 |
2.3 block.c
| 名称 | 说明 |
|---|---|
struct mmc_blk_data |
每槽/每分区队列实例:lock、disk、queue、part 链表、flags(CMD23/REL_WR/PACKED)、usage、read_only、part_type、part_curr、name_idx、reset_done、area_type、retry_cnt。 |
struct sddisk_partition_s |
NuttX 分区节点:firstblock/nblocks、disk_name、register_blockdriver 的 i_private。 |
struct mmc_blk_ioc_data |
Linux 风格 MMC_IOC_* ioctl 内核缓冲(本树若未启用完整 bdev 路径则仅编译保留)。 |
全局/静态(block.c)
block_mutex、open_lockperdev_minors(默认CONFIG_MMC_BLOCK_MINORS= 8)max_devices、dev_use[]、name_use[](设备号分配)encrypt_data_tmp(可选 MBR 解密)g_sd_offset(FAT_DEBUG)mmc_driver:probe/remove/shutdown,module_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_locksdio_uart_tty_driver、sdio_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_FS 或 REQ_DISCARD;卡移除或 RPMB 队列则 kill。 |
mmc_queue_thread |
mq |
0 |
mmcqd 主循环:blk_fetch_request → issue_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_SUSPENDED、blk_stop_queue、down(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_sg 再 sg_init_one 到 bounce_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.c :md->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_len 与 max_segment_size 切 SG。 |
blk_end_request |
rq, error, nr_bytes |
bool(恒 false) |
设 error、done_data_len,request_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.c :complete(&req->completion)。 |
内联 :rq_data_dir(rq)、queue_max_segment_size、blk_queue_* 状态位测试等见 blk_req.h。
3.3 block.c(主路径)
模块与探测
| 函数 | 返回 | 作用 |
|---|---|---|
mmc_blk_init |
0 / 负值 |
算 max_devices、可选分配 encrypt_data_tmp、mmc_register_driver(&mmc_driver)。 |
mmc_blk_exit |
0 |
反注册、释放加密缓冲。 |
mmc_blk_probe |
0 / -ENODEV 等 |
检查 CCC_BLOCK_READ、blk_fixups、mmc_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_queue、issue_fn = mmc_blk_issue_rq、disk_name = mmcblkN。 |
mmc_blk_alloc_parts |
0 / 负 errno |
eMMC 引导/GP/RPMB 等子 mmc_blk_data。 |
mmc_add_disk(NuttX) |
0 / 负 errno |
注册 /dev/mmcblkN、parse_block_partition → sddisk_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 |
完成扇区数 | 构造栈上 request → add_acct_request → wait_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_card;mmc_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_prep → mmc_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_sg、bounce_pre、mmc_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 |
组 mrq,mmc_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_driver、tty_register_driver、sdio_register_driver;sdio_uart_exit反注册。 - probe/remove :
sdio_uart_probe(解析 tuple 0x91、sdio_uart_add_port、tty_port_register_device)、sdio_uart_remove。 - 数据面 :
sdio_uart_irq→sdio_uart_receive_chars/transmit_chars;sdio_uart_write等 tty 操作集。
3.5 mmc_test.c(概览)
- 模块 :
mmc_testMMC 驱动,通过 debugfs (mmc_test_register_dbgfs_file)运行用例,不注册块设备。 - 入口 :
mmc_test_init→mmc_register_driver;mmc_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/write的wait_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_prev,mmc_start_req 可在上一 MMC 传输完成前由块层提交下一 mmc_async_req;MMC_QUEUE_NEW_REQUEST 时线程不交换 cur/prev 并重新取队。REQ_FLUSH/REQ_DISCARD 会先 mmc_blk_issue_rw_rq(mq, NULL) 排空进行中的异步读写的 host areq。
5. 与上游 Linux 的差异(阅读代码时注意)
- 无完整 bio :
request.data_buf由__mmc_blk_*直接填入;blk_rq_map_sg按连续缓冲切段。 - 块设备注册 :
register_blockdriver("/dev/mmcblkN", &mmc_bdops, ...),分区名为mmcblkNpM。 - 完成回调 :
request_wait_done在 block.c ,不在blk_req.c。 - Packed 写 :
queue.c/block.c中部分 packed 逻辑被#if 0关掉,运行时以单请求读写为主。 mmc_test/sdio_uart:模块 init 宏多为注释,是否链接进镜像取决于平台 Kconfig/构建脚本。
如需把本文落盘为仓库内 docs/*.md 或补充 core.c 中 mmc_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. 建议阅读顺序
- 本文第 2 章流程图
- Host:
dw_mmc-pltfm-hc.c→dw_mmc-pltfm.c→dw_mmc.c(probe + request_end) - Core:
host.c(add_host)→core.c(rescan / wait_for_req)→sdio_io.c/sdio_ops.c - Card:
queue.c→block.c(若做存储) - 对照板级 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\