This module provides a USB Peripheral Video Device Class Driver (PUVC). It implements the USB PUVC Interface.
The r_usb_puvc module combines with the r_usb_basic module to provide USB Peripheral Video Device Class (PUVC) driver.
This driver notifies the application when receiving the following class requests:
For details about each device class, please refer to Video Class specification.
This driver uses the following transfer type for the streaming data transfer.
This driver does not support Bulk transfer.
#define APP_VIDEO_DATA_BUFFER_SIZE (1024 * 20)
#define BMREQUESTTYPEDIR (0x0080U)
#define BMREQUESTTYPETYPE (0x0060U)
#define VIDEO_PROBE_NOT_SET 0
#define ISO_IF_ALT_0 (0x0000)
#define VALUE_FFH (0xFF)
#define VALUE_34 (34)
#if (APP_VIDEO_DATA == APP_VIDEO_DATA_DEVICE_TIME)
#define APP_DEVICE_CLOCK_FREQUENCY_100_MHZ (0x05F5E100U)
#define APP_DEVICE_CLOCK_FREQUENCY APP_DEVICE_CLOCK_FREQUENCY_100_MHZ
#endif
#define USB_UVC_MAX_VIDEO_FRAME_BUFFER_SIZE_150000 (0x000249F0U)
#define USB_UVC_MAX_VIDEO_FRAME_BUFFER_SIZE USB_UVC_MAX_VIDEO_FRAME_BUFFER_SIZE_150000
#define USB_PUVC_MAX_PACKET_SIZE_800 (0x320)
#define USB_PUVC_MAX_PACKET_SIZE_1024 (0x400)
#define USB_PUVC_MAX_PACKET_SIZE USB_PUVC_MAX_PACKET_SIZE_1024
void usb_puvc_example(void);
#if (BSP_CFG_RTOS == 2)
void usb_apl_callback(usb_event_info_t * p_event_info, usb_hdl_t handler,
usb_onoff_t state);
#endif
static usb_puvc_video_probe_control_t g_video_probe_control;
static usb_puvc_video_probe_control_t g_video_commit_control;
static uint8_t g_control_buf[VALUE_34] = {0};
static uint8_t g_snd_buf[APP_VIDEO_DATA_BUFFER_SIZE] = {0};
static uint32_t g_total_send_length = 0;
static volatile bool g_err_flag = false;
static bool b_usb_connected = false;
static uint16_t g_current_alt = 0;
#if (APP_VIDEO_DATA == APP_VIDEO_DATA_DEVICE_TIME)
static uint32_t g_pre_scr_device_clock_count = 0;
static double_t g_total_elapsed_time_in_a_frame_s = 0;
static void puvc_app_device_clock_init(void);
static uint32_t puvc_app_device_clock_get(void);
#endif
static void puvc_app_video_class_request(void);
static void puvc_app_video_class_request_out(void);
static void puvc_app_video_class_request_out_complete(void);
static void puvc_app_video_class_request_in(void);
static void puvc_app_video_data_init(uint8_t * p_video_data);
static void puvc_app_video_header_make(usb_puvc_video_payload_header_t * p_header);
static void puvc_app_video_data_make(uint8_t * p_video_data);
static void puvc_app_data_buffer_clear(void);
static void handle_error(
fsp_err_t err,
char * err_str);
#if (BSP_CFG_RTOS == 2)
static volatile usb_event_info_t * p_usb_event = NULL;
#else
static usb_event_info_t event_info = {0};
static volatile usb_event_info_t * p_usb_event = &event_info;
#endif
#if (BSP_CFG_RTOS == 2)
extern QueueHandle_t g_queue;
#endif
void usb_puvc_example (void)
{
#if (BSP_CFG_RTOS == 2)
BaseType_t err_queue = pdFALSE;
#endif
g_video_probe_control.hint = VIDEO_PROBE_NOT_SET;
g_video_probe_control.format_index = VIDEO_PROBE_NOT_SET;
g_video_probe_control.frame_index = VIDEO_PROBE_NOT_SET;
g_video_probe_control.frame_interval = VIDEO_PROBE_NOT_SET;
g_video_probe_control.key_frame_rate = VIDEO_PROBE_NOT_SET;
g_video_probe_control.frame_rate = VIDEO_PROBE_NOT_SET;
g_video_probe_control.comp_quality = VIDEO_PROBE_NOT_SET;
g_video_probe_control.comp_windows_size = VIDEO_PROBE_NOT_SET;
g_video_probe_control.delay = VIDEO_PROBE_NOT_SET;
g_video_probe_control.max_video_frame_size = USB_UVC_MAX_VIDEO_FRAME_BUFFER_SIZE;
g_video_probe_control.max_payload_transfer_size = USB_PUVC_MAX_PACKET_SIZE;
#if (APP_VIDEO_DATA == APP_VIDEO_DATA_DAMMY)
g_video_probe_control.clock_frequency = VIDEO_PROBE_NOT_SET;
#else
g_video_probe_control.clock_frequency = APP_DEVICE_CLOCK_FREQUENCY;
#endif
g_video_probe_control.framing_info = VIDEO_PROBE_NOT_SET;
g_video_probe_control.prefered_version = VIDEO_PROBE_NOT_SET;
g_video_probe_control.min_version = VIDEO_PROBE_NOT_SET;
g_video_probe_control.max_version = VIDEO_PROBE_NOT_SET;
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
#if (APP_VIDEO_DATA == APP_VIDEO_DATA_DEVICE_TIME)
puvc_app_device_clock_init();
#endif
while (true)
{
if (true == g_err_flag)
{
handle_error(
FSP_ERR_ABORTED,
"\r\nError in sending usb event through queue\r\n");
}
#if (BSP_CFG_RTOS == 2)
err_queue = xQueueReceive(g_queue, &p_usb_event, (portMAX_DELAY));
if (pdTRUE != err_queue)
{
handle_error(
FSP_ERR_ABORTED,
"\r\nError in receiving event through queue\r\n");
}
#else
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
#endif
err = process_usb_events();
handle_error(err, "\r\nprocess_usb_events failed.\r\n");
}
}
{
usb_puvc_video_payload_header_t uvc_header;
switch (p_usb_event->event)
{
{
b_usb_connected = true;
break;
}
{
if ((true == b_usb_connected) && (0 < g_current_alt))
{
if (FSP_SUCCESS == p_usb_event->status)
{
if (APP_VIDEO_DATA_BUFFER_SIZE >
(g_total_send_length + g_video_probe_control.max_payload_transfer_size))
{
g_total_send_length += g_video_probe_control.max_payload_transfer_size;
}
else
{
g_total_send_length = 0;
}
puvc_app_video_data_make(g_snd_buf + g_total_send_length);
puvc_app_video_header_make(&uvc_header);
memcpy(g_snd_buf + g_total_send_length, &uvc_header, sizeof(uvc_header));
g_snd_buf + g_total_send_length,
g_video_probe_control.max_payload_transfer_size,
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
}
break;
}
{
if (b_usb_connected)
{
if (
USB_CLASS == (p_usb_event->setup.request_type & BMREQUESTTYPETYPE))
{
puvc_app_video_class_request();
}
else
{
}
}
break;
}
{
if (b_usb_connected)
{
if (
USB_STANDARD == (p_usb_event->setup.request_type & BMREQUESTTYPETYPE))
{
if (
USB_HOST_TO_DEV == (p_usb_event->setup.request_type & BMREQUESTTYPEDIR))
{
{
if (ISO_IF_ALT_0 < p_usb_event->setup.request_value)
{
g_current_alt = p_usb_event->setup.request_value;
puvc_app_video_data_init(g_snd_buf);
puvc_app_video_header_make(&uvc_header);
memcpy(g_snd_buf, &uvc_header, sizeof(uvc_header));
g_snd_buf,
g_video_probe_control.max_payload_transfer_size,
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else
{
if (0 != g_current_alt)
{
g_current_alt = 0;
}
memset(&g_video_probe_control, 0, sizeof(g_video_probe_control));
memset(&g_video_commit_control, 0, sizeof(g_video_commit_control));
}
g_total_send_length = 0;
}
}
}
else if (
USB_CLASS == (p_usb_event->setup.request_type & BMREQUESTTYPETYPE))
{
if (
USB_HOST_TO_DEV == (p_usb_event->setup.request_type & BMREQUESTTYPEDIR))
{
puvc_app_video_class_request_out_complete();
}
else
{
}
}
else
{
}
}
break;
}
{
b_usb_connected = false;
g_current_alt = 0;
puvc_app_data_buffer_clear();
g_total_send_length = 0;
break;
}
{
b_usb_connected = true;
break;
}
default:
{
break;
}
}
return err;
}
static void puvc_app_video_class_request (void)
{
if (
USB_HOST_TO_DEV == (BMREQUESTTYPEDIR & p_usb_event->setup.request_type))
{
puvc_app_video_class_request_out();
}
{
puvc_app_video_class_request_in();
}
else
{
}
}
static void puvc_app_video_class_request_out (void)
{
if ((USB_PUVC_SET_CUR == (p_usb_event->setup.request_type &
USB_BREQUEST)) &&
{
if (0 == p_usb_event->setup.request_index)
{
}
else
{
if ((USB_PUVC_VS_PROBE_CONTROL == p_usb_event->setup.request_value) ||
(USB_PUVC_VS_COMMIT_CONTROL == p_usb_event->setup.request_value))
{
(uint8_t *) g_control_buf,
p_usb_event->setup.request_length);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else
{
}
}
}
else
{
}
}
static void puvc_app_video_class_request_out_complete (void)
{
if ((USB_PUVC_SET_CUR == (p_usb_event->setup.request_type &
USB_BREQUEST)) &&
{
if (0 == p_usb_event->setup.request_index)
{
}
else
{
if (USB_PUVC_VS_PROBE_CONTROL == p_usb_event->setup.request_value)
{
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.hint)
{
g_video_probe_control.hint = (uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_HINT_OFFSET]);
g_video_probe_control.hint |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_HINT_OFFSET + 1] << 8);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.format_index)
{
g_video_probe_control.format_index =
g_control_buf[USB_PUVC_PROBE_COMMIT_FORMAT_INDEX_OFFSET];
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.frame_index)
{
g_video_probe_control.frame_index =
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INDEX_OFFSET];
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.frame_interval)
{
g_video_probe_control.frame_interval =
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET]);
g_video_probe_control.frame_interval |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET + 1] << 8);
g_video_probe_control.frame_interval |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET + 2] << 16);
g_video_probe_control.frame_interval |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET + 3] << 24);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.key_frame_rate)
{
g_video_probe_control.key_frame_rate =
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET]);
g_video_probe_control.key_frame_rate |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET + 1] << 8);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.frame_rate)
{
g_video_probe_control.frame_rate =
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_PFRAME_RATE_OFFSET]);
g_video_probe_control.frame_rate |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_PFRAME_RATE_OFFSET + 1] << 8);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.comp_quality)
{
g_video_probe_control.comp_quality =
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_QUALITY_OFFSET]);
g_video_probe_control.comp_quality |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_QUALITY_OFFSET + 1] << 8);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.comp_windows_size)
{
g_video_probe_control.comp_windows_size =
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET]);
g_video_probe_control.comp_windows_size |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET + 1] << 8);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.delay)
{
g_video_probe_control.delay = (uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_DELAY_OFFSET]);
g_video_probe_control.delay |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_DELAY_OFFSET + 1] << 8);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.max_video_frame_size)
{
g_video_probe_control.max_video_frame_size =
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET]);
g_video_probe_control.max_video_frame_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET + 1] << 8);
g_video_probe_control.max_video_frame_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET + 2] << 16);
g_video_probe_control.max_video_frame_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET + 3] << 24);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.max_payload_transfer_size)
{
g_video_probe_control.max_payload_transfer_size =
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET]);
g_video_probe_control.max_payload_transfer_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET + 1] << 8);
g_video_probe_control.max_payload_transfer_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET + 2] << 16);
g_video_probe_control.max_payload_transfer_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET + 3] << 24);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.clock_frequency)
{
g_video_probe_control.clock_frequency =
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET]);
g_video_probe_control.clock_frequency |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET + 1] << 8);
g_video_probe_control.clock_frequency |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET + 2] << 16);
g_video_probe_control.clock_frequency |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET + 3] << 24);
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.framing_info)
{
g_video_probe_control.framing_info =
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAMING_INFO_OFFSET];
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.prefered_version)
{
g_video_probe_control.prefered_version =
g_control_buf[USB_PUVC_PROBE_COMMIT_PREFERRED_VERSION_OFFSET];
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.min_version)
{
g_video_probe_control.min_version =
g_control_buf[USB_PUVC_PROBE_COMMIT_MIN_VERSION_OFFSET];
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.max_version)
{
g_video_probe_control.max_version =
g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VERSION_OFFSET];
}
if (((VIDEO_PROBE_NOT_SET != g_video_probe_control.format_index) &&
(VIDEO_PROBE_NOT_SET != g_video_probe_control.frame_index)) &&
(VIDEO_PROBE_NOT_SET != g_video_probe_control.frame_interval))
{
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.max_video_frame_size)
{
g_video_probe_control.max_video_frame_size = USB_UVC_MAX_VIDEO_FRAME_BUFFER_SIZE;
}
if (VIDEO_PROBE_NOT_SET == g_video_probe_control.max_payload_transfer_size)
{
g_video_probe_control.max_payload_transfer_size = USB_PUVC_MAX_PACKET_SIZE;
}
}
}
else if (USB_PUVC_VS_COMMIT_CONTROL == p_usb_event->setup.request_value)
{
g_video_commit_control.hint = (uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_HINT_OFFSET]);
g_video_commit_control.hint |= (uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_HINT_OFFSET + 1] << 8);
g_video_commit_control.format_index =
g_control_buf[USB_PUVC_PROBE_COMMIT_FORMAT_INDEX_OFFSET];
g_video_commit_control.frame_index =
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INDEX_OFFSET];
g_video_commit_control.frame_interval =
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET]);
g_video_commit_control.frame_interval |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET + 1] << 8);
g_video_commit_control.frame_interval |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET + 2] << 16);
g_video_commit_control.frame_interval |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET + 3] << 24);
g_video_commit_control.key_frame_rate =
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET]);
g_video_commit_control.key_frame_rate |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET + 1] << 8);
g_video_commit_control.frame_rate =
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_PFRAME_RATE_OFFSET]);
g_video_commit_control.frame_rate |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_PFRAME_RATE_OFFSET + 1] << 8);
g_video_commit_control.comp_quality =
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_QUALITY_OFFSET]);
g_video_commit_control.comp_quality |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_QUALITY_OFFSET + 1] << 8);
g_video_commit_control.comp_windows_size =
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET]);
g_video_commit_control.comp_windows_size |=
(uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET + 1] << 8);
g_video_commit_control.delay = (uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_DELAY_OFFSET]);
g_video_commit_control.delay |= (uint16_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_DELAY_OFFSET + 1] << 8);
g_video_commit_control.max_video_frame_size =
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET]);
g_video_commit_control.max_video_frame_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET + 1] << 8);
g_video_commit_control.max_video_frame_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET + 2] << 16);
g_video_commit_control.max_video_frame_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET + 3] << 24);
g_video_commit_control.max_payload_transfer_size =
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET]);
g_video_commit_control.max_payload_transfer_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET + 1] << 8);
g_video_commit_control.max_payload_transfer_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET + 2] << 16);
g_video_commit_control.max_payload_transfer_size |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET + 3] << 24);
g_video_commit_control.clock_frequency =
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET]);
g_video_commit_control.clock_frequency |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET + 1] << 8);
g_video_commit_control.clock_frequency |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET + 2] << 16);
g_video_commit_control.clock_frequency |=
(uint32_t) (g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET + 3] << 24);
g_video_commit_control.framing_info =
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAMING_INFO_OFFSET];
g_video_commit_control.prefered_version =
g_control_buf[USB_PUVC_PROBE_COMMIT_PREFERRED_VERSION_OFFSET];
g_video_commit_control.min_version =
g_control_buf[USB_PUVC_PROBE_COMMIT_MIN_VERSION_OFFSET];
g_video_commit_control.max_version =
g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VERSION_OFFSET];
}
else
{
}
}
}
}
static void puvc_app_video_class_request_in (void)
{
if ((USB_PUVC_GET_CUR == (p_usb_event->setup.request_type &
USB_BREQUEST)) &&
{
if (0 == p_usb_event->setup.request_index)
{
}
else
{
if (USB_PUVC_VS_PROBE_CONTROL == p_usb_event->setup.request_value)
{
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_HINT_OFFSET], (void *) &g_video_probe_control.hint,
sizeof(g_video_probe_control.hint));
g_control_buf[USB_PUVC_PROBE_COMMIT_FORMAT_INDEX_OFFSET] = g_video_probe_control.format_index;
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INDEX_OFFSET] = g_video_probe_control.frame_index;
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET],
(void *) &g_video_probe_control.frame_interval,
sizeof(g_video_probe_control.frame_interval));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET],
(void *) &g_video_probe_control.key_frame_rate,
sizeof(g_video_probe_control.key_frame_rate));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_PFRAME_RATE_OFFSET],
(void *) &g_video_probe_control.frame_rate,
sizeof(g_video_probe_control.frame_rate));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_QUALITY_OFFSET],
(void *) &g_video_probe_control.comp_quality,
sizeof(g_video_probe_control.comp_quality));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET],
(void *) &g_video_probe_control.comp_windows_size,
sizeof(g_video_probe_control.comp_windows_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_DELAY_OFFSET],
(void *) &g_video_probe_control.delay,
sizeof(g_video_probe_control.delay));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET],
(void *) &g_video_probe_control.max_video_frame_size,
sizeof(g_video_probe_control.max_video_frame_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET],
(void *) &g_video_probe_control.max_payload_transfer_size,
sizeof(g_video_probe_control.max_payload_transfer_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET],
(void *) &g_video_probe_control.clock_frequency,
sizeof(g_video_probe_control.clock_frequency));
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAMING_INFO_OFFSET] = g_video_probe_control.framing_info;
g_control_buf[USB_PUVC_PROBE_COMMIT_PREFERRED_VERSION_OFFSET] = g_video_probe_control.prefered_version;
g_control_buf[USB_PUVC_PROBE_COMMIT_MIN_VERSION_OFFSET] = g_video_probe_control.min_version;
g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VERSION_OFFSET] = g_video_probe_control.max_version;
(uint8_t *) g_control_buf,
p_usb_event->setup.request_length);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else if (USB_PUVC_VS_COMMIT_CONTROL == p_usb_event->setup.request_value)
{
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_HINT_OFFSET], (void *) &g_video_commit_control.hint,
sizeof(g_video_commit_control.hint));
g_control_buf[USB_PUVC_PROBE_COMMIT_FORMAT_INDEX_OFFSET] = g_video_commit_control.format_index;
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INDEX_OFFSET] = g_video_commit_control.frame_index;
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET],
(void *) &g_video_commit_control.frame_interval,
sizeof(g_video_commit_control.frame_interval));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET],
(void *) &g_video_commit_control.key_frame_rate,
sizeof(g_video_commit_control.key_frame_rate));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_PFRAME_RATE_OFFSET],
(void *) &g_video_commit_control.frame_rate,
sizeof(g_video_commit_control.frame_rate));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_QUALITY_OFFSET],
(void *) &g_video_commit_control.comp_quality,
sizeof(g_video_commit_control.comp_quality));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET],
(void *) &g_video_commit_control.comp_windows_size,
sizeof(g_video_commit_control.comp_windows_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_DELAY_OFFSET],
(void *) &g_video_commit_control.delay,
sizeof(g_video_commit_control.delay));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET],
(void *) &g_video_commit_control.max_video_frame_size,
sizeof(g_video_commit_control.max_video_frame_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET],
(void *) &g_video_commit_control.max_payload_transfer_size,
sizeof(g_video_commit_control.max_payload_transfer_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET],
(void *) &g_video_commit_control.clock_frequency,
sizeof(g_video_commit_control.clock_frequency));
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAMING_INFO_OFFSET] = g_video_commit_control.framing_info;
g_control_buf[USB_PUVC_PROBE_COMMIT_PREFERRED_VERSION_OFFSET] = g_video_commit_control.prefered_version;
g_control_buf[USB_PUVC_PROBE_COMMIT_MIN_VERSION_OFFSET] = g_video_commit_control.min_version;
g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VERSION_OFFSET] = g_video_commit_control.max_version;
(uint8_t *) g_control_buf,
p_usb_event->setup.request_length);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else
{
}
}
}
else if (((USB_PUVC_GET_MIN == (p_usb_event->setup.request_type &
USB_BREQUEST)) ||
(USB_PUVC_GET_MAX == (p_usb_event->setup.request_type &
USB_BREQUEST))) &&
{
if (0 == p_usb_event->setup.request_index)
{
}
else
{
if (USB_PUVC_VS_PROBE_CONTROL == p_usb_event->setup.request_value)
{
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_HINT_OFFSET], (void *) &g_video_probe_control.hint,
sizeof(g_video_probe_control.hint));
g_control_buf[USB_PUVC_PROBE_COMMIT_FORMAT_INDEX_OFFSET] = g_video_probe_control.format_index;
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INDEX_OFFSET] = g_video_probe_control.frame_index;
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET],
(void *) &g_video_probe_control.frame_interval,
sizeof(g_video_probe_control.frame_interval));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET],
(void *) &g_video_probe_control.key_frame_rate,
sizeof(g_video_probe_control.key_frame_rate));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_PFRAME_RATE_OFFSET],
(void *) &g_video_probe_control.frame_rate,
sizeof(g_video_probe_control.frame_rate));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_QUALITY_OFFSET],
(void *) &g_video_probe_control.comp_quality,
sizeof(g_video_probe_control.comp_quality));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET],
(void *) &g_video_probe_control.comp_windows_size,
sizeof(g_video_probe_control.comp_windows_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_DELAY_OFFSET],
(void *) &g_video_probe_control.delay,
sizeof(g_video_probe_control.delay));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET],
(void *) &g_video_probe_control.max_video_frame_size,
sizeof(g_video_probe_control.max_video_frame_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET],
(void *) &g_video_probe_control.max_payload_transfer_size,
sizeof(g_video_probe_control.max_payload_transfer_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET],
(void *) &g_video_probe_control.clock_frequency,
sizeof(g_video_probe_control.clock_frequency));
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAMING_INFO_OFFSET] = g_video_probe_control.framing_info;
g_control_buf[USB_PUVC_PROBE_COMMIT_PREFERRED_VERSION_OFFSET] = g_video_probe_control.prefered_version;
g_control_buf[USB_PUVC_PROBE_COMMIT_MIN_VERSION_OFFSET] = g_video_probe_control.min_version;
g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VERSION_OFFSET] = g_video_probe_control.max_version;
(uint8_t *) g_control_buf,
p_usb_event->setup.request_length);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else if (USB_PUVC_VS_COMMIT_CONTROL == p_usb_event->setup.request_value)
{
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_HINT_OFFSET], (void *) &g_video_commit_control.hint,
sizeof(g_video_commit_control.hint));
g_control_buf[USB_PUVC_PROBE_COMMIT_FORMAT_INDEX_OFFSET] = g_video_commit_control.format_index;
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INDEX_OFFSET] = g_video_commit_control.frame_index;
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_FRAME_INTERVAL_OFFSET],
(void *) &g_video_commit_control.frame_interval,
sizeof(g_video_commit_control.frame_interval));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET],
(void *) &g_video_commit_control.key_frame_rate,
sizeof(g_video_commit_control.key_frame_rate));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_PFRAME_RATE_OFFSET],
(void *) &g_video_commit_control.frame_rate,
sizeof(g_video_commit_control.frame_rate));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_QUALITY_OFFSET],
(void *) &g_video_commit_control.comp_quality,
sizeof(g_video_commit_control.comp_quality));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET],
(void *) &g_video_commit_control.comp_windows_size,
sizeof(g_video_commit_control.comp_windows_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_DELAY_OFFSET],
(void *) &g_video_commit_control.delay,
sizeof(g_video_commit_control.delay));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET],
(void *) &g_video_commit_control.max_video_frame_size,
sizeof(g_video_commit_control.max_video_frame_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET],
(void *) &g_video_commit_control.max_payload_transfer_size,
sizeof(g_video_commit_control.max_payload_transfer_size));
memcpy(&g_control_buf[USB_PUVC_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET],
(void *) &g_video_commit_control.clock_frequency,
sizeof(g_video_commit_control.clock_frequency));
g_control_buf[USB_PUVC_PROBE_COMMIT_FRAMING_INFO_OFFSET] = g_video_commit_control.framing_info;
g_control_buf[USB_PUVC_PROBE_COMMIT_PREFERRED_VERSION_OFFSET] = g_video_commit_control.prefered_version;
g_control_buf[USB_PUVC_PROBE_COMMIT_MIN_VERSION_OFFSET] = g_video_commit_control.min_version;
g_control_buf[USB_PUVC_PROBE_COMMIT_MAX_VERSION_OFFSET] = g_video_commit_control.max_version;
(uint8_t *) g_control_buf,
p_usb_event->setup.request_length);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
else
{
}
}
}
else
{
}
}
static void puvc_app_data_buffer_clear (void)
{
memset(g_snd_buf, 0, sizeof(g_snd_buf));
}
static void puvc_app_video_header_make (usb_puvc_video_payload_header_t * p_header)
{
#if (APP_VIDEO_DATA == APP_VIDEO_DATA_DAMMY)
p_header->header_length = 0x0C;
p_header->bit_field_header = 0x00;
memset(p_header->presentation_time, 0, sizeof(p_header->presentation_time));
memset(p_header->source_clock_reference_time, 0, sizeof(p_header->source_clock_reference_time));
memset(p_header->source_clock_reference_sof_taken_counter, 0,
sizeof(p_header->source_clock_reference_sof_taken_counter));
#else
#endif
}
static void puvc_app_video_data_make (uint8_t * p_video_data)
{
}
static void puvc_app_video_data_init (uint8_t * p_video_data)
{
#if (APP_VIDEO_DATA == APP_VIDEO_DATA_DAMMY)
uint32_t i = 0;
uint32_t j = 0;
uint8_t * p_video_work = p_video_data;
p_video_work = p_video_work + sizeof(usb_puvc_video_payload_header_t);
for ( ; i < (APP_VIDEO_DATA_BUFFER_SIZE - sizeof(usb_puvc_video_payload_header_t)); i++)
{
if (i % (VALUE_FFH + 1))
{
(p_video_work)[i] = (uint8_t) i;
}
else
{
(p_video_work)[i] = (uint8_t) j;
j++;
}
}
#else
#endif
}
#if (APP_VIDEO_DATA == APP_VIDEO_DATA_DEVICE_TIME)
void puvc_app_device_clock_init (void)
{
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
uint32_t puvc_app_device_clock_get (void)
{
uint32_t clock_count;
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP
}
}
#endif
#if (BSP_CFG_RTOS == 2)
void usb_apl_callback (usb_event_info_t * p_event_info, usb_hdl_t handler,
usb_onoff_t state)
{
if (pdTRUE != (xQueueSend(g_queue, (const void *) &p_event_info, (TickType_t) (RESET_VALUE))))
{
g_err_flag = true;
}
}
#endif
static void handle_error (
fsp_err_t err,
char * err_str)
{
if (FSP_SUCCESS != err)
{
{
APP_ERR_TRAP
}
APP_ERR_TRAP
}
}
A template for PUVC descriptors can be found in ra/fsp/src/r_usb_puvc/r_usb_puvc_descriptor.c.template. Also, please be sure to use your vendor ID.