• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * A V4L2 driver for nvp6324 cameras and AHD Coax protocol.
3  *
4  * Copyright (c) 2017 by Allwinnertech Co., Ltd.  http://www.allwinnertech.com
5  *
6  * Authors:  Li Huiyu <lihuiyu@allwinnertech.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #include <linux/string.h>
14 #include <linux/delay.h>
15 #include <linux/unistd.h>
16 #include "jaguar1_common.h"
17 #include "jaguar1_coax_table.h"
18 #include "jaguar1_coax_protocol.h"
19 #include "jaguar1_video.h"
20 #include "../sensor_helper.h"
21 
22 #define SENSOR_NAME "nvp6324_mipi"
23 
24 extern unsigned int bit8;
25 
26 /*=======================================================================================================
27  ********************************************************************************************************
28  **************************** Coaxial protocol up stream function ***************************************
29  ********************************************************************************************************
30  * Coaxial protocol up stream Flow
31  * 1. Up stream initialize       -  coax_tx_init
32  * 2. Fill upstream data & Send  -  coax_tx_cmd_send
33  *
34  * Coaxial protocol up stream register(example: channel 0)
35  * (3x00) tx_baud               : 1 bit duty
36  * (3x02) tx_pel_baud           : 1 bit duty of pelco(SD)
37  * (3x03) tx_line_pos0          : up stream line position(low)
38  * (3x04) tx_line_pos1          : up stream line position(high)
39  * (3x05) tx_line_count         : up stream output line number in 1 frame
40  * (3x07) tx_pel_line_pos0      : up stream line position of pelco(low)
41  * (3x08) tx_pel_line_pos1      : up stream line position of pelco(high)
42  * (3x0A) tx_line_count_max     : up stream output total line
43  * (3x0B) tx_mode               : up stream Mode set (ACP, CCP, TCP)
44  * (3x0D) tx_sync_pos0          : up stream sync start position(low)
45  * (3x0E) tx_sync_pos1          : up stream sync start position(high)
46  * (3x2F) tx_even               : up stream SD..Interlace
47  * (3x0C) tx_zero_length        : Only CVI 4M
48  ========================================================================================================*/
49 static NC_VIVO_CH_FORMATDEF g_coax_format;
50 
51 
52 /**************************************************************************************
53  * @desc
54  *	JAGUAR1's This function initializes the register associated with the UP Stream..
55  *
56  * @param_in		(NC_VD_COAX_Tx_Init_STR *)coax_tx_mode			UP Stream Initialize structure
57  *
58  * @return	void		 								None
59  *
60  * ioctl : IOC_VDEC_COAX_TX_INIT
61  ***************************************************************************************/
__NC_VD_ACP_Get_CommandFormat_Get(NC_COAX_CMD_DEF def)62 static NC_VD_ACP_CMDDEF_STR *__NC_VD_ACP_Get_CommandFormat_Get(NC_COAX_CMD_DEF def)
63 {
64 	NC_VD_ACP_CMDDEF_STR *pRet = &coax_cmd_lists[def];
65 	if (pRet == NULL) {
66 		sensor_dbg("Not Supported format Yet!!!(%d)\n", def);
67 	}
68 	return  pRet;
69 }
70 
__NC_VD_COAX_InitFormat_Get(NC_VIVO_CH_FORMATDEF def)71 NC_VD_COAX_Init_STR *__NC_VD_COAX_InitFormat_Get(NC_VIVO_CH_FORMATDEF def)
72 {
73 	NC_VD_COAX_Init_STR *pRet = &coax_init_lists[def];
74 	if (pRet == NULL) {
75 		sensor_dbg("Not Supported format Yet!!!(%d)\n", def);
76 	}
77 	return  pRet;
78 }
79 
__NC_VD_COAX_16bit_InitFormat_Get(NC_VIVO_CH_FORMATDEF def)80 NC_VD_COAX_Init_STR *__NC_VD_COAX_16bit_InitFormat_Get(NC_VIVO_CH_FORMATDEF def)
81 {
82 	NC_VD_COAX_Init_STR *pRet = &coax_acp_16bit_init_lists[def];
83 	if (pRet == NULL) {
84 		sensor_dbg("Not Supported format Yet!!!(%d)\n", def);
85 	}
86 	return  pRet;
87 }
88 
__NC_VD_COAX_Command_Each_Copy(unsigned char * Dst,int * Src)89 int __NC_VD_COAX_Command_Each_Copy(unsigned char *Dst, int *Src)
90 {
91 	int items = 0;
92 
93 	while (Src[items] != EOD) {
94 		Dst[items] = Src[items];
95 		items++;
96 	}
97 
98 	return items;
99 }
100 
__NC_VD_COAX_Command_Copy(NC_FORMAT_STANDARD format,NC_VIVO_CH_FORMATDEF vivofmt,unsigned char * Dst,NC_VD_ACP_CMDDEF_STR * pCMD)101 int __NC_VD_COAX_Command_Copy(NC_FORMAT_STANDARD format, NC_VIVO_CH_FORMATDEF vivofmt, unsigned char *Dst, NC_VD_ACP_CMDDEF_STR *pCMD)
102 {
103 	int cmd_cnt = 0;
104 
105 	if (format == FMT_SD) {
106 		cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->sd);
107 	} else if ((format == FMT_AHD20) || (format == FMT_AHD30)) {
108 		if (vivofmt == AHD30_5M_20P || vivofmt == AHD30_5M_12_5P || vivofmt == AHD30_5_3M_20P)
109 			cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->ahd_4_5m);
110 		else if (vivofmt == AHD30_4M_30P || vivofmt == AHD30_4M_25P || vivofmt == AHD30_4M_15P)
111 			cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->ahd_4_5m);
112 		else
113 			cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->ahd_8bit);
114 	} else if (format == FMT_CVI) {
115 		cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->cvi_cmd);
116 	} else if (format == FMT_TVI) {
117 		if ((vivofmt == TVI_4M_30P) || (vivofmt == TVI_4M_25P) || (vivofmt == TVI_4M_15P))
118 			cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->tvi_v2_0);
119 		else
120 			cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->tvi_v1_0);
121 	} else
122 		sensor_dbg("NC_VD_COAX_Tx_Command_Send::Command Copy Error!!\n");
123 
124 
125 
126 	return cmd_cnt;
127 }
128 
__NC_VD_COAX_16bit_Command_Copy(NC_FORMAT_STANDARD format,NC_VIVO_CH_FORMATDEF vivofmt,unsigned char * Dst,NC_VD_ACP_CMDDEF_STR * pCMD)129 int __NC_VD_COAX_16bit_Command_Copy(NC_FORMAT_STANDARD format, NC_VIVO_CH_FORMATDEF vivofmt, unsigned char *Dst, NC_VD_ACP_CMDDEF_STR *pCMD)
130 {
131 	int cmd_cnt = 0;
132 
133 	if ((vivofmt == AHD20_720P_25P) || (vivofmt == AHD20_720P_30P) ||\
134 			(vivofmt == AHD20_720P_25P_EX) || (vivofmt == AHD20_720P_30P_EX) ||\
135 			(vivofmt == AHD20_720P_25P_EX_Btype) || (vivofmt == AHD20_720P_30P_EX_Btype)) {
136 		cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->ahd_16bit);
137 	} else if ((vivofmt == CVI_4M_25P) || (vivofmt == CVI_4M_30P) ||\
138 			(vivofmt == CVI_8M_15P) || (vivofmt == CVI_8M_12_5P)) {
139 		cmd_cnt = __NC_VD_COAX_Command_Each_Copy(Dst, pCMD->cvi_new_cmd);
140 	} else {
141 		printk("[drv_coax] Can not send commands!! Unsupported format!!\n");
142 		return 0;
143 	}
144 
145 
146 	return cmd_cnt;
147 }
148 
149 /**************************************************************************************
150  * @desc
151  *	JAGUAR1's This function initializes the register associated with the UP Stream..
152  *
153  * @param_in		(NC_VD_COAX_Tx_Init_STR *)coax_tx_mode			UP Stream Initialize structure
154  *
155  * @return	void		 								None
156  *
157  * ioctl : IOC_VDEC_COAX_TX_INIT
158  ***************************************************************************************/
coax_tx_init(void * p_param)159 void coax_tx_init(void *p_param)
160 {
161 	NC_VD_COAX_Init_STR *CoaxVal;
162 	NC_VD_COAX_STR *coax_tx = (NC_VD_COAX_STR *)p_param;
163 
164 	int ch = coax_tx->ch;
165 	unsigned char distance = 0;
166 
167 	g_coax_format =  coax_tx->vivo_fmt;
168 
169 
170 	CoaxVal = __NC_VD_COAX_InitFormat_Get(coax_tx->vivo_fmt);
171 	sensor_dbg("[drv_coax]ch::%d >>> fmt::%s\n", ch, CoaxVal->name);
172 
173 #if 0
174 
175 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->devnum], 0xFF, 0x13);
176 	distance = gpio_i2c_read(jaguar1_i2c_addr[coax_tx->devnum], (0xA0+ch));
177 
178 	distance = distance&0x0F;
179 	if (distance == 0x0F) {
180 		printk("DRV::Cable distance Unknown!!\n");
181 		distance = 0;
182 	} else
183 		printk("DRV::Cable distance(%x)\n", distance);
184 #endif
185 
186 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x01);
187 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xA8, 0x00);
188 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xA9, 0x00);
189 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xAA, 0x00);
190 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xAB, 0x00);
191 
192 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
193 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x7C+((ch%2)*0x80), CoaxVal->rx_src);
194 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x7D+((ch%2)*0x80), CoaxVal->rx_slice_lev);
195 
196 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
197 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x00+((ch%2)*0x80), CoaxVal->tx_baud[distance]);
198 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x02+((ch%2)*0x80), CoaxVal->tx_pel_baud[distance]);
199 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x03+((ch%2)*0x80), CoaxVal->tx_line_pos0[distance]);
200 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x04+((ch%2)*0x80), CoaxVal->tx_line_pos1[distance]);
201 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x05+((ch%2)*0x80), CoaxVal->tx_line_count);
202 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x07+((ch%2)*0x80), CoaxVal->tx_pel_line_pos0[distance]);
203 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x08+((ch%2)*0x80), CoaxVal->tx_pel_line_pos1[distance]);
204 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0A+((ch%2)*0x80), CoaxVal->tx_line_count_max);
205 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0B+((ch%2)*0x80), CoaxVal->tx_mode);
206 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0D+((ch%2)*0x80), CoaxVal->tx_sync_pos0[distance]);
207 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0E + ((ch%2)*0x80), CoaxVal->tx_sync_pos1[distance]);
208 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x2F+((ch%2)*0x80), CoaxVal->tx_even);
209 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0C+((ch%2)*0x80), CoaxVal->tx_zero_length);
210 
211 #if 0
212 	// MPP Coaxial mode select Ch1~4
213 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x01);
214 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xA8, 0x08);
215 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xA9, 0x09);
216 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xAA, 0x0A);
217 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xAB, 0x0B);
218 
219 	// Coaxial each mode set
220 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x05+ch%4);
221 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x2F, 0x00);
222 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x30, 0xE0);
223 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x31, 0x43);
224 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x32, 0xA2);
225 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x7C, CoaxVal->rx_src);
226 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x7D, CoaxVal->rx_slice_lev);
227 
228 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
229 
230 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x00+((ch%2)*0x80), CoaxVal->tx_baud[distance]);
231 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x02+((ch%2)*0x80), CoaxVal->tx_pel_baud[distance]);
232 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x03+((ch%2)*0x80), CoaxVal->tx_line_pos0[distance]);
233 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x04+((ch%2)*0x80), CoaxVal->tx_line_pos1[distance]);
234 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x05+((ch%2)*0x80), CoaxVal->tx_line_count);
235 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x07+((ch%2)*0x80), CoaxVal->tx_pel_line_pos0[distance]);
236 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x08+((ch%2)*0x80), CoaxVal->tx_pel_line_pos1[distance]);
237 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0A+((ch%2)*0x80), CoaxVal->tx_line_count_max);
238 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0B+((ch%2)*0x80), CoaxVal->tx_mode);
239 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0D+((ch%2)*0x80), CoaxVal->tx_sync_pos0[distance]);
240 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0E + ((ch%2)*0x80), CoaxVal->tx_sync_pos1[distance]);
241 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x2F+((ch%2)*0x80), CoaxVal->tx_even);
242 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0C+((ch%2)*0x80), CoaxVal->tx_zero_length);
243 #endif
244 
245 #if DBG_TX_INIT_PRINT
246 	printk("[drv]tx_src:            5x7C>> 0x%02X\n", CoaxVal->rx_src);
247 	printk("[drv]tx_slice_lev:      5x7D>> 0x%02X\n", CoaxVal->rx_slice_lev);
248 	printk("[drv]tx_pel_baud:       3x02>> 0x%02X\n", CoaxVal->tx_baud[distance]);
249 	printk("[drv]tx_pel_line_pos0:  3x07>> 0x%02X\n", CoaxVal->tx_pel_line_pos0[distance]);
250 	printk("[drv]tx_pel_line_pos1:  3x08>> 0x%02X\n", CoaxVal->tx_pel_line_pos1[distance]);
251 	printk("[drv]tx_mode:           3x0B>> 0x%02X\n", CoaxVal->tx_mode);
252 	printk("[drv]tx_baud:           3x00>> 0x%02X\n", CoaxVal->tx_baud[distance]);
253 	printk("[drv]tx_line_pos0:      3x03>> 0x%02X\n", CoaxVal->tx_line_pos0[distance]);
254 	printk("[drv]tx_line_pos1:      3x04>> 0x%02X\n", CoaxVal->tx_line_pos1[distance]);
255 	printk("[drv]tx_line_count:     3x05>> 0x%02X\n", CoaxVal->tx_line_count);
256 	printk("[drv]tx_line_count_max: 3x0A>> 0x%02X\n", CoaxVal->tx_line_count_max);
257 	printk("[drv]tx_sync_pos0:      3x0D>> 0x%02X\n", CoaxVal->tx_sync_pos0[distance]);
258 	printk("[drv]tx_sync_pos1:      3x0E>> 0x%02X\n", CoaxVal->tx_sync_pos1[distance]);
259 	printk("[drv]tx_even:           3x2F>> 0x%02X\n", CoaxVal->tx_even);
260 	printk("[drv]tx_zero_length:    3x0C>> 0x%02X\n", CoaxVal->tx_zero_length);
261 #endif
262 
263 }
264 
265 /**************************************************************************************
266  * @desc
267  *	JAGUAR1's This function initializes the register associated with the UP Stream..
268  *
269  * @param_in		(NC_VD_COAX_Tx_Init_STR *)coax_tx_mode			UP Stream Initialize structure
270  *
271  * @return	void		 								None
272  *
273  * ioctl : IOC_VDEC_COAX_TX_INIT
274  ***************************************************************************************/
coax_tx_16bit_init(void * p_param)275 void coax_tx_16bit_init(void *p_param)
276 {
277 	NC_VD_COAX_STR *coax_tx = (NC_VD_COAX_STR *)p_param;
278 	NC_VD_COAX_Init_STR *CoaxVal;
279 
280 	int ch = coax_tx->ch;
281 	int fmt = coax_tx->vivo_fmt;
282 	unsigned char distance = 0;
283 
284 	if ((fmt == AHD20_720P_25P) || (fmt == AHD20_720P_30P) ||\
285 			(fmt == AHD20_720P_25P_EX) || (fmt == AHD20_720P_30P_EX) ||\
286 			(fmt == AHD20_720P_25P_EX_Btype) || (fmt == AHD20_720P_30P_EX_Btype)) {
287 		sensor_dbg("[drv_coax]Ch: %d ACP 16bit initialize!!!\n", ch);
288 	} else if ((fmt == CVI_4M_25P) || (fmt == CVI_4M_30P) ||\
289 			(fmt == CVI_8M_15P) || (fmt == CVI_8M_12_5P)) {
290 		sensor_dbg("[drv_coax]Ch: %d CVI New Protocol initialize!!!\n", ch);
291 	} else {
292 		sensor_dbg("[drv_coax]Ch: %d Can not initialize!! Unsupported format!!\n", ch);
293 		return;
294 	}
295 
296 	CoaxVal = __NC_VD_COAX_16bit_InitFormat_Get(coax_tx->vivo_fmt);
297 	sensor_dbg("[drv_coax]Ch: %d Format >>>>> %s\n", ch, CoaxVal->name);
298 
299 #if 0
300 	gpio_i2c_write(jaguar1_i2c_addr[chip_num], 0xFF, 0x13);
301 	distance = gpio_i2c_read(jaguar1_i2c_addr[chip_num], (0xA0+ch)); /* 0:short, 1:100m, 2:200m, 3:300m, 4:400m, 5:500m, 0x0F:Unknown*/
302 
303 	distance = distance&0x0F;
304 	if (distance == 0x0F) {
305 		printk("DRV::Cable distance Unknown!!\n");
306 		distance = 0;
307 	} else
308 		printk("DRV::Cable distance(%x)\n", distance);
309 #endif
310 
311 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x01);
312 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xA8, 0x00);
313 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xA9, 0x00);
314 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xAA, 0x00);
315 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xAB, 0x00);
316 
317 /*	// Coaxial each mode set
318 	//gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x05+ch%4);  // BANK 5
319 	//gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x2F, 0x00);       // MPP_H_INV, MPP_V_INV, MPP_F_INV
320 	//gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x30, 0xE0);       // MPP_H_S[7~4], MPP_H_E[3:0]
321 	//gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x31, 0x43);       // MPP_H_S[7:0]
322 	//gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x32, 0xA2);       // MPP_H_E[7:0]*/
323 
324 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
325 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x7C, CoaxVal->rx_src);
326 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x7D, CoaxVal->rx_slice_lev);
327 
328 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
329 
330 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x00+((ch%2)*0x80), CoaxVal->tx_baud[distance]);
331 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x02+((ch%2)*0x80), CoaxVal->tx_pel_baud[distance]);
332 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x03+((ch%2)*0x80), CoaxVal->tx_line_pos0[distance]);
333 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x04+((ch%2)*0x80), CoaxVal->tx_line_pos1[distance]);
334 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x05+((ch%2)*0x80), CoaxVal->tx_line_count);
335 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x07+((ch%2)*0x80), CoaxVal->tx_pel_line_pos0[distance]);
336 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x08+((ch%2)*0x80), CoaxVal->tx_pel_line_pos1[distance]);
337 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0A+((ch%2)*0x80), CoaxVal->tx_line_count_max);
338 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0B+((ch%2)*0x80), CoaxVal->tx_mode);
339 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0D+((ch%2)*0x80), CoaxVal->tx_sync_pos0[distance]);
340 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0E + ((ch%2)*0x80), CoaxVal->tx_sync_pos1[distance]);
341 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x2F+((ch%2)*0x80), CoaxVal->tx_even);
342 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0C+((ch%2)*0x80), CoaxVal->tx_zero_length);
343 
344 #if DBG_TX_INIT_PRINT
345 	printk("[drv]tx_src:            5x7C>> 0x%02X\n", CoaxVal->rx_src);
346 	printk("[drv]tx_slice_lev:      5x7D>> 0x%02X\n", CoaxVal->rx_slice_lev);
347 	printk("[drv]tx_pel_baud:       3x02>> 0x%02X\n", CoaxVal->tx_baud[distance]);
348 	printk("[drv]tx_pel_line_pos0:  3x07>> 0x%02X\n", CoaxVal->tx_pel_line_pos0[distance]);
349 	printk("[drv]tx_pel_line_pos1:  3x08>> 0x%02X\n", CoaxVal->tx_pel_line_pos1[distance]);
350 	printk("[drv]tx_mode:           3x0B>> 0x%02X\n", CoaxVal->tx_mode);
351 	printk("[drv]tx_baud:           3x00>> 0x%02X\n", CoaxVal->tx_baud[distance]);
352 	printk("[drv]tx_line_pos0:      3x03>> 0x%02X\n", CoaxVal->tx_line_pos0[distance]);
353 	printk("[drv]tx_line_pos1:      3x04>> 0x%02X\n", CoaxVal->tx_line_pos1[distance]);
354 	printk("[drv]tx_line_count:     3x05>> 0x%02X\n", CoaxVal->tx_line_count);
355 	printk("[drv]tx_line_count_max: 3x0A>> 0x%02X\n", CoaxVal->tx_line_count_max);
356 	printk("[drv]tx_sync_pos0:      3x0D>> 0x%02X\n", CoaxVal->tx_sync_pos0[distance]);
357 	printk("[drv]tx_sync_pos1:      3x0E>> 0x%02X\n", CoaxVal->tx_sync_pos1[distance]);
358 	printk("[drv]tx_even:           3x2F>> 0x%02X\n", CoaxVal->tx_even);
359 	printk("[drv]tx_zero_length:    3x0C>> 0x%02X\n", CoaxVal->tx_zero_length);
360 #endif
361 
362 }
363 
364 /**************************************************************************************
365  * @desc
366  *	JAGUAR1's Send UP Stream command.
367  *
368  * @param_in		(NC_VD_COAX_SET_STR *)coax_tx_mode			    UP Stream Command structure
369  *
370  * @return	void		 								None
371  *
372  * ioctl : IOC_VDEC_COAX_TX_CMD_SEND
373  ***************************************************************************************/
coax_tx_cmd_send(void * p_param)374 void coax_tx_cmd_send(void *p_param)
375 {
376 	NC_VD_COAX_STR *coax_tx = (NC_VD_COAX_STR *)p_param;
377 	int i;
378 	int cmd_cnt = 0;
379 	unsigned char ch              = coax_tx->ch;
380 	NC_COAX_CMD_DEF cmd           = coax_tx->cmd;
381 	NC_FORMAT_STANDARD format     = coax_tx->format_standard;
382 	NC_VIVO_CH_FORMATDEF vivofmt  = coax_tx->vivo_fmt;
383 
384 	unsigned char tx_bank          = 0x00;
385 	unsigned char tx_cmd_addr      = 0x00;
386 	unsigned char tx_shot_addr     = 0x00;
387 	unsigned char command[32]      = {0,};
388 	unsigned char TCP_CMD_Stop_v10[10] = {0xb5, 0x00, 0x14, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc9, 0x80};
389 	unsigned char TCP_CMD_Stop_v20[10] = {0xb5, 0x01, 0x14, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc5, 0x80};
390 
391 
392 	NC_VD_COAX_Init_STR *CoaxVal = __NC_VD_COAX_InitFormat_Get(vivofmt);
393 	NC_VD_ACP_CMDDEF_STR *pCMD   = __NC_VD_ACP_Get_CommandFormat_Get(cmd);
394 	sensor_dbg("[drv_coax]Ch: %d Command >>>>> %s\n", ch, pCMD->name);
395 
396 	tx_bank      = CoaxVal->tx_bank;
397 	tx_cmd_addr  = CoaxVal->tx_cmd_addr;
398 	tx_shot_addr = CoaxVal->tx_shot_addr;
399 
400 	cmd_cnt = __NC_VD_COAX_Command_Copy(format, vivofmt, command, pCMD);
401 
402 	if (format == FMT_SD) {
403 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, tx_bank+((ch%4)/2));
404 		for (i = 0; i < cmd_cnt; i++) {
405 			gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], (tx_cmd_addr+((ch%2)*0x80))+i, 0);
406 		}
407 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
408 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x01);
409 		msleep(CoaxVal->shot_delay);
410 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x00);
411 
412 		msleep(CoaxVal->reset_delay);
413 
414 		for (i = 0; i < cmd_cnt; i++) {
415 			gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], (tx_cmd_addr+((ch%2)*0x80))+i, command[i]);
416 		}
417 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
418 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x01);
419 		msleep(CoaxVal->shot_delay);
420 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x00);
421 	} else if (format == FMT_CVI) {
422 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, tx_bank+(ch%4));
423 		for (i = 0; i < cmd_cnt; i++) {
424 			gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_cmd_addr+i, command[i]);
425 			gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x10+i, 0xff);
426 		}
427 
428 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
429 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x01);
430 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x00);
431 	} else {
432 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, tx_bank+((ch%4)/2));
433 		for (i = 0; i < cmd_cnt; i++) {
434 			gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], (tx_cmd_addr+((ch%2)*0x80))+i, command[i]);
435 		}
436 
437 
438 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
439 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x01);
440 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x00);
441 	}
442 
443 	if (format == FMT_TVI) {
444 		msleep(30);
445 		if ((vivofmt == TVI_4M_30P) || (vivofmt == TVI_4M_25P) || (vivofmt == TVI_4M_15P)) {
446 			gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, tx_bank+((ch%4)/2));
447 			for (i = 0; i < 10; i++) {
448 				gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_cmd_addr+((ch%2)*0x80)+i, TCP_CMD_Stop_v20[i]);
449 			}
450 		} else {
451 			gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, tx_bank+((ch%4)/2));
452 			for (i = 0; i < 10; i++) {
453 				gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_cmd_addr+((ch%2)*0x80)+i, TCP_CMD_Stop_v10[i]);
454 			}
455 		}
456 
457 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x01);
458 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x00);
459 	}
460 }
461 
462 /**************************************************************************************
463  * @desc
464  *	JAGUAR1's Send UP Stream command.
465  *
466  * @param_in		(NC_VD_COAX_SET_STR *)coax_tx_mode			    UP Stream Command structure
467  *
468  * @return	void		 								None
469  *
470  * ioctl : IOC_VDEC_COAX_TX_CMD_SEND
471  ***************************************************************************************/
coax_tx_16bit_cmd_send(void * p_param)472 void coax_tx_16bit_cmd_send(void *p_param)
473 {
474 	NC_VD_COAX_STR *coax_tx = (NC_VD_COAX_STR *)p_param;
475 	int i;
476 	int cmd_cnt = 0;
477 	unsigned char ch              = coax_tx->ch;
478 	NC_COAX_CMD_DEF cmd           = coax_tx->cmd;
479 	NC_FORMAT_STANDARD format     = coax_tx->format_standard;
480 	NC_VIVO_CH_FORMATDEF vivofmt  = coax_tx->vivo_fmt;
481 
482 	unsigned char tx_bank          = 0x00;
483 	unsigned char tx_cmd_addr      = 0x00;
484 	unsigned char tx_shot_addr     = 0x00;
485 	unsigned char command[32]      = {0, };
486 
487 	NC_VD_COAX_Init_STR *CoaxVal = __NC_VD_COAX_InitFormat_Get(vivofmt);
488 	NC_VD_ACP_CMDDEF_STR *pCMD   = __NC_VD_ACP_Get_CommandFormat_Get(cmd);
489 	sensor_dbg("[drv_coax]Ch: %d 16bit Command >>>>> %s\n", ch, pCMD->name);
490 
491 	tx_bank      = CoaxVal->tx_bank;
492 	tx_cmd_addr  = CoaxVal->tx_cmd_addr;
493 	tx_shot_addr = CoaxVal->tx_shot_addr;
494 
495 	cmd_cnt = __NC_VD_COAX_16bit_Command_Copy(format, vivofmt, command, pCMD);
496 
497 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
498 
499 	for (i = 0; i < cmd_cnt; i++) {
500 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x20+((ch%2)*0x80)+i, 0);
501 	}
502 
503 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
504 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0c+((ch%2)*0x80), 0x01);
505 	msleep(30);
506 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0c+((ch%2)*0x80), 0x00);
507 
508 
509 	for (i = 0; i < cmd_cnt; i++) {
510 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x20+((ch%2)*0x80)+i, command[i]);
511 	}
512 
513 
514 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
515 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0c+((ch%2)*0x80), 0x01);
516 	msleep(30);
517 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0x0c+((ch%2)*0x80), 0x00);
518 
519 }
520 
coax_tx_cvi_new_cmd_send(void * p_param)521 void coax_tx_cvi_new_cmd_send(void *p_param)
522 {
523 	NC_VD_COAX_STR *coax_tx = (NC_VD_COAX_STR *)p_param;
524 	int i;
525 	int cmd_cnt = 0;
526 
527 	unsigned char ch              = coax_tx->ch;
528 	NC_COAX_CMD_DEF cmd           = coax_tx->cmd;
529 	NC_FORMAT_STANDARD format     = coax_tx->format_standard;
530 	NC_VIVO_CH_FORMATDEF vivofmt  = coax_tx->vivo_fmt;
531 
532 	unsigned char tx_bank          = 0x00;
533 	unsigned char tx_cmd_addr      = 0x00;
534 	unsigned char tx_shot_addr     = 0x00;
535 	unsigned char command[32]      = {0,};
536 
537 
538 	NC_VD_COAX_Init_STR *CoaxVal = __NC_VD_COAX_InitFormat_Get(vivofmt);    // Get from Coax_Tx_Init Table
539 	NC_VD_ACP_CMDDEF_STR *pCMD   = __NC_VD_ACP_Get_CommandFormat_Get(cmd);  // Get From Coax_Tx_Command Table
540 	printk("[drv_coax]Ch: %d Command >>>>> %s\n", ch, pCMD->name);
541 
542 	tx_bank      = CoaxVal->tx_bank;
543 	tx_cmd_addr  = CoaxVal->tx_cmd_addr;
544 	tx_shot_addr = CoaxVal->tx_shot_addr;
545 
546 
547 	cmd_cnt = __NC_VD_COAX_16bit_Command_Copy(format, vivofmt, command, pCMD);
548 
549 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, tx_bank+(ch%4));
550 	for (i = 0; i < cmd_cnt; i++) {
551 		gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_cmd_addr+i, command[i]);
552 	}
553 
554 
555 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], 0xFF, 0x02+((ch%4)/2));
556 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x01);
557 	gpio_i2c_write(jaguar1_i2c_addr[coax_tx->vd_dev], tx_shot_addr+((ch%2)*0x80), 0x00);
558 }
559 
560 /*=======================================================================================================
561  ********************************************************************************************************
562  **************************** Coaxial protocol down stream function *************************************
563  ********************************************************************************************************
564  *
565  * Coaxial protocol down stream Flow
566  * 1. Down stream initialize   -  coax_rx_init
567  * 2. Down stream data read    -  coax_rx_data_get
568  *
569  * Coaxial protocol down stream register(example: channel 0)
570  * (3x63) rx_comm_on         : Coaxial Down Stream Mode ON/OFF ( 0: OFF / 1: ON )
571  * (3x62) rx_area            : Down Stream Read Line Number
572  * (3x66) rx_signal_enhance  : Signal Enhance ON/OFF ( 0: OFF / 1: ON )
573  * (3x69) rx_manual_duty     : 1 Bit Duty Setting ( HD@25, 30P 0x32  /  HD@50, 60P, FHD@25, 30P 0x64 )
574  * (3x60) rx_head_matching   : Same Header Read (EX. 0x48)
575  * (3x61) rx_data_rz         : The lower 2 bits set Coax Mode.. ( 0 : A-CP ), ( 1 : C-CP ), ( 2 : T-CP )
576  * (3x68) rx_sz              : Down stream size setting
577  * (3x3A)                    : Down stream buffer clear
578  ========================================================================================================*/
579 /**************************************************************************************
580  * @desc
581  *	JAGUAR1's   This function initializes the register associated with the Down Stream.
582  *
583  * @param_in		(NC_VD_COAX_SET_STR *)coax_tx_mode			    Down Stream Initialize structure
584  *
585  * @return	void		 								None
586  *
587  * ioctl : IOC_VDEC_COAX_RX_INIT
588  ***************************************************************************************/
coax_rx_init(void * p_param)589 void coax_rx_init(void *p_param)
590 {
591 	NC_VD_COAX_STR *coax_rx = (NC_VD_COAX_STR *)p_param;
592 	unsigned char ch             = coax_rx->ch;
593 	NC_VIVO_CH_FORMATDEF vivofmt = coax_rx->vivo_fmt;
594 
595 	NC_VD_COAX_Init_STR *coax_rx_val = __NC_VD_COAX_InitFormat_Get(vivofmt);
596 
597 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0xFF,  0x02+((ch%4)/2));
598 
599 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0x63+((ch%2)*0x80), coax_rx_val->rx_comm_on);
600 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0x62+((ch%2)*0x80), coax_rx_val->rx_area);
601 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0x66+((ch%2)*0x80), coax_rx_val->rx_signal_enhance);
602 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0x69+((ch%2)*0x80), coax_rx_val->rx_manual_duty);
603 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0x60+((ch%2)*0x80), coax_rx_val->rx_head_matching);
604 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0x61+((ch%2)*0x80), coax_rx_val->rx_data_rz);
605 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0x68+((ch%2)*0x80), coax_rx_val->rx_sz);
606 	sensor_dbg("[drv]Channel %d Format >>>>> %s\n", ch, coax_rx_val->name);
607 	sensor_dbg("[drv]rx_head_matching:  0x60 >> 0x%02X\n", coax_rx_val->rx_head_matching);
608 	sensor_dbg("[drv]rx_data_rz:        0x61 >> 0x%02X\n", coax_rx_val->rx_data_rz);
609 	sensor_dbg("[drv]rx_area:           0x62 >> 0x%02X\n", coax_rx_val->rx_area);
610 	sensor_dbg("[drv]rx_comm_on:        0x63 >> 0x%02X\n", coax_rx_val->rx_comm_on);
611 	sensor_dbg("[drv]rx_signal_enhance: 0x66 >> 0x%02X\n", coax_rx_val->rx_signal_enhance);
612 	sensor_dbg("[drv]rx_sz:             0x68 >> 0x%02X\n", coax_rx_val->rx_sz);
613 	sensor_dbg("[drv]rx_manual_duty:    0x69 >> 0x%02X\n", coax_rx_val->rx_manual_duty);
614 
615 }
616 
617 /**************************************************************************************
618  * @desc
619  *	JAGUAR1's   Read down stream data.
620  *
621  * @param_in		(NC_VD_COAX_SET_STR *)coax_tx_mode			    Down Stream read structure
622  *
623  * @return	void		 								None
624  *
625  * ioctl : IOC_VDEC_COAX_RX_DATA_READ
626  ***************************************************************************************/
coax_rx_data_get(void * p_param)627 void coax_rx_data_get(void *p_param)
628 {
629 	NC_VD_COAX_STR *coax_rx = (NC_VD_COAX_STR *)p_param;
630 
631 	int ii = 0;
632 	int ch = coax_rx->ch;
633 	int format = coax_rx->format_standard;
634 
635 	gpio_i2c_write(jaguar1_i2c_addr[coax_rx->vd_dev], 0xFF, 0x02+((ch%4)/2));
636 
637 	if ((format == FMT_CVI) || (format == FMT_TVI)) {
638 		for (ii = 0; ii < 5; ii++) {
639 			coax_rx->rx_data1[ii] = gpio_i2c_read(jaguar1_i2c_addr[coax_rx->vd_dev], (0x40+((ch%2)*0x80))+ii);
640 			coax_rx->rx_data2[ii] = gpio_i2c_read(jaguar1_i2c_addr[coax_rx->vd_dev], (0x45+((ch%2)*0x80))+ii);
641 			coax_rx->rx_data3[ii] = gpio_i2c_read(jaguar1_i2c_addr[coax_rx->vd_dev], (0x4A+((ch%2)*0x80))+ii);
642 			coax_rx->rx_data4[ii] = gpio_i2c_read(jaguar1_i2c_addr[coax_rx->vd_dev], (0x6C+((ch%2)*0x80))+ii);
643 			coax_rx->rx_data5[ii] = gpio_i2c_read(jaguar1_i2c_addr[coax_rx->vd_dev], (0x71+((ch%2)*0x80))+ii);
644 			coax_rx->rx_data6[ii] = gpio_i2c_read(jaguar1_i2c_addr[coax_rx->vd_dev], (0x76+((ch%2)*0x80))+ii);
645 		}
646 	} else {
647 		for (ii = 0; ii < 8; ii++) {
648 			coax_rx->rx_pelco_data[ii] = gpio_i2c_read(jaguar1_i2c_addr[coax_rx->vd_dev], (0x50+((ch%2)*0x80))+ii);
649 		}
650 	}
651 }
652 
653 /**************************************************************************************
654  * @desc
655  *	JAGUAR1's   Down stream buffer clear.
656  *
657  * @param_in		(NC_VD_COAX_SET_STR *)coax_tx_mode			    UP Stream Command structure
658  *
659  * @return	void		 								None
660  *
661  * ioctl : IOC_VDEC_COAX_RX_BUF_CLEAR
662  ***************************************************************************************/
coax_rx_buffer_clear(void * p_param)663 void coax_rx_buffer_clear(void *p_param)
664 {
665 	NC_VD_COAX_STR *coax_val = (NC_VD_COAX_STR *)p_param;
666 
667 	unsigned char ch = coax_val->ch;
668 
669 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0xFF, 0x02+((ch%4)/2));
670 
671 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x3A+((ch%2)*0x80), 0x01);
672 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x3A+((ch%2)*0x80), 0x00);
673 }
674 
675 /**************************************************************************************
676  * @desc
677  *	JAGUAR1's   Down stream mode off.
678  *
679  * @param_in		(NC_VD_COAX_SET_STR *)coax_tx_mode			    UP Stream Command structure
680  *
681  * @return	void		 								None
682  *
683  * ioctl : IOC_VDEC_COAX_RX_DEINIT
684  ***************************************************************************************/
coax_rx_deinit(void * p_param)685 void coax_rx_deinit(void *p_param)
686 {
687 	NC_VD_COAX_STR *coax_val = (NC_VD_COAX_STR *)p_param;
688 
689 	unsigned char ch = coax_val->ch;
690 
691 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0xFF, 0x02+((ch%4)/2));
692 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x63+((ch%2)*0x80), 0);
693 }
694 
695 /*=======================================================================================================
696  ********************************************************************************************************
697  ************************** Coaxial protocol firmware upgrade function **********************************
698  ********************************************************************************************************
699  *
700  * Coaxial protocol firmware upgrade Flow
701  * 1. ACP Check - Down Stream Header 0x55  - coax_fw_ready_header_check_from_isp_recv
702  * 2.1 FW ready send                       - coax_fw_ready_cmd_to_isp_send
703  * 2.2 FW ready ACK receive                - coax_fw_ready_cmd_ack_from_isp_recv
704  * 3.1 FW start send                       - coax_fw_start_cmd_to_isp_send
705  * 3.2 FW start ACK receive                - coax_fw_start_cmd_ack_from_isp_recv
706  * 4.1 FW data send - 139byte   	   - coax_fw_one_packet_data_to_isp_send
707  * 4.2 FW data ACK receive - offset        - coax_fw_one_packet_data_ack_from_isp_recv
708  * 5.1 FW end send                         - coax_fw_end_cmd_to_isp_send
709  * 5.2 FW end ACK receive                  - coax_fw_end_cmd_ack_from_isp_recv
710  ========================================================================================================*/
711 
712 /**************************************************************************************
713  * @desc
714  *	JAGUAR1's   Down stream check header value.(AHD : 0x55)
715  *
716  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel       FW Update channel
717  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->result        Header check result
718  *
719  * @return	void		 								None
720  *
721  * ioctl : IOC_VDEC_COAX_FW_ACP_HEADER_GET
722  ***************************************************************************************/
coax_fw_ready_header_check_from_isp_recv(void * p_param)723 void coax_fw_ready_header_check_from_isp_recv(void *p_param)
724 {
725 	int ret = FW_FAILURE;
726 	int ch = 0;
727 	int devnum = 0;
728 	unsigned char readval = 0;
729 
730 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
731 	ch = pstFileInfo->channel;
732 	devnum = pstFileInfo->channel/4;
733 
734 	/* set register */
735 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
736 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x50+((ch%2)*0x80), 0x05);  /* PELCO Down Stream Read 1st Line*/
737 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x60+((ch%2)*0x80), 0x55);  /*Header Matching*/
738 
739 	/* If the header is (0x50=>0x55) and chip information is (0x51=>0x3X, 0x4X, 0x5X ), it can update firmware */
740 	if (gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x50+((ch%2)*0x80)) == 0x55) {
741 		sensor_dbg(">>>>> DRV[%s:%d] CH:%d, this camera can update, please, wait! = 0x%x\n", __func__, __LINE__, ch, gpio_i2c_read(jaguar1_i2c_addr[ch/4], 0x51+((ch%2)*0x80)));
742 		ret = FW_SUCCESS;
743 	} else {
744 		readval = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x50+((ch%2)*0x80));
745 		sensor_dbg(">>>>> DRV[%s:%d] check ACP_STATUS_MODE::0x%x\n", __func__, __LINE__, readval);
746 		ret = FW_FAILURE;
747 	}
748 
749 	pstFileInfo->result = ret;
750 }
751 
752 /**************************************************************************************
753  * @desc
754  *	JAGUAR1's   FW Ready command send to camera ( Mode change to FHD@25P )
755  *
756  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel       FW Update channel
757  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->cp_mode       Camera Format
758  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->result        Function execution result
759  *
760  * @return	void		 								None
761  *
762  * ioctl : IOC_VDEC_COAX_FW_READY_CMD_SET
763  ***************************************************************************************/
coax_fw_ready_cmd_to_isp_send(void * p_param)764 void coax_fw_ready_cmd_to_isp_send(void *p_param) // FW Ready
765 {
766 	int ch = 0;
767 	int devnum = 0;
768 	int ret = FW_FAILURE;
769 	int cp_mode = 0;
770 
771 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
772 	ch = pstFileInfo->channel;
773 	cp_mode = pstFileInfo->cp_mode;
774 	devnum = pstFileInfo->channel/4;
775 
776 	/* Adjust Tx */
777 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
778 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x0A+((ch%2)*0x80), 0x04);  /* Tx Line count max*/
779 
780 	/* change video mode FHD@25P Command Send */
781 	if ((cp_mode == FMT_AHD20) || (cp_mode == FMT_AHD30)) {
782 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x10+((ch%2)*0x80), 0x60);
783 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x11+((ch%2)*0x80), 0xB0);
784 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x12+((ch%2)*0x80), 0x02);
785 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x13+((ch%2)*0x80), 0x02);
786 
787 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x08);
788 		msleep(200);
789 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x10);
790 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x00);
791 		sensor_dbg(">>>>> DRV[%s:%d] CH:%d, coax_fw_ready_cmd_to_isp_send!!- AHD\n", __func__, __LINE__, ch);
792 		ret = FW_SUCCESS;
793 	} else if ((cp_mode == FMT_CVI) || (cp_mode == FMT_TVI)) {
794 		/* change video mode FHD@25P Command Send */
795 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
796 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x10+((ch%2)*0x80), 0x55);
797 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x11+((ch%2)*0x80), 0x60);
798 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x12+((ch%2)*0x80), 0xB0);
799 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x13+((ch%2)*0x80), 0x02);
800 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x14+((ch%2)*0x80), 0x00);
801 
802 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x08);
803 		msleep(1000);
804 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x10);
805 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x00);
806 		sensor_dbg(">>>>> DRV[%s:%d] CH:%d, coax_fw_ready_cmd_to_isp_send!!- AHD\n", __func__, __LINE__, ch);
807 		ret = FW_SUCCESS;
808 	} else {
809 		sensor_dbg(">>>> DRV[%s:%d] CH:%d, FMT:%d > Unknown Format!!! \n", __func__, __LINE__, ch, cp_mode);
810 		ret = FW_FAILURE;
811 	}
812 
813 	pstFileInfo->result = ret;
814 }
815 
816 /**************************************************************************************
817  * @desc
818  *	JAGUAR1's   FW Ready ACK receive from camera
819  *
820  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel       FW Update channel
821 
822  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->result        Function execution result
823  *
824  * @return	void		 								None
825  *
826  * ioctl : IOC_VDEC_COAX_FW_READY_ACK_GET
827  ***************************************************************************************/
coax_fw_ready_cmd_ack_from_isp_recv(void * p_param)828 void coax_fw_ready_cmd_ack_from_isp_recv(void *p_param)
829 {
830 	static int toggle;
831 	int ret = FW_FAILURE;
832 	int ch = 0;
833 	int devnum = 0;
834 	unsigned char retval = 0x00;
835 	unsigned char retval2 = 0x00;
836 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
837 	ch = pstFileInfo->channel;
838 	devnum = pstFileInfo->channel/4;
839 
840 
841 	/* AHD FHD 25P Video Setting  */
842 	if (!toggle) {
843 		video_input_init vd_set;
844 		vd_set.ch = ch;
845 		vd_set.format = AHD20_1080P_25P;
846 		vd_set.input = SINGLE_ENDED;
847 		vd_jaguar1_init_set(&vd_set);
848 		toggle = 1 ;
849 	}
850 
851 	/* Adjust Rx FHD@25P */
852 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
853 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x63+((ch%2)*0x80), 0x01);
854 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x62+((ch%2)*0x80), 0x05);
855 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x66+((ch%2)*0x80), 0x81);
856 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x69+((ch%2)*0x80), 0x2D);
857 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x60+((ch%2)*0x80), 0x55);
858 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x61+((ch%2)*0x80), 0x00);
859 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x68+((ch%2)*0x80), 0x80);
860 
861 	if (gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x57+((ch%2)*0x80)) == 0x02) {
862 		/* get status, If the status is 0x00(Camera information), 0x01(Firmware version */
863 		if (gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x56+((ch%2)*0x80)) == 0x00) {
864 			printk(">>>>> DRV[%s:%d]CH:%d Receive ISP status : [READY]\n", __func__, __LINE__, ch);
865 			ret = FW_SUCCESS;
866 		}
867 	} else {
868 		retval  = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x56+((ch%2)*0x80));
869 		retval2 = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x57+((ch%2)*0x80));
870 		printk(">>>>> DRV[%s:%d]CH:%d retry : Receive ISP status[READY], [0x56-true[0x00]:0x%x], [0x57-true[0x02]:0x%x]\n", __func__, __LINE__, ch, retval, retval2);
871 		ret = FW_FAILURE;
872 	}
873 
874 	/* Rx Buffer clear */
875 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
876 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x3A+((ch%2)*0x80), 0x01);
877 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x3A+((ch%2)*0x80), 0x00);
878 
879 	pstFileInfo->result = ret;
880 }
881 
882 /**************************************************************************************
883  * @desc
884  *	JAGUAR1's   FW start command send to camera ( change to black pattern )
885  *
886  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel       FW Update channel
887  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->cp_mode       Camera Format
888  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->result        Function execution result
889  *
890  * @return	void		 								None
891  *
892  * ioctl : IOC_VDEC_COAX_FW_START_CMD_SET
893  ***************************************************************************************/
coax_fw_start_cmd_to_isp_send(void * p_param)894 void coax_fw_start_cmd_to_isp_send(void *p_param)
895 {
896 	int ch = 0;
897 	int devnum = 0;
898 
899 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
900 
901 	ch = pstFileInfo->channel;
902 	devnum = pstFileInfo->channel/4;
903 
904 	/* Adjust Tx */
905 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
906 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x00+((ch%2)*0x80), 0x2D);
907 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x03+((ch%2)*0x80), 0x0D);
908 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x05+((ch%2)*0x80), 0x03);
909 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x0A+((ch%2)*0x80), 0x04);
910 
911 	// Tx Command set
912 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x10+((ch%2)*0x80), 0x60);
913 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x11+((ch%2)*0x80), 0xB0);
914 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x12+((ch%2)*0x80), 0x02);
915 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x13+((ch%2)*0x80), 0x40);
916 
917 	// Tx Command Shot
918 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x08);
919 	msleep(200);
920 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x10);
921 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x00);
922 
923 	sensor_dbg(">>>>> DRV[%s:%d]CH:%d >> Send command[START]\n", __func__, __LINE__, ch);
924 }
925 
926 /**************************************************************************************
927  * @desc
928  *	JAGUAR1's    FW Start ACK receive from camera
929  *
930  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel       FW Update channel
931  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->cp_mode       Camera Format
932  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->result        Function execution result
933  *
934  * @return	void		 								None
935  *
936  * ioctl : IOC_VDEC_COAX_FW_START_ACK_GET
937  ***************************************************************************************/
938 
coax_fw_start_cmd_ack_from_isp_recv(void * p_param)939 void coax_fw_start_cmd_ack_from_isp_recv(void *p_param)
940 {
941 	int ch = 0;
942 	int devnum = 0;
943 	int ret = FW_FAILURE;
944 
945 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
946 	ch = pstFileInfo->channel;
947 	devnum = pstFileInfo->channel/4;
948 
949 	/* Adjust Rx FHD@25P */
950 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
951 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x63+((ch%2)*0x80), 0x01);
952 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x62+((ch%2)*0x80), 0x05);
953 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x66+((ch%2)*0x80), 0x81);
954 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x69+((ch%2)*0x80), 0x2D);
955 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x60+((ch%2)*0x80), 0x55);
956 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x61+((ch%2)*0x80), 0x00);
957 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x68+((ch%2)*0x80), 0x8);
958 
959 	if (gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x57+((ch%2)*0x80)) == 0x02) {
960 		if (gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x56+((ch%2)*0x80)) == 0x02) {
961 			printk(">>>>> DRV[%s:%d]CH:%d Receive ISP status : [START]\n", __func__, __LINE__, ch);
962 			ret = FW_SUCCESS;
963 		} else {
964 			unsigned char retval1;
965 			unsigned char retval2;
966 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
967 			retval1 = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x56+((ch%2)*0x80));
968 			retval2 = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x57+((ch%2)*0x80));
969 			ret = FW_FAILURE;
970 			sensor_dbg(">>>>> DRV[%s:%d]CH:%d retry : Receive ISP status[START], [0x56-true[0x02]:0x%x], [0x57-true[0x02]:0x%x]\n", __func__, __LINE__, ch, retval1, retval2);
971 		}
972 	}
973 
974 	/* Rx Buffer clear */
975 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
976 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x3A+((ch%2)*0x80), 0x01);
977 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x3A+((ch%2)*0x80), 0x00);
978 
979 	pstFileInfo->result = ret;
980 }
981 
982 /**************************************************************************************
983  * @desc
984  *	JAGUAR1's    FW Data send to camera(One packet data size 139byte)
985  *
986  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel                  FW Update channel
987  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->readsize                 One packet data size
988  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->currentFileOffset        File offset
989  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->result                   Function execution result
990  *
991  * @return	void		 								           None
992  *
993  * ioctl : IOC_VDEC_COAX_FW_SEND_DATA_SET
994  ***************************************************************************************/
coax_fw_one_packet_data_to_isp_send(void * p_param)995 void coax_fw_one_packet_data_to_isp_send(void *p_param)
996 {
997 	int ch = 0;
998 	int devnum = 0;
999 	int ii = 0;
1000 	unsigned int low = 0x00;
1001 	unsigned int mid = 0x00;
1002 	unsigned int high = 0x00;
1003 	unsigned int readsize = 0;
1004 	int byteNumOfPacket = 0;
1005 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
1006 
1007 	/* file information */
1008 	ch        = pstFileInfo->channel;
1009 	readsize  = pstFileInfo->readsize;
1010 	devnum	  = pstFileInfo->channel/4;
1011 
1012 	/* fill packet(139bytes), end packet is filled with 0xff */
1013 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xff, 0x0c+(ch%4));
1014 	for (ii = 0; ii < 139; ii++) {
1015 		if (byteNumOfPacket < readsize) {
1016 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x00+ii, pstFileInfo->onepacketbuf[ii]);
1017 			byteNumOfPacket++;
1018 		} else if (byteNumOfPacket >= readsize) {
1019 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x00+ii, 0xff);
1020 			byteNumOfPacket++;
1021 		}
1022 
1023 		if (ii == 0)
1024 			low = pstFileInfo->onepacketbuf[ii];
1025 		else if (ii == 1)
1026 			mid = pstFileInfo->onepacketbuf[ii];
1027 		else if (ii == 2)
1028 			high = pstFileInfo->onepacketbuf[ii];
1029 	}
1030 
1031 	/* offset */
1032 	pstFileInfo->currentFileOffset = (unsigned int)((high << 16)&(0xFF0000)) | (unsigned int)((mid << 8)&(0xFF00)) | (unsigned char)(low);
1033 
1034 	/* Tx Change mode to use Big data */
1035 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
1036 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x0B+((ch%2)*0x80), 0x30);
1037 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x05+((ch%2)*0x80), 0x8A);
1038 
1039 	/* Tx Shot */
1040 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
1041 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x08);
1042 }
1043 
1044 /**************************************************************************************
1045  * @desc
1046  *	JAGUAR1's    FW Data ACK receive from camera
1047  *
1048  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel                  FW Update channel
1049  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->currentFileOffset        File offset
1050 
1051  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->result                   Function execution result
1052  *
1053  * @return	void		 								           None
1054  *
1055  * ioctl : IOC_VDEC_COAX_FW_SEND_ACK_GET
1056  ***************************************************************************************/
coax_fw_one_packet_data_ack_from_isp_recv(void * p_param)1057 void coax_fw_one_packet_data_ack_from_isp_recv(void *p_param)
1058 {
1059 	int ret = FW_FAILURE;
1060 	int ch = 0;
1061 	int devnum = 0;
1062 	unsigned int onepacketaddr = 0;
1063 	unsigned int receive_addr = 0;
1064 
1065 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
1066 	ch = pstFileInfo->channel;
1067 	onepacketaddr = pstFileInfo->currentFileOffset;
1068 	devnum = pstFileInfo->channel/4;
1069 
1070 	/* Adjust Rx FHD@25P */
1071 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
1072 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x63+((ch%2)*0x80), 0x01);
1073 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x62+((ch%2)*0x80), 0x05);
1074 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x66+((ch%2)*0x80), 0x81);
1075 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x69+((ch%2)*0x80), 0x2D);
1076 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x60+((ch%2)*0x80), 0x55);
1077 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x61+((ch%2)*0x80), 0x00);
1078 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x68+((ch%2)*0x80), 0x70);
1079 
1080 	if (gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x57+((ch%2)*0x80)) == 0x02) {
1081 		/* check ISP status - only check first packet */
1082 		if (pstFileInfo->currentpacketnum == 0) {
1083 			if (gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x56+((ch%2)*0x80)) == 0x03) {
1084 				pstFileInfo->result = FW_FAILURE;
1085 				printk(">>>>> DRV[%s:%d] CH:%d, Failed, error status, code=3..................\n", __func__, __LINE__, ch);
1086 				return;
1087 			}
1088 		}
1089 
1090 		/* check offset */
1091 		receive_addr = ((gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x53+((ch%2)*0x80))<<16) + \
1092 				(gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x54+((ch%2)*0x80))<<8) +
1093 				gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x55+((ch%2)*0x80)));
1094 		if (onepacketaddr == receive_addr) {
1095 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x10);
1096 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x00);
1097 			ret = FW_SUCCESS;
1098 			pstFileInfo->receive_addr = receive_addr;
1099 			pstFileInfo->result = ret;
1100 		}
1101 	}
1102 
1103 	pstFileInfo->result = ret;
1104 }
1105 
1106 /**************************************************************************************
1107  * @desc
1108  *	JAGUAR1's    FW End command send to camera
1109  *
1110  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel                  FW Update channel
1111  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->result                   FW Data send result
1112  *
1113  * @return	void		 								           None
1114  *
1115  * ioctl : IOC_VDEC_COAX_FW_END_CMD_SET
1116  ***************************************************************************************/
coax_fw_end_cmd_to_isp_send(void * p_param)1117 void coax_fw_end_cmd_to_isp_send(void *p_param)
1118 {
1119 	int ch = 0;
1120 	int devnum = 0;
1121 	int send_success = 0;
1122 
1123 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
1124 
1125 	ch = pstFileInfo->channel;
1126 	send_success = pstFileInfo->result;
1127 	devnum = pstFileInfo->channel/4;
1128 
1129 	/* adjust Tx line */
1130 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
1131 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x0B+((ch%2)*0x80), 0x10);
1132 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x05+((ch%2)*0x80), 0x03);
1133 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x0A+((ch%2)*0x80), 0x03);
1134 
1135 	/* Fill end command */
1136 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x10+((ch%2)*0x80), 0x60);
1137 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x11+((ch%2)*0x80), 0xb0);
1138 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x12+((ch%2)*0x80), 0x02);
1139 	if (send_success == FW_FAILURE) {
1140 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x13+((ch%2)*0x80), 0xE0/*0xC0*/);
1141 		sensor_dbg(">>>>> DRV[%s:%d] CH:%d, Camera UPDATE error signal. send Abnormal ending!\n", __func__, __LINE__, ch);
1142 	} else {
1143 		gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x13+((ch%2)*0x80), 0x80/*0x60*/);
1144 		sensor_dbg(">>>>> DVR[%s:%d] CH:%d, Camera UPDATE ending signal. wait please!\n", __func__, __LINE__, ch);
1145 	}
1146 
1147 	/* Shot */
1148 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x08);
1149 	msleep(200);
1150 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x09+((ch%2)*0x80), 0x00);
1151 
1152 }
1153 
1154 /**************************************************************************************
1155  * @desc
1156  *	JAGUAR1's    FW End command ACK receive from camera
1157  *
1158  * @param_in		(FIRMWARE_UP_FILE_INFO *)p_param->channel                  FW Update channel
1159  *
1160  * @param_out	(FIRMWARE_UP_FILE_INFO *)p_param->result                   Function execution result
1161  *
1162  * @return	void		 								           None
1163  *
1164  * ioctl : IOC_VDEC_COAX_FW_END_ACK_GET
1165  ***************************************************************************************/
coax_fw_end_cmd_ack_from_isp_recv(void * p_param)1166 void coax_fw_end_cmd_ack_from_isp_recv(void *p_param)
1167 {
1168 	int ch = 0;
1169 	int devnum = 0;
1170 
1171 	unsigned char videofm = 0x00;
1172 	unsigned char ack_return = 0x00;
1173 	unsigned char isp_status = 0x00;
1174 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
1175 
1176 	ch = pstFileInfo->channel;
1177 	devnum = pstFileInfo->channel/4;
1178 
1179 	/* check video format(video loss), 0:videoloss, 1:video on */
1180 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x05+(ch%4));
1181 	videofm = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0xF0);
1182 
1183 	if (videofm == 0xFF) {
1184 		sensor_dbg(">>>>> DRV[%s:%d] Final[CH:%d], No video[END]!\n", __func__, __LINE__, ch);
1185 		pstFileInfo->result = FW_FAILURE;
1186 		return;
1187 	}
1188 
1189 	/* Adjust Rx FHD@25P */
1190 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
1191 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x63+((ch%2)*0x80), 0x01);   // Ch_X Rx ON
1192 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x62+((ch%2)*0x80), 0x05);   // Ch_X Rx Area
1193 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x66+((ch%2)*0x80), 0x81);   // Ch_X Rx Signal enhance
1194 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x69+((ch%2)*0x80), 0x2D);   // Ch_X Rx Manual duty
1195 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x60+((ch%2)*0x80), 0x55);   // Ch_X Rx Header matching
1196 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x61+((ch%2)*0x80), 0x00);   // Ch_X Rx data_rz
1197 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x68+((ch%2)*0x80), 0x80);   // Ch_X Rx SZ
1198 
1199 	/* get status, If the ack_return(0x56) is 0x05(completed writing f/w file to isp's flash) */
1200 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
1201 	ack_return = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x56+((ch%2)*0x80));
1202 	isp_status = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x57+((ch%2)*0x80));
1203 	if (isp_status == 0x02 && ack_return == 0x05) {
1204 		sensor_dbg(">>>>> DRV[%s:%d]CH:%d Receive ISP status : [END]\n", __func__, __LINE__, ch);
1205 		pstFileInfo->result = FW_SUCCESS;
1206 		return;
1207 	} else {
1208 		sensor_dbg(">>>>> DRV[%s:%d]CH:%d retry : Receive ISP status[END], [0x56-true[0x05]:0x%x], [0x57-true[0x02]:0x%x]\n", __func__, __LINE__, ch, ack_return, isp_status);
1209 		pstFileInfo->result = FW_FAILURE;
1210 		return;
1211 	}
1212 
1213 }
1214 
1215 
coax_fw_revert_to_previous_fmt_set(void * p_param)1216 void coax_fw_revert_to_previous_fmt_set(void *p_param)
1217 {
1218 	video_input_init vd_set;
1219 	int ch = 0;
1220 	int devnum = 0;
1221 
1222 	FIRMWARE_UP_FILE_INFO *pstFileInfo = (FIRMWARE_UP_FILE_INFO *)p_param;
1223 
1224 	ch = pstFileInfo->channel;
1225 	devnum = pstFileInfo->channel/4;
1226 
1227 	/* previous video format Setting  */
1228 	vd_set.ch = ch;
1229 	vd_set.format = g_coax_format;
1230 	vd_set.input = SINGLE_ENDED;
1231 	vd_jaguar1_init_set(&vd_set);
1232 
1233 }
1234 
1235 /*=======================================================================================================
1236  *  Coaxial protocol Support option function
1237  *
1238  ========================================================================================================*/
1239 /**************************************************************************************
1240  * @desc
1241  *	JAGUAR1's    RT/NRT Mode change
1242  *
1243  * @param_in		(NC_VD_COAX_Tx_Init_STR *)p_param->channel                 Coax read channel
1244  *
1245  * @return	void		 								           None
1246  *
1247  * ioctl : IOC_VDEC_COAX_TEST_TX_INIT_DATA_READ
1248  ***************************************************************************************/
coax_option_rt_nrt_mode_change_set(void * p_param)1249 void coax_option_rt_nrt_mode_change_set(void *p_param)
1250 {
1251 	NC_VD_COAX_STR *coax_val = (NC_VD_COAX_STR *)p_param;
1252 
1253 	unsigned char ch    = coax_val->ch;
1254 	unsigned char param = coax_val->param;
1255 	unsigned char tx_line = 0;
1256 	unsigned char tx_line_max = 0;
1257 
1258 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0xFF, 0x02+((ch%4)/2));
1259 
1260 	tx_line     = gpio_i2c_read(jaguar1_i2c_addr[coax_val->vd_dev], 0x05+((ch%2)*0x80));
1261 	tx_line_max = gpio_i2c_read(jaguar1_i2c_addr[coax_val->vd_dev], 0x0A+((ch%2)*0x80));
1262 
1263 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x05+((ch%2)*0x80), 0x03);
1264 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x0A+((ch%2)*0x80), 0x04);
1265 
1266 	if (!param) {
1267 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x10+((ch%2)*0x80), 0x60);
1268 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x11+((ch%2)*0x80), 0xb1);
1269 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x12+((ch%2)*0x80), 0x00);
1270 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x13+((ch%2)*0x80), 0x00);
1271 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x14+((ch%2)*0x80), 0x00);
1272 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x15+((ch%2)*0x80), 0x00);
1273 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x16+((ch%2)*0x80), 0x00);
1274 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x17+((ch%2)*0x80), 0x00);
1275 	} else {
1276 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x10+((ch%2)*0x80), 0x60);
1277 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x11+((ch%2)*0x80), 0xb1);
1278 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x12+((ch%2)*0x80), 0x01);
1279 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x13+((ch%2)*0x80), 0x00);
1280 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x14+((ch%2)*0x80), 0x00);
1281 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x15+((ch%2)*0x80), 0x00);
1282 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x16+((ch%2)*0x80), 0x00);
1283 		gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x17+((ch%2)*0x80), 0x00);
1284 	}
1285 
1286 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x09+((ch%2)*0x80), 0x08);
1287 	msleep(100);
1288 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x09+((ch%2)*0x80), 0x10);
1289 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x09+((ch%2)*0x80), 0x00);
1290 
1291 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x05+((ch%2)*0x80), tx_line);
1292 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0x0A+((ch%2)*0x80), tx_line_max);
1293 
1294 }
1295 
1296 /*=======================================================================================================
1297  *  Coaxial protocol test function
1298  *
1299  ========================================================================================================*/
1300 /**************************************************************************************
1301  * @desc
1302  *	JAGUAR1's    Test function. Read coax Tx initialize value
1303  *
1304  * @param_in		(NC_VD_COAX_Tx_Init_STR *)p_param->channel                 Coax read channel
1305  *
1306  * @return	void		 								           None
1307  *
1308  * ioctl : IOC_VDEC_COAX_TEST_TX_INIT_DATA_READ
1309  ***************************************************************************************/
coax_test_tx_init_read(NC_VD_COAX_TEST_STR * coax_tx_mode)1310 void coax_test_tx_init_read(NC_VD_COAX_TEST_STR *coax_tx_mode)
1311 {
1312 
1313 	int ch = 0;
1314 	int devnum = 0;
1315 
1316 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x05+ch%4);
1317 	coax_tx_mode->rx_src = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x7C);
1318 	coax_tx_mode->rx_slice_lev = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x7D);
1319 
1320 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x02+((ch%4)/2));
1321 	coax_tx_mode->tx_baud           = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x00+((ch%2)*0x80));
1322 	coax_tx_mode->tx_pel_baud       = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x02+((ch%2)*0x80));
1323 	coax_tx_mode->tx_line_pos0      = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x03+((ch%2)*0x80));
1324 	coax_tx_mode->tx_line_pos1      = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x04+((ch%2)*0x80));
1325 	coax_tx_mode->tx_line_count     = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x05+((ch%2)*0x80));
1326 	coax_tx_mode->tx_pel_line_pos0  = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x07+((ch%2)*0x80));
1327 	coax_tx_mode->tx_pel_line_pos1  = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x08+((ch%2)*0x80));
1328 	coax_tx_mode->tx_line_count_max = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x0A+((ch%2)*0x80));
1329 	coax_tx_mode->tx_mode           = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x0B+((ch%2)*0x80));
1330 	coax_tx_mode->tx_sync_pos0      = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x0D+((ch%2)*0x80));
1331 	coax_tx_mode->tx_sync_pos1      = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x0E + ((ch%2)*0x80));
1332 	coax_tx_mode->tx_even           = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x2F+((ch%2)*0x80));
1333 	coax_tx_mode->tx_zero_length    = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x0C+((ch%2)*0x80));
1334 }
1335 
coax_acp_rx_detect_get(void * p_param)1336 void coax_acp_rx_detect_get(void *p_param)
1337 {
1338 	NC_VD_COAX_STR *coax_val = (NC_VD_COAX_STR *)p_param;
1339 
1340 	unsigned char ch = coax_val->ch;
1341 	unsigned char val_1 = 0;
1342 	unsigned char val_2 = 0;
1343 
1344 
1345 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0xFF, 0x02+ch%4);
1346 	val_1 = gpio_i2c_read(jaguar1_i2c_addr[coax_val->vd_dev], 0x5c+((ch%2)*0x80));
1347 
1348 	gpio_i2c_write(jaguar1_i2c_addr[coax_val->vd_dev], 0xFF, 0x00);
1349 	val_2 = gpio_i2c_read(jaguar1_i2c_addr[coax_val->vd_dev], 0xa8 + ch);
1350 	coax_val->param = val_1;
1351 }
1352 /**************************************************************************************
1353  * @desc
1354  *	JAGUAR1's    Test function. bank, address, value setting.  get from application
1355  *
1356  * @param_in		(NC_VD_COAX_TEST_STR *)coax_data                 Coax Tx setting value
1357  *
1358  * @return	void		 								 None
1359  *
1360  * ioctl : IOC_VDEC_COAX_TEST_DATA_SET
1361  ***************************************************************************************/
coax_test_data_set(NC_VD_COAX_TEST_STR * coax_data)1362 void coax_test_data_set(NC_VD_COAX_TEST_STR *coax_data)
1363 {
1364 	gpio_i2c_write(jaguar1_i2c_addr[coax_data->chip_num], 0xFF, coax_data->bank);
1365 	gpio_i2c_write(jaguar1_i2c_addr[coax_data->chip_num], coax_data->data_addr, coax_data->param);
1366 }
1367 
1368 /**************************************************************************************
1369  * @desc
1370  *	JAGUAR1's    Test function. Read value bank, address, value. To application
1371  *
1372  * @param_in		(NC_VD_COAX_TEST_STR *)coax_data                 Coax read channel
1373  *
1374  * @return	void		 								 None
1375  *
1376  * ioctl : IOC_VDEC_COAX_TEST_DATA_READ
1377  ***************************************************************************************/
coax_test_data_get(NC_VD_COAX_TEST_STR * coax_data)1378 void coax_test_data_get(NC_VD_COAX_TEST_STR *coax_data)
1379 {
1380 	gpio_i2c_write(jaguar1_i2c_addr[coax_data->chip_num], 0xFF, coax_data->bank);
1381 	coax_data->param = gpio_i2c_read(jaguar1_i2c_addr[coax_data->chip_num], coax_data->data_addr);
1382 }
1383 
1384 /**************************************************************************************
1385  * @desc
1386  *	JAGUAR1's    Test function. Bank Dump To application
1387  *
1388  * @param_in		(NC_VD_COAX_BANK_DUMP_STR *)coax_data            Coax read channel
1389  *
1390  * @return	void		 								 None
1391  *
1392  * ioctl : IOC_VDEC_COAX_TEST_DATA_READ
1393  ***************************************************************************************/
coax_test_Bank_dump_get(NC_VD_COAX_BANK_DUMP_STR * coax_data)1394 void coax_test_Bank_dump_get(NC_VD_COAX_BANK_DUMP_STR *coax_data)
1395 {
1396 	int ii = 0;
1397 	memset(coax_data->rx_pelco_data, 0, sizeof(coax_data->rx_pelco_data));
1398 
1399 	sensor_dbg("[drv]dev: %x, Bank: 0x%02X\n", coax_data->vd_dev, coax_data->bank);
1400 
1401 	gpio_i2c_write(jaguar1_i2c_addr[coax_data->vd_dev], 0xFF, coax_data->bank);
1402 
1403 	for (ii = 0; ii < 256; ii++) {
1404 		coax_data->rx_pelco_data[ii] = gpio_i2c_read(jaguar1_i2c_addr[coax_data->vd_dev], 0x00+ii);
1405 	}
1406 
1407 }
1408 
1409 
1410 /*******************************************************************************
1411 *	Description		: write data to ISP
1412 *	Argurments		: ch(channel ID),reg_addr(high[1byte]:bank, low[1byte]:register)
1413 *					  reg_data(data)
1414 *	Return value	: void
1415 *	Modify			:
1416 *	warning			:
1417 *******************************************************************************/
acp_isp_write(unsigned char ch,unsigned int reg_addr,unsigned char reg_data)1418 void acp_isp_write(unsigned char ch, unsigned int reg_addr, unsigned char reg_data)
1419 {
1420 	unsigned char bankaddr = 0x00;
1421 	unsigned char device_id = 0x00;
1422 	unsigned char lcnt_bak, lcntm_bak, crc_bak;
1423 
1424 	bankaddr = (reg_addr>>8)&0xFF;
1425 	if (bankaddr >= 0xB0 && bankaddr <= 0xB4) {
1426 		device_id = 0x55;
1427 	} else {
1428 		device_id = ACP_REG_WR;
1429 	}
1430 
1431 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0xFF, 0x02+((ch%4)/2));
1432 	lcnt_bak = gpio_i2c_read(jaguar1_i2c_addr[ch/4], 0x05+((ch%2)*0x80));
1433 	lcntm_bak = gpio_i2c_read(jaguar1_i2c_addr[ch/4], 0x0A+((ch%2)*0x80));
1434 	crc_bak = gpio_i2c_read(jaguar1_i2c_addr[ch/4], 0x60+((ch%2)*0x80));
1435 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0A+((ch%2)*0x80), 0x03);
1436 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x60+((ch%2)*0x80), device_id);
1437 
1438 	/* write data to isp */
1439 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0xFF, 0x02+((ch%4)/2));
1440 	if (bit8 == 1) {
1441 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x10+((ch%2)*0x80), ACP_REG_WR);
1442 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x11+((ch%2)*0x80), (reg_addr>>8)&0xFF);
1443 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x12+((ch%2)*0x80), reg_addr&0xFF);
1444 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x13+((ch%2)*0x80), reg_data);
1445 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x09+((ch%2)*0x80), 0x08);
1446 		msleep(200);
1447 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0xFF, 0x02+((ch%4)/2));
1448 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x09+((ch%2)*0x80), 0x10);
1449 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x09+((ch%2)*0x80), 0x00);
1450 		printk("ahd acp 8bit mode test\n");
1451 	} else {
1452 		/*
1453 		// fill Reset
1454 		for(i=0;i<4;i++)
1455 		{
1456 			gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x20+((ch%2)*0x80)+i, 0);
1457 		}
1458 		// Command Shot
1459 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0xFF, 0x02+((ch%4)/2) );
1460 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0c+((ch%2)*0x80), 0x01);
1461 		msleep(30);
1462 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0c+((ch%2)*0x80), 0x00);
1463 		*/
1464 
1465 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x20+((ch%2)*0x80), ACP_REG_WR);
1466 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x21+((ch%2)*0x80), (reg_addr>>8)&0xFF);
1467 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x22+((ch%2)*0x80), reg_addr&0xFF);
1468 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x23+((ch%2)*0x80), reg_data);
1469 
1470 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0xFF, 0x02+((ch%4)/2));
1471 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0c+((ch%2)*0x80), 0x01);
1472 		msleep(200);
1473 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0c+((ch%2)*0x80), 0x00);
1474 		printk("ahd pelcod 16bit mode test\n");
1475 	}
1476 
1477 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0A+((ch%2)*0x80), lcntm_bak);
1478 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x60+((ch%2)*0x80), crc_bak);
1479 
1480 
1481 	sensor_dbg(">>>>> CH:%d NORMAL, RX->TX : ", ch);
1482 	sensor_dbg("%02x ", ACP_REG_WR);
1483 	sensor_dbg("%02x ", (reg_addr>>8)&0xFF);
1484 	sensor_dbg("%02x ", reg_addr&0xFF);
1485 	sensor_dbg("%02x ", reg_data);
1486 	sensor_dbg("\n");
1487 
1488 }
1489 
1490 /*******************************************************************************
1491 *	Description		: read acp data of ISP
1492 *	Argurments		: ch(channel ID), reg_addr(high[1byte]:bank, low[1byte]:register)
1493 *	Return value	: void
1494 *	Modify			:
1495 *	warning			:
1496 *******************************************************************************/
acp_isp_read(unsigned char ch,unsigned int reg_addr)1497 unsigned char acp_isp_read(unsigned char ch, unsigned int reg_addr)
1498 {
1499 	unsigned int data_3x50[8];
1500 	unsigned char lcnt_bak, lcntm_bak, crc_bak;
1501 	unsigned char bank;
1502 	unsigned char addr;
1503 	int i;
1504 
1505 	bank = (reg_addr>>8)&0xFF;
1506 	addr = reg_addr&0xFF;
1507 
1508 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0xFF, 0x02+((ch%4)/2));
1509 	lcnt_bak = gpio_i2c_read(jaguar1_i2c_addr[ch/4], 0x05+((ch%2)*0x80));
1510 	lcntm_bak = gpio_i2c_read(jaguar1_i2c_addr[ch/4], 0x0A+((ch%2)*0x80));
1511 	crc_bak = gpio_i2c_read(jaguar1_i2c_addr[ch/4], 0x60+((ch%2)*0x80));
1512 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0A+((ch%2)*0x80), 0x03);
1513 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x60+((ch%2)*0x80), ACP_REG_RD);
1514 
1515 	if (bit8 == 1) {
1516 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0xFF, 0x02+((ch%4)/2));
1517 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x10+(ch%2)*0x80, 0x61);
1518 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x10+1+(ch%2)*0x80, bank);
1519 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x10+2+(ch%2)*0x80, addr);
1520 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x10+3+(ch%2)*0x80, 0x00);
1521 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x09+(ch%2)*0x80, 0x08);
1522 	} else {
1523 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0xFF, 0x02+((ch%4)/2));
1524 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x20+(ch%2)*0x80, 0x61);
1525 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x20+1+(ch%2)*0x80, bank);
1526 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x20+2+(ch%2)*0x80, addr);
1527 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x20+3+(ch%2)*0x80, 0x00);
1528 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0c+(ch%2)*0x80, 0x01);
1529 	}
1530 	msleep(300);
1531 	for (i = 0; i < 8; i++) {
1532 		data_3x50[i] = gpio_i2c_read(jaguar1_i2c_addr[ch/4], 0x50+i+((ch%2)*0x80));
1533 		sensor_dbg("acp_isp_read ch = %d, reg_addr = %x, reg_data = %x\n", ch, reg_addr, data_3x50[i]);
1534 	}
1535 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0A+((ch%2)*0x80), lcntm_bak);
1536 	gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x60+((ch%2)*0x80), crc_bak);
1537 	if (bit8 == 1) {
1538 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x09+((ch%2)*0x80), 0x10);
1539 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x09+((ch%2)*0x80), 0x00);
1540 	} else {
1541 		gpio_i2c_write(jaguar1_i2c_addr[ch/4], 0x0c+(ch%2)*0x80, 0x00);
1542 	}
1543 	return data_3x50[3];
1544 }
1545 
1546 
1547