SD/MMC子系统之一——插卡、检测

一、SDHCI与控制器驱动

  SDHC:Secure Digital(SD) Host Controller,是指一套sd host控制器的设计标准,其寄存器偏移以及意义都有一定的规范,并且提供了对应的驱动程序,方便vendor进行host controller的开发。
  厂商按照这套标准设计host controller之后,可以直接使用sdhci driver来实现host controller的使用,(qcom和samsung都使用了这套标准)。而vendor只需要实现平台相关的部分、如clock、pinctrl、power等等的部分即可。
  关于这个标准,可以参考《SDHC_Ver3.00_Final_110225》。
  注意,强调一下,这是一种mmc host controller的设计标准,其本质上还是属于mmc host。并且,其兼容mmc type card,而不是说只能使用于sd type card。

  SDHCI:Secure Digital(SD) Host Controller Interface,是针对SDHC标准的驱动接口。

  其常见接口如:

    sdhci_pltfm_init:平台设备SDHCI初始化,主要是分配、设置sdhci_host,最终关联到platform_device的device

    sdhci_alloc_host:分配sdhci_host

      mmc_alloc_host:分配、设置mmc_host(卡检测的扫描工作队列)

    sdhci_add_host:设置sdhci_host,关联到mmc_host,并注册mmc_host

      sdhci_setup_host:设置sdhci_host  

二、卡检测的初始化:

  自定义SDHC驱动初始化调用platform_driver_register平台注册用户platform_driver。

  其中自定义SDHC驱动的probe会分配sdhci_host、sdhci_pltfm_host内存,并对sdhci_host进行设置

  然后进行关联mmc_host、sdhci_host、sdhci_pltfm_host。

  然后调用SDHCI接口sdhci_add_host,将得到的sdhci_host注册到sdhci core中。

  SDHCI接口sdhci_add_host会设置sdhci_host,并调用下级__sdhci_add_host。

  SDHCI接口__sdhci_add_host

    设置请求处理完成时调用的任务队列处理函数sdhci_tasklet_finish

    设置当前请求命令的响应定时处理函数sdhci_timeout_timer

    设置当前数据交互的响应定时sdhci_timeout_data_timer

    设置等待队列的缓冲区读准备中断

    设置sdhci_host

    设置外部中断

    注册LE灯

    调用mmc_add_host

    使能卡检测sdhci_enable_card_detection

  其中mmc_add_host添加设备类,调用mmc_start_host开启主机,并注册电源管理通知。

  其中mmc_claim_host声明独占主机,设置电源,使用host->slot.handler_priv->cd_gpio注册线程化中断,执行一次卡检测_mmc_detect_change

二、卡检测的执行:

  因为在启动主机时会执行卡检测,但是这里也不一定会检测成功,因为有可能没插卡。

  除了SDHC驱动以外,还会编写一份控制器驱动,比如海思的himci。

  自定义控制器驱动初始化调用platform_driver_register平台注册用户platform_driver。

  其中自定义SDHC驱动的probe会分配、设置自定义主机属性,其中卡检测函数有三种使用情况:

  1)自定义主机属性的mmc_host_ops的get_cd函数

  2)自定义主机属性的card_status函数

  3)自定义主机属性的定时器

  其中通常插卡检测是由定时器的处理函数检测到的,定时器处理函数的流程为:

  1)通过卡检测寄存器或者IO,连续检查5次SD卡状态,相同则继续,否则重复100次。(次数均为自定义)

  2)如果5次相同则判断其值是否为插入,如果是插入则软复位,初始化自定义主机属性,调用MMC子系统API的mmc_detect_change

  mmc_detect_change调用_mmc_detect_change,两者的区别为电源管理是否唤醒事件,默认为有

  _mmc_detect_change会判断如果设备被配置为唤醒,我们将防止新的休眠5秒,以便为用户提供使用事件的空间。

  然后设置mmc_host->detect_change为1,检测更改

  然后调用mmc_schedule_delayed_work调度工作队列

  mmc_schedule_delayed_work会调用queue_delayed_work执行system_freezable_wq的工作队列,其中使用system_freezable_wq的原因有2个:

  1)它允许同时执行多个工作(不是相同的工作项)。

  2)当用户空间在系统PM期间冻结时,队列将冻结。

  而此处的工作任务为mmc_alloc_host中设置的INIT_DELAYED_WORK(&host->detect, mmc_rescan);

  所以,这里跳转到mmc_rescan

  mmc_rescan:

    根据mmc_host->rescan_disable判断是否允许扫描,如果为真则不允许直接退出。

    根据mmc_host->cap判断是否为不可移动的已注册卡只扫描一次还是可以继续扫描。

    设置mmc_host->rescan_entered=1,表示进入扫描

    调用mmc_bus_get递增总线操作计数

    调用mmc_rescan_try_freq,以四种频率进行初始化SDIO SD EMMC

  mmc_rescan_try_freq

    设置mmc_host->f_init,根据mmc_recan函数传进来的频率参数,一般mmc/sd/sdio的初始化时钟采用的是400kHZ.

    调用mmc_power_up,进行上电。在mmc_add_host时,会调用mmc_start_host,而那里首先是将host掉电的,所以这里上电。

    调用mmc_hw_reset_for_init,有些emmc (VCCQ总是开着的)可能在通电后无法复位,所以如果可能的话,可以进行硬件复位。

    根据不同卡做不同的操作:

    1)纯SD卡,则目标卡不会应答,一般主机host的寄存器会报错,但是这个无关紧要,可以不理它。

    2)纯SDIO卡,那么这里就是复位SDIO卡,通过发送命令CMD52来实现的。

    3)SD卡和SDIO卡的组合卡,则需要先发送CMD52来复位SDIO卡,再复位SD卡,因为CMD52要先于CMD0发送。

    调用mmc_go_idle,发送CMD0,复位SD卡,进入IDLE模式

    调用mmc_send_if_cond,如果是SD卡,则发送CMD8 获取支持的电压值

    根据不同卡做不同的卡检测操作:

    1)SDIO卡,调用mmc_attach_sdio

    2)SD卡,调用mmc_attach_sd

    3)MMC卡,调用mmc_attach_mmc

    4)都不是,则调用mmc_power_off进行下电

  此处以SD卡为例,所以只看mmc_attach_sd

    

原文地址:https://www.cnblogs.com/pokerface/p/11059611.html

时间: 2024-10-09 06:39:09

SD/MMC子系统之一——插卡、检测的相关文章

Smart210学习记录-----SD/MMC/SDIO驱动

转自:http://jingpin.jikexueyuan.com/article/23369.html 一.SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(MultimediaCard) SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代.在维基百科上有相当详细的 SD/MMC 规格说明:[http://zh.wikipedia.org/wiki/Secure

Linux SD/MMC/SDIO驱动分析

一.SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(MultimediaCard) SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代.在维基百科上有相当详细的 SD/MMC 规格说明:[http://zh.wikipedia.org/wiki/Secure_Digital]. SDIO(SecureDigital I/O) SDIO 是目前我们比较关心的技术,

Linux SD/MMC/SDIO驱动分析_转

转自:Linux SD/MMC/SDIO驱动分析    https://www.cnblogs.com/cslunatic/p/3678045.html#3053341 一.SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(MultimediaCard) SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代.在维基百科上有相当详细的 SD/MMC 规格说明:[htt

SD/MMC相关寄存器的介绍

熟悉SD/MMC的相关寄存器对协议的理解有一定的辅助作用,所以这篇文章来介绍一下SD/MMC相关的寄存器有哪些呢? 1.SD卡内部架构 在熟悉SD/MMC相关寄存器之前,我们先来看看SD卡的内部架构是怎么样的,如下图所示: 2.SD/MMC相关寄存器的介绍 从上图中总结出:SD卡内部有7个寄存器. 一.OCR,CID,CSD和SCR寄存器保存卡的配置信息; 二.RCA寄存器保存着通信过程中卡当前暂时分配的地址(只适合SD模式); 三.CSR寄存器卡状态(Card Status)和SSR寄存器SD

SD/MMC卡初始化及读写流程

二.MMC/SD卡的模型和工作原理 PIN脚.SD卡总线.SD卡结构.SD卡寄存器.上电过程 SD卡寄存器: OCR:操作电压寄存器: 只读,32位 第31位: 表示卡上电的状态位 CID: 卡身份识别寄存器 只读 128位 生产厂商.产品ID,生产日期和串号等 CSD: 部分可写 128位 卡的容量.擦出扇区大小.读写最大数据块的大小.读操作的电流.电压等等 CSR: 卡配置寄存器 64位 数据位宽 RCA: 16位 相关的卡地址寄存器,卡识别过程中主控器和卡协商出来的一个地址 三.SD卡命令

SD/MMC的Commands和Responses的总结

SD总线通信是基于指令和数据比特流,起始位開始和停止位结束. SD总线通信有三个元素:1.Command:由host发送到卡设备.使用CMD线发送. 2.Response:从card端发送到host端,作为对前一个CMD的对应,通过CMD线发送: 3.Data:即能从host传输到card,也能从card传输到host.通过data线传输. 一.Commands 下面是四种用于控制卡设备的指令类型,每一个command都是固定的48位长度:1.broadcast commands(bc). no

MMC在一个管理单元检测到错误

遇到的问题,还没有解决. 不想重装系统,尝试过系统修复,以及网络上的各种方法,没有什么作用.打电话给微软客服的时候,微软说要付费才能解决. 前些天设置了了两个自动关机的任务计划,刚好金山跳出说要把sql的两个垃圾文件删掉,删掉之后,设置好的任务计划都没有显示出来,觉得奇怪.然后将电脑时间调了下,可以自动关机.当把时间调到正常,再次进入计算机管理的任务计划马上就跳出如下对话框. 详细信息 FX:{c7b8fb07-bfe1-4c2e-9217-7a69a95bbac4} 系统找不到指定的文件. (

sdio/sd/mmc architecture

三个驱动mmc_core.ko mmc_block.ko omap_hsmmc.ko 读懂一个协议的架构有利于学习源码 参考了 http://processors.wiki.ti.com/index.php/AM335x_MMC/SD_Driver%27s_Guide待续

PatentTips - Method for booting a host device from an MMC/SD device

FIELD OF THE INVENTION The present invention relates to a memory device and especially to the interfaces of memory?cards. More specifically the present invention relates to Multi Media?Cards?(MMC) or Secure Digital (SD-)?cards. There is a trend that