1 /* 2 * Copyright (c) 2006-2020, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2020-10-27 bigmagic first version 9 */ 10 11 #ifndef __DRV_SDIO_H__ 12 #define __DRV_SDIO_H__ 13 14 #include <rtthread.h> 15 #include <rtdevice.h> 16 #include <drivers/dev_mmcsd_core.h> 17 18 #include "board.h" 19 #include "raspi4.h" 20 21 /* Struct for Intrrrupt Information */ 22 #define SDXC_CmdDone BIT(0) 23 #define SDXC_DataDone BIT(1) 24 #define SDXC_BlockGap BIT(2) 25 #define SDXC_WriteRdy BIT(4) 26 #define SDXC_ReadRdy BIT(5) 27 #define SDXC_Card BIT(8) 28 #define SDXC_Retune BIT(12) 29 #define SDXC_BootAck BIT(13) 30 #define SDXC_EndBoot BIT(14) 31 #define SDXC_Err BIT(15) 32 #define SDXC_CTOErr BIT(16) 33 #define SDXC_CCRCErr BIT(17) 34 #define SDXC_CENDErr BIT(18) 35 #define SDXC_CBADErr BIT(19) 36 #define SDXC_DTOErr BIT(20) 37 #define SDXC_DCRCErr BIT(21) 38 #define SDXC_DENDErr BIT(22) 39 #define SDXC_ACMDErr BIT(24) 40 41 #define SDXC_BLKCNT_EN BIT(1) 42 #define SDXC_AUTO_CMD12_EN BIT(2) 43 #define SDXC_AUTO_CMD23_EN BIT(3) 44 #define SDXC_DAT_DIR BIT(4) //from card to host 45 #define SDXC_MULTI_BLOCK BIT(5) 46 #define SDXC_CMD_RSPNS_136 BIT(16) 47 #define SDXC_CMD_RSPNS_48 BIT(17) 48 #define SDXC_CMD_RSPNS_48busy BIT(16)|BIT(17) 49 #define SDXC_CHECK_CRC_CMD BIT(19) 50 #define SDXC_CMD_IXCHK_EN BIT(20) 51 #define SDXC_CMD_ISDATA BIT(21) 52 #define SDXC_CMD_SUSPEND BIT(22) 53 #define SDXC_CMD_RESUME BIT(23) 54 #define SDXC_CMD_ABORT BIT(23)|BIT(22) 55 56 #define SDXC_CMD_INHIBIT BIT(0) 57 #define SDXC_DAT_INHIBIT BIT(1) 58 #define SDXC_DAT_ACTIVE BIT(2) 59 #define SDXC_WRITE_TRANSFER BIT(8) 60 #define SDXC_READ_TRANSFER BIT(9) 61 62 struct sdhci_cmd_t 63 { 64 rt_uint32_t cmdidx; 65 rt_uint32_t cmdarg; 66 rt_uint32_t resptype; 67 rt_uint32_t datarw; 68 #define DATA_READ 1 69 #define DATA_WRITE 2 70 rt_uint32_t response[4]; 71 }; 72 73 struct sdhci_data_t 74 { 75 rt_uint8_t * buf; 76 rt_uint32_t flag; 77 rt_uint32_t blksz; 78 rt_uint32_t blkcnt; 79 }; 80 81 struct sdhci_t 82 { 83 char * name; 84 rt_uint32_t voltages; 85 rt_uint32_t width; 86 rt_uint32_t clock; 87 rt_err_t removeable; 88 void * sdcard; 89 90 rt_err_t (*detect)(struct sdhci_t * sdhci); 91 rt_err_t (*setwidth)(struct sdhci_t * sdhci, rt_uint32_t width); 92 rt_err_t (*setclock)(struct sdhci_t * sdhci, rt_uint32_t clock); 93 rt_err_t (*transfer)(struct sdhci_t * sdhci, struct sdhci_cmd_t * cmd, struct sdhci_data_t * dat); 94 void * priv; 95 }; 96 97 struct sdhci_pdata_t 98 { 99 size_t virt; 100 }; 101 102 // EMMC command flags 103 #define CMD_TYPE_NORMAL (0x00000000) 104 #define CMD_TYPE_SUSPEND (0x00400000) 105 #define CMD_TYPE_RESUME (0x00800000) 106 #define CMD_TYPE_ABORT (0x00c00000) 107 #define CMD_IS_DATA (0x00200000) 108 #define CMD_IXCHK_EN (0x00100000) 109 #define CMD_CRCCHK_EN (0x00080000) 110 #define CMD_RSPNS_NO (0x00000000) 111 #define CMD_RSPNS_136 (0x00010000) 112 #define CMD_RSPNS_48 (0x00020000) 113 #define CMD_RSPNS_48B (0x00030000) 114 #define TM_MULTI_BLOCK (0x00000020) 115 #define TM_DAT_DIR_HC (0x00000000) 116 #define TM_DAT_DIR_CH (0x00000010) 117 #define TM_AUTO_CMD23 (0x00000008) 118 #define TM_AUTO_CMD12 (0x00000004) 119 #define TM_BLKCNT_EN (0x00000002) 120 #define TM_MULTI_DATA (CMD_IS_DATA|TM_MULTI_BLOCK|TM_BLKCNT_EN) 121 122 #define RCA_NO (1) 123 #define RCA_YES (2) 124 125 // INTERRUPT register settings 126 #define INT_AUTO_ERROR (0x01000000) 127 #define INT_DATA_END_ERR (0x00400000) 128 #define INT_DATA_CRC_ERR (0x00200000) 129 #define INT_DATA_TIMEOUT (0x00100000) 130 #define INT_INDEX_ERROR (0x00080000) 131 #define INT_END_ERROR (0x00040000) 132 #define INT_CRC_ERROR (0x00020000) 133 #define INT_CMD_TIMEOUT (0x00010000) 134 #define INT_ERR (0x00008000) 135 #define INT_ENDBOOT (0x00004000) 136 #define INT_BOOTACK (0x00002000) 137 #define INT_RETUNE (0x00001000) 138 #define INT_CARD (0x00000100) 139 #define INT_READ_RDY (0x00000020) 140 #define INT_WRITE_RDY (0x00000010) 141 #define INT_BLOCK_GAP (0x00000004) 142 #define INT_DATA_DONE (0x00000002) 143 #define INT_CMD_DONE (0x00000001) 144 #define INT_ERROR_MASK (INT_CRC_ERROR|INT_END_ERROR|INT_INDEX_ERROR| \ 145 INT_DATA_TIMEOUT|INT_DATA_CRC_ERR|INT_DATA_END_ERR| \ 146 INT_ERR|INT_AUTO_ERROR) 147 #define INT_ALL_MASK (INT_CMD_DONE|INT_DATA_DONE|INT_READ_RDY|INT_WRITE_RDY|INT_ERROR_MASK) 148 149 #define EMMC_ARG2 (0x00) 150 #define EMMC_BLKSIZECNT (0x04) 151 #define EMMC_ARG1 (0x08) 152 #define EMMC_CMDTM (0x0c) 153 #define EMMC_RESP0 (0x10) 154 #define EMMC_RESP1 (0x14) 155 #define EMMC_RESP2 (0x18) 156 #define EMMC_RESP3 (0x1c) 157 #define EMMC_DATA (0x20) 158 #define EMMC_STATUS (0x24) 159 #define EMMC_CONTROL0 (0x28) 160 #define EMMC_CONTROL1 (0x2c) 161 #define EMMC_INTERRUPT (0x30) 162 #define EMMC_IRPT_MASK (0x34) 163 #define EMMC_IRPT_EN (0x38) 164 #define EMMC_CONTROL2 (0x3c) 165 #define EMMC_CAPABILITIES_0 (0x40) 166 #define EMMC_CAPABILITIES_1 (0x44) 167 #define EMMC_BOOT_TIMEOUT (0x70) 168 #define EMMC_EXRDFIFO_EN (0x84) 169 #define EMMC_SPI_INT_SPT (0xf0) 170 #define EMMC_SLOTISR_VER (0xfc) 171 172 // CONTROL register settings 173 #define C0_SPI_MODE_EN (0x00100000) 174 #define C0_HCTL_HS_EN (0x00000004) 175 #define C0_HCTL_DWITDH (0x00000002) 176 177 #define C1_SRST_DATA (0x04000000) 178 #define C1_SRST_CMD (0x02000000) 179 #define C1_SRST_HC (0x01000000) 180 #define C1_TOUNIT_DIS (0x000f0000) 181 #define C1_TOUNIT_MAX (0x000e0000) 182 #define C1_CLK_GENSEL (0x00000020) 183 #define C1_CLK_EN (0x00000004) 184 #define C1_CLK_STABLE (0x00000002) 185 #define C1_CLK_INTLEN (0x00000001) 186 187 #define FREQ_SETUP (400000) // 400 Khz 188 #define FREQ_NORMAL (25000000) // 25 Mhz 189 190 // SLOTISR_VER values 191 #define HOST_SPEC_NUM 0x00ff0000 192 #define HOST_SPEC_NUM_SHIFT 16 193 #define HOST_SPEC_V3 2 194 #define HOST_SPEC_V2 1 195 #define HOST_SPEC_V1 0 196 197 // STATUS register settings 198 #define SR_DAT_LEVEL1 (0x1e000000) 199 #define SR_CMD_LEVEL (0x01000000) 200 #define SR_DAT_LEVEL0 (0x00f00000) 201 #define SR_DAT3 (0x00800000) 202 #define SR_DAT2 (0x00400000) 203 #define SR_DAT1 (0x00200000) 204 #define SR_DAT0 (0x00100000) 205 #define SR_WRITE_PROT (0x00080000) // From SDHC spec v2, BCM says reserved 206 #define SR_READ_AVAILABLE (0x00000800) // ???? undocumented 207 #define SR_WRITE_AVAILABLE (0x00000400) // ???? undocumented 208 #define SR_READ_TRANSFER (0x00000200) 209 #define SR_WRITE_TRANSFER (0x00000100) 210 #define SR_DAT_ACTIVE (0x00000004) 211 #define SR_DAT_INHIBIT (0x00000002) 212 #define SR_CMD_INHIBIT (0x00000001) 213 214 #define CONFIG_MMC_USE_DMA 215 #define DMA_ALIGN (32U) 216 217 #define SD_CMD_INDEX(a) ((a) << 24) 218 #define SD_CMD_RESERVED(a) (0xffffffff) 219 #define SD_CMD_INDEX(a) ((a) << 24) 220 #define SD_CMD_TYPE_NORMAL (0x0) 221 #define SD_CMD_TYPE_SUSPEND (1 << 22) 222 #define SD_CMD_TYPE_RESUME (2 << 22) 223 #define SD_CMD_TYPE_ABORT (3 << 22) 224 #define SD_CMD_TYPE_MASK (3 << 22) 225 #define SD_CMD_ISDATA (1 << 21) 226 #define SD_CMD_IXCHK_EN (1 << 20) 227 #define SD_CMD_CRCCHK_EN (1 << 19) 228 #define SD_CMD_RSPNS_TYPE_NONE (0) // For no response 229 #define SD_CMD_RSPNS_TYPE_136 (1 << 16) // For response R2 (with CRC), R3,4 (no CRC) 230 #define SD_CMD_RSPNS_TYPE_48 (2 << 16) // For responses R1, R5, R6, R7 (with CRC) 231 #define SD_CMD_RSPNS_TYPE_48B (3 << 16) // For responses R1b, R5b (with CRC) 232 #define SD_CMD_RSPNS_TYPE_MASK (3 << 16) 233 #define SD_CMD_MULTI_BLOCK (1 << 5) 234 #define SD_CMD_DAT_DIR_HC (0) 235 #define SD_CMD_DAT_DIR_CH (1 << 4) 236 #define SD_CMD_AUTO_CMD_EN_NONE (0) 237 #define SD_CMD_AUTO_CMD_EN_CMD12 (1 << 2) 238 #define SD_CMD_AUTO_CMD_EN_CMD23 (2 << 2) 239 #define SD_CMD_BLKCNT_EN (1 << 1) 240 #define SD_CMD_DMA (1) 241 #define SD_RESP_NONE SD_CMD_RSPNS_TYPE_NONE 242 #define SD_RESP_R1 (SD_CMD_RSPNS_TYPE_48) // | SD_CMD_CRCCHK_EN) 243 #define SD_RESP_R1b (SD_CMD_RSPNS_TYPE_48B) // | SD_CMD_CRCCHK_EN) 244 #define SD_RESP_R2 (SD_CMD_RSPNS_TYPE_136) // | SD_CMD_CRCCHK_EN) 245 #define SD_RESP_R3 SD_CMD_RSPNS_TYPE_48 246 #define SD_RESP_R4 SD_CMD_RSPNS_TYPE_136 247 #define SD_RESP_R5 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN) 248 #define SD_RESP_R5b (SD_CMD_RSPNS_TYPE_48B | SD_CMD_CRCCHK_EN) 249 #define SD_RESP_R6 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN) 250 #define SD_RESP_R7 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN) 251 #define SD_DATA_READ (SD_CMD_ISDATA | SD_CMD_DAT_DIR_CH) 252 #define SD_DATA_WRITE (SD_CMD_ISDATA | SD_CMD_DAT_DIR_HC) 253 #endif 254