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