OpenCores
URL https://opencores.org/ocsvn/usb_fpga_1_2/usb_fpga_1_2/trunk

Subversion Repositories usb_fpga_1_2

[/] [usb_fpga_1_2/] [trunk/] [include/] [ztex-flash1.h] - Blame information for rev 4

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
/*!
2
   ZTEX Firmware Kit for EZ-USB Microcontrollers
3 4 ZTEX
   Copyright (C) 2009-2010 ZTEX e.K.
4 2 ZTEX
   http://www.ztex.de
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License version 3 as
8
   published by the Free Software Foundation.
9
 
10
   This program is distributed in the hope that it will be useful, but
11
   WITHOUT ANY WARRANTY; without even the implied warranty of
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
   General Public License for more details.
14
 
15
   You should have received a copy of the GNU General Public License
16
   along with this program; if not, see http://www.gnu.org/licenses/.
17
!*/
18
 
19
/*
20 3 ZTEX
    SPI mode of MMC / *SD Cards
21 2 ZTEX
*/
22
 
23 3 ZTEX
#ifeq[MMC_PORT][E]
24
#define[MMC_bmMODE]
25
#elifeq[MMC_PORT][A]
26
#elifeq[MMC_PORT][B]
27
#elifeq[MMC_PORT][C]
28
#elifneq[MMC_PORT][D]
29
#error[Macro `MMC_PORT' is not defined correctly. Valid values are: `A', `B', `C', `D' and `E'.]
30
#endif
31 2 ZTEX
 
32 3 ZTEX
#ifndef[ZTEX_FLASH1_H]
33
#define[ZTEX_FLASH1_H]
34
 
35
#define[@CAPABILITY_FLASH;]
36
 
37
#ifndef[MMC_PORT]
38
#error[MMC_PORT not defined]
39 2 ZTEX
#endif
40
 
41 3 ZTEX
#ifndef[MMC_BIT_CS]
42
#error[MMC_BIT_CS not defined]
43
#endif
44 2 ZTEX
 
45 3 ZTEX
#ifndef[MMC_BIT_DI]
46
#error[MMC_BIT_DI not defined]
47
#endif
48
 
49
#ifndef[MMC_BIT_DO]
50
#error[MMC_BIT_DO not defined]
51
#endif
52
 
53
#ifndef[MMC_BIT_CLK]
54
#error[MMC_BIT_CLK not defined]
55
#endif
56
 
57 4 ZTEX
#ifndef[MMC__PORT_DO]
58
#define[MMC__PORT_DO][MMC_PORT]
59
#endif
60
 
61
#ifdef[MMC_bmMODE]
62
#ifneq[MMC__PORT_DO][MMC_PORT]
63
#error[MMC__PORT_DO and MMC_PORT must be equal]
64
#endif
65
#endif
66
 
67 3 ZTEX
#define[MMC_bmCS][bmBITMMC_BIT_CS]
68
#define[MMC_bmDI][bmBITMMC_BIT_DI]
69
#define[MMC_bmDO][bmBITMMC_BIT_DO]
70
#define[MMC_bmCLK][bmBITMMC_BIT_CLK]
71
 
72
#define[MMC_IO][IOMMC_PORT]
73 4 ZTEX
#define[MMC__IO_DO][IOMMC__PORT_DO]
74 3 ZTEX
 
75
#ifndef[MMC_bmMODE]
76
#define[MMC_CS][IOMMC_PORTMMC_BIT_CS]
77
#define[MMC_CLK][IOMMC_PORTMMC_BIT_CLK]
78
#define[MMC_DI][IOMMC_PORTMMC_BIT_DI]
79 4 ZTEX
#define[MMC_DO][IOMMC__PORT_DOMMC_BIT_DO]
80 3 ZTEX
#endif
81
 
82
// may be redefined if the first sectors are reserved (e.g. for a FPGA bitstream)
83
#define[FLASH_FIRST_FREE_SECTOR][0]
84
 
85
xdata BYTE flash_enabled;       // 0    1: enabled, 0:disabled
86
xdata WORD flash_sector_size;   // 1    sector size
87
xdata DWORD flash_sectors;      // 3    number of sectors
88
xdata BYTE flash_ec;            // 7    error code
89
 
90
xdata BYTE mmc_last_cmd;        // 0
91
xdata BYTE mmc_response;        // 1
92 4 ZTEX
xdata BYTE mmc_version;         // 2
93
xdata BYTE mmc_buffer[16];      // 3
94 3 ZTEX
 
95
#define[FLASH_EC_CMD_ERROR][1]
96
#define[FLASH_EC_TIMEOUT][2]
97
#define[FLASH_EC_BUSY][3]
98
#define[FLASH_EC_PENDING][4]
99
#define[FLASH_EC_READ_ERROR][5]
100
#define[FLASH_EC_WRITE_ERROR][6]
101 4 ZTEX
#define[FLASH_EC_NOTSUPPORTED][7]
102 3 ZTEX
 
103 2 ZTEX
/* *********************************************************************
104 3 ZTEX
   ***** mmc_clocks ****************************************************
105 2 ZTEX
   ********************************************************************* */
106 3 ZTEX
// perform c (256 if c=0) clocks
107
void mmc_clocks (BYTE c) {
108
        c;                                      // this avoids stupid warnings
109
_asm
110
        mov     r2,dpl
111
#ifdef[MMC_bmMODE]
112
        mov     a,_MMC_IO
113
        anl     a, #(~MMC_bmCLK)
114
        mov     r3, a
115
        orl     a, #(MMC_bmCLK)
116
        mov     r4, a
117
010014$:
118
        mov     _MMC_IO,r4
119
        nop
120
        mov     _MMC_IO,r3
121
#else
122
010014$:
123
        setb    _MMC_CLK
124
        nop
125
        clr     _MMC_CLK
126
#endif
127
        djnz    r2,010014$
128
_endasm;
129 2 ZTEX
}
130
 
131 3 ZTEX
 
132 2 ZTEX
/* *********************************************************************
133 3 ZTEX
   ***** flash_read_byte ***********************************************
134
   ********************************************************************* */
135
// read a single byte from the flash
136
BYTE flash_read_byte() { // uses r2,r3,r4
137
_asm
138
#ifdef[MMC_bmMODE]
139
        // 8 - 1 + 8*13 + 1 + 6 = 118 clocks
140
        mov     a,_MMC_IO
141
        anl     a, #(~MMC_bmCLK)
142
        mov     r2, a
143
        orl     a, #(MMC_bmCLK)
144
        mov     r3, a
145
 
146
        mov     a,_MMC_IO       // 7
147
        anl     a,#(MMC_bmDO)
148
        mov     _MMC_IO, r3
149
        subb    a,#1
150
        rlc     a
151
        mov     r4,a
152
        mov     _MMC_IO, r2
153
 
154
        mov     a,_MMC_IO       // 6
155
        anl     a,#(MMC_bmDO)
156
        mov     _MMC_IO, r3
157
        subb    a,#1
158
        mov     a,r4
159
        rlc     a
160
        mov     r4,a
161
        mov     _MMC_IO, r2
162
 
163
        mov     a,_MMC_IO       // 5
164
        anl     a,#(MMC_bmDO)
165
        mov     _MMC_IO, r3
166
        subb    a,#1
167
        mov     a,r4
168
        rlc     a
169
        mov     r4,a
170
        mov     _MMC_IO, r2
171
 
172
        mov     a,_MMC_IO       // 4
173
        anl     a,#(MMC_bmDO)
174
        mov     _MMC_IO, r3
175
        subb    a,#1
176
        mov     a,r4
177
        rlc     a
178
        mov     r4,a
179
        mov     _MMC_IO, r2
180
 
181
        mov     a,_MMC_IO       // 3
182
        anl     a,#(MMC_bmDO)
183
        mov     _MMC_IO, r3
184
        subb    a,#1
185
        mov     a,r4
186
        rlc     a
187
        mov     r4,a
188
        mov     _MMC_IO, r2
189
 
190
        mov     a,_MMC_IO       // 2
191
        anl     a,#(MMC_bmDO)
192
        mov     _MMC_IO, r3
193
        subb    a,#1
194
        mov     a,r4
195
        rlc     a
196
        mov     r4,a
197
        mov     _MMC_IO, r2
198
 
199
        mov     a,_MMC_IO       // 1
200
        anl     a,#(MMC_bmDO)
201
        mov     _MMC_IO, r3
202
        subb    a,#1
203
        mov     a,r4
204
        rlc     a
205
        mov     r4,a
206
        mov     _MMC_IO, r2
207
 
208
        mov     a,_MMC_IO       // 0
209
        anl     a,#(MMC_bmDO)
210
        mov     _MMC_IO, r3
211
        subb    a,#1
212
        mov     a,r4
213
        rlc     a
214
        xrl     a,#255
215
        mov     _MMC_IO, r2
216
 
217
#else
218
        // 8*7 + 6 = 62 clocks 
219
        mov     c,_MMC_DO       // 7
220
        setb    _MMC_CLK
221
        rlc     a
222
        clr     _MMC_CLK
223
 
224
        mov     c,_MMC_DO       // 6
225
        setb    _MMC_CLK
226
        rlc     a
227
        clr     _MMC_CLK
228
 
229
        mov     c,_MMC_DO       // 5
230
        setb    _MMC_CLK
231
        rlc     a
232
        clr     _MMC_CLK
233
 
234
        mov     c,_MMC_DO       // 4
235
        setb    _MMC_CLK
236
        rlc     a
237
        clr     _MMC_CLK
238
 
239
        mov     c,_MMC_DO       // 3
240
        setb    _MMC_CLK
241
        rlc     a
242
        clr     _MMC_CLK
243
 
244
        mov     c,_MMC_DO       // 2
245
        setb    _MMC_CLK
246
        rlc     a
247
        clr     _MMC_CLK
248
 
249
        mov     c,_MMC_DO       // 1
250
        setb    _MMC_CLK
251
        rlc     a
252
        clr     _MMC_CLK
253
 
254
        mov     c,_MMC_DO       // 0
255
        setb    _MMC_CLK
256
        rlc     a
257
        clr     _MMC_CLK
258
#endif
259
        mov     dpl,a
260
        ret
261
_endasm;
262
        return 0;                // never ever called (just to avoid warnings)
263
}
264
 
265
/* *********************************************************************
266
   ***** flash_read ****************************************************
267
   ********************************************************************* */
268
// read len (256 if len=0) bytes from the flash to the buffer
269
void flash_read(__xdata BYTE *buf, BYTE len) {
270
        *buf;                                   // this avoids stupid warnings
271
        len;                                    // this too
272
_asm                                            // *buf is in dptr, len is in _flash_read_PARM_2
273
        mov     r2,_flash_read_PARM_2
274
#ifdef[MMC_bmMODE]
275
        mov     a,_MMC_IO
276
        anl     a, #(~MMC_bmCLK)
277
        mov     r5, a
278
        orl     a, #(MMC_bmCLK)
279
        mov     r3, a
280
 
281
010012$:
282
        // 8 + len*(-1 + 8*13 - 1 + 2 + 9) + 4 = 12 + len*113 clocks
283
        mov     a,_MMC_IO       // 7
284
        anl     a,#(MMC_bmDO)
285
        mov     _MMC_IO, r3
286
        subb    a,#1
287
        rlc     a
288
        mov     r4,a
289
        mov     _MMC_IO, r5
290
 
291
        mov     a,_MMC_IO       // 6
292
        anl     a,#(MMC_bmDO)
293
        mov     _MMC_IO, r3
294
        subb    a,#1
295
        mov     a,r4
296
        rlc     a
297
        mov     r4,a
298
        mov     _MMC_IO, r5
299
 
300
        mov     a,_MMC_IO       // 5
301
        anl     a,#(MMC_bmDO)
302
        mov     _MMC_IO, r3
303
        subb    a,#1
304
        mov     a,r4
305
        rlc     a
306
        mov     r4,a
307
        mov     _MMC_IO, r5
308
 
309
        mov     a,_MMC_IO       // 4
310
        anl     a,#(MMC_bmDO)
311
        mov     _MMC_IO, r3
312
        subb    a,#1
313
        mov     a,r4
314
        rlc     a
315
        mov     r4,a
316
        mov     _MMC_IO, r5
317
 
318
        mov     a,_MMC_IO       // 3
319
        anl     a,#(MMC_bmDO)
320
        mov     _MMC_IO, r3
321
        subb    a,#1
322
        mov     a,r4
323
        rlc     a
324
        mov     r4,a
325
        mov     _MMC_IO, r5
326
 
327
        mov     a,_MMC_IO       // 2
328
        anl     a,#(MMC_bmDO)
329
        mov     _MMC_IO, r3
330
        subb    a,#1
331
        mov     a,r4
332
        rlc     a
333
        mov     r4,a
334
        mov     _MMC_IO, r5
335
 
336
        mov     a,_MMC_IO       // 1
337
        anl     a,#(MMC_bmDO)
338
        mov     _MMC_IO, r3
339
        subb    a,#1
340
        mov     a,r4
341
        rlc     a
342
        mov     r4,a
343
        mov     _MMC_IO, r5
344
 
345
        mov     a,_MMC_IO       // 0
346
        anl     a,#(MMC_bmDO)
347
        mov     _MMC_IO, r3
348
        subb    a,#1
349
        mov     a,r4
350
        rlc     a
351
        xrl     a,#255
352
        mov     _MMC_IO, r5
353
#else
354
010012$:
355
        // 2 + len*(8*7 + 9) + 4 = 6 + len*65 clocks
356
        mov     c,_MMC_DO       // 7
357
        setb    _MMC_CLK
358
        rlc     a
359
        clr     _MMC_CLK
360
 
361
        mov     c,_MMC_DO       // 6
362
        setb    _MMC_CLK
363
        rlc     a
364
        clr     _MMC_CLK
365
 
366
        mov     c,_MMC_DO       // 5
367
        setb    _MMC_CLK
368
        rlc     a
369
        clr     _MMC_CLK
370
 
371
        mov     c,_MMC_DO       // 4
372
        setb    _MMC_CLK
373
        rlc     a
374
        clr     _MMC_CLK
375
 
376
        mov     c,_MMC_DO       // 3
377
        setb    _MMC_CLK
378
        rlc     a
379
        clr     _MMC_CLK
380
 
381
        mov     c,_MMC_DO       // 2
382
        setb    _MMC_CLK
383
        rlc     a
384
        clr     _MMC_CLK
385
 
386
        mov     c,_MMC_DO       // 1
387
        setb    _MMC_CLK
388
        rlc     a
389
        clr     _MMC_CLK
390
 
391
        mov     c,_MMC_DO       // 0
392
        setb    _MMC_CLK
393
        rlc     a
394
        clr     _MMC_CLK
395
#endif
396
        movx    @dptr,a
397
        inc     dptr
398
        djnz    r2,010012$
399
_endasm;
400
}
401
 
402
/* *********************************************************************
403
   ***** flash_write_byte **********************************************
404
   ********************************************************************* */
405
// send one bytes from buffer buf to the card
406
void flash_write_byte (BYTE b) {        // b is in dpl
407
        b;                              // this avoids stupid warnings
408
_asm
409
#ifdef[MMC_bmMODE]
410
        // up to 7 + 8*12 + 6 = 109 clocks
411
        mov     a,_MMC_IO
412
        anl     a, #(255 - MMC_bmCLK - MMC_bmDI )
413
        mov     r3, a
414
        mov     a,dpl
415
 
416
        rlc     a               // 7
417
        mov     _MMC_IO,r3
418
        jnc     0100157$
419
        orl     _MMC_IO, #(MMC_bmDI)
420
0100157$:
421
        orl     _MMC_IO, #(MMC_bmCLK)
422
 
423
        rlc     a               // 6
424
        mov     _MMC_IO,r3
425
        jnc     0100156$
426
        orl     _MMC_IO, #(MMC_bmDI)
427
0100156$:
428
        orl     _MMC_IO, #(MMC_bmCLK)
429
 
430
        rlc     a               // 5
431
        mov     _MMC_IO,r3
432
        jnc     0100155$
433
        orl     _MMC_IO, #(MMC_bmDI)
434
0100155$:
435
        orl     _MMC_IO, #(MMC_bmCLK)
436
 
437
        rlc     a               // 4
438
        mov     _MMC_IO,r3
439
        jnc     0100154$
440
        orl     _MMC_IO, #(MMC_bmDI)
441
0100154$:
442
        orl     _MMC_IO, #(MMC_bmCLK)
443
 
444
        rlc     a               // 3
445
        mov     _MMC_IO,r3
446
        jnc     0100153$
447
        orl     _MMC_IO, #(MMC_bmDI)
448
0100153$:
449
        orl     _MMC_IO, #(MMC_bmCLK)
450
 
451
        rlc     a               // 2
452
        mov     _MMC_IO,r3
453
        jnc     0100152$
454
        orl     _MMC_IO, #(MMC_bmDI)
455
0100152$:
456
        orl     _MMC_IO, #(MMC_bmCLK)
457
 
458
        rlc     a               // 1
459
        mov     _MMC_IO,r3
460
        jnc     0100151$
461
        orl     _MMC_IO, #(MMC_bmDI)
462
0100151$:
463
        orl     _MMC_IO, #(MMC_bmCLK)
464
 
465
        rlc     a               // 0
466
        mov     _MMC_IO,r3
467
        jnc     0100150$
468
        orl     _MMC_IO, #(MMC_bmDI)
469
0100150$:
470
        orl     _MMC_IO, #(MMC_bmCLK)
471
 
472
        mov     _MMC_IO,r3
473
#else
474
        // 3 + 8*7 + 4 = 63 clocks 
475
        mov     a,dpl
476
        rlc     a               // 7
477
 
478
        mov     _MMC_DI,c
479
        setb    _MMC_CLK
480
        rlc     a               // 6
481
        clr     _MMC_CLK
482
 
483
        mov     _MMC_DI,c
484
        setb    _MMC_CLK
485
        rlc     a               // 5
486
        clr     _MMC_CLK
487
 
488
        mov     _MMC_DI,c
489
        setb    _MMC_CLK
490
        rlc     a               // 4
491
        clr     _MMC_CLK
492
 
493
        mov     _MMC_DI,c
494
        setb    _MMC_CLK
495
        rlc     a               // 3
496
        clr     _MMC_CLK
497
 
498
        mov     _MMC_DI,c
499
        setb    _MMC_CLK
500
        rlc     a               // 2
501
        clr     _MMC_CLK
502
 
503
        mov     _MMC_DI,c
504
        setb    _MMC_CLK
505
        rlc     a               // 1
506
        clr     _MMC_CLK
507
 
508
        mov     _MMC_DI,c
509
        setb    _MMC_CLK
510
        rlc     a               // 0
511
        clr     _MMC_CLK
512
 
513
        mov     _MMC_DI,c
514
        setb    _MMC_CLK
515
        nop
516
        clr     _MMC_CLK
517
#endif  
518
_endasm;
519
}
520
 
521
/* *********************************************************************
522 2 ZTEX
   ***** flash_write ***************************************************
523
   ********************************************************************* */
524 3 ZTEX
// write len (256 id len=0) bytes from the buffer to the flash
525
void flash_write(__xdata BYTE *buf, BYTE len) {
526
        *buf;                                   // this avoids stupid warnings
527
        len;                                    // this too
528
_asm                                            // *buf is in dptr, len is in _flash_read_PARM_2
529
        mov     r2,_flash_read_PARM_2
530
#ifdef[MMC_bmMODE]
531
        // 7 + len*(2 + 8*12 + 7 ) + 6 = 13 + len*105 clocks
532
        mov     a,_MMC_IO
533
        anl     a, #(255 - MMC_bmCLK - MMC_bmDI )
534
        mov     r3, a
535
010013$:
536
        movx    a,@dptr
537
 
538
        rlc     a               // 7
539
        mov     _MMC_IO,r3
540
        jnc     0100167$
541
        orl     _MMC_IO, #(MMC_bmDI)
542
0100167$:
543
        orl     _MMC_IO, #(MMC_bmCLK)
544
 
545
        rlc     a               // 6
546
        mov     _MMC_IO,r3
547
        jnc     0100166$
548
        orl     _MMC_IO, #(MMC_bmDI)
549
0100166$:
550
        orl     _MMC_IO, #(MMC_bmCLK)
551
 
552
        rlc     a               // 5
553
        mov     _MMC_IO,r3
554
        jnc     0100165$
555
        orl     _MMC_IO, #(MMC_bmDI)
556
0100165$:
557
        orl     _MMC_IO, #(MMC_bmCLK)
558
 
559
        rlc     a               // 4
560
        mov     _MMC_IO,r3
561
        jnc     0100164$
562
        orl     _MMC_IO, #(MMC_bmDI)
563
0100164$:
564
        orl     _MMC_IO, #(MMC_bmCLK)
565
 
566
        rlc     a               // 3
567
        mov     _MMC_IO,r3
568
        jnc     0100163$
569
        orl     _MMC_IO, #(MMC_bmDI)
570
0100163$:
571
        orl     _MMC_IO, #(MMC_bmCLK)
572
 
573
        rlc     a               // 2
574
        mov     _MMC_IO,r3
575
        jnc     0100162$
576
        orl     _MMC_IO, #(MMC_bmDI)
577
0100162$:
578
        orl     _MMC_IO, #(MMC_bmCLK)
579
 
580
        rlc     a               // 1
581
        mov     _MMC_IO,r3
582
        jnc     0100161$
583
        orl     _MMC_IO, #(MMC_bmDI)
584
0100161$:
585
        orl     _MMC_IO, #(MMC_bmCLK)
586
 
587
        rlc     a               // 0
588
        mov     _MMC_IO,r3
589
        jnc     0100160$
590
        orl     _MMC_IO, #(MMC_bmDI)
591
0100160$:
592
        orl     _MMC_IO, #(MMC_bmCLK)
593
 
594
        inc     dptr
595
        djnz    r2,010013$
596
 
597
        mov     _MMC_IO,r3
598
#else
599
010013$:
600
        // 2 + len*(3 + 8*7 - 1 + 7 ) + 4 = 6 + len*65 clocks
601
        movx    a,@dptr
602
        rlc     a               // 7
603
 
604
        mov     _MMC_DI,c
605
        setb    _MMC_CLK
606
        rlc     a               // 6
607
        clr     _MMC_CLK
608
 
609
        mov     _MMC_DI,c
610
        setb    _MMC_CLK
611
        rlc     a               // 5
612
        clr     _MMC_CLK
613
 
614
        mov     _MMC_DI,c
615
        setb    _MMC_CLK
616
        rlc     a               // 4
617
        clr     _MMC_CLK
618
 
619
        mov     _MMC_DI,c
620
        setb    _MMC_CLK
621
        rlc     a               // 3
622
        clr     _MMC_CLK
623
 
624
        mov     _MMC_DI,c
625
        setb    _MMC_CLK
626
        rlc     a               // 2
627
        clr     _MMC_CLK
628
 
629
        mov     _MMC_DI,c
630
        setb    _MMC_CLK
631
        rlc     a               // 1
632
        clr     _MMC_CLK
633
 
634
        mov     _MMC_DI,c
635
        setb    _MMC_CLK
636
        rlc     a               // 0
637
        clr     _MMC_CLK
638
 
639
        mov     _MMC_DI,c
640
        setb    _MMC_CLK
641
        inc     dptr
642
        clr     _MMC_CLK
643
 
644
        djnz    r2,010013$
645
#endif
646
_endasm;
647
}
648
 
