esp_err_t sdmmc_send_cmd(sdmmc_card_t* card, sdmmc_command_t* cmd) { if (card->host.command_timeout_ms != 0) { cmd->timeout_ms = card->host.command_timeout_ms; } else if (cmd->timeout_ms == 0) { cmd->timeout_ms = SDMMC_DEFAULT_CMD_TIMEOUT_MS; } int slot = card->host.slot; ESP_LOGV(TAG, "sending cmd slot=%d op=%d arg=%x flags=%x data=%p blklen=%d datalen=%d timeout=%d", slot, cmd->opcode, cmd->arg, cmd->flags, cmd->data, cmd->blklen, cmd->datalen, cmd->timeout_ms); esp_err_t err = (*card->host.do_transaction)(slot, cmd); if (err != 0) { ESP_LOGD(TAG, "cmd=%d, sdmmc_req_run returned 0x%x", cmd->opcode, err); return err; } int state = MMC_R1_CURRENT_STATE(cmd->response); ESP_LOGV(TAG, "cmd response %08x %08x %08x %08x err=0x%x state=%d", cmd->response[0], cmd->response[1], cmd->response[2], cmd->response[3], cmd->error, state); return cmd->error; }
static int wait_card_state_prg( mmc_card_data *mmc_card_cur, mmc_controller_data *mmc_cont_cur) { #define RETRY_WAIT_CARD_PRG_COUNT 100 int count = 0; unsigned int status; int err; for (count=0;count<RETRY_WAIT_CARD_PRG_COUNT;count++) { err= mmc_send_status(mmc_card_cur, mmc_cont_cur, &status); if (err!=1) { printf("Error getting card status\n"); return err; } if (MMC_R1_CURRENT_STATE(status) != MMC_R1_STATE_PRG) break; printf("wait for mmc card to exit prg state\n"); udelay(1000); } if (count>=RETRY_WAIT_CARD_PRG_COUNT) { printf("mmc wait prg state timeout\n"); return 0; } return 1; }
static esp_err_t sdmmc_send_cmd(sdmmc_card_t* card, sdmmc_command_t* cmd) { int slot = card->host.slot; ESP_LOGV(TAG, "sending cmd slot=%d op=%d arg=%x flags=%x data=%p blklen=%d datalen=%d", slot, cmd->opcode, cmd->arg, cmd->flags, cmd->data, cmd->blklen, cmd->datalen); esp_err_t err = (*card->host.do_transaction)(slot, cmd); if (err != 0) { ESP_LOGD(TAG, "sdmmc_req_run returned 0x%x", err); return err; } int state = MMC_R1_CURRENT_STATE(cmd->response); ESP_LOGV(TAG, "cmd response %08x %08x %08x %08x err=0x%x state=%d", cmd->response[0], cmd->response[1], cmd->response[2], cmd->response[3], cmd->error, state); return cmd->error; }