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

📄 usb_oper.asm

📁 holtek mouse usb asm. FW
💻 ASM
📖 第 1 页 / 共 2 页
字号:
INCLUDE		DONGLE.INC


PUBLIC		INIT_USB
PUBLIC		USB_ROUTINE
PUBLIC		WRITE_FIFO2
PUBLIC		WRITE_FIFO2X
PUBLIC		WRITE_FIFO2XX

PUBLIC		WRITE_FIFO1
PUBLIC		WRITE_FIFO1_ALLZERO
PUBLIC		USB_CONFIGURATION_DONE
PUBLIC		FIFO_WF
PUBLIC		FIFO_WF1
PUBLIC		NOT_BOOT_TYPE
EXTERN		RF_KDATA_GOT:BIT
EXTERN		RF_MDATA_GOT:BIT

USB_OPERDATA	.SECTION	'DATA'

EP0_READY				DBIT
EP1_READY				DBIT
EP2_READY				DBIT
USB_CONFIGURATION_DONE	DBIT
ZERO_IN_TOKEN_REQUIRED	DBIT
USB_SUSPENDED			DBIT
FIFO_WF					DBIT
FIFO_WF1				DBIT
NOT_BOOT_TYPE			DBIT

USB_LCOUNT				DB			?
USB_DATALENGTH			DB			?

BYTE_REST				DB			?
BYTE_POS				DB			?
BYTE_SADDR				DB			?	
USB_SUSPEND_CNT			DB			?	

BIGGER_THAN_8_TEMP		DB	?

USB_OPERCODE	.SECTION	'CODE'

INIT_USB:

			MOV		A, 040H				;Clear SCC options
			MOV		SCC, A				;Select 6MHz

			CLR		USR.4				;Necessary steps; to ensure the interface selection
			CLR		USR.5				;is the correct one

			MOV		A, STALL
			MOV		MP1, A
			CLR		ID1.1
			CLR		ID1.2

			CLR		USR.4				;NOT SELECT PS/2 INTERFACE
			SET		USR.5				;SELECT USB INTERFACE
			SET		USR.7				;USB MODE
			CLR		SUSP2
			SET		SCC.3				;TURN USB CLOCK

			MOV		A, 041H
			MOV		MP1, A
			MOV		A, 06H
			MOV		ID1, A

			CLR		EP1_READY
			CLR		EP2_READY

			RET

USB_ROUTINE:
			SNZ		USBF		;CHECK IF THERE IS ANY USB EVENT, IF NO,
			JMP		EXIT_USB_ROUTINE;THEN EXIT USB ROUTINE
			
			SZ		URST		;CHECK IF USB RESET SIGNAL IS RECEIVED,
			JMP		HANDLE_USBRST	;IF SO, HANDLE IT 

			SZ		SUSP
			JMP		HANDLE_SUSPEND	;IF SUSPEND STATUS IS DETECTED, PROCESS IT

			SZ		RESUME
			JMP		HANDLE_RESUME	

			SZ		EP0IF		;CHECK IF THERE IS ANY USB PACKET SENT BY PC,
			JMP		HANDLE_EP0	;IF SO, HANDLE IT

			SZ		EP1IF		;CHECK IF THE HOST HAS ACCESS THE EP1,
			JMP		HANDLE_EP1	;IF SO, MEANS THAT WE CAN PUT MORE DATA TO THE FIFO1

			SZ		EP2IF		;CHECK IF THE HOST HAS ACCESS THE EP2,
			JMP		HANDLE_EP2	;IF SO, MEANS THAT WE CAN PUT MORE DATA TO THE FIFO2
					

			JMP		EXIT_USB_ROUTINE

	HANDLE_RESUME:
			CLR		USB_SUSPENDED
			SET		USBCKEN
			JMP		EXIT_USB_ROUTINE

	HANDLE_SUSPEND:
			INC		USB_SUSPEND_CNT
			MOV		A, 00FH
			XOR		A, USB_SUSPEND_CNT
			SZ		ACC
			JMP		EXIT_USB_ROUTINE

			SET		USB_SUSPENDED
			CLR		USBCKEN
			JMP		EXIT_USB_ROUTINE
			

	HANDLE_EP1:
			CLR		EP1IF
			SET		EP1_READY
			
			JMP		EXIT_USB_ROUTINE

	HANDLE_EP2:
			CLR		EP2IF
			SET		EP2_READY
			
			JMP		EXIT_USB_ROUTINE

	HANDLE_USBRST:
			CLR		EP0IF
			CLR		EP1IF
			CLR		EP2IF

			CLR		EP0_READY
			CLR		EP1_READY
			CLR		EP2_READY
			CLR		USB_CONFIGURATION_DONE
			CLR		ZERO_IN_TOKEN_REQUIRED
			CLR		USB_SUSPENDED
			SET		USBCKEN
			CLR		USB_SUSPEND_CNT
			SET		NOT_BOOT_TYPE
			CLR		URST

	EXIT_USB_ROUTINE:
			CLR		USBF

			RET


HANDLE_EP0:

			MOV		A, MISC
			MOV		MP1, A

			SNZ		ID1.SCMD
			JMP		CHECK_IF_INTOKEN

			JMP		EP0_SETUPHANDLE

			JMP		EXIT_HANDLE_EP0

	CHECK_IF_INTOKEN:
			MOV		A, SIE
			MOV		MP1, A

			SNZ		ID1.IN			;CHECK IF ANY USB OUT-TOKEN IS RECEIVED
			JMP		CHECK_IF_EP0_OUTTOKEN

			CALL	EP0_INHANDLE			;IF SO, HANDLE IT.
			JMP		EXIT_HANDLE_EP0

	CHECK_IF_EP0_OUTTOKEN:
			CALL	CHECK_EP0_FIFO_READY
			SZ		EP0_READY
			JMP		EP0_OUTHANDLE
			;SZ		ID1.OUT			;CHECK IF ANY USB IN-TOKEN IS RECEIVED
			;JMP		EP0_OUTHANDLE		;IF SO, HANDLE IT.
		
			JMP		EXIT_HANDLE_EP0

	EP0_SETUPHANDLE:
			CLR		ID1.SCMD
			CALL	READ_FIFO0			;READ IN USB SETUP-TOKEN PACKET
			CALL	EP0_SETPACKET_ANALY		;ANALYIZE WHAT THE HOST WANT TO

			JMP		EXIT_HANDLE_EP0

	EP0_OUTHANDLE:
			;SNZ		ID1.LEN0
			CALL	READ_FIFO0
			CLR		EP0_READY
			CLR		ID1.OUT

			SNZ		ZERO_IN_TOKEN_REQUIRED
			JMP		EXIT_HANDLE_EP0

			CLR		ZERO_IN_TOKEN_REQUIRED
			CALL	WRITE_LEN0_TOFIFO0

	EXIT_HANDLE_EP0:

			CLR		EP0IF

			JMP		EXIT_USB_ROUTINE

EP0_SETPACKET_ANALY:

			MOV		A, EP0_BUFF
			MOV		MP0, A

			MOV		A, ID0
			AND		A, 060H

			XOR		A, 00H	
			SZ		ACC
			JMP		NEXT_CHECK_EP0_0

			;THIS IS THE HOTS-TO-DEVICE, STANDARD COMMAND

			INC		MP0
			MOV		A, ID0

			CLR		[0EH].4
			ADDM	A, PCL
			JMP		EXIT_EP0_OUTPACKET_ANALY	;0:GET_STATUS
			JMP		SETCLR_FEATURE			;1:CLEAR_FEATURE
			JMP		EXIT_EP0_OUTPACKET_ANALY	;2:RESERVED
			JMP		SETCLR_FEATURE			;3:SET_FEATURE
			JMP		EXIT_EP0_OUTPACKET_ANALY	;4:RESERVED
			JMP		SET_ADDRESS						;5:SET_ADDRESS
			JMP		GET_DESCRIPTOR			;6:GET_DESCRIPTOR
			JMP		EXIT_EP0_OUTPACKET_ANALY	;7:SET_DESCRIPTOR
			JMP		EXIT_EP0_OUTPACKET_ANALY	;8:GET_CONFIGURATION
			JMP		SET_CONFIGURATION		;9:SET_CONFIGURATION
			JMP		EXIT_EP0_OUTPACKET_ANALY	;A:GET_INTERFACE
			JMP		EXIT_EP0_OUTPACKET_ANALY	;B:SET_INTERFACE
			JMP		EXIT_EP0_OUTPACKET_ANALY	;C:SYNCH_FRAME

			;THIS IS HOTS-TO-DEVICE, STANDARD, SET/CLEAR_CONFIGURATION COMMAND
	SETCLR_FEATURE:
			SZ		USB_CONFIGURATION_DONE
			SET		[0EH].4
			MOV		A, STALL
			MOV		MP1, A
	
			CLR		ID1.STALL0						

			CALL	WRITE_LEN0_TOFIFO0


			JMP		EXIT_EP0_OUTPACKET_ANALY


			;THIS IS HOTS-TO-DEVICE, STANDARD, SET_ADDRESS COMMAND
	SET_ADDRESS:
			SZ		USB_CONFIGURATION_DONE	
			SET		[0EH].4
			CLR		BYTE_REST

			MOV		A, SIE
			MOV		MP1, A
			MOV		A, 01H
			ORM		A, ID1

			MOV		A, AWR
			MOV		MP1, A			

			INC		MP0
			MOV		A, ID0
			RL		ACC
			AND		A, 0FEH
			MOV		ID1, A
			
			CALL	WRITE_LEN0_TOFIFO0
			
			JMP		EXIT_EP0_OUTPACKET_ANALY

			;THIS IS HOTS-TO-DEVICE, STANDARD, SET_CONFIGURATION COMMAND
	SET_CONFIGURATION:
			SZ		USB_CONFIGURATION_DONE
			SET		[0EH].4
			CALL	WRITE_LEN0_TOFIFO0

			;SET		USB_CONFIGURATION_DONE

			JMP		EXIT_EP0_OUTPACKET_ANALY


			;THIS IS HOST-TO-DEVICE, STANDARD, GET_DESCRIPTOR COMAND
	GET_DESCRIPTOR:
			;SZ		USB_CONFIGURATION_DONE
			;SET		[0EH].4
			INC		MP0
			INC		MP0

			MOV		A, ID0
			AND		A, 0F0H
			SZ		ACC
			JMP		HANDLE_REPORT_DESCRIPTOR

			MOV		A, ID0
			DEC		ACC

			JMP		DESCR_SWITCH

	HANDLE_REPORT_DESCRIPTOR:
		
			MOV		A, ID0
			AND		A, 00FH
			ADD		A, 006H
			INC		MP0
			ADD		A, ID0

	DESCR_SWITCH:
			ADDM	A, PCL
			JMP		GET_DEVICE_DESCR		;1:GET DEVICE DESCRIPTOR
			JMP		GET_CONFIGURATION_DESCR		;2:GET CONFIGURATION DESCRIPTOR
			JMP		GET_STRING_DESCR		;3:GET STRING DESCRIPTOR
			JMP		EXIT_EP0_OUTPACKET_ANALY	;4:GET INTERFACE DESCRIPTOR
			JMP		EXIT_EP0_OUTPACKET_ANALY	;5:GET ENDPOINT DESCRIPTOR
			JMP		EXIT_EP0_OUTPACKET_ANALY	;6:GET DEVICE QUALIFIER DESCRIPTOR (NOT SUPPORTED)
			JMP		EXIT_EP0_OUTPACKET_ANALY	;7:GET OTHER SPEED CONFIGURATION DESCRIPTOR (NOT SUPPORTED)
			JMP		EXIT_EP0_OUTPACKET_ANALY	;8:GET INTERFACEPOWER DESCRIPTOR (NOT SUPPORTED)
			JMP		GET_KB_REPORT_DESCR		;9:GET KEYBOARD REPORT DESCRIPTOR
			JMP		GET_MICE_REPORT_DESCR		;A:GET MOUSE REPORT DESCRIPTOR

	GET_DEVICE_DESCR:
			SZ		USB_CONFIGURATION_DONE
			SET		[0EH].4
			INC		MP0
			INC		MP0
			INC		MP0
		
			CLR		CARRY
			MOV		A, ID0
			MOV		BYTE_REST, A
			MOV		A, DEVICE_DESCR_LENGTH
			SUBM	A, BYTE_REST
			SZ		CARRY
			JMP		TAKE_ID0_DEVICE_DESCR
		
			MOV		BYTE_REST, A
			JMP		DEVICE_DESCR_NEXT

	TAKE_ID0_DEVICE_DESCR:
			MOV		A, ID0
			MOV		BYTE_REST, A	

	DEVICE_DESCR_NEXT:
			CLR		BYTE_POS
			MOV		A, LOW DEVICED
			MOV		BYTE_SADDR, A
			MOV		TBLP, A
			CALL	WRITE_FIFO0
		

			JMP		EXIT_EP0_OUTPACKET_ANALY

	GET_CONFIGURATION_DESCR:
			SZ		USB_CONFIGURATION_DONE
			SET		[0EH].4
			INC		MP0
			INC		MP0
			INC		MP0
		
			MOV		A, ID0
			MOV		BYTE_REST, A

			MOV		A, 0FFH
			XOR		A, BYTE_REST
			SZ		ACC
			JMP		CONFIGURATION_DESCR_NEXT

			MOV		A, ALL_CONFIGURATION_LENGTH
			MOV		BYTE_REST, A
		
	CONFIGURATION_DESCR_NEXT:
			CLR		BYTE_POS
			MOV		A, LOW CONFIGURATIOND
			MOV		BYTE_SADDR, A
			MOV		TBLP, A
			CALL	WRITE_FIFO0
		

			JMP		EXIT_EP0_OUTPACKET_ANALY

	GET_STRING_DESCR:
			SZ		USB_CONFIGURATION_DONE
			SET		[0EH].4
			DEC		MP0

			MOV		A, ID0
			SZ		ACC
			JMP		SEND_PRODUCTS

			MOV		A, LANGID_LENGTH
			MOV		BYTE_REST, A
			MOV		A, LOW LANGID
			MOV		TBLP, A
			JMP		STRING_DESCR_NEXT

	SEND_PRODUCTS:
			MOV		A, STRING_DESCR_LENGTH
			MOV		BYTE_REST, A
			MOV		A, LOW PRODUCTS
			MOV		TBLP, A

	STRING_DESCR_NEXT:
			CLR		BYTE_POS
			MOV		BYTE_SADDR, A
			CALL	WRITE_FIFO0
		

			JMP		EXIT_EP0_OUTPACKET_ANALY

	GET_KB_REPORT_DESCR:
			SZ		USB_CONFIGURATION_DONE
			SET		[0EH].4
			INC		MP0
			INC		MP0

			CLR		CARRY
			MOV		A, ID0
			MOV		BYTE_REST, A
			MOV		A, KB_REPORT_DESCR_LENGTH
			SUBM	A, BYTE_REST
			SZ		CARRY
			JMP		TAKE_ID0_KBREPORT_DESCR
		
			MOV		BYTE_REST, A
			JMP		KBREPORT_DESCR_NEXT

	TAKE_ID0_KBREPORT_DESCR:
			MOV		A, ID0
			MOV		BYTE_REST, A	

	KBREPORT_DESCR_NEXT:
			CLR		BYTE_POS
			MOV		A, LOW KBREPORTD
			MOV		BYTE_SADDR, A
			MOV		TBLP, A
			CALL	WRITE_FIFO0

			JMP		EXIT_EP0_OUTPACKET_ANALY
	
	GET_MICE_REPORT_DESCR:
			SZ		USB_CONFIGURATION_DONE
			SET		[0EH].4
			INC		MP0
			INC		MP0
		
			CLR		CARRY
			MOV		A, ID0
			MOV		BYTE_REST, A
			MOV		A, MICE_REPORT_DESCR_LENGTH
			SUBM	A, BYTE_REST
			SZ		CARRY
			JMP		TAKE_ID0_MICEREPORT_DESCR
		
			MOV		BYTE_REST, A
			JMP		MICEREPORT_DESCR_NEXT

	TAKE_ID0_MICEREPORT_DESCR:
			MOV		A, ID0
			MOV		BYTE_REST, A	

	MICEREPORT_DESCR_NEXT:
			CLR		BYTE_POS
			MOV		A, LOW MICEREPORTD
			MOV		BYTE_SADDR, A
			MOV		TBLP, A
			CALL	WRITE_FIFO0
		
			SET		USB_CONFIGURATION_DONE

			JMP		EXIT_EP0_OUTPACKET_ANALY


	NEXT_CHECK_EP0_0:
			MOV		A, ID0
			AND		A, 060H

			XOR		A, 020H	
			SZ		ACC
			JMP		NEXT_CHECK_EP0_1

			;THIS IS THE HOST-TO-DEVICE, CLASS COMMAND

			;CLASS COMMAND 0X0A
			INC		MP0
			MOV		A, 00AH
			XOR		A, ID0
			SZ		ACC
			JMP		CHECK_IF_OTHER_210
			JMP		CLASS_0_LEN

	CHECK_IF_OTHER_210:
			;CLASS COMMAND 0X0B
			MOV		A, 00BH
			XOR		A, ID0
			SZ		ACC
			JMP		CHECK_IF_OTHER_211

			INC		MP0
			;INC		MP0
			;INC		MP0
			MOV		A, ID0

			SET		NOT_BOOT_TYPE
			SNZ		ACC.0
			CLR		NOT_BOOT_TYPE

			JMP		CLASS_0_LEN

	CHECK_IF_OTHER_211:
			;CLASS COMMAND 0X09
			MOV		A, 009H
			XOR		A, ID0
			SZ		ACC
			JMP		NOT_SUPPORTED_CLASS_COMMAND

			SET		ZERO_IN_TOKEN_REQUIRED
			JMP		NOT_SUPPORTED_CLASS_COMMAND

	CLASS_0_LEN:
			CALL	WRITE_LEN0_TOFIFO0

	NOT_SUPPORTED_CLASS_COMMAND:

			JMP		EXIT_EP0_OUTPACKET_ANALY

	NEXT_CHECK_EP0_1:
			MOV		A, ID0
			AND		A, 060H

			XOR		A, 040H	
			SZ		ACC
			JMP		EXIT_EP0_OUTPACKET_ANALY

			;THIS IS THE HOST-TO-DEVICE, VENDOR COMMAND
			
	EXIT_EP0_OUTPACKET_ANALY:
		
			RET

