1ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/**************************************************************************** 2ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 3ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Filename: cpia2_core.c 4ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 5ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Copyright 2001, STMicrolectronics, Inc. 6ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Contact: steve.miller@st.com 7ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 8ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Description: 9ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * This is a USB driver for CPia2 based video cameras. 10ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * The infrastructure of this driver is based on the cpia usb driver by 11ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Jochen Scharrlach and Johannes Erdfeldt. 12ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 13ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * This program is free software; you can redistribute it and/or modify 14ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * it under the terms of the GNU General Public License as published by 15ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * the Free Software Foundation; either version 2 of the License, or 16ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * (at your option) any later version. 17ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 18ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * This program is distributed in the hope that it will be useful, 19ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * but WITHOUT ANY WARRANTY; without even the implied warranty of 20ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * GNU General Public License for more details. 22ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 23ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * You should have received a copy of the GNU General Public License 24ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * along with this program; if not, write to the Free Software 25ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 26ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 27ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Stripped of 2.4 stuff ready for main kernel submit by 28d9b01449e75d1351296595e28d2af72993bcc3dcAlan Cox * Alan Cox <alan@lxorguk.ukuu.org.uk> 29ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 30ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ****************************************************************************/ 31ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 32ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#include "cpia2.h" 33ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 34229fd7d2f19c650c34034885180f91574e837bbbTim Gardner#include <linux/module.h> 35ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#include <linux/slab.h> 36f894dfd735237548d282d6fd55b6ebb4b2fd9ef2Hans Verkuil#include <linux/mm.h> 37ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#include <linux/vmalloc.h> 3804a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse#include <linux/firmware.h> 39ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 40229fd7d2f19c650c34034885180f91574e837bbbTim Gardner#define FIRMWARE "cpia2/stv0672_vp4.bin" 41229fd7d2f19c650c34034885180f91574e837bbbTim GardnerMODULE_FIRMWARE(FIRMWARE); 42229fd7d2f19c650c34034885180f91574e837bbbTim Gardner 43ff699e6bd02eb1c6d02c7c2b576c2ee6caab201cDouglas Schilling Landgraf/* #define _CPIA2_DEBUG_ */ 44ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 45ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#ifdef _CPIA2_DEBUG_ 46ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 47ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic const char *block_name[] = { 48ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox "System", 49ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox "VC", 50ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox "VP", 51ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox "IDATA" 52ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox}; 53ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#endif 54ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 55ff699e6bd02eb1c6d02c7c2b576c2ee6caab201cDouglas Schilling Landgrafstatic unsigned int debugs_on; /* default 0 - DEBUG_REG */ 56ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 57ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 58ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 59ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 60ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Forward Declarations 61ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 62ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 63ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int apply_vp_patch(struct camera_data *cam); 64ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int set_default_user_mode(struct camera_data *cam); 65ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int set_vw_size(struct camera_data *cam, int size); 66ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int configure_sensor(struct camera_data *cam, 67ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int reqwidth, int reqheight); 68ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int config_sensor_410(struct camera_data *cam, 69ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int reqwidth, int reqheight); 70ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int config_sensor_500(struct camera_data *cam, 71ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int reqwidth, int reqheight); 72ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int set_all_properties(struct camera_data *cam); 73ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic void wake_system(struct camera_data *cam); 74ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic void set_lowlight_boost(struct camera_data *cam); 75ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic void reset_camera_struct(struct camera_data *cam); 76ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int cpia2_set_high_power(struct camera_data *cam); 77ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 78ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/* Here we want the physical address of the memory. 79ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * This is used when initializing the contents of the 80ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * area and marking the pages as reserved. 81ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox */ 82ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic inline unsigned long kvirt_to_pa(unsigned long adr) 83ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 84ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long kva, ret; 85ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 86ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox kva = (unsigned long) page_address(vmalloc_to_page((void *)adr)); 87ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox kva |= adr & (PAGE_SIZE-1); /* restore the offset */ 88ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ret = __pa(kva); 89ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return ret; 90ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 91ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 92ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic void *rvmalloc(unsigned long size) 93ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 94ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox void *mem; 95ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long adr; 96ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 97ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Round it off to PAGE_SIZE */ 98ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox size = PAGE_ALIGN(size); 99ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 100ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox mem = vmalloc_32(size); 101ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!mem) 102ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return NULL; 103ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 104ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox memset(mem, 0, size); /* Clear the ram out, no junk to the user */ 105ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox adr = (unsigned long) mem; 106ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 107ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox while ((long)size > 0) { 108ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox SetPageReserved(vmalloc_to_page((void *)adr)); 109ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox adr += PAGE_SIZE; 110ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox size -= PAGE_SIZE; 111ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 112ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return mem; 113ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 114ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 115ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic void rvfree(void *mem, unsigned long size) 116ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 117ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long adr; 118ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 119ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!mem) 120ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return; 121ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 122ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox size = PAGE_ALIGN(size); 123ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 124ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox adr = (unsigned long) mem; 125ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox while ((long)size > 0) { 126ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ClearPageReserved(vmalloc_to_page((void *)adr)); 127ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox adr += PAGE_SIZE; 128ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox size -= PAGE_SIZE; 129ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 130ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox vfree(mem); 131ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 132ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 133ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 134ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 135ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_do_command 136ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 137ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Send an arbitrary command to the camera. For commands that read from 138ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * the camera, copy the buffers into the proper param structures. 139ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 140ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_do_command(struct camera_data *cam, 141ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u32 command, u8 direction, u8 param) 142ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 143ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval = 0; 144ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 145ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned int device = cam->params.pnp_id.device_type; 146ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 147ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.command = command; 148ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; /* default */ 149ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = direction; 150ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 151ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 152ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Set up the command. 153ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 154ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (command) { 155ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VERSION: 156ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = 157ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 158ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_SYSTEM_DEVICE_HI; 159ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 160ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_PNP_ID: 161ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = 162ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 163ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 8; 164ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_SYSTEM_DESCRIP_VID_HI; 165ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 166ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_ASIC_TYPE: 167ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; 168ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VC_ASIC_ID; 169ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 170ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_SENSOR: 171ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 172ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_SENSOR_FLAGS; 173ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 174ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_DEVICE: 175ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 176ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_DEVICEH; 177ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 178ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VP_BRIGHTNESS: 179ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 180ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_BRIGHTNESS: 181ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 182ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 183ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (device == DEVICE_STV_672) 184ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP4_EXPOSURE_TARGET; 185ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 186ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP5_EXPOSURE_TARGET; 187ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 188ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_CONTRAST: 189ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 190ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_CONTRAST: 191ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 192ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 193ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_YRANGE; 194ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 195ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VP_SATURATION: 196ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 197ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_SATURATION: 198ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 199ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 200ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (device == DEVICE_STV_672) 201ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_SATURATION; 202ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 203ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP5_MCUVSATURATION; 204ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 205ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VP_GPIO_DATA: 206ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 207ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_GPIO_DATA: 208ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 209ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 210ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_GPIO_DATA; 211ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 212ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VP_GPIO_DIRECTION: 213ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 214ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_GPIO_DIRECTION: 215ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 216ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 217ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_GPIO_DIRECTION; 218ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 219ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VC_MP_GPIO_DATA: 220ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 221ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VC_MP_GPIO_DATA: 222ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; 223ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 224ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VC_MP_DATA; 225ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 226ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION: 227ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 228ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION: 229ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; 230ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 231ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VC_MP_DIR; 232ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 233ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_ENABLE_PACKET_CTRL: 234ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = 235ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 236ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_SYSTEM_INT_PACKET_CTRL; 237ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 238ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; 239ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 240ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_FLICKER_MODES: 241ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 242ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_FLICKER_MODES: 243ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 244ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 245ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_FLICKER_MODES; 246ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 247ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_RESET_FIFO: /* clear fifo and enable stream block */ 248ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 249ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; 250ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0; 251ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VC_ST_CTRL; 252ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = CPIA2_VC_ST_CTRL_SRC_VC | 253ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_DST_USB | CPIA2_VC_ST_CTRL_EOF_DETECT; 254ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VC_ST_CTRL; 255ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = CPIA2_VC_ST_CTRL_SRC_VC | 256ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_DST_USB | 257ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_EOF_DETECT | 258ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_FIFO_ENABLE; 259ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 260ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_HI_POWER: 261ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = 262ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_SYSTEM; 263ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; 264ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = 265ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_SYSTEM_CONTROL; 266ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = 267ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_SYSTEM_CONTROL; 268ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = CPIA2_SYSTEM_CONTROL_CLEAR_ERR; 269ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = 270ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_CONTROL_HIGH_POWER; 271ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 272ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_LOW_POWER: 273ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = 274ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 275ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 276ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL; 277ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = 0; 278ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 279ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_CLEAR_V2W_ERR: 280ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = 281ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 282ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 283ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL; 284ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = CPIA2_SYSTEM_CONTROL_CLEAR_ERR; 285ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 286ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_USER_MODE: /* Then fall through */ 287ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; 288ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_USER_MODE: 289ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 290ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 291ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (device == DEVICE_STV_672) 292ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP4_USER_MODE; 293ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 294ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP5_USER_MODE; 295ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 296ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_FRAMERATE_REQ: 297ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 298ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 299ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (device == DEVICE_STV_672) 300ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP4_FRAMERATE_REQUEST; 301ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 302ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP5_FRAMERATE_REQUEST; 303ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; 304ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 305ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_WAKEUP: 306ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 307ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_WAKEUP: 308ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; 309ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 310ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VC_WAKEUP; 311ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 312ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_PW_CONTROL: 313ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 314ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_PW_CONTROL: 315ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; 316ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 317ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VC_PW_CTRL; 318ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 319ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_SYSTEM_STATE: 320ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 321ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 322ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_SYSTEMSTATE; 323ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 324ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_SYSTEM_CTRL: 325ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 326ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_SYSTEM_CTRL: 327ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = 328ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 329ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 330ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL; 331ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 332ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VP_SYSTEM_CTRL: 333ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 334ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_SYSTEM_CTRL: 335ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 336ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 337ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_SYSTEMCTRL; 338ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 339ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VP_EXP_MODES: 340ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 341ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_EXP_MODES: 342ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 343ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 344ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_EXPOSURE_MODES; 345ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 346ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_DEVICE_CONFIG: 347ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 348ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_DEVICE_CONFIG: 349ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 350ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 351ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_DEVICE_CONFIG; 352ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 353ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_SERIAL_ADDR: 354ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; 355ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = 356ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 357ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 358ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_SYSTEM_VP_SERIAL_ADDR; 359ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 360ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_SENSOR_CR1: 361ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; 362ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 363ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 364ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_SENSOR_CR1; 365ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 366ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_VC_CONTROL: 367ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 368ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VC_CONTROL: 369ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; 370ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 371ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VC_VC_CTRL; 372ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 373ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_TARGET_KB: 374ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 375ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 376ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VC_VC_TARGET_KB; 377ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = param; 378ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 379ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_DEF_JPEG_OPT: 380ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 381ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 4; 382ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VC_VC_JPEG_OPT; 383ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = 384ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_JPEG_OPT_DOUBLE_SQUEEZE; 385ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VC_VC_USER_SQUEEZE; 386ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = 20; 387ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[2].index = CPIA2_VC_VC_CREEP_PERIOD; 388ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[2].value = 2; 389ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[3].index = CPIA2_VC_VC_JPEG_OPT; 390ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[3].value = CPIA2_VC_VC_JPEG_OPT_DEFAULT; 391ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 392ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_REHASH_VP4: 393ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 394ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 395ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_REHASH_VALUES; 396ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; 397ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 398ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_SET_USER_EFFECTS: /* Note: Be careful with this as 399ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox this register can also affect 400ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox flicker modes */ 401ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = param; /* Then fall through */ 402ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_USER_EFFECTS: 403ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 404ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 405ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (device == DEVICE_STV_672) 406ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP4_USER_EFFECTS; 407ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 408ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP5_USER_EFFECTS; 409ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 410ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 411ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox LOG("DoCommand received invalid command\n"); 412ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 413ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 414ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 415ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = cpia2_send_command(cam, &cmd); 416ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (retval) { 417ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 418ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 419ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 420ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 421ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Now copy any results from a read into the appropriate param struct. 422ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 423ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (command) { 424ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VERSION: 425ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.firmware_revision_hi = 426ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]; 427ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.firmware_revision_lo = 428ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]; 429ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 430ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_PNP_ID: 431ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.pnp_id.vendor = (cmd.buffer.block_data[0] << 8) | 432ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]; 433ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.pnp_id.product = (cmd.buffer.block_data[2] << 8) | 434ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]; 435ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.pnp_id.device_revision = 436ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (cmd.buffer.block_data[4] << 8) | 437ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]; 438ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.vendor == 0x553) { 439ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.product == 0x100) { 440ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.pnp_id.device_type = DEVICE_STV_672; 441ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else if (cam->params.pnp_id.product == 0x140 || 442ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.pnp_id.product == 0x151) { 443ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.pnp_id.device_type = DEVICE_STV_676; 444ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 445ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 446ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 447ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_ASIC_TYPE: 448ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.asic_id = cmd.buffer.block_data[0]; 449ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.asic_rev = cmd.buffer.block_data[1]; 450ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 451ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_SENSOR: 452ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags = cmd.buffer.block_data[0]; 453ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_rev = cmd.buffer.block_data[1]; 454ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 455ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_DEVICE: 456ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.vp_device_hi = cmd.buffer.block_data[0]; 457ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.vp_device_lo = cmd.buffer.block_data[1]; 458ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 459ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_GPIO_DATA: 460ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_data = cmd.buffer.block_data[0]; 461ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 462ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_GPIO_DIRECTION: 463ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_direction = cmd.buffer.block_data[0]; 464ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 465ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION: 466ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vc_params.vc_mp_direction =cmd.buffer.block_data[0]; 467ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 468ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VC_MP_GPIO_DATA: 469ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vc_params.vc_mp_data = cmd.buffer.block_data[0]; 470ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 471ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_FLICKER_MODES: 472ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.cam_register = 473ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]; 474ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 475ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_WAKEUP: 476ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vc_params.wakeup = cmd.buffer.block_data[0]; 477ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 478ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_PW_CONTROL: 479ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vc_params.pw_control = cmd.buffer.block_data[0]; 480ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 481ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_SYSTEM_CTRL: 482ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.system_ctrl = cmd.buffer.block_data[0]; 483ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 484ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_SYSTEM_STATE: 485ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.system_state = cmd.buffer.block_data[0]; 486ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 487ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_SYSTEM_CTRL: 488ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.system_ctrl = cmd.buffer.block_data[0]; 489ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 490ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VP_EXP_MODES: 491ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.exposure_modes = cmd.buffer.block_data[0]; 492ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 493ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_DEVICE_CONFIG: 494ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.device_config = cmd.buffer.block_data[0]; 495ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 496ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_VC_CONTROL: 497ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vc_params.vc_control = cmd.buffer.block_data[0]; 498ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 499ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_USER_MODE: 500ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.video_mode = cmd.buffer.block_data[0]; 501ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 502ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_CMD_GET_USER_EFFECTS: 503ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.user_effects = cmd.buffer.block_data[0]; 504ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 505ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 506ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 507ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 508ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 509ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 510ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 511ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 512ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 513ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_send_command 514ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 515ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 5161039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab 5171039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab#define DIR(cmd) ((cmd->direction == TRANSFER_WRITE) ? "Write" : "Read") 5181039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab#define BINDEX(cmd) (cmd->req_mode & 0x03) 5191039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab 520ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd) 521ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 522ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u8 count; 523ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u8 start; 524ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u8 *buffer; 525ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval; 526ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 527ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (cmd->req_mode & 0x0c) { 528ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CAMERAACCESS_TYPE_RANDOM: 529ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = cmd->reg_count * sizeof(struct cpia2_register); 530ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start = 0; 531ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer = (u8 *) & cmd->buffer; 532ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) 5331039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DBG("%s Random: Register block %s\n", DIR(cmd), 5341039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab block_name[BINDEX(cmd)]); 535ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 536ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CAMERAACCESS_TYPE_BLOCK: 537ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = cmd->reg_count; 538ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start = cmd->start; 539ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer = cmd->buffer.block_data; 540ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) 5411039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DBG("%s Block: Register block %s\n", DIR(cmd), 5421039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab block_name[BINDEX(cmd)]); 543ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 544ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CAMERAACCESS_TYPE_MASK: 545ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = cmd->reg_count * sizeof(struct cpia2_reg_mask); 546ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start = 0; 547ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer = (u8 *) & cmd->buffer; 548ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) 5491039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DBG("%s Mask: Register block %s\n", DIR(cmd), 5501039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab block_name[BINDEX(cmd)]); 551ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 552ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CAMERAACCESS_TYPE_REPEAT: /* For patch blocks only */ 553ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = cmd->reg_count; 554ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start = cmd->start; 555ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer = cmd->buffer.block_data; 556ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) 5571039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DBG("%s Repeat: Register block %s\n", DIR(cmd), 5581039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab block_name[BINDEX(cmd)]); 559ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 560ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 56194205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison LOG("%s: invalid request mode\n",__func__); 562ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 563ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 564ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 565ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = cpia2_usb_transfer_cmd(cam, 566ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox buffer, 567ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd->req_mode, 568ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start, count, cmd->direction); 569ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#ifdef _CPIA2_DEBUG_ 570ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (debugs_on & DEBUG_REG) { 571ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i; 572ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox for (i = 0; i < cmd->reg_count; i++) { 573ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((cmd->req_mode & 0x0c) == CAMERAACCESS_TYPE_BLOCK) 574ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox KINFO("%s Block: [0x%02X] = 0x%02X\n", 5751039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DIR(cmd), start + i, buffer[i]); 576ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((cmd->req_mode & 0x0c) == CAMERAACCESS_TYPE_RANDOM) 577ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox KINFO("%s Random: [0x%02X] = 0x%02X\n", 5781039752353f1308bcd594a79196f60a22d45975dMauro Carvalho Chehab DIR(cmd), cmd->buffer.registers[i].index, 579ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd->buffer.registers[i].value); 580ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 581ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 582ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#endif 583ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 584ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 585ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox}; 586ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 587ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/************* 588ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Functions to implement camera functionality 589ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *************/ 590ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 591ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 592ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_get_version_info 593ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 594ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 595ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic void cpia2_get_version_info(struct camera_data *cam) 596ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 597ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VERSION, TRANSFER_READ, 0); 598ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_PNP_ID, TRANSFER_READ, 0); 599ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_ASIC_TYPE, TRANSFER_READ, 0); 600ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_SENSOR, TRANSFER_READ, 0); 601ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_DEVICE, TRANSFER_READ, 0); 602ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 603ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 604ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 605ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 606ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_reset_camera 607ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 608ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Called at least during the open process, sets up initial params. 609ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 610ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_reset_camera(struct camera_data *cam) 611ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 612ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u8 tmp_reg; 613ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval = 0; 6146c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil int target_kb; 615ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i; 616ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 617ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 618ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 619ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * VC setup 620ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 621ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = configure_sensor(cam, 622ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width, 623ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height); 624ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (retval < 0) { 625ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("Couldn't configure sensor, error=%d\n", retval); 626ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 627ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 628ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 629ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Clear FIFO and route/enable stream block */ 630ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 631ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 632ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; 633ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VC_ST_CTRL; 634ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = CPIA2_VC_ST_CTRL_SRC_VC | 635ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_DST_USB | CPIA2_VC_ST_CTRL_EOF_DETECT; 636ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VC_ST_CTRL; 637ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = CPIA2_VC_ST_CTRL_SRC_VC | 638ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_DST_USB | 639ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_ST_CTRL_EOF_DETECT | CPIA2_VC_ST_CTRL_FIFO_ENABLE; 640ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 641ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 642ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 643ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_high_power(cam); 644ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 645ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) { 646ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Enable button notification */ 647ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_SYSTEM; 648ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_SYSTEM_INT_PACKET_CTRL; 649ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = 650ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_INT_PACKET_CTRL_ENABLE_SW_XX; 651ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 652ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 653ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 654ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 65597989ada7628da262eafb4bebce0a319c7cb0f5fRobert P. J. Day schedule_timeout_interruptible(msecs_to_jiffies(100)); 656ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 657ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) 658ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = apply_vp_patch(cam); 659ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 660ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* wait for vp to go to sleep */ 66197989ada7628da262eafb4bebce0a319c7cb0f5fRobert P. J. Day schedule_timeout_interruptible(msecs_to_jiffies(100)); 662ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 663ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 664ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * If this is a 676, apply VP5 fixes before we start streaming 665ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 666ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_676) { 667ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP; 668ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 669ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* The following writes improve the picture */ 670ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VP5_MYBLACK_LEVEL; 671ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = 0; /* reduce from the default 672ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * rec 601 pedestal of 16 */ 673ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VP5_MCYRANGE; 674ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = 0x92; /* increase from 100% to 675ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * (256/256 - 31) to fill 676ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * available range */ 677ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[2].index = CPIA2_VP5_MYCEILING; 678ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[2].value = 0xFF; /* Increase from the 679ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * default rec 601 ceiling 680ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * of 240 */ 681ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[3].index = CPIA2_VP5_MCUVSATURATION; 682ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[3].value = 0xFF; /* Increase from the rec 683ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 601 100% level (128) 684ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * to 145-192 */ 685ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[4].index = CPIA2_VP5_ANTIFLKRSETUP; 686ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[4].value = 0x80; /* Inhibit the 687ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * anti-flicker */ 688ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 689ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* The following 4 writes are a fix to allow QVGA to work at 30 fps */ 690ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[5].index = CPIA2_VP_RAM_ADDR_H; 691ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[5].value = 0x01; 692ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[6].index = CPIA2_VP_RAM_ADDR_L; 693ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[6].value = 0xE3; 694ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[7].index = CPIA2_VP_RAM_DATA; 695ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[7].value = 0x02; 696ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[8].index = CPIA2_VP_RAM_DATA; 697ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[8].value = 0xFC; 698ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 699ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 700ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 9; 701ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 702ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 703ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 704ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 705ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Activate all settings and start the data stream */ 706ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set user mode */ 707ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_default_user_mode(cam); 708ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 709ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Give VP time to wake up */ 71097989ada7628da262eafb4bebce0a319c7cb0f5fRobert P. J. Day schedule_timeout_interruptible(msecs_to_jiffies(100)); 711ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 712ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_all_properties(cam); 713ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 714ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_MODE, TRANSFER_READ, 0); 715ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("After SetAllProperties(cam), user mode is 0x%0X\n", 716ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.video_mode); 717ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 718ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 719ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Set audio regulator off. This and the code to set the compresison 720ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * state are too complex to form a CPIA2_CMD_, and seem to be somewhat 721ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * intertwined. This stuff came straight from the windows driver. 722ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 723ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Turn AutoExposure off in VP and enable the serial bridge to the sensor */ 724ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_CTRL, TRANSFER_READ, 0); 725ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg = cam->params.vp_params.system_ctrl; 726ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = tmp_reg & 727ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (tmp_reg & (CPIA2_VP_SYSTEMCTRL_HK_CONTROL ^ 0xFF)); 728ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 729ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_DEVICE_CONFIG, TRANSFER_READ, 0); 730ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = cam->params.vp_params.device_config | 731ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VP_DEVICE_CONFIG_SERIAL_BRIDGE; 732ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VP_SYSTEMCTRL; 733ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VP_DEVICE_CONFIG; 734ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP; 735ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; 736ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 737ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0; 738ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 739ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 740ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the correct I2C address in the CPiA-2 system register */ 741ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 742ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_SERIAL_ADDR, 743ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 744ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_VP_SERIAL_ADDR_SENSOR); 745ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 746ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Now have sensor access - set bit to turn the audio regulator off */ 747ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 748ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_SENSOR_CR1, 749ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, CPIA2_SENSOR_CR1_DOWN_AUDIO_REGULATOR); 750ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 751ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the correct I2C address in the CPiA-2 system register */ 752ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) 753ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 754ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_SERIAL_ADDR, 755ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 756ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_VP_SERIAL_ADDR_VP); // 0x88 757ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 758ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 759ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_SERIAL_ADDR, 760ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 761ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_VP_SERIAL_ADDR_676_VP); // 0x8a 762ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 763ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* increase signal drive strength */ 764ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_676) 765ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 766ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_VP_EXP_MODES, 767ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 768ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VP_EXPOSURE_MODES_COMPILE_EXP); 769ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 770ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Start autoexposure */ 771ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_DEVICE_CONFIG, TRANSFER_READ, 0); 772ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].value = cam->params.vp_params.device_config & 773ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (CPIA2_VP_DEVICE_CONFIG_SERIAL_BRIDGE ^ 0xFF); 774ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 775ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_CTRL, TRANSFER_READ, 0); 776ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].value = 777ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.system_ctrl | CPIA2_VP_SYSTEMCTRL_HK_CONTROL; 778ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 779ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[0].index = CPIA2_VP_DEVICE_CONFIG; 780ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[1].index = CPIA2_VP_SYSTEMCTRL; 781ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VP; 782ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 2; 783ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 784ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 785ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 786ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 787ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set compression state */ 788ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VC_CONTROL, TRANSFER_READ, 0); 789ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.compression.inhibit_htables) { 790ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg = cam->params.vc_params.vc_control | 791ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CTRL_INHIBIT_H_TABLES; 792ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 793ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg = cam->params.vc_params.vc_control & 794ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ~CPIA2_VC_VC_CTRL_INHIBIT_H_TABLES; 795ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 796ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_VC_CONTROL, TRANSFER_WRITE,tmp_reg); 797ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 7986c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil /* Set target size (kb) on vc 7996c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil This is a heuristic based on the quality parameter and the raw 8006c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil framesize in kB divided by 16 (the compression factor when the 8016c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil quality is 100%) */ 8026c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil target_kb = (cam->width * cam->height * 2 / 16384) * 8036c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil cam->params.vc_params.quality / 100; 8046c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil if (target_kb < 1) 8056c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil target_kb = 1; 806ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_TARGET_KB, 8076c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil TRANSFER_WRITE, target_kb); 808ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 809ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Wiggle VC Reset */ 810ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 811ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * First read and wait a bit. 812ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 813ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox for (i = 0; i < 50; i++) { 814ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_PW_CONTROL, 815ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_READ, 0); 816ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 817ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 818ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg = cam->params.vc_params.pw_control; 819ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg &= ~CPIA2_VC_PW_CTRL_VC_RESET_N; 820ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 821ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_PW_CONTROL, TRANSFER_WRITE,tmp_reg); 822ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 823ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox tmp_reg |= CPIA2_VC_PW_CTRL_VC_RESET_N; 824ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_PW_CONTROL, TRANSFER_WRITE,tmp_reg); 825ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 826ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_DEF_JPEG_OPT, TRANSFER_WRITE, 0); 827ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 828ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_MODE, TRANSFER_READ, 0); 829ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("After VC RESET, user mode is 0x%0X\n", 830ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.video_mode); 831ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 832ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 833ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 834ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 835ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 836ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 837ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_high_power 838ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 839ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 840ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int cpia2_set_high_power(struct camera_data *cam) 841ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 842ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i; 843ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox for (i = 0; i <= 50; i++) { 844ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Read system status */ 845ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam,CPIA2_CMD_GET_SYSTEM_CTRL,TRANSFER_READ,0); 846ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 847ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* If there is an error, clear it */ 848ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.camera_state.system_ctrl & 849ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_SYSTEM_CONTROL_V2W_ERR) 850ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_CLEAR_V2W_ERR, 851ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 0); 852ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 853ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Try to set high power mode */ 854ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_SYSTEM_CTRL, 855ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 1); 856ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 857ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Try to read something in VP to check if everything is awake */ 858ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VP_SYSTEM_STATE, 859ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_READ, 0); 860ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.vp_params.system_state & 861ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VP_SYSTEMSTATE_HK_ALIVE) { 862ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 863ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else if (i == 50) { 864ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.power_mode = LO_POWER_MODE; 865ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("Camera did not wake up\n"); 866ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EIO; 867ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 868ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 869ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 870ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("System now in high power state\n"); 871ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.power_mode = HI_POWER_MODE; 872ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 873ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 874ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 875ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 876ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 877ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_low_power 878ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 879ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 880ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_low_power(struct camera_data *cam) 881ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 882ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.power_mode = LO_POWER_MODE; 883ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_SYSTEM_CTRL, TRANSFER_WRITE, 0); 884ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 885ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 886ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 887ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 888ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 889ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * apply_vp_patch 890ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 891ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 89204a33e406a062cd1bb55014ee17a3558109a2d74David Woodhousestatic int cpia2_send_onebyte_command(struct camera_data *cam, 89304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse struct cpia2_command *cmd, 89404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse u8 start, u8 datum) 89504a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse{ 89604a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd->buffer.block_data[0] = datum; 89704a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd->start = start; 89804a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd->reg_count = 1; 89904a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse return cpia2_send_command(cam, cmd); 90004a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse} 90104a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse 902ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int apply_vp_patch(struct camera_data *cam) 903ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 90404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse const struct firmware *fw; 905229fd7d2f19c650c34034885180f91574e837bbbTim Gardner const char fw_name[] = FIRMWARE; 90604a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse int i, ret; 907ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 908ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 90904a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse ret = request_firmware(&fw, fw_name, &cam->dev->dev); 91004a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse if (ret) { 91104a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse printk(KERN_ERR "cpia2: failed to load VP patch \"%s\"\n", 91204a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse fw_name); 91304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse return ret; 91404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse } 91504a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse 916ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_REPEAT | CAMERAACCESS_VP; 917ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 918ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 91904a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse /* First send the start address... */ 92004a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0A, fw->data[0]); /* hi */ 92104a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0B, fw->data[1]); /* lo */ 922ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 92304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse /* ... followed by the data payload */ 92404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse for (i = 2; i < fw->size; i += 64) { 92504a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd.start = 0x0C; /* Data */ 92604a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cmd.reg_count = min_t(int, 64, fw->size - i); 92704a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse memcpy(cmd.buffer.block_data, &fw->data[i], cmd.reg_count); 928ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 929ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 930ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 93104a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse /* Next send the start address... */ 93204a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0A, fw->data[0]); /* hi */ 93304a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0B, fw->data[1]); /* lo */ 93404a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse 93504a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse /* ... followed by the 'goto' command */ 93604a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse cpia2_send_onebyte_command(cam, &cmd, 0x0D, 1); 93704a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse 93804a33e406a062cd1bb55014ee17a3558109a2d74David Woodhouse release_firmware(fw); 939ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 940ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 941ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 942ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 943ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 944ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * set_default_user_mode 945ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 946ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 947ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int set_default_user_mode(struct camera_data *cam) 948ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 949ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char user_mode; 950ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char frame_rate; 951ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int width = cam->params.roi.width; 952ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int height = cam->params.roi.height; 953ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 954ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (cam->params.version.sensor_flags) { 955ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_404: 956ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_407: 957ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_409: 958ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_410: 959ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if ((width > STV_IMAGE_QCIF_COLS) 960ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox || (height > STV_IMAGE_QCIF_ROWS)) { 961ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode = CPIA2_VP_USER_MODE_CIF; 962ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 963ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode = CPIA2_VP_USER_MODE_QCIFDS; 964ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 965ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate = CPIA2_VP_FRAMERATE_30; 966ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 967ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_500: 968ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if ((width > STV_IMAGE_CIF_COLS) 969ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox || (height > STV_IMAGE_CIF_ROWS)) { 970ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode = CPIA2_VP_USER_MODE_VGA; 971ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 972ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode = CPIA2_VP_USER_MODE_QVGADS; 973ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 974ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) 975ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate = CPIA2_VP_FRAMERATE_15; 976ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 977ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate = CPIA2_VP_FRAMERATE_30; 978ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 979ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 98094205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison LOG("%s: Invalid sensor flag value 0x%0X\n",__func__, 981ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags); 982ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 983ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 984ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 985ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Sensor flag = 0x%0x, user mode = 0x%0x, frame rate = 0x%X\n", 986ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags, user_mode, frame_rate); 987ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_USER_MODE, TRANSFER_WRITE, 988ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox user_mode); 989ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.vp_params.frame_rate > 0 && 990ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate > cam->params.vp_params.frame_rate) 991ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame_rate = cam->params.vp_params.frame_rate; 992ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 993ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_fps(cam, frame_rate); 994ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 995ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// if (cam->params.pnp_id.device_type == DEVICE_STV_676) 996ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// cpia2_do_command(cam, 997ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// CPIA2_CMD_SET_VP_SYSTEM_CTRL, 998ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// TRANSFER_WRITE, 999ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// CPIA2_VP_SYSTEMCTRL_HK_CONTROL | 1000ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox// CPIA2_VP_SYSTEMCTRL_POWER_CONTROL); 1001ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1002ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 1003ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1004ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1005ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1006ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1007ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_match_video_size 1008ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1009ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * return the best match, where 'best' is as always 1010ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * the largest that is not bigger than what is requested. 1011ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1012ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_match_video_size(int width, int height) 1013ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1014ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= STV_IMAGE_VGA_COLS && height >= STV_IMAGE_VGA_ROWS) 1015ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_VGA; 1016ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1017ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= STV_IMAGE_CIF_COLS && height >= STV_IMAGE_CIF_ROWS) 1018ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_CIF; 1019ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1020ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= STV_IMAGE_QVGA_COLS && height >= STV_IMAGE_QVGA_ROWS) 1021ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_QVGA; 1022ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1023ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= 288 && height >= 216) 1024ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_288_216; 1025ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1026ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= 256 && height >= 192) 1027ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_256_192; 1028ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1029ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= 224 && height >= 168) 1030ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_224_168; 1031ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1032ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= 192 && height >= 144) 1033ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_192_144; 1034ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1035ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width >= STV_IMAGE_QCIF_COLS && height >= STV_IMAGE_QCIF_ROWS) 1036ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return VIDEOSIZE_QCIF; 1037ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1038ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -1; 1039ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1040ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1041ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1042ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1043ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * SetVideoSize 1044ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1045ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1046ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int set_vw_size(struct camera_data *cam, int size) 1047ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1048ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval = 0; 1049ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1050ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.video_size = size; 1051ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1052ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (size) { 1053ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_VGA: 1054ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting size to VGA\n"); 1055ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_VGA_COLS; 1056ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_VGA_ROWS; 1057873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = STV_IMAGE_VGA_COLS; 1058873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = STV_IMAGE_VGA_ROWS; 1059ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1060ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_CIF: 1061ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting size to CIF\n"); 1062ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_CIF_COLS; 1063ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_CIF_ROWS; 1064873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = STV_IMAGE_CIF_COLS; 1065873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = STV_IMAGE_CIF_ROWS; 1066ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1067ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_QVGA: 1068ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting size to QVGA\n"); 1069ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_QVGA_COLS; 1070ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_QVGA_ROWS; 1071873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = STV_IMAGE_QVGA_COLS; 1072873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = STV_IMAGE_QVGA_ROWS; 1073ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1074ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_288_216: 1075ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = 288; 1076ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = 216; 1077873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = 288; 1078873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = 216; 1079ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1080ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_256_192: 1081873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = 256; 1082873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = 192; 1083ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = 256; 1084ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = 192; 1085ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1086ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_224_168: 1087873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = 224; 1088873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = 168; 1089ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = 224; 1090ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = 168; 1091ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1092ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_192_144: 1093873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = 192; 1094873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = 144; 1095ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = 192; 1096ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = 144; 1097ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1098ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case VIDEOSIZE_QCIF: 1099ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting size to QCIF\n"); 1100ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_QCIF_COLS; 1101ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_QCIF_ROWS; 1102873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = STV_IMAGE_QCIF_COLS; 1103873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = STV_IMAGE_QCIF_ROWS; 1104ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1105ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1106ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = -EINVAL; 1107ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1108ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 1109ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1110ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1111ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1112ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1113ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * configure_sensor 1114ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1115ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1116ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int configure_sensor(struct camera_data *cam, 1117ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int req_width, int req_height) 1118ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1119ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval; 1120ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1121ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch (cam->params.version.sensor_flags) { 1122ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_404: 1123ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_407: 1124ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_409: 1125ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_410: 1126ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = config_sensor_410(cam, req_width, req_height); 1127ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1128ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_SENSOR_FLAGS_500: 1129ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = config_sensor_500(cam, req_width, req_height); 1130ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1131ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1132ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1133ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1134ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1135ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 1136ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1137ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1138ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1139ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1140ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * config_sensor_410 1141ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1142ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1143ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int config_sensor_410(struct camera_data *cam, 1144ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int req_width, int req_height) 1145ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1146ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 1147ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i = 0; 1148ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int image_size; 1149ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int image_type; 1150ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int width = req_width; 1151ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int height = req_height; 1152ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1153ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 1154ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Make sure size doesn't exceed CIF. 1155ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 1156ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width > STV_IMAGE_CIF_COLS) 1157ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox width = STV_IMAGE_CIF_COLS; 1158ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (height > STV_IMAGE_CIF_ROWS) 1159ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox height = STV_IMAGE_CIF_ROWS; 1160ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1161ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_size = cpia2_match_video_size(width, height); 1162ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1163ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Config 410: width = %d, height = %d\n", width, height); 1164ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Image size returned is %d\n", image_size); 1165ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_size >= 0) { 1166ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_vw_size(cam, image_size); 1167ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox width = cam->params.roi.width; 1168ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox height = cam->params.roi.height; 1169ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1170ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("After set_vw_size(), width = %d, height = %d\n", 1171ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox width, height); 1172ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width <= 176 && height <= 144) { 1173ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("image type = VIDEOSIZE_QCIF\n"); 1174ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_QCIF; 1175ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1176ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (width <= 320 && height <= 240) { 1177ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("image type = VIDEOSIZE_QVGA\n"); 1178ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_QVGA; 1179ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1180ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else { 1181ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("image type = VIDEOSIZE_CIF\n"); 1182ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_CIF; 1183ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1184ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1185ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("ConfigSensor410 failed\n"); 1186ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1187ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1188ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1189ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 1190ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 1191ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1192ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* VC Format */ 1193ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_FORMAT; 1194ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF) { 1195ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1196ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (CPIA2_VC_VC_FORMAT_UFIRST | 1197ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_FORMAT_SHORTLINE); 1198ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1199ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1200ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) CPIA2_VC_VC_FORMAT_UFIRST; 1201ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1202ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1203ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* VC Clocks */ 1204ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_CLOCKS; 1205ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) { 1206ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) { 1207ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value= 1208ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)(CPIA2_VC_VC_672_CLOCKS_CIF_DIV_BY_3 | 1209ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_672_CLOCKS_SCALING | 1210ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV2); 1211ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("VC_Clocks (0xc4) should be B\n"); 1212ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1213ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else { 1214ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value= 1215ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)(CPIA2_VC_VC_676_CLOCKS_CIF_DIV_BY_3 | 1216ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV2); 1217ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1218ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1219ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) { 1220ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1221ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (CPIA2_VC_VC_672_CLOCKS_CIF_DIV_BY_3 | 1222ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV0); 1223ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1224ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else { 1225ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1226ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (CPIA2_VC_VC_676_CLOCKS_CIF_DIV_BY_3 | 1227ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_676_CLOCKS_SCALING | 1228ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV0); 1229ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1230ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1231ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("VC_Clocks (0xc4) = 0x%0X\n", cmd.buffer.registers[i-1].value); 1232ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1233ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Input reqWidth from VC */ 1234ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_IHSIZE_LO; 1235ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1236ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1237ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (STV_IMAGE_QCIF_COLS / 4); 1238ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1239ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1240ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (STV_IMAGE_CIF_COLS / 4); 1241ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1242ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Timings */ 1243ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_HI; 1244ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1245ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1246ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1247ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 1; 1248ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1249ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_LO; 1250ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1251ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 208; 1252ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1253ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 160; 1254ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1255ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_HI; 1256ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1257ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1258ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1259ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 1; 1260ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1261ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_LO; 1262ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1263ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 160; 1264ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1265ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 64; 1266ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1267ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Output Image Size */ 1268ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_OHSIZE; 1269ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = cam->params.roi.width / 4; 1270ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1271ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_OVSIZE; 1272ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = cam->params.roi.height / 4; 1273ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1274ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Cropping */ 1275ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HCROP; 1276ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1277ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1278ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QCIF_COLS / 4) - (width / 4)) / 2); 1279ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1280ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1281ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_CIF_COLS / 4) - (width / 4)) / 2); 1282ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1283ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VCROP; 1284ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1285ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1286ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QCIF_ROWS / 4) - (height / 4)) / 2); 1287ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1288ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1289ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_CIF_ROWS / 4) - (height / 4)) / 2); 1290ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1291ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Scaling registers (defaults) */ 1292ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HPHASE; 1293ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1294ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1295ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VPHASE; 1296ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1297ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1298ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HISPAN; 1299ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 31; 1300ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1301ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VISPAN; 1302ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 31; 1303ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1304ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HICROP; 1305ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1306ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1307ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VICROP; 1308ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1309ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1310ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HFRACT; 1311ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x81; /* = 8/1 = 8 (HIBYTE/LOBYTE) */ 1312ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1313ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VFRACT; 1314ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x81; /* = 8/1 = 8 (HIBYTE/LOBYTE) */ 1315ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1316ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = i; 1317ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1318ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1319ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1320ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return i; 1321ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1322ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1323ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1324ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1325ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1326ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * config_sensor_500(cam) 1327ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1328ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1329ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxstatic int config_sensor_500(struct camera_data *cam, 1330ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int req_width, int req_height) 1331ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1332ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 1333ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i = 0; 1334ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int image_size = VIDEOSIZE_CIF; 1335ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int image_type = VIDEOSIZE_VGA; 1336ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int width = req_width; 1337ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int height = req_height; 1338ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned int device = cam->params.pnp_id.device_type; 1339ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1340ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_size = cpia2_match_video_size(width, height); 1341ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1342ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (width > STV_IMAGE_CIF_COLS || height > STV_IMAGE_CIF_ROWS) 1343ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_VGA; 1344ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (width > STV_IMAGE_QVGA_COLS || height > STV_IMAGE_QVGA_ROWS) 1345ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_CIF; 1346ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (width > STV_IMAGE_QCIF_COLS || height > STV_IMAGE_QCIF_ROWS) 1347ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_QVGA; 1348ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1349ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_type = VIDEOSIZE_QCIF; 1350ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1351ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_size >= 0) { 1352ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_vw_size(cam, image_size); 1353ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox width = cam->params.roi.width; 1354ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox height = cam->params.roi.height; 1355ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1356ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("ConfigSensor500 failed\n"); 1357ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1358ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1359ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1360ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("image_size = %d, width = %d, height = %d, type = %d\n", 1361ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox image_size, width, height, image_type); 1362ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1363ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; 1364ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 1365ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox i = 0; 1366ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1367ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* VC Format */ 1368ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_FORMAT; 1369ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = (u8) CPIA2_VC_VC_FORMAT_UFIRST; 1370ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1371ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value |= (u8) CPIA2_VC_VC_FORMAT_DECIMATING; 1372ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox i++; 1373ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1374ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* VC Clocks */ 1375ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_CLOCKS; 1376ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (device == DEVICE_STV_672) { 1377ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1378ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1379ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)CPIA2_VC_VC_CLOCKS_LOGDIV1; 1380ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1381ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1382ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)(CPIA2_VC_VC_672_CLOCKS_SCALING | 1383ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV3); 1384ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1385ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1386ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1387ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)CPIA2_VC_VC_CLOCKS_LOGDIV0; 1388ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1389ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1390ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8)(CPIA2_VC_VC_676_CLOCKS_SCALING | 1391ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_VC_CLOCKS_LOGDIV2); 1392ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1393ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox i++; 1394ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1395ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("VC_CLOCKS = 0x%X\n", cmd.buffer.registers[i-1].value); 1396ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1397ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Input width from VP */ 1398ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_IHSIZE_LO; 1399ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1400ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1401ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (STV_IMAGE_VGA_COLS / 4); 1402ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1403ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].value = 1404ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (STV_IMAGE_QVGA_COLS / 4); 1405ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox i++; 1406ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Input width = %d\n", cmd.buffer.registers[i-1].value); 1407ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1408ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Timings */ 1409ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_HI; 1410ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1411ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 2; 1412ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1413ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 1; 1414ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1415ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_LO; 1416ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1417ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 250; 1418ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_QVGA) 1419ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 125; 1420ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1421ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 160; 1422ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1423ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_HI; 1424ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1425ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 2; 1426ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1427ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 1; 1428ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1429ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_LO; 1430ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1431ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 12; 1432ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_QVGA) 1433ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 64; 1434ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1435ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 6; 1436ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1437ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Output Image Size */ 1438ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_OHSIZE; 1439ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1440ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = STV_IMAGE_CIF_COLS / 4; 1441ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1442ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = width / 4; 1443ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1444ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_OVSIZE; 1445ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_QCIF) 1446ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = STV_IMAGE_CIF_ROWS / 4; 1447ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1448ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = height / 4; 1449ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1450ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Cropping */ 1451ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HCROP; 1452ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1453ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1454ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_VGA_COLS / 4) - (width / 4)) / 2); 1455ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_QVGA) 1456ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1457ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QVGA_COLS / 4) - (width / 4)) / 2); 1458ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_CIF) 1459ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1460ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_CIF_COLS / 4) - (width / 4)) / 2); 1461ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else /*if (image_type == VIDEOSIZE_QCIF)*/ 1462ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1463ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QCIF_COLS / 4) - (width / 4)) / 2); 1464ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1465ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VCROP; 1466ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_VGA) 1467ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1468ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_VGA_ROWS / 4) - (height / 4)) / 2); 1469ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_QVGA) 1470ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1471ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QVGA_ROWS / 4) - (height / 4)) / 2); 1472ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else if (image_type == VIDEOSIZE_CIF) 1473ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1474ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_CIF_ROWS / 4) - (height / 4)) / 2); 1475ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else /*if (image_type == VIDEOSIZE_QCIF)*/ 1476ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = 1477ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (u8) (((STV_IMAGE_QCIF_ROWS / 4) - (height / 4)) / 2); 1478ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1479ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Scaling registers (defaults) */ 1480ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HPHASE; 1481ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1482ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 36; 1483ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1484ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1485ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1486ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VPHASE; 1487ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1488ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 32; 1489ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1490ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1491ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1492ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HISPAN; 1493ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1494ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 26; 1495ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1496ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 31; 1497ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1498ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VISPAN; 1499ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1500ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 21; 1501ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1502ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 31; 1503ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1504ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HICROP; 1505ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1506ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1507ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VICROP; 1508ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0; 1509ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1510ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_HFRACT; 1511ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1512ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x2B; /* 2/11 */ 1513ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1514ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x81; /* 8/1 */ 1515ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1516ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i].index = CPIA2_VC_VC_VFRACT; 1517ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) 1518ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x13; /* 1/3 */ 1519ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1520ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.registers[i++].value = (u8) 0x81; /* 8/1 */ 1521ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1522ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = i; 1523ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1524ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1525ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1526ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return i; 1527ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1528ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1529ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1530ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1531ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1532ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * setallproperties 1533ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1534ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * This sets all user changeable properties to the values in cam->params. 1535ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1536d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic int set_all_properties(struct camera_data *cam) 1537ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1538ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /** 1539ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Don't set target_kb here, it will be set later. 1540ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * framerate and user_mode were already set (set_default_user_mode). 1541ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox **/ 1542ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1543ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_change_streaming_alternate(cam, 1544ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.stream_mode); 1545ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1546ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, 1547ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, 1548ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, cam->params.vp_params.gpio_direction); 1549ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DATA, TRANSFER_WRITE, 1550ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_data); 1551ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 15526c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil v4l2_ctrl_handler_setup(&cam->hdl); 15536c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil 1554ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox wake_system(cam); 1555ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1556ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox set_lowlight_boost(cam); 1557ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1558ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 1559ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1560ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1561ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1562ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1563ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_save_camera_state 1564ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1565ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1566ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_save_camera_state(struct camera_data *cam) 1567ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1568ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0); 1569ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION, TRANSFER_READ, 1570ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 0); 1571ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_VC_MP_GPIO_DATA, TRANSFER_READ, 0); 1572ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Don't get framerate or target_kb. Trust the values we already have */ 1573ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1574ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1575ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1576ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1577ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1578ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_flicker_mode 1579ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1580ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1581ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_flicker_mode(struct camera_data *cam, int mode) 1582ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1583ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char cam_reg; 1584ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int err = 0; 1585ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1586ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.pnp_id.device_type != DEVICE_STV_672) 1587ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1588ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1589ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the appropriate bits in FLICKER_MODES, preserving the rest */ 1590ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_GET_FLICKER_MODES, 1591ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_READ, 0))) 1592ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1593ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg = cam->params.flicker_control.cam_register; 1594ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1595ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch(mode) { 1596ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case NEVER_FLICKER: 1597ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; 1598ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_FLICKER_MODES_50HZ; 1599ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1600ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case FLICKER_60: 1601ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; 1602ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_FLICKER_MODES_50HZ; 1603ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1604ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case FLICKER_50: 1605ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; 1606ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_FLICKER_MODES_50HZ; 1607ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1608ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1609ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1610ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1611ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1612ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_SET_FLICKER_MODES, 1613ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, cam_reg))) 1614ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1615ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1616ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the appropriate bits in EXP_MODES, preserving the rest */ 1617ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_GET_VP_EXP_MODES, 1618ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_READ, 0))) 1619ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1620ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg = cam->params.vp_params.exposure_modes; 1621ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1622ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (mode == NEVER_FLICKER) { 1623ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_EXPOSURE_MODES_INHIBIT_FLICKER; 1624ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1625ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_EXPOSURE_MODES_INHIBIT_FLICKER; 1626ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1627ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1628ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_SET_VP_EXP_MODES, 1629ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, cam_reg))) 1630ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1631ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1632ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if((err = cpia2_do_command(cam, CPIA2_CMD_REHASH_VP4, 1633ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 1))) 1634ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1635ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1636ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch(mode) { 1637ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case NEVER_FLICKER: 1638ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case FLICKER_60: 1639ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case FLICKER_50: 1640ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.flicker_mode_req = mode; 1641ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1642ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1643ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox err = -EINVAL; 1644ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1645ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1646ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return err; 1647ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1648ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1649ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1650ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1651ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_property_flip 1652ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1653ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1654ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_property_flip(struct camera_data *cam, int prop_val) 1655ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1656ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char cam_reg; 1657ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1658ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0); 1659ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg = cam->params.vp_params.user_effects; 1660ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1661ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (prop_val) 1662ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox { 1663ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_USER_EFFECTS_FLIP; 1664ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1665ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1666ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox { 1667ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_USER_EFFECTS_FLIP; 1668ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 16696c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil cam->params.vp_params.user_effects = cam_reg; 1670ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE, 1671ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg); 1672ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1673ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1674ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1675ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1676ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_property_mirror 1677ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1678ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1679ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_property_mirror(struct camera_data *cam, int prop_val) 1680ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1681ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned char cam_reg; 1682ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1683ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0); 1684ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg = cam->params.vp_params.user_effects; 1685ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1686ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (prop_val) 1687ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox { 1688ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg |= CPIA2_VP_USER_EFFECTS_MIRROR; 1689ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1690ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 1691ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox { 1692ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg &= ~CPIA2_VP_USER_EFFECTS_MIRROR; 1693ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 16946c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil cam->params.vp_params.user_effects = cam_reg; 1695ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE, 1696ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam_reg); 1697ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1698ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1699ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1700ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1701ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_gpio 1702ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1703ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1704ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_gpio(struct camera_data *cam, unsigned char setting) 1705ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1706ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int ret; 1707ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1708ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set the microport direction (register 0x90, should be defined 1709ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * already) to 1 (user output), and set the microport data (0x91) to 1710ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * the value in the ioctl argument. 1711ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox */ 1712ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1713ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ret = cpia2_do_command(cam, 1714ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, 1715ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_MP_DIR_OUTPUT, 1716ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 255); 1717ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (ret < 0) 1718ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return ret; 1719ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_direction = 255; 1720ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1721ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ret = cpia2_do_command(cam, 1722ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_SET_VC_MP_GPIO_DATA, 1723ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VC_MP_DIR_OUTPUT, 1724ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox setting); 1725ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (ret < 0) 1726ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return ret; 1727ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_data = setting; 1728ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1729ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 1730ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1731ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1732ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1733ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1734ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_fps 1735ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1736ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1737ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_set_fps(struct camera_data *cam, int framerate) 1738ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1739ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int retval; 1740ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1741ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox switch(framerate) { 1742ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_30: 1743ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_25: 1744ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.pnp_id.device_type == DEVICE_STV_672 && 1745ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags == 1746ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_VP_SENSOR_FLAGS_500) { 1747ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1748ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1749ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Fall through */ 1750ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_15: 1751ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_12_5: 1752ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_7_5: 1753ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox case CPIA2_VP_FRAMERATE_6_25: 1754ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox break; 1755ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox default: 1756ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 1757ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1758ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1759ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672 && 1760ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox framerate == CPIA2_VP_FRAMERATE_15) 1761ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox framerate = 0; /* Work around bug in VP4 */ 1762ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1763ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox retval = cpia2_do_command(cam, 1764ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox CPIA2_CMD_FRAMERATE_REQ, 1765ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 1766ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox framerate); 1767ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1768ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(retval == 0) 1769ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.frame_rate = framerate; 1770ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1771ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return retval; 1772ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1773ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1774ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1775ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1776ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_brightness 1777ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1778ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1779ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_brightness(struct camera_data *cam, unsigned char value) 1780ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1781ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 1782ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Don't let the register be set to zero - bug in VP4 - flash of full 1783ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * brightness 1784ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 1785ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672 && value == 0) 1786ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox value++; 1787ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting brightness to %d (0x%0x)\n", value, value); 17886c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil cpia2_do_command(cam, CPIA2_CMD_SET_VP_BRIGHTNESS, TRANSFER_WRITE, value); 1789ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1790ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1791ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1792ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1793ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_contrast 1794ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1795ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1796ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_contrast(struct camera_data *cam, unsigned char value) 1797ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1798ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting contrast to %d (0x%0x)\n", value, value); 1799ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_CONTRAST, TRANSFER_WRITE, value); 1800ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1801ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1802ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1803ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1804ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_saturation 1805ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1806ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1807ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_saturation(struct camera_data *cam, unsigned char value) 1808ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1809ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Setting saturation to %d (0x%0x)\n", value, value); 1810ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam,CPIA2_CMD_SET_VP_SATURATION, TRANSFER_WRITE,value); 1811ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1812ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1813ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1814ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1815ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * wake_system 1816ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1817ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1818d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic void wake_system(struct camera_data *cam) 1819ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1820ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_WAKEUP, TRANSFER_WRITE, 0); 1821ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1822ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1823ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1824ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1825ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * set_lowlight_boost 1826ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1827ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Valid for STV500 sensor only 1828ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1829d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic void set_lowlight_boost(struct camera_data *cam) 1830ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1831ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 1832ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1833ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type != DEVICE_STV_672 || 1834ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.sensor_flags != CPIA2_VP_SENSOR_FLAGS_500) 1835ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return; 1836ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1837ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_WRITE; 1838ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 1839ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 3; 1840ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_RAM_ADDR_H; 1841ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1842ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = 0; /* High byte of address to write to */ 1843ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1] = 0x59; /* Low byte of address to write to */ 1844ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2] = 0; /* High byte of data to write */ 1845ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1846ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1847ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1848ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.vp_params.lowlight_boost) { 1849ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = 0x02; /* Low byte data to write */ 1850ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 1851ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0] = 0x06; 1852ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 1853ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP_RAM_DATA; 1854ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 1855ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1856ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1857ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Rehash the VP4 values */ 1858ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_REHASH_VP4, TRANSFER_WRITE, 1); 1859ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1860ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1861ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1862ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1863ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_set_format 1864ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1865ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Assumes that new size is already set in param struct. 1866ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1867ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_set_format(struct camera_data *cam) 1868ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1869ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->flush = true; 1870ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1871ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_pause(cam); 1872ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1873ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* reset camera to new size */ 1874ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_low_power(cam); 1875ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_reset_camera(cam); 1876ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->flush = false; 1877ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1878ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_dbg_dump_registers(cam); 1879ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1880ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_resume(cam); 1881ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 1882ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1883ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 1884ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1885ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_dbg_dump_registers 1886ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 1887ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 1888ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_dbg_dump_registers(struct camera_data *cam) 1889ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 1890ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#ifdef _CPIA2_DEBUG_ 1891ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct cpia2_command cmd; 1892ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1893ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!(debugs_on & DEBUG_DUMP_REGS)) 1894ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return; 1895ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1896ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.direction = TRANSFER_READ; 1897ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1898ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Start with bank 0 (SYSTEM) */ 1899ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; 1900ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 3; 1901ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0; 1902ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1903ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "System Device Hi = 0x%X\n", 1904ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1905ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "System Device Lo = 0x%X\n", 1906ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 1907ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "System_system control = 0x%X\n", 1908ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 1909ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1910ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Bank 1 (VC) */ 1911ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; 1912ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 4; 1913ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x80; 1914ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1915ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "ASIC_ID = 0x%X\n", 1916ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1917ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "ASIC_REV = 0x%X\n", 1918ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 1919ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "PW_CONTRL = 0x%X\n", 1920ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 1921ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "WAKEUP = 0x%X\n", 1922ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 1923ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1924ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xA0; /* ST_CTRL */ 1925ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 1926ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1927ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "Stream ctrl = 0x%X\n", 1928ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1929ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1930ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xA4; /* Stream status */ 1931ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1932ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "Stream status = 0x%X\n", 1933ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1934ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1935ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xA8; /* USB status */ 1936ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 3; 1937ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1938ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "USB_CTRL = 0x%X\n", 1939ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1940ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "USB_STRM = 0x%X\n", 1941ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 1942ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "USB_STATUS = 0x%X\n", 1943ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 1944ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1945ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xAF; /* USB settings */ 1946ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 1947ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1948ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "USB settings = 0x%X\n", 1949ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1950ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 1951ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0xC0; /* VC stuff */ 1952ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 26; 1953ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 1954ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Control = 0x%0X\n", 1955ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 1956ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Format = 0x%0X\n", 1957ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 1958ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Clocks = 0x%0X\n", 1959ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[4]); 1960ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC IHSize = 0x%0X\n", 1961ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]); 1962ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Xlim Hi = 0x%0X\n", 1963ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[6]); 1964ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC XLim Lo = 0x%0X\n", 1965ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[7]); 1966ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC YLim Hi = 0x%0X\n", 1967ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[8]); 1968ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC YLim Lo = 0x%0X\n", 1969ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[9]); 1970ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC OHSize = 0x%0X\n", 1971ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[10]); 1972ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC OVSize = 0x%0X\n", 1973ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[11]); 1974ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HCrop = 0x%0X\n", 1975ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[12]); 1976ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC VCrop = 0x%0X\n", 1977ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[13]); 1978ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HPhase = 0x%0X\n", 1979ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[14]); 1980ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC VPhase = 0x%0X\n", 1981ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[15]); 1982ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HIspan = 0x%0X\n", 1983ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[16]); 1984ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC VIspan = 0x%0X\n", 1985ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[17]); 1986ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HiCrop = 0x%0X\n", 1987ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[18]); 1988ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC ViCrop = 0x%0X\n", 1989ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[19]); 1990ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC HiFract = 0x%0X\n", 1991ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[20]); 1992ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC ViFract = 0x%0X\n", 1993ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[21]); 1994ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC JPeg Opt = 0x%0X\n", 1995ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[22]); 1996ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Creep Per = 0x%0X\n", 1997ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[23]); 1998ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC User Sq. = 0x%0X\n", 1999ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[24]); 2000ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VC Target KB = 0x%0X\n", 2001ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[25]); 2002ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2003ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** VP ***/ 2004ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; 2005ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 14; 2006ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0; 2007ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2008ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2009ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Dev Hi = 0x%0X\n", 2010ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2011ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Dev Lo = 0x%0X\n", 2012ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2013ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Sys State = 0x%0X\n", 2014ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 2015ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Sys Ctrl = 0x%0X\n", 2016ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 2017ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Sensor flg = 0x%0X\n", 2018ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]); 2019ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Sensor Rev = 0x%0X\n", 2020ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[6]); 2021ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Dev Config = 0x%0X\n", 2022ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[7]); 2023ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP GPIO_DIR = 0x%0X\n", 2024ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[8]); 2025ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP GPIO_DATA = 0x%0X\n", 2026ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[9]); 2027ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Ram ADDR H = 0x%0X\n", 2028ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[10]); 2029ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Ram ADDR L = 0x%0X\n", 2030ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[11]); 2031ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP RAM Data = 0x%0X\n", 2032ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[12]); 2033ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "Do Call = 0x%0X\n", 2034ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[13]); 2035ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2036ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.pnp_id.device_type == DEVICE_STV_672) { 2037ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 9; 2038ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x0E; 2039ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2040ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Clock Ctrl = 0x%0X\n", 2041ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2042ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Patch Rev = 0x%0X\n", 2043ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2044ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Vid Mode = 0x%0X\n", 2045ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 2046ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Framerate = 0x%0X\n", 2047ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 2048ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP UserEffect = 0x%0X\n", 2049ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[4]); 2050ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP White Bal = 0x%0X\n", 2051ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]); 2052ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP WB thresh = 0x%0X\n", 2053ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[6]); 2054ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Exp Modes = 0x%0X\n", 2055ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[7]); 2056ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Exp Target = 0x%0X\n", 2057ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[8]); 2058ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2059ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 2060ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x1B; 2061ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2062ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP FlickerMds = 0x%0X\n", 2063ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2064ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 2065ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 8 ; 2066ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x0E; 2067ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2068ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Clock Ctrl = 0x%0X\n", 2069ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2070ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Patch Rev = 0x%0X\n", 2071ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2072ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Vid Mode = 0x%0X\n", 2073ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[5]); 2074ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP Framerate = 0x%0X\n", 2075ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[6]); 2076ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP UserEffect = 0x%0X\n", 2077ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[7]); 2078ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2079ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 1; 2080ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = CPIA2_VP5_EXPOSURE_TARGET; 2081ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2082ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 Exp Target= 0x%0X\n", 2083ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2084ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2085ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.reg_count = 4; 2086ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.start = 0x3A; 2087ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_send_command(cam, &cmd); 2088ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 MY Black = 0x%0X\n", 2089ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[0]); 2090ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 MCY Range = 0x%0X\n", 2091ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[1]); 2092ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 MYCEILING = 0x%0X\n", 2093ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[2]); 2094ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox printk(KERN_DEBUG "VP5 MCUV Sat = 0x%0X\n", 2095ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cmd.buffer.block_data[3]); 2096ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2097ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox#endif 2098ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2099ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2100ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2101ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2102ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * reset_camera_struct 2103ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2104ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Sets all values to the defaults 2105ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2106d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuilstatic void reset_camera_struct(struct camera_data *cam) 2107ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2108ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 2109ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * The following parameter values are the defaults from the register map. 2110ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 2111ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.lowlight_boost = 0; 2112ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2113ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* FlickerModes */ 2114ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.flicker_control.flicker_mode_req = NEVER_FLICKER; 2115ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2116ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* jpeg params */ 2117ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.compression.jpeg_options = CPIA2_VC_VC_JPEG_OPT_DEFAULT; 2118ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.compression.creep_period = 2; 2119ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.compression.user_squeeze = 20; 2120ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.compression.inhibit_htables = false; 2121ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2122ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* gpio params */ 2123ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_direction = 0; /* write, the default safe mode */ 2124ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.gpio_data = 0; 2125ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2126ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Target kb params */ 21276c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil cam->params.vc_params.quality = 100; 2128ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2129ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 2130ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Set Sensor FPS as fast as possible. 2131ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 2132ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.pnp_id.device_type == DEVICE_STV_672) { 2133ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->params.version.sensor_flags == CPIA2_VP_SENSOR_FLAGS_500) 2134ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_15; 2135ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 2136ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_30; 2137ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 2138ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.vp_params.frame_rate = CPIA2_VP_FRAMERATE_30; 2139ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2140ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2141ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /*** 2142ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Set default video mode as large as possible : 2143ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * for vga sensor set to vga, for cif sensor set to CIF. 2144ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ***/ 2145ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.version.sensor_flags == CPIA2_VP_SENSOR_FLAGS_500) { 2146ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->sensor_type = CPIA2_SENSOR_500; 2147ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->video_size = VIDEOSIZE_VGA; 2148ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_VGA_COLS; 2149ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_VGA_ROWS; 2150ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } else { 2151ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->sensor_type = CPIA2_SENSOR_410; 2152ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->video_size = VIDEOSIZE_CIF; 2153ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.width = STV_IMAGE_CIF_COLS; 2154ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.roi.height = STV_IMAGE_CIF_ROWS; 2155ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2156ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2157873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->width = cam->params.roi.width; 2158873ecd8f8f5eed877df74e54e7c20aee9ef887e5Hans Verkuil cam->height = cam->params.roi.height; 2159ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2160ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2161ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2162ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2163ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_init_camera_struct 2164ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2165ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Initializes camera struct, does not call reset to fill in defaults. 2166ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 21676c493f8b28c6744995e92801a20dca192635dd22Hans Verkuilstruct camera_data *cpia2_init_camera_struct(struct usb_interface *intf) 2168ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2169ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct camera_data *cam; 2170ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2171dd00cc486ab1c17049a535413d1751ef3482141cYoann Padioleau cam = kzalloc(sizeof(*cam), GFP_KERNEL); 2172ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2173ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!cam) { 2174ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("couldn't kmalloc cpia2 struct\n"); 2175ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return NULL; 2176ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2177ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 21786c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil cam->v4l2_dev.release = cpia2_camera_release; 21796c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil if (v4l2_device_register(&intf->dev, &cam->v4l2_dev) < 0) { 21806c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil v4l2_err(&cam->v4l2_dev, "couldn't register v4l2_device\n"); 21816c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil kfree(cam); 21826c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil return NULL; 21836c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil } 2184ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2185d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil mutex_init(&cam->v4l2_lock); 2186ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox init_waitqueue_head(&cam->wq_stream); 2187ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2188ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return cam; 2189ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2190ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2191ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2192ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2193ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_init_camera 2194ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2195ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * Initializes camera. 2196ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2197ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_init_camera(struct camera_data *cam) 2198ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2199ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("Start\n"); 2200ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2201ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->mmapped = false; 2202ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2203ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Get sensor and asic types before reset. */ 2204ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_high_power(cam); 2205ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_get_version_info(cam); 2206ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (cam->params.version.asic_id != CPIA2_ASIC_672) { 2207ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("Device IO error (asicID has incorrect value of 0x%X\n", 2208ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.version.asic_id); 2209ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENODEV; 2210ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2211ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2212ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Set GPIO direction and data to a safe state. */ 2213ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, 2214ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 0); 2215ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DATA, 2216ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox TRANSFER_WRITE, 0); 2217ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2218ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* resetting struct requires version info for sensor and asic types */ 2219ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox reset_camera_struct(cam); 2220ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2221ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_set_low_power(cam); 2222ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2223ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("End\n"); 2224ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2225ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2226ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2227ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2228ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2229ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2230ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_allocate_buffers 2231ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2232ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2233ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_allocate_buffers(struct camera_data *cam) 2234ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2235ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox int i; 2236ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2237ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(!cam->buffers) { 2238ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox u32 size = cam->num_frames*sizeof(struct framebuf); 2239ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers = kmalloc(size, GFP_KERNEL); 2240ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(!cam->buffers) { 2241ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("couldn't kmalloc frame buffer structures\n"); 2242ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENOMEM; 2243ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2244ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2245ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2246ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(!cam->frame_buffer) { 2247ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->frame_buffer = rvmalloc(cam->frame_size*cam->num_frames); 2248ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!cam->frame_buffer) { 2249ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox ERR("couldn't vmalloc frame buffer data area\n"); 2250ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox kfree(cam->buffers); 2251ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers = NULL; 2252ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENOMEM; 2253ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2254ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2255ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2256ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox for(i=0; i<cam->num_frames-1; ++i) { 2257ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].next = &cam->buffers[i+1]; 2258ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].data = cam->frame_buffer +i*cam->frame_size; 2259ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].status = FRAME_EMPTY; 2260ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].length = 0; 2261ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].max_length = 0; 2262ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].num = i; 2263ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2264ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].next = cam->buffers; 2265ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].data = cam->frame_buffer +i*cam->frame_size; 2266ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].status = FRAME_EMPTY; 2267ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].length = 0; 2268ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].max_length = 0; 2269ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers[i].num = i; 2270ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->curbuff = cam->buffers; 2271ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->workbuff = cam->curbuff->next; 2272ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("buffers=%p, curbuff=%p, workbuff=%p\n", cam->buffers, cam->curbuff, 2273ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->workbuff); 2274ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2275ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2276ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2277ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2278ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2279ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_free_buffers 2280ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2281ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2282ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxvoid cpia2_free_buffers(struct camera_data *cam) 2283ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2284ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->buffers) { 2285ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox kfree(cam->buffers); 2286ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->buffers = NULL; 2287ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2288ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if(cam->frame_buffer) { 2289ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox rvfree(cam->frame_buffer, cam->frame_size*cam->num_frames); 2290ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->frame_buffer = NULL; 2291ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2292ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2293ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2294ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2295ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2296ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_read 2297ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2298ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2299ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxlong cpia2_read(struct camera_data *cam, 2300ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox char __user *buf, unsigned long count, int noblock) 2301ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2302ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox struct framebuf *frame; 2303d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil 2304d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (!count) 2305ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2306ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2307ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!buf) { 230894205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison ERR("%s: buffer NULL\n",__func__); 2309ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 2310ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2311ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2312ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (!cam) { 231394205c7a48b637ae60bd69ac4cc16743a6dddd09Harvey Harrison ERR("%s: Internal error, camera_data NULL!\n",__func__); 2314ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 2315ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2316ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2317d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (!cam->streaming) { 2318ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Start streaming */ 2319ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_start(cam, 2320ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.stream_mode); 2321ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2322ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2323ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Copy cam->curbuff in case it changes while we're processing */ 2324ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame = cam->curbuff; 2325ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (noblock && frame->status != FRAME_READY) { 2326ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EAGAIN; 2327ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2328ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2329d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (frame->status != FRAME_READY) { 2330d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil mutex_unlock(&cam->v4l2_lock); 2331ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox wait_event_interruptible(cam->wq_stream, 23326c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil !video_is_registered(&cam->vdev) || 2333ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (frame = cam->curbuff)->status == FRAME_READY); 2334d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil mutex_lock(&cam->v4l2_lock); 2335ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (signal_pending(current)) 2336ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ERESTARTSYS; 23376c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil if (!video_is_registered(&cam->vdev)) 2338ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2339ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2340ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2341ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* copy data to user space */ 2342d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (frame->length > count) 2343ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EFAULT; 2344d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (copy_to_user(buf, frame->data, frame->length)) 2345ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EFAULT; 2346ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2347ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox count = frame->length; 2348ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2349ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox frame->status = FRAME_EMPTY; 2350ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2351ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return count; 2352ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2353ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2354ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2355ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2356ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_poll 2357ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2358ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2359ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxunsigned int cpia2_poll(struct camera_data *cam, struct file *filp, 2360ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox poll_table *wait) 2361ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 23626c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil unsigned int status = v4l2_ctrl_poll(filp, wait); 2363ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 23646c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil if ((poll_requested_events(wait) & (POLLIN | POLLRDNORM)) && 23656c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil !cam->streaming) { 2366ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox /* Start streaming */ 2367ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cpia2_usb_stream_start(cam, 2368ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->params.camera_state.stream_mode); 2369ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2370ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2371ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox poll_wait(filp, &cam->wq_stream, wait); 2372ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 23736c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil if (cam->curbuff->status == FRAME_READY) 23746c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil status |= POLLIN | POLLRDNORM; 2375ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2376ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return status; 2377ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2378ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2379ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox/****************************************************************************** 2380ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2381ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * cpia2_remap_buffer 2382ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox * 2383ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox *****************************************************************************/ 2384ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Coxint cpia2_remap_buffer(struct camera_data *cam, struct vm_area_struct *vma) 2385ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox{ 2386ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox const char *adr = (const char *)vma->vm_start; 2387ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long size = vma->vm_end-vma->vm_start; 2388ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long start_offset = vma->vm_pgoff << PAGE_SHIFT; 2389ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long start = (unsigned long) adr; 2390ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox unsigned long page, pos; 2391ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2392ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox DBG("mmap offset:%ld size:%ld\n", start_offset, size); 2393ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 23946c493f8b28c6744995e92801a20dca192635dd22Hans Verkuil if (!video_is_registered(&cam->vdev)) 2395ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -ENODEV; 2396ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2397ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (size > cam->frame_size*cam->num_frames || 2398ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox (start_offset % cam->frame_size) != 0 || 2399d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil (start_offset+size > cam->frame_size*cam->num_frames)) 2400ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EINVAL; 2401ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2402ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox pos = ((unsigned long) (cam->frame_buffer)) + start_offset; 2403ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox while (size > 0) { 2404ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox page = kvirt_to_pa(pos); 2405d2db8fee0d77f43f64e4e97ccc1558a9f59fab41Hans Verkuil if (remap_pfn_range(vma, start, page >> PAGE_SHIFT, PAGE_SIZE, PAGE_SHARED)) 2406ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return -EAGAIN; 2407ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox start += PAGE_SIZE; 2408ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox pos += PAGE_SIZE; 2409ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox if (size > PAGE_SIZE) 2410ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox size -= PAGE_SIZE; 2411ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox else 2412ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox size = 0; 2413ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox } 2414ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox 2415ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox cam->mmapped = true; 2416ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox return 0; 2417ab33d5071de7a33616842882c11b5eb52a6c26a1Alan Cox} 2418