diff mbox

[15/20] sdcard: Add SDFrame136 struct and 136-bit SD response frames functions

Message ID 20180504155918.21287-16-f4bug@amsat.org (mailing list archive)
State New, archived
Headers show

Commit Message

Philippe Mathieu-Daudé May 4, 2018, 3:59 p.m. UTC
The 'read CID/CSD register' request returns a 136-bit frame
containing those 128-bit registers.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 include/hw/sd/sd.h     | 29 +++++++++++++++++++++++++++++
 hw/sd/sdmmc-internal.c | 15 +++++++++++++++
 2 files changed, 44 insertions(+)

Comments

Philippe Mathieu-Daudé May 4, 2018, 4:57 p.m. UTC | #1
On 05/04/2018 12:59 PM, Philippe Mathieu-Daudé wrote:
> The 'read CID/CSD register' request returns a 136-bit frame
> containing those 128-bit registers.
> 
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  include/hw/sd/sd.h     | 29 +++++++++++++++++++++++++++++
>  hw/sd/sdmmc-internal.c | 15 +++++++++++++++
>  2 files changed, 44 insertions(+)
> 
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index 13de1b30c3..c76be51b32 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -91,6 +91,17 @@ typedef struct SDFrame48 {
>      uint8_t crc;
>  } SDFrame48;
>  
> +/**
> + * SDFrame136: 136 bits CID or CSD responses
> + *
> + * @content: CID or CSD register
> + * @crc:     7-bit CRC checksum
> + */
> +typedef struct SDFrame136 {
> +    uint8_t content[15];
> +    uint8_t crc;
> +} SDFrame136;
> +
>  typedef struct SDFrame48 SDRequest;
>  
>  typedef struct SDState SDState;
> @@ -193,6 +204,14 @@ void sd_prepare_frame48(SDFrame48 *frame, uint8_t cmd, uint32_t arg,
>   */
>  void sd_update_frame48_checksum(SDFrame48 *frame, bool is_response);
>  
> +/**
> + * sd_update_frame136_checksum:
> + * @frame: the #SDFrame136 to verify
> + *
> + * Update the 16-bit CRC checksum of a SD 136-bit frame.

Oops this should be:

    "Update the 7-bit CRC checksum of a SD 136-bit frame."

> + */
> +void sd_update_frame136_checksum(SDFrame136 *frame);
> +
>  /**
>   * sd_verify_frame48_checksum:
>   * @frame: the #SDFrame48 to verify
> @@ -204,6 +223,16 @@ void sd_update_frame48_checksum(SDFrame48 *frame, bool is_response);
>   */
>  bool sd_verify_frame48_checksum(SDFrame48 *frame, bool is_response);
>  
> +/**
> + * sd_verify_frame136_checksum:
> + * @frame: the #SDFrame48 to verify
> + *
> + * Verify the 16-bit CRC checksum of a SD 136-bit frame.

And:

    "Verify the 7-bit CRC checksum of a SD 136-bit frame."

> + *
> + * Returns: A boolean indicating whether the frame 16-bit CRC is correct.
> + */
> +bool sd_verify_frame136_checksum(SDFrame136 *frame);
> +
>  /* 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/sdmmc-internal.c b/hw/sd/sdmmc-internal.c
> index c990cc9e8e..68350a2304 100644
> --- a/hw/sd/sdmmc-internal.c
> +++ b/hw/sd/sdmmc-internal.c
> @@ -117,6 +117,11 @@ static uint8_t sd_calc_frame48_crc7(uint8_t cmd, uint32_t arg, bool is_response)
>      return sd_crc7(buffer, sizeof(buffer));
>  }
>  
> +static uint8_t sd_calc_frame136_crc7(SDFrame136 *frame)
> +{
> +    return (sd_crc7(frame->content, sizeof(frame->content)) << 1) | 1;
> +}
> +
>  bool sd_verify_frame48_checksum(SDFrame48 *frame, bool is_response)
>  {
>      uint8_t crc = sd_calc_frame48_crc7(frame->cmd, frame->arg, is_response);
> @@ -124,11 +129,21 @@ bool sd_verify_frame48_checksum(SDFrame48 *frame, bool is_response)
>      return crc == frame->crc;
>  }
>  
> +bool sd_verify_frame136_checksum(SDFrame136 *frame)
> +{
> +    return sd_calc_frame136_crc7(frame) == frame->crc;
> +}
> +
>  void sd_update_frame48_checksum(SDFrame48 *frame, bool is_response)
>  {
>      frame->crc = sd_calc_frame48_crc7(frame->cmd, frame->arg, is_response);
>  }
>  
> +void sd_update_frame136_checksum(SDFrame136 *frame)
> +{
> +    frame->crc = (sd_crc7(frame->content, sizeof(frame->content)) << 1) | 1;
> +}
> +
>  void sd_prepare_frame48(SDFrame48 *frame, uint8_t cmd, uint32_t arg,
>                          bool is_response, bool gen_crc)
>  {
>
diff mbox

Patch

diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 13de1b30c3..c76be51b32 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -91,6 +91,17 @@  typedef struct SDFrame48 {
     uint8_t crc;
 } SDFrame48;
 
+/**
+ * SDFrame136: 136 bits CID or CSD responses
+ *
+ * @content: CID or CSD register
+ * @crc:     7-bit CRC checksum
+ */
+typedef struct SDFrame136 {
+    uint8_t content[15];
+    uint8_t crc;
+} SDFrame136;
+
 typedef struct SDFrame48 SDRequest;
 
 typedef struct SDState SDState;
@@ -193,6 +204,14 @@  void sd_prepare_frame48(SDFrame48 *frame, uint8_t cmd, uint32_t arg,
  */
 void sd_update_frame48_checksum(SDFrame48 *frame, bool is_response);
 
+/**
+ * sd_update_frame136_checksum:
+ * @frame: the #SDFrame136 to verify
+ *
+ * Update the 16-bit CRC checksum of a SD 136-bit frame.
+ */
+void sd_update_frame136_checksum(SDFrame136 *frame);
+
 /**
  * sd_verify_frame48_checksum:
  * @frame: the #SDFrame48 to verify
@@ -204,6 +223,16 @@  void sd_update_frame48_checksum(SDFrame48 *frame, bool is_response);
  */
 bool sd_verify_frame48_checksum(SDFrame48 *frame, bool is_response);
 
+/**
+ * sd_verify_frame136_checksum:
+ * @frame: the #SDFrame48 to verify
+ *
+ * Verify the 16-bit CRC checksum of a SD 136-bit frame.
+ *
+ * Returns: A boolean indicating whether the frame 16-bit CRC is correct.
+ */
+bool sd_verify_frame136_checksum(SDFrame136 *frame);
+
 /* 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/sdmmc-internal.c b/hw/sd/sdmmc-internal.c
index c990cc9e8e..68350a2304 100644
--- a/hw/sd/sdmmc-internal.c
+++ b/hw/sd/sdmmc-internal.c
@@ -117,6 +117,11 @@  static uint8_t sd_calc_frame48_crc7(uint8_t cmd, uint32_t arg, bool is_response)
     return sd_crc7(buffer, sizeof(buffer));
 }
 
+static uint8_t sd_calc_frame136_crc7(SDFrame136 *frame)
+{
+    return (sd_crc7(frame->content, sizeof(frame->content)) << 1) | 1;
+}
+
 bool sd_verify_frame48_checksum(SDFrame48 *frame, bool is_response)
 {
     uint8_t crc = sd_calc_frame48_crc7(frame->cmd, frame->arg, is_response);
@@ -124,11 +129,21 @@  bool sd_verify_frame48_checksum(SDFrame48 *frame, bool is_response)
     return crc == frame->crc;
 }
 
+bool sd_verify_frame136_checksum(SDFrame136 *frame)
+{
+    return sd_calc_frame136_crc7(frame) == frame->crc;
+}
+
 void sd_update_frame48_checksum(SDFrame48 *frame, bool is_response)
 {
     frame->crc = sd_calc_frame48_crc7(frame->cmd, frame->arg, is_response);
 }
 
+void sd_update_frame136_checksum(SDFrame136 *frame)
+{
+    frame->crc = (sd_crc7(frame->content, sizeof(frame->content)) << 1) | 1;
+}
+
 void sd_prepare_frame48(SDFrame48 *frame, uint8_t cmd, uint32_t arg,
                         bool is_response, bool gen_crc)
 {