sdio代码分析
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,1、SDIO扫描函数调用流程dw_mci_probe(zx29_mmc.c)-->dw_mci_init_slot(zx29_mmc.c)-->Mmc_alloc_host(host.c)-->INI
千家信息网最后更新 2025年12月01日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安全错误
数据库的锁怎样保障安全
数据库索性是什么怎么构建
烟台网络安全工程师招聘
孝感市服务器机柜
联创互联网科技有限公司
普陀区品质软件开发价格咨询
关于数据库设计的案例
花雨庭服务器安全吗
山西太原软件开发工资标准
四川网络技术转让包括什么
软件开发中分析阶段的常用工具
软件开发需求内容如何迭代
c 数据库空
盐城运营软件开发厂家
集群和服务器
南京正规软件开发销售电话
我的世界网易修仙服务器2022
ps4的命运2是哪个服务器
数据库enddate
实时数据库系统对外数据接口要求
play商店 从服务器
数据库 bak文件
早期线性软件开发模型称为
戴尔服务器进阵列卡bios
市政府网络安全保密局
可视化数据库好吗
口碑好的人工智能应用软件开发
服务器密码被黑如何用程序修改
义马软件开发收费
怎么做河南软件开发
win 10服务器版下载