ChibiOS/HAL 9.0.0
hal_mmcsd.h
Go to the documentation of this file.
1/*
2 ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15*/
16
17/**
18 * @file hal_mmcsd.h
19 * @brief MMC/SD cards common header.
20 * @details This header defines an abstract interface useful to access MMC/SD
21 * I/O block devices in a standardized way.
22 *
23 * @addtogroup MMCSD
24 * @{
25 */
26
27#ifndef HAL_MMCSD_H
28#define HAL_MMCSD_H
29
30#if (HAL_USE_MMC_SPI == TRUE) || (HAL_USE_SDC == TRUE) || defined(__DOXYGEN__)
31
32/*===========================================================================*/
33/* Driver constants. */
34/*===========================================================================*/
35
36/**
37 * @brief Fixed block size for MMC/SD block devices.
38 */
39#define MMCSD_BLOCK_SIZE 512U
40
41/**
42 * @brief Mask of error bits in R1 responses.
43 */
44#define MMCSD_R1_ERROR_MASK 0xFDFFE008U
45
46/**
47 * @brief Fixed pattern for CMD8.
48 */
49#define MMCSD_CMD8_PATTERN 0x000001AAU
50
51/**
52 * @name SD/MMC status conditions
53 * @{
54 */
55#define MMCSD_STS_IDLE 0U
56#define MMCSD_STS_READY 1U
57#define MMCSD_STS_IDENT 2U
58#define MMCSD_STS_STBY 3U
59#define MMCSD_STS_TRAN 4U
60#define MMCSD_STS_DATA 5U
61#define MMCSD_STS_RCV 6U
62#define MMCSD_STS_PRG 7U
63#define MMCSD_STS_DIS 8U
64/** @} */
65
66/**
67 * @name SD/MMC commands
68 * @{
69 */
70#define MMCSD_CMD_GO_IDLE_STATE 0U
71#define MMCSD_CMD_INIT 1U
72#define MMCSD_CMD_ALL_SEND_CID 2U
73#define MMCSD_CMD_SEND_RELATIVE_ADDR 3U
74#define MMCSD_CMD_SET_RELATIVE_ADDR MMCSD_CMD_SEND_RELATIVE_ADDR
75#define MMCSD_CMD_SET_BUS_WIDTH 6U
76#define MMCSD_CMD_SWITCH MMCSD_CMD_SET_BUS_WIDTH
77#define MMCSD_CMD_SEL_DESEL_CARD 7U
78#define MMCSD_CMD_SEND_IF_COND 8U
79#define MMCSD_CMD_SEND_EXT_CSD MMCSD_CMD_SEND_IF_COND
80#define MMCSD_CMD_SEND_CSD 9U
81#define MMCSD_CMD_SEND_CID 10U
82#define MMCSD_CMD_STOP_TRANSMISSION 12U
83#define MMCSD_CMD_SEND_STATUS 13U
84#define MMCSD_CMD_SET_BLOCKLEN 16U
85#define MMCSD_CMD_READ_SINGLE_BLOCK 17U
86#define MMCSD_CMD_READ_MULTIPLE_BLOCK 18U
87#define MMCSD_CMD_SET_BLOCK_COUNT 23U
88#define MMCSD_CMD_WRITE_BLOCK 24U
89#define MMCSD_CMD_WRITE_MULTIPLE_BLOCK 25U
90#define MMCSD_CMD_ERASE_RW_BLK_START 32U
91#define MMCSD_CMD_ERASE_RW_BLK_END 33U
92#define MMCSD_CMD_ERASE 38U
93#define MMCSD_CMD_APP_OP_COND 41U
94#define MMCSD_CMD_LOCK_UNLOCK 42U
95#define MMCSD_CMD_APP_CMD 55U
96#define MMCSD_CMD_READ_OCR 58U
97/** @} */
98
99/**
100 * @name CSD record offsets
101 * @{
102 */
103/* CSD for MMC */
104#define MMCSD_CSD_MMC_CSD_STRUCTURE_SLICE 127U, 126U
105#define MMCSD_CSD_MMC_SPEC_VERS_SLICE 125U, 122U
106#define MMCSD_CSD_MMC_TAAC_SLICE 119U, 112U
107#define MMCSD_CSD_MMC_NSAC_SLICE 111U, 104U
108#define MMCSD_CSD_MMC_TRAN_SPEED_SLICE 103U, 96U
109#define MMCSD_CSD_MMC_CCC_SLICE 95U, 84U
110#define MMCSD_CSD_MMC_READ_BL_LEN_SLICE 83U, 80U
111#define MMCSD_CSD_MMC_READ_BL_PARTIAL_SLICE 79U, 79U
112#define MMCSD_CSD_MMC_WRITE_BLK_MISALIGN_SLICE 78U, 78U
113#define MMCSD_CSD_MMC_READ_BLK_MISALIGN_SLICE 77U, 77U
114#define MMCSD_CSD_MMC_DSR_IMP_SLICE 76U, 76U
115#define MMCSD_CSD_MMC_C_SIZE_SLICE 73U, 62U
116#define MMCSD_CSD_MMC_VDD_R_CURR_MIN_SLICE 61U, 59U
117#define MMCSD_CSD_MMC_VDD_R_CURR_MAX_SLICE 58U, 56U
118#define MMCSD_CSD_MMC_VDD_W_CURR_MIN_SLICE 55U, 53U
119#define MMCSD_CSD_MMC_VDD_W_CURR_MAX_SLICE 52U, 50U
120#define MMCSD_CSD_MMC_C_SIZE_MULT_SLICE 49U, 47U
121#define MMCSD_CSD_MMC_ERASE_GRP_SIZE_SLICE 46U, 42U
122#define MMCSD_CSD_MMC_ERASE_GRP_MULT_SLICE 41U, 37U
123#define MMCSD_CSD_MMC_WP_GRP_SIZE_SLICE 36U, 32U
124#define MMCSD_CSD_MMC_WP_GRP_ENABLE_SLICE 31U, 31U
125#define MMCSD_CSD_MMC_DEFAULT_ECC_SLICE 30U, 29U
126#define MMCSD_CSD_MMC_R2W_FACTOR_SLICE 28U, 26U
127#define MMCSD_CSD_MMC_WRITE_BL_LEN_SLICE 25U, 22U
128#define MMCSD_CSD_MMC_WRITE_BL_PARTIAL_SLICE 21U, 21U
129#define MMCSD_CSD_MMC_CONTENT_PROT_APP_SLICE 16U, 16U
130#define MMCSD_CSD_MMC_FILE_FORMAT_GRP_SLICE 15U, 15U
131#define MMCSD_CSD_MMC_COPY_SLICE 14U, 14U
132#define MMCSD_CSD_MMC_PERM_WRITE_PROTECT_SLICE 13U, 13U
133#define MMCSD_CSD_MMC_TMP_WRITE_PROTECT_SLICE 12U, 12U
134#define MMCSD_CSD_MMC_FILE_FORMAT_SLICE 11U, 10U
135#define MMCSD_CSD_MMC_ECC_SLICE 9U, 8U
136#define MMCSD_CSD_MMC_CRC_SLICE 7U, 1U
137
138/* CSD version 2.0 */
139#define MMCSD_CSD_20_CRC_SLICE 7U, 1U
140#define MMCSD_CSD_20_FILE_FORMAT_SLICE 11U, 10U
141#define MMCSD_CSD_20_TMP_WRITE_PROTECT_SLICE 12U, 12U
142#define MMCSD_CSD_20_PERM_WRITE_PROTECT_SLICE 13U, 13U
143#define MMCSD_CSD_20_COPY_SLICE 14U, 14U
144#define MMCSD_CSD_20_FILE_FORMAT_GRP_SLICE 15U, 15U
145#define MMCSD_CSD_20_WRITE_BL_PARTIAL_SLICE 21U, 21U
146#define MMCSD_CSD_20_WRITE_BL_LEN_SLICE 25U, 12U
147#define MMCSD_CSD_20_R2W_FACTOR_SLICE 28U, 26U
148#define MMCSD_CSD_20_WP_GRP_ENABLE_SLICE 31U, 31U
149#define MMCSD_CSD_20_WP_GRP_SIZE_SLICE 38U, 32U
150#define MMCSD_CSD_20_ERASE_SECTOR_SIZE_SLICE 45U, 39U
151#define MMCSD_CSD_20_ERASE_BLK_EN_SLICE 46U, 46U
152#define MMCSD_CSD_20_C_SIZE_SLICE 69U, 48U
153#define MMCSD_CSD_20_DSR_IMP_SLICE 76U, 76U
154#define MMCSD_CSD_20_READ_BLK_MISALIGN_SLICE 77U, 77U
155#define MMCSD_CSD_20_WRITE_BLK_MISALIGN_SLICE 78U, 78U
156#define MMCSD_CSD_20_READ_BL_PARTIAL_SLICE 79U, 79U
157#define MMCSD_CSD_20_READ_BL_LEN_SLICE 83U, 80U
158#define MMCSD_CSD_20_CCC_SLICE 95U, 84U
159#define MMCSD_CSD_20_TRANS_SPEED_SLICE 103U, 96U
160#define MMCSD_CSD_20_NSAC_SLICE 111U, 104U
161#define MMCSD_CSD_20_TAAC_SLICE 119U, 112U
162#define MMCSD_CSD_20_CSD_STRUCTURE_SLICE 127U, 126U
163
164/* CSD version 1.0 */
165#define MMCSD_CSD_10_CRC_SLICE MMCSD_CSD_20_CRC_SLICE
166#define MMCSD_CSD_10_FILE_FORMAT_SLICE MMCSD_CSD_20_FILE_FORMAT_SLICE
167#define MMCSD_CSD_10_TMP_WRITE_PROTECT_SLICE MMCSD_CSD_20_TMP_WRITE_PROTECT_SLICE
168#define MMCSD_CSD_10_PERM_WRITE_PROTECT_SLICE MMCSD_CSD_20_PERM_WRITE_PROTECT_SLICE
169#define MMCSD_CSD_10_COPY_SLICE MMCSD_CSD_20_COPY_SLICE
170#define MMCSD_CSD_10_FILE_FORMAT_GRP_SLICE MMCSD_CSD_20_FILE_FORMAT_GRP_SLICE
171#define MMCSD_CSD_10_WRITE_BL_PARTIAL_SLICE MMCSD_CSD_20_WRITE_BL_PARTIAL_SLICE
172#define MMCSD_CSD_10_WRITE_BL_LEN_SLICE MMCSD_CSD_20_WRITE_BL_LEN_SLICE
173#define MMCSD_CSD_10_R2W_FACTOR_SLICE MMCSD_CSD_20_R2W_FACTOR_SLICE
174#define MMCSD_CSD_10_WP_GRP_ENABLE_SLICE MMCSD_CSD_20_WP_GRP_ENABLE_SLICE
175#define MMCSD_CSD_10_WP_GRP_SIZE_SLICE MMCSD_CSD_20_WP_GRP_SIZE_SLICE
176#define MMCSD_CSD_10_ERASE_SECTOR_SIZE_SLICE MMCSD_CSD_20_ERASE_SECTOR_SIZE_SLICE
177#define MMCSD_CSD_10_ERASE_BLK_EN_SLICE MMCSD_CSD_20_ERASE_BLK_EN_SLICE
178#define MMCSD_CSD_10_C_SIZE_MULT_SLICE 49U, 47U
179#define MMCSD_CSD_10_VDD_W_CURR_MAX_SLICE 52U, 50U
180#define MMCSD_CSD_10_VDD_W_CURR_MIN_SLICE 55U, 53U
181#define MMCSD_CSD_10_VDD_R_CURR_MAX_SLICE 58U, 56U
182#define MMCSD_CSD_10_VDD_R_CURR_MIX_SLICE 61U, 59U
183#define MMCSD_CSD_10_C_SIZE_SLICE 73U, 62U
184#define MMCSD_CSD_10_DSR_IMP_SLICE MMCSD_CSD_20_DSR_IMP_SLICE
185#define MMCSD_CSD_10_READ_BLK_MISALIGN_SLICE MMCSD_CSD_20_READ_BLK_MISALIGN_SLICE
186#define MMCSD_CSD_10_WRITE_BLK_MISALIGN_SLICE MMCSD_CSD_20_WRITE_BLK_MISALIGN_SLICE
187#define MMCSD_CSD_10_READ_BL_PARTIAL_SLICE MMCSD_CSD_20_READ_BL_PARTIAL_SLICE
188#define MMCSD_CSD_10_READ_BL_LEN_SLICE 83U, 80U
189#define MMCSD_CSD_10_CCC_SLICE MMCSD_CSD_20_CCC_SLICE
190#define MMCSD_CSD_10_TRANS_SPEED_SLICE MMCSD_CSD_20_TRANS_SPEED_SLICE
191#define MMCSD_CSD_10_NSAC_SLICE MMCSD_CSD_20_NSAC_SLICE
192#define MMCSD_CSD_10_TAAC_SLICE MMCSD_CSD_20_TAAC_SLICE
193#define MMCSD_CSD_10_CSD_STRUCTURE_SLICE MMCSD_CSD_20_CSD_STRUCTURE_SLICE
194/** @} */
195
196/**
197 * @name CID record offsets
198 * @{
199 */
200/* CID for SDC */
201#define MMCSD_CID_SDC_CRC_SLICE 7U, 1U
202#define MMCSD_CID_SDC_MDT_M_SLICE 11U, 8U
203#define MMCSD_CID_SDC_MDT_Y_SLICE 19U, 12U
204#define MMCSD_CID_SDC_PSN_SLICE 55U, 24U
205#define MMCSD_CID_SDC_PRV_M_SLICE 59U, 56U
206#define MMCSD_CID_SDC_PRV_N_SLICE 63U, 60U
207#define MMCSD_CID_SDC_PNM0_SLICE 71U, 64U
208#define MMCSD_CID_SDC_PNM1_SLICE 79U, 72U
209#define MMCSD_CID_SDC_PNM2_SLICE 87U, 80U
210#define MMCSD_CID_SDC_PNM3_SLICE 95U, 88U
211#define MMCSD_CID_SDC_PNM4_SLICE 103U, 96U
212#define MMCSD_CID_SDC_OID_SLICE 119U, 104U
213#define MMCSD_CID_SDC_MID_SLICE 127U, 120U
214
215/* CID for MMC */
216#define MMCSD_CID_MMC_CRC_SLICE 7U, 1U
217#define MMCSD_CID_MMC_MDT_Y_SLICE 11U, 8U
218#define MMCSD_CID_MMC_MDT_M_SLICE 15U, 12U
219#define MMCSD_CID_MMC_PSN_SLICE 47U, 16U
220#define MMCSD_CID_MMC_PRV_M_SLICE 51U, 48U
221#define MMCSD_CID_MMC_PRV_N_SLICE 55U, 52U
222#define MMCSD_CID_MMC_PNM0_SLICE 63U, 56U
223#define MMCSD_CID_MMC_PNM1_SLICE 71U, 64U
224#define MMCSD_CID_MMC_PNM2_SLICE 79U, 72U
225#define MMCSD_CID_MMC_PNM3_SLICE 87U, 80U
226#define MMCSD_CID_MMC_PNM4_SLICE 95U, 88U
227#define MMCSD_CID_MMC_PNM5_SLICE 103U, 96U
228#define MMCSD_CID_MMC_OID_SLICE 119U, 104U
229#define MMCSD_CID_MMC_MID_SLICE 127U, 120U
230/** @} */
231
232/*===========================================================================*/
233/* Driver pre-compile time settings. */
234/*===========================================================================*/
235
236/*===========================================================================*/
237/* Derived constants and error checks. */
238/*===========================================================================*/
239
240/*===========================================================================*/
241/* Driver data structures and types. */
242/*===========================================================================*/
243
244/**
245 * @brief @p MMCSDBlockDevice specific methods.
246 */
247#define _mmcsd_block_device_methods \
248 _base_block_device_methods
249
250/**
251 * @brief @p MMCSDBlockDevice specific data.
252 * @note It is empty because @p MMCSDBlockDevice is only an interface
253 * without implementation.
254 */
255#define _mmcsd_block_device_data \
256 _base_block_device_data \
257 /* Card CID.*/ \
258 uint32_t cid[4]; \
259 /* Card CSD.*/ \
260 uint32_t csd[4]; \
261 /* Total number of blocks in card.*/ \
262 uint32_t capacity;
263
264/**
265 * @extends BaseBlockDeviceVMT
266 *
267 * @brief @p MMCSDBlockDevice virtual methods table.
268 */
272
273/**
274 * @extends BaseBlockDevice
275 *
276 * @brief MCC/SD block device class.
277 * @details This class represents a, block-accessible, MMC/SD device.
278 */
279typedef struct {
280 /** @brief Virtual Methods Table.*/
284
285/**
286 * @brief Unpacked CID register from SDC.
287 */
288typedef struct {
289 uint8_t mid;
290 uint16_t oid;
291 char pnm[5];
292 uint8_t prv_n;
293 uint8_t prv_m;
294 uint32_t psn;
295 uint8_t mdt_m;
296 uint16_t mdt_y;
297 uint8_t crc;
299
300/**
301 * @brief Unpacked CID register from MMC.
302 */
303typedef struct {
304 uint8_t mid;
305 uint16_t oid;
306 char pnm[6];
307 uint8_t prv_n;
308 uint8_t prv_m;
309 uint32_t psn;
310 uint8_t mdt_m;
311 uint16_t mdt_y;
312 uint8_t crc;
314
315/**
316 * @brief Unpacked CSD v1.0 register from SDC.
317 */
349
350/**
351 * @brief Unpacked CSD v2.0 register from SDC.
352 */
353typedef struct {
355 uint8_t taac;
356 uint8_t nsac;
357 uint8_t tran_speed;
358 uint16_t ccc;
359 uint8_t read_bl_len;
363 uint8_t dsr_imp;
364 uint32_t c_size;
367 uint8_t wp_grp_size;
369 uint8_t r2w_factor;
373 uint8_t copy;
376 uint8_t file_format;
377 uint8_t crc;
379
380/**
381 * @brief Unpacked CSD register from MMC.
382 */
383typedef struct {
385 uint8_t spec_vers;
386 uint8_t taac;
387 uint8_t nsac;
388 uint8_t tran_speed;
389 uint16_t ccc;
390 uint8_t read_bl_len;
394 uint8_t dsr_imp;
395 uint16_t c_size;
400 uint8_t c_size_mult;
403 uint8_t wp_grp_size;
405 uint8_t default_ecc;
406 uint8_t r2w_factor;
411 uint8_t copy;
414 uint8_t file_format;
415 uint8_t ecc;
416 uint8_t crc;
418
419/*===========================================================================*/
420/* Driver macros. */
421/*===========================================================================*/
422
423/**
424 * @name R1 response utilities
425 * @{
426 */
427/**
428 * @brief Evaluates to @p true if the R1 response contains error flags.
429 *
430 * @param[in] r1 the r1 response
431 */
432#define MMCSD_R1_ERROR(r1) (((r1) & MMCSD_R1_ERROR_MASK) != 0U)
433
434/**
435 * @brief Returns the status field of an R1 response.
436 *
437 * @param[in] r1 the r1 response
438 */
439#define MMCSD_R1_STS(r1) (((r1) >> 9U) & 15U)
440
441/**
442 * @brief Evaluates to @p true if the R1 response indicates a locked card.
443 *
444 * @param[in] r1 the r1 response
445 */
446#define MMCSD_R1_IS_CARD_LOCKED(r1) ((((r1) >> 21U) & 1U) != 0U)
447/** @} */
448
449/**
450 * @name Macro Functions
451 * @{
452 */
453/**
454 * @brief Returns the card capacity in blocks.
455 *
456 * @param[in] ip pointer to a @p MMCSDBlockDevice or derived class
457 *
458 * @return The card capacity.
459 *
460 * @api
461 */
462#define mmcsdGetCardCapacity(ip) ((ip)->capacity)
463/** @} */
464
465/*===========================================================================*/
466/* External declarations. */
467/*===========================================================================*/
468
469#ifdef __cplusplus
470extern "C" {
471#endif
472 uint32_t _mmcsd_get_slice(const uint32_t *data,
473 uint32_t end,
474 uint32_t start);
475 uint32_t _mmcsd_get_capacity(const uint32_t *csd);
476 uint32_t _mmcsd_get_capacity_ext(const uint8_t *ext_csd);
478 unpacked_sdc_cid_t *cidsdc);
480 unpacked_mmc_cid_t *cidmmc);
482 unpacked_mmc_csd_t *csdmmc);
484 unpacked_sdc_csd_10_t *csd10);
486 unpacked_sdc_csd_20_t *csd20);
487#ifdef __cplusplus
488}
489#endif
490
491#endif /* HAL_USE_MMC_SPI == TRUE || HAL_USE_MMC_SDC == TRUE */
492
493#endif /* HAL_MMCSD_H */
494
495/** @} */
#define _base_block_device_methods
BaseBlockDevice specific methods.
Definition hal_ioblock.h:63
void _mmcsd_unpack_csd_v10(const MMCSDBlockDevice *sdcp, unpacked_sdc_csd_10_t *csd10)
Unpacks SDC CSD v1.0 array in structure.
Definition hal_mmcsd.c:254
void _mmcsd_unpack_mmc_cid(const MMCSDBlockDevice *sdcp, unpacked_mmc_cid_t *cidmmc)
Unpacks MMC CID array in structure.
Definition hal_mmcsd.c:174
void _mmcsd_unpack_sdc_cid(const MMCSDBlockDevice *sdcp, unpacked_sdc_cid_t *cidsdc)
Unpacks SDC CID array in structure.
Definition hal_mmcsd.c:143
void _mmcsd_unpack_csd_v20(const MMCSDBlockDevice *sdcp, unpacked_sdc_csd_20_t *csd20)
Unpacks SDC CSD v2.0 array in structure.
Definition hal_mmcsd.c:296
uint32_t _mmcsd_get_slice(const uint32_t *data, uint32_t end, uint32_t start)
Gets a bit field from a words array.
Definition hal_mmcsd.c:61
#define _mmcsd_block_device_data
MMCSDBlockDevice specific data.
Definition hal_mmcsd.h:255
uint32_t _mmcsd_get_capacity(const uint32_t *csd)
Extract card capacity from a CSD.
Definition hal_mmcsd.c:93
void _mmcsd_unpack_csd_mmc(const MMCSDBlockDevice *sdcp, unpacked_mmc_csd_t *csdmmc)
Unpacks MMC CSD array in structure.
Definition hal_mmcsd.c:206
uint32_t _mmcsd_get_capacity_ext(const uint8_t *ext_csd)
Extract MMC card capacity from EXT_CSD.
Definition hal_mmcsd.c:125
MCC/SD block device class.
Definition hal_mmcsd.h:279
const struct MMCSDBlockDeviceVMT * vmt
Virtual Methods Table.
Definition hal_mmcsd.h:281
MMCSDBlockDevice virtual methods table.
Definition hal_mmcsd.h:269
Unpacked CID register from MMC.
Definition hal_mmcsd.h:303
Unpacked CSD register from MMC.
Definition hal_mmcsd.h:383
uint8_t vdd_w_curr_max
Definition hal_mmcsd.h:399
uint8_t write_blk_misalign
Definition hal_mmcsd.h:392
uint8_t tmp_write_protect
Definition hal_mmcsd.h:413
uint8_t wp_grp_enable
Definition hal_mmcsd.h:404
uint8_t vdd_r_curr_max
Definition hal_mmcsd.h:397
uint8_t vdd_r_curr_min
Definition hal_mmcsd.h:396
uint8_t content_prot_app
Definition hal_mmcsd.h:409
uint8_t write_bl_partial
Definition hal_mmcsd.h:408
uint8_t read_bl_partial
Definition hal_mmcsd.h:391
uint8_t perm_write_protect
Definition hal_mmcsd.h:412
uint8_t file_format_grp
Definition hal_mmcsd.h:410
uint8_t erase_grp_size
Definition hal_mmcsd.h:401
uint8_t vdd_w_curr_min
Definition hal_mmcsd.h:398
uint8_t read_blk_misalign
Definition hal_mmcsd.h:393
uint8_t csd_structure
Definition hal_mmcsd.h:384
uint8_t erase_grp_mult
Definition hal_mmcsd.h:402
Unpacked CID register from SDC.
Definition hal_mmcsd.h:288
Unpacked CSD v1.0 register from SDC.
Definition hal_mmcsd.h:318
Unpacked CSD v2.0 register from SDC.
Definition hal_mmcsd.h:353