📄 hub_ep0.asm
字号:
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 + -