Код: Выделить всё
static const uint8_t USB_ConfigDescriptor[] = {
ARRLEN34(
ARRLEN1(
bLENGTH, // bLength: Configuration Descriptor size
USB_DESCR_CONFIG, //bDescriptorType: Configuration
wTOTALLENGTH, //wTotalLength
2, // bNumInterfaces
1, // bConfigurationValue: Configuration value
0, // iConfiguration: Index of string descriptor describing the configuration
0x80, // bmAttributes: bus powered
0x32, // MaxPower 100 mA
)
ARRLEN1(//0: Audio control Interface
bLENGTH, // bLength
USB_DESCR_INTERFACE, // bDescriptorType
0, // bInterfaceNumber
0, // bAlternateSetting
0, // bNumEndpoints (если испольуется Interrupt endpoint, может быть 1)
USB_CLASS_AUDIO, // bInterfaceClass:
USB_SUBCLASS_AUDIOCONTROL, // bInterfaceSubClass:
0x00, // bInterfaceProtocol:
0x00, // iInterface
)
ARRLEN67(//AC interface
ARRLEN1(//AC interface header
bLENGTH, //bLength
USB_DESCR_CS_INTERFACE, //bDescriptorType
1, //bDescriptorSubType
USB_U16(1), //bcdADC //AudioDeviceClass серийный номер
wTOTALLENGTH, //wTotalLength
1, //bInCollection //количество интерфейсов в коллекции
1, //bInterfaceNr(1), //массив (список) номеров интерфейсов в коллекции
//bInterfaceNr(2), ...
)
ARRLEN1(//1. AC Input terminal
bLENGTH, //bLength
USB_DESCR_CS_INTERFACE, //bDescriptorType
USBAUDIO_IF_TERM_IN, //bDescriptorSubType
1, //bTerminalID
USB_U16( USBAUDIO_TERMINAL_MIC ), //wTerminalTypeЧто это вообще такое (а вариантов немало!)
0, //bAssocTerminal привязка выходного терминала для создания пары. Не используем
1, //bNrChannels
USB_U16( 0 ), //wChannelConfig //к чему именно подключены каналы
0, //iChannelNames
0, //iTerminal
)
ARRLEN1(//2. AC Feature Unit
bLENGTH, //bLength
USB_DESCR_CS_INTERFACE, //bDescriptorType
USBAUDIO_IF_FEATURE, //bDescriptorSubType
2, //UnitID
1, //bSourceID <---------------------------------------------
1, //bControlSize //размер одного элемента в массиве
//bmaControls чем именно можно управлять
USBAUDIO_FEATURE_MUTE, //Channel(0)
USBAUDIO_FEATURE_NONE, //Channel(1) канал 1 - Mute
//нужно описать оба канала?
0, //iFeature
)
ARRLEN1(//3. AC Output Terminal
bLENGTH, //bLength
USB_DESCR_CS_INTERFACE, //bDescriptorType
USBAUDIO_IF_TERM_OUT, //bDescriptorSubType
3, //bTerminalID
USB_U16( USBAUDIO_TERMINAL_USB ), //wTerminalType:speaker
0, //bAssocTerminal
2, //bSourceID <-------------------------------------------
0, //iTerminal
)
)
ARRLEN1(//1 Audio Streaming Interface
bLENGTH, //bLength
USB_DESCR_INTERFACE, //bDescriptorType
1, //bInterfaceNumber
0, //bAlternateSetting
0, //bNumEndpoints
USB_CLASS_AUDIO, //bInterfaceClass
USB_SUBCLASS_AUDIOSTREAMING, //bInterfaceSubClass
0, //bInterfaceProtocol
0, //iInterface
)
ARRLEN1(//1alt Audio Streaming Interface (alternative)
bLENGTH, //bLength
USB_DESCR_INTERFACE, //bDescriptorType
1, //bInterfaceNumber
1, //bAlternateSetting
1, //bNumEndpoints
USB_CLASS_AUDIO, //bInterfaceClass
USB_SUBCLASS_AUDIOSTREAMING, //bInterfaceSubClass
0, //bInterfaceProtocol
0, //iInterface
)
ARRLEN1(//AS Interface
bLENGTH, //bLength
USB_DESCR_CS_INTERFACE, //bDescriptorType
USBAUDIO_AS_GENERAL, //bDescriptorSubType
3, //bTerminalLink <----------------------------------------
1, //bDelay //задержка, вносимая устройством (в единицах числа фреймов)
USB_U16( USBAUDIO_FORMAT_PCM ), //wFormatTag=PCM, тип кодирования данных //TODO описать возможные типы
)
ARRLEN1(//AS Format Type 1
bLENGTH, //bLength
USB_DESCR_CS_INTERFACE, //bDescriptorType
USBAUDIO_AS_FORMAT, //bDescriptorSubType
1, //bFormatType
1, //bNrChannels
2, //bSubFrameSize //количество БАЙТОВ на отсчет (1-4)
16, //bBitResolution //количество БИТОВ на отсчет (<= bSubFrameSize*8) //наверное, то-занимаемое в потоке место, а это - реальная разрешающая способность
1, //bSamFreqType //количество поддерживаемых частот
USB_AC24(48000), //tSamFreq //(6 байт!) массив диапазонов частот
)
ARRLEN1(//Endpoint descriptor
bLENGTH, //bLength
USB_DESCR_ENDPOINT, //bDescriptorType
ENDP_DATA_NUM | 0x80,
USB_ENDP_ISO, //Isochronous / Synch=none / usage=data //TODO
USB_U16(ENDP_DATA_SIZE),
1, //bInterval - частота опроса, для изохронных всегда 1
0, //bRefresh - хз что это, сказано выставить в 0
0, //bSynchAddress - адрес endpoint'а для синхронизации
)
ARRLEN1(//Isochronous endpoint descriptor
bLENGTH, //bLength
USB_DESCR_ENDP_ISO, //bDescriptorType
1, //bDescriptorSubType
0, //bmAttributes
0, //bLockDelayUnits (undefned)
USB_U16(0), //wLockDelay
)
)
};