📄 sdspi.lst
字号:
\ 00000020 ........ BL SDSPI_Read
354 if (error) {
\ 00000024 0010B0E1 MOVS R1,R0
\ 00000028 0700001A BNE ??SDSPI_GetDataResp_1
355 return error;
356 }
357 if (((resp & 0x11) == 0x1) || ((resp & 0xf0) == 0))
\ 0000002C 0000DDE5 LDRB R0,[SP, #+0]
\ 00000030 110000E2 AND R0,R0,#0x11
\ 00000034 010050E3 CMP R0,#+1
\ 00000038 0000DD15 LDRBNE R0,[SP, #+0]
\ 0000003C F0001013 TSTNE R0,#0xF0
358 break;
359
360 respRetry--;
\ 00000040 01505512 SUBSNE R5,R5,#+1
361 } while(respRetry > 0);
\ 00000044 F2FFFF1A BNE ??SDSPI_GetDataResp_0
362 //TRACE_DEBUG("SDSPI_GetDataResp 0x%X\n\r",resp);
363 return resp;
\ 00000048 0000DDE5 LDRB R0,[SP, #+0]
\ ??SDSPI_GetDataResp_1:
\ 0000004C 3240BDE8 POP {R1,R4,R5,LR}
\ 00000050 1EFF2FE1 BX LR ;; return
364 }
365
366 //------------------------------------------------------------------------------
367 /// Starts a SPI master transfer. This is a non blocking function. It will
368 /// return as soon as the transfer is started.
369 /// Returns 0 if the transfer has been started successfully; otherwise returns
370 /// error.
371 /// \param pSdSpi Pointer to a SdSpi instance.
372 /// \param pCommand Pointer to the SPI command to execute.
373 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
374 unsigned char SDSPI_SendCommand(SdSpi *pSdSpi, SdSpiCmd *pCommand)
375 {
\ SDSPI_SendCommand:
\ 00000000 F04F2DE9 PUSH {R4-R11,LR}
\ 00000004 0CD04DE2 SUB SP,SP,#+12
\ 00000008 0040A0E1 MOV R4,R0
\ 0000000C 0150A0E1 MOV R5,R1
376 AT91S_SPI *pSpiHw = pSdSpi->pSpiHw;
377 unsigned char CmdToken[6];
378 unsigned char *pData;
379 unsigned int blockSize;
380 unsigned int i;
381 unsigned char error;
382 unsigned char dataHeader;
383 unsigned int dataRetry1 = 100;
\ 00000010 6460A0E3 MOV R6,#+100
384 unsigned int dataRetry2 = 100;
\ 00000014 64B0A0E3 MOV R11,#+100
385 unsigned char crc[2];
386 unsigned char crcPrev = 0;
387 unsigned char crcPrev2 = 0;
388
389 SANITY_CHECK(pSdSpi);
\ 00000018 000054E3 CMP R4,#+0
\ 0000001C 0700001A BNE ??SDSPI_SendCommand_0
\ 00000020 ........ LDR R0,??DataTable12 ;; `?<Constant "-F- ASSERT: ">`
\ 00000024 ........ BL printf
\ 00000028 8520A0E3 MOV R2,#+133
\ 0000002C 402F82E3 ORR R2,R2,#0x100
\ 00000030 ........ LDR R1,??DataTable13 ;; `?<Constant "F:\\\\Diplomovka\\\\IARproj...">`
\ 00000034 ........ LDR R0,??DataTable14 ;; `?<Constant "Sanity check failed a...">`
\ 00000038 ........ BL printf
\ ??SDSPI_SendCommand_1:
\ 0000003C FEFFFFEA B ??SDSPI_SendCommand_1
390 SANITY_CHECK(pSpiHw);
\ ??SDSPI_SendCommand_0:
\ 00000040 000094E5 LDR R0,[R4, #+0]
\ 00000044 000050E3 CMP R0,#+0
\ 00000048 0700001A BNE ??SDSPI_SendCommand_2
\ 0000004C ........ LDR R0,??DataTable12 ;; `?<Constant "-F- ASSERT: ">`
\ 00000050 ........ BL printf
\ 00000054 8620A0E3 MOV R2,#+134
\ 00000058 402F82E3 ORR R2,R2,#0x100
\ 0000005C ........ LDR R1,??DataTable13 ;; `?<Constant "F:\\\\Diplomovka\\\\IARproj...">`
\ 00000060 ........ LDR R0,??DataTable14 ;; `?<Constant "Sanity check failed a...">`
\ 00000064 ........ BL printf
\ ??SDSPI_SendCommand_3:
\ 00000068 FEFFFFEA B ??SDSPI_SendCommand_3
391 SANITY_CHECK(pCommand);
\ ??SDSPI_SendCommand_2:
\ 0000006C 000055E3 CMP R5,#+0
\ 00000070 0700001A BNE ??SDSPI_SendCommand_4
\ 00000074 ........ LDR R0,??DataTable12 ;; `?<Constant "-F- ASSERT: ">`
\ 00000078 ........ BL printf
\ 0000007C 8720A0E3 MOV R2,#+135
\ 00000080 402F82E3 ORR R2,R2,#0x100
\ 00000084 ........ LDR R1,??DataTable13 ;; `?<Constant "F:\\\\Diplomovka\\\\IARproj...">`
\ 00000088 ........ LDR R0,??DataTable14 ;; `?<Constant "Sanity check failed a...">`
\ 0000008C ........ BL printf
\ ??SDSPI_SendCommand_5:
\ 00000090 FEFFFFEA B ??SDSPI_SendCommand_5
392
393 CmdToken[0] = pCommand->cmd & 0x3F;
\ ??SDSPI_SendCommand_4:
\ 00000094 040095E5 LDR R0,[R5, #+4]
\ 00000098 3F0000E2 AND R0,R0,#0x3F
\ 0000009C 0400CDE5 STRB R0,[SP, #+4]
394 pData = pCommand->pData;
\ 000000A0 0C7095E5 LDR R7,[R5, #+12]
395 blockSize = pCommand->blockSize;
\ 000000A4 B081D5E1 LDRH R8,[R5, #+16]
396
397 SDSPI_MakeCmd((unsigned char *)&CmdToken, pCommand->arg);
\ 000000A8 081095E5 LDR R1,[R5, #+8]
\ 000000AC 04008DE2 ADD R0,SP,#+4
\ 000000B0 ........ BL SDSPI_MakeCmd
398
399 // Command is now being executed
400 pSdSpi->pCommand = pCommand;
\ 000000B4 085084E5 STR R5,[R4, #+8]
401 pCommand->status = SDSPI_STATUS_PENDING;
\ 000000B8 0100A0E3 MOV R0,#+1
\ 000000BC 0000C5E5 STRB R0,[R5, #+0]
402
403 // Send the command
404 if((pCommand->conTrans == SPI_NEW_TRANSFER) || (blockSize == 0)) {
\ 000000C0 1400D5E5 LDRB R0,[R5, #+20]
\ 000000C4 000050E3 CMP R0,#+0
\ 000000C8 00005813 CMPNE R8,#+0
\ 000000CC 1900001A BNE ??SDSPI_SendCommand_6
405
406 for(i = 0; i < 6; i++) {
\ 000000D0 00A0A0E3 MOV R10,#+0
\ 000000D4 04908DE2 ADD R9,SP,#+4
407 error = SDSPI_Write(pSdSpi, &CmdToken[i], 1);
\ ??SDSPI_SendCommand_7:
\ 000000D8 0120A0E3 MOV R2,#+1
\ 000000DC 0910A0E1 MOV R1,R9
\ 000000E0 0400A0E1 MOV R0,R4
\ 000000E4 ........ BL SDSPI_Write
408 if (error) {
\ 000000E8 0010B0E1 MOVS R1,R0
\ 000000EC 7900001A BNE ??SDSPI_SendCommand_8
409 TRACE_DEBUG("Error: %d\n\r", error);
410 return error;
411 }
412 }
\ 000000F0 01A08AE2 ADD R10,R10,#+1
\ 000000F4 019089E2 ADD R9,R9,#+1
\ 000000F8 06005AE3 CMP R10,#+6
\ 000000FC F5FFFF3A BCC ??SDSPI_SendCommand_7
413 // Specific for Cmd12()
414 if ((pCommand->cmd & 0x3F) == 12) {
\ 00000100 040095E5 LDR R0,[R5, #+4]
\ 00000104 3F0000E2 AND R0,R0,#0x3F
\ 00000108 0C0050E3 CMP R0,#+12
415 if( 1 == SDSPI_Wait(pSdSpi, 2) ) {
\ 0000010C 0210A003 MOVEQ R1,#+2
\ 00000110 0400A001 MOVEQ R0,R4
\ 00000114 ........ BLEQ SDSPI_Wait
416 TRACE_DEBUG("Pb Send command 12\n\r");
417 }
418 }
419 if (pCommand->pResp) {
\ 00000118 180095E5 LDR R0,[R5, #+24]
\ 0000011C 000050E3 CMP R0,#+0
\ 00000120 0400000A BEQ ??SDSPI_SendCommand_6
420 error = SDSPI_GetCmdResp(pSdSpi, pCommand);
\ 00000124 0510A0E1 MOV R1,R5
\ 00000128 0400A0E1 MOV R0,R4
\ 0000012C ........ BL SDSPI_GetCmdResp
421 if (error) {
\ 00000130 0010B0E1 MOVS R1,R0
\ 00000134 6700001A BNE ??SDSPI_SendCommand_8
422 TRACE_DEBUG("Error: %d\n\r", error);
423 return error;
424 }
425 }
426 }
427
428 if( (blockSize > 0) && (pCommand->nbBlock == 0) ) {
\ ??SDSPI_SendCommand_6:
\ 00000138 000058E3 CMP R8,#+0
\ 0000013C 5D00000A BEQ ??SDSPI_SendCommand_9
\ 00000140 B201D5E1 LDRH R0,[R5, #+18]
\ 00000144 000050E3 CMP R0,#+0
\ 00000148 5A00001A BNE ??SDSPI_SendCommand_9
429 pCommand->nbBlock = 1;
\ 0000014C 0100A0E3 MOV R0,#+1
\ 00000150 B201C5E1 STRH R0,[R5, #+18]
430 }
431
432 // For data block operations
433 while (pCommand->nbBlock > 0) {
434
435 // If data block size is invalid, return error
436 if (blockSize == 0) {
437 TRACE_DEBUG("Block Size = 0\n\r");
438 return 1;
439 }
440
441 // DATA transfer from card to host
442 if (pCommand->isRead) {
\ ??SDSPI_SendCommand_10:
\ 00000154 1500D5E5 LDRB R0,[R5, #+21]
\ 00000158 000050E3 CMP R0,#+0
\ 0000015C 0F00001A BNE ??SDSPI_SendCommand_11
443 do {
444 SDSPI_Read(pSdSpi, &dataHeader, 1);
445 dataRetry1 --;
446 if (dataHeader == SDSPI_START_BLOCK_1) {
447 break;
448 }
449 else if((dataHeader & 0xf0) == 0x00) {
450 pCommand->status = SDSPI_STATUS_ERROR;
451 TRACE_DEBUG("Data Error 0x%X!\n\r", dataHeader);
452 return 1;
453 }
454 } while(dataRetry1 > 0);
455
456 if (dataRetry1 == 0) {
457 TRACE_DEBUG("Timeout dataretry1\n\r");
458 return 1;
459 }
460
461 SDSPI_Read(pSdSpi, pData, blockSize);
462
463 // Specific for Cmd9()
464 if ((pCommand->cmd & 0x3f) != 0x9) {
465
466 SDSPI_Read(pSdSpi, crc, 2);
467 #ifdef SDSPI_CRC_ON
468 // Check data CRC
469 TRACE_DEBUG("Check Data CRC\n\r");
470 crcPrev = 0;
471 crcPrev2 = 0;
472 if (crc[0] != ((crc_itu_t(crcPrev, pData, blockSize) & 0xff00) >> 8 )
473 || crc[1] != (crc_itu_t(crcPrev2, pData, blockSize) & 0xff)) {
474 TRACE_ERROR("CRC error 0x%X 0x%X 0x%X\n\r", \
475 crc[0], crc[1], crc_itu_t(pData, blockSize));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -