📄 sd.lst
字号:
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN .\Output\Sd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Sd.c LARGE BROWSE INCDIR(.\Includes) DEBUG OBJECTEXTEND CODE SYMBOLS PRINT(
-.\Output\Sd.lst) OBJECT(.\Output\Sd.obj)
stmt level source
1 //----------------------------------------------------------------------------
2 // (C) Copyright 2002, SOTA Design Technology Inc.
3 // ALL RIGHTS RESERVED
4 //----------------------------------------------------------------------------
5 // Project: S603
6 // File Name: Sd.c
7 // Author: David Yen
8 // Description:
9 // The SD access module
10 // Revision History
11 // 10/17/02: David Yen created.
12 //----------------------------------------------------------------------------
13
14 #include "Include.h"
15 #include "fs7822.h"
16 #include "fs7822regs.h"
17 //#include <reg51.h>
18 #include <stdio.h>
19 #include <string.h>
20 //#include "Device.h"
21 #include "UsbDisk.h"
22 #include "Storage.h"
23
24 #define MAX_CMD_LEN 6
25 #define MAX_RESP_LEN 17 // Max response length = 136 bits
26 #define RSP_LEN 6
27 #define LONG_RSP_LEN 17
28 #define CARD_CMD_START 0x40
29 #define CARD_PWRUP_FINISH 0x80
30 #define OPERATION_VOL_RANGE 0x00FF0000
31 #define GOOD_CRC16_STS 0x02
32
33 /* SD_COMMAND */
34 #define SD_CMD_ONLY 1
35 #define SD_CMD_SHORT_RSP 2
36 #define SD_CMD_LONG_RSP 3
37 #define SD_CMD_TX_DATA 4
38 #define SD_CMD_TX_DATA_ONLY 5
39 #define SD_CMD_RX_DATA 6
40 #define SD_CMD_RX_DATA_ONLY 7
41
42 #define IDLE_STATE 0
43 #define READY_STATE 1
44 #define IDENTIFY_STATE 2
45 #define STANDBY_STATE 3
46 #define TRANSFER_STATE 4
47 #define DATA_STATE 5
48 #define RECEIVE_STATE 6
49 #define PRGROGAM_STATE 7
50 #define DISCONNECT_STATE 8
51
52 #define BUS_WIDTH_1BIT 0x00
53 #define BUS_WIDTH_4BIT 0x02
54
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 2
55 // Command Name Index MMC-3.1 MMC-4.0 SD-1.01 Resp
56 #define GO_IDLE_STATE 0 // V V V -
57 #define SEND_OP_COND 1 // V V R3 (OCR)
58 #define ALL_SEND_CID 2 // V V V R2
59 #define SEND_RELATIVE_ADDR 3 // R1 R1 R6 See SdGetRespType()
60 #define SET_DSR 4 // V V V -
61 #define SWITCH 6 // V R1
62 #define SELECT_CARD 7 // V V V R1
63 #define SEND_EXT_CSD 8 // V R1
64 #define SEND_CSD 9 // V V V R2
65 #define SEND_CID 10 // V V V R2
66 #define READ_DAT_UNTIL_STOP 11 // V V R1
67 #define STOP_TRANS 12 // V V V R1
68 #define SEND_STATUS 13 // V V V R1
69 #define GO_INACTIVE_STATE 15 // V V V -
70 #define SET_BLOCKLEN 16 // V V V R1
71 #define READ_BLOCK 17 // V V V R1
72 #define READ_MUL_BLOCK 18 // V V V R1
73 #define WRITE_DAT_UNTIL_STOP 20 // V V R1
74 #define SET_BLOCK_COUNT 23 // V V R1
75 #define WRITE_BLOCK 24 // V V V R1
76 #define WRITE_MUL_BLOCK 25 // V V V R1
77 #define PROGRAM_CID 26 // V V R1
78 #define PROGRAM_CSD 27 // V V V R1
79 #define SET_WRITE_PROT 28 // V V V R1
80 #define CLR_WRITE_PROT 29 // V V V R1
81 #define SEND_WRITE_PROT 30 // V V V R1
82 #define ERASE_WR_BLK_START 32 // V R1
83 #define ERASE_WR_BLK_END 33 // V R1
84 #define ERASE_GROUP_START 35 // V V R1
85 #define ERASE_GROUP_END 36 // V V R1
86 #define ERASE 38 // V V V R1
87 #define FAST_IO 39 // V V R4
88 #define GO_IRQ_STATE 40 // V V R5
89 #define LOCK_UNLOCK 42 // V V V R1
90 #define APP_CMD 55 // V V V R1
91 #define GEN_CMD 56 // V V V R1
92
93 // ACMD Name Index MMC-3.1 MMC-4.0 SD-1.01 Resp
94 #define SET_BUS_WIDTH 6 // V R1
95 #define SEND_SD_STATUS 13 // V R1
96 #define SEND_NUM_WR_BLOCKS 22 // V R1
97 #define SET_WR_BLK_ERASE_CNT 23 // V R1
98 #define SD_SEND_OP_COND 41 // V R3 (OCR)
99 #define SET_CLR_CARD_DETECT 42 // V R1
100 #define SEND_SCR 51 // V R1
101
102 // ??? According to Spec of MMC3.1, MultiMediaCard returns response of
103 // type R1 to APP_CMD (CMD55). But, according to Spec of SD1.01
104 // page 23, MultiMediaCard will not respond to APP_CMD - CMD55.
105 // Is this a confliction ?
106
107
108 #define SdHiClk() SDMI_CTL=(SDMI_CTL|bmSD_CLK_SEL)|bmSD_CLK_EN;
109 #define SdLoClk() SDMI_CTL=(SDMI_CTL&~bmSD_CLK_SEL)|bmSD_CLK_EN;
110 #define SdStopClk() SDMI_CTL=SDMI_CTL&~bmSD_CLK_EN;
111 #define IsCardBusy() (SDMI_ST&bmSD_BUSY)
112 #define SdWriteProtect() ((SDMI_ST & bmSD_WR_PROTECT))
113 //#define SdCardExist() (CSRRead(SD_BASE + SD_STATUS) & SD_CARD_STS)
114 //#define SdCtrlReset() CSRWrite(SD_BASE + SD_CLK_CTRL, SD_RESET | SD_CLK_EN)
115 #define SdWaitCard()\
116 {\
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 3
117 CmdTimer = SD_CMD_TIMEOUT;\
118 while (IsCardBusy() && CmdTimer);\
119 }
120
121 #ifdef PMOS
122 #define SdPowerOn() {SD_POWER_CTRL = 0; Delay(50);}
123 #define SdPowerOff() SD_POWER_CTRL = 1
124 #else
#define SdPowerOn()
#define SdPowerOff()
#endif
128
129 typedef enum {CARD_SD, CARD_MMC} TCARD_TYPE;
130
131 /*************************************************
132 Global Variables
133 *************************************************/
134 xdata BYTE SdGetFlashInfoTimer = 0;
135
136 /*************************************************
137 Local Variables
138 *************************************************/
139 static xdata UINT32 SdAvailableBlocks = 0;
140 static xdata TCARD_TYPE CardType = CARD_SD;
141 static idata BYTE SdCmdBuf[MAX_CMD_LEN];
142 static xdata BYTE SdRespBuf[MAX_RESP_LEN];
143 static idata UINT32 RCA = 0;
144 static BOOL MmcProtol;
145
146 #define TYPE_RESP_NO 0
147 #define TYPE_RESP_R1 1
148 #define TYPE_RESP_R2 2
149 #define TYPE_RESP_R3 3
150 #define TYPE_RESP_R4 4
151 #define TYPE_RESP_R5 5
152 #define TYPE_RESP_R6 6
153
154 xdata BYTE IsAppCmd = false;
155 /*
156 //modify by David Guo
157 //xdata UINT16 MMCtest = 0;
158 //xdata UINT16 MMCerror1 = 0;
159 //xdata UINT16 MMCerror2 = 0;
160 //xdata UINT16 MMCerror3 = 0;
161 //xdata BYTE MMCCmdIndex[150];
162 //end modify by David Guo
163 */
164 BYTE SdGetRespType(BYTE CmdIndex)
165 {
166 1 if(CmdIndex == SEND_RELATIVE_ADDR)
167 1 {
168 2 if(CardType == CARD_SD)
169 2 return TYPE_RESP_R6;
170 2 else
171 2 return TYPE_RESP_R1;
172 2 }
173 1 switch(CmdIndex)
174 1 {
175 2 case GO_IDLE_STATE : return TYPE_RESP_NO; break;
176 2 case SEND_OP_COND : return TYPE_RESP_R3; break;
177 2 case ALL_SEND_CID : return TYPE_RESP_R2; break;
178 2 case SET_DSR : return TYPE_RESP_NO; break;
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 4
179 2 case SWITCH : return TYPE_RESP_R1; break;
180 2 case SELECT_CARD : return TYPE_RESP_R1; break;
181 2 case SEND_EXT_CSD : return TYPE_RESP_R1; break;
182 2 case SEND_CSD : return TYPE_RESP_R2; break;
183 2 case SEND_CID : return TYPE_RESP_R2; break;
184 2 case READ_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
185 2 case STOP_TRANS : return TYPE_RESP_R1; break;
186 2 case SEND_STATUS : return TYPE_RESP_R1; break;
187 2 case GO_INACTIVE_STATE : return TYPE_RESP_NO; break;
188 2 case SET_BLOCKLEN : return TYPE_RESP_R1; break;
189 2 case READ_BLOCK : return TYPE_RESP_R1; break;
190 2 case READ_MUL_BLOCK : return TYPE_RESP_R1; break;
191 2 case WRITE_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
192 2 case SET_BLOCK_COUNT : return TYPE_RESP_R1; break;
193 2 case WRITE_BLOCK : return TYPE_RESP_R1; break;
194 2 case WRITE_MUL_BLOCK : return TYPE_RESP_R1; break;
195 2 case PROGRAM_CID : return TYPE_RESP_R1; break;
196 2 case PROGRAM_CSD : return TYPE_RESP_R1; break;
197 2 case SET_WRITE_PROT : return TYPE_RESP_R1; break;
198 2 case CLR_WRITE_PROT : return TYPE_RESP_R1; break;
199 2 case SEND_WRITE_PROT : return TYPE_RESP_R1; break;
200 2 case ERASE_WR_BLK_START : return TYPE_RESP_R1; break;
201 2 case ERASE_WR_BLK_END : return TYPE_RESP_R1; break;
202 2 case ERASE_GROUP_START : return TYPE_RESP_R1; break;
203 2 case ERASE_GROUP_END : return TYPE_RESP_R1; break;
204 2 case ERASE : return TYPE_RESP_R1; break;
205 2 case FAST_IO : return TYPE_RESP_R4; break;
206 2 case GO_IRQ_STATE : return TYPE_RESP_R5; break;
207 2 case LOCK_UNLOCK : return TYPE_RESP_R1; break;
208 2 case APP_CMD : return TYPE_RESP_R1; break;
209 2 case GEN_CMD : return TYPE_RESP_R1; break;
210 2 // APP_CMDs
211 2 case SEND_NUM_WR_BLOCKS : return TYPE_RESP_R1; break;
212 2 case SD_SEND_OP_COND : return TYPE_RESP_R3; break;
213 2 case SEND_SCR : return TYPE_RESP_R1; break;
214 2 default : return TYPE_RESP_NO; break;
215 2 }
216 1 // Following commands are with identical index and response type:
217 1 // 1. SET_BUS_WIDTH (ACMD6) Response R1
218 1 // SWITCH (CMD6) Response R1
219 1 // 2. SEND_SD_STATUS (ACMD13) Response R1
220 1 // SEND_STATUS (CMD13) Response R1
221 1 // 3. SET_WR_BLK_ERASE_CNT (ACMD23) Response R1
222 1 // SET_BLOCK_COUNT (CMD23) Response R1
223 1 // 4. SET_CLR_CARD_DETECT (ACMD42) Response R1
224 1 // LOCK_UNLOCK (CMD42) Response R1
225 1 }
226
227 STATUS SdSendCmd(BYTE CmdIndex, PBYTE CmdBuf)
228 {
229 1 BYTE RespType , RespLen , CmdType;
230 1 //BYTE Status;
231 1 BYTE i;
232 1 BYTE RetryCount = 0;
233 1
234 1 RespType = SdGetRespType(CmdIndex);
235 1
236 1
237 1 if((CmdIndex == READ_BLOCK)||
238 1 (CmdIndex == READ_MUL_BLOCK))
239 1 {
240 2 RespLen = 6;
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 5
241 2 CmdType = SD_CMD_RX_DATA;
242 2 }
243 1 else if((CmdIndex == WRITE_BLOCK)||
244 1 (CmdIndex == WRITE_MUL_BLOCK))
245 1 {
246 2 RespLen = 6;
247 2 CmdType = SD_CMD_TX_DATA;
248 2 }
249 1 else if(RespType == TYPE_RESP_NO)
250 1 {
251 2 RespLen = 0;
252 2 CmdType = SD_CMD_ONLY;
253 2 }
254 1 else if(RespType == TYPE_RESP_R2)
255 1 {
256 2 RespLen = 17;
257 2 CmdType = SD_CMD_LONG_RSP;
258 2 }
259 1
260 1 else
261 1 {
262 2 RespLen = 6;
263 2 CmdType = SD_CMD_SHORT_RSP;
264 2 }
265 1
266 1 if (CmdIndex == 0x5)
267 1 {
268 2 RespLen = 6;
269 2 CmdType = SD_CMD_SHORT_RSP;
270 2
271 2 }
272 1
273 1 for( ; RetryCount < 3; RetryCount++)
274 1 {
275 2 //CmdBuf[0] = CARD_CMD_START | CmdIndex;
276 2 SDMCMDRESBUF00 = CARD_CMD_START | CmdIndex;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -