📄 sl811.lst
字号:
261 5 SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm
262 5 }
263 4
264 4 //------------------------------------------------
265 4 // Copy last IN token data pkt from prev transfer
266 4 // Check if there was data available during the
267 4 // last data transfer
268 4 //------------------------------------------------
269 4 if(bufLen)
270 4 {
271 5 SL811BufRead(((dataX&1)?data0:data1), usbstack.buffer, bufLen);
272 5 usbstack.buffer += bufLen;
273 5 }
274 4
275 4 //------------------------------------------------
276 4 // Terminate on short packets, i.e. remainder!=0
277 4 // a short packet or empty data packet OR when
278 4 // requested data len have completed, i.e.wLen=0
279 4 // For a LOWSPEED device, the 1st device descp,
280 4 // wPayload is default to 64-byte, LS device will
281 4 // only send back a max of 8-byte device descp,
282 4 // and host detect this as a short packet, and
283 4 // terminate with OUT status stage
284 4 //------------------------------------------------
285 4 if(remainder || !usbstack.wLen)
286 4 break;
287 4 }// PID IN
288 3 else if((usbstack.pid == PID_OUT)&&(bEnd))
289 3 break;
290 3 else if(usbstack.pid == PID_SETUP) // do nothing for SETUP/OUT token
291 3 break;
292 3 }
293 2
294 2 //-------------------------NAK----------------------------
295 2 if (result & EP0_NAK) // NAK Detected
296 2 {
297 3 //if(usbstack.endpoint==0) // on ep0 during enumeration of LS device
298 3 { // happen when slave is not fast enough,
299 4 //if(usbstack.pid == PID_IN)
300 4 // offset=(dataX & 1) ? 0x8:0x0;
301 4 //if(usbstack.pid == PID_OUT)
302 4 // offset=(dataX & 1) ? 0x0:0x8;
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 6
303 4 //else
304 4 // offset=(dataX & 1) ? 0x8:0x0;
305 4 offset=0;
306 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
307 4 SL811Write(EP0Control+offset,cmd); // re-arm and request for last cmd, IN token
308 4 //result = 0; // respond to NAK status only
309 4 }
310 3 //else // normal data endpoint, exit now !!! , non-zero ep
311 3 // break; // main loop control the interval polling
312 3 }
313 2
314 2 //-----------------------TIMEOUT--------------------------
315 2 if (result & EP0_TIMEOUT) // TIMEOUT Detected
316 2 {
317 3 if(usbstack.endpoint==0) // happens when hub enumeration
318 3 {
319 4 if(++timeout >= TIMEOUT_RETRY)
320 4 {
321 5 timeout--;
322 5 break; // exit on the timeout detected
323 5 }
324 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
325 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd again
326 4 }
327 3 else
328 3 { // all other data endpoint, data transfer
329 4 bXXGFlags.TIMEOUT_ERR = TRUE; // failed, set flag to terminate transfer
330 4 break; // happens when data transfer on a device
331 4 } // through the hub
332 3 }
333 2
334 2 //-----------------------STALL----------------------------
335 2 if (result & EP0_STALL) // STALL detected
336 2 return TRUE; // for unsupported request.
337 2
338 2 //----------------------OVEFLOW---------------------------
339 2 if (result & EP0_OVERFLOW) // OVERFLOW detected
340 2 //result=result;
341 2 break;
342 2 //-----------------------ERROR----------------------------
343 2 //if (result & EP0_ERROR) // ERROR detected
344 2 //result=result;
345 2 // break;
346 2 } // end of While(1)
347 1
348 1 if (result & EP0_ACK) // on ACK transmission
349 1 return TRUE; // return OK
350 1
351 1 return FALSE; // fail transmission
352 1
353 1
354 1 }
355 //*****************************************************************************************
356 // Control Endpoint 0's USB Data Xfer
357 // ep0Xfer, endpoint 0 data transfer
358 //*****************************************************************************************
359 unsigned char ep0Xfer(void)
360 {
361 1 //unsigned char wLen;
362 1
363 1 //wLen=usbstack.wLen;
364 1 usbstack.endpoint=0;
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 7
365 1 //----------------------------------------------------
366 1 // SETUP token with 8-byte request on endpoint 0
367 1 //----------------------------------------------------
368 1 usbstack.pid=PID_SETUP;
369 1 usbstack.wLen=8;
370 1 //usbstack.buffer=&usbstack.setup;
371 1 if (!usbXfer())
372 1 return FALSE;
373 1 //DelayMs(10);
374 1 usbstack.pid = PID_IN;
375 1 //----------------------------------------------------
376 1 // IN or OUT data stage on endpoint 0
377 1 //----------------------------------------------------
378 1 usbstack.wLen=usbstack.setup.wLength;
379 1 if (usbstack.wLen) // if there are data for transfer
380 1 {
381 2 if (usbstack.setup.bmRequest & 0x80) // host-to-device : IN token
382 2 {
383 3 usbstack.pid = PID_IN;
384 3
385 3 if(!usbXfer())
386 3 return FALSE;
387 3 //usbstack.wPayload = 0;
388 3 usbstack.pid = PID_OUT;
389 3 }
390 2 else // device-to-host : OUT token
391 2 {
392 3 usbstack.pid = PID_OUT;
393 3
394 3 if(!usbXfer())
395 3 return FALSE;
396 3 usbstack.pid = PID_IN;
397 3 }
398 2 }
399 1 //DelayMs(10);
400 1 //----------------------------------------------------
401 1 // Status stage IN or OUT zero-length data packet
402 1 //----------------------------------------------------
403 1 usbstack.wLen=0;
404 1 if(!usbXfer())
405 1 return FALSE;
406 1
407 1 return TRUE;
408 1
409 1 }
410
411
412 unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
413 {
414 1 usbstack.usbaddr=0x1;
415 1 usbstack.endpoint=usbstack.epbulkout;
416 1 usbstack.pid=PID_OUT;
417 1 usbstack.wPayload=64;
418 1 usbstack.wLen=len;
419 1 usbstack.buffer=pBuffer;
420 1
421 1 if(usbstack.wLen)
422 1 return usbXfer();
423 1
424 1 return TRUE;
425 1 }
426
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 8
427 unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len)
428 {
429 1 usbstack.usbaddr=0x1;
430 1 usbstack.endpoint=usbstack.epbulkin;
431 1 usbstack.pid=PID_IN;
432 1 usbstack.wPayload=64;
433 1 usbstack.wLen=len;
434 1 usbstack.buffer=pBuffer;
435 1 if(usbstack.wLen)
436 1 //while(!usbXfer());
437 1 return usbXfer();
438 1 return TRUE;
439 1 }
440 //*****************************************************************************************
441 // Control endpoint
442 //*****************************************************************************************
443 //void VendorCmd(void)
444 //{
445 // ep0Xfer();
446 //}
447
448 //*****************************************************************************************
449 // Set Device Address :
450 //*****************************************************************************************
451 unsigned char SetAddress(unsigned char addr)
452 {
453 1 usbstack.usbaddr=0;
454 1 usbstack.setup.bmRequest=0;
455 1 usbstack.setup.bRequest=SET_ADDRESS;
456 1 usbstack.setup.wValue=addr;
457 1 usbstack.setup.wIndex=0;
458 1 usbstack.setup.wLength=0;
459 1 //usbstack.buffer=&usbstack.setup;
460 1 return ep0Xfer();
461 1
462 1 }
463
464 //*****************************************************************************************
465 // Set Device Configuration :
466 //*****************************************************************************************
467 unsigned char Set_Configuration(void)
468 {
469 1 //usbstack.usbaddr=usbaddr;
470 1 //usbstack.
471 1 usbstack.setup.bmRequest=0;
472 1 usbstack.setup.bRequest=SET_CONFIG;
473 1 usbstack.setup.wValue=DEVICE;
474 1 usbstack.setup.wIndex=0;
475 1 usbstack.setup.wLength=0;
476 1 usbstack.buffer=NULL;
477 1 return ep0Xfer();
478 1
479 1 }
480 //*****************************************************************************************/
481 // Set Device Interface :
482 //*****************************************************************************************/
483 unsigned char Set_Interface(void)
484 {
485 1 usbstack.setup.bmRequest=1;
486 1 usbstack.setup.bRequest=SET_INTERFACE;
487 1 usbstack.setup.wValue=0;
488 1 usbstack.setup.wIndex=0;
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 9
489 1 usbstack.setup.wLength=0;
490 1 usbstack.buffer=NULL;
491 1 return ep0Xfer();
492 1
493 1 }
494 //*****************************************************************************************
495 // Get Device Descriptor : Device, Configuration, String
496 //*****************************************************************************************
497 unsigned char GetDesc(void)
498 {
499 1
500 1 usbstack.setup.bmRequest=0x80;
501 1 usbstack.setup.bRequest=GET_DESCRIPTOR;
502 1 usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
503 1
504 1 usbstack.wPayload=uDev.wPayLoad[0];
505 1 //usbstack.buffer=&usbstack.setup;
506 1 return ep0Xfer();
507 1 }
508
509 unsigned int GetMaxLUN(void)
510 {
511 1
512 1 usbstack.setup.bmRequest=0xa1;
513 1 usbstack.setup.bRequest=0xfe;
514 1 usbstack.setup.wValue=0;
515 1 usbstack.setup.wIndex=0;
516 1 usbstack.setup.wLength=1;
517 1 return ep0Xfer();
518 1 }
519 //*****************************************************************************************
520 // USB Data Endpoint Read/Write
521 // wLen is in low byte first format
522 //*****************************************************************************************
523
524
525 //*****************************************************************************************
526 // USB Device Enumeration Process
527 // Support 1 confguration and interface #0 and alternate setting #0 only
528 // Support up to 1 control endpoint + 4 data endpoint only
529 //*****************************************************************************************
530 unsigned char EnumUsbDev(BYTE usbaddr)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -