📄 chap_9.lst
字号:
C51 COMPILER V4.01, CHAP_9 07/07/01 13:16:08 PAGE 1
DOS C51 COMPILER V4.01, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN CHAP_9.OBJ
COMPILER INVOKED BY: C:\KEIL\C51V4\BIN\C51.EXE CHAP_9.C DEBUG SMALL CODE SYMBOLS OBJECTEXTEND NOAMAKE
stmt level source
1 /*
2 //*************************************************************************
3 //
4 // P H I L I P S P R O P R I E T A R Y
5 //
6 // COPYRIGHT (c) 1997 BY PHILIPS SINGAPORE.
7 // -- ALL RIGHTS RESERVED --
8 //
9 // File Name: CHAP_9.C
10 // Created: 19 Dec 97
11 // Modified:
12 // Revision: 3.0
13 //
14 //*************************************************************************
15 */
16
17 #include <stdio.h>
18 #include <string.h>
19
20 #include <reg51.h> /* special function register declarations */
21
22 #include "epphal.h"
23 #include "d12ci.h"
24 #include "mainloop.h"
25 #include "usb100.h"
26 #include "chap_9.h"
27
28 #define NUM_ENDPOINTS 4
29
30 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
31 + sizeof(USB_INTERFACE_DESCRIPTOR) \
32 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
33
34 extern CONTROL_XFER ControlData;
35 extern IO_REQUEST idata ioRequest;
36 extern EPPFLAGS bEPPflags;
37
38 code USB_DEVICE_DESCRIPTOR DeviceDescr =
39 {
40 sizeof(USB_DEVICE_DESCRIPTOR),
41 USB_DEVICE_DESCRIPTOR_TYPE,
42 SWAP(0x0100),
43 USB_CLASS_CODE_TEST_CLASS_DEVICE,
44 0, 0,
45 EP0_PACKET_SIZE,
46 SWAP(0x0471),
47 SWAP(0x0666),
48 SWAP(0x0100),
49 0, 0, 0,
50 25
51 };
52
53 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
54 {
55 sizeof(USB_CONFIGURATION_DESCRIPTOR),
56 USB_CONFIGURATION_DESCRIPTOR_TYPE,
57 SWAP(CONFIG_DESCRIPTOR_LENGTH),
58 1,
59 1,
C51 COMPILER V4.01, CHAP_9 07/07/01 13:16:08 PAGE 2
60 0,
61 0x60,
62 0x1
63 };
64
65 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
66 {
67 sizeof(USB_INTERFACE_DESCRIPTOR),
68 USB_INTERFACE_DESCRIPTOR_TYPE,
69 0,
70 0,
71 NUM_ENDPOINTS,
72 USB_CLASS_CODE_TEST_CLASS_DEVICE,
73 USB_SUBCLASS_CODE_TEST_CLASS_D12,
74 USB_PROTOCOL_CODE_TEST_CLASS_D12,
75 0
76 };
77
78 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
79 {
80 sizeof(USB_ENDPOINT_DESCRIPTOR),
81 USB_ENDPOINT_DESCRIPTOR_TYPE,
82 0x81,
83 USB_ENDPOINT_TYPE_INTERRUPT,
84 SWAP(EP1_PACKET_SIZE),
85 10
86 };
87
88 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
89 {
90 sizeof(USB_ENDPOINT_DESCRIPTOR),
91 USB_ENDPOINT_DESCRIPTOR_TYPE,
92 0x1,
93 USB_ENDPOINT_TYPE_INTERRUPT,
94 SWAP(EP1_PACKET_SIZE),
95 10
96 };
97
98 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
99 {
100 sizeof(USB_ENDPOINT_DESCRIPTOR),
101 USB_ENDPOINT_DESCRIPTOR_TYPE,
102 0x82,
103 USB_ENDPOINT_TYPE_BULK,
104 SWAP(EP2_PACKET_SIZE),
105 10
106 };
107
108 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
109 {
110 sizeof(USB_ENDPOINT_DESCRIPTOR),
111 USB_ENDPOINT_DESCRIPTOR_TYPE,
112 0x2,
113 USB_ENDPOINT_TYPE_BULK,
114 SWAP(EP2_PACKET_SIZE),
115 10
116 };
117
118 /*
119 //*************************************************************************
120 // USB Protocol Layer
121 //*************************************************************************
122 */
123
124 void reserved(void)
125 {
C51 COMPILER V4.01, CHAP_9 07/07/01 13:16:08 PAGE 3
126 1 stall_ep0();
127 1 }
128
129 /*
130 //*************************************************************************
131 // USB standard device requests
132 //*************************************************************************
133 */
134
135 void get_status(void)
136 {
137 1 unsigned char endp, txdat[2];
138 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
139 1 unsigned char c;
140 1
141 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
142 2 if(bEPPflags.bits.remote_wakeup == 1)
143 2 txdat[0] = 3;
144 2 else
145 2 txdat[0] = 1;
146 2 txdat[1]=0;
147 2 single_transmit(txdat, 2);
148 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
149 2 txdat[0]=0;
150 2 txdat[1]=0;
151 2 single_transmit(txdat, 2);
152 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
153 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
154 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
155 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
156 2 else
157 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
158 2 if(c & D12_STALL)
159 2 txdat[0] = 1;
160 2 else
161 2 txdat[0] = 0;
162 2 txdat[1] = 0;
163 2 single_transmit(txdat, 2);
164 2 } else
165 1 stall_ep0();
166 1 }
167
168 void clear_feature(void)
169 {
170 1 unsigned char endp;
171 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
172 1
173 1 if (bRecipient == USB_RECIPIENT_DEVICE
174 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
175 2 DISABLE;
176 2 bEPPflags.bits.remote_wakeup = 0;
177 2 ENABLE;
178 2 single_transmit(0, 0);
179 2 }
180 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
181 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
182 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
183 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
184 2 /* clear TX stall for IN on EPn. */
185 2 D12_SetEndpointStatus(endp*2 + 1, 0);
186 2 else
187 2 /* clear RX stall for OUT on EPn. */
188 2 D12_SetEndpointStatus(endp*2, 0);
189 2 single_transmit(0, 0);
190 2 } else
191 1 stall_ep0();
C51 COMPILER V4.01, CHAP_9 07/07/01 13:16:08 PAGE 4
192 1 }
193
194 void set_feature(void)
195 {
196 1 unsigned char endp;
197 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
198 1
199 1 if (bRecipient == USB_RECIPIENT_DEVICE
200 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
201 2 DISABLE;
202 2 bEPPflags.bits.remote_wakeup = 1;
203 2 ENABLE;
204 2 single_transmit(0, 0);
205 2 }
206 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
207 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
208 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
209 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
210 2 /* clear TX stall for IN on EPn. */
211 2 D12_SetEndpointStatus(endp*2 + 1, 1);
212 2 else
213 2 /* clear RX stall for OUT on EPn. */
214 2 D12_SetEndpointStatus(endp*2, 1);
215 2 single_transmit(0, 0);
216 2 } else
217 1 stall_ep0();
218 1 }
219
220 void set_address(void)
221 {
222 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
223 1 DEVICE_ADDRESS_MASK), 1);
224 1 single_transmit(0, 0);
225 1 }
226
227 void get_descriptor(void)
228 {
229 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
230 1
231 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
232 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
233 2 } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
234 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
235 2 } else
236 1 stall_ep0();
237 1 }
238
239 void get_configuration(void)
240 {
241 1 unsigned char c = bEPPflags.bits.configuration;
242 1
243 1 single_transmit(&c, 1);
244 1 }
245
246 void set_configuration(void)
247 {
248 1 if (ControlData.DeviceRequest.wValue == 0) {
249 2 /* put device in unconfigured state */
250 2 single_transmit(0, 0);
251 2 DISABLE;
252 2 bEPPflags.bits.configuration = 0;
253 2 ENABLE;
254 2 init_unconfig();
255 2 } else if (ControlData.DeviceRequest.wValue == 1) {
256 2 /* Configure device */
257 2 single_transmit(0, 0);
C51 COMPILER V4.01, CHAP_9 07/07/01 13:16:08 PAGE 5
258 2
259 2 init_unconfig();
260 2 init_config();
261 2
262 2 DISABLE;
263 2 bEPPflags.bits.configuration = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -