📄 sdspi.lst
字号:
476 return 1;
477 }
478 #endif
479 }
480 }
481
482 // DATA transfer from host to card
483 else {
484 SDSPI_NCS(pSdSpi);
\ 00000160 0400A0E1 MOV R0,R4
\ 00000164 ........ BL SDSPI_NCS
485 if ((pCommand->conTrans == SPI_CONTINUE_TRANSFER) || ((pCommand->cmd & 0x3f) == 25)) {
\ 00000168 1400D5E5 LDRB R0,[R5, #+20]
\ 0000016C 010050E3 CMP R0,#+1
\ 00000170 04009515 LDRNE R0,[R5, #+4]
\ 00000174 3F000012 ANDNE R0,R0,#0x3F
\ 00000178 19005013 CMPNE R0,#+25
486 dataHeader = SDSPI_START_BLOCK_2;
\ 0000017C FC10A003 MOVEQ R1,#+252
\ 00000180 FE10A013 MOVNE R1,#+254
\ 00000184 210000EA B ??SDSPI_SendCommand_12
\ ??SDSPI_SendCommand_13:
\ 00000188 000058E3 CMP R8,#+0
\ 0000018C F0FFFF1A BNE ??SDSPI_SendCommand_10
\ ??SDSPI_SendCommand_14:
\ 00000190 0100A0E3 MOV R0,#+1
\ 00000194 4F0000EA B ??SDSPI_SendCommand_8
\ ??SDSPI_SendCommand_15:
\ 00000198 000056E3 CMP R6,#+0
\ 0000019C FBFFFF0A BEQ ??SDSPI_SendCommand_14
\ ??SDSPI_SendCommand_11:
\ 000001A0 0120A0E3 MOV R2,#+1
\ 000001A4 0D10A0E1 MOV R1,SP
\ 000001A8 0400A0E1 MOV R0,R4
\ 000001AC ........ BL SDSPI_Read
\ 000001B0 016046E2 SUB R6,R6,#+1
\ 000001B4 0000DDE5 LDRB R0,[SP, #+0]
\ 000001B8 FE0050E3 CMP R0,#+254
\ 000001BC 0400000A BEQ ??SDSPI_SendCommand_16
\ 000001C0 F00010E3 TST R0,#0xF0
\ 000001C4 F3FFFF1A BNE ??SDSPI_SendCommand_15
\ 000001C8 0200A0E3 MOV R0,#+2
\ 000001CC 0000C5E5 STRB R0,[R5, #+0]
\ 000001D0 EEFFFFEA B ??SDSPI_SendCommand_14
\ ??SDSPI_SendCommand_16:
\ 000001D4 000056E3 CMP R6,#+0
\ 000001D8 ECFFFF0A BEQ ??SDSPI_SendCommand_14
\ 000001DC 0820A0E1 MOV R2,R8
\ 000001E0 0710A0E1 MOV R1,R7
\ 000001E4 0400A0E1 MOV R0,R4
\ 000001E8 ........ BL SDSPI_Read
\ 000001EC 040095E5 LDR R0,[R5, #+4]
\ 000001F0 3F0000E2 AND R0,R0,#0x3F
\ 000001F4 090050E3 CMP R0,#+9
\ 000001F8 2A00000A BEQ ??SDSPI_SendCommand_17
\ 000001FC 0220A0E3 MOV R2,#+2
\ 00000200 02108DE2 ADD R1,SP,#+2
\ 00000204 0400A0E1 MOV R0,R4
\ 00000208 ........ BL SDSPI_Read
\ 0000020C 250000EA B ??SDSPI_SendCommand_17
\ ??SDSPI_SendCommand_12:
\ 00000210 0010CDE5 STRB R1,[SP, #+0]
487 }
488 else {
489 dataHeader = SDSPI_START_BLOCK_1;
490 }
491
492 crcPrev = 0;
493 crc[0] = (crc_itu_t(crcPrev, pData, blockSize) & 0xff00) >> 8;
\ 00000214 0820A0E1 MOV R2,R8
\ 00000218 0710A0E1 MOV R1,R7
\ 0000021C 0000A0E3 MOV R0,#+0
\ 00000220 ........ BL crc_itu_t
\ 00000224 2004A0E1 LSR R0,R0,#+8
\ 00000228 0200CDE5 STRB R0,[SP, #+2]
494 crcPrev2 = 0;
495 crc[1] = (crc_itu_t(crcPrev2, pData, blockSize) & 0xff);
\ 0000022C 0820A0E1 MOV R2,R8
\ 00000230 0710A0E1 MOV R1,R7
\ 00000234 0000A0E3 MOV R0,#+0
\ 00000238 ........ BL crc_itu_t
\ 0000023C 0300CDE5 STRB R0,[SP, #+3]
496 SDSPI_Write(pSdSpi, &dataHeader, 1);
\ 00000240 0120A0E3 MOV R2,#+1
\ 00000244 0D10A0E1 MOV R1,SP
\ 00000248 0400A0E1 MOV R0,R4
\ 0000024C ........ BL SDSPI_Write
497 SDSPI_Write(pSdSpi, pData, blockSize);
\ 00000250 0820A0E1 MOV R2,R8
\ 00000254 0710A0E1 MOV R1,R7
\ 00000258 0400A0E1 MOV R0,R4
\ 0000025C ........ BL SDSPI_Write
498 SDSPI_Write(pSdSpi, crc, 2);
\ 00000260 0220A0E3 MOV R2,#+2
\ 00000264 02108DE2 ADD R1,SP,#+2
\ 00000268 0400A0E1 MOV R0,R4
\ 0000026C ........ BL SDSPI_Write
499
500 // If status bits in data response is not "data accepted", return error
501 if ((SDSPI_GetDataResp(pSdSpi, pCommand) & 0xe) != 0x4) {
\ 00000270 0510A0E1 MOV R1,R5
\ 00000274 0400A0E1 MOV R0,R4
\ 00000278 ........ BL SDSPI_GetDataResp
\ 0000027C 0E0000E2 AND R0,R0,#0xE
\ 00000280 040050E3 CMP R0,#+4
\ 00000284 0200000A BEQ ??SDSPI_SendCommand_18
502 TRACE_ERROR("Write resp error!\n\r");
\ 00000288 54009FE5 LDR R0,??SDSPI_SendCommand_19 ;; `?<Constant "-E- Write resp error!\\n\\r">`
\ 0000028C ........ BL printf
503 return 1;
\ 00000290 BEFFFFEA B ??SDSPI_SendCommand_14
504 }
505
506 do {
507 if (SDSPI_WaitDataBusy(pSdSpi) == 0) {
\ ??SDSPI_SendCommand_18:
\ 00000294 0400A0E1 MOV R0,R4
\ 00000298 ........ BL SDSPI_WaitDataBusy
\ 0000029C 000050E3 CMP R0,#+0
508 break;
509 }
510 dataRetry2--;
\ 000002A0 01B05B12 SUBSNE R11,R11,#+1
511 } while(dataRetry2 > 0);
\ 000002A4 FAFFFF1A BNE ??SDSPI_SendCommand_18
512 }
513 pData += blockSize;
\ ??SDSPI_SendCommand_17:
\ 000002A8 077088E0 ADD R7,R8,R7
514 pCommand->nbBlock--;
\ 000002AC B201D5E1 LDRH R0,[R5, #+18]
\ 000002B0 010040E2 SUB R0,R0,#+1
\ 000002B4 B201C5E1 STRH R0,[R5, #+18]
515 }
\ ??SDSPI_SendCommand_9:
\ 000002B8 B201D5E1 LDRH R0,[R5, #+18]
\ 000002BC 000050E3 CMP R0,#+0
\ 000002C0 B0FFFF1A BNE ??SDSPI_SendCommand_13
516
517 if (pCommand->status == SDSPI_STATUS_PENDING) {
\ 000002C4 0000D5E5 LDRB R0,[R5, #+0]
\ 000002C8 010050E3 CMP R0,#+1
518 pCommand->status = 0;
\ 000002CC 0000A003 MOVEQ R0,#+0
\ 000002D0 0000C505 STRBEQ R0,[R5, #+0]
519 }
520
521 //TRACE_DEBUG("end SDSPI_SendCommand\n\r");
522 return 0;
\ 000002D4 0000A0E3 MOV R0,#+0
\ ??SDSPI_SendCommand_8:
\ 000002D8 0CD08DE2 ADD SP,SP,#+12 ;; stack cleaning
\ 000002DC F04FBDE8 POP {R4-R11,LR}
\ 000002E0 1EFF2FE1 BX LR ;; return
\ ??SDSPI_SendCommand_19:
\ 000002E4 ........ DC32 `?<Constant "-E- Write resp error!\\n\\r">`
523 }
524 //!
525
526 //------------------------------------------------------------------------------
527 /// The SPI_Handler must be called by the SPI Interrupt Service Routine with the
528 /// corresponding Spi instance.
529 /// The SPI_Handler will unlock the Spi semaphore and invoke the upper application
530 /// callback.
531 /// \param pSdSpi Pointer to a SdSpi instance.
532 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
533 void SDSPI_Handler(SdSpi *pSdSpi)
534 {
\ SDSPI_Handler:
\ 00000000 00502DE9 PUSH {R12,LR}
535 SdSpiCmd *pCommand = pSdSpi->pCommand;
\ 00000004 081090E5 LDR R1,[R0, #+8]
536 AT91S_SPI *pSpiHw = pSdSpi->pSpiHw;
\ 00000008 002090E5 LDR R2,[R0, #+0]
537 volatile unsigned int spiSr;
538
539 // Read the status register
540 spiSr = pSpiHw->SPI_SR;
\ 0000000C 103092E5 LDR R3,[R2, #+16]
\ 00000010 00308DE5 STR R3,[SP, #+0]
541 if(spiSr & AT91C_SPI_RXBUFF) {
\ 00000014 00309DE5 LDR R3,[SP, #+0]
\ 00000018 400013E3 TST R3,#0x40
\ 0000001C 1100000A BEQ ??SDSPI_Handler_0
542
543 if (pCommand->status == SDSPI_STATUS_PENDING) {
\ 00000020 0030D1E5 LDRB R3,[R1, #+0]
\ 00000024 010053E3 CMP R3,#+1
544 pCommand->status = 0;
\ 00000028 0030A003 MOVEQ R3,#+0
\ 0000002C 0030C105 STRBEQ R3,[R1, #+0]
545 }
546 // Disable transmitter and receiver
547 pSpiHw->SPI_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS;
\ 00000030 0230A0E3 MOV R3,#+2
\ 00000034 803F83E3 ORR R3,R3,#0x200
\ 00000038 203182E5 STR R3,[R2, #+288]
548
549 // Disable the SPI clock
550 AT91C_BASE_PMC->PMC_PCDR = (1 << pSdSpi->spiId);
\ 0000003C 0130A0E3 MOV R3,#+1
\ 00000040 D4C0D0E1 LDRSB R12,[R0, #+4]
\ 00000044 133CA0E1 LSL R3,R3,R12
\ 00000048 EBC0E0E3 MVN R12,#+235
\ 0000004C C0CFCCE3 BIC R12,R12,#0x300
\ 00000050 00308CE5 STR R3,[R12, #+0]
551
552 // Disable buffer complete interrupt
553 pSpiHw->SPI_IDR = AT91C_SPI_RXBUFF | AT91C_SPI_ENDTX;
\ 00000054 6030A0E3 MOV R3,#+96
\ 00000058 183082E5 STR R3,[R2, #+24]
554
555 // Release the SPI semaphore
556 pSdSpi->semaphore++;
\ 0000005C 0C20D0E5 LDRB R2,[R0, #+12]
\ 00000060 012082E2 ADD R2,R2,#+1
\ 00000064 0C20C0E5 STRB R2,[R0, #+12]
557 }
558
559 // Invoke the callback associated with the current command
560 if (pCommand && pCommand->callback) {
\ ??SDSPI_Handler_0:
\ 00000068 000051E3 CMP R1,#+0
\ 0000006C 20009115 LDRNE R0,[R1, #+32]
\ 00000070 00005013 CMPNE R0,#+0
561 pCommand->callback(0, pCommand);
\ 00000074 0000A013 MOVNE R0,#+0
\ 00000078 20209115 LDRNE R2,[R1, #+32]
\ 0000007C 0FE0A011 MOVNE LR,PC
\
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -