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