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