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 CONTROL_BUFFER_SIZE (256)
#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[CONTROL_BUFFER_SIZE] 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
#define CONTROL_BUFFER_SIZE (256)
#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_2 (2)
#define SAMPLING_FREQUENCY_DATA_SIZE_3 (3)
#define SAMPLING_FREQUENCY_DATA_SIZE_14 (14)
#define SAMPLING_FREQUENCY_SUB_RANGE (4 * 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[CONTROL_BUFFER_SIZE] 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 uint8_t g_device_protocol = VALUE_FFH;
static uint32_t g_completed_read_transfer_length_total = 0;
static uint32_t g_num_sub_ranges = 0;
static void haud_app_data_buffer_init(void);
static void haud_app_standard_request_complete_aud10(void);
static void haud_app_standard_request_complete_aud20(void);
static void haud_app_audio_class_request_complete_aud10(void);
static void haud_app_audio_class_request_complete_aud20(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_aud10(uint8_t ep_address);
static fsp_err_t haud_app_sampling_frequency_get_aud20(uint8_t ep_address, uint16_t length);
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_device_protocol = USB_HAUD_PROTOCOL_IP_VERSION_01_00;
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 if (USB_HAUD_PROTOCOL_IP_VERSION_02_00 == device_info.
protocol)
{
g_device_protocol = USB_HAUD_PROTOCOL_IP_VERSION_02_00;
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
}
err = haud_app_sampling_frequency_get_aud20(
USB_EP_DIR_OUT, SAMPLING_FREQUENCY_DATA_SIZE_2);
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)
{
{
if (USB_HAUD_PROTOCOL_IP_VERSION_01_00 == g_device_protocol)
{
haud_app_standard_request_complete_aud10();
}
else if (USB_HAUD_PROTOCOL_IP_VERSION_02_00 == g_device_protocol)
{
haud_app_standard_request_complete_aud20();
}
else
{
}
break;
}
{
if (USB_HAUD_PROTOCOL_IP_VERSION_01_00 == g_device_protocol)
{
haud_app_audio_class_request_complete_aud10();
}
else if (USB_HAUD_PROTOCOL_IP_VERSION_02_00 == g_device_protocol)
{
haud_app_audio_class_request_complete_aud20();
}
else
{
}
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_device_protocol = VALUE_FFH;
g_num_sub_ranges = 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_aud10 (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_standard_request_complete_aud20 (void)
{
uint32_t request_size;
{
{
g_device_address);
if (FSP_SUCCESS != err)
{
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 ((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;
err =
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
err = haud_app_sampling_frequency_get_aud20(
USB_EP_DIR_IN, SAMPLING_FREQUENCY_DATA_SIZE_2);
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
}
{
request_size = READ_REQUEST_SIZE;
}
else
{
request_size =
}
err =
R_USB_Read(&g_basic0_ctrl, g_recv_buffer, request_size, g_device_address);
if (FSP_SUCCESS != err)
{
handle_error(err, "**R_USB_Read API FAILED**");
}
}
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_aud10 (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 void haud_app_audio_class_request_complete_aud20 (void)
{
uint32_t value;
uint32_t offset;
uint32_t request_length;
uint8_t direction;
uint32_t frequency_low;
uint32_t frequency_high;
uint8_t * p_buf;
if ((USB_HAUD_AUDIO20_RANGE == (p_usb_event->setup.request_type &
USB_BREQUEST)) &&
{
if (g_sampling_tx.
interface_number == (uint32_t) (p_usb_event->setup.request_index & VALUE_FFH))
{
p_haud_sampling = &g_sampling_tx;
}
else
{
p_haud_sampling = &g_sampling_rx;
}
if (SAMPLING_FREQUENCY_DATA_SIZE_2 == p_usb_event->setup.request_length)
{
g_num_sub_ranges = (uint32_t) (*(uint16_t *) g_buf);
if (0 == g_num_sub_ranges)
{
APP_ERR_TRAP
}
request_length = g_num_sub_ranges * SAMPLING_FREQUENCY_SUB_RANGE;
if (request_length > VALUE_FFFFH)
{
APP_ERR_TRAP
}
request_length += 2;
if (request_length > VALUE_FFFFH)
{
APP_ERR_TRAP
}
err = haud_app_sampling_frequency_get_aud20(direction, (uint16_t) request_length);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else
{
for (offset = 2; offset < p_usb_event->setup.request_length; offset += SAMPLING_FREQUENCY_SUB_RANGE)
{
p_buf = g_buf;
value = (uint32_t) *(p_buf++ + offset);
value |= ((uint32_t) *(p_buf++ + offset) << 8);
value |= ((uint32_t) *(p_buf++ + offset) << 16);
value |= ((uint32_t) *(p_buf++ + offset) << 24);
frequency_low = value;
value = (uint32_t) *(p_buf++ + offset);
value |= ((uint32_t) *(p_buf++ + offset) << 8);
value |= ((uint32_t) *(p_buf++ + offset) << 16);
value |= ((uint32_t) *(p_buf++ + offset) << 24);
frequency_high = value;
{
APP_ERR_TRAP
}
{
APP_ERR_TRAP
}
if ((frequency_low > p_haud_sampling->
frequency) ||
(frequency_high < p_haud_sampling->
frequency))
{
APP_ERR_TRAP
}
if (FSP_SUCCESS != err)
{
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_3;
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_aud10 (uint8_t ep_address)
{
usb_setup_t setup;
if (USB_HAUD_PROTOCOL_IP_VERSION_01_00 == g_device_protocol)
{
setup.request_value = USB_HAUD_AUDIO10_EP_SAMPLING_FREQ_CONTROL << 8;
setup.request_index = ep_address;
setup.request_length = SAMPLING_FREQUENCY_DATA_SIZE_3;
}
else
{
err = FSP_ERR_USB_FAILED;
}
return err;
}
static fsp_err_t haud_app_sampling_frequency_get_aud20 (uint8_t ep_address, uint16_t length)
{
usb_setup_t setup;
if (USB_HAUD_PROTOCOL_IP_VERSION_02_00 == g_device_protocol)
{
{
{
setup.request_value = 0 | USB_HAUD_AUDIO20_CS_SAM_FREQ_CONTROL << 8;
setup.request_index =
setup.request_length = length;
}
}
else
{
{
setup.request_value = 0 | USB_HAUD_AUDIO20_CS_SAM_FREQ_CONTROL << 8;
setup.request_index =
setup.request_length = length;
}
}
}
else
{
err = FSP_ERR_USB_FAILED;
}
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