📄 usb_int.asm
字号:
;----------------------------------------------------------------------
; Remark : 前次USB_INT已经收到Setup command,这次的IN要把command接收进来
;----------------------------------------------------------------------
HaveDataInFIFO0:
JMP DataStage ; No (data stage(Host to device)
;-----------------------------------------------------------------------------------------
;----------------------------------------------------------------------
; Remark : 将Setup command的资料接收进来
;----------------------------------------------------------------------
get_cmd_data:
clr bsetup_flag ; 清除bsetup_flag=0
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_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
;----------------------------------------------------------------------
; Remark : 分析Setup 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 ; 若前次USB_INT看到了Setup command,则放弃Send_FIFO0
JMP ExitExt0 ;
;----------------------------------------------------------------------
; Remark : 检查FIFO0是否ready可以写资料出去
;----------------------------------------------------------------------
CALL FIFO0_Wr_Check ; examine whether FIFO0 has data?
clr r1.@USB_Req ;
SZ Z ; FIFO0 ready
JMP ExitExt0 ; Not ready,则ExitExt0
;----------------------------------------------------------------------
; Remark : FIFO0 ready可以写data出去,检查是否有data要送出出去
;----------------------------------------------------------------------
NoneTag:
SnZ bFLAG_SndFC ; Continue Send (ReadNextCnf)
JMP ExitExt0 ;
snz bhas_data_out_previous ; 检查前一批data是否已经被Host拿走了(bhas_data_out_previous=0)
JMP ReadNextCnf ; 读取下一批data
clr bhas_data_out_previous ; 确定前一批data真的被Host拿走了(将bhas_data_out_previous=0)
jmp ExitExt0 ;
;----------------------------------------------------------------------------
DataStage:
;----------------------------------------------------------------------
; Remark : 可能前次USB_INT收到了Setup command
;----------------------------------------------------------------------
sz bsetup_flag ; 判断前次是否收到了Setup command
JMP get_cmd_data ; 若有,则跳到get_cmd_data将Setup command收进来
;----------------------------------------------------------------------
; Remark : 可能前次USB_INT收到了SetupReport的命令
;----------------------------------------------------------------------
CALL FIFO0_Rd_Check ; Any data in FIFO 0 ?
CALL ReadFIFO0 ; Read FIFO 0
sz bCMD_INDEX ; (若前次USB_INT收到了SetReport的命令,则会将bCMD_INDEX设为1)
jmp Set_SetOutput ; 若前次USB_INT收到了SetupReport的命令,则跳到Set_SetOutput把SetReport的命令收进来
jmp RedundantData ; 若前次USB_INT没有收到了SetupReport的命令,则不须理会收到的data
RedundantData:
JMP ExitExt0 ;
Set_SetOutput:
JMP ToStallPipe0 ; No
;----------------------------------------------------------------------------
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 ; 使得ACC的bit 0设成1(ACC=00000001B)
call setstall ; 设STALL.0=0,将Endpoint 0 STALL住
ExitExt:
ExitExt0:
clr Int_reg.@int0 ;clr pipe0 int flag
jmp Exit_of_Ext_start ;
;------------------------------------------------------------------------------
; MOV A,USB_STALL ; MP1 point to Stall register (Read Only)
; MOV MP1,A ; MP1=USB_STALL address
; clr Int_reg.@int0 ; 清除Int_reg.@int0=0
;
;wait_Int0_int0:
; clr wdt ;
; snz Int_reg.@int0 ; 等到下一次Int_reg.@int0=1
; jmp wait_Int0_int0 ;
;
; set stall.0 ;
; set r1.0 ; 将Endpoint 0 STALL住
;
; clr Int_reg.@int0 ; 清除Int_reg.@int0=0
;
;wait_Int0_int1:
; clr wdt ;
; snz Int_reg.@int0 ; 等到下一次Int_reg.@int0=1
; jmp wait_Int0_int1 ;
;
; clr stall.0 ;
; clr r1.0 ; 将Endpoint 0 STALL打开
;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 F_MouseChange
jmp report_pipe1_data
jmp ExitExt1
report_pipe1_data:
clr F_MouseChange
Call MoveMouseData
out_fifo1_data:
CALL FIFO1_Wr_Check ;FIFO0 ready ?
mov a, MOUSE_STATUS_SIZE ;
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
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -