sdio代码分析
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,1、SDIO扫描函数调用流程dw_mci_probe(zx29_mmc.c)-->dw_mci_init_slot(zx29_mmc.c)-->Mmc_alloc_host(host.c)-->INI
千家信息网最后更新 2026年10月31日sdio代码分析
1、SDIO扫描函数调用流程
dw_mci_probe(zx29_mmc.c)-->dw_mci_init_slot(zx29_mmc.c)-->Mmc_alloc_host(host.c)-->INIT_DELAYED_WORK(host.c)创建delayed_work将mmc_rescan放入工作队列。dw_mci_probe(zx29_mmc.c)-->dw_mci_init_slot(zx29_mmc.c)-->Mmc_add_host(host.c)-->mmc_start_host(core.c)-->mmc_detect_change(core.c),在mmc_detect_change中将唤醒工作队列,进行mmc_rescan。mmcrescan-> 分别使用400k、300k、200k,100k的速率调用mmc_rescan_try_freq进行扫描,只要扫描到了设备,就会退出扫描。所以如果在400k速率时扫描到了sdio设备,后面3种速率的扫描就不需要再执行。
- mmcrescantryfreq->
- mmc_power_up->
- sdio_reset->(cmd52,cmd52) 这两个命令都没有回应,这是因为sdio设备刚上电时处于initialization state,对于cmd52命令是不响应的,在这种情况下,这两个命令对sdio设备也是没有任何作用的。如果当前sdio设备处于commond state或transfer state,需要重新扫描sido设备,这两个命令就起作用了,会对sdio设备进行复位;
- mmc_go_idle->(cmd0) 把卡从sd mode切换到spi mode
- mmc_send_if_cond->(cmd8) 该命令对sdio设备为可选命令,可以不用实现。
3. mmcattachsdio->
- 1)mmc_send_io_op_cond->(cmd5) 获取配置
- 2)mmc_sdio_init_card-> response发现sdio设备不支持1.8V,后面不会进行1.8V的切换;同时该sdio设备不支持sd memory,也不需要进行sd memory的相关初始化。
- mmcsendioopcond->(cmd5) 设置配置
- mmcsendrelativeaddr->(cmd3) 获取sdio设备的RCA
- mmcselectcard->(cmd7) 通过RCA选择sdio设备
- sdioreadcccr->(cmd52…) 读取cccr、Card Capability寄存器,用于获取sdio version、CCCR format version、是否支持多块传输、是否支持master功率控制、是否支持高速模式、总线速率选择。
- sdioreadcommoncis->(cmd52…) 读取CIS,用于获取vendor id、device id等。
- sdioenablehs-> 切换到高速模式
- mmcsdioswitchhs->(cmd52…) 切换到高速模式
- sdioenable4bitbus-> 设置SDIO设备bus width,设置控制器bus width
- sdioenablewide->(cmd52…)
3)sdio_init_func-> - sdioreadfbr->(cmd52…) 读取fbr
- sdioreadfunccis->(cmd52…) 读取CIS,读取function的CIS与前面sdio_read_common_cis读取CIS是一样的流程,只是读取CIS的地址不同,CIS的内容也不同而已。 其中一个很重要的参数是:func->max_blksize;
同时如果读到vendor id,device id,就保存在function的结构中,若没读到,就从card->cis.vendor、card->cis.device(sdio_read_common_cis读出来的)copy过来
4)mmc_add_card-> 增加sdio设备
5)sdio_add_func->增加function设备
从整个扫描过程看,没有使用到data线,所以如果sdio设备初始化的时候,能检测到设备,但初始化失败,很大可能那就是data线出问题了。
2、linux sdio读写流程
mmc_request(queue.c)中调用wake_up_process唤醒mmc_queue_thread;
mmc_queue_thread(queue.c)-->
-blk_fetch_request(queue.c)-->获取相应的mmc_request
--mq->issue_fn()(mmc_blk_issue_rq block.c)-->处理request请求
---mmc_blk_issue_rw_rq(block.c)-->对请求队列的数据进行操作,最后调用mmc_wait_for_req
----mmc_start_req(core.c)-->开始处理请求,进入协议的核心层
-----__mmc_start_data_req(core.c)
------mmc_start_request(core.c)
-------host->ops->request()(dw_mci_request zx29_mmc.c)-->调用主机控制层实现真正硬件上请求的处理
设备
命令
支持
速率
切换
两个
模式
流程
队列
高速
处理
控制
不同
作用
同时
工作
选择
配置
很大
重要
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云南咖啡
互联网科技公司排名
国智互联网科技
高科技与互联网
美国互联网科技
北京互联网络科技有限公司
未来的互联网科技
无线互联网科技
赫美联合互联网科技
互联网科技大会
隆华科技工业互联网
昭通互联网科技选哪家
互联网科技研发水平
广州富喜互联网络科技
互联网科技数字货币
陕西彩京云互联网科技有限公司
互联网金融金融科技
杭州科技互联网公司有哪些
六子台科技互联网展会
颐高云石互联网科技
伟宏互联网科技
互联网是不是新科技
互联网扶贫科技
齐家互联网科技有限公司
互联网高科技企业
联恩商钥互联网科技有限公司
海南科技产业互联网平台
栖莱科技互联网股份有限公司
厦门千工互联网科技有限公司
互联网领先科技成果宣传视频