SDIO驱动(6)命令的构建和发送

本文详细介绍了SDIO驱动中命令的构建过程,包括mmc_command结构体的使用和CMD52命令的构建方法。同时,文章解析了命令发送的步骤,如通过mmc_io_rw_direct_host函数调用mmc_wait_for_cmd发送命令,并讨论了数据传输的完成状态和错误处理机制。内容深入到传输请求mmc_request的构建和等待事件的完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值