[置顶]Linux设备驱动子系统第二弹 - SD卡 分类: Linux驱动 2010-10-01 19:59 3553人阅读 评论(5) 收藏 举报 1. 总论 2. 主控制器 3. 协议层 4. 块设备 1. 总论 1.1 概念 ? ?
MMC - MultiMedia Card SD - Secure Digital Card
1.2 分类
?
按存储大小,普通SD卡(<=2GB,支持FAT12/FAT16),HCSD卡(>2GB,<=32GB,支持FAT32)
? 按体积大小,普通SD卡,mini-SD卡,micro-SD卡(TF卡)
1.3 速度
? ?
默认模式: 12.5MB/s 高速模式: 25MB/s
1.4 子系统代码结构
Linux源码里/drivers/mmc下有三个文件夹,分别存放了SD块设备,核心层和SD主控制器的相关代码,可以通过Kconfig和Makefile获取更多信息。
2. 主控制器
SD卡的控制器芯片,可以看成CPU的代言人,它为CPU分担了完成与SD卡数据通信的任务。 2.1 数据结构 以PXA芯片的SD控制器驱动为例, struct pxamci_host { struct mmc_host *mmc; struct mmc_request *mrq; struct mmc_command *cmd; struct mmc_data *data; ... ... };
2.1.1 struct mmc_host 结构体mmc_host定义于/include/linux/mmc/host.c,可以认为是linux为SD卡控制器专门准备的一个类,该类里面的成员是所有SD卡控制器都需要的,放之四海而皆准的数据结构,而在PXA芯片控制器的驱动程序pxamci.c中,则为该类具体化了一个对象struct mmc_host *mmc,此mmc指针即指代着该PXA芯片SD卡控制器的一个具体化对象。
struct mmc_host {
const struct mmc_host_ops *ops; // SD卡主控制器的操作函数,即该控制器所具备的驱动能力
const struct mmc_bus_ops *bus_ops; // SD总线驱动的操作函数,即SD总线所具备的驱动能力
struct mmc_ios ios; // 配置时钟、总线、电源、片选、时序等 struct mmc_card *card; // 连接到此主控制器的SD卡设备 ... ... };
struct mmc_host_ops {
void (*request)(struct mmc_host *host, struct mmc_request *req); // 核心函数,完成主控制器与SD卡设备之间的数据通信
void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios); // 配置时钟、总线、电源、片选、时序等
int (*get_ro)(struct mmc_host *host);
void (*enable_sdio_irq)(struct mmc_host *host, int enable); };
struct mmc_bus_ops {
void (*remove)(struct mmc_host *); // 拔出SD卡的回调函数
void (*detect)(struct mmc_host *); // 探测SD卡是否还在SD总线上的回调函数 void (*suspend)(struct mmc_host *); void (*resume)(struct mmc_host *); };
struct mmc_card {
struct mmc_host *host; /* the host this device belongs to */ struct device dev; /* the device */
unsigned int rca; /* relative card address of device */ unsigned int type; /* card type */ unsigned int state; /* (our) card state */ unsigned int quirks; /* card quirks */ u32 raw_cid[4]; /* raw card CID */ u32 raw_csd[4]; /* raw card CSD */ u32 raw_scr[2]; /* raw card SCR */ struct mmc_cid cid; /* card identification */ struct mmc_csd csd; /* card specific */
struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */ struct sd_scr scr; /* extra SD information */
struct sd_switch_caps sw_caps; /* switch (CMD6) caps */ unsigned int sdio_funcs; /* number of SDIO functions */ struct sdio_cccr cccr; /* common card info */