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

📄 usbjk.asm

📁 51系列的USB固件程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
						MOV B,#08H
CLSSETUP:				MOV @R0,A
						INC R0
						DJNZ B,CLSSETUP
						RET
;===========================================================================================
Control_dispatcher:		MOV A,bmRequestType
						ANL A,#USB_REQUEST_TYPE_MASK
						MOV R2,A
						MOV A,bRequest
						MOV R3,A
						CJNE R2,#USB_STANDARD_REQUEST,Control_dispatch1
						CLR C
						MOV A,bRequest
						SUBB A,#NUMBER_STD_REQ
						JC Control_dispatch01
						RET
Control_dispatch01:		CLR C
						MOV A,R3
						RLC A
						ADD A,R3
						MOV DPTR,#STANDARDREQUEST
						JMP @A+DPTR
STANDARDREQUEST:		LJMP Get_Status
						LJMP Clear_Feature
						LJMP Req_Undefined
						LJMP Set_Feature
						LJMP Req_Undefined
						LJMP Set_Address
						LJMP Get_Descriptor
						LJMP Req_Undefined
						LJMP Get_Configuration
						LJMP Set_Configuration
						LJMP Get_Interface
						LJMP Set_Interface
						LJMP Req_Undefined
Req_Undefined:			LCALL Stall_EP0
						RET
											
Control_dispatch1:		CJNE R2,#USB_VENDOR_REQUEST,Control_dispatch2
Control_dispatch2:		CJNE R2,#USB_CLASS_REQUEST,Control_dispatch3
Control_dispatch3:		LCALL Stall_ep0
						RET
;===============================================================================						
Get_Status:				MOV A,bmRequestType
						ANL A,#USB_RECIPIENT_MASK						;=1FH
						CJNE A,#USB_RECIPIENT_DEVICE,GetIntfaceState
						MOV A,#03H
						JB Remote_Wakeup,RemoteState1
						MOV A,#01H
RemoteState1:			MOV	R6,A
						MOV R7,#00H
						MOV B,#02H
						LCALL D12_AckHost
						RET						

GetIntfaceState:		CJNE A,#USB_RECIPIENT_INTERFACE,GetEndpointState
						MOV R6,#00H
						MOV R7,#00H
						MOV B,#02H
						LCALL  D12_AckHost
						RET						

GetEndpointState:		CJNE A,#USB_RECIPIENT_ENDPOINT,GetStall
						mov a,wIndex
						anl a,#0FH					;MAX_EP_MASK				;取端点号到A
						clr C
						rlc A
						mov b,A
						mov a,wIndex
						JNB acc.7,GetEPState1
						mov a,B
						inc A
						mov b,A
GetEPState1:			mov a,B
						lcall D12_SelectEndpoint
						MOV R6,#00H
						CJNE A,#D12_STALL,GetEPState2
						MOV R6,#01H
GetEPState2:			MOV R7,#00H
						MOV B,#02H
						LCALL  D12_AckHost
						RET	

GetStall:				LCALL Stall_EP0
						RET
						
Clear_Feature:			MOV A,bmRequestType
						ANL A,#1FH
						MOV R3,A
						CJNE A,#USB_RECIPIENT_DEVICE,Clear_Feature1
						MOV A,wValue
						CJNE A,#01H,Clear_Feature01							;Remote Wake_up
						CLR Remote_wakeup
						MOV B,#00H
						LCALL D12_AckHost
						RET
Clear_Feature01:		MOV A,wValue
						CJNE A,#02H,Clear_Feature02
						MOV B,#00H
						LCALL D12_AckHost
Clear_Feature02:		RET						
						
Clear_Feature1:			CJNE A,#USB_RECIPIENT_ENDPOINT,Clear_Feature12
						MOV A,#wValue
						MOV B,A
						MOV A,#wValue+1
						ORL A,B
						JNZ Clear_Feature12						;USB_FEATURE_EENDPOINT_HALT=0000H
						MOV A,wIndex
						ANL A,#MAX_EP_MASK						;07H
						CLR C
						RLC A
						MOV B,A
						MOV A,wIndex
						JNB ACC.7,Clear_Feature11
						MOV A,B
						INC A
						MOV B,A
Clear_Feature11:		MOV A,B
						MOV B,#00H
						LCALL D12_SetEndpointStatus						
						MOV B,#00H
						LCALL D12_AckHost
						RET
Clear_Feature12:		LCALL Stall_EP0
						RET						
						
Set_Feature:			MOV A,bmRequestType
						ANL A,#1FH
						MOV R3,A
						CJNE A,#USB_RECIPIENT_DEVICE,Set_Feature1
						MOV A,wValue
						CJNE A,#01H,Set_Feature01							;Remote Wake_up
						SETB Remote_wakeup
						MOV B,#00H
						LCALL D12_AckHost
						RET
