📄 usb.lst
字号:
408 unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
409 {
410 1 // usbstack.endpoint=usbstack.epbulkout;
411 1 usbstack.pid=PID_OUT;
412 1 TxEpnum = uDev.bEPAddr[usbstack.epbulkout];
413 1
414 1 usbstack.wPayload=64;
415 1 usbstack.wLen=len;
416 1 usbstack.buffer=pBuffer;
417 1 bXXGFlags.bToggle=uDev.bData1[usbstack.epbulkout];
418 1
419 1 while(len>0)
420 1 {
421 2 if (len > usbstack.wPayload)
422 2 usbstack.wLen = usbstack.wPayload;
423 2 else
424 2 usbstack.wLen = len;
425 2
426 2 if(!usbXfer(TxEpnum))
427 2 return FALSE;
C51 COMPILER V8.02 USB 09/19/2006 15:01:22 PAGE 17
428 2
429 2 bXXGFlags.bToggle=~bXXGFlags.bToggle;
430 2
431 2 len-=usbstack.wLen;
432 2 usbstack.buffer=usbstack.buffer+usbstack.wLen;
433 2 }
434 1 uDev.bData1[usbstack.epbulkout]=bXXGFlags.bToggle; // save toggle status back to associated EP
435 1 return TRUE;
436 1 }
437
438 unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len)
439 {
440 1 // usbstack.endpoint=usbstack.epbulkin;
441 1 usbstack.pid=PID_IN;
442 1 TxEpnum = uDev.bEPAddr[usbstack.epbulkin];
443 1
444 1 usbstack.wPayload=64;
445 1 usbstack.wLen=len;
446 1 usbstack.buffer=pBuffer;
447 1
448 1 if(usbstack.wLen)
449 1 {
450 2 bXXGFlags.bToggle = uDev.bData1[usbstack.epbulkin]; // restore toggle state
451 2 if(!usbXfer(TxEpnum))
452 2 return FALSE;
453 2
454 2 uDev.bData1[usbstack.epbulkin] = bXXGFlags.bToggle; // save toggle state
455 2 }
456 1 return TRUE;
457 1 }
458
459 //*****************************************************************************************
460 // Set Device Address :
461 //*****************************************************************************************
462 unsigned char setAddress(unsigned char addr)
463 {
464 1 usbstack.setup.bmRequest=0;
465 1 usbstack.setup.bRequest=SET_ADDRESS;
466 1 usbstack.setup.wValue=addr;
467 1 usbstack.setup.wIndex=0;
468 1 usbstack.setup.wLength=0;
469 1 usbstack.wLen=0x8;
470 1
471 1 return ep0Xfer();
472 1 }
473
474 //*****************************************************************************************
475 // Set Device Configuration :
476 //*****************************************************************************************
477 unsigned char setConfiguration(void)
478 {
479 1 usbstack.setup.bmRequest=0;
480 1 usbstack.setup.bRequest=SET_CONFIG;
481 1 usbstack.setup.wIndex=0;
482 1 usbstack.setup.wLength=0;
483 1 usbstack.wLen=0x8;
484 1
485 1 return ep0Xfer();
486 1 }
487
488 //*****************************************************************************************
489 // Get Device Descriptor : Device, Configuration, String
C51 COMPILER V8.02 USB 09/19/2006 15:01:22 PAGE 18
490 //*****************************************************************************************
491 unsigned char getDesc(void)
492 {
493 1 usbstack.setup.bmRequest=0x80;
494 1 usbstack.setup.bRequest=GET_DESCRIPTOR;
495 1 usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
496 1 usbstack.wPayload=uDev.wPayLoad[0];
497 1 usbstack.wLen=8; // set for 8-byte descriptor length
498 1
499 1 return ep0Xfer();
500 1 }
501
502 //*****************************************************************************************
503 // USB Device Enumeration Process
504 // Support 1 confguration and interface #0 and alternate setting #0 only
505 // Support up to 1 control endpoint + 4 data endpoint only
506 //*****************************************************************************************
507 unsigned char enumUsbDev(BYTE usbaddr)
508 {
509 1 unsigned char i; // always reset USB transfer address
510 1 unsigned char epLen;
511 1
512 1 // pointers to descriptor data structures
513 1 pDevDesc pDev; // device descriptor
514 1 pCfgDesc pCfg; // configuration descriptor
515 1 pIntfDesc pIfc; // interface descriptor
516 1 pEPDesc pEnp; // end-point descriptor
517 1
518 1 TxAddr = 0x0; // double make sure Address is zero
519 1 uDev.wPayLoad[0] = 8; // default 8-byte payload for EP0
520 1 usbstack.wPayload = uDev.wPayLoad[0];
521 1 usbstack.buffer=DBUF; // setup source and destination buffer
522 1 usbstack.usbaddr = 0; // default address
523 1
524 1 //------------------------------------------------
525 1 // Get USB Device Descriptors on EP0 & Addr 0
526 1 // with default 64-byte payload
527 1 //------------------------------------------------
528 1 pDev =(pDevDesc)DBUF; // device descriptor data structure overlay
529 1
530 1 // part of the 8-byte setup command
531 1 usbstack.setup.wValue=DEVICE;
532 1 usbstack.setup.wIndex=0;
533 1 usbstack.setup.wLength=8; // we only try to get 8 bytes for the
534 1 // correct wPayload of Endpoint 0
535 1 if (!getDesc())
536 1 return FALSE;
537 1
538 1 uDev.wPayLoad[0]=pDev->bMaxPacketSize0;
539 1 usbstack.wPayload = uDev.wPayLoad[0];
540 1
541 1 //------------------------------------------------
542 1 // Set Slave USB Device Address
543 1 //------------------------------------------------
544 1 if (!setAddress(usbaddr)) // set to specific USB address
545 1 return FALSE; //
546 1
547 1 TxAddr = usbaddr;
548 1 //------------------------------------------------
549 1 // Get USB Device Descriptors on EP0 & Addr X
550 1 //------------------------------------------------
551 1 usbstack.usbaddr=usbaddr;
C51 COMPILER V8.02 USB 09/19/2006 15:01:22 PAGE 19
552 1 usbstack.setup.wLength=pDev->bLength;
553 1 usbstack.setup.wValue=DEVICE;
554 1 usbstack.setup.wIndex=0;
555 1 usbstack.buffer=DBUF;
556 1
557 1 if (!getDesc())
558 1 return FALSE; // For this current device:
559 1 uDev.wVID = pDev->idVendor; // save VID
560 1 uDev.wPID = pDev->idProduct; // save PID
561 1 uDev.iMfg = pDev->iManufacturer; // save Mfg Index
562 1 uDev.iPdt = pDev->iProduct; // save Product Index
563 1
564 1 //------------------------------------------------
565 1 // Get Slave USB Configuration Descriptors
566 1 //------------------------------------------------
567 1 pCfg = (pCfgDesc)DBUF;
568 1
569 1 usbstack.setup.wValue=CONFIGURATION;
570 1 usbstack.setup.wIndex=0;
571 1 usbstack.setup.wLength=9;
572 1 usbstack.buffer=DBUF;
573 1 if (!getDesc())
574 1 return FALSE;
575 1
576 1 usbstack.setup.wLength=WordSwap(pCfg->wLength);
577 1 usbstack.buffer=DBUF;
578 1 // usbstack.setup.wLength=32;
579 1 if (!getDesc())
580 1 return FALSE;
581 1 // the DBUF now should contain 32 bytes of configuration data:
582 1 // 0-8: configuration descriptor
583 1 // 9-17: interface descriptor
584 1 // 18-24: EP0 descriptor
585 1 // 25-31: EP1 descriptor
586 1
587 1 pIfc = (pIntfDesc)(DBUF + 9); // point to Interface Descp
588 1 uDev.bClass = pIfc->iClass; // update to class type
589 1 uDev.bNumOfEPs = (pIfc->bEndPoints <= MAX_EP) ? pIfc->bEndPoints : MAX_EP;
590 1
591 1 if(uDev.bClass==8) //mass storage device
592 1 {
593 2 bXXGFlags.bMassDevice=TRUE;
594 2 }
595 1 //------------------------------------------------
596 1 // Set configuration (except for HUB device)
597 1 //------------------------------------------------
598 1 usbstack.setup.wValue=DEVICE;
599 1 //------------------------------------------------
600 1 // For each slave endpoints, get its attributes
601 1 // Excluding endpoint0, only data endpoints
602 1 //------------------------------------------------
603 1 if (!setConfiguration())
604 1 return FALSE;
605 1
606 1 epLen = 0;
607 1 for (i=1; i<=uDev.bNumOfEPs; i++) // For each data endpoint
608 1 {
609 2 pEnp = (pEPDesc)(DBUF + 18 + epLen); // point to Endpoint Descp(non-HID)
610 2 //if(pIfc->iClass == HIDCLASS)
611 2 // pEnp = (pEPDesc)(DBUF + 9 + 9 + 9 + epLen); // update pointer to Endpoint(HID)
612 2 uDev.bEPAddr[i] = pEnp->bEPAdd; // Ep address and direction
613 2 uDev.bAttr[i] = pEnp->bAttr; // Attribute of Endpoint
C51 COMPILER V8.02 USB 09/19/2006 15:01:22 PAGE 20
614 2 uDev.wPayLoad[i] = WordSwap(pEnp->wPayLoad); // Payload of Endpoint
615 2 uDev.bInterval[i] = pEnp->bInterval; // Polling interval
616 2 uDev.bData1[i] = 0; // init data toggle
617 2 epLen += 7;
618 2 //////////////////////////////
619 2 if(uDev.bAttr[i]==0x2) // bulk endpoint
620 2 {
621 3 if(uDev.bEPAddr[i]&0x80)
622 3 usbstack.epbulkin=i; // bulk in
623 3 else
624 3 usbstack.epbulkout=i; // bulk out
625 3 }
626 2
627 2 }
628 1
629 1 return TRUE;
630 1 }
631
632
633 ///////////////////////////////////////////////////////////////////////////////////////////
634 void usbInit(void)
635 {
636 1 SieCtrl = 0x03; // apply bus power & reset SIE
637 1 DelayUs(100);
638 1 SieCtrl = 0x09; // enable SOF, otherwise device will sleep
639 1 TxEpnum = 0x00;
640 1 TxAddr = 0x00;
641 1 SieStat0 = INT_CLEAR;
642 1 SieStat1 = INT_CLEAR;
643 1 Alarm = INT_CLEAR;
644 1 Mp3Stat = INT_CLEAR;
645 1 AlarmEn = 0x02;
646 1 Ualarm = INT_CLEAR;
647 1
648
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -