1 /*
2 * A V4L2 driver for nvp6134 cameras.
3 *
4 * Copyright (c) 2017 by Allwinnertech Co., Ltd. http://www.allwinnertech.com
5 * Authors: chenliang <michaelchen@allwinnertech.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12
13 /*
14 *#include "type.h"
15 *#include "../../para.h"
16 *#include "../cci/cci.h"
17 *#include "../csic_hw.h"
18 *#include "include.h"
19 *#include "common.h"
20 *#include "nxp_6134/common.h"
21 */
22 #include "type.h"
23 #include "video.h"
24
25 #include <linux/clk.h>
26 #include <linux/delay.h>
27 #include <linux/i2c.h>
28 #include <linux/init.h>
29 #include <linux/io.h>
30 #include <linux/module.h>
31 #include <linux/slab.h>
32 #include <linux/videodev2.h>
33 #include <media/v4l2-device.h>
34 #include <media/v4l2-mediabus.h>
35
36 #include "../camera.h"
37 #include "../sensor_helper.h"
38 #include "csi_dev_nvp6134.h"
39 #include <media/v4l2-subdev.h>
40 int chip_id[4];
41 int rev_id[4];
42 unsigned int nvp6134_iic_addr[4] = {0x60, 0x62, 0x64, 0x66};
43 unsigned int nvp6134_cnt;
44
45 /* #define COLORBAR_EN */
46
47 extern struct v4l2_subdev *gl_sd;
48 #define SENSOR_NAME "nvp6134"
49
gpio_i2c_write(u8 da,u8 reg,u8 val)50 u32 gpio_i2c_write(u8 da, u8 reg, u8 val)
51 {
52 u32 ret;
53
54 ret = cci_write_a8_d8(gl_sd, reg, val);
55 /* u_twi_wr_8_8(reg, val, da>>1,3); */
56
57 return ret;
58 }
59
gpio_i2c_read(u8 da,u8 reg)60 u32 gpio_i2c_read(u8 da, u8 reg)
61 {
62 u8 ret;
63 u8 val = 0;
64
65 ret = cci_read_a8_d8(gl_sd, reg, &val);
66 /* ret = u_twi_rd_8_8(reg, &val, da>>1,3); */
67
68 return val;
69 }
70
71 /*******************************************************************************
72 * Description : Get Device ID
73 * Argurments : dec(slave address)
74 * Return value : Device ID
75 * Modify :
76 * warning :
77 *******************************************************************************/
check_id(unsigned int dec)78 int check_id(unsigned int dec)
79 {
80 int ret;
81
82 gpio_i2c_write(dec, 0xFF, 0x00);
83 ret = gpio_i2c_read(dec, 0xf4);
84 return ret;
85 }
86
87 /*******************************************************************************
88 * Description : Get rev ID
89 * Argurments : dec(slave address)
90 * Return value : rev ID
91 * Modify :
92 * warning :
93 *******************************************************************************/
check_rev(unsigned int dec)94 int check_rev(unsigned int dec)
95 {
96 int ret;
97
98 gpio_i2c_write(dec, 0xFF, 0x00);
99 ret = gpio_i2c_read(dec, 0xf5);
100 return ret;
101 }
102
103 /* For 0, 1, 5 */
dump_bank(int bank)104 void dump_bank(int bank)
105 {
106 int i = 0;
107 u32 ret = 0;
108 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, bank);
109 for (i = 0; i < 0xF6; i++) {
110
111 if (i == 0 || i % 16 == 0)
112 sensor_print("0x%02x-0x%02x: ", i, i + 15);
113 ret = gpio_i2c_read(nvp6134_iic_addr[0], i);
114 sensor_print("0x%02x ", ret);
115 if ((i > 0) && ((i + 1) % 16) == 0)
116 sensor_print("\n");
117 }
118 }
119 EXPORT_SYMBOL(dump_bank);
120
read_bank_value(void)121 void read_bank_value(void)
122 {
123
124 u8 ret = 0;
125 u8 i = 0;
126
127 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x00);
128 for (i = 0; i < 0xF6; i++) {
129 ret = gpio_i2c_read(nvp6134_iic_addr[0], i);
130 sensor_print("Bank0[0x%2.2x] = 0x%2.2x\n", i, ret);
131 }
132
133 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x01);
134 for (i = 0; i < 0xF6; i++) {
135 ret = gpio_i2c_read(nvp6134_iic_addr[0], i);
136 sensor_print("Bank1[0x%2.2x] = 0x%2.2x\n", i, ret);
137 }
138
139 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x05);
140 for (i = 0; i < 0xF0; i++) {
141 ret = gpio_i2c_read(nvp6134_iic_addr[0], i);
142 sensor_print("Bank5[0x%2.2x] = 0x%2.2x\n", i, ret);
143 }
144 }
145
sensor_init_hardware(u32 val)146 int sensor_init_hardware(u32 val)
147 {
148 /* int ret = 0; */
149 int ch = 0;
150 int chip = 0;
151
152 /*
153 *check Device ID of maximum 4chip on the slave address,
154 * manage slave address. chip count.
155 */
156 nvp6134_cnt = 1;
157 #ifdef AHD_1080P_1CH
158 chip_id[0] = NVP6134B_R0_ID;
159 #else
160 chip_id[0] = NVP6134_R0_ID;
161 #endif
162 nvp6134_iic_addr[0] = 0x62;
163
164 #if 0
165 for (chip = 0; chip < 1; chip++) {
166 chip_id[chip] = check_id(nvp6134_iic_addr[chip]);
167 rev_id[chip] = check_rev(nvp6134_iic_addr[chip]);
168 if ((chip_id[chip] != NVP6134_R0_ID) &&
169 (chip_id[chip] != NVP6134B_R0_ID)) {
170 sensor_print("Device ID Error... %x\n", chip_id[chip]);
171 } else {
172 /*
173 sensor_print("Device (0x%x) ID OK... %x\n",
174 nvp6134_iic_addr[chip], chip_id[chip]);
175 sensor_print("Device (0x%x) REV ... %x\n",
176 nvp6134_iic_addr[chip], rev_id[chip]);
177 */
178 nvp6134_iic_addr[nvp6134_cnt] = nvp6134_iic_addr[chip];
179 if (nvp6134_cnt < chip)
180 nvp6134_iic_addr[chip] = 0xFF;
181 chip_id[nvp6134_cnt] = chip_id[chip];
182 rev_id[nvp6134_cnt] = rev_id[chip];
183 nvp6134_cnt++;
184 }
185 }
186 #endif
187 /* sensor_print("Chip Count = %d, [0x%x]\n", */
188 /* nvp6134_cnt, nvp6134_iic_addr[0]); */
189
190 /* initialize semaphore */
191 /* sema_init(&nvp6134_lock, 1); */
192
193 /* initialize common value of AHD */
194 for (chip = 0; chip < nvp6134_cnt; chip++)
195 nvp6134_common_init(chip);
196
197 /* set channel mode(AHD 1080P) each chip - default */
198 for (ch = 0; ch < nvp6134_cnt * 4; ch++) {
199 /*û����Ƶ�����ʱ����Ĭ������ΪAHD 1080P novideoģʽ. */
200 nvp6134_set_chnmode(ch, NTSC, NVP6134_VI_1080P_NOVIDEO);
201 #ifdef AHD_1080P_1CH
202 nvp6134_set_chnmode(ch, PAL, NVP6134_VI_1080P_NOVIDEO);
203 nvp6134_set_chnmode(ch, PAL, NVP6134_VI_1080P_2530);
204 #else
205 nvp6134_set_chnmode(ch, PAL, NVP6134_VI_720P_2530);
206 #endif
207 }
208
209 /* set port(1MUX AHD 1080P) each chip - default */
210 for (chip = 0; chip < nvp6134_cnt; chip++) {
211 if (chip_id[chip] == NVP6134_R0_ID) {
212 /*����nvp6134 4��port�����ģʽ 0~3 port�ڿ��� */
213 nvp6134_set_portmode(chip, 0,
214 NVP6134_OUTMODE_4MUX_BT1120S, 0);
215
216 /* 1 bt1120 output 1ch data */
217 /* ;NVP6134_OUTMODE_2MUX_BT1120S:2ch */
218 /* data;NVP6134_OUTMODE_4MUX_BT1120S:4ch data */
219
220 /*
221 nvp6134_set_portmode(chip, 1,
222 NVP6134_OUTMODE_4MUX_BT1120S, 1);
223 nvp6134_set_portmode(chip, 2,
224 NVP6134_OUTMODE_4MUX_BT1120S, 2);
225 nvp6134_set_portmode(chip, 3,
226 NVP6134_OUTMODE_4MUX_BT1120S, 3);
227 */
228 } else if (chip_id[chip] == NVP6134B_R0_ID) {
229 /*����nvp6134b 2��port�����ģʽ, 1/2 port�ڿ��� */
230 /* nvp6134_set_portmode(chip, 1,
231 NVP6134_OUTMODE_4MUX_BT1120S, 1);
232 nvp6134_set_portmode(chip, 2,
233 NVP6134_OUTMODE_4MUX_BT1120S, 0); */
234 nvp6134_set_portmode(chip, 1,
235 NVP6134_OUTMODE_1MUX_FHD, 1);
236 nvp6134_set_portmode(chip, 2,
237 NVP6134_OUTMODE_1MUX_FHD, 0);
238 }
239 }
240 #ifndef AHD_1080P_1CH
241 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x00);
242 /*ch1*/
243 gpio_i2c_write(nvp6134_iic_addr[0], 0x0c, 0x00);
244 gpio_i2c_write(nvp6134_iic_addr[0], 0x10, 0x80);
245 gpio_i2c_write(nvp6134_iic_addr[0], 0x3c, 0x80);
246 gpio_i2c_write(nvp6134_iic_addr[0], 0x40, 0x00);
247 gpio_i2c_write(nvp6134_iic_addr[0], 0x44, 0xf0);
248 gpio_i2c_write(nvp6134_iic_addr[0], 0x48, 0x30);
249 gpio_i2c_write(nvp6134_iic_addr[0], 0x4c, 0xf6);
250 gpio_i2c_write(nvp6134_iic_addr[0], 0x50, 0xf0);
251 /*ch2*/
252 gpio_i2c_write(nvp6134_iic_addr[0], 0x0d, 0x00);
253 gpio_i2c_write(nvp6134_iic_addr[0], 0x11, 0x80);
254 gpio_i2c_write(nvp6134_iic_addr[0], 0x3d, 0x80);
255 gpio_i2c_write(nvp6134_iic_addr[0], 0x41, 0x00);
256 gpio_i2c_write(nvp6134_iic_addr[0], 0x45, 0xf0);
257 gpio_i2c_write(nvp6134_iic_addr[0], 0x49, 0x30);
258 gpio_i2c_write(nvp6134_iic_addr[0], 0x4d, 0xf6);
259 gpio_i2c_write(nvp6134_iic_addr[0], 0x51, 0xf0);
260 /*ch3*/
261 gpio_i2c_write(nvp6134_iic_addr[0], 0x0e, 0x00);
262 gpio_i2c_write(nvp6134_iic_addr[0], 0x12, 0x80);
263 gpio_i2c_write(nvp6134_iic_addr[0], 0x3e, 0x80);
264 gpio_i2c_write(nvp6134_iic_addr[0], 0x42, 0x00);
265 gpio_i2c_write(nvp6134_iic_addr[0], 0x46, 0xf0);
266 gpio_i2c_write(nvp6134_iic_addr[0], 0x4a, 0x30);
267 gpio_i2c_write(nvp6134_iic_addr[0], 0x4e, 0xf6);
268 gpio_i2c_write(nvp6134_iic_addr[0], 0x52, 0xf0);
269 /*ch4*/
270 gpio_i2c_write(nvp6134_iic_addr[0], 0x0f, 0x00);
271 gpio_i2c_write(nvp6134_iic_addr[0], 0x13, 0x80);
272 gpio_i2c_write(nvp6134_iic_addr[0], 0x3f, 0x80);
273 gpio_i2c_write(nvp6134_iic_addr[0], 0x43, 0x00);
274 gpio_i2c_write(nvp6134_iic_addr[0], 0x47, 0xf0);
275 gpio_i2c_write(nvp6134_iic_addr[0], 0x4b, 0x30);
276 gpio_i2c_write(nvp6134_iic_addr[0], 0x4f, 0xf6);
277 gpio_i2c_write(nvp6134_iic_addr[0], 0x53, 0xf0);
278 #endif
279 #ifdef COLORBAR_EN
280 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x05);
281 gpio_i2c_write(nvp6134_iic_addr[0], 0x2c, 0x08);
282 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x06);
283 gpio_i2c_write(nvp6134_iic_addr[0], 0x2c, 0x08);
284 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x07);
285 gpio_i2c_write(nvp6134_iic_addr[0], 0x2c, 0x08);
286 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x08);
287 gpio_i2c_write(nvp6134_iic_addr[0], 0x2c, 0x08);
288
289 gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x00);
290 /* gpio_i2c_write(nvp6134_iic_addr[0], 0x78, 0x42);//ch1:Blue */
291 /* ch2:Yellow ch3:Green ch4:Red */
292 /* gpio_i2c_write(nvp6134_iic_addr[0], 0x79, 0x76); */
293 gpio_i2c_write(nvp6134_iic_addr[0], 0x78,
294 0xce); /* ch1:Blue ch2:Yellow ch3:Green ch4:Red */
295 gpio_i2c_write(nvp6134_iic_addr[0], 0x79, 0xba);
296 #endif
297
298 /* gpio_i2c_write(nvp6134_iic_addr[0], 0x7A, 0x44); */
299 /* gpio_i2c_write(nvp6134_iic_addr[0], 0x7B, 0x44); */
300
301 /* read_bank_value(3); */
302 /* dump_bank(0); */
303 /* dump_bank(1); */
304 /* dump_bank(5); */
305
306 /* gpio_i2c_write(nvp6134_iic_addr[0], 0xFF, 0x01); */
307 /* gpio_i2c_write(nvp6134_iic_addr[0], 0xCA, 0x66); */
308
309 /* initialize Audio */
310 /* recmaster, pbmaster, ch_num, samplerate, bits */
311 /* audio_init(1,0,16,0,0); */
312
313 /* create kernel thread for EQ, But Now not used. */
314 /* nvp6134_kt = kthread_create(nvp6134_kernel_thread, NULL, */
315 /*"nvp6134_kt"); */
316 /* if(!IS_ERR(nvp6134_kt)) */
317 /* wake_up_process(nvp6134_kt); */
318 /* else { */
319 /* sensor_print("create nvp6134 watchdog thread failed!!\n"); */
320 /* nvp6134_kt = 0; */
321 /* return 0; */
322 /* } */
323
324 return 0;
325 }
326