📄 mmc.lst
字号:
154 void rcvr_spi_m(BYTE *dst)
155 {
156 *dst = rcvr_spi();
157 }
158
159
160 /*---------------------*/
161 /* Wait for card ready */
162
\ In segment CODE, align 4, keep-with-next
163 static
164 BYTE wait_ready ()
165 {
\ wait_ready:
\ 00000000 10B5 PUSH {R4,LR}
166 BYTE res;
167
168 Timer = 50; /* Wait for ready in timeout of 500ms */
\ 00000002 .... LDR R4,??DataTable8 ;; Stat
\ 00000004 3220 MOV R0,#+50
\ 00000006 6070 STRB R0,[R4, #+1]
169 rcvr_spi();
\ 00000008 FF20 MOV R0,#+255
\ 0000000A ........ BL AT91_spi
170 do
171 res = rcvr_spi();
\ ??wait_ready_0:
\ 0000000E FF20 MOV R0,#+255
\ 00000010 ........ BL AT91_spi
172 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
173 return res;
\ ??wait_ready_1:
\ 0000001E 10BC POP {R4}
\ 00000020 02BC POP {R1}
\ 00000022 0847 BX R1 ;; return
174 }
175
176 /*--------------------------------*/
177 /* Receive a data packet from MMC */
178
\ In segment CODE, align 4, keep-with-next
179 extern
180 BOOL rcvr_datablock (
181 BYTE *buff, /* Data buffer to store received data */
182 BYTE wc /* Word count (0 means 256 words) */
183 )
184 {
\ rcvr_datablock:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
185 BYTE token;
186
187 Timer = 10;
\ 00000006 .... LDR R6,??DataTable8 ;; Stat
\ 00000008 0A20 MOV R0,#+10
\ 0000000A 7070 STRB R0,[R6, #+1]
\ 0000000C 02E0 B ??rcvr_datablock_0
188 do { /* Wait for data packet in timeout of 100ms */
189 token = rcvr_spi();
190 } 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
191 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
192
193 do { /* Receive the data block into buffer */
194 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
195 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
196 } 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
197 rcvr_spi(); /* Discard CRC */
\ 00000042 FF20 MOV R0,#+255
\ 00000044 ........ BL AT91_spi
198 rcvr_spi();
\ 00000048 FF20 MOV R0,#+255
\ 0000004A ........ BL AT91_spi
199
200 return TRUE; /* Return with success */
\ 0000004E 0120 MOV R0,#+1
\ ??rcvr_datablock_4:
\ 00000050 .... B ?Subroutine17
201 }
\ In segment CODE, align 4, keep-with-next
\ ?Subroutine17:
\ 00000000 70BC POP {R4-R6}
\ 00000002 02BC POP {R1}
\ 00000004 0847 BX R1 ;; return
202
203
204
205 /*---------------------------*/
206 /* Send a data packet to MMC */
207
208 #ifndef _READONLY
\ In segment CODE, align 4, keep-with-next
209 static
210 BOOL xmit_datablock (
211 const BYTE *buff, /* 512 byte data block to be transmitted */
212 BYTE token /* Data/Stop token */
213 )
214 {
\ xmit_datablock:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
215 BYTE resp, wc = 0;
\ 00000006 0026 MOV R6,#+0
216
217
218 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
219
220 xmit_spi(token); /* Xmit data token */
\ ??xmit_datablock_0:
\ 00000014 281C MOV R0,R5
\ 00000016 ........ BL AT91_spi
221 if (token != 0xFD) { /* Is data token */
\ 0000001A FD2D CMP R5,#+253
\ 0000001C 18D0 BEQ ??xmit_datablock_3
222 do { /* Xmit the 512 byte data block to MMC */
223 xmit_spi(*buff++);
\ ??xmit_datablock_4:
\ 0000001E 2078 LDRB R0,[R4, #+0]
\ 00000020 ........ BL AT91_spi
\ 00000024 641C ADD R4,R4,#+1
224 xmit_spi(*buff++);
\ 00000026 2078 LDRB R0,[R4, #+0]
\ 00000028 ........ BL AT91_spi
\ 0000002C 641C ADD R4,R4,#+1
225 } 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
226 xmit_spi(0xFF); /* CRC (Dummy) */
\ 00000036 FF20 MOV R0,#+255
\ 00000038 ........ BL AT91_spi
227 xmit_spi(0xFF);
\ 0000003C FF20 MOV R0,#+255
\ 0000003E ........ BL AT91_spi
228 resp = rcvr_spi(); /* Reveive data response */
\ 00000042 FF20 MOV R0,#+255
\ 00000044 ........ BL AT91_spi
229 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
230 return FALSE;
231 }
232
233 return TRUE;
\ ??xmit_datablock_3:
\ 00000050 0120 MOV R0,#+1
\ ??xmit_datablock_2:
\ 00000052 C046 NOP
\ 00000054 REQUIRE ?Subroutine17
\ 00000054 ;; // Fall through to label ?Subroutine17
234 }
235 #endif
236
237
238 /*------------------------------*/
239 /* Send a command packet to MMC */
240
\ In segment CODE, align 4, keep-with-next
241 extern
242 BYTE send_cmd (
243 BYTE cmd, /* Command byte */
244 DWORD arg /* Argument */
245 )
246 {
\ send_cmd:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
247 BYTE n, res;
248
249
250 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
251
252 /* Send command packet */
253 xmit_spi(cmd); /* Command */
\ ??send_cmd_0:
\ 00000012 201C MOV R0,R4
\ 00000014 ........ BL AT91_spi
254 xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */
\ 00000018 280E LSR R0,R5,#+24
\ 0000001A ........ BL AT91_spi
255 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
256 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
257 xmit_spi((BYTE)arg); /* Argument[7..0] */
\ 00000032 2806 LSL R0,R5,#+24
\ 00000034 000E LSR R0,R0,#+24
\ 00000036 ........ BL AT91_spi
258 xmit_spi(0x95); /* CRC (valid for only CMD0) */
\ 0000003A 9520 MOV R0,#+149
\ 0000003C ........ BL AT91_spi
259
260 /* Receive command response */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -