s3c6410 的SDIO驱动分析(3)

mmc_host用于描述MMC接口 CPU一侧的设备,它可以看成是class device的特例,而插入的SDIO设备,如SD卡则封装成数据结构,如果mmc_host发送命令和数据是通过 struct 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);       
 int (*get_ro)(struct mmc_host *host);                               
 int (*get_cd)(struct mmc_host *host);                               
                                                                      
 void (*enable_sdio_irq)(struct mmc_host *host, int enable);        
};
 

 

如果SDIO设备操作,直接采用如下定义

static struct mmc_host_ops s3c_hsmmc_ops = {
 .request = s3c_hsmmc_request,
 .set_ios = s3c_hsmmc_set_ios,
};
 

 

mmc_card /mmc_bus

如果SD卡的之存储设备进行块设备操作,则需要另一个额外的mmc bus总线,并且需要定义mmc_card结构,对应(device).并且进行存储的块设备操作定义在mmc_driver类。

 

如果SDIO设备本身不需要这个总线

 

在mmc又单独定义一个 mmc总线,

 

static struct bus_type mmc_bus_type = {
 .name  = "mmc",
 .dev_attrs = mmc_dev_attrs,
 .match  = mmc_bus_match,
 .uevent  = mmc_bus_uevent,
 .probe  = mmc_bus_probe,
 .remove  = mmc_bus_remove,
 .suspend = mmc_bus_suspend,
 .resume  = mmc_bus_resume,
};

int mmc_register_bus(void)
{
 return bus_register(&mmc_bus_type);
}

void mmc_unregister_bus(void)
{
 bus_unregister(&mmc_bus_type);
}

 

 

 

mmc_card.它可以看一个bus device 设备

// include/linux/mmc/card.h

/*
 * MMC device
 */
struct mmc_card {
 struct mmc_host  *host;  /* the host this device belongs to */
 struct device  dev;  /* the device */
 unsigned int  rca;  /* relative card address of device */
 unsigned int  type;  /* card type */
#define MMC_TYPE_MMC  0  /* MMC card */
#define MMC_TYPE_SD  1  /* SD card */
#define MMC_TYPE_SDIO  2  /* SDIO card */
 unsigned int  state;  /* (our) card state */
#define MMC_STATE_PRESENT (1<<0)  /* present in sysfs */
#define MMC_STATE_READONLY (1<<1)  /* card is read-only */
#define MMC_STATE_HIGHSPEED (1<<2)  /* card is in high speed mode */
#define MMC_STATE_BLOCKADDR (1<<3)  /* card uses block-addressing */

u32   raw_cid[4]; /* raw card CID */
 u32   raw_csd[4]; /* raw card CSD */
 u32   raw_scr[2]; /* raw card SCR */
 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_switch_caps sw_caps; /* switch (CMD6) caps */

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwfggy.html