📄 sd.lst
字号:
C51 COMPILER V7.02b SD 02/01/2007 10:35:44 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 OPTIMIZE(9,SPEED) BROWSE INCDIR(Include) DEFINE(READER) DEBUG OBJECTEX
-TEND PRINT(.\Output\Sd.lst) OBJECT(.\Output\Sd.obj)
stmt level source
1 /*
2 **********************************************************************************************
3 * Project: TK7821
4 * File: sd.c
5 * Contents:
6 * The SD access module
7 *
8 * $Date: 02/25/05 Jason v0.1
9 * 05/12/05 Mingo v0.2 www.fameg.com
10 *
11 * Copyright (c) 2005 Fameg, Inc. All rights reserved
12 ***********************************************************************************************
13 */
14
15 #include <reg51.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include "Device.h"
19 #include "UsbDisk.h"
20 #include "Storage.h"
21
22 #define MAX_CMD_LEN 6
23 #define MAX_RESP_LEN 17 // Max response length = 136 bits
24 #define RSP_LEN 6
25 #define LONG_RSP_LEN 17
26 #define CARD_CMD_START 0x40
27 #define CARD_PWRUP_FINISH 0x80
28 #define OPERATION_VOL_RANGE 0x00FF0000
29 #define GOOD_CRC16_STS 0x02
30
31 /* SD_COMMAND */
32 #define SD_CMD_ONLY 1
33 #define SD_CMD_SHORT_RSP 2
34 #define SD_CMD_LONG_RSP 3
35 #define SD_CMD_TX_DATA 4
36 #define SD_CMD_TX_DATA_ONLY 5
37 #define SD_CMD_RX_DATA 6
38 #define SD_CMD_RX_DATA_ONLY 7
39
40 #define IDLE_STATE 0
41 #define READY_STATE 1
42 #define IDENTIFY_STATE 2
43 #define STANDBY_STATE 3
44 #define TRANSFER_STATE 4
45 #define DATA_STATE 5
46 #define RECEIVE_STATE 6
47 #define PRGROGAM_STATE 7
48 #define DISCONNECT_STATE 8
49
50 #define BUS_WIDTH_1BIT 0x00
51 #define BUS_WIDTH_4BIT 0x02
52
53 // Command Name Index MMC-3.1 MMC-4.0 SD-1.01 Resp
54 #define GO_IDLE_STATE 0 // V V V -
C51 COMPILER V7.02b SD 02/01/2007 10:35:44 PAGE 2
55 #define SEND_OP_COND 1 // V V R3 (OCR)
56 #define ALL_SEND_CID 2 // V V V R2
57 #define SEND_RELATIVE_ADDR 3 // R1 R1 R6 See SdGetRespType()
58 #define SET_DSR 4 // V V V -
59 #define SWITCH 6 // V R1
60 #define SELECT_CARD 7 // V V V R1
61 #define SEND_EXT_CSD 8 // V R1
62 #define SEND_CSD 9 // V V V R2
63 #define SEND_CID 10 // V V V R2
64 #define READ_DAT_UNTIL_STOP 11 // V V R1
65 #define STOP_TRANS 12 // V V V R1
66 #define SEND_STATUS 13 // V V V R1
67 #define GO_INACTIVE_STATE 15 // V V V -
68 #define SET_BLOCKLEN 16 // V V V R1
69 #define READ_BLOCK 17 // V V V R1
70 #define READ_MUL_BLOCK 18 // V V V R1
71 #define WRITE_DAT_UNTIL_STOP 20 // V V R1
72 #define SET_BLOCK_COUNT 23 // V V R1
73 #define WRITE_BLOCK 24 // V V V R1
74 #define WRITE_MUL_BLOCK 25 // V V V R1
75 #define PROGRAM_CID 26 // V V R1
76 #define PROGRAM_CSD 27 // V V V R1
77 #define SET_WRITE_PROT 28 // V V V R1
78 #define CLR_WRITE_PROT 29 // V V V R1
79 #define SEND_WRITE_PROT 30 // V V V R1
80 #define ERASE_WR_BLK_START 32 // V R1
81 #define ERASE_WR_BLK_END 33 // V R1
82 #define ERASE_GROUP_START 35 // V V R1
83 #define ERASE_GROUP_END 36 // V V R1
84 #define ERASE 38 // V V V R1
85 #define FAST_IO 39 // V V R4
86 #define GO_IRQ_STATE 40 // V V R5
87 #define LOCK_UNLOCK 42 // V V V R1
88 #define APP_CMD 55 // V V V R1
89 #define GEN_CMD 56 // V V V R1
90
91 // ACMD Name Index MMC-3.1 MMC-4.0 SD-1.01 Resp
92 #define SET_BUS_WIDTH 6 // V R1
93 #define SEND_SD_STATUS 13 // V R1
94 #define SEND_NUM_WR_BLOCKS 22 // V R1
95 #define SET_WR_BLK_ERASE_CNT 23 // V R1
96 #define SD_SEND_OP_COND 41 // V R3 (OCR)
97 #define SET_CLR_CARD_DETECT 42 // V R1
98 #define SEND_SCR 51 // V R1
99
100 // ??? According to Spec of MMC3.1, MultiMediaCard returns response of
101 // type R1 to APP_CMD (CMD55). But, according to Spec of SD1.01
102 // page 23, MultiMediaCard will not respond to APP_CMD - CMD55.
103 // Is this a confliction ?
104
105
106 #define SdHiClk() CSRWrite(SD_BASE + SD_CLK_CTRL, \
107 (CSRRead(SD_BASE + SD_CLK_CTRL) | SD_CLK_SEL) | SD_CLK_EN);
108 #define SdLoClk() CSRWrite(SD_BASE + SD_CLK_CTRL, \
109 (CSRRead(SD_BASE + SD_CLK_CTRL) & ~SD_CLK_SEL) | SD_CLK_EN);
110 #define SdStopClk() CSRWrite(SD_BASE + SD_CLK_CTRL, \
111 CSRRead(SD_BASE + SD_CLK_CTRL) & ~SD_CLK_EN);
112 #define IsCardBusy() (CSRRead(SD_BASE + SD_STATUS) & SD_BUSY)
113 #define SdWriteProtect() (!(CSRRead(SD_BASE + SD_STATUS) & SD_WPD))
114 #define SdCardExist() (CSRRead(SD_BASE + SD_STATUS) & SD_CARD_STS)
115 #define SdCtrlReset() CSRWrite(SD_BASE + SD_CLK_CTRL, SD_RESET | SD_CLK_EN)
116 #define SdWaitCard()\
C51 COMPILER V7.02b SD 02/01/2007 10:35:44 PAGE 3
117 {\
118 CmdTimer = SD_CMD_TIMEOUT;\
119 while (IsCardBusy() && CmdTimer);\
120 }
121
122 #ifdef PMOS
123 #define SdPowerOn() {SD_POWER_CTRL = 0; Delay(50);}
124 #define SdPowerOff() SD_POWER_CTRL = 1
125 #else
#define SdPowerOn()
#define SdPowerOff()
#endif
129
130 typedef enum {CARD_SD, CARD_MMC} TCARD_TYPE;
131
132 /*************************************************
133 Global Variables
134 *************************************************/
135 xdata BYTE SdGetFlashInfoTimer = 0;
136
137 /*************************************************
138 Local Variables
139 *************************************************/
140 static xdata UINT32 SdAvailableBlocks = 0;
141 static xdata TCARD_TYPE CardType = CARD_SD;
142 static idata BYTE SdCmdBuf[MAX_CMD_LEN];
143 static xdata BYTE SdRespBuf[MAX_RESP_LEN];
144 static idata UINT32 RCA = 0;
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 bool IsAppCmd = false;
155
156 BYTE SdGetRespType(BYTE CmdIndex)
157 {
158 1 if(CmdIndex == SEND_RELATIVE_ADDR)
159 1 {
160 2 if(CardType == CARD_SD)
161 2 return TYPE_RESP_R6;
162 2 else
163 2 return TYPE_RESP_R1;
164 2 }
165 1 switch(CmdIndex)
166 1 {
167 2 case GO_IDLE_STATE : return TYPE_RESP_NO; break;
168 2 case SEND_OP_COND : return TYPE_RESP_R3; break;
169 2 case ALL_SEND_CID : return TYPE_RESP_R2; break;
170 2 case SET_DSR : return TYPE_RESP_NO; break;
171 2 case SWITCH : return TYPE_RESP_R1; break;
172 2 case SELECT_CARD : return TYPE_RESP_R1; break;
173 2 case SEND_EXT_CSD : return TYPE_RESP_R1; break;
174 2 case SEND_CSD : return TYPE_RESP_R2; break;
175 2 case SEND_CID : return TYPE_RESP_R2; break;
176 2 case READ_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
177 2 case STOP_TRANS : return TYPE_RESP_R1; break;
178 2 case SEND_STATUS : return TYPE_RESP_R1; break;
C51 COMPILER V7.02b SD 02/01/2007 10:35:44 PAGE 4
179 2 case GO_INACTIVE_STATE : return TYPE_RESP_NO; break;
180 2 case SET_BLOCKLEN : return TYPE_RESP_R1; break;
181 2 case READ_BLOCK : return TYPE_RESP_R1; break;
182 2 case READ_MUL_BLOCK : return TYPE_RESP_R1; break;
183 2 case WRITE_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
184 2 case SET_BLOCK_COUNT : return TYPE_RESP_R1; break;
185 2 case WRITE_BLOCK : return TYPE_RESP_R1; break;
186 2 case WRITE_MUL_BLOCK : return TYPE_RESP_R1; break;
187 2 case PROGRAM_CID : return TYPE_RESP_R1; break;
188 2 case PROGRAM_CSD : return TYPE_RESP_R1; break;
189 2 case SET_WRITE_PROT : return TYPE_RESP_R1; break;
190 2 case CLR_WRITE_PROT : return TYPE_RESP_R1; break;
191 2 case SEND_WRITE_PROT : return TYPE_RESP_R1; break;
192 2 case ERASE_WR_BLK_START : return TYPE_RESP_R1; break;
193 2 case ERASE_WR_BLK_END : return TYPE_RESP_R1; break;
194 2 case ERASE_GROUP_START : return TYPE_RESP_R1; break;
195 2 case ERASE_GROUP_END : return TYPE_RESP_R1; break;
196 2 case ERASE : return TYPE_RESP_R1; break;
197 2 case FAST_IO : return TYPE_RESP_R4; break;
198 2 case GO_IRQ_STATE : return TYPE_RESP_R5; break;
199 2 case LOCK_UNLOCK : return TYPE_RESP_R1; break;
200 2 case APP_CMD : return TYPE_RESP_R1; break;
201 2 case GEN_CMD : return TYPE_RESP_R1; break;
202 2 // APP_CMDs
203 2 case SEND_NUM_WR_BLOCKS : return TYPE_RESP_R1; break;
204 2 case SD_SEND_OP_COND : return TYPE_RESP_R3; break;
205 2 case SEND_SCR : return TYPE_RESP_R1; break;
206 2 default : return TYPE_RESP_NO; break;
207 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -