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

📄 main.asm

📁 Holtek ht82a832r USB-PHONE DEMO 源码 ht82a832r 是Holtek开发的USB-PHONE 的OTP SOC芯片,信价比很高
💻 ASM
📖 第 1 页 / 共 2 页
字号:

		set 		UCC.@UCC_USBCKEN
		nop
		set		USC.@USC_V33C		;//pc 開始送 command 過來

			
		if	AUDIO_8K
			set		MODE_CTRL.3
		endif
		
	
	;-----------------------------------------------------------
	;初始化按键处理指令
	;-----------------------------------------------------------
		clr		CMD_SCount
		mov		A,OFFSET CMD_Buf
		mov		CMD_SPtr,A

		clr		Key_Count
		mov		A,OFFSET Key_Buf
		mov		Key_ptr,A
		
		clr 		wdt		
		RET
		
;***************************************************************
;		Timer_0_ISR
;		1.Timer time = 21.2 ms
;		2.Do this procedure is 3.6ms
;***************************************************************
Timer_0_ISR:	
		clr		TMR0C.4
		MOV		isr_tmr0_acc,A		;save ACC
		MOV		A,STATUS
		MOV		isr_tmr0_status,A	;save status
		MOV		A,MP1
		MOV		isr_tmr0_mp1,A		;save mp1
		MOV		A,MP0
		MOV		isr_tmr0_mp0,A		;save mp0
		MOV		A,TBLP
		MOV		isr_tmr0_tblp,A		;save TBLP
		
Timer_0_My_Function:
	;-----------------------------------------------------------
	; Here to add your another code !!
	;-----------------------------------------------------------
		NOP		
		clr wdt
		
Timer_0_ISR_END:		
		MOV		A,isr_tmr0_tblp		;restore TBLP
		MOV		TBLP,A
		MOV		A,isr_tmr0_mp0		;restore MP0
		MOV		MP0,A
		MOV		A,isr_tmr0_mp1		;restore MP1
		MOV		MP1,A
		MOV		A,isr_tmr0_status	;restore STATUS
		MOV		STATUS,A
		MOV		A,isr_tmr0_acc		;restore ACC
		SET		TMR0C.4			;start timer0

		RETI

;***************************************************************
;		Timer_1_ISR
;		1.Timer time = 21.2 ms
;		2.Do this procedure is 3.6ms
;***************************************************************
Timer_1_ISR:
		CLR		TMR1C.4


		MOV		isr_tmr1_acc,A		;save ACC
		MOV		A,STATUS
		MOV		isr_tmr1_status,A	;save status
		MOV		A,MP1
		MOV		isr_tmr1_mp1,A		;save mp1
		MOV		A,MP0
		MOV		isr_tmr1_mp0,A		;save mp0
		MOV		A,TBLP
		MOV		isr_tmr1_tblp,A		;save TBLP
		
		clr wdt	
		SET		TMR1_KEY_FG
		;IF	UseMediaKey
		;call		Key_Debounced
		;ENDIF
		call		Run_Volume_Step

		call		KeyScanProcess		;键盘按键扫描
		

		MOV		A,isr_tmr1_tblp		;restore TBLP
		MOV		TBLP,A
		MOV		A,isr_tmr1_mp0		;restore MP0
		MOV		MP0,A
		MOV		A,isr_tmr1_mp1		;restore MP1
		MOV		MP1,A
		MOV		A,isr_tmr1_status	;restore STATUS
		MOV		STATUS,A
		MOV		A,isr_tmr1_acc		;restore ACC

Timer_1_ISR_End:
		SET		TMR1C.4
		RETI

;***************************************************************
;		USB_ISR : USB Interrupt Routine
;		1.Back up every status register
;		2.check which endpoint is interrupt
;***************************************************************
USB_ISR:
		CLR		INTC0.@INTC0_EEI	;disable USB interrupt
		;modify 2006-09-11
		;SET		INTC0.@INTC0_EMI

		MOV		isr_usb_acc,A		;save ACC
		MOV		A,STATUS
		MOV		isr_usb_status,A	;save status
		MOV		A,MP1
		MOV		isr_usb_mp1,A		;save mp1
		MOV		A,MP0
		MOV		isr_usb_mp0,A		;save mp0
		MOV		A,TBLP
		MOV		isr_usb_tblp,A		;save TBLP

		
		clr wdt
		;;Check Which FIFO is interrupt
		JMP		Check_Access_FIFO		



