?? chap_9.src
字號:
MOV A,bytecount
ORL A,R4
MOV bytecount,A
; //讀取傳輸方式
; FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
; SOURCE LINE # 339
MOV DPTR,#D14_Cntrl_Reg+020H
MOVX A,@DPTR
MOV R7,A
MOV FileSize+07H,R7
; ep0in_ack();
; SOURCE LINE # 340
LCALL ep0in_ack
; Kernel_Flag.BITS.Transfer_Start = 1;//標志傳輸數據開始
; SOURCE LINE # 341
MOV R7,Kernel_Flag+03H
MOV A,R7
ORL A,#020H
MOV Kernel_Flag+03H,A
; break;
; SOURCE LINE # 342
RET
;
; default :
; SOURCE LINE # 344
?C0016:
; if(USB_Device_Request.bmRequestType == 0xC0)
; SOURCE LINE # 345
MOV R0,#LOW (USB_Device_Request)
MOV A,@R0
MOV R7,A
MOV A,R7
CJNE A,#0C0H,?C0017
; {
; SOURCE LINE # 346
; ep0in_ack();
; SOURCE LINE # 347
LCALL ep0in_ack
; break;
; SOURCE LINE # 348
RET
; }
; SOURCE LINE # 349
?C0017:
; if(USB_Device_Request.bmRequestType == 0x40)
; SOURCE LINE # 350
MOV R0,#LOW (USB_Device_Request)
MOV A,@R0
MOV R7,A
MOV A,R7
XRL A,#040H
JNZ ?C0023
; {
; SOURCE LINE # 351
; D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
; SOURCE LINE # 352
MOV DPTR,#D14_Cntrl_Reg+02CH
CLR A
MOVX @DPTR,A
; D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
; SOURCE LINE # 353
MOV DPTR,#D14_Cntrl_Reg+028H
MOVX A,@DPTR
MOV R7,A
MOV A,R7
ORL A,#01H
MOV R7,A
MOV DPTR,#D14_Cntrl_Reg+028H
MOV A,R7
MOVX @DPTR,A
?C0019:
; while(!USB_Int_Flag.BITS.EP0SETUP)
; SOURCE LINE # 354
MOV R7,USB_Int_Flag+01H
MOV A,R7
JB ACC.0,?C0020
; {
; SOURCE LINE # 355
; //讀取ISP1581中斷寄存器
; USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
; SOURCE LINE # 357
MOV DPTR,#D14_Cntrl_Reg+018H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV A,USB_Int_Flag+03H
ORL A,R7
MOV USB_Int_Flag+03H,A
MOV A,USB_Int_Flag+02H
ORL A,R6
MOV USB_Int_Flag+02H,A
MOV A,USB_Int_Flag+01H
ORL A,R5
MOV USB_Int_Flag+01H,A
MOV A,USB_Int_Flag
ORL A,R4
MOV USB_Int_Flag,A
; //回寫ISP1581中斷寄存器
; D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
; SOURCE LINE # 359
MOV R7,USB_Int_Flag+03H
MOV R6,USB_Int_Flag+02H
MOV R5,USB_Int_Flag+01H
MOV R4,USB_Int_Flag
MOV DPTR,#D14_Cntrl_Reg+018H
LCALL ?C?LSTXDATA
; if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
; SOURCE LINE # 360
MOV R7,USB_Int_Flag
MOV A,R7
RRC A
RRC A
RRC A
ANL A,#01FH
MOV R7,A
MOV A,R7
JB ACC.0,?C0023
MOV R7,USB_Int_Flag
MOV A,R7
JNB ACC.0,?C0019
RET
; return;
; }
; SOURCE LINE # 362
?C0020:
; USB_Int_Flag.BITS.EP0TX = 0;
; SOURCE LINE # 363
MOV R7,USB_Int_Flag+01H
MOV A,R7
ANL A,#0F7H
MOV USB_Int_Flag+01H,A
; break;
; SOURCE LINE # 364
; }
; SOURCE LINE # 365
; }
; SOURCE LINE # 366
; }
; SOURCE LINE # 367
; }
; SOURCE LINE # 368
?C0023:
RET
; END OF Vendor_Specific_Command
;
; //***********************************************************************
; //* *
; //* Routine : *
; //* Input : None *
; //* Output : None *
; //* Function : *
; //* *
; //***********************************************************************
;
; void reserved(void)
RSEG ?PR?reserved?CHAP_9
reserved:
; SOURCE LINE # 379
; {
; SOURCE LINE # 380
; }
; SOURCE LINE # 381
RET
; END OF reserved
;
;
; //Get_Descriptor()獲取描述符
; void get_descriptor(void)
RSEG ?PR?get_descriptor?CHAP_9
get_descriptor:
USING 0
; SOURCE LINE # 385
; {
; SOURCE LINE # 386
;
; switch(USB_Device_Request.wValue)
; SOURCE LINE # 388
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 B,R6
LCALL ?C?ICASE
DW ?C0026
DW 01H
DW ?C0031
DW 02H
DW ?C0060
DW 03H
DW ?C0064
DW 04H
DW ?C0065
DW 05H
DW ?C0087
DW 06H
DW ?C0092
DW 07H
DW ?C0071
DW 08H
DW 00H
DW ?C0112
; {
; SOURCE LINE # 389
; case 1://設備描述符
; SOURCE LINE # 390
?C0026:
; //選擇描述符
; if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
; SOURCE LINE # 392
MOV R7,Kernel_Flag+03H
MOV A,R7
JNB ACC.0,?C0027
; Descriptor_Ptr = &Standard_Device_Descriptor[0]; //set pointer to device descriptor
; SOURCE LINE # 393
MOV R6,#HIGH (Standard_Device_Descriptor)
MOV R7,#LOW (Standard_Device_Descriptor)
MOV Descriptor_Ptr,R6
MOV Descriptor_Ptr+01H,R7
?C0027:
; if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
; SOURCE LINE # 394
MOV R7,Kernel_Flag+03H
MOV A,R7
JB ACC.0,?C0028
; Descriptor_Ptr = &HS_Device_Descriptor[0]; //set pointer to device descriptor
; SOURCE LINE # 395
MOV R6,#HIGH (HS_Device_Descriptor)
MOV R7,#LOW (HS_Device_Descriptor)
MOV Descriptor_Ptr,R6
MOV Descriptor_Ptr+01H,R7
?C0028:
; count = *Descriptor_Ptr; //read in descriptor length
; SOURCE LINE # 396
MOV R6,Descriptor_Ptr
MOV R7,Descriptor_Ptr+01H
MOV DPL,R7
MOV DPH,R6
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV R6,#00H
MOV count,R6
MOV count+01H,R7
; //選擇端點號
; D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
; SOURCE LINE # 398
MOV DPTR,#D14_Cntrl_Reg+02CH
MOV A,#01H
MOVX @DPTR,A
; //寫下發送字節數
; D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 0x12;
; SOURCE LINE # 400
MOV DPTR,#D14_Cntrl_Reg+01CH
MOV A,#012H
MOVX @DPTR,A
; D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
; SOURCE LINE # 401
MOV DPTR,#D14_Cntrl_Reg+01DH
CLR A
MOVX @DPTR,A
?C0029:
; //send descriptor
; //發送描述符
; while(count != 0)
; SOURCE LINE # 404
MOV A,count+01H
ORL A,count
JZ ?C0030
; {
; SOURCE LINE # 405
; D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
; SOURCE LINE # 406
MOV R6,Descriptor_Ptr
MOV R7,Descriptor_Ptr+01H
MOV DPL,R7
MOV DPH,R6
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV DPTR,#D14_Cntrl_Reg+020H
MOV A,R7
MOVX @DPTR,A
; count--;
; SOURCE LINE # 407
MOV A,count+01H
DEC count+01H
JNZ ?C0214
DEC count
?C0214:
; Descriptor_Ptr++;
; SOURCE LINE # 408
INC Descriptor_Ptr+01H
MOV A,Descriptor_Ptr+01H
JNZ ?C0215
INC Descriptor_Ptr
?C0215:
; }
; SOURCE LINE # 409
SJMP ?C0029
?C0030:
; wait_ep0tx();
; SOURCE LINE # 410
LCALL wait_ep0tx
; ep0out_ack();
; SOURCE LINE # 411
LCALL ep0out_ack
; break;
; SOURCE LINE # 412
RET
;
; case 2 : //獲取配置描述符
; SOURCE LINE # 414
?C0031:
; USB_Int_Flag.BITS.EP0RX = 0;
; SOURCE LINE # 415
MOV R7,USB_Int_Flag+01H
MOV A,R7
ANL A,#0FBH
MOV USB_Int_Flag+01H,A
; Temp = 64;
; SOURCE LINE # 416
MOV Temp,#00H
MOV Temp+01H,#040H
; Descriptor_Ptr = &Standard_Config_Descriptor[0]; //set pointer to configuration descriptor
; SOURCE LINE # 417
MOV R6,#HIGH (Standard_Config_Descriptor)
MOV R7,#LOW (Standard_Config_Descriptor)
MOV Descriptor_Ptr,R6
MOV Descriptor_Ptr+01H,R7
; count = *Descriptor_Ptr; //get configuration Descriptor length
; SOURCE LINE # 418
MOV R6,Descriptor_Ptr
MOV R7,Descriptor_Ptr+01H
MOV DPL,R7
MOV DPH,R6
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV R6,#00H
MOV count,R6
MOV count+01H,R7
; //選擇端點號1
; D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
; SOURCE LINE # 420
MOV DPTR,#D14_Cntrl_Reg+02CH
MOV A,#01H
MOVX @DPTR,A
; //check if only configuration descriptor required
; //檢查描述符長度,決定是只發送配置描述符還是描述符集合
; if(count >= USB_Device_Request.wLength) //Send only Configuration descriptor
; SOURCE LINE # 423
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
CLR C
MOV A,count+01H
SUBB A,R7
MOV A,count
SUBB A,R6
JC ?C0032
; {
; SOURCE LINE # 424
; //寫入發送字節數
; D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
; SOURCE LINE # 426
MOV R0,#LOW (USB_Device_Request+07H)
MOV A,@R0
MOV R7,A
MOV DPTR,#D14_Cntrl_Reg+01CH
MOV A,R7
MOVX @DPTR,A
; D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (USB_Device_Request.wLength >> 8);
; SOURCE LINE # 427
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV A,R6
MOV R7,A
MOV R6,#00H
MOV DPTR,#D14_Cntrl_Reg+01DH
MOV A,R7
MOVX @DPTR,A
; //send descriptor
; //發送描述符
; for(count = 0 ; count < USB_Device_Request.wLength ; count++)
; SOURCE LINE # 430
MOV count,#00H
MOV count+01H,#00H
?C0033:
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
CLR C
MOV A,count+01H
SUBB A,R7
MOV A,count
SUBB A,R6
JNC ?C0034
; {
; SOURCE LINE # 431
; D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
; SOURCE LINE # 432
MOV R6,Descriptor_Ptr
MOV R7,Descriptor_Ptr+01H
MOV DPL,R7
MOV DPH,R6
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV DPTR,#D14_Cntrl_Reg+020H
MOV A,R7
MOVX @DPTR,A
; Descriptor_Ptr++;
; SOURCE LINE # 433
INC Descriptor_Ptr+01H
MOV A,Descriptor_Ptr+01H
JNZ ?C0216
INC Descriptor_Ptr
?C0216:
; }
; SOURCE LINE # 434
INC count+01H
MOV A,count+01H
JNZ ?C0217
INC count
?C0217:
SJMP ?C0033
?C0034:
; wait_ep0tx();
; SOURCE LINE # 435
LCALL wait_ep0tx
; ep0out_ack();
; SOURCE LINE # 436
LCALL ep0out_ack
; }
; SOURCE LINE # 437
RET
?C0032:
; else //send Configuration,Interface and Endpoint descriptor
; {
; SOURCE LINE # 439
; //發送描述符集合(配置+接口+端點)
; if(USB_Device_Request.wLength >= 32)
; SOURCE LINE # 441
MOV R0,#LOW (USB_Device_Request+06H)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
CLR C
MOV A,R7
SUBB A,#020H
MOV A,R6
SUBB A,#00H
JNC $ + 5H
LJMP ?C0037
; {
; SOURCE LINE # 442
?C0038:
; //寫入配置描述符
; while(count != 0)
; SOURCE LINE # 444
MOV A,count+01H
ORL A,count
JZ ?C0039
; {
; SOURCE LINE # 445
; D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
; SOURCE LINE # 446
MOV R6,Descriptor_Ptr
MOV R7,Descriptor_Ptr+01H
MOV DPL,R7
MOV DPH,R6
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV DPTR,#D14_Cntrl_Reg+020H
MOV A,R7
MOVX @DPTR,A
; count--;
; SOURCE LINE # 447
MOV A,count+01H
DEC count+01H
JNZ ?C0218
DEC count
?C0218:
; Descriptor_Ptr++;
; SOURCE LINE # 448
INC Descriptor_Ptr+01H
MOV A,Descriptor_Ptr+01H
JNZ ?C0219
INC Descriptor_Ptr
?C0219:
; }
; SOURCE LINE # 449
SJMP ?C0038
?C0039:
; //選擇高速還是全速接口描述符
; if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
; SOURCE LINE # 451
MOV R7,Kernel_Flag+03H
MOV A,R7
JNB ACC.0,?C0040
; Descriptor_Ptr = &Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
; SOURCE LINE # 452
MOV R6,#HIGH (Bulk_Interface_Descriptor)
MOV R7,#LOW (Bulk_Interface_Descriptor)
MOV Descriptor_Ptr,R6
MOV Descriptor_Ptr+01H,R7
?C0040:
; if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
; SOURCE LINE # 453
MOV R7,Kernel_Flag+03H
MOV A,R7
JB ACC.0,?C0041
; Descriptor_Ptr = &HS_Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
; SOURCE LINE # 454
MOV R6,#HIGH (HS_Bulk_Interface_Descriptor)
MOV R7,#LOW (HS_Bulk_Interface_Descriptor)
MOV Descriptor_Ptr,R6
MOV Descriptor_Ptr+01H,R7
?C0041:
; count = *Descriptor_Ptr; //get the descriptor count
; SOURCE LINE # 455
MOV R6,Descriptor_Ptr
MOV R7,Descriptor_Ptr+01H
MOV DPL,R7
MOV DPH,R6
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV R6,#00H
MOV count,R6
MOV count+01H,R7
?C0042:
; //寫入接口描述符
; while(count != 0)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -