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)13uint32_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)18ATTR_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)122ATTR_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 }