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