📄 mmc.lst
字号:
C51 COMPILER V6.20c MMC 07/10/2002 15:17:49 PAGE 1
C51 COMPILER V6.20c, COMPILATION OF MODULE MMC
OBJECT MODULE PLACED IN ..\obj\mmc.obj
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE ..\..\..\lib_mem\mmc\mmc.c BROWSE INCDIR(..\src\system;..\..\..\lib) DEFINE
-(KEIL) DEBUG OBJECTEXTEND PRINT(.\mmc.lst) OBJECT(..\obj\mmc.obj)
stmt level source
1 /*C**************************************************************************
2 * $RCSfile: mmc.c,v $
3 *----------------------------------------------------------------------------
4 * Copyright (c) 2002 Atmel.
5 *----------------------------------------------------------------------------
6 * RELEASE: $Name: DEMO_FAT_1_2_5 $
7 * REVISION: $Revision: 1.9 $
8 * FILE_CVSID: $Id: mmc.c,v 1.9 2002/06/03 11:35:46 ffosse Exp $
9 *----------------------------------------------------------------------------
10 * PURPOSE:
11 * This file contains the high level MMC routines
12 *
13 * NOTES:
14 * Global Variables:
15 * - gl_ptr_mem: long in data space
16 *
17 * - The functions are written to handle a 2-card MMC stack
18 * - Only MMC cards with block size = 512 bytes are accepted
19 *****************************************************************************/
20
21 /*_____ I N C L U D E S ____________________________________________________*/
22
23 #include "config.h" /* system configuration */
24 #include "..\..\lib\usb\usb_drv.h" /* usb driver definition */
25 #include "mmc.h" /* MMC definition */
26
27
28 /*_____ M A C R O S ________________________________________________________*/
29
30
31 /*_____ D E F I N I T I O N ________________________________________________*/
32
33 extern data Uint32 gl_ptr_mem; /* memory data pointer */
34 extern data Byte gl_mem_tick; /* memory tick counter */
35 extern bdata bit gl_mem_failure; /* memory hardware failure */
36
37 static Byte mmc_state;
38 static bit mmc_mem_busy; /* memory in busy state */
39 idata Uint32 mmc_mem_size; /* memory disk size in pages */
40
41
42 /*_____ D E C L A R A T I O N ______________________________________________*/
43
44
45 /*F**************************************************************************
46 * NAME: mmc_init
47 *----------------------------------------------------------------------------
48 * PARAMS:
49 *
50 * return:
51 *----------------------------------------------------------------------------
52 * PURPOSE:
53 * MMC initialisation
54 *----------------------------------------------------------------------------
C51 COMPILER V6.20c MMC 07/10/2002 15:17:49 PAGE 2
55 * EXAMPLE:
56 *----------------------------------------------------------------------------
57 * NOTE:
58 *----------------------------------------------------------------------------
59 * REQUIREMENTS:
60 *****************************************************************************/
61 void mmc_init (void)
62 {
63 1 gl_mem_failure = FALSE;
64 1 mmc_state = MMC_FUNCT_START;
65 1 mmc_mem_busy = FALSE; /* memory ready */
66 1 }
67
68
69 /*F**************************************************************************
70 * NAME: mmc_init_csd
71 *----------------------------------------------------------------------------
72 * PARAMS:
73 *
74 * return:
75 * check status - OK: card supported by software
76 * - KO: card not supported by software
77 *----------------------------------------------------------------------------
78 * PURPOSE:
79 * Card validity checking, memory variable initialisation and
80 * controller data transfer mode initialisation
81 *----------------------------------------------------------------------------
82 * EXAMPLE:
83 *----------------------------------------------------------------------------
84 * NOTE:
85 * Card with block size != 512 are rejected
86 *----------------------------------------------------------------------------
87 * REQUIREMENTS:
88 *****************************************************************************/
89 bit mmc_init_csd (void)
90 {
91 1 Byte tmp;
92 1
93 1 ACC = Mmc_rd_cmd(); /* dummy read of header */
94 1 ACC = Mmc_rd_cmd(); /* dummy read of CSD[0] */
95 1 ACC = Mmc_rd_cmd(); /* dummy read */
96 1 ACC = Mmc_rd_cmd(); /* dummy read */
97 1 ACC = Mmc_rd_cmd(); /* dummy read */
98 1 ACC = Mmc_rd_cmd(); /* dummy read */
99 1
100 1 if ((Mmc_rd_cmd() & CSD_MSK_RBL) != CSD_BLEN_512) /* check block length */
101 1 { /* block size != 512 bytes not supported by firmware */
102 2 Mmc_reset_cmd_fifos(); /* reset pointers */
103 2 return KO;
104 2 }
105 1 else
106 1 {
107 2 Mmc_set_block_size(CSD_BLEN_512); /* init controller */
108 2 }
109 1 /* compute card size in number of block (block size = 512) */
110 1 /* read C_SIZE */
111 1 ((Byte*)&mmc_mem_size)[0] = 0;
112 1 ((Byte*)&mmc_mem_size)[1] = 0;
113 1 ((Byte*)&mmc_mem_size)[2] = Mmc_rd_cmd() & CSD_MSK_CSH;
114 1 ((Byte*)&mmc_mem_size)[3] = Mmc_rd_cmd();
115 1 mmc_mem_size = mmc_mem_size << 2;
116 1 ((Byte*)&mmc_mem_size)[3] |= ((Mmc_rd_cmd() & CSD_MSK_CSL) >> 6);
C51 COMPILER V6.20c MMC 07/10/2002 15:17:49 PAGE 3
117 1 /* read C_SIZE_MULT */
118 1 tmp = Mmc_rd_cmd() << 1;
119 1 tmp = (tmp | (Mmc_rd_cmd() >> 7)) & CSD_MSK_CSM;
120 1 mmc_mem_size = ((mmc_mem_size + 1) << (tmp + 2));
121 1 mmc_mem_size--;
122 1 Mmc_set_single_block(); /* single block mode transfer */
123 1 Mmc_enable_flow_ctrl(); /* start flow control */
124 1 Mmc_reset_cmd_fifos(); /* reset pointers */
125 1 return OK;
126 1 }
127
128
129 /*F**************************************************************************
130 * NAME: mmc_init_stack
131 *----------------------------------------------------------------------------
132 * PARAMS:
133 *
134 * return:
135 *----------------------------------------------------------------------------
136 * PURPOSE:
137 * Initialize MMC controller and reset all cards to idle state
138 *----------------------------------------------------------------------------
139 * EXAMPLE:
140 *----------------------------------------------------------------------------
141 * NOTE:
142 * This function is called when initializing stack for first time
143 *----------------------------------------------------------------------------
144 * REQUIREMENTS:
145 *****************************************************************************/
146 void mmc_init_stack (void)
147 {
148 1 gl_mem_failure = FALSE;
149 1 Mmc_set_read(); /* dir from card to uc */
150 1 Mmc_set_clock(MMC_CLK_INIT); /* set MMC clock to 400 KHz */
151 1 Mmc_enable();
152 1 Mmc_reset();
153 1 Mmc_reset_cmd_fifos();
154 1 Mmc_reset_data_fifos();
155 1 mmc_send_scmd(MMC_GO_IDLE_STATE, MMC_NO_RESP);
156 1 }
157
158
159 /*F**************************************************************************
160 * NAME: mmc_init_next
161 *----------------------------------------------------------------------------
162 * PARAMS:
163 *
164 * return:
165 *----------------------------------------------------------------------------
166 * PURPOSE:
167 * Initialize MMC controller
168 *----------------------------------------------------------------------------
169 * EXAMPLE:
170 *----------------------------------------------------------------------------
171 * NOTE:
172 * This function is called when stack has already been initialized
173 *----------------------------------------------------------------------------
174 * REQUIREMENTS:
175 *****************************************************************************/
176 void mmc_init_next (void)
177 {
178 1 gl_mem_failure = FALSE;
C51 COMPILER V6.20c MMC 07/10/2002 15:17:49 PAGE 4
179 1 Mmc_set_read(); /* dir from card to uc */
180 1 Mmc_set_clock(MMC_CLK_INIT); /* set MMC clock to 400 KHz */
181 1 Mmc_enable();
182 1 Mmc_reset();
183 1 Mmc_reset_cmd_fifos();
184 1 Mmc_reset_data_fifos();
185 1 }
186
187
188 /*F**************************************************************************
189 * NAME: mmc_single_acq
190 *----------------------------------------------------------------------------
191 * PARAMS:
192 *
193 * return:
194 * MMC_OK: state result OK
195 * MMC_ERROR: state result KO
196 * MMC_END: end of card acquisition
197 *----------------------------------------------------------------------------
198 * PURPOSE:
199 * Single card acquisition
200 *----------------------------------------------------------------------------
201 * EXAMPLE:
202 *----------------------------------------------------------------------------
203 * NOTE:
204 * - This function must be called 5 or 6 times for completion depending on
205 * the busy card
206 * - Each call must be delayed enough to leave time for command
207 * transmission and response reception
208 * - It does not take care of the DSR
209 * - At the end of this function CSD is in buffer
210 *
211 * STATES: MMC_SINGLE_OP_COND send operating condition
212 * MMC_SINGLE_CID check busy and send CID or op cond again
213 * MMC_SINGLE_SRA check CID response and set relative address
214 * MMC_SINGLE_CSD send CSD request
215 * MMC_SINGLE_END check CSD reception
216 *----------------------------------------------------------------------------
217 * REQUIREMENTS:
218 *****************************************************************************/
219 Byte mmc_single_acq (void)
220 {
221 1 Uint32 response;
222 1
223 1 switch (mmc_state)
224 1 {
225 2 case MMC_SINGLE_OP_COND:
226 2 {
227 3 mmc_send_cmd(MMC_SEND_OP_COND, MMC_OCR_INIT, MMC_RESP_R3);
228 3 mmc_state = MMC_SINGLE_CID;
229 3 return (MMC_OK);
230 3 }
231 2
232 2 case MMC_SINGLE_CID:
233 2 {
234 3 if (mmc_check_response() == MMC_ERR_RESP)
235 3 {
236 4 mmc_state = MMC_FUNCT_START;
237 4 return (MMC_ERROR); /* no response */
238 4 }
239 3 else
240 3 {
C51 COMPILER V6.20c MMC 07/10/2002 15:17:49 PAGE 5
241 4 response = mmc_read_response();
242 4 if ((((Byte*)&response)[0] & MMC_BUSY_OCR) != MMC_BUSY_OCR)
243 4 { /* at least one card is busy */
244 5 mmc_send_cmd(MMC_SEND_OP_COND, MMC_OCR_INIT, MMC_RESP_R3);
245 5 }
246 4 else
247 4 {
248 5 mmc_send_scmd(MMC_ALL_SEND_CID, MMC_RESP_R2);
249 5 mmc_state = MMC_SINGLE_SRA;
250 5 }
251 4 return (MMC_OK);
252 4 }
253 3 }
254 2
255 2 case MMC_SINGLE_SRA:
256 2 {
257 3 if (mmc_check_response() == MMC_ERR_RESP)
258 3 {
259 4 mmc_state = MMC_FUNCT_START;
260 4 return (MMC_ERROR); /* no response */
261 4 }
262 3 else
263 3 {
264 4 mmc_send_cmd(MMC_SET_RELATIVE_ADDRESS, MMC_RCA_1, MMC_RESP_R1);
265 4 mmc_state = MMC_SINGLE_CSD;
266 4 return (MMC_OK);
267 4 }
268 3 }
269 2
270 2 case MMC_SINGLE_CSD:
271 2 {
272 3 if (mmc_check_response() == MMC_ERR_RESP)
273 3 {
274 4 mmc_state = MMC_FUNCT_START;
275 4 return (MMC_ERROR); /* no response */
276 4 }
277 3 else
278 3 {
279 4 mmc_send_cmd(MMC_SEND_CSD, MMC_RCA_1, MMC_RESP_R2);
280 4 mmc_state = MMC_SINGLE_END;
281 4 return (MMC_OK);
282 4 }
283 3 }
284 2
285 2 case MMC_SINGLE_END:
286 2 {
287 3 if (mmc_check_response() == MMC_ERR_RESP)
288 3 {
289 4 mmc_state = MMC_FUNCT_START;
290 4 return (MMC_ERROR); /* no response */
291 4 }
292 3 else
293 3 {
294 4 Mmc_set_clock(MMC_CLK_TRANS); /* set MMC clock to transfer */
295 4 mmc_state = MMC_FUNCT_START;
296 4 Mmc_set_single_block(); /* single block transfer */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -