HPM SDK
HPMicro Software Development Kit
hpm_sdmmc_card.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2023 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 };
121 
122 
126 typedef union {
127  uint32_t status;
128  struct {
129  uint32_t : 3;
130  uint32_t ake_seq_error: 1;
131  uint32_t : 1;
132  uint32_t app_cmd: 1;
133  uint32_t fx_event: 1;
134  uint32_t : 1;
135  uint32_t ready_for_data: 1;
136  uint32_t current_state: 4;
137  uint32_t erase_reset: 1;
138  uint32_t card_ecc_disabled: 1;
139  uint32_t wp_erase_skip: 1;
140  uint32_t csd_overwrite: 1;
141  uint32_t : 2;
142  uint32_t error: 1;
143  uint32_t cc_error: 1;
144  uint32_t card_ecc_failed: 1;
145  uint32_t illegal_command: 1;
146  uint32_t com_crc_error: 1;
147  uint32_t lock_unlock_failed: 1;
148  uint32_t card_is_locked: 1;
149  uint32_t wp_violation: 1;
150  uint32_t erase_param: 1;
151  uint32_t erase_seq_error: 1;
152  uint32_t block_len_error: 1;
153  uint32_t address_error: 1;
154  uint32_t out_of_range: 1;
155  };
157 
161 typedef struct {
162  uint8_t bus_width;
163  uint8_t secure_mode;
164  uint16_t card_type;
165  uint32_t protected_size;
166  uint8_t speed_class;
169  uint8_t erase_offset;
170  uint32_t au_size;
171  uint32_t erase_timeout;
172  uint32_t erase_size;
173 
174  uint32_t uhs_au_size;
175  uint8_t reserved[3];
176 } sd_status_t;
177 
181 typedef union {
182  struct {
183  uint64_t : 1;
184  uint64_t crc7: 7;
185  uint64_t mdt: 12;
186  uint64_t : 4;
187  uint64_t psn: 32;
188  uint64_t prv: 8;
189  uint64_t pnm: 40;
190  uint64_t oid: 16;
191  uint64_t mid: 8;
192  };
193  uint32_t cid_words[4];
194 } sd_cid_t;
195 
199 typedef union {
200  uint32_t ocr_word;
201  struct {
202  uint32_t : 7;
203  uint32_t low_voltage_range: 1;
204  uint32_t : 7;
205  uint32_t support_2v7_2v8: 1;
206  uint32_t support_2v8_2v9: 1;
207  uint32_t support_2v9_3v0: 1;
208  uint32_t support_3v0_3v1: 1;
209  uint32_t support_3v1_3v2: 1;
210  uint32_t support_3v2_3v3: 1;
211  uint32_t support_3v3_3v4: 1;
212  uint32_t support_3v4_3v5: 1;
213  uint32_t support_3v5_3v6: 1;
215  uint32_t : 2;
216  uint32_t over_2tb_support: 1;
217  uint32_t : 1;
218  uint32_t uhs2_card_status: 1;
219  uint32_t card_capacity_status: 1;
220  uint32_t card_power_up_status: 1;
221  };
222 } sd_ocr_t;
223 
224 
228 typedef struct _sd_csd {
229  uint8_t csd_structure;
230  uint8_t data_read_access_time1;
231  uint8_t data_read_access_time2;
232  uint8_t transfer_speed;
233  uint16_t card_command_class;
234  bool support_read_block_partial;
235  bool support_write_block_misalignment;
236  bool support_read_block_misalignment;
237  bool is_dsr_implemented;
238  bool support_sdxc;
239  bool is_erase_block_enabled;
240  bool is_write_protection_group_enabled;
241  bool support_write_block_partial;
242  bool support_file_format_group;
243  bool support_copy;
244  bool support_permanent_write_protect;
245  bool support_temporary_write_protect;
246 
247  uint8_t read_current_vdd_min;
248  uint8_t read_current_vdd_max;
249  uint8_t write_current_vdd_min;
250  uint8_t write_current_vdd_max;
251  uint8_t device_size_multiplier;
252  uint8_t write_speed_factor;
253  uint8_t file_format;
254 
255  uint32_t device_size;
256  uint32_t read_block_len;
257  uint32_t erase_sector_size;
258  uint32_t max_write_block_len;
259  uint32_t write_protect_group_size;
261 
265 typedef union {
266  struct {
267  uint32_t reserved;
268  uint32_t support_cmd20: 1;
269  uint32_t support_cmd23: 1;
272  uint32_t : 2;
273  uint32_t sd_specx: 4;
274  uint32_t sd_spec4: 1;
275  uint32_t ex_security: 4;
276  uint32_t sd_spec3: 1;
277  uint32_t sd_bus_widths: 4;
278  uint32_t sd_security: 3;
280  uint32_t sd_spec: 4;
281  uint32_t scr_structure: 4;
282  };
283  uint32_t scr_word[2];
284 } sd_scr_t;
285 
286 
287 
288 typedef enum {
293 } sdcard_type_t;
294 
295 #define SDMMC_BLOCK_SIZE_DEFAULT (512U)
296 
297 
301 #define SPISD_DUMMY_BYTE 0xFFU
302 #define SPISD_START_TOKEN 0xFEU
303 #define SPISD_START_MULTI_WRITE_TOKEN 0xFCU
304 #define SPISD_END_MULTI_WRITE_TOKEN 0xFDU
308 #define SPI_SD_BLOCK_SIZE (512U)
309 
313 #define SPISD_R1_IDLE_FLAG (0x01)
314 #define SPISD_R1_ERASE_RESET_FLAG (0x02)
315 #define SPISD_R1_ILLEGAL_CMD_FLAG (0x04)
316 #define SPISD_R1_CMD_CRC_FLAG (0x08)
317 #define SPISD_R1_ERASE_SEQ_ERROR_FLAG (0x10)
318 #define SPISD_R1_ADDR_ERROR_FLAG (0x20)
319 #define SPISD_R1_PARAM_ERROR_FLAG (0x40)
320 #define SPISD_R1_ZERO_FLAG (0x80)
321 
322 
323 #endif /* HPM_SDMMC_CARD_H */
@ 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
@ 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
@ 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_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
@ 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
struct _sd_csd sd_csd_t
SD Card CSD register information.
sdcard_type_t
Definition: hpm_sdmmc_card.h:288
@ card_type_mmc
Definition: hpm_sdmmc_card.h:289
@ card_type_sd_v2_hc
Definition: hpm_sdmmc_card.h:292
@ card_type_sd_v2
Definition: hpm_sdmmc_card.h:291
@ card_type_sd_v1
Definition: hpm_sdmmc_card.h:290
SD Card Satus Register Information.
Definition: hpm_sdmmc_card.h:161
uint32_t protected_size
Definition: hpm_sdmmc_card.h:165
uint8_t speed_class
Definition: hpm_sdmmc_card.h:166
uint32_t erase_size
Definition: hpm_sdmmc_card.h:172
uint32_t au_size
Definition: hpm_sdmmc_card.h:170
uint8_t uhs_speed_grade
Definition: hpm_sdmmc_card.h:168
uint8_t bus_width
Definition: hpm_sdmmc_card.h:162
uint32_t erase_timeout
Definition: hpm_sdmmc_card.h:171
uint32_t uhs_au_size
Definition: hpm_sdmmc_card.h:174
uint8_t erase_offset
Definition: hpm_sdmmc_card.h:169
uint8_t secure_mode
Definition: hpm_sdmmc_card.h:163
uint8_t performance_move
Definition: hpm_sdmmc_card.h:167
uint16_t card_type
Definition: hpm_sdmmc_card.h:164
SD CID Register Information.
Definition: hpm_sdmmc_card.h:181
uint64_t mdt
Definition: hpm_sdmmc_card.h:185
uint64_t mid
Definition: hpm_sdmmc_card.h:191
uint64_t crc7
Definition: hpm_sdmmc_card.h:184
uint64_t psn
Definition: hpm_sdmmc_card.h:187
uint64_t pnm
Definition: hpm_sdmmc_card.h:189
uint64_t oid
Definition: hpm_sdmmc_card.h:190
uint64_t prv
Definition: hpm_sdmmc_card.h:188
SD OCR register information.
Definition: hpm_sdmmc_card.h:199
uint32_t over_2tb_support
Definition: hpm_sdmmc_card.h:216
uint32_t low_voltage_range
Definition: hpm_sdmmc_card.h:203
uint32_t uhs2_card_status
Definition: hpm_sdmmc_card.h:218
uint32_t support_2v9_3v0
Definition: hpm_sdmmc_card.h:207
uint32_t support_3v3_3v4
Definition: hpm_sdmmc_card.h:211
uint32_t support_3v0_3v1
Definition: hpm_sdmmc_card.h:208
uint32_t support_3v5_3v6
Definition: hpm_sdmmc_card.h:213
uint32_t support_2v7_2v8
Definition: hpm_sdmmc_card.h:205
uint32_t card_power_up_status
Definition: hpm_sdmmc_card.h:220
uint32_t switching_to_1v8_accepted
Definition: hpm_sdmmc_card.h:214
uint32_t ocr_word
Definition: hpm_sdmmc_card.h:200
uint32_t card_capacity_status
Definition: hpm_sdmmc_card.h:219
uint32_t support_3v4_3v5
Definition: hpm_sdmmc_card.h:212
uint32_t support_3v1_3v2
Definition: hpm_sdmmc_card.h:209
uint32_t support_3v2_3v3
Definition: hpm_sdmmc_card.h:210
uint32_t support_2v8_2v9
Definition: hpm_sdmmc_card.h:206
SD Card SCR register information.
Definition: hpm_sdmmc_card.h:265
uint32_t support_cmd58_or_cmd59
Definition: hpm_sdmmc_card.h:271
uint32_t sd_bus_widths
Definition: hpm_sdmmc_card.h:277
uint32_t scr_structure
Definition: hpm_sdmmc_card.h:281
uint32_t sd_specx
Definition: hpm_sdmmc_card.h:273
uint32_t ex_security
Definition: hpm_sdmmc_card.h:275
uint32_t sd_spec
Definition: hpm_sdmmc_card.h:280
uint32_t data_stat_after_erase
Definition: hpm_sdmmc_card.h:279
uint32_t sd_spec3
Definition: hpm_sdmmc_card.h:276
uint32_t sd_security
Definition: hpm_sdmmc_card.h:278
uint32_t reserved
Definition: hpm_sdmmc_card.h:267
uint32_t sd_spec4
Definition: hpm_sdmmc_card.h:274
uint32_t support_cmd23
Definition: hpm_sdmmc_card.h:269
uint32_t support_cmd48_or_cmd49
Definition: hpm_sdmmc_card.h:270
uint32_t support_cmd20
Definition: hpm_sdmmc_card.h:268
SD/MMC R1 register information.
Definition: hpm_sdmmc_card.h:126
uint32_t card_ecc_failed
Definition: hpm_sdmmc_card.h:144
uint32_t error
Definition: hpm_sdmmc_card.h:142
uint32_t card_is_locked
Definition: hpm_sdmmc_card.h:148
uint32_t ready_for_data
Definition: hpm_sdmmc_card.h:135
uint32_t csd_overwrite
Definition: hpm_sdmmc_card.h:140
uint32_t status
Definition: hpm_sdmmc_card.h:127
uint32_t illegal_command
Definition: hpm_sdmmc_card.h:145
uint32_t out_of_range
Definition: hpm_sdmmc_card.h:154
uint32_t ake_seq_error
Definition: hpm_sdmmc_card.h:130
uint32_t wp_violation
Definition: hpm_sdmmc_card.h:149
uint32_t erase_reset
Definition: hpm_sdmmc_card.h:137
uint32_t app_cmd
Definition: hpm_sdmmc_card.h:132
uint32_t erase_param
Definition: hpm_sdmmc_card.h:150
uint32_t cc_error
Definition: hpm_sdmmc_card.h:143
uint32_t card_ecc_disabled
Definition: hpm_sdmmc_card.h:138
uint32_t current_state
Definition: hpm_sdmmc_card.h:136
uint32_t wp_erase_skip
Definition: hpm_sdmmc_card.h:139
uint32_t fx_event
Definition: hpm_sdmmc_card.h:133
uint32_t block_len_error
Definition: hpm_sdmmc_card.h:152
uint32_t address_error
Definition: hpm_sdmmc_card.h:153
uint32_t erase_seq_error
Definition: hpm_sdmmc_card.h:151
uint32_t com_crc_error
Definition: hpm_sdmmc_card.h:146
uint32_t lock_unlock_failed
Definition: hpm_sdmmc_card.h:147