📄 usb_isr.asm
字号:
;;Established date: 2006/03/01
;;********************************************************************
;;====================================================================
ISR_USB:
M_PUSH
;clr pa.4
;PUSH
;; CLR INTC1.0 ;Close USB interrupt
;; SET INTC0.0 ;Open other interrupt request
;; MOV A,C_USBRegisterBank ;USB register bank(no need in HT46RB50
;; MOV BP,A ;because it USB reg in bank0.)
;;--------------------------------------------------------------------
SNZ F_Suspend
JMP L_CheckAccessFIFO ;USB is work
MOV A,11110000B ;USB is suspend
ANDM A,USR ;clear all endpoint status
;;--------------------------------------------------------------------
SZ F_Resume ;USB is resume?(reset)
JMP L_TurnOnUSB ;Yes(reset),Open USB
JMP L_Exit_ISRUSB ;No(suspend),return
L_TurnOnUSB:
SET F_USBClockOn ;UCC.3,USB clock on
JMP L_Exit_ISRUSB ;return
;;--------------------------------------------------------------------
L_CheckAccessFIFO:
SET F_USBClockOn ;Open USB clock
CLR F_Suspend2 ;clear USB low power mode
SZ F_AccessEP0 ;endpoint0 USB?
JMP L_AccessFIFO0 ;EP0 service
SZ F_AccessEP1 ;endpoint1 USB?
JMP L_AccessFIFO1 ;EP1 service
JMP L_Exit_ISRUSB ;exit USB interrupt
;;====================================================================
L_AccessFIFO0:
SET F_USBReset ;USB interrupt initial(?????)
CLR F_AccessEP0 ;Clear EP0 flag
MOV A,C_MISC ;point MISC
MOV MP1,A
SNZ F_ControlEvent ;setup finally?
JMP L_CheckSetupStage ;no,setup
SNZ R1.@Packet0 ;receive 0-size from host?
JMP L_ProcessOutDataPacket ;no,next check
;;--------------------------------------------------------------------
L_StatusStage:
CLR R1.@Packet0 ;receive 0-size packet,clear 0-size packet flag
SNZ R1.@SetupToken ;setup common?
JMP L_Exit_ISRUSB0 ;no,exit USB interrupt
;;--------------------------------------------------------------------
L_CheckSetupStage:
SNZ R1.@SetupToken
JMP L_Exit_ISRUSB0
L_SetupStage:
CLR R1.@SetupToken ;clear setup common flag
CLR R1.@Packet0 ;clear 0-size packet flag
SET F_ControlEvent ;set the flag of setup finally
SET F_SetupData ;set setup data flag
JMP L_Exit_ISRUSB0 ;exit
;;--------------------------------------------------------------------
L_ProcessOutDataPacket:
SZ R1.@SetupToken ;next check,is setup command?
JMP L_SetupStage ;yes,jmp to setup service
CALL SBR_FIFO0_RD_Check ;FIFO0 read ready check
CLR R1.@USB_REQ
SNZ Z
JMP L_SendFIFO0 ;ready=0,not ready for read FIFO,jmp to write FIFO check
; JMP L_ReadFIFO0 ;ready=1,ready for read
;;--------------------------------------------------------------------
;;------------------ Read FIFO ---------------------------------------
L_ReadFIFO0:
SZ F_SetupData ;FIFO data is setup data?
JMP L_GetSetupStage_Data ;Yes,jmp to get setup data
CALL SBR_FIFO0_RD_Check ;no,check RD
CALL SBR_ReadFIFO0 ;Read FIFO0
MOV A,M_ReportIndex ;load report index
ADDM A,PCL
JMP L_Exit_ISRUSB ;0:exit
JMP L_SetFeature ;1:set feature
; JMP L_SetOutput
;;====================================================================
;;--------------------ouput data from host to device------------------
;;====================================================================
L_SetOutput:
MOV A,M_DataPacketLength ;load packet length which receive
XOR A,C_ReportSize ;packet length=8?
SNZ Z
JMP L_StallPipe0 ;no,error
;; CALL SBR_USBToCOM ;yes,output
;MOV A,M_FIFOBAK0 ;wang
;MOV PA,A ;wang
CLR M_ReportIndex ;clear report index
JMP L_WriteDataToFIFO_0_Packet ;send a 0 size packet
;;--------------------------------------------------------------------
L_SetFeature:
CLR M_ReportIndex ;clear report index
JMP L_StallPipe0 ;error
;;--------------------------------------------------------------------
L_GetSetupStage_Data:
CLR F_SetupData ;clear the flag of setup data
CALL SBR_FIFO0_RD_Check
CALL SBR_ReadFIFO0 ;read FIFO
MOV A,C_Stall
MOV MP1,A
;; CLR M_Stall.0
;; MOV A,M_Stall
;; MOV R1,A ;clear EP0 error flag(???)
CLR F_SendContinue ;clear send data flag
CLR M_ReportIndex ;clear report index
MOV A,C_FIFOSize
XOR A,M_DataPacketLength ;data packet length = 8 byte?
SNZ Z
JMP L_StallPipe0 ;no,error.(setup data == 8 byte)
MOV A,C_RequestType
AND A,T_RequestType ;check RequestType's D6..5.
SWAP ACC
RR ACC
ADDM A,PCL
JMP L_StandardRequest ;0:standard request
JMP L_ClassRequest ;1:class request
JMP L_StallPipe0 ;2:factory reques. 3:NULL
;;--------------------------------------------------------------------
;;-------------------- Write FIFO ------------------------------------
L_SendFIFO0:
SZ F_SetupData ;the data is setup data?
JMP L_Exit_ISRUSB0 ;yes,exit
CALL SBR_FIFO0_WR_Check ;Write FIFO check
CLR R1.@USB_Req
SNZ Z
JMP L_Exit_ISRUSB0 ;not ready for write,exit
SNZ F_SendContinue ;continue send data which for setup command
JMP L_Exit_ISRUSB0 ;no,exit
MOV A,M_TBLPFIFO ;load TBLP address
MOV TBLP,A
JMP L_WriteDataToBuffer ;write data to FIFO buffer
;;--------------------------------------------------------------------
;;------------- send any bytes ---------------------------------------
L_WriteDataToFIFO_AnyBytes:
MOV M_DataPacketLength,A ;save FIFO buffer's length
CLR F_ControlEvent ;clear the flag of setup finally
JMP L_WriteDataToFIFO ;write FIFO
;;--------------------------------------------------------------------
;;------------ send 8 byte data --------------------------------------
L_WriteDataToFIFO:
CLR F_BufferFull ;clear the flag of buffer full
CALL SBR_FIFO0_WR_Check ;FIFO write check
SZ Z ;ready?
JMP L_WriteDataToFIFOOK ;yes,jmp to write data
CLR R1.@USB_Req ;no,clear req
SZ R1.@Packet0 ;send 0-size packet?
JMP L_Exit_ISRUSB0 ;yes,exit
SZ R1.@SetupToken ;send data is the setup command?
JMP L_Exit_ISRUSB0 ;yes,exit
JMP L_WriteDataToFIFO ;no,continue FIFO write enable check
L_WriteDataToFIFOOK:
CALL SBR_WriteFIFO0 ;write FIFO from buffer
SET F_DataUpdate ;set the flag of data updata
JMP L_Exit_ISRUSB0
;;--------------------------------------------------------------------
;;----------- send 0 byte data ---------------------------------------
L_WriteDataToFIFO_0_Packet:
CLR F_BufferFull ;clear buffer full flag
CALL SBR_FIFO0_WR_Check ;check ready for write data
SZ Z
JMP L_Write0PacketToFIFO ;yes,write
CLR R1.@USB_Req
SZ R1.@Packet0
JMP L_Exit_ISRUSB0
SZ R1.@SetupToken
JMP L_Exit_ISRUSB0
JMP L_WriteDataToFIFO_0_Packet ;no,continue check
L_Write0PacketToFIFO:
CALL SBR_Write_0_Packet ;write 0 size packet
CLR F_ControlEvent ;clear the flag of setup command receive
JMP L_Exit_ISRUSB0
;;--------------------------------------------------------------------
L_Stallpipe0:
MOV A,C_STALL
MOV MP1,A
SET M_STALL.0 ;set the error flag of EP0
SET R1.0
JMP L_Exit_ISRUSB
;;--------------------------------------------------------------------
L_Exit_ISRUSB0:
CLR USR.0 ;clear EP0 request
JMP L_Exit_ISRUSB
;;********************************************************************
;;**************************input data to host************************
;;********************************************************************
;;====================================================================
L_AccessFIFO1:
SZ M_ReportIndex
JMP L_ExitISRUSB1
CALL SBR_FIFO1_WR_Check ;check FIFO can write
CLR R1.@USB_Req
SNZ Z
JMP L_ExitISRUSB1 ;not ready to write,exit
;;--------------------------------------------------------------------
L_SendFIFOInterruptIn:
SNZ F_AD_FULL ;AD receive end?
JMP L_Exit_ISRUSB ;no,exiT
MOV A,C_FIFOSize
MOV M_Temp1,A
MOV A,OFFSET M_FIFOBAK0
MOV MP0,A
MOV A,OFFSET M_AD_BUF0
MOV MP1,A
MOV A,R1 ;LOAD AD
MOV R0,A
INC MP0
INC MP1
SDZ M_Temp1
JMP $-5 ;save data in FIFO buffer
MOV A,C_ReportSize
MOV M_DataPacketLength,A
CALL SBR_FIFO1_WR_Check
CALL SBR_WriteFIFO1
CLR F_AD_FULL
;;;--------------------------
; INC M_AD_CHANNEL
; MOV A,M_AD_CHANNEL
; SUB A,C_AD_CHANNEL ;;AD channel max?
; SZ C
; CLR M_AD_CHANNEL
; MOV A,ADCR
; AND A,0F8H
; OR A,M_AD_CHANNEL
; MOV ADCR,A
; CLR START
; SET START
; CLR START
;;--------------------------------------------------------------------
L_ExitISRUSB1:
CLR F_AccessEP1
JMP L_Exit_ISRUSB
;;********************************************************************
L_Exit_ISRUSB:
;; CLR INTC0.0 ;Clear other interrupt request
;; SET INTC1.0 ;Open USB interrupt
; set pa.4
M_POP
RETI
;;********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -