📄 usbvideo_drv.h
字号:
/* MJPEG video frame descriptor */
/* Note that the kal_uint8[2] array can not modify to kal_uint16
It is bacause align issue */
typedef struct
{
kal_uint8 bLength;
kal_uint8 bDescriptorType;
kal_uint8 bDescriptorSubType;
kal_uint8 bFrameIndex;
kal_uint8 bmCapabilities;
kal_uint8 wWidth[2];
kal_uint8 wHeight[2];
kal_uint8 dwMinBitRate[4];
kal_uint8 dwMaxBitRate[4];
kal_uint8 dwMaxVideoFrameBufferSize[4];
kal_uint8 dwDefaultFrameInterval[4];
kal_uint8 bFrameIntervalType;
kal_uint8 dwMinFrameInterval[4];
kal_uint8 dwMaxFrameInterval[4];
kal_uint8 dwFrameIntervalStep[4];
} USBVideo_MJPEG_Frame_Dscr;
/* still size structure */
/* Note that the kal_uint8[2] array can not modify to kal_uint16
It is bacause align issue */
typedef struct
{
kal_uint8 wWidth[2];
kal_uint8 wHeight[2];
}USBVideo_Still_Size;
/* Still image frame descriptor */
typedef struct
{
kal_uint8 bLength;
kal_uint8 bDescriptorType;
kal_uint8 bDescriptorSubType;
kal_uint8 bEndpointAddress;
kal_uint8 bNumImageSizePatterns;
USBVideo_Still_Size *p_image_patterns;
kal_uint8 bNumCompressionPattern;
kal_uint8 *p_compression_patterns;
} USBVideo_Still_Frame_Dscr;
/* Color matching descriptor */
typedef struct
{
kal_uint8 bLength;
kal_uint8 bDescriptorType;
kal_uint8 bDescriptorSubType;
kal_uint8 bColorPrimaries;
kal_uint8 bTransferCharacteristics;
kal_uint8 bMatrixCoefficients;
} USBVideo_Color_Dscr;
/* video probe and commit setting */
/* Note that the kal_uint8[2] array can not modify to kal_uint16
It is bacause align issue */
typedef struct
{
kal_uint8 bmHint[2];
kal_uint8 bFormatIndex;
kal_uint8 bFrameIndex;
kal_uint8 dwFrameInterval[4];
kal_uint8 wKeyFrameRate[2];
kal_uint8 wPFrameRate[2];
kal_uint8 wCompQuality[2];
kal_uint8 wCompWindowSize[2];
kal_uint8 wDelay[2];
kal_uint8 dwMaxVideoFrameSize[4];
kal_uint8 dwMaxPayloadTransferSize[4];
//kal_uint8 dwClockFrequency[4];
//kal_uint8 bmFramingInfo;
//kal_uint8 bPreferedVersion;
//kal_uint8 bMinVersion;
//kal_uint8 bMaxVersion;
}USBVideo_Probe_Commit_Struct;
/* still probe and commit setting */
/* Note that the kal_uint8[2] array can not modify to kal_uint16
It is bacause align issue */
typedef struct
{
kal_uint8 bFormatIndex;
kal_uint8 bFrameIndex;
kal_uint8 bCompressionIndex;
kal_uint8 dwMaxVideoFrameSize[4];
kal_uint8 dwMaxPayloadTransferSize[4];
}USBVideo_Still_Probe_Commit_Struct;
typedef struct
{
kal_uint8 bHeaderLength;
kal_uint8 bmHeaderInfo;
kal_uint8 dwPTS[4];
kal_uint8 dwSCR[6];
}USBVideo_Payload_Header;
typedef struct
{
kal_uint8 bStuausType;
kal_uint8 bOriginator;
kal_uint8 bEvent;
kal_uint8 bValue;
}USBVideo_VS_Status_Pkt_Struct;
typedef struct
{
kal_uint8 bStuausType;
kal_uint8 bOriginator;
kal_uint8 bEvent;
kal_uint8 bSelector;
kal_uint8 bAttribute;
kal_uint8 bValue;
}USBVideo_VC_Status_Pkt_Struct;
/***********************************************
implement enum and structure
************************************************/
typedef enum
{
/* msg between media and USB */
USBVIDEO_MSG_MED_START_SUCCESS_CNF,
USBVIDEO_MSG_MED_START_FAIL_CNF,
USBVIDEO_MSG_MED_CHANGE_VIDEO_IND,
USBVIDEO_MSG_MED_STILL_CAPTURE_IND,
USBVIDEO_MSG_MED_START_IND,
USBVIDEO_MSG_MED_DEVICE_STILL_CNF,
USBVIDEO_MSG_MED_PAUSE_CNF,
USBVIDEO_MSG_MED_RESUME_SUCCESS_CNF,
USBVIDEO_MSG_MED_RESUME_FAIL_CNF,
USBVIDEO_MSG_MED_STOP_IND,
USBVIDEO_MSG_MED_STOP_CNF,
USBVIDEO_MSG_MED_ABORT_IND,
/* msg used in internal USB driver */
USBVIDEO_MSG_USB_ENUM_DONE,
USBVIDEO_MSG_USB_COMPLETE_VIDEO,
USBVIDEO_MSG_USB_DMA_DONE,
USBVIDEO_MSG_USB_CHANGE_SIZE,
USBVIDEO_MSG_USB_STILL_CAPTURE,
USBVIDEO_MSG_USB_COMPLETE_STILL,
USBVIDEO_MSG_USB_STILL_DMA_DONE,
USBVIDEO_MSG_USB_STILL_DMA_PARTIAL,
USBVIDEO_MSG_USB_INCALL_DMA_DONE,
USBVIDEO_MSG_USB_INCALL_TIMEOUT,
USBVIDEO_MSG_USB_INCALL_CHANGE_SIZE,
USBVIDEO_MSG_USB_ABORT
}USBVIDEO_MSG_TYPE;
typedef enum
{
USBVIDEO_STATE_STOP,
USBVIDEO_STATE_SEND,
USBVIDEO_STATE_DROP,
USBVIDEO_STATE_STILL,
USBVIDEO_STATE_PRE_PAUSE,
USBVIDEO_STATE_PAUSE
}USBVIDEO_STATE;
typedef enum
{
USBVIDEO_PROBE_NONE,
USBVIDEO_PROBE_IN,
USBVIDEO_PROBE_DONE,
USBVIDEO_COMMIT_IN,
USBVIDEO_COMMIT_DONE
}USBVIDEO_PROBE_STATE;
typedef enum
{
USBVIDEO_START_NONE,
USBVIDEO_START_RECV_MED_REQ,
USBVIDEO_START_RECV_COMMIT,
USBVIDEO_START_DONE
}USBVIDEO_START_STATE;
typedef enum
{
USBVIDEO_DMA_VIDEO,
USBVIDEO_DMA_STILL,
USBVIDEO_DMA_INCALL_JPEG
}USBVIDEO_DMA_TYPE;
typedef enum
{
USBVIDEO_DMA_DONE_COMPLETE,
USBVIDEO_DMA_DONE_STOP /* DMA stop because of timeout, clear halt feature ,or commit but does not change size */
}USBVIDEO_DMA_DONE_TYPE;
typedef struct
{
kal_uint8 subtype;
kal_uint8 length;
}USBVideo_Attr_Sub_Map;
typedef struct
{
USBVIDEO_ATTRIBUTE_TYPE attr_type;
kal_uint32 shift;
kal_uint8 length;
const USBVideo_Attr_Sub_Map *subtype_table;
}USBVideo_Attr_Map;
typedef struct
{
kal_uint32 video_size[USBVIDEO_VIDEO_BUFFER_NUMBER]; /* complete video size returned by camera */
kal_uint8 *video_buffer_addr[USBVIDEO_VIDEO_BUFFER_NUMBER]; /* buffer start address */
kal_uint32 video_buffer_size; /* each buffer size */
kal_uint8 video_buffer_read_index; /* read pointer */
kal_uint8 video_buffer_write_index; /* write pointer */
kal_bool video_buffer_full; /* full flag */
kal_bool send_video_msg; /* indicate whether complete function should send complete msg to USB task */
kal_uint32 sent_video_size; /* already sent size for the current transmitting buffer */
kal_uint8 video_frame_id; /* even/odd id filled in payload header */
kal_uint32 still_size;
kal_uint8 still_count;
kal_uint8 *incall_jpeg_addr;
kal_uint32 incall_jpeg_size;
kal_uint8 *incall_jpeg_buff;
USBVIDEO_DMA_TYPE dma_type;
USBVIDEO_DMA_DONE_TYPE dma_done_type;
kal_bool b_processing_dma; /* be set at DMA callback*/
kal_uint8 timer_handle;
kal_bool b_stop_timer; /* TRUE when clear halt cmd */
const USBVideo_Video_Size_Info *p_video_size_info; /* be set at USBVideo_VS_If_Create() */
const USBVideo_Still_Size_Info *p_still_size_info;
kal_uint8 video_size_num;
kal_uint8 still_size_num;
kal_uint32 default_jpeg_max_size[USBVIDEO_VIDEO_SIZE_MAX]; /* be set by MMI */
kal_bool b_set_default_jpeg_max_size[USBVIDEO_VIDEO_SIZE_MAX];
}USBVideo_Control_Struct;
typedef struct
{
Usb_EpBIn_Status *intrpipe; /* interrupt EP, VC Interface */
Usb_EpBIn_Status *txpipe; /* Bulk IN EP, VS Interface */
Usb_Ep_Info *vc_ep_intr_info;
Usb_Ep_Info *vs_ep_in_info;
Usb_Interface_Info *vc_if_info;
Usb_Interface_Info *vs_if_info;
Usb_IAD_Dscr *iad_desc;
kal_uint8 vs_interface_id;
kal_uint32 vc_ct_support;
kal_uint32 vc_ct_set;
kal_uint32 vc_pu_support;
kal_uint32 vc_pu_set;
kal_uint8 vc_ct_subtype_cnf[USBVIDEO_ATTRIBUTE_CT_MAX];
kal_uint8 vc_pu_subtype_cnf[USBVIDEO_ATTRIBUTE_PU_MAX-0x80];
kal_bool vs_intr_done; /*decide if issue interrupt */
USBVIDEO_STATE state;
USBVideo_Probe_Commit_Struct vs_probe_control;
USBVideo_Probe_Commit_Struct vs_recv_probe_control;
kal_uint8 commit_video_index;
kal_uint8 video_compression_index;
USBVIDEO_PROBE_STATE probe_state;
USBVideo_Still_Probe_Commit_Struct vs_still_probe_control;
USBVideo_Still_Probe_Commit_Struct vs_recv_still_probe_control;
kal_uint8 commit_still_index;
kal_uint8 commit_still_compression_index;
USBVIDEO_PROBE_STATE still_probe_state;
USBVideo_VS_Status_Pkt_Struct vs_status_pkt;
USBVideo_VC_Status_Pkt_Struct vc_status_pkt;
USBVIDEO_START_STATE video_start_state;
USBVideo_Control_Struct video_control;
USBVideo_Attr_Value set_attr_value; /* be used at set attr value*/
/* default jpeg provided by MMI */
usbvideo_default_JPEG_Info *default_jpeg_info; /* incall JPEG, get from media task when pause request */
kal_uint8 default_jpeg_num;
/* customizable variables*/
const USB_VIDEO_PARAM *custom_param;
const USBVideo_Camera_Param *camera_param;
//const USBVideo_MMI_Param *mmi_param;
#ifdef WEBCAM_TEST_DMA_DELAY
kal_uint8 test_timer_handle;
kal_bool test_enable;
#endif
} USBVideo_Struct;
typedef struct
{
LOCAL_PARA_HDR
kal_uint8 index;
}usbvideo_still_dma_struct;
/***********************************************
function and global variable
************************************************/
extern USBVideo_Struct g_USBVideo;
extern void USBVideo_Send_Msg(USBVIDEO_MSG_TYPE msg_type, kal_uint32 param1, kal_uint32 param2);
extern void USBVideo_VC_If_Create(void *ifname);
extern void USBVideo_VC_If_Reset(void);
extern void USBVideo_VS_If_Create(void *ifname);
extern void USBVideo_VS_If_Reset(void);
extern void USB_Init_Video_Status(void);
extern void USB_Release_Video_Status(void);
extern kal_bool USBVideo_Send_Intr(void *addr,kal_uint32 len);
extern void USBVideo_Send_Incall_JPEG(void);
extern void USBVideo_Send_Video(void);
/*********************************
Debug utility
************************************/
#define USBVIDEO_DBG_DATA_SIZE 1024
typedef enum
{
UV_DBG_INCALL_DMA_CALLBACK,
UV_DBG_TX_DMA_CALLBACK,
UV_DBG_CLR_FEATURE_CALLBACK,
UV_DBG_START_VIDEO_REQ_HDLR,
UV_DBG_VIDEO_DMA_DONE_HDLR,
UV_DBG_STILL_DMA_DONE_HDLR,
UV_DBG_PRE_PAUSE_TIMEOUT_HDLR,
UV_DBG_PAUSE_REQ_HDLR,
UV_DBG_INCALL_DMA_DONE_HDLR,
UV_DBG_RESUME_REQ_HDLR,
UV_DBG_IS_BUFFER_EMPTY,
UV_DBG_COMPLETE_VIDEO_BUFFER,
UV_DBG_SEND_COMPLETE_VIDEO_MSG,
UV_DBG_COMPLETE_VIDEO_HDLR,
UV_DBG_SEND_ATTR_CNF_MSG,
UV_DBG_MSG_TYPE,
UV_DBG_USB_TASK_MSG_TYPE,
UV_DBG_SEND_COMPLETE_VIDEO_MSG_INTERNAL,
UV_DBG_SEND_SET_ATTR_REQ_MSG,
UV_DBG_CUSTOM_TASK_MSG_TYPE,
UV_DBG_MAX
} USBVIDEO_DBG_INFO;
typedef struct
{
USBVIDEO_DBG_INFO tag;
kal_uint32 parameter;
}USBVideo_Dbg_Data;
typedef struct
{
USBVideo_Dbg_Data dbg_data[USBVIDEO_DBG_DATA_SIZE];
kal_uint16 dbg_data_idx;
}USBVideo_Dbg_Struct;
extern void USBVideo_Util_Init(void);
extern void USBVideo_Util_Release(void);
extern void USBVideo_Dbg_Trace(USBVIDEO_DBG_INFO tag, kal_uint32 parameter);
#endif /* USBVIDEO_DRV_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -