📄 usb.src
字号:
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
VendorDeviceRequest:
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW read_write_register + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
DB 0FFH
DW reserved + 0
RSEG ?C_INITSEG
DB 004H
DB ClockTicks
DB 000H,000H,000H,000H ; long
DB 001H
DB last_key?946
DB 00FH
; #include <reg51.h> /* special function register declarations */
; #include <stdio.h>
; #include <string.h>
; #include "d12.h"
;
;
; unsigned char rcv_data_len;
;
; void main(void)
RSEG ?PR?main?USB
main:
USING 0
; SOURCE LINE # 9
; {
; SOURCE LINE # 10
;
; init_port(); //初始化I/O口
; SOURCE LINE # 12
LCALL init_port
; init_serial(); //初始化串行口
; SOURCE LINE # 13
LCALL init_serial
; init_timer0(); //初始化定时器0
; SOURCE LINE # 14
LCALL init_timer0
; init_special_interrupts(); //设置中断
; SOURCE LINE # 15
LCALL init_special_interrupts
; MCU_D12CS = 0x1;
; SOURCE LINE # 16
SETB MCU_D12CS
; MCU_D12CS = 0x0;
; SOURCE LINE # 17
CLR MCU_D12CS
; bEPPflags.value = 0;
; SOURCE LINE # 18
CLR A
MOV bEPPflags,A
MOV bEPPflags+01H,A
; reconnect_USB(); //重新连接USB
; SOURCE LINE # 19
LCALL reconnect_USB
?C0001:
; while( TRUE )
; SOURCE LINE # 20
; {
; SOURCE LINE # 21
; if (bEPPflags.bits.timer)
; SOURCE LINE # 22
MOV R7,bEPPflags
MOV A,R7
JNB ACC.0,?C0003
; {
; SOURCE LINE # 23
; DISABLE; //定时器溢出,检测按键状态
; SOURCE LINE # 24
CLR EA
; bEPPflags.bits.timer = 0;
; SOURCE LINE # 25
MOV R7,bEPPflags
MOV A,R7
ANL A,#0FEH
MOV bEPPflags,A
; ENABLE;
; SOURCE LINE # 26
SETB EA
; if(bEPPflags.bits.configuration)//设备未配置返回
; SOURCE LINE # 27
MOV R7,bEPPflags+01H
MOV A,R7
JNB ACC.0,?C0003
; check_key_LED();
; SOURCE LINE # 28
LCALL check_key_LED
; }
; SOURCE LINE # 29
?C0003:
; if (bEPPflags.bits.bus_reset)
; SOURCE LINE # 30
MOV R7,bEPPflags
MOV A,R7
CLR C
RRC A
JNB ACC.0,?C0005
; { //设备复位处理
; SOURCE LINE # 31
; DISABLE;
; SOURCE LINE # 32
CLR EA
; bEPPflags.bits.bus_reset = 0;
; SOURCE LINE # 33
MOV R7,bEPPflags
MOV A,R7
ANL A,#0FDH
MOV bEPPflags,A
; ENABLE;
; SOURCE LINE # 34
SETB EA
; // Release D12's SUSPEND pin after bus reset
; // Enable 74HCT123 pulse generation before disconnect
; D12SUSPD = 1;
; SOURCE LINE # 37
SETB D12SUSPD
; }
; SOURCE LINE # 38
?C0005:
; if (bEPPflags.bits.suspend)
; SOURCE LINE # 39
MOV R7,bEPPflags
MOV A,R7
RRC A
RRC A
ANL A,#03FH
JNB ACC.0,?C0006
; { //挂起改变处理
; SOURCE LINE # 40
; DISABLE;
; SOURCE LINE # 41
CLR EA
; bEPPflags.bits.suspend= 0;
; SOURCE LINE # 42
MOV R7,bEPPflags
MOV A,R7
ANL A,#0FBH
MOV bEPPflags,A
; ENABLE;
; SOURCE LINE # 43
SETB EA
; if(D12SUSPD == 1)
; SOURCE LINE # 44
JNB D12SUSPD,?C0006
; { //挂起处理
; SOURCE LINE # 45
; D12SUSPD = 0;
; SOURCE LINE # 46
CLR D12SUSPD
; P0 = 0xFF;
; SOURCE LINE # 47
MOV P0,#0FFH
; P1 = 0xFF;
; SOURCE LINE # 48
MOV P1,#0FFH
; P2 = 0xFF;
; SOURCE LINE # 49
MOV P2,#0FFH
; P3 = 0xFF;
; SOURCE LINE # 50
MOV P3,#0FFH
; D12_SetDMA(0xC3);
; SOURCE LINE # 51
MOV R7,#0C3H
LCALL _D12_SetDMA
; D12SUSPD = 1;
; SOURCE LINE # 52
SETB D12SUSPD
; PCON |= 0x02;
; SOURCE LINE # 53
ORL PCON,#02H
?C0008:
; while (1);
; SOURCE LINE # 54
SJMP ?C0008
; }
; SOURCE LINE # 55
; }
; SOURCE LINE # 56
?C0006:
; if (bEPPflags.bits.setup_packet)
; SOURCE LINE # 57
MOV R7,bEPPflags
MOV A,R7
RRC A
RRC A
RRC A
ANL A,#01FH
JNB ACC.0,?C0010
; { //Setup包处理
; SOURCE LINE # 58
; DISABLE;
; SOURCE LINE # 59
CLR EA
; bEPPflags.bits.setup_packet = 0;
; SOURCE LINE # 60
MOV R7,bEPPflags
MOV A,R7
ANL A,#0F7H
MOV bEPPflags,A
; ENABLE;
; SOURCE LINE # 61
SETB EA
; control_handler(); //调用请求处理子程序
; SOURCE LINE # 62
LCALL control_handler
; D12SUSPD = 1;
; SOURCE LINE # 63
SETB D12SUSPD
; }
; SOURCE LINE # 64
?C0010:
; if(bEPPflags.bits.ep1_rxdone)
; SOURCE LINE # 65
MOV R7,bEPPflags+01H
MOV A,R7
RRC A
RRC A
ANL A,#03FH
JNB ACC.0,?C0011
; {
; SOURCE LINE # 66
; D12_WriteEndpoint(3,rcv_data_len,GenEpBuf);
; SOURCE LINE # 67
MOV R3,#00H
MOV R2,#HIGH (GenEpBuf)
MOV R1,#LOW (GenEpBuf)
MOV R5,rcv_data_len
MOV R7,#03H
LCALL _D12_WriteEndpoint
; bEPPflags.bits.ep1_rxdone = 0 ;
; SOURCE LINE # 68
MOV R7,bEPPflags+01H
MOV A,R7
ANL A,#0FBH
MOV bEPPflags+01H,A
; }
; SOURCE LINE # 69
?C0011:
; if(bEPPflags.bits.ep2_rxdone)
; SOURCE LINE # 70
MOV R7,bEPPflags+02H
MOV A,R7
JB ACC.0,$ + 6H
LJMP ?C0001
; {
; SOURCE LINE # 71
; D12_WriteEndpoint(5,rcv_data_len,EpBuf);
; SOURCE LINE # 72
MOV R3,#00H
MOV R2,#HIGH (EpBuf)
MOV R1,#LOW (EpBuf)
MOV R5,rcv_data_len
MOV R7,#05H
LCALL _D12_WriteEndpoint
; bEPPflags.bits.ep2_rxdone = 0 ;
; SOURCE LINE # 73
MOV R7,bEPPflags+02H
MOV A,R7
ANL A,#0FEH
MOV bEPPflags+02H,A
; }
; SOURCE LINE # 74
; }
; SOURCE LINE # 75
LJMP ?C0001
; END OF main
; }
;
; //返回stall应答
; void stall_ep0(void)
RSEG ?PR?stall_ep0?USB
stall_ep0:
USING 0
; SOURCE LINE # 79
; {
; SOURCE LINE # 80
; D12_SetEndpointStatus(0, 1);
; SOURCE LINE # 81
LCALL L?0215
; D12_SetEndpointStatus(1, 1);
; SOURCE LINE # 82
MOV R5,#01H
MOV R7,#01H
LJMP _D12_SetEndpointStatus
; END OF stall_ep0
; }
;
; //断开USB总线
; void disconnect_USB(void)
RSEG ?PR?disconnect_USB?USB
disconnect_USB:
USING 0
; SOURCE LINE # 86
; {
; SOURCE LINE # 87
; // Initialize D12 configuration
; D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
; SOURCE LINE # 89
MOV R5,#043H
MOV R7,#02H
LJMP _D12_SetMode
; END OF disconnect_USB
; }
;
; //连接USB总线
; void connect_USB(void)
RSEG ?PR?connect_USB?USB
connect_USB:
USING 0
; SOURCE LINE # 93
; {
; SOURCE LINE # 94
; // reset event flags
; DISABLE;
; SOURCE LINE # 96
CLR EA
; bEPPflags.value = 0;//清除所有状态
; SOURCE LINE # 97
CLR A
MOV bEPPflags,A
MOV bEPPflags+01H,A
; ENABLE;
; SOURCE LINE # 98
SETB EA
; // V2.1 enable normal+sof interrupt
; D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
; SOURCE LINE # 100
MOV R7,#0C0H
LCALL _D12_SetDMA
; // Initialize D12 configuration
; D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
; SOURCE LINE # 102
MOV R5,#043H
MOV R7,#012H
LJMP _D12_SetMode
; END OF connect_USB
; }
;
; //重新连接到USB总线
; void reconnect_USB(void)
RSEG ?PR?reconnect_USB?USB
reconnect_USB:
USING 0
; SOURCE LINE # 106
; {
; SOURCE LINE # 107
; unsigned long clk_cnt;
; MCU_LED0 = 0;
; SOURCE LINE # 109
CLR MCU_LED0
; MCU_LED1 = 0;
; SOURCE LINE # 110
CLR MCU_LED1
; // Pull-down D12's SUSPEND pin
; // Disable 74HCT123 pulse generation before disconnect
; // Release D12's SUSPEND pin after receiving bus reset from host
; D12SUSPD = 0;
; SOURCE LINE # 114
CLR D12SUSPD
; disconnect_USB();
; SOURCE LINE # 115
LCALL disconnect_USB
; printf("Wait for 1 second ...\n");
; SOURCE LINE # 116
MOV R3,#0FFH
MOV R2,#HIGH (?SC_268)
MOV R1,#LOW (?SC_268)
LCALL _printf
; clk_cnt = ClockTicks;
; SOURCE LINE # 117
MOV clk_cnt?440+03H,ClockTicks+03H
MOV clk_cnt?440+02H,ClockTicks+02H
MOV clk_cnt?440+01H,ClockTicks+01H
MOV clk_cnt?440,ClockTicks
?C0017:
; while(ClockTicks < clk_cnt + 20) ;
; SOURCE LINE # 118
MOV A,clk_cnt?440+03H
ADD A,#014H
MOV R7,A
CLR A
ADDC A,clk_cnt?440+02H
MOV R6,A
CLR A
ADDC A,clk_cnt?440+01H
MOV R5,A
CLR A
ADDC A,clk_cnt?440
MOV R4,A
MOV R3,ClockTicks+03H
MOV R2,ClockTicks+02H
MOV R1,ClockTicks+01H
MOV R0,ClockTicks
CLR C
LCALL ?C?ULCMP
JC ?C0017
?C0018:
; connect_USB();
; SOURCE LINE # 119
LCALL connect_USB
; MCU_LED0 = 1;
; SOURCE LINE # 120
SETB MCU_LED0
; MCU_LED1 = 1;
; SOURCE LINE # 121
SETB MCU_LED1
; }
; SOURCE LINE # 122
RET
; END OF reconnect_USB
;
; //恢复到未配置状态
; void init_unconfig(void)
RSEG ?PR?init_unconfig?USB
init_unconfig:
USING 0
; SOURCE LINE # 125
; {
; SOURCE LINE # 126
; // unsigned char i;
; D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
; SOURCE LINE # 128
CLR A
MOV R7,A
LJMP _D12_SetEndpointEnable
; END OF init_unconfig
; }
;
; //设置配置状态
; void init_config(void)
RSEG ?PR?init_config?USB
init_config:
USING 0
; SOURCE LINE # 132
; {
; SOURCE LINE # 133
; D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
; SOURCE LINE # 134
MOV R7,#01H
LJMP _D12_SetEndpointEnable
; END OF init_config
; }
;
; //从端点号1发送数据
; void single_transmit(unsigned char * buf, unsigned char len)
RSEG ?PR?_single_transmit?USB
L?0211:
USING 0
MOV bEPPflags,A
SETB EA
L?0212:
MOV R3,#00H
MOV R2,#00H
MOV R1,#00H
CLR A
MOV R5,A
_single_transmit:
USING 0
;---- Variable 'buf?741' assigned to Register 'R1/R2/R3' ----
;---- Variable 'len?742' assigned to Register 'R5' ----
; SOURCE LINE # 138
; {
; SOURCE LINE # 139
; if( len <= EP0_PACKET_SIZE)
; SOURCE LINE # 140
MOV A,R5
SETB C
SUBB A,#010H
JNC ?C0023
; {
; SOURCE LINE # 141
; D12_WriteEndpoint(1, len, buf);
; SOURCE LINE # 142
MOV R7,#01H
LCALL _D12_WriteEndpoint
; }
; SOURCE LINE # 143
; }
; SOURCE LINE # 144
?C0023:
RET
; END OF _single_transmit
; //发送端点号1建立代码
; void code_transmit(unsigned char code * pRomData, unsigned short len)
RSEG ?PR?_code_transmit?USB
_code_transmit:
USING 0
MOV pRomData?843,R6
MOV pRomData?843+01H,R7
;---- Variable 'len?844' assigned to Register 'R4/R5' ----
; SOURCE LINE # 146
; {
; SOURCE LINE # 147
;
; ControlData.wCount = 0;
; SOURCE LINE # 149
CLR A
MOV ControlData+0AH,A
MOV ControlData+0BH,A
; if(ControlData.wLength > len) ControlData.wLength = len;
; SOURCE LINE # 150
SETB C
MOV A,ControlData+09H
SUBB A,R5
MOV A,ControlData+08H
SUBB A,R4
JC ?C0024
MOV ControlData+08H,R4
MOV ControlData+09H,R5
?C0024:
; ControlData.pData = pRomData;
; SOURCE LINE # 151
MOV ControlData+0CH,#0FFH
MOV ControlData+0DH,pRomData?843
MOV ControlData+0EH,pRomData?843+01H
; if( ControlData.wLength >= EP0_PACKET_SIZE)
; SOURCE LINE # 152
CLR C
MOV A,ControlData+09H
SUBB A,#010H
MOV A,ControlData+08H
SUBB A,#00H
JC ?C0025
; {
; SOURCE LINE # 153
; D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
; SOURCE LINE # 154
MOV R3,ControlData+0CH
MOV R2,ControlData+0DH
MOV R1,ControlData+0EH
MOV R5,#010H
MOV R7,#01H
LCALL _D12_WriteEndpoint
; ControlData.wCount += EP0_PACKET_SIZE;
; SOURCE LINE # 155
MOV A,#010H
ADD A,ControlData+0BH
MOV ControlData+0BH,A
CLR A
ADDC A,ControlData+0AH
MOV ControlData+0AH,A
; DISABLE;
; SOURCE LINE # 156
CLR EA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -