关于EMMC和SD卡-设备驱动(1)

eMMC和SD卡都是将闪存控制器和NAND Flash封装在一起,只是接口不同,eMMC一般是BGA封装,焊接在PCB上,SD卡单独封装,使用SDIO接口通讯。

origin: http://blog.csdn.net/Do_or_Die/article/details/40260101

第一次写这方面的文章,也不怎么会写吧!之前一直在学习uboot代码,其实提到设备驱动就不得不提到内核机制,所以学习驱动必须学习内核机制,希望和所有初学者一起学习、交流!

我主要从事eMMC/SD卡设备驱动的开发,提起SD卡大家都知道就是手机里面的那张小存储卡,而emmc可能就不太清楚了,其实用过手机或平板的都知道,厂商经常会说自己的ROM 16G、32G等,其实这个ROM已经不是当初的概念了,现在这个ROM是用nandflash或者emmc代替,emmc比nandflash的传输速度更快,底层的开发更加方便,不用考虑nandflash的坏块处理。所以大家买手机或者平板是可关注下ROM用的是什么芯片。

SD卡和emmc的接口和传输协议都类似,所以它们代码都放在/common/drive/mmc/文件夹下,按照驱动的架构分为三层分别存放在三个文件夹下面/mmc/card,/mmc/core,/mmc/host 三个文件夹下,接下来我主要分析下emmc/sd卡的驱动框架结构,具体代码有待继续学习。

emmc/sd都属于块设备驱动,而块设备驱动是内核驱动中最难的一种,下面是一个典型的块设备驱动的架构,它包括了应用层、内核驱动、硬件三层。

按照这个框架来实现emmc/sd卡的驱动模型,主要是实现其中的内核空间和硬件层。

其实理解驱动框架,主要是理解各个层之间是如何进行通讯的。下面就此分析其中的通讯机制。

(1)Host层

Host层主要是对主机控制器进行描述, 这里以我们公司的xxx_sdio.c为例子进行分析,我们先采用 static int xxx_sdio_probe(struct platform_device *pdev)注册了一个平台设备,接下来重点关注probe函 数。在这个函数中,host层与core层的联系是通过下面三句实现的。首先分配一个mmc_host结构体,接下来对操作该结构体的函数赋值mmc->ops,待会我一一介绍。中间还对mmc结构的很多成员进行了赋值,最后将mmc结构加入到mmc子系统,mmc_alloc_host,以及mmc_add_host 的具体做了什么事情,以后我们具体分析,这三句是些mmc层驱动必须包含的。
mmc = mmc_alloc_host(sizeof(struct xxxsd_platform), &pdev->dev);
mmc->ops     = &xxx_sdio_ops;
……………
xxxmci_ops 中包含了四个函数:
static struct mmc_host_ops xxxmci_ops = {
    .request    = xxxmci_request,
    .set_ios    = xxxmci_set_ios,
    .get_ro        = xxxmci_get_ro,
    .get_cd        = xxxmci_card_present,

};
我们 从简单的开始分析,这些函数都会在core部分被调用:
xxxmci_get_ro:这个函数通过从GPIO读取,来判断我们的卡是否是写保护的
xxxmci_card_present: 这个函数通过从GPIO读取来判断卡是否存在
xxxmci_set_ios:s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
依据核心层传递过来的ios,来设置硬件IO,包括引脚配置,使能时钟,和配置总线带宽。
xxxmci_request: 这个函数是最主要,也最复杂的函数,实现了命令和数据的发送和接收,
当core部分需要发送命令或者传输数据时,都会调用这个函数,并传递mrq 请求。

void xxx_sdio_request(struct mmc_host *mmc, struct mmc_request *mrq);

(2)core层

CORE层完成了不同协议和规范的实现,并为HOST层的驱动提供了接口函数,在HOST层我们曾经调用的两个函数:
mmc_alloc_host(sizeof(struct xxxmci_host), &pdev->dev);
mmc_add_host(mmc );
我 们就从这两个函数入手,来分析CORE层与HOST层是如何交互的。

它们的作用主要是扫描和初始化SD卡和emmc,并将其添加到系统设备模型中。其具体的代码将在以后的文章中具体分析。

(3)CARD层
因为SD卡和emmc都是块设备,当然需要提供块设备的驱动程序,这部分就是实现了将SD卡和emmc如何实现为块设备的。这些代码都在CARD文件夹下的block.c文件中。它主要实现了建立设备节点通过请求队列机制进行数据传输。

每层都会涉及到内核机制中的很多东西,在以后的文章中会对每一个函数进行分析。理解的东西不多,还需继续努力!


  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值