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