1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /**************************************************************************** 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Filename: cpia2.h 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright 2001, STMicrolectronics, Inc. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Contact: steve.miller@st.com 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Description: 11*4882a593Smuzhiyun * This is a USB driver for CPiA2 based video cameras. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * This driver is modelled on the cpia usb driver by 14*4882a593Smuzhiyun * Jochen Scharrlach and Johannes Erdfeldt. 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun ****************************************************************************/ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef __CPIA2_H__ 19*4882a593Smuzhiyun #define __CPIA2_H__ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #include <linux/videodev2.h> 22*4882a593Smuzhiyun #include <linux/usb.h> 23*4882a593Smuzhiyun #include <linux/poll.h> 24*4882a593Smuzhiyun #include <media/v4l2-common.h> 25*4882a593Smuzhiyun #include <media/v4l2-device.h> 26*4882a593Smuzhiyun #include <media/v4l2-ctrls.h> 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #include "cpia2_registers.h" 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* define for verbose debug output */ 31*4882a593Smuzhiyun //#define _CPIA2_DEBUG_ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /*** 34*4882a593Smuzhiyun * Image defines 35*4882a593Smuzhiyun ***/ 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* Misc constants */ 38*4882a593Smuzhiyun #define ALLOW_CORRUPT 0 /* Causes collater to discard checksum */ 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* USB Transfer mode */ 41*4882a593Smuzhiyun #define XFER_ISOC 0 42*4882a593Smuzhiyun #define XFER_BULK 1 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* USB Alternates */ 45*4882a593Smuzhiyun #define USBIF_CMDONLY 0 46*4882a593Smuzhiyun #define USBIF_BULK 1 47*4882a593Smuzhiyun #define USBIF_ISO_1 2 /* 128 bytes/ms */ 48*4882a593Smuzhiyun #define USBIF_ISO_2 3 /* 384 bytes/ms */ 49*4882a593Smuzhiyun #define USBIF_ISO_3 4 /* 640 bytes/ms */ 50*4882a593Smuzhiyun #define USBIF_ISO_4 5 /* 768 bytes/ms */ 51*4882a593Smuzhiyun #define USBIF_ISO_5 6 /* 896 bytes/ms */ 52*4882a593Smuzhiyun #define USBIF_ISO_6 7 /* 1023 bytes/ms */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* Flicker Modes */ 55*4882a593Smuzhiyun #define NEVER_FLICKER 0 56*4882a593Smuzhiyun #define FLICKER_60 60 57*4882a593Smuzhiyun #define FLICKER_50 50 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* Debug flags */ 60*4882a593Smuzhiyun #define DEBUG_NONE 0 61*4882a593Smuzhiyun #define DEBUG_REG 0x00000001 62*4882a593Smuzhiyun #define DEBUG_DUMP_PATCH 0x00000002 63*4882a593Smuzhiyun #define DEBUG_DUMP_REGS 0x00000004 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /*** 66*4882a593Smuzhiyun * Video frame sizes 67*4882a593Smuzhiyun ***/ 68*4882a593Smuzhiyun enum { 69*4882a593Smuzhiyun VIDEOSIZE_VGA = 0, /* 640x480 */ 70*4882a593Smuzhiyun VIDEOSIZE_CIF, /* 352x288 */ 71*4882a593Smuzhiyun VIDEOSIZE_QVGA, /* 320x240 */ 72*4882a593Smuzhiyun VIDEOSIZE_QCIF, /* 176x144 */ 73*4882a593Smuzhiyun VIDEOSIZE_288_216, 74*4882a593Smuzhiyun VIDEOSIZE_256_192, 75*4882a593Smuzhiyun VIDEOSIZE_224_168, 76*4882a593Smuzhiyun VIDEOSIZE_192_144, 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define STV_IMAGE_CIF_ROWS 288 80*4882a593Smuzhiyun #define STV_IMAGE_CIF_COLS 352 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define STV_IMAGE_QCIF_ROWS 144 83*4882a593Smuzhiyun #define STV_IMAGE_QCIF_COLS 176 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define STV_IMAGE_VGA_ROWS 480 86*4882a593Smuzhiyun #define STV_IMAGE_VGA_COLS 640 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define STV_IMAGE_QVGA_ROWS 240 89*4882a593Smuzhiyun #define STV_IMAGE_QVGA_COLS 320 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define JPEG_MARKER_COM (1<<6) /* Comment segment */ 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /*** 94*4882a593Smuzhiyun * Enums 95*4882a593Smuzhiyun ***/ 96*4882a593Smuzhiyun /* Sensor types available with cpia2 asics */ 97*4882a593Smuzhiyun enum sensors { 98*4882a593Smuzhiyun CPIA2_SENSOR_410, 99*4882a593Smuzhiyun CPIA2_SENSOR_500 100*4882a593Smuzhiyun }; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* Asic types available in the CPiA2 architecture */ 103*4882a593Smuzhiyun #define CPIA2_ASIC_672 0x67 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /* Device types (stv672, stv676, etc) */ 106*4882a593Smuzhiyun #define DEVICE_STV_672 0x0001 107*4882a593Smuzhiyun #define DEVICE_STV_676 0x0002 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun enum frame_status { 110*4882a593Smuzhiyun FRAME_EMPTY, 111*4882a593Smuzhiyun FRAME_READING, /* In the process of being grabbed into */ 112*4882a593Smuzhiyun FRAME_READY, /* Ready to be read */ 113*4882a593Smuzhiyun FRAME_ERROR, 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /*** 117*4882a593Smuzhiyun * Register access (for USB request byte) 118*4882a593Smuzhiyun ***/ 119*4882a593Smuzhiyun enum { 120*4882a593Smuzhiyun CAMERAACCESS_SYSTEM = 0, 121*4882a593Smuzhiyun CAMERAACCESS_VC, 122*4882a593Smuzhiyun CAMERAACCESS_VP, 123*4882a593Smuzhiyun CAMERAACCESS_IDATA 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define CAMERAACCESS_TYPE_BLOCK 0x00 127*4882a593Smuzhiyun #define CAMERAACCESS_TYPE_RANDOM 0x04 128*4882a593Smuzhiyun #define CAMERAACCESS_TYPE_MASK 0x08 129*4882a593Smuzhiyun #define CAMERAACCESS_TYPE_REPEAT 0x0C 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define TRANSFER_READ 0 132*4882a593Smuzhiyun #define TRANSFER_WRITE 1 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #define DEFAULT_ALT USBIF_ISO_6 135*4882a593Smuzhiyun #define DEFAULT_BRIGHTNESS 0x46 136*4882a593Smuzhiyun #define DEFAULT_CONTRAST 0x93 137*4882a593Smuzhiyun #define DEFAULT_SATURATION 0x7f 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* Power state */ 140*4882a593Smuzhiyun #define HI_POWER_MODE CPIA2_SYSTEM_CONTROL_HIGH_POWER 141*4882a593Smuzhiyun #define LO_POWER_MODE CPIA2_SYSTEM_CONTROL_LOW_POWER 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /******** 145*4882a593Smuzhiyun * Commands 146*4882a593Smuzhiyun *******/ 147*4882a593Smuzhiyun enum { 148*4882a593Smuzhiyun CPIA2_CMD_NONE = 0, 149*4882a593Smuzhiyun CPIA2_CMD_GET_VERSION, 150*4882a593Smuzhiyun CPIA2_CMD_GET_PNP_ID, 151*4882a593Smuzhiyun CPIA2_CMD_GET_ASIC_TYPE, 152*4882a593Smuzhiyun CPIA2_CMD_GET_SENSOR, 153*4882a593Smuzhiyun CPIA2_CMD_GET_VP_DEVICE, 154*4882a593Smuzhiyun CPIA2_CMD_GET_VP_BRIGHTNESS, 155*4882a593Smuzhiyun CPIA2_CMD_SET_VP_BRIGHTNESS, 156*4882a593Smuzhiyun CPIA2_CMD_GET_CONTRAST, 157*4882a593Smuzhiyun CPIA2_CMD_SET_CONTRAST, 158*4882a593Smuzhiyun CPIA2_CMD_GET_VP_SATURATION, 159*4882a593Smuzhiyun CPIA2_CMD_SET_VP_SATURATION, 160*4882a593Smuzhiyun CPIA2_CMD_GET_VP_GPIO_DIRECTION, 161*4882a593Smuzhiyun CPIA2_CMD_SET_VP_GPIO_DIRECTION, 162*4882a593Smuzhiyun CPIA2_CMD_GET_VP_GPIO_DATA, 163*4882a593Smuzhiyun CPIA2_CMD_SET_VP_GPIO_DATA, 164*4882a593Smuzhiyun CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION, 165*4882a593Smuzhiyun CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, 166*4882a593Smuzhiyun CPIA2_CMD_GET_VC_MP_GPIO_DATA, 167*4882a593Smuzhiyun CPIA2_CMD_SET_VC_MP_GPIO_DATA, 168*4882a593Smuzhiyun CPIA2_CMD_ENABLE_PACKET_CTRL, 169*4882a593Smuzhiyun CPIA2_CMD_GET_FLICKER_MODES, 170*4882a593Smuzhiyun CPIA2_CMD_SET_FLICKER_MODES, 171*4882a593Smuzhiyun CPIA2_CMD_RESET_FIFO, /* clear fifo and enable stream block */ 172*4882a593Smuzhiyun CPIA2_CMD_SET_HI_POWER, 173*4882a593Smuzhiyun CPIA2_CMD_SET_LOW_POWER, 174*4882a593Smuzhiyun CPIA2_CMD_CLEAR_V2W_ERR, 175*4882a593Smuzhiyun CPIA2_CMD_SET_USER_MODE, 176*4882a593Smuzhiyun CPIA2_CMD_GET_USER_MODE, 177*4882a593Smuzhiyun CPIA2_CMD_FRAMERATE_REQ, 178*4882a593Smuzhiyun CPIA2_CMD_SET_COMPRESSION_STATE, 179*4882a593Smuzhiyun CPIA2_CMD_GET_WAKEUP, 180*4882a593Smuzhiyun CPIA2_CMD_SET_WAKEUP, 181*4882a593Smuzhiyun CPIA2_CMD_GET_PW_CONTROL, 182*4882a593Smuzhiyun CPIA2_CMD_SET_PW_CONTROL, 183*4882a593Smuzhiyun CPIA2_CMD_GET_SYSTEM_CTRL, 184*4882a593Smuzhiyun CPIA2_CMD_SET_SYSTEM_CTRL, 185*4882a593Smuzhiyun CPIA2_CMD_GET_VP_SYSTEM_STATE, 186*4882a593Smuzhiyun CPIA2_CMD_GET_VP_SYSTEM_CTRL, 187*4882a593Smuzhiyun CPIA2_CMD_SET_VP_SYSTEM_CTRL, 188*4882a593Smuzhiyun CPIA2_CMD_GET_VP_EXP_MODES, 189*4882a593Smuzhiyun CPIA2_CMD_SET_VP_EXP_MODES, 190*4882a593Smuzhiyun CPIA2_CMD_GET_DEVICE_CONFIG, 191*4882a593Smuzhiyun CPIA2_CMD_SET_DEVICE_CONFIG, 192*4882a593Smuzhiyun CPIA2_CMD_SET_SERIAL_ADDR, 193*4882a593Smuzhiyun CPIA2_CMD_SET_SENSOR_CR1, 194*4882a593Smuzhiyun CPIA2_CMD_GET_VC_CONTROL, 195*4882a593Smuzhiyun CPIA2_CMD_SET_VC_CONTROL, 196*4882a593Smuzhiyun CPIA2_CMD_SET_TARGET_KB, 197*4882a593Smuzhiyun CPIA2_CMD_SET_DEF_JPEG_OPT, 198*4882a593Smuzhiyun CPIA2_CMD_REHASH_VP4, 199*4882a593Smuzhiyun CPIA2_CMD_GET_USER_EFFECTS, 200*4882a593Smuzhiyun CPIA2_CMD_SET_USER_EFFECTS 201*4882a593Smuzhiyun }; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun enum user_cmd { 204*4882a593Smuzhiyun COMMAND_NONE = 0x00000001, 205*4882a593Smuzhiyun COMMAND_SET_FPS = 0x00000002, 206*4882a593Smuzhiyun COMMAND_SET_COLOR_PARAMS = 0x00000004, 207*4882a593Smuzhiyun COMMAND_GET_COLOR_PARAMS = 0x00000008, 208*4882a593Smuzhiyun COMMAND_SET_FORMAT = 0x00000010, /* size, etc */ 209*4882a593Smuzhiyun COMMAND_SET_FLICKER = 0x00000020 210*4882a593Smuzhiyun }; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /*** 213*4882a593Smuzhiyun * Some defines specific to the 676 chip 214*4882a593Smuzhiyun ***/ 215*4882a593Smuzhiyun #define CAMACC_CIF 0x01 216*4882a593Smuzhiyun #define CAMACC_VGA 0x02 217*4882a593Smuzhiyun #define CAMACC_QCIF 0x04 218*4882a593Smuzhiyun #define CAMACC_QVGA 0x08 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun struct cpia2_register { 222*4882a593Smuzhiyun u8 index; 223*4882a593Smuzhiyun u8 value; 224*4882a593Smuzhiyun }; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun struct cpia2_reg_mask { 227*4882a593Smuzhiyun u8 index; 228*4882a593Smuzhiyun u8 and_mask; 229*4882a593Smuzhiyun u8 or_mask; 230*4882a593Smuzhiyun u8 fill; 231*4882a593Smuzhiyun }; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun struct cpia2_command { 234*4882a593Smuzhiyun u32 command; 235*4882a593Smuzhiyun u8 req_mode; /* (Block or random) | registerBank */ 236*4882a593Smuzhiyun u8 reg_count; 237*4882a593Smuzhiyun u8 direction; 238*4882a593Smuzhiyun u8 start; 239*4882a593Smuzhiyun union reg_types { 240*4882a593Smuzhiyun struct cpia2_register registers[32]; 241*4882a593Smuzhiyun struct cpia2_reg_mask masks[16]; 242*4882a593Smuzhiyun u8 block_data[64]; 243*4882a593Smuzhiyun u8 *patch_data; /* points to function defined block */ 244*4882a593Smuzhiyun } buffer; 245*4882a593Smuzhiyun }; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun struct camera_params { 248*4882a593Smuzhiyun struct { 249*4882a593Smuzhiyun u8 firmware_revision_hi; /* For system register set (bank 0) */ 250*4882a593Smuzhiyun u8 firmware_revision_lo; 251*4882a593Smuzhiyun u8 asic_id; /* Video Compressor set (bank 1) */ 252*4882a593Smuzhiyun u8 asic_rev; 253*4882a593Smuzhiyun u8 vp_device_hi; /* Video Processor set (bank 2) */ 254*4882a593Smuzhiyun u8 vp_device_lo; 255*4882a593Smuzhiyun u8 sensor_flags; 256*4882a593Smuzhiyun u8 sensor_rev; 257*4882a593Smuzhiyun } version; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun struct { 260*4882a593Smuzhiyun u32 device_type; /* enumerated from vendor/product ids. 261*4882a593Smuzhiyun * Currently, either STV_672 or STV_676 */ 262*4882a593Smuzhiyun u16 vendor; 263*4882a593Smuzhiyun u16 product; 264*4882a593Smuzhiyun u16 device_revision; 265*4882a593Smuzhiyun } pnp_id; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun struct { 268*4882a593Smuzhiyun u8 brightness; /* CPIA2_VP_EXPOSURE_TARGET */ 269*4882a593Smuzhiyun u8 contrast; /* Note: this is CPIA2_VP_YRANGE */ 270*4882a593Smuzhiyun u8 saturation; /* CPIA2_VP_SATURATION */ 271*4882a593Smuzhiyun } color_params; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun struct { 274*4882a593Smuzhiyun u8 cam_register; 275*4882a593Smuzhiyun u8 flicker_mode_req; /* 1 if flicker on, else never flicker */ 276*4882a593Smuzhiyun } flicker_control; 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun struct { 279*4882a593Smuzhiyun u8 jpeg_options; 280*4882a593Smuzhiyun u8 creep_period; 281*4882a593Smuzhiyun u8 user_squeeze; 282*4882a593Smuzhiyun u8 inhibit_htables; 283*4882a593Smuzhiyun } compression; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun struct { 286*4882a593Smuzhiyun u8 ohsize; /* output image size */ 287*4882a593Smuzhiyun u8 ovsize; 288*4882a593Smuzhiyun u8 hcrop; /* cropping start_pos/4 */ 289*4882a593Smuzhiyun u8 vcrop; 290*4882a593Smuzhiyun u8 hphase; /* scaling registers */ 291*4882a593Smuzhiyun u8 vphase; 292*4882a593Smuzhiyun u8 hispan; 293*4882a593Smuzhiyun u8 vispan; 294*4882a593Smuzhiyun u8 hicrop; 295*4882a593Smuzhiyun u8 vicrop; 296*4882a593Smuzhiyun u8 hifraction; 297*4882a593Smuzhiyun u8 vifraction; 298*4882a593Smuzhiyun } image_size; 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun struct { 301*4882a593Smuzhiyun int width; /* actual window width */ 302*4882a593Smuzhiyun int height; /* actual window height */ 303*4882a593Smuzhiyun } roi; 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun struct { 306*4882a593Smuzhiyun u8 video_mode; 307*4882a593Smuzhiyun u8 frame_rate; 308*4882a593Smuzhiyun u8 video_size; /* Not a register, just a convenience for cropped sizes */ 309*4882a593Smuzhiyun u8 gpio_direction; 310*4882a593Smuzhiyun u8 gpio_data; 311*4882a593Smuzhiyun u8 system_ctrl; 312*4882a593Smuzhiyun u8 system_state; 313*4882a593Smuzhiyun u8 lowlight_boost; /* Bool: 0 = off, 1 = on */ 314*4882a593Smuzhiyun u8 device_config; 315*4882a593Smuzhiyun u8 exposure_modes; 316*4882a593Smuzhiyun u8 user_effects; 317*4882a593Smuzhiyun } vp_params; 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun struct { 320*4882a593Smuzhiyun u8 pw_control; 321*4882a593Smuzhiyun u8 wakeup; 322*4882a593Smuzhiyun u8 vc_control; 323*4882a593Smuzhiyun u8 vc_mp_direction; 324*4882a593Smuzhiyun u8 vc_mp_data; 325*4882a593Smuzhiyun u8 quality; 326*4882a593Smuzhiyun } vc_params; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun struct { 329*4882a593Smuzhiyun u8 power_mode; 330*4882a593Smuzhiyun u8 system_ctrl; 331*4882a593Smuzhiyun u8 stream_mode; /* This is the current alternate for usb drivers */ 332*4882a593Smuzhiyun u8 allow_corrupt; 333*4882a593Smuzhiyun } camera_state; 334*4882a593Smuzhiyun }; 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun #define NUM_SBUF 2 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun struct cpia2_sbuf { 339*4882a593Smuzhiyun char *data; 340*4882a593Smuzhiyun struct urb *urb; 341*4882a593Smuzhiyun }; 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun struct framebuf { 344*4882a593Smuzhiyun u64 ts; 345*4882a593Smuzhiyun unsigned long seq; 346*4882a593Smuzhiyun int num; 347*4882a593Smuzhiyun int length; 348*4882a593Smuzhiyun int max_length; 349*4882a593Smuzhiyun volatile enum frame_status status; 350*4882a593Smuzhiyun u8 *data; 351*4882a593Smuzhiyun struct framebuf *next; 352*4882a593Smuzhiyun }; 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun struct camera_data { 355*4882a593Smuzhiyun /* locks */ 356*4882a593Smuzhiyun struct v4l2_device v4l2_dev; 357*4882a593Smuzhiyun struct mutex v4l2_lock; /* serialize file operations */ 358*4882a593Smuzhiyun struct v4l2_ctrl_handler hdl; 359*4882a593Smuzhiyun struct { 360*4882a593Smuzhiyun /* Lights control cluster */ 361*4882a593Smuzhiyun struct v4l2_ctrl *top_light; 362*4882a593Smuzhiyun struct v4l2_ctrl *bottom_light; 363*4882a593Smuzhiyun }; 364*4882a593Smuzhiyun struct v4l2_ctrl *usb_alt; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun /* camera status */ 367*4882a593Smuzhiyun int first_image_seen; 368*4882a593Smuzhiyun enum sensors sensor_type; 369*4882a593Smuzhiyun u8 flush; 370*4882a593Smuzhiyun struct v4l2_fh *stream_fh; 371*4882a593Smuzhiyun u8 mmapped; 372*4882a593Smuzhiyun int streaming; /* 0 = no, 1 = yes */ 373*4882a593Smuzhiyun int xfer_mode; /* XFER_BULK or XFER_ISOC */ 374*4882a593Smuzhiyun struct camera_params params; /* camera settings */ 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun /* v4l */ 377*4882a593Smuzhiyun int video_size; /* VIDEO_SIZE_ */ 378*4882a593Smuzhiyun struct video_device vdev; /* v4l videodev */ 379*4882a593Smuzhiyun u32 width; 380*4882a593Smuzhiyun u32 height; /* Its size */ 381*4882a593Smuzhiyun __u32 pixelformat; /* Format fourcc */ 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun /* USB */ 384*4882a593Smuzhiyun struct usb_device *dev; 385*4882a593Smuzhiyun unsigned char iface; 386*4882a593Smuzhiyun unsigned int cur_alt; 387*4882a593Smuzhiyun unsigned int old_alt; 388*4882a593Smuzhiyun struct cpia2_sbuf sbuf[NUM_SBUF]; /* Double buffering */ 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun wait_queue_head_t wq_stream; 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun /* Buffering */ 393*4882a593Smuzhiyun u32 frame_size; 394*4882a593Smuzhiyun int num_frames; 395*4882a593Smuzhiyun unsigned long frame_count; 396*4882a593Smuzhiyun u8 *frame_buffer; /* frame buffer data */ 397*4882a593Smuzhiyun struct framebuf *buffers; 398*4882a593Smuzhiyun struct framebuf * volatile curbuff; 399*4882a593Smuzhiyun struct framebuf *workbuff; 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun /* MJPEG Extension */ 402*4882a593Smuzhiyun int APPn; /* Number of APP segment to be written, must be 0..15 */ 403*4882a593Smuzhiyun int APP_len; /* Length of data in JPEG APPn segment */ 404*4882a593Smuzhiyun char APP_data[60]; /* Data in the JPEG APPn segment. */ 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun int COM_len; /* Length of data in JPEG COM segment */ 407*4882a593Smuzhiyun char COM_data[60]; /* Data in JPEG COM segment */ 408*4882a593Smuzhiyun }; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun /* v4l */ 411*4882a593Smuzhiyun int cpia2_register_camera(struct camera_data *cam); 412*4882a593Smuzhiyun void cpia2_unregister_camera(struct camera_data *cam); 413*4882a593Smuzhiyun void cpia2_camera_release(struct v4l2_device *v4l2_dev); 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* core */ 416*4882a593Smuzhiyun int cpia2_reset_camera(struct camera_data *cam); 417*4882a593Smuzhiyun int cpia2_set_low_power(struct camera_data *cam); 418*4882a593Smuzhiyun void cpia2_dbg_dump_registers(struct camera_data *cam); 419*4882a593Smuzhiyun int cpia2_match_video_size(int width, int height); 420*4882a593Smuzhiyun void cpia2_set_camera_state(struct camera_data *cam); 421*4882a593Smuzhiyun void cpia2_save_camera_state(struct camera_data *cam); 422*4882a593Smuzhiyun void cpia2_set_color_params(struct camera_data *cam); 423*4882a593Smuzhiyun void cpia2_set_brightness(struct camera_data *cam, unsigned char value); 424*4882a593Smuzhiyun void cpia2_set_contrast(struct camera_data *cam, unsigned char value); 425*4882a593Smuzhiyun void cpia2_set_saturation(struct camera_data *cam, unsigned char value); 426*4882a593Smuzhiyun int cpia2_set_flicker_mode(struct camera_data *cam, int mode); 427*4882a593Smuzhiyun void cpia2_set_format(struct camera_data *cam); 428*4882a593Smuzhiyun int cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd); 429*4882a593Smuzhiyun int cpia2_do_command(struct camera_data *cam, 430*4882a593Smuzhiyun unsigned int command, 431*4882a593Smuzhiyun unsigned char direction, unsigned char param); 432*4882a593Smuzhiyun void cpia2_deinit_camera_struct(struct camera_data *cam, struct usb_interface *intf); 433*4882a593Smuzhiyun struct camera_data *cpia2_init_camera_struct(struct usb_interface *intf); 434*4882a593Smuzhiyun int cpia2_init_camera(struct camera_data *cam); 435*4882a593Smuzhiyun int cpia2_allocate_buffers(struct camera_data *cam); 436*4882a593Smuzhiyun void cpia2_free_buffers(struct camera_data *cam); 437*4882a593Smuzhiyun long cpia2_read(struct camera_data *cam, 438*4882a593Smuzhiyun char __user *buf, unsigned long count, int noblock); 439*4882a593Smuzhiyun __poll_t cpia2_poll(struct camera_data *cam, 440*4882a593Smuzhiyun struct file *filp, poll_table *wait); 441*4882a593Smuzhiyun int cpia2_remap_buffer(struct camera_data *cam, struct vm_area_struct *vma); 442*4882a593Smuzhiyun void cpia2_set_property_flip(struct camera_data *cam, int prop_val); 443*4882a593Smuzhiyun void cpia2_set_property_mirror(struct camera_data *cam, int prop_val); 444*4882a593Smuzhiyun int cpia2_set_gpio(struct camera_data *cam, unsigned char setting); 445*4882a593Smuzhiyun int cpia2_set_fps(struct camera_data *cam, int framerate); 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun /* usb */ 448*4882a593Smuzhiyun int cpia2_usb_init(void); 449*4882a593Smuzhiyun void cpia2_usb_cleanup(void); 450*4882a593Smuzhiyun int cpia2_usb_transfer_cmd(struct camera_data *cam, void *registers, 451*4882a593Smuzhiyun u8 request, u8 start, u8 count, u8 direction); 452*4882a593Smuzhiyun int cpia2_usb_stream_start(struct camera_data *cam, unsigned int alternate); 453*4882a593Smuzhiyun int cpia2_usb_stream_stop(struct camera_data *cam); 454*4882a593Smuzhiyun int cpia2_usb_stream_pause(struct camera_data *cam); 455*4882a593Smuzhiyun int cpia2_usb_stream_resume(struct camera_data *cam); 456*4882a593Smuzhiyun int cpia2_usb_change_streaming_alternate(struct camera_data *cam, 457*4882a593Smuzhiyun unsigned int alt); 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun /* ----------------------- debug functions ---------------------- */ 461*4882a593Smuzhiyun #ifdef _CPIA2_DEBUG_ 462*4882a593Smuzhiyun #define ALOG(lev, fmt, args...) printk(lev "%s:%d %s(): " fmt, __FILE__, __LINE__, __func__, ## args) 463*4882a593Smuzhiyun #define LOG(fmt, args...) ALOG(KERN_INFO, fmt, ## args) 464*4882a593Smuzhiyun #define ERR(fmt, args...) ALOG(KERN_ERR, fmt, ## args) 465*4882a593Smuzhiyun #define DBG(fmt, args...) ALOG(KERN_DEBUG, fmt, ## args) 466*4882a593Smuzhiyun #else 467*4882a593Smuzhiyun #define ALOG(fmt,args...) printk(fmt,##args) 468*4882a593Smuzhiyun #define LOG(fmt,args...) ALOG(KERN_INFO "cpia2: "fmt,##args) 469*4882a593Smuzhiyun #define ERR(fmt,args...) ALOG(KERN_ERR "cpia2: "fmt,##args) 470*4882a593Smuzhiyun #define DBG(fmn,args...) do {} while(0) 471*4882a593Smuzhiyun #endif 472*4882a593Smuzhiyun /* No function or lineno, for shorter lines */ 473*4882a593Smuzhiyun #define KINFO(fmt, args...) printk(KERN_INFO fmt,##args) 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun #endif 476