This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Usb failed packets

Hello,

What could be causing failed packets


Connection Status Device connected
Current Configuration 1
Speed Full
Device Address 1
Number Of Open Pipes 0

Device Descriptor NXP LPC17xx Speaker
Offset Field Size Value Description
0 bLength 1 12h
1 bDescriptorType 1 01h Device
2 bcdUSB 2 0200h USB Spec 2.0
4 bDeviceClass 1 00h Class info in Ifc Descriptors
5 bDeviceSubClass 1 00h
6 bDeviceProtocol 1 00h
7 bMaxPacketSize0 1 40h 64 bytes
8 idVendor 2 1FC7h
10 idProduct 2 4005h
12 bcdDevice 2 0100h 1.00
14 iManufacturer 1 01h "NXP Semicond "
15 iProduct 1 02h "NXP LPC17xx Speaker "
16 iSerialNumber 1 03h "DEMO00000000"
17 bNumConfigurations 1 01h

Configuration Descriptor 1 Bus Powered, 100 mA
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 02h Configuration
2 wTotalLength 2 0076h
4 bNumInterfaces 1 02h
5 bConfigurationValue 1 01h
6 iConfiguration 1 00h
7 bmAttributes 1 80h Bus Powered
 4..0: Reserved  ...00000
 5: Remote Wakeup  ..0.....  No
 6: Self Powered  .0......  No, Bus Powered
 7: Reserved (set to one)
(bus-powered for 1.0)  1.......
8 bMaxPower 1 32h 100 mA

Interface Descriptor 0/0 Audio, 0 Endpoints
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 04h Interface
2 bInterfaceNumber 1 00h
3 bAlternateSetting 1 00h
4 bNumEndpoints 1 00h
5 bInterfaceClass 1 01h Audio
6 bInterfaceSubClass 1 01h Audio Control
7 bInterfaceProtocol 1 00h
8 iInterface 1 00h

Audio Control Interface Header Descriptor
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 24h Audio Control Interface Header
2  7 01 00 01 27 00 01 01

Audio Control Input Terminal Descriptor
Offset Field Size Value Description
0 bLength 1 0Ch
1 bDescriptorType 1 24h Audio Control Input Terminal
2  10 02 01 01 01 00 01 00 00
00 00

Audio Control Feature Unit Descriptor
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 24h Audio Control Feature Unit
2  7 06 02 01 01 03 00 00

Audio Control Output Terminal Descriptor
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 24h Audio Control Output Terminal
2  7 03 03 01 03 00 02 00

Interface Descriptor 1/0 Audio, 0 Endpoints
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 04h Interface
2 bInterfaceNumber 1 01h
3 bAlternateSetting 1 00h
4 bNumEndpoints 1 00h
5 bInterfaceClass 1 01h Audio
6 bInterfaceSubClass 1 02h Audio Streaming
7 bInterfaceProtocol 1 00h
8 iInterface 1 00h

Interface Descriptor 1/1 Audio, 2 Endpoints
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 04h Interface
2 bInterfaceNumber 1 01h
3 bAlternateSetting 1 01h
4 bNumEndpoints 1 02h
5 bInterfaceClass 1 01h Audio
6 bInterfaceSubClass 1 02h Audio Streaming
7 bInterfaceProtocol 1 00h
8 iInterface 1 00h

Audio Streaming Interface Descriptor
Offset Field Size Value Description
0 bLength 1 07h
1 bDescriptorType 1 24h Audio Streaming Interface
2  5 01 01 01 01 00

Audio Streaming Format Type Descriptor
Offset Field Size Value Description
0 bLength 1 0Bh
1 bDescriptorType 1 24h Audio Streaming Format Type
2  9 02 01 01 02 10 01 40 1F
00

Endpoint Descriptor 03 3 Out, Isochronous, 1 ms
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 03h 3 Out
3 bmAttributes 1 05h Isochronous, Asynchronous, Data
 1..0: Transfer Type  ......01  Isochronous
 3..2: Sync Type  ....01..  Asynchronous
 5..4: Usage Type  ..00....  Data
 7..6: Reserved  00......
4 wMaxPacketSize 2 0012h 18 bytes
6 bInterval 1 01h 1 ms
7 bRefresh 1 00h
8 bSynchAddress 1 83h

Audio Streaming Isochronous Audio Data Endpoint Descriptor
Offset Field Size Value Description
0 bLength 1 07h
1 bDescriptorType 1 25h Audio Streaming Isochronous Audio Data Endpoint
2  5 01 00 02 00 00

Endpoint Descriptor 83 3 In, Isochronous, 1 ms
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 83h 3 In
3 bmAttributes 1 01h Isochronous, No Sync, Data
 1..0: Transfer Type  ......01  Isochronous
 3..2: Sync Type  ....00..  No Sync
 5..4: Usage Type  ..00....  Data
 7..6: Reserved  00......
4 wMaxPacketSize 2 0003h 3 bytes
6 bInterval 1 01h 1 ms
7 bRefresh 1 01h
8 bSynchAddress 1 00h

http://pastebin.com/gbdKGnwQ


URB     0006-0003       4:11:41.526     6.746 ms        71 us   Sync Reset Pipe and Clear Stall                         01:01:83        83DEC6F0h       USBPDO-5        usbhub  84E65E00h       Success (Success)
URB     0007-0002       4:11:41.526     6.749 ms        88 us   Sync Reset Pipe and Clear Stall                         01:01:83        83DC8C80h       0000007a        usbccgp 84E65E00h       Success (Success)
URB     0008    4:11:41.526     6.758 ms                Isoch Transfer  3 bytes buffer          in      01:01:83        83DC8C80h       0000007a        usbccgp 84FD5790h
URB     0009    4:11:41.526     6.763 ms                Isoch Transfer  3 bytes buffer          in      01:01:83        83DEC6F0h       USBPDO-5        usbhub  84FD5790h
URB     0010-0009       4:11:41.526     6.831 ms        69 us   Isoch Transfer                  in      01:01:83        83DEC6F0h       USBPDO-5        usbhub  84FD5790h       Unsuccessful (Internal HC Error)
URB     0011-0008       4:11:41.526     6.834 ms        77 us   Isoch Transfer                  in      01:01:83        83DC8C80h       0000007a        usbccgp 84FD5790h       Unsuccessful (Internal HC Error)
URB     0012    4:11:41.526     6.847 ms                Sync Reset Pipe and Clear Stall                         01:01:83        83DC8C80h       0000007a        usbccgp 83DD4008h
URB     0013    4:11:41.526     6.853 ms                Sync Reset Pipe and Clear Stall                         01:01:83        83DEC6F0h       USBPDO-5        usbhub  83DD4008h
URB     0014-0013       4:11:41.526     6.889 ms        36 us   Sync Reset Pipe and Clear Stall                         01:01:83        83DEC6F0h       USBPDO-5        usbhub  83DD4008h       Success (Success)
URB     0015-0012       4:11:41.526     6.892 ms        45 us   Sync Reset Pipe and Clear Stall                         01:01:83        83DC8C80h       0000007a        usbccgp 83DD4008h       Success (Success)



Parents
No data
Reply
  • /* Audio Streaming Interface */
      AUDIO_STREAMING_INTERFACE_DESC_SIZE,  /* bLength */
      AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
      AUDIO_STREAMING_GENERAL,              /* bDescriptorSubtype */
      0x01,                                 /* bTerminalLink */
      0x01,                                 /* bDelay */
      WBVAL(AUDIO_FORMAT_PCM),              /* wFormatTag */
    /* Audio Type I Format */
      AUDIO_FORMAT_TYPE_I_DESC_SZ(1),       /* bLength */
      AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
      AUDIO_STREAMING_FORMAT_TYPE,          /* bDescriptorSubtype */
      AUDIO_FORMAT_TYPE_I,                  /* bFormatType */
      0x01,                                 /* bNrChannels */
      0x02,                                 /* bSubFrameSize */
      16,                                   /* bBitResolution */
      0x01,                                 /* bSamFreqType */
      B3VAL(32000),                         /* tSamFreq */
    /* Endpoint - Standard Descriptor */
      AUDIO_STANDARD_ENDPOINT_DESC_SIZE,    /* bLength */
      USB_ENDPOINT_DESCRIPTOR_TYPE,         /* bDescriptorType */
      USB_ENDPOINT_OUT(3),                  /* bEndpointAddress */
      USB_ENDPOINT_TYPE_ISOCHRONOUS |
      USB_ENDPOINT_SYNC_ASYNCHRONOUS,           /* bmAttributes */ <---------------
      WBVAL(66),                            /* wMaxPacketSize */
      0x01,                                 /* bInterval */
      0x00,                                 /* bRefresh */
      0x83,                                 /* bSynchAddress */ <------
    /* Endpoint - Audio Streaming */
      AUDIO_STREAMING_ENDPOINT_DESC_SIZE,   /* bLength */
      AUDIO_ENDPOINT_DESCRIPTOR_TYPE,       /* bDescriptorType */
      AUDIO_ENDPOINT_GENERAL,               /* bDescriptor */
      0x00,                                 /* bmAttributes */
      0x02,                                 /* bLockDelayUnits */
      WBVAL(0x0000),                        /* wLockDelay */
    
    
    /* Endpoint - Standard Descriptor */                       // <-------- additional feedback EP
      AUDIO_STANDARD_ENDPOINT_DESC_SIZE,    /* bLength */
      USB_ENDPOINT_DESCRIPTOR_TYPE,         /* bDescriptorType */
      USB_ENDPOINT_IN(3),                   /* bEndpointAddress */
      USB_ENDPOINT_TYPE_ISOCHRONOUS,        /* bmAttributes */
      WBVAL(3),                             /* wMaxPacketSize */
      0x01,                                 /* bInterval */
      0x01,                                 /* bRefresh, every 2ms */
      0x00,                                 /* bSynchAddress */
    
    
    
    
    
    
    
    
    /* Terminator */
      0                                     /* bLength */
    };
    
    /* USB String Descriptor (optional) */
    const uint8_t USB_StringDescriptor[] = {
    /* Index 0x00: LANGID Codes */
      0x04,                              /* bLength */
      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
      WBVAL(0x0409), /* US English */    /* wLANGID */
    /* Index 0x01: Manufacturer */
      (13*2 + 2),                        /* bLength (13 Char + Type + lenght) */
      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
      'N',0,
      'X',0,
      'P',0,
      ' ',0,
      'S',0,
      'e',0,
      'm',0,
      'i',0,
      'c',0,
      'o',0,
      'n',0,
      'd',0,
      ' ',0,
    /* Index 0x02: Product */
      (20*2 + 2),                        /* bLength ( 20 Char + Type + lenght) */
      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
      'N',0,
      'X',0,
      'P',0,
      ' ',0,
      'L',0,
      'P',0,
      'C',0,
      '1',0,
      '7',0,
      'x',0,
      'x',0,
      ' ',0,
      'S',0,
      'p',0,
      'e',0,
      'a',0,
      'k',0,
      'e',0,
      'r',0,
      ' ',0,
    /* Index 0x03: Serial Number */
      (12*2 + 2),                        /* bLength (12 Char + Type + lenght) */
      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
      'D',0,
      'E',0,
      'M',0,
      'O',0,
      '0',0,
      '0',0,
      '0',0,
      '0',0,
      '0',0,
      '0',0,
      '0',0,
      '0',0,
    };
    

Children
  • /* Audio Definitions */
    #define DATA_FREQ 32000                 /* Audio Data Frequency */
    #define P_S       32                    /* Packet Size */
    #if USB_DMA
    #define P_C       4                     /* Packet Count */
    #else
    #define P_C       1                     /* Packet Count */
    #endif
    #define B_S       (8*P_C*P_S)           /* Buffer Size */
    
    uint32_t last_timer_count;
    #if USB_SOF_EVENT
    void USB_SOF_Event (void) {
    uint32_t current_timer_count;
      uint32_t feedback_value;
      uint32_t pclk;
                                                            // feedback
      current_timer_count = LPC_TIM1->TC;                   // capture current SOF timing on the Timer1
      if ( USB_AltSetting[1] == 1 ) {               // When interface 1 / alt 1 is enabled,
                                                    // calculate master/SOF frequency ratio in 10.10 (10.14) format
        feedback_value = ((current_timer_count - last_timer_count) << 14) / (pclk/DATA_FREQ);
                                                    // and send it to the feedback IN EP
        USB_WriteEP( 0x83, (uint8_t *)&feedback_value, 3 );
      }
      last_timer_count = current_timer_count;       // update the last SOF timing
    
    

  • Duration was reduced but still some in the us seconds

    (Iso Request Failed)
    URB     5654-5653       5:37:35.394     1.286303 s      1.866 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     5655-5652       5:37:35.394     1.286307 s      1.873 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     5662-5661       5:37:35.395     1.287303 s      928 us  Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     5663-5660       5:37:35.395     1.287306 s      935 us  Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     5706-5705       5:37:35.405     1.297317 s      1.829 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     5707-5704       5:37:35.405     1.297320 s      1.838 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     6522-6521       5:37:35.589     1.481314 s      1.651 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     6523-6520       5:37:35.589     1.481319 s      1.660 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     10384-10383     5:37:36.459     2.351312 s      1.299 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     10385-10382     5:37:36.459     2.351315 s      1.307 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     11192-11191     5:37:36.644     2.536358 s      1.723 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     11193-11190     5:37:36.644     2.536364 s      1.734 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     11200-11199     5:37:36.646     2.538304 s      1.847 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     11201-11198     5:37:36.646     2.538308 s      1.855 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     11210-11207     5:37:36.647     2.539328 s      954 us  Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     11211-11206     5:37:36.647     2.539331 s      961 us  Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     11220-11219     5:37:36.649     2.541319 s      1.476 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     11221-11218     5:37:36.649     2.541323 s      1.486 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13076-13075     5:37:37.073     2.965537 s      2.165 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13077-13074     5:37:37.073     2.965540 s      2.172 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13084-13083     5:37:37.075     2.967927 s      2.315 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13085-13082     5:37:37.075     2.967931 s      2.322 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13094-13091     5:37:37.079     2.971425 s      2.582 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13095-13090     5:37:37.079     2.971427 s      2.589 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13104-13103     5:37:37.081     2.973315 s      1.326 ms        Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13105-13102     5:37:37.081     2.973320 s      1.335 ms        Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13112-13111     5:37:37.082     2.974307 s      908 us  Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13113-13110     5:37:37.082     2.974311 s      916 us  Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13120-13119     5:37:37.083     2.975306 s      924 us  Isoch Transfer                  in      01:01:83        871826F0h       USBPDO-5        usbhub  85CBDB60h       Unsuccessful (Iso Request Failed)
    URB     13121-13118     5:37:37.083     2.975309 s      933 us  Isoch Transfer                  in      01:01:83        870442C8h       0000010f        usbccgp 85CBDB60h       Unsuccessful (Iso Request Failed)
    
    LPC_SC->PCONP |= (1 << 2);     // Power on Timer'
    

  • Audio is fine no distortion, I am not sure what impact the errors are having, all I know is I am getting them:(

  • Why is the bSynchAddress 129 when the bEndpointAddress is 0x81 EP 1 IN

    IN this usb code you posted in the usb asynchronous thread this code.

       bLength                 9
            bDescriptorType         5
            bEndpointAddress     0x01  EP 1 OUT
            bmAttributes            5
              Transfer Type            Isochronous
              Synch Type               Asynchronous
              Usage Type               Data
            wMaxPacketSize     0x0246  1x 582 bytes
            bInterval               1
            bRefresh                0
            bSynchAddress         129
            AudioControl Endpoint Descriptor:
              bLength                 7
              bDescriptorType        37
              bDescriptorSubtype      1 (EP_GENERAL)
              bmAttributes         0x01
                Sampling Frequency
              bLockDelayUnits         2 Decoded PCM samples
              wLockDelay              0 Decoded PCM samples
          Endpoint Descriptor:
            bLength                 9
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            1
              Transfer Type            Isochronous
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0003  1x 3 bytes
            bInterval               1
            bRefresh                1
            bSynchAddress           0
    
    

  • I think it is MARSet tried like this

    
    void USB_Reset (void) {
    
    #if USB_DMA
      LPC_USB->USBUDCAH   = USB_RAM_ADR;
      LPC_USB->USBDMARClr = 0xFFFFFFFF;
      LPC_USB->USBEpDMADis  = 0xFFFFFFFF;
      LPC_USB->USBEpDMAEn   = USB_DMA_EP;
      LPC_USB->USBEoTIntClr = 0xFFFFFFFF;
      LPC_USB->USBNDDRIntClr = 0xFFFFFFFF;
      LPC_USB->USBSysErrIntClr = 0xFFFFFFFF;
      LPC_USB->USBDMAIntEn  = 0x00000007;
      LPC_USB->USBDMARSet = 1 << EPAdr(0x83);<--------------
      //LPC_USB->USBDMARSet = USB_ENDPOINT_IN(3);<------------
      //DMA_REQ_SET = 1 << EPAdr(0x83);<------------------
    //LPC_USB->USBDMARSet = 1<<EPAdr(USB_DMA_EP;);<------------
    
      DDMemMap[0] = 0x00000000;
      DDMemMap[1] = 0x00000000;
      for (n = 0; n < USB_EP_NUM; n++) {
        udca[n] = 0;
        UDCA[n] = 0;
      }
    #endif
    }
    

  • After I go back I misunderstood what you were saying it just does not seem to want to work properly in Slave mode,

    The firmware handles the isoc IN endpoint (0x83) in "slave mode" (ie. not in DMA mode).
    USB_SOF_Event() processes this endpoint.
    So, don't register this EP at USB_DMA_EP
    
    usbcfg.h
    #define USB_DMA_EP          0x000000C0 // <--- 0x00000040
    Tsuneo
    

    Can it not be set up for the in endpoint to work in DMA MODE I have been trying with no success can you help.

  • anything like this?? I see in the orignal code in the SOF_EVENT endpoint 3 out is call in slave mode, and then in the USB_EndPoint3 (uint32_t event) it is then put in DMA MODE

    If I just leave it how you orignal set it both in and out endpoint 3 will both be called in slave mode first then if I can figure out how it should be written I can call them both in DMA MODE
    at void USB_EndPoint3 (uint32_t event) {

    Becasue like I said the IN Endpoint 3 just does not want to work properly with out adding it into void USB_EndPoint3 (uint32_t event) { in DMA MODE after being first called in SLAVE MODE at the SOF EVENT

     uint32_t last_timer_count;
    #if USB_SOF_EVENT
    void USB_SOF_Event (void) {
    #if USB_DMA == 0 <----- don't need this??
    uint32_t current_timer_count;
      uint32_t feedback_value;
    
      uint32_t pclk;
    
                                                            // feedback
      current_timer_count = LPC_TIM1->TC;                   // capture current SOF timing on the Timer1
      if ( USB_AltSetting[1] == 1 ) {               // When interface 1 / alt 1 is enabled,
                                                    // calculate master/SOF frequency ratio in 10.10 (10.14) format
        feedback_value = ((current_timer_count - last_timer_count) << 14) / (pclk/DATA_FREQ);
                                                    // and send it to the feedback IN EP
        USB_WriteEP( 0x83, (uint8_t *)&feedback_value, 3 );
      }
      last_timer_count = current_timer_count;       // update the last SOF timing
    
    
    void USB_EndPoint3 (uint32_t event) {
    #if USB_DMA
      USB_DMA_DESCRIPTOR DD;
      uint32_t current_timer_count;
      uint32_t feedback_value;
    
      uint32_t pclk;
    
      if (event & USB_EVT_IN_DMA_EOT) {
        /* End of Transfer */
    current_timer_count = LPC_TIM1->TC;                   // capture current SOF timing on the Timer1
      if ( USB_AltSetting[1] == 1 ) {               // When interface 1 / alt 1 is enabled,
                                                    // calculate master/SOF frequency ratio in 10.10 (10.14) format
        feedback_value = ((current_timer_count - last_timer_count) << 14) / (pclk/DATA_FREQ);
                                                    // and send it to the feedback IN EP
    
        if (USB_DMA_BufAdr(0x83) != ((uint8_t *)&feedback_value, 3 )); {
    
        }
    
    }
      last_timer_count = current_timer_count;       // update the last SOF timing
    
      }
      if (event & (USB_EVT_IN_DMA_EOT) | (USB_EVT_IN_DMA_NDR)) {
        /* End of Transfer or New Descriptor Request */
        DD.BufAdr  = ((uint8_t*)&feedback_value, 3)); /* DMA Buffer Address */
        DD.BufLen  = P_C;                       /* DMA Packet Count */
        DD.MaxSize = 0;                         /* Must be 0 for Iso Transfer */
        DD.InfoAdr = (uint32_t)InfoBuf;            /* Packet Info Buffer Address */
        DD.Cfg.Val = 0;                         /* Initial DMA Configuration */
        DD.Cfg.Type.IsoEP = 1;                  /* Iso Endpoint */
        USB_DMA_Setup (0x83, &DD);              /* Setup DMA */
        USB_DMA_Enable(0x83);                   /* Enable DMA */
      }
    #else
      event = event;
    #endif
    }
    

    Could would please try to get it work like this even if you don't think it is the problem.

  • EP3 IN and EP3 OUT works independently.

    usbcfg.h
    #define USB_DMA_EP          0x000000C0 // <--- 0x00000040
    


    This setting means
    - EP3 IN: slave mode
    - DP3 OUT: DMA mode

    You may run EP3 IN in DMA mode, too.
    But DMA for just 3 bytes transfer is too much.

    I tested this modification of USBAudio on Olimex LPC1766-STK and MacOSX, monitored on a hardware bus analyzer.
    The EP3 IN correctly responds to the transactions from host, but its data was unexpected one.
    Maybe, Windows upset with this unexpected feedback value.

    In your USB_SOF_Event() code, pclk is used in right side without filling any value.

    void USB_SOF_Event (void) {
      uint32_t pclk;
    
        feedback_value = ((current_timer_count - last_timer_count) << 14) / (pclk/DATA_FREQ);
    

    I fixed it, but the feedback value over EP3 IN is still strange.

    Almost same modification works on MCB23xx board without any problem.
    There are some difference(s) on LPC17xx, on which I'm not yet aware of it.
    Now, another test is going on.

    Tsuneo

  • For test of EP3 IN transaction, put a fixed value to the feedback_value, as follows.
    And then, you'll see Windows also run the device as we expect.
    This is the clue that wrong feedback_value makes Windows upset.

    void USB_SOF_Event (void) {
    uint32_t current_timer_count;
      uint32_t feedback_value;
      uint32_t pclk;
                                                    // feedback
      current_timer_count = LPC_TIM1->TC;           // capture current SOF timing on the Timer1
      if ( USB_AltSetting[1] == 1 ) {               // When interface 1 / alt 1 is enabled,
                                                    // calculate master/SOF frequency ratio in 10.10 (10.14) format
    //    feedback_value = ((current_timer_count - last_timer_count) << 14) / (pclk/DATA_FREQ);
    
        feedback_value = 32 << 14;    // test value for 32k sampling
    
                                                    // and send it to the feedback IN EP
        USB_WriteEP( 0x83, (uint8_t *)&feedback_value, 3 );
      }
      last_timer_count = current_timer_count;       // update the last SOF timing
    

    Tsuneo

  • This code did not seem to do anything when trying on windows vista

    void USB_SOF_Event (void) {
    uint32_t current_timer_count;
      uint32_t feedback_value;
      uint32_t pclk;
                                                    // feedback
      current_timer_count = LPC_TIM1->TC;           // capture current SOF timing on the Timer1
      if ( USB_AltSetting[1] == 1 ) {               // When interface 1 / alt 1 is enabled,
                                                    // calculate master/SOF frequency ratio in 10.10 (10.14) format
    //    feedback_value = ((current_timer_count - last_timer_count) << 14) / (pclk/DATA_FREQ);
    
        feedback_value = 32 << 14;    // test value for 32k sampling
    
                                                    // and send it to the feedback IN EP
        USB_WriteEP( 0x83, (uint8_t *)&feedback_value, 3 );
      }
      last_timer_count = current_timer_count;       // update the last SOF timing
    
    

    I try to mod it but can not get it to work

    
    feedback_value = ((current_timer_count - last_timer_count) (32<< 14) / (pclk/DATA_FREQ);
    
    

  • OK, I found a bug of the original Keil example.

    BUG: USB_SOF_Event() is repeatedly called in the interval of around 3us
    It should be called in 1ms interval.

    Solution: Clear SOF (FRAME) interrupt flag in ISR, as follows

    MCB1700 Sample Code Bundle for LPC17xx Peripherals using Keil's MDK-ARM V2.00 (Jan 10, 2011)
    ics.nxp.com/.../mcb1700.code.bundle.lpc17xx.keil.zip
    
    keil_examples\USBAudio\usbhw.c
    
    void USB_IRQHandler (void) {
      ...
      ...
    #if USB_SOF_EVENT
      /* Start of Frame Interrupt */
      if (disr & FRAME_INT) {
    
        LPC_USB->DevIntClr = FRAME_INT;   // <---- bug fix
    
        USB_SOF_Event();
      }
    #endif
    

    Tsuneo

  • Nope did nothing, apart from hang the pc after a couple of seconds of audio.

  • What do these definitions do anyway where is the documentation. the same errors are still happing

    usbreg.h

    /* Device Interrupt Bit Definitions */
    #define FRAME_INT           0x00000001
    #define EP_FAST_INT         0x00000002
    #define EP_SLOW_INT         0x00000004
    #define DEV_STAT_INT        0x00000008
    #define CCEMTY_INT          0x00000010
    #define CDFULL_INT          0x00000020
    #define RxENDPKT_INT        0x00000040
    #define TxENDPKT_INT        0x00000080
    #define EP_RLZED_INT        0x00000100
    #define ERR_INT             0x00000200
    

  • Hmm,
    On my side, the mods work as we expect.
    Maybe, I didn't touch to all of modifications I made.
    I posted current modification, here.
    www.8052.com/.../MCB1700_USBAudio_Async_32k_r0.zip
    Try this one.

    To run above firmware on MCB1700, touch this line.

    usbdmain.c
    
    int main (void)
    {
      ...
      ...
    #define OLIMEX_LPC1766STK   // <--- comment this line for MCB1700
    





    At this stage, we have examined basic implementation of the feedback endpoint for Async Sink.
    To brush up above implementation, these issues still remain.

    1) Feedback refresh interval
    In above implementation, Windows read out the feedback EP every 11 or 12 frames, Mac does every 8 frames.
    But our firmware refreshes it in every frame.

    We have to change the refresh interval and bRefresh value on sync EP.

    USB Audio Spec, www.usb.org/.../audio10.pdf
    3.7.2.2 Isochronous Synch Endpoint
    The sample clock Fs is always derived from a master clock Fm in the device.
    P is related to the ratio between those clocks through the following relationship:
    Fm = Fs * 2^(P-1)

    As indicated earlier, a new Ff value is available every 2^(10 – P) frames with P ranging from 1 to 9. The
    bRefresh field of the synch standard endpoint descriptor is used to report the exponent (10-P) to the Host.
    It can range from 9 down to 1. (512 ms down to 2 ms)

    2) Variable number of samples per frame
    Async Sink results +/- 1 samples per frame occasionally, when the frequency ratio of
    the local sampling clock and SOF is apart from an integer number.
    But original Keil implementation assumes that the sample number per frame would be constant,
    and this number is power of 2, ie. 1, 2, 4, 8, 16, 32,...
    This assumption is fine for Adaptive/Synchronous Sink, but it is not approved for Async Sink.

    - I touched to the mods for Keils's "mask" method, in this post
    http://www.keil.com/forum/19557/
    Posted 30-Sep-2011 03:43 GMT

    - The mods on above post has to be modified more for variable transferred data size on each frame.

    3) Pop noise on Windows
    Windows irregularly put Set_Interface(0) / Set_Interface(1) pair to the device, while it plays sound.
    This makes pop noise. I'm not sure if this behavior is caused by the value of feedback or not.

    Tsuneo

  • Which one of these should I be changing the feild bInterval and bRefresh for. If you could explain how they both work together would help.

    /* Endpoint - Standard Descriptor */
      AUDIO_STANDARD_ENDPOINT_DESC_SIZE,    /* bLength */
      USB_ENDPOINT_DESCRIPTOR_TYPE,         /* bDescriptorType */
      USB_ENDPOINT_OUT(3),                  /* bEndpointAddress */
      USB_ENDPOINT_TYPE_ISOCHRONOUS | USB_ENDPOINT_SYNC_ASYNCHRONOUS,        /* bmAttributes */          // <-------
      WBVAL(66),                            /* wMaxPacketSize */   // <-------
      0x01,                                 /* bInterval */
      0x00,                                 /* bRefresh */
      0x83,                                 /* bSynchAddress */    // <-------
    
    
    /* Endpoint - Standard Descriptor - for feedback */
      AUDIO_STANDARD_ENDPOINT_DESC_SIZE,    /* bLength */
      USB_ENDPOINT_DESCRIPTOR_TYPE,         /* bDescriptorType */
      USB_ENDPOINT_IN(3),                   /* bEndpointAddress */
      USB_ENDPOINT_TYPE_ISOCHRONOUS,        /* bmAttributes */
      WBVAL(3),                             /* wMaxPacketSize */
      0x01,                                 /* bInterval */
      0x01,                                 /* bRefresh */
      0x00,                                 /* bSynchAddress */
    


    If I set them like this

    /* Endpoint - Standard Descriptor */
      AUDIO_STANDARD_ENDPOINT_DESC_SIZE,    /* bLength */
      USB_ENDPOINT_DESCRIPTOR_TYPE,         /* bDescriptorType */
      USB_ENDPOINT_OUT(3),                  /* bEndpointAddress */
      USB_ENDPOINT_TYPE_ISOCHRONOUS | USB_ENDPOINT_SYNC_ASYNCHRONOUS,        /* bmAttributes */          // <-------
      WBVAL(66),                            /* wMaxPacketSize */   // <-------
      0x01,                                 /* bInterval */   <------------------------ Interval for polling endpoint for data transfers expressed in milliseconds  0x01 = 1 packet every frame
      0x09,                                 /* bRefresh */   <----------------------------- 512ms until synchronization pipe provides new synchronization feedback data.
      0x83,                                 /* bSynchAddress */    // <-------
    
    

    would that mean I would get 1ms delay for polling data transfers of 1 packet every frame, and then 512ms before the endpoint provides new synchronization feedback data.

    what do you feel they should be set at.

    What are you suggesting to be changed when you wrote these comments, are you talking about audio.h and desc.c WBVAL(66), and P_S Packet Size


    2) Variable number of samples per frame
    Async Sink results +/- 1 samples per frame occasionally, when the frequency ratio of
    the local sampling clock and SOF is apart from an integer number.
    But original Keil implementation assumes that the sample number per frame would be constant,
    and this number is power of 2, ie. 1, 2, 4, 8, 16, 32,...
    This assumption is fine for Adaptive/Synchronous Sink, but it is not approved for Async Sink.

    /* Audio Definitions */
    #define DATA_FREQ 32000                 /* Audio Data Frequency */
    #define P_S       32                    /* Packet Size */
    #if USB_DMA
    #define P_C       4                     /* Packet Count */
    #else
    #define P_C       1                     /* Packet Count */
    #endif
    #define B_S       (8*P_C*P_S)           /* Buffer Size */
    

    >> The mods on above post has to be modified more for variable transferred data size on each frame.

    Could you give me details about what I am to do here