[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 05/14] sdcard: Move sd_crc7() and calc_checksum()
From: |
Philippe Mathieu-Daudé |
Subject: |
[Qemu-devel] [PATCH v2 05/14] sdcard: Move sd_crc7() and calc_checksum() out for qtesting |
Date: |
Wed, 9 May 2018 00:46:49 -0300 |
Move the calc_checksum() functions out so we will able to write
qtests for them.
Signed-off-by: Philippe Mathieu-Daudé <address@hidden>
---
include/hw/sd/sd.h | 20 ++++++++++++++++++++
hw/sd/sd.c | 33 ---------------------------------
hw/sd/sdmmc-internal.c | 35 +++++++++++++++++++++++++++++++++++
3 files changed, 55 insertions(+), 33 deletions(-)
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 9bdb3c9285..c854ed6a14 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -130,6 +130,26 @@ typedef struct {
void (*set_readonly)(DeviceState *dev, bool readonly);
} SDBusClass;
+/**
+ * sd_frame48_calc_checksum:
+ * @content: pointer to the frame content
+ *
+ * Calculate the 7-bit CRC of a 48-bit SD frame.
+ *
+ * Returns: The frame CRC.
+ */
+uint8_t sd_frame48_calc_checksum(const void *content);
+
+/**
+ * sd_frame136_calc_checksum:
+ * @content: pointer to the frame content
+ *
+ * Calculate the 7-bit CRC of a 136-bit SD frame.
+ *
+ * Returns: The frame CRC.
+ */
+uint8_t sd_frame136_calc_checksum(const void *content);
+
/* Legacy functions to be used only by non-qdevified callers */
SDState *sd_init(BlockBackend *bs, bool is_spi);
int sd_do_command(SDState *sd, SDRequest *req,
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 06607115a7..d8dad94fc4 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -236,24 +236,6 @@ static const int sd_cmd_class[SDMMC_CMD_MAX] = {
7, 7, 10, 7, 9, 9, 9, 8, 8, 10, 8, 8, 8, 8, 8, 8,
};
-static uint8_t sd_crc7(const void *message, size_t width)
-{
- int i, bit;
- uint8_t shift_reg = 0x00;
- const uint8_t *msg = (const uint8_t *)message;
-
- for (i = 0; i < width; i++, msg++) {
- for (bit = 7; bit >= 0; bit--) {
- shift_reg <<= 1;
- if ((shift_reg >> 7) ^ ((*msg >> bit) & 1)) {
- shift_reg ^= 0x89;
- }
- }
- }
-
- return shift_reg;
-}
-
static uint16_t sd_crc16(const void *message, size_t width)
{
int i, bit;
@@ -273,21 +255,6 @@ static uint16_t sd_crc16(const void *message, size_t width)
return shift_reg;
}
-enum {
- F48_CONTENT_LENGTH = 1 /* command */ + 4 /* argument */,
- F136_CONTENT_LENGTH = 15,
-};
-
-static uint8_t sd_frame48_calc_checksum(const void *content)
-{
- return sd_crc7(content, F48_CONTENT_LENGTH);
-}
-
-static uint8_t sd_frame136_calc_checksum(const void *content)
-{
- return (sd_crc7(content, F136_CONTENT_LENGTH) << 1) | 1;
-}
-
#define OCR_POWER_DELAY_NS 500000 /* 0.5ms */
FIELD(OCR, VDD_VOLTAGE_WINDOW, 0, 24)
diff --git a/hw/sd/sdmmc-internal.c b/hw/sd/sdmmc-internal.c
index 2053def3f1..a94d65b756 100644
--- a/hw/sd/sdmmc-internal.c
+++ b/hw/sd/sdmmc-internal.c
@@ -9,6 +9,7 @@
*/
#include "qemu/osdep.h"
+#include "hw/sd/sd.h"
#include "sdmmc-internal.h"
const char *sd_cmd_name(uint8_t cmd)
@@ -70,3 +71,37 @@ const char *sd_acmd_name(uint8_t cmd)
return acmd_abbrev[cmd] ? acmd_abbrev[cmd] : "UNKNOWN_ACMD";
}
+
+/* 7 bit CRC with polynomial x^7 + x^3 + 1 */
+static uint8_t sd_crc7(const void *message, size_t width)
+{
+ int i, bit;
+ uint8_t shift_reg = 0x00;
+ const uint8_t *msg = (const uint8_t *)message;
+
+ for (i = 0; i < width; i++, msg++) {
+ for (bit = 7; bit >= 0; bit--) {
+ shift_reg <<= 1;
+ if ((shift_reg >> 7) ^ ((*msg >> bit) & 1)) {
+ shift_reg ^= 0x89;
+ }
+ }
+ }
+
+ return shift_reg;
+}
+
+enum {
+ F48_CONTENT_LENGTH = 1 /* command */ + 4 /* argument */,
+ F136_CONTENT_LENGTH = 15,
+};
+
+uint8_t sd_frame48_calc_checksum(const void *content)
+{
+ return sd_crc7(content, F48_CONTENT_LENGTH);
+}
+
+uint8_t sd_frame136_calc_checksum(const void *content)
+{
+ return (sd_crc7(content, F136_CONTENT_LENGTH) << 1) | 1;
+}
--
2.17.0
- [Qemu-devel] [PATCH v2 01/14] sdcard: Use the ldst API, (continued)
[Qemu-devel] [PATCH v2 05/14] sdcard: Move sd_crc7() and calc_checksum() out for qtesting,
Philippe Mathieu-Daudé <=
[Qemu-devel] [PATCH v2 06/14] sdcard: Add test_sd_verify_cksum_frame136(), Philippe Mathieu-Daudé, 2018/05/08
[Qemu-devel] [PATCH v2 07/14] sdcard: Invert the sd_req_crc_is_valid() logic, Philippe Mathieu-Daudé, 2018/05/08
[Qemu-devel] [PATCH v2 08/14] sdcard: Extract sd_frame48_verify_checksum() out for qtesting, Philippe Mathieu-Daudé, 2018/05/08
[Qemu-devel] [PATCH v2 09/14] sdcard: Add sd_frame136_verify_checksum(), Philippe Mathieu-Daudé, 2018/05/08
[Qemu-devel] [PATCH v2 10/14] sdcard: Remove the SDRequest argument from internal functions, Philippe Mathieu-Daudé, 2018/05/08
[Qemu-devel] [PATCH v2 11/14] sdcard: Add sd_frame48_init(), replace SDRequest by a raw buffer, Philippe Mathieu-Daudé, 2018/05/08
[Qemu-devel] [PATCH v2 13/14] sdcard: Add a "validate-crc" property, Philippe Mathieu-Daudé, 2018/05/08