Fixed descriptor, attempted audio implementation.

This commit is contained in:
imi415 2022-02-13 00:10:10 +08:00
parent cc7d05de02
commit 9d52e0c9d7
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
4 changed files with 36 additions and 20 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -24,8 +24,6 @@
#include <string.h>
#include <math.h>
#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 */

View File

@ -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);
}