接着判断控制器如果不支持 Auto CMD12 (sdhci_auto_cmd12() 返回 false,具体解析见下一段),同时命令不是 CMD53(SDIO多块读写命令),则使能控制器 Auto CMD23能力。如果不是上述条件则继续判断,struct mmc_request的变量 sbc(SET_BLOCK_COUNT for multiblock)是否已经初始化,同时软件初始化控制器是否设置了 Auto CMD23标志 (SDHCI_AUTO_CMD23),是,则使能控制器 Auto CMD23能力和将配置好的 mrq->sbc->arg(blocks / ../core/mmc_test.c +210)写入控制器的 SDHCI_ARGUMENT2中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
if (mmc_op_multi(cmd->opcode) || data->blocks > 1) { mode = SDHCI_TRNS_BLK_CNT_EN | SDHCI_TRNS_MULTI; /* * If we are sending CMD23, CMD12 never gets sent * on successful completion (so no Auto-CMD12). */ if (sdhci_auto_cmd12(host, cmd->mrq) && (cmd->opcode != SD_IO_RW_EXTENDED)) mode |= SDHCI_TRNS_AUTO_CMD12; elseif (cmd->mrq->sbc && (host->flags & SDHCI_AUTO_CMD23)) { mode |= SDHCI_TRNS_AUTO_CMD23; sdhci_writel(host, cmd->mrq->sbc->arg, SDHCI_ARGUMENT2); } }
sdhci_auto_cmd12,返回 true则控制器当前配置使能了 Auto CMD12,false反之。分析下 return的这三个条件,1、struct mmc_request的变量 sbc(SET_BLOCK_COUNT for multiblock)没有初始化;