📄 mmc.lst
字号:
\ 00000006 6070 STRB R0,[R4, #+1]
145 rcvr_spi();
\ 00000008 FF20 MOV R0,#+255
\ 0000000A ........ BL AT91_spi
146 do
147 res = rcvr_spi();
\ ??wait_ready_0:
\ 0000000E FF20 MOV R0,#+255
\ 00000010 ........ BL AT91_spi
148 while ((res != 0xFF) && Timer);
\ 00000014 FF28 CMP R0,#+255
\ 00000016 02D0 BEQ ??wait_ready_1
\ 00000018 6178 LDRB R1,[R4, #+1]
\ 0000001A 0029 CMP R1,#+0
\ 0000001C F7D1 BNE ??wait_ready_0
149 return res;
\ ??wait_ready_1:
\ 0000001E 10BC POP {R4}
\ 00000020 02BC POP {R1}
\ 00000022 0847 BX R1 ;; return
150 }
151
152 /*--------------------------------*/
153 /* Receive a data packet from MMC */
154
\ In segment CODE, align 4, keep-with-next
155 extern
156 unsigned int rcvr_datablock (
157 BYTE *buff, /* Data buffer to store received data */
158 BYTE wc /* Word count (0 means 256 words) */
159 )
160 {
\ rcvr_datablock:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
161 BYTE token;
162
163 Timer = 10;
\ 00000006 .... LDR R6,??DataTable8 ;; Stat
\ 00000008 0A20 MOV R0,#+10
\ 0000000A 7070 STRB R0,[R6, #+1]
\ 0000000C 02E0 B ??rcvr_datablock_0
164 do { /* Wait for data packet in timeout of 100ms */
165 token = rcvr_spi();
166 } while ((token == 0xFF) && Timer );
\ ??rcvr_datablock_1:
\ 0000000E 7078 LDRB R0,[R6, #+1]
\ 00000010 0028 CMP R0,#+0
\ 00000012 06D0 BEQ ??rcvr_datablock_2
\ ??rcvr_datablock_0:
\ 00000014 FF20 MOV R0,#+255
\ 00000016 ........ BL AT91_spi
\ 0000001A FF28 CMP R0,#+255
\ 0000001C F7D0 BEQ ??rcvr_datablock_1
167 if(token != 0xFE) return FALSE; /* If not valid data token, retutn with error */
\ 0000001E FE28 CMP R0,#+254
\ 00000020 01D0 BEQ ??rcvr_datablock_3
\ ??rcvr_datablock_2:
\ 00000022 0020 MOV R0,#+0
\ 00000024 14E0 B ??rcvr_datablock_4
168
169 do { /* Receive the data block into buffer */
170 rcvr_spi_m(buff++);
\ ??rcvr_datablock_3:
\ 00000026 FF20 MOV R0,#+255
\ 00000028 ........ BL AT91_spi
\ 0000002C 2070 STRB R0,[R4, #+0]
\ 0000002E 641C ADD R4,R4,#+1
171 rcvr_spi_m(buff++);
\ 00000030 FF20 MOV R0,#+255
\ 00000032 ........ BL AT91_spi
\ 00000036 2070 STRB R0,[R4, #+0]
\ 00000038 641C ADD R4,R4,#+1
172 } while (--wc);
\ 0000003A 6D1E SUB R5,R5,#+1
\ 0000003C 2D06 LSL R5,R5,#+24
\ 0000003E 2D0E LSR R5,R5,#+24
\ 00000040 F1D1 BNE ??rcvr_datablock_3
173 rcvr_spi(); /* Discard CRC */
\ 00000042 FF20 MOV R0,#+255
\ 00000044 ........ BL AT91_spi
174 rcvr_spi();
\ 00000048 FF20 MOV R0,#+255
\ 0000004A ........ BL AT91_spi
175
176 return TRUE; /* Return with success */
\ 0000004E 0120 MOV R0,#+1
\ ??rcvr_datablock_4:
\ 00000050 .... B ?Subroutine21
177 }
\ In segment CODE, align 4, keep-with-next
\ ?Subroutine21:
\ 00000000 70BC POP {R4-R6}
\ 00000002 02BC POP {R1}
\ 00000004 0847 BX R1 ;; return
178
179
180
181 /*---------------------------*/
182 /* Send a data packet to MMC */
183
184 #ifndef _READONLY
\ In segment CODE, align 4, keep-with-next
185 static
186 unsigned int xmit_datablock (
187 const BYTE *buff, /* 512 byte data block to be transmitted */
188 BYTE token /* Data/Stop token */
189 )
190 {
\ xmit_datablock:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
191 BYTE resp, wc = 0;
\ 00000006 0026 MOV R6,#+0
192
193
194 if (wait_ready() != 0xFF) return FALSE;
\ 00000008 ........ BL wait_ready
\ 0000000C FF28 CMP R0,#+255
\ 0000000E 01D0 BEQ ??xmit_datablock_0
\ ??xmit_datablock_1:
\ 00000010 0020 MOV R0,#+0
\ 00000012 1EE0 B ??xmit_datablock_2
195
196 xmit_spi(token); /* Xmit data token */
\ ??xmit_datablock_0:
\ 00000014 281C MOV R0,R5
\ 00000016 ........ BL AT91_spi
197 if (token != 0xFD) { /* Is data token */
\ 0000001A FD2D CMP R5,#+253
\ 0000001C 18D0 BEQ ??xmit_datablock_3
198 do { /* Xmit the 512 byte data block to MMC */
199 xmit_spi(*buff++);
\ ??xmit_datablock_4:
\ 0000001E 2078 LDRB R0,[R4, #+0]
\ 00000020 ........ BL AT91_spi
\ 00000024 641C ADD R4,R4,#+1
200 xmit_spi(*buff++);
\ 00000026 2078 LDRB R0,[R4, #+0]
\ 00000028 ........ BL AT91_spi
\ 0000002C 641C ADD R4,R4,#+1
201 } while (--wc);
\ 0000002E 761E SUB R6,R6,#+1
\ 00000030 3606 LSL R6,R6,#+24
\ 00000032 360E LSR R6,R6,#+24
\ 00000034 F3D1 BNE ??xmit_datablock_4
202 xmit_spi(0xFF); /* CRC (Dummy) */
\ 00000036 FF20 MOV R0,#+255
\ 00000038 ........ BL AT91_spi
203 xmit_spi(0xFF);
\ 0000003C FF20 MOV R0,#+255
\ 0000003E ........ BL AT91_spi
204 resp = rcvr_spi(); /* Reveive data response */
\ 00000042 FF20 MOV R0,#+255
\ 00000044 ........ BL AT91_spi
205 if ((resp & 0x1F) != 0x05) /* If not accepted, return with error */
\ 00000048 C006 LSL R0,R0,#+27
\ 0000004A C00E LSR R0,R0,#+27
\ 0000004C 0528 CMP R0,#+5
\ 0000004E DFD1 BNE ??xmit_datablock_1
206 return FALSE;
207 }
208
209 return TRUE;
\ ??xmit_datablock_3:
\ 00000050 0120 MOV R0,#+1
\ ??xmit_datablock_2:
\ 00000052 C046 NOP
\ 00000054 REQUIRE ?Subroutine21
\ 00000054 ;; // Fall through to label ?Subroutine21
210 }
211 #endif
212
213
214 /*------------------------------*/
215 /* Send a command packet to MMC */
216
\ In segment CODE, align 4, keep-with-next
217 extern
218 BYTE send_cmd (
219 BYTE cmd, /* Command byte */
220 DWORD arg /* Argument */
221 )
222 {
\ send_cmd:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
223 BYTE n, res;
224
225
226 if (wait_ready() != 0xFF) return 0xFF;
\ 00000006 ........ BL wait_ready
\ 0000000A FF28 CMP R0,#+255
\ 0000000C 01D0 BEQ ??send_cmd_0
\ 0000000E FF20 MOV R0,#+255
\ 00000010 24E0 B ??send_cmd_1
227
228 /* Send command packet */
229 xmit_spi(cmd); /* Command */
\ ??send_cmd_0:
\ 00000012 201C MOV R0,R4
\ 00000014 ........ BL AT91_spi
230 xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */
\ 00000018 280E LSR R0,R5,#+24
\ 0000001A ........ BL AT91_spi
231 xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */
\ 0000001E 280C LSR R0,R5,#+16
\ 00000020 0006 LSL R0,R0,#+24
\ 00000022 000E LSR R0,R0,#+24
\ 00000024 ........ BL AT91_spi
232 xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */
\ 00000028 280A LSR R0,R5,#+8
\ 0000002A 0006 LSL R0,R0,#+24
\ 0000002C 000E LSR R0,R0,#+24
\ 0000002E ........ BL AT91_spi
233 xmit_spi((BYTE)arg); /* Argument[7..0] */
\ 00000032 2806 LSL R0,R5,#+24
\ 00000034 000E LSR R0,R0,#+24
\ 00000036 ........ BL AT91_spi
234 xmit_spi(0x95); /* CRC (valid for only CMD0) */
\ 0000003A 9520 MOV R0,#+149
\ 0000003C ........ BL AT91_spi
235
236 /* Receive command response */
237 if (cmd == CMD12) rcvr_spi(); /* Skip a stuff byte when stop reading */
\ 00000040 4C2C CMP R4,#+76
\ 00000042 02D1 BNE ??send_cmd_2
\ 00000044 FF20 MOV R0,#+255
\ 00000046 ........ BL AT91_spi
238 n = 10; /* Wait for a valid response in timeout of 10 attempts */
\ ??send_cmd_2:
\ 0000004A 0A24 MOV R4,#+10
239 do
240 res = rcvr_spi();
\ ??send_cmd_3:
\ 0000004C FF20 MOV R0,#+255
\ 0000004E ........ BL AT91_spi
241 while ((res & 0x80) && --n);
\ 00000052 0106 LSL R1,R0,#+24
\ 00000054 02D5 BPL ??send_cmd_1
\ 00000056 641E SUB R4,R4,#+1
\ 00000058 2106 LSL R1,R4,#+24
\ 0000005A F7D1 BNE ??send_cmd_3
242
243 return res; /* Return with the response value */
\ ??send_cmd_1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -