SD卡的驱动(linux操作系统下)

emmc读写速度慢:是1线,还是4,8线,emmc和控制器本身支持的最高速率,还有dts的配置,cache(sync)是否有影响;回写,调度。

s3cmci_probe->mmc_alloc_host(mmc_rescan)->mmc_add_host->mmc_start_host->queue_delayed_work(system_freezable_wq, work, delay)->mmc_rescan->mmc_rescan_try_freq->mmc_attach_mmc->mmc_init_card,mmc_add_card->mmc_alloc_card->drv->probe(mmc_blk_probe)->mmc_blk_alloc->alloc_disk(perdev_minors),mmc_init_queue,add_disk->

block层:实现mmc为块设备,和块设备那套对接,实现并注册卡的驱动,加入到bus上。

core:抽象host,bus ,card实体,向底层提供便利的host要用的api。提供检测卡的插入,向bus注册sd卡。

host:提供并注册host驱动,实现host ops,用platform bus去match。

sd卡插入后的流程:中断检测总线上是否有卡,init card(standy_by),在bus上add card,找到driver match上,probe函数。

nandflash芯片

mmc 卡化

sd卡,比mmc在写保护,速率,容量

inand/emmc 电子产品越来越小,芯片比sd卡卡槽小巧,卡槽插拔次数多了接触不良。

inand/emmc sd卡芯片化,速率和接口,现在是8线io,支持1,4,8线传输模式,sd卡IO线,支持1,4线传输。自己完成ECC校验,不用代码来实现。sd卡内存有个卡的接口控制器,就相当于一个单片机。

形式上,这个部分和i2c非常相似
系统也是分成core层,host层(对应i2c的adapter),设备层
core层:主要功能应该是提供host注册,总线注册,设备注册的几个方法以及所谓sdio总线接口的算法了。
host层:已经是注册一个platform设备,其中应该提供主要sdio接口算法的实现。
设备层:应该是提供几个功能 1)注册块设备,映射到/dev下面的设备节点 2)应该还有设备其他信息。

Host层驱动,主要是填充mmc_host结构体相关内容和实现mmc_host_ops结构体中的函数。最后调用mmc_add_host向MMC core注册host驱动。可以参考S3C24XX的HOST驱动程序(drivers/mmc/host/s3cmci.c,s3cmci.h),上层MMC Core主要调用mmc_host_ops中的函数来实现与硬件交互。

MMC Core层。
该层主要实现了几个结构体函数指针,用来构建整个MMC设备驱动模型。它们是:
struct bus_type mmc_bus_type  /*mmc总线,用来管理sd/mmc卡设备和驱动*/
struct mmc_bus_ops mmc_ops    /*MMC卡总线操作函数,主要是在电源管理方面*/
struct mmc_bus_ops mmc_sd_op  /*SD卡总线操作函数,主要是在电源管理方面*/
struct mmc_bus_ops mmc_sdio_ops  /*SDIO总线操作函数,主要是在电源管理方面*/
struct bus_type sdio_bus_type  /*SDIO另外定义了一条总线*/
core.c文件中实现了几个关键的函数,用来提供给上层MMC Card调用和对SD/MMC卡的侦测函数以及初始化。
供给上层MMC Card调用主要有:
void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq);
int mmc_wait_for_cmd(struct mmc_host *host, struct mmc_command *cmd, int retries);

mmc_attach_xxx函数就是用来完成侦测和初始化的,选择相应的总线操作函数,并产生struct mmc_card结构体,并填充其内容,最后注册一个mmc_card(代表着一个设备),并在注册中由mmc_bus_type结构体的match和probe函数来查找到适合该设备的驱动(这个又牵涉到设备驱动模型,可以查看设备驱动模型相关内容,了解设备和驱动匹配的过程),这里将匹配到mmc card层的MMC_Block(MMC块设备驱动程序,由 struct mmc_driver代表)。在完成设备侦测和初始化以后,以后的操作就是mmc card层中相关的设备驱动程序发出的了。

MMC card层,该层主要实现具体的设备驱动程序,如MMC块设备驱动程序,通过mmc_register_driver注册。如果是SDIO就有可能是其它字符设备驱动程序了,其通过调用sdio_register_driver来注册设备驱动。
总体概括来说:
host层提供驱动相关MMC/SD/SDIO控制器的功能。
Core层提供了具体MMC/SD/SDIO设备侦测和初始化功能,以及电源管理方面的内容和通用的操作功能。
Card为实现具体的设备驱动层。

MMC/SD卡的驱动整个构架由三个文件组成,其实一共就做了两件事件:
1).卡的检测。
2).卡数据的读取。

4.4.1.卡的检测中涉及到的函数
tcc_mmc_probe(host/tcc_sdhc.c) 
 mmc_alloc_host(core/core.c) 
   mmc_rescan(core/core.c) 
  mmc_attach_mmc(core/mmc.c) 
 mmc_init_card(core/mmc.c) 
      mmc_add_card(core/bus.c) 
   device_add 
    mmc_bus_match(core/bus.c) 
    mmc_bus_probe(core/bus.c)                                                      mmc_blk_probe(card/block.c)
      alloc_disk/add_disk

4.4.2.卡中数据读写涉及到的函数
mmc_blk_issue_rq(card/block.c)
 mmc_wait_for_req(core/core.c)
  mmc_start_request(core/core.c)
   host->ops->requset(host,mrq)
     //tcc_sdhc.c中的tcc_mmc_request

core.c

注册sys/bus/mmc

注册sys/class/mmc_host

注册sys/bus/sdio


 

SD 卡驱动分析...................................................................................................................................1 块请求处理(linux/driver/mmc/card).....................................................................................2 1.probe.................................................................................................................................................2 2.do_request......................................................................................................................................13 3.小结................................................................................................................................................24 core 层处理(linux/driver/mmc/core)...................................................................................25 1.core 层初始化................................................................................................................................25 2.mmc_claim_host............................................................................................................................28 3.mmc_release_host..........................................................................................................................31 4.mmc_wait_for_req.........................................................................................................................33 5.mmc_wait_for_cmd.......................................................................................................................35 SD 控制器之初始化(linux/driver/mmc/host).....................................................................37 core 层续集之 mmc_add_host..................................................................................................49 SD 控制器之真正的硬件操作.................................................................................................82 1.s3cmci_get_ro................................................................................................................................83 2.s3cmci_set_ios...............................................................................................................................84 3.s3cmci_request 之命令处理..........................................................................................................86 4.s3cmci_request 之数据传输..........................................................................................................97 小结.........................................................................................................................................113
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值