📄 usb_int2.asm
字号:
sz CMD_ADDR
set baddr_state
CLR bFLAG_AdrF ;have finished address write
JMP ExitExt0
;--------------------------------------------------------------------------------------
AccessFIFO0_cont: ;????
;examine FIFO0 IN, SETUP, OUT Intterupt
snz bhas_data_out_previous1
jmp AccessFIFO0_cont1
clr bhas_data_out_previous1
jmp ExitExt0
;-------------------------------------------------------------------------------
AccessFIFO0_cont1:
snz bhas_data_out_previous2
jmp AccessFIFO0_cont11
clr bhas_data_out_previous2
jmp ExitExt0
;-------------------------------------------------------------------------------
AccessFIFO0_cont11:
set bFLAG_Setup
CheckSetup:
MOV A,USB_MISC ;MP1 point to Misc. register
MOV MP1,A ;
nop
nop
snz r1.@USB_Setup
clr bFlag_setup
snz bFLAG_Setup
JMP AccessFIFO0_cont2 ;No (data stage(Host to device)
Setup_stage:
clr r1.@USB_Setup ;clear USB setup bit
clr r1.@USB_Len0
clr bwait_setup
set bsetup_flag
jmp Exitext0
;-------------------------------------------------------------------------------
AccessFIFO0_cont2:
CALL FIFO0_Rd_Check ;Any data in FIFO 0 ?
CLR R1.@USB_Req ;No: Clear request for FIFO0_Rd_Check
SNZ Z ;
JMP HaveDataInFIFO0 ;Yes
;Host read out data from FIFO 0
;Send next transaction data
JMP SendFIFO0
;----------------------------------------------------------------------------
HaveDataInFIFO0:
JMP DataStage ;No (data stage(Host to device)
;-----------------------------------------------------------------------------------------
get_cmd_data:
clr bsetup_flag
CALL FIFO0_Rd_Check ;Any data in FIFO 0 ?
CALL ReadFIFO0 ;Read FIFO 0
clr acc
call GetPipeBit ;???
call clearstall ;clear pipe0 stall status
CLR bFLAG_SndFC ;No Continue Send(ReadNextCnf)
clr bFLAG_FIFO_REDY ;ignore address write
CLR bFLAG_RsqF ;Clear re_send Flag
CLR bCMD_INDEX ;set Return address to 0
clr bhas_data_out_previous
clr bhas_data_out_previous1
clr bhas_data_out_previous2
MOV A,LOW GetEnd ;Set Defaut Return Address
MOV ReturnAddr,A ;to ReturnAddr
;parsing request command & set command index
MOV A,08H ;Request structure == 8 bytes ?
XOR A,FIFO_SendLen ;
SNZ Z ;
JMP ToStallPipe0 ;No: data length is invalid
;Parsing command ;Yes: Parsing command
MOV A,Setup_Type ;Type
AND A,FIFO_Type ;Request Type
;!!!!! Need in same page
SWAP ACC ;Need be change when Setup_Type
RR ACC ;changed
usb_request_pcl_5:
ADDM A,PCL
JMP StandardRequest ;Standard Request
JMP ClassRequest ;Class Specific Request
JMP ToStallPipe0 ;No support Vendor Request
JMP ToStallPipe0 ;Illegal
;----------------------------------------------------------------------------
;Host has read data out from FIFO 0
SendFIFO0:
sz bsetup_flag
JMP ExitExt0
CALL FIFO0_Wr_Check ;examine whether FIFO0 has data?
clr r1.@USB_Req
SZ Z ;
JMP ExitExt0
;examine whehter has data output
;Write address to USB_ADDR_WAKE
NoneTag:
SnZ bFLAG_SndFC ;Continue Send (ReadNextCnf)
JMP ExitExt0
snz bhas_data_out_previous
JMP ReadNextCnf ;
clr bhas_data_out_previous
jmp ExitExt0
;----------------------------------------------------------------------------
DataStage:
sz bsetup_flag
JMP get_cmd_data
CALL FIFO0_Rd_Check ;Any data in FIFO 0 ?
CALL ReadFIFO0 ;Read FIFO 0
sz bCMD_INDEX ;
jmp Set_SetOutput
jmp RedundantData
RedundantData:
JMP ExitExt0
Set_SetOutput:
MOV A,FIFO_SendLen ;Is length == 1 ?
XOR A,01H ;
SNZ Z ;
JMP ToStallPipe0 ;No
MOV A,FIFO_TYPE ;Output report (LED)
MOV KB_LED,A ;
CALL SetLED ;Set all keyboard LED
clr bCMD_INDEX ;Reset to 0
JMP SendHandShake
;----------------------------------------------------------------------------
RequestResponse:
CLR bFLAG_RsqF
CALL FIFO0_Wr_Check ;Ready to response ?
SNZ Z ;
JMP CanResponse
clr r1.@USB_Req
sz r1.@usb_len0
JMP ExitExt0 ;continue to scan keyboard
sz r1.@USB_Setup
jmp ExitExt0 ;continue to scan keyboard
jmp RequestResponse
CanResponse:
CALL WriteFIFO0
set bhas_data_out_previous
set bhas_data_out_previous1
set bhas_data_out_previous2
jmp ExitExt0
;----------------------------------------------------------------------------
SendHandShake:
CALL LEN0_Wr_Check ;FIFO0 ready ?
SnZ Z ;
jmp sendHandShake_continue
clr r1.@USB_Req
sz r1.@usb_len0
JMP ExitExt0 ;continue to scan keyboard
sz r1.@USB_Setup
jmp ExitExt0 ;continue to scan keyboard
jmp sendHandshake
sendHandshake_continue:
CALL WriteLen0 ;ACK (Write 0 length)
SZ bFLAG_FIFO_REDY
SET bFLAG_AdrF ;the address response is written to FIFO
CLR bFLAG_FIFO_REDY
set bwait_setup
JMP ExitExt0 ;continue to scan keyboard
;----------------------------------------------------------------------------
SendFIFOOut:
MOV FIFO_SendLen ,A ;data length to send
set bwait_setup
jmp RequestResponse
;----------------------------------------------------------------------------
ToStallPipe0:
clr acc
call GetPipeBit
call setstall
ExitExt:
ExitExt0:
clr Int_reg.@int0 ;clr pipe0 int flag
jmp Exit_of_Ext_start
;----------------------------------------------------------------------------
Check_Pipe1:
AccessFIFO1:
sz bCMD_INDEX ;Reset to 0
jmp ExitExt1
CALL FIFO1_Wr_Check ;FIFO0 ready ?
clr r1.@USB_Req
SZ Z ;
JMP ExitExt1
sz bKB_KeyUpt
jmp report_pipe1_data
jmp ExitExt1
report_pipe1_data:
clr bKB_KeyUpt
CALL MoveKeyboardData ;Update it
out_fifo1_data:
CALL FIFO1_Wr_Check ;FIFO0 ready ?
mov a,8
mov FIFO_SendLen,a
CALL WriteFIFO1
clr btime_out_KB
clr TempKBTime
clr tempkbtime_L
ExitExt1:
clr int_reg.@int1
clr int_reg_temp.@int1
JMP Exit_of_Ext_start
;----------------------------------------------------------------------------
Check_Pipe2:
AccessFIFO2:
sz bCMD_INDEX ;Reset to 0
jmp ExitExt2
ExitExt2:
clr int_reg.@int2
clr int_reg_temp.@int2
JMP Exit_of_Ext_start
;----------------------------------------------------------------------------
Check_Pipe3:
AccessFIFO3:
clr int_reg.@int3
clr int_reg_temp.@int3
JMP Exit_of_Ext_start
;----------------------------------------------------------------------------
public ToStallPipe0
public SendFIFOOut
public SendHandShake
public RequestResponse
public usb_request_pcl_5
public ext_start
public ExitExt
public wr_no
public setrpt_no
public kywr_no
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -