STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
emmc_card.c
Go to the documentation of this file.
1#include "emmc_card.h"
2
3#include <string.h>
4
5void emmc_card_parse(const uint32_t cid[4], const uint8_t ext_csd[512],
6 emmc_card_info_t* out) {
7 memset(out, 0, sizeof *out);
8 /* CID bit fields, datasheet p. 5. */
9 out->mid = (uint8_t)(cid[0] >> 24); /* [127:120] */
10 out->pnm[0] = (char)(cid[0] & 0xFFU); /* [103:96] */
11 out->pnm[1] = (char)(cid[1] >> 24); /* [95:88] */
12 out->pnm[2] = (char)((cid[1] >> 16) & 0xFFU); /* [87:80] */
13 out->pnm[3] = (char)((cid[1] >> 8) & 0xFFU); /* [79:72] */
14 out->pnm[4] = (char)(cid[1] & 0xFFU); /* [71:64] */
15 out->pnm[5] = (char)(cid[2] >> 24); /* [63:56] */
16 out->pnm[6] = '\0';
17 out->prv = (uint8_t)((cid[2] >> 16) & 0xFFU); /* [55:48] */
18 out->psn = (cid[2] << 16) | (cid[3] >> 16); /* [47:16] */
19
20 out->ext_csd_rev = ext_csd[EMMC_EXT_CSD_REV];
21 out->sec_count = (uint32_t)ext_csd[EMMC_EXT_CSD_SEC_COUNT] |
22 ((uint32_t)ext_csd[EMMC_EXT_CSD_SEC_COUNT + 1U] << 8) |
23 ((uint32_t)ext_csd[EMMC_EXT_CSD_SEC_COUNT + 2U] << 16) |
24 ((uint32_t)ext_csd[EMMC_EXT_CSD_SEC_COUNT + 3U] << 24);
25 out->device_type = ext_csd[EMMC_EXT_CSD_DEVICE_TYPE];
26 out->pre_eol = ext_csd[EMMC_EXT_CSD_PRE_EOL_INFO];
27 out->life_a = ext_csd[EMMC_EXT_CSD_LIFE_TIME_A];
28 out->life_b = ext_csd[EMMC_EXT_CSD_LIFE_TIME_B];
29 out->rst_n_function = ext_csd[EMMC_EXT_CSD_RST_N_FUNCTION];
30 out->cache_ctrl = ext_csd[EMMC_EXT_CSD_CACHE_CTRL];
31 out->wr_rel_set = ext_csd[EMMC_EXT_CSD_WR_REL_SET];
32}
33
35 uint32_t issues = EMMC_CARD_OK;
36 if (info->mid != EMMC_CARD_MID_KIOXIA) {
37 issues |= EMMC_CARD_WRONG_MAKER;
38 }
39 if (strcmp(info->pnm, EMMC_CARD_PNM) != 0) {
40 issues |= EMMC_CARD_WRONG_PART;
41 }
42 if (info->sec_count != EMMC_CARD_SEC_COUNT) {
43 issues |= EMMC_CARD_WRONG_SIZE;
44 }
45 if (info->ext_csd_rev < EMMC_CARD_EXT_CSD_REV_MIN) {
46 issues |= EMMC_CARD_OLD_REVISION;
47 }
48 /* Life-time estimates: 0x09 = 80-90 % used. PRE_EOL 2 = warning. */
49 if (info->pre_eol >= 2U || info->life_a >= 0x09U || info->life_b >= 0x09U) {
50 issues |= EMMC_CARD_WEAR_WARNING;
51 }
52 if ((info->wr_rel_set & 0x01U) == 0U) {
54 }
55 if (info->cache_ctrl != 0U) {
56 issues |= EMMC_CARD_CACHE_ON;
57 }
58 return issues;
59}
static board_sleep_info_t info
Definition board_sleep.c:14
uint32_t emmc_card_check(const emmc_card_info_t *info)
Definition emmc_card.c:34
void emmc_card_parse(const uint32_t cid[4], const uint8_t ext_csd[512], emmc_card_info_t *out)
Definition emmc_card.c:5
#define EMMC_EXT_CSD_PRE_EOL_INFO
Definition emmc_card.h:32
#define EMMC_EXT_CSD_CACHE_CTRL
Definition emmc_card.h:24
#define EMMC_EXT_CSD_DEVICE_TYPE
Definition emmc_card.h:30
#define EMMC_CARD_EXT_CSD_REV_MIN
Definition emmc_card.h:21
#define EMMC_CARD_PNM
Definition emmc_card.h:19
@ EMMC_CARD_WRONG_SIZE
Definition emmc_card.h:57
@ EMMC_CARD_WRONG_PART
Definition emmc_card.h:56
@ EMMC_CARD_WEAR_WARNING
Definition emmc_card.h:59
@ EMMC_CARD_CACHE_ON
Definition emmc_card.h:61
@ EMMC_CARD_OK
Definition emmc_card.h:54
@ EMMC_CARD_NO_RELIABLE_WRITE
Definition emmc_card.h:60
@ EMMC_CARD_OLD_REVISION
Definition emmc_card.h:58
@ EMMC_CARD_WRONG_MAKER
Definition emmc_card.h:55
#define EMMC_EXT_CSD_SEC_COUNT
Definition emmc_card.h:31
#define EMMC_EXT_CSD_REV
Definition emmc_card.h:29
#define EMMC_EXT_CSD_LIFE_TIME_B
Definition emmc_card.h:34
#define EMMC_EXT_CSD_LIFE_TIME_A
Definition emmc_card.h:33
#define EMMC_CARD_MID_KIOXIA
Definition emmc_card.h:18
#define EMMC_EXT_CSD_RST_N_FUNCTION
Definition emmc_card.h:25
#define EMMC_EXT_CSD_WR_REL_SET
Definition emmc_card.h:26
#define EMMC_CARD_SEC_COUNT
Definition emmc_card.h:20