?? emb_f.asm
字號:
lcall Ep3TxLoopBack
$$END$
$$END$
$$END$
$$IF$ (BENCFG12 == 1)
$$IF$ (EPADDR12 == 3)
$$IFN$ (EPATT12 == 1)
jnb FRXD3, EXIT_FUNCTION_ISR
mov EPINDEX,#03
lCall Ep3RxLoopBack ; 82930 has received a packet from HC
lcall Ep3TxLoopBack
$$END$
$$END$
$$END$
$$IF$ (BENCFG13 == 1)
$$IF$ (EPADDR13 == 3)
$$IFN$ (EPATT13 == 1)
jnb FRXD3, EXIT_FUNCTION_ISR
mov EPINDEX,#03
lCall Ep3RxLoopBack ; 82930 has received a packet from HC
lcall Ep3TxLoopBack
$$END$
$$END$
$$END$
$$IF$ (BENCFG14 == 1)
$$IF$ (EPADDR14 == 3)
$$IFN$ (EPATT14 == 1)
jnb FRXD3, EXIT_FUNCTION_ISR
mov EPINDEX,#03
lCall Ep3RxLoopBack ; 82930 has received a packet from HC
lcall Ep3TxLoopBack
$$END$
$$END$
$$END$
$$IF$ (BENCFG15 == 1)
$$IF$ (EPADDR15 == 3)
$$IFN$ (EPATT15 == 1)
jnb FRXD3, EXIT_FUNCTION_ISR
mov EPINDEX,#03
lCall Ep3RxLoopBack ; 82930 has received a packet from HC
lcall Ep3TxLoopBack
$$END$
$$END$
$$END$
$$IF$ (BENCFG16 == 1)
$$IF$ (EPADDR16 == 3)
$$IFN$ (EPATT16 == 1)
jnb FRXD3, EXIT_FUNCTION_ISR
mov EPINDEX,#03
lCall Ep3RxLoopBack ; 82930 has received a packet from HC
lcall Ep3TxLoopBack
$$END$
$$END$
$$END$
mov A, FIFLG ; Check to see if any other Interrupts are pending.
jz EXIT_FUNCTION_ISR
ljmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
;F_EP2_TX:
; jnb FTXD2, F_EP3_TX
; mov EPINDEX,#02
; lCall EP2_TX_ISR ; 82930 has sent a packet to HC
; jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
;F_EP3_TX:
; jnb FTXD3, EXIT_FUNCTION_ISR
; mov EPINDEX,#03
; lCall EP3_TX_ISR ; 82930 has sent a packet to HC
; jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
EXIT_FUNCTION_ISR:
pop EPINDEX
pop B
pop ACC
pop PSW1
pop PSW
reti
;COMMENT *------------------------------------------------------------
;Function name : ProcessOutToken
;Brief Description : Services all OUTs on EP0.
; : This routine checks to see if this is an OUT token oor
; : SETUP token. If a SETUP token then the Control COmmand
; : State machine is initilized to SETUP STAGE
;Regs preserved : No reg. is saved
;--------------------------------------------------------------------*
;SCOPE
ProcessOutToken:
anl FIFLG, #EP0_RX_CLR ; Clear the interrupt bit.
jmp ProcCommand
ProcCommand:
mov A, RXSTAT
jnb ACC.6, CheckOutStatusPhase ; Is this a setup packet??
; Now Check for Data still in FIFO.
; If this is true then the function
; did not see the ACK form the host.
mov A, TXFLG
anl A, #0C0h
jZ NoEP0Error
setb TXCLR ; Flush the Transmit FIFOS in case
; a null packet is still left.
NoEP0Error:
; Check to see if the stall bit is set.
mov A, EPCON
anl A, #0C0h
jz NoEp0Stall
anl EPCON, #03Fh ; Clear the stalls
orl TXSTAT, #88h ; Set data toggle on TX ep0.
NoEp0Stall:
lCall SetupReceived
setb RXFFRC ; Update receive FIFO state
clr RXSETUP
jmp ReturnProcessOutToken
CheckOutStatusPhase:
mov A, gbSetupSeqRX
cjne A, #STATUS_PHASE, CheckDataPhase ; Is this the status phase of a "GET"
; command?
setb RXFFRC ; Update receive FIFO state
mov A, #SETUP_PHASE ; Update the state machine-Expect
; a setup packet
mov gbSetupSeqRX, A
mov gbSetupSeqTX, A
jmp ReturnProcessOutToken
;---------------------------------------------------------------
; - Control Write Data Stage
;---------------------------------------------------------------
; If this is a control write command with a datastage then this
; routine will be called on all data stages of the control write.
; When all the data has been collected(Bytes received=wLength)
; the actual routine is called. The size of data is limited to this
; buffer length.
; THE CALLING CODE MUST THEN CALL SetUpControlWriteStatusStage to allow
; the status stage to continue. The user must NOT do this themselves.
; Later in the life of this code, other features will be added here.
CheckDataPhase:
cjne A, #DATA_PHASE, BadOutToken
; Are we processing a Control Write,
; i.e. Set Descr...
; Added to handle control writes with data stages.
; When a control Write with a data stage is detected
; the data is placed in the buffer 'CntlWriteDataBuffer'
; When all the data
; has been collected(Bytes received=wLength) the actual routine is
; called. The size of data is limited to this buffer length.
;---------------------------------------------------------
;------------------- NOTE --------------------------------
;---------------------------------------------------------
; For this routine to work all the data must be stored below
; 100h as I am using byte addressing. Also, since 80-FF is used
; as SFRs and I don't want to for the user to use indirect
; addressing, the data must ne stored between 20h-7Fh.
; Also, these routines will only work for data sets of less than
; 256. But the above limitations put this the max much ower than
; this. MaxBuffer = (7F-20h-Other varaibles in this region)
push R0
mov A, #CntlWriteDataBuffer ; Get location of buffer
add A, CntlWriteDataPntr ; Add the offset
mov R0, A ; R0 now contains the location to start storing the
; data.
; Update the data stored in memory
mov A, RXCNTL ; Get number of bytes to move
add A, CntlWriteDataPntr ; Add number received
mov CntlWriteDataPntr, A ; update memory variable
mov A, RXCNTL
JZ RdDone ; If no data in the buffer, then exit.
ReadData:
mov @R0, RXDAT ; Get the data and store it.
inc R0
djnz ACC, ReadData
pop R0
RdDone:
setb RXFFRC ; Update receive FIFO state
; Now check to see if this was the last
; read by checking if (Bytes received=wLength)
mov A, CntlWriteDataPntr
cjne A, wLength+1, NeedMoreData ; If this is not equal to the expected, then jmp around.
; When all the data has been received, the
; other routines in this program will
; be called to process it.
ProcessControlWriteData:
push DPX ; Processing the jump table will
; corrupt DPX. Save it here
lcall DoJumpTable ; At this point all data has been
; stored and all we need to do now is to
; process it.
pop DPX ; Restore DPX
jmp ReturnProcessOutToken
NeedMoreData:
CheckCommand2:
BadOutToken:
orl EPCON, #0C0h ; Who knows what this was. Stall the EP.
ReturnProcessOutToken:
Ret
;COMMENT *------------------------------------------------------------
;Function name : SetupReceived
;Brief Description : Service all Setup Tokens recd. on EP0
;Regs preserved : No reg. is saved
;--------------------------------------------------------------------*
;SCOPE
SetupReceived:
mov A, RXCNTL ; Get the no. of bytes
clr CY
subb A, #8 ; 8 is length of all setup packets.
JNZ ReturnSetup ; If less than 8 bytes recd.
; Return
; Since buffer will reside within the
; the first 255 bytes, I can use
; register indirect addressing
; Move FIFO to command buffer.
; Notice byte swapping of word fields
; For Word Fields make USB Little Endian words->'251 Big Endian words
clr EDOVW
mov COMMAND_BUFFER, RXDAT ; bmRequestType
mov COMMAND_BUFFER+1, RXDAT ; bRequest
mov COMMAND_BUFFER+3, RXDAT ; wValue LSB
mov COMMAND_BUFFER+2, RXDAT ; wValue MSB
mov COMMAND_BUFFER+5, RXDAT ; wIndex LSB
mov COMMAND_BUFFER+4, RXDAT ; wIndex MSB
mov COMMAND_BUFFER+7, RXDAT ; wLength LSB
mov COMMAND_BUFFER+6, RXDAT ; wLength MSB
push DPX ; Processing the jump table will
; corrupt DPX. Save it here
lCall ProcessSetup
pop DPX ; Restore DPX
ReturnSetup:
Ret
;COMMENT *------------------------------------------------------------
;Function name : ProcessSetup
;Brief Description : Process a Setup token recd. on EP0. Thile some of the
; : code may look sifficult to understand the end result is not.
; : The following simply prepares a byte of data for use in a jump table.
; : The code compresses the 8 byte bmRequestValue into 4 1/2
; : bits by removing bits 2,3 & 4. These bits are never used
; : and it allows the jump table to be signfigantly smaller.
; : By using this jump table, the code size reduces by several
; : hundred bytes over the entire code!
; : THIS FIRMWARE IS ASSUMES BITS 2,3 & 4 are zero!!!!
; : By compressing the byte down, we limit the size
; : of the jump table.
;Regs preserved : No reg. is saved
;--------------------------------------------------------------------*
;SCOPE
ProcessSetup:
; The First step is setting up the Stage tracing variable by examing the
; bmRequest value. This will tell us if this is a control Write
; or control read command. For right now we will assume that this
; is a no data command and will therefore pre-initilize the data
; byte counters used to send data back, to zero.
mov gbFControlBufferBytesLeft, #00h
mov gbFControlBufferBytesLeft + 1, #00h
mov A, bmRequestType
jb ACC.7, SetupGetCommand
SetupSetCommand:
mov gbSetupSeqRX, #DATA_PHASE ; Advance State Machine to next state
mov gbSetupSeqTX, #STATUS_PHASE
; Now check to see if this is a control write with a data stage.
mov A, wLength
orl A, wLength+1
jz DoJumpTable ; If this is a no data command then process it
mov CntlWriteDataPntr, #0 ; Initilize the data pointer for future control write
; data stages.
ret ; If we are expecting data then don't
; process the command yet. Exit and wait
; for the rest of the data to come in.
SetupGetCommand:
mov gbSetupSeqRX, #STATUS_PHASE ; Advance State Machine to next state
mov gbSetupSeqTX, #DATA_PHASE
DoJumpTable:
; This table will jump to the correct subroutine
; to handle the type of command contained in bmRequestType
; The new jmp table will be compressed by shifting and rotating
; out bits, 2,3 & 4.
; Place bmRequestType in the following order and then do the jump table
; on it.
; xx65107x
; if bits 65 == 11, Reserved = Error
; Unless you have time, don't spend a lot of time tracing the algorythm
; It's fancy and it works. If you don't understand it go ask someone for a quarter.
mov A, bmRequestType ; Get the value.
anl A, #0E3h ; Clear out bits 2,3,4 since
; we don't need these
; Reg A now looks like 765xxx10
RL A ; Put bits 1,0,& 7 in new placement
RL A ; Leave LSB cleared so jump is the number of words.
; xxxx1076
CheckBit6: ; 6 is currently in bit 0 position,
jnb ACC.0, CheckBit5 ; Convert it to bit 5 position
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -