@@ -822,7 +822,66 @@ struct audio_cs_ep_ep_general_descriptor {
822822 0x00 , /* wLockDelay */ \
823823 0x00
824824
825+ #define AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT (bInterfaceNumber , bTerminalLink , bNrChannels , bSubFrameSize , bBitResolution , bEndpointAddress , wMaxPacketSize , bInterval , bFeedbackEndpointAddress , ...) \
826+ 0x09 , /* bLength */ \
827+ USB_DESCRIPTOR_TYPE_INTERFACE , /* bDescriptorType */ \
828+ bInterfaceNumber , /* bInterfaceNumber */ \
829+ 0x00 , /* bAlternateSetting */ \
830+ 0x00 , /* bNumEndpoints */ \
831+ USB_DEVICE_CLASS_AUDIO , /* bInterfaceClass */ \
832+ AUDIO_SUBCLASS_AUDIOSTREAMING , /* bInterfaceSubClass */ \
833+ AUDIO_PROTOCOL_UNDEFINED , /* bInterfaceProtocol */ \
834+ 0x00 , /* iInterface */ \
835+ 0x09 , /* bLength */ \
836+ USB_DESCRIPTOR_TYPE_INTERFACE , /* bDescriptorType */ \
837+ bInterfaceNumber , /* bInterfaceNumber */ \
838+ 0x01 , /* bAlternateSetting */ \
839+ 0x02 , /* bNumEndpoints */ \
840+ USB_DEVICE_CLASS_AUDIO , /* bInterfaceClass */ \
841+ AUDIO_SUBCLASS_AUDIOSTREAMING , /* bInterfaceSubClass */ \
842+ AUDIO_PROTOCOL_UNDEFINED , /* bInterfaceProtocol */ \
843+ 0x00 , /* iInterface */ \
844+ 0x07 , /* bLength */ \
845+ AUDIO_INTERFACE_DESCRIPTOR_TYPE , /* bDescriptorType */ \
846+ AUDIO_STREAMING_GENERAL , /* bDescriptorSubtype */ \
847+ bTerminalLink , /* bTerminalLink : Unit ID of the Output Terminal*/ \
848+ 0x01 , /* bDelay */ \
849+ WBVAL (AUDIO_FORMAT_PCM ), /* wFormatTag : AUDIO_FORMAT_PCM */ \
850+ 0x08 + PP_NARG (__VA_ARGS__ ), /* bLength */ \
851+ AUDIO_INTERFACE_DESCRIPTOR_TYPE , /* bDescriptorType */ \
852+ AUDIO_STREAMING_FORMAT_TYPE , /* bDescriptorSubtype */ \
853+ AUDIO_FORMAT_TYPE_I , /* bFormatType */ \
854+ bNrChannels , /* bNrChannels */ \
855+ bSubFrameSize , /* bSubFrameSize : Bytes per audio subframe */ \
856+ bBitResolution , /* bBitResolution : bits per sample */ \
857+ (PP_NARG (__VA_ARGS__ )/3 ), /* bSamFreqType : only one frequency supported */ \
858+ __VA_ARGS__ , /* tSamFreq : Audio sampling frequency coded on 3 bytes */ \
859+ 0x09 , /* bLength */ \
860+ USB_DESCRIPTOR_TYPE_ENDPOINT , /* bDescriptorType */ \
861+ bEndpointAddress , /* bEndpointAddress : IN endpoint 1 */ \
862+ 0x05 , /* bmAttributes */ \
863+ WBVAL (wMaxPacketSize ), /* wMaxPacketSize */ \
864+ bInterval , /* bInterval : one packet per frame */ \
865+ 0x00 , /* bRefresh */ \
866+ bFeedbackEndpointAddress , /* bSynchAddress */ \
867+ 0x07 , /* bLength */ \
868+ AUDIO_ENDPOINT_DESCRIPTOR_TYPE , /* bDescriptorType */ \
869+ AUDIO_ENDPOINT_GENERAL , /* bDescriptor */ \
870+ AUDIO_EP_CONTROL_SAMPLING_FEQ , /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */ \
871+ 0x00 , /* bLockDelayUnits */ \
872+ 0x00 , /* wLockDelay */ \
873+ 0x00 , \
874+ 0x09 , /* bLength */ \
875+ USB_DESCRIPTOR_TYPE_ENDPOINT , /* bDescriptorType */ \
876+ bFeedbackEndpointAddress , /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \
877+ 0x11 , /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \
878+ WBVAL (4 ), /* XXXX wMaxPacketSize in Bytes */ \
879+ bInterval , /* bInterval */ \
880+ 0x03 , /* bRefresh, 8ms */ \
881+ 0x00 /* bSynchAddress */
882+
825883#define AUDIO_AS_DESCRIPTOR_INIT_LEN (n ) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07 )
884+ #define AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT_LEN (n ) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07 + 0x09 )
826885
827886#define AUDIO_AS_ALTSETTING_DESCRIPTOR_INIT (bInterfaceNumber , bAlternateSetting , bTerminalLink , bNrChannels , bSubFrameSize , bBitResolution , bEndpointAddress , bmAttributes , wMaxPacketSize , bInterval , ...) \
828887 0x09 , /* bLength */ \
@@ -1281,4 +1340,19 @@ struct audio_v2_control_range3_param_block {
12811340#define AUDIO_SAMPLE_FREQ_4B (frq ) (uint8_t )(frq ), (uint8_t )((frq >> 8 )), \
12821341 (uint8_t )((frq >> 16 )), (uint8_t )((frq >> 24 ))
12831342
1343+ /* format 10.14 */
1344+ #define AUDIO_FREQ_TO_FEEDBACK_FS (freq ) ((freq << 10 ) / 1000 )
1345+ #define AUDIO_FEEDBACK_TO_BUF_FS (buf , feedback ) \
1346+ buf [0 ] = ((feedback << 4 ) & 0xFFU ); \
1347+ buf [1 ] = (((feedback << 4 ) >> 8U ) & 0xFFU ); \
1348+ buf [2 ] = (((feedback << 4 ) >> 16U ) & 0xFFU )
1349+
1350+ /* format 16.16 */
1351+ #define AUDIO_FREQ_TO_FEEDBACK_HS (freq ) ((freq << 13) / 1000)
1352+ #define AUDIO_FEEDBACK_TO_BUF_HS (buf , feedback ) \
1353+ buf[0] = (((feedback & 0x00001FFFu) << 3) & 0xFFu); \
1354+ buf[1] = ((((feedback & 0x00001FFFu) << 3) >> 8) & 0xFFu); \
1355+ buf[2] = (((feedback & 0x01FFE000u) >> 13) & 0xFFu); \
1356+ buf[3] = (((feedback & 0x01FFE000u) >> 21) & 0xFFu)
1357+
12841358#endif /* USB_AUDIO_H */
0 commit comments