1/*
2 * Driver for the ov7660 sensor
3 *
4 * Copyright (C) 2009 Erik Andr��n
5 * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project.
6 * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br>
7 *
8 * Portions of code to USB interface and ALi driver software,
9 * Copyright (c) 2006 Willem Duinker
10 * v4l2 interface modeled after the V4L2 driver
11 * for SN9C10x PC Camera Controllers
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License as
15 * published by the Free Software Foundation, version 2.
16 *
17 */
18
19#ifndef M5602_OV7660_H_
20#define M5602_OV7660_H_
21
22#include "m5602_sensor.h"
23
24#define OV7660_GAIN		0x00
25#define OV7660_BLUE_GAIN	0x01
26#define OV7660_RED_GAIN		0x02
27#define OV7660_VREF		0x03
28#define OV7660_COM1		0x04
29#define OV7660_BAVE		0x05
30#define OV7660_GEAVE		0x06
31#define OV7660_AECHH		0x07
32#define OV7660_RAVE		0x08
33#define OV7660_COM2		0x09
34#define OV7660_PID		0x0a
35#define OV7660_VER		0x0b
36#define OV7660_COM3		0x0c
37#define OV7660_COM4		0x0d
38#define OV7660_COM5		0x0e
39#define OV7660_COM6		0x0f
40#define OV7660_AECH		0x10
41#define OV7660_CLKRC		0x11
42#define OV7660_COM7		0x12
43#define OV7660_COM8		0x13
44#define OV7660_COM9		0x14
45#define OV7660_COM10		0x15
46#define OV7660_RSVD16		0x16
47#define OV7660_HSTART		0x17
48#define OV7660_HSTOP		0x18
49#define OV7660_VSTART		0x19
50#define OV7660_VSTOP		0x1a
51#define OV7660_PSHFT		0x1b
52#define OV7660_MIDH		0x1c
53#define OV7660_MIDL		0x1d
54#define OV7660_MVFP		0x1e
55#define OV7660_LAEC		0x1f
56#define OV7660_BOS		0x20
57#define OV7660_GBOS		0x21
58#define OV7660_GROS		0x22
59#define OV7660_ROS		0x23
60#define OV7660_AEW		0x24
61#define OV7660_AEB		0x25
62#define OV7660_VPT		0x26
63#define OV7660_BBIAS		0x27
64#define OV7660_GbBIAS		0x28
65#define OV7660_RSVD29		0x29
66#define OV7660_RBIAS		0x2c
67#define OV7660_HREF		0x32
68#define OV7660_ADC		0x37
69#define OV7660_OFON		0x39
70#define OV7660_TSLB		0x3a
71#define OV7660_COM12		0x3c
72#define OV7660_COM13		0x3d
73#define OV7660_LCC1		0x62
74#define OV7660_LCC2		0x63
75#define OV7660_LCC3		0x64
76#define OV7660_LCC4		0x65
77#define OV7660_LCC5		0x66
78#define OV7660_HV		0x69
79#define OV7660_RSVDA1		0xa1
80
81#define OV7660_DEFAULT_GAIN		0x0e
82#define OV7660_DEFAULT_RED_GAIN		0x80
83#define OV7660_DEFAULT_BLUE_GAIN	0x80
84#define OV7660_DEFAULT_SATURATION	0x00
85#define OV7660_DEFAULT_EXPOSURE		0x20
86
87/* Kernel module parameters */
88extern int force_sensor;
89extern bool dump_sensor;
90
91int ov7660_probe(struct sd *sd);
92int ov7660_init(struct sd *sd);
93int ov7660_init(struct sd *sd);
94int ov7660_init_controls(struct sd *sd);
95int ov7660_start(struct sd *sd);
96int ov7660_stop(struct sd *sd);
97void ov7660_disconnect(struct sd *sd);
98
99static const struct m5602_sensor ov7660 = {
100	.name = "ov7660",
101	.i2c_slave_id = 0x42,
102	.i2c_regW = 1,
103	.probe = ov7660_probe,
104	.init = ov7660_init,
105	.init_controls = ov7660_init_controls,
106	.start = ov7660_start,
107	.stop = ov7660_stop,
108	.disconnect = ov7660_disconnect,
109};
110
111static const unsigned char preinit_ov7660[][4] = {
112	{BRIDGE, M5602_XB_MCU_CLK_DIV, 0x02},
113	{BRIDGE, M5602_XB_MCU_CLK_CTRL, 0xb0},
114	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00},
115	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
116	{BRIDGE, M5602_XB_ADC_CTRL, 0xc0},
117	{BRIDGE, M5602_XB_SENSOR_TYPE, 0x0d},
118	{BRIDGE, M5602_XB_SENSOR_CTRL, 0x00},
119	{BRIDGE, M5602_XB_GPIO_DIR, 0x03},
120	{BRIDGE, M5602_XB_GPIO_DIR, 0x03},
121	{BRIDGE, M5602_XB_ADC_CTRL, 0xc0},
122	{BRIDGE, M5602_XB_SENSOR_TYPE, 0x0c},
123
124	{SENSOR, OV7660_OFON, 0x0c},
125	{SENSOR, OV7660_COM2, 0x11},
126	{SENSOR, OV7660_COM7, 0x05},
127
128	{BRIDGE, M5602_XB_GPIO_DIR, 0x01},
129	{BRIDGE, M5602_XB_GPIO_DAT, 0x04},
130	{BRIDGE, M5602_XB_GPIO_EN_H, 0x06},
131	{BRIDGE, M5602_XB_GPIO_DIR_H, 0x06},
132	{BRIDGE, M5602_XB_GPIO_DAT_H, 0x00},
133	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x08},
134	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
135	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00},
136	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
137	{BRIDGE, M5602_XB_ADC_CTRL, 0xc0},
138	{BRIDGE, M5602_XB_SENSOR_TYPE, 0x0c},
139	{BRIDGE, M5602_XB_GPIO_DIR, 0x05},
140	{BRIDGE, M5602_XB_GPIO_DAT, 0x00},
141	{BRIDGE, M5602_XB_GPIO_EN_H, 0x06},
142	{BRIDGE, M5602_XB_GPIO_EN_L, 0x00}
143};
144
145static const unsigned char init_ov7660[][4] = {
146	{BRIDGE, M5602_XB_MCU_CLK_DIV, 0x02},
147	{BRIDGE, M5602_XB_MCU_CLK_CTRL, 0xb0},
148	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00},
149	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
150	{BRIDGE, M5602_XB_ADC_CTRL, 0xc0},
151	{BRIDGE, M5602_XB_SENSOR_TYPE, 0x0d},
152	{BRIDGE, M5602_XB_SENSOR_CTRL, 0x00},
153	{BRIDGE, M5602_XB_GPIO_DIR, 0x01},
154	{BRIDGE, M5602_XB_GPIO_DIR, 0x01},
155	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00},
156	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
157	{BRIDGE, M5602_XB_ADC_CTRL, 0xc0},
158	{BRIDGE, M5602_XB_SENSOR_TYPE, 0x0c},
159	{BRIDGE, M5602_XB_GPIO_DIR, 0x05},
160	{BRIDGE, M5602_XB_GPIO_DAT, 0x00},
161	{BRIDGE, M5602_XB_GPIO_EN_H, 0x06},
162	{BRIDGE, M5602_XB_GPIO_EN_L, 0x00},
163	{SENSOR, OV7660_COM7, 0x80},
164	{SENSOR, OV7660_CLKRC, 0x80},
165	{SENSOR, OV7660_COM9, 0x4c},
166	{SENSOR, OV7660_OFON, 0x43},
167	{SENSOR, OV7660_COM12, 0x28},
168	{SENSOR, OV7660_COM8, 0x00},
169	{SENSOR, OV7660_COM10, 0x40},
170	{SENSOR, OV7660_HSTART, 0x0c},
171	{SENSOR, OV7660_HSTOP, 0x61},
172	{SENSOR, OV7660_HREF, 0xa4},
173	{SENSOR, OV7660_PSHFT, 0x0b},
174	{SENSOR, OV7660_VSTART, 0x01},
175	{SENSOR, OV7660_VSTOP, 0x7a},
176	{SENSOR, OV7660_VSTOP, 0x00},
177	{SENSOR, OV7660_COM7, 0x05},
178	{SENSOR, OV7660_COM6, 0x42},
179	{SENSOR, OV7660_BBIAS, 0x94},
180	{SENSOR, OV7660_GbBIAS, 0x94},
181	{SENSOR, OV7660_RSVD29, 0x94},
182	{SENSOR, OV7660_RBIAS, 0x94},
183	{SENSOR, OV7660_COM1, 0x00},
184	{SENSOR, OV7660_AECH, 0x00},
185	{SENSOR, OV7660_AECHH, 0x00},
186	{SENSOR, OV7660_ADC, 0x05},
187	{SENSOR, OV7660_COM13, 0x00},
188	{SENSOR, OV7660_RSVDA1, 0x23},
189	{SENSOR, OV7660_TSLB, 0x0d},
190	{SENSOR, OV7660_HV, 0x80},
191	{SENSOR, OV7660_LCC1, 0x00},
192	{SENSOR, OV7660_LCC2, 0x00},
193	{SENSOR, OV7660_LCC3, 0x10},
194	{SENSOR, OV7660_LCC4, 0x40},
195	{SENSOR, OV7660_LCC5, 0x01},
196
197	{SENSOR, OV7660_AECH, 0x20},
198	{SENSOR, OV7660_COM1, 0x00},
199	{SENSOR, OV7660_OFON, 0x0c},
200	{SENSOR, OV7660_COM2, 0x11},
201	{SENSOR, OV7660_COM7, 0x05},
202	{BRIDGE, M5602_XB_GPIO_DIR, 0x01},
203	{BRIDGE, M5602_XB_GPIO_DAT, 0x04},
204	{BRIDGE, M5602_XB_GPIO_EN_H, 0x06},
205	{BRIDGE, M5602_XB_GPIO_DIR_H, 0x06},
206	{BRIDGE, M5602_XB_GPIO_DAT_H, 0x00},
207	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x08},
208	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
209	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00},
210	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
211	{BRIDGE, M5602_XB_ADC_CTRL, 0xc0},
212	{BRIDGE, M5602_XB_SENSOR_TYPE, 0x0c},
213	{BRIDGE, M5602_XB_GPIO_DIR, 0x05},
214	{BRIDGE, M5602_XB_GPIO_DAT, 0x00},
215	{BRIDGE, M5602_XB_GPIO_EN_H, 0x06},
216	{BRIDGE, M5602_XB_GPIO_EN_L, 0x00},
217	{SENSOR, OV7660_AECH, 0x5f},
218	{SENSOR, OV7660_COM1, 0x03},
219	{SENSOR, OV7660_OFON, 0x0c},
220	{SENSOR, OV7660_COM2, 0x11},
221	{SENSOR, OV7660_COM7, 0x05},
222	{BRIDGE, M5602_XB_GPIO_DIR, 0x01},
223	{BRIDGE, M5602_XB_GPIO_DAT, 0x04},
224	{BRIDGE, M5602_XB_GPIO_EN_H, 0x06},
225	{BRIDGE, M5602_XB_GPIO_DIR_H, 0x06},
226	{BRIDGE, M5602_XB_GPIO_DAT_H, 0x00},
227	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x08},
228	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
229	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00},
230	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
231	{BRIDGE, M5602_XB_ADC_CTRL, 0xc0},
232	{BRIDGE, M5602_XB_SENSOR_TYPE, 0x0c},
233	{BRIDGE, M5602_XB_GPIO_DIR, 0x05},
234	{BRIDGE, M5602_XB_GPIO_DAT, 0x00},
235	{BRIDGE, M5602_XB_GPIO_EN_H, 0x06},
236	{BRIDGE, M5602_XB_GPIO_EN_L, 0x00},
237
238	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x06},
239	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
240	{BRIDGE, M5602_XB_ADC_CTRL, 0xc0},
241	{BRIDGE, M5602_XB_SENSOR_TYPE, 0x0c},
242	{BRIDGE, M5602_XB_LINE_OF_FRAME_H, 0x81},
243	{BRIDGE, M5602_XB_PIX_OF_LINE_H, 0x82},
244	{BRIDGE, M5602_XB_SIG_INI, 0x01},
245	{BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
246	{BRIDGE, M5602_XB_VSYNC_PARA, 0x08},
247	{BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
248	{BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
249	{BRIDGE, M5602_XB_VSYNC_PARA, 0x01},
250	{BRIDGE, M5602_XB_VSYNC_PARA, 0xec},
251	{BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
252	{BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
253	{BRIDGE, M5602_XB_SIG_INI, 0x00},
254	{BRIDGE, M5602_XB_SIG_INI, 0x02},
255	{BRIDGE, M5602_XB_HSYNC_PARA, 0x00},
256	{BRIDGE, M5602_XB_HSYNC_PARA, 0x27},
257	{BRIDGE, M5602_XB_HSYNC_PARA, 0x02},
258	{BRIDGE, M5602_XB_HSYNC_PARA, 0xa7},
259	{BRIDGE, M5602_XB_SIG_INI, 0x00},
260	{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00},
261	{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
262};
263#endif
264