📄 chap_9.lst
字号:
189 sizeof(USB_ENDPOINT_DESCRIPTOR),
190 USB_ENDPOINT_DESCRIPTOR_TYPE,
191 0x82,
192 USB_ENDPOINT_TYPE_BULK,
193 SWAP(EP2_PACKET_SIZE),
194 10
195 };
196
197 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
198 {
199 sizeof(USB_ENDPOINT_DESCRIPTOR),
200 USB_ENDPOINT_DESCRIPTOR_TYPE,
201 0x2,
202 USB_ENDPOINT_TYPE_BULK,
203 SWAP(EP2_PACKET_SIZE),
204 10
205 };
206 #endif
207 /*
208 //*************************************************************************
209 // USB Protocol Layer
210 //*************************************************************************
211 */
212
213 void reserved(void)
214 {
215 1 stall_ep0();
216 1 }
217
218 /*
219 //*************************************************************************
220 // USB standard device requests
221 //*************************************************************************
222 */
223
224 void get_status(void)
225 {
226 1 unsigned char endp, txdat[2];
227 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
228 1 unsigned char c;
229 1
230 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
231 2 if(bEPPflags.bits.remote_wakeup == 1)
232 2 txdat[0] = 3;
233 2 else
234 2 txdat[0] = 1;
235 2 txdat[1]=0;
236 2 single_transmit(txdat, 2);
237 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
238 2 txdat[0]=0;
239 2 txdat[1]=0;
240 2 single_transmit(txdat, 2);
241 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
C51 COMPILER V8.01 CHAP_9 04/24/2006 19:23:08 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 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
245 2 else
246 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
247 2 if(c & D12_STALL)
248 2 txdat[0] = 1;
249 2 else
250 2 txdat[0] = 0;
251 2 txdat[1] = 0;
252 2 single_transmit(txdat, 2);
253 2 } else
254 1 stall_ep0();
255 1 }
256
257 void clear_feature(void)
258 {
259 1 unsigned char endp;
260 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
261 1
262 1 if (bRecipient == USB_RECIPIENT_DEVICE
263 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
264 2 DISABLE;
265 2 bEPPflags.bits.remote_wakeup = 0;
266 2 ENABLE;
267 2 single_transmit(0, 0);
268 2 }
269 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
270 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
271 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
272 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
273 2 /* clear TX stall for IN on EPn. */
274 2 D12_SetEndpointStatus(endp*2 + 1, 0);
275 2 else
276 2 /* clear RX stall for OUT on EPn. */
277 2 D12_SetEndpointStatus(endp*2, 0);
278 2 single_transmit(0, 0);
279 2 } else
280 1 stall_ep0();
281 1 }
282
283 void set_feature(void)
284 {
285 1 unsigned char endp;
286 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
287 1
288 1 if (bRecipient == USB_RECIPIENT_DEVICE
289 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
290 2 DISABLE;
291 2 bEPPflags.bits.remote_wakeup = 1;
292 2 ENABLE;
293 2 single_transmit(0, 0);
294 2 }
295 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
296 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
297 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
298 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
299 2 /* clear TX stall for IN on EPn. */
300 2 D12_SetEndpointStatus(endp*2 + 1, 1);
301 2 else
302 2 /* clear RX stall for OUT on EPn. */
303 2 D12_SetEndpointStatus(endp*2, 1);
C51 COMPILER V8.01 CHAP_9 04/24/2006 19:23:08 PAGE 6
304 2 single_transmit(0, 0);
305 2 } else
306 1 stall_ep0();
307 1 }
308
309 void set_address(void)
310 {
311 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
312 1 DEVICE_ADDRESS_MASK), 1);
313 1 single_transmit(0, 0);
314 1 }
315
316 void get_descriptor(void)
317 {
318 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
319 1
320 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
321 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
322 2 } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
323 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
324 2 } else
325 1 stall_ep0();
326 1 }
327
328 void get_configuration(void)
329 {
330 1 unsigned char c = bEPPflags.bits.configuration;
331 1
332 1 single_transmit(&c, 1);
333 1 }
334
335 void set_configuration(void)
336 {
337 1 if (ControlData.DeviceRequest.wValue == 0) {
338 2 /* put device in unconfigured state */
339 2 single_transmit(0, 0);
340 2 DISABLE;
341 2 bEPPflags.bits.configuration = 0;
342 2 ENABLE;
343 2 init_unconfig();
344 2 } else if (ControlData.DeviceRequest.wValue == 1) {
345 2 /* Configure device */
346 2 single_transmit(0, 0);
347 2
348 2 init_unconfig();
349 2 init_config();
350 2
351 2 DISABLE;
352 2 bEPPflags.bits.configuration = 1;
353 2 ENABLE;
354 2 } else
355 1 stall_ep0();
356 1 }
357
358 void get_interface(void)
359 {
360 1 unsigned char txdat = 0; /* Only/Current interface = 0 */
361 1 single_transmit(&txdat, 1);
362 1 }
363
364 void set_interface(void)
365 {
C51 COMPILER V8.01 CHAP_9 04/24/2006 19:23:08 PAGE 7
366 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
367 1 single_transmit(0, 0);
368 1 else
369 1 stall_ep0();
370 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 448 ----
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 + -