Samuel Mokrani
/
USBAudio_micro
USBAudio example using a microphone
Diff: USBDevice/USBAudio/USBAudio.cpp
- Revision:
- 5:b49b6a8ca111
- Parent:
- 3:e6a29c83ac52
- Child:
- 6:be128039be16
--- a/USBDevice/USBAudio/USBAudio.cpp Mon Dec 19 16:13:32 2011 +0000 +++ b/USBDevice/USBAudio/USBAudio.cpp Tue Dec 20 10:44:10 2011 +0000 @@ -36,7 +36,7 @@ channel_config = (channel_nb == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R; SOF_handler = false; - readIN = false; + writeIN = false; interruptIN = false; buf_stream = NULL; @@ -46,25 +46,26 @@ } bool USBAudio::write(uint8_t * buf) { - readIN = false; + writeIN = false; SOF_handler = false; if (interruptIN) { - USBDevice::writeNB(EP3IN, buf, 16, 16); + USBDevice::writeNB(EP3IN, buf, PACKET_SIZE_ISO, PACKET_SIZE_ISO); } else { buf_stream = buf; } while (!SOF_handler); if (interruptIN) { - while (!readIN); + while (!writeIN); } buf_stream = NULL; return true; } +DigitalOut p1(p18); // Called in ISR context on each start of frame void USBAudio::SOF(int frameNumber) { if (buf_stream != NULL) { - USBDevice::writeNB(EP3IN, (uint8_t *)buf_stream, 16, 16); + USBDevice::writeNB(EP3IN, (uint8_t *)buf_stream, PACKET_SIZE_ISO, PACKET_SIZE_ISO); } SOF_handler = true; } @@ -72,7 +73,7 @@ bool USBAudio::EP3_IN_callback() { interruptIN = true; - readIN = true; + writeIN = true; return true; } @@ -98,91 +99,86 @@ } if (interface == 1 && (alternate == 0 || alternate == 1)) { return true; - } else - printf("intf: %d, alt: %d\r\n", interface, alternate); + } return false; } #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \ - + (5 * INTERFACE_DESCRIPTOR_LENGTH) \ + + (3 * INTERFACE_DESCRIPTOR_LENGTH) \ + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH) \ - + (2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \ - + (2 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \ - + (2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \ - + (0x07) \ - + (2 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \ - + (2 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \ - + (2 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \ - + (2 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) ) + + (1 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \ + + (1 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \ + + (1 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \ + + (1 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \ + + (1 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \ + + (1 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) ) #define TOTAL_CONTROL_INTF_LENGTH (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + \ - 2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH + \ - 2 * FEATURE_UNIT_DESCRIPTOR_LENGTH + \ - 2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH + \ - 0x07) + 1 * INPUT_TERMINAL_DESCRIPTOR_LENGTH + \ + 1 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) uint8_t * USBAudio::configurationDesc() { static uint8_t configDescriptor[] = { // Configuration 1 - CONFIGURATION_DESCRIPTOR_LENGTH, // bLength - CONFIGURATION_DESCRIPTOR, // bDescriptorType - 0x64, // wTotalLength (LSB) - 0x00, // wTotalLength (MSB) - 0x02, // bNumInterfaces - DEFAULT_CONFIGURATION, // bConfigurationValue - 0x00, // iConfiguration - 0x80, // bmAttributes - 50, // bMaxPower + CONFIGURATION_DESCRIPTOR_LENGTH, // bLength + CONFIGURATION_DESCRIPTOR, // bDescriptorType + LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB) + MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB) + 0x02, // bNumInterfaces + DEFAULT_CONFIGURATION, // bConfigurationValue + 0x00, // iConfiguration + 0x80, // bmAttributes + 50, // bMaxPower // Interface 0, Alternate Setting 0, Audio Control - INTERFACE_DESCRIPTOR_LENGTH, // bLength - INTERFACE_DESCRIPTOR, // bDescriptorType - 0x00, // bInterfaceNumber - 0x00, // bAlternateSetting - 0x00, // bNumEndpoints - 0x01, // bInterfaceClass - 0x01, // bInterfaceSubClass - 0x00, // bInterfaceProtocol - 0x00, // iInterface + INTERFACE_DESCRIPTOR_LENGTH, // bLength + INTERFACE_DESCRIPTOR, // bDescriptorType + 0x00, // bInterfaceNumber + 0x00, // bAlternateSetting + 0x00, // bNumEndpoints + AUDIO_CLASS, // bInterfaceClass + SUBCLASS_AUDIOCONTROL, // bInterfaceSubClass + 0x00, // bInterfaceProtocol + 0x00, // iInterface // Audio Control Interface - 0x09, // bLength - 0x24, // bDescriptorType - 0x01, // bDescriptorSubtype - LSB(0x0100), // bcdADC (LSB) - MSB(0x0100), // bcdADC (MSB) - 0x1e, // wTotalLength - 0x00, // wTotalLength - 0x01, // bInCollection - 0x01, // baInterfaceNr + CONTROL_INTERFACE_DESCRIPTOR_LENGTH, // bLength + INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType + CONTROL_HEADER, // bDescriptorSubtype + LSB(0x0100), // bcdADC (LSB) + MSB(0x0100), // bcdADC (MSB) + LSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength + MSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength + 0x01, // bInCollection + 0x01, // baInterfaceNr - // Audio Input Terminal (Speaker) - 0x0c, // bLength - 0x24, // bDescriptorType - 0x02, // bDescriptorSubtype - 0x01, // bTerminalID - 0x01, // wTerminalType - 0x02, // wTerminalType - 0x00, // bAssocTerminal - 0x01, // bNrChannels - 0x00, // wChannelConfig - 0x00, // wChannelConfig - 0x00, // iChannelNames - 0x00, // iTerminal + // Audio Input Terminal (Microphone) + INPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength + INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType + CONTROL_INPUT_TERMINAL, // bDescriptorSubtype + 0x01, // bTerminalID + LSB(TERMINAL_MICROPHONE), // wTerminalType + MSB(TERMINAL_MICROPHONE), // wTerminalType + 0x00, // bAssocTerminal + channel_nb, // bNrChannels + LSB(channel_config), // wChannelConfig + MSB(channel_config), // wChannelConfig + 0x00, // iChannelNames + 0x00, // iTerminal // Audio Output Terminal (Speaker) - 0x09, // bLength - 0x24, // bDescriptorType - 0x03, // bDescriptorSubtype - 0x02, // bTerminalID - 0x01, // wTerminalType - 0x01, // wTerminalType - 0x00, // bAssocTerminal - 0x01, // bSourceID - 0x00, // iTerminal + OUTPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength + INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType + CONTROL_OUTPUT_TERMINAL, // bDescriptorSubtype + 0x02, // bTerminalID + LSB(TERMINAL_USB_STREAMING), // wTerminalType + MSB(TERMINAL_USB_STREAMING), // wTerminalType + 0x00, // bAssocTerminal + 0x01, // bSourceID + 0x00, // iTerminal @@ -192,76 +188,73 @@ // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith - 0x09, // bLength - 0x04, // bDescriptorType - 0x01, // bInterfaceNumber - 0x00, // bAlternateSetting - 0x00, // bNumEndpoints - 0x01, // bInterfaceClass - 0x02, // bInterfaceSubClass - 0x00, // bInterfaceProtocol - 0x00, // iInterface + INTERFACE_DESCRIPTOR_LENGTH, // bLength + INTERFACE_DESCRIPTOR, // bDescriptorType + 0x01, // bInterfaceNumber + 0x00, // bAlternateSetting + 0x00, // bNumEndpoints + AUDIO_CLASS, // bInterfaceClass + SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass + 0x00, // bInterfaceProtocol + 0x00, // iInterface // Interface 1, Alternate Setting 1, Audio Streaming - Operational - 0x09, // bLength - 0x04, // bDescriptorType - 0x01, // bInterfaceNumber - 0x01, // bAlternateSetting - 0x01, // bNumEndpoints - 0x01, // bInterfaceClass - 0x02, // bInterfaceSubClass - 0x00, // bInterfaceProtocol - 0x00, // iInterface + INTERFACE_DESCRIPTOR_LENGTH, // bLength + INTERFACE_DESCRIPTOR, // bDescriptorType + 0x01, // bInterfaceNumber + 0x01, // bAlternateSetting + 0x01, // bNumEndpoints + AUDIO_CLASS, // bInterfaceClass + SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass + 0x00, // bInterfaceProtocol + 0x00, // iInterface // Audio Streaming Interface - 0x07, // bLength - 0x24, // bDescriptorType - 0x01, // bDescriptorSubtype - 0x02, // bTerminalLink - 0x01, // bDelay - 0x01, // wFormatTag - 0x00, // wFormatTag + STREAMING_INTERFACE_DESCRIPTOR_LENGTH, // bLength + INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType + SUBCLASS_AUDIOCONTROL, // bDescriptorSubtype + 0x02, // bTerminalLink (output terminal microphone) + 0x01, // bDelay + 0x01, // wFormatTag + 0x00, // wFormatTag // Audio Type I Format - 0x0B, // bLength - 0x24, // bDescriptorType - 0x02, // bDescriptorSubtype - 0x01, // bFormatType - 0x01, // bNrChannels - 0x02, // bSubFrameSize - 0x10, // bBitResolution - 0x01, // bSamFreqType - 0x40, // tSamFreq - 0x1F, // tSamFreq - 0x00, // tSamFreq + FORMAT_TYPE_I_DESCRIPTOR_LENGTH, // bLength + INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType + SUBCLASS_AUDIOSTREAMING, // bDescriptorSubtype + FORMAT_TYPE_I, // bFormatType + channel_nb, // bNrChannels + 0x02, // bSubFrameSize + 0x10, // bBitResolution + 0x01, // bSamFreqType + LSB(FREQ), // tSamFreq + (FREQ >> 8) & 0xff, // tSamFreq + (FREQ >> 16) & 0xff, // tSamFreq // Endpoint - Standard Descriptor - 0x09, // bLength - 0x05, // bDescriptorType - PHY_TO_DESC(EPISO_IN), // bEndpointAddress - E_ISOCHRONOUS, // bmAttributes - LSB(PACKET_SIZE_ISO), // wMaxPacketSize - MSB(PACKET_SIZE_ISO), // wMaxPacketSize - 0x01, // bInterval - 0x00, // bRefresh - 0x00, // bSynchAddress + ENDPOINT_DESCRIPTOR_LENGTH + 2, // bLength + ENDPOINT_DESCRIPTOR, // bDescriptorType + PHY_TO_DESC(EPISO_IN), // bEndpointAddress + E_ISOCHRONOUS, // bmAttributes + LSB(PACKET_SIZE_ISO), // wMaxPacketSize + MSB(PACKET_SIZE_ISO), // wMaxPacketSize + 0x01, // bInterval + 0x00, // bRefresh + 0x00, // bSynchAddress // Endpoint - Audio Streaming - 0x07, // bLength - 0x25, // bDescriptorType - 0x01, // bDescriptor - 0x00, // bmAttributes - 0x00, // bLockDelayUnits - LSB(0x0000), // wLockDelay - MSB(0x0000), // wLockDelay - - + STREAMING_ENDPOINT_DESCRIPTOR_LENGTH, // bLength + ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType + ENDPOINT_GENERAL, // bDescriptor + 0x00, // bmAttributes + 0x00, // bLockDelayUnits + LSB(0x0000), // wLockDelay + MSB(0x0000), // wLockDelay // Terminator 0 }; - //printf("size config: %d\r\n", sizeof(configDescriptor)); return configDescriptor; }