1 #ifndef __SWM341_SDIO_H__ 2 #define __SWM341_SDIO_H__ 3 4 5 #define SD_CMD_GO_IDLE_STATE ((uint8_t)0) 6 #define SD_CMD_SEND_OP_COND ((uint8_t)1) 7 #define SD_CMD_ALL_SEND_CID ((uint8_t)2) 8 #define SD_CMD_SET_REL_ADDR ((uint8_t)3) 9 #define SD_CMD_SET_DSR ((uint8_t)4) 10 #define SD_CMD_HS_SWITCH ((uint8_t)6) 11 #define SD_CMD_SEL_DESEL_CARD ((uint8_t)7) 12 #define SD_CMD_SEND_IF_COND ((uint8_t)8) 13 #define SD_CMD_SEND_CSD ((uint8_t)9) 14 #define SD_CMD_SEND_CID ((uint8_t)10) 15 #define SD_CMD_STOP_TRANSMISSION ((uint8_t)12) 16 #define SD_CMD_SEND_STATUS ((uint8_t)13) 17 #define SD_CMD_SET_BLOCKLEN ((uint8_t)16) 18 #define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17) 19 #define SD_CMD_READ_MULT_BLOCK ((uint8_t)18) 20 #define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24) 21 #define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25) 22 #define SD_CMD_PROG_CID ((uint8_t)26) 23 #define SD_CMD_PROG_CSD ((uint8_t)27) 24 #define SD_CMD_APP_CMD ((uint8_t)55) 25 26 /*Following commands are SD Card Specific commands. 27 SDIO_APP_CMD should be sent before sending these commands. */ 28 #define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6) 29 #define SD_CMD_SD_APP_STAUS ((uint8_t)13) 30 #define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22) 31 #define SD_CMD_SD_APP_OP_COND ((uint8_t)41) 32 #define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) 33 #define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51) 34 #define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52) 35 #define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53) 36 37 #define SD_CMD53_ARG_Count 0 // 0x001 1 0x002 2 ... 0x1FF 512 0x000 512 byte 38 #define SD_CMD53_ARG_Addr 9 // Start Address of I/O register to read or write 39 #define SD_CMD53_ARG_AddrInc 26 // 0 Multi byte R/W to fixed address 1 Multi byte R/W to incrementing address 40 #define SD_CMD53_ARG_CountUnit 27 // 0 Count in byte 1 Count in block 41 #define SD_CMD53_ARG_Function 28 // The number of the function within the I/O card you wish to read or write. Function 0x00 selects the common I/O area (CIA). 42 #define SD_CMD53_ARG_nRW 31 // 0 for read 1 for write 43 44 45 #define SD_RESP_NO 0 //0 无响应 46 #define SD_RESP_32b 2 //2 32位响应 47 #define SD_RESP_128b 1 //1 128位响应 48 #define SD_RESP_32b_busy 3 //3 32位响应,check Busy after response 49 50 #define SD_BUSWIDTH_1b 0 51 #define SD_BUSWIDTH_4b 2 52 53 #define SD_RES_OK 0 54 #define SD_RES_ERR 1 55 #define SD_RES_TIMEOUT 2 56 57 58 /* Card Status return by response R1 */ 59 #define SD_CS_APP_CMD (1 << 5) // The card will expect ACMD 60 #define SD_CS_READY_FOR_DATA (1 << 8) // Corresponds to buffer empty signaling on the bus 61 #define SD_CS_CURRENT_STATE (1 << 9) // The state of the card when receiving the command. 共 4 位 62 #define SD_CS_CARD_ECC_FAILED (1 << 21) 63 #define SD_CS_ILLEGAL_COMMAND (1 << 22) 64 #define SD_CS_CARD_IS_LOCKED (1 << 25) 65 66 67 typedef struct 68 { 69 __IO uint8_t CSDStruct; // CSD structure 70 __IO uint8_t SysSpecVersion; // System specification version 71 __IO uint8_t Reserved1; // Reserved 72 __IO uint8_t TAAC; // Data read access-time 1 73 __IO uint8_t NSAC; // Data read access-time 2 in CLK cycles 74 __IO uint8_t MaxBusClkFrec; // Max. bus clock frequency 75 __IO uint16_t CardComdClasses; //< Card command classes 76 __IO uint8_t RdBlockLen; // Max. read data block length 77 __IO uint8_t PartBlockRead; // Partial blocks for read allowed 78 __IO uint8_t WrBlockMisalign; // Write block misalignment 79 __IO uint8_t RdBlockMisalign; // Read block misalignment 80 __IO uint8_t DSRImpl; // DSR implemented 81 __IO uint8_t Reserved2; // Reserved 82 __IO uint32_t DeviceSize; // Device Size 83 __IO uint8_t MaxRdCurrentVDDMin; // Max. read current @ VDD min 84 __IO uint8_t MaxRdCurrentVDDMax; // Max. read current @ VDD max 85 __IO uint8_t MaxWrCurrentVDDMin; // Max. write current @ VDD min 86 __IO uint8_t MaxWrCurrentVDDMax; // Max. write current @ VDD max 87 __IO uint8_t DeviceSizeMul; // Device size multiplier 88 __IO uint8_t EraseGrSize; // Erase group size 89 __IO uint8_t EraseGrMul; // Erase group size multiplier 90 __IO uint8_t WrProtectGrSize; // Write protect group size 91 __IO uint8_t WrProtectGrEnable; // Write protect group enable 92 __IO uint8_t ManDeflECC; // Manufacturer default ECC 93 __IO uint8_t WrSpeedFact; // Write speed factor 94 __IO uint8_t MaxWrBlockLen; // Max. write data block length 95 __IO uint8_t WriteBlockPaPartial; // Partial blocks for write allowed 96 __IO uint8_t Reserved3; // Reserded 97 __IO uint8_t ContentProtectAppli; // Content protection application 98 __IO uint8_t FileFormatGrouop; // File format group 99 __IO uint8_t CopyFlag; // Copy flag (OTP) 100 __IO uint8_t PermWrProtect; // Permanent write protection 101 __IO uint8_t TempWrProtect; // Temporary write protection 102 __IO uint8_t FileFormat; // File Format 103 __IO uint8_t ECC; // ECC code 104 } SD_CSD; 105 106 typedef struct 107 { 108 __IO uint8_t ManufacturerID; // ManufacturerID 109 __IO uint16_t OEM_AppliID; // OEM/Application ID 110 __IO uint32_t ProdName1; // Product Name part1 111 __IO uint8_t ProdName2; // Product Name part2 112 __IO uint8_t ProdRev; // Product Revision 113 __IO uint32_t ProdSN; // Product Serial Number 114 __IO uint8_t Reserved1; // Reserved1 115 __IO uint16_t ManufactDate; // Manufacturing Date 116 } SD_CID; 117 118 119 #define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000) 120 #define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001) 121 #define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002) 122 #define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003) 123 #define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004) 124 #define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005) 125 #define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006) 126 #define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007) 127 128 129 typedef struct 130 { 131 SD_CSD SD_csd; 132 SD_CID SD_cid; 133 uint64_t CardCapacity; // Card Capacity 134 uint32_t CardBlockSize; // Card Block Size 135 uint16_t RCA; 136 uint8_t CardType; 137 } SD_CardInfo; 138 139 140 extern SD_CardInfo SD_cardInfo; 141 142 uint32_t SDIO_Init(uint32_t freq); 143 uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[]); 144 uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[]); 145 146 uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]); 147 uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]); 148 149 uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]); 150 uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]); 151 152 uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma); 153 154 #define SDIO_SendCmd(cmd, arg, resp_type, resp_data) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 0, 0, 0, 0) 155 #define SDIO_SendCmdWithData(cmd, arg, resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 1, data_read, block_cnt, 0) 156 #define SDIO_SendCmdWithDataByDMA(cmd, arg, resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 1, data_read, block_cnt, 1) 157 158 void parseCID(uint32_t CID_Tab[4]); 159 void parseCSD(uint32_t CID_Tab[4]); 160 161 uint32_t calcSDCLKDiv(uint32_t freq_sel); 162 163 164 enum SDIO_bus_width { SDIO_1bit = 0, SDIO_4bit = 1 }; 165 166 uint32_t SDIO_IO_Init(uint32_t freq, enum SDIO_bus_width w); 167 uint32_t SDIO_IO_ByteWrite(uint8_t func, uint32_t addr, uint8_t data); 168 uint32_t SDIO_IO_ByteRead(uint8_t func, uint32_t addr, uint8_t * data); 169 uint32_t SDIO_IO_BlockWrite(uint8_t func, uint32_t addr, uint8_t addrInc, uint32_t buff[], uint16_t block_size); 170 uint32_t SDIO_IO_BlockRead(uint8_t func, uint32_t addr, uint8_t addrInc, uint32_t buff[], uint16_t block_size); 171 uint32_t SDIO_IO_MultiBlockWrite(uint8_t func, uint32_t addr, uint8_t addrInc, uint32_t buff[], uint16_t block_count); 172 uint32_t SDIO_IO_MultiBlockRead(uint8_t func, uint32_t addr, uint8_t addrInc, uint32_t buff[], uint16_t block_count); 173 174 #endif //__SWM341_SDIO_H__ 175