📄 chap_9.lst
字号:
C51 COMPILER V7.06 CHAP_9 03/19/2006 13:40:23 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 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(0x0691),
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 0x60,//0x9F, // 0x80,
48 0xC8//0x32
49 };
50
51 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
52 {
53 sizeof(USB_INTERFACE_DESCRIPTOR),
54 USB_INTERFACE_DESCRIPTOR_TYPE,
55 0,
C51 COMPILER V7.06 CHAP_9 03/19/2006 13:40:23 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.06 CHAP_9 03/19/2006 13:40:23 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 if (bRecipient == USB_RECIPIENT_DEVICE) {
127 2 if(bEPPflags.bits.remote_wakeup == 1)
128 2 txdat[0] = 3;
129 2 else
130 2 txdat[0] = 1;
131 2 txdat[1]=0;
132 2 single_transmit(txdat, 2);
133 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
134 2 txdat[0]=0;
135 2 txdat[1]=0;
136 2 single_transmit(txdat, 2);
137 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
138 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
139 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
140 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
141 2 else
142 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
143 2 if(c & D12_STALL)
144 2 txdat[0] = 1;
145 2 else
146 2 txdat[0] = 0;
147 2 txdat[1] = 0;
148 2 single_transmit(txdat, 2);
149 2 } else
150 1 stall_ep0();
151 1 }
152
153 void clear_feature(void)
154 {
155 1 unsigned char endp;
156 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
157 1 if (bRecipient == USB_RECIPIENT_DEVICE
158 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
159 2 DISABLE;
160 2 bEPPflags.bits.remote_wakeup = 0;
161 2 ENABLE;
162 2 single_transmit(0, 0);
163 2 }
164 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
165 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
166 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
167 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
168 2 /* clear TX stall for IN on EPn. */
169 2 D12_SetEndpointStatus(endp*2 + 1, 0);
170 2 else
171 2 /* clear RX stall for OUT on EPn. */
172 2 D12_SetEndpointStatus(endp*2, 0);
173 2 single_transmit(0, 0);
174 2 } else
175 1 stall_ep0();
176 1 }
177
178 void set_feature(void)
179 {
C51 COMPILER V7.06 CHAP_9 03/19/2006 13:40:23 PAGE 4
180 1 unsigned char endp;
181 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
182 1 if (bRecipient == USB_RECIPIENT_DEVICE
183 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
184 2 DISABLE;
185 2 bEPPflags.bits.remote_wakeup = 1;
186 2 ENABLE;
187 2 single_transmit(0, 0);
188 2 }
189 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
190 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
191 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
192 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
193 2 /* clear TX stall for IN on EPn. */
194 2 D12_SetEndpointStatus(endp*2 + 1, 1);
195 2 else
196 2 /* clear RX stall for OUT on EPn. */
197 2 D12_SetEndpointStatus(endp*2, 1);
198 2 single_transmit(0, 0);
199 2 } else
200 1 stall_ep0();
201 1 }
202
203 void set_address(void)
204 {
205 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
206 1 DEVICE_ADDRESS_MASK), 1);
207 1 single_transmit(0, 0);
208 1 }
209
210 void get_descriptor(void)
211 {
212 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
213 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
214 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
215 2 } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
216 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
217 2 } else
218 1 stall_ep0();
219 1 }
220
221 void get_configuration(void)
222 {
223 1 unsigned char c = bEPPflags.bits.configuration;
224 1 single_transmit(&c, 1);
225 1 }
226
227 void set_configuration(void)
228 {
229 1
230 1 if (ControlData.DeviceRequest.wValue == 0) {
231 2 /* put device in unconfigured state */
232 2 single_transmit(0, 0);
233 2 DISABLE;
234 2 bEPPflags.bits.configuration = 0;
235 2 ENABLE;
236 2 init_unconfig();
237 2 } else if (ControlData.DeviceRequest.wValue == 1) {
238 2 /* Configure device */
239 2 single_transmit(0, 0);
240 2
241 2 init_unconfig();
C51 COMPILER V7.06 CHAP_9 03/19/2006 13:40:23 PAGE 5
242 2 init_config();
243 2
244 2 DISABLE;
245 2 bEPPflags.bits.configuration = 1;
246 2 ENABLE;
247 2 } else
248 1 stall_ep0();
249 1 }
250
251 void get_interface(void)
252 {
253 1 unsigned char txdat = 0; /* Only/Current interface = 0 */
254 1 single_transmit(&txdat, 1);
255 1 }
256
257 void set_interface(void)
258 {
259 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
260 1 single_transmit(0, 0);
261 1 else
262 1 stall_ep0();
263 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 454 ----
CONSTANT SIZE = 64 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 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 + -