• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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