This module provides a USB Peripheral Audio Device Class Driver (HAUD). It implements the USB HAUD Interface.
The r_usb_haud module combines with the r_usb_basic module to provide USB Host Audio Device Class (HAUD) driver.
This driver notifies the application when receiving the following class requests:
For details about each device class, please refer to Audio Class specification.
#define AUDIO_BUFFER_SIZE (3 * 1024) + 1024
#define REQUEST_SIZE (3 * 1024)
#define FIRST_PACKET_TEST_SIZE (200)
#define READ_REQUEST_SIZE (REQUEST_SIZE + FIRST_PACKET_TEST_SIZE)
#define BMREQUESTTYPEDIR (0x0080U)
#define BMREQUESTTYPETYPE (0x0060U)
#define ALT_NUM_0 (0)
#define SAMPLING_FREQUENCY_CHANNNELS (2)
#define SAMPLING_FREQUENCY_FREQUENCY (48000)
#define SAMPLING_FREQUENCY_RESOLUTION (16)
#define SAMPLING_FREQUENCY_DATA_SIZE (3)
void usb_haud_example(void);
#if (BSP_CFG_RTOS == 2)
void usb_apl_callback(usb_event_info_t * p_event_info, usb_hdl_t cur_task,
usb_onoff_t usb_state);
#endif
#if (BSP_CFG_RTOS == 2)
static volatile usb_event_info_t * p_usb_event = NULL;
extern QueueHandle_t g_usb_queue;
#else
static usb_event_info_t event_info = {0};
static volatile usb_event_info_t * p_usb_event = &event_info;
#endif
static uint8_t g_buf[8] BSP_ALIGN_VARIABLE(4) = {RESET_VALUE};
static uint8_t g_send_buffer[AUDIO_BUFFER_SIZE] BSP_ALIGN_VARIABLE(4);
static uint8_t g_recv_buffer[AUDIO_BUFFER_SIZE] BSP_ALIGN_VARIABLE(4);
static uint8_t g_usb_dummy = RESET_VALUE;
static volatile bool g_err_flag = false;
static uint8_t g_device_address = 0;
static uint32_t g_completed_read_transfer_length_total = 0;
static void haud_app_data_buffer_init(void);
static void haud_app_standard_request_complete(void);
static void haud_app_audio_class_request_complete(void);
static fsp_err_t haud_app_interface_set(uint32_t value, uint32_t index);
static fsp_err_t haud_app_sampling_frequency_set(uint8_t ep_address, uint32_t frequency);
static fsp_err_t haud_app_sampling_frequency_get(uint8_t ep_address);
static void handle_error(
fsp_err_t err,
char * err_str);
void usb_haud_example (void)
{
#if (BSP_CFG_RTOS == 2)
BaseType_t err_queue = USB_FALSE;
#endif
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
haud_app_data_buffer_init();
while (true)
{
if (true == g_err_flag)
{
}
#if (BSP_CFG_RTOS == 2)
err_queue = xQueueReceive(g_usb_queue, &p_usb_event, (portMAX_DELAY));
if (USB_TRUE != err_queue)
{
handle_error(
FSP_ERR_ABORTED,
"Error in receiving USB event message through queue");
}
#else
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
#endif
switch (p_usb_event->event)
{
{
g_device_address = p_usb_event->device_address;
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
if (USB_HAUD_PROTOCOL_IP_VERSION_01_00 == device_info.
protocol)
{
g_sampling_tx.
channels = SAMPLING_FREQUENCY_CHANNNELS;
g_sampling_tx.
frequency = SAMPLING_FREQUENCY_FREQUENCY;
g_sampling_tx.
resolution = SAMPLING_FREQUENCY_RESOLUTION;
err =
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else
{
}
break;
}
{
if ((FSP_SUCCESS == p_usb_event->status) || (FSP_ERR_USB_SIZE_SHORT == p_usb_event->status))
{
g_completed_read_transfer_length_total += p_usb_event->data_size;
if (READ_REQUEST_SIZE > g_completed_read_transfer_length_total)
{
g_recv_buffer + g_completed_read_transfer_length_total,
g_device_address);
if (FSP_SUCCESS != err)
{
handle_error(err, "**R_USB_Read API FAILED**");
}
}
else
{
if (0 == memcmp(g_send_buffer, g_recv_buffer + FIRST_PACKET_TEST_SIZE, REQUEST_SIZE))
{
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else
{
APP_ERR_TRAP
}
}
}
else
{
APP_ERR_TRAP
}
break;
}
{
if (FSP_SUCCESS == p_usb_event->status)
{
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else
{
APP_ERR_TRAP
}
break;
}
{
switch (BMREQUESTTYPETYPE & p_usb_event->setup.request_type)
{
{
haud_app_standard_request_complete();
break;
}
{
haud_app_audio_class_request_complete();
break;
}
}
break;
}
{
memset(&g_sampling_tx, 0, sizeof(g_sampling_tx));
memset(&g_sampling_rx, 0, sizeof(g_sampling_rx));
g_device_address = 0;
g_completed_read_transfer_length_total = 0;
break;
}
default:
{
break;
}
}
}
}
static void haud_app_data_buffer_init (void)
{
uint32_t i = 0;
uint32_t j = 0;
for ( ; i < AUDIO_BUFFER_SIZE; i++)
{
if (i % (VALUE_FFH + 1))
{
(g_send_buffer)[i] = (uint8_t) i;
}
else
{
(g_send_buffer)[i] = (uint8_t) j;
j++;
}
}
}
static void haud_app_standard_request_complete (void)
{
{
{
g_device_address);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
(g_sampling_tx.
(g_sampling_tx.
(g_sampling_tx.
{
}
{
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
}
else if ((g_sampling_tx.
interface_number == p_usb_event->setup.request_index) &&
(ALT_NUM_0 == p_usb_event->setup.request_value))
{
g_sampling_rx.
channels = SAMPLING_FREQUENCY_CHANNNELS;
g_sampling_rx.
frequency = SAMPLING_FREQUENCY_FREQUENCY;
g_sampling_rx.
resolution = SAMPLING_FREQUENCY_RESOLUTION;
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else if ((g_sampling_rx.
interface_number == p_usb_event->setup.request_index) &&
{
g_device_address);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
(g_sampling_rx.
(g_sampling_rx.
(g_sampling_rx.
{
}
{
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
}
else if ((g_sampling_rx.
interface_number == p_usb_event->setup.request_index) &&
(ALT_NUM_0 == p_usb_event->setup.request_value))
{
}
else
{
APP_ERR_TRAP
}
}
}
static void haud_app_audio_class_request_complete (void)
{
uint32_t value;
if ((USB_HAUD_AUDIO10_SET_CUR == (p_usb_event->setup.request_type &
USB_BREQUEST)) &&
{
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else if ((USB_HAUD_AUDIO10_SET_CUR == (p_usb_event->setup.request_type &
USB_BREQUEST)) &&
{
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else if ((USB_HAUD_AUDIO10_GET_CUR == (p_usb_event->setup.request_type &
USB_BREQUEST)) &&
{
g_buf[3] = 0;
value = (ULONG) g_buf[0];
value |= (ULONG) g_buf[1] << 8;
value |= (ULONG) g_buf[2] << 16;
value |= (ULONG) g_buf[3] << 24;
{
APP_ERR_TRAP
}
err =
R_USB_Write(&g_basic0_ctrl, (uint8_t *) g_send_buffer, REQUEST_SIZE, g_device_address);
if (FSP_SUCCESS != err)
{
handle_error(err, "**R_USB_Write API FAILED**");
}
}
else if ((USB_HAUD_AUDIO10_GET_CUR == (p_usb_event->setup.request_type &
USB_BREQUEST)) &&
{
g_buf[3] = 0;
value = (ULONG) g_buf[0];
value |= (ULONG) g_buf[1] << 8;
value |= (ULONG) g_buf[2] << 16;
value |= (ULONG) g_buf[3] << 24;
{
APP_ERR_TRAP
}
if (FSP_SUCCESS != err)
{
handle_error(err, "**R_USB_Read API FAILED**");
}
}
else
{
APP_ERR_TRAP
}
}
static fsp_err_t haud_app_interface_set (uint32_t value, uint32_t index)
{
usb_setup_t setup;
setup.request_value = (uint16_t) value;
setup.request_index = (uint16_t) index;
setup.request_length = 0;
return err;
}
static fsp_err_t haud_app_sampling_frequency_set (uint8_t ep_address, uint32_t frequency)
{
usb_setup_t setup;
setup.request_value = USB_HAUD_AUDIO10_EP_SAMPLING_FREQ_CONTROL << 8;
setup.request_index = (uint16_t) ep_address;
setup.request_length = SAMPLING_FREQUENCY_DATA_SIZE;
g_buf[0] = (uint8_t) frequency;
g_buf[1] = (uint8_t) (frequency >> 8);
g_buf[2] = (uint8_t) (frequency >> 16);
g_buf[3] = 0;
return err;
}
static fsp_err_t haud_app_sampling_frequency_get (uint8_t ep_address)
{
usb_setup_t setup;
setup.request_value = USB_HAUD_AUDIO10_EP_SAMPLING_FREQ_CONTROL << 8;
setup.request_index = ep_address;
setup.request_length = SAMPLING_FREQUENCY_DATA_SIZE;
return err;
}
static void handle_error (
fsp_err_t err,
char * err_str)
{
if (FSP_SUCCESS != error)
{
APP_ERR_TRAP
}
}
#if (BSP_CFG_RTOS == 2)
void usb_apl_callback (usb_event_info_t * p_event_info, usb_hdl_t handler,
usb_onoff_t usb_state)
{
if (USB_TRUE != (xQueueSend(g_usb_queue, (const void *) &p_event_info, (TickType_t) (NO_WAIT_TIME))))
{
g_err_flag = true;
}
}
#endif