?? chap_9.src
字號:
; SOURCE LINE # 215
; //清除高速狀態標志
; EA_DISABLE;
; SOURCE LINE # 217
CLR EA
; USB_Int_Flag.BITS.HS_STAT = 0;
; SOURCE LINE # 218
MOV R7,USB_Int_Flag
MOV A,R7
ANL A,#0DFH
MOV USB_Int_Flag,A
; EA_ENABLE;
; SOURCE LINE # 219
SETB EA
; if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
; SOURCE LINE # 220
MOV R7,Kernel_Flag+03H
MOV A,R7
JNB ACC.0,?C0006
; {
; SOURCE LINE # 221
; //切換高速指示
; HS_FS_LED = HIGH_SPEED_LED;
; SOURCE LINE # 223
SETB HS_FS_LED
; //設置高速模式狀態
; Kernel_Flag.BITS.HS_FS_State = HIGH_SPEED;
; SOURCE LINE # 225
MOV R7,Kernel_Flag+03H
MOV A,R7
ANL A,#0FEH
MOV Kernel_Flag+03H,A
; //重新配置高速端點
; Init_Endpoint();
; SOURCE LINE # 227
LCALL Init_Endpoint
;
; // PIO_Count = 64;
; PIO_Count = 512;
; SOURCE LINE # 230
MOV PIO_Count,#02H
MOV PIO_Count+01H,#00H
; }
; SOURCE LINE # 231
; }
; SOURCE LINE # 232
; }
; SOURCE LINE # 233
?C0006:
RET
; END OF USB_Debug_Mode
;
;
; //***********************************************************************
; //* *
; //* Routine : *
; //* Input : None *
; //* Output : None *
; //* Function : *
; //* *
; //***********************************************************************
; //建立包處理
; void USB_Setup(void)
RSEG ?PR?USB_Setup?CHAP_9
USB_Setup:
USING 0
; SOURCE LINE # 245
; {
; SOURCE LINE # 246
; unsigned char type, req;
;
; //清除EP0SETUP中斷標志
; USB_Int_Flag.BITS.EP0SETUP = 0;
; SOURCE LINE # 250
MOV R7,USB_Int_Flag+01H
MOV A,R7
ANL A,#0FEH
MOV USB_Int_Flag+01H,A
; //清除總線復位標志
; Kernel_Flag.BITS.Bus_Reset = 0;
; SOURCE LINE # 252
MOV R7,Kernel_Flag+01H
MOV A,R7
ANL A,#0BFH
MOV Kernel_Flag+01H,A
; //選擇端點0SETUP緩沖區
; D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
; SOURCE LINE # 254
MOV DPTR,#D14_Cntrl_Reg+02CH
MOV A,#020H
MOVX @DPTR,A
;
; //讀取USB請求
; //讀取請求類型
; USB_Device_Request.bmRequestType = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 258
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV R0,#LOW (USB_Device_Request)
MOV @R0,AR7
; //讀取請求號
; USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 260
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV R0,#LOW (USB_Device_Request+01H)
MOV @R0,AR7
; //讀取16bit請求數據
; USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 262
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV R6,#00H
MOV R0,#LOW (USB_Device_Request+02H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; USB_Device_Request.wValue <<= 8;
; SOURCE LINE # 263
MOV R0,#LOW (USB_Device_Request+02H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV A,R7
MOV R7,#00H
MOV R6,A
MOV R0,#LOW (USB_Device_Request+02H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 264
MOV R0,#LOW (USB_Device_Request+02H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R5,A
MOV R4,#00H
MOV A,R6
ORL A,R4
MOV R6,A
MOV A,R7
ORL A,R5
MOV R7,A
MOV R0,#LOW (USB_Device_Request+02H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; //讀取16bit請求索引
; USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 266
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV R6,#00H
MOV R0,#LOW (USB_Device_Request+04H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; USB_Device_Request.wIndex <<= 8;
; SOURCE LINE # 267
MOV R0,#LOW (USB_Device_Request+04H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV A,R7
MOV R7,#00H
MOV R6,A
MOV R0,#LOW (USB_Device_Request+04H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 268
MOV R0,#LOW (USB_Device_Request+04H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R5,A
MOV R4,#00H
MOV A,R6
ORL A,R4
MOV R6,A
MOV A,R7
ORL A,R5
MOV R7,A
MOV R0,#LOW (USB_Device_Request+04H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; //讀取16bit長度
; USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 270
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV R6,#00H
MOV R0,#LOW (USB_Device_Request+06H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; USB_Device_Request.wLength <<= 8;
; SOURCE LINE # 271
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV A,R7
MOV R7,#00H
MOV R6,A
MOV R0,#LOW (USB_Device_Request+06H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 272
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R5,A
MOV R4,#00H
MOV A,R6
ORL A,R4
MOV R6,A
MOV A,R7
ORL A,R5
MOV R7,A
MOV R0,#LOW (USB_Device_Request+06H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
;
; //長度處理(高低8位對調)
; Temp = USB_Device_Request.wLength;
; SOURCE LINE # 275
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV Temp,A
INC R0
MOV A,@R0
MOV Temp+01H,A
; USB_Device_Request.wLength = 0;
; SOURCE LINE # 276
MOV R0,#LOW (USB_Device_Request+06H)
MOV @R0,#00H
INC R0
MOV @R0,#00H
; USB_Device_Request.wLength = (UC) Temp;
; SOURCE LINE # 277
MOV R7,Temp+01H
MOV R6,#00H
MOV R0,#LOW (USB_Device_Request+06H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; USB_Device_Request.wLength <<= 8;
; SOURCE LINE # 278
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV A,R7
MOV R7,#00H
MOV R6,A
MOV R0,#LOW (USB_Device_Request+06H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; Temp >>= 8;
; SOURCE LINE # 279
MOV A,Temp
MOV Temp+01H,A
MOV Temp,#00H
; USB_Device_Request.wLength |= Temp;
; SOURCE LINE # 280
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV A,R6
ORL A,Temp
MOV R6,A
MOV A,R7
ORL A,Temp+01H
MOV R7,A
MOV R0,#LOW (USB_Device_Request+06H)
MOV @R0,AR6
INC R0
MOV @R0,AR7
;
; type = USB_Device_Request.bmRequestType & 0x60;
; SOURCE LINE # 282
MOV R0,#LOW (USB_Device_Request)
MOV A,@R0
MOV R7,A
MOV A,R7
ANL A,#060H
MOV type?140,A
; req = USB_Device_Request.bRequest & 0x0f;
; SOURCE LINE # 283
MOV R0,#LOW (USB_Device_Request+01H)
MOV A,@R0
MOV R7,A
MOV A,R7
ANL A,#0FH
MOV req?141,A
;
; //廠商請求
; if (type == 0x40)
; SOURCE LINE # 286
MOV A,type?140
CJNE A,#040H,?C0007
; {
; SOURCE LINE # 287
; Vendor_Specific_Command();//廠商請求處理
; SOURCE LINE # 288
LCALL Vendor_Specific_Command
; }
; SOURCE LINE # 289
RET
?C0007:
; else if (type == 0x00)
; SOURCE LINE # 290
MOV A,type?140
JNZ ?C0010
; (*StandardDeviceRequest[req])();//調用標準請求
; SOURCE LINE # 291
MOV R7,req?141
MOV A,R7
MOV B,#03H
MUL AB
ADD A,#LOW (StandardDeviceRequest)
MOV DPL,A
CLR A
ADDC A,#HIGH (StandardDeviceRequest)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R3,A
MOV A,#01H
MOVC A,@A+DPTR
MOV R2,A
MOV A,#02H
MOVC A,@A+DPTR
MOV R1,A
LCALL ?C?ICALL
; }
; SOURCE LINE # 292
?C0010:
RET
; END OF USB_Setup
;
; //***********************************************************************
; //* *
; //* Routine : *
; //* Input : None *
; //* Output : None *
; //* Function : *
; //* *
; //***********************************************************************
; //廠商請求處理
; void Vendor_Specific_Command(void)
RSEG ?PR?Vendor_Specific_Command?CHAP_9
Vendor_Specific_Command:
USING 0
; SOURCE LINE # 303
; {
; SOURCE LINE # 304
; if(USB_Device_Request.bRequest == 0x0C)
; SOURCE LINE # 305
MOV R0,#LOW (USB_Device_Request+01H)
MOV A,@R0
MOV R7,A
MOV A,R7
XRL A,#0CH
JZ $ + 5H
LJMP ?C0023
; {
; SOURCE LINE # 306
; switch (USB_Device_Request.wIndex)
; SOURCE LINE # 307
MOV R0,#LOW (USB_Device_Request+04H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV A,R7
MOV B,R6
LCALL ?C?ICASE
DW ?C0015
DW 07104H
DW ?C0013
DW 07204H
DW 00H
DW ?C0016
; {
; SOURCE LINE # 308
; case GET_FIRMWARE_VERSION ://獲取固件版本
; SOURCE LINE # 309
?C0013:
; if(USB_Device_Request.wLength == 1)
; SOURCE LINE # 310
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV A,R7
XRL A,#01H
ORL A,R6
JNZ ?C0015
; {
; SOURCE LINE # 311
; //select endpoint
; D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
; SOURCE LINE # 313
MOV DPTR,#D14_Cntrl_Reg+02CH
MOV A,#01H
MOVX @DPTR,A
; //set the data length to 1 byte
; D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
; SOURCE LINE # 315
MOV DPTR,#D14_Cntrl_Reg+01CH
MOV A,#01H
MOVX @DPTR,A
; D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
; SOURCE LINE # 316
MOV DPTR,#D14_Cntrl_Reg+01DH
CLR A
MOVX @DPTR,A
; //sent 0x21 as data
; D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x21;//版本號
; SOURCE LINE # 318
MOV DPTR,#D14_Cntrl_Reg+020H
MOV A,#021H
MOVX @DPTR,A
; wait_ep0tx();
; SOURCE LINE # 319
LCALL wait_ep0tx
; ep0out_ack();
; SOURCE LINE # 320
LCALL ep0out_ack
; // ep0in_ack();
; break;
; SOURCE LINE # 322
RET
; }
; SOURCE LINE # 323
;
; case SETUP_DMA_REQUEST :
; SOURCE LINE # 325
?C0015:
; //Out Token Ack detected
; wait_ep0rx();
; SOURCE LINE # 327
LCALL wait_ep0rx
; D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
; SOURCE LINE # 328
MOV DPTR,#D14_Cntrl_Reg+02CH
CLR A
MOVX @DPTR,A
; //
; FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 330
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV FileSize,R7
; FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 331
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV FileSize+01H,R7
; FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 332
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV FileSize+02H,R7
; //讀取傳輸字節數
; Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 334
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV R6,#00H
MOV Temp,R6
MOV Temp+01H,R7
; bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 335
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV bytecount+03H,R7
MOV bytecount+02H,R6
MOV bytecount+01H,R5
MOV bytecount,R4
; bytecount <<= 8;
; SOURCE LINE # 336
MOV R7,bytecount+03H
MOV R6,bytecount+02H
MOV R5,bytecount+01H
MOV R4,bytecount
MOV R0,#08H
LCALL ?C?LSHL
MOV bytecount+03H,R7
MOV bytecount+02H,R6
MOV bytecount+01H,R5
MOV bytecount,R4
; bytecount |= Temp;
; SOURCE LINE # 337
MOV R6,Temp
MOV R7,Temp+01H
CLR A
MOV R4,A
MOV R5,A
MOV A,bytecount+03H
ORL A,R7
MOV bytecount+03H,A
MOV A,bytecount+02H
ORL A,R6
MOV bytecount+02H,A
MOV A,bytecount+01H
ORL A,R5
MOV bytecount+01H,A
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -