Files
TAIXIN/sdk/include/dev/usb/uvc_host.h

403 lines
8.6 KiB
C
Raw Permalink Normal View History

#ifndef _UVC_HOST_H
#define _UVC_HOST_H
#include "typesdef.h"
#include "list.h"
typedef enum
{
UVC_DESCRIPTOR_UNDEFINED=0,
UVC_HEADER,
UVC_INPUT_TERMINAL,
UVC_OUTPUT_TERMINAL,
UVC_SELECTOR_UNIT,
UVC_PROCESSING_UNIT,
UVC_EXTENSION_UNIT,
UVC_ENCODING_UNIT
}VC_Subtype;
typedef enum
{
VS_UNDEFINED=0,
VS_INPUT_HEADER,
VS_OUTPUT_HEADER,
VS_STILL_IMAGE_FRAME,
VS_FORMAT_UNCOMPRESSED,
VS_FRAME_UNCOMPRESSED,
VS_FORMAT_MJPEG,
VS_FRAME_MJPEG,
Reserved,
Reserved1,
VS_FORMAT_MPEG2TS,
Reserved2,
VS_FORMAT_DV,
VS_COLORFORMAT,
Reserved3,
Reserved4,
VS_FORMAT_FRAME_BASED,
VS_FRAME_FRAME_BASED,
VS_FORMAT_STREAM_BASED,
VS_FORMAT_H264,
VS_FRAME_H264,
VS_FORMAT_H264_SIMULCAST
}VS_Subtype;
// Standard Configuration Descriptor
typedef struct
{
uint8 length; // Size of descriptor in uint8
uint8 type; // Configuration
uint16 t_length; // Total length
uint8 num_intf; // Number of interface
uint8 cv; // bConfigurationValue
uint8 index; // iConfiguration
uint8 attr; // Configuration Characteristic
uint8 max_power; // Power config
} SCFG_DESC, *P_SCFG_DESC;
// Standard Interface Descriptor
typedef struct
{
uint8 length;
uint8 type;
uint8 num;
uint8 alt_tring;
uint8 end_points;
uint8 iclass;
uint8 sub;
uint8 proto;
uint8 index;
} SINTF_DESC, *P_INTF_DESC;
// Standard Device Descriptor
typedef struct
{
uint8 length;
uint8 descriptor_type;
uint16 bcd_usb;
uint8 device_class;
uint8 device_subclass;
uint8 device_protocol;
uint8 maxpacket_size0;
uint16 id_vendor;
uint16 id_product;
uint16 bcd_device;
uint8 manufacturer;
uint8 product;
uint8 serial_number;
uint8 num_configurations;
} SDEV_DESC, *P_DEV_DESC;
// Standard EndPoint Descriptor
typedef struct
{
uint8 length;
uint8 type;
uint8 ep_addr;
uint8 attr;
uint16 pay_load; // low-speed this must be 0x08
uint8 interval;
} SEP_DESC, *P_EP_DESC;
struct VC_PROCESS{
uint8 bLength;
uint8 bDescriptorType;
uint8 bDescriptorSubtype;
uint8 bUnitID;
uint8 bSourceID;
uint16 wMaxMultiplier;
uint8 bControlSize;
uint32 bmControls;
uint8 iProcessing;
}__attribute__((packed));
typedef struct{
uint8 bLength;
uint8 bDescriptorType;
uint8 bDescriptorSubtype;
uint8 bFrameIndex;
uint8 bmCapabilities;
uint16 wWidth;
uint16 wHeight;
}VS_FRAME;
typedef struct{
uint8 bLength;
uint8 bDescriptorType;
uint8 bDescriptorSubtype;
uint8 bFrameIndex;
uint8 bNumFrameDescriptors;
}VS_FORMAT;
typedef struct{
uint8 bLength;
uint8 bDescriptorType;
uint8 bDescriptorSubtype;
uint8 bNumFormats;
}VS_HEAD;
#define INTERFACE_Type 0x24
#define STRAME_O_CONTORL 0x04
#define ENDPOINT_DESC 0x05
#define VS_FAME_TYPE_MAXNUM 20
#define VS_FORMAT_TYPE_MAXNUM 2
#define __INTFS_STACK__ 32
#define IS_UVC_JPEG 1
#define USB_DEV_UVC_CLASS 0xef
#define USB_DEV_HUB_CLASS 0X09
#define UVC_SET_REQ 0x21
#define UVC_GET_REQ 0xA1
#define UVC_SET_CUR 0x01
#define UVC_GET_CUR 0x81
#define UVC_GET_MIN 0x82
#define UVC_GET_MAX 0x83
#define UVC_GET_RES 0x84
#define UVC_GET_LEN 0x85
#define UVC_GET_INFO 0x86
#define UVC_GET_DEF 0x87
#define UVC_CLASS 0x0e
#define UAC_CLASS 0x01
#define UVC_VGA 1
#define UVC_720P 2
typedef struct{
uint8 DesLen;
uint8 DescriptorType;
uint8 Subtype;
uint8 control_endpoint;
VS_HEAD vs_head;
VS_FRAME vs_frame[VS_FAME_TYPE_MAXNUM];
VS_FORMAT vs_format[VS_FORMAT_TYPE_MAXNUM];
uint8 vs_frame_num;
uint8 vs_format_num;
uint32 intfs_count;
uint32 edpt_count;
SINTF_DESC intfs[__INTFS_STACK__];
SEP_DESC edpt[__INTFS_STACK__];
struct VC_PROCESS vc_process;
uint8 control_intfs;
}UVC_DES;
typedef struct{
uint8 ep;
uint8 eptpye;
uint16 len;
}EP_DES;
typedef struct
{
uint8 ctyp;
uint8 cv;
uint8 epctl;
uint8 ctl_intfs;
uint8 ctl_altset;
uint8 ctl_pload;
uint8 ctl_ttyp;
uint8 ctl_interval;
uint8 epstrm;
uint8 strm_intfs;
uint8 strm_altset;
uint16 strm_pload;
uint8 strm_ttyp;
uint8 strm_interval;
}UVCDEV;
typedef struct{
uint8 ctl_intfs;
uint32 process_ctl;
uint8 process_unitID;
}UVC_PROCESS;
typedef struct {
uint8 ctl_val;
int16 info;
int16 max;
int16 min;
uint16 res;
int16 cur;
}UVC_PROC_REQ;
typedef struct{
UVC_PROC_REQ brightness;
UVC_PROC_REQ contrast;
UVC_PROC_REQ hue;
UVC_PROC_REQ saturation;
UVC_PROC_REQ sharpness;
UVC_PROC_REQ gamma;
UVC_PROC_REQ white_bal_temp;
UVC_PROC_REQ white_bal_comp;
UVC_PROC_REQ backlight_comp;
UVC_PROC_REQ gain;
UVC_PROC_REQ power_line_fre;
UVC_PROC_REQ hue_auto;
UVC_PROC_REQ white_bal_temp_auto;
UVC_PROC_REQ white_bal_comp_auto;
UVC_PROC_REQ digital_mult;
UVC_PROC_REQ digital_mult_limit;
UVC_PROC_REQ ana_video_stan;
UVC_PROC_REQ ana_lock_sta;
UVC_PROC_REQ contrast_auto;
}UVC_PROCESS_INFO;
typedef enum {
BRIGHTNESS,
CONTRAST,
HUE,
SATURATION,
SHARPNESS,
GAMMA,
WHITE_BAL_TEMP,
WHITE_BAL_COMP,
BACKLIGHT_COMP,
GAIN,
POWER_LINE_FRE,
HUE_AUTO,
WHITE_BAL_TEMP_AUTO,
WHITE_BAL_COMP_AUTO,
DIGITAL_MULT,
DIGITAL_MULT_LIMIT,
ANA_VIDEO_STAN,
ANA_LOCK_STA,
AONTRAST_AUTO
}UVC_PROCESS_ENUM;
typedef struct{
VS_FRAME vs_frame;
VS_FORMAT vs_format;
}UVC_SLEST;
struct VIDEO_COMMIT
{
uint16 bmhint;
uint8 bFormatIndex;
uint8 bFrameIndex;
uint32 dwFrameInterval;
uint16 wKeyFrameRate;
uint16 wPFrameRate;
uint16 wCompQuality;
uint16 wCompWindowSize;
uint16 wDelay;
uint32 dwMaxVideoFrameSize;
uint32 dwMaxPayloadTSize;
}__attribute__((packed));
typedef struct {
struct list_head list;
uint8 *cpbuff; //当前写入数据的地址
uint8 uvc_head[16];//one pack head data
uint8 frame_end; //frame结束标志表示USB获取数据结束 0进行中 1正常结束 2异常结束
uint32 tgl;
uint32 sta;
uint32 state; //frame状态0空闲 1正在填充 2:可用 3:应用正在使用
uint32 frame_len; //帧长度
uint32 data_len;//one packe data len
uint32 head_len;//one packe head len
uint32 re_space;//当前所写的buff剩余空间
uint32 frame_counter;
}UVC_MANAGE;
typedef struct {
struct list_head list; //BLANK块节点互连
uint32 frame_counter; //此数据块代表的frame号
uint32 blank_len; //blank可使用的数据长度最后一个数据块非满外其他都满
uint32 re_space; //当前blank剩下多少空间可填
uint8 blank_loop; //blank计数每一帧都从0开始增加便于后面重组
uint8 *buf_ptr; //数据块指针
uint8 busy; //blank块状态0空闲 1正在填充或者发送 2:可用
}UVC_BLANK;
typedef struct{
uint8 addr;
uint8 int_endpoint;
uint8 port_num;
uint8 connect_port;
}HUB_manage;
enum usb_host_io_cmd {
USB_HOST_IO_CMD_RESET, //usb复位
USB_HOST_IO_CMD_SET_CUR,
USB_HOST_IO_CMD_GET_CUR,
USB_HOST_IO_CMD_SET_IDX, //1:VGA, 2:720
};
struct uvc_user_arg
{
void *usb_dev;
uint32_t state; //0:可以创建任务 1:正在运行 2:等待任务删除
uint32_t uvc_format;
};
#define HUB_STATU_CONNECT (BIT(1))
#define HUB_STATU_RESTEND (BIT(1))
/**hub clear feature **/
#define PORT_CONNECT 0x10
#define PORT_ENABLE 0X01
#define CLEAR_PORT_REST 0x14
/**hub set feature **/
#define PORT_POWER 0X08
#define PORT_REST 0x04
#define UVC_EP 2
#define HUB_EP 1
#define UAC_EP 3
#define UVC2_EP 1
#define ISO_HEAD 0
#define BULK_HEAD 12
#define UVC_HEAD BULK_HEAD
#define UVC_HOST_NUM 2
void uvc_room_init(void *p_dev);
void usb_dma_irq(void * dev, uint8_t* uvc_rx_buff, uint8_t uvc_head_res, uint8_t ep_type);
//void usb_host_irq(typedef_usb_t *usb_sw);
void uvc_user();
void uvc_room_init_mjpeg();
void uvc_room_deinit_mjpeg();
void uvc_room_init_h264();
void uvc_room_deinit_h264(void);
void uvc_reset_dev(uint8_t en);
void uvc_reset_dev_mjpeg(uint8_t en);
void uvc_reset_dev_h264(uint8_t en);
void uvc_sema_init();
void uvc_sema_down(int32 tmo_ms);
void uvc_sema_up();
void uvc_app_user_init();
void force_reset_uvc_frame();
UVC_MANAGE* get_uvc_message_gloal();
uint32 get_uvc_frame_len();
uint8* get_uvc_buf();
uint8 free_uvc_blank(UVC_BLANK* uvc_b);
UVC_BLANK* get_uvc_blank();
#endif