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

📄 hub_ep0.asm

📁 mcs51,2051,x86系列MCU
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        mov     TXDAT, #00h
        mov     TXCNTL, #02
        ret

ReturnBadSTDGetEPCommand:

        orl     EPCON, #0C0h                    ; Stall EP0
ReturnSTDGetEPCommand:
        Ret

;COMMENT *------------------------------------------------------------
;Function name     : SetUpSinglePacketControlReadStatusStage
;Brief Description : Sets the status in the IN buffer and initilizes all the
;                  : registers needed to do a single packet control read.
;                  : This needs to be done so the IN token is processed correctly.
;                  :
;Regs preserved    : No reg. is saved
;--------------------------------------------------------------------*
;SCOPE
SetUpSinglePacketControlReadStatusStage:

        mov     wLength,      #00
        mov     wLength+1,    #00
        mov     gbSetupSeqRX, #STATUS_PHASE      ; Advance State Machine to next state
        mov     gbSetupSeqTX, #DATA_PHASE
        setb    TXOE                             ; Enable data transmit
        Ret

;COMMENT *------------------------------------------------------------
;Function name     : StandardSetEndpointCommand:
;Brief Description : Process a Standard Set Endpoint Command Setup Token
;                  : This can only be a Set,Clear Feature - Endpoint Stall
;                  :
;Regs preserved    : No reg. is saved
;--------------------------------------------------------------------*
SCOPE
StandardSetEndpointCommand:
        push    EPINDEX
        mov     A,      wIndex+1                 ; Get the endpoint of the stall to clear
        anl     A,      #0Fh                     ; Find out if this is an EP0 CLear Stall Command.
        orl     EPINDEX,A                        ; Setup the EPINDEX to point at correct index.

                               ; Check to make sure this is an Endpoint Stall.
                               ; If it is not then it's a wrong command plus you
                               ; save a few bytes doing it in this order.

        mov     A,      wValue+1
        cjne    A,      #ENDPOINT_STALL, ReturnBadSTDSetEPCommand

        mov     A,      bRequest
        cjne    A,      #CLEAR_FEATURE,  CheckSetEndpointFeature

ClearEndpointFeature:
                   ;------------------------------------------------
                   ;- CLEAR ENDPOINT STALL
                   ;------------------------------------------------
ClearEndpointStall:
        mov     A,      wIndex+1                 ; Get the endpoint of the stall to clear
        anl     A,      #0Fh                     ; Find out if this is an EP0 CLear Stall Command.
        JNZ     ClearNonEP0Stall

        anl     EPCON,  #03Fh                    ; For EP0 Clear both TX & RX stall bits
        ljmp     ReturnSTDSetEPCommand

ClearNonEP0Stall:                                ; Must be EP1 Clear Stall command.

        mov     A,      wIndex+1                 ; Get the endpoint of the stall to clear
        JB      ACC.7,  ClearInStall             ; For Non EP0, examing the direction bit as well.
ClearOutStall:
        anl     HSTAT, #5Ah                      ; Clear the stall on Hub EP1
        ljmp     ReturnSTDSetEPCommand
ClearInStall:
        anl     HSTAT, #5Ah                      ; Clear the stall on Hub EP1
        ljmp     ReturnSTDSetEPCommand


CheckSetEndpointFeature:
        cjne    A,      #SET_FEATURE, ReturnBadSTDSetEPCommand


SetEndpointFeature:
                   ;------------------------------------------------
                   ;- SET ENDPOINT STALL
                   ;------------------------------------------------
SetEndpointStall:

        mov     A,      wIndex+1                 ; Get the endpoint to stall
        JB      ACC.7,  SetInStall


SetOutStall:
        orl     HSTAT, #20h
        ljmp     ReturnSTDSetEPCommand
SetInStall:
        orl     HSTAT, #20h
        ljmp     ReturnSTDSetEPCommand

ReturnBadSTDSetEPCommand:
        push    EPINDEX
        mov     EPINDEX, #01
        mov     TXDAT,  #14h
        mov     TXCNTL, #01h
        pop     EPINDEX

        orl     EPCON, #0C0h                  ;Stall EP0
ReturnSTDSetEPCommand:
        pop     EPINDEX
        ljmp     SetUpControlWriteStatusStage


;COMMENT *------------------------------------------------------------
;Function name     : StandardSetDeviceCommand:
;Brief Description : Process a Standard Set Device Command Setup Token
;                  : The only valid commands are Set Address,
;                  : Set Configuration.  Other commands which have this
;                  : field but are un-defined are
;                  : ClearDeviceFeature, SetDescriptor, SetDeviceFeature.
;                  :
;Regs preserved    : No reg. is saved
;--------------------------------------------------------------------*
;SCOPE
StandardSetDeviceCommand:

        mov     A,      bRequest
        cjne    A,      #SET_CONFIGURATION, CheckSetDeviceAddress
SetDeviceConfiguration:
                   ;------------------------------------------------
                   ;- SET DEVICE CONFIGURATION
                   ;------------------------------------------------

        mov      A,    wValue+1

CheckConfig0:
        cjne     A,    #0, CheckConfig1
        mov      CurrentConfiguration, R11   ; Set up the variables
        mov      EPINDEX,  #80h
        clr      HSTAT.4                     ; Disbale EP1
        ljmp      ReturnSTDSetDevice

CheckConfig1:
        cjne     A,    #1, ReturnBadSetDeviceCommand
        mov      CurrentConfiguration, R11   ; Set up the variables
        mov     EPINDEX, #80h              ; Select Hub EP1
        setb    HSTAT.4                    ; Enable EP1      (kls) normally done on SetConfiguration
        ljmp     ReturnSTDSetDevice

CheckConfig2:
        cjne     A,    #2, ReturnBadSetDeviceCommand


        sjmp     ReturnSTDSetDevice


        ;------- TBD -------
        ; Call SetConfiguration
        sjmp    ReturnSTDSetDevice

CheckSetDeviceAddress:
        cjne    A,      #SET_ADDRESS, CheckSetDeviceRWU
                   ;------------------------------------------------
                   ;- SET DEVICE ADDRESS
                   ;------------------------------------------------

        ; Set Address should just return.  The command will be executed following
        ; the status stage
        sjmp    ReturnSTDSetDevice

CheckSetDeviceRWU:
        cjne    A,      #SET_FEATURE, CheckClearDeviceRWU
        mov     A,      wValue+1
        cjne    A,      #DEVICE_REMOTE_WAKEUP, ReturnBadSetDeviceCommand
        setb    HRWUPE                                 ; Enable the hub to respnd to RWU.
        sjmp    ReturnSTDSetDevice

CheckClearDeviceRWU:
        cjne    A,      #CLEAR_FEATURE, ReturnBadSetDeviceCommand
        mov     A,      wValue+1
        cjne    A,      #DEVICE_REMOTE_WAKEUP, ReturnBadSetDeviceCommand
        clr     HRWUPE                                 ; Disable the hub to respnd to RWU.
        sjmp    ReturnSTDSetDevice


ReturnSTDSetDevice:
       ljmp     SetUpControlWriteStatusStage


StandardSetInterfaceCommand:
        mov     A,      bRequest
        cjne    A,      #SET_INTERFACE, ReturnBadSetDeviceCommand

        mov     A,      wValue+1
        orl     A,      wIndex+1
        jnz     ReturnBadSetDeviceCommand
        mov     CurrentConfig1Interface, R11
        sjmp    ReturnSTDSetDevice

StandardGetInterfaceCommand:
        mov     A,      bRequest
        cjne    A,      #GET_INTERFACE, ReturnBadSetDeviceCommand
        mov     A,      wValue+1
        jnz     ReturnBadSetDeviceCommand
        mov     R11,    CurrentConfig1Interface
        mov     TXDAT, A
        mov     TXCNTL, #01
        ret



StandardSetOtherCommand:
StandardGetOtherCommand:

            ;------------------------------------------
            ; - Unknown Standard Command -- STALL ENDPOINT
            ;------------------------------------------
ReturnBadSetDeviceCommand:

        orl    EPCON,       #0C0h                ; Stall Endpoint
        ret

;-----------------------------------------------------------------
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
;S
;S          END OF STANDARD TYPE COMMANDS
;S
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs
;-----------------------------------------------------------------

;-----------------------------------------------------------------
;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
;C
;C          START OF CLASS COMMANDS
;C
;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
;-----------------------------------------------------------------


ClassGetDeviceCommand:

       lcall    GetClassDeviceCommand
        ret

ClassGetOtherCommand:

       lcall    GetClassOtherCommand

        ret

ClassSetDeviceCommand:

       lcall    SetClassDeviceCommand
       lcall    SetUpControlWriteStatusStage      ; We know this will was a single packet only
        ret                                       ; command so go ahead and prepare/arm the status stage

ClassSetEndpointCommand:
ClassSetOtherCommand:

       lcall    SetClassOtherCommand
       lcall    SetUpControlWriteStatusStage      ; We know this will was a single packet only
                                                  ; command so go ahead and prepare/arm the status stage
        ret


ClassSetInterfaceCommand:
ClassGetInterfaceCommand:

ClassGetEndpointCommand:
            ;------------------------------------------
            ; - Unknown Class Command -- STALL ENDPOINT
            ;------------------------------------------


        orl    EPCON,       #0C0h         ;Stall Endpoint
        ret

;-----------------------------------------------------------------
;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
;C
;C          END OF CLASS COMMANDS
;C
;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
;-----------------------------------------------------------------

;-----------------------------------------------------------------
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;V
;V          START OF VENDOR COMMANDS
;V
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;-----------------------------------------------------------------

VendorSetDeviceCommand:

VendorGetDeviceCommand:
            ret
VendorSetInterfaceCommand:
VendorGetInterfaceCommand:
VendorSetEndpointCommand:
VendorGetEndpointCommand:
VendorSetOtherCommand:
VendorGetOtherCommand:
            ;------------------------------------------
            ; - UnknownVendorCommand -- STALL ENDPOINT
            ;------------------------------------------

        orl    EPCON,       #0C0h         ;Stall Endpoint
        ret

;-----------------------------------------------------------------
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;V
;V          END OF VENDOR COMMANDS
;V
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;-----------------------------------------------------------------

;-----------------------------------------------------------------
;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
;U
;U          UTILILITY ROUTINES
;U
;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
;-----------------------------------------------------------------

;COMMENT *------------------------------------------------------------
;Function name     : ProcessInToken
;Brief Description : Services all INs on EP0.
;Regs preserved    : No reg. is saved
;--------------------------------------------------------------------*
;SCOPE
ProcessInToken:
;(HUB)
        jb      EPINDEX.7, ProcessHubInToken        ; Is this a HUB or NON Hub Call?

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -