mirror of https://github.com/xemu-project/xemu.git
sdcard: handles more commands in SPI mode
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Alistair Francis <alistair.francis@xilinx.com> Message-id: 20180215221325.7611-13-f4bug@amsat.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
a21208646d
commit
946897ce18
27
hw/sd/sd.c
27
hw/sd/sd.c
|
@ -1386,9 +1386,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
|
||||||
|
|
||||||
/* Application specific commands (Class 8) */
|
/* Application specific commands (Class 8) */
|
||||||
case 55: /* CMD55: APP_CMD */
|
case 55: /* CMD55: APP_CMD */
|
||||||
if (sd->rca != rca)
|
if (!sd->spi) {
|
||||||
|
if (sd->rca != rca) {
|
||||||
return sd_r0;
|
return sd_r0;
|
||||||
|
}
|
||||||
|
}
|
||||||
sd->expecting_acmd = true;
|
sd->expecting_acmd = true;
|
||||||
sd->card_status |= APP_CMD;
|
sd->card_status |= APP_CMD;
|
||||||
return sd_r1;
|
return sd_r1;
|
||||||
|
@ -1408,6 +1410,18 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 58: /* CMD58: READ_OCR (SPI) */
|
||||||
|
if (!sd->spi) {
|
||||||
|
goto bad_cmd;
|
||||||
|
}
|
||||||
|
return sd_r3;
|
||||||
|
|
||||||
|
case 59: /* CMD59: CRC_ON_OFF (SPI) */
|
||||||
|
if (!sd->spi) {
|
||||||
|
goto bad_cmd;
|
||||||
|
}
|
||||||
|
goto unimplemented_spi_cmd;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
bad_cmd:
|
bad_cmd:
|
||||||
qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
|
qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
|
||||||
|
@ -1431,6 +1445,9 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
|
||||||
sd->card_status |= APP_CMD;
|
sd->card_status |= APP_CMD;
|
||||||
switch (req.cmd) {
|
switch (req.cmd) {
|
||||||
case 6: /* ACMD6: SET_BUS_WIDTH */
|
case 6: /* ACMD6: SET_BUS_WIDTH */
|
||||||
|
if (sd->spi) {
|
||||||
|
goto unimplemented_spi_cmd;
|
||||||
|
}
|
||||||
switch (sd->state) {
|
switch (sd->state) {
|
||||||
case sd_transfer_state:
|
case sd_transfer_state:
|
||||||
sd->sd_status[0] &= 0x3f;
|
sd->sd_status[0] &= 0x3f;
|
||||||
|
@ -1565,6 +1582,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
|
||||||
default:
|
default:
|
||||||
/* Fall back to standard commands. */
|
/* Fall back to standard commands. */
|
||||||
return sd_normal_command(sd, req);
|
return sd_normal_command(sd, req);
|
||||||
|
|
||||||
|
unimplemented_spi_cmd:
|
||||||
|
/* Commands that are recognised but not yet implemented in SPI mode. */
|
||||||
|
qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
|
||||||
|
req.cmd);
|
||||||
|
return sd_illegal;
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
|
qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
|
||||||
|
|
Loading…
Reference in New Issue