📄 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
extern bhas_len0 :bit
extern wr_NO :byte
extern kywr_NO :byte
FIFO_temp equ int_temp1
fifo_no equ int_temp2
USBlib .Section AT 270H 'code' ;AT USBlib_ADDRESS
LEN0_Rd_Check:
MOV A,USB_MISC ;
MOV MP1,A
mov a,11100000b
andm a,r1
nop
nop
SET R1.@USB_Req ;Set 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
;----------------------------------------------------------------------------
;FIFO 0 ready to read ?
FIFO0_Rd_Check:
mov a,00000000b
jmp FIFO_Check
FIFO1_RD_check:
mov a,00001000b
jmp FIFO_Check
FIFO2_RD_check:
mov a,00010000b
jmp FIFO_Check
FIFO3_RD_check:
mov a,00011000b
jmp FIFO_Check
;----------------------------------------------------------------------------
;Len 0 ready to write ?
LEN0_Wr_Check:
;FIFO 0 ready to write ?
FIFO0_Wr_Check:
mov a,00000010b
jmp FIFO_Check
FIFO1_Wr_check:
mov a,00001010b
jmp FIFO_Check
FIFO2_Wr_check:
mov a,00010010b
jmp FIFO_Check
FIFO3_Wr_check:
mov a,00011010b
jmp FIFO_Check
FIFO_Check:
mov FIFO_temp,a
MOV A,USB_MISC
MOV MP1,A
mov a,r1
and a,11100000b
or a,fifo_temp ;清misc的低3位,选择相应的Endpoint
mov r1,a
nop
nop
SET R1.@USB_Req ;Set request
nop
nop
; mov a,40h
MOV A,(01H SHL @USB_Ready) ;access ready flag
Check:
NOP ;min delay 3 instruction cycle
NOP
nop
nop
nop
nop
; AND A,41H
AND A,R1 ;Z=0:ready/1:not ready
RET
;----------------------------------------------------------------------------
;----BEGIN (Read FIFO)
ReadLen0:
MOV A,USB_FIFO0 ;dummy read
MOV MP1,A ;
MOV A,R1 ;
nop
JMP E1ND_Request ;
ReadFIFO0:
MOV A,USB_FIFO0
JMP ReadFIFO
ReadFIFO1:
MOV A,USB_FIFO1
JMP ReadFIFO
ReadFIFO2:
MOV A,USB_FIFO2
JMP ReadFIFO
ReadFIFO3:
MOV A,USB_FIFO3
JMP ReadFIFO
ReadFIFO:
MOV FIFO_NO,A ;FIFO NO.
CLR FIFO_SendLen ;Initial length to 0
MOV A,OFFSET FIFO_Type ;set input FIFO buffer pointer
MOV MP0,A ;
ReadFIFOLoop:
MOV A,FIFO_NO ;FIFO NO.
MOV MP1,A ;
MOV A,R1 ;Read FIFO data
nop
MOV R0,A ;
INC FIFO_SendLen ;Getting data length++
INC MP0 ;Update to next pointer
MOV A,FIFO_SIZE ;FIFO full ?
XOR A,FIFO_SendLen ;
SZ Z ;
JMP E1ND_Request ;Yes
MOV A,USB_MISC ;Check ready ?
MOV MP1,A ;
nop
nop
nop
nop
nop
nop
SZ R1.@USB_Ready ;
JMP ReadFIFOLoop ;Yes
JMP E1ND_Request ;No Exit for not 8 bytes data
;----END (Read FIFO)
;----------------------------------------------------------------------------
;----BEGIN (Write FIFO)
;Write FIFO_OUT1 Data to FIFO Buffer
WriteFIFO0:
inc wr_no
mov a, wr_no
sub a, 02h
sz acc
jmp $+2
nop
MOV A,USB_FIFO0
JMP WriteFIFO
WriteFIFO1:
inc kywr_no
mov a, kywr_no
sub a, 02h
sz acc
jmp $+2
nop
MOV A,USB_FIFO1
JMP WriteFIFO
WriteFIFO2:
MOV A,USB_FIFO2
JMP WriteFIFO
WriteFIFO3:
MOV A,USB_FIFO3
JMP WriteFIFO
WriteFIFO:
MOV FIFO_NO,A ;FIFO NO.
MOV A,OFFSET FIFO_OUT1 ;set output FIFO buffer pointer
MOV MP0,A ;
WriteFIFOLoop:
SZ FIFO_SendLen ;Any data to write ?
JMP WriteFIFOTag ;Yes
JMP EndWrite ;No
WriteFIFOTag:
MOV A,FIFO_NO ;FIFO NO.
MOV MP1,A ;
SET FIFO_w_c_b
MOV A,R0 ;Write data to FIFO
MOV R1,A ;
CLR FIFO_w_c_b
DEC FIFO_SendLen ;Getting data length++
INC MP0 ;Update to next pointer
MOV A,USB_MISC ;End of FIFO ?
MOV MP1,A ;
nop
nop
nop
nop
nop
nop
SZ R1.@USB_Ready ;
JMP WriteFIFOLoop ;No
WriteLen0:
EndWrite:
;----------------------------------------------------------------------------
;----BEGIN (End request)
E1ND_Request:
MOV A,USB_MISC
MOV MP1,A
MOV A,(01H SHL @USB_Tx) ;Change Tx state
XORM A,R1 ;
nop
nop
nop
nop
nop
nop
CLR R1.@USB_Req ;End request
RET
;----END (End request)
;----END (Write FIFO)
;----------------------------------------------------------------------------
;----BEGIN (Clear FIFO)
ClearFIFO1:
set r1.@USB_Clear
clr r1.@USB_Tx
nop
nop
CLR R1.@USB_Clear ;Disable Clear
CLR R1.@USB_Req ;End request
RET
; MOV A,USB_MISC
; MOV MP1,A
; mov a,11110000b
; and a,r1
; or A,((1 SHL @USB_Tx)+(1 SHL @USB_SelP)+(1 SHL @USB_Clear)+ (01H shl @USB_Req))
; ;set Tx, Pipe & Clear state
;; JMP ClearFIFO
;ClearFIFO:
; MOV R1,A ;
;; JMP END_Clear_Request
;END_Clear_Request:
; MOV A,USB_MISC
; MOV MP1,A
; MOV A,(01H SHL @USB_Tx) ;Change Tx state
; XORM A,R1 ;
; nop
; nop
; CLR R1.@USB_Clear ;Disable Clear
; CLR R1.@USB_Req ;End request
; RET
;----END (Clear FIFO)
;----------------------------------------------------------------------------
;----BEGIN (Check setup)
;Output: Z = 0:Setup/1:None
;CheckSetup:
; MOV A,USB_MISC ;MP1 point to Misc. register
; MOV MP1,A ;
; MOV A,(01H SHL @USB_Setup) ;Misc. Register Setup flag
; JMP Check
;----------------------------------------------------------------------------
;----BEGIN (Get pipe bit)
;Input : ACC pipe number
;Output: ACC pip bit (D0:pipe 0, D1:pipe 1...)
GetPipeBit:
INC ACC
MOV FIFO_TEMP,A
MOV A,80H
GetPipeBitLoop:
RL ACC
SDZ FIFO_TEMP
JMP GetPipeBitLoop
RET
;----END (Get pipe bit)
;----------------------------------------------------------------------------
;----BEGIN (Set Stall)
;Input : ACC = Pipe number
SetStall:
MOV FIFO_TEMP ,A ;
MOV A,USB_STALL ;MP1 point to Stall register (Read Only)
MOV MP1,A ;
MOV A,FIFO_TEMP
OR A,STALL ;Set stall bit
JMP SetStallTag
;----END (Set Stall)
;----------------------------------------------------------------------------
;----BEGIN (Clear Stall)
;Input : ACC = Pipe number
ClearStall:
MOV FIFO_TEMP,A ;
MOV A,USB_STALL ;MP1 point to Stall register
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 (Clear Sta
;----------------------------------------------------------------------------
;----BEGIN (Set Address)
;Input : ACC = Address
;SetAddress:
; RL ACC ;Shift address to D1
; AND A,0FEH ;& save it
; MOV FIFO_ADDR,A ;Move address to adress buffer
; SZ STD_FLAG.@RmtWakeup ;Remote wakeup exist ?
; SET FIFO_ADDR.@ADDR_Wake ;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 ;
; RET
;----- END (USB function) --------------------------------------------------
public LEN0_Rd_Check
public LEN0_Wr_Check
public FIFO0_Rd_Check
;public FIFO0_Rd_Check1
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 ClearFIFO0
public ClearFIFO1
;public ClearFIFO2
;public CheckSetup
;public CheckPipe
public GetPipeBit
public SetStall
public ClearStall
;public SetAddress
;public SetRemoteFun
;public END_Request
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -