Skip to content

Commit

Permalink
sdcard: Add a 'spec_version' property, default to Spec v2.00
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
philmd authored and pm215 committed Jun 8, 2018
1 parent e2fce16 commit 2f0939c
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
23 changes: 20 additions & 3 deletions 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
Expand Down Expand Up @@ -91,6 +92,7 @@ struct SDState {
uint8_t sd_status[64];

/* Configurable properties */
uint8_t spec_version;
BlockBackend *blk;
bool spi;

Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand Down
5 changes: 5 additions & 0 deletions include/hw/sd/sd.h
Expand Up @@ -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,
Expand Down

0 comments on commit 2f0939c

Please sign in to comment.