332 lines
10 KiB
C
332 lines
10 KiB
C
#ifndef _USB_VIDEO_H_
|
|
#define _USB_VIDEO_H_
|
|
|
|
#include "host/uvc.h"
|
|
#include "asm/usb.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* --------------------------------------------------------------------------
|
|
* UVC constants
|
|
*/
|
|
|
|
#define SC_UNDEFINED 0x00
|
|
#define SC_VIDEOCONTROL 0x01
|
|
#define SC_VIDEOSTREAMING 0x02
|
|
#define SC_VIDEO_INTERFACE_COLLECTION 0x03
|
|
|
|
|
|
/* VideoControl class specific interface descriptor */
|
|
#define VC_DESCRIPTOR_UNDEFINED 0x00
|
|
#define VC_HEADER 0x01
|
|
#define VC_INPUT_TERMINAL 0x02
|
|
#define VC_OUTPUT_TERMINAL 0x03
|
|
#define VC_SELECTOR_UNIT 0x04
|
|
#define VC_PROCESSING_UNIT 0x05
|
|
#define VC_EXTENSION_UNIT 0x06
|
|
|
|
/* VideoStreaming class specific interface descriptor */
|
|
#define VS_UNDEFINED 0x00
|
|
#define VS_INPUT_HEADER 0x01
|
|
#define VS_OUTPUT_HEADER 0x02
|
|
#define VS_STILL_IMAGE_FRAME 0x03
|
|
#define VS_FORMAT_UNCOMPRESSED 0x04
|
|
#define VS_FRAME_UNCOMPRESSED 0x05
|
|
#define VS_FORMAT_MJPEG 0x06
|
|
#define VS_FRAME_MJPEG 0x07
|
|
#define VS_FORMAT_MPEG2TS 0x0a
|
|
#define VS_FORMAT_DV 0x0c
|
|
#define VS_COLORFORMAT 0x0d
|
|
#define VS_FORMAT_FRAME_BASED 0x10
|
|
#define VS_FRAME_FRAME_BASED 0x11
|
|
#define VS_FORMAT_STREAM_BASED 0x12
|
|
|
|
/* Endpoint type */
|
|
#define EP_UNDEFINED 0x00
|
|
#define EP_GENERAL 0x01
|
|
#define EP_ENDPOINT 0x02
|
|
#define EP_INTERRUPT 0x03
|
|
|
|
|
|
/* VideoControl interface controls */
|
|
#define VC_CONTROL_UNDEFINED 0x00
|
|
#define VC_VIDEO_POWER_MODE_CONTROL 0x01
|
|
#define VC_REQUEST_ERROR_CODE_CONTROL 0x02
|
|
|
|
/* Terminal controls */
|
|
#define TE_CONTROL_UNDEFINED 0x00
|
|
|
|
/* Selector Unit controls */
|
|
#define SU_CONTROL_UNDEFINED 0x00
|
|
#define SU_INPUT_SELECT_CONTROL 0x01
|
|
|
|
/* Camera Terminal controls */
|
|
#define CT_CONTROL_UNDEFINED 0x00
|
|
#define CT_SCANNING_MODE_CONTROL 0x01
|
|
#define CT_AE_MODE_CONTROL 0x02
|
|
#define CT_AE_PRIORITY_CONTROL 0x03
|
|
#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
|
|
#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
|
|
#define CT_FOCUS_ABSOLUTE_CONTROL 0x06
|
|
#define CT_FOCUS_RELATIVE_CONTROL 0x07
|
|
#define CT_FOCUS_AUTO_CONTROL 0x08
|
|
#define CT_IRIS_ABSOLUTE_CONTROL 0x09
|
|
#define CT_IRIS_RELATIVE_CONTROL 0x0a
|
|
#define CT_ZOOM_ABSOLUTE_CONTROL 0x0b
|
|
#define CT_ZOOM_RELATIVE_CONTROL 0x0c
|
|
#define CT_PANTILT_ABSOLUTE_CONTROL 0x0d
|
|
#define CT_PANTILT_RELATIVE_CONTROL 0x0e
|
|
#define CT_ROLL_ABSOLUTE_CONTROL 0x0f
|
|
#define CT_ROLL_RELATIVE_CONTROL 0x10
|
|
#define CT_PRIVACY_CONTROL 0x11
|
|
|
|
/* Processing Unit controls */
|
|
#define PU_CONTROL_UNDEFINED 0x00
|
|
#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
|
|
#define PU_BRIGHTNESS_CONTROL 0x02
|
|
#define PU_CONTRAST_CONTROL 0x03
|
|
#define PU_GAIN_CONTROL 0x04
|
|
#define PU_POWER_LINE_FREQUENCY_CONTROL 0x05
|
|
#define PU_HUE_CONTROL 0x06
|
|
#define PU_SATURATION_CONTROL 0x07
|
|
#define PU_SHARPNESS_CONTROL 0x08
|
|
#define PU_GAMMA_CONTROL 0x09
|
|
#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a
|
|
#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b
|
|
#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c
|
|
#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d
|
|
#define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e
|
|
#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f
|
|
#define PU_HUE_AUTO_CONTROL 0x10
|
|
#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11
|
|
#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12
|
|
|
|
#define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01
|
|
#define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02
|
|
|
|
/* VideoStreaming interface controls */
|
|
#define VS_CONTROL_UNDEFINED 0x00
|
|
#define VS_PROBE_CONTROL 0x01
|
|
#define VS_COMMIT_CONTROL 0x02
|
|
#define VS_STILL_PROBE_CONTROL 0x03
|
|
#define VS_STILL_COMMIT_CONTROL 0x04
|
|
#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
|
|
#define VS_STREAM_ERROR_CODE_CONTROL 0x06
|
|
#define VS_GENERATE_KEY_FRAME_CONTROL 0x07
|
|
#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
|
|
#define VS_SYNC_DELAY_CONTROL 0x09
|
|
|
|
#define TT_VENDOR_SPECIFIC 0x0100
|
|
#define TT_STREAMING 0x0101
|
|
|
|
/* Input Terminal types */
|
|
#define ITT_VENDOR_SPECIFIC 0x0200
|
|
#define ITT_CAMERA 0x0201
|
|
#define ITT_MEDIA_TRANSPORT_INPUT 0x0202
|
|
|
|
/* Output Terminal types */
|
|
#define OTT_VENDOR_SPECIFIC 0x0300
|
|
#define OTT_DISPLAY 0x0301
|
|
#define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302
|
|
|
|
#define EXTERNAL_VENDOR_SPECIFIC 0x0400
|
|
#define COMPOSITE_CONNECTOR 0x0401
|
|
#define SVIDEO_CONNECTOR 0x0402
|
|
#define COMPONENT_CONNECTOR 0x0403
|
|
|
|
#define UVC_ENTITY_IS_UNIT(entity) ((entity->type & 0xff00) == 0)
|
|
#define UVC_ENTITY_IS_TERM(entity) ((entity->type & 0xff00) != 0)
|
|
#define UVC_ENTITY_IS_ITERM(entity) ((entity->type & 0xff00) == ITT_VENDOR_SPECIFIC)
|
|
#define UVC_ENTITY_IS_OTERM(entity) ((entity->type & 0xff00) == OTT_VENDOR_SPECIFIC)
|
|
|
|
/* ------------------------------------------------------------------------
|
|
* GUIDs
|
|
*/
|
|
#define UVC_GUID_UVC_CAMERA {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
|
|
#define UVC_GUID_UVC_OUTPUT {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
|
|
#define UVC_GUID_UVC_PROCESSING {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01}
|
|
#define UVC_GUID_UVC_SELECTOR {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}
|
|
|
|
#if 0
|
|
#define UVC_GUID_UNIT_EXTENSION 0x92, 0x42, 0x39, 0x46,\
|
|
0xD1, 0x0C,\
|
|
0xE3, 0x4A,\
|
|
0x87, 0x83,\
|
|
0x31, 0x33, 0xF9, 0xEA, 0xAA, 0x3B
|
|
#else
|
|
|
|
#define UVC_GUID_UNIT_EXTENSION1 0x70, 0x33, 0xf0, 0x28,\
|
|
0x11, 0x63,\
|
|
0x2e, 0x4A,\
|
|
0xba, 0x2c,\
|
|
0x68, 0x90, 0xeb, 0x33, 0x40, 0x16
|
|
#define UVC_GUID_UNIT_EXTENSION2 0x94, 0x73, 0xdf, 0xdd,\
|
|
0x3e, 0x97,\
|
|
0x27, 0x47,\
|
|
0xbe, 0xd9,\
|
|
0x04, 0xed, 0x64, 0x26, 0xdc, 0x67
|
|
#endif
|
|
#if 0
|
|
#define UVC_GUID_UNIT_EXTENSION 0xAD, 0xCC, 0xB1, 0xC2,\
|
|
0xF6, 0xAB, 0xB8, 0x48,\
|
|
0x8E, 0x37, 0x32, 0xD4,\
|
|
0xF3, 0xA3, 0xFE, 0xEC
|
|
#endif
|
|
#define UVC_GUID_FORMAT_MJPEG 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \
|
|
0x80, 0x00, 0x00, 0xaa,0x00, 0x38, 0x9b, 0x71
|
|
|
|
#define UVC_GUID_FORMAT_YUY2 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \
|
|
0x80, 0x00, 0x00, 0xaa,0x00, 0x38, 0x9b, 0x71
|
|
|
|
#define UVC_GUID_FORMAT_NV12 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \
|
|
0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
|
|
|
|
#define UVC_GUID_FORMAT_I420 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \
|
|
0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
|
|
|
|
#define UVC_GUID_FORMAT_H264 'H', '2', '6', '4', 0x00, 0x00, 0x10, 0x00, \
|
|
0x80, 0x00, 0x00, 0xaa,0x00, 0x38, 0x9b, 0x71
|
|
|
|
/* ------------------------------------------------------------------------
|
|
* Driver specific constants.
|
|
*/
|
|
|
|
|
|
#define UVC_FORMAT_YUY2 0
|
|
#define UVC_FORMAT_NV12 0
|
|
#define UVC_FORMAT_I420 1
|
|
#define UVC_FORMAT_MJPG 1
|
|
|
|
|
|
|
|
#if 1
|
|
#define FREAME_MAX_WIDTH 1280
|
|
#define FREAME_MAX_HEIGHT 720
|
|
#else
|
|
#define FREAME_MAX_WIDTH 640
|
|
#define FREAME_MAX_HEIGHT 480
|
|
#endif
|
|
|
|
#define UVC_FRAME_SZIE (FREAME_MAX_WIDTH * FREAME_MAX_HEIGHT * 2)
|
|
|
|
#define MJPG_WWIDTH_0 (1280)
|
|
#define MJPG_WHEIGHT_0 (720)
|
|
|
|
#define MJPG_WWIDTH_1 (0)
|
|
#define MJPG_WHEIGHT_1 (0)
|
|
|
|
#define MJPG_WWIDTH_2 (0)
|
|
#define MJPG_WHEIGHT_2 (0)
|
|
|
|
#define MJPG_WWIDTH_3 (0)
|
|
#define MJPG_WHEIGHT_3 (0)
|
|
|
|
#define MJPG_WWIDTH_4 (0)
|
|
#define MJPG_WHEIGHT_4 (0)
|
|
|
|
#define YUV_WWIDTH_0 (0x500)
|
|
#define YUV_WHEIGHT_0 (0x2D0)
|
|
|
|
#define YUV_WWIDTH_1 (0x0280)
|
|
#define YUV_WHEIGHT_1 (0x01E0)
|
|
|
|
#define YUV_WWIDTH_2 (0x0320)
|
|
#define YUV_WHEIGHT_2 (0x0258)
|
|
|
|
#define YUV_WWIDTH_3 (0x0160)
|
|
#define YUV_WHEIGHT_3 (0x0120)
|
|
|
|
#define YUV_WWIDTH_4 (0x0140)
|
|
#define YUV_WHEIGHT_4 (0x00F0)
|
|
|
|
#define FRAME_FPS (10000000/30)
|
|
|
|
#if UVC_FORMAT_YUY2||UVC_FORMAT_NV12
|
|
#define ISO_EP_INTERVAL 1
|
|
#else
|
|
#define ISO_EP_INTERVAL 1
|
|
#endif
|
|
|
|
#define UVC_DWCLOCKFREQUENCY 0x01c9c380
|
|
|
|
#define UVC_IT_TERMINALID 1
|
|
#define UVC_PU_TERMINALID 2
|
|
#define UVC_EXT_TERMINALID1 3
|
|
#define UVC_EXT_TERMINALID2 4
|
|
#define UVC_OT_TERMINALID1 5
|
|
|
|
|
|
///////////Video Class
|
|
/* USB VIDEO INTERFACE TYPE */
|
|
#define VIDEO_CTL_INTFACE_TYPE 1
|
|
#define VIDEO_STEAM_INTFACE_TYPE 2
|
|
|
|
/* Video BFH */
|
|
#define UVC_FID 0x01
|
|
#define UVC_EOF 0x02
|
|
#define UVC_PTS 0x04
|
|
#define UVC_SCR 0x08
|
|
#define UVC_RES 0x10
|
|
#define UVC_STI 0x20
|
|
#define UVC_ERR 0x40
|
|
#define UVC_EOH 0x80
|
|
|
|
|
|
#define VIDEO_INF_NUM 2
|
|
|
|
#define VS_IT_CONTROLS_ENABLE 1
|
|
#define VS_PU_CONTROLS_ENABLE 1
|
|
|
|
#if 1
|
|
#define FMT_MAX_RESO_NUM 5
|
|
|
|
struct uvc_unit_ctrl {
|
|
u8 request;
|
|
u8 unit;
|
|
u32 len;
|
|
u8 *data;
|
|
};
|
|
|
|
struct uvc_reso {
|
|
u16 width;
|
|
u16 height;
|
|
};
|
|
|
|
struct uvc_reso_info {
|
|
int num;
|
|
struct uvc_reso reso[5];
|
|
};
|
|
|
|
struct usb_camera {
|
|
u8 quality;
|
|
u32 bits_rate;
|
|
int (*video_open)(int idx, int fmt, int frame_id, int fps);
|
|
int (*video_reqbuf)(int idx, void *buf, u32 len, u32 *frame_end);
|
|
int (*video_close)(int idx);
|
|
int (*processing_unit_response)(struct uvc_unit_ctrl *ctl_req);
|
|
int (*private_cmd_response)(u16 cmd, u16 data);
|
|
const struct uvc_reso_info *jpg_info;
|
|
const struct uvc_reso_info *yuv_info;
|
|
};
|
|
#endif
|
|
|
|
|
|
void usb_video_shutter(usb_dev usb_id);
|
|
u32 uvc_desc_config(usb_dev usb_id, u8 *ptr, u32 *inf);
|
|
void uvc_set_camera_info(usb_dev usb_id, const struct usb_camera *info);
|
|
u32 uvc_register(usb_dev usb_id);
|
|
u32 uvc_release(usb_dev usb_id);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|
|
|