Linux设备驱动程序架构分析之MMC/SD(七)
2015-04-29
1374行,由mmc_host取得s3cmci_host。
1375行,取得s3c24xx_mci_pdata,其它保存着SDI的平台数据。
1378行,如果s3c24xx_mci_pdata.no_wprotect为1,表明没有写保护开关,直接退出。例如MMC卡就没有写保护开关,只有SD卡才有写保护开关。
1381行,读取gpio_wprotect引脚电平,对于Mini2440,即GPH8引脚。
1382行,与pdata->wprotect_invert执行异或操作,即反转上步得到GPH8引脚电平值。
s3cmci_card_present函数定义在drivers/mmc/host/s3cmci.c文件中:
1256行,由mmc_host取得s3cmci_host。
1257行,取得s3c24xx_mci_pdata,其它保存着SDI的平台数据。
1260行,如果s3c24xx_mci_pdata.no_detect为1,表明没有卡探测引脚,直接退出。
1263行,读取gpio_detect引脚电平值,对于Mini2440,即GPG8引脚。
1264行,与pdata->detect_invert进行异或操作,即反转上步得到的GPG8引脚电平值。
s3cmci_enable_sdio_irq函数定义在drivers/mmc/host/s3cmci.c文件中:
1389行,由mmc_host取得s3cmci_host。
1395行,读取SDICON即SDI控制寄存器的内容,保存在con中。
1396行,我觉得这一行不应该存在,因为这一行将参数enable的值赋值给host->sdio_irqen,但是1398行又接着判断enable与host->sdio_irqen是否相等,如果相等就退出了。
1401-1408行,enable为1,使能SDIO中断。
1402行,S3C2410_SDICON_SDIOIRQ定义在drivers/mmc/host/s3cmci.c文件中:
57#define S3C2410_SDICON_SDIOIRQ (1 << 3)
对照S3C2440 Datasheet,可知这个宏用来设置SDICON寄存器的第3位,该位决定是否接收SDIO中断。
1403行,S3C2410_SDIIMSK_SDIOIRQ定义在drivers/mmc/host/s3cmci.c文件中:
105#define S3C2410_SDIIMSK_SDIOIRQ (1 << 12)
对照S3C2440 Datasheet,可知这个宏用来设置SDIIntMsk寄存器的第13位,该位决定当read wait request发生时,SDI是否产生一个中断。
enable_imask函数定义在drivers/mmc/host/s3cmci.c文件中:
该函数用来设置SDIIntMsk寄存器。
1409-1416行,enable为0,禁用SDIO中断。
1419行,用新的con设置SDICON即SDI控制寄存器。
s3cmci_set_ios函数定义在drivers/mmc/host/s3cmci.c文件中:
1306行,参数ios是structmmc_ios类型指针。struct mmc_ios定义在include/linux/mmc/host.h文件中:
