SyterKit 0.4.0.x
SyterKit is a bare-metal framework
Loading...
Searching...
No Matches
sys-mmc.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0+ */
2
3#ifndef _SYS_MMC_H_
4#define _SYS_MMC_H_
5
6#include <io.h>
7#include <stdarg.h>
8#include <stdbool.h>
9#include <stddef.h>
10#include <stdint.h>
11#include <types.h>
12
13#ifdef __cplusplus
14extern "C" {
15#endif// __cplusplus
16
17enum {
18 SD_VERSION_SD = 0x20000,
23
24 MMC_VERSION_MMC = 0x10000,
38};
39
40#define MMC_MODE_HS (1 << 0) /* can run at 26MHz -- DS26_SDR12 */
41#define MMC_MODE_HS_52MHz (1 << 1) /* can run at 52MHz with SDR mode -- HSSDR52_SDR25 */
42#define MMC_MODE_4BIT (1 << 2)
43#define MMC_MODE_8BIT (1 << 3)
44#define MMC_MODE_SPI (1 << 4)
45#define MMC_MODE_HC (1 << 5)
46#define MMC_MODE_DDR_52MHz (1 << 6) /* can run at 52Mhz with DDR mode -- HSDDR52_DDR50 */
47#define MMC_MODE_HS200 (1 << 7) /* can run at 200/208MHz with SDR mode -- HS200_SDR104 */
48#define MMC_MODE_HS400 (1 << 8) /* can run at 200MHz with DDR mode -- HS400 */
49
50#define SD_DATA_4BIT 0x00040000
51
52#define MMC_DATA_READ (1U << 0)
53#define MMC_DATA_WRITE (1U << 1)
54
55#define MMC_CMD_MANUAL 1//add by sunxi.not sent stop when read/write multi block,and sent stop when sent cmd12
56
57#define NO_CARD_ERR -16 /* No SD/MMC card inserted */
58#define UNUSABLE_ERR -17 /* Unusable Card */
59#define COMM_ERR -18 /* Communications Error */
60#define TIMEOUT -19
61
62#define MMC_CMD_GO_IDLE_STATE 0
63#define MMC_CMD_SEND_OP_COND 1
64#define MMC_CMD_ALL_SEND_CID 2
65#define MMC_CMD_SET_RELATIVE_ADDR 3
66#define MMC_CMD_SET_DSR 4
67#define MMC_CMD_SWITCH 6
68#define MMC_CMD_SELECT_CARD 7
69#define MMC_CMD_SEND_EXT_CSD 8
70#define MMC_CMD_SEND_CSD 9
71#define MMC_CMD_SEND_CID 10
72#define MMC_CMD_STOP_TRANSMISSION 12
73#define MMC_CMD_SEND_STATUS 13
74#define MMC_CMD_SET_BLOCKLEN 16
75#define MMC_CMD_READ_SINGLE_BLOCK 17
76#define MMC_CMD_READ_MULTIPLE_BLOCK 18
77#define MMC_CMD_WRITE_SINGLE_BLOCK 24
78#define MMC_CMD_WRITE_MULTIPLE_BLOCK 25
79#define MMC_CMD_ERASE_GROUP_START 35
80#define MMC_CMD_ERASE_GROUP_END 36
81#define MMC_CMD_ERASE 38
82#define MMC_CMD_APP_CMD 55
83#define MMC_CMD_SPI_READ_OCR 58
84#define MMC_CMD_SPI_CRC_ON_OFF 59
85
86#define SD_CMD_SEND_RELATIVE_ADDR 3
87#define SD_CMD_SWITCH_FUNC 6
88#define SD_CMD_SEND_IF_COND 8
89
90#define SD_CMD_APP_SET_BUS_WIDTH 6
91#define SD_CMD_ERASE_WR_BLK_START 32
92#define SD_CMD_ERASE_WR_BLK_END 33
93#define SD_CMD_APP_SEND_OP_COND 41
94#define SD_CMD_APP_SEND_SCR 51
95
96/* SCR definitions in different words */
97#define SD_HIGHSPEED_BUSY 0x00020000
98#define SD_HIGHSPEED_SUPPORTED 0x00020000
99
100#define MMC_HS_TIMING 0x00000100
101#define MMC_HS_52MHZ 0x2
102#define MMC_DDR_52MHZ 0x4
103
104#define OCR_BUSY 0x80000000
105#define OCR_HCS 0x40000000
106#define OCR_VOLTAGE_MASK 0x007FFF80
107#define OCR_ACCESS_MODE 0x60000000
108
109#define SECURE_ERASE 0x80000000
110
111#define MMC_STATUS_MASK (~0x0206BF7F)
112#define MMC_STATUS_RDY_FOR_DATA (1 << 8)
113#define MMC_STATUS_CURR_STATE (0xf << 9)
114#define MMC_STATUS_ERROR (1 << 19)
115
116#define MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */
117#define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */
118#define MMC_VDD_21_22 0x00000200 /* VDD voltage 2.1 ~ 2.2 */
119#define MMC_VDD_22_23 0x00000400 /* VDD voltage 2.2 ~ 2.3 */
120#define MMC_VDD_23_24 0x00000800 /* VDD voltage 2.3 ~ 2.4 */
121#define MMC_VDD_24_25 0x00001000 /* VDD voltage 2.4 ~ 2.5 */
122#define MMC_VDD_25_26 0x00002000 /* VDD voltage 2.5 ~ 2.6 */
123#define MMC_VDD_26_27 0x00004000 /* VDD voltage 2.6 ~ 2.7 */
124#define MMC_VDD_27_28 0x00008000 /* VDD voltage 2.7 ~ 2.8 */
125#define MMC_VDD_28_29 0x00010000 /* VDD voltage 2.8 ~ 2.9 */
126#define MMC_VDD_29_30 0x00020000 /* VDD voltage 2.9 ~ 3.0 */
127#define MMC_VDD_30_31 0x00040000 /* VDD voltage 3.0 ~ 3.1 */
128#define MMC_VDD_31_32 0x00080000 /* VDD voltage 3.1 ~ 3.2 */
129#define MMC_VDD_32_33 0x00100000 /* VDD voltage 3.2 ~ 3.3 */
130#define MMC_VDD_33_34 0x00200000 /* VDD voltage 3.3 ~ 3.4 */
131#define MMC_VDD_34_35 0x00400000 /* VDD voltage 3.4 ~ 3.5 */
132#define MMC_VDD_35_36 0x00800000 /* VDD voltage 3.5 ~ 3.6 */
133
134#define MMC_SWITCH_MODE_CMD_SET 0x00 /* Change the command set */
135#define MMC_SWITCH_MODE_SET_BITS 0x01 /* Set bits in EXT_CSD byte addressed by index which are 1 in value field */
136#define MMC_SWITCH_MODE_CLEAR_BITS 0x02 /* Clear bits in EXT_CSD byte addressed by index, which are 1 in value field */
137#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target byte to value */
138
139#define SD_SWITCH_CHECK 0
140#define SD_SWITCH_SWITCH 1
141
142/*
143 * EXT_CSD fields
144 */
145#define EXT_CSD_CMDQ_MODE_EN 15 /* R/W */
146#define EXT_CSD_FLUSH_CACHE 32 /* W */
147#define EXT_CSD_CACHE_CTRL 33 /* R/W */
148#define EXT_CSD_POWER_OFF_NOTIFICATION 34 /* R/W */
149#define EXT_CSD_PACKED_FAILURE_INDEX 35 /* RO */
150#define EXT_CSD_PACKED_CMD_STATUS 36 /* RO */
151#define EXT_CSD_EXP_EVENTS_STATUS 54 /* RO, 2 bytes */
152#define EXT_CSD_EXP_EVENTS_CTRL 56 /* R/W, 2 bytes */
153#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
154#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
155#define EXT_CSD_PARTITION_SETTING_COMPLETED 155 /* R/W */
156#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
157#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
158#define EXT_CSD_HPI_MGMT 161 /* R/W */
159#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
160#define EXT_CSD_BKOPS_EN 163 /* R/W */
161#define EXT_CSD_BKOPS_START 164 /* W */
162#define EXT_CSD_SANITIZE_START 165 /* W */
163#define EXT_CSD_WR_REL_PARAM 166 /* RO */
164#define EXT_CSD_RPMB_MULT 168 /* RO */
165#define EXT_CSD_FW_CONFIG 169 /* R/W */
166#define EXT_CSD_BOOT_WP 173 /* R/W */
167#define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
168#define EXT_CSD_PART_CONFIG 179 /* R/W */
169#define EXT_CSD_ERASED_MEM_CONT 181 /* RO */
170#define EXT_CSD_BUS_WIDTH 183 /* R/W */
171#define EXT_CSD_STROBE_SUPPORT 184 /* RO */
172#define EXT_CSD_HS_TIMING 185 /* R/W */
173#define EXT_CSD_POWER_CLASS 187 /* R/W */
174#define EXT_CSD_REV 192 /* RO */
175#define EXT_CSD_STRUCTURE 194 /* RO */
176#define EXT_CSD_CARD_TYPE 196 /* RO */
177#define EXT_CSD_DRIVER_STRENGTH 197 /* RO */
178#define EXT_CSD_OUT_OF_INTERRUPT_TIME 198 /* RO */
179#define EXT_CSD_PART_SWITCH_TIME 199 /* RO */
180#define EXT_CSD_PWR_CL_52_195 200 /* RO */
181#define EXT_CSD_PWR_CL_26_195 201 /* RO */
182#define EXT_CSD_PWR_CL_52_360 202 /* RO */
183#define EXT_CSD_PWR_CL_26_360 203 /* RO */
184#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
185#define EXT_CSD_S_A_TIMEOUT 217 /* RO */
186#define EXT_CSD_REL_WR_SEC_C 222 /* RO */
187#define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */
188#define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */
189#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
190#define EXT_CSD_BOOT_MULT 226 /* RO */
191#define EXT_CSD_SEC_TRIM_MULT 229 /* RO */
192#define EXT_CSD_SEC_ERASE_MULT 230 /* RO */
193#define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */
194#define EXT_CSD_TRIM_MULT 232 /* RO */
195#define EXT_CSD_PWR_CL_200_195 236 /* RO */
196#define EXT_CSD_PWR_CL_200_360 237 /* RO */
197#define EXT_CSD_PWR_CL_DDR_52_195 238 /* RO */
198#define EXT_CSD_PWR_CL_DDR_52_360 239 /* RO */
199#define EXT_CSD_BKOPS_STATUS 246 /* RO */
200#define EXT_CSD_POWER_OFF_LONG_TIME 247 /* RO */
201#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
202#define EXT_CSD_CACHE_SIZE 249 /* RO, 4 bytes */
203#define EXT_CSD_PWR_CL_DDR_200_360 253 /* RO */
204#define EXT_CSD_FIRMWARE_VERSION 254 /* RO, 8 bytes */
205#define EXT_CSD_PRE_EOL_INFO 267 /* RO */
206#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A 268 /* RO */
207#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B 269 /* RO */
208#define EXT_CSD_CMDQ_DEPTH 307 /* RO */
209#define EXT_CSD_CMDQ_SUPPORT 308 /* RO */
210#define EXT_CSD_SUPPORTED_MODE 493 /* RO */
211#define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */
212#define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */
213#define EXT_CSD_MAX_PACKED_WRITES 500 /* RO */
214#define EXT_CSD_MAX_PACKED_READS 501 /* RO */
215#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
216#define EXT_CSD_HPI_FEATURES 503
217
218/*
219 * EXT_CSD field definitions
220 */
221#define EXT_CSD_CMD_SET_NORMAL (1 << 0)
222#define EXT_CSD_CMD_SET_SECURE (1 << 1)
223#define EXT_CSD_CMD_SET_CPSECURE (1 << 2)
224
225/* -- EXT_CSD[196] DEVICE_TYPE */
226#define EXT_CSD_CARD_TYPE_HS_26 (1 << 0) /* Card can run at 26MHz */
227#define EXT_CSD_CARD_TYPE_HS_52 (1 << 1) /* Card can run at 52MHz */
228#define EXT_CSD_CARD_TYPE_HS (EXT_CSD_CARD_TYPE_HS_26 | EXT_CSD_CARD_TYPE_HS_52)
229#define EXT_CSD_CARD_TYPE_DDR_1_8V (1 << 2) /* Card can run at 52MHz */ /* DDR mode @1.8V or 3V I/O */
230#define EXT_CSD_CARD_TYPE_DDR_1_2V (1 << 3) /* Card can run at 52MHz */ /* DDR mode @1.2V I/O */
231#define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_DDR_1_2V)
232#define EXT_CSD_CARD_TYPE_HS200_1_8V (1 << 4) /* Card can run at 200MHz */
233#define EXT_CSD_CARD_TYPE_HS200_1_2V (1 << 5) /* Card can run at 200MHz */ /* SDR mode @1.2V I/O */
234#define EXT_CSD_CARD_TYPE_HS200 (EXT_CSD_CARD_TYPE_HS200_1_8V | EXT_CSD_CARD_TYPE_HS200_1_2V)
235#define EXT_CSD_CARD_TYPE_HS400_1_8V (1 << 6) /* Card can run at 200MHz DDR, 1.8V */
236#define EXT_CSD_CARD_TYPE_HS400_1_2V (1 << 7) /* Card can run at 200MHz DDR, 1.2V */
237#define EXT_CSD_CARD_TYPE_HS400 (EXT_CSD_CARD_TYPE_HS400_1_8V | EXT_CSD_CARD_TYPE_HS400_1_2V)
238
239/* -- EXT_CSD[183] BUS_WIDTH */
240#define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */
241#define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */
242#define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */
243#define EXT_CSD_BUS_DDR_4 5 /* Card is in 4 bit ddr mode */
244#define EXT_CSD_BUS_DDR_8 6 /* Card is in 8 bit ddr mode */
245
246/* -- EXT_CSD[185] HS_TIMING */
247#define EXT_CSD_TIMING_BC 0 /* Backwards compatibility */
248#define EXT_CSD_TIMING_HS 1 /* High speed */
249#define EXT_CSD_TIMING_HS200 2 /* HS200 */
250#define EXT_CSD_TIMING_HS400 3 /* HS400 */
251
252#define R1_ILLEGAL_COMMAND (1 << 22)
253#define R1_APP_CMD (1 << 5)
254
255#define MMC_RSP_PRESENT (1 << 0)
256#define MMC_RSP_136 (1 << 1) /* 136 bit response */
257#define MMC_RSP_CRC (1 << 2) /* expect valid crc */
258#define MMC_RSP_BUSY (1 << 3) /* card may send busy */
259#define MMC_RSP_OPCODE (1 << 4) /* response contains opcode */
260
261#define MMC_RSP_NONE (0)
262#define MMC_RSP_R1 (MMC_RSP_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE)
263#define MMC_RSP_R1b (MMC_RSP_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE | MMC_RSP_BUSY)
264#define MMC_RSP_R2 (MMC_RSP_PRESENT | MMC_RSP_136 | MMC_RSP_CRC)
265#define MMC_RSP_R3 (MMC_RSP_PRESENT)
266#define MMC_RSP_R4 (MMC_RSP_PRESENT)
267#define MMC_RSP_R5 (MMC_RSP_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE)
268#define MMC_RSP_R6 (MMC_RSP_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE)
269#define MMC_RSP_R7 (MMC_RSP_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE)
270
271#define MMCPART_NOAVAILABLE (0xff)
272#define PART_ACCESS_MASK (0x7)
273#define PART_SUPPORT (0x1)
274
275#define be32_to_cpu(x) ((0x000000ff & ((x) >> 24)) | (0x0000ff00 & ((x) >> 8)) | (0x00ff0000 & ((x) << 8)) | (0xff000000 & ((x) << 24)))
276
285
295
296/*
297 * timing mode
298 * 1: output and input are both based on phase
299 * 3: output is based on phase, input is based on delay chain
300 * 4: output is based on phase, input is based on delay chain.
301 * it also support to use delay chain on data strobe signal.
302 */
308
309#define SUNXI_MMC_1X_2X_MODE_CONTROL_REG (0x03000024)
310
314
322
323typedef struct mmc_data {
324 union {
325 char *dest;
326 const char *src;
327 } b;
332
363
364
377int sunxi_mmc_init(void *sdhci_hdl);
378
392uint32_t sunxi_mmc_blk_read(void *sdhci, void *dst, uint32_t start, uint32_t blkcnt);
393
409uint32_t sunxi_mmc_blk_write(void *sdhci, void *dst, uint32_t start, uint32_t blkcnt);
410
411#ifdef __cplusplus
412}
413#endif// __cplusplus
414
415#endif// _SYS_MMC_H_
u64_t uint64_t
Definition stdint.h:16
u32_t uint32_t
Definition stdint.h:13
Definition sys-mmc.h:315
uint32_t response[4]
Definition sys-mmc.h:319
uint32_t flags
Definition sys-mmc.h:320
uint32_t resp_type
Definition sys-mmc.h:317
uint32_t cmdidx
Definition sys-mmc.h:316
uint32_t cmdarg
Definition sys-mmc.h:318
Definition sys-mmc.h:323
union mmc_data::@11 b
char * dest
Definition sys-mmc.h:325
uint32_t blocksize
Definition sys-mmc.h:330
uint32_t flags
Definition sys-mmc.h:328
const char * src
Definition sys-mmc.h:326
uint32_t blocks
Definition sys-mmc.h:329
Definition sys-mmc.h:333
uint32_t f_max_ddr
Definition sys-mmc.h:339
uint32_t csd[4]
Definition sys-mmc.h:346
uint32_t f_min
Definition sys-mmc.h:337
uint32_t scr[2]
Definition sys-mmc.h:345
uint32_t part_num
Definition sys-mmc.h:350
uint32_t card_caps
Definition sys-mmc.h:342
uint32_t rca
Definition sys-mmc.h:348
uint32_t part_config
Definition sys-mmc.h:349
int high_capacity
Definition sys-mmc.h:340
uint32_t host_caps
Definition sys-mmc.h:343
uint32_t erase_grp_size
Definition sys-mmc.h:354
uint32_t speed_mode
Definition sys-mmc.h:361
uint32_t clock
Definition sys-mmc.h:341
uint32_t ocr
Definition sys-mmc.h:344
uint32_t cid[4]
Definition sys-mmc.h:347
uint32_t read_bl_len
Definition sys-mmc.h:352
char revision[8+8]
Definition sys-mmc.h:360
uint32_t f_max
Definition sys-mmc.h:338
uint32_t write_bl_len
Definition sys-mmc.h:353
uint32_t voltages
Definition sys-mmc.h:334
tune_sdly_t tune_sdly
Definition sys-mmc.h:356
uint32_t bus_width
Definition sys-mmc.h:336
uint32_t version
Definition sys-mmc.h:335
uint32_t blksz
Definition sys-mmc.h:359
uint32_t tran_speed
Definition sys-mmc.h:351
uint32_t lba
Definition sys-mmc.h:358
uint32_t b_max
Definition sys-mmc.h:357
uint64_t capacity
Definition sys-mmc.h:355
Definition sys-mmc.h:311
uint32_t tm4_smx_fx[12]
Definition sys-mmc.h:312
@ MMC_VERSION_4_5
Definition sys-mmc.h:35
@ MMC_VERSION_2_2
Definition sys-mmc.h:28
@ SD_VERSION_2
Definition sys-mmc.h:20
@ MMC_VERSION_4_41
Definition sys-mmc.h:34
@ MMC_VERSION_4_2
Definition sys-mmc.h:32
@ MMC_VERSION_MMC
Definition sys-mmc.h:24
@ SD_VERSION_SD
Definition sys-mmc.h:18
@ MMC_VERSION_UNKNOWN
Definition sys-mmc.h:25
@ MMC_VERSION_1_2
Definition sys-mmc.h:26
@ MMC_VERSION_5_0
Definition sys-mmc.h:36
@ MMC_VERSION_4_1
Definition sys-mmc.h:31
@ SD_VERSION_1_10
Definition sys-mmc.h:22
@ MMC_VERSION_3
Definition sys-mmc.h:29
@ MMC_VERSION_1_4
Definition sys-mmc.h:27
@ SD_VERSION_3
Definition sys-mmc.h:19
@ MMC_VERSION_4_3
Definition sys-mmc.h:33
@ SD_VERSION_1_0
Definition sys-mmc.h:21
@ MMC_VERSION_5_1
Definition sys-mmc.h:37
@ MMC_VERSION_4
Definition sys-mmc.h:30
struct mmc_data mmc_data_t
sdhci_freq_point_t
Definition sys-mmc.h:286
@ MMC_CLK_200M
Definition sys-mmc.h:292
@ MMC_MAX_CLK_FREQ_NUM
Definition sys-mmc.h:293
@ MMC_CLK_25M
Definition sys-mmc.h:288
@ MMC_CLK_50M
Definition sys-mmc.h:289
@ MMC_CLK_100M
Definition sys-mmc.h:290
@ MMC_CLK_400K
Definition sys-mmc.h:287
@ MMC_CLK_150M
Definition sys-mmc.h:291
struct tune_sdly tune_sdly_t
sdhci_timing_mode
Definition sys-mmc.h:303
@ MMC_TIMING_MODE_4
Definition sys-mmc.h:306
@ MMC_TIMING_MODE_1
Definition sys-mmc.h:304
@ MMC_TIMING_MODE_3
Definition sys-mmc.h:305
uint32_t sunxi_mmc_blk_write(void *sdhci, void *dst, uint32_t start, uint32_t blkcnt)
Writes blocks of data to the MMC device using the specified SDHCI instance.
Definition sys-mmc.c:1854
uint32_t sunxi_mmc_blk_read(void *sdhci, void *dst, uint32_t start, uint32_t blkcnt)
Read blocks from the Sunxi MMC block device.
Definition sys-mmc.c:1835
struct mmc_cmd mmc_cmd_t
sdhci_speed_mode_t
Definition sys-mmc.h:277
@ MMC_HSSDR52_SDR25
Definition sys-mmc.h:279
@ MMC_HS200_SDR104
Definition sys-mmc.h:281
@ MMC_DS26_SDR12
Definition sys-mmc.h:278
@ MMC_MAX_SPD_MD_NUM
Definition sys-mmc.h:283
@ MMC_HSDDR52_DDR50
Definition sys-mmc.h:280
@ MMC_HS400
Definition sys-mmc.h:282
int sunxi_mmc_init(void *sdhci_hdl)
Initializes the SD/MMC host controller and attached card.
Definition sys-mmc.c:1758
struct mmc mmc_t