SD卡驱动学习(一)

来源:互联网 发布:undefined动作数据 编辑:程序博客网 时间:2024/06/05 15:44

Sd卡框架

1.主要结构体

struct mmc_host描述卡控制器

/include/linux/mmc/host.h

struct mmc_host {

const structmmc_host_ops *ops;//SD卡主机控制器的操作函数,即主机控制器所具备的驱动能力

struct mmc_card *card;/*device attached to this host */

const structmmc_bus_ops *bus_ops;//SD卡总线驱动操作函数集,SD总线所具备的驱动能力

struct mmc_ios ios;/*currentiobus settings */

。。。。。

}

struct mmc_card描述卡,当中主要存放SD卡的信息,即卡内部的寄存器信息。

/include/linux/mmc/card.h

struct mmc_card {

struct mmc_host *host;/*the host this device belongs to */

unsigned inttype;/*card type */

u32 raw_cid[4];/*raw card CID */

u32 raw_csd[4];/*raw card CSD */

u32 raw_scr[2];/*raw card SCR */

structmmc_cid cid;/*card identification */

struct mmc_csd csd;/*card specific */

struct mmc_ext_csdext_csd;/*mmcv4 extended card specific */

struct sd_scr scr;/*extra SD information */

struct sd_ssrssr;/*yet more SD information */

。。。。。

}

struct mmc_driver描述mmc卡驱动

/include/linux/mmc/card.h

struct mmc_driver {

struct device_driverdrv;

int(*probe)(structmmc_card *);

void(*remove)(structmmc_card *);

int(*suspend)(structmmc_card *, pm_message_t);

int(*resume)(structmmc_card *);

}

struct mmc_host_ops描述卡控制器操作集,用于主机控制器层像core层操作的函数,把core层与具体的主机隔离起来,也就是core通过这个函数指针来操作控制器,而不能直接使用主机控制器的函数。

/include/linux/mmc/host.h

struct mmc_host_ops {

int(*enable)(struct mmc_host *host);

int(*disable)(structmmc_host *host, int lazy);

void (*request)(struct mmc_host *host, struct mmc_request *req);//核心函数,完成主机控制器与SD卡设备间的数据通信

void (*set_ios)(structmmc_host *host, structmmc_ios *ios);//配置时钟、总线、电源、片选、时序等

int (*get_ro)(structmmc_host *host);

int (*get_cd)(struct mmc_host *host);

void (*enable_sdio_irq)(structmmc_host *host, intenable);

/*optionalcallbackfor HCquirks*/

void (*init_card)(struct mmc_host *host, struct mmc_card *card);

}

struct mmc_bus_ops描述SD卡总线的驱动能力

/include/linux/mmc/core.h

structmmc_bus_ops {

int(*awake)(struct mmc_host *);

int(*sleep)(struct mmc_host *);

void(*remove)(structmmc_host *);//拔出SD卡的回调函数

void(*detect)(struct mmc_host *);//探测SD卡是否在SD总线上面的回调函数

int(*suspend)(structmmc_host *);

int(*resume)(struct mmc_host *);

void(*power_save)(struct mmc_host *);

void(*power_restore)(struct mmc_host *);

}

struct mmc_ios配置时钟、总线、电源、片选、时序等

/include/linux/mmc/host.h

struct mmc_ios {

unsigned int clock;/*clock rate */

unsigned short vdd;

unsigned charbus_mode;/*command output mode */

unsignedchar power_mode;/*power supply mode */

unsigned charbus_width;/*data bus width */

unsigned char timing;/*timing specification used */

}

struct mmc_request描述了主机控制器与SD卡间通信需要的指令和数据

/include/linux/mmc/core.h

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

};

struct mmc_command描述主机控制器和SD卡通信命令的结构体

/include/linux/mmc/core.h

struct mmc_command {

u32 opcode;//对应commandindex

u32 arg;//对应命令参数

u32 resp[4];//对应response

unsigned int flags;/*expected response type */

unsigned int retries;/*max number of retries */

unsigned int error;/*command error */

unsignedint erase_timeout;/*in milliseconds */

struct mmc_data *data;/*data segment associated with cmd*/

struct mmc_request *mrq;/*associated request */

}

struct mmc_data描述主机控制器和SD卡通信的数据

/include/linux/mmc/core.h

struct mmc_data {

unsigned int timeout_ns;/*data timeout (inns,max 80ms) */

unsigned int timeout_clks;/*data timeout (in clocks) */

unsigned int blksz;/*data block size */

unsigned intblocks;/*number of blocks */

unsigned int error;/*data error */

unsignedint flags;

unsigned int bytes_xfered;

struct mmc_command *stop;/*stop command */

struct mmc_request *mrq;/*associated request */

unsigned int sg_len;/*size of scatter list */

struct scatterlist *sg;/*I/O scatter list */

}

2.SD的物理结构

Sd卡的pin脚有9个,SD卡的传输方式有两种(SD模式和SPI模式),对于SD模式来说9pin脚分别是VDDVSSGNDCLKCMDDATA0DATA3.

3.SD卡传输(SD2.0协议)

1)传输模式

Sd卡不能自己发送或接受数据,首先由主机向SD卡发送命令command,等待SD卡回复response,如果成功收到回复,传输数据。


2)指令格式

一条command48位,其中commandindex代表具体指令名称,在linux代码里面把39-8位都看做argument认为是指令的参数。



4.linuxSD卡驱动的工作原理

首先linuxSd卡的驱动在/drivers/mmc下面,从文件结构可以看出SD卡在linux中的层次结构


接下来我将从卡的插入和拔出流程,SD卡块设备注册的过程,request以及数据传输的实现来介绍SD卡驱动。