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