107 lines
2.6 KiB
C
107 lines
2.6 KiB
C
/*
|
|
* Copyright (c) 2022, sakumisu
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#ifndef USBD_VIDEO_H
|
|
#define USBD_VIDEO_H
|
|
|
|
#include <rtthread.h>
|
|
#include "include/usb_video.h"
|
|
#include "lib/multimedia/msi.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
enum usbd_video_mode
|
|
{
|
|
USBD_VIDEO_CLOSE = 0,
|
|
USBD_VIDEO_OPEN,
|
|
};
|
|
|
|
struct video_entity_info {
|
|
rt_uint8_t bDescriptorSubtype;
|
|
rt_uint8_t bEntityId;
|
|
rt_uint16_t wTerminalType;
|
|
};
|
|
|
|
struct usbd_video_msg
|
|
{
|
|
rt_uint8_t * flush_info_addr;
|
|
rt_uint8_t * dma_buff;
|
|
rt_uint8_t copy_len;
|
|
rt_uint8_t control_selector;
|
|
};
|
|
|
|
struct usbd_video_process_unit_cur_info
|
|
{
|
|
rt_uint32_t wWhiteBalance_Component;
|
|
rt_uint16_t wBacklightCompensation;
|
|
rt_uint16_t wBrightness;
|
|
rt_uint16_t wContrast;
|
|
rt_uint16_t wHue;
|
|
rt_uint16_t wHue_Auto;
|
|
rt_uint16_t wSaturation;
|
|
rt_uint16_t wSharpness;
|
|
rt_uint16_t wGamma;
|
|
rt_uint16_t wGain;
|
|
rt_uint16_t wWhiteBalance_Temprature;
|
|
rt_uint16_t wWhiteBalance_Temprature_Auto;
|
|
rt_uint16_t wWhiteBalance_Component_Auto;
|
|
rt_uint16_t wDigital_Multiplier;
|
|
rt_uint8_t wDigital_Multiplier_Limit;
|
|
rt_uint8_t bPowerLineFrequency;
|
|
};
|
|
|
|
typedef void (*uvc_set_resolution)(uint32_t in_weight, uint32_t in_height, uint32_t out_weight, uint32_t out_height, uint32_t en);
|
|
|
|
struct usbd_video_ops
|
|
{
|
|
uvc_set_resolution mjpeg_set_resolution;
|
|
uvc_set_resolution h264_set_resolution;
|
|
};
|
|
|
|
struct usbd_video_priv {
|
|
struct video_probe_and_commit_controls probe __attribute__((aligned(4)));
|
|
struct video_probe_and_commit_controls commit __attribute__((aligned(4)));
|
|
struct usbd_video_process_unit_cur_info process_unit_info;
|
|
rt_uint8_t power_mode;
|
|
rt_uint8_t error_code;
|
|
struct video_entity_info info[3];
|
|
struct rt_messagequeue video_mq;
|
|
struct usbd_video_ops ops;
|
|
};
|
|
|
|
/*
|
|
* uvc class device type
|
|
*/
|
|
|
|
struct uvc_class_device
|
|
{
|
|
rt_device_t dev;
|
|
rt_event_t event;
|
|
rt_uint8_t open_count;
|
|
|
|
rt_uint8_t *buffer;
|
|
rt_uint32_t buffer_index;
|
|
|
|
uep_t ep;
|
|
rt_thread_t thread;
|
|
struct msi *recv_msi;
|
|
struct msi *cur_msi;
|
|
};
|
|
|
|
/* Init video interface driver */
|
|
static rt_bool_t usbd_uvc_init(struct ufunction *func);
|
|
static void usbd_video_init_intf(uint8_t busid, uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize);
|
|
static rt_err_t usbd_video_open(uint8_t busid, ufunction_t func);
|
|
static rt_err_t usbd_video_close(uint8_t busid, ufunction_t func);
|
|
static uint32_t usbd_video_mjpeg_payload_fill(uint8_t busid, uint8_t *input, uint32_t input_len, uint8_t *output, uint32_t *out_len);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* USBD_VIDEO_H */
|