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 */
|