Fixed descriptor, attempted audio implementation.
This commit is contained in:
parent
cc7d05de02
commit
9d52e0c9d7
|
@ -231,7 +231,7 @@ UCHAR device_framework_fs[] = {
|
||||||
/* Endpoint descriptor size=7 */
|
/* Endpoint descriptor size=7 */
|
||||||
0x07, // bLength
|
0x07, // bLength
|
||||||
0x05, // bDescriptorType
|
0x05, // bDescriptorType
|
||||||
0x81, // bEndpointAddress
|
0x82, // bEndpointAddress
|
||||||
0x11, // bmAttributes
|
0x11, // bmAttributes
|
||||||
0x04, 0x00, // wMaxPacketSize
|
0x04, 0x00, // wMaxPacketSize
|
||||||
0x04, // bInterval
|
0x04, // bInterval
|
||||||
|
|
|
@ -28,7 +28,6 @@ uint8_t audio_amp_power(uint8_t up) {
|
||||||
} else {
|
} else {
|
||||||
HAL_GPIO_WritePin(A_AMP_UP_GPIO_Port, A_AMP_UP_Pin, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(A_AMP_UP_GPIO_Port, A_AMP_UP_Pin, GPIO_PIN_RESET);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,16 +48,10 @@ uint8_t audio_amp_is_connected(void) {
|
||||||
/**
|
/**
|
||||||
* @brief Enable amplifiers and set volume.
|
* @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
|
* @return uint8_t 0 - ERROR, everything else - OK
|
||||||
*/
|
*/
|
||||||
uint8_t audio_amp_set_volume(uint8_t volume) {
|
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) {
|
if (tpa6130a2_enable_channel(&s_tpa, TPA6130_CH_L | TPA6130_CH_R) != TPA6130_OK) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -73,7 +66,7 @@ uint8_t audio_amp_set_volume(uint8_t volume) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tpa6130a2_set_volume(&s_tpa, converted_vol) != TPA6130_OK) {
|
if (tpa6130a2_set_volume(&s_tpa, volume) != TPA6130_OK) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,6 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "audio/audio_amp.h"
|
|
||||||
#include "audio/audio_clocksel.h"
|
|
||||||
|
|
||||||
#include "tx_api.h"
|
#include "tx_api.h"
|
||||||
#include "ux_api.h"
|
#include "ux_api.h"
|
||||||
|
@ -218,6 +216,7 @@ int main(void)
|
||||||
MX_USB_OTG_FS_PCD_Init();
|
MX_USB_OTG_FS_PCD_Init();
|
||||||
/* USER CODE BEGIN 2 */
|
/* USER CODE BEGIN 2 */
|
||||||
|
|
||||||
|
|
||||||
tx_kernel_enter();
|
tx_kernel_enter();
|
||||||
|
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
|
|
|
@ -1,14 +1,23 @@
|
||||||
|
#include "stm32h7xx_hal.h"
|
||||||
|
|
||||||
|
#include "audio/audio_amp.h"
|
||||||
|
#include "audio/audio_clocksel.h"
|
||||||
|
|
||||||
#include "usbd_uac_process.h"
|
#include "usbd_uac_process.h"
|
||||||
|
|
||||||
UX_DEVICE_CLASS_AUDIO_PARAMETER audio_param;
|
UX_DEVICE_CLASS_AUDIO_PARAMETER audio_param;
|
||||||
UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER audio_stream_param[1];
|
UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER audio_stream_param[1];
|
||||||
UX_DEVICE_CLASS_AUDIO20_CONTROL audio_control[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 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_activate(VOID *args);
|
||||||
static VOID usbd_uac_deactivate(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);
|
static VOID usbd_uac_frame_done(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG actual_len);
|
||||||
|
|
||||||
UINT usbd_uac_class_register(void) {
|
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_sampling_frequency = 48000;
|
||||||
audio_control[0].ux_device_class_audio20_control_fu_id = 0x30;
|
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_mute[0] = 0;
|
||||||
audio_control[0].ux_device_class_audio20_control_volume_min[0] = 0;
|
audio_control[0].ux_device_class_audio20_control_volume_min[0] = -64;
|
||||||
audio_control[0].ux_device_class_audio20_control_volume_max[0] = 100;
|
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_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 =
|
audio_stream_param[0].ux_device_class_audio_stream_parameter_callbacks.ux_device_class_audio_stream_change =
|
||||||
usbd_uac_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) {
|
switch (audio_control[0].ux_device_class_audio20_control_changed) {
|
||||||
case UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED:
|
case UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED:
|
||||||
|
audio_amp_set_volume(0);
|
||||||
break;
|
break;
|
||||||
case UX_DEVICE_CLASS_AUDIO20_CONTROL_VOLUME_CHANGED:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
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) {
|
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_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) {
|
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);
|
||||||
}
|
}
|
Loading…
Reference in New Issue