Set_Feature01:			MOV A,wValue
						CJNE A,#02H,Set_Feature02
						MOV B,#00H
						LCALL D12_AckHost
Set_Feature02:			RET						
						
Set_Feature1:			CJNE A,#USB_RECIPIENT_ENDPOINT,Set_Feature12
						MOV R1,#wValue
						MOV A,@R1
						INC R1
						ORL A,@R1
						JNZ Set_Feature12						;USB_FEATURE_EENDPOINT_HALT=0000H
						MOV A,wIndex
						ANL A,#MAX_EP_MASK						;07H
						CLR C
						RLC A
						MOV B,A
						MOV A,wIndex
						JNB ACC.7,Set_Feature11
						MOV A,B
						INC A
						MOV B,A
Set_Feature11:			MOV A,B
						MOV B,#01H
						LCALL D12_SetEndpointStatus						
						MOV B,#00H
						LCALL D12_AckHost
						RET
Set_Feature12:			LCALL Stall_EP0
						RET		

Set_Address:			MOV A,wValue
						ANL A,#7FH								;DEVICE_ADDRESS_MASK
						MOV B,A
						LCALL D12_SetAddressEnable
						MOV B,#00H
						LCALL D12_AckHost
						RET
;======================================================================================================
Get_Descriptor:			MOV wTransmitCount,#00H
						MOV A,wValue
						MOV R6,A				;bDescriptorIndex
						MOV A,wValue+1
						MOV R7,A				;bDescriptorType
						MOV A,wLength
						MOV R4,A
						MOV A,wLength+1
						MOV R5,A
						MOV A,R7
						CJNE A,#01H,Get_Descriptor1					;USB_DEVICE_DESCRIPTOR_TYPE=01H
						CLR C
						MOV A,wLength
						MOV R4,A
						SUBB A,#12H									;USB_DEVICE_DESCRIPTOR_LEN=12H
						MOV A,wLength+1
						MOV R5,A
						SUBB A,#00H
						JC GetDescriptor01
						CJNE R4,#12H,GetDescriptor00
						mov a,3bh
						inc A
						mov 3bh,a
						cjne a,#01h,GetDescriptor05
						SJMP GetDescriptor01
GetDescriptor05:		cjne a,#02h,GetDescriptor06
						SJMP GetDescriptor01
GetDescriptor06:		sjmp GetDescriptor01						
GetDescriptor00:		MOV R4,#08H						
GetDescriptor01:		MOV A,R4
						MOV wTransmitLength,A
						CLR C
						MOV A,R4
						SUBB A,#EP0_MAXPACKET_SIZE
						JNC GetDesc02
						MOV DPTR,#USB_DEVICE_DESCRIPTOR
						MOV A,DPL
						MOV R6,A
						MOV A,DPH
						ORL A,#80H
						MOV R7,A
						MOV R5,#00H
						MOV A,R4
						MOV B,A
						MOV A,#01H
						LCALL D12_TransmitRom
						LCALL EP0_TRANSMIT_OVER
						RET
Getdesc02:				MOV DPTR,#USB_DEVICE_DESCRIPTOR
						MOV A,DPL
						MOV TransmitBufAddrL,A
						MOV R6,A
						MOV A,DPH
						MOV R7,A
						ORL A,#80H
						MOV TransmitBufAddrH,A
						MOV R5,#00H
						MOV B,#EP0_MAXPACKET_SIZE
						MOV A,#01H
						LCALL D12_TransmitRom
						MOV A,wTransmitCount
						ADD A,#EP0_MAXPACKET_SIZE
						MOV wTransmitCount,A
						MOV CONTROL_STATE,#USB_TRANSMIT
						RET
						
Get_Descriptor1:		CJNE A,#02H,Get_Descriptor2					;USB_CONFIGURATION_DESCRIPTOR_TYPE=02H
						CLR C
						MOV A,wLength
						MOV R4,A
						SUBB A,#ALL_CONFIG_LEN						;PACKED_USB_CONFIG_DESCR_LEN=27H
						MOV A,wLength+1
						MOV R5,A
						SUBB A,#00H
						JC GetDescriptor11
						MOV R4,#ALL_CONFIG_LEN						;USB_DEVICE_DESCRIPTOR_LEN=27H
GetDescriptor11:		MOV A,R4
						MOV wTransmitLength,A
						CLR C
						MOV A,R4
						SUBB A,#EP0_MAXPACKET_SIZE
						JNC GetDesc12
						MOV DPTR,#USB_CONFIG_DESCR
						MOV A,DPL
						MOV R6,A
						MOV A,DPH
						MOV R7,A
						MOV R5,#00H
						MOV A,R4
						MOV B,A
						MOV A,#01H
						LCALL D12_TransmitRom
						LCALL EP0_TRANSMIT_OVER
						RET
Getdesc12:				MOV DPTR,#USB_CONFIG_DESCR
						MOV A,DPL
						MOV TransmitBufAddrL,A
						MOV R6,A
						MOV A,DPH
						MOV R7,A
						ORL A,#80H
						MOV TransmitBufAddrH,A
						MOV R5,#00H
						MOV B,#EP0_MAXPACKET_SIZE
						MOV A,#01H
						LCALL D12_TransmitRom
						MOV A,wTransmitCount
						ADD A,#EP0_MAXPACKET_SIZE
						MOV wTransmitCount,A
						MOV CONTROL_STATE,#USB_TRANSMIT
						RET

Get_Descriptor2:		CJNE A,#03H,Get_Descriptor3					;USB_STRING_DESCRIPTOR_TYPE=03H

Get_Descriptor3:		LCALL Stall_EP0

						RET
;=============================================================================================================						
Get_Configuration:		MOV A,Dev_Configured
						MOV R6,A
						MOV B,#01H
						LCALL D12_AckHost
						RET
						
Set_Configuration:		MOV A,wValue
						ORL A,wValue+1
						JNZ Set_Configur1
						MOV B,#00H
						LCALL D12_AckHost
						MOV Dev_Configured,#00h
						CLR PSW.5
						LCALL D12_SetEndpointEnable
						RET
Set_Configur1:			CJNE A,#01H,Set_Configur2
						MOV B,#00H
						LCALL D12_AckHost
						CLR PSW.5
						LCALL D12_SetEndpointEnable	
						SETB PSW.5
						LCALL D12_SetEndpointEnable	
						MOV Dev_Configured,#01H
						RET
Set_Configur2:			LCALL Stall_EP0
						RET
												
Get_Interface:			MOV R6,#00H
						MOV B,#01H
						LCALL D12_AckHost
						RET
						
Set_Interface:			MOV A,wValue
						ORL A,wValue+1
						ORL A,wIndex
						ORL A,wIndex+1
						JNZ Set_Interface1
						MOV B,#00H
						LCALL D12_AckHost
						RET
Set_Interface1:			LCALL Stall_EP0
						RET						
						
;===============================================================================
SAVE_ERROR:				PUSH ACC
						RRC A
						ANL A,#0FH						;取错误代码
						JNZ SAVE_ERROR2
						POP ACC
						RET
SAVE_ERROR2:			DEC A
						MOV R2,A
						MOV A,B
						RLC A
						MOV R0,#LASTERROR
						ADD A,R0
						MOV R0,A
						MOV A,R2
						CLR C
						SUBB A,#08H
						JC SAVE_ERROR1
						MOV R2,A
						INC R0
SAVE_ERROR1:			MOV A,R2
						MOV DPTR,#ZYCB
						MOVC A,@A+DPTR
						MOV B,A
						MOV A,@R0
						ORL A,B
						MOV @R0,A
						POP ACC
						RET



ZYCB:					DB 01H,02H,04H,08H,10H,20H,40H,80H
						ORG 0800H
USB_DEVICE_DESCRIPTOR:	DB 12H					;描述表字节数
						DB 01H					;描述表类型
						DB 00H,02H				;版本号
						DB 00H
						DB 00H
						DB 00H
						DB 10H					;端点0的最大包大小(8、16、32、64)
						DB 71H,04H				;厂商ID
						DB 26H,66H				;产品ID
						DB 01H,00H				;设备发行号(BCD)
						DB 00H
						DB 00H
						DB 00H
						DB 01H
						
USB_CONFIG_DESCR:		DB 09H						;此描述表的字节数
						DB 02H						;配置描述表类型
						DB ALL_CONFIG_LEN,00H		;此配置信息的总长=39
						DB 01H						;此配置所支持的接口个数
						DB 01H						;
						DB 00H
						DB 5FH
						DB 01H
						
USB_INTERFACE_DESCR:	DB 09H
						DB 04H
						DB 00H
						DB 00H
						DB 03H
						DB 0FEH
						DB 03H
						DB 01H
						DB 00H
						
EP2IN_DESCR:			DB 07H
						DB 05H
						DB 82H
						DB 02H
						DB 40H,00H
						DB 0AH

EP2OUT_DESCR:			DB 07H
						DB 05H
						DB 02H
						DB 02H
						DB 40H,00H
						DB 0AH

EP1IN_DESCR:			DB 07H
						DB 05H
						DB 81H
						DB 00H
						DB 10H,00H
						DB 0AH

EP1OUT_DESCR:			DB 07H
						DB 05H
						DB 01H
						DB 00H
						DB 10H,00H
						DB 0AH
						END

⌨️ 快捷键说明

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