📄 fusb200.lst
字号:
C51 COMPILER V7.50 FUSB200 11/21/2008 15:02:59 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE FUSB200
OBJECT MODULE PLACED IN FUSB200.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE FUSB200.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "FUSB200.h"
2 #include "type.h"
3 #include "reg51.h"
4 #include "absacc.h"
5 #include <stdio.h>
6 #include <string.h>
7
8 //for testing TX data
9 //const char code tdata[] = {0x55,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x
-55};
10
11 struct dev_req_s dev_req;
12
13 //Initialize M8051EW
14 void init_m8051ew()
15 {
16 1 //Enable global interrupt
17 1 EA = 1;
18 1 //Enable external interrput0
19 1 EX0 = 1;
20 1 //Edge
21 1 IT0 = 1;
22 1 // //Interrput priority
23 1 // PX0 = 1;
24 1 }
25
26 //Initialize USB controller
27 void init_fusb()
28 {
29 1 //int gTest = 0;
30 1 //int a,b,c;
31 1 //gTest = XBYTE[FUSB_REG_MAIN_CTL];
32 1
33 1 /* Initialize control register */
34 1 //Turn on D+/D- & Turn off UNPLUG
35 1 XBYTE[FUSB_REG_PHY_TMS] = 0x00;
36 1 //Test mode--Loop Back Test of CX
37 1 //XBYTE[FUSB_REG_TEST_EP] = 0x02;
38 1 //set CHIP_EN/SFRST/Global Interrupt
39 1 XBYTE[FUSB_REG_MAIN_CTL] = 0x34;
40 1 //Turn off SFRST
41 1 XBYTE[FUSB_REG_MAIN_CTL] = 0x24;
42 1 //Unmask group interruput(MINT_SCR0~MINT_SCR7)
43 1 XBYTE[FUSB_REG_INT_MGRP] = 0x00;
44 1 //Unmask CX interruput
45 1 XBYTE[FUSB_REG_INT_MSKB0] = 0x00;
46 1 //set suspend delay = 5ms
47 1 XBYTE[FUSB_REG_IDLE_CNT] |= 0x05;
48 1 }
49
50 //Initialize interrupt
51 void init_interrupt()
52 {
53 1 /* Initialize FIFO register */
54 1 XBYTE[FUSB_REG_EP1_MAP] = 0xf0; //EP1 IN map to FIFO0
C51 COMPILER V7.50 FUSB200 11/21/2008 15:02:59 PAGE 2
55 1 XBYTE[FUSB_REG_EP2_MAP] = 0x6f; //EP2 OUT map to FIFO6
56 1 XBYTE[FUSB_REG_FIFO0_MAP] = 0x11; //FIFO0 map to EP1 IN
57 1 XBYTE[FUSB_REG_FIFO6_MAP] = 0x02; //FIFO6 map to EP2 OUT
58 1 XBYTE[FUSB_REG_IEP1_XPSZ_L] = 0x00; //EP1 IN Max Packet Size (L)
59 1 XBYTE[FUSB_REG_IEP1_XPSZ_H] = 0x64; //EP1 IN Max Packet Size (H) = 1024 TX_NUM_HBW = 3
60 1 XBYTE[FUSB_REG_OEP2_XPSZ_L] = 0x00; //EP2 OUT Max Packet Size(L)
61 1 XBYTE[FUSB_REG_OEP2_XPSZ_H] = 0x04; //EP2 OUT Max Packet Size(H) = 1024
62 1 XBYTE[FUSB_REG_FIFO0_CFG] = 0x9a; //Set FIFO0 Size <= 1024, Triple buffer, bulk type
63 1 //revision
64 1 XBYTE[FUSB_REG_FIFO2_CFG] = 0x1a; //Set FIFO2 Size <= 1024, Triple buffer, bulk type
65 1 XBYTE[FUSB_REG_FIFO4_CFG] = 0x1a; //Set FIFO4 Size <= 1024, Triple buffer, bulk type
66 1
67 1 XBYTE[FUSB_REG_FIFO6_CFG] = 0x82; //Set FIFO6 Size <= 1024, Single buffer, bulk type
68 1 XBYTE[FUSB_REG_INT_MSKB0] |= 0x40; //FW read masked status of interrupt
69 1 }
70 //Delay function 30us
71 void delay(void)
72 {
73 1 u8 i = 0;
74 1
75 1 for (i=0;i<0x7f;i++)
76 1 {
77 2 //for(i=0;i<0x7fff;i++)
78 2 //{
79 2 ;
80 2 //}
81 2 }
82 1 return;
83 1 }
84
85 //EndPoint0 interrupt service
86 void ep0_int_service(void)
87 {
88 1 if(XBYTE[FUSB_REG_INT_SOURCE0] & FUSB_INT_SOURCE0_CX_SETUP_INT)
89 1 {
90 2 //u8 dev_configuration;
91 2 u8 meg[8];
92 2 //Clear CX_COM_INT
93 2 XBYTE[FUSB_REG_INT_SOURCE0] &= 0x7f;
94 2
95 2 //Device request, read EndPoint0 FIFO 8bit each time
96 2 meg[0] = XBYTE[FUSB_REG_EP0_DATA];
97 2 meg[1] = XBYTE[FUSB_REG_EP0_DATA];
98 2 meg[2] = XBYTE[FUSB_REG_EP0_DATA];
99 2 meg[3] = XBYTE[FUSB_REG_EP0_DATA];
100 2 meg[4] = XBYTE[FUSB_REG_EP0_DATA];
101 2 meg[5] = XBYTE[FUSB_REG_EP0_DATA];
102 2 meg[6] = XBYTE[FUSB_REG_EP0_DATA];
103 2 meg[7] = XBYTE[FUSB_REG_EP0_DATA];
104 2
105 2 //Get descriptor value to struct
106 2 dev_req.bmRequestType = meg[0];
107 2 dev_req.bRequest = meg[1];
108 2 dev_req.wValue = BYTE_TO_WORD(meg[3],meg[2]);
109 2 dev_req.wIndex = BYTE_TO_WORD(meg[5],meg[4]);
110 2 dev_req.wLength = BYTE_TO_WORD(meg[7],meg[6]);
111 2
112 2 //GetDescriptor request
113 2 if(dev_req.bmRequestType == 0x80 && dev_req.bRequest == 0x06)
114 2 {
115 3 if(dev_req.wValue == 0x0100)//Type--device descriptor
116 3 {
C51 COMPILER V7.50 FUSB200 11/21/2008 15:02:59 PAGE 3
117 4 //Clear EndPoint0 FIFO
118 4 XBYTE[FUSB_REG_CX_CSR] |= 0x08;
119 4 //Check EndPoint0 FIFO empty
120 4 if(XBYTE[FUSB_REG_CX_CSR] & 0x20)
121 4 {
122 5 //Device descriptor for host
123 5 XBYTE[FUSB_REG_EP0_DATA] = 0x12;//DeviceDscr.bLength;
124 5 XBYTE[FUSB_REG_EP0_DATA] = 0x01;//DeviceDscr.bDescriptorType;
125 5 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_LOW(DeviceDscr.bcdUSB);
126 5 XBYTE[FUSB_REG_EP0_DATA] = 0x02;//GET_HIGH(DeviceDscr.bcdUSB);
127 5 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.bDeviceClass; /*Means config the class in interface desc
-ription*/
128 5 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.bDeviceSubClass;
129 5 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.bDeviceProtocol;
130 5 XBYTE[FUSB_REG_EP0_DATA] = 0x40;//DeviceDscr.bMaxPacketSize0;
131 5 XBYTE[FUSB_REG_EP0_DATA] = 0x51;//GET_LOW(DeviceDscr.idVendor);/*Apply on www.usb.org*/
132 5 XBYTE[FUSB_REG_EP0_DATA] = 0x19;//GET_HIGH(DeviceDscr.idVendor);
133 5 XBYTE[FUSB_REG_EP0_DATA] = 0x03;//GET_LOW(DeviceDscr.idProduct);/*Defined by user*/
134 5 XBYTE[FUSB_REG_EP0_DATA] = 0x16;//GET_HIGH(DeviceDscr.idProduct);
135 5 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_LOW(DeviceDscr.bcdDevice);/**/
136 5 XBYTE[FUSB_REG_EP0_DATA] = 0x02;//GET_HIGH(DeviceDscr.bcdDevice);
137 5 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.iManufacturer;
138 5 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.iSerialNumber;
139 5 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.serialnum_str;
140 5 XBYTE[FUSB_REG_EP0_DATA] = 0x01;//DeviceDscr.bNumberConfigurations;
141 5 //CX writen done
142 5 XBYTE[FUSB_REG_CX_CSR] |= 0x01;
143 5 }
144 4 }
145 3 else if(dev_req.wValue == 0x0200)//Type--configuration descriptor
146 3 {
147 4 if(dev_req.wLength == 0x0009)
148 4 {
149 5 //Clear EndPoint0 FIFO
150 5 XBYTE[FUSB_REG_CX_CSR] |= 0x08;
151 5 //Check EndPoint0 FIFO empty
152 5 if(XBYTE[FUSB_REG_CX_CSR] & 0x20)
153 5 {
154 6 XBYTE[FUSB_REG_EP0_DATA] = 0x09;//ConfigurationDscr.bLength;
155 6 XBYTE[FUSB_REG_EP0_DATA] = 0x02;//ConfigurationDscr.bDescriptorType;
156 6 XBYTE[FUSB_REG_EP0_DATA] = 0x20;//GET_LOW(ConfigurationDscr.wTotalLength);
157 6 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_HIGH(ConfigurationDscr.wTotalLength);
158 6 XBYTE[FUSB_REG_EP0_DATA] = 0x01;//ConfigurationDscr.bNumInterfaces;
159 6 XBYTE[FUSB_REG_EP0_DATA] = 0x01;//ConfigurationDscr.bConfigurationValue;
160 6 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//ConfigurationDscr.iConfiguration;
161 6 XBYTE[FUSB_REG_EP0_DATA] = 0xc0;//ConfigurationDscr.bmAttributes;
162 6 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//ConfigurationDscr.bMaxpower;
163 6
164 6 //CX writen done
165 6 XBYTE[FUSB_REG_CX_CSR] |= 0x01;
166 6 }
167 5 }
168 4 else
169 4 {
170 5 //Clear EndPoint0 FIFO
171 5 XBYTE[FUSB_REG_CX_CSR] |= 0x08;
172 5 //Check EndPoint0 FIFO empty
173 5 if(XBYTE[FUSB_REG_CX_CSR] & 0x20)
174 5 {
175 6 //Configuration description
176 6 XBYTE[FUSB_REG_EP0_DATA] = 0x09;//ConfigurationDscr.bLength;
177 6 XBYTE[FUSB_REG_EP0_DATA] = 0x02;//ConfigurationDscr.bDescriptorType;
C51 COMPILER V7.50 FUSB200 11/21/2008 15:02:59 PAGE 4
178 6 XBYTE[FUSB_REG_EP0_DATA] = 0x20;//GET_LOW(ConfigurationDscr.wTotalLength);
179 6 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_HIGH(ConfigurationDscr.wTotalLength);
180 6 XBYTE[FUSB_REG_EP0_DATA] = 0x01;//ConfigurationDscr.bNumInterfaces;
181 6 XBYTE[FUSB_REG_EP0_DATA] = 0x01;//ConfigurationDscr.bConfigurationValue;
182 6 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//ConfigurationDscr.iConfiguration;
183 6 XBYTE[FUSB_REG_EP0_DATA] = 0xc0;//ConfigurationDscr.bmAttributes;
184 6 XBYTE[FUSB_REG_EP0_DATA] = 0x00;//ConfigurationDscr.bMaxpower;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -