?? mmc.lst
字號:
1 .code 16 2 .file "mmc.c" 10 .Ltext0: 11 .global mmc_buffer 12 .bss 15 mmc_buffer: 16 0000 00000000 .space 512 16 00000000 16 00000000 16 00000000 16 00000000 17 .global s_pPDC 18 .data 19 .align 2 22 s_pPDC: 23 0000 0001FEFF .word -130816 24 .global s_pPMC 25 .align 2 28 s_pPMC: 29 0004 00FCFFFF .word -1024 30 .global s_pPio 31 .align 2 34 s_pPio: 35 0008 00F4FFFF .word -3072 36 .global s_pSpi 37 .align 2 40 s_pSpi: 41 000c 0000FEFF .word -131072 42 .text 43 .align 2 44 .global Delays 45 .code 16 46 .thumb_func 48 Delays: 49 .LFB2: 50 .file 1 "mmc.c" 1:mmc.c **** // mmc.c : MultiMediaCard functions: init, read, write ...
2:mmc.c **** //
3:mmc.c **** // Rolf Freitag 5/2003
4:mmc.c **** //
5:mmc.c ****
6:mmc.c ****
7:mmc.c ****
8:mmc.c **** // MMC Lib
9:mmc.c **** #ifndef _MMCLIB_C
10:mmc.c **** #define _MMCLIB_C
11:mmc.c **** //---------------------------------------------------------------------
12:mmc.c **** #include "include/include.h"
13:mmc.c ****
14:mmc.c ****
15:mmc.c **** #include "math.h"
16:mmc.c **** #include "string.h"
17:mmc.c ****
18:mmc.c ****
19:mmc.c **** AT91PS_SPI s_pSpi = AT91C_BASE_SPI0;
20:mmc.c **** AT91PS_PIO s_pPio = AT91C_BASE_PIOA;
21:mmc.c **** AT91PS_PMC s_pPMC = AT91C_BASE_PMC;
22:mmc.c **** AT91PS_PDC s_pPDC = AT91C_BASE_PDC_SPI0;
23:mmc.c ****
24:mmc.c ****
25:mmc.c **** char mmcGetResponse(void);
26:mmc.c **** char mmcGetXXResponse(const char resp);
27:mmc.c **** char mmcCheckBusy(void);
28:mmc.c ****
29:mmc.c **** void initSSP (void);
30:mmc.c ****
31:mmc.c **** char mmc_buffer[512] = { 0 }; // Buffer for mmc i/o for data and registers
32:mmc.c **** extern char card_state; // 0 for no card found, 1 for card found (init successfull)
33:mmc.c ****
34:mmc.c ****
35:mmc.c **** //---------------------------------------------------------------------
36:mmc.c **** void Delays (unsigned long a) { while (--a!=0); }
51 .loc 1 36 0 52 .LVL0: 53 @ lr needed for prologue 54 .loc 1 36 0 55 0000 0023 mov r3, #0 56 .L3: 57 0002 0133 add r3, r3, #1 58 0004 8342 cmp r3, r0 59 0006 FCD1 bne .L3 60 @ sp needed for prologue 61 0008 7047 bx lr 62 .LFE2: 64 000a 0000 .align 2 65 .global initSPI_port 66 .code 16 67 .thumb_func 69 initSPI_port: 70 .LFB3: 37:mmc.c ****
38:mmc.c ****
39:mmc.c **** void initSPI_port (void) {
71 .loc 1 39 0 72 .LVL1: 40:mmc.c ****
41:mmc.c **** //Card present -> CP - PA15
42:mmc.c **** s_pPio->PIO_ODR = BIT15; //Configure in Input
73 .loc 1 42 0 74 000c 054B ldr r3, .L10 75 000e 1A68 ldr r2, [r3] 76 0010 8023 mov r3, #128 77 0012 1B02 lsl r3, r3, #8 78 0014 5361 str r3, [r2, #20] 43:mmc.c **** s_pPio->PIO_PER = BIT15; //Enable PA15
79 .loc 1 43 0 80 0016 1360 str r3, [r2] 44:mmc.c ****
45:mmc.c **** //Write protect -> WP - PA16
46:mmc.c **** s_pPio->PIO_ODR = BIT16; //Configure in Input
81 .loc 1 46 0 82 0018 8023 mov r3, #128 83 001a 5B02 lsl r3, r3, #9 84 001c 5361 str r3, [r2, #20] 85 .loc 1 39 0 86 @ lr needed for prologue 47:mmc.c **** s_pPio->PIO_PER = BIT16; //Enable PA16
87 .loc 1 47 0 88 001e 1360 str r3, [r2] 48:mmc.c ****
49:mmc.c **** }
89 .loc 1 49 0 90 @ sp needed for prologue 91 0020 7047 bx lr 92 .L11: 93 0022 0000 .align 2 94 .L10: 95 0024 00000000 .word s_pPio 96 .LFE3: 98 .align 2 99 .global initSPI 100 .code 16 101 .thumb_func 103 initSPI: 104 .LFB4: 50:mmc.c ****
51:mmc.c **** // setup usart1 in spi mode
52:mmc.c **** void initSPI (void)
53:mmc.c **** {
105 .loc 1 53 0 106 .LVL2: 54:mmc.c ****
55:mmc.c **** // Init SPI0
56:mmc.c **** //set functionality to pins:
57:mmc.c **** //port0.12 -> NPCS0
58:mmc.c **** //port0.16 -> MISO
59:mmc.c **** //port0.17 -> MOSI
60:mmc.c **** //port0.18 -> SPCK
61:mmc.c **** s_pPio->PIO_PDR = BIT13 | BIT16 | BIT17 | BIT18;
107 .loc 1 61 0 108 0028 0E4B ldr r3, .L14 109 002a 1A68 ldr r2, [r3] 110 002c E423 mov r3, #228 111 002e DB02 lsl r3, r3, #11 112 0030 5360 str r3, [r2, #4] 62:mmc.c **** s_pPio->PIO_ASR = BIT13 | BIT16 | BIT17 | BIT18;
113 .loc 1 62 0 114 0032 1367 str r3, [r2, #112] 63:mmc.c **** s_pPio->PIO_BSR = 0;
115 .loc 1 63 0 116 0034 0023 mov r3, #0 117 0036 5367 str r3, [r2, #116] 64:mmc.c ****
65:mmc.c ****
66:mmc.c **** //enable the clock of SPI
67:mmc.c **** s_pPMC->PMC_PCER = 1 << AT91C_ID_SPI0;
118 .loc 1 67 0 119 0038 0B4B ldr r3, .L14+4 120 003a 1A68 ldr r2, [r3] 121 003c 1023 mov r3, #16 122 003e 1361 str r3, [r2, #16] 68:mmc.c **** //l_pPMC->PMC_PCER = 1 << 5;
69:mmc.c ****
70:mmc.c **** // Fixed mode
71:mmc.c **** s_pSpi->SPI_CR = 0x81; //SPI Enable, Sowtware reset
123 .loc 1 71 0 124 0040 0A4B ldr r3, .L14+8 125 0042 1A68 ldr r2, [r3] 126 0044 8123 mov r3, #129 127 0046 1360 str r3, [r2] 72:mmc.c **** s_pSpi->SPI_CR = 0x01; //SPI Enable
128 .loc 1 72 0 129 0048 0123 mov r3, #1 130 004a 1360 str r3, [r2] 73:mmc.c ****
74:mmc.c **** s_pSpi->SPI_MR = 0xD0019; //Master mode, fixed select, disable decoder, FDIV=1 (M 131 .loc 1 74 0 132 004c 084B ldr r3, .L14+12 133 004e 5360 str r3, [r2, #4] 75:mmc.c ****
76:mmc.c **** //s_pSpi->SPI_CSR[1] = 0x4A02; //8bit, CPOL=0, ClockPhase=1, SCLK = 200kHz
77:mmc.c **** s_pSpi->SPI_CSR[1] = 0x00001F02; //8bit, CPOL=0, ClockPhase=1, SCLK = 48Mhz/32*31 = 48 134 .loc 1 77 0 135 0050 084B ldr r3, .L14+16 136 0052 5363 str r3, [r2, #52] 78:mmc.c ****
79:mmc.c **** s_pPDC->PDC_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;
137 .loc 1 79 0 138 0054 084B ldr r3, .L14+20 139 0056 0949 ldr r1, .L14+24 140 0058 1B68 ldr r3, [r3] 80:mmc.c **** s_pSpi->SPI_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;
141 .loc 1 80 0 142 005a FC32 add r2, r2, #252 143 .loc 1 79 0 144 005c 1962 str r1, [r3, #32] 145 .loc 1 53 0 146 @ lr needed for prologue 147 .loc 1 80 0 148 005e 5162 str r1, [r2, #36] 81:mmc.c ****
82:mmc.c **** }
149 .loc 1 82 0 150 @ sp needed for prologue 151 0060 7047 bx lr 152 .L15: 153 0062 0000 .align 2 154 .L14: 155 0064 00000000 .word s_pPio 156 0068 00000000 .word s_pPMC 157 006c 00000000 .word s_pSpi 158 0070 19000D00 .word 851993 159 0074 021F0000 .word 7938 160 0078 00000000 .word s_pPDC 161 007c 01010000 .word 257 162 .LFE4: 164 .align 2 165 .global spiSendByte 166 .code 16 167 .thumb_func 169 spiSendByte: 170 .LFB13: 83:mmc.c ****
84:mmc.c ****
85:mmc.c **** // Initialisieren
86:mmc.c **** char initMMC (void)
87:mmc.c **** {
88:mmc.c ****
89:mmc.c **** //raise SS and MOSI for 80 clock cycles
90:mmc.c **** //SendByte(0xff) 10 times with SS high
91:mmc.c **** //RAISE SS
92:mmc.c **** int i;
93:mmc.c **** char response=0x01;
94:mmc.c ****
95:mmc.c ****
96:mmc.c **** // debug_printf("Start iniMMC......");
97:mmc.c **** initSPI();
98:mmc.c **** //initialization sequence on PowerUp
99:mmc.c **** ///CS_HIGH();
100:mmc.c **** for(i=0;i<=9;i++)
101:mmc.c **** spiSendByte(0xff);
102:mmc.c **** ///CS_LOW();
103:mmc.c **** //Send Command 0 to put MMC in SPI mode
104:mmc.c **** mmcSendCmd(0x00,0,0x95);
105:mmc.c **** //Now wait for READY RESPONSE
106:mmc.c **** if(mmcGetResponse()!=0x01);
107:mmc.c **** // debug_printf("no responce");
108:mmc.c ****
109:mmc.c **** while(response==0x01)
110:mmc.c **** {
111:mmc.c **** // debug_printf("Sending Command 1");
112:mmc.c **** //CS_HIGH();
113:mmc.c **** spiSendByte(0xff);
114:mmc.c **** //CS_LOW();
115:mmc.c **** mmcSendCmd(0x01,0x00,0xff);
116:mmc.c **** response=mmcGetResponse();
117:mmc.c **** }
118:mmc.c **** //CS_HIGH();
119:mmc.c **** spiSendByte(0xff);
120:mmc.c **** // debug_printf("MMC INITIALIZED AND SET TO SPI MODE PROPERLY.");
121:mmc.c **** return MMC_SUCCESS;
122:mmc.c **** }
123:mmc.c ****
124:mmc.c ****
125:mmc.c ****
126:mmc.c **** // Ti added mmc Get Responce
127:mmc.c **** char mmcGetResponse(void)
128:mmc.c **** {
129:mmc.c **** //Response comes 1-8bytes after command
130:mmc.c **** //the first bit will be a 0
131:mmc.c **** //followed by an error code
132:mmc.c **** //data will be 0xff until response
133:mmc.c **** int i=0;
134:mmc.c ****
135:mmc.c **** char response;
136:mmc.c ****
137:mmc.c **** while(i<=64)
138:mmc.c **** {
139:mmc.c **** response=spiSendByte(0xff);
140:mmc.c **** if(response==0x00)break;
141:mmc.c **** if(response==0x01)break;
142:mmc.c **** i++;
143:mmc.c **** }
144:mmc.c **** return response;
145:mmc.c **** }
146:mmc.c ****
147:mmc.c **** char mmcGetXXResponse(const char resp)
148:mmc.c **** {
149:mmc.c **** //Response comes 1-8bytes after command
150:mmc.c **** //the first bit will be a 0
151:mmc.c **** //followed by an error code
152:mmc.c **** //data will be 0xff until response
153:mmc.c **** int i=0;
154:mmc.c ****
155:mmc.c **** char response;
156:mmc.c ****
157:mmc.c **** while(i<=500)
158:mmc.c **** {
159:mmc.c **** response=spiSendByte(0xff);
160:mmc.c **** if(response==resp)break;
161:mmc.c **** i++;
162:mmc.c **** }
163:mmc.c **** return response;
164:mmc.c **** }
165:mmc.c **** char mmcCheckBusy(void)
166:mmc.c **** {
167:mmc.c **** //Response comes 1-8bytes after command
168:mmc.c **** //the first bit will be a 0
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -