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