📄 chap_9.lst
字号:
24 =1 /*
25 =1 //*************************************************************************
26 =1 // USB Protocol Layer
27 =1 //*************************************************************************
28 =1 */
29 =1
30 =1 /*
31 =1 //*************************************************************************
C51 COMPILER V8.02 CHAP_9 07/27/2007 11:10:48 PAGE 15
32 =1 // USB standard device requests
33 =1 //*************************************************************************
34 =1 */
35 =1 void get_status(void);
36 =1 void clear_feature(void);
37 =1 void set_feature(void);
38 =1 void set_address(void);
39 =1 void get_descriptor(void);
40 =1 void get_configuration(void);
41 =1 void set_configuration(void);
42 =1 void get_interface(void);
43 =1 void set_interface(void);
44 =1
45 =1 void reserved(void);
46 =1
47 =1 #endif
32
33 #define NUM_ENDPOINTS 4
34
35 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
36 + sizeof(USB_INTERFACE_DESCRIPTOR) \
37 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
38
39 extern CONTROL_XFER ControlData;
40 extern IO_REQUEST idata ioRequest;
41 extern EPPFLAGS bEPPflags;
42
43 code USB_DEVICE_DESCRIPTOR DeviceDescr =
44 {
45 sizeof(USB_DEVICE_DESCRIPTOR),
46 USB_DEVICE_DESCRIPTOR_TYPE,
47 SWAP(0x0100),
48 USB_CLASS_CODE_TEST_CLASS_DEVICE,
49 0, 0,
50 EP0_PACKET_SIZE,
51 SWAP(0x0471),
52 #ifndef __C51__
SWAP(0x0222),
#else
55 SWAP(0x0888),
56 #endif
57 SWAP(0x0100),
58 0, 0, 0,
59 1
60 };
61
62 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
63 {
64 sizeof(USB_CONFIGURATION_DESCRIPTOR),
65 USB_CONFIGURATION_DESCRIPTOR_TYPE,
66 SWAP(CONFIG_DESCRIPTOR_LENGTH),
67 1,
68 1,
69 0,
70 0x60,
71 0x1
72 };
73
74 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
75 {
76 sizeof(USB_INTERFACE_DESCRIPTOR),
77 USB_INTERFACE_DESCRIPTOR_TYPE,
C51 COMPILER V8.02 CHAP_9 07/27/2007 11:10:48 PAGE 16
78 0,
79 0,
80 NUM_ENDPOINTS,
81 USB_CLASS_CODE_TEST_CLASS_DEVICE,
82 USB_SUBCLASS_CODE_TEST_CLASS_D12,
83 USB_PROTOCOL_CODE_TEST_CLASS_D12,
84 0
85 };
86
87 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
88 {
89 sizeof(USB_ENDPOINT_DESCRIPTOR),
90 USB_ENDPOINT_DESCRIPTOR_TYPE,
91 0x81,
92 USB_ENDPOINT_TYPE_INTERRUPT,
93 SWAP(EP1_PACKET_SIZE),
94 10
95 };
96
97 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
98 {
99 sizeof(USB_ENDPOINT_DESCRIPTOR),
100 USB_ENDPOINT_DESCRIPTOR_TYPE,
101 0x1,
102 USB_ENDPOINT_TYPE_INTERRUPT,
103 SWAP(EP1_PACKET_SIZE),
104 10
105 };
106
107 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
108 {
109 sizeof(USB_ENDPOINT_DESCRIPTOR),
110 USB_ENDPOINT_DESCRIPTOR_TYPE,
111 0x82,
112 USB_ENDPOINT_TYPE_BULK,
113 SWAP(EP2_PACKET_SIZE),
114 10
115 };
116
117 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
118 {
119 sizeof(USB_ENDPOINT_DESCRIPTOR),
120 USB_ENDPOINT_DESCRIPTOR_TYPE,
121 0x2,
122 USB_ENDPOINT_TYPE_BULK,
123 SWAP(EP2_PACKET_SIZE),
124 10
125 };
126
127 #ifndef __C51__
extern unsigned char far *dmaBuffer;
#endif
130 /*
131 //*************************************************************************
132 // USB Protocol Layer
133 //*************************************************************************
134 */
135
136 void reserved(void)
137 {
138 1 stall_ep0();
139 1 }
C51 COMPILER V8.02 CHAP_9 07/27/2007 11:10:48 PAGE 17
140
141 /*
142 //*************************************************************************
143 // USB standard device requests
144 //*************************************************************************
145 */
146
147 void get_status(void)
148 {
149 1 unsigned char endp, txdat[2];
150 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
151 1 unsigned char c;
152 1
153 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
154 2 if(bEPPflags.bits.remote_wakeup == 1)
155 2 txdat[0] = 3;
156 2 else
157 2 txdat[0] = 1;
158 2 txdat[1]=0;
159 2 single_transmit(txdat, 2);
160 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
161 2 txdat[0]=0;
162 2 txdat[1]=0;
163 2 single_transmit(txdat, 2);
164 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
165 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
166 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
167 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
168 2 else
169 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
170 2 if(c & D12_STALL)
171 2 txdat[0] = 1;
172 2 else
173 2 txdat[0] = 0;
174 2 txdat[1] = 0;
175 2 single_transmit(txdat, 2);
176 2 } else
177 1 stall_ep0();
178 1 }
179
180 void clear_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 = 0;
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, 0);
198 2 else
199 2 /* clear RX stall for OUT on EPn. */
200 2 D12_SetEndpointStatus(endp*2, 0);
201 2 single_transmit(0, 0);
C51 COMPILER V8.02 CHAP_9 07/27/2007 11:10:48 PAGE 18
202 2 } else
203 1 stall_ep0();
204 1 }
205
206 void set_feature(void)
207 {
208 1 unsigned char endp;
209 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
210 1
211 1 if (bRecipient == USB_RECIPIENT_DEVICE
212 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
213 2 DISABLE;
214 2 bEPPflags.bits.remote_wakeup = 1;
215 2 ENABLE;
216 2 single_transmit(0, 0);
217 2 }
218 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
219 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
220 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
221 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
222 2 /* clear TX stall for IN on EPn. */
223 2 D12_SetEndpointStatus(endp*2 + 1, 1);
224 2 else
225 2 /* clear RX stall for OUT on EPn. */
226 2 D12_SetEndpointStatus(endp*2, 1);
227 2 single_transmit(0, 0);
228 2 } else
229 1 stall_ep0();
230 1 }
231
232 void set_address(void)
233 {
234 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
235 1 DEVICE_ADDRESS_MASK), 1);
236 1 single_transmit(0, 0);
237 1 }
238
239 void get_descriptor(void)
240 {
241 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
242 1
243 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
244 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
245 2 } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
246 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
247 2 } else
248 1 stall_ep0();
249 1 }
250
251 void get_configuration(void)
252 {
253 1 unsigned char c = bEPPflags.bits.configuration;
254 1
255 1 single_transmit(&c, 1);
256 1 }
257
258 void set_configuration(void)
259 {
260 1 if (ControlData.DeviceRequest.wValue == 0) {
261 2 /* put device in unconfigured state */
262 2 single_transmit(0, 0);
263 2 DISABLE;
C51 COMPILER V8.02 CHAP_9 07/27/2007 11:10:48 PAGE 19
264 2 bEPPflags.bits.configuration = 0;
265 2 ENABLE;
266 2 init_unconfig();
267 2 } else if (ControlData.DeviceRequest.wValue == 1) {
268 2 /* Configure device */
269 2 single_transmit(0, 0);
270 2
271 2 init_unconfig();
272 2 init_config();
273 2
274 2 DISABLE;
275 2 bEPPflags.bits.configuration = 1;
276 2 ENABLE;
277 2 } else
278 1 stall_ep0();
279 1 }
280
281 void get_interface(void)
282 {
283 1 unsigned char txdat = 0; /* Only/Current interface = 0 */
284 1 single_transmit(&txdat, 1);
285 1 }
286
287 void set_interface(void)
288 {
289 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
290 1 single_transmit(0, 0);
291 1 else
292 1 stall_ep0();
293 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -