千家信息网

sdio代码分析

发表于:2024-10-11 作者:千家信息网编辑
千家信息网最后更新 2024年10月11日,1、SDIO扫描函数调用流程dw_mci_probe(zx29_mmc.c)-->dw_mci_init_slot(zx29_mmc.c)-->Mmc_alloc_host(host.c)-->INI
千家信息网最后更新 2024年10月11日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。
  1. mmcrescan-> 分别使用400k、300k、200k,100k的速率调用mmc_rescan_try_freq进行扫描,只要扫描到了设备,就会退出扫描。所以如果在400k速率时扫描到了sdio设备,后面3种速率的扫描就不需要再执行。

  2. mmcrescantryfreq->

  • mmc_power_up->
  1. sdio_reset->(cmd52,cmd52) 这两个命令都没有回应,这是因为sdio设备刚上电时处于initialization state,对于cmd52命令是不响应的,在这种情况下,这两个命令对sdio设备也是没有任何作用的。如果当前sdio设备处于commond state或transfer state,需要重新扫描sido设备,这两个命令就起作用了,会对sdio设备进行复位;
  2. mmc_go_idle->(cmd0) 把卡从sd mode切换到spi mode
  3. 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的相关初始化。
    1. mmcsendioopcond->(cmd5) 设置配置
    2. mmcsendrelativeaddr->(cmd3) 获取sdio设备的RCA
    3. mmcselectcard->(cmd7) 通过RCA选择sdio设备
    4. sdioreadcccr->(cmd52…) 读取cccr、Card Capability寄存器,用于获取sdio version、CCCR format version、是否支持多块传输、是否支持master功率控制、是否支持高速模式、总线速率选择。
    5. sdioreadcommoncis->(cmd52…) 读取CIS,用于获取vendor id、device id等。
    6. sdioenablehs-> 切换到高速模式
    7. mmcsdioswitchhs->(cmd52…) 切换到高速模式
    8. sdioenable4bitbus-> 设置SDIO设备bus width,设置控制器bus width
    9. sdioenablewide->(cmd52…)
      3)sdio_init_func->
    10. sdioreadfbr->(cmd52…) 读取fbr
    11. 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安全错误 数据库的锁怎样保障安全 网络安全手抄报范文 云服务器ecs安全组配置 教育网络安全专题宣传片 河源自助点餐软件开发 vb.net 内存数据库 魔兽怀旧服最佳服务器排名 网络安全工作遵循以发展促安全 苹果cms如何删除数据库 linux与网络安全 福安市网络安全诈骗报案电话 暗影之月服务器 网络安全等保测评机构备案 下一代网络技术的毕业论文 锤子手机显示无法连接服务器 申请国家网络安全人才培养基地 软件开发团队管理实验 河南交友软件开发服务费 无锡软件开发月薪2万 苏州聚盛网络技术有限责任公司 银行软件开发社招西安岗位 可以直接考计算机三级网络技术吗 网络技术公司待遇怎么样 张掖华为数据库招聘信息 华为的网络安全中心 Linux网络安全实验 大专软件开发专接本好考吗 分布式测控网络技术讲解 宝山区互联网软件开发厂家要求 数据库是数据管理的最新技术 网络安全工作四个坚持
0