#define MMC_SEND_EXT_CSD 8 /* R1 */
#define MMC_SEND_CSD 9 /* R2 */
#define MMC_SEND_CID 10 /* R1 */
+#define MMC_READ_DAT_UNTIL_STOP 11 /* R1 */
#define MMC_STOP_TRANSMISSION 12 /* R1B */
#define MMC_SEND_STATUS 13 /* R1 */
#define MMC_SET_BLOCKLEN 16 /* R1 */
#define MMC_READ_BLOCK_SINGLE 17 /* R1 */
#define MMC_READ_BLOCK_MULTIPLE 18 /* R1 */
+#define MMC_WRITE_DAT_UNTIL_STOP 20 /* R1 */
#define MMC_SET_BLOCK_COUNT 23 /* R1 */
#define MMC_WRITE_BLOCK_SINGLE 24 /* R1 */
#define MMC_WRITE_BLOCK_MULTIPLE 25 /* R1 */
return ESP_OK;
}
+static bool cmd_needs_auto_stop(const sdmmc_command_t* cmd)
+{
+ /* SDMMC host needs an "auto stop" flag for the following commands: */
+ return cmd->datalen > 0 &&
+ (cmd->opcode == MMC_WRITE_BLOCK_MULTIPLE ||
+ cmd->opcode == MMC_READ_BLOCK_MULTIPLE ||
+ cmd->opcode == MMC_WRITE_DAT_UNTIL_STOP ||
+ cmd->opcode == MMC_READ_DAT_UNTIL_STOP);
+}
+
static sdmmc_hw_cmd_t make_hw_cmd(sdmmc_command_t* cmd)
{
sdmmc_hw_cmd_t res = { 0 };
res.rw = 1;
}
assert(cmd->datalen % cmd->blklen == 0);
- if ((cmd->datalen / cmd->blklen) > 1) {
- res.send_auto_stop = 1;
- }
+ res.send_auto_stop = cmd_needs_auto_stop(cmd) ? 1 : 0;
}
- ESP_LOGV(TAG, "%s: opcode=%d, rexp=%d, crc=%d", __func__,
- res.cmd_index, res.response_expect, res.check_response_crc);
+ ESP_LOGV(TAG, "%s: opcode=%d, rexp=%d, crc=%d, auto_stop=%d", __func__,
+ res.cmd_index, res.response_expect, res.check_response_crc,
+ res.send_auto_stop);
return res;
}