📄 chap_9.lst
字号:
C51 COMPILER V7.06 CHAP_9 06/17/2003 13:33:10 PAGE 1
C51 COMPILER V7.06, 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
stmt 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.06 CHAP_9 06/17/2003 13:33:10 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.06 CHAP_9 06/17/2003 13:33:10 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 SWAP(EP2_PACKET_SIZE),
139 10
140 };
141
142 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
143 {
144 sizeof(USB_ENDPOINT_DESCRIPTOR),
145 USB_ENDPOINT_DESCRIPTOR_TYPE,
146 0x2,
147 USB_ENDPOINT_TYPE_BULK,
148 SWAP(EP2_PACKET_SIZE),
149 10
150 };
151
152 /*
153 //*************************************************************************
154 // USB Protocol Layer
155 //*************************************************************************
156 */
157
158 void reserved(void)
159 {
160 1 stall_ep0();
161 1 }
162
163 /*
164 //*************************************************************************
165 // USB standard device requests
166 //*************************************************************************
167 */
168
169
170 void get_status(void)
171 {
172 1 unsigned char endp, txdat[2];
173 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
174 1 unsigned char c;
175 1
176 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
177 2 if(bEPPflags.bits.remote_wakeup == 1)
178 2 txdat[0] = 3;
179 2 else
C51 COMPILER V7.06 CHAP_9 06/17/2003 13:33:10 PAGE 4
180 2 txdat[0] = 1;
181 2 txdat[1]=0;
182 2 single_transmit(txdat, 2);
183 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
184 2 txdat[0]=0;
185 2 txdat[1]=0;
186 2 single_transmit(txdat, 2);
187 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
188 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
189 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
190 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
191 2 else
192 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
193 2 if(c & D12_STALL)
194 2 txdat[0] = 1;
195 2 else
196 2 txdat[0] = 0;
197 2 txdat[1] = 0;
198 2 single_transmit(txdat, 2);
199 2 } else
200 1 stall_ep0();
201 1 }
202
203 void clear_feature(void)
204 {
205 1 unsigned char endp;
206 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
207 1
208 1 if (bRecipient == USB_RECIPIENT_DEVICE
209 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
210 2 DISABLE;
211 2 bEPPflags.bits.remote_wakeup = 0;
212 2 ENABLE;
213 2 single_transmit(0, 0);
214 2 }
215 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
216 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
217 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
218 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
219 2 /* clear TX stall for IN on EPn. */
220 2 D12_SetEndpointStatus(endp*2 + 1, 0);
221 2 else
222 2 /* clear RX stall for OUT on EPn. */
223 2 D12_SetEndpointStatus(endp*2, 0);
224 2 single_transmit(0, 0);
225 2 } else
226 1 stall_ep0();
227 1 }
228
229 void set_feature(void)
230 {
231 1 unsigned char endp;
232 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
233 1
234 1 if (bRecipient == USB_RECIPIENT_DEVICE
235 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
236 2 DISABLE;
237 2 bEPPflags.bits.remote_wakeup = 1;
238 2 ENABLE;
239 2 single_transmit(0, 0);
240 2 }
241 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
C51 COMPILER V7.06 CHAP_9 06/17/2003 13:33:10 PAGE 5
242 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
243 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
244 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
245 2 /* clear TX stall for IN on EPn. */
246 2 D12_SetEndpointStatus(endp*2 + 1, 1);
247 2 else
248 2 /* clear RX stall for OUT on EPn. */
249 2 D12_SetEndpointStatus(endp*2, 1);
250 2 single_transmit(0, 0);
251 2 } else
252 1 stall_ep0();
253 1 }
254
255 void set_address(void)
256 {
257 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
258 1 DEVICE_ADDRESS_MASK), 1);
259 1 single_transmit(0, 0);
260 1 }
261
262 void get_descriptor(void)
263 {
264 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
265 1
266 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
267 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
268 2 } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
269 2 if (ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
270 2 {ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;}
271 2 code_transmit((unsigned char code *)&ConfigDescr, ControlData.DeviceRequest.wLength);
272 2 //code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
273 2 } else
274 1 stall_ep0();
275 1 }
276
277 void get_configuration(void)
278 {
279 1 unsigned char c = bEPPflags.bits.configuration;
280 1
281 1 single_transmit(&c, 1);
282 1 }
283
284 void set_configuration(void)
285 {
286 1 if (ControlData.DeviceRequest.wValue == 0) {
287 2 /* put device in unconfigured state */
288 2 single_transmit(0, 0);
289 2 DISABLE;
290 2 bEPPflags.bits.configuration = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -