• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_SDMMC_SD_H
9 #define HPM_SDMMC_SD_H
10 
11 #include "hpm_sdmmc_common.h"
12 #include "hpm_sdmmc_card.h"
13 #include "hpm_sdmmc_port.h"
14 
15 typedef enum {
16     sd_timing_sdr12_default = 0,
17     sd_timing_sdr25_highspeed = 1,
18     sd_timing_sdr50 = 2,
19     sd_timing_sdr104 = 3,
20     sd_timing_ddr50 = 4,
21 } sd_timing_mode_t;
22 
23 typedef enum {
24     sd_drive_strength_typeb = 0,
25     sd_drive_strength_typea = 1,
26     sd_drive_strength_typec = 2,
27     sd_drive_strength_typed = 3
28 } sd_drive_strength_t;
29 
30 typedef enum {
31     sd_current_limit_200ma,
32     sd_current_limit_400ma,
33     sd_current_limit_600ma,
34     sd_current_limit_800ma,
35 } sd_max_current_t;
36 
37 
38 
39 typedef union {
40     uint32_t flags;
41     struct {
42         uint32_t support_speed_class_control_cmd: 1;
43         uint32_t support_set_block_count_cmd: 1;
44         uint32_t support_4bit_width: 1;
45         uint32_t is_byte_addressing_mode:1;
46     };
47 } sd_flags_t;
48 
49 enum {
50     sd_switch_function_group_access_mode = 1,
51     sd_switch_function_group_command_system = 2,
52     sd_switch_function_group_drive_strength = 3,
53     sd_switch_function_group_power_limit = 4,
54 };
55 
56 enum {
57     sd_switch_function_mode_check = 0,
58     sd_switch_function_mode_set = 1,
59 };
60 
61 typedef union {
62     uint32_t status_word[16];
63     struct {
64         uint32_t reserved0[8];
65         uint16_t reserved1;
66         uint16_t busy_status_for_function_in_group1;
67         uint16_t busy_status_for_function_in_group2;
68         uint16_t busy_status_for_function_in_group3;
69         uint16_t busy_status_for_function_in_group4;
70         uint16_t busy_status_for_function_in_group5;
71 
72         uint32_t busy_status_for_function_in_group6: 16;
73         uint32_t data_structure_version: 8;
74         uint32_t function_selection_of_function_group1: 4;
75         uint32_t function_selection_of_function_group2: 4;
76 
77         uint32_t function_selection_of_function_group3: 4;
78         uint32_t function_selection_of_function_group4: 4;
79         uint32_t function_selection_of_function_group5: 4;
80         uint32_t function_selection_of_function_group6: 4;
81         uint32_t support_bits_of_functions_in_function_group1: 16;
82         uint32_t support_bits_of_functions_in_function_group2: 16;
83         uint32_t support_bits_of_functions_in_function_group3: 16;
84         uint32_t support_bits_of_functions_in_function_group4: 16;
85         uint32_t support_bits_of_functions_in_function_group5: 16;
86         uint32_t support_bits_of_functions_in_function_group6: 16;
87         uint32_t max_current_or_power_consumption: 16;
88     };
89 } switch_function_status_t;
90 
91 typedef struct _sdmmc_sdcard {
92     sdmmc_host_t *host;
93     uint16_t relative_addr;
94     sd_cid_t cid;
95     sd_ocr_t ocr;
96     sd_csd_t csd;
97     sd_scr_t scr;
98     switch_function_status_t sfs;
99     sd_status_t status;
100     sdmmc_r1_status_t r1_status;
101     sd_flags_t sd_flags;
102 
103     uint32_t block_count;
104     uint32_t block_size;
105     uint32_t max_freq;
106     uint64_t card_size_in_bytes;
107 
108     sdmmc_speed_mode_t current_timing;
109     sd_drive_strength_t drive_strength;
110     sd_max_current_t max_current;
111     sdmmc_operation_voltage_t operation_voltage;
112 
113     bool is_host_ready;
114 } sd_card_t;
115 
116 
117 #ifdef __cplusplus
118 extern "C" {
119 #endif
120 
121 hpm_stat_t sd_init(sd_card_t *card);
122 
123 void sd_deinit(sd_card_t *card);
124 
125 hpm_stat_t sd_card_init(sd_card_t *card);
126 
127 void sd_card_deinit(sd_card_t *card);
128 
129 hpm_stat_t sd_host_init(sd_card_t *card);
130 
131 hpm_stat_t sd_host_deinit(sd_card_t *card);
132 
133 void sd_set_card_power(sd_card_t *card, bool enable);
134 
135 bool sd_is_card_present(sd_card_t *card);
136 
137 bool sd_check_readonly(sd_card_t *card);
138 
139 hpm_stat_t sd_select_card(sd_card_t *card, bool is_selected);
140 
141 hpm_stat_t sd_read_status(sd_card_t *card);
142 
143 hpm_stat_t sd_read_blocks(sd_card_t *card, uint8_t *buffer, uint32_t start_block, uint32_t block_count);
144 
145 hpm_stat_t sd_write_blocks(sd_card_t *card, const uint8_t *buffer, uint32_t start_block, uint32_t block_count);
146 
147 hpm_stat_t sd_erase_blocks(sd_card_t *card, uint32_t start_block, uint32_t block_count);
148 
149 hpm_stat_t sd_set_driver_strength(sd_card_t *card, sd_drive_strength_t driver_strength);
150 
151 hpm_stat_t sd_set_max_current(sd_card_t *card, sd_max_current_t max_current);
152 
153 hpm_stat_t sd_polling_card_status_busy(sd_card_t *card, uint32_t timeout_ms);
154 
155 
156 #ifdef __cplusplus
157 }
158 #endif
159 
160 #endif /* HPM_SDMMC_SD_H */
161