Path: blob/master/drivers/media/video/cpia2/cpia2.h
17590 views
/****************************************************************************1*2* Filename: cpia2.h3*4* Copyright 2001, STMicrolectronics, Inc.5*6* Contact: [email protected]7*8* Description:9* This is a USB driver for CPiA2 based video cameras.10*11* This driver is modelled on the cpia usb driver by12* Jochen Scharrlach and Johannes Erdfeldt.13*14* This program is free software; you can redistribute it and/or modify15* it under the terms of the GNU General Public License as published by16* the Free Software Foundation; either version 2 of the License, or17* (at your option) any later version.18*19* This program is distributed in the hope that it will be useful,20* but WITHOUT ANY WARRANTY; without even the implied warranty of21* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the22* GNU General Public License for more details.23*24* You should have received a copy of the GNU General Public License25* along with this program; if not, write to the Free Software26* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.27*28****************************************************************************/2930#ifndef __CPIA2_H__31#define __CPIA2_H__3233#include <linux/version.h>34#include <linux/videodev2.h>35#include <media/v4l2-common.h>36#include <linux/usb.h>37#include <linux/poll.h>3839#include "cpia2dev.h"40#include "cpia2_registers.h"4142/* define for verbose debug output */43//#define _CPIA2_DEBUG_4445#define CPIA2_MAJ_VER 346#define CPIA2_MIN_VER 047#define CPIA2_PATCH_VER 04849/***50* Image defines51***/5253/* Misc constants */54#define ALLOW_CORRUPT 0 /* Causes collater to discard checksum */5556/* USB Transfer mode */57#define XFER_ISOC 058#define XFER_BULK 15960/* USB Alternates */61#define USBIF_CMDONLY 062#define USBIF_BULK 163#define USBIF_ISO_1 2 /* 128 bytes/ms */64#define USBIF_ISO_2 3 /* 384 bytes/ms */65#define USBIF_ISO_3 4 /* 640 bytes/ms */66#define USBIF_ISO_4 5 /* 768 bytes/ms */67#define USBIF_ISO_5 6 /* 896 bytes/ms */68#define USBIF_ISO_6 7 /* 1023 bytes/ms */6970/* Flicker Modes */71#define NEVER_FLICKER 072#define ANTI_FLICKER_ON 173#define FLICKER_60 6074#define FLICKER_50 507576/* Debug flags */77#define DEBUG_NONE 078#define DEBUG_REG 0x0000000179#define DEBUG_DUMP_PATCH 0x0000000280#define DEBUG_DUMP_REGS 0x000000048182/***83* Video frame sizes84***/85enum {86VIDEOSIZE_VGA = 0, /* 640x480 */87VIDEOSIZE_CIF, /* 352x288 */88VIDEOSIZE_QVGA, /* 320x240 */89VIDEOSIZE_QCIF, /* 176x144 */90VIDEOSIZE_288_216,91VIDEOSIZE_256_192,92VIDEOSIZE_224_168,93VIDEOSIZE_192_144,94};9596#define STV_IMAGE_CIF_ROWS 28897#define STV_IMAGE_CIF_COLS 3529899#define STV_IMAGE_QCIF_ROWS 144100#define STV_IMAGE_QCIF_COLS 176101102#define STV_IMAGE_VGA_ROWS 480103#define STV_IMAGE_VGA_COLS 640104105#define STV_IMAGE_QVGA_ROWS 240106#define STV_IMAGE_QVGA_COLS 320107108#define JPEG_MARKER_COM (1<<6) /* Comment segment */109110/***111* Enums112***/113/* Sensor types available with cpia2 asics */114enum sensors {115CPIA2_SENSOR_410,116CPIA2_SENSOR_500117};118119/* Asic types available in the CPiA2 architecture */120#define CPIA2_ASIC_672 0x67121122/* Device types (stv672, stv676, etc) */123#define DEVICE_STV_672 0x0001124#define DEVICE_STV_676 0x0002125126enum frame_status {127FRAME_EMPTY,128FRAME_READING, /* In the process of being grabbed into */129FRAME_READY, /* Ready to be read */130FRAME_ERROR,131};132133/***134* Register access (for USB request byte)135***/136enum {137CAMERAACCESS_SYSTEM = 0,138CAMERAACCESS_VC,139CAMERAACCESS_VP,140CAMERAACCESS_IDATA141};142143#define CAMERAACCESS_TYPE_BLOCK 0x00144#define CAMERAACCESS_TYPE_RANDOM 0x04145#define CAMERAACCESS_TYPE_MASK 0x08146#define CAMERAACCESS_TYPE_REPEAT 0x0C147148#define TRANSFER_READ 0149#define TRANSFER_WRITE 1150151#define DEFAULT_ALT USBIF_ISO_6152#define DEFAULT_BRIGHTNESS 0x46153#define DEFAULT_CONTRAST 0x93154#define DEFAULT_SATURATION 0x7f155#define DEFAULT_TARGET_KB 0x30156157/* Power state */158#define HI_POWER_MODE CPIA2_SYSTEM_CONTROL_HIGH_POWER159#define LO_POWER_MODE CPIA2_SYSTEM_CONTROL_LOW_POWER160161162/********163* Commands164*******/165enum {166CPIA2_CMD_NONE = 0,167CPIA2_CMD_GET_VERSION,168CPIA2_CMD_GET_PNP_ID,169CPIA2_CMD_GET_ASIC_TYPE,170CPIA2_CMD_GET_SENSOR,171CPIA2_CMD_GET_VP_DEVICE,172CPIA2_CMD_GET_VP_BRIGHTNESS,173CPIA2_CMD_SET_VP_BRIGHTNESS,174CPIA2_CMD_GET_CONTRAST,175CPIA2_CMD_SET_CONTRAST,176CPIA2_CMD_GET_VP_SATURATION,177CPIA2_CMD_SET_VP_SATURATION,178CPIA2_CMD_GET_VP_GPIO_DIRECTION,179CPIA2_CMD_SET_VP_GPIO_DIRECTION,180CPIA2_CMD_GET_VP_GPIO_DATA,181CPIA2_CMD_SET_VP_GPIO_DATA,182CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION,183CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION,184CPIA2_CMD_GET_VC_MP_GPIO_DATA,185CPIA2_CMD_SET_VC_MP_GPIO_DATA,186CPIA2_CMD_ENABLE_PACKET_CTRL,187CPIA2_CMD_GET_FLICKER_MODES,188CPIA2_CMD_SET_FLICKER_MODES,189CPIA2_CMD_RESET_FIFO, /* clear fifo and enable stream block */190CPIA2_CMD_SET_HI_POWER,191CPIA2_CMD_SET_LOW_POWER,192CPIA2_CMD_CLEAR_V2W_ERR,193CPIA2_CMD_SET_USER_MODE,194CPIA2_CMD_GET_USER_MODE,195CPIA2_CMD_FRAMERATE_REQ,196CPIA2_CMD_SET_COMPRESSION_STATE,197CPIA2_CMD_GET_WAKEUP,198CPIA2_CMD_SET_WAKEUP,199CPIA2_CMD_GET_PW_CONTROL,200CPIA2_CMD_SET_PW_CONTROL,201CPIA2_CMD_GET_SYSTEM_CTRL,202CPIA2_CMD_SET_SYSTEM_CTRL,203CPIA2_CMD_GET_VP_SYSTEM_STATE,204CPIA2_CMD_GET_VP_SYSTEM_CTRL,205CPIA2_CMD_SET_VP_SYSTEM_CTRL,206CPIA2_CMD_GET_VP_EXP_MODES,207CPIA2_CMD_SET_VP_EXP_MODES,208CPIA2_CMD_GET_DEVICE_CONFIG,209CPIA2_CMD_SET_DEVICE_CONFIG,210CPIA2_CMD_SET_SERIAL_ADDR,211CPIA2_CMD_SET_SENSOR_CR1,212CPIA2_CMD_GET_VC_CONTROL,213CPIA2_CMD_SET_VC_CONTROL,214CPIA2_CMD_SET_TARGET_KB,215CPIA2_CMD_SET_DEF_JPEG_OPT,216CPIA2_CMD_REHASH_VP4,217CPIA2_CMD_GET_USER_EFFECTS,218CPIA2_CMD_SET_USER_EFFECTS219};220221enum user_cmd {222COMMAND_NONE = 0x00000001,223COMMAND_SET_FPS = 0x00000002,224COMMAND_SET_COLOR_PARAMS = 0x00000004,225COMMAND_GET_COLOR_PARAMS = 0x00000008,226COMMAND_SET_FORMAT = 0x00000010, /* size, etc */227COMMAND_SET_FLICKER = 0x00000020228};229230/***231* Some defines specific to the 676 chip232***/233#define CAMACC_CIF 0x01234#define CAMACC_VGA 0x02235#define CAMACC_QCIF 0x04236#define CAMACC_QVGA 0x08237238239struct cpia2_register {240u8 index;241u8 value;242};243244struct cpia2_reg_mask {245u8 index;246u8 and_mask;247u8 or_mask;248u8 fill;249};250251struct cpia2_command {252u32 command;253u8 req_mode; /* (Block or random) | registerBank */254u8 reg_count;255u8 direction;256u8 start;257union reg_types {258struct cpia2_register registers[32];259struct cpia2_reg_mask masks[16];260u8 block_data[64];261u8 *patch_data; /* points to function defined block */262} buffer;263};264265struct camera_params {266struct {267u8 firmware_revision_hi; /* For system register set (bank 0) */268u8 firmware_revision_lo;269u8 asic_id; /* Video Compressor set (bank 1) */270u8 asic_rev;271u8 vp_device_hi; /* Video Processor set (bank 2) */272u8 vp_device_lo;273u8 sensor_flags;274u8 sensor_rev;275} version;276277struct {278u32 device_type; /* enumerated from vendor/product ids.279* Currently, either STV_672 or STV_676 */280u16 vendor;281u16 product;282u16 device_revision;283} pnp_id;284285struct {286u8 brightness; /* CPIA2_VP_EXPOSURE_TARGET */287u8 contrast; /* Note: this is CPIA2_VP_YRANGE */288u8 saturation; /* CPIA2_VP_SATURATION */289} color_params;290291struct {292u8 cam_register;293u8 flicker_mode_req; /* 1 if flicker on, else never flicker */294int mains_frequency;295} flicker_control;296297struct {298u8 jpeg_options;299u8 creep_period;300u8 user_squeeze;301u8 inhibit_htables;302} compression;303304struct {305u8 ohsize; /* output image size */306u8 ovsize;307u8 hcrop; /* cropping start_pos/4 */308u8 vcrop;309u8 hphase; /* scaling registers */310u8 vphase;311u8 hispan;312u8 vispan;313u8 hicrop;314u8 vicrop;315u8 hifraction;316u8 vifraction;317} image_size;318319struct {320int width; /* actual window width */321int height; /* actual window height */322} roi;323324struct {325u8 video_mode;326u8 frame_rate;327u8 video_size; /* Not a register, just a convenience for cropped sizes */328u8 gpio_direction;329u8 gpio_data;330u8 system_ctrl;331u8 system_state;332u8 lowlight_boost; /* Bool: 0 = off, 1 = on */333u8 device_config;334u8 exposure_modes;335u8 user_effects;336} vp_params;337338struct {339u8 pw_control;340u8 wakeup;341u8 vc_control;342u8 vc_mp_direction;343u8 vc_mp_data;344u8 target_kb;345} vc_params;346347struct {348u8 power_mode;349u8 system_ctrl;350u8 stream_mode; /* This is the current alternate for usb drivers */351u8 allow_corrupt;352} camera_state;353};354355#define NUM_SBUF 2356357struct cpia2_sbuf {358char *data;359struct urb *urb;360};361362struct framebuf {363struct timeval timestamp;364unsigned long seq;365int num;366int length;367int max_length;368volatile enum frame_status status;369u8 *data;370struct framebuf *next;371};372373struct cpia2_fh {374enum v4l2_priority prio;375u8 mmapped;376};377378struct camera_data {379/* locks */380struct mutex v4l2_lock; /* serialize file operations */381struct v4l2_prio_state prio;382383/* camera status */384volatile int present; /* Is the camera still present? */385int open_count; /* # of process that have camera open */386int first_image_seen;387u8 mains_freq; /* for flicker control */388enum sensors sensor_type;389u8 flush;390u8 mmapped;391int streaming; /* 0 = no, 1 = yes */392int xfer_mode; /* XFER_BULK or XFER_ISOC */393struct camera_params params; /* camera settings */394395/* v4l */396int video_size; /* VIDEO_SIZE_ */397struct video_device *vdev; /* v4l videodev */398u32 width;399u32 height; /* Its size */400__u32 pixelformat; /* Format fourcc */401402/* USB */403struct usb_device *dev;404unsigned char iface;405unsigned int cur_alt;406unsigned int old_alt;407struct cpia2_sbuf sbuf[NUM_SBUF]; /* Double buffering */408409wait_queue_head_t wq_stream;410411/* Buffering */412u32 frame_size;413int num_frames;414unsigned long frame_count;415u8 *frame_buffer; /* frame buffer data */416struct framebuf *buffers;417struct framebuf * volatile curbuff;418struct framebuf *workbuff;419420/* MJPEG Extension */421int APPn; /* Number of APP segment to be written, must be 0..15 */422int APP_len; /* Length of data in JPEG APPn segment */423char APP_data[60]; /* Data in the JPEG APPn segment. */424425int COM_len; /* Length of data in JPEG COM segment */426char COM_data[60]; /* Data in JPEG COM segment */427};428429/* v4l */430int cpia2_register_camera(struct camera_data *cam);431void cpia2_unregister_camera(struct camera_data *cam);432433/* core */434int cpia2_reset_camera(struct camera_data *cam);435int cpia2_set_low_power(struct camera_data *cam);436void cpia2_dbg_dump_registers(struct camera_data *cam);437int cpia2_match_video_size(int width, int height);438void cpia2_set_camera_state(struct camera_data *cam);439void cpia2_save_camera_state(struct camera_data *cam);440void cpia2_set_color_params(struct camera_data *cam);441void cpia2_set_brightness(struct camera_data *cam, unsigned char value);442void cpia2_set_contrast(struct camera_data *cam, unsigned char value);443void cpia2_set_saturation(struct camera_data *cam, unsigned char value);444int cpia2_set_flicker_mode(struct camera_data *cam, int mode);445void cpia2_set_format(struct camera_data *cam);446int cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd);447int cpia2_do_command(struct camera_data *cam,448unsigned int command,449unsigned char direction, unsigned char param);450struct camera_data *cpia2_init_camera_struct(void);451int cpia2_init_camera(struct camera_data *cam);452int cpia2_allocate_buffers(struct camera_data *cam);453void cpia2_free_buffers(struct camera_data *cam);454long cpia2_read(struct camera_data *cam,455char __user *buf, unsigned long count, int noblock);456unsigned int cpia2_poll(struct camera_data *cam,457struct file *filp, poll_table *wait);458int cpia2_remap_buffer(struct camera_data *cam, struct vm_area_struct *vma);459void cpia2_set_property_flip(struct camera_data *cam, int prop_val);460void cpia2_set_property_mirror(struct camera_data *cam, int prop_val);461int cpia2_set_target_kb(struct camera_data *cam, unsigned char value);462int cpia2_set_gpio(struct camera_data *cam, unsigned char setting);463int cpia2_set_fps(struct camera_data *cam, int framerate);464465/* usb */466int cpia2_usb_init(void);467void cpia2_usb_cleanup(void);468int cpia2_usb_transfer_cmd(struct camera_data *cam, void *registers,469u8 request, u8 start, u8 count, u8 direction);470int cpia2_usb_stream_start(struct camera_data *cam, unsigned int alternate);471int cpia2_usb_stream_stop(struct camera_data *cam);472int cpia2_usb_stream_pause(struct camera_data *cam);473int cpia2_usb_stream_resume(struct camera_data *cam);474int cpia2_usb_change_streaming_alternate(struct camera_data *cam,475unsigned int alt);476477478/* ----------------------- debug functions ---------------------- */479#ifdef _CPIA2_DEBUG_480#define ALOG(lev, fmt, args...) printk(lev "%s:%d %s(): " fmt, __FILE__, __LINE__, __func__, ## args)481#define LOG(fmt, args...) ALOG(KERN_INFO, fmt, ## args)482#define ERR(fmt, args...) ALOG(KERN_ERR, fmt, ## args)483#define DBG(fmt, args...) ALOG(KERN_DEBUG, fmt, ## args)484#else485#define ALOG(fmt,args...) printk(fmt,##args)486#define LOG(fmt,args...) ALOG(KERN_INFO "cpia2: "fmt,##args)487#define ERR(fmt,args...) ALOG(KERN_ERR "cpia2: "fmt,##args)488#define DBG(fmn,args...) do {} while(0)489#endif490/* No function or lineno, for shorter lines */491#define KINFO(fmt, args...) printk(KERN_INFO fmt,##args)492493#endif494495496