blob: 867c7bb7eaee1d8b7905af80a5676b4994faf4bb [file] [log] [blame]
/******************************************************************************
* @file usbdesc.c
*
* @brief for TLSR chips
*
* @author public@telink-semi.com;
* @date Sep. 30, 2010
*
* @attention
*
* Copyright (C) 2019-2020 Telink Semiconductor (Shanghai) Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************/
#include <application/usbstd/usbdesc.h>
#include "tl_common.h"
#include "drivers.h"
#if (USB_MOUSE_ENABLE)
#include <application/app/usbmouse_i.h>
#endif
#if (USB_KEYBOARD_ENABLE)
#include <application/app/usbkb_i.h>
#endif
#if (USB_SOMATIC_ENABLE)
#include "../app/usbsomatic_i.h"
#endif
#if (USB_SPEAKER_ENABLE || USB_MIC_ENABLE)
#include <application/app/usbaud_i.h>
#endif
#if (USB_CDC_ENABLE)
#include <application/app/usbcdc_i.h>
#endif
//#include "usb.h"
// request parameters
/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
* the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
* via the language ID table available at USB.org what languages the device supports for its string descriptors.
*/
const USB_Descriptor_String_t language_desc = { {
sizeof(USB_Descriptor_Hdr_t) + 2, DTYPE_String },
{ LANGUAGE_ID_ENG } };
/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
* form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
* Descriptor.
*/
const USB_Descriptor_String_t vendor_desc = { { sizeof(USB_Descriptor_Hdr_t)
+ sizeof(STRING_VENDOR) - 2, DTYPE_String }, // Header
STRING_VENDOR };
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
* and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
* Descriptor.
*/
const USB_Descriptor_String_t product_desc = { {
sizeof(USB_Descriptor_Hdr_t) + sizeof(STRING_PRODUCT) - 2,
DTYPE_String }, // Header
STRING_PRODUCT };
/** Serial number string. This is a Unicode string containing the device's unique serial number, expressed as a
* series of uppercase hexadecimal digits.
*/
const USB_Descriptor_String_t serial_desc = { { sizeof(USB_Descriptor_Hdr_t)
+ sizeof(STRING_SERIAL) - 2, DTYPE_String }, // Header
STRING_SERIAL };
#if (MS_OS_DESCRIPTOR_ENABLE)
const USB_Descriptor_String_t microsoft_OS_desc = { {
sizeof(USB_Descriptor_Hdr_t) + sizeof(STRING_MSFT) - 2,
DTYPE_String }, // Header
STRING_MSFT };
const unsigned char OSFeatureDescriptor[] ={
0x26,0x01, 0x00, 0x00,
0x00,0x01,
0x05,0x00,
0x05,0x00,
// DeviceIdleEnabled
0x36,0x00, 0x00, 0x00,
0x04,0x00, 0x00, 0x00,
0x24, 0x00,
0x44,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x49,0x00,0x64,0x00,
0x6C,0x00,0x65,0x00,0x45,0x00,0x6E,0x00,0x61,0x00,0x62,0x00,0x6C,0x00,0x65,0x00,
0x64,0x00,0x00,0x00,
0x04,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,
//DefaultIdleState
0x34,0x00,0x00,0x00,
0x04,0x00, 0x00, 0x00,
0x22,0x00,
0x44,0x00, 0x65,0x00, 0x66,0x00, 0x61,0x00, 0x75,0x00,
0x6C,0x00, 0x74,0x00, 0x49,0x00, 0x64,0x00, 0x6C,0x00,
0x65,0x00, 0x53,0x00, 0x74,0x00, 0x61,0x00, 0x74,0x00,
0x65,0x00, 0x00,0x00,
0x04,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,
//default timeout value for selective suspend.
0x38,0x00,0x00,0x00,
0x04,0x00, 0x00, 0x00,
0x26,0x00,
0x44,0x00,0x65,0x00,0x66,0x00,0x61,0x00,
0x75,0x00,0x6C,0x00,0x74,0x00,0x49,0x00,
0x64,0x00,0x6C,0x00,0x65,0x00,0x54,0x00,
0x69,0x00,0x6D,0x00,0x65,0x00,0x6F,0x00,
0x75,0x00,0x74,0x00,
0x00,0x00,
0x04,0x00,0x00,0x00,
0x88,0x13,0x00,0x00,
// user-enabled selective suspend.
0x44,0x00,0x00,0x00,
0x04,0x00, 0x00, 0x00,
0x32,0x00,
0x55,0x00,0x73,0x00,
0x65,0x00,0x72,0x00,
0x53,0x00,0x65,0x00,
0x74,0x00,0x44,0x00,
0x65,0x00,0x76,0x00,
0x69,0x00,0x63,0x00,
0x65,0x00,0x49,0x00,
0x64,0x00,0x6C,0x00,
0x65,0x00,0x45,0x00,
0x6E,0x00,0x61,0x00,
0x62,0x00,0x6C,0x00,
0x65,0x00,0x64,0x00,
0x00,0x00,
0x04,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,
//user-enabled remote wake setting.
0x36,0x00,0x00,0x00,
0x04,0x00,0x00,0x00,
0x24,0x00,
0x53,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6D,0x00,0x57,0x00,0x61,0x00,
0x6B,0x00,0x65,0x00,0x45,0x00,0x6E,0x00,0x61,0x00,0x62,0x00,0x6C,0x00,0x65,0x00,
0x64,0x00,0x00,0x00,
0x04,0x00,0x00,0x00,
0x01,0x00,0x00,0x00
};
const USB_MS_OS_compatID_t OSFeatureDescriptor_compatID = {
{
sizeof(USB_MS_OS_compatID_Header_t)
+ USB_KEYBOARD_ENABLE * sizeof(USB_MS_OS_compatID_Function_t)
+ USB_MOUSE_ENABLE * sizeof(USB_MS_OS_compatID_Function_t),
0x0100,
0x0004,
USB_KEYBOARD_ENABLE + USB_MOUSE_ENABLE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},
{
#if USB_KEYBOARD_ENABLE
{
USB_INTF_KEYBOARD,
0x01,
'W', 'I', 'N', 'U' ,'S','B', 0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,
},
#endif
#if USB_MOUSE_ENABLE
{
USB_INTF_MOUSE,
0x01,
'W', 'I', 'N', 'U' ,'S','B', 0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,
},
#endif
}
};
#if 0
const unsigned char OSFeatureDescriptor_compatID[] = {
0x28,0x00,0x00,0x00,
0x00,0x01,
0x04,0x00,
0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,
USB_INTF_MOUSE,
0x01,
'W', 'I', 'N', 'U' ,'S','B', 0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,
};
#endif
#endif
#ifndef ID_PRODUCT
#define ID_PRODUCT (ID_PRODUCT_BASE | (USB_PRINTER_ENABLE?(1<<0):0) | (USB_SPEAKER_ENABLE?(1<<1):0) | (USB_MIC_ENABLE?(1<<2):0) \
| (USB_MOUSE_ENABLE?(1<<3):0) | (USB_KEYBOARD_ENABLE?(1<<4):0) | (USB_SOMATIC_ENABLE?(1<<5):0))
#endif
const USB_Descriptor_Device_t device_desc = { {
sizeof(USB_Descriptor_Device_t), DTYPE_Device }, // Header
#if (MS_OS_DESCRIPTOR_ENABLE)
0x0200, // USBSpecification, USB 2.0
#else
0x0110, // USBSpecification, USB 1.1
#endif
#if (USB_CDC_ENABLE)
CDC_CSCP_CDCClass, // Class
USB_CSCP_NoDeviceSubclass, // SubClass
USB_CSCP_NoDeviceProtocol, // Protocol
#else
USB_CSCP_NoDeviceClass,
USB_CSCP_NoDeviceSubclass, // SubClass
USB_CSCP_NoDeviceProtocol, // Protocol
#endif
8, // Endpoint0Size, Maximum Packet Size for Zero Endpoint. Valid Sizes are 8, 16, 32, 64
ID_VENDOR, // VendorID
#if USB_CDC_ENABLE
0x8846,
#else
#if AUDIO_HOGP
0xc080,//ID_PRODUCT, // ProductID
#else
ID_PRODUCT,
#endif
#endif
0x0100, // .ReleaseNumber
USB_STRING_VENDOR, // .ManufacturerStrIndex
USB_STRING_PRODUCT, // .ProductStrIndex
3, // .SerialNumStrIndex, iSerialNumber
1 };
const USB_Descriptor_Configuration_t
configuration_desc = { { {
sizeof(USB_Descriptor_Configuration_Hdr_t),
DTYPE_Configuration }, // Length, type
sizeof(USB_Descriptor_Configuration_t), // TotalLength: variable
USB_INTF_MAX, // NumInterfaces
1, // Configuration index
NO_DESCRIPTOR, // Configuration String
USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP, // Attributes
USB_CONFIG_POWER_MA(50) // MaxPower = 100mA
},
#if AUDIO_HOGP
// HID audio hogp interface
{ {sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_AUDIO_HOGP,
0, // AlternateSetting
1, // bNumEndpoints
HID_CSCP_HIDClass, HID_CSCP_NonBootSubclass,
HID_CSCP_KeyboardBootProtocol, NO_DESCRIPTOR
},
{
// hid des
{
{sizeof(USB_HID_Descriptor_HID_t), HID_DTYPE_HID}, 0x0111, // HIDSpec
0, 1, // TotalReportDescriptors
HID_DTYPE_Report, {sizeof(audio_hogp_report_desc), 0x00}, // HIDReportLength
},
// audio_hogp_in_endpoint
{
{sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint},
ENDPOINT_DIR_IN | USB_EDP_AUDIO_IN,
EP_TYPE_INTERRUPT, 0x40, // EndpointSize
1,//USB_KEYBOARD_POLL_INTERVAL // PollingIntervalMS
},
// // audio_hogp_out_endpoint
// {
// {sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint},
// ENDPOINT_DIR_OUT | USB_EDP_KEYBOARD_OUT,
// EP_TYPE_BULK, 0x0010, // EndpointSize
// 1//USB_KEYBOARD_POLL_INTERVAL // PollingIntervalMS
// },
},
#endif
#if (USB_CDC_ENABLE)
#if 0
{
// iad0
{sizeof(USB_Descriptor_Interface_Association_t), DTYPE_InterfaceAssociation}, // Header
0, // FirstInterfaceIndex
2, // TotalInterface
CDC_CSCP_CDCClass, // Class
CDC_CSCP_ACMSubclass, // Subclass
CDC_CSCP_ATCommandProtocol, // protocol
NO_DESCRIPTOR // IADStrIndex
},
#endif
{
// cdc_interface
{sizeof(USB_Descriptor_Interface_t), DTYPE_Interface}, // Header
USB_INTF_CDC_CCI, // InterfaceNumber
0, // AlternateSetting
1, // TotalEndpoints
CDC_CSCP_CDCClass, // Class
CDC_CSCP_ACMSubclass, // SubClass
CDC_CSCP_ATCommandProtocol, // Protocol
NO_DESCRIPTOR //InterfaceStrIndex
},
{
// cdc_descriptor
//CDC_Functional_Header
{
{sizeof(USB_CDC_Descriptor_FunctionalHeader_t), DTYPE_CSInterface}, // Header
CDC_DSUBTYPE_CSInterface_Header, // Subtype
0x0110 // CDCSpecification
},
// CDC_Functional_ACM =
{
{sizeof(USB_CDC_Descriptor_FunctionalACM_t), DTYPE_CSInterface}, // Header
CDC_DSUBTYPE_CSInterface_ACM, // Subtype
0x02 // Capabilities
},
// CDC_Functional_Union =
{
{sizeof(USB_CDC_Descriptor_FunctionalUnion_t), DTYPE_CSInterface}, // Header
CDC_DSUBTYPE_CSInterface_Union, // Subtype
0, // MasterInterfaceNumber
1, // SlaveInterfaceNumber
},
// CDC_CallManagement =
{
{sizeof(USB_CDC_Descriptor_FunctionalUnion_t), DTYPE_CSInterface}, // Header
CDC_DSUBTYPE_CSInterface_CallManagement, // Subtype
0, // MasterInterfaceNumber
1, // SlaveInterfaceNumber
},
// CDC_NotificationEndpoint =
{
{sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint}, // Header
(ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), // EndpointAddress
(EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), // Attributes
CDC_NOTIFICATION_EPSIZE, // EndpointSize
0x40 // PollingIntervalMS
},
// CDC_DCI_Interface =
{
{sizeof(USB_Descriptor_Interface_t), DTYPE_Interface}, // Header
USB_INTF_CDC_DCI, // InterfaceNumber
0, // AlternateSetting
2, // TotalEndpoints
CDC_CSCP_CDCDataClass, // Class
CDC_CSCP_NoDataSubclass, // SubClass
CDC_CSCP_NoDataProtocol, // Protocol
NO_DESCRIPTOR // InterfaceStrIndex
},
// CDC_DataOutEndpoint =
{
{sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint}, // Header
(ENDPOINT_DIR_OUT | CDC_RX_EPNUM), // EndpointAddress
(EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), // Attributes
CDC_TXRX_EPSIZE, // EndpointSize
0x00 // PollingIntervalMS
},
// CDC_DataInEndpoint =
{
{sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint}, // Header
(ENDPOINT_DIR_IN | CDC_TX_EPNUM), // EndpointAddress
(EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), // Attributes
CDC_TXRX_EPSIZE, // EndpointSize
0x00 // PollingIntervalMS
},
},
#endif
#if(USB_PRINTER_ENABLE)
// printer_interface
{ { sizeof(USB_Descriptor_Interface_t), DTYPE_Interface },
USB_INTF_PRINTER, 0, // AlternateSetting
#if(USB_SOMATIC_ENABLE)
1, // bNumEndpoints
#else
2, // bNumEndpoints
#endif
PRNT_CSCP_PrinterClass, // bInterfaceclass ->Printer
PRNT_CSCP_PrinterSubclass, // bInterfaceSubClass -> Control
PRNT_CSCP_BidirectionalProtocol,// bInterfaceProtocol
NO_DESCRIPTOR // iInterface, same as iProduct in USB_Descriptor_Device_t, or else not working
},
// printer_in_endpoint
{ { sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint }, // length, bDescriptorType
ENDPOINT_DIR_IN | USB_EDP_PRINTER_IN, // endpoint id
EP_TYPE_BULK, // endpoint type
0x0040, // wMaxPacketSize
0 // bInterval
},
#if(!USB_SOMATIC_ENABLE)
// printer_out_endpoint
{ { sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint }, // length, bDescriptorType
USB_EDP_PRINTER_OUT, // endpoint id
EP_TYPE_BULK, // endpoint type
0x0040, // wMaxPacketSize
0 // polling bInterval. valid for iso or interrupt type
},
#endif
#endif
#if (USB_MIC_ENABLE || USB_SPEAKER_ENABLE)
// audio_control_interface
{ { sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_AUDIO_CONTROL, 0, // AlternateSetting
0, // bNumEndpoints
AUDIO_CSCP_AudioClass, // bInterfaceclass ->Printer
AUDIO_CSCP_ControlSubclass, // bInterfaceSubClass -> Control
AUDIO_CSCP_ControlProtocol, // bInterfaceProtocol
NO_DESCRIPTOR // iInterface
},
// audio_control_interface_ac;
{
#if (USB_MIC_ENABLE && USB_SPEAKER_ENABLE)
{ sizeof(USB_Audio_Descriptor_Interface_AC_TL_t),DTYPE_CSInterface}, AUDIO_DSUBTYPE_CSInterface_Header, // Subtype
{0x00, 0x01}, // ACSpecification, version == 1.0
// debug note: TotalLength must less than 256
{(sizeof(USB_Audio_Descriptor_Interface_AC_TL_t) + /*10*/
sizeof(USB_Audio_Descriptor_InputTerminal_t) + /*12*/
sizeof(USB_Audio_Descriptor_OutputTerminal_t) + /*9*/
sizeof(USB_Audio_Descriptor_FeatureUnit_Mic_t) + /*9*/
sizeof(USB_Audio_Descriptor_InputTerminal_t) + /*12*/
sizeof(USB_Audio_Descriptor_OutputTerminal_t) + /*9*/
sizeof(USB_Audio_StdDescriptor_FeatureUnit_t)/*10*/), 0}, 2, // InCollection
USB_INTF_SPEAKER, USB_INTF_MIC
#else
{sizeof(USB_Audio_Descriptor_Interface_AC_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_Header, // Subtype
{0x00, 0x01}, // ACSpecification, version == 1.0
#if (USB_MIC_ENABLE)
{(sizeof(USB_Audio_Descriptor_Interface_AC_t) + /*9*/
sizeof(USB_Audio_Descriptor_InputTerminal_t) + /*12*/
sizeof(USB_Audio_Descriptor_OutputTerminal_t) + /*9*/
sizeof(USB_Audio_Descriptor_FeatureUnit_Mic_t) /*9*/),0},
1,
USB_INTF_MIC
#else
{(sizeof(USB_Audio_Descriptor_Interface_AC_t) + /*9*/
sizeof(USB_Audio_Descriptor_InputTerminal_t) + /*12*/
sizeof(USB_Audio_Descriptor_OutputTerminal_t) + /*9*/
sizeof(USB_Audio_StdDescriptor_FeatureUnit_t) /*10*/),0},
1,
USB_INTF_SPEAKER
#endif
#endif
},
#endif
#if (USB_SPEAKER_ENABLE)
// speaker_input_terminal
{ { sizeof(USB_Audio_Descriptor_InputTerminal_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_InputTerminal,
USB_SPEAKER_INPUT_TERMINAL_ID, AUDIO_TERMINAL_STREAMING, 0, // AssociatedOutputTerminal
2, // TotalChannels
0x0003, // ChannelConfig
0, // ChannelStrIndex
NO_DESCRIPTOR},
// speaker_feature_unit
{ sizeof(USB_Audio_StdDescriptor_FeatureUnit_t), DTYPE_CSInterface,
AUDIO_DSUBTYPE_CSInterface_Feature,
USB_SPEAKER_FEATURE_UNIT_ID,
USB_SPEAKER_FEATURE_UNIT_SOURCE_ID, 1, // bControlSize
{ 0x03, 0x00, 0x00}, // bmaControls
NO_DESCRIPTOR},
// speaker_output_terminal
{ { sizeof(USB_Audio_Descriptor_OutputTerminal_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_OutputTerminal,
USB_SPEAKER_OUTPUT_TERMINAL_ID, AUDIO_TERMINAL_OUT_SPEAKER, 0, // AssociatedOutputTerminal
USB_SPEAKER_OUTPUT_TERMINAL_SOURCE_ID, NO_DESCRIPTOR},
#endif
#if (USB_MIC_ENABLE)
// mic_input_terminal
{ { sizeof(USB_Audio_Descriptor_InputTerminal_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_InputTerminal,
USB_MIC_INPUT_TERMINAL_ID, AUDIO_TERMINAL_IN_MIC, 0, // AssociatedOutputTerminal
1, // TotalChannels
0x0001, // ChannelConfig
0, // ChannelStrIndex
NO_DESCRIPTOR},
// mic_feature_unit
{
{ sizeof(USB_Audio_Descriptor_FeatureUnit_Mic_t),
DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_Feature, USB_MIC_FEATURE_UNIT_ID,
USB_MIC_FEATURE_UNIT_SOURCE_ID, 1, // bControlSize
{ 0x03, 0x00}, // bmaControls
NO_DESCRIPTOR},
// mic_output_terminal
{ { sizeof(USB_Audio_Descriptor_OutputTerminal_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_OutputTerminal,
USB_MIC_OUTPUT_TERMINAL_ID, AUDIO_TERMINAL_STREAMING, 0, // AssociatedOutputTerminal
USB_MIC_OUTPUT_TERMINAL_SOURCE_ID, NO_DESCRIPTOR},
#endif
#if (USB_SPEAKER_ENABLE)
// speaker_setting0
{ { sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_SPEAKER,
0, // AlternateSetting
0, // bNumEndpoints
AUDIO_CSCP_AudioClass, AUDIO_CSCP_AudioStreamingSubclass,
AUDIO_CSCP_StreamingProtocol, NO_DESCRIPTOR},
// speaker_setting1
{ { sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_SPEAKER,
1, // AlternateSetting
1, // bNumEndpoints
AUDIO_CSCP_AudioClass, AUDIO_CSCP_AudioStreamingSubclass,
AUDIO_CSCP_StreamingProtocol, NO_DESCRIPTOR},
// speaker_audio_stream
{ { sizeof(USB_Audio_Descriptor_Interface_AS_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_General, 1, // TerminalLink #1 USB Streaming IT
1, // FrameDelay
{ USB_AUDIO_FORMAT_PCM & 0xff, (USB_AUDIO_FORMAT_PCM >> 8)
& 0xff}},
// speaker_audio_format
{ { sizeof(USB_Audio_Descriptor_Format_t)
+ sizeof(USB_Audio_SampleFreq_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_FormatType, USB_AUDIO_FORMAT_PCM, 2, // Channels
2, // SubFrameSize
0x10, // BitsResolution
1 // TotalDiscreteSampleRates
},
// speaker_sample_rate AUDIO_SAMPLE_FREQ
{ 0x80, 0xbb, 0x00},
// speaker_stream_endpoint
{ {
{ sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), DTYPE_Endpoint},
USB_EDP_SPEAKER,
EP_TYPE_ISOCHRONOUS | (EP_SYNC_TYPE_ADAPTIVE << 2) | (EP_USAGE_TYPE_DATA << 4), // Attributes ENDPOINT_ATTR_ASYNC
0x00c0, // EndpointSize USB_MIC_CHANNELS_LEN
1 // PollingIntervalMS
}, 0, // Refresh
0 // SyncEndpointNumber
},
// speaker_stream_endpoint_spc
{
{ sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t),
DTYPE_CSEndpoint}, AUDIO_DSUBTYPE_CSInterface_General,
AUDIO_EP_FULL_PACKETS_ONLY | AUDIO_EP_SAMPLE_FREQ_CONTROL, 0, // LockDelayUnits
{ 0, 0} // LockDelay
},
#if(USB_AUDIO_441K_ENABLE)
NOTE("Add 441k descriptor if USB_AUDIO_441K_ENABLE defined")
#endif
#endif
#if (USB_MIC_ENABLE)
// mic_setting0
{ { sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_MIC,
0, // AlternateSetting
0, // bNumEndpoints
AUDIO_CSCP_AudioClass, AUDIO_CSCP_AudioStreamingSubclass,
AUDIO_CSCP_StreamingProtocol, NO_DESCRIPTOR
},
// mic_setting1
{ { sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_MIC,
1, // AlternateSetting
1, // bNumEndpoints
AUDIO_CSCP_AudioClass, AUDIO_CSCP_AudioStreamingSubclass,
AUDIO_CSCP_StreamingProtocol, NO_DESCRIPTOR
},
// mic_audio_stream
{ { sizeof(USB_Audio_Descriptor_Interface_AS_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_General, 6, // TerminalLink #6USB USB Streaming OT
1, // FrameDelay
{ USB_AUDIO_FORMAT_PCM & 0xff, (USB_AUDIO_FORMAT_PCM >> 8)& 0xff}
},
// mic_audio_format
{ { sizeof(USB_Audio_Descriptor_Format_t)
+ sizeof(USB_Audio_SampleFreq_t), DTYPE_CSInterface},
AUDIO_DSUBTYPE_CSInterface_FormatType, USB_AUDIO_FORMAT_PCM, // FormatType
MIC_CHANNEL_COUNT, // Channels
2, // SubFrameSize
MIC_RESOLUTION_BIT, // BitsResolution
1 // TotalDiscreteSampleRates
},
// mic_sample_rate
{(MIC_SAMPLE_RATE & 0xff), (MIC_SAMPLE_RATE >> 8), 0x00},
// mic_stream_endpoint
{ {
{ sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), DTYPE_Endpoint}
, ENDPOINT_DIR_MASK | USB_EDP_MIC,
EP_TYPE_ISOCHRONOUS | (EP_SYNC_TYPE_SYNC << 2) | (EP_USAGE_TYPE_DATA << 4), // Attributes
USB_MIC_CHANNELS_LEN, 1 // PollingIntervalMS
},
0, // Refresh
0 // SyncEndpointNumber
},
// mic_stream_endpoint_spc
{
{ sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t),
DTYPE_CSEndpoint}, AUDIO_DSUBTYPE_CSInterface_General,
AUDIO_EP_SAMPLE_FREQ_CONTROL, 0, // LockDelayUnits
{ 0, 0} // LockDelay
},
#endif
#if(0)
// audio_interface
{
{sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_AUDIO_HID,
0, // AlternateSetting
1, // bNumEndpoints
HID_CSCP_HIDClass, HID_CSCP_NonBootSubclass,
HID_CSCP_NonBootProtocol, NO_DESCRIPTOR
},
{
// audio_hid
{
{sizeof(USB_HID_Descriptor_HID_t), HID_DTYPE_HID}, 0x0111, // HIDSpec
USB_HID_COUNTRY_NONE, 1, // TotalReportDescriptors
HID_DTYPE_Report, {sizeof(usbaud_report_desc), 0x00}, // HIDReportLength sizeof(Report)
},
// audio_in_endpoint
{
{sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint},
ENDPOINT_DIR_IN | USB_EDP_AUDIO,
EP_TYPE_INTERRUPT, 0x0010, // EndpointSize
1 // PollingIntervalMS
}
},
#endif
#if (USB_KEYBOARD_ENABLE)
// keyboardInterface
{ {sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_KEYBOARD,
0, // AlternateSetting
1, // bNumEndpoints
HID_CSCP_HIDClass, HID_CSCP_BootSubclass,
HID_CSCP_KeyboardBootProtocol, NO_DESCRIPTOR
},
{
// keyboard_hid
{
{sizeof(USB_HID_Descriptor_HID_t), HID_DTYPE_HID}, 0x0111, // HIDSpec
USB_HID_COUNTRY_US, 1, // TotalReportDescriptors
HID_DTYPE_Report, {sizeof(keyboard_report_desc), 0x00}, // HIDReportLength
},
// keyboard_in_endpoint
{
{sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint},
ENDPOINT_DIR_IN | USB_EDP_KEYBOARD_IN,
EP_TYPE_INTERRUPT, 0x0008, // EndpointSize
USB_KEYBOARD_POLL_INTERVAL // PollingIntervalMS
},
},
#endif
#if (USB_MOUSE_ENABLE)
// mouse_interface
{ { sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_MOUSE,
0, // AlternateSetting
1, // bNumEndpoints
HID_CSCP_HIDClass, HID_CSCP_BootSubclass,
HID_CSCP_MouseBootProtocol, NO_DESCRIPTOR}, {
// mouse_hid
{ { sizeof(USB_HID_Descriptor_HID_t), HID_DTYPE_HID}, 0x0111, // HIDSpec
USB_HID_COUNTRY_US, 1, // TotalReportDescriptors
HID_DTYPE_Report, {sizeof(mouse_report_desc), 0x00}, // HIDReportLength
},
// mouse_in_endpoint
{ { sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint},
ENDPOINT_DIR_IN | USB_EDP_MOUSE,
EP_TYPE_INTERRUPT, 0x0008, // EndpointSize
USB_MOUSE_POLL_INTERVAL // PollingIntervalMS
}},
#endif
#if (USB_SOMATIC_ENABLE)
// SOMATICInterface
{ {sizeof(USB_Descriptor_Interface_t), DTYPE_Interface},
USB_INTF_SOMATIC,
0, // AlternateSetting
1, // bNumEndpoints
HID_CSCP_HIDClass, HID_CSCP_BootSubclass,
HID_CSCP_NonBootProtocol, NO_DESCRIPTOR
},
{
// SOMATIC_hid
{
{sizeof(USB_HID_Descriptor_HID_t), HID_DTYPE_HID}, 0x0111, // HIDSpec
USB_HID_COUNTRY_US, 1, // TotalReportDescriptors
HID_DTYPE_Report, {sizeof(somatic_report_desc), 0x00}, // HIDReportLength
},
// SOMATIC_in_endpoint
{
{sizeof(USB_Descriptor_Endpoint_t), DTYPE_Endpoint},
ENDPOINT_DIR_IN | USB_EDP_SOMATIC_OUT,
EP_TYPE_INTERRUPT, 0x0010, // EndpointSize
USB_SOMATIC_POLL_INTERVAL // PollingIntervalMS
},
},
#endif
};
u8* usbdesc_get_language(void) {
return (u8*) (&language_desc);
}
u8* usbdesc_get_vendor(void) {
return (u8*) (&vendor_desc);
}
u8* usbdesc_get_product(void) {
return (u8*) (&product_desc);
}
#if (MS_OS_DESCRIPTOR_ENABLE)
u8* usbdesc_get_OS_descriptor(void) {
return (u8*) (&microsoft_OS_desc);
}
u8* usbdesc_get_OSFeature(int *length) {
*length = sizeof(OSFeatureDescriptor);
return (u8*) (&OSFeatureDescriptor);
}
u8* usbdesc_get_compatID(int *length) {
*length = OSFeatureDescriptor_compatID.compatID_Header.dwLength;
return (u8*) (&OSFeatureDescriptor_compatID);
}
#endif
u8* usbdesc_get_serial(void) {
return (u8*) (&serial_desc);
}
u8* usbdesc_get_device(void) {
return (u8*) (&device_desc);
}
u8* usbdesc_get_configuration(void) {
return (u8*) (&configuration_desc);
}
#if(0)
u8* usbdesc_get_audio(void) {
return (u8*) (&configuration_desc.audio_descriptor);
}
#endif
#if (USB_MOUSE_ENABLE)
u8* usbdesc_get_mouse(void) {
return (u8*) (&configuration_desc.mouse_descriptor);
}
#endif
#if (USB_KEYBOARD_ENABLE)
u8* usbdesc_get_keyboard(void) {
return (u8*) (&configuration_desc.keyboard_descriptor);
}
#endif
#if (USB_SOMATIC_ENABLE)
u8* usbdesc_get_somatic(void) {
return (u8*) (&configuration_desc.somatic_descriptor);
}
#endif
#if (USB_CDC_ENABLE)
u8* usbdesc_get_cdc(void) {
return (u8*) (&configuration_desc.cdc_descriptor);
}
u8* usbdesc_get_cdc_inf(void) {
return (u8*) (&configuration_desc.cdc_interface);
}
#endif
#if (AUDIO_HOGP)
u8* usbdesc_get_audio_hogp(void) {
return (u8*) (&configuration_desc.audio_hogp_descriptor);
}
#endif