summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-01-13 21:25:42 +0800
committersakumisu <[email protected]>2025-01-13 21:28:06 +0800
commita1ac569236b2a0ffe13c55399c9a20e1f53867f0 (patch)
tree8e9030a062d047623842277eda6f3177e6b0d301
parent570d2b5ff8f732975b433e4a93d83f1687d5d6f3 (diff)
update(demo): add macro for caculating feedback value
-rw-r--r--class/audio/usb_audio.h23
-rw-r--r--demo/audio_v1_mic_speaker_multichan_template.c2
-rw-r--r--demo/audio_v2_speaker_multichan_template.c10
3 files changed, 31 insertions, 4 deletions
diff --git a/class/audio/usb_audio.h b/class/audio/usb_audio.h
index 1ce3d446..0646a16b 100644
--- a/class/audio/usb_audio.h
+++ b/class/audio/usb_audio.h
@@ -862,7 +862,7 @@ struct audio_cs_ep_ep_general_descriptor {
0x05, /* bmAttributes */ \
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
bInterval, /* bInterval : one packet per frame */ \
- bInterval, /* bRefresh */ \
+ 0x00, /* bRefresh */ \
bFeedbackEndpointAddress, /* bSynchAddress */ \
0x07, /* bLength */ \
AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \
@@ -874,10 +874,10 @@ struct audio_cs_ep_ep_general_descriptor {
0x09, /* bLength */ \
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
bFeedbackEndpointAddress, /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \
- 0x11, /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \
+ 0x15, /* bmAttributes: TransferType=Isochronous SyncType=Asynchronous EndpointType=Feedback */ \
WBVAL(4), /* XXXX wMaxPacketSize in Bytes */ \
bInterval, /* bInterval */ \
- 0x00, /* bRefresh */ \
+ 0x03, /* bRefresh, 8ms */ \
0x00 /* bSynchAddress */
#define AUDIO_AS_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07)
@@ -1325,7 +1325,7 @@ struct audio_v2_control_range3_param_block {
0x07, /* bLength */ \
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
bFeedbackEndpointAddress, /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \
- 0x11, /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \
+ 0x15, /* bmAttributes: TransferType=Isochronous SyncType=Asynchronous EndpointType=Feedback */ \
WBVAL(4), /* XXXX wMaxPacketSize in Bytes */ \
bInterval /* bInterval */
@@ -1340,4 +1340,19 @@ struct audio_v2_control_range3_param_block {
#define AUDIO_SAMPLE_FREQ_4B(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), \
(uint8_t)((frq >> 16)), (uint8_t)((frq >> 24))
+/* format 10.14 */
+#define AUDIO_UPDATE_FEEDBACK_DATA_FS(buf, freq) \
+ uint32_t value = ((freq / 1000) << 14) | ((freq % 1000) << 4); \
+ buf[0] = ((value >> 0U) & 0xFFU); \
+ buf[1] = ((value >> 8U) & 0xFFU); \
+ buf[2] = ((value >> 16U) & 0xFFU)
+
+/* format 16.16 */
+#define AUDIO_UPDATE_FEEDBACK_DATA_HS(buf, freq) \
+ uint32_t value = ((freq / 1000) << 13) | ((freq % 1000) << 3); \
+ buf[0] = ((value >> 0U) & 0xFFU); \
+ buf[1] = ((value >> 8U) & 0xFFU); \
+ buf[2] = ((value >> 16U) & 0xFFU); \
+ buf[3] = ((value >> 24U) & 0xFFU)
+
#endif /* USB_AUDIO_H */
diff --git a/demo/audio_v1_mic_speaker_multichan_template.c b/demo/audio_v1_mic_speaker_multichan_template.c
index 7af6de77..b6957b61 100644
--- a/demo/audio_v1_mic_speaker_multichan_template.c
+++ b/demo/audio_v1_mic_speaker_multichan_template.c
@@ -211,6 +211,7 @@ void usbd_audio_open(uint8_t busid, uint8_t intf)
rx_flag = 1;
/* setup first out ep read transfer */
usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET);
+ AUDIO_UPDATE_FEEDBACK_DATA_FS(s_speaker_feedback_buffer, AUDIO_SPEAKER_FREQ); /* uac1 can only use 10.14 */
usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE);
printf("OPEN1\r\n");
} else {
@@ -248,6 +249,7 @@ void usbd_audio_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
void usbd_audio_iso_out_feedback_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
{
USB_LOG_RAW("actual feedback len:%d\r\n", nbytes);
+ AUDIO_UPDATE_FEEDBACK_DATA_FS(s_speaker_feedback_buffer, AUDIO_SPEAKER_FREQ);
usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE);
}
#endif
diff --git a/demo/audio_v2_speaker_multichan_template.c b/demo/audio_v2_speaker_multichan_template.c
index 873b752a..83f4f74e 100644
--- a/demo/audio_v2_speaker_multichan_template.c
+++ b/demo/audio_v2_speaker_multichan_template.c
@@ -232,6 +232,11 @@ void usbd_audio_open(uint8_t busid, uint8_t intf)
rx_flag = 1;
/* setup first out ep read transfer */
usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET);
+#ifdef CONFIG_USB_HS
+ AUDIO_UPDATE_FEEDBACK_DATA_HS(s_speaker_feedback_buffer, AUDIO_FREQ);
+#else
+ AUDIO_UPDATE_FEEDBACK_DATA_FS(s_speaker_feedback_buffer, AUDIO_FREQ);
+#endif
usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE);
USB_LOG_RAW("OPEN\r\n");
}
@@ -259,6 +264,11 @@ void usbd_audio_iso_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
void usbd_audio_iso_out_feedback_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
{
USB_LOG_RAW("actual feedback len:%d\r\n", nbytes);
+#ifdef CONFIG_USB_HS
+ AUDIO_UPDATE_FEEDBACK_DATA_HS(s_speaker_feedback_buffer, AUDIO_FREQ);
+#else
+ AUDIO_UPDATE_FEEDBACK_DATA_FS(s_speaker_feedback_buffer, AUDIO_FREQ);
+#endif
usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE);
}
#endif