649
/* *********************************************************************
650
   ***** mmc_wait_busy *************************************************
651
   ********************************************************************* */
652
BYTE mmc_wait_busy () {
653
    WORD i;
654
    flash_ec = FLASH_EC_BUSY;
655
    MMC_IO |= MMC_bmDI;                         // avoids that in-data is interpreted as command
656
    for (i=0; (flash_read_byte()!=255) && i<65535; i++ ) ;
657 4 ZTEX
    if ( MMC__IO_DO & MMC_bmDO ) {
658 3 ZTEX
        flash_ec = 0;
659
        return 0;
660
    }
661
    return 1;
662
}
663
 
664
/* *********************************************************************
665
   ***** mmc_select ****************************************************
666
   ********************************************************************* */
667
/*
668
   select the card (CS) and waits if busy
669
   returns 1 if busy
670 2 ZTEX
*/
671 3 ZTEX
BYTE mmc_select() {
672
    MMC_IO |= MMC_bmCS;                         // CS = 1
673
    mmc_clocks(8);                              // 8 dummy clocks to finish a previous command
674
    MMC_IO &= ~MMC_bmCS;                        // CS = 0
675
 
676
    return mmc_wait_busy();
677 2 ZTEX
}
678
 
679
/* *********************************************************************
680 3 ZTEX
   ***** mmc_deselect **************************************************
681 2 ZTEX
   ********************************************************************* */
682 3 ZTEX
// de-select the card (CS) and waits if busy
683
void mmc_deselect() {
684
    MMC_IO |= MMC_bmDI;                         // CS = 1
685
    mmc_clocks(8);                              // 8 dummy clocks to finish a previous command
686
    MMC_IO |= MMC_bmCS;                         // CS = 1
687
    mmc_clocks(8);                              // 8 more dummy clocks
688
}
689
 
690
/* *********************************************************************
691
   ***** mmc_read_response *********************************************
692
   ********************************************************************* */
693
// read the first response byte
694
BYTE mmc_read_response() {
695
        MMC_IO |= MMC_bmDI;                     // avoids that in-data is interpreted as command
696
_asm
697
        mov     r2,#0x255
698
010010$:
699
        lcall   _flash_read_byte
700
        mov     a,dpl
701
        jnb     acc.7,010011$
702
        djnz    r2, 010010$
703 2 ZTEX
 
704 3 ZTEX
010011$:
705
        mov     dptr,#_mmc_response
706
        movx    @dptr,a
707
        mov     dpl,a
708
        ret
709
_endasm;
710
        return 0;                                // never ever called, just to avoid stupid warnings
711
}
712
 
713
/* *********************************************************************
714
   ***** mmc_wait_start ************************************************
715
   ********************************************************************* */
716
/*
717
   wait for the start byte
718
   returns 1 on error
719
*/
720
BYTE mmc_wait_start() {
721
    WORD to;
722
    to=0;
723
    MMC_IO |= MMC_bmDI;                         // avoids that in-data is interpreted as command
724
    while ( flash_read_byte() != 0xfe ) {       // wait for the start byte
725
        if ( ++to == 0 )                         // 65536 * 8 clocks
726
            return 1;
727 2 ZTEX
    }
728 3 ZTEX
    return 0;
729
}
730
 
731
/* *********************************************************************
732
   ***** flash_read_init ***********************************************
733
   ********************************************************************* */
734
/*
735
   Start the initialization sequence for reading sector s-
736
   The whole sector must be read.
737
   returns an error code (FLASH_EC_*). 0 means no error.
738
*/
739
BYTE flash_read_init(DWORD s) {
740
    if ( (MMC_IO & MMC_bmCS) == 0 ) {
741
        return FLASH_EC_PENDING;                // we interrupted a pending Flash operation
742
    }
743
    if ( mmc_select() ) {                       // select the card
744
        mmc_deselect();
745
        return FLASH_EC_BUSY;
746
    }
747 4 ZTEX
    mmc_clocks(8);                              // 8 dummy clocks
748 3 ZTEX
    mmc_last_cmd = 17;
749
    mmc_buffer[0] = 17 | 64;
750 4 ZTEX
    if ( mmc_version == 0 ) {
751
        s = s << 1;
752
        mmc_buffer[1] = s >> 16;
753
        mmc_buffer[2] = s >> 8;
754
        mmc_buffer[3] = s;
755
        mmc_buffer[4] = 0;
756
    }
757
    else {
758
        mmc_buffer[1] = s >> 24;
759
        mmc_buffer[2] = s >> 16;
760
        mmc_buffer[3] = s >> 8;
761
        mmc_buffer[4] = s;
762
    }
763 3 ZTEX
    mmc_buffer[5] = 1;
764
    flash_write(mmc_buffer,6);
765
    mmc_read_response();
766
    if ( mmc_response != 0 ) {
767
        mmc_deselect();
768
        return FLASH_EC_CMD_ERROR;
769
    }
770
 
771
    if ( mmc_wait_start() ) {                   // wait for the start byte
772
        mmc_deselect();
773
        return FLASH_EC_TIMEOUT;
774
    }
775
    return 0;
776
}
777
 
778
/* *********************************************************************
779
   ***** flash_read_finish *********************************************
780
   ********************************************************************* */
781
/*
782
   Reads n dummy bytes (the whole sector has to be read out)
783
   and runs the finalization sequence for a sector read.
784
*/
785
void flash_read_finish(WORD n) {
786
    while ( n > 32 ) {
787
        mmc_clocks(0);                           // 256 clocks = 32 dummy bytes
788
        n-=32;
789
    }
790
    mmc_clocks(n << 3);
791
    mmc_clocks(24);                             // 16 CRC + 8 dummy clocks
792
    mmc_deselect();
793
}
794
 
795
 
796
/* *********************************************************************
797
   ***** flash_write_init **********************************************
798
   ********************************************************************* */
799
/*
800
   Start the initialization sequence for writing sector s
801
   The whole sectir must be written.
802
   returns an error code (FLASH_EC_*). 0 means no error.
803
*/
804
BYTE flash_write_init(DWORD s) {
805
    if ( (MMC_IO & MMC_bmCS) == 0 ) {
806
        return FLASH_EC_PENDING;                // we interrupted a pending Flash operation
807
    }
808
    if ( mmc_select() ) {                       // select the card
809
        mmc_deselect();
810
        return FLASH_EC_BUSY;
811
    }
812 4 ZTEX
    mmc_clocks(8);                              // 8 dummy clocks
813 3 ZTEX
    mmc_last_cmd = 24;
814
    mmc_buffer[0] = 24 | 64;
815 4 ZTEX
    if ( mmc_version == 0 ) {
816
        s = s << 1;
817
        mmc_buffer[1] = s >> 16;
818
        mmc_buffer[2] = s >> 8;
819
        mmc_buffer[3] = s;
820
        mmc_buffer[4] = 0;
821
    }
822
    else {
823
        mmc_buffer[1] = s >> 24;
824
        mmc_buffer[2] = s >> 16;
825
        mmc_buffer[3] = s >> 8;
826
        mmc_buffer[4] = s;
827
    }
828 3 ZTEX
    mmc_buffer[5] = 1;
829
    flash_write(mmc_buffer,6);
830
    mmc_read_response();
831
    if ( mmc_response != 0 ) {
832
        mmc_deselect();
833
        return FLASH_EC_CMD_ERROR;
834
    }
835
 
836
    MMC_IO |= MMC_bmDI;                                 // send one dummy byte plus the start byte 0xfe
837
    mmc_clocks(15);
838
    MMC_IO &= ~MMC_bmDI;
839
    MMC_IO |= MMC_bmCLK;
840
    MMC_IO &= ~MMC_bmCLK;
841
    return 0;
842
}
843
 
844
/* *********************************************************************
845
   ***** flash_write_finish ********************************************
846
   ********************************************************************* */
847
/*
848
   Writes n dummy bytes (the whole sector has to be written)
849
   and runs the finalization sequence for a sector write
850
   returns an error code (FLASH_EC_*). 0 means no error.
851
*/
852
BYTE flash_write_finish(WORD n) {
853
    BYTE b;
854
    MMC_IO &= ~MMC_bmDI;                        // value of the dummy data is 0
855
    while ( n > 32 ) {
856
        mmc_clocks(0);                           // 256 clocks = 32 dummy bytes
857
        n-=32;
858
    }
859
    mmc_clocks(n << 3);
860
 
861
    MMC_IO |= MMC_bmDI;
862
    mmc_clocks(16);                             // 16 CRC clocks
863
    b = flash_read_byte() & 7;
864
//    mmc_wait_busy();                          // not required here, programming continues if card is deslected
865
    mmc_deselect();
866
    if ( b != 5 ) {                             // data response, last three bits must be 5
867
        return FLASH_EC_WRITE_ERROR;
868
    }
869
    return 0;
870
}
871
 
872
/* *********************************************************************
873
   ***** mmc_send_cmd **************************************************
874
   ********************************************************************* */
875
// send a command   
876 4 ZTEX
#define[mmc_send_cmd(][,$1.$2.$3.$4,$5);][{                     // send a command, argument=0
877
    mmc_clocks(8);                              // 8 dummy clocks
878 3 ZTEX
    mmc_last_cmd = $0;
879
    mmc_buffer[0] = 64 | ($0 & 127);
880 4 ZTEX
    mmc_buffer[1] = $1;
881
    mmc_buffer[2] = $2;
882
    mmc_buffer[3] = $3;
883
    mmc_buffer[4] = $4;
884
    mmc_buffer[5] = $5 | 1;
885 3 ZTEX
    flash_write(mmc_buffer,6);
886
    mmc_read_response();
887
}]
888
 
889
/* *********************************************************************
890
   ***** flash_init ****************************************************
891
   ********************************************************************* */
892
// init the card
893
void flash_init() {
894 4 ZTEX
    BYTE i, j, k;
895 3 ZTEX
 
896
    flash_enabled = 1;
897
    flash_sector_size = 512;
898 4 ZTEX
    mmc_version = 0;
899 2 ZTEX
 
900 4 ZTEX
    OEMMC_PORT = OEMMC_PORT | ( MMC_bmCS | MMC_bmDI | MMC_bmCLK );
901
    OEMMC__PORT_DO = OEMMC__PORT_DO & ~MMC_bmDO;
902
 
903 3 ZTEX
    MMC_IO |= MMC_bmDI;
904
    MMC_IO |= MMC_bmCS;
905
    mmc_clocks(0);                               // 256 clocks
906
 
907
    mmc_select();                               // select te card
908
    flash_ec = FLASH_EC_BUSY;
909
 
910 4 ZTEX
    mmc_send_cmd(0, 0.0.0.0, 0x95);                      // send reset command
911 3 ZTEX
    if ( mmc_response & ~1 ) {                  // check for errors
912
        goto mmc_init_cmd_err;
913 2 ZTEX
    }
914 4 ZTEX
 
915
    // send cmd8, valid ? 2.0 mode : 1.xx mode
916
    mmc_send_cmd(8, 0.0.1.0xaa, 0x87);
917
    if ( ( mmc_response & bmBIT2) == 0 ) {
918
        if ( (mmc_response & 0xfe) != 0 )
919
            goto mmc_init_cmd_err;
920
        flash_read(mmc_buffer,4);
921
        if ( ( (mmc_buffer[2] & 15) != 1) || (mmc_buffer[3] != 0xaa ) ) {
922
            flash_ec = FLASH_EC_NOTSUPPORTED;
923
            goto mmc_init_err;
924
        }
925
        mmc_version=1;
926
    }
927
 
928
    // CMD1 is not recommended, therefore we try ACMD41 first
929
    k=mmc_version ? 64 : 0;
930
    mmc_send_cmd(55, 0.0.0.0, 0);
931
    if ( (mmc_response & 0xfe) == 0 )
932
        mmc_send_cmd(41, k.0.0.0, 0);
933
    j = mmc_response & 0xfe;
934
 
935 3 ZTEX
    for ( i=0; mmc_response != 0 && i<255; i++ ) {        // send the init command and wait wait (up to 1s) until ready
936
        wait(4);
937 4 ZTEX
        if ( j ) {
938
            mmc_send_cmd(1, k.0.0.0, 0xff);
939
        }
940
        else {
941
            mmc_send_cmd(55, 0.0.0.0, 0);
942
            mmc_send_cmd(41, k.0.0.0, 0);
943
        }
944 3 ZTEX
    }
945
    if ( mmc_response != 0 ) {                   // check for errors
946
        goto mmc_init_cmd_err;
947 4 ZTEX
    }
948
 
949
    if ( mmc_version ) {
950
        mmc_send_cmd(58, 0.0.0.0, 0);            // check the high capacity mode
951
        if ( mmc_response != 0 )                 // check for errors
952
            goto mmc_init_cmd_err;
953
        flash_read(mmc_buffer,4);
954
        if ( (mmc_buffer[0] & 64) == 0 )  // card in standard capacity mode
955
            mmc_version = 0;
956 3 ZTEX
    }
957
 
958 4 ZTEX
    mmc_send_cmd(9, 0.0.0.0, 0);         // read the CSD
959 3 ZTEX
    if ( mmc_wait_start() ) {
960
        flash_ec = FLASH_EC_TIMEOUT;
961
        goto mmc_init_err;
962
    }
963
    flash_read(mmc_buffer,16);
964 4 ZTEX
    mmc_clocks(16);                             // CRC is clocked out
965 3 ZTEX
 
966 4 ZTEX
    mmc_buffer[0] &= 192;
967
    if ( (mmc_buffer[0] & 192) == 0  ) {
968
        i = (mmc_buffer[5] & 15) + ((mmc_buffer[10] >> 7) | ((mmc_buffer[9] & 3) << 1)) - 7;
969
        flash_sectors = ((mmc_buffer[8] >> 6) | (mmc_buffer[7] << 2) | ((mmc_buffer[6] & 3) << 10)) + 1;
970
        flash_sectors = flash_sectors << i;
971
    }
972
    else if ( (mmc_buffer[0] & 192) == 64  ) { // todo
973
        flash_sectors = ( ( ((DWORD)(mmc_buffer[7] & 63) << 16) | (mmc_buffer[8] << 8) | mmc_buffer[9]  ) +1 ) << 10;
974
    }
975
    else {
976
        flash_ec = FLASH_EC_NOTSUPPORTED;
977
        goto mmc_init_err;
978
    }
979 3 ZTEX
 
980
    flash_ec = 0;
981
    mmc_deselect();
982
 
983
    return;
984
 
985
mmc_init_cmd_err:
986
    flash_ec = FLASH_EC_CMD_ERROR;
987
mmc_init_err:
988
    flash_enabled = 0;
989
    mmc_deselect();
990 2 ZTEX
}
991
 
992
 
993
/* *********************************************************************
994
   ***** EP0 vendor request 0x40 ***************************************
995
   ********************************************************************* */
996 3 ZTEX
// send mmc information structure (card size, error status,  ...) to the host
997 2 ZTEX
ADD_EP0_VENDOR_REQUEST((0x40,,
998 3 ZTEX
    MEM_COPY1(flash_enabled,EP0BUF,8);
999 2 ZTEX
    EP0BCH = 0;
1000 3 ZTEX
    EP0BCL = 8;
1001
,,
1002
));;
1003 2 ZTEX
 
1004 3 ZTEX
/* *********************************************************************
1005
   ***** EP0 vendor request 0x41 ***************************************
1006
   ********************************************************************* */
1007
void mmc_read_ep0 () {
1008
    flash_read(EP0BUF, ep0_payload_transfer);
1009
    if ( ep0_payload_remaining == 0 ) {
1010
        mmc_clocks(24);                         // 16 CRC + 8 dummy clocks
1011
        mmc_deselect();
1012
    }
1013
}
1014
 
1015
ADD_EP0_VENDOR_REQUEST((0x41,,                  // read (exactly) one sector
1016
    if ( (MMC_IO & MMC_bmCS) == 0 ) {
1017
        flash_ec = FLASH_EC_PENDING;            // we interrupted a pending Flash operation
1018
        EP0_STALL;
1019
    }
1020
    if ( mmc_select() ) {                       // select the card
1021
        mmc_deselect();
1022
        EP0_STALL;
1023
    }
1024 4 ZTEX
    mmc_clocks(8);                              // 8 dummy clocks
1025 3 ZTEX
    mmc_last_cmd = 17;
1026
    mmc_buffer[0] = 17 | 64;
1027 4 ZTEX
    if ( mmc_version == 0 ) {
1028 3 ZTEX
_asm
1029
    clr c
1030
    mov dptr,#(_SETUPDAT + 2)
1031
    movx a,@dptr
1032
    mov dptr,#(_mmc_buffer + 3)
1033
    rlc a
1034
    movx @dptr,a
1035
 
1036
    mov dptr,#(_SETUPDAT + 3)
1037
    movx a,@dptr
1038
    mov dptr,#(_mmc_buffer + 2)
1039
    rlc a
1040
    movx @dptr,a
1041
 
1042
    mov dptr,#(_SETUPDAT + 4)
1043
    movx a,@dptr
1044
    mov dptr,#(_mmc_buffer + 1)
1045
    rlc a
1046
    movx @dptr,a
1047
_endasm;
1048 4 ZTEX
        mmc_buffer[4] = 0;
1049
    }
1050
    else {
1051
        mmc_buffer[1] = SETUPDAT[5];
1052
        mmc_buffer[2] = SETUPDAT[4];
1053
        mmc_buffer[3] = SETUPDAT[3];
1054
        mmc_buffer[4] = SETUPDAT[2];
1055
    }
1056 3 ZTEX
    mmc_buffer[5] = 1;
1057
    flash_write(mmc_buffer,6);
1058
    mmc_read_response();
1059
    if ( mmc_response != 0 ) {
1060
        flash_ec = FLASH_EC_CMD_ERROR;
1061
        mmc_deselect();
1062
        EP0_STALL;
1063
    }
1064
 
1065
    if ( mmc_wait_start() ) {                   // wait for the start byte
1066
        flash_ec = FLASH_EC_TIMEOUT;
1067
        mmc_deselect();
1068
        EP0_STALL;
1069
    }
1070
 
1071
    mmc_read_ep0();
1072
    EP0BCH = 0;
1073
    EP0BCL = ep0_payload_transfer;
1074
,,
1075
    if ( ep0_payload_transfer != 0 ) {
1076
        mmc_read_ep0();
1077
    }
1078
    EP0BCH = 0;
1079
    EP0BCL = ep0_payload_transfer;
1080
));;
1081
 
1082
/* *********************************************************************
1083
   ***** EP0 vendor command 0x42 ***************************************
1084
   ********************************************************************* */
1085
void mmc_send_ep0 () {
1086
    flash_write(EP0BUF, ep0_payload_transfer);
1087
    if ( ep0_payload_remaining == 0 ) {
1088
        MMC_IO |= MMC_bmDI;
1089
        mmc_clocks(16);                         // 16 CRC clocks
1090
        if ( (flash_read_byte() & 7) != 5 ) {   // data response, last three bits must be 5
1091
            flash_ec = FLASH_EC_WRITE_ERROR;
1092
        }
1093
//      mmc_wait_busy();                        // not required here, programming continues if card is deselected
1094
        mmc_deselect();
1095
    }
1096
}
1097
 
1098
ADD_EP0_VENDOR_COMMAND((0x42,,                  // write (exactly!) one sector
1099
    if ( (MMC_IO & MMC_bmCS) == 0 ) {
1100
        flash_ec = FLASH_EC_PENDING;            // we interrupted a pending Flash operation
1101
        EP0_STALL;
1102
    }
1103
    if ( mmc_select() ) {                       // select the card
1104
        mmc_deselect();
1105
        EP0_STALL;
1106
    }
1107 4 ZTEX
    mmc_clocks(8);                              // 8 dummy clocks
1108 3 ZTEX
    mmc_last_cmd = 24;
1109
    mmc_buffer[0] = 24 | 64;
1110 4 ZTEX
    if ( mmc_version == 0 ) {
1111 3 ZTEX
_asm
1112
    clr c
1113
    mov dptr,#(_SETUPDAT + 2)
1114
    movx a,@dptr
1115
    mov dptr,#(_mmc_buffer + 3)
1116
    rlc a
1117
    movx @dptr,a
1118
 
1119
    mov dptr,#(_SETUPDAT + 3)
1120
    movx a,@dptr
1121
    mov dptr,#(_mmc_buffer + 2)
1122
    rlc a
1123
    movx @dptr,a
1124
 
1125
    mov dptr,#(_SETUPDAT + 4)
1126
    movx a,@dptr
1127
    mov dptr,#(_mmc_buffer + 1)
1128
    rlc a
1129
    movx @dptr,a
1130
_endasm;
1131 4 ZTEX
        mmc_buffer[4] = 0;
1132
    }
1133
    else {
1134
        mmc_buffer[1] = SETUPDAT[5];
1135
        mmc_buffer[2] = SETUPDAT[4];
1136
        mmc_buffer[3] = SETUPDAT[3];
1137
        mmc_buffer[4] = SETUPDAT[2];
1138
    }
1139
 
1140 3 ZTEX
    mmc_buffer[5] = 1;
1141
    flash_write(mmc_buffer,6);
1142
    mmc_read_response();
1143
    if ( mmc_response != 0 ) {
1144
        flash_ec = FLASH_EC_CMD_ERROR;
1145
        mmc_deselect();
1146
        EP0_STALL;
1147
    }
1148
 
1149
    MMC_IO |= MMC_bmDI;                                 // send one dummy byte plus the start byte 0xfe
1150
    mmc_clocks(15);
1151
    MMC_IO &= ~MMC_bmDI;
1152
    MMC_IO |= MMC_bmCLK;
1153
    MMC_IO &= ~MMC_bmCLK;
1154
,,
1155
    if ( ep0_payload_transfer != 0 ) {
1156
        flash_ec = 0;
1157
        mmc_send_ep0();
1158
        if ( flash_ec != 0 ) {
1159
            EP0_STALL;
1160
        }
1161
    }
1162
));;
1163
 
1164
/* *********************************************************************
1165
   ***** EP0 vendor request 0x43 ***************************************
1166
   ********************************************************************* */
1167
// send detailed MMC status plus debug information
1168
ADD_EP0_VENDOR_REQUEST((0x43,,                  // this may interrupt a pending operation
1169 4 ZTEX
    MEM_COPY1(flash_ec,EP0BUF+2,20);
1170
    EP0BUF[22] = (MMC__IO_DO & MMC_bmDO) == 0;
1171 3 ZTEX
    mmc_select();
1172 4 ZTEX
    mmc_send_cmd(13, 0.0.0.0, 0);
1173 3 ZTEX
    EP0BUF[0] = mmc_response;
1174
    EP0BUF[1] = flash_read_byte();
1175
    mmc_deselect();
1176
    EP0BCH = 0;
1177 4 ZTEX
    EP0BCL = 23;
1178 3 ZTEX
,,
1179
));;
1180
 
1181
#endif  /*ZTEX_FLASH1_H*/

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.