📄 usblib1.asm
字号:
include ht82k96e.inc
;include usbrf.inc
include usbfifo.inc
extern stall :byte
extern FIFO_Type :byte
extern FIFO_OUT1 :byte
extern int_temp1 :byte
extern int_temp2 :byte
extern fifo_sendlen :byte
FIFO_temp equ int_temp1
fifo_no equ int_temp2
;USBlib .Section AT 278H 'code' ;AT USBlib_ADDRESS
USBlib .Section AT 280H 'code' ;AT USBlib_ADDRESS
;----------------------------------------------------------------------------
; Remark : 检查是否有Zero-length packet进来
;----------------------------------------------------------------------------
LEN0_Rd_Check:
;------- 02-06-2003 : 这一段在96E可以省略,让LEN0_Rd_Check与FIFO0_Rd_Check共用 --
;------- 02-10-2003 : 这一段是为了与980A相容,因为980A检查Zero-length必须这样做 -
; MOV A,USB_MISC ;
; MOV MP1,A ;
; mov a,11100000b ;
; andm a,r1 ; ACC=读取USB_MISC的LEN0,READY,SCMD bits
; nop ;
; nop ;
; SET R1.@USB_Req ; 设定USB_MISC.REQ=1(下FIFO request)
; nop ;
; nop ;
; nop ;
; nop ;
; nop ;
; nop ;
; MOV A,(01H SHL @USB_Len0) ; Len0 ready flag
; JMP Check ; Z=0:Len0 ready/1:Len0 not ready
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; Remark : 检查FIFO 0/1/2/3 READY to read ?
;----------------------------------------------------------------------------
FIFO0_Rd_Check:
mov a,00000000b ; ACC=00H(SELP1=0,SELP0=0,检查FIFO0 READ)
jmp FIFO_Check ; 跳到FIFO_Check
FIFO1_RD_check:
mov a,00001000b ; ACC=08H(SELP1=0,SELP0=1,检查FIFO1 READ)
jmp FIFO_Check ; 跳到FIFO_Check
FIFO2_RD_check:
mov a,00010000b ; ACC=10H(SELP1=1,SELP0=0,检查FIFO2 READ)
jmp FIFO_Check ; 跳到FIFO_Check
FIFO3_RD_check:
mov a,00011000b ; ACC=18H(SELP1=1,SELP0=1,检查FIFO3 READ)
jmp FIFO_Check ; 跳到FIFO_Check
;----------------------------------------------------------------------------
;Len 0 ready to write ?
LEN0_Wr_Check:
;FIFO 0 ready to write ?
;----------------------------------------------------------------------------
; Remark : 检查FIFO 0/1/2/3 READY to write ?
;----------------------------------------------------------------------------
FIFO0_Wr_Check:
mov a,00000010b ; ACC=02H(SELP1=0,SELP0=0,检查FIFO0 WRITE)
jmp FIFO_Check ; 跳到FIFO_Check
FIFO1_Wr_check:
mov a,00001010b ; ACC=0AH(SELP1=0,SELP0=1,检查FIFO1 WRITE)
jmp FIFO_Check ; 跳到FIFO_Check
FIFO2_Wr_check:
mov a,00010010b ; ACC=22H(SELP1=1,SELP0=0,检查FIFO2 WRITE)
jmp FIFO_Check ; 跳到FIFO_Check
FIFO3_Wr_check:
mov a,00011010b ; ACC=2AH(SELP1=1,SELP0=1,检查FIFO3 WRITE)
jmp FIFO_Check ; 跳到FIFO_Check
FIFO_Check: ; 检查FIFO read或write的状态是否READY
mov FIFO_temp,a ; FIFO_temp=ACC
MOV A,USB_MISC ;
MOV MP1,A ;
mov a,r1 ; ACC=读取USB_MISC的状态
and a,11100000b ; 取出LEN0,READY,SCMD bits
or a,fifo_temp ; 结合SELP1,SELP0的设定
mov r1,a ; 写入USB_MISC
nop ;
nop ;
SET R1.@USB_Req ; 设定USB_MISC.REQ=1(下FIFO request)
nop ;
nop ;
MOV A,(01H SHL @USB_Ready) ; access ready flag
Check:
NOP ; 至少delay 3 instruction cycle
NOP ;
nop ;
nop ;
nop ;
nop ;
AND A,R1 ; Z=0:FIFO ready; Z=1:FIFO not ready
RET
;----------------------------------------------------------------------------
;----BEGIN (Read FIFO)
ReadLen0:
MOV A,USB_FIFO0 ; (dummy read)
MOV MP1,A ; MP1=USB_FIFO0
MOV A,R1 ; ACC=读取USB_FIFO0
nop ;
JMP E1ND_Request ; 跳到E1ND_Request
ReadFIFO0:
MOV A,USB_FIFO0 ; ACC=USB_FIFO0 register
JMP ReadFIFO ; 跳到ReadFIFO
ReadFIFO1:
MOV A,USB_FIFO1 ; ACC=USB_FIFO1 register
JMP ReadFIFO ; 跳到ReadFIFO
ReadFIFO2:
MOV A,USB_FIFO2 ; ACC=USB_FIFO2 register
JMP ReadFIFO ; 跳到ReadFIFO
ReadFIFO3:
MOV A,USB_FIFO3 ; ACC=USB_FIFO3 register
JMP ReadFIFO ; 跳到ReadFIFO
ReadFIFO:
MOV FIFO_NO,A ; FIFO_NO=欲读取的FIFO
CLR FIFO_SendLen ; 初设FIFO_SendLen=0
MOV A,OFFSET FIFO_Type ; set input FIFO buffer pointer
MOV MP0,A ; MP0=USB device读取FIFO时用来存放data的buffer起始位址
ReadFIFOLoop: ; 将8 bytes的data读进来
MOV A,FIFO_NO ; FIFO_NO=即将要读取的目标FIFO register
MOV MP1,A ; MP1=欲读取的FIFO
MOV A,R1 ; 读取FIFO data
nop ;
MOV R0,A ;
INC FIFO_SendLen ; 累加FIFO_SendLen
INC MP0 ; 累加buffer pointer
MOV A,FIFO_SIZE ; FIFO full(=8) ?
XOR A,FIFO_SendLen ; 检查FIFO_SendLen是否为8
SZ Z ;
JMP E1ND_Request ; 若FIFO_SendLen=8,表示buffer已收满,则跳到E1ND_Request
MOV A,USB_MISC ; Check ready ?
MOV MP1,A ; MP1=USB_MISC
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
SZ R1.@USB_Ready ; 检查USB_MISC.USB_Ready是否ready
JMP ReadFIFOLoop ; Yes ready,继续读下一个byte
JMP E1ND_Request ; No Exit for not 8 bytes data
;----END (Read FIFO)
;----------------------------------------------------------------------------
;----BEGIN (Write FIFO)
;Write FIFO_OUT1 Data to FIFO Buffer
WriteFIFO0:
MOV A,USB_FIFO0 ; ACC=USB_FIFO0 register
JMP WriteFIFO ; 跳到WriteFIFO
WriteFIFO1:
MOV A,USB_FIFO1 ; ACC=USB_FIFO1 register
JMP WriteFIFO ; 跳到WriteFIFO
WriteFIFO2:
MOV A,USB_FIFO2 ; ACC=USB_FIFO2 register
JMP WriteFIFO ; 跳到WriteFIFO
WriteFIFO3:
MOV A,USB_FIFO3 ; ACC=USB_FIFO3 register
JMP WriteFIFO ; 跳到WriteFIFO
WriteFIFO:
MOV FIFO_NO,A ; FIFO_NO=欲写入的FIFO
MOV A,OFFSET FIFO_OUT1 ; set output FIFO buffer pointer
MOV MP0,A ; MP0=USB device写入FIFO时的source buffer起始位址
WriteFIFOLoop:
SZ FIFO_SendLen ; 检查是否有Any data to write?(FIFO_SendLen=8)
JMP WriteFIFOTag ; Yes,去WriteFIFOTag
JMP EndWrite ; No,结束WriteFIFO
WriteFIFOTag:
MOV A,FIFO_NO ; FIFO NO.
MOV MP1,A ; MP1=即将要写入的目标FIFO register
SET FIFO_w_c_b ; (For ICE only,0 for FIFO read,1 for FIFO write)
MOV A,R0 ; 读出data
MOV R1,A ; 写入FIFO
CLR FIFO_w_c_b ; (For ICE only,0 for FIFO read,1 for FIFO write)
DEC FIFO_SendLen ; FIFO_SendLen递减1
INC MP0 ; Update to next pointer
MOV A,USB_MISC ;
MOV MP1,A ; MP1=USB_MISC
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
SZ R1.@USB_Ready ; 检查USB_MISC.USB_Ready bit
JMP WriteFIFOLoop ; 若USB_MISC.USB_Ready bit=1,则继续写入下一data byte
WriteLen0: ; Write一个Zero-Length packet的作法:
EndWrite: ;
;----------------------------------------------------------------------------
;----BEGIN (End request)
E1ND_Request:
MOV A,USB_MISC ;
MOV MP1,A ; MP1=USB_MISC
MOV A,(01H SHL @USB_Tx) ; Change Tx state
XORM A,R1 ; 切换USB_MISC.USB_TX bit的值(0->1:Rx->Tx或1->0:Tx->Rx)
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
CLR R1.@USB_Req ; 结束USB request状态
RET
;----END (End request)
;----------------------------------------------------------------------------
;----BEGIN (Clear FIFO)
ClearFIFO1:
set r1.@USB_Clear ; 清除所选定的FIFO
clr r1.@USB_Tx ;
nop ;
nop ;
CLR R1.@USB_Clear ; Disable USB_Clear
CLR R1.@USB_Req ; End request
RET
;----------------------------------------------------------------------------
; Input : ACC pipe number
; Output: ACC pip bit (D0:pipe 0, D1:pipe 1...)
; Remark : 将指定的pipe number的bit位置mark为1
;----------------------------------------------------------------------------
GetPipeBit:
INC ACC ;
MOV FIFO_TEMP,A ;
MOV A,80H ;
GetPipeBitLoop:
RL ACC ;
SDZ FIFO_TEMP ;
JMP GetPipeBitLoop ;
RET
;----------------------------------------------------------------------------
; Input : ACC = Pipe number
; Remark : 将指定的pipe number的bit位置设为1
;----------------------------------------------------------------------------
SetStall:
MOV FIFO_TEMP ,A ;
MOV A,USB_STALL ; MP1=USB_STALL
MOV MP1,A ;
MOV A,FIFO_TEMP ;
OR A,STALL ; Set stall bit
JMP SetStallTag
;----------------------------------------------------------------------------
; Input : ACC = Pipe number
; Remark : 将指定的pipe number的bit位置设为0
;----------------------------------------------------------------------------
ClearStall:
MOV FIFO_TEMP,A ;
MOV A,USB_STALL ; MP1=USB_STALL
MOV MP1,A ;
MOV A,FIFO_TEMP ;
CPL ACC ; Clear stall bit
AND A,STALL ;
SetStallTag:
MOV STALL,A ; Update Satll buffer
MOV R1,A ; Update Stall register
RET
;----- END (USB function) --------------------------------------------------
public LEN0_Rd_Check
public LEN0_Wr_Check
public FIFO0_Rd_Check
public FIFO1_Rd_Check
public FIFO2_Rd_Check
public FIFO3_Rd_Check
public FIFO0_Wr_Check
public FIFO1_Wr_Check
public FIFO2_Wr_Check
public FIFO3_Wr_Check
public ReadLen0
public ReadFIFO0
public ReadFIFO1
public ReadFIFO2
public ReadFIFO3
public WriteLen0
public WriteFIFO0
public WriteFIFO1
public WriteFIFO2
public ClearFIFO1
public GetPipeBit
public SetStall
public ClearStall
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -