[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v47 05/19] hw/sd/sdcard: Implement emmc_set_csd()
From: |
Philippe Mathieu-Daudé |
Subject: |
[PATCH v47 05/19] hw/sd/sdcard: Implement emmc_set_csd() |
Date: |
Tue, 9 Jul 2024 17:25:42 +0200 |
eMMC CSD register is very similar to SD one.
Most notable change: the version announced is v4.3.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
TODO: comment magic values?
---
hw/sd/sd.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 2d737a836f..f580c6b2ae 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -476,6 +476,44 @@ static const uint8_t sd_csd_rw_mask[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
};
+static void emmc_set_csd(SDState *sd, uint64_t size)
+{
+ int hwblock_shift = HWBLOCK_SHIFT;
+ uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
+ uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
+
+ sd->csd[0] = (2 << 6) | (4 << 2);
+ sd->csd[1] = 0x07;
+ sd->csd[2] = 0x00;
+ sd->csd[3] = 0x32;
+ sd->csd[4] = 0x0f;
+ if (size <= 2 * GiB) {
+ /* use 1k blocks */
+ uint32_t csize1k = (size >> (CMULT_SHIFT + 10)) - 1;
+ sd->csd[5] = 0x5a;
+ sd->csd[6] = 0x80 | ((csize1k >> 10) & 0xf);
+ sd->csd[7] = (csize1k >> 2) & 0xff;
+ } else { /* >= 2GB : size stored in ext CSD, block addressing */
+ sd->csd[5] = 0x59;
+ sd->csd[6] = 0x8f;
+ sd->csd[7] = 0xff;
+ sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1);
+ }
+ sd->csd[8] = 0xff;
+ sd->csd[9] = 0xfc | /* Max. write current */
+ ((CMULT_SHIFT - 2) >> 1);
+ sd->csd[10] = 0x40 | /* Erase sector size */
+ (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1);
+ sd->csd[11] = 0x00 | /* Write protect group size */
+ ((sectsize << 7) & 0x80) | wpsize;
+ sd->csd[12] = 0x90 | /* Write speed factor */
+ (hwblock_shift >> 2);
+ sd->csd[13] = 0x20 | /* Max. write data block length */
+ ((hwblock_shift << 6) & 0xc0);
+ sd->csd[14] = 0x00;
+ sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
+}
+
static void sd_set_csd(SDState *sd, uint64_t size)
{
int hwblock_shift = HWBLOCK_SHIFT;
@@ -2600,6 +2638,7 @@ static void emmc_class_init(ObjectClass *klass, void
*data)
sc->proto = &sd_proto_emmc;
sc->set_cid = emmc_set_cid;
+ sc->set_csd = emmc_set_csd;
}
static const TypeInfo sd_types[] = {
--
2.41.0
- [PATCH v47 00/19] hw/sd/sdcard: Add eMMC support, Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 01/19] hw/sd/sdcard: Basis for eMMC support, Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 02/19] hw/sd/sdcard: Register generic command handlers, Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 03/19] hw/sd/sdcard: Register unimplemented command handlers, Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 04/19] hw/sd/sdcard: Implement emmc_set_cid(), Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 05/19] hw/sd/sdcard: Implement emmc_set_csd(),
Philippe Mathieu-Daudé <=
- [PATCH v47 06/19] hw/sd/sdcard: Add emmc_cmd_SET_RELATIVE_ADDR handler (CMD3), Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 07/19] hw/sd/sdcard: Fix SET_BLOCK_COUNT command argument on eMMC (CMD23), Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 08/19] hw/sd/sdcard: Add mmc_cmd_PROGRAM_CID handler (CMD26), Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 09/19] hw/sd/sdcard: Implement eMMC sleep state (CMD5), Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 10/19] hw/sd/sdcard: Add emmc_cmd_SEND_EXT_CSD handler (CMD8), Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 11/19] hw/sd/sdcard: Add eMMC 'boot-size' property, Philippe Mathieu-Daudé, 2024/07/09
- [PATCH v47 12/19] hw/sd/sdcard: Simplify EXT_CSD values for spec v4.3, Philippe Mathieu-Daudé, 2024/07/09