USB_ISR_END:
		MOV		A,isr_usb_tblp		;restore TBLP
		MOV		TBLP,A
		MOV		A,isr_usb_mp0		;restore MP0
		MOV		MP0,A
		MOV		A,isr_usb_mp1		;restore MP1
		MOV		MP1,A
		MOV		A,isr_usb_status	;restore STATUS
		MOV		STATUS,A
		MOV		A,isr_usb_acc		;restore ACC

		;modify 2006-08-18
		;CLR		INTC0.@INTC0_EMI
		SET		INTC0.@INTC0_EEI


		RETI


;***************************************************************
;		USB_EPX_ISR
;		之前使用 USR@EP0IF EQU	[01BH].0 判別會偵測不到
;		更改成   USB_STATUS_CONTROL.@EP0IF
;***************************************************************
Check_Access_FIFO:
		clr wdt	
		SZ		USR.@USR_EP0F
		JMP		USB_EP0_ISR
		SZ		USR.@USR_EP1F
		JMP		USB_EP1_ISR
		SZ		USR.@USR_EP2F
		JMP		USB_EP2_ISR
		SZ		USR.@USR_EP3F
		JMP		USB_EP3_ISR
		SZ		USR.@USR_EP4F
		JMP		USB_EP4_ISR

		JMP		USB_ISR_END

;-----------------------------------------------------
;EPNPOINT 0
;-----------------------------------------------------
USB_EP0_ISR:
		;modify 2006-07-27
		;CLR		USR.@USR_EP0F	;Fix Bus Enumeration Stress

;;case1
		SZ		MISC.@MISC_SCMD			;check setup token      
		JMP		USB_EP0_SETUP_TOKEN                                     
                
		SZ		MISC.@MISC_LEN0			;check out ack token    
		JMP		USB_EP0_OUT_ACK_TOKEN                                   

		CALL		FIFO0_RD_CHECK                                          
		SZ		bFlag_FIFO_Ready                                        
		JMP		USB_EP0_OUT_TOKEN 
		;clr		MISC.@MISC_REQ

		CALL		FIFO0_WR_CHECK                                          
		SZ		bFlag_FIFO_Ready                                        
		JMP		USB_EP0_IN_TOKEN		;else is in token       
		;clr		MISC.@MISC_REQ

		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume

  		JMP		USB_EP0_ISR_END   


;;case2
;;		SZ		MISC.@MISC_SCMD			;check setup token      
;;		JMP		USB_EP0_SETUP_TOKEN                                     
;;                
;;		SZ		MISC.@MISC_LEN0			;check out ack token    
;;		JMP		USB_EP0_OUT_ACK_TOKEN                                   
;;
;;		CALL		FIFO0_RD_CHECK                                          
;;		SZ		bFlag_FIFO_Ready                                        
;;		JMP		USB_EP0_OUT_TOKEN 
;;		;clr		MISC.@MISC_REQ
;;
;;		CALL		FIFO0_WR_CHECK                                          
;;		SZ		bFlag_FIFO_Ready                                        
;;		JMP		USB_EP0_IN_TOKEN		;else is in token       
;;		;clr		MISC.@MISC_REQ
;;
;;
;;  		JMP		USB_EP0_ISR_END   


;;case3
;;		call		FIFO0_RD_CHECK
;;		sz		bFlag_FIFO_Ready
;;		jmp		Have_Data_Out
;;		
;;		call		FIFO0_WR_CHECK
;;		sz		bFlag_FIFO_Ready
;;		jmp		USB_EP0_IN_TOKEN
;;		
;;		jmp		USB_EP0_ISR_END
;;
;;Have_Data_Out:
;;		sz		MISC.@MISC_SCMD
;;		jmp		USB_EP0_SETUP_TOKEN
;;		sz		MISC.@MISC_LEN0
;;		jmp		USB_EP0_OUT_ACK_TOKEN
;;		
;;		jmp		USB_EP0_OUT_TOKEN





USB_EP0_SETUP_TOKEN:					;PARSE SETUP TOKEN
		clr wdt
		CALL		StageOne
		;Clear OutToken 的剩余中断
		CLR		bFlag_OutTokenRemainInt
		;保存指定的大小
		kmov		Data_Length,FIFO_wLengthL
		JMP		USB_EP0_ISR_END

USB_EP0_IN_TOKEN:
		clr wdt
		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume
		CALL		control_read
		JMP		USB_EP0_ISR_END

USB_EP0_OUT_ACK_TOKEN:
		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume
		clr wdt
		clr		MISC.@MISC_LEN0
