sdcard: Add a 'spec_version' property, default to Spec v2.00
As of this commit, the Spec v1 is not working, and all controllers expect the cards to be conformant to Spec v2. Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-id: 20180607180641.874-4-f4bug@amsat.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
e2fce16edb
commit
2f0939c234
23
hw/sd/sd.c
23
hw/sd/sd.c
@ -1,9 +1,10 @@
|
||||
/*
|
||||
* SD Memory Card emulation as defined in the "SD Memory Card Physical
|
||||
* layer specification, Version 1.10."
|
||||
* layer specification, Version 2.00."
|
||||
*
|
||||
* Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
|
||||
* Copyright (c) 2007 CodeSourcery
|
||||
* Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@ -91,6 +92,7 @@ struct SDState {
|
||||
uint8_t sd_status[64];
|
||||
|
||||
/* Configurable properties */
|
||||
uint8_t spec_version;
|
||||
BlockBackend *blk;
|
||||
bool spi;
|
||||
|
||||
@ -310,8 +312,12 @@ static void sd_ocr_powerup(void *opaque)
|
||||
|
||||
static void sd_set_scr(SDState *sd)
|
||||
{
|
||||
sd->scr[0] = (0 << 4) /* SCR structure version 1.0 */
|
||||
| 1; /* Spec Version 1.10 */
|
||||
sd->scr[0] = 0 << 4; /* SCR structure version 1.0 */
|
||||
if (sd->spec_version == SD_PHY_SPECv1_10_VERS) {
|
||||
sd->scr[0] |= 1; /* Spec Version 1.10 */
|
||||
} else {
|
||||
sd->scr[0] |= 2; /* Spec Version 2.00 */
|
||||
}
|
||||
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
|
||||
| 0b0101; /* 1-bit or 4-bit width bus modes */
|
||||
sd->scr[2] = 0x00; /* Extended Security is not supported. */
|
||||
@ -2058,6 +2064,15 @@ static void sd_realize(DeviceState *dev, Error **errp)
|
||||
|
||||
sd->proto_name = sd->spi ? "SPI" : "SD";
|
||||
|
||||
switch (sd->spec_version) {
|
||||
case SD_PHY_SPECv1_10_VERS
|
||||
... SD_PHY_SPECv2_00_VERS:
|
||||
break;
|
||||
default:
|
||||
error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sd->blk && blk_is_read_only(sd->blk)) {
|
||||
error_setg(errp, "Cannot use read-only drive as SD card");
|
||||
return;
|
||||
@ -2074,6 +2089,8 @@ static void sd_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
static Property sd_properties[] = {
|
||||
DEFINE_PROP_UINT8("spec_version", SDState,
|
||||
spec_version, SD_PHY_SPECv2_00_VERS),
|
||||
DEFINE_PROP_DRIVE("drive", SDState, blk),
|
||||
/* We do not model the chip select pin, so allow the board to select
|
||||
* whether card should be in SSI or MMC/SD mode. It is also up to the
|
||||
|
@ -54,6 +54,11 @@
|
||||
#define APP_CMD (1 << 5)
|
||||
#define AKE_SEQ_ERROR (1 << 3)
|
||||
|
||||
enum SDPhySpecificationVersion {
|
||||
SD_PHY_SPECv1_10_VERS = 1,
|
||||
SD_PHY_SPECv2_00_VERS = 2,
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
SD_VOLTAGE_0_4V = 400, /* currently not supported */
|
||||
SD_VOLTAGE_1_8V = 1800,
|
||||
|
Loading…
Reference in New Issue
Block a user