• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 #include "hpm_common.h"
8 #include "hpm_soc.h"
9 #include "hpm_sdmmc_host.h"
10 #include "board.h"
11 
12 
sdmmc_get_sys_addr(sdmmc_host_t * host,uint32_t addr)13 uint32_t sdmmc_get_sys_addr(sdmmc_host_t *host, uint32_t addr)
14 {
15     return core_local_mem_to_sys_address(host->host_param.hart_id, addr);
16 }
17 
board_init_sd_host_params(sdmmc_host_t * host,SDMMCHOST_Type * base)18 ATTR_WEAK hpm_stat_t board_init_sd_host_params(sdmmc_host_t *host, SDMMCHOST_Type *base)
19 {
20     sdmmc_host_param_t *param = &host->host_param;
21     param->host_flags = 0;
22 
23     sdmmc_io_init_apis_t *init_apis = &host->host_param.io_init_apis;
24     hpm_sdmmc_extra_io_data_t *io_data = &host->host_param.io_data;
25     param->base = base;
26     param->clock_init_func = board_sd_configure_clock;
27     param->hart_id = BOARD_RUNNING_CORE;
28     param->delay_ms = board_delay_ms;
29 
30     init_apis->cd_io_init = init_sdxc_cd_pin;
31     init_apis->cmd_io_init = init_sdxc_cmd_pin;
32     init_apis->clk_data_io_init = init_sdxc_clk_data_pins;
33 
34 #if defined(BOARD_APP_SDCARD_SUPPORT_3V3) && (BOARD_APP_SDCARD_SUPPORT_3V3 == 1)
35     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_3V3;
36 #endif
37     bool support_1v8 = false;
38     bool support_4bit = false;
39     bool support_vsel = false;
40     bool support_pwr = false;
41     bool support_cd = false;
42 #if defined(BOARD_APP_SDCARD_SUPPORT_1V8) && (BOARD_APP_SDCARD_SUPPORT_1V8 == 1)
43     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_1V8;
44     support_1v8 = true;
45 #endif
46 #if defined(BOARD_APP_SDCARD_SUPPORT_4BIT) && (BOARD_APP_SDCARD_SUPPORT_4BIT == 1)
47     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_4BIT;
48     support_4bit = true;
49 #endif
50     if (support_1v8 && support_4bit) {
51         param->host_flags |= HPM_SDMMC_HOST_SUPPORT_SDR50 | HPM_SDMMC_HOST_SUPPORT_SDR104;
52         if (sdxc_is_ddr50_supported(base)) {
53             param->host_flags |= HPM_SDMMC_HOST_SUPPORT_DDR;
54         }
55     }
56 
57 #if defined(BOARD_APP_SDCARD_SUPPORT_CARD_DETECTION) && (BOARD_APP_SDCARD_SUPPORT_CARD_DETECTION == 1)
58     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_CARD_DETECTION;
59     support_cd = true;
60     init_apis->cd_io_init = init_sdxc_cd_pin;
61 #endif
62 
63 #if defined(BOARD_APP_SDCARD_SUPPORT_POWER_SWITCH) && (BOARD_APP_SDCARD_SUPPORT_POWER_SWITCH == 1)
64     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_POWER_SWITCH;
65     support_pwr = true;
66     init_apis->pwr_io_init = init_sdxc_pwr_pin;
67 #endif
68 
69 #if defined(BOARD_APP_SDCARD_SUPPORT_VOLTAGE_SWITCH) && (BOARD_APP_SDCARD_SUPPORT_VOLTAGE_SWITCH == 1)
70     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_VOLTAGE_SWITCH;
71     support_vsel = true;
72     init_apis->vsel_io_init = init_sdxc_vsel_pin;
73 #endif
74 
75     if (support_vsel) {
76 #if defined(BOARD_APP_SDCARD_VOLTAGE_SWITCH_USING_GPIO) && (BOARD_APP_SDCARD_VOLTAGE_SWITCH_USING_GPIO == 1)
77         io_data->vsel_pin.use_gpio = true;
78         io_data->vsel_pin.gpio_pin = BOARD_APP_SDCARD_VSEL_PIN;
79 #if defined(BOARD_APP_SDCARD_VOLTAGE_SWITCH_PIN_POL) && (BOARD_APP_SDCARD_VOLTAGE_SWITCH_PIN_POL == 1)
80         io_data->vsel_pin.polarity = 1;
81 #else
82         io_data->vsel_pin.polarity = 0;
83 #endif
84 #else
85         io_data->vsel_pin.use_gpio = false;
86         param->host_flags |= HPM_SDMMC_HOST_VSEL_IN_IP;
87 #endif
88     }
89     if (support_cd) {
90 #if defined(BOARD_APP_SDCARD_CARD_DETECTION_USING_GPIO) && (BOARD_APP_SDCARD_CARD_DETECTION_USING_GPIO == 1)
91         io_data->cd_pin.use_gpio = true;
92         io_data->cd_pin.gpio_pin = BOARD_APP_SDCARD_CARD_DETECTION_PIN;
93 #if defined(BOARD_APP_SDCARD_CARD_DETECTION_PIN_POL) && (BOARD_APP_SDCARD_CARD_DETECTION_PIN_POL == 1)
94         io_data->cd_pin.polarity = 1;
95 #else
96         io_data->cd_pin.polarity = 0;
97 #endif
98 #else
99         io_data->cd_pin.use_gpio = false;
100         param->host_flags |= HPM_SDMMC_HOST_CD_IN_IP;
101 #endif
102     }
103 
104     if (support_pwr) {
105 #if defined(BOARD_APP_SDCARD_POWER_SWITCH_USING_GPIO) && (BOARD_APP_SDCARD_POWER_SWITCH_USING_GPIO == 1)
106         io_data->pwr_pin.use_gpio = true;
107         io_data->pwr_pin.gpio_pin = BOARD_APP_SDCARD_POWER_SWITCH_PIN;
108 #if defined(BOARD_APP_SDCARD_POWER_SWITCH_PIN_POL) && (BOARD_APP_SDCARD_POWER_SWITCH_PIN_POL == 1)
109         io_data->pwr_pin.polarity = true;
110 #else
111         io_data->pwr_pin.polarity = false;
112 #endif
113 #else
114         io_data->pwr_pin.use_gpio = false;
115         param->host_flags |= HPM_SDMMC_HOST_PWR_IN_IP;
116 #endif
117     }
118 
119     return status_success;
120 }
121 
board_init_emmc_host_params(sdmmc_host_t * host,SDMMCHOST_Type * base)122 ATTR_WEAK hpm_stat_t board_init_emmc_host_params(sdmmc_host_t *host, SDMMCHOST_Type *base)
123 {
124     bool support_ds = false;
125     sdmmc_host_param_t *param = &host->host_param;
126     param->host_flags = 0;
127 
128     sdmmc_io_init_apis_t *init_apis = &host->host_param.io_init_apis;
129     hpm_sdmmc_extra_io_data_t *io_data = &host->host_param.io_data;
130     param->base = BOARD_APP_EMMC_SDXC_BASE;
131     param->clock_init_func = board_sd_configure_clock;
132     param->hart_id = BOARD_RUNNING_CORE;
133     param->delay_ms = board_delay_ms;
134 
135     init_apis->cd_io_init = init_sdxc_cd_pin;
136     init_apis->cmd_io_init = init_sdxc_cmd_pin;
137     init_apis->clk_data_io_init = init_sdxc_clk_data_pins;
138 #if defined(BOARD_APP_EMMC_SUPPORT_DS) && (BOARD_APP_EMMC_SUPPORT_DS == 1)
139     init_apis->ds_io_init = init_sdxc_ds_pin;
140     support_ds = true;
141 #endif
142 
143 #if defined(BOARD_APP_EMMC_SUPPORT_3V3) && (BOARD_APP_EMMC_SUPPORT_3V3 == 1)
144     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_3V3;
145 #endif
146     bool support_1v8 = false;
147     bool support_4bit = false;
148     bool support_8bit = false;
149     bool support_vsel = false;
150     bool support_pwr = false;
151 #if defined(BOARD_APP_EMMC_SUPPORT_1V8) && (BOARD_APP_EMMC_SUPPORT_1V8 == 1)
152     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_1V8;
153     support_1v8 = true;
154 #endif
155 #if defined(BOARD_APP_EMMC_SUPPORT_4BIT) && (BOARD_APP_EMMC_SUPPORT_4BIT == 1)
156     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_4BIT;
157     support_4bit = true;
158 #endif
159 #if defined(BOARD_APP_EMMC_SUPPORT_8BIT) && (BOARD_APP_EMMC_SUPPORT_8BIT == 1)
160     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_4BIT | HPM_SDMMC_HOST_SUPPORT_8BIT;
161     support_8bit = true;
162     support_4bit = true;
163 #endif
164     if (support_1v8 && support_4bit) {
165         param->host_flags |= HPM_SDMMC_HOST_SUPPORT_HS200;
166     }
167     if (support_1v8 && support_8bit && support_ds) {
168         param->host_flags |= HPM_SDMMC_HOST_SUPPORT_HS400;
169     }
170     if (sdxc_is_ddr50_supported(base)) {
171         param->host_flags |= HPM_SDMMC_HOST_SUPPORT_DDR;
172     }
173 
174 #if defined(BOARD_APP_EMMC_SUPPORT_DS) && (BOARD_APP_EMMC_SUPPORT_DS == 1)
175     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_DATA_STROBE;
176 #endif
177 
178 #if defined(BOARD_APP_EMMC_SUPPORT_POWER_SWITCH) && (BOARD_APP_EMMC_SUPPORT_POWER_SWITCH == 1)
179     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_POWER_SWITCH;
180     support_pwr = true;
181     init_apis->pwr_io_init = init_sdxc_pwr_pin;
182 #endif
183 
184 #if defined(BOARD_APP_EMMC_SUPPORT_VOLTAGE_SWITCH) && (BOARD_APP_EMMC_SUPPORT_VOLTAGE_SWITCH == 1)
185     param->host_flags |= HPM_SDMMC_HOST_SUPPORT_VOLTAGE_SWITCH;
186     support_vsel = true;
187     init_apis->vsel_io_init = init_sdxc_vsel_pin;
188 #endif
189 
190     if (support_vsel) {
191 #if defined(BOARD_APP_EMMC_VOLTAGE_SWITCH_USING_GPIO) && (BOARD_APP_EMMC_VOLTAGE_SWITCH_USING_GPIO == 1)
192         io_data->vsel_pin.use_gpio = true;
193         io_data->vsel_pin.gpio_pin = BOARD_APP_EMMC_VSEL_PIN;
194 #if defined(BOARD_APP_EMMC_VOLTAGE_SWITCH_PIN_POL) && (BOARD_APP_EMMC_VOLTAGE_SWITCH_PIN_POL == 1)
195         io_data->vsel_pin.polarity = 1;
196 #else
197         io_data->vsel_pin.polarity = 0;
198 #endif
199 #else
200         io_data->vsel_pin.use_gpio = false;
201         param->host_flags |= HPM_SDMMC_HOST_VSEL_IN_IP;
202 #endif
203     }
204     if (support_pwr) {
205 #if defined(BOARD_APP_EMMC_POWER_SWITCH_USING_GPIO) && (BOARD_APP_EMMC_POWER_SWITCH_USING_GPIO == 1)
206         io_data->pwr_pin.use_gpio = true;
207         io_data->pwr_pin.gpio_pin = BOARD_APP_EMMC_POWER_SWITCH_PIN;
208 #if defined(BOARD_APP_EMMC_POWER_SWITCH_PIN_POL) && (BOARD_APP_EMMC_POWER_SWITCH_PIN_POL == 1)
209         io_data->pwr_pin.polarity = true;
210 #else
211         io_data->pwr_pin.polarity = false;
212 #endif
213 #else
214         io_data->pwr_pin.use_gpio = false;
215         param->host_flags |= HPM_SDMMC_HOST_PWR_IN_IP;
216 #endif
217     }
218     return status_success;
219 }