|
| 1 | +/* |
| 2 | + * Copyright (c) 2006 Uwe Stuehler <[email protected]> |
| 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 | + int slot; /*!< slot number, to be passed to host functions */ |
| 134 | + int max_freq_khz; /*!< max frequency supported by the host */ |
| 135 | +#define SDMMC_FREQ_DEFAULT 20000 /*!< SD/MMC Default speed (limited by clock divider) */ |
| 136 | +#define SDMMC_FREQ_HIGHSPEED 40000 /*!< SD High speed (limited by clock divider) */ |
| 137 | +#define SDMMC_FREQ_PROBING 400 /*!< SD/MMC probing speed */ |
| 138 | +#define SDMMC_FREQ_52M 52000 /*!< MMC 52MHz speed */ |
| 139 | +#define SDMMC_FREQ_26M 26000 /*!< MMC 26MHz speed */ |
| 140 | + float io_voltage; /*!< I/O voltage used by the controller (voltage switching is not supported) */ |
| 141 | + esp_err_t (*init)(void); /*!< Host function to initialize the driver */ |
| 142 | + esp_err_t (*set_bus_width)(int slot, size_t width); /*!< host function to set bus width */ |
| 143 | + size_t (*get_bus_width)(int slot); /*!< host function to get bus width */ |
| 144 | + esp_err_t (*set_bus_ddr_mode)(int slot, bool ddr_enable); /*!< host function to set DDR mode */ |
| 145 | + esp_err_t (*set_card_clk)(int slot, uint32_t freq_khz); /*!< host function to set card clock frequency */ |
| 146 | + esp_err_t (*do_transaction)(int slot, sdmmc_command_t* cmdinfo); /*!< host function to do a transaction */ |
| 147 | + esp_err_t (*deinit)(void); /*!< host function to deinitialize the driver */ |
| 148 | + esp_err_t (*io_int_enable)(int slot); /*!< Host function to enable SDIO interrupt line */ |
| 149 | + esp_err_t (*io_int_wait)(int slot, TickType_t timeout_ticks); /*!< Host function to wait for SDIO interrupt line to be active */ |
| 150 | + int command_timeout_ms; /*!< timeout, in milliseconds, of a single command. Set to 0 to use the default value. */ |
| 151 | +} sdmmc_host_t; |
| 152 | + |
| 153 | +/** |
| 154 | + * SD/MMC card information structure |
| 155 | + */ |
| 156 | +typedef struct { |
| 157 | + sdmmc_host_t host; /*!< Host with which the card is associated */ |
| 158 | + uint32_t ocr; /*!< OCR (Operation Conditions Register) value */ |
| 159 | + union { |
| 160 | + sdmmc_cid_t cid; /*!< decoded CID (Card IDentification) register value */ |
| 161 | + sdmmc_response_t raw_cid; /*!< raw CID of MMC card to be decoded |
| 162 | + after the CSD is fetched in the data transfer mode*/ |
| 163 | + }; |
| 164 | + sdmmc_csd_t csd; /*!< decoded CSD (Card-Specific Data) register value */ |
| 165 | + sdmmc_scr_t scr; /*!< decoded SCR (SD card Configuration Register) value */ |
| 166 | + sdmmc_ext_csd_t ext_csd; /*!< decoded EXT_CSD (Extended Card Specific Data) register value */ |
| 167 | + uint16_t rca; /*!< RCA (Relative Card Address) */ |
| 168 | + uint16_t max_freq_khz; /*!< Maximum frequency, in kHz, supported by the card */ |
| 169 | + uint32_t is_mem : 1; /*!< Bit indicates if the card is a memory card */ |
| 170 | + uint32_t is_sdio : 1; /*!< Bit indicates if the card is an IO card */ |
| 171 | + uint32_t is_mmc : 1; /*!< Bit indicates if the card is MMC */ |
| 172 | + uint32_t num_io_functions : 3; /*!< If is_sdio is 1, contains the number of IO functions on the card */ |
| 173 | + uint32_t log_bus_width : 2; /*!< log2(bus width supported by card) */ |
| 174 | + uint32_t is_ddr : 1; /*!< Card supports DDR mode */ |
| 175 | + uint32_t reserved : 23; /*!< Reserved for future expansion */ |
| 176 | +} sdmmc_card_t; |
| 177 | + |
| 178 | + |
| 179 | +#endif // _SDMMC_TYPES_H_ |
0 commit comments