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