sdio代码分析
发表于:2025-02-24 作者:千家信息网编辑
千家信息网最后更新 2025年02月24日,1、SDIO扫描函数调用流程dw_mci_probe(zx29_mmc.c)-->dw_mci_init_slot(zx29_mmc.c)-->Mmc_alloc_host(host.c)-->INI
千家信息网最后更新 2025年02月24日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安全错误
数据库的锁怎样保障安全
黄浦区购买网络技术服务价格合理
书签制作网络安全
高中信息技术数据库的初步认识
湖南会计软件开发资格
点游族网络技术有限公司
数据库一体机的定义
软件开发目标市场
专业性网络技术推广服务保障
菁宁庭网络技术服务部
如何查看数据库一个表有多大
致成网络技术有限公司怎么样
中国银联服务器项目
图情专业文摘数据库
服务器端口的企业管理器在哪
西藏健康智慧养老软件开发
网络安全有互动才叫普法
钦州网络技术
外接软件开发项目怎么收费
可以到哪个数据库查找
矩阵服务器是什么
连接用户名和邮件服务器
服务器允许程序运行
鑫网匠网络技术有限公司
药厂网络安全员工作总结
浙江统一软件开发设施服务标准
南京交易软件开发中心
陈酿数据库为什么这么强
问卷数据库用什么软件
和田县青年网络技术服务中心
安全许可证服务器