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