sdio代码分析
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,1、SDIO扫描函数调用流程dw_mci_probe(zx29_mmc.c)-->dw_mci_init_slot(zx29_mmc.c)-->Mmc_alloc_host(host.c)-->INI
千家信息网最后更新 2025年01月23日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安全错误
数据库的锁怎样保障安全
石嘴山软件开发怎么样
网络安全app管理
计算机系统与网络技术
数据库中loop
甘肃时代网络技术服务代理商
网络安全集中治理专题
三星svoice网络服务器错误
access数据库查询用途
临安安卓软件开发
怎么往网页中添加数据库
gpu服务器显卡哪个合算
北京蓝鲸鱼网络技术有限公司
交通银行总行软件开发中心编制
网络技术自我评价
前端查询会给数据库对应id吗
python软件开发宁波招聘
哪些网络技术可以实现在线学习
广州云企网络技术
原型 软件开发模型
陆丰软件开发技术
嵌入式软件开发视频
替换数据库中一行数据
大话2手游服务器查询
守望先锋捞月狗数据库
固原分销系统软件开发
上海销售软件开发
机器人软件开发与应用专业
netbeans数据库
手机怎么老是连接不上服务器
遍历数据库