/* * Copyright (C) 2019 Rockchip Electronics Co., Ltd. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL), available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef _UVC_GADGET_H_ #define _UVC_GADGET_H_ #include #include #include #define UVC_EVENT_FIRST (V4L2_EVENT_PRIVATE_START + 0) #define UVC_EVENT_CONNECT (V4L2_EVENT_PRIVATE_START + 0) #define UVC_EVENT_DISCONNECT (V4L2_EVENT_PRIVATE_START + 1) #define UVC_EVENT_STREAMON (V4L2_EVENT_PRIVATE_START + 2) #define UVC_EVENT_STREAMOFF (V4L2_EVENT_PRIVATE_START + 3) #define UVC_EVENT_SETUP (V4L2_EVENT_PRIVATE_START + 4) #define UVC_EVENT_DATA (V4L2_EVENT_PRIVATE_START + 5) #define UVC_EVENT_SUSPEND (V4L2_EVENT_PRIVATE_START + 6) #define UVC_EVENT_RESUME (V4L2_EVENT_PRIVATE_START + 7) #define UVC_EVENT_LAST (V4L2_EVENT_PRIVATE_START + 8) #define MAX_UVC_REQUEST_DATA_LENGTH 60 #define UVC_CTRL_INTERFACE_ID 0x00 #define UVC_CTRL_CAMERA_TERMINAL_ID 0x01 #define UVC_CTRL_PROCESSING_UNIT_ID 0x02 #define UVC_CTRL_EXTENSION_UNIT_ID 0x03 #define UVC_CTRL_OUTPUT_TERMINAL_ID 0x04 #define UVC_CTRL_XU_UNIT_ID 0x06 struct uvc_request_data { __s32 length; __u8 data[60]; }; struct uvc_event { union { enum usb_device_speed speed; struct usb_ctrlrequest req; struct uvc_request_data data; }; }; #define UVCIOC_SEND_RESPONSE _IOW('U', 1, struct uvc_request_data) #define UVC_INTF_CONTROL 0 #define UVC_INTF_STREAMING 1 #ifdef __cplusplus extern "C" { #endif #include "uvc_video.h" #include "uvc_control.h" #include "mpi_enc.h" #include #include #include #include #include #include #include "uvc_configfs.h" #define V4L2_PIX_FMT_H265 v4l2_fourcc('H', '2', '6', '5') /* H265 with start codes */ #define UVC_PU_FPS_CONTROL 0xff #define UVC_PU_ROLL_CONTROL 0xfd #define UVC_PU_EXPOSURE_TIME_CONTROL 0xfc #define UVC_PU_AE_MODE_CONTROL 0xfb /* --------------------------------------------------------------------------- * Generic stuff */ enum XuCmd { CMD_TOOLS_CTRL_1 = 0x01, CMD_GET_CAMERA_VERSION, CMD_SET_CAMERA_IP, // CMD_START_CAMERA, CMD_SHUTDOWN_CAMERA, CMD_RESET_CAMERA, CMD_SET_MOTOR_RATE = 0x06, CMD_SET_MOTOR_BY_STEPS = 0x07, CMD_SET_MOTOR_BY_USER = 0x08, CMD_STOP_MOTOR_BY_USER = 0x09, CMD_SET_EPTZ = 0x0a, CMD_SET_H265 = 0x0b, CMD_MAX_NUM = CMD_SET_H265, }; /* IO methods supported */ enum io_method { IO_METHOD_MMAP, IO_METHOD_USERPTR, IO_METHOD_DMA_BUFF, }; #define UVC_IO_METHOD_MMAP 0 #define UVC_IO_METHOD_USERPTR 1 #define UVC_IO_METHOD_DMA_BUFF 2 #ifdef RK_MPP_USE_UVC_VIDEO_BUFFER #define UVC_IO_METHOD UVC_IO_METHOD_DMA_BUFF // do not modify, modify the RK_MPP_USE_UVC_VIDEO_BUFFER to choice #else #define UVC_IO_METHOD UVC_IO_METHOD_MMAP //UVC_IO_METHOD_DMA_BUFF // here can set 0 or 2 // 1 still not support #endif /* Buffer representing one video frame */ struct buffer { struct v4l2_buffer buf; void *start; size_t length; }; struct v4l2_buffer_info { struct uvc_buffer *uvc_buf; int fd; int index; }; enum USB_STATE { USB_STATE_FIRST_GET_READY, USB_STATE_FIRST_GET_OK, USB_STATE_FIRST_SEND_OK, USB_STATE_NORMAL_RUN }; /* Represents a UVC based video output device */ struct uvc_device { int video_id; /* uvc device specific */ int uvc_fd; int is_streaming; int run_standalone; char *uvc_devname; struct uvc_function_config *fc; int suspend; int need_bypass; /* uvc control request specific */ struct uvc_streaming_control probe; struct uvc_streaming_control commit; int control; struct uvc_request_data request_error_code; unsigned int brightness_val; unsigned short contrast_val; int hue_val; unsigned int saturation_val; unsigned int sharpness_val; unsigned int gamma_val; unsigned int white_balance_temperature_val; unsigned int white_balance_temperature_auto_val; unsigned int gain_val; unsigned int hue_auto_val; unsigned int zoom_val; int pan_val; int tilt_val; short roll_val; short iris_val; int exposure_time_val; unsigned char ae_mode_val; unsigned char power_line_frequency_val; unsigned char ex_tool_ctrl1[4]; unsigned char ex_sn_data[MAX_UVC_REQUEST_DATA_LENGTH]; unsigned char ex_ip_data[MAX_UVC_REQUEST_DATA_LENGTH];// unsigned char ex_date_data[MAX_UVC_REQUEST_DATA_LENGTH]; unsigned int eptz_flag; unsigned int xu_h265; /* uvc buffer specific */ enum io_method io; struct buffer *mem; struct buffer *dummy_buf; unsigned int nbufs; unsigned int fcc; unsigned int width; unsigned int height; unsigned int fps; unsigned int bulk; uint8_t color; unsigned int imgsize; void *imgdata; /* USB speed specific */ int mult; int burst; int maxpkt; enum usb_device_speed speed; /* uvc specific flags */ int first_buffer_queued; int uvc_shutdown_requested; /* uvc buffer queue and dequeue counters */ unsigned long long int qbuf_count; unsigned long long int dqbuf_count; /* v4l2 device hook */ struct v4l2_device *vdev; uint8_t cs; uint8_t entity_id; struct v4l2_buffer ubuf; struct v4l2_buffer_info *vbuf_info; int abandon_count; enum USB_STATE usb_state; unsigned int first_usb_get_ready_pts; unsigned int first_usb_get_ok_pts; unsigned int first_usb_send_ok_pts; unsigned int first_cmd_pts; unsigned int stream_on_pts; int get_buf_count; }; int uvc_gadget_main(struct uvc_function_config *fc); int uvc_video_reqbufs(struct uvc_device *dev, int nbufs); int uvc_video_stream(struct uvc_device *dev, int enable); #ifdef __cplusplus } #endif #endif /* _UVC_GADGET_H_ */