EP0_INHANDLE:
			SZ		BYTE_REST
			CALL	WRITE_FIFO0

			MOV		A, SIE
			MOV		MP1, A
		
			CLR		ID1.IN

			RET

CHECK_EP0_FIFO_READY:
			CLR		EP0_READY
			MOV		A, MISC
			MOV		MP1, A
			MOV		A, 0E0H
			ANDM	A, ID1

			CALL	USB_MISC_DELAY

			SET		ID1.REQ			

			CALL	USB_MISC_DELAY			

			SZ		ID1.READY
			SET		EP0_READY

			CALL	USB_MISC_DELAY
			CLR		ID1.REQ
			RET

READ_FIFO0:
			MOV		A, 8
			MOV		USB_LCOUNT,A

	RFIFO0:
			MOV		A, EP0_BUFF
			MOV		MP0, A	

			MOV		A, MISC
			MOV		MP1, A
			MOV		A, 0E0H
			ANDM	A, ID1

			CALL	USB_MISC_DELAY

			SET		ID1.REQ			

	RFIFO0LOOP:
			MOV		A, MISC
			MOV		MP1, A

			CALL	USB_MISC_DELAY			

			SNZ		ID1.READY
			JMP		READ_FIFO0END	

			MOV		A, FIFO0
			MOV		MP1, A
			MOV		A, ID1
			MOV		ID0, A
			INC		MP0

			SDZ		USB_LCOUNT
			JMP		RFIFO0LOOP

	READ_FIFO0END:
			MOV		A, MISC
			MOV		MP1, A

			SET		ID1.TX
			CALL	USB_MISC_DELAY
			
			CLR		ID1.REQ
			RET

WRITE_LEN0_TOFIFO0:

			MOV		A, MISC			
			MOV		MP1, A

			MOV		A, ID1
			AND		A, 0E0H
			OR		A, 02H
			MOV		ID1, A

			CALL	USB_MISC_DELAY

			SET		ID1.0

			CALL	USB_MISC_DELAY

			CLR		ID1.1
			CALL	USB_MISC_DELAY

			CLR		ID1.0

	WLEN0_EXIT:

			RET


WRITE_FIFO0:

			MOV		A, BYTE_SADDR
			MOV		TBLP, A
			MOV		A, BYTE_POS
			ADDM	A, TBLP
		
			MOV	A, BYTE_REST
			MOV	BIGGER_THAN_8_TEMP, A
			
			SZ	BIGGER_THAN_8_TEMP.7
			JMP		GREATER_THAN_8
			SZ	BIGGER_THAN_8_TEMP.6
			JMP		GREATER_THAN_8
			SZ	BIGGER_THAN_8_TEMP.5
			JMP		GREATER_THAN_8
			SZ	BIGGER_THAN_8_TEMP.4
			JMP		GREATER_THAN_8
			SZ	BIGGER_THAN_8_TEMP.3
			JMP		GREATER_THAN_8
		;============================================================
			MOV		A, BYTE_REST
			MOV		USB_DATALENGTH, A
			CLR		BYTE_REST

			JMP		START_TO_WFIFO0

	GREATER_THAN_8:
			MOV		A, 8

⌨️ 快捷键说明

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