📄 function.asm
字号:
;*********************************************************************
; Functin Library
; Author : Ansonku
; EMail : ansonku@holtek.com.tw
; Date : 2005/01/11
;*********************************************************************
#include ht82a851r.inc
#include const.inc
;=====================================================================
; Descriptor Label
;=====================================================================
;2005/11/01 ClearFeature_Endpoint add Send_Hand_Shake
;
;
;
;
;
;
;
;
extern control_read_table:NEAR
extern device_desc_table:NEAR
extern config_desc_table:NEAR
extern end_config_desc_table:NEAR
extern hid_report_desc_table:NEAR
extern end_hid_report_desc_table:NEAR
extern USBStringLanguageDescription:NEAR
extern USBStringDescription1:NEAR
extern USBStringDescription2:NEAR
extern USBStringDescription3:NEAR
extern HID_Desc:NEAR
extern config_desc_length:NEAR
extern hid_desc_length:NEAR
extern report_desc_length:NEAR
extern USB_EP0_ISR_END:NEAR
;=====================================================================
; External Variable
;=====================================================================
;modify 2006-09-22
extern FIFO_SIZE:byte
;-----------------------------
extern FIFO_SendLen:byte
extern FIFO_Type:byte
extern FIFO_Request:byte
extern FIFO_wValueL:byte
extern FIFO_wValueH:byte
extern FIFO_wIndexL:byte
extern FIFO_wIndexH:byte
extern FIFO_wLengthL:byte
extern FIFO_wLengthH:byte
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 USB_Interface:byte
extern USB_Interface_Alt:byte
extern USB_Configuration:byte
extern FIFO_ADDR:byte
extern Loop_Counter:byte
extern Data_Count:byte
extern Data_Start:byte
extern nCmdIndex1:byte
extern nCmdIndex2:byte
extern nCmdIndex3:byte
extern VolumeH_Save:byte
extern VolumeL_Save:byte
extern bFlag_Audio_Mute:bit
;modify 2006-09-28
extern bFlag_Mic_Mute:bit
;=====================================================================
; FIFO Status
;=====================================================================
;FIFO
extern FIFO_TEMP:byte
extern bFlag_Real_Cmd:bit
extern bFlag_FIFO_Ready:bit
extern bFlag_FIFO_LEN0:bit
extern bFlag_RD_HTable:bit
extern bFlag_wait_control_out:bit
extern bFlag_SET_ADDRESS:bit
extern bFlag_SCMD:bit
extern bFlag_Enum_Ready:bit
extern bFlag_SetConfiguration_Ready:bit
extern bFlag_SetInterface_Ready:bit
extern StageOne:NEAR
extern USB_ISR_END:NEAR
;********************************************************************
; USB LIB
; 1.CHECK FIFOX RD READEY? bFlag_FIFO_Ready = 1:bFlag_FIFO_Ready = 0
;********************************************************************
FIFO0_RD_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111000b
MOV UCC,A
MOV A,00000000b
JMP FIFO_CHECK
FIFO1_RD_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111001b
MOV UCC,A
MOV A,00000000b
JMP FIFO_CHECK
FIFO2_RD_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111010b
MOV UCC,A
MOV A,00000000b
JMP FIFO_CHECK
FIFO3_RD_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111011b
MOV UCC,A
MOV A,00000000b
JMP FIFO_CHECK
FIFO4_RD_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111100b
MOV UCC,A
MOV A,00000000b
JMP FIFO_CHECK
FIFO5_RD_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111101b
MOV UCC,A
MOV A,00000000b
JMP FIFO_CHECK
;********************************************************************
; USB LIB
; 1.CHECK FIFOX WR READEY ? bFlag_FIFO_Ready = 1:bFlag_FIFO_Ready = 0
;********************************************************************
;LEN0 ready to write??
LEN0_WR_CHECK:
;CHECK FIFOX ready to write?
FIFO0_WR_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111000b
MOV UCC,A
MOV A,00000010b
JMP FIFO_CHECK
FIFO1_WR_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111001b
MOV UCC,A
MOV A,00000010b
JMP FIFO_CHECK
FIFO2_WR_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111010b
MOV UCC,A
MOV A,00000010b
JMP FIFO_CHECK
FIFO3_WR_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111011b
MOV UCC,A
MOV A,00000010b
JMP FIFO_CHECK
FIFO4_WR_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111100b
MOV UCC,A
MOV A,00000010b
JMP FIFO_CHECK
FIFO5_WR_CHECK:
MOV A,UCC
OR A,00000111b
AND A,11111101b
MOV UCC,A
MOV A,00000010b
JMP FIFO_CHECK
FIFO_CHECK:
clr wdt
MOV FIFO_TEMP,A
MOV A,USB_MISC
MOV MP1,A
MOV A,R1
AND A,11111000b
OR A,FIFO_TEMP
MOV R1,A
CALL Delay_3us
SET R1.@MISC_REQ ;set request
CALL Delay_28us
SET bFlag_FIFO_Ready
SNZ R1.@MISC_Ready
CLR bFlag_FIFO_Ready ;if MISC.Ready = 1 -> bFlag_FIFO_Ready = 1
SET bFlag_FIFO_LEN0
SNZ R1.@MISC_LEN0
CLR bFlag_FIFO_LEN0
;;SZ bFlag_FIFO_Ready
clr MISC.@MISC_REQ
clr wdt
RET
;modify 2006-09-22
ReadLen0:
MOV A,USB_FIFO0
MOV MP1,A
MOV A,R1
NOP
JMP Read_FIFO_END
Read_FIFO0:
MOV A,USB_FIFO0_SIZE
MOV FIFO_SIZE,A
MOV A,USB_FIFO0
JMP Read_FIFO
Read_FIFO1:
MOV A,USB_FIFO1_SIZE
MOV FIFO_SIZE,A
MOV A,USB_FIFO1
JMP Read_FIFO
Read_FIFO2:
MOV A,USB_FIFO2_SIZE
MOV FIFO_SIZE,A
MOV A,USB_FIFO2
JMP Read_FIFO
Read_FIFO3:
MOV A,USB_FIFO3_SIZE
MOV FIFO_SIZE,A
MOV A,USB_FIFO3
JMP Read_FIFO
Read_FIFO4:
MOV A,USB_FIFO4_SIZE
MOV FIFO_SIZE,A
MOV A,USB_FIFO4
JMP Read_FIFO
Read_FIFO5:
MOV A,USB_FIFO5_SIZE
MOV FIFO_SIZE,A
MOV A,USB_FIFO5
JMP Read_FIFO
Read_FIFO:
SET MISC.@MISC_REQ
MOV FIFO_TEMP,A ;FIFO_TEMP SAVE FIFOX ADDRESS
CLR FIFO_SendLen
MOV A,OFFSET FIFO_Type
MOV MP0,A
Read_FIFO_Loop:
MOV A,FIFO_TEMP
MOV MP1,A
MOV A,R1
MOV R0,A
INC FIFO_SendLen
INC MP0
MOV A,FIFO_SIZE
XOR A,FIFO_SendLen
SZ Z ;1=FIFO_SIZE=FIFO_SendLen
JMP Read_FIFO_End
MOV A,USB_MISC
MOV MP1,A
CALL Delay_28us
SZ R1.@MISC_Ready
JMP Read_FIFO_LOOP
JMP Read_FIFO_End
Send_Hand_Shake:
Send_Hand_Shake_wait:
; protect die loop
call Check_Real_Cmd
sz bFlag_Real_Cmd
;jmp USB_EP0_ISR_END
ret ;modify by 2006-02-16
CALL FIFO0_WR_CHECK
SNZ bFlag_FIFO_Ready
JMP Send_Hand_Shake_wait
set MISC.@MISC_REQ
WriteLen0:
Write_FIFO_OK:
Read_FIFO_End:
MOV A,USB_MISC
MOV MP1,A
MOV A,(01H SHL @MISC_TX) ;Change TX State
;CLR INTC0.0
XORM A,R1
CALL Delay_3us
CLR R1.@MISC_REQ
;SET INTC0.0
RET
;============================================================
;Function:Write FIFOx from FIFO_OUTx
;============================================================
Write_FIFO0:
MOV A,USB_FIFO0
JMP Write_FIFO
Write_FIFO1:
MOV A,USB_FIFO1
JMP Write_FIFO
Write_FIFO2:
MOV A,USB_FIFO2
JMP Write_FIFO
Write_FIFO3:
MOV A,USB_FIFO3
JMP Write_FIFO
Write_FIFO4:
MOV A,USB_FIFO4
JMP Write_FIFO
Write_FIFO5:
MOV A,USB_FIFO5
JMP Write_FIFO
Write_FIFO:
clr wdt
SET MISC.@MISC_REQ
MOV FIFO_TEMP,A ;FIFO NO Address
MOV A,OFFSET FIFO_OUT1
MOV MP0,A
Write_FIFO_Loop:
clr wdt
MOV A,FIFO_SendLen
XOR A,00H
SZ Z
JMP Write_FIFO_End
MOV A,FIFO_TEMP
MOV MP1,A
MOV A,R0
MOV R1,A
DEC FIFO_SendLen
MOV A,FIFO_SendLen
XOR A,00H
SZ Z
JMP Write_FIFO_End ;;FIFO_SendLen=0 means send complete
INC MP0
MOV A,USB_MISC
MOV MP1,A
call Delay_28us
SZ R1.@MISC_Ready
JMP Write_FIFO_Loop
Write_FIFO_End:
clr wdt
JMP Write_FIFO_OK
get_descriptor_length:
clr wdt
MOV A,FIFO_WLENGTHH
XOR A,0
SNZ Z
JMP use_actual_length
MOV A,FIFO_WLENGTHL
XOR A,0
SZ Z
JMP use_actual_length
MOV A,FIFO_WLENGTHL
SUB A,data_count
SZ C ;if(FIFO_LENGTHL>data_count) c=1
JMP use_actual_length
MOV A,FIFO_WLENGTHL
MOV data_count,A
use_actual_length:
RET
control_read:
clr wdt
MOV A,data_start
MOV TBLP,A
control_read_data_stage:
clr wdt
MOV A,00H
MOV Loop_Counter,A
MOV FIFO_SendLen,A
SZ MISC.@MISC_SCMD
JMP control_read_status_stage_end
clr wdt
MOV A,OFFSET FIFO_TYPE
MOV MP0,A
MOV A,data_count
XOR A,00H
SZ Z
JMP dma_load_done ;A=00H
dma_load_loop:
clr wdt
SNZ bFlag_RD_HTable
JMP Read_Low_Bytes
Read_High_Bytes:
clr wdt
CLR bFlag_RD_HTable
TABRDL R0
INC TBLP
INC data_start
MOV A,TBLH
AND A,00111111b
MOV R0,A
XOR A,3FH
SZ Z
JMP dma_load_loop
JMP Check_Read_Length
Read_Low_Bytes:
clr wdt
SET bFlag_RD_HTable
TABRDL R0
MOV A,R0
Check_Read_Length:
clr wdt
INC MP0
INC loop_counter
INC FIFO_SendLen
DEC data_count
SZ Z
JMP wait_control_read
MOV A,loop_counter
XOR A,EP0_FIFO_SIZE
SNZ Z
JMP dma_load_loop
jmp wait_control_read
dma_load_done:
clr wdt
;SZ MISC.@MISC_SCMD
;JMP control_read_status_stage_end
CALL Send_Hand_Shake
jmp control_read_status_stage_end
wait_control_read:
clr wdt
call Check_Real_Cmd
sz bFlag_Real_Cmd
jmp control_read_status_stage_end
clr wdt
CALL FIFO0_WR_CHECK
SNZ bFlag_FIFO_Ready
JMP wait_control_read ;wait FIFO0 Ready
CALL Write_FIFO0
control_read_status_stage_end:
clr wdt
NOP
RET
;-----------------------------------------------------------
; Check_Real_Cmd : if have new cmd , set bFlag_Real_Cmd else clr bFlag_Real_Cmd
;-----------------------------------------------------------
Check_Real_Cmd:
clr wdt
clr bFlag_Real_Cmd
SZ MISC.@MISC_SCMD
set bFlag_Real_Cmd
SZ MISC.@MISC_LEN0
set bFlag_Real_Cmd
RET
;***************************************************************
; USB Stage3
; Process the request
;***************************************************************
;Set the device address to the wValue in the SETUP packet at the completion
;of the current transaction
;-----------------------------------------------------------
; Set Address
;-----------------------------------------------------------
SetAddress:
clr wdt
MOV A,FIFO_WVALUEL ;save address to FIFO_ADDR
MOV FIFO_ADDR,A
MOV FIFO_TEMP,A
MOV A,USB_SIES
MOV MP1,A
MOV A,00000001b
ORM A,R1
RLA FIFO_TEMP
AND A,0FEH
MOV FIFO_TEMP,A
MOV A,USB_AWR
MOV MP1,A
MOV A,FIFO_TEMP
MOV R1,A
NOP
CALL Send_Hand_Shake ;send a handshake with host
SET bFlag_Set_Address
;;RET ;for test
JMP USB_EP0_ISR_END
;-----------------------------------------------------------
; Set Configuration
;-----------------------------------------------------------
SetConfiguration:
;//modify windows 2000 bug
clr wdt
set USVC.7 ;unmute SPK
set PGA_CTRL.7 ;unmute MIC
MOV A,FIFO_WVALUEL
MOV USB_Configuration,A
CLR STALL
;MOV A,USB_STALL
;MOV MP1,A
;CLR R1 ;not stall
set bFlag_SetConfiguration_Ready
SetConfiguration_wait:
CALL Send_Hand_Shake
JMP USB_EP0_ISR_END
;-----------------------------------------------------------
; Set Interface
;-----------------------------------------------------------
SetInterface:
clr wdt
MOV A,FIFO_WVALUEL
MOV USB_Interface_Alt,A
MOV A,FIFO_WINDEXL
MOV USB_Interface,A
set bFlag_SetInterface_Ready
set pa.0
SetInterface_wait:
CALL Send_Hand_Shake
JMP USB_EP0_ISR_END
;-----------------------------------------------------------
; Get Interface
;-----------------------------------------------------------
GetInterface:
clr wdt
mov A,USB_Interface_Alt
mov FIFO_OUT1,A
mov A,01H
mov FIFO_SendLen,A
GetInterface_Loop:
clr wdt
call Check_Real_Cmd
sz bFlag_Real_Cmd
jmp GetInterface_End
clr wdt
call FIFO0_WR_CHECK
SNZ bFlag_FIFO_Ready
JMP GetInterface_Loop
CALL Write_FIFO0
GetInterface_End:
JMP USB_EP0_ISR_END
;-----------------------------------------------------------
; Get Status
; For Get Status (DEVICE,INTERFACE,ENDPOINT) , if self-powered and remote wakeup need to modify
; return 2 bytes (00 00)
;-----------------------------------------------------------
GetStatus:
clr wdt
mov a,02H
mov FIFO_SendLen,a
mov a,00H
mov FIFO_Out1,a
mov FIFO_Out2,a
GetStatus_Loop:
clr wdt
call Check_Real_Cmd
sz bFlag_Real_Cmd
jmp GetStatus_End
clr wdt
call FIFO0_WR_CHECK
SNZ bFlag_FIFO_Ready
JMP GetStatus_Loop
CALL Write_FIFO0
GetStatus_End:
JMP USB_EP0_ISR_END
;-----------------------------------------------------------
; Get Status (Endpoint)
;-----------------------------------------------------------
GetStatus_Endpoint:
clr wdt
mov a,02H
mov FIFO_SendLen,a
mov a,07FH
and a,FIFO_wIndexL
call GetPipeBit
mov FIFO_TEMP,a
mov a,STALL
and a,FIFO_TEMP
mov FIFO_TEMP,a
clr FIFO_Out1
sz FIFO_TEMP
set FIFO_Out1.0
clr FIFO_Out2
jmp GetStatus_Loop
GetStatus_Endpoint_End:
JMP USB_EP0_ISR_END
;-----------------------------------------------------------
; Clear Feature : The HT82A822R return ACK without ERROR
; bmRequest: 00 Device
; 02 EndPoint
; bRequest 01 CLEAR_FEATURE
; wValue 0000 clear ENDPOINT0 HALT
; 0001 clear REMOTE_WAKEUP
; wIndex 0000
; wLength 0000
;-----------------------------------------------------------
ClearFeature:
;;----2007-01-10 for Vista DTM----
mov a,FIFO_wValueL
xor a,01H
snz z
JMP SendStall0
;set b_wakeup
;clr bRmtWakeup
;;------------------------------
clr wdt
CALL Send_Hand_Shake
ClearFeature_Loop:
ClearFeature_End:
JMP USB_EP0_ISR_END
;-----------------------------------------------------------
; Clear Feature (Endpoint)
;-----------------------------------------------------------
ClearFeature_Endpoint:
clr wdt
snz bFlag_SetConfiguration_Ready
JMP SendStall0
mov a,07FH
and a,FIFO_wIndexL
call GetPipeBit
mov FIFO_TEMP,a
CPL FIFO_TEMP
mov a,STALL
AND a,FIFO_TEMP
mov STALL,a
CALL Send_Hand_Shake
ClearFeature_Endpoint_End:
JMP USB_EP0_ISR_END
;-----------------------------------------------------------
; Set Feature
;-----------------------------------------------------------
SetFeature:
;;----2007-01-10 for Vista DTM----
mov a,FIFO_wValueH
xor a,00H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -