};
unsigned int unsigned int usage;
block_bits; //卡每一块大小所占的bit位
结构mmc_card是一个插卡的特性描述结构,它代有了一个插卡。列出如下(在include/linux/mmc/card.h中):
struct mmc_card { struct list_head struct mmc_host struct device unsigned int 地址 unsigned int #define MMC_STATE_PRESENT 统中
#define MMC_STATE_DEAD #define MMC_STATE_BAD u32 u32 struct mmc_cid 的CID寄存器 struct mmc_csd csd; 器 };
node; *host; dev; rca; //在主设备链表中的节点 // 卡所属的控制器 //通用设备结构
//设备的相对本地系统的//卡的状态
//卡出现在sysfs文件系//卡不在工作状态 //不认识的设备
/* raw card CID */ /* raw card CSD */ //卡的身份鉴别,值来自卡
state;
(1<<0) (1<<1) (1<<2) raw_cid[4]; raw_csd[4]; cid;
//卡特定信息,值来自卡的CSD寄存
结构mmc_host描述了一个MMC卡控制器的特性及操作等,结构mmc_host列出如
下(在include/linux/mmc/host.h中):
struct mmc_host { struct device struct mmc_host_ops unsigned int unsigned int u32 char
*dev; //通用设备结构
*ops; //控制器操作函数集结构 f_min; f_max;
ocr_avail; //卡可用的OCR寄存器值 host_name[8]; //控制器名字
//主控制器中与块层请求队列相关数据 unsigned int max_seg_size; //最大片断的尺寸 unsigned short max_hw_segs; //最大硬件片断数 unsigned short max_phys_segs; //最大物理片断数 unsigned short max_sectors; //最大扇区数 unsigned short unused; //私有数据 struct mmc_ios ios; //当前i/o总线设置 u32 ocr; //当前的OCR设置 struct list_head cards; //接在这个主控制器上的设备 wait_queue_head_t wq; //等待队列 spinlock_t lock; //卡忙时的锁 struct mmc_card *card_busy; //正与主控制器通信的卡 struct mmc_card *card_selected; //选择的MMC卡 struct work_struct detect; //工作结构 };
结构mmc_host_ops是控制器的操作函数集,它包括请求处理函数指针和控制器对卡I/O的状态的设置函数指针,结构mmc_host_ops列出如下:
struct mmc_host_ops { void (*request)(struct mmc_host *host, struct mmc_request *req); void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios); }
结构mmc_ios描述了控制器对卡的I/O状态,列出如下:
struct mmc_ios { unsigned int clock; unsigned short vdd; unsigned char bus_mode; unsigned char power_mode;
//时钟频率 //命令输出模式 //电源供应模式
};
结构mmc_driver是MMC设备驱动程序结构,列出如下:
struct mmc_driver { struct device_driver drv; int (*probe)(struct mmc_card *); void (*remove)(struct mmc_card *); int (*suspend)(struct mmc_card *, u32); int (*resume)(struct mmc_card *); };
(2) 读写请求相关结构
图 MMC卡读写请求结构示意图
对于MMC卡的操作是通过MMC请求结构mmc_request的传递来完成的,来自系统块层的读写请求到达MMC设备抽象层时,用系统的读写请求填充初始化MMC卡的
读写请求,经MMC协议分解后,然后把请求发给设备,再调用具体设备的请求处理函数来完成请求的处理。MMC卡读写请求结构示意图中上图。下面分析MMC卡读写请求相关结构:
结构mmc_request描述了读写MMC卡的请求,它包括命令、数据及请求完成后的回调函数。结构mmc_request列出如下(在include/linux/mmc/mmc.h中):
struct mmc_request { struct mmc_command struct mmc_data struct mmc_command void void 成的回调函数 };
*cmd; *data; *stop;
*done_data; //回调函数的参数
(*done)(struct mmc_request *);//请求完
结构mmc_queue是MMC的请求队列结构,它封装了通用请求队列结构,加入了MMC卡相关结构,结构mmc_queue列出如下(在drivers/mmc/mmc_queue.h中):
struct mmc_queue { struct mmc_card struct completion wait_queue_head_t struct semaphore unsigned int struct request int request *);
//发出读写请求函数 int request *); void struct request_queue struct scatterlist };
*card; //MMC卡结构
thread_complete; //线程完成结构 thread_wq; //等待队列 thread_sem; flags;
*req; //通用请求结构
(*prep_fn)(struct mmc_queue *, struct
(*issue_fn)(struct mmc_queue *, struct *data;
*queue; //块层通用请求队列 *sg; //碎片链表
结构mmc_data描述了MMC卡读写的数据相关信息,如:请求、操作命令、数据及状态等。结构mmc_data列出如下(在include/linuc/mmc/mmc.h中):
struct mmc_data { unsigned int timeout_ns; //数据超时( ns,最大80ms) unsigned int timeout_clks; //数据超时(以时钟计数) unsigned int blksz_bits; //数据块大小的bit位 unsigned int blocks; //块数 unsigned int error; //数据错误 unsigned int flags; //数据操作标识
#define MMC_DATA_WRITE (1 << 8) #define MMC_DATA_READ (1 << 9) #define MMC_DATA_STREAM (1 << 10) unsigned int bytes_xfered; struct mmc_command *stop; //停止命令 struct mmc_request *mrq; //相关的请求 unsigned int sg_len; //碎片链表的长度 struct scatterlist *sg; // I/O碎片链表指针 };
结构mmc_command描述了MMC卡操作相关命令及数据、状态信息等,结构列出如下:
struct mmc_command { u32 u32 u32 unsigned int #define MMC_RSP_NONE #define MMC_RSP_SHORT #define MMC_RSP_LONG #define MMC_RSP_MASK #define MMC_RSP_CRC #define MMC_RSP_BUSY
opcode; arg; resp[4]; flags; (0 << 0) (1 << 0) (2 << 0) (3 << 0) (1 << 3) (1 << 4)
//期望的反应类型
/* expect valid crc */
/* card may send busy */