📄 usb_core.s79
字号:
BX LR ;; return
CFI EndBlock cfiBlock9
// 417 }
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable31:
DC32 pInformation
// 418
// 419 /*******************************************************************************
// 420 * Function Name : DataStageOut.
// 421 * Description : Data stage of a Control Write Transfer.
// 422 * Input : None.
// 423 * Output : None.
// 424 * Return : None.
// 425 *******************************************************************************/
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock10 Using cfiCommon0
CFI Function DataStageOut
THUMB
// 426 void DataStageOut(void)
// 427 {
DataStageOut:
PUSH {R4-R7,LR}
CFI ?RET Frame(CFA, -4)
CFI R7 Frame(CFA, -8)
CFI R6 Frame(CFA, -12)
CFI R5 Frame(CFA, -16)
CFI R4 Frame(CFA, -20)
CFI CFA R13+20
// 428 ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info;
LDR.N R4,??DataTable43 ;; pInformation
LDR R5,[R4, #+0]
// 429 u32 save_rLength;
// 430
// 431 save_rLength = pEPinfo->Usb_rLength;
LDRH R0,[R5, #+16]!
// 432
// 433 if (pEPinfo->CopyData && save_rLength)
LDR R1,[R5, #+8]
MOVS R2,R1
BEQ.N ??DataStageOut_0
CBZ R0,??DataStageOut_0
// 434 {
// 435 u8 *Buffer;
// 436 u32 Length;
// 437
// 438 Length = pEPinfo->PacketSize;
LDRH R6,[R5, #+4]
// 439 if (Length > save_rLength)
CMP R0,R6
IT CC
// 440 {
// 441 Length = save_rLength;
MOVCC R6,R0
// 442 }
// 443
// 444 Buffer = (*pEPinfo->CopyData)(Length);
MOVS R0,R6
BLX R1
MOVS R7,R0
// 445 pEPinfo->Usb_rLength -= Length;
LDRH R0,[R5, #+0]
SUBS R0,R0,R6
STRH R0,[R5, #+0]
// 446 pEPinfo->Usb_rOffset += Length;
LDRH R0,[R5, #+2]
ADDS R0,R0,R6
STRH R0,[R5, #+2]
// 447
// 448 PMAToUserBufferCopy(Buffer, GetEPRxAddr(ENDP0), Length);
MOVS R0,#+0
_BLF GetEPRxAddr,??GetEPRxAddr??rT
MOVS R2,R6
MOVS R1,R0
MOVS R0,R7
_BLF PMAToUserBufferCopy,??PMAToUserBufferCopy??rT
// 449 }
// 450
// 451 if (pEPinfo->Usb_rLength != 0)
??DataStageOut_0:
LDR.N R6,??DataTable47 ;; SaveTState
LDRH R0,[R5, #+0]
MOVS R7,#+48
CBZ R0,??DataStageOut_1
// 452 {
// 453 vSetEPRxStatus(EP_RX_VALID);/* re-enable for next data reception */
LDR.N R0,??DataTable41 ;; SaveRState
LSLS R1,R7,#+8
STRH R1,[R0, #+0]
// 454 SetEPTxCount(ENDP0, 0);
MOVS R1,#+0
MOVS R0,#+0
_BLF SetEPTxCount,??SetEPTxCount??rT
// 455 vSetEPTxStatus(EP_TX_VALID);/* Expect the host to abort the data OUT stage */
STRH R7,[R6, #+0]
// 456 }
// 457 /* Set the next State*/
// 458 if (pEPinfo->Usb_rLength >= pEPinfo->PacketSize)
??DataStageOut_1:
LDRH R1,[R5, #+0]
LDRH R2,[R5, #+4]
LDR R0,[R4, #+0]
CMP R1,R2
ITTT CS
// 459 {
// 460 pInformation->ControlState = OUT_DATA;
MOVCS R1,#+3
STRBCS R1,[R0, #+8]
POPCS {R4-R7,PC}
// 461 }
// 462 else
// 463 {
// 464 if (pEPinfo->Usb_rLength > 0)
CBZ R1,??DataStageOut_2
// 465 {
// 466 pInformation->ControlState = LAST_OUT_DATA;
MOVS R1,#+5
STRB R1,[R0, #+8]
POP {R4-R7,PC}
// 467 }
// 468 else if (pEPinfo->Usb_rLength == 0)
// 469 {
// 470 pInformation->ControlState = WAIT_STATUS_IN;
??DataStageOut_2:
MOVS R1,#+6
STRB R1,[R0, #+8]
// 471 USB_StatusIn();
LDR.N R0,??DataTable45 ;; 0x40005c50
LDR.N R1,??DataTable46 ;; 0x40006004
MOVS R2,#+0
LDR R0,[R0, #+0]
UXTH R0,R0
STR R2,[R1, R0, LSL #+1]
STRH R7,[R6, #+0]
// 472 }
// 473 }
// 474 }
POP {R4-R7,PC} ;; return
CFI EndBlock cfiBlock10
// 475
// 476 /*******************************************************************************
// 477 * Function Name : DataStageIn.
// 478 * Description : Data stage of a Control Read Transfer.
// 479 * Input : None.
// 480 * Output : None.
// 481 * Return : None.
// 482 *******************************************************************************/
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock11 Using cfiCommon0
CFI Function DataStageIn
THUMB
// 483 void DataStageIn(void)
// 484 {
// 485 ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info;
DataStageIn:
LDR.N R0,??DataTable43 ;; pInformation
PUSH {R4-R8,LR}
CFI ?RET Frame(CFA, -4)
CFI R8 Frame(CFA, -8)
CFI R7 Frame(CFA, -12)
CFI R6 Frame(CFA, -16)
CFI R5 Frame(CFA, -20)
CFI R4 Frame(CFA, -24)
CFI CFA R13+24
// 486 u32 save_wLength = pEPinfo->Usb_wLength;
// 487 u32 ControlState = pInformation->ControlState;
// 488
// 489 u8 *DataBuffer;
// 490 u32 Length;
// 491
// 492 if ((save_wLength == 0) && (ControlState == LAST_IN_DATA))
MOVS R4,#+4
MOV R8,R0
LDR R0,[R8, #+0]
MOVS R5,R0
LDRH R1,[R5, #+16]!
CBNZ R1,??DataStageIn_0
LDRB R0,[R0, #+8]
CMP R0,#+4
BNE.N ??DataStageIn_0
// 493 {
// 494 if(Data_Mul_MaxPacketSize == TRUE)
LDR.N R0,??DataTable53 ;; Data_Mul_MaxPacketSize
LDRB R1,[R0, #+0]
CMP R1,#+1
BNE.N ??DataStageIn_1
// 495 {
// 496 /* No more data to send and empty packet */
// 497 Send0LengthData();
LDR.N R2,??DataTable45 ;; 0x40005c50
LDR.N R3,??DataTable46 ;; 0x40006004
MOVS R1,#+0
LDR R2,[R2, #+0]
UXTH R2,R2
STR R1,[R3, R2, LSL #+1]
MOVS R2,#+48
// 498 ControlState = LAST_IN_DATA;
// 499 Data_Mul_MaxPacketSize = FALSE;
STRB R1,[R0, #+0]
B.N ??DataStageIn_2
// 500 }
// 501 else
// 502 {
// 503 /* No more data to send so STALL the TX Status*/
// 504 ControlState = WAIT_STATUS_OUT;
??DataStageIn_1:
MOVS R4,#+7
// 505 vSetEPTxStatus(EP_TX_STALL);
MOVS R2,#+16
B.N ??DataStageIn_2
// 506 }
// 507
// 508 goto Expect_Status_Out;
// 509 }
// 510
// 511 Length = pEPinfo->PacketSize;
??DataStageIn_0:
LDRH R6,[R5, #+4]
// 512 ControlState = (save_wLength <= Length) ? LAST_IN_DATA : IN_DATA;
CMP R6,R1
BCC.N ??DataStageIn_3
// 513
// 514 if (Length > save_wLength)
CMP R1,R6
IT CC
// 515 {
// 516 Length = save_wLength;
MOVCC R6,R1
// 517 }
// 518
// 519 DataBuffer = (*pEPinfo->CopyData)(Length);
??DataStageIn_4:
LDR R1,[R5, #+8]
MOVS R0,R6
BLX R1
MOVS R7,R0
// 520
// 521 UserToPMABufferCopy(DataBuffer, GetEPTxAddr(ENDP0), Length);
MOVS R0,#+0
_BLF GetEPTxAddr,??GetEPTxAddr??rT
MOVS R2,R6
MOVS R1,R0
MOVS R0,R7
_BLF UserToPMABufferCopy,??UserToPMABufferCopy??rT
// 522
// 523 SetEPTxCount(ENDP0, Length);
MOVS R1,R6
MOVS R0,#+0
_BLF SetEPTxCount,??SetEPTxCount??rT
// 524
// 525 pEPinfo->Usb_wLength -= Length;
LDRH R0,[R5, #+0]
// 526 pEPinfo->Usb_wOffset += Length;
// 527 vSetEPTxStatus(EP_TX_VALID);
MOVS R2,#+48
// 528
// 529 USB_StatusOut();/* Expect the host to abort the data IN stage */
LSLS R1,R2,#+8
SUBS R0,R0,R6
STRH R0,[R5, #+0]
LDRH R0,[R5, #+2]
ADDS R0,R0,R6
STRH R0,[R5, #+2]
LDR.N R0,??DataTable41 ;; SaveRState
STRH R1,[R0, #+0]
??DataStageIn_2:
LDR.N R0,??DataTable47 ;; SaveTState
STRH R2,[R0, #+0]
// 530
// 531 Expect_Status_Out:
// 532 pInformation->ControlState = ControlState;
LDR R0,[R8, #+0]
STRB R4,[R0, #+8]
// 533 }
POP {R4-R8,PC}
??DataStageIn_3:
MOVS R4,#+2
B.N ??DataStageIn_4
CFI EndBlock cfiBlock11
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable41:
DC32 SaveRState
// 534
// 535 /*******************************************************************************
// 536 * Function Name : NoData_Setup0.
// 537 * Description : Proceed the processing of setup request without data stage.
// 538 * Input : None.
// 539 * Output : None.
// 540 * Return : None.
// 541 *******************************************************************************/
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock12 Using cfiCommon0
CFI Function NoData_Setup0
THUMB
// 542 void NoData_Setup0(void)
// 543 {
NoData_Setup0:
PUSH {R4-R6,LR}
CFI ?RET Frame(CFA, -4)
CFI R6 Frame(CFA, -8)
CFI R5 Frame(CFA, -12)
CFI R4 Frame(CFA, -16)
CFI CFA R13+16
// 544 RESULT Result = USB_UNSUPPORT;
// 545 u32 RequestNo = pInformation->USBbRequest;
LDR.N R5,??DataTable43 ;; pInformation
// 546 u32 ControlState;
// 547
// 548 if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
MOVS R4,#+8
LDR R0,[R5, #+0]
LDRB R1,[R0, #+0]
LDRB R6,[R0, #+1]
LSLS R2,R1,#+25
BNE.N ??NoData_Setup0_0
// 549 {
// 550 /* Device Request*/
// 551 /* SET_CONFIGURATION*/
// 552 if (RequestNo == SET_CONFIGURATION)
CMP R6,#+9
BNE.N ??NoData_Setup0_1
// 553 {
// 554 Result = Standard_SetConfiguration();
BL Standard_SetConfiguration
B.N ??NoData_Setup0_2
// 555 }
// 556
// 557 /*SET ADDRESS*/
// 558 else if (RequestNo == SET_ADDRESS)
??NoData_Setup0_1:
LDRH R1,[R0, #+4]
LDRB R2,[R0, #+3]
CMP R6,#+5
BNE.N ??NoData_Setup0_3
// 559 {
// 560 if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0)
// 561 || (pInformation->USBwIndex != 0)
// 562 || (pInformation->Current_Configuration != 0))
CMP R2,#+128
BCS.N ??NoData_Setup0_4
LDRB R2,[R0, #+2]
CMP R2,#+0
BNE.N ??NoData_Setup0_4
CMP R1,#+0
BNE.N ??NoData_Setup0_4
LDRB R0,[R0, #+10]
CMP R0,#+0
BEQ.N ??NoData_Setup0_5
// 563 /* Device Address should be 127 or less*/
// 564 {
// 565 ControlState = STALLED;
// 566 goto exit_NoData_Setup0;
B.N ??NoData_Setup0_4
// 567 }
// 568 else
// 569 {
// 570 Result = USB_SUCCESS;
// 571 }
// 572 }
// 573 /*SET FEATURE for Device*/
// 574 else if (RequestNo == SET_FEATURE)
??NoData_Setup0_3:
LDRB R0,[R0, #+9]
CMP R6,#+3
BNE.N ??NoData_Setup0_6
// 575 {
// 576 if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP)
// 577 && (pInformation->USBwIndex == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -