📄 sdspi.lst
字号:
238 }
239 }
240
241 //------------------------------------------------------------------------------
242 /// Convert SD MCI command to a SPI mode command token.
243 /// \param pCmdToken Pointer to the SD command token.
244 /// \param arg SD command argument
245 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
246 void SDSPI_MakeCmd(unsigned char *pCmdToken, unsigned int arg)
247 {
\ SDSPI_MakeCmd:
\ 00000000 10402DE9 PUSH {R4,LR}
\ 00000004 0040A0E1 MOV R4,R0
248 unsigned char sdCmdNum;
249 unsigned char crc = 0;
250 unsigned char crcPrev = 0;
251
252 sdCmdNum = 0x3f & *pCmdToken;
253 *pCmdToken = sdCmdNum | 0x40;
\ 00000008 0000D4E5 LDRB R0,[R4, #+0]
\ 0000000C 3F0000E2 AND R0,R0,#0x3F
\ 00000010 400080E3 ORR R0,R0,#0x40
\ 00000014 0000C4E5 STRB R0,[R4, #+0]
254 *(pCmdToken+1) = (arg >> 24) & 0xff;
\ 00000018 210CA0E1 LSR R0,R1,#+24
\ 0000001C 0100C4E5 STRB R0,[R4, #+1]
255 *(pCmdToken+2) = (arg >> 16) & 0xff;
\ 00000020 2108A0E1 LSR R0,R1,#+16
\ 00000024 0200C4E5 STRB R0,[R4, #+2]
256 *(pCmdToken+3) = (arg >> 8) & 0xff;
\ 00000028 2104A0E1 LSR R0,R1,#+8
\ 0000002C 0300C4E5 STRB R0,[R4, #+3]
257 *(pCmdToken+4) = arg & 0xff;
\ 00000030 0410C4E5 STRB R1,[R4, #+4]
258
259 crc = crc7(crcPrev, (unsigned char *)(pCmdToken), 5);
260
261 *(pCmdToken+5) = (crc << 1) | 1;
\ 00000034 0520A0E3 MOV R2,#+5
\ 00000038 0410A0E1 MOV R1,R4
\ 0000003C 0000A0E3 MOV R0,#+0
\ 00000040 ........ BL crc7
\ 00000044 0110A0E3 MOV R1,#+1
\ 00000048 800081E1 ORR R0,R1,R0, LSL #+1
\ 0000004C 0500C4E5 STRB R0,[R4, #+5]
262 }
\ 00000050 1040BDE8 POP {R4,LR}
\ 00000054 1EFF2FE1 BX LR ;; return
263
264 //------------------------------------------------------------------------------
265 /// Get response after send SD command.
266 /// Return 0 if no error, otherwise indicate an error.
267 /// \param pSdSpi Pointer to the SD SPI instance.
268 /// \param pCommand Pointer to the SD command
269 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
270 unsigned char SDSPI_GetCmdResp(SdSpi *pSdSpi, SdSpiCmd *pCommand)
271 {
\ SDSPI_GetCmdResp:
\ 00000000 7C402DE9 PUSH {R2-R6,LR}
\ 00000004 0040A0E1 MOV R4,R0
\ 00000008 0150A0E1 MOV R5,R1
272 unsigned char resp[8]; // response
273 unsigned char error;
274 unsigned int respRetry = 8; //NCR max 8, refer to card datasheet
\ 0000000C 0860A0E3 MOV R6,#+8
275
276 memset(resp, 0, 8);
\ 00000010 0820A0E3 MOV R2,#+8
\ 00000014 0010A0E3 MOV R1,#+0
\ 00000018 0D00A0E1 MOV R0,SP
\ 0000001C ........ BL memset
277
278 // Wait for response start bit.
279 do {
280 error = SDSPI_Read(pSdSpi, &resp[0], 1);
\ ??SDSPI_GetCmdResp_1:
\ 00000020 0120A0E3 MOV R2,#+1
\ 00000024 0D10A0E1 MOV R1,SP
\ 00000028 0400A0E1 MOV R0,R4
\ 0000002C ........ BL SDSPI_Read
281 if (error) {
\ 00000030 0010B0E1 MOVS R1,R0
\ 00000034 1000001A BNE ??SDSPI_GetCmdResp_2
282 TRACE_DEBUG("\n\rpb SDSPI_GetCmdResp: 0x%X\n\r", error);
283 return error;
284 }
285 if ((resp[0]&0x80) == 0) {
\ 00000038 0000DDE5 LDRB R0,[SP, #+0]
\ 0000003C 800010E3 TST R0,#0x80
286 break;
287 }
288 respRetry--;
\ 00000040 01605612 SUBSNE R6,R6,#+1
289 } while(respRetry > 0);
\ 00000044 F5FFFF1A BNE ??SDSPI_GetCmdResp_1
290
291 switch (pCommand->resType) {
\ 00000048 1C00D5E5 LDRB R0,[R5, #+28]
\ 0000004C 010040E2 SUB R0,R0,#+1
\ 00000050 060050E3 CMP R0,#+6
\ 00000054 0700008A BHI ??SDSPI_GetCmdResp_3
\ 00000058 04108FE2 ADR R1,??SDSPI_GetCmdResp_0
\ 0000005C 0010D1E7 LDRB R1,[R1, R0]
\ 00000060 01F18FE0 ADD PC,PC,R1, LSL #+2
\ ??SDSPI_GetCmdResp_0:
\ 00000064 01071304 DC8 +1,+7,+19,+4
\ 00000068 04042600 DC8 +4,+4,+38,+0
292 case 1:
293 *(pCommand->pResp) = resp[0];
\ ??SDSPI_GetCmdResp_4:
\ 0000006C 180095E5 LDR R0,[R5, #+24]
\ 00000070 0010DDE5 LDRB R1,[SP, #+0]
\ 00000074 001080E5 STR R1,[R0, #+0]
294 break;
295
296 case 2:
297 error = SDSPI_Read(pSdSpi, &resp[1], 1);
298 if (error) {
299 return error;
300 }
301 *(pCommand->pResp) = resp[0]
302 | (resp[1] << 8);
303 break;
304
305 // Response 3, get OCR
306 case 3:
307 error = SDSPI_Read(pSdSpi, &resp[1], 4);
308 if (error) {
309 return error;
310 }
311 *(pCommand->pResp) = resp[0]
312 | (resp[1] << 8)
313 | (resp[2] << 16)
314 | (resp[3] << 24);
315 *(pCommand->pResp+1) = resp[4];
316 break;
317
318 case 7:
319 TRACE_DEBUG("case 7\n\r");
320 error = SDSPI_Read(pSdSpi, &resp[1], 4);
321 if (error) {
322 return error;
323 }
324 *(pCommand->pResp) = resp[0]
325 | (resp[1] << 8)
326 | (resp[2] << 16)
327 | (resp[3] << 24);
328 *(pCommand->pResp+1) = resp[4];
329 break;
330
331 default:
332 TRACE_DEBUG("PB default\n\r");
333 break;
334 }
335
336 return 0;
\ ??SDSPI_GetCmdResp_3:
\ 00000078 0000A0E3 MOV R0,#+0
\ ??SDSPI_GetCmdResp_2:
\ 0000007C 7640BDE8 POP {R1,R2,R4-R6,LR}
\ 00000080 1EFF2FE1 BX LR ;; return
\ ??SDSPI_GetCmdResp_5:
\ 00000084 0120A0E3 MOV R2,#+1
\ 00000088 01108DE2 ADD R1,SP,#+1
\ 0000008C 0400A0E1 MOV R0,R4
\ 00000090 ........ BL SDSPI_Read
\ 00000094 0010B0E1 MOVS R1,R0
\ 00000098 F7FFFF1A BNE ??SDSPI_GetCmdResp_2
\ 0000009C 0000DDE5 LDRB R0,[SP, #+0]
\ 000000A0 0110DDE5 LDRB R1,[SP, #+1]
\ 000000A4 010480E1 ORR R0,R0,R1, LSL #+8
\ 000000A8 181095E5 LDR R1,[R5, #+24]
\ 000000AC 000081E5 STR R0,[R1, #+0]
\ 000000B0 F0FFFFEA B ??SDSPI_GetCmdResp_3
\ ??SDSPI_GetCmdResp_6:
\ 000000B4 0420A0E3 MOV R2,#+4
\ 000000B8 01108DE2 ADD R1,SP,#+1
\ 000000BC 0400A0E1 MOV R0,R4
\ 000000C0 ........ BL SDSPI_Read
\ 000000C4 0010B0E1 MOVS R1,R0
\ 000000C8 EBFFFF1A BNE ??SDSPI_GetCmdResp_2
\ ??SDSPI_GetCmdResp_7:
\ 000000CC 0000DDE5 LDRB R0,[SP, #+0]
\ 000000D0 0110DDE5 LDRB R1,[SP, #+1]
\ 000000D4 010480E1 ORR R0,R0,R1, LSL #+8
\ 000000D8 0210DDE5 LDRB R1,[SP, #+2]
\ 000000DC 010880E1 ORR R0,R0,R1, LSL #+16
\ 000000E0 0310DDE5 LDRB R1,[SP, #+3]
\ 000000E4 010C80E1 ORR R0,R0,R1, LSL #+24
\ 000000E8 181095E5 LDR R1,[R5, #+24]
\ 000000EC 000081E5 STR R0,[R1, #+0]
\ 000000F0 180095E5 LDR R0,[R5, #+24]
\ 000000F4 0410DDE5 LDRB R1,[SP, #+4]
\ 000000F8 041080E5 STR R1,[R0, #+4]
\ 000000FC DDFFFFEA B ??SDSPI_GetCmdResp_3
\ ??SDSPI_GetCmdResp_8:
\ 00000100 0420A0E3 MOV R2,#+4
\ 00000104 01108DE2 ADD R1,SP,#+1
\ 00000108 0400A0E1 MOV R0,R4
\ 0000010C ........ BL SDSPI_Read
\ 00000110 0010B0E1 MOVS R1,R0
\ 00000114 D8FFFF1A BNE ??SDSPI_GetCmdResp_2
\ 00000118 EBFFFFEA B ??SDSPI_GetCmdResp_7
337 }
338
339 //------------------------------------------------------------------------------
340 /// Get response after send data.
341 /// Return 0 if no error, otherwise indicate an error.
342 /// \param pSdSpi Pointer to the SD SPI instance.
343 /// \param pCommand Pointer to the SD command
344 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
345 unsigned char SDSPI_GetDataResp(SdSpi *pSdSpi, SdSpiCmd *pCommand)
346 {
\ SDSPI_GetDataResp:
\ 00000000 38402DE9 PUSH {R3-R5,LR}
\ 00000004 0040A0E1 MOV R4,R0
347 unsigned char resp = 0; // response
\ 00000008 0010A0E3 MOV R1,#+0
\ 0000000C 0010CDE5 STRB R1,[SP, #+0]
348 unsigned char error;
349 unsigned int respRetry = 18; //NCR max 8, refer to card datasheet
\ 00000010 1250A0E3 MOV R5,#+18
350
351 // Wait for response start bit.
352 do {
353 error = SDSPI_Read(pSdSpi, &resp, 1);
\ ??SDSPI_GetDataResp_0:
\ 00000014 0120A0E3 MOV R2,#+1
\ 00000018 0D10A0E1 MOV R1,SP
\ 0000001C 0400A0E1 MOV R0,R4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -