Linux mmc驱动框架(2)——重要数据结构

概述

数据结构描述
struct mmc_host用来表示一个mmc host控制器
struct mmc_card用来表示一个mmc设备(卡)
struct mmc_iosIO总线相关设置
struct mmc_driver用来表示 mmc 卡驱动
struct mmc_bus_ops总线操作函数集, 有mmc、sd、sdio三种
struct mmc_host_opsHost控制器操作函数集,用来描述卡控制器操作接口函数功能,用于从主机控制器层向 core 层注册操作函数,从而将core 层与具体的主机控制器隔离
struct mmc_command表示一个mmc命令
struct mmc_data表示一个mmc数据
struct mmc_request表示一个mmc请求
struct sdio_func一张sdio卡可以支持很多Functions,一个Function对应软件上的struct sdio_func结构体,最后反应到驱动模型上就是一个device

mmc_host

struct mmc_host {
	int			index;
	const struct mmc_host_ops *ops;			/* host控制器操作函数集*/
	u32			ocr_avail;
	u32			ocr_avail_sdio;				/* SDIO-specific OCR */
	u32			ocr_avail_sd;				/* SD-specific OCR */
	u32			ocr_avail_mmc;				/* MMC-specific OCR */
	u32			caps;						/* Host能力标志位 */
	u32			caps2;						/* Host能力标志位2,32位不够再补一个32位 */
	struct mmc_ios		ios;				/* current io bus settings */
	int			rescan_disable;				/* disable card detection */
	int			rescan_entered;				/* used with nonremovable devices */
	struct mmc_card		*card;				/* 用来表示一个挂在当前host上的mmc设备(卡) */
	struct delayed_work	detect;				/* 卡检测函数 */
	int			detect_change;				/* 卡检测标志 */
	struct mmc_slot		slot;
	const struct mmc_bus_ops *bus_ops;		/* 当前总线操作函数集,mmc/sd/sdio */
	struct mmc_supply	supply;
	unsigned int		slotno;				/* used for sdio acpi binding */
	int			dsr_req;					/* DSR value is valid */
	u32			dsr;						/* optional driver stage (DSR) value */
	unsigned long		private[0] ____cacheline_aligned;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

mmc_card

struct mmc_card {
    struct mmc_host     *host;        		/* 设备(卡)对应的host数据结构 */
    struct device       dev;          		/* the device */
    u32                 ocr;          		/* 当前 OCR 设定*/
    unsigned int        rca;          		/* relative card address of device */
    unsigned int        type;         		/* Card类型: MMC、SD、SDIO、COMBO */
    unsigned int        state;        		/* 当前卡的状态 */
    unsigned int        quirks;       		/* card quirks */
    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_ssr       ssr;          		/* yet more 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 */
    struct sdio_func    *sdio_func[7];     	/* SDIO functions (devices) */
    unsigned int        sd_bus_speed;      	/* Bus Speed Mode set for the card */
    unsigned int        mmc_avail_type;    	/* supported device type by both host and card */
    unsigned int        drive_strength;    	/* for UHS-I, HS200 or HS400 */
};

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

mmc_ios

struct mmc_ios {
	unsigned int	clock;					/* 时钟频率 */
	unsigned short	vdd;
	unsigned char	bus_mode;				/* 命令输出模式: 开漏模式、上拉模式 */
	unsigned char	chip_select;			/* SPI片选 */
	unsigned char	power_mode;				/* 电源供应模式:UNDEFINED、OFF、UP、ON */
	unsigned char	bus_width;				/* 数据总线宽度:1、4、8 */
	unsigned char	timing;					/* timing specification used */
	unsigned char	signal_voltage;			/* 信号电压值(1.8V or 3.3V) */
	unsigned char	drv_type;				/* 驱动了恶性type (A, B, C, D) */
	bool enhanced_strobe;					/* hs400es selection */
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

mmc_dirver

struct mmc_driver {
	struct device_driver drv;
	int (*probe)(struct mmc_card *card);
	void (*remove)(struct mmc_card *card);
	void (*shutdown)(struct mmc_card *card);
};

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

mmc_bus_ops

struct mmc_bus_ops {
	void (*remove)(struct mmc_host *);
	void (*detect)(struct mmc_host *);
	int (*pre_suspend)(struct mmc_host *);
	int (*suspend)(struct mmc_host *);
	int (*resume)(struct mmc_host *);
	int (*runtime_suspend)(struct mmc_host *);
	int (*runtime_resume)(struct mmc_host *);
	int (*power_save)(struct mmc_host *);
	int (*power_restore)(struct mmc_host *);
	int (*alive)(struct mmc_host *);
	int (*shutdown)(struct mmc_host *);
	int (*reset)(struct mmc_host *);
};

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

mmc_host_ops

struct mmc_host_ops {
    void    (*post_req)(struct mmc_host *, struct mmc_request *, int err);
    void    (*pre_req)(struct mmc_host *, struct mmc_request *, bool is_first_req);
    void    (*request)(struct mmc_host *host, struct mmc_request *req);
    void    (*set_ios)(struct mmc_host *, struct mmc_ios *);
    int     (*get_ro)(struct mmc_host *);
    int     (*get_cd)(struct mmc_host *);
    void    (*enable_sdio_irq)(struct mmc_host *, int enable);
    void    (*init_card)(struct mmc_host *, struct mmc_card *card);
    int     (*start_signal_voltage_switch)(struct mmc_host *, struct mmc_ios *);
    int     (*card_busy)(struct mmc_host *);
    int     (*execute_tuning)(struct mmc_host *, u32 opcode);
    int     (*prepare_hs400_tuning)(struct mmc_host *host, struct mmc_ios *ios);
    void    (*hs400_enhanced_strobe)(struct mmc_host *, struct mmc_ios *);
    int     (*select_drive_strength)(struct mmc_card *card,
                  unsigned int max_dtr, int host_drv, int card_drv, int *drv_type);
    void    (*hw_reset)(struct mmc_host *);
    void    (*card_event)(struct mmc_host *);
    int     (*multi_io_quirk)(struct mmc_card *, unsigned int direction, int blk_size);
};

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

mmc_command

struct mmc_command {
	u32			opcode;						/* command的操作码 */
	u32			arg;						/* command携带的参数 */
	u32			resp[4];					/* command发出后,如果需要应答,结果保存在resp数组中,最多可以保存128bits的应答 */
	unsigned int	flags;					/* 期望的应答类型 */
	unsigned int	retries;				/* 最大重发的次数 */
	int				error;					/* 如果最终还是出错,通过该字段返回错误的原因 */
	unsigned int	busy_timeout;			/* busy detect timeout in ms */
	bool			sanitize_busy;			/* Set this flag only for blocking sanitize request */
	struct mmc_data		*data;				/* data segment associated with cmd */
	struct mmc_request	*mrq;				/* associated request */
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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		blk_addr;			/* block address */
	int					error;				/* 如果数据出错,错误值保存在该字段 */
	unsigned int		flags;				/* 指明数据传输的方向,可采用下面的宏定义 */

#define MMC_DATA_WRITE BIT(8)
#define MMC_DATA_READ BIT(9)
/* Extra flags used by CQE /
#define MMC_DATA_QBR BIT(10) / CQE queue barrier*/
#define MMC_DATA_PRIO BIT(11) /* CQE high priority /
#define MMC_DATA_REL_WR BIT(12) / Reliable write /
#define MMC_DATA_DAT_TAG BIT(13) / Tag request /
#define MMC_DATA_FORCED_PRG BIT(14) / Forced programming */

<span class="token keyword">unsigned</span> <span class="token keyword">int</span>		bytes_xfered<span class="token punctuation">;</span>

<span class="token keyword">struct</span> mmc_command	<span class="token operator">*</span>stop<span class="token punctuation">;</span>				<span class="token comment">/* stop command */</span>
<span class="token keyword">struct</span> mmc_request	<span class="token operator">*</span>mrq<span class="token punctuation">;</span>				<span class="token comment">/* associated request */</span>

<span class="token keyword">unsigned</span> <span class="token keyword">int</span>		sg_len<span class="token punctuation">;</span>				<span class="token comment">/* sg数组的长度 */</span>
<span class="token keyword">int</span>					sg_count<span class="token punctuation">;</span>			<span class="token comment">/* sg数组的个数 */</span>
<span class="token keyword">struct</span> scatterlist	<span class="token operator">*</span>sg<span class="token punctuation">;</span>				<span class="token comment">/* 保存需要传输的数据数组 */</span>
s32					host_cookie<span class="token punctuation">;</span>		<span class="token comment">/* host private data */</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

mmc_request

struct mmc_request {
	struct mmc_command	*cmd;				/* start command,必须设置 */
	struct mmc_data		*data;				/* 传输的数据,非必须 */
	struct mmc_command	*stop;
<span class="token keyword">void</span> <span class="token operator">*</span>done_data<span class="token punctuation">;</span>						<span class="token comment">/* completion data */</span>
<span class="token keyword">void</span> <span class="token punctuation">(</span><span class="token operator">*</span>done<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">struct</span> mmc_request <span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">/* 传输完成时的回调函数,用于通知传输请求的发起者 */</span>

};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

sdio_func

struct sdio_func {
	struct mmc_card		*card;		/* the card this device belongs to */
	struct device		dev;		/* the device */
	sdio_irq_handler_t	*irq_handler;	/* IRQ callback */
	unsigned int		num;		/* function number */
	unsigned char		class;		/* standard interface class */
	unsigned short		vendor;		/* vendor id */
	unsigned short		device;		/* device id */
	unsigned		max_blksize;	/* maximum block size */
	unsigned		cur_blksize;	/* current block size */
	unsigned		enable_timeout;	/* max enable timeout in msec */
	unsigned int		state;		/* function state */
#define SDIO_STATE_PRESENT	(1<<0)		/* present in sysfs */
	u8			*tmpbuf;	/* DMA:able scratch buffer */
	unsigned		num_info;	/* number of info strings */
	const char		**info;		/* info strings */
	struct sdio_func_tuple *tuples;
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值