;;		call		Delay_3us
		JMP		USB_EP0_ISR_END
		


USB_EP0_OUT_TOKEN:
		;modify 2006-08-28
		CLR		USR.@USR_EP0F	;Fix OHCI Volume
		clr wdt
		clr		acc
		xor		a,nCmdIndex1
		sz		z
		jmp		USB_EP0_ISR_END

USB_EP0_OUT_TOKEN_Loop:
		clr wdt
		CALL		Check_Real_Cmd
		sz		bFlag_Real_Cmd
		jmp		USB_EP0_OUT_TOKEN_End

		clr wdt	
		CALL		FIFO0_RD_CHECK
		SNZ		bFlag_FIFO_Ready
		JMP		USB_EP0_OUT_TOKEN_Loop

		SZ		bFlag_OutTokenRemainInt
		JMP		USB_EP0_OUT_TOKEN_ReadRemain

		MOV		A,OFFSET FIFO_TYPE
		MOV		Data_RStart,A
		CLR		DATA_RCount
		SET		bFlag_OutTokenRemainInt		;首次终端中,设定标记下次为剩余数据的中断
		
		
		CALL		READ_FIFO0_EX

		CALL		Send_Hand_Shake
		
		JMP		USB_EP0_OUT_TOKEN_ReadDoneCheck
USB_EP0_OUT_TOKEN_ReadRemain:
		CALL		READ_FIFO0_EX

		CALL		Send_Hand_Shake

USB_EP0_OUT_TOKEN_ReadDoneCheck:
								;根据Setup阶段的数据包确定Data阶段的数据大小检查是否已经完成
		MOV		A,Data_Length
		XOR		A,Data_RCount
		SNZ		Z
		JMP		USB_EP0_OUT_TOKEN_End
		
USB_EP0_OUT_TOKEN_ReadDone:	;数据接收完毕
		NOP
		;为了与原先的处理流程兼容将Data_Buf的数据保存到FIFO中,

		MOV		A,OFFSET Data_Buf
		MOV		MP0,A
		MOV		A,OFFSET FIFO_Type
		MOV		MP1,A

		MOV		A,8
		MOV		Loop_Counter,A

USB_EP0_OUT_TOKEN_COPYFIFO:
		MOV		A,R0
		MOV		R1,A

		INC		MP0
		INC		MP1

		DEC		Loop_Counter
		SNZ		Z
		JMP	USB_EP0_OUT_TOKEN_COPYFIFO
		

		;decode command
		;//parse Cmd , 21H = SetReport Out Data
		mov		a,21H
		xor		a,nCmdIndex1
		sz		z
		jmp		ProcessOutData

		;//parse Cmd , 18H = Speaker Mute Control
		mov		a,18H
		xor		a,nCmdIndex1
		sz		z
		jmp		Implement_Speaker_Mute

		;//parse Cmd , 19H = Mic Mute Control
		mov		a,19H
		xor		a,nCmdIndex1
		sz		z
		jmp		Implement_Mic_Mute


		;//parse Cmd , 28H = Speaker Volume Control
		mov		a,28H
		xor		a,nCmdIndex1
		sz		z
		jmp		Implement_Speaker_Volume

		;//parse Cmd , 29H = Mic Volume Control
		mov		a,29H
		xor		a,nCmdIndex1
		sz		z
		jmp		Implement_Mic_Volume



		;//unknow command
		jmp		USB_EP0_OUT_TOKEN_End
		
USB_EP0_OUT_TOKEN_End:
		clr		nCmdIndex1
		JMP		USB_EP0_ISR_END


Implement_Speaker_Mute:
		clr wdt
		sz		FIFO_out1.0
		clr		USVC.7			;mute
		snz		FIFO_out1.0
		set		USVC.7			;unmute

		sz		FIFO_out1.0
		set		bFlag_Audio_Mute	;mute
		snz		FIFO_out1.0
		clr		bFlag_Audio_Mute	;unmute

		snz		bFlag_Audio_Mute
		jmp		Implement_Speaker_Mute_1
		
		mov		a,Min_Volume
		mov		USVC,a
		
		clr		USVC.7
		
		
Implement_Speaker_Mute_1:
		jmp		USB_EP0_OUT_TOKEN_End


Implement_Mic_Mute:
		clr wdt
		sz		FIFO_OUT1.0
		clr		PGA_CTRL.7	;mute
		snz		FIFO_OUT1.0
		set		PGA_CTRL.7	;unmute
		
		sz		FIFO_out1.0
		set		bFlag_Mic_Mute	;mute
		snz		FIFO_out1.0
		clr		bFlag_Mic_Mute	;unmute
		
		
		jmp		USB_EP0_OUT_TOKEN_End
		

		

Implement_Speaker_Volume:
		clr wdt
		kmov		VolumeH_Save,FIFO_out1
		kmov		VolumeL_Save,FIFO_out2
Implement_Speaker_Volume_End:
		jmp		USB_EP0_OUT_TOKEN_End		

Implement_Mic_Volume:
		clr wdt
		mov		a,7FH
		xor		a,FIFO_OUT2
		sz		z
		jmp		Implement_Mic_Volume_Set_Max
				
		mov		a,80H
		xor		a,FIFO_OUT2
		sz		z
		jmp		Implement_Mic_Volume_Set_Min
	
		kmov		FIFO_TEMP,FIFO_OUT2
		jmp		Implement_Mic_Volume_1
		
Implement_Mic_Volume_Set_Max:		
		clr wdt
		kmov		FIFO_TEMP,MIC_Max_Volume
		jmp		Implement_Mic_Volume_1
Implement_Mic_Volume_Set_Min:		
		clr wdt
		kmov		FIFO_TEMP,MIC_Min_Volume
		jmp		Implement_Mic_Volume_1
Implement_Mic_Volume_1:
		clr wdt
		mov		a,80H
		and		a,PGA_CTRL
		
		or		a,FIFO_TEMP
		mov		PGA_CTRL,a
Implement_Mic_Volume_End:
		jmp		USB_EP0_OUT_TOKEN_END

USB_EP0_ISR_END:
		;modify 2006-07-27
		;CLR		USR.@USR_EP0F		;Fix Bus Enumeration Stress
		JMP		USB_ISR_END
;-----------------------------------------------------
;EPNPOINT 1 Interrupt
;-----------------------------------------------------
USB_EP1_ISR:
		;check the data is in fifo ?
		;CALL		FIFO1_RD_CHECK
		;SNZ		bFlag_FIFO_Ready
		;JMP		USB_EP1_ISR_END
		;CALL		Read_FIFO1

		;;CALL		FIFO1_WR_CHECK
		;;SNZ		bFlag_FIFO_Ready
		;;JMP		USB_EP1_ISR_END
		;;MOV		A,00H
		;;MOV		FIFO_OUT1,A
		;;MOV		A,01H
		;;MOV		FIFO_SendLen,A
		;;CALL		WRITE_FIFO1	

		;JMP		USB_EP1_ISR_END
	
		;准备写入数据
		;检查是否需要被写入的数据
		SZ		CMD_SCount
		JMP		USB_EP1_ISR_Write
		JMP		USB_EP1_ISR_END
USB_EP1_ISR_Write:
		CALL		FIFO1_WR_CHECK
		SNZ		bFlag_FIFO_Ready
		JMP		USB_EP1_ISR_END

		;将CMD_Buf的数据发送出去
;----------------------------------------------------------------------
; EP1_InData:
;  EP1在收到IN Token后调用该函数,返回CMD_SPtr, CMD_SCount 指定的数据
;  若数据
;
;----------------------------------------------------------------------		
EP1_InData:
		clr wdt	
EP1_InData_stage:
		clr wdt	
		MOV		A,0H
		MOV		Loop_Counter,A			;本次发送的字节数
		MOV		FIFO_SendLen,A

		;
		;1)将数据保存到FIFO_OUT
		;2)再将数据写入到FIFO
		;
		

		MOV		A,CMD_SCount			;检查是否仍有待处理数据
		XOR		A,00H
		SZ		Z
		JMP		USB_EP1_ISR_END			;A=00H

		MOV		A,CMD_SPtr
		MOV		MP0,A
								;准备装载数据到内存
EP1_InData_dma_load_loop:
		SET		MISC.@MISC_REQ
EP1_Write_FIFO_Loop:
		
		clr wdt	
		MOV		A,CMD_SCount
		XOR		A,00H
		SZ		Z
		JMP		EP1_Write_FIFO_End

		MOV		A,USB_FIFO1
		MOV		MP1,A 

		MOV		A,R0
		MOV		R1,A
		DEC		CMD_SCount
		
		INC		CMD_SPtr

		MOV		A,CMD_SCount
		XOR		A,00H
		SZ		Z
		JMP		EP1_Write_FIFO_End		;FIFO_SendLen=0 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -