xref: /OK3568_Linux_fs/kernel/drivers/media/i2c/nvp6158_drv/nvp6158_motion.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /********************************************************************************
3 *
4 *  Copyright (C) 2017 	NEXTCHIP Inc. All rights reserved.
5 *  Module		: motion.c
6 *  Description	:
7 *  Author		:
8 *  Date         :
9 *  Version		: Version 1.0
10 *
11 ********************************************************************************
12 *  History      :
13 *
14 *
15 ********************************************************************************/
16 #include <linux/string.h>
17 #include <linux/delay.h>
18 #include "nvp6158_common.h"
19 
20 extern unsigned int nvp6158_iic_addr[4];
21 
22 #include "nvp6158_motion.h"
23 
24 /**************************************************************************************
25 * @desc
26 * 	RAPTOR3's
27 *
28 * @param_in		(motion_mode *)p_param->channel                  FW Update channel
29 *
30 * @return   	void  		       								 None
31 *
32 * ioctl : IOC_VDEC_MOTION_SET
33 ***************************************************************************************/
nvp6158_motion_detection_get(motion_mode * motion_set)34 void nvp6158_motion_detection_get(motion_mode *motion_set)
35 {
36 	//BANK2_MOTION
37 	unsigned char ReadVal = 0;
38 	unsigned char ch_mask = 1;
39 	unsigned char ch = motion_set->ch;
40 	unsigned char ret = 0;
41 
42 	ch_mask = ch_mask<<ch;
43 
44 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0xFF, 0x00);
45 	ReadVal = gpio_i2c_read(nvp6158_iic_addr[motion_set->devnum], 0xA9);
46 
47 	ret = ReadVal&ch_mask;
48 	motion_set->set_val = ret;
49 
50 //	printk("motion_detection_get:: %x\n", motion_set->set_val);
51 
52 }
53 
nvp6158_motion_onoff_set(motion_mode * motion_set)54 void nvp6158_motion_onoff_set(motion_mode *motion_set)
55 {
56 	//BANK2_MOTION
57 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0xFF, 0x02);
58 
59 	if(motion_set->fmtdef == TVI_3M_18P || motion_set->fmtdef == TVI_5M_12_5P ||
60 		motion_set->fmtdef == TVI_5M_20P) {
61 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x00 + (0x07 * motion_set->ch), 0x0C);
62 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x02 + (0x07 * motion_set->ch), 0x23);
63 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x11);
64 
65 		if(motion_set->fmtdef == TVI_3M_18P) {
66 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0x78);
67 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x40);
68 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x72);
69 		} else if(motion_set->fmtdef == TVI_5M_12_5P) {
70 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xA2);
71 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x51);
72 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x9c);
73 		} else if(motion_set->fmtdef == TVI_5M_20P) {
74 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xA0);
75 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x51);
76 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x9a);
77 		}
78 
79 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2B + (0x06 * motion_set->ch), 0x6);
80 
81 		printk("[DRV_Motion_OnOff] ch(%d) fmtdef(%d)\n", motion_set->ch, motion_set->fmtdef);
82 	} else if( motion_set->fmtdef == AHD20_1080P_15P_EX || motion_set->fmtdef == AHD20_1080P_12_5P_EX ) {
83 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x00 + (0x07 * motion_set->ch), 0x0C);
84 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x02 + (0x07 * motion_set->ch), 0x23);
85 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x11);
86 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xf0);
87 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x2d);
88 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2B + (0x06 * motion_set->ch), 0x06);
89 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0xea);
90 	} else {
91 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x00);
92 	}
93 
94 	if(motion_set->set_val<0 || motion_set->set_val>1) {
95 		printk("[DRV_Motion_OnOff]Error!! ch(%d) Setting Value Over:%x!! Only 0 or 1\n", motion_set->ch, motion_set->set_val);
96 		return;
97 	}
98 
99 	switch(motion_set->set_val) {
100 		case FUNC_OFF : gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], (0x00 + (0x07 * motion_set->ch)), 0x0D);
101 						gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x00);
102 			break;
103 		case FUNC_ON : gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], (0x00 + (0x07 * motion_set->ch)), 0x0C);
104 			break;
105 	}
106 
107 
108 }
109 
nvp6158_motion_pixel_all_onoff_set(motion_mode * motion_set)110 void nvp6158_motion_pixel_all_onoff_set(motion_mode *motion_set)
111 {
112 	int ii=0;
113 	unsigned char addr = 0;
114 
115 	//BANK2_MOTION
116 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0xFF, 0x02);
117 
118 	if(motion_set->fmtdef == TVI_3M_18P || motion_set->fmtdef == TVI_5M_12_5P ||
119 			motion_set->fmtdef == TVI_5M_20P) {
120 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x00 + (0x07 * motion_set->ch), 0x0C);
121 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x02 + (0x07 * motion_set->ch), 0x23);
122 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x11);
123 
124 		if(motion_set->fmtdef == TVI_3M_18P) {
125 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0x78);
126 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x40);
127 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x72);
128 		} else if(motion_set->fmtdef == TVI_5M_12_5P) {
129 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xA2);
130 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x51);
131 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x9c);
132 		} else if(motion_set->fmtdef == TVI_5M_20P) {
133 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xA0);
134 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x51);
135 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x9a);
136 		}
137 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2B + (0x06 * motion_set->ch), 0x6);
138 
139 		printk("[DRV_Motion_OnOff] ch(%d) fmtdef(%d)\n", motion_set->ch, motion_set->fmtdef);
140 	} else  if( motion_set->fmtdef == AHD20_1080P_15P_EX || motion_set->fmtdef == AHD20_1080P_12_5P_EX ) {
141 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x00 + (0x07 * motion_set->ch), 0x0C);
142 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x02 + (0x07 * motion_set->ch), 0x23);
143 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x11);
144 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xf0);
145 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x2d);
146 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2B + (0x06 * motion_set->ch), 0x06);
147 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0xea);
148 	} else {
149 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x00);
150 	}
151 
152 	for(ii=0; ii<24; ii++) {
153 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], (0x40 +(0x18 *motion_set->ch)) + ii, motion_set->set_val);
154 		addr = (0x40 +(0x18 *motion_set->ch)) + ii;
155 	}
156 }
157 
nvp6158_motion_pixel_onoff_set(motion_mode * motion_set)158 void nvp6158_motion_pixel_onoff_set(motion_mode *motion_set)
159 {
160 	unsigned char val = 0x80;
161 	unsigned char ReadVal;
162 	unsigned char on;
163 
164 	unsigned char ch      = motion_set->ch;
165 	unsigned char SetPix  = motion_set->set_val/8;
166 	unsigned char SetVal  = motion_set->set_val%8;
167 
168 	val = val >> SetVal;
169 
170 	//BANK2_MOTION
171 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0xFF, 0x02);
172 
173 	if(motion_set->fmtdef == TVI_3M_18P || motion_set->fmtdef == TVI_5M_12_5P ||
174 			motion_set->fmtdef == TVI_5M_20P) {
175 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x00 + (0x07 * motion_set->ch), 0x0C);
176 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x02 + (0x07 * motion_set->ch), 0x23);
177 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x11);
178 
179 		if(motion_set->fmtdef == TVI_3M_18P) {
180 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0x78);
181 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x40);
182 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x72);
183 		} else if(motion_set->fmtdef == TVI_4M_15P) {
184 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xA0);
185 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x3C);
186 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x9a);
187 		} else if(motion_set->fmtdef == TVI_5M_12_5P) {
188 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xA2);
189 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x51);
190 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x9c);
191 		} else if(motion_set->fmtdef == TVI_5M_20P) {
192 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xA0);
193 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x51);
194 			gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0x9a);
195 		}
196 
197 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2B + (0x06 * motion_set->ch), 0x6);
198 
199 		printk("[DRV_Motion_OnOff] ch(%d) fmtdef(%d)\n", motion_set->ch, motion_set->fmtdef);
200 	} else if( motion_set->fmtdef == AHD20_1080P_15P_EX || motion_set->fmtdef == AHD20_1080P_12_5P_EX ) {
201 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x00 + (0x07 * motion_set->ch), 0x0C);
202 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x02 + (0x07 * motion_set->ch), 0x23);
203 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x11);
204 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x29 + (0x06 * motion_set->ch), 0xf0);
205 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2A + (0x06 * motion_set->ch), 0x2d);
206 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2B + (0x06 * motion_set->ch), 0x06);
207 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x2C + (0x06 * motion_set->ch), 0xea);
208 	} else {
209 		gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0x28 + (0x06 * motion_set->ch), 0x00);
210 	}
211 
212 	ReadVal = gpio_i2c_read(nvp6158_iic_addr[motion_set->devnum], (0x40 +(0x18 *ch)) + SetPix);
213 	on = val&ReadVal;
214 	if(on) {
215 		val = ~val;
216 		val = val&ReadVal;
217 	} else {
218 		val = val|ReadVal;
219 	}
220 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], (0x40 +(0x18 *ch)) + SetPix, val);
221 }
222 
nvp6158_motion_pixel_onoff_get(motion_mode * motion_set)223 void nvp6158_motion_pixel_onoff_get(motion_mode *motion_set)
224 {
225 	unsigned char val = 0x80;
226 	unsigned char ReadVal;
227 	unsigned char on;
228 
229 	unsigned char Ch      = motion_set->ch;
230 	unsigned char SetPix  = motion_set->set_val/8;
231 	unsigned char SetVal  = motion_set->set_val%8;
232 
233 	val = val >> SetVal;
234 
235 	//BANK2_MOTION
236 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0xFF, 0x02);
237 	ReadVal = gpio_i2c_read(nvp6158_iic_addr[motion_set->devnum], (0x40 +(0x18 *Ch)) + SetPix);
238 
239 	on = val&ReadVal;
240 
241 	if(on) {
242 		motion_set->set_val = 1;
243 	} else {
244 		motion_set->set_val = 0;
245 	}
246 }
247 
nvp6158_motion_tsen_set(motion_mode * motion_set)248 void nvp6158_motion_tsen_set(motion_mode *motion_set)
249 {
250 	unsigned char ch = motion_set->ch;
251 	unsigned char SetVal = motion_set->set_val;
252 
253 	//BANK2_MOTION
254 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0xFF, 0x02);
255 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], (0x01 +(0x07 * ch)), SetVal);
256 	printk("[DRV_Motion]ch(%d), TSEN Val(%x)\n", ch, SetVal);
257 }
258 
nvp6158_motion_psen_set(motion_mode * motion_set)259 void nvp6158_motion_psen_set(motion_mode *motion_set)
260 {
261 	unsigned char msb_mask = 0xf0;
262 	unsigned char lsb_mask = 0x07;
263 	unsigned char ch = motion_set->ch;
264 	unsigned char SetVal = motion_set->set_val;
265 	unsigned char ReadVal;
266 
267 	//BANK2_MOTION
268 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], 0xFF, 0x02);
269 	ReadVal = gpio_i2c_read(nvp6158_iic_addr[motion_set->devnum], (0x02 +(0x07 * ch)));
270 
271 	msb_mask = msb_mask&ReadVal;
272 	SetVal = lsb_mask&SetVal;
273 
274 	SetVal = SetVal|msb_mask;
275 
276 	gpio_i2c_write(nvp6158_iic_addr[motion_set->devnum], (0x02 +(0x07 * ch)), SetVal);
277 	printk("[DRV_Motion]ch(%d), readVal(%x), SetVal(%x)\n", ch, ReadVal, SetVal);
278 }
279