⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function.asm

📁 Holtek audio decoder , Dongle 参考范例
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*********************************************************************
;	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 + -