📄 usb.lst
字号:
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 13
734 1 i=inportb(D12_DATA);
735 1 j=inportb(D12_DATA);
736 1 i += (j<<8);
737 1
738 1 if(bEPPflags.bits.in_isr == 0)
739 1 ENABLE;
740 1
741 1 return i;
742 1 }
743
744 //读取端点数据
745 unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
746 {
747 1 unsigned char i, j;
748 1
749 1 if(bEPPflags.bits.in_isr == 0)
750 1 DISABLE;
751 1
752 1 outportb(D12_COMMAND, endp);
753 1 if((inportb(D12_DATA) & D12_FULLEMPTY) == 0)
754 1 {
755 2 if(bEPPflags.bits.in_isr == 0)
756 2 ENABLE;
757 2 return 0;
758 2 }
759 1
760 1 outportb(D12_COMMAND, 0xF0);
761 1 j = inportb(D12_DATA);
762 1 j = inportb(D12_DATA);
763 1
764 1 if(j > len)
765 1 j = len;
766 1
767 1 for(i=0; i<j; i++)
768 1 *(buf+i) = inportb(D12_DATA);
769 1
770 1 outportb(D12_COMMAND, 0xF2);
771 1
772 1 if(bEPPflags.bits.in_isr == 0)
773 1 ENABLE;
774 1
775 1 return j;
776 1 }
777
778 //写端点
779 unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
780 {
781 1 unsigned char i;
782 1
783 1 if(bEPPflags.bits.in_isr == 0)
784 1 DISABLE;
785 1
786 1 outportb(D12_COMMAND, endp);
787 1 i = inportb(D12_DATA);
788 1
789 1 outportb(D12_COMMAND, 0xF0);
790 1 outportb(D12_DATA, 0);
791 1 outportb(D12_DATA, len);
792 1
793 1 for(i=0; i<len; i++)
794 1 outportb(D12_DATA, *(buf+i));
795 1
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 14
796 1 outportb(D12_COMMAND, 0xFA);
797 1
798 1 if(bEPPflags.bits.in_isr == 0)
799 1 ENABLE;
800 1
801 1 return len;
802 1 }
803
804 //设置端点应答
805 void D12_AcknowledgeEndpoint(unsigned char endp)
806 {
807 1 outportb(D12_COMMAND, endp);
808 1 outportb(D12_COMMAND, 0xF1);
809 1 if(endp == 0)
810 1 outportb(D12_COMMAND, 0xF2);
811 1 }
812
813 //输出数据
814 void outportb(unsigned int Addr, unsigned char Data)
815 {
816 1 *((unsigned char xdata *) Addr) = Data;
817 1 }
818
819 //输入数据
820 unsigned char inportb(unsigned int Addr)
821 {
822 1 return *((unsigned char xdata *) Addr);
823 1 }
824
825
826 //获取固件版本号
827 void get_firmware_version()
828 {
829 1 unsigned char i;
830 1
831 1 i = 0x31; // firmware version number
832 1 single_transmit((unsigned char *)&i, 1);
833 1 }
834
835 //获取端点2缓存区大小
836 void get_buffer_size()
837 {
838 1 unsigned char i[4];
839 1 if(bNoRAM == TRUE)
840 1 {
841 2 i[0] = EP2_PACKET_SIZE;
842 2 i[1] = 0;
843 2 i[2] = 0;
844 2 i[3] = 0;
845 2 }
846 1 else
847 1 {
848 2 i[0] = 0;
849 2 i[1] = 1;
850 2 i[2] = 0;
851 2 i[3] = 0;
852 2 }
853 1 single_transmit((unsigned char *)&i, 4);
854 1 }
855
856 //厂商请求处理
857 void read_write_register(void)
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 15
858 {
859 1 unsigned char i,len,epstatus;
860 1
861 1 if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
862 1 {
863 2 if(bEPPflags.bits.verbose)
864 2 printf("Read Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n",
865 2 ControlData.DeviceRequest.wValue,
866 2 ControlData.DeviceRequest.wLength,
867 2 ControlData.DeviceRequest.wIndex);
868 2
869 2 if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION &&
870 2 ControlData.DeviceRequest.wValue == 0 &&
871 2 ControlData.DeviceRequest.wLength == 1)
872 2 get_firmware_version();//获取固件版本号
873 2 else
874 2 if(ControlData.DeviceRequest.wIndex == GET_BUFFER_SIZE &&
875 2 ControlData.DeviceRequest.wValue == 0 &&
876 2 ControlData.DeviceRequest.wLength == 4)
877 2 get_buffer_size();//获取缓冲区大小
878 2 else
879 2 stall_ep0();
880 2
881 2 } // if read register
882 1 else
883 1 {
884 2 if(bEPPflags.bits.verbose)
885 2 {
886 3
887 3 printf("Write Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n",
888 3 ControlData.DeviceRequest.wValue,
889 3 ControlData.DeviceRequest.wLength,
890 3 ControlData.DeviceRequest.wIndex);
891 3
892 3 printf("Data: ");
893 3 for(i = 0; i < ControlData.DeviceRequest.wLength; i ++)
894 3 printf("0x%bx, ", *((ControlData.dataBuffer)+i));
895 3 printf("\n");
896 3 }
897 2
898 2 if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST &&
899 2 ControlData.DeviceRequest.wValue == 0 &&
900 2 ControlData.DeviceRequest.wLength == 6)
901 2 {
902 3 if(ControlData.dataBuffer[5]==0x81)
903 3 {
904 4 D12_WriteEndpoint(5, ControlData.dataBuffer[3], EpBuf);//发送数据
905 4 }
906 3 if(ControlData.dataBuffer[5]==0x80)
907 3 {
908 4 epstatus=D12_ReadEndpointStatus(4);
909 4 epstatus &= 0x60;
910 4 if (epstatus == 0x60)
911 4 len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
912 4 }
913 3 single_transmit(0, 0);
914 3 //setup_dma_request();//DMA设置处理,因为未使用DMA所以屏蔽掉
915 3 }
916 2 else
917 2 stall_ep0();
918 2 } // if write register
919 1 }
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 16
920
921 //定时器0初始化程序
922 //定时器用来定时检测按键状态
923 void init_timer0(void)
924 {
925 1 TMOD &= 0XF0; /* clear Timer 0 */
926 1 TMOD |= 0X1;
927 1 TL0 = 0X0; /* value set by user */
928 1 TH0 = 0X0; /* value set by user */
929 1 ET0 = 1; /* IE.1*/
930 1 TR0 = 1; /* TCON.4 start timer */
931 1 PT0 = 1;
932 1
933 1 EA = 1;
934 1 }
935 //中断设置
936 void init_special_interrupts(void)
937 {
938 1 IT0 = 0;
939 1 EX0 = 1;
940 1 PX0 = 0;
941 1 }
942
943 //I/O口初始化程序
944 void init_port()
945 {
946 1 P0 = 0xFF;
947 1 P1 = 0xFF;
948 1 P2 = 0xFF;
949 1 P3 = 0xFF;
950 1 MCU_D12CS = 0x0;
951 1 D12SUSPD = 0;
952 1 }
953
954 //串行口设置
955 void init_serial(void)
956 {
957 1 SCON = 0X52;
958 1 PCON = 0X80 | PCON;
959 1 TMOD = 0X20;
960 1 TCON = 0x69; // TCON
961 1 TH1 = 0xFA;
962 1 }
963
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2899 ----
CONSTANT SIZE = 931 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 56
IDATA SIZE = 86 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -