📄 chap_9.lst
字号:
C51 COMPILER V7.08 CHAP_9 03/11/2005 10:40:00 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN Chap_9.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Chap_9.c OPTIMIZE(2,SPEED) DEBUG OBJECTEXTEND
line level source
1 /*
2 //*************************************************************************
3 //
4 // ZLGMCU
5 // www.zlgmcu.com
6 // File Name: chap_9.C
7 // Revision: 0.2(2002-04-08)
8 // Author: Liu Ying Bin
9 // Use library: USB51S.LIB
10 // Note: USB51S.LIB不带DMA控制功能
11 //*************************************************************************
12 */
13
14 #include <stdio.h>
15 #include <string.h>
16
17 #include <reg51.h> /* special function register declarations */
18
19 //#include "epphal.h"
20 #include "d12ci.h"
21 #include "mainloop.h"
22 #include "isr.h"
23 #include "usb100.h"
24 #include "chap_9.h"
25
26 #define NUM_ENDPOINTS 4
27
28 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
29 + sizeof(USB_INTERFACE_DESCRIPTOR) \
30 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
31
32 extern CONTROL_XFER ControlData;
33 extern IO_REQUEST idata ioRequest;
34 extern EPPFLAGS bEPPflags;
35 extern code void (*VendorDeviceRequest[])(void);
36
37 //extern void help_devreq(unsigned char typ, unsigned char req);
38
39
40 /*
41 //*************************************************************************
42 // USB protocol function pointer arrays
43 //*************************************************************************
44 */
45
46 //USB标准设备请求入口地址指针表
47 code void (*StandardDeviceRequest[])(void) =
48 {
49 get_status,
50 clear_feature,
51 reserved,
52 set_feature,
53 reserved,
54 set_address,
55 get_descriptor,
C51 COMPILER V7.08 CHAP_9 03/11/2005 10:40:00 PAGE 2
56 reserved,
57 get_configuration,
58 set_configuration,
59 get_interface,
60 set_interface,
61 reserved,
62 reserved,
63 reserved,
64 reserved
65 };
66
67
68 //设备描述符
69 code USB_DEVICE_DESCRIPTOR DeviceDescr =
70 {
71 sizeof(USB_DEVICE_DESCRIPTOR),
72 USB_DEVICE_DESCRIPTOR_TYPE,
73 SWAP(0x0100),
74 USB_CLASS_CODE_TEST_CLASS_DEVICE,
75 0, 0,
76 EP0_PACKET_SIZE,
77 SWAP(0x0471),
78 SWAP(0x0666),
79 SWAP(0x0100),
80 0, 0, 0,
81 25
82 };
83
84 //配置描述符
85 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
86 {
87 sizeof(USB_CONFIGURATION_DESCRIPTOR),
88 USB_CONFIGURATION_DESCRIPTOR_TYPE,
89 SWAP(CONFIG_DESCRIPTOR_LENGTH),
90 1,
91 1,
92 0,
93 0x60,
94 0x1
95 };
96
97 //接口描述符
98 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
99 {
100 sizeof(USB_INTERFACE_DESCRIPTOR),
101 USB_INTERFACE_DESCRIPTOR_TYPE,
102 0,
103 0,
104 NUM_ENDPOINTS,
105 USB_CLASS_CODE_TEST_CLASS_DEVICE,
106 USB_SUBCLASS_CODE_TEST_CLASS_D12,
107 USB_PROTOCOL_CODE_TEST_CLASS_D12,
108 0
109 };
110
111 //端点描述符
112 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
113 {
114 sizeof(USB_ENDPOINT_DESCRIPTOR),
115 USB_ENDPOINT_DESCRIPTOR_TYPE,
116 0x81,
117 USB_ENDPOINT_TYPE_INTERRUPT,
C51 COMPILER V7.08 CHAP_9 03/11/2005 10:40:00 PAGE 3
118 SWAP(EP1_PACKET_SIZE),
119 10
120 };
121
122 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
123 {
124 sizeof(USB_ENDPOINT_DESCRIPTOR),
125 USB_ENDPOINT_DESCRIPTOR_TYPE,
126 0x1,
127 USB_ENDPOINT_TYPE_INTERRUPT,
128 SWAP(EP1_PACKET_SIZE),
129 10
130 };
131
132 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
133 {
134 sizeof(USB_ENDPOINT_DESCRIPTOR),
135 USB_ENDPOINT_DESCRIPTOR_TYPE,
136 0x82,
137 USB_ENDPOINT_TYPE_BULK,
138 // USB_ENDPOINT_TYPE_INTERRUPT,
139 // USB_ENDPOINT_TYPE_ISOCHRONOUS,
140 SWAP(EP2_PACKET_SIZE),
141 // SWAP(128), //for iso mode
142 1
143 };
144
145 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
146 {
147 sizeof(USB_ENDPOINT_DESCRIPTOR),
148 USB_ENDPOINT_DESCRIPTOR_TYPE,
149 0x2,
150 USB_ENDPOINT_TYPE_BULK,
151 // USB_ENDPOINT_TYPE_INTERRUPT,
152 SWAP(EP2_PACKET_SIZE),
153 1
154 };
155
156 /*
157 //*************************************************************************
158 // USB Protocol Layer
159 //*************************************************************************
160 */
161
162 void reserved(void)
163 {
164 1 stall_ep0();
165 1 }
166
167 /*
168 //*************************************************************************
169 // USB standard device requests
170 //*************************************************************************
171 */
172
173
174 void get_status(void)
175 {
176 1 unsigned char endp, txdat[2];
177 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
178 1 unsigned char c;
179 1
C51 COMPILER V7.08 CHAP_9 03/11/2005 10:40:00 PAGE 4
180 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
181 2 if(bEPPflags.bits.remote_wakeup == 1)
182 2 txdat[0] = 3;
183 2 else
184 2 txdat[0] = 1;
185 2 txdat[1]=0;
186 2 single_transmit(txdat, 2);
187 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
188 2 txdat[0]=0;
189 2 txdat[1]=0;
190 2 single_transmit(txdat, 2);
191 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
192 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
193 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
194 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
195 2 else
196 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
197 2 if(c & D12_STALL)
198 2 txdat[0] = 1;
199 2 else
200 2 txdat[0] = 0;
201 2 txdat[1] = 0;
202 2 single_transmit(txdat, 2);
203 2 } else
204 1 stall_ep0();
205 1 }
206
207 void clear_feature(void)
208 {
209 1 unsigned char endp;
210 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
211 1
212 1 if (bRecipient == USB_RECIPIENT_DEVICE
213 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
214 2 DISABLE;
215 2 bEPPflags.bits.remote_wakeup = 0;
216 2 ENABLE;
217 2 single_transmit(0, 0);
218 2 }
219 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
220 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
221 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
222 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
223 2 /* clear TX stall for IN on EPn. */
224 2 D12_SetEndpointStatus(endp*2 + 1, 0);
225 2 else
226 2 /* clear RX stall for OUT on EPn. */
227 2 D12_SetEndpointStatus(endp*2, 0);
228 2 single_transmit(0, 0);
229 2 } else
230 1 stall_ep0();
231 1 }
232
233 void set_feature(void)
234 {
235 1 unsigned char endp;
236 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
237 1
238 1 if (bRecipient == USB_RECIPIENT_DEVICE
239 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
240 2 DISABLE;
241 2 bEPPflags.bits.remote_wakeup = 1;
C51 COMPILER V7.08 CHAP_9 03/11/2005 10:40:00 PAGE 5
242 2 ENABLE;
243 2 single_transmit(0, 0);
244 2 }
245 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
246 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
247 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
248 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
249 2 /* clear TX stall for IN on EPn. */
250 2 D12_SetEndpointStatus(endp*2 + 1, 1);
251 2 else
252 2 /* clear RX stall for OUT on EPn. */
253 2 D12_SetEndpointStatus(endp*2, 1);
254 2 single_transmit(0, 0);
255 2 } else
256 1 stall_ep0();
257 1 }
258
259 void set_address(void)
260 {
261 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
262 1 DEVICE_ADDRESS_MASK), 1);
263 1 single_transmit(0, 0);
264 1 }
265
266 void get_descriptor(void)
267 {
268 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
269 1
270 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
271 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
272 2 } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
273 2 if (ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
274 2 {ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;}
275 2 code_transmit((unsigned char code *)&ConfigDescr, ControlData.DeviceRequest.wLength);
276 2 //code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
277 2 } else
278 1 stall_ep0();
279 1 }
280
281 void get_configuration(void)
282 {
283 1 unsigned char c = bEPPflags.bits.configuration;
284 1
285 1 single_transmit(&c, 1);
286 1 }
287
288 void set_configuration(void)
289 {
290 1 if (ControlData.DeviceRequest.wValue == 0) {
291 2 /* put device in unconfigured state */
292 2 single_transmit(0, 0);
293 2 DISABLE;
294 2 bEPPflags.bits.configuration = 0;
295 2 ENABLE;
296 2 init_unconfig();
297 2 } else if (ControlData.DeviceRequest.wValue == 1) {
298 2 /* Configure device */
299 2 single_transmit(0, 0);
300 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -