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

📄 usb_int2.asm

📁 82K96E/82M99E开发的USB键盘接收端DEMO程序源码
💻 ASM
字号:

include		ht82k96e.inc
;include 	usbrf.inc
include		usbFIFO.inc



;"FIFO_type"
@Setup_D    EQU     7               	;direction
@INTERFACE	EQU		0
Setup_Type  EQU     60H             	;Type
Setup_Rev   EQU     1FH             	;Recipient  (Just use 2 bits)
wValueH_Typ EQU     60H     			;D6..5  Type: 0-Standard, 1-Class, 2-Vendor
wValueH_Dst EQU     1FH     			;



extern		bFLAG_SndFC		:bit			;has control pipe data to transmitter
extern		bFLAG_Setup		:bit
;extern		bFLAG_FIFO_REDY		:bit
extern		bFLAG_RsqF		:bit
;extern		bFLAG_AdrF		:bit
extern		bRmtWakeup		:bit 
extern		bhas_data_out_previous	:bit
extern		bhas_data_out_previous1	:bit
extern		bhas_data_out_previous2	:bit


extern		bsetup_flag		:bit			;there are setup cmd received	
extern		bCMD_INDEX		:bit
extern		baddr_state		:bit
extern		bKB_KeyUpt		:bit
extern		btime_out_KB	:bit
;extern		bacpi_key_chg	:bit
;extern		bmulti_key_chg	:bit
extern		breseume_s		:bit
extern		bwait_setup		:bit




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		FIFO0_Wr_Check			:near
extern		FIFO0_Rd_Check			:near
extern		FIFO1_Rd_Check			:near
extern		FIFO2_Rd_Check			:near
;extern		LEN0_Rd_Check			:near
extern		LEN0_Wr_Check			:near
;extern		ReadLen0				:near
extern		WriteLen0				:near
extern		ReadFIFO0				:near
extern		ReadFIFO1				:near
extern		ReadFIFO2				:near
extern		WriteFIFO0				:near
extern		FIFO1_Wr_Check 			:near
extern		WriteFIFO1				:near
extern		FIFO2_Wr_Check			:near
extern		WriteFIFO2				:near
;extern		moveacpidata			:near
;extern		movemultidata			:near




extern		GetPipeBit				:near
extern		clearstall				:near
extern		setstall				:near


extern		GetEnd						:near
extern		StandardRequest				:near
extern		ClassRequest				:near
extern		ReadNextCnf					:near

extern		SetLED						:near
extern		MoveKeyboardData			:near

extern		ReturnAddr					:byte
extern		FIFO_SendLen				:byte
extern		FIFO_Type					:byte
extern		KB_LED						:byte
extern		TempKBTime					:byte
extern		TempKBTime_L				:byte
extern		CMD_ADDR					:byte
extern		int_temp1					:byte


FIFO_addr		equ			int_temp1


usbint_var		.section		'data'
isr_usb_acc			db			?
isr_usb_status		db			?
isr_usb_mp1			db			?
isr_usb_mp0			db			?
isr_usb_tblp		db			?
int_reg_temp		db			?				;for store USB pipe int register




;**************************************************************************
;*			External INT subroutine
;**************************************************************************

usbExt			.Section	 AT 350H 'code'
;External interrupt service routine
EXT_START:
				clr		wdt	
				MOV     ISR_USB_ACC,A          	;Save ACC
                MOV     A,STATUS               	;Save STATUS
                MOV     isr_usb_status,A        

                MOV     A,USB_REG_BANK      	;Set bank pointer to USB control
                MOV     BP,A                	;register bank	



				MOV		A,MP1
				MOV		isr_usb_mp1,A
				mov		a,mp0
				mov		isr_USB_mp0,a
				mov		a,tblp
				mov		isr_usb_tblp,a

				clr		intc.1
				set		intc.0

				clr		FIFO_w_c_b				;use in Bread Board only
;-----------------------------------------------------------------------------------
				snz		suspend_line
				jmp		check_Access_FIFO

				mov		a,11110000b				;clear Int_reg within suspend state
				andm	a,Int_reg

				sz		resume_line
				jmp		turn_on_usb
;turn_off_usb:
;				clr		on_usb_clk			 	;turn on USB CLK	
;				set		regulator_off
				jmp		Exit_of_Ext_start
turn_on_usb:
				set		breseume_s
				set		on_usb_clk				;turn on USB CLK	
				clr		regulator_off
;-----------------------------------------------------------------------------------
;ExitExt:
Exit_of_Ext_start:

				mov		a,isr_usb_tblp
				mov		tblp,a
				mov		a,isr_usb_mp0
				mov		mp0,a
				MOV		A,isr_usb_mp1
				MOV		MP1,A	

                MOV     A,0				      	;Set bank pointer to UC
                MOV     BP,A                	;register bank	

                MOV     A,Isr_usb_status        ;Restore STATUS
                MOV     STATUS,A               	;
                MOV     A,isr_usb_acc          	;Restore ACC
				clr		intc.0
				set		intc.1
                RETI   
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
check_Access_FIFO:
				clr		breseume_s
				set		on_usb_clk				;turn on USB CLK	
				clr		regulator_off

				sz		Int_reg.@int0			
				jmp		AccessFIFO0

;other pipe except pipe0 interrupt
				mov		a,Int_reg
				sz		Int_reg_temp
				jmp		examine_int123
				and		a,00001110b
				mov		Int_reg_temp,a
examine_int123:	
				sz		Int_reg_temp.@int1				
				jmp		AccessFIFO1
				sz		Int_reg_temp.@int2
				jmp		AccessFIFO2
				sz		Int_reg_temp.@int3
				jmp		AccessFIFO3		
				jmp		Exit_of_Ext_start
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
Check_Pipe0:				
AccessFIFO0:
				set		chk_usb_reset_event		;set usb mode flag
				clr		Int_reg.@int0			;clr pipe0 int flag	

                MOV     A,USB_MISC          	;MP1 point to Misc. register
                MOV     MP1,A               	;


;------------------------------------------------------------------------------------
				sz		bwait_setup
				jmp		wait_next_setup

				snz		r1.@usb_len0
				jmp		AccessFIFO0_cont		;out, in
;------------------------------------------------------------------------------------
wait_next_setup:
                MOV     A,USB_MISC          	;MP1 point to Misc. register
                MOV     MP1,A               	;
				nop
				nop
				sz		r1.@USB_Setup
				jmp		AccessFIFO0_cont		;seup
                JMP     ExitExt0

;--------------------------------------------------------------------------------------	
AccessFIFO0_cont:
;examine FIFO0 IN, SETUP, OUT Intterupt

				snz		bhas_data_out_previous1
				jmp		AccessFIFO0_cont1
				clr		bhas_data_out_previous1
				jmp		ExitExt0
;-------------------------------------------------------------------------------
AccessFIFO0_cont1:				
				snz		bhas_data_out_previous2
				jmp		AccessFIFO0_cont11
				clr		bhas_data_out_previous2
				jmp		ExitExt0

;-------------------------------------------------------------------------------
AccessFIFO0_cont11:				


				set		bFLAG_Setup
CheckSetup:
                MOV     A,USB_MISC          	;MP1 point to Misc. register
                MOV     MP1,A               	;
				nop
				nop
				snz		r1.@USB_Setup
				clr		bFlag_setup

				snz		bFLAG_Setup
                JMP     AccessFIFO0_cont2          	;No (data stage(Host to device)
Setup_stage:
				clr		r1.@USB_Setup			;clear USB setup bit
				clr		r1.@USB_Len0
				clr		bwait_setup
				set		bsetup_flag
				jmp		Exitext0
;-------------------------------------------------------------------------------
AccessFIFO0_cont2:
                CALL    FIFO0_Rd_Check      	;Any data in FIFO 0 ?
                CLR     R1.@USB_Req         	;No: Clear request for FIFO0_Rd_Check
                SNZ     Z                  		;
                JMP     HaveDataInFIFO0     	;Yes

;Host read out data from FIFO 0
;Send next transaction data
                JMP     SendFIFO0
;----------------------------------------------------------------------------


HaveDataInFIFO0:
                JMP     DataStage           	;No (data stage(Host to device)
;-----------------------------------------------------------------------------------------
get_cmd_data:
				clr		bsetup_flag
                CALL    FIFO0_Rd_Check      	;Any data in FIFO 0 ?
                CALL    ReadFIFO0           	;Read FIFO 0

				clr		acc
				call	GetPipeBit
				call	clearstall				;clear pipe0 stall status

                CLR     bFLAG_SndFC 			;No Continue Send(ReadNextCnf)
;				clr		bFLAG_FIFO_REDY			;ignore address write
;				clr		bFLAG_AdrF
				CLR		bFLAG_RsqF				;Clear re_send Flag
                CLR     bCMD_INDEX          	;set Return address to 0
				clr		bhas_data_out_previous
				clr		bhas_data_out_previous1
				clr		bhas_data_out_previous2


                MOV     A,LOW GetEnd        	;Set Defaut Return Address
                MOV     ReturnAddr,A      		;to ReturnAddr 
;parsing request command & set command index
                MOV     A,08H               	;Request structure == 8 bytes ?
                XOR     A,FIFO_SendLen      	;
                SNZ     Z                   	;
                JMP		ToStallPipe0			;No: data length is invalid
;Parsing command                            	;Yes: Parsing  command
                MOV     A,Setup_Type        	;Type
                AND     A,FIFO_Type        		;Request Type
;!!!!! Need in same page
                SWAP    ACC                 	;Need be change when Setup_Type
                RR      ACC                 	;changed
usb_request_pcl_5:
                ADDM    A,PCL
                JMP     StandardRequest     	;Standard Request
                JMP     ClassRequest        	;Class Specific Request
                JMP		ToStallPipe0        	;No support Vendor Request
                JMP		ToStallPipe0        	;Illegal
;----------------------------------------------------------------------------

;Host has read data out from FIFO 0
SendFIFO0:
				sz		bsetup_flag
                JMP     ExitExt0

                CALL    FIFO0_Wr_Check       	;examine whether FIFO0 has data?
				clr		r1.@USB_Req 
                SZ      Z                   	;
				JMP		ExitExt0

;examine whehter has data output
  												;Write address to USB_ADDR_WAKE

NoneTag:
                SnZ     bFLAG_SndFC 				;Continue Send (ReadNextCnf)
                JMP     ExitExt0
				snz		bhas_data_out_previous
	            JMP     ReadNextCnf				;
				clr		bhas_data_out_previous
				jmp		ExitExt0
;----------------------------------------------------------------------------
DataStage:
				sz		bsetup_flag
                JMP     get_cmd_data
                CALL    FIFO0_Rd_Check      	;Any data in FIFO 0 ?
                CALL    ReadFIFO0           	;Read FIFO 0
                sz		bCMD_INDEX            	;
				jmp		Set_SetOutput
				jmp		RedundantData

RedundantData:
                JMP     ExitExt0
Set_SetOutput:
                MOV     A,FIFO_SendLen         	;Is length == 1 ?
                XOR     A,01H                   ;
                SNZ     Z                       ;
                JMP		ToStallPipe0            ;No
                MOV     A,FIFO_TYPE            	;Output report (LED)
                MOV     KB_LED,A                ;
	            CALL    SetLED                  ;Set all keyboard LED
				clr     bCMD_INDEX             	;Reset to 0
                JMP     SendHandShake
;----------------------------------------------------------------------------
RequestResponse:
                CLR     bFLAG_RsqF
                CALL    FIFO0_Wr_Check  		;Ready to response ?
                SNZ     Z               		;
				JMP		CanResponse
				clr		r1.@USB_Req 

				sz		r1.@usb_len0
                JMP     ExitExt0    			;continue to scan keyboard				
				sz		r1.@USB_Setup
				jmp		ExitExt0    			;continue to scan keyboard
				jmp		RequestResponse
CanResponse:
                CALL    WriteFIFO0
				set		bhas_data_out_previous
				set		bhas_data_out_previous1
				set		bhas_data_out_previous2
				jmp		ExitExt0

;----------------------------------------------------------------------------
SendHandShake:
                CALL    LEN0_Wr_Check       	;FIFO0 ready ?
                SnZ     Z                   	;
				jmp		sendHandShake_continue
				clr		r1.@USB_Req 

				sz		r1.@usb_len0
                JMP     ExitExt0    			;continue to scan keyboard				
				sz		r1.@USB_Setup
				jmp		ExitExt0    			;continue to scan keyboard
				jmp		sendHandshake
sendHandshake_continue:
                CALL    WriteLen0           	;ACK (Write 0 length)
;				SZ		bFLAG_FIFO_REDY
;				SET		bFLAG_AdrF				;the address response is written to FIFO
;				CLR		bFLAG_FIFO_REDY
				set		bwait_setup
                JMP     ExitExt0    			;continue to scan keyboard

;----------------------------------------------------------------------------
SendFIFOOut:
                MOV     FIFO_SendLen ,A    		;data length to send
				set		bwait_setup
				jmp		RequestResponse
;----------------------------------------------------------------------------
ToStallPipe0:
				clr		acc
				call	GetPipeBit
				call	setstall
ExitExt:
ExitExt0:
				clr		Int_reg.@int0			;clr pipe0 int flag	
				jmp		Exit_of_Ext_start
;----------------------------------------------------------------------------
Check_Pipe1:
AccessFIFO1:

				sz     	bCMD_INDEX             	;Reset to 0
				jmp		ExitExt1

                CALL    FIFO1_Wr_Check       	;FIFO0 ready ?
				clr		r1.@USB_Req 
                SZ      Z                   	;
				JMP		ExitExt1

				sz		bKB_KeyUpt
				jmp		report_pipe1_data
				jmp		ExitExt1


report_pipe1_data:
				clr		bKB_KeyUpt				
	            CALL    MoveKeyboardData   	;Update it

out_fifo1_data:
                CALL    FIFO1_Wr_Check       	;FIFO0 ready ?
				mov		a,8
				mov		FIFO_SendLen,a	
	            CALL    WriteFIFO1

				clr		btime_out_KB
				clr		TempKBTime
				clr		tempkbtime_L


ExitExt1:
				clr		int_reg.@int1
				clr		int_reg_temp.@int1	
				JMP		Exit_of_Ext_start	

;----------------------------------------------------------------------------
Check_Pipe2:
AccessFIFO2:
				sz     	bCMD_INDEX             	;Reset to 0
				jmp		ExitExt2

ExitExt2:
				clr		int_reg.@int2
				clr		int_reg_temp.@int2	
				JMP		Exit_of_Ext_start	

;----------------------------------------------------------------------------
Check_Pipe3:
AccessFIFO3:
				clr		int_reg.@int3
				clr		int_reg_temp.@int3	
				JMP		Exit_of_Ext_start	
;----------------------------------------------------------------------------


public	ToStallPipe0
public	SendFIFOOut
public	SendHandShake
public	RequestResponse
public	usb_request_pcl_5
public	ext_start
public	ExitExt	
END

⌨️ 快捷键说明

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