📄 usb.lst
字号:
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 9
488 2 single_transmit(0, 0);
489 2 }
490 1 else
491 1 stall_ep0();
492 1 }
493
494 //特性设置
495 void set_feature(void)
496 {
497 1 unsigned char endp;
498 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
499 1
500 1 if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
501 1 { //设置远程唤醒功能
502 2 DISABLE;
503 2 bEPPflags.bits.remote_wakeup = 1;
504 2 ENABLE;
505 2 single_transmit(0, 0);
506 2 }
507 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT
-_STALL)
508 1 { //设置端点stall
509 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
510 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
511 2 /* clear TX stall for IN on EPn. */
512 2 D12_SetEndpointStatus(endp*2 + 1, 1);
513 2 else
514 2 /* clear RX stall for OUT on EPn. */
515 2 D12_SetEndpointStatus(endp*2, 1);
516 2 single_transmit(0, 0);
517 2 }
518 1 else
519 1 stall_ep0();
520 1 }
521
522 //设置地址
523 void set_address(void)
524 {
525 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
526 1 single_transmit(0, 0);
527 1 }
528
529 //获取描述符
530 void get_descriptor(void)
531 {
532 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
533 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
534 1 { //获取设备描述符
535 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
536 2 }
537 1 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
538 1 { //获取配置描述符
539 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
540 2 }
541 1 else
542 1 stall_ep0();
543 1 }
544 //获取配置状态
545 void get_configuration(void)
546 {
547 1 unsigned char c = bEPPflags.bits.configuration;
548 1 single_transmit(&c, 1);
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 10
549 1 }
550
551 //设置配置状态
552 void set_configuration(void)
553 {
554 1 if (ControlData.DeviceRequest.wValue == 0)
555 1 {
556 2 //设备进入未配置状态
557 2 single_transmit(0, 0);
558 2 DISABLE;
559 2 bEPPflags.bits.configuration = 0;
560 2 ENABLE;
561 2 init_unconfig();
562 2 }
563 1 else if (ControlData.DeviceRequest.wValue == 1)
564 1 {
565 2 //配置设备
566 2 single_transmit(0, 0);
567 2
568 2 init_unconfig();
569 2 init_config();
570 2 DISABLE;
571 2 bEPPflags.bits.configuration = 1;
572 2 ENABLE;
573 2 }
574 1 else
575 1 stall_ep0();
576 1 }
577
578 //获取接口状态
579 void get_interface(void)
580 {
581 1 unsigned char txdat = 0; /* Only/Current interface = 0 */
582 1 single_transmit(&txdat, 1);
583 1 }
584
585 //设置接口状态
586 void set_interface(void)
587 {
588 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0) single_transmit(0, 0)
-;
589 1 else
590 1 stall_ep0();
591 1 }
592
593 //设置地址使能
594 void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
595 {
596 1 if(bEPPflags.bits.in_isr == 0) DISABLE;
597 1 outportb(D12_COMMAND, 0xD0); //输出指令
598 1 if(bEnable) bAddress |= 0x80;
599 1 outportb(D12_DATA, bAddress); //设置地址
600 1 if(bEPPflags.bits.in_isr == 0) ENABLE;
601 1 }
602
603 //设置端点使能
604 void D12_SetEndpointEnable(unsigned char bEnable)
605 {
606 1 if(bEPPflags.bits.in_isr == 0)
607 1 DISABLE;
608 1
609 1 outportb(D12_COMMAND, 0xD8);//输出指令
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 11
610 1 if(bEnable)
611 1 outportb(D12_DATA, 1);//设置端点允许
612 1 else
613 1 outportb(D12_DATA, 0);//设置端点禁止
614 1
615 1 if(bEPPflags.bits.in_isr == 0)
616 1 ENABLE;
617 1 }
618
619 //模式设置
620 void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
621 {
622 1 if(bEPPflags.bits.in_isr == 0)
623 1 DISABLE;
624 1 outportb(D12_COMMAND, 0xF3);//设置模式
625 1 outportb(D12_DATA, bConfig);
626 1 outportb(D12_DATA, bClkDiv);
627 1 if(bEPPflags.bits.in_isr == 0)
628 1 ENABLE;
629 1 }
630
631 //DMA工作方式设置
632 void D12_SetDMA(unsigned char bMode)
633 {
634 1 if(bEPPflags.bits.in_isr == 0)
635 1 DISABLE;
636 1 outportb(D12_COMMAND, 0xFB);//设置DMA工作方式
637 1 outportb(D12_DATA, bMode);
638 1 if(bEPPflags.bits.in_isr == 0)
639 1 ENABLE;
640 1 }
641
642 //读取中断寄存器
643 unsigned short D12_ReadInterruptRegister(void)
644 {
645 1 unsigned char b1;
646 1 unsigned int j;
647 1 outportb(D12_COMMAND, 0xF4);//读取中断寄存器
648 1 b1 = inportb(D12_DATA);
649 1 j = inportb(D12_DATA);
650 1 j <<= 8;
651 1 j += b1;
652 1 return j;
653 1 }
654
655 //端点选择
656 unsigned char D12_SelectEndpoint(unsigned char bEndp)
657 {
658 1 unsigned char c;
659 1 if(bEPPflags.bits.in_isr == 0)
660 1 DISABLE;
661 1 outportb(D12_COMMAND, bEndp); //端点选择
662 1 c = inportb(D12_DATA);
663 1 if(bEPPflags.bits.in_isr == 0)
664 1 ENABLE;
665 1 return c;
666 1 }
667
668 //读取最后传输状态
669 unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
670 {
671 1 outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 12
672 1 return inportb(D12_DATA);
673 1 }
674
675 //读取端点状态
676 unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
677 {
678 1 unsigned char c;
679 1 if(bEPPflags.bits.in_isr == 0)
680 1 DISABLE;
681 1 outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
682 1 c = inportb(D12_DATA);
683 1 if(bEPPflags.bits.in_isr == 0)
684 1 ENABLE;
685 1 return c;
686 1 }
687
688 //设置端点状态
689 void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
690 {
691 1 if(bEPPflags.bits.in_isr == 0)
692 1 DISABLE;
693 1
694 1 outportb(D12_COMMAND, 0x40 + bEndp);//设置端点状态
695 1 outportb(D12_DATA, bStalled);
696 1
697 1 if(bEPPflags.bits.in_isr == 0)
698 1 ENABLE;
699 1 }
700
701 //传输恢复
702 void D12_SendResume(void)
703 {
704 1 outportb(D12_COMMAND, 0xF6);//设置发送恢复
705 1 }
706
707 //读取当前帧号
708 unsigned short D12_ReadCurrentFrameNumber(void)
709 {
710 1 unsigned short i,j;
711 1
712 1 if(bEPPflags.bits.in_isr == 0)
713 1 DISABLE;
714 1
715 1 outportb(D12_COMMAND, 0xF5);//读取当前帧数目
716 1 i= inportb(D12_DATA);
717 1 j = inportb(D12_DATA);
718 1 i += (j<<8);
719 1
720 1 if(bEPPflags.bits.in_isr == 0)
721 1 ENABLE;
722 1
723 1 return i;
724 1 }
725
726 unsigned short D12_ReadChipID(void)
727 {
728 1 unsigned short i,j;
729 1
730 1 if(bEPPflags.bits.in_isr == 0)
731 1 DISABLE;
732 1
733 1 outportb(D12_COMMAND, 0xFD);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -