aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/i2c/tcm825x.h
blob: 8ebab953963f869b5f63ea4e8686def0e5e9f573 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/*
 * drivers/media/i2c/tcm825x.h
 *
 * Register definitions for the TCM825X CameraChip.
 *
 * Author: David Cohen (david.cohen@indt.org.br)
 *
 * This file is licensed under the terms of the GNU General Public License
 * version 2. This program is licensed "as is" without any warranty of any
 * kind, whether express or implied.
 *
 * This file was based on ov9640.h from MontaVista
 */

#ifndef TCM825X_H
#define TCM825X_H

#include <linux/videodev2.h>

#include <media/v4l2-int-device.h>

#define TCM825X_NAME "tcm825x"

#define TCM825X_MASK(x)  x & 0x00ff
#define TCM825X_ADDR(x) (x & 0xff00) >> 8

/* The TCM825X I2C sensor chip has a fixed slave address of 0x3d. */
#define TCM825X_I2C_ADDR	0x3d

/*
 * define register offsets for the TCM825X sensor chip
 * OFFSET(8 bits) + MASK(8 bits)
 * MASK bit 4 and 3 are used when the register uses more than one address
 */
#define TCM825X_FPS		0x0280
#define TCM825X_ACF		0x0240
#define TCM825X_DOUTBUF		0x020C
#define TCM825X_DCLKP		0x0202
#define TCM825X_ACFDET		0x0201
#define TCM825X_DOUTSW		0x0380
#define TCM825X_DATAHZ		0x0340
#define TCM825X_PICSIZ		0x033c
#define TCM825X_PICFMT		0x0302
#define TCM825X_V_INV		0x0480
#define TCM825X_H_INV		0x0440
#define TCM825X_ESRLSW		0x0430
#define TCM825X_V_LENGTH	0x040F
#define TCM825X_ALCSW		0x0580
#define TCM825X_ESRLIM		0x0560
#define TCM825X_ESRSPD_U        0x051F
#define TCM825X_ESRSPD_L        0x06FF
#define TCM825X_AG		0x07FF
#define TCM825X_ESRSPD2         0x06FF
#define TCM825X_ALCMODE         0x0830
#define TCM825X_ALCH            0x080F
#define TCM825X_ALCL            0x09FF
#define TCM825X_AWBSW           0x0A80
#define TCM825X_MRG             0x0BFF
#define TCM825X_MBG             0x0CFF
#define TCM825X_GAMSW           0x0D80
#define TCM825X_HDTG            0x0EFF
#define TCM825X_VDTG            0x0FFF
#define TCM825X_HDTCORE         0x10F0
#define TCM825X_VDTCORE         0x100F
#define TCM825X_CONT            0x11FF
#define TCM825X_BRIGHT          0x12FF
#define TCM825X_VHUE            0x137F
#define TCM825X_UHUE            0x147F
#define TCM825X_VGAIN           0x153F
#define TCM825X_UGAIN           0x163F
#define TCM825X_UVCORE          0x170F
#define TCM825X_SATU            0x187F
#define TCM825X_MHMODE          0x1980
#define TCM825X_MHLPFSEL        0x1940
#define TCM825X_YMODE           0x1930
#define TCM825X_MIXHG           0x1907
#define TCM825X_LENS            0x1A3F
#define TCM825X_AGLIM           0x1BE0
#define TCM825X_LENSRPOL        0x1B10
#define TCM825X_LENSRGAIN       0x1B0F
#define TCM825X_ES100S          0x1CFF
#define TCM825X_ES120S          0x1DFF
#define TCM825X_DMASK           0x1EC0
#define TCM825X_CODESW          0x1E20
#define TCM825X_CODESEL         0x1E10
#define TCM825X_TESPIC          0x1E04
#define TCM825X_PICSEL          0x1E03
#define TCM825X_HNUM            0x20FF
#define TCM825X_VOUTPH          0x287F
#define TCM825X_ESROUT          0x327F
#define TCM825X_ESROUT2         0x33FF
#define TCM825X_AGOUT           0x34FF
#define TCM825X_DGOUT           0x353F
#define TCM825X_AGSLOW1         0x39C0
#define TCM825X_FLLSMODE        0x3930
#define TCM825X_FLLSLIM         0x390F
#define TCM825X_DETSEL          0x3AF0
#define TCM825X_ACDETNC         0x3A0F
#define TCM825X_AGSLOW2         0x3BC0
#define TCM825X_DG              0x3B3F
#define TCM825X_REJHLEV         0x3CFF
#define TCM825X_ALCLOCK         0x3D80
#define TCM825X_FPSLNKSW        0x3D40
#define TCM825X_ALCSPD          0x3D30
#define TCM825X_REJH            0x3D03
#define TCM825X_SHESRSW         0x3E80
#define TCM825X_ESLIMSEL        0x3E40
#define TCM825X_SHESRSPD        0x3E30
#define TCM825X_ELSTEP          0x3E0C
#define TCM825X_ELSTART         0x3E03
#define TCM825X_AGMIN           0x3FFF
#define TCM825X_PREGRG          0x423F
#define TCM825X_PREGBG          0x433F
#define TCM825X_PRERG           0x443F
#define TCM825X_PREBG           0x453F
#define TCM825X_MSKBR           0x477F
#define TCM825X_MSKGR           0x487F
#define TCM825X_MSKRB           0x497F
#define TCM825X_MSKGB           0x4A7F
#define TCM825X_MSKRG           0x4B7F
#define TCM825X_MSKBG           0x4C7F
#define TCM825X_HDTCSW          0x4D80
#define TCM825X_VDTCSW          0x4D40
#define TCM825X_DTCYL           0x4D3F
#define TCM825X_HDTPSW          0x4E80
#define TCM825X_VDTPSW          0x4E40
#define TCM825X_DTCGAIN         0x4E3F
#define TCM825X_DTLLIMSW        0x4F10
#define TCM825X_DTLYLIM         0x4F0F
#define TCM825X_YLCUTLMSK       0x5080
#define TCM825X_YLCUTL          0x503F
#define TCM825X_YLCUTHMSK       0x5180
#define TCM825X_YLCUTH          0x513F
#define TCM825X_UVSKNC          0x527F
#define TCM825X_UVLJ            0x537F
#define TCM825X_WBGMIN          0x54FF
#define TCM825X_WBGMAX          0x55FF
#define TCM825X_WBSPDUP         0x5603
#define TCM825X_ALLAREA         0x5820
#define TCM825X_WBLOCK          0x5810
#define TCM825X_WB2SP           0x580F
#define TCM825X_KIZUSW          0x5920
#define TCM825X_PBRSW           0x5910
#define TCM825X_ABCSW           0x5903
#define TCM825X_PBDLV           0x5AFF
#define TCM825X_PBC1LV          0x5BFF

#define TCM825X_NUM_REGS	(TCM825X_ADDR(TCM825X_PBC1LV) + 1)

#define TCM825X_BYTES_PER_PIXEL 2

#define TCM825X_REG_TERM 0xff		/* terminating list entry for reg */
#define TCM825X_VAL_TERM 0xff		/* terminating list entry for val */

/* define a structure for tcm825x register initialization values */
struct tcm825x_reg {
	u8 val;
	u16 reg;
};

enum image_size { subQCIF = 0, QQVGA, QCIF, QVGA, CIF, VGA };
enum pixel_format { YUV422 = 0, RGB565 };
#define NUM_IMAGE_SIZES 6
#define NUM_PIXEL_FORMATS 2

#define TCM825X_XCLK_MIN	11900000
#define TCM825X_XCLK_MAX	25000000

struct capture_size {
	unsigned long width;
	unsigned long height;
};

struct tcm825x_platform_data {
	/* Is the sensor usable? Doesn't yet mean it's there, but you
	 * can try! */
	int (*is_okay)(void);
	/* Set power state, zero is off, non-zero is on. */
	int (*power_set)(int power);
	/* Default registers written after power-on or reset. */
	const struct tcm825x_reg *(*default_regs)(void);
	int (*needs_reset)(struct v4l2_int_device *s, void *buf,
			   struct v4l2_pix_format *fmt);
	int (*ifparm)(struct v4l2_ifparm *p);
	int (*is_upside_down)(void);
};

/* Array of image sizes supported by TCM825X.  These must be ordered from
 * smallest image size to largest.
 */
static const struct capture_size tcm825x_sizes[] = {
	{ 128,  96 }, /* subQCIF */
	{ 160, 120 }, /* QQVGA */
	{ 176, 144 }, /* QCIF */
	{ 320, 240 }, /* QVGA */
	{ 352, 288 }, /* CIF */
	{ 640, 480 }, /* VGA */
};

#endif /* ifndef TCM825X_H */