1a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/* 2cb7a01ac324bf2ee2c666f37ac867e4135f9785aMauro Carvalho Chehab * drivers/media/i2c/tcm825x.h 3a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * 4a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * Register definitions for the TCM825X CameraChip. 5a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * 6a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * Author: David Cohen (david.cohen@indt.org.br) 7a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * 8a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * This file is licensed under the terms of the GNU General Public License 9a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * version 2. This program is licensed "as is" without any warranty of any 10a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * kind, whether express or implied. 11a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * 12a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * This file was based on ov9640.h from MontaVista 13a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus */ 14a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 15a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#ifndef TCM825X_H 16a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_H 17a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 18a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#include <linux/videodev2.h> 19a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 20a03636cb21af1d22a894a5a863b2ba3c3687da63Hans Verkuil#include "v4l2-int-device.h" 21a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 22a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_NAME "tcm825x" 23a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 24576f7d34871f64ac3064f5fc3892c67a90cd1677ileana@telecom-paristech.fr#define TCM825X_MASK(x) (x & 0x00ff) 25576f7d34871f64ac3064f5fc3892c67a90cd1677ileana@telecom-paristech.fr#define TCM825X_ADDR(x) ((x & 0xff00) >> 8) 26a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 27a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/* The TCM825X I2C sensor chip has a fixed slave address of 0x3d. */ 28a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_I2C_ADDR 0x3d 29a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 30a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/* 31a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * define register offsets for the TCM825X sensor chip 32a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * OFFSET(8 bits) + MASK(8 bits) 33a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * MASK bit 4 and 3 are used when the register uses more than one address 34a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus */ 35a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_FPS 0x0280 36a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ACF 0x0240 37a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DOUTBUF 0x020C 38a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DCLKP 0x0202 39a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ACFDET 0x0201 40a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DOUTSW 0x0380 41a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DATAHZ 0x0340 42a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PICSIZ 0x033c 43a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PICFMT 0x0302 44a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_V_INV 0x0480 45a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_H_INV 0x0440 46a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRLSW 0x0430 47a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_V_LENGTH 0x040F 48a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCSW 0x0580 49a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRLIM 0x0560 50a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRSPD_U 0x051F 51a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRSPD_L 0x06FF 52a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AG 0x07FF 53a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESRSPD2 0x06FF 54a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCMODE 0x0830 55a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCH 0x080F 56a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCL 0x09FF 57a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AWBSW 0x0A80 58a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MRG 0x0BFF 59a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MBG 0x0CFF 60a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_GAMSW 0x0D80 61a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HDTG 0x0EFF 62a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VDTG 0x0FFF 63a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HDTCORE 0x10F0 64a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VDTCORE 0x100F 65a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_CONT 0x11FF 66a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_BRIGHT 0x12FF 67a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VHUE 0x137F 68a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UHUE 0x147F 69a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VGAIN 0x153F 70a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UGAIN 0x163F 71a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UVCORE 0x170F 72a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_SATU 0x187F 73a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MHMODE 0x1980 74a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MHLPFSEL 0x1940 75a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YMODE 0x1930 76a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MIXHG 0x1907 77a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_LENS 0x1A3F 78a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGLIM 0x1BE0 79a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_LENSRPOL 0x1B10 80a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_LENSRGAIN 0x1B0F 81a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ES100S 0x1CFF 82a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ES120S 0x1DFF 83a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DMASK 0x1EC0 84a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_CODESW 0x1E20 85a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_CODESEL 0x1E10 86a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_TESPIC 0x1E04 87a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PICSEL 0x1E03 88a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HNUM 0x20FF 89a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VOUTPH 0x287F 90a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESROUT 0x327F 91a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESROUT2 0x33FF 92a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGOUT 0x34FF 93a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DGOUT 0x353F 94a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGSLOW1 0x39C0 95a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_FLLSMODE 0x3930 96a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_FLLSLIM 0x390F 97a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DETSEL 0x3AF0 98a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ACDETNC 0x3A0F 99a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGSLOW2 0x3BC0 100a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DG 0x3B3F 101a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_REJHLEV 0x3CFF 102a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCLOCK 0x3D80 103a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_FPSLNKSW 0x3D40 104a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALCSPD 0x3D30 105a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_REJH 0x3D03 106a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_SHESRSW 0x3E80 107a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ESLIMSEL 0x3E40 108a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_SHESRSPD 0x3E30 109a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ELSTEP 0x3E0C 110a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ELSTART 0x3E03 111a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_AGMIN 0x3FFF 112a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PREGRG 0x423F 113a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PREGBG 0x433F 114a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PRERG 0x443F 115a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PREBG 0x453F 116a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKBR 0x477F 117a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKGR 0x487F 118a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKRB 0x497F 119a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKGB 0x4A7F 120a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKRG 0x4B7F 121a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_MSKBG 0x4C7F 122a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HDTCSW 0x4D80 123a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VDTCSW 0x4D40 124a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DTCYL 0x4D3F 125a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_HDTPSW 0x4E80 126a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VDTPSW 0x4E40 127a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DTCGAIN 0x4E3F 128a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DTLLIMSW 0x4F10 129a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_DTLYLIM 0x4F0F 130a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YLCUTLMSK 0x5080 131a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YLCUTL 0x503F 132a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YLCUTHMSK 0x5180 133a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_YLCUTH 0x513F 134a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UVSKNC 0x527F 135a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_UVLJ 0x537F 136a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WBGMIN 0x54FF 137a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WBGMAX 0x55FF 138a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WBSPDUP 0x5603 139a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ALLAREA 0x5820 140a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WBLOCK 0x5810 141a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_WB2SP 0x580F 142a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_KIZUSW 0x5920 143a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PBRSW 0x5910 144a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_ABCSW 0x5903 145a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PBDLV 0x5AFF 146a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_PBC1LV 0x5BFF 147a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 148a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_NUM_REGS (TCM825X_ADDR(TCM825X_PBC1LV) + 1) 149a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 150a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_BYTES_PER_PIXEL 2 151a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 152a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_REG_TERM 0xff /* terminating list entry for reg */ 153a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define TCM825X_VAL_TERM 0xff /* terminating list entry for val */ 154a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 155a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/* define a structure for tcm825x register initialization values */ 156a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusstruct tcm825x_reg { 157a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus u8 val; 158a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus u16 reg; 159a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus}; 160a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 161a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusenum image_size { subQCIF = 0, QQVGA, QCIF, QVGA, CIF, VGA }; 162a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusenum pixel_format { YUV422 = 0, RGB565 }; 163a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define NUM_IMAGE_SIZES 6 164a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#define NUM_PIXEL_FORMATS 2 165a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 1662060955748dff6280cd211b68c92d9a99d1c78f9Sakari Ailus#define TCM825X_XCLK_MIN 11900000 1672060955748dff6280cd211b68c92d9a99d1c78f9Sakari Ailus#define TCM825X_XCLK_MAX 25000000 1682060955748dff6280cd211b68c92d9a99d1c78f9Sakari Ailus 169a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusstruct capture_size { 170a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus unsigned long width; 171a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus unsigned long height; 172a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus}; 173a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 174a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailusstruct tcm825x_platform_data { 175a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus /* Is the sensor usable? Doesn't yet mean it's there, but you 176a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * can try! */ 177a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus int (*is_okay)(void); 178a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus /* Set power state, zero is off, non-zero is on. */ 179a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus int (*power_set)(int power); 180a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus /* Default registers written after power-on or reset. */ 1813e1e788341e64adea9996b20ebbbce21b5aa7f68Uma Sharma const struct tcm825x_reg * (*default_regs)(void); 182a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus int (*needs_reset)(struct v4l2_int_device *s, void *buf, 183a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus struct v4l2_pix_format *fmt); 1842060955748dff6280cd211b68c92d9a99d1c78f9Sakari Ailus int (*ifparm)(struct v4l2_ifparm *p); 18534cb61693e204897a6ae37d56a1e07d0cdd8cdbfSakari Ailus int (*is_upside_down)(void); 186a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus}; 187a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 188a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus/* Array of image sizes supported by TCM825X. These must be ordered from 189a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus * smallest image size to largest. 190a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus */ 191e23b290716ad9355d9f17b569c8c9e659ff68aa7Tobias Klauserstatic const struct capture_size tcm825x_sizes[] = { 192a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus { 128, 96 }, /* subQCIF */ 193a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus { 160, 120 }, /* QQVGA */ 194a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus { 176, 144 }, /* QCIF */ 195a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus { 320, 240 }, /* QVGA */ 196a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus { 352, 288 }, /* CIF */ 197a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus { 640, 480 }, /* VGA */ 198a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus}; 199a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus 200a5e90862114124d79e1a3f34641b00fec51d1806Sakari Ailus#endif /* ifndef TCM825X_H */ 201