diff --git a/Core/Inc/usbd_descriptors.h b/Core/Inc/usbd_descriptors.h index 7b49b2a..83473ac 100644 --- a/Core/Inc/usbd_descriptors.h +++ b/Core/Inc/usbd_descriptors.h @@ -231,7 +231,7 @@ UCHAR device_framework_fs[] = { /* Endpoint descriptor size=7 */ 0x07, // bLength 0x05, // bDescriptorType - 0x81, // bEndpointAddress + 0x82, // bEndpointAddress 0x11, // bmAttributes 0x04, 0x00, // wMaxPacketSize 0x04, // bInterval diff --git a/Core/Src/audio/audio_amp.c b/Core/Src/audio/audio_amp.c index 39cdacb..d6d7db9 100644 --- a/Core/Src/audio/audio_amp.c +++ b/Core/Src/audio/audio_amp.c @@ -28,7 +28,6 @@ uint8_t audio_amp_power(uint8_t up) { } else { HAL_GPIO_WritePin(A_AMP_UP_GPIO_Port, A_AMP_UP_Pin, GPIO_PIN_RESET); } - return 1; } @@ -49,16 +48,10 @@ uint8_t audio_amp_is_connected(void) { /** * @brief Enable amplifiers and set volume. * - * @param volume volume to be set (1 - 100) + * @param volume volume to be set (0 - 63) * @return uint8_t 0 - ERROR, everything else - OK */ uint8_t audio_amp_set_volume(uint8_t volume) { - uint8_t converted_vol = 0; - - if(volume > 0) { - converted_vol = (volume - 1) * 64 / 100; - } - if (tpa6130a2_enable_channel(&s_tpa, TPA6130_CH_L | TPA6130_CH_R) != TPA6130_OK) { return 0; } @@ -73,7 +66,7 @@ uint8_t audio_amp_set_volume(uint8_t volume) { return 0; } - if (tpa6130a2_set_volume(&s_tpa, converted_vol) != TPA6130_OK) { + if (tpa6130a2_set_volume(&s_tpa, volume) != TPA6130_OK) { return 0; } diff --git a/Core/Src/main.c b/Core/Src/main.c index bd45f47..8754c0e 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -24,8 +24,6 @@ #include #include -#include "audio/audio_amp.h" -#include "audio/audio_clocksel.h" #include "tx_api.h" #include "ux_api.h" @@ -218,6 +216,7 @@ int main(void) MX_USB_OTG_FS_PCD_Init(); /* USER CODE BEGIN 2 */ + tx_kernel_enter(); /* USER CODE END 2 */ diff --git a/Core/Src/usbd_uac_process.c b/Core/Src/usbd_uac_process.c index adae98a..4f8ef3c 100644 --- a/Core/Src/usbd_uac_process.c +++ b/Core/Src/usbd_uac_process.c @@ -1,14 +1,23 @@ +#include "stm32h7xx_hal.h" + +#include "audio/audio_amp.h" +#include "audio/audio_clocksel.h" + #include "usbd_uac_process.h" UX_DEVICE_CLASS_AUDIO_PARAMETER audio_param; UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER audio_stream_param[1]; UX_DEVICE_CLASS_AUDIO20_CONTROL audio_control[1]; +UCHAR audio_buffer[256]; + +extern SAI_HandleTypeDef hsai_BlockA3; + static UINT usbd_uac_request_process(UX_DEVICE_CLASS_AUDIO *audio, UX_SLAVE_TRANSFER *transfer); static VOID usbd_uac_activate(VOID *args); static VOID usbd_uac_deactivate(VOID *args); -static VOID usbd_uac_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG alt_setting); +static VOID usbd_uac_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG alternate_setting); static VOID usbd_uac_frame_done(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG actual_len); UINT usbd_uac_class_register(void) { @@ -16,10 +25,10 @@ UINT usbd_uac_class_register(void) { audio_control[0].ux_device_class_audio20_control_sampling_frequency = 48000; audio_control[0].ux_device_class_audio20_control_fu_id = 0x30; audio_control[0].ux_device_class_audio20_control_mute[0] = 0; - audio_control[0].ux_device_class_audio20_control_volume_min[0] = 0; - audio_control[0].ux_device_class_audio20_control_volume_max[0] = 100; + audio_control[0].ux_device_class_audio20_control_volume_min[0] = -64; + audio_control[0].ux_device_class_audio20_control_volume_max[0] = 0; audio_control[0].ux_device_class_audio20_control_volume_res[0] = 1; - audio_control[0].ux_device_class_audio20_control_volume[0] = 100; + audio_control[0].ux_device_class_audio20_control_volume[0] = -64; audio_stream_param[0].ux_device_class_audio_stream_parameter_callbacks.ux_device_class_audio_stream_change = usbd_uac_stream_change; @@ -53,8 +62,10 @@ UINT usbd_uac_request_process(UX_DEVICE_CLASS_AUDIO *audio, UX_SLAVE_TRANSFER *t switch (audio_control[0].ux_device_class_audio20_control_changed) { case UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED: + audio_amp_set_volume(0); break; case UX_DEVICE_CLASS_AUDIO20_CONTROL_VOLUME_CHANGED: + audio_amp_set_volume((uint8_t)(audio_control[0].ux_device_class_audio20_control_volume[0] * -1)); break; default: break; @@ -64,17 +75,30 @@ UINT usbd_uac_request_process(UX_DEVICE_CLASS_AUDIO *audio, UX_SLAVE_TRANSFER *t } static VOID usbd_uac_activate(VOID *args) { - // + audio_amp_power(1); + audio_clock_select(AUDIO_CLKIN_24M); } static VOID usbd_uac_deactivate(VOID *args) { // } -static VOID usbd_uac_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG alt_setting) { - // +static VOID usbd_uac_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG alternate_setting) { + if(alternate_setting == 0) { + memset(audio_buffer, 0x00, sizeof(audio_buffer)); + return; + } + + ux_device_class_audio_reception_start(stream); } static VOID usbd_uac_frame_done(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG actual_len) { - // + UCHAR *buf; + ULONG len; + + ux_device_class_audio_read_frame_get(stream, &buf, &len); + + HAL_SAI_Transmit_DMA(&hsai_BlockA3, buf, len); + + ux_device_class_audio_read_frame_free(stream); } \ No newline at end of file