263 lines
5.9 KiB
C
263 lines
5.9 KiB
C
/*
|
|
* Copyright 2004-2015 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
*/
|
|
|
|
/*
|
|
* The code contained herein is licensed under the GNU General Public
|
|
* License. You may obtain a copy of the GNU General Public License
|
|
* Version 2 or later at the following locations:
|
|
*
|
|
* http://www.opensource.org/licenses/gpl-license.html
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*/
|
|
|
|
/*!
|
|
* @defgroup MXC_V4L2_CAPTURE MXC V4L2 Video Capture Driver
|
|
*/
|
|
/*!
|
|
* @file mxc_v4l2_capture.h
|
|
*
|
|
* @brief mxc V4L2 capture device API Header file
|
|
*
|
|
* It include all the defines for frame operations, also three structure defines
|
|
* use case ops structure, common v4l2 driver structure and frame structure.
|
|
*
|
|
* @ingroup MXC_V4L2_CAPTURE
|
|
*/
|
|
#ifndef __MXC_V4L2_CAPTURE_H__
|
|
#define __MXC_V4L2_CAPTURE_H__
|
|
|
|
#include <linux/uaccess.h>
|
|
#include <linux/list.h>
|
|
#include <linux/mxc_v4l2.h>
|
|
#include <linux/completion.h>
|
|
#include <linux/dmaengine.h>
|
|
#include <linux/pxp_dma.h>
|
|
#include <linux/ipu-v3.h>
|
|
#include <linux/platform_data/dma-imx.h>
|
|
|
|
#include <media/v4l2-dev.h>
|
|
#include "v4l2-int-device.h"
|
|
|
|
|
|
#define FRAME_NUM 10
|
|
#define MXC_SENSOR_NUM 2
|
|
|
|
enum imx_v4l2_devtype {
|
|
IMX5_V4L2,
|
|
IMX6_V4L2,
|
|
};
|
|
|
|
/*!
|
|
* v4l2 frame structure.
|
|
*/
|
|
struct mxc_v4l_frame {
|
|
u32 paddress;
|
|
void *vaddress;
|
|
int count;
|
|
int width;
|
|
int height;
|
|
|
|
struct v4l2_buffer buffer;
|
|
struct list_head queue;
|
|
int index;
|
|
union {
|
|
int ipu_buf_num;
|
|
int csi_buf_num;
|
|
};
|
|
};
|
|
|
|
/* Only for old version. Will go away soon. */
|
|
typedef struct {
|
|
u8 clk_mode;
|
|
u8 ext_vsync;
|
|
u8 Vsync_pol;
|
|
u8 Hsync_pol;
|
|
u8 pixclk_pol;
|
|
u8 data_pol;
|
|
u8 data_width;
|
|
u8 pack_tight;
|
|
u8 force_eof;
|
|
u8 data_en_pol;
|
|
u16 width;
|
|
u16 height;
|
|
u32 pixel_fmt;
|
|
u32 mclk;
|
|
u16 active_width;
|
|
u16 active_height;
|
|
} sensor_interface;
|
|
|
|
/* Sensor control function */
|
|
/* Only for old version. Will go away soon. */
|
|
struct camera_sensor {
|
|
void (*set_color) (int bright, int saturation, int red, int green,
|
|
int blue);
|
|
void (*get_color) (int *bright, int *saturation, int *red, int *green,
|
|
int *blue);
|
|
void (*set_ae_mode) (int ae_mode);
|
|
void (*get_ae_mode) (int *ae_mode);
|
|
sensor_interface *(*config) (int *frame_rate, int high_quality);
|
|
sensor_interface *(*reset) (void);
|
|
void (*get_std) (v4l2_std_id *std);
|
|
void (*set_std) (v4l2_std_id std);
|
|
unsigned int csi;
|
|
};
|
|
|
|
/*!
|
|
* common v4l2 driver structure.
|
|
*/
|
|
typedef struct _cam_data {
|
|
struct video_device *video_dev;
|
|
int device_type;
|
|
|
|
/* semaphore guard against SMP multithreading */
|
|
struct semaphore busy_lock;
|
|
|
|
int open_count;
|
|
|
|
/* params lock for this camera */
|
|
struct semaphore param_lock;
|
|
|
|
/* Encoder */
|
|
struct list_head ready_q;
|
|
struct list_head done_q;
|
|
struct list_head working_q;
|
|
int ping_pong_csi;
|
|
spinlock_t queue_int_lock;
|
|
spinlock_t dqueue_int_lock;
|
|
struct mxc_v4l_frame frame[FRAME_NUM];
|
|
struct mxc_v4l_frame dummy_frame;
|
|
wait_queue_head_t enc_queue;
|
|
int enc_counter;
|
|
dma_addr_t rot_enc_bufs[2];
|
|
void *rot_enc_bufs_vaddr[2];
|
|
int rot_enc_buf_size[2];
|
|
enum v4l2_buf_type type;
|
|
|
|
/* still image capture */
|
|
wait_queue_head_t still_queue;
|
|
int still_counter;
|
|
dma_addr_t still_buf[2];
|
|
void *still_buf_vaddr;
|
|
|
|
/* overlay */
|
|
struct v4l2_window win;
|
|
struct v4l2_framebuffer v4l2_fb;
|
|
dma_addr_t vf_bufs[2];
|
|
void *vf_bufs_vaddr[2];
|
|
int vf_bufs_size[2];
|
|
dma_addr_t rot_vf_bufs[2];
|
|
void *rot_vf_bufs_vaddr[2];
|
|
int rot_vf_buf_size[2];
|
|
bool overlay_active;
|
|
int output;
|
|
struct fb_info *overlay_fb;
|
|
int fb_origin_std;
|
|
struct work_struct csi_work_struct;
|
|
|
|
/* v4l2 format */
|
|
struct v4l2_format v2f;
|
|
struct v4l2_format input_fmt; /* camera in */
|
|
bool bswapenable;
|
|
int rotation; /* for IPUv1 and IPUv3, this means encoder rotation */
|
|
int vf_rotation; /* viewfinder rotation only for IPUv1 and IPUv3 */
|
|
struct v4l2_mxc_offset offset;
|
|
|
|
/* V4l2 control bit */
|
|
int bright;
|
|
int hue;
|
|
int contrast;
|
|
int saturation;
|
|
int red;
|
|
int green;
|
|
int blue;
|
|
int ae_mode;
|
|
|
|
/* standard */
|
|
struct v4l2_streamparm streamparm;
|
|
struct v4l2_standard standard;
|
|
bool standard_autodetect;
|
|
|
|
/* crop */
|
|
struct v4l2_rect crop_bounds;
|
|
struct v4l2_rect crop_defrect;
|
|
struct v4l2_rect crop_current;
|
|
|
|
int (*enc_update_eba) (void *private, dma_addr_t eba);
|
|
int (*enc_enable) (void *private);
|
|
int (*enc_disable) (void *private);
|
|
int (*enc_enable_csi) (void *private);
|
|
int (*enc_disable_csi) (void *private);
|
|
void (*enc_callback) (u32 mask, void *dev);
|
|
int (*vf_start_adc) (void *private);
|
|
int (*vf_stop_adc) (void *private);
|
|
int (*vf_start_sdc) (void *private);
|
|
int (*vf_stop_sdc) (void *private);
|
|
int (*vf_enable_csi) (void *private);
|
|
int (*vf_disable_csi) (void *private);
|
|
int (*csi_start) (void *private);
|
|
int (*csi_stop) (void *private);
|
|
|
|
/* misc status flag */
|
|
bool overlay_on;
|
|
bool capture_on;
|
|
int overlay_pid;
|
|
int capture_pid;
|
|
bool low_power;
|
|
wait_queue_head_t power_queue;
|
|
unsigned int ipu_id;
|
|
unsigned int csi;
|
|
u8 mclk_source;
|
|
bool mclk_on[2]; /* two mclk sources at most now */
|
|
int current_input;
|
|
|
|
int local_buf_num;
|
|
|
|
/* camera sensor interface */
|
|
struct camera_sensor *cam_sensor; /* old version */
|
|
struct v4l2_int_device *all_sensors[MXC_SENSOR_NUM];
|
|
struct v4l2_int_device *sensor;
|
|
struct v4l2_int_device *self;
|
|
int sensor_index;
|
|
void *ipu;
|
|
void *csi_soc;
|
|
enum imx_v4l2_devtype devtype;
|
|
|
|
/* v4l2 buf elements related to PxP DMA */
|
|
struct completion pxp_tx_cmpl;
|
|
struct pxp_channel *pxp_chan;
|
|
struct pxp_config_data pxp_conf;
|
|
struct dma_async_tx_descriptor *txd;
|
|
dma_cookie_t cookie;
|
|
struct scatterlist sg[2];
|
|
} cam_data;
|
|
|
|
struct sensor_data {
|
|
const struct ov5642_platform_data *platform_data;
|
|
struct v4l2_int_device *v4l2_int_device;
|
|
struct i2c_client *i2c_client;
|
|
struct v4l2_pix_format pix;
|
|
struct v4l2_captureparm streamcap;
|
|
bool on;
|
|
|
|
/* control settings */
|
|
int brightness;
|
|
int hue;
|
|
int contrast;
|
|
int saturation;
|
|
int red;
|
|
int green;
|
|
int blue;
|
|
int ae_mode;
|
|
|
|
u32 mclk;
|
|
u8 mclk_source;
|
|
struct clk *sensor_clk;
|
|
int csi;
|
|
|
|
void (*io_init)(void);
|
|
};
|
|
|
|
void set_mclk_rate(uint32_t *p_mclk_freq, uint32_t csi);
|
|
#endif /* __MXC_V4L2_CAPTURE_H__ */
|