1/*************************************************************************** 2 * API for image sensors connected to ET61X[12]51 PC Camera Controllers * 3 * * 4 * Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> * 5 * * 6 * This program is free software; you can redistribute it and/or modify * 7 * it under the terms of the GNU General Public License as published by * 8 * the Free Software Foundation; either version 2 of the License, or * 9 * (at your option) any later version. * 10 * * 11 * This program is distributed in the hope that it will be useful, * 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 14 * GNU General Public License for more details. * 15 * * 16 * You should have received a copy of the GNU General Public License * 17 * along with this program; if not, write to the Free Software * 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * 19 ***************************************************************************/ 20 21#ifndef _ET61X251_SENSOR_H_ 22#define _ET61X251_SENSOR_H_ 23 24#include <linux/usb.h> 25#include <linux/videodev2.h> 26#include <linux/device.h> 27#include <linux/stddef.h> 28#include <linux/errno.h> 29#include <asm/types.h> 30 31struct et61x251_device; 32struct et61x251_sensor; 33 34/*****************************************************************************/ 35 36extern int et61x251_probe_tas5130d1b(struct et61x251_device* cam); 37 38#define ET61X251_SENSOR_TABLE \ 39/* Weak detections must go at the end of the list */ \ 40static int (*et61x251_sensor_table[])(struct et61x251_device*) = { \ 41 &et61x251_probe_tas5130d1b, \ 42 NULL, \ 43}; 44 45extern struct et61x251_device* 46et61x251_match_id(struct et61x251_device* cam, const struct usb_device_id *id); 47 48extern void 49et61x251_attach_sensor(struct et61x251_device* cam, 50 const struct et61x251_sensor* sensor); 51 52/*****************************************************************************/ 53 54extern int et61x251_write_reg(struct et61x251_device*, u8 value, u16 index); 55extern int et61x251_i2c_raw_write(struct et61x251_device*, u8 n, u8 data1, 56 u8 data2, u8 data3, u8 data4, u8 data5, 57 u8 data6, u8 data7, u8 data8, u8 address); 58 59/*****************************************************************************/ 60 61enum et61x251_i2c_sysfs_ops { 62 ET61X251_I2C_READ = 0x01, 63 ET61X251_I2C_WRITE = 0x02, 64}; 65 66enum et61x251_i2c_interface { 67 ET61X251_I2C_2WIRES, 68 ET61X251_I2C_3WIRES, 69}; 70 71/* Repeat start condition when RSTA is high */ 72enum et61x251_i2c_rsta { 73 ET61X251_I2C_RSTA_STOP = 0x00, /* stop then start */ 74 ET61X251_I2C_RSTA_REPEAT = 0x01, /* repeat start */ 75}; 76 77#define ET61X251_MAX_CTRLS (V4L2_CID_LASTP1-V4L2_CID_BASE+10) 78 79struct et61x251_sensor { 80 char name[32]; 81 82 enum et61x251_i2c_sysfs_ops sysfs_ops; 83 84 enum et61x251_i2c_interface interface; 85 u8 i2c_slave_id; 86 enum et61x251_i2c_rsta rsta; 87 struct v4l2_rect active_pixel; /* left and top define FVSX and FVSY */ 88 89 struct v4l2_queryctrl qctrl[ET61X251_MAX_CTRLS]; 90 struct v4l2_cropcap cropcap; 91 struct v4l2_pix_format pix_format; 92 93 int (*init)(struct et61x251_device* cam); 94 int (*get_ctrl)(struct et61x251_device* cam, 95 struct v4l2_control* ctrl); 96 int (*set_ctrl)(struct et61x251_device* cam, 97 const struct v4l2_control* ctrl); 98 int (*set_crop)(struct et61x251_device* cam, 99 const struct v4l2_rect* rect); 100 int (*set_pix_format)(struct et61x251_device* cam, 101 const struct v4l2_pix_format* pix); 102 103 /* Private */ 104 struct v4l2_queryctrl _qctrl[ET61X251_MAX_CTRLS]; 105 struct v4l2_rect _rect; 106}; 107 108#endif /* _ET61X251_SENSOR_H_ */ 109