mirror of https://github.com/xemu-project/xemu.git
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
|
* 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) 2006 Andrzej Zaborowski <balrog@zabor.org>
|
||||||
* Copyright (c) 2007 CodeSourcery
|
* Copyright (c) 2007 CodeSourcery
|
||||||
|
* Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
@ -91,6 +92,7 @@ struct SDState {
|
||||||
uint8_t sd_status[64];
|
uint8_t sd_status[64];
|
||||||
|
|
||||||
/* Configurable properties */
|
/* Configurable properties */
|
||||||
|
uint8_t spec_version;
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
bool spi;
|
bool spi;
|
||||||
|
|
||||||
|
@ -310,8 +312,12 @@ static void sd_ocr_powerup(void *opaque)
|
||||||
|
|
||||||
static void sd_set_scr(SDState *sd)
|
static void sd_set_scr(SDState *sd)
|
||||||
{
|
{
|
||||||
sd->scr[0] = (0 << 4) /* SCR structure version 1.0 */
|
sd->scr[0] = 0 << 4; /* SCR structure version 1.0 */
|
||||||
| 1; /* Spec Version 1.10 */
|
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) */
|
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
|
||||||
| 0b0101; /* 1-bit or 4-bit width bus modes */
|
| 0b0101; /* 1-bit or 4-bit width bus modes */
|
||||||
sd->scr[2] = 0x00; /* Extended Security is not supported. */
|
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";
|
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)) {
|
if (sd->blk && blk_is_read_only(sd->blk)) {
|
||||||
error_setg(errp, "Cannot use read-only drive as SD card");
|
error_setg(errp, "Cannot use read-only drive as SD card");
|
||||||
return;
|
return;
|
||||||
|
@ -2074,6 +2089,8 @@ static void sd_realize(DeviceState *dev, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Property sd_properties[] = {
|
static Property sd_properties[] = {
|
||||||
|
DEFINE_PROP_UINT8("spec_version", SDState,
|
||||||
|
spec_version, SD_PHY_SPECv2_00_VERS),
|
||||||
DEFINE_PROP_DRIVE("drive", SDState, blk),
|
DEFINE_PROP_DRIVE("drive", SDState, blk),
|
||||||
/* We do not model the chip select pin, so allow the board to select
|
/* 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
|
* 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 APP_CMD (1 << 5)
|
||||||
#define AKE_SEQ_ERROR (1 << 3)
|
#define AKE_SEQ_ERROR (1 << 3)
|
||||||
|
|
||||||
|
enum SDPhySpecificationVersion {
|
||||||
|
SD_PHY_SPECv1_10_VERS = 1,
|
||||||
|
SD_PHY_SPECv2_00_VERS = 2,
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SD_VOLTAGE_0_4V = 400, /* currently not supported */
|
SD_VOLTAGE_0_4V = 400, /* currently not supported */
|
||||||
SD_VOLTAGE_1_8V = 1800,
|
SD_VOLTAGE_1_8V = 1800,
|
||||||
|
|
Loading…
Reference in New Issue