HPM SDK
HPMicro Software Development Kit
hpm_sdmmc_card.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_SDMMC_CARD_H
9 #define HPM_SDMMC_CARD_H
10 
11 #include <stdint.h>
12 
16 enum {
40 };
41 
45 enum {
53 
64 };
65 
69 enum {
84 
95 
99 
104 
108 
111 
114 
120 
124 };
125 
126 
130 typedef union {
131  uint32_t status;
132  struct {
133  uint32_t : 3;
134  uint32_t ake_seq_error: 1;
135  uint32_t : 1;
136  uint32_t app_cmd: 1;
137  uint32_t fx_event: 1;
138  uint32_t : 1;
139  uint32_t ready_for_data: 1;
140  uint32_t current_state: 4;
141  uint32_t erase_reset: 1;
142  uint32_t card_ecc_disabled: 1;
143  uint32_t wp_erase_skip: 1;
144  uint32_t csd_overwrite: 1;
145  uint32_t : 2;
146  uint32_t error: 1;
147  uint32_t cc_error: 1;
148  uint32_t card_ecc_failed: 1;
149  uint32_t illegal_command: 1;
150  uint32_t com_crc_error: 1;
151  uint32_t lock_unlock_failed: 1;
152  uint32_t card_is_locked: 1;
153  uint32_t wp_violation: 1;
154  uint32_t erase_param: 1;
155  uint32_t erase_seq_error: 1;
156  uint32_t block_len_error: 1;
157  uint32_t address_error: 1;
158  uint32_t out_of_range: 1;
159  };
161 
165 typedef struct {
166  uint8_t bus_width;
167  uint8_t secure_mode;
168  uint16_t card_type;
169  uint32_t protected_size;
170  uint8_t speed_class;
173  uint8_t erase_offset;
174  uint32_t au_size;
175  uint32_t erase_timeout;
176  uint32_t erase_size;
177 
178  uint32_t uhs_au_size;
179  uint8_t reserved[3];
180 } sd_status_t;
181 
185 typedef union {
186  struct {
187  uint64_t : 1;
188  uint64_t crc7: 7;
189  uint64_t mdt: 12;
190  uint64_t : 4;
191  uint64_t psn: 32;
192  uint64_t prv: 8;
193  uint64_t pnm: 40;
194  uint64_t oid: 16;
195  uint64_t mid: 8;
196  };
197  uint32_t cid_words[4];
198 } sd_cid_t;
199 
203 typedef union {
204  uint32_t ocr_word;
205  struct {
206  uint32_t : 7;
207  uint32_t low_voltage_range: 1;
208  uint32_t : 7;
209  uint32_t support_2v7_2v8: 1;
210  uint32_t support_2v8_2v9: 1;
211  uint32_t support_2v9_3v0: 1;
212  uint32_t support_3v0_3v1: 1;
213  uint32_t support_3v1_3v2: 1;
214  uint32_t support_3v2_3v3: 1;
215  uint32_t support_3v3_3v4: 1;
216  uint32_t support_3v4_3v5: 1;
217  uint32_t support_3v5_3v6: 1;
219  uint32_t : 2;
220  uint32_t over_2tb_support: 1;
221  uint32_t : 1;
222  uint32_t uhs2_card_status: 1;
223  uint32_t card_capacity_status: 1;
224  uint32_t card_power_up_status: 1;
225  };
226 } sd_ocr_t;
227 
228 
232 typedef struct _sd_csd {
233  uint8_t csd_structure;
234  uint8_t data_read_access_time1;
235  uint8_t data_read_access_time2;
236  uint8_t transfer_speed;
237  uint16_t card_command_class;
238  bool support_read_block_partial;
239  bool support_write_block_misalignment;
240  bool support_read_block_misalignment;
241  bool is_dsr_implemented;
242  bool support_sdxc;
243  bool is_erase_block_enabled;
244  bool is_write_protection_group_enabled;
245  bool support_write_block_partial;
246  bool support_file_format_group;
247  bool support_copy;
248  bool support_permanent_write_protect;
249  bool support_temporary_write_protect;
250 
251  uint8_t read_current_vdd_min;
252  uint8_t read_current_vdd_max;
253  uint8_t write_current_vdd_min;
254  uint8_t write_current_vdd_max;
255  uint8_t device_size_multiplier;
256  uint8_t write_speed_factor;
257  uint8_t file_format;
258 
259  uint32_t device_size;
260  uint32_t read_block_len;
261  uint32_t erase_sector_size;
262  uint32_t max_write_block_len;
263  uint32_t write_protect_group_size;
265 
269 typedef union {
270  struct {
271  uint32_t reserved;
272  uint32_t support_cmd20: 1;
273  uint32_t support_cmd23: 1;
276  uint32_t : 2;
277  uint32_t sd_specx: 4;
278  uint32_t sd_spec4: 1;
279  uint32_t ex_security: 4;
280  uint32_t sd_spec3: 1;
281  uint32_t sd_bus_widths: 4;
282  uint32_t sd_security: 3;
284  uint32_t sd_spec: 4;
285  uint32_t scr_structure: 4;
286  };
287  uint32_t scr_word[2];
288 } sd_scr_t;
289 
290 
291 
292 typedef enum {
297 } sdcard_type_t;
298 
299 #define SDMMC_BLOCK_SIZE_DEFAULT (512U)
300 
301 
305 #define SPISD_DUMMY_BYTE 0xFFU
306 #define SPISD_START_TOKEN 0xFEU
307 #define SPISD_START_MULTI_WRITE_TOKEN 0xFCU
308 #define SPISD_END_MULTI_WRITE_TOKEN 0xFDU
312 #define SPI_SD_BLOCK_SIZE (512U)
313 
317 #define SPISD_R1_IDLE_FLAG (0x01)
318 #define SPISD_R1_ERASE_RESET_FLAG (0x02)
319 #define SPISD_R1_ILLEGAL_CMD_FLAG (0x04)
320 #define SPISD_R1_CMD_CRC_FLAG (0x08)
321 #define SPISD_R1_ERASE_SEQ_ERROR_FLAG (0x10)
322 #define SPISD_R1_ADDR_ERROR_FLAG (0x20)
323 #define SPISD_R1_PARAM_ERROR_FLAG (0x40)
324 #define SPISD_R1_ZERO_FLAG (0x80)
325 
326 
327 #endif /* HPM_SDMMC_CARD_H */
@ sd_cmd_all_send_cid
Definition: hpm_sdmmc_card.h:54
@ sd_cmd_crc_option
Definition: hpm_sdmmc_card.h:63
@ sd_cmd_erase_end
Definition: hpm_sdmmc_card.h:62
@ sd_acmd_set_clear_card_detect
Definition: hpm_sdmmc_card.h:51
@ sd_cmd_send_csd
Definition: hpm_sdmmc_card.h:58
@ sd_acmd_sd_status
Definition: hpm_sdmmc_card.h:47
@ sd_cmd_send_if_cond
Definition: hpm_sdmmc_card.h:57
@ sd_cmd_erase_start
Definition: hpm_sdmmc_card.h:61
@ sd_cmd_send_relative_addr
Definition: hpm_sdmmc_card.h:55
@ sd_acmd_set_bus_width
Definition: hpm_sdmmc_card.h:46
@ sd_acmd_sd_send_op_cond
Definition: hpm_sdmmc_card.h:50
@ sd_acmd_send_scr
Definition: hpm_sdmmc_card.h:52
@ sd_cmd_switch
Definition: hpm_sdmmc_card.h:56
@ sd_acmd_set_num_wr_blocks
Definition: hpm_sdmmc_card.h:48
@ sd_cmd_send_tuning_block
Definition: hpm_sdmmc_card.h:60
@ sd_voltage_switch
Definition: hpm_sdmmc_card.h:59
@ sd_acmd_set_wr_blk_erase_count
Definition: hpm_sdmmc_card.h:49
struct _sd_csd sd_csd_t
SD Card CSD register information.
sdcard_type_t
Definition: hpm_sdmmc_card.h:292
@ card_type_mmc
Definition: hpm_sdmmc_card.h:293
@ card_type_sd_v2_hc
Definition: hpm_sdmmc_card.h:296
@ card_type_sd_v2
Definition: hpm_sdmmc_card.h:295
@ card_type_sd_v1
Definition: hpm_sdmmc_card.h:294
@ sdmmc_cmd_select_card
Definition: hpm_sdmmc_card.h:20
@ sdmmc_cmd_app_cmd
Definition: hpm_sdmmc_card.h:37
@ sdmmc_cmd_go_inactive_state
Definition: hpm_sdmmc_card.h:25
@ sdmmc_cmd_send_status
Definition: hpm_sdmmc_card.h:24
@ sdmmc_cmd_erase
Definition: hpm_sdmmc_card.h:35
@ sdmmc_cmd_set_block_length
Definition: hpm_sdmmc_card.h:26
@ sdmmc_cmd_send_cid
Definition: hpm_sdmmc_card.h:22
@ sdmmc_cmd_send_csd
Definition: hpm_sdmmc_card.h:21
@ sdmmc_cmd_go_idle_state
Definition: hpm_sdmmc_card.h:17
@ sdmmc_cmd_read_single_block
Definition: hpm_sdmmc_card.h:27
@ sdmmc_cmd_write_multiple_block
Definition: hpm_sdmmc_card.h:31
@ sdmmc_cmd_clear_write_protect
Definition: hpm_sdmmc_card.h:34
@ sdmmc_cmd_read_ocr
Definition: hpm_sdmmc_card.h:39
@ sdmmc_cmd_program_csd
Definition: hpm_sdmmc_card.h:32
@ sdmmc_cmd_general_cmd
Definition: hpm_sdmmc_card.h:38
@ sdmmc_cmd_stop_transmission
Definition: hpm_sdmmc_card.h:23
@ sdmmc_cmd_set_write_protect
Definition: hpm_sdmmc_card.h:33
@ sdmmc_cmd_all_send_cid
Definition: hpm_sdmmc_card.h:18
@ sdmmc_cmd_lock_unlock
Definition: hpm_sdmmc_card.h:36
@ sdmmc_cmd_read_multiple_block
Definition: hpm_sdmmc_card.h:28
@ sdmmc_cmd_write_single_block
Definition: hpm_sdmmc_card.h:30
@ sdmmc_cmd_set_block_count
Definition: hpm_sdmmc_card.h:29
@ sdmmc_cmd_set_dsr
Definition: hpm_sdmmc_card.h:19
@ sdio_cmd_io_send_op_cond
Definition: hpm_sdmmc_card.h:121
@ emmc_cmd_send_status
Definition: hpm_sdmmc_card.h:81
@ emmc_cmd_protocol_write
Definition: hpm_sdmmc_card.h:113
@ emmc_cmd_lock_unlock
Definition: hpm_sdmmc_card.h:107
@ emmc_cmd_protocol_read
Definition: hpm_sdmmc_card.h:112
@ emmc_cmd_send_write_prot
Definition: hpm_sdmmc_card.h:102
@ emmc_cmd_read_multiple_block
Definition: hpm_sdmmc_card.h:87
@ emmc_cmd_send_cid
Definition: hpm_sdmmc_card.h:79
@ emmc_cmd_execute_write_task
Definition: hpm_sdmmc_card.h:118
@ emmc_cmd_program_csd
Definition: hpm_sdmmc_card.h:93
@ emmc_cmd_set_relative_addr
Definition: hpm_sdmmc_card.h:72
@ emmc_cmd_send_ext_csd
Definition: hpm_sdmmc_card.h:77
@ emmc_cmd_switch
Definition: hpm_sdmmc_card.h:75
@ sdio_cmd_io_rw_direct
Definition: hpm_sdmmc_card.h:122
@ emmc_cmd_app_cmd
Definition: hpm_sdmmc_card.h:109
@ emmc_cmd_gen_cmd
Definition: hpm_sdmmc_card.h:110
@ emmc_cmd_fast_io
Definition: hpm_sdmmc_card.h:105
@ emmc_cmd_send_tuning_block
Definition: hpm_sdmmc_card.h:88
@ emmc_cmd_set_time
Definition: hpm_sdmmc_card.h:94
@ emmc_cmd_erase
Definition: hpm_sdmmc_card.h:98
@ sdio_cmd_io_rw_extend
Definition: hpm_sdmmc_card.h:123
@ emmc_cmd_go_inactive_state
Definition: hpm_sdmmc_card.h:83
@ emmc_cmd_set_write_prot
Definition: hpm_sdmmc_card.h:100
@ emmc_cmd_write_multiple_block
Definition: hpm_sdmmc_card.h:91
@ emmc_cmd_bus_test
Definition: hpm_sdmmc_card.h:82
@ emmc_cmd_send_write_prot_type
Definition: hpm_sdmmc_card.h:103
@ emmc_cmd_erase_group_start
Definition: hpm_sdmmc_card.h:96
@ emmc_cmd_execute_read_task
Definition: hpm_sdmmc_card.h:117
@ emmc_cmd_all_send_cid
Definition: hpm_sdmmc_card.h:71
@ emmc_cmd_set_block_length
Definition: hpm_sdmmc_card.h:85
@ emmc_cmd_clear_write_prot
Definition: hpm_sdmmc_card.h:101
@ emmc_cmd_go_irq_state
Definition: hpm_sdmmc_card.h:106
@ emmc_cmd_cmdq_task_mgmt
Definition: hpm_sdmmc_card.h:119
@ emmc_cmd_write_single_block
Definition: hpm_sdmmc_card.h:90
@ emmc_cmd_stop_transmission
Definition: hpm_sdmmc_card.h:80
@ emmc_cmd_read_single_block
Definition: hpm_sdmmc_card.h:86
@ emmc_cmd_send_csd
Definition: hpm_sdmmc_card.h:78
@ emmc_cmd_select
Definition: hpm_sdmmc_card.h:76
@ emmc_cmd_queued_task_params
Definition: hpm_sdmmc_card.h:115
@ emmc_cmd_sleep_awake
Definition: hpm_sdmmc_card.h:74
@ emmc_cmd_set_block_count
Definition: hpm_sdmmc_card.h:89
@ emmc_cmd_program_cid
Definition: hpm_sdmmc_card.h:92
@ emmc_cmd_erase_group_end
Definition: hpm_sdmmc_card.h:97
@ emmc_cmd_send_op_cond
Definition: hpm_sdmmc_card.h:70
@ emmc_cmd_set_dsr
Definition: hpm_sdmmc_card.h:73
@ emmc_cmd_queued_task_address
Definition: hpm_sdmmc_card.h:116
SD Card Status Register Information.
Definition: hpm_sdmmc_card.h:165
uint32_t protected_size
Definition: hpm_sdmmc_card.h:169
uint8_t speed_class
Definition: hpm_sdmmc_card.h:170
uint32_t erase_size
Definition: hpm_sdmmc_card.h:176
uint32_t au_size
Definition: hpm_sdmmc_card.h:174
uint8_t uhs_speed_grade
Definition: hpm_sdmmc_card.h:172
uint8_t bus_width
Definition: hpm_sdmmc_card.h:166
uint32_t erase_timeout
Definition: hpm_sdmmc_card.h:175
uint32_t uhs_au_size
Definition: hpm_sdmmc_card.h:178
uint8_t erase_offset
Definition: hpm_sdmmc_card.h:173
uint8_t secure_mode
Definition: hpm_sdmmc_card.h:167
uint8_t performance_move
Definition: hpm_sdmmc_card.h:171
uint16_t card_type
Definition: hpm_sdmmc_card.h:168
SD CID Register Information.
Definition: hpm_sdmmc_card.h:185
uint64_t mdt
Definition: hpm_sdmmc_card.h:189
uint64_t mid
Definition: hpm_sdmmc_card.h:195
uint64_t crc7
Definition: hpm_sdmmc_card.h:188
uint64_t psn
Definition: hpm_sdmmc_card.h:191
uint64_t pnm
Definition: hpm_sdmmc_card.h:193
uint64_t oid
Definition: hpm_sdmmc_card.h:194
uint64_t prv
Definition: hpm_sdmmc_card.h:192
SD OCR register information.
Definition: hpm_sdmmc_card.h:203
uint32_t over_2tb_support
Definition: hpm_sdmmc_card.h:220
uint32_t low_voltage_range
Definition: hpm_sdmmc_card.h:207
uint32_t uhs2_card_status
Definition: hpm_sdmmc_card.h:222
uint32_t support_2v9_3v0
Definition: hpm_sdmmc_card.h:211
uint32_t support_3v3_3v4
Definition: hpm_sdmmc_card.h:215
uint32_t support_3v0_3v1
Definition: hpm_sdmmc_card.h:212
uint32_t support_3v5_3v6
Definition: hpm_sdmmc_card.h:217
uint32_t support_2v7_2v8
Definition: hpm_sdmmc_card.h:209
uint32_t card_power_up_status
Definition: hpm_sdmmc_card.h:224
uint32_t switching_to_1v8_accepted
Definition: hpm_sdmmc_card.h:218
uint32_t ocr_word
Definition: hpm_sdmmc_card.h:204
uint32_t card_capacity_status
Definition: hpm_sdmmc_card.h:223
uint32_t support_3v4_3v5
Definition: hpm_sdmmc_card.h:216
uint32_t support_3v1_3v2
Definition: hpm_sdmmc_card.h:213
uint32_t support_3v2_3v3
Definition: hpm_sdmmc_card.h:214
uint32_t support_2v8_2v9
Definition: hpm_sdmmc_card.h:210
SD Card SCR register information.
Definition: hpm_sdmmc_card.h:269
uint32_t support_cmd58_or_cmd59
Definition: hpm_sdmmc_card.h:275
uint32_t sd_bus_widths
Definition: hpm_sdmmc_card.h:281
uint32_t scr_structure
Definition: hpm_sdmmc_card.h:285
uint32_t sd_specx
Definition: hpm_sdmmc_card.h:277
uint32_t ex_security
Definition: hpm_sdmmc_card.h:279
uint32_t sd_spec
Definition: hpm_sdmmc_card.h:284
uint32_t data_stat_after_erase
Definition: hpm_sdmmc_card.h:283
uint32_t sd_spec3
Definition: hpm_sdmmc_card.h:280
uint32_t sd_security
Definition: hpm_sdmmc_card.h:282
uint32_t reserved
Definition: hpm_sdmmc_card.h:271
uint32_t sd_spec4
Definition: hpm_sdmmc_card.h:278
uint32_t support_cmd23
Definition: hpm_sdmmc_card.h:273
uint32_t support_cmd48_or_cmd49
Definition: hpm_sdmmc_card.h:274
uint32_t support_cmd20
Definition: hpm_sdmmc_card.h:272
SD/MMC R1 register information.
Definition: hpm_sdmmc_card.h:130
uint32_t card_ecc_failed
Definition: hpm_sdmmc_card.h:148
uint32_t error
Definition: hpm_sdmmc_card.h:146
uint32_t card_is_locked
Definition: hpm_sdmmc_card.h:152
uint32_t ready_for_data
Definition: hpm_sdmmc_card.h:139
uint32_t csd_overwrite
Definition: hpm_sdmmc_card.h:144
uint32_t status
Definition: hpm_sdmmc_card.h:131
uint32_t illegal_command
Definition: hpm_sdmmc_card.h:149
uint32_t out_of_range
Definition: hpm_sdmmc_card.h:158
uint32_t ake_seq_error
Definition: hpm_sdmmc_card.h:134
uint32_t wp_violation
Definition: hpm_sdmmc_card.h:153
uint32_t erase_reset
Definition: hpm_sdmmc_card.h:141
uint32_t app_cmd
Definition: hpm_sdmmc_card.h:136
uint32_t erase_param
Definition: hpm_sdmmc_card.h:154
uint32_t cc_error
Definition: hpm_sdmmc_card.h:147
uint32_t card_ecc_disabled
Definition: hpm_sdmmc_card.h:142
uint32_t current_state
Definition: hpm_sdmmc_card.h:140
uint32_t wp_erase_skip
Definition: hpm_sdmmc_card.h:143
uint32_t fx_event
Definition: hpm_sdmmc_card.h:137
uint32_t block_len_error
Definition: hpm_sdmmc_card.h:156
uint32_t address_error
Definition: hpm_sdmmc_card.h:157
uint32_t erase_seq_error
Definition: hpm_sdmmc_card.h:155
uint32_t com_crc_error
Definition: hpm_sdmmc_card.h:150
uint32_t lock_unlock_failed
Definition: hpm_sdmmc_card.h:151