📄 usb_int2.asm
字号:
include ht82k96e.inc
;include usbrf.inc
include usbFIFO.inc
;"FIFO_type"
@Setup_D EQU 7 ;direction
@INTERFACE EQU 0
Setup_Type EQU 60H ;Type
Setup_Rev EQU 1FH ;Recipient (Just use 2 bits)
wValueH_Typ EQU 60H ;D6..5 Type: 0-Standard, 1-Class, 2-Vendor
wValueH_Dst EQU 1FH ;
extern bFLAG_SndFC :bit ;has control pipe data to transmitter
extern bFLAG_Setup :bit
extern bFLAG_FIFO_REDY :bit
extern bFLAG_RsqF :bit
extern bFLAG_AdrF :bit
extern bRmtWakeup :bit
extern bhas_data_out_previous :bit
extern bhas_data_out_previous1 :bit
extern bhas_data_out_previous2 :bit
extern bsetup_flag :bit ;there are setup cmd received
extern bCMD_INDEX :bit
extern baddr_state :bit
extern bKB_KeyUpt :bit
extern btime_out_KB :bit
;extern bacpi_key_chg :bit
;extern bmulti_key_chg :bit
extern breseume_s :bit
extern bwait_setup :bit
extern fifo_out1 :byte
extern fifo_out2 :byte
extern fifo_out3 :byte
extern fifo_out4 :byte
extern fifo_out5 :byte
extern fifo_out6 :byte
extern fifo_out7 :byte
extern fifo_out8 :byte
extern FIFO0_Wr_Check :near
extern FIFO0_Rd_Check :near
extern FIFO1_Rd_Check :near
extern FIFO2_Rd_Check :near
extern LEN0_Rd_Check :near
extern LEN0_Wr_Check :near
extern ReadLen0 :near
extern WriteLen0 :near
extern ReadFIFO0 :near
extern ReadFIFO1 :near
extern ReadFIFO2 :near
extern WriteFIFO0 :near
extern FIFO1_Wr_Check :near
extern WriteFIFO1 :near
extern FIFO2_Wr_Check :near
extern WriteFIFO2 :near
;extern moveacpidata :near
;extern movemultidata :near
extern GetPipeBit :near
extern clearstall :near
extern setstall :near
extern GetEnd :near
extern StandardRequest :near
extern ClassRequest :near
extern ReadNextCnf :near
extern SetLED :near
extern MoveKeyboardData :near
extern ReturnAddr :byte
extern FIFO_SendLen :byte
extern FIFO_Type :byte
extern KB_LED :byte
extern TempKBTime :byte
extern TempKBTime_L :byte
extern CMD_ADDR :byte
extern int_temp1 :byte
FIFO_addr equ int_temp1
usbint_var .section 'data'
isr_usb_acc db ?
isr_usb_status db ?
isr_usb_mp1 db ?
isr_usb_mp0 db ?
isr_usb_tblp db ?
int_reg_temp db ? ;for store USB pipe int register
int_NO db ?
wr_NO db ?
setrpt_NO db ?
kywr_NO db ?
;**************************************************************************
;* External INT subroutine
;**************************************************************************
usbExt .Section AT 350H 'code'
;External interrupt service routine
EXT_START:
clr wdt
MOV ISR_USB_ACC,A ;Save ACC
MOV A,STATUS ;Save STATUS
MOV isr_usb_status,A
MOV A,USB_REG_BANK ;Set bank pointer to USB control
MOV BP,A ;register bank
inc int_NO ;insert for count int number
mov a, int_NO
sub a, 08h
sz acc
jmp $+2
nop
MOV A,MP1 ;Save mp1,r1,mp0,r0 before
MOV isr_usb_mp1,A
mov a,mp0
mov isr_USB_mp0,a
mov a,tblp
mov isr_usb_tblp,a
clr intc.1 ;usb int is disable
set intc.0 ;master int is enable
clr FIFO_w_c_b ;use in Bread Board only,read FIFO
;-----------------------------------------------------------------------------------
snz suspend_line
jmp check_Access_FIFO
mov a,11110000b ;clear Int_reg within suspend state
andm a,Int_reg
sz resume_line
jmp turn_on_usb
;turn_off_usb:
; clr on_usb_clk ;turn on USB CLK
; set regulator_off
jmp Exit_of_Ext_start
turn_on_usb:
set breseume_s
set on_usb_clk ;turn on USB CLK
clr regulator_off
;-----------------------------------------------------------------------------------
;ExitExt:
Exit_of_Ext_start:
mov a,isr_usb_tblp
mov tblp,a
mov a,isr_usb_mp0
mov mp0,a
MOV A,isr_usb_mp1
MOV MP1,A
MOV A,0 ;Set bank pointer to UC
MOV BP,A ;register bank
MOV A,Isr_usb_status ;Restore STATUS
MOV STATUS,A ;
MOV A,isr_usb_acc ;Restore ACC
clr intc.0
set intc.1
RETI
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
check_Access_FIFO:
clr breseume_s
set on_usb_clk ;turn on USB CLK
clr regulator_off
sz Int_reg.@int0
jmp AccessFIFO0
;other pipe except pipe0 interrupt
mov a,Int_reg
sz Int_reg_temp
jmp examine_int123
and a,00001110b
mov Int_reg_temp,a
examine_int123:
sz Int_reg_temp.@int1
jmp AccessFIFO1
sz Int_reg_temp.@int2
jmp AccessFIFO2
sz Int_reg_temp.@int3
jmp AccessFIFO3
jmp Exit_of_Ext_start
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
Check_Pipe0:
AccessFIFO0:
set chk_usb_reset_event ;?set usb mode flag
clr Int_reg.@int0 ;clr pipe0 int flag
MOV A,USB_MISC ;MP1 point to Misc. register
MOV MP1,A ;
;------------------------------------------------------------------------------------
sz bwait_setup
jmp wait_next_setup
snz r1.@usb_len0
jmp AccessFIFO0_cont ;out, in
;------------------------------------------------------------------------------------
wait_next_setup:
MOV A,USB_MISC ;MP1 point to Misc. register
MOV MP1,A ;
nop
nop
sz r1.@USB_Setup
jmp AccessFIFO0_cont ;setup
;--------------------------------------------------------------------------------------
SNZ bFLAG_AdrF ;Need to write address
JMP ExitExt0
CALL FIFO0_Wr_Check ;FIFO0 ready ?
clr r1.@USB_Req
SZ Z ;
JMP ExitExt0
;set address
rla CMD_ADDR
AND A,0FEH ;& save it
MOV FIFO_ADDR,A ;Move address to adress buffer
SZ bRmtWakeup ;Remote wakeup exist ?
SET FIFO_addr.0 ;Yes:Set remote wakeup flag
MOV A,USB_ADDR_WAKE ;MP1 point to Address register
MOV MP1,A ;
MOV A,FIFO_ADDR ;Write to Address Register
MOV R1,A ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -