⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_core.s79

📁 用于监视I2C通信总线
💻 S79
📖 第 1 页 / 共 5 页
字号:
        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 + -