1 /* 2 * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org> 3 * Adaptations to ESP-IDF Copyright (c) 2016 Espressif Systems (Shanghai) PTE LTD 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #ifndef _SDMMC_TYPES_H_ 19 #define _SDMMC_TYPES_H_ 20 21 #include <stdint.h> 22 #include <stddef.h> 23 #include "esp_err.h" 24 #include "freertos/FreeRTOS.h" 25 26 /** 27 * Decoded values from SD card Card Specific Data register 28 */ 29 typedef struct { 30 int csd_ver; /*!< CSD structure format */ 31 int mmc_ver; /*!< MMC version (for CID format) */ 32 int capacity; /*!< total number of sectors */ 33 int sector_size; /*!< sector size in bytes */ 34 int read_block_len; /*!< block length for reads */ 35 int card_command_class; /*!< Card Command Class for SD */ 36 int tr_speed; /*!< Max transfer speed */ 37 } sdmmc_csd_t; 38 39 /** 40 * Decoded values from SD card Card IDentification register 41 */ 42 typedef struct { 43 int mfg_id; /*!< manufacturer identification number */ 44 int oem_id; /*!< OEM/product identification number */ 45 char name[8]; /*!< product name (MMC v1 has the longest) */ 46 int revision; /*!< product revision */ 47 int serial; /*!< product serial number */ 48 int date; /*!< manufacturing date */ 49 } sdmmc_cid_t; 50 51 /** 52 * Decoded values from SD Configuration Register 53 */ 54 typedef struct { 55 int sd_spec; /*!< SD Physical layer specification version, reported by card */ 56 int bus_width; /*!< bus widths supported by card: BIT(0) — 1-bit bus, BIT(2) — 4-bit bus */ 57 } sdmmc_scr_t; 58 59 /** 60 * Decoded values of Extended Card Specific Data 61 */ 62 typedef struct { 63 uint8_t power_class; /*!< Power class used by the card */ 64 } sdmmc_ext_csd_t; 65 66 /** 67 * SD/MMC command response buffer 68 */ 69 typedef uint32_t sdmmc_response_t[4]; 70 71 /** 72 * SD SWITCH_FUNC response buffer 73 */ 74 typedef struct { 75 uint32_t data[512 / 8 / sizeof(uint32_t)]; /*!< response data */ 76 } sdmmc_switch_func_rsp_t; 77 78 /** 79 * SD/MMC command information 80 */ 81 typedef struct { 82 uint32_t opcode; /*!< SD or MMC command index */ 83 uint32_t arg; /*!< SD/MMC command argument */ 84 sdmmc_response_t response; /*!< response buffer */ 85 void* data; /*!< buffer to send or read into */ 86 size_t datalen; /*!< length of data buffer */ 87 size_t blklen; /*!< block length */ 88 int flags; /*!< see below */ 89 /** @cond */ 90 #define SCF_ITSDONE 0x0001 /*!< command is complete */ 91 #define SCF_CMD(flags) ((flags) & 0x00f0) 92 #define SCF_CMD_AC 0x0000 93 #define SCF_CMD_ADTC 0x0010 94 #define SCF_CMD_BC 0x0020 95 #define SCF_CMD_BCR 0x0030 96 #define SCF_CMD_READ 0x0040 /*!< read command (data expected) */ 97 #define SCF_RSP_BSY 0x0100 98 #define SCF_RSP_136 0x0200 99 #define SCF_RSP_CRC 0x0400 100 #define SCF_RSP_IDX 0x0800 101 #define SCF_RSP_PRESENT 0x1000 102 /* response types */ 103 #define SCF_RSP_R0 0 /*!< none */ 104 #define SCF_RSP_R1 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) 105 #define SCF_RSP_R1B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY) 106 #define SCF_RSP_R2 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_136) 107 #define SCF_RSP_R3 (SCF_RSP_PRESENT) 108 #define SCF_RSP_R4 (SCF_RSP_PRESENT) 109 #define SCF_RSP_R5 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) 110 #define SCF_RSP_R5B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY) 111 #define SCF_RSP_R6 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) 112 #define SCF_RSP_R7 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) 113 /* special flags */ 114 #define SCF_WAIT_BUSY 0x2000 /*!< Wait for completion of card busy signal before returning */ 115 /** @endcond */ 116 esp_err_t error; /*!< error returned from transfer */ 117 int timeout_ms; /*!< response timeout, in milliseconds */ 118 } sdmmc_command_t; 119 120 /** 121 * SD/MMC Host description 122 * 123 * This structure defines properties of SD/MMC host and functions 124 * of SD/MMC host which can be used by upper layers. 125 */ 126 typedef struct { 127 uint32_t flags; /*!< flags defining host properties */ 128 #define SDMMC_HOST_FLAG_1BIT BIT(0) /*!< host supports 1-line SD and MMC protocol */ 129 #define SDMMC_HOST_FLAG_4BIT BIT(1) /*!< host supports 4-line SD and MMC protocol */ 130 #define SDMMC_HOST_FLAG_8BIT BIT(2) /*!< host supports 8-line MMC protocol */ 131 #define SDMMC_HOST_FLAG_SPI BIT(3) /*!< host supports SPI protocol */ 132 #define SDMMC_HOST_FLAG_DDR BIT(4) /*!< host supports DDR mode for SD/MMC */ 133 #define SDMMC_HOST_FLAG_DEINIT_ARG BIT(5) /*!< host `deinit` function called with the slot argument */ 134 int slot; /*!< slot number, to be passed to host functions */ 135 int max_freq_khz; /*!< max frequency supported by the host */ 136 #define SDMMC_FREQ_DEFAULT 20000 /*!< SD/MMC Default speed (limited by clock divider) */ 137 #define SDMMC_FREQ_HIGHSPEED 40000 /*!< SD High speed (limited by clock divider) */ 138 #define SDMMC_FREQ_PROBING 400 /*!< SD/MMC probing speed */ 139 #define SDMMC_FREQ_52M 52000 /*!< MMC 52MHz speed */ 140 #define SDMMC_FREQ_26M 26000 /*!< MMC 26MHz speed */ 141 float io_voltage; /*!< I/O voltage used by the controller (voltage switching is not supported) */ 142 esp_err_t (*init)(void); /*!< Host function to initialize the driver */ 143 esp_err_t (*set_bus_width)(int slot, size_t width); /*!< host function to set bus width */ 144 size_t (*get_bus_width)(int slot); /*!< host function to get bus width */ 145 esp_err_t (*set_bus_ddr_mode)(int slot, bool ddr_enable); /*!< host function to set DDR mode */ 146 esp_err_t (*set_card_clk)(int slot, uint32_t freq_khz); /*!< host function to set card clock frequency */ 147 esp_err_t (*do_transaction)(int slot, sdmmc_command_t* cmdinfo); /*!< host function to do a transaction */ 148 union { 149 esp_err_t (*deinit)(void); /*!< host function to deinitialize the driver */ 150 esp_err_t (*deinit_p)(int slot); /*!< host function to deinitialize the driver, called with the `slot` */ 151 }; 152 esp_err_t (*io_int_enable)(int slot); /*!< Host function to enable SDIO interrupt line */ 153 esp_err_t (*io_int_wait)(int slot, TickType_t timeout_ticks); /*!< Host function to wait for SDIO interrupt line to be active */ 154 int command_timeout_ms; /*!< timeout, in milliseconds, of a single command. Set to 0 to use the default value. */ 155 } sdmmc_host_t; 156 157 /** 158 * SD/MMC card information structure 159 */ 160 typedef struct { 161 sdmmc_host_t host; /*!< Host with which the card is associated */ 162 uint32_t ocr; /*!< OCR (Operation Conditions Register) value */ 163 union { 164 sdmmc_cid_t cid; /*!< decoded CID (Card IDentification) register value */ 165 sdmmc_response_t raw_cid; /*!< raw CID of MMC card to be decoded 166 after the CSD is fetched in the data transfer mode*/ 167 }; 168 sdmmc_csd_t csd; /*!< decoded CSD (Card-Specific Data) register value */ 169 sdmmc_scr_t scr; /*!< decoded SCR (SD card Configuration Register) value */ 170 sdmmc_ext_csd_t ext_csd; /*!< decoded EXT_CSD (Extended Card Specific Data) register value */ 171 uint16_t rca; /*!< RCA (Relative Card Address) */ 172 uint16_t max_freq_khz; /*!< Maximum frequency, in kHz, supported by the card */ 173 uint32_t is_mem : 1; /*!< Bit indicates if the card is a memory card */ 174 uint32_t is_sdio : 1; /*!< Bit indicates if the card is an IO card */ 175 uint32_t is_mmc : 1; /*!< Bit indicates if the card is MMC */ 176 uint32_t num_io_functions : 3; /*!< If is_sdio is 1, contains the number of IO functions on the card */ 177 uint32_t log_bus_width : 2; /*!< log2(bus width supported by card) */ 178 uint32_t is_ddr : 1; /*!< Card supports DDR mode */ 179 uint32_t reserved : 23; /*!< Reserved for future expansion */ 180 } sdmmc_card_t; 181 182 183 #endif // _SDMMC_TYPES_H_ 184