📄 usbjk.asm
字号:
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 + -