?? chap_9.lst
字號:
380 5 //讀取ISP1581中斷寄存器
381 5 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
382 5 //回寫ISP1581中斷寄存器
383 5 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
384 5 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
385 5 return;
386 5 }
387 4 USB_Int_Flag.BITS.EP0TX = 0;
388 4 break;
389 4 }
390 3 }
391 2 }
392 1 }
393
394 //***********************************************************************
395 //* *
396 //* Routine : *
397 //* Input : None *
398 //* Output : None *
399 //* Function : *
400 //* *
401 //***********************************************************************
402
403 void reserved(void)
404 {
405 1 }
406
407
408 //Get_Descriptor()獲取描述符
409 void get_descriptor(void)
410 {
411 1
412 1 switch(USB_Device_Request.wValue)
413 1 {
414 2 case 1://設備描述符
415 2 //選擇描述符
416 2 if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
417 2 Descriptor_Ptr = &Standard_Device_Descriptor[0]; //set pointer to device descriptor
418 2 if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
419 2 Descriptor_Ptr = &HS_Device_Descriptor[0]; //set pointer to device descriptor
420 2 count = *Descriptor_Ptr; //read in descriptor length
421 2 //選擇端點號
422 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
423 2 //寫下發送字節數
424 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 0x12;
425 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
426 2 //send descriptor
427 2 //發送描述符
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 8
428 2 while(count != 0)
429 2 {
430 3 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
431 3 count--;
432 3 Descriptor_Ptr++;
433 3 }
434 2 wait_ep0tx();
435 2 ep0out_ack();
436 2 break;
437 2
438 2 case 2 : //獲取配置描述符
439 2 USB_Int_Flag.BITS.EP0RX = 0;
440 2 Temp = 64;
441 2 Descriptor_Ptr = &Standard_Config_Descriptor[0]; //set pointer to configuration descriptor
442 2 count = *Descriptor_Ptr; //get configuration Descriptor length
443 2 //選擇端點號1
444 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
445 2 //check if only configuration descriptor required
446 2 //檢查描述符長度,決定是只發送配置描述符還是描述符集合
447 2 if(count >= USB_Device_Request.wLength) //Send only Configuration descriptor
448 2 {
449 3 //寫入發送字節數
450 3 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
451 3 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (USB_Device_Request.wLength >> 8);
452 3 //send descriptor
453 3 //發送描述符
454 3 for(count = 0 ; count < USB_Device_Request.wLength ; count++)
455 3 {
456 4 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
457 4 Descriptor_Ptr++;
458 4 }
459 3 wait_ep0tx();
460 3 ep0out_ack();
461 3 }
462 2 else //send Configuration,Interface and Endpoint descriptor
463 2 {
464 3 //發送描述符集合(配置+接口+端點)
465 3 if(USB_Device_Request.wLength >= 32)
466 3 {
467 4 //寫入配置描述符
468 4 while(count != 0)
469 4 {
470 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
471 5 count--;
472 5 Descriptor_Ptr++;
473 5 }
474 4 //選擇高速還是全速接口描述符
475 4 if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
476 4 Descriptor_Ptr = &Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
477 4 if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
478 4 Descriptor_Ptr = &HS_Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
479 4 count = *Descriptor_Ptr; //get the descriptor count
480 4 //寫入接口描述符
481 4 while(count != 0)
482 4 {
483 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
484 5 count--;
485 5 Descriptor_Ptr++;
486 5 }
487 4 //選擇高速還是全速端點1IN描述符
488 4 if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
489 4 Descriptor_Ptr = &Int_In_Descriptor[0]; //set pointer to interface descriptor
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 9
490 4 if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
491 4 Descriptor_Ptr = &HS_Int_In_Descriptor[0]; //set pointer to interface descriptor
492 4 count = *Descriptor_Ptr; //read in descriptor length
493 4 //寫入端點1IN描述符
494 4 while(count != 0)
495 4 {
496 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
497 5 count--;
498 5 Descriptor_Ptr++;
499 5 }
500 4 //選擇高速還是全速端點1OUT描述符
501 4 if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
502 4 Descriptor_Ptr = &Int_Out_Descriptor[0]; //set pointer to interface descriptor
503 4 if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
504 4 Descriptor_Ptr = &HS_Int_Out_Descriptor[0]; //set pointer to interface descriptor
505 4 count = *Descriptor_Ptr; //read in descriptor length
506 4 //寫入端點1OUT描述符
507 4 while(count != 0)
508 4 {
509 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
510 5 count--;
511 5 Descriptor_Ptr++;
512 5 }
513 4 //選擇高速還是全速端點2IN描述符
514 4 if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
515 4 Descriptor_Ptr = &Bulk_In_Descriptor[0]; //set pointer to interface descriptor
516 4 if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
517 4 Descriptor_Ptr = &HS_Bulk_In_Descriptor[0]; //set pointer to interface descriptor
518 4 count = *Descriptor_Ptr; //read in descriptor length
519 4 //寫入端點2IN描述符
520 4 while(count != 0)
521 4 {
522 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
523 5 count--;
524 5 Descriptor_Ptr++;
525 5 }
526 4 //選擇高速還是全速端點2OUT描述符
527 4 if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
528 4 Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
529 4 if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
530 4 Descriptor_Ptr = &HS_Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
531 4 count = *Descriptor_Ptr; //read in descriptor length
532 4 //寫入端點2OUT描述符
533 4 while(count != 0)
534 4 {
535 5 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
536 5 count--;
537 5 Descriptor_Ptr++;
538 5 }
539 4 }
540 3 //使端點有效
541 3 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1; //validate FIFO
542 3 wait_ep0tx();
543 3 ep0out_ack();
544 3 }
545 2 break;
546 2
547 2 case 3: //獲取字符串描述符
548 2 Descriptor_Ptr = &Standard_String_ID[0]; //set pointer to interface descriptor
549 2 count = *Descriptor_Ptr; //get length
550 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
551 2 if(USB_Device_Request.wLength < count)
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 10
552 2 count = USB_Device_Request.wLength; //get the remaining length
553 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = count;
554 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
555 2 //send string ID
556 2 while(count != 0)
557 2 {
558 3 D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr; //fill up FIFO
559 3 Descriptor_Ptr++;
560 3 count--;
561 3 }
562 2 wait_ep0tx();
563 2 ep0out_ack();
564 2 break;
565 2
566 2
567 2 case 4:
568 2 reserved();
569 2 break;
570 2
571 2 case 5: //獲取端點描述符
572 2 Temp = 0;
573 2 if((USB_Device_Request.wValue & 0x00ff) > 0x0001)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -