Linux 2.6.38
1、command的构建
MMC子系统是主从式的架构,数据的传输由host通过命令进行请求和发送。kernel中命令由结构体mmc_command表示:
struct mmc_command {
u32 opcode; // Command的操作码
u32 arg; // Command携带的参数
u32 resp[4]; // Command发出后,如果需要应答,结果保存在resp数组中,最多可以保存128bits的应答
unsigned int flags; // 保存该命令所期望的应答类型
unsigned int retries; // 指明最多可重发的次数
unsigned int error; // 如果最终还是出错,通过该字段返回错误的原因,例如ETIMEDOUT、EILSEQ、EINVAL、ENOMEDIUM等
unsigned int erase_timeout; /* in milliseconds */
struct mmc_data *data; /* data segment associated with cmd */
struct mmc_request *mrq; /* associated request */
};
struct mmc_data结构定义传输数据内容:
struct mmc_data {
unsigned int timeout_ns; /* data timeout (in ns, max 80ms) */
unsigned int timeout_clks; /* data timeout (in clocks) */
unsigned int blksz; /* data block size */
unsigned int blocks; /* number of blocks */
unsigned int error; /* data 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; /* stop command */
struct mmc_request *mrq; /* associated request */
unsigned int sg_len; /* size of scatter list */
struct scatterlist *sg; /* I/O scatter list */
}
error,如果数据传输出错,错误值保存在该字段。
flags,指明数据传输方向,可采用下面定义的宏。
sg,struct scatterlist类型的数组,保存需要传输的数据。
sg_len,sg数组的大小。
我们知道,数据传输有两种方式,一种使用内存存放收发数据,另一种就是DMA。使用DMA的时候涉及数据的scatter/gather,就需要一个scatterlist数组。
传输请求mmc_request:
struct mmc_request {
struct mmc_command *cmd;
struct mmc_data *data;
struct mmc_command *stop;
void *done_data