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