📄 chap9.lst
字号:
C51 COMPILER V7.01 CHAP9 09/27/2003 23:46:52 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE CHAP9
OBJECT MODULE PLACED IN chap9.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE chap9.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2
3 #include <stdio.h>
4 #include <string.h>
5
6 //#include <reg51.h> /* special function register declarations */
7
8 #include "Epphal.h"
9 #include "d12ci.h"
10 #include "mainloop.h"
11 #include "USB100.h"
12 #include "chap9.h"
13
14 //---------------------------
15 extern void single_transmit(unsigned char * buf, unsigned char len);
16 extern void code_transmit(unsigned char code * pRomData, unsigned short len);
17 extern void stall_ep0(void);
18 extern void init_unconfig(void);
19 extern void init_config(void);
20
21 #define NUM_ENDPOINTS 4
22
23 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
24 + sizeof(USB_INTERFACE_DESCRIPTOR) \
25 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
26
27 extern CONTROL_XFER ControlData;
28 extern IO_REQUEST idata ioRequest;
29 extern EPPFLAGS bEPPflags;
30
31 code USB_DEVICE_DESCRIPTOR DeviceDescr =
32 {
33 sizeof(USB_DEVICE_DESCRIPTOR),
34 USB_DEVICE_DESCRIPTOR_TYPE,
35 SWAP(0x0100),
36 USB_CLASS_CODE_TEST_CLASS_DEVICE,
37 0,
38 0,
39 EP0_PACKET_SIZE,
40 SWAP(0x0471), //VID
41 SWAP(0x0666), //PID
42 SWAP(0x0100),
43 0, //Manufactory
44 0, //Product
45 0, //Serial Number
46 25 //Number of possible configurations
47 };
48
49 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
50 {
51 sizeof(USB_CONFIGURATION_DESCRIPTOR),
52 USB_CONFIGURATION_DESCRIPTOR_TYPE,
53 SWAP(CONFIG_DESCRIPTOR_LENGTH),
54 1,
55 1,
C51 COMPILER V7.01 CHAP9 09/27/2003 23:46:52 PAGE 2
56 0,
57 0x60,
58 0xf0
59 //0x1
60 };
61
62 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
63 {
64 sizeof(USB_INTERFACE_DESCRIPTOR),
65 USB_INTERFACE_DESCRIPTOR_TYPE,
66 0,
67 0,
68 NUM_ENDPOINTS,
69 USB_CLASS_CODE_TEST_CLASS_DEVICE,
70 USB_SUBCLASS_CODE_TEST_CLASS_D12,
71 USB_PROTOCOL_CODE_TEST_CLASS_D12,
72 0
73 };
74
75 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
76 {
77 sizeof(USB_ENDPOINT_DESCRIPTOR),
78 USB_ENDPOINT_DESCRIPTOR_TYPE,
79 0x81,
80 USB_ENDPOINT_TYPE_INTERRUPT,
81 SWAP(EP1_PACKET_SIZE),
82 10
83 };
84
85 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
86 {
87 sizeof(USB_ENDPOINT_DESCRIPTOR),
88 USB_ENDPOINT_DESCRIPTOR_TYPE,
89 0x1,
90 USB_ENDPOINT_TYPE_INTERRUPT,
91 SWAP(EP1_PACKET_SIZE),
92 10
93 };
94
95 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
96 {
97 sizeof(USB_ENDPOINT_DESCRIPTOR),
98 USB_ENDPOINT_DESCRIPTOR_TYPE,
99 0x82,
100 USB_ENDPOINT_TYPE_BULK,
101 SWAP(EP2_PACKET_SIZE),
102 10
103 };
104
105 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
106 {
107 sizeof(USB_ENDPOINT_DESCRIPTOR),
108 USB_ENDPOINT_DESCRIPTOR_TYPE,
109 0x2,
110 USB_ENDPOINT_TYPE_BULK,
111 SWAP(EP2_PACKET_SIZE),
112 10
113 };
114
115 /*
116 //*************************************************************************
117 // USB Protocol Layer
C51 COMPILER V7.01 CHAP9 09/27/2003 23:46:52 PAGE 3
118 //*************************************************************************
119 */
120
121 void reserved(void)
122 {
123 1 stall_ep0();
124 1 }
125
126 /*
127 //*************************************************************************
128 // USB standard device requests
129 //*************************************************************************
130 */
131
132 void get_status(void)
133 {
134 1 unsigned char endp, txdat[2];
135 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
136 1 unsigned char c;
137 1
138 1 if (bRecipient == USB_RECIPIENT_DEVICE)
139 1 {
140 2 if(bEPPflags.bits.remote_wakeup == 1)
141 2 {
142 3 txdat[0] = 3;
143 3 }
144 2 else
145 2 {
146 3 txdat[0] = 1;
147 3 }
148 2 txdat[1]=0;
149 2 single_transmit(txdat, 2);
150 2 }
151 1 else if (bRecipient == USB_RECIPIENT_INTERFACE)
152 1 {
153 2 txdat[0]=0;
154 2 txdat[1]=0;
155 2 single_transmit(txdat, 2);
156 2 }
157 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT)
158 1 {
159 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
160 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
161 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
162 2
163 2
164 2 else
165 2 {
166 3 c = D12_SelectEndpoint(endp*2); /* Control-out */
167 3 }
168 2 if(c & D12_STALL)
169 2 {
170 3 txdat[0] = 1;
171 3 }
172 2 else
173 2 {
174 3 txdat[0] = 0;
175 3 }
176 2 txdat[1] = 0;
177 2 single_transmit(txdat, 2);
178 2 }
179 1 else
C51 COMPILER V7.01 CHAP9 09/27/2003 23:46:52 PAGE 4
180 1 {
181 2 stall_ep0();
182 2 }
183 1 }
184
185 void clear_feature(void)
186 {
187 1 unsigned char endp;
188 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
189 1
190 1 if (bRecipient == USB_RECIPIENT_DEVICE
191 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
192 1 {
193 2 DISABLE;
194 2 bEPPflags.bits.remote_wakeup = 0;
195 2 ENABLE;
196 2 single_transmit(0, 0);
197 2 }
198 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
199 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
200 1 {
201 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
202 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
203 2 { // clear TX stall for IN on EPn.
204 3 D12_SetEndpointStatus(endp*2 + 1, 0);
205 3 }
206 2 else
207 2 { // clear RX stall for OUT on EPn.
208 3 D12_SetEndpointStatus(endp*2, 0);
209 3 }
210 2 single_transmit(0, 0);
211 2 }
212 1 else
213 1 {
214 2 stall_ep0();
215 2 }
216 1 }
217
218 void set_feature(void)
219 {
220 1 unsigned char endp;
221 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
222 1
223 1 if (bRecipient == USB_RECIPIENT_DEVICE
224 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
225 1 {
226 2 DISABLE;
227 2 bEPPflags.bits.remote_wakeup = 1;
228 2 ENABLE;
229 2 single_transmit(0, 0);
230 2 }
231 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
232 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
233 1 {
234 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
235 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
236 2 { // clear TX stall for IN on EPn.
237 3 D12_SetEndpointStatus(endp*2 + 1, 1);
238 3 }
239 2 else
240 2 { // clear RX stall for OUT on EPn.
241 3 D12_SetEndpointStatus(endp*2, 1);
C51 COMPILER V7.01 CHAP9 09/27/2003 23:46:52 PAGE 5
242 3 }
243 2 single_transmit(0, 0);
244 2 }
245 1 else
246 1 {
247 2 stall_ep0();
248 2 }
249 1 }
250
251 void set_address(void)
252 {
253 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
254 1 DEVICE_ADDRESS_MASK), 1);
255 1 single_transmit(0, 0);
256 1 }
257
258 void get_descriptor(void)
259 {
260 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
261 1
262 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
263 1 {
264 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
265 2 }
266 1 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
267 1 {
268 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
269 2 }
270 1 else
271 1 stall_ep0();
272 1 }
273
274 void get_configuration(void)
275 {
276 1 unsigned char c = bEPPflags.bits.configuration;
277 1
278 1 single_transmit(&c, 1);
279 1 }
280
281 void set_configuration(void)
282 {
283 1 if (ControlData.DeviceRequest.wValue == 0)
284 1 {
285 2 //* put device in unconfigured state
286 2 single_transmit(0, 0);
287 2 DISABLE;
288 2 bEPPflags.bits.configuration = 0;
289 2 ENABLE;
290 2 init_unconfig();
291 2 } else if (ControlData.DeviceRequest.wValue == 1)
292 1 {
293 2 // Configure device
294 2 single_transmit(0, 0);
295 2
296 2 init_unconfig();
297 2 init_config();
298 2
299 2 DISABLE;
300 2 bEPPflags.bits.configuration = 1;
301 2 ENABLE;
302 2 }
303 1 else
C51 COMPILER V7.01 CHAP9 09/27/2003 23:46:52 PAGE 6
304 1 {
305 2 stall_ep0();
306 2 }
307 1 }
308
309 void get_interface(void)
310 {
311 1 unsigned char txdat = 0; // Only/Current interface = 0
312 1 single_transmit(&txdat, 1);
313 1 }
314
315 void set_interface(void)
316 {
317 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
318 1 {
319 2 single_transmit(0, 0);
320 2 }
321 1 else
322 1 {
323 2 stall_ep0();
324 2 }
325 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 448 ----
CONSTANT SIZE = 64 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
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 + -