Linux设备驱动子系统第二弹 - SD卡 联系客服

发布时间 : 星期一 文章Linux设备驱动子系统第二弹 - SD卡更新完毕开始阅读5a98ddd680eb6294dd886c8a

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 */

struct sdio_cis cis; /* common tuple info */ ... ... };

mmc_card结构体内的数据结构主要存放SD卡的信息,其中RCA, CID, CSD, SCR为SD卡内部的32位寄存器。

2.1.2 struct mmc_request 结构体mmc_request定义于/include/linux/mmc/core.h,它主要存放两大数据结构的指针,分别是cmd和data,顾名思意,一个为指令,一个为数据,也就是说,mmc_request结构体存放了进行主控制器与sd卡间通信所需要的指令和数据,struct mmc_request, struct mmc_command *cmd, struct mmc_data *data三者之间的关系如下所示,

struct mmc_request { struct mmc_command *cmd; struct mmc_data *data; struct mmc_command *stop;

void *done_data; /* completion data */

void (*done)(struct mmc_request *);/* completion function */ };

说到结构体mmc_command和mmc_data,就必须说说SD卡的协议了。 1) 物理结构

SD卡有9个pin脚(micro-SD为8个,少一个接地pin脚),如图所示,

SD的数据传输方式有两种,普通SD模式和SPI模式,以SD模式为例,9个pin脚分别是VDD,VSS,CLK,以及我们需要关注的一根指令线CMD,4根数据线DAT0~DAT3。 2) 传输模式

首先由主机向SD卡发送命令command,等待SD卡的回复response,如果成功收到回复,则进行数据传输。其中,指令线和数据线上传输的指令和数据都要遵循相应的协议格式。

3) 指令格式