Linux驱动SDIO1

张开发
2026/4/16 1:44:33 15 分钟阅读

分享文章

Linux驱动SDIO1
SDIO协议所有的通信都是由HOST端发出命令开始的。在DEVICE端只要能解析HOST的命令就可以同HOST进行通信了。SDIO的HOST可以连接多个DEVICE。SDIO的信号传输模式有SPI、1-bit、4-bit三种在SDIO总线定义中,DAT1信号线复用为中断线在SDIO的1BIT模式下DAT0用来传输数据DAT1用作中断线。在SDIO的4BIT模式下DAT0-DAT3用来传输数据其中DAT1复用作中断线。全速高速的SDIO卡传输率可以超过100Mbps低速的SDIO卡支援的时脉速率在0至400KHz之间时序读写写数据的传输是分块进行的。数据块后面总是跟着CRC位。单块写CMD24。多块写:CMD25单块读CMD17。多块读:CMD18定义了单块和多块操作。WIFI模块为例单块一般是传输AT指令多块传输数据。数据传输都是以块Block为单位的为512字节的倍数。读写时序一样的只不过指令不同。写是数据从主机到卡读是数据从卡到主机。半双工的。写操作有忙信号机制读操作有超时机制。连续多块写a.主机发送CMD25多块写命令 起始地址b.设备返回R1响应c.循环发送数据块主机发送一个数据块设备拉低DATA0表示忙设备处理完成后释放DATA0主机继续发送下一个块d.主机发送CMD12停止传输命令f.设备返回响应并停止接收忙信号时序每个数据块发送后主机必须轮询DATA0状态,只有DATA0为高电平时才能发送下一个块。最后一块写入完成后仍需等待忙信号释放。这个忙等待时间SDIO卡如WiFi芯片通常较快SD卡可能要清缓冲区的话会慢一些。连续多块读a.主机发送CMD18多块读命令 起始地址b.设备返回R1响应c.主机循环接收数据块设备自动发送下一个数据块无需额外命令主机持续接收数据并校验CRCd.主机发送CMD12停止传输命令f.设备停止发送数据返回响应超时机制发送读命令后若设备在超时时间内未返回数据判定为失败命令第一个字节016位命令第二~五个字节命令 6bit命令号(比如CMD25)32位参数(地址)第六个字节7位CRC1命令类型广播命令bc通过SD总线发送到总线上所有从设备并且不需要应答的命令。需要应答的广播命令bcr通过SD总线发送到总线上所有从设备并且需要所有的从设备分别应答的命令。指向地址的命令ac没有数据传输的到某一个指定从设备的命令。指向地址的数据传输命令adtc对指定的从设备进行数据传输的命令。响应短响应是48bit长响应是136bit。最常用的Linux驱动SDIO接口协议作是一种应用广泛的接口协议其功能被集成在linux的driver/mmc目录下,其中core目录封装了sdio的协议框架定义接口。host目录则为具体的产品设备用到的接口函数的实现。[root100ask:~]# dmesg|grep sdhci #注册操作库的模块 [ 3.987571] sdhci: Secure Digital Host Controller Interface driver [ 3.993955] sdhci: Copyright(c) Pierre Ossman [ 3.998537] sdhci-pltfm: SDHCI platform and OF driver helper #sdhci_esdhc_imx_probe内容 [ 4.007982] sdhci-esdhc-imx 2190000.usdhc: sdhci_pltfm_init: start#设备分配内存并初始化sdhci_host结构体 [ 4.014828] sdhci-esdhc-imx 2190000.usdhc: sdhci_pltfm_init: success, host 88589b40 [ 4.023028] sdhci-esdhc-imx 2190000.usdhc: sdhci_esdhc_imx_probe_dt enter#配置用到的结构体 [ 4.030097] sdhci-esdhc-imx 2190000.usdhc: could not get ultra high speed state, work on normal mode [ 4.039418] sdhci-esdhc-imx 2190000.usdhc: Got CD GPIO [ 4.044889] sdhci-esdhc-imx 2190000.usdhc: sdhci_esdhc_imx_hwinit enter#硬件初始化一些配置补丁 [ 4.051551] sdhci-esdhc-imx 2190000.usdhc: device_set_wakeup_capable will enter#使能唤醒能力 [ 4.059452] sdhci-esdhc-imx 2190000.usdhc: sdhci_add_host enter #sdhci_add_host内容 [ 4.065527] sdhci-esdhc-imx 2190000.usdhc: sdhci_setup_host enter#配置很多结构体 [ 4.071724] sdhci-esdhc-imx 2190000.usdhc: sdhci_do_reset enter mask 1#sdhci_setup_host-sdhci_read_caps-sdhci_do_reset(host, SDHCI_RESET_ALL),#根据结构体注册设备前执行复位 [ 4.078726] sdhci-esdhc-imx 2190000.usdhc: reset enter mask 1 [ 4.085588] sdhci-esdhc-imx 2190000.usdhc: __sdhci_add_host enter#正式配置定时器队列寄存器向总线注册设备 #__sdhci_add_host 内容 [ 4.091746] sdhci-esdhc-imx 2190000.usdhc: sdhci_init enter#设置寄存器硬复位 [ 4.097477] sdhci-esdhc-imx 2190000.usdhc: sdhci_do_reset enter mask 1 [ 4.104545] sdhci-esdhc-imx 2190000.usdhc: reset enter mask 1 [ 4.117850] sdhci-esdhc-imx 2190000.usdhc: mmc_add_host enter#向核心层注册MMC主机SDHCI主机是MMC主机的一种 [ 4.187120] sdhci-esdhc-imx 2190000.usdhc: mmc_rescan enter#注册主机后触发延迟工作队列mmc_detect_change调用mmc_rescan [ 4.187163] sdhci-esdhc-imx 2190000.usdhc: sdhci_init enter#重新初始化重置软件状态机 [ 4.187180] sdhci-esdhc-imx 2190000.usdhc: sdhci_do_reset enter mask 1 [ 4.187213] sdhci-esdhc-imx 2190000.usdhc: reset enter mask 1 [ 4.187230] sdhci-esdhc-imx 2190000.usdhc: sdhci_set_card_detection enter#启用卡插入/拔出的检测机制:根据是否支持卡检测中断配置并写入寄存器 [ 4.219375] sdhci-esdhc-imx 2190000.usdhc: sdhci_set_card_detection enter #下面这个卡扫描不到东西一直在重启 [ 4.227291] sdhci-esdhc-imx 2194000.usdhc: sdhci_pltfm_init: start [ 4.233752] sdhci-esdhc-imx 2194000.usdhc: sdhci_pltfm_init: success, host 8858a340 [ 4.241885] sdhci-esdhc-imx 2194000.usdhc: sdhci_esdhc_imx_probe_dt enter [ 4.249055] sdhci-esdhc-imx 2194000.usdhc: could not get ultra high speed state, work on normal mode [ 4.259070] sdhci-esdhc-imx 2194000.usdhc: sdhci_esdhc_imx_hwinit enter [ 4.265840] sdhci-esdhc-imx 2194000.usdhc: device_set_wakeup_capable will enter [ 4.273396] sdhci-esdhc-imx 2194000.usdhc: sdhci_add_host enter [ 4.279426] sdhci-esdhc-imx 2194000.usdhc: sdhci_setup_host enter [ 4.285683] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 4.292545] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 4.299475] sdhci-esdhc-imx 2194000.usdhc: __sdhci_add_host enter [ 4.305753] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 4.311373] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 4.318283] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 4.325330] sdhci-esdhc-imx 2194000.usdhc: mmc_add_host enter [ 4.394698] sdhci-esdhc-imx 2194000.usdhc: mmc_rescan enter [ 4.394725] sdhci-esdhc-imx 2194000.usdhc: mmc_rescan_try_freq enter [ 4.399743] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.399778] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.399792] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.399819] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.405642] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.405675] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.405688] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.405715] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.424414] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.424447] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.424460] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.424487] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.424548] sdhci-esdhc-imx 2194000.usdhc: mmc_attach_sdio enter [ 4.430690] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.430718] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.430732] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.430758] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.437723] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.437754] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.437769] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.437794] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.443940] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.443970] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.443983] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.444009] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.450954] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.450983] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.450996] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.451022] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.457232] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.457263] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.457276] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.457303] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.464288] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.464319] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.464333] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.464359] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.470703] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.470734] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.470747] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.470775] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.477952] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 2 [ 4.477985] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 2 [ 4.477999] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 4 [ 4.478026] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 4 [ 4.825777] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 5.497882] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 5.503485] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 5.510569] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 5.524461] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 6.336033] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 6.341639] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 6.356337] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 6.369957] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 6.582731] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 6.588573] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 6.596159] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 6.609816] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 7.685934] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 7.691545] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 7.724553] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 7.738248] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 8.017421] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 8.017436] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 8.017452] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 8.030296] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 8.267818] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 8.267830] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 8.267846] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 8.275513] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 9.320419] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 9.326259] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 9.333072] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 9.347617] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 9.770354] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 9.776335] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 9.783152] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 9.797540] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 9.947528] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 9.953139] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 9.960769] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 9.974873] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 11.414815] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 11.420486] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 11.428976] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 11.443831] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 19.435703] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 19.441323] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 19.449374] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 19.463644] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 21.095895] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 21.101504] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 21.109074] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 21.123118] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 21.268612] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 21.274360] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 21.281170] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 21.295509] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 23.052563] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 23.058674] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 23.067199] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 23.081029] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 23.419044] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 23.424925] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 23.431798] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 23.447202] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 25.098726] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 25.104654] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 25.111490] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 25.126618] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 26.087167] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 26.092779] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 26.102258] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 26.116395] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 27.180157] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 27.195805] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 27.202641] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 27.217431] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 27.356574] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 27.362185] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 27.370097] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 27.384636] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 30.476169] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 30.481850] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 30.490974] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 30.505520] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 35.817319] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 35.822994] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 35.831533] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 35.846640] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 40.215388] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 40.221065] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 40.230585] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 40.245105] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 61.016038] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 61.021717] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 61.030656] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 61.045595] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 66.055980] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 66.061660] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 66.070956] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 66.085849] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 69.673629] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 69.684816] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 69.691712] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 69.713192] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 71.095534] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 71.101208] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 71.109665] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 71.124569] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 82.367389] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 82.373066] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 82.382271] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 82.397252] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 88.215278] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 88.220955] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 88.229383] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 88.244213] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 103.839070] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 103.847904] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 103.856816] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 103.870730] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter [ 109.335162] sdhci-esdhc-imx 2194000.usdhc: sdhci_init enter [ 109.340836] sdhci-esdhc-imx 2194000.usdhc: sdhci_do_reset enter mask 1 [ 109.349334] sdhci-esdhc-imx 2194000.usdhc: reset enter mask 1 [ 109.364171] sdhci-esdhc-imx 2194000.usdhc: sdhci_set_card_detection enter1.注册驱动/home/book/100ask_imx6ull-sdk/Linux-4.9.88/drivers/mmc/sdhci.c/home/book/100ask_imx6ull-sdk/Linux-4.9.88/drivers/mmc/sdhci-pltfm.c这两个模块是提供封装好的操作函数和辅助注册平台设备的函数没有调用硬件的内容。所以声明一下模块注册了就好不用注册platform_driver真正的驱动结构体在同目录sdhci-esdhc-imx.c中static struct platform_driver sdhci_esdhc_imx_driver { .driver { .name sdhci-esdhc-imx, .of_match_table imx_esdhc_dt_ids, .pm sdhci_esdhc_pmops, }, .id_table imx_esdhc_devtype, .probe sdhci_esdhc_imx_probe, .remove sdhci_esdhc_imx_remove, }; module_platform_driver(sdhci_esdhc_imx_driver); static const struct of_device_id imx_esdhc_dt_ids[] { { .compatible fsl,imx25-esdhc, .data esdhc_imx25_data, }, { .compatible fsl,imx35-esdhc, .data esdhc_imx35_data, }, { .compatible fsl,imx51-esdhc, .data esdhc_imx51_data, }, { .compatible fsl,imx53-esdhc, .data esdhc_imx53_data, }, { .compatible fsl,imx6sx-usdhc, .data usdhc_imx6sx_data, }, { .compatible fsl,imx6sl-usdhc, .data usdhc_imx6sl_data, }, { .compatible fsl,imx6q-usdhc, .data usdhc_imx6q_data, }, { .compatible fsl,imx6ull-usdhc, .data usdhc_imx6ull_data, }, { .compatible fsl,imx7d-usdhc, .data usdhc_imx7d_data, }, { .compatible fsl,imx7ulp-usdhc, .data usdhc_imx7ulp_data, }, { .compatible fsl,imx8qm-usdhc, .data usdhc_imx8qm_data, }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, imx_esdhc_dt_ids);匹配的设备树在imx6ull.dtsi文件中第n次去100ask_imx6ull-14x14.dts扒拉无果了。usdhc1: usdhc02190000 { compatible fsl,imx6ull-usdhc, fsl,imx6sx-usdhc; reg 0x02190000 0x4000; interrupts GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH; #GIC_SPI 表示共享外设中断中断号 22触发类型为高电平有效 clocks clks IMX6UL_CLK_USDHC1, clks IMX6UL_CLK_USDHC1, clks IMX6UL_CLK_USDHC1; #三个时钟引用但都指向同一个时钟 IMX6UL_CLK_USDHC1 clock-names ipg, ahb, per;#每个时钟用途 assigned-clocks clks IMX6UL_CLK_USDHC1_SEL, clks IMX6UL_CLK_USDHC1; assigned-clock-parents clks IMX6UL_CLK_PLL2_PFD2; assigned-clock-rates 0, 132000000; #USDHC1 时钟路径 #PLL2_PFD2 (396MHz) ──→ [IMX6UL_CLK_USDHC1_SEL选择器] ──→ [分频器] ──→ IMX6UL_CLK_USDHC1(输出)(使用的时钟) # ↑ ↑ ↑ #assigned-clock-parents 可选的父时钟还包括 根据assigned-clock-rates设置的频率自主调整 # PLL2_PFD0、PLL3_PFD1 等 bus-width 4; #DAT0-DAT3 四根数据线 fsl,tuning-step 2;#延迟调优步长为 2 个延迟单元 status disabled; #设备状态disabled 表示该节点在启动时不会被注册为平台设备。板级 .dts 文件中会通过 usdhc1 { status okay; ... } 启用 };2.匹配后进入probe忘记标记了static int sdhci_esdhc_imx_probe(struct platform_device *pdev) { ... /* 为pdev分配并初始化sdhci_host结构体 --------------------- | struct sdhci_host | ← 返回的 host 指针 --------------------- | struct sdhci_pltfm_host | ← 通过 sdhci_priv(host) 访问 --------------------- | 平台私有数据 (priv_size) | ← 通过 sdhci_pltfm_priv(pltfm_host) 访问 --------------------- */ host sdhci_pltfm_init(pdev, sdhci_esdhc_imx_pdata, sizeof(*imx_data)); pltfm_host sdhci_priv(host); imx_data sdhci_pltfm_priv(pltfm_host); //根据设备树或传统 ID 表确定当前芯片的硬件特性(结构体中定义的一堆flags) imx_data-socdata of_id ? of_id-data : (struct esdhc_soc_data *) pdev-id_entry-driver_data; //获取并使能时钟 ... clk_prepare_enable(imx_data-clk_per); clk_prepare_enable(imx_data-clk_ipg); clk_prepare_enable(imx_data-clk_ahb); //配置引脚 imx_data-pinctrl devm_pinctrl_get(pdev-dev); imx_data-pins_default pinctrl_lookup_state(imx_data-pinctrl, PINCTRL_STATE_DEFAULT); //处理quirks ... //调用平台特定的 probe 函数 //全是配置完善这三个结构体的变量 err sdhci_esdhc_imx_probe_dt(pdev, host, imx_data); //硬件底层初始化:一些配置补丁 sdhci_esdhc_imx_hwinit(host); //使能唤醒能力 device_set_wakeup_capable(pdev-dev, 1); //注册 SDHCI 主机 err sdhci_add_host(host); //配置电源管理 pm_runtime_set_active(pdev-dev);//将设备的运行时 PM 状态强制设置为 active pm_runtime_set_autosuspend_delay(pdev-dev, 50);//设置自动挂起延迟时间为 50 毫秒 pm_runtime_use_autosuspend(pdev-dev);//启用自动挂起功能 pm_suspend_ignore_children(pdev-dev, 1);//在系统挂起时忽略子设备的状态 pm_runtime_enable(pdev-dev);//启用PM 框架 return 0; }

更多文章