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