linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编1
来源:互联网 发布:mac网页匀速滑动 编辑:程序博客网 时间:2024/05/22 07:48
1. 硬件基础:
SD/MMC/SDIO 概念区分概要
SD (Secure Digital )与 MMC (Multimedia Card )
SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代。
SDIO 是目前我们比较关心的技术,SDIO 故名思义,就是 SD 的 I/O 接口(interface )的意思,不过这样解释可能还有点抽像。更具体的说明,SD 本来是记忆卡的标准,但是现在也可以把 SD 拿来插上一些外围接口使用,这样的技术便是 SDIO 。
所以 SDIO 本身是一种相当单纯的技术,透过 SD 的 I/O 接脚来连接外部外围,并且透过 SD 上的 I/O 数据接位与这些外围传输数据,而且 SD 协会会员也推出很完整的 SDIO stack 驱动程序,使得 SDIO 外围(我们称为 SDIO 卡)的开发与应用变得相当热门。
现在已经有非常多的手机或是手持装置都支持 SDIO 的功能(SD 标准原本就是针对 mobile device 而制定),而且许多 SDIO 外围也都被开发出来,让手机外接外围更加容易,并且开发上更有弹性(不需要内建外围)。目前常见的 SDIO 外围(SDIO 卡)有:
· Wi-Fi card (无线网络卡)
· CMOS sensor card (照相模块)
· GPS card
· GSM/GPRS modem card
· Bluetooth card
· Radio/TV card (很好玩)
SDIO 的应用将是未来嵌入式系统最重要的接口技术之一,并且也会取代目前 GPIO 式的 SPI 接口。
SD/SDIO 的传输模式
SD 传输模式有以下 3 种:
· SPI mode (required )
· 1-bit mode
· 4-bit mode
SDIO 同样也支持以上 3 种传输模式。依据 SD 标准,所有的 SD (记忆卡)与 SDIO (外围)都必须支持 SPI mode ,因此 SPI mode 是「required 」。此外,早期的 MMC 卡(使用 SPI 传输)也能接到 SD 插糟(SD slot ),并且使用 SPI mode 或 1-bit mode 来读取。
SD 的 MMC Mode
SD 也能读取 MMC 内存,虽然 MMC 标准上提到,MMC 内存不见得要支持 SPI mode (但是一定要支持 1-bit mode ),但是市面上能看到的 MMC 卡其实都有支持 SPI mode 。因此,我们可以把 SD 设定成 SPI mode 的传输方式来读取 MMC 记忆卡。
SD 的 MMC Mode 就是用来读取 MMC 卡的一种传输模式。不过,SD 的 MMC Mode 虽然也是使用 SPI mode ,但其物理特性仍是有差异的:
· MMC 的 SPI mode 最大传输速率为 20 Mbit/s ;
· SD 的 SPI mode 最大传输速率为 25 Mbit/s 。
为避免混淆,有时也用 SPI/MMC mode 与 SPI/SD mode 的写法来做清楚区别。
2.MMC 子系统的基本框架结构:
很遗憾,内核没有为我们提供关于MMC 子系统的文档,在谷歌上搜索了很多,也没有找到相关文章。只能自己看代码分析了,可能有很多理解不对的地方,希望研究过这方面的朋友多邮件交流一下。
MMC 子系统的代码在kernel/driver/MMC 下,目前的MMC 子系统支持一些形式的记忆卡:SD,SDIO,MMC. 由于笔者对SDIO 的规范不是很清楚,后面的分析中不会涉及。MMC 子系统范围三个部分:
HOST 部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的。
CORE 部分: 这是整个MMC 的核心存,这部分完成了不同协议和规范的实现,并为HOST 层的驱动提供了接口函数。
CARD 部分:因为这些记忆卡都是块设备,当然需要提供块设备的驱动程序,这部分就是实现了将你的SD 卡如何实现为块设备的。
3.HOST 层分析:
HOST 层实现的就是我们针对特定主机的驱动程序,这里以mini2440 的s3cmci.c 为例子进行分析,我们先采用platform_driver_register(&s3cmci_2440_driver) 注册了一个平台设备,接下来重点关注probe 函数。在这个函数总,我们与CORE 的联系是通过下面三句实现的。首先分配一个mmc_host 结构体,注意sizeof(struct s3cmci_host) ,这样就能在mmc_host 中找到了s3cmci_host ,嵌入结构和被嵌入的结构体能够找到对方在Linux 内核代码中的常用技术了。接下来为mmc->pos 赋值, s3cmci_ops 结构实现了几个很重要的函数,待会我一一介绍。中间还对mmc 结构的很多成员进行了赋值,最后将mmc 结构加入到MMC 子系统,mmc_alloc_host ,以及mmc_add_host 的具体做了什么事情,我们在下节再分析,这三句是些MMC 层驱动必须包含的。
mmc = mmc_alloc_host(sizeof(struct s3cmci_host), &pdev->dev);
mmc->ops = &s3cmci_ops;
……………
s3cmci_ops 中包含了四个函数:
static struct mmc_host_ops s3cmci_ops = {
.request = s3cmci_request,
.set_ios = s3cmci_set_ios,
.get_ro = s3cmci_get_ro,
.get_cd = s3cmci_card_present,
};
我们从简单的开始分析 , 这些函数都会在 core 部分被调用:
s3cmci_get_ro: 这个函数通过从 GPIO 读取,来判断我们的卡是否是写保护的
s3cmci_card_present : 这个函数通过从 GPIO 读取来判断卡是否存在
s3cmci_set_ios : s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
依据核心层传递过来的 ios ,来设置硬件 IO, 包括引脚配置,使能时钟,和配置总线带宽。
s3cmci_request : 这个 函数是最主要,也最复杂的函数,实现了命令和数据的发送和接收,
当 CORE 部分需要发送命令或者传输数据时,都会调用这个函数,并传递 mrq 请求。
static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
{
struct s3cmci_host *host = mmc_priv(mmc);
host->status = "mmc request";
host->cmd_is_stop = 0;
host->mrq = mrq;
if (s3cmci_card_present(mmc) == 0) {
dbg(host, dbg_err, "%s: no medium present ", __func__);
host->mrq->cmd->error = -ENOMEDIUM;
mmc_request_done(mmc, mrq);// 如果卡不存在,就终止请求
} else
s3cmci_send_request(mmc);
}
接下来看 s3cmci_send_request(mmc) :
这个函数先判断一下请求时传输数据还是命令, 如果是数据的话:
先调用 s3cmci_setup_data 来对 S3C2410_SDIDCON 寄存器进行设置,然后设置 SDITIMER 寄存器这就设置好了总线宽度,是否使用 DMA, ,并启动了数据传输模式,并且使能了下面这些中断:
imsk = S3C2410_SDIIMSK_FIFOFAIL | S3C2410_SDIIMSK_DATACRC |
S3C2410_SDIIMSK_DATATIMEOUT | S3C2410_SDIIMSK_DATAFINISH;
解析来判断是否是采用 DMA 进行数据传输还是采用 FIFO 进行数据传输
if (host->dodma)
/ because host->dodma = 0,so we don't use it
res = s3cmci_prepare_dma(host, cmd->data);// 准备 DMA 传输,
else
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编1
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编2
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编写
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编写
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编写
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编写
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编写
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编写(2),一些初始化流程
- Linux SD/MMC/SDIO驱动分析
- Linux SD/MMC/SDIO驱动分析
- Linux SD/MMC/SDIO驱动分析
- linux下SD/MMC/SDIO驱动分析
- Linux SD/MMC/SDIO驱动分析(新)
- SD/MMC/SDIO 驱动分析
- SD/MMC/SDIO驱动
- sd 卡驱动在2.6内核的编写.sd/mmc/sdio kernel,sd/mmc/sdio 内核
- ArcGIS 10.0是否支持64位环境的QA问答结果
- 黑马程序员 动态代理
- 黑马程序员 交通灯管理系统
- cmd命令
- Linux SD/MMC/SDIO
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编1
- 家庭日记2
- linux sd卡驱动分析,基于mini2440,sdio mmc sd卡驱动编2
- C#类型转换
- JS 面向对象选项卡
- Flex中的CSS: (3)CSS会被编译器转换为什么样的AS代码--全局选择器:global
- 程序员的编辑器——VIM
- vim 程式編輯器
- rufus下载页面