xref: /utopia/UTPA2-700.0.x/modules/pq/hal/maxim/pq/mhal_pq_adaptive.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 #define MHAL_PQ_ADAPTIVE_C
95 
96 //-------------------------------------------------------------------------------------------------
97 //  Include Files
98 //-------------------------------------------------------------------------------------------------
99 #if !defined(MSOS_TYPE_LINUX_KERNEL)
100 #include "string.h"
101 #else
102 #include <linux/string.h>
103 #include <linux/random.h>
104 #endif
105 // Common Definition
106 #include "MsCommon.h"
107 #include "MsOS.h"
108 
109 // Internal Definition
110 #include "hwreg_utility2.h"
111 #include "color_reg.h"
112 
113 #include "drvXC_IOPort.h"
114 #include "apiXC.h"
115 #include "apiXC_Dlc.h"
116 #include "mhal_pq_adaptive.h"
117 //-------------------------------------------------------------------------------------------------
118 //  Driver Compiler Options
119 //-------------------------------------------------------------------------------------------------
120 
121 //-------------------------------------------------------------------------------------------------
122 //  Local Defines
123 //-------------------------------------------------------------------------------------------------
124 #define MSIF_ADAPTIVE_LIB_CODE_C            {'A','D','A','P','T','I','V','E','_'}
125 #define MSIF_ADAPTIVE_VERSION_C             {'0','0','0','0','0','1'}
126 #define PQ_ADAPTIVE_VERSION 9132
127 
128 #ifndef UNUSED //to avoid compile warnings...
129 #define UNUSED(var) (void)((var) = (var))
130 #endif
131 //#define DBG_DBK_LC
132 //#define DBG_SD2HD_LC
133 //#define DBG_HISW8T_LC
134 //-------------------------------------------------------------------------------------------------
135 //  Local Structures
136 //-------------------------------------------------------------------------------------------------
137 
138 //-------------------------------------------------------------------------------------------------
139 //  Global Variables
140 //-------------------------------------------------------------------------------------------------
141 static MS_BOOL _bAnyCandenceEnable = TRUE;
142 static MS_BOOL _bVerticalMovingForDHD = FALSE;
143 //extern MS_U16 _u16PQSrcType_DBK_Detect[PQ_MAX_WINDOW]; //For Auto_DBK SW driver used
144 static MS_BOOL _bIsHDSource = true;             //For Check SD mode
145 static int normalize_factor = 255;
146 XC_LetterBoxState lbState;
147 static MS_S32 frameWidth;
148 static MS_S32 frameHeight;
149 static MS_U8 lbConfirmLevel = 0;
150 static MS_U16 GuardBandWidth = 0x40;
151 #define MaxWidth 4097
152 #define MaxHeight 2161
153 //DBK Variables
154 #define paraSize 32
155 #define paraVerSize 16
156 static MS_S32 WidthIIR = 8,VWidthIIR = 8;
157 //PQ driver SD HD report W IIR
158 static MS_U32 u32SdW = 0, u32FhdW = 0;
159 
160 static XC_MCNRLutQmapSetting m_stMCNRLutQmapSetting = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}};
161 
162 // Threshold for blockness check
163 const int hitrate_threshold = 128; // 160/256
164 const int hitRateDiffThr = 16; // 16/256
165 //Patch switching control
166 #define HQV_JAGGY_PATTERN_ENBLE 0
167 #define SHIBASOKU_ENABLE 1
168 #define LG_SPECIFIC_PATTERN_ENABLE 0
169 #define SZ_PATTERN_ENABLE 1
170 #define SEC_HQV_PATTERN 0
171 #define KURO_PATTERN_ENABLE 0
172 #define HOUSE_MD_PATTERN_ENABLE 0
173 
174 #define MCNR_LUT_LOAD_FROM_QMAP 1
175 #define PDNR_LUT_LOAD_FROM_QMAP 1
176 
177 #define FOR_FULL_RANGE 0
178 #if !defined(MSOS_TYPE_LINUX_KERNEL)
179 extern __attribute__((weak))MS_U8 MApi_XC_DLC_GetAverageValue(void);
180 #endif
181 //-------------------------------------------------------------------------------------------------
182 //  Local Variables
183 //-------------------------------------------------------------------------------------------------
184 
185 
186 //-------------------------------------------------------------------------------------------------
187 //  Debug Functions
188 //-------------------------------------------------------------------------------------------------
189 
190 /******************************************************************************/
191 /// Debug Info Control
192 /******************************************************************************/
DEBUG_LC_Turn_On(void)193 void DEBUG_LC_Turn_On(void)
194 {
195     MApi_XC_W2BYTEMSK(REG_SC_BK30_38_L, 0x0001, 0x0001 );
196     MApi_XC_W2BYTEMSK(REG_SC_BK30_3A_L, 0x0002, 0x0002 );
197 }
198 
DEBUG_LC(const MS_U16 lightReg,const MS_U8 val,const MS_U8 color)199 void DEBUG_LC( const MS_U16 lightReg, const MS_U8 val, const MS_U8 color )
200 {
201     if( val == 0 )
202         MApi_XC_W2BYTEMSK(lightReg, ( color << (val<<2) ), ( 0x7 << (val<<2) ) );
203     else if( val == 1 )
204         MApi_XC_W2BYTE(lightReg, ( color << 4 ) | color );
205     else if( val == 2 )
206         MApi_XC_W2BYTE(lightReg, ( color << 8 ) | ( color << 4 ) | color );
207     else
208         MApi_XC_W2BYTE(lightReg, ( color << 12 ) | ( color << 8 ) | ( color << 4 ) | color );
209 }
210 
DEBUG_LC_40(const MS_U8 a)211 void DEBUG_LC_40( const MS_U8 a )
212 {
213     if( (a > 0x00) && (a < 0x04) )
214     {
215         MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0001 );
216     }
217     else if( (a > 0x03) && (a < 0x10) )
218     {
219         MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0011 );
220     }
221     else if( (a > 0x0F) && (a < 0x40) )
222     {
223         MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0111 );
224     }
225     else if( (a > 0x3F) /*&& (a < 0x100)*/ )
226     {
227         MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x1111 );
228     }
229     else
230     {
231         MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0000 );
232     }
233 }
234 
DEBUG_LC_41(const MS_U8 a)235 void DEBUG_LC_41( const MS_U8 a )
236 {
237     if( (a > 0) && (a < 4) )
238     {
239         MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0002 );
240     }
241     else if( (a > 3) && (a < 8) )
242     {
243         MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0022 );
244     }
245     else if( (a > 7) && (a < 12) )
246     {
247         MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0222 );
248     }
249     else if( (a > 11) )
250     {
251         MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x2222 );
252     }
253     else
254     {
255         MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0000 );
256     }
257 }
258 
DEBUG_LC_42(const MS_BOOL isSceneChangeMc,const MS_BOOL isSceneChangeY)259 void DEBUG_LC_42( const MS_BOOL isSceneChangeMc, const MS_BOOL isSceneChangeY )
260 {
261     if( isSceneChangeMc )
262         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0003, 0x0007);
263     else
264         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0000, 0x0007);
265 
266     if( isSceneChangeY )
267         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0040, 0x0070);
268     else
269         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0000, 0x0070);
270 }
271 
DEBUG_LC_43(MS_U8 noiseLevel)272 void DEBUG_LC_43( MS_U8 noiseLevel )
273 {
274     /*
275     if( noiseLevel < 0 )
276     MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x1111, 0x7777 );
277     else
278     */
279     {
280         MS_U8 val = noiseLevel >> 5;
281         if( val == 0 )
282             MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0000, 0x7777);
283         else if( val == 1 )
284             MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0002, 0x7777);
285         else if( val == 2 )
286             MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0022, 0x7777);
287         else if( val == 3 )
288             MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0222, 0x7777);
289         else
290             MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x2222, 0x7777);
291     }
292 }
293 
DEBUG_LC_55(const MS_U8 GG)294 void DEBUG_LC_55( const MS_U8 GG )
295 {
296 
297     //BK30_40~BK30_5F
298     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
299     //LSB(low byte) = left, MSB(high byte) = right
300     if ( GG == 1 )//white
301     {
302         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
303     }
304     else if (GG == 2)//green
305     {
306         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x2222, 0x7777);
307     }
308     else//black
309     {
310         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
311     }
312 }
313 
DEBUG_LC_56(const MS_U8 GG)314 void DEBUG_LC_56( const MS_U8 GG )
315 {
316 
317     //BK30_40~BK30_5F
318     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
319     //LSB(low byte) = left, MSB(high byte) = right
320     if ( GG == 1 )//white
321     {
322         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
323     }
324     else if (GG == 2)//green
325     {
326         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x2222, 0x7777);
327     }
328     else//black
329     {
330         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
331     }
332 }
DEBUG_LC_57(const MS_U8 GG)333 void DEBUG_LC_57( const MS_U8 GG )
334 {
335 
336     //BK30_40~BK30_5F
337     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
338     //LSB(low byte) = left, MSB(high byte) = right
339     if ( GG == 1 )//white
340     {
341         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
342     }
343     else if (GG == 2)//green
344     {
345         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x2222, 0x7777);
346     }
347     else//black
348     {
349         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
350     }
351 }
352 
DEBUG_LC_5D(const MS_U8 GG)353 void DEBUG_LC_5D( const MS_U8 GG )
354 {
355 
356     //BK30_40~BK30_5F
357     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
358     //LSB(low byte) = left, MSB(high byte) = right
359     if ( GG == 1 )//white
360     {
361         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7777, 0x7777);
362     }
363     else if (GG == 2)//green
364     {
365         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x2222, 0x7777);
366     }
367     else//black
368     {
369         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x0000, 0x7777);
370     }
371 }
DEBUG_LC_5E(const MS_U8 GG)372 void DEBUG_LC_5E( const MS_U8 GG )
373 {
374 
375     //BK30_40~BK30_5F
376     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
377     //LSB(low byte) = left, MSB(high byte) = right
378     if ( GG == 1 )
379     {
380         MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x7777, 0x7777);
381     }
382     else if (GG == 2)
383     {
384         MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x2222, 0x7777);
385     }
386     else
387     {
388         MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x0000, 0x7777);
389     }
390 }
DEBUG_LC_5F(const MS_U8 GG)391 void DEBUG_LC_5F( const MS_U8 GG )
392 {
393 
394     //BK30_40~BK30_5F
395     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
396     //LSB(low byte) = left, MSB(high byte) = right
397     if ( GG == 1 )
398     {
399         MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x7777, 0x7777);
400     }
401     else if (GG == 2)
402     {
403         MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x2222, 0x7777);
404     }
405     else
406     {
407         MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x0000, 0x7777);
408     }
409 }
410 
411 //Add by Bella for SHDH debug 8/30
412 //Renamed by Probex Sep.06 2013
DEBUG_LC_Full6bit(const MS_U8 data)413 void DEBUG_LC_Full6bit( const MS_U8 data )
414 {
415     //BK30_50, BK30_54, BK30_58
416     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
417     //LSB(low byte) = left, MSB(high byte) = right
418 
419     if ( data <= 7 )
420     {
421 
422         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, data, 0x7777);
423         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
424         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
425 
426   }
427   else if ( data <= 14 )
428     {
429         MS_U16 dataExpression = ( (data-7) << 4) + 7;
430         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
431         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
432         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
433     }
434     else if ( data <= 21)
435     {
436         MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
437         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
438         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
439         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
440     }
441     else if (data <= 28 )
442     {
443         MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
444         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
445         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
446         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
447     }
448     else if (data <= 35)
449     {
450         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
451         MS_U16 dataExpression = ( data-28 );
452         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
453         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
454 
455     }
456     else if (data <= 42 )
457     {
458         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
459         MS_U16 dataExpression = (( data-35 )<< 4) + 7;
460         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
461         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
462     }
463   else if (data <= 49 )
464     {
465         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
466         MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
467         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
468         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
469 
470     }
471     else if (data <= 56 )
472     {
473         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
474         MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
475         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
476         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
477     }
478     else if (data <= 63 )
479     {
480         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
481         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x7777, 0x7777);
482         MS_U16 dataExpression = (data - 56 );
483         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, dataExpression, 0x7777);
484     }
485     else //>64
486     {
487         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
488         MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x7777, 0x7777);
489         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x7777, 0x7777);
490     }
491 }
DEBUG_LC_Full6bit2(const MS_U8 data)492 void DEBUG_LC_Full6bit2( const MS_U8 data )
493 {
494     //BK30_51, BK30_55, BK30_59
495     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
496     //LSB(low byte) = left, MSB(high byte) = right
497 
498     if ( data <= 7 )
499     {
500 
501         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, data, 0x7777);
502         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
503         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
504 
505   }
506   else if ( data <= 14 )
507     {
508         MS_U16 dataExpression = ( (data-7) << 4) + 7;
509         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
510         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
511         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
512     }
513     else if ( data <= 21)
514     {
515         MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
516         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
517         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
518         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
519     }
520     else if (data <= 28 )
521     {
522         MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
523         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
524         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
525         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
526     }
527     else if (data <= 35)
528     {
529         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
530         MS_U16 dataExpression = ( data-28 );
531         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
532         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
533 
534     }
535     else if (data <= 42 )
536     {
537         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
538         MS_U16 dataExpression = (( data-35 )<< 4) + 7;
539         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
540         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
541     }
542   else if (data <= 49 )
543     {
544         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
545         MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
546         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
547         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
548 
549     }
550     else if (data <= 56 )
551     {
552         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
553         MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
554         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
555         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
556     }
557     else if (data <= 63 )
558     {
559         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
560         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
561         MS_U16 dataExpression = (data - 56 );
562         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, dataExpression, 0x7777);
563     }
564     else
565     {
566         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
567         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
568         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7777, 0x7777);
569     }
570 }
DEBUG_LC_Full6bit3(const MS_U8 data)571 void DEBUG_LC_Full6bit3( const MS_U8 data )
572 {
573     //BK30_52, BK30_56, BK30_5A
574     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
575     //LSB(low byte) = left, MSB(high byte) = right
576 
577     if ( data <= 7 )
578     {
579 
580         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, data, 0x7777);
581         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
582         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
583 
584   }
585   else if ( data <= 14 )
586     {
587         MS_U16 dataExpression = ( (data-7) << 4) + 7;
588         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
589         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
590         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
591     }
592     else if ( data <= 21)
593     {
594         MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
595         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
596         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
597         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
598     }
599     else if (data <= 28 )
600     {
601         MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
602         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
603         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
604         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
605     }
606     else if (data <= 35)
607     {
608         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
609         MS_U16 dataExpression = ( data-28 );
610         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
611         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
612 
613     }
614     else if (data <= 42 )
615     {
616         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
617         MS_U16 dataExpression = (( data-35 )<< 4) + 7;
618         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
619         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
620     }
621   else if (data <= 49 )
622     {
623         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
624         MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
625         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
626         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
627 
628     }
629     else if (data <= 56 )
630     {
631         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
632         MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
633         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
634         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
635     }
636     else if (data <= 63 )
637     {
638         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
639         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
640         MS_U16 dataExpression = (data - 56 );
641         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, dataExpression, 0x7777);
642     }
643     else
644     {
645         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
646         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
647         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7777, 0x7777);
648     }
649 }
DEBUG_LC_Full6bit4(const MS_U8 data)650 void DEBUG_LC_Full6bit4( const MS_U8 data )
651 {
652     //BK30_53, BK30_57, BK30_5B
653     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
654     //LSB(low byte) = left, MSB(high byte) = right
655 
656     if ( data <= 7 )
657     {
658 
659         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, data, 0x7777);
660         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
661         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
662 
663   }
664   else if ( data <= 14 )
665     {
666         MS_U16 dataExpression = ( (data-7) << 4) + 7;
667         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
668         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
669         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
670     }
671     else if ( data <= 21)
672     {
673         MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
674         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
675         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
676         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
677     }
678     else if (data <= 28 )
679     {
680         MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
681         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
682         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
683         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
684     }
685     else if (data <= 35)
686     {
687         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
688         MS_U16 dataExpression = ( data-28 );
689         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
690         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
691 
692     }
693     else if (data <= 42 )
694     {
695         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
696         MS_U16 dataExpression = (( data-35 )<< 4) + 7;
697         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
698         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
699     }
700   else if (data <= 49 )
701     {
702         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
703         MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
704         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
705         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
706 
707     }
708     else if (data <= 56 )
709     {
710         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
711         MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
712         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
713         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
714     }
715     else if (data <= 63 )
716     {
717         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
718         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
719         MS_U16 dataExpression = (data - 56 );
720         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, dataExpression, 0x7777);
721     }
722     else
723     {
724         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
725         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
726         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
727     }
728 }
DEBUG_LC_Full6bit5(const MS_U8 data)729 void DEBUG_LC_Full6bit5( const MS_U8 data )
730 {
731     //BK30_50, BK30_54, BK30_58
732     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
733     //LSB(low byte) = left, MSB(high byte) = right
734 
735     if ( data <= 7 )
736     {
737 
738         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, data, 0x7777);
739         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
740         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
741 
742   }
743   else if ( data <= 14 )
744     {
745         MS_U16 dataExpression = ( (data-7) << 4) + 7;
746         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
747         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
748         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
749     }
750     else if ( data <= 21)
751     {
752         MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
753         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
754         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
755         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
756     }
757     else if (data <= 28 )
758     {
759         MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
760         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
761         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
762         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
763     }
764     else if (data <= 35)
765     {
766         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
767         MS_U16 dataExpression = ( data-28 );
768         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
769         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
770 
771     }
772     else if (data <= 42 )
773     {
774         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
775         MS_U16 dataExpression = (( data-35 )<< 4) + 7;
776         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
777         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
778     }
779   else if (data <= 49 )
780     {
781         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
782         MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
783         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
784         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
785 
786     }
787     else if (data <= 56 )
788     {
789         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
790         MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
791         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
792         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
793     }
794     else if (data <= 63 )
795     {
796         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
797         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x7777, 0x7777);
798         MS_U16 dataExpression = (data - 56 );
799         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, dataExpression, 0x7777);
800     }
801     else //>64
802     {
803         MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
804         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x7777, 0x7777);
805         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x7777, 0x7777);
806     }
807 }
DEBUG_LC_Full6bit6(const MS_U8 data)808 void DEBUG_LC_Full6bit6( const MS_U8 data )
809 {
810     //BK30_50, BK30_54, BK30_58
811     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
812     //LSB(low byte) = left, MSB(high byte) = right
813 
814     if ( data <= 7 )
815     {
816 
817         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, data, 0x7777);
818         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
819         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
820 
821   }
822   else if ( data <= 14 )
823     {
824         MS_U16 dataExpression = ( (data-7) << 4) + 7;
825         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
826         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
827         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
828     }
829     else if ( data <= 21)
830     {
831         MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
832         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
833         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
834         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
835     }
836     else if (data <= 28 )
837     {
838         MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
839         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
840         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
841         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
842     }
843     else if (data <= 35)
844     {
845         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
846         MS_U16 dataExpression = ( data-28 );
847         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
848         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
849 
850     }
851     else if (data <= 42 )
852     {
853         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
854         MS_U16 dataExpression = (( data-35 )<< 4) + 7;
855         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
856         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
857     }
858   else if (data <= 49 )
859     {
860         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
861         MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
862         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
863         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
864 
865     }
866     else if (data <= 56 )
867     {
868         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
869         MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
870         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
871         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
872     }
873     else if (data <= 63 )
874     {
875         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
876         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x7777, 0x7777);
877         MS_U16 dataExpression = (data - 56 );
878         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, dataExpression, 0x7777);
879     }
880     else //>64
881     {
882         MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
883         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x7777, 0x7777);
884         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x7777, 0x7777);
885     }
886 }
DEBUG_LC_Full6bit7(const MS_U8 data)887 void DEBUG_LC_Full6bit7( const MS_U8 data )
888 {
889     //BK30_50, BK30_54, BK30_58
890     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
891     //LSB(low byte) = left, MSB(high byte) = right
892 
893     if ( data <= 7 )
894     {
895 
896         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, data, 0x7777);
897         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
898         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
899 
900   }
901   else if ( data <= 14 )
902     {
903         MS_U16 dataExpression = ( (data-7) << 4) + 7;
904         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
905         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
906         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
907     }
908     else if ( data <= 21)
909     {
910         MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
911         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
912         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
913         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
914     }
915     else if (data <= 28 )
916     {
917         MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
918         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
919         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
920         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
921     }
922     else if (data <= 35)
923     {
924         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
925         MS_U16 dataExpression = ( data-28 );
926         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
927         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
928 
929     }
930     else if (data <= 42 )
931     {
932         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
933         MS_U16 dataExpression = (( data-35 )<< 4) + 7;
934         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
935         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
936     }
937   else if (data <= 49 )
938     {
939         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
940         MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
941         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
942         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
943 
944     }
945     else if (data <= 56 )
946     {
947         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
948         MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
949         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
950         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
951     }
952     else if (data <= 63 )
953     {
954         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
955         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x7777, 0x7777);
956         MS_U16 dataExpression = (data - 56 );
957         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, dataExpression, 0x7777);
958     }
959     else //>64
960     {
961         MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
962         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x7777, 0x7777);
963         MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x7777, 0x7777);
964     }
965 }
DEBUG_LC_Full6bit8(const MS_U8 data)966 void DEBUG_LC_Full6bit8( const MS_U8 data )
967 {
968     //BK30_50, BK30_54, BK30_58
969     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
970     //LSB(low byte) = left, MSB(high byte) = right
971 
972     if ( data <= 7 )
973     {
974         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, data, 0x7777);
975         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
976         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
977   }
978   else if ( data <= 14 )
979     {
980         MS_U16 dataExpression = ( (data-7) << 4) + 7;
981         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
982         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
983         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
984     }
985     else if ( data <= 21)
986     {
987         MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
988         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
989         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
990         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
991     }
992     else if (data <= 28 )
993     {
994         MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
995         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
996         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
997         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
998     }
999     else if (data <= 35)
1000     {
1001         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1002         MS_U16 dataExpression = ( data-28 );
1003         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1004         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1005 
1006     }
1007     else if (data <= 42 )
1008     {
1009         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1010         MS_U16 dataExpression = (( data-35 )<< 4) + 7;
1011         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1012         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1013     }
1014   else if (data <= 49 )
1015     {
1016         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1017         MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
1018         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1019         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1020 
1021     }
1022     else if (data <= 56 )
1023     {
1024         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1025         MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
1026         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1027         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1028     }
1029     else if (data <= 63 )
1030     {
1031         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1032         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x7777, 0x7777);
1033         MS_U16 dataExpression = (data - 56 );
1034         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, dataExpression, 0x7777);
1035     }
1036     else //>64
1037     {
1038         MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1039         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x7777, 0x7777);
1040         MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x7777, 0x7777);
1041     }
1042 }
DEBUG_LC_DBKWidth(const MS_U8 width)1043 void DEBUG_LC_DBKWidth( const MS_U8 width )
1044 {
1045     //BK30_40~BK30_5F
1046     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1047     //LSB(low byte) = left, MSB(high byte) = right
1048     if ( width == 8 )
1049     {
1050         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0222, 0x0777);
1051     }
1052     else if ( width == 16 )
1053     {
1054         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0444, 0x0777);
1055     }
1056     else if ( width <=22 && width>=20 )
1057     {
1058         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0555, 0x0777);
1059     }
1060     else
1061     {
1062         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0111, 0x0777);
1063     }
1064 }
DEBUG_LC_DBKDET(const MS_U8 GG)1065 void DEBUG_LC_DBKDET( const MS_U8 GG )
1066 {
1067 
1068     //BK30_40~BK30_5F
1069     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1070     //LSB(low byte) = left, MSB(high byte) = right
1071     if ( GG == 0 )
1072     {
1073         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x7000, 0x7000);
1074     }
1075     if ( GG == 1 )
1076     {
1077         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x6000, 0x7000); //yellow
1078     }
1079     else if (GG == 2)
1080     {
1081         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x5000, 0x7000); //purple
1082     }
1083     else if (GG == 3)
1084     {
1085         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x4000, 0x7000); //4 = cyan
1086     }
1087     else if (GG == 4)
1088     {
1089         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x3000, 0x7000); //3 = blue
1090     }
1091     else if (GG == 5)
1092     {
1093         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x2000, 0x7000); //2 = green
1094     }
1095     else if (GG == 6)
1096     {
1097         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0000, 0x7000);
1098 
1099     }
1100     else
1101     {
1102         MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x1111, 0x7000);
1103     }
1104 }
DEBUG_LC_FrameEdg(const MS_U16 inValue)1105 void DEBUG_LC_FrameEdg( const MS_U16 inValue )
1106 {
1107     //BK30_40~BK30_5F
1108     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1109     //LSB(low byte) = left, MSB(high byte) = right
1110 
1111     //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1112 
1113     //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1114     //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1115     int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1116     {
1117         TH1 = 100;
1118         TH2 = 80;
1119         TH3 = 60;
1120         TH4 = 50;
1121         TH5 = 40;
1122         TH6 = 30;
1123         TH7 = 20;
1124         TH8 = 10;
1125     }
1126     if ( inValue> TH1 )
1127     {
1128         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
1129         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1130     }
1131     else if ( inValue> TH2 )
1132     {
1133         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7770, 0x7777);
1134         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1135     }
1136     else if ( inValue> TH3 )
1137     {
1138         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7700, 0x7777);
1139         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1140     }
1141     else if ( inValue> TH4 )
1142     {
1143         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7000, 0x7777);
1144         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1145     }
1146     else if ( inValue > TH5 )
1147     {
1148         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1149         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1150     }
1151     else if ( inValue > TH6 )
1152     {
1153         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1154         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7770, 0x7777);
1155     }
1156     else if ( inValue > TH7 )
1157     {
1158         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1159         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7700, 0x7777);
1160     }
1161     else if ( inValue > TH8 )
1162     {
1163         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1164         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7000, 0x7777);
1165     }
1166     else
1167     {
1168         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1169         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x0000, 0x7777);
1170     }
1171 }
DEBUG_LC_FrameBlk(const MS_U16 inValue)1172 void DEBUG_LC_FrameBlk( const MS_U16 inValue )
1173 {
1174     //BK30_40~BK30_5F
1175     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1176     //LSB(low byte) = left, MSB(high byte) = right
1177 
1178     //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1179 
1180     //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1181     //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1182     int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1183     //if (HD_control == false)
1184     {
1185         TH1 = 100;
1186         TH2 = 80;
1187         TH3 = 60;
1188         TH4 = 50;
1189         TH5 = 40;
1190         TH6 = 30;
1191         TH7 = 20;
1192         TH8 = 10;
1193     }
1194     if ( inValue> TH1 )
1195     {
1196         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
1197         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1198     }
1199     else if ( inValue> TH2 )
1200     {
1201         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7770, 0x7777);
1202         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1203     }
1204     else if ( inValue> TH3 )
1205     {
1206         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7700, 0x7777);
1207         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1208     }
1209     else if ( inValue> TH4 )
1210     {
1211         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7000, 0x7777);
1212         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1213     }
1214     else if ( inValue > TH5 )
1215     {
1216         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1217         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1218     }
1219     else if ( inValue > TH6 )
1220     {
1221         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1222         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7770, 0x7777);
1223     }
1224     else if ( inValue > TH7 )
1225     {
1226         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1227         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7700, 0x7777);
1228     }
1229     else if ( inValue > TH8 )
1230     {
1231         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1232         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7000, 0x7777);
1233     }
1234     else
1235     {
1236         MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1237         MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
1238     }
1239 }
DEBUG_LC_FrameDet(const MS_U16 inValue)1240 void DEBUG_LC_FrameDet( const MS_U16 inValue )
1241 {
1242     //BK30_40~BK30_5F
1243     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1244     //LSB(low byte) = left, MSB(high byte) = right
1245 
1246     //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1247 
1248     //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1249     //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1250     int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1251     //if (HD_control == false)
1252     {
1253         TH1 = 100;
1254         TH2 = 80;
1255         TH3 = 60;
1256         TH4 = 50;
1257         TH5 = 40;
1258         TH6 = 30;
1259         TH7 = 20;
1260         TH8 = 10;
1261     }
1262     if ( inValue> TH1 )
1263     {
1264         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7777, 0x7777);
1265         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1266     }
1267     else if ( inValue> TH2 )
1268     {
1269         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7770, 0x7777);
1270         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1271     }
1272     else if ( inValue> TH3 )
1273     {
1274         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7700, 0x7777);
1275         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1276     }
1277     else if ( inValue> TH4 )
1278     {
1279         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7000, 0x7777);
1280         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1281     }
1282     else if ( inValue > TH5 )
1283     {
1284         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1285         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1286     }
1287     else if ( inValue > TH6 )
1288     {
1289         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1290         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7770, 0x7777);
1291     }
1292     else if ( inValue > TH7 )
1293     {
1294         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1295         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7700, 0x7777);
1296     }
1297     else if ( inValue > TH8 )
1298     {
1299         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1300         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7000, 0x7777);
1301     }
1302     else
1303     {
1304         MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1305         MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
1306     }
1307 }
1308 
DEBUG_LC_ColorSum(const MS_U16 inValue)1309 void DEBUG_LC_ColorSum( const MS_U16 inValue )
1310 {
1311     //BK30_40~BK30_5F
1312     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1313     //LSB(low byte) = left, MSB(high byte) = right
1314 
1315     //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1316 
1317     //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1318     //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1319     int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1320 
1321     {
1322         TH1 = 100;
1323         TH2 = 80;
1324         TH3 = 60;
1325         TH4 = 50;
1326         TH5 = 40;
1327         TH6 = 30;
1328         TH7 = 20;
1329         TH8 = 10;
1330     }
1331     if ( inValue> TH1 )
1332         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
1333     else if ( inValue> TH2 )
1334         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7774, 0x7777);
1335     else if ( inValue> TH3 )
1336         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7770, 0x7777);
1337     else if ( inValue> TH4 )
1338         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7740, 0x7777);
1339     else if ( inValue > TH5 )
1340         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7700, 0x7777);
1341     else if ( inValue > TH6 )
1342         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7400, 0x7777);
1343     else if ( inValue > TH7 )
1344         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7000, 0x7777);
1345     else if ( inValue > TH8 )
1346         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x4000, 0x7777);
1347     else
1348         MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
1349 }
DEBUG_LC_uComplex(const MS_U16 inValue)1350 void DEBUG_LC_uComplex( const MS_U16 inValue )
1351 {
1352     //BK30_40~BK30_5F
1353     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1354     //LSB(low byte) = left, MSB(high byte) = right
1355 
1356     //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1357 
1358     //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1359     //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1360     int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1361 
1362     {
1363         TH1 = 0x1000;
1364         TH2 = 0x0800;
1365         TH3 = 0x0400;
1366         TH4 = 0x0200;
1367         TH5 = 0x0100;
1368         TH6 = 0x0080;
1369         TH7 = 0x0040;
1370         TH8 = 0x0020;
1371     }
1372     if ( inValue> TH1 )
1373         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
1374     else if ( inValue> TH2 )
1375         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7774, 0x7777);
1376     else if ( inValue> TH3 )
1377         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7770, 0x7777);
1378     else if ( inValue> TH4 )
1379         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7740, 0x7777);
1380     else if ( inValue > TH5 )
1381         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7700, 0x7777);
1382     else if ( inValue > TH6 )
1383         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7400, 0x7777);
1384     else if ( inValue > TH7 )
1385         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7000, 0x7777);
1386     else if ( inValue > TH8 )
1387         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x4000, 0x7777);
1388     else
1389         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x0000, 0x7777);
1390 
1391 }
DEBUG_LC_SDCnt(const MS_U16 inValue)1392 void DEBUG_LC_SDCnt( const MS_U16 inValue )
1393 {
1394     //BK30_40~BK30_5F
1395     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1396     //LSB(low byte) = left, MSB(high byte) = right
1397 
1398     //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1399 
1400     //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1401     //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1402     int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1403 
1404     {
1405         TH1 = 50000;
1406         TH2 = 20000;
1407         TH3 = 8000;
1408         TH4 = 3000;
1409         TH5 = 1000;
1410         TH6 = 300;
1411         TH7 = 100;
1412         TH8 = 10;
1413     }
1414     if ( inValue> TH1 )
1415         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7777, 0x7777);
1416     else if ( inValue> TH2 )
1417         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7774, 0x7777);
1418     else if ( inValue> TH3 )
1419         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7770, 0x7777);
1420     else if ( inValue> TH4 )
1421         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7740, 0x7777);
1422     else if ( inValue > TH5 )
1423         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7700, 0x7777);
1424     else if ( inValue > TH6 )
1425         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7400, 0x7777);
1426     else if ( inValue > TH7 )
1427         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7000, 0x7777);
1428     else if ( inValue > TH8 )
1429         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x4000, 0x7777);
1430     else
1431         MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
1432 }
DEBUG_LC_HDCnt(const MS_U16 inValue)1433 void DEBUG_LC_HDCnt( const MS_U16 inValue )
1434 {
1435     //BK30_40~BK30_5F
1436     //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1437     //LSB(low byte) = left, MSB(high byte) = right
1438 
1439     //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1440 
1441     //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1442     //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1443     int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1444 
1445     {
1446         TH1 = 4000;
1447         TH2 = 1000;
1448         TH3 = 500;
1449         TH4 = 250;
1450         TH5 = 120;
1451         TH6 = 60;
1452         TH7 = 30;
1453         TH8 = 10;
1454     }
1455     if ( inValue> TH1 )
1456         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7777, 0x7777);
1457     else if ( inValue> TH2 )
1458         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7774, 0x7777);
1459     else if ( inValue> TH3 )
1460         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7770, 0x7777);
1461     else if ( inValue> TH4 )
1462         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7740, 0x7777);
1463     else if ( inValue > TH5 )
1464         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7700, 0x7777);
1465     else if ( inValue > TH6 )
1466         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7400, 0x7777);
1467     else if ( inValue > TH7 )
1468         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7000, 0x7777);
1469     else if ( inValue > TH8 )
1470         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x4000, 0x7777);
1471     else
1472         MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x0000, 0x7777);
1473 }
1474 /******************************************************************************/
1475 // Debug Info Control
1476 /******************************************************************************/
1477 
1478 
1479 
1480 
1481 //-------------------------------------------------------------------------------------------------
1482 //  Local Functions
1483 //-------------------------------------------------------------------------------------------------
1484 
1485 
1486 //-------------------------------------------------------------------------------------------------
1487 //  Global Functions
1488 //-------------------------------------------------------------------------------------------------
__minmax(int a,int b,int c)1489 int __minmax(int a, int b, int c) // make sure b < c
1490 {
1491     if (a<=b)
1492         return b;
1493     else if (a >= c)
1494         return c;
1495     else
1496         return a;
1497 }
1498 
__max(int a,int b)1499 int __max(int a, int b)
1500 {
1501     if (a>=b)
1502         return a;
1503     else
1504         return b;
1505 }
1506 
__max3(int a,int b,int c)1507 int __max3(int a, int b, int c)
1508 {
1509     if ( (a>=b) && (a>=c) )
1510         return a;
1511     else if ((b>=a) && (b>=c) )
1512         return b;
1513     else
1514         return c;
1515 }
1516 
__min(int a,int b)1517 int __min(int a, int b)
1518 {
1519     if (a>=b)
1520         return b;
1521     else
1522         return a;
1523 }
1524 
__min3(int a,int b,int c)1525 int __min3(int a, int b, int c)
1526 {
1527     if ( (a<=b) && (a<=c) )
1528         return a;
1529     else if ((b<=a) && (b<=c) )
1530         return b;
1531     else
1532         return c;
1533 }
1534 
1535 /******************************************************************************/
1536 ///Get control register for adaptive tuning function
1537 ///@return MS_U32: Read two byte for FSC
1538 ///Add by Bella 20150707
1539 /******************************************************************************/
MDrv_Read2Byte(MS_U64 AddresL)1540 MS_U16 MDrv_Read2Byte( MS_U64 AddresL) //Eva modify U8 --> U16
1541 {
1542     MS_U16 u16Value= 0;
1543 
1544     u16Value= (MS_U16)((MApi_XC_ReadByte(AddresL+1) << 8) |(MApi_XC_ReadByte(AddresL)));
1545 
1546     return u16Value;
1547 }
1548 
1549 /******************************************************************************/
1550 ///Get control register for adaptive tuning function
1551 ///@return MS_U32: Read two byte and MASK for FSC
1552 ///Add by Bella 20150707
1553 /******************************************************************************/
MDrv_Read2ByteMSK(MS_U64 AddresL,MS_U16 mask)1554 MS_U16 MDrv_Read2ByteMSK( MS_U64 AddresL, MS_U16 mask)
1555 {
1556     MS_U16 u16Value= 0;
1557 
1558     u16Value= (MS_U16)((MApi_XC_ReadByte(AddresL+1) << 8) |(MApi_XC_ReadByte(AddresL)))&mask;
1559 
1560     return u16Value;
1561 }
1562 
1563 /******************************************************************************/
1564 ///Get control register for adaptive tuning function
1565 ///@return MS_U8: Control status
1566 /******************************************************************************/
MDrv_SC_get_adaptive_ctrl(void)1567 MS_U8 MDrv_SC_get_adaptive_ctrl(void)
1568 {
1569     MS_U8 u8Ctrl = 0;
1570 
1571     u8Ctrl = (MS_U8)MApi_XC_R2BYTEMSK(REG_SC_BK22_7C_L, 0xFF);
1572 
1573     return u8Ctrl;
1574 }
1575 
1576 /******************************************************************************/
1577 ///Get control register for adaptive tuning function
1578 ///@return MS_U8: Control status
1579 /******************************************************************************/
MDrv_SC_get_adaptive_ctrl2(void)1580 MS_U8 MDrv_SC_get_adaptive_ctrl2(void)
1581 {
1582     MS_U8 u8Ctrl = 0;
1583 
1584     u8Ctrl = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK22_7C_L, 0xFF00) >> 8);
1585 
1586     return u8Ctrl;
1587 }
1588 
1589 /******************************************************************************/
1590 ///Get control register for adaptive tuning function
1591 ///@return MS_U8: Control status
1592 /******************************************************************************/
MDrv_UFSC_get_adaptive_ctrl3(void)1593 MS_U8 MDrv_UFSC_get_adaptive_ctrl3(void)
1594 {
1595     MS_U8 u8UFSCCtrl = 0;
1596 
1597     u8UFSCCtrl =MDrv_Read2ByteMSK(REG_FSC_BK30_3F_L, 0xFFFF)>>8;
1598 
1599     return u8UFSCCtrl;
1600 }
1601 
1602 /******************************************************************************/
1603 /// Agate Function
1604 /******************************************************************************/
MDrv_SC_Agate_ME1_SetStatisticsWindow(void)1605 void MDrv_SC_Agate_ME1_SetStatisticsWindow( void )
1606 {
1607     MS_U32 u32MaxHblkSize = 0, u32MaxVblkSize = 0;
1608 
1609     u32MaxHblkSize = MApi_XC_R2BYTEMSK(REG_SC_BK17_02_L, 0x00FF);   //ME2_H Max
1610     u32MaxVblkSize = MApi_XC_R2BYTEMSK(REG_SC_BK17_02_L, 0xFF00) >> 8;  //ME2_V Max
1611 
1612     u32MaxHblkSize = u32MaxHblkSize - 1;
1613     u32MaxVblkSize = u32MaxVblkSize - 1;
1614 
1615     MApi_XC_W2BYTEMSK( REG_SC_BK17_5C_L,  u32MaxHblkSize<<8 , 0xFF00 ); /*reg_stat_xblk_end*/
1616     MApi_XC_W2BYTEMSK( REG_SC_BK17_5D_L,  u32MaxVblkSize<<8 , 0xFF00 ); /*reg_stat_yblk_end*/
1617 }
1618 
MDrv_SC_Edison_ME1_SetStatisticsWindow(MS_U32 u16Width,MS_U16 u16Height)1619 void MDrv_SC_Edison_ME1_SetStatisticsWindow(MS_U32 u16Width, MS_U16 u16Height)
1620 {
1621     MS_U16 u16MaxHblkSize = 0, u16MaxVblkSize = 0;
1622 
1623     u16MaxHblkSize  = (u16Width/10);  //ME2_H Max
1624     u16MaxVblkSize = (u16Height/6);  //ME2_V Max
1625 
1626     u16MaxHblkSize  = u16MaxHblkSize - 4;
1627     u16MaxVblkSize = u16MaxVblkSize - 4;
1628 
1629     MApi_XC_W2BYTEMSK( REG_SC_BK17_5C_L,  u16MaxHblkSize<<8 , 0xFF00 ); /*reg_stat_xblk_end*/
1630     MApi_XC_W2BYTEMSK( REG_SC_BK17_5D_L,  u16MaxVblkSize<<8 , 0xFF00 ); /*reg_stat_yblk_end*/
1631 }
1632 
MDrv_SC_Edison_GMV_reload(const XC_GMvStates gMv)1633 void MDrv_SC_Edison_GMV_reload( const XC_GMvStates gMv )
1634 {
1635     MS_BOOL bisPanScan = FALSE;
1636     static MS_U8 iir_cnt = 0;
1637     MS_S8 MvXdir = 0;
1638     MS_S8 MvYdir = 0;
1639 
1640     if( ( gMv.h1XYsum > 10 ) && ( gMv.h2XYsum > 10 ) && ( gMv.h1XYdiff < 5 ) && ( gMv.h2XYdiff < 5 ) ) //pan-scan case
1641     {
1642         bisPanScan = true;
1643     }
1644     else
1645     {
1646         bisPanScan = false;
1647     }
1648 
1649     if( bisPanScan )
1650     {
1651         iir_cnt = 120; //default:240
1652     }
1653     else
1654     {
1655         if( iir_cnt != 0 )
1656             iir_cnt--;
1657     }
1658 
1659     MvXdir = gMv.minMvXdir - 32;
1660     MvYdir = gMv.minMvYdir - 8;
1661 
1662     //ME1 refer GMV
1663     if( iir_cnt == 0 )
1664     {
1665         MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x03  , 0x000F );
1666         MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<0) , 0x007F );
1667         MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<8) , 0x1F00 );
1668         MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x00<<8) , 0xFF00 );
1669     }
1670     else
1671     {
1672         MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x02  , 0x000F );
1673         MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x01<<8) , 0xFF00 ); //ME1 favor GMV enable
1674 
1675         //Set ME1 MVX
1676         if( MvXdir >= 0 )
1677             MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, MvXdir , 0x007F );
1678         else
1679         {
1680             if( MvXdir == -32)
1681                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0060 , 0x007F );
1682             else if( MvXdir == -31)
1683                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0061 , 0x007F );
1684             else if( MvXdir == -30)
1685                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0062 , 0x007F );
1686             else if( MvXdir == -29)
1687                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0063 , 0x007F );
1688             else if( MvXdir == -28)
1689                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0064 , 0x007F );
1690             else if( MvXdir == -27)
1691                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0065 , 0x007F );
1692             else if( MvXdir == -26)
1693                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0066 , 0x007F );
1694             else if( MvXdir == -25)
1695                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0067 , 0x007F );
1696             else if( MvXdir == -24)
1697                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0068 , 0x007F );
1698             else if( MvXdir == -23)
1699                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0069 , 0x007F );
1700             else if( MvXdir == -22)
1701                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006A , 0x007F );
1702             else if( MvXdir == -21)
1703                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006B , 0x007F );
1704             else if( MvXdir == -20)
1705                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006C , 0x007F );
1706             else if( MvXdir == -19)
1707                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006D , 0x007F );
1708             else if( MvXdir == -18)
1709                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006E , 0x007F );
1710             else if( MvXdir == -17)
1711                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006F , 0x007F );
1712             else if( MvXdir == -16)
1713                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0070 , 0x007F );
1714             else if( MvXdir == -15)
1715                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0071 , 0x007F );
1716             else if( MvXdir == -14)
1717                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0072 , 0x007F );
1718             else if( MvXdir == -13)
1719                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0073 , 0x007F );
1720             else if( MvXdir == -12)
1721                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0074 , 0x007F );
1722             else if( MvXdir == -11)
1723                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0075 , 0x007F );
1724             else if( MvXdir == -10)
1725                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0076 , 0x007F );
1726             else if( MvXdir == -9)
1727                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0077 , 0x007F );
1728             else if( MvXdir == -8)
1729                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0078 , 0x007F );
1730             else if( MvXdir == -7)
1731                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0079 , 0x007F );
1732             else if( MvXdir == -6)
1733                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007A , 0x007F );
1734             else if( MvXdir == -5)
1735                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007B , 0x007F );
1736             else if( MvXdir == -4)
1737                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007C , 0x007F );
1738             else if( MvXdir == -3)
1739                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007D , 0x007F );
1740             else if( MvXdir == -2)
1741                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007E , 0x007F );
1742             else if( MvXdir == -1)
1743                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007F , 0x007F );
1744         }
1745 
1746         //Set ME1 MVY
1747         if( MvYdir >= 0 )
1748             MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, MvYdir<<8 , 0x1F00 );
1749         else
1750         {
1751             if( MvYdir == -8)
1752                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1800 , 0x1F00 );
1753             else if( MvYdir == -7)
1754                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1900 , 0x1F00 );
1755             else if( MvYdir == -6)
1756                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1A00 , 0x1F00 );
1757             else if( MvYdir == -5)
1758                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1B00 , 0x1F00 );
1759             else if( MvYdir == -4)
1760                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1C00 , 0x1F00 );
1761             else if( MvYdir == -3)
1762                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1D00 , 0x1F00 );
1763             else if( MvYdir == -2)
1764                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1E00 , 0x1F00 );
1765             else if( MvYdir == -1)
1766                 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1F00 , 0x1F00 );
1767         }
1768     }
1769 }
1770 
1771 #define REG_MCDI_EODIW_SHIFT_MAX 3
1772 #define REG_MCDI_EODIW_SHIFT_MIN 1
1773 #define REG_MCDI_EODIW_AB_MAX_GAIN_MAX 12
1774 #define REG_MCDI_EODIW_AB_MAX_GAIN_MIN 4
1775 #define REG_MCDI_EODIW_MIN_SAD_GAIN_MAX 6
1776 #define REG_MCDI_EODIW_MIN_SAD_GAIN_MIN 1
MDrv_SC_Agate_SubMvPanScan(const XC_GMvStates gMv,const MS_BOOL isSceneChange,const MS_BOOL isSdHqvJaggedTest,const MS_U16 motion)1777 void MDrv_SC_Agate_SubMvPanScan( const XC_GMvStates gMv, const MS_BOOL isSceneChange, const MS_BOOL isSdHqvJaggedTest, const MS_U16 motion )
1778 {
1779     MS_BOOL bisSubMvPanScan = FALSE;
1780     static MS_U8 u8iir_cnt = 0;
1781     MS_BOOL bisMv0 = ( ( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 ) ) ? true : false;
1782     static MS_U8 u8isMv0Cnt = 0;
1783     static MS_U8 u8isSubMvPanScanCnt = 0;
1784 
1785     static MS_U16 u16reg_mcdi_eodiw_shift = REG_MCDI_EODIW_SHIFT_MAX;
1786     static MS_U16 u16reg_mcdi_eodiw_ab_max_gain = REG_MCDI_EODIW_AB_MAX_GAIN_MIN;
1787     static MS_U16 u16reg_mcdi_eodiw_min_sad_gain = REG_MCDI_EODIW_MIN_SAD_GAIN_MAX;
1788 
1789 
1790     if( bisMv0 && ( motion < 0x100 ) )
1791     {
1792         if( u8isMv0Cnt < 20 )
1793             u8isMv0Cnt++;
1794     }
1795     else
1796     {
1797         if( u8isMv0Cnt > 0 )
1798             u8isMv0Cnt--;
1799     }
1800 
1801     if( ( gMv.h1XYsum > 10 ) && ( gMv.h2XYsum > 10 )
1802         &&( gMv.h1XYdiff < 5 ) && ( gMv.h2XYdiff < 5 ) && gMv.yMvIsMovingOdd )
1803     {
1804         bisSubMvPanScan = true;
1805     }
1806     else
1807     {
1808         bisSubMvPanScan = false;
1809     }
1810 
1811 
1812     if( bisSubMvPanScan )
1813     {
1814         if( u8isSubMvPanScanCnt < 20 )
1815             u8isSubMvPanScanCnt++;
1816     }
1817     else
1818     {
1819         if( u8isSubMvPanScanCnt > 0 )
1820             u8isSubMvPanScanCnt--;
1821     }
1822 
1823 
1824     //PRT_TRP(" isSubMvPanScan(%d)\n", isSubMvPanScan);
1825     //PRT_TRP(" isSubMvPanScan(%d)\n", isSubMvPanScan);
1826 
1827     if( ( u8isSubMvPanScanCnt > 5 ) || isSdHqvJaggedTest )
1828     {
1829         u8iir_cnt = 240;
1830     }
1831     else
1832     {
1833         if( u8iir_cnt != 0 )
1834             u8iir_cnt--;
1835     }
1836 
1837     if( isSceneChange ||  ( u8isMv0Cnt > 10 ) ) /* for pattern stable, if only check GMV-Mv0 have problem */
1838         u8iir_cnt = 0;
1839 
1840     if( u8iir_cnt == 0 )
1841     {
1842         if( u16reg_mcdi_eodiw_shift < REG_MCDI_EODIW_SHIFT_MAX )
1843             u16reg_mcdi_eodiw_shift++;
1844 
1845         if( u16reg_mcdi_eodiw_ab_max_gain > REG_MCDI_EODIW_AB_MAX_GAIN_MIN )
1846             u16reg_mcdi_eodiw_ab_max_gain--;
1847 
1848         if( u16reg_mcdi_eodiw_min_sad_gain < REG_MCDI_EODIW_MIN_SAD_GAIN_MAX )
1849             u16reg_mcdi_eodiw_min_sad_gain++;
1850     }
1851     else/* do sub pixel */
1852     {
1853         if( u16reg_mcdi_eodiw_shift > REG_MCDI_EODIW_SHIFT_MIN )
1854             u16reg_mcdi_eodiw_shift--;
1855 
1856         if( u16reg_mcdi_eodiw_ab_max_gain < REG_MCDI_EODIW_AB_MAX_GAIN_MAX )
1857             u16reg_mcdi_eodiw_ab_max_gain++;
1858 
1859         if( u16reg_mcdi_eodiw_min_sad_gain > REG_MCDI_EODIW_MIN_SAD_GAIN_MIN )
1860             u16reg_mcdi_eodiw_min_sad_gain--;
1861     }
1862 
1863     MApi_XC_W2BYTEMSK( REG_SC_BK22_29_L, u16reg_mcdi_eodiw_shift  , 0x000F );
1864     MApi_XC_W2BYTEMSK( REG_SC_BK22_29_L, (u16reg_mcdi_eodiw_ab_max_gain<<12) , 0xF000 );
1865 
1866      //Dummy to control write value, add by Bella 20150708
1867         if((MApi_XC_R2BYTE(REG_SC_BK23_5D_L)&0x0F00)!=0x0000)
1868         {
1869             MApi_XC_W2BYTEMSK(REG_SC_BK22_2A_L, MApi_XC_R2BYTE(REG_SC_BK23_5D_L), 0x0F00);
1870          }
1871         else
1872          {
1873         MApi_XC_W2BYTEMSK( REG_SC_BK22_2A_L, (u16reg_mcdi_eodiw_min_sad_gain<<8) , 0x0F00 );
1874          }
1875 }
1876 
MDrv_SC_Agate_PanScan_Church(const XC_GMvStates gMv,const MS_U16 nonMv0Comfirm,const MS_U32 uComplex,const MS_BOOL meStill,const MS_BOOL isHDsource)1877 void MDrv_SC_Agate_PanScan_Church( const XC_GMvStates gMv, const MS_U16 nonMv0Comfirm, const MS_U32 uComplex, const MS_BOOL meStill, const MS_BOOL isHDsource )
1878 {
1879     MS_BOOL bisPanScanV = FALSE;
1880     static MS_U8 iir_cnt = 0;
1881     MS_U32 colorSum = 0;
1882 
1883     colorSum  = MApi_XC_R2BYTE(REG_SC_BK1A_6E_L);
1884     colorSum  = colorSum / 8;
1885 
1886     if( (gMv.h1XYsum > 10) && (gMv.h2XYsum > 10) && (gMv.h1XYdiff < 3) && (gMv.h2XYdiff < 3)
1887             && (gMv.minMvXdir == 32) && (nonMv0Comfirm > 6) &&(colorSum > 0x80) && (uComplex > 0x100)
1888             && (uComplex < 0x600) && (meStill == false) && (isHDsource == false) ) //vertical moving
1889     {
1890             bisPanScanV = true;
1891     }
1892     else
1893     {
1894             bisPanScanV = false;
1895     }
1896 
1897     if( bisPanScanV )
1898     {
1899         iir_cnt = 120; //default:240
1900     }
1901     else
1902     {
1903         if( iir_cnt != 0 )
1904         iir_cnt--;
1905     }
1906 
1907     if( isHDsource )
1908         iir_cnt = 0;
1909 
1910     if( iir_cnt == 0 )
1911     {
1912         MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x03  , 0x000F );
1913         MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<8) , 0xFF00 );
1914         MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x00<<8) , 0xFF00 );
1915         MApi_XC_W2BYTEMSK( REG_SC_BK17_54_L, (0x10) , 0x00FF );
1916      }
1917     else
1918     {
1919         MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x01  , 0x000F );
1920         MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x02<<8) , 0xFF00 );
1921         MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x02<<8) , 0xFF00 );
1922         MApi_XC_W2BYTEMSK( REG_SC_BK17_54_L, (0x6C) , 0x00FF );
1923      }
1924 }
1925 
MDrv_SC_FilmReorder(const XC_OpFrameStates opFrameStatus)1926 void MDrv_SC_FilmReorder( const XC_OpFrameStates opFrameStatus )
1927 {
1928     static XC_FilmRoStates filmRoStates;
1929     static MS_BOOL init = true;
1930     static MS_U8 samplingTime = 0;
1931 //  MS_BOOL isPoolOfFull;
1932     int vaildCnt = 0;
1933     int i = 0;
1934 
1935     samplingTime++;
1936 
1937     if( init )
1938     {
1939         for( i=0; i < 16 ; i++ )
1940         {
1941             filmRoStates.motion[i] = 0;
1942             filmRoStates.unmatch_1[i] = 0;
1943             filmRoStates.unmatch_3[i] = 0;
1944             filmRoStates.vaildCnt[i] = 0;
1945             filmRoStates.vaild[i] = false;
1946         }
1947         init = false;
1948     }
1949 
1950     /* Step0. loading states */
1951     filmRoStates.motion[opFrameStatus.curOpFrame]           = MApi_XC_R2BYTEMSK(REG_SC_BK0A_1A_L, 0xFFFF);
1952     filmRoStates.unmatch_1[opFrameStatus.curOpFrame]        = MApi_XC_R2BYTEMSK(REG_SC_BK0A_0A_L, 0xFFFF);
1953     filmRoStates.unmatch_3[opFrameStatus.curOpFrame]        = MApi_XC_R2BYTEMSK(REG_SC_BK0A_0B_L, 0xFFFF);
1954 
1955     if( filmRoStates.vaildCnt[opFrameStatus.curOpFrame] < 255 )
1956         filmRoStates.vaildCnt[opFrameStatus.curOpFrame]++;
1957 
1958     filmRoStates.vaild[opFrameStatus.curOpFrame]          = true;
1959 
1960     /* Step1. 1s do clean unflash counter */
1961     if( samplingTime == 60 )
1962     {
1963         for( i = 0; i < opFrameStatus.maxOpFrame; i++ )
1964         {
1965             if( filmRoStates.vaildCnt[i] < 10 )
1966             {
1967                 filmRoStates.vaild[i]         = false;
1968             }
1969         }
1970         samplingTime = 0;/* reset of sampling time */
1971     }
1972 
1973     /* Step2. Check pool is full */
1974     vaildCnt = 0;
1975     for( i = 0; i < opFrameStatus.maxOpFrame; i++ )
1976     {
1977         if( filmRoStates.vaild[i] )
1978             vaildCnt++;
1979     }
1980 //  isPoolOfFull = ( vaildCnt > (opFrameStatus.maxOpFrame/2) ) ? true : false;
1981 
1982 }
1983 
MDrv_SC_SaveHpfSetting(const MS_U8 isSourceChange)1984 XC_HpfDefaultRegSetting MDrv_SC_SaveHpfSetting( const MS_U8 isSourceChange )
1985 {
1986     static XC_HpfDefaultRegSetting reg;
1987 
1988     if(  isSourceChange == 1 )
1989     {
1990 
1991         reg.HDSDD0_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0001) );
1992         reg.HDSDD1_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0010) >> 4 );
1993 
1994         reg.HDSDD0_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0700) >> 8 );
1995         reg.HDSDD1_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x7000) >> 12 );
1996 
1997         reg.HDSDD0_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_71_L, 0xFFFF)  );
1998         reg.HDSDD1_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_72_L, 0xFFFF)  );
1999 
2000         reg.HDSDD_underflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x003F)  );
2001         reg.HDSDD_overflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x3F00) >> 8 );
2002 
2003         //reg.HDSD_detection_letter_box_enable = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0080) >> 7 );
2004     }
2005     return reg;
2006 }
2007 
2008 #if 0
2009 void print_hpfSetting(void)
2010 {
2011     MS_BOOL HDSDD0_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0001) );
2012     MS_BOOL HDSDD1_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0010) >> 4 );
2013 
2014     MS_U8 HDSDD0_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0700) >> 8 );
2015     MS_U8 HDSDD1_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x7000) >> 12 );
2016 
2017     MS_U16 HDSDD0_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_71_L, 0xFFFF)  );
2018     MS_U16 HDSDD1_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_72_L, 0xFFFF)  );
2019 
2020     MS_U8 HDSDD_underflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x003F)  );
2021     MS_U8 HDSDD_overflow_threshold  = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x3F00) >> 8 );
2022 
2023     MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
2024     //MS_U16 boundarystart = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_7C_L, 0x1FFF)  );
2025     //MS_U16 boundaryend   = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_7D_L, 0x1FFF)  );
2026     MS_U16 uxx = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0080)  );
2027 
2028     //PRT_TRP("det_mode_0 = %d, det_mode_1 = %d, det_mode_shift_0 = %d, det_mode_shift_1 = %d, det_mode_threshold_0 = %d, det_mode_threshold_1 = %d, HDSDD_underflow_threshold = %d, HDSDD_overflow_threshold = %d\n",
2029     HDSDD0_det_mode, HDSDD1_det_mode, HDSDD0_det_mode_shift, HDSDD1_det_mode_shift, HDSDD0_det_mode_threshold, HDSDD1_det_mode_threshold, HDSDD_underflow_threshold, HDSDD_overflow_threshold);
2030 
2031     //PRT_TRP("widthCur = %d, boundarystart = %d, boundaryend = %d, uxx = %d\n", widthCur, boundarystart, boundaryend, uxx);
2032 }
2033 #endif
2034 
MDrv_SC_hpfDefaultRelod(const XC_HpfDefaultRegSetting defaultReg)2035 void MDrv_SC_hpfDefaultRelod( const XC_HpfDefaultRegSetting defaultReg )
2036 {
2037     //const int boundary = 10;
2038     //MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
2039 
2040 
2041 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold, 0xFFFF);
2042 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode_shift)<<12, 0x7000);
2043 
2044 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF);  /*for HD repot*/
2045 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
2046 
2047 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, defaultReg.HDSDD_underflow_threshold , 0x003F); /* underflow */
2048 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, (defaultReg.HDSDD_overflow_threshold)<<8, 0x3F00); /* overflow */
2049 
2050 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, defaultReg.HDSDD0_det_mode , 0x0001); /* mode */
2051 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode)<<4, 0x0010); /* mode */
2052 
2053 #if FOR_FULL_RANGE
2054     MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x01D8, 0xFFFF); //Reset for Full range in Maserati
2055     MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x4000, 0x7000);
2056 
2057     MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x01D8, 0xFFFF);  /*for HD repot*/ //Reset for Full range in Maserati
2058     MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0200, 0x0700); /*for HD repot*/
2059 
2060     MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x0000, 0x003F); /* underflow */ //Reset for Full range in Maserati
2061     MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3F00, 0x3F00); /* overflow *///Reset for Full range in Maserati
2062 
2063 #else  //for limit range settings
2064     MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x0190, 0xFFFF);
2065     MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x4000, 0x7000);
2066 
2067     MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF);  /*for HD repot*/
2068     MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0200, 0x0700); /*for HD repot*/
2069 
2070 
2071     MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x000C, 0x003F); /* underflow */
2072     MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3200, 0x3F00); /* overflow */
2073 #endif
2074 
2075     MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0001 , 0x0001); /* mode */
2076     MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0010, 0x0010); /* mode */
2077 
2078 
2079 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
2080 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, boundary, 0x1FFF); /* set start */
2081 //  MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);/* set end */
2082 }
2083 
2084 
2085 /*#define TIMEID_LRLETTERBOX 0
2086 MS_BOOL MDrv_SC_Edison_LrLetterBox( const XC_OpFrameStates opFrameStatusCur, const XC_HpfDefaultRegSetting defaultReg, const MS_U8 _timeSharingID, const MS_U8 timingSegment )
2087 {
2088     const int boundary = 10;
2089     static XC_OpFrameStates opFrameStatusLast;
2090     MS_U16 widthCur = 0;
2091     static MS_U16 widthLast;
2092     static MS_U8 operationCnt = 0;
2093     static int maxBreadthDetermine = 0;
2094     MS_U32 sdCntActL_cur = 0, sdCntActR_cur = 0;
2095     static MS_U32 sdCntActL_last = 0xFFFF;
2096     static MS_U32 sdCntActR_last = 0xFFFF;
2097     static int sdCntActLcnt = 0;
2098     static int sdCntActRcnt = 0;
2099     static MS_BOOL isL_letterBox = false;
2100     static MS_BOOL isR_letterBox = false;
2101 
2102     static MS_BOOL _return = false;
2103 
2104     widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);//cur width
2105 
2106     if( _timeSharingID == TIMEID_LRLETTERBOX )
2107     {
2108         if( timingSegment == 0 )
2109             MDrv_SC_hpfDefaultRelod( defaultReg );
2110         else
2111         {
2112             //enable window
2113             MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
2114 
2115             // max width ratio
2116 
2117             if( widthCur != widthLast )
2118             {
2119                 maxBreadthDetermine = widthCur / 12;
2120             }
2121 
2122             // L/R width switch
2123             if( isL_letterBox )// if "L letter box" ready then do "R letter box"
2124             {
2125                 //R side
2126                 MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, widthCur-boundary-maxBreadthDetermine, 0x1FFF);// set start
2127                 MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);//set end
2128             }
2129             else
2130             {
2131                 //L side
2132                 MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 0+boundary, 0x1FFF); //set start
2133                 MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, maxBreadthDetermine+boundary, 0x1FFF);//set end
2134             }
2135 
2136             if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2137             {
2138                 if(operationCnt%2)
2139                 {
2140                     sdCntActL_cur = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
2141                     sdCntActL_cur = ( sdCntActL_last*3 + sdCntActL_cur ) >> 2;
2142                     sdCntActL_last = sdCntActL_cur;
2143 
2144                     if( sdCntActL_last < 3 )
2145                     {
2146                         if( sdCntActLcnt < 256 ) // 256 = counter max
2147                             sdCntActLcnt++;
2148                     }
2149                     else
2150                     {
2151                         if( sdCntActLcnt > 5 )
2152                             sdCntActLcnt = sdCntActLcnt - 5;
2153                     }
2154                 }
2155                 else
2156                 {
2157                     sdCntActR_cur = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
2158                     sdCntActR_cur = ( sdCntActR_last*3 + sdCntActR_cur ) >> 2;
2159                     sdCntActR_last = sdCntActR_cur;
2160 
2161                     if( sdCntActR_last < 3 )
2162                     {
2163                         if( sdCntActRcnt < 256 )// 256 = counter max
2164                             sdCntActRcnt++;
2165                     }
2166                     else
2167                     {
2168                         if( sdCntActRcnt > 5 )
2169                             sdCntActRcnt = sdCntActRcnt - 5;
2170                     }
2171                 }
2172                 operationCnt++;
2173             }
2174 
2175             isL_letterBox = ( sdCntActLcnt > 120 ) ? true : false;
2176             isR_letterBox = ( sdCntActRcnt > 120 ) ? true : false;
2177 
2178             opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2179             widthLast = widthCur;
2180 
2181             _return = (isL_letterBox && isR_letterBox);
2182         }
2183     }
2184     else
2185     {
2186         //disable window
2187         //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0000, 0x0080);
2188         //MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, boundary, 0x1FFF); // set start
2189         //    MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);// set end
2190     }
2191 
2192     return _return;
2193 }
2194 */
MDrv_SC_McFilmLike(const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd)2195 MS_BOOL MDrv_SC_McFilmLike( const XC_OpFrameStates opFrameStatusCur, MS_BOOL isHd )
2196 {
2197     static XC_OpFrameStates opFrameStatusLast;
2198     static XC_McFilmStates mcFilmStates;
2199     MS_BOOL  isFilm = FALSE;
2200     static MS_U8 isFilmCnt = 0;
2201     static MS_U8 continuousError = 0;
2202     MS_U8 lowerBoundTh = 0;
2203 
2204     if( isHd )
2205         lowerBoundTh = 0xFF;
2206     else
2207       #if SZ_PATTERN_ENABLE
2208       lowerBoundTh = 0x80;
2209       #else
2210             lowerBoundTh = 0x40;
2211       #endif
2212 
2213     mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2214     mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2215 
2216     if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2217     {
2218         if(((mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*5))&&(mcFilmStates.filmLikePrvPixels > lowerBoundTh))
2219             ||((mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*5))&&(mcFilmStates.filmLikeNxtPixels > lowerBoundTh)))
2220         {
2221             if( isFilmCnt < 255 )
2222                 isFilmCnt++;
2223 
2224             continuousError = 0;
2225         }
2226         else
2227         {
2228             if( isFilmCnt > 0 )
2229                 isFilmCnt--;
2230 
2231             if( continuousError < 255 )
2232                 continuousError++;
2233         }
2234 
2235         if( continuousError > 4 )
2236             isFilmCnt = 0;
2237     }
2238 
2239     opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2240 
2241     isFilm = ( isFilmCnt > 10 ) ? true : false;
2242 
2243     return isFilm;
2244 }
MDrv_SC_McFilmUkoSabihS(const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd,MS_U32 _hpfHdCntReport)2245 MS_BOOL MDrv_SC_McFilmUkoSabihS( const XC_OpFrameStates opFrameStatusCur, MS_BOOL isHd, MS_U32 _hpfHdCntReport )
2246 {
2247     static XC_OpFrameStates opFrameStatusLast;
2248     static XC_McFilmStates mcFilmStates;
2249     MS_BOOL  isFilm;
2250     static MS_U8 isFilmCnt = 0;
2251     static MS_U8 continuousError = 0;
2252     MS_U8 lowerBoundTh = 0;
2253 
2254     if( isHd )
2255     {
2256         if (_hpfHdCntReport >= 50000)
2257             lowerBoundTh = 0xFF;//255
2258         else if (_hpfHdCntReport >= 32000)
2259             lowerBoundTh = 128+ 127*(_hpfHdCntReport-32000)/18000;
2260         else if (_hpfHdCntReport >= 6400)
2261             lowerBoundTh = 64+ 16*(_hpfHdCntReport-6400)/6400;
2262         else //if (_hpfHdCntReport <= 6400)
2263             lowerBoundTh = _hpfHdCntReport/100;
2264     }
2265     else
2266         lowerBoundTh = 0x80;
2267 
2268     mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2269     mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2270 
2271     MS_U32 filmLikePrvPixelsAdj = __max(mcFilmStates.filmLikePrvPixels - lowerBoundTh*2, 0);
2272     MS_U32 filmLikeNxtPixelsAdj = __max(mcFilmStates.filmLikeNxtPixels - lowerBoundTh*2, 0);
2273     //DEBUG_LC_Full6bit3(max(mcFilmStates.filmLikePrvPixels, mcFilmStates.filmLikeNxtPixels )/16);
2274     //DEBUG_LC_Full6bit4(min(mcFilmStates.filmLikePrvPixels, mcFilmStates.filmLikeNxtPixels )/16);
2275     //DEBUG_LC_Full6bit5(lowerBoundTh);
2276     if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2277     {
2278         if( (filmLikePrvPixelsAdj > 0) && (filmLikeNxtPixelsAdj > 0) &&
2279             ( (filmLikePrvPixelsAdj>filmLikeNxtPixelsAdj*5 && filmLikePrvPixelsAdj > lowerBoundTh)
2280             ||(filmLikeNxtPixelsAdj>filmLikePrvPixelsAdj*5 && filmLikeNxtPixelsAdj > lowerBoundTh) ) )
2281         {
2282             if( isFilmCnt < 63 )
2283                 isFilmCnt++;
2284 
2285             continuousError = 0;
2286         }
2287         else if(((mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*5))&&(mcFilmStates.filmLikePrvPixels > lowerBoundTh))
2288             ||((mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*5))&&(mcFilmStates.filmLikeNxtPixels > lowerBoundTh)))
2289         {
2290             if( isFilmCnt < 63 )
2291                 isFilmCnt++;
2292 
2293             continuousError = 0;
2294         }
2295         else
2296         {
2297             if( isFilmCnt > 0 )
2298                 isFilmCnt--;
2299 
2300             if( continuousError < 63 )
2301                 continuousError++;
2302         }
2303 
2304         if( continuousError > 4 )
2305             isFilmCnt = 0;
2306     }
2307 
2308     opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2309 
2310     isFilm = ( isFilmCnt > 10 ) ? true : false;
2311     //DEBUG_LC_Full6bit2(isFilmCnt);
2312 
2313     return isFilm;
2314 }
MDrv_SC_Motion4StillCnt(const MS_U16 motion4)2315 MS_U8 MDrv_SC_Motion4StillCnt( const MS_U16 motion4 )
2316 {
2317     static MS_U8 motionCnt = 0;
2318 
2319     if( motion4 == 0 )
2320     {
2321      //motionCnt = motionCnt < 12 ? motionCnt += 3 : 15);
2322 
2323      if(motionCnt < 12)
2324      {
2325       motionCnt += 3;
2326      }
2327      else
2328      {
2329       motionCnt =15;
2330      }
2331     }
2332        else
2333        {
2334      //motionCnt = motionCnt > 3 ? motionCnt -= 3 : 0);
2335      if(motionCnt > 3 )
2336      {
2337        motionCnt -= 3;
2338     }
2339     else
2340     {
2341       motionCnt =0;
2342       }
2343     }
2344 
2345     return motionCnt;
2346 }
2347 
MDrv_SC_Me1Still(const MS_U16 me13x3MwMax,const MS_U16 mv0Cost)2348 MS_U8 MDrv_SC_Me1Still( const MS_U16 me13x3MwMax, const MS_U16 mv0Cost )
2349 {
2350     static MS_U8 cnt = 0;
2351 
2352     if( ( me13x3MwMax < 30 ) && ( mv0Cost < 30) )
2353     {
2354         if( cnt < 15 )
2355             cnt++;
2356     }
2357     else
2358     {
2359         if( cnt > 0 )
2360             cnt--;
2361     }
2362 
2363     return cnt;
2364 }
2365 
MDrv_SC_McSmallMoving(const MS_U16 me13x3MwMin,const MS_U16 mv0Cost)2366 MS_U8 MDrv_SC_McSmallMoving( const MS_U16 me13x3MwMin, const MS_U16 mv0Cost )
2367 {
2368     static MS_U8 smallMovingCnt = 0;
2369 
2370     if( ( mv0Cost>>8 ) > me13x3MwMin )
2371     {
2372         if( smallMovingCnt < 255 )
2373             smallMovingCnt++;
2374     }
2375     else
2376     {
2377         if( smallMovingCnt > 0 )
2378             smallMovingCnt--;
2379     }
2380 
2381     return smallMovingCnt;
2382 }
2383 
MDrv_SC_McFilmLikeHd(const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd)2384 MS_BOOL MDrv_SC_McFilmLikeHd( const XC_OpFrameStates opFrameStatusCur, MS_BOOL isHd )
2385 {
2386     static XC_OpFrameStates opFrameStatusLast;
2387     static XC_McFilmStates mcFilmStates;
2388     MS_BOOL  isFilm = FALSE;
2389     static MS_U8 isFilmCnt = 0;
2390     static MS_U8 continuousError = 0;
2391     MS_U8 lowerBoundTh = 0;
2392 
2393     if( isHd )
2394         lowerBoundTh = 0xFF;
2395     else
2396         lowerBoundTh = 0x40;
2397 
2398     mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2399     mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2400 
2401     if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2402     {
2403         if(((mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*15))&&(mcFilmStates.filmLikePrvPixels > lowerBoundTh ))      /*Sam modify*/
2404             ||((mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*15))&&(mcFilmStates.filmLikeNxtPixels > lowerBoundTh )))  /*Sam modify*/
2405         {
2406             if( isFilmCnt < 255 )
2407                 isFilmCnt++;
2408 
2409             continuousError = 0;
2410         }
2411         else
2412         {
2413             if( isFilmCnt > 0 )
2414                 isFilmCnt--;
2415 
2416             if( continuousError < 255 )
2417                 continuousError++;
2418         }
2419 
2420         if( continuousError > 4 )
2421             isFilmCnt = 0;
2422     }
2423 
2424     opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2425 
2426     isFilm = ( isFilmCnt > 10 ) ? true : false;
2427 
2428     return isFilm;
2429 }
2430 
MDrv_SC_McFilmLikeAny(const XC_OpFrameStates opFrameStatusCur,const MS_BOOL isMcFilmLike,MS_BOOL isHd)2431 MS_BOOL MDrv_SC_McFilmLikeAny( const XC_OpFrameStates opFrameStatusCur, const MS_BOOL isMcFilmLike, MS_BOOL isHd )
2432 {
2433     static XC_OpFrameStates opFrameStatusLast;
2434     static XC_McFilmStates mcFilmStates;
2435     MS_BOOL  isFilmAny = FALSE;
2436     static MS_U8 isFilmCnt = 0;
2437     static MS_U8 continuousError = 0;
2438     static MS_U8 continuousZero = 0;
2439     static MS_U16 maxFilmLikeDiff = 0;
2440     MS_U8 lowerBoundTh = 0;
2441 
2442     if( isHd )
2443         lowerBoundTh = 0xFF;
2444     else
2445         lowerBoundTh = 0x80;
2446 
2447     mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2448     mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2449 
2450     if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2451     {
2452 
2453         if(((mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*5))&&(mcFilmStates.filmLikePrvPixels > lowerBoundTh))
2454             ||((mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*5))&&(mcFilmStates.filmLikeNxtPixels > lowerBoundTh)))
2455         {
2456             if( isFilmCnt < 255 )
2457                 isFilmCnt++;
2458 
2459             /* save maximum of diff */
2460             if( mcFilmStates.filmLikePrvPixels > mcFilmStates.filmLikeNxtPixels )
2461                 maxFilmLikeDiff = mcFilmStates.filmLikePrvPixels;
2462             else
2463                 maxFilmLikeDiff = mcFilmStates.filmLikeNxtPixels;
2464 
2465             continuousError = 0;
2466             continuousZero = 15; /* Keep to 10 * 1.5x times "O" */
2467 
2468         }
2469         else if(  ( maxFilmLikeDiff > mcFilmStates.filmLikePrvPixels*5 ) && ( maxFilmLikeDiff > mcFilmStates.filmLikeNxtPixels*5 ) && ( continuousZero > 0 ) )
2470         {
2471             if( continuousZero > 0 )
2472                 continuousZero--;
2473         }
2474         else
2475         {
2476             if( isFilmCnt > 0 )
2477                 isFilmCnt--;
2478 
2479             if( continuousError < 255 )
2480                 continuousError++;
2481 
2482             continuousZero = 0;
2483             maxFilmLikeDiff = 0;
2484         }
2485 
2486         if( continuousError > 4 )
2487         {
2488             isFilmCnt = 0;
2489         }
2490     }
2491 
2492     opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2493 
2494     isFilmAny = ( isFilmCnt > 10 ) ? true : false;
2495 
2496     return ( isFilmAny && ( !isMcFilmLike ) ); /* Film-Any(without 2:3:3:2/2:2:2:4) and Film-32/22 will not into same condition */
2497 }
2498 
MDrv_SC_McFilmLikeForSlowMotion(const MS_U32 motion,const XC_GMvStates gMv)2499 MS_BOOL MDrv_SC_McFilmLikeForSlowMotion( const MS_U32 motion, const XC_GMvStates gMv  )
2500 {
2501     MS_BOOL isMv0 = ((gMv.minMvXdir == 32)&&(gMv.minMvYdir == 8)) ? true : false;
2502     MS_BOOL maxBinFocus = ( gMv.h1XYsum > 0x40 ) ? true : false;
2503     MS_BOOL isStill = ( motion < 0x100 ) ? true : false;
2504 
2505     static XC_McFilmStates mcFilmStates;
2506     MS_BOOL  isFilm = FALSE;
2507     static MS_U8 isFilmCnt = 0;
2508     static MS_U8 continuousError = 0;
2509 
2510     mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2511     mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2512 
2513     if( (mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*1) )
2514         || (mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*1) ) )
2515     {
2516         if( isFilmCnt < 255 )
2517             isFilmCnt++;
2518 
2519         continuousError = 0;
2520     }
2521     else
2522     {
2523         if( isFilmCnt > 0 )
2524             isFilmCnt--;
2525 
2526         if( continuousError < 255 )
2527             continuousError++;
2528     }
2529 
2530     if( continuousError > 10 )
2531         isFilmCnt = 0;
2532 
2533     //isFilm = ( isFilmCnt > 10 ) ? true : false;
2534     isFilm = ( isFilmCnt > 5 ) ? true : false;
2535 
2536     return ( isFilm && isMv0 && maxBinFocus && isStill );
2537 }
2538 
MDrv_SC_HQV_JaggedTestPattern(const XC_GMvStates gMv)2539 MS_BOOL MDrv_SC_HQV_JaggedTestPattern( const XC_GMvStates gMv )
2540 {
2541     MS_BOOL isMvX0 = (gMv.minMvXdir == 32) ? true : false;
2542     MS_BOOL isOddY = ( gMv.minMvYdir % 2 ) ? true : false;
2543     MS_BOOL maxBinNonFocus = ( gMv.h1XYsum < 0x10 ) ? true : false;
2544 
2545     if( isMvX0 && isOddY && maxBinNonFocus )
2546     {
2547         return  true;
2548         //printf("MDrv_SC_HQV_JaggedTestPattern == TRUE\n\n");
2549     }
2550     else
2551     {
2552         return false;
2553         //printf("MDrv_SC_HQV_JaggedTestPattern == FALSE\n\n");
2554     }
2555     //printf("isMvX0 == %d, isOddY == %d, maxBinNonFocus == %d\n\n", isMvX0, isOddY, maxBinNonFocus);
2556 }
2557 
2558 #define SPIKE_NR_MAX 15
2559 #define SPIKE_NR_MIN 2
MDrv_SC_HQV_RandomNoise(const XC_GMvStates gMv,const MS_U16 mvNotFound,const MS_U32 _hdFilterBaseReport,const MS_U32 u32MotionValue_Sum)2560 void MDrv_SC_HQV_RandomNoise( const XC_GMvStates gMv,  const MS_U16 mvNotFound, const MS_U32 _hdFilterBaseReport,  const MS_U32 u32MotionValue_Sum )
2561 {
2562     MS_BOOL isMv0 = ((gMv.minMvXdir == 32)&&(gMv.minMvYdir == 8)) ? true : false;
2563     MS_BOOL maxBinFocus = ( gMv.h1XYsum > 0xE0 ) ? true : false;
2564     MS_BOOL isMoving = ( u32MotionValue_Sum > 0x02 ) ? true : false;
2565     MS_BOOL notSoHighFreq = ( _hdFilterBaseReport < 0x700 ) ? true : false;
2566     MS_BOOL isNotFound =  ( mvNotFound > 0x300 ) ? true : false;
2567 
2568     static MS_BOOL isHqvRandomNoise = false;
2569     static MS_U8 confirmCnt = 0;
2570     static MS_U8 intensity = 0;
2571 
2572     if( isMv0 && maxBinFocus && isMoving && notSoHighFreq && isNotFound )
2573     {
2574         if( confirmCnt < 60 )
2575             confirmCnt++;
2576     }
2577     else
2578         confirmCnt = 0;
2579 
2580     isHqvRandomNoise = ( confirmCnt > 10 ) ? true : false;
2581 
2582     if( isHqvRandomNoise )
2583     {
2584         if( intensity < SPIKE_NR_MAX )
2585             intensity++;
2586     }
2587     else
2588     {
2589         if( intensity > SPIKE_NR_MIN )
2590             intensity--;
2591     }
2592     MApi_XC_W2BYTEMSK( REG_SC_BK26_50_L,  (MS_U16)( intensity << 8 )  , 0x0F00 );
2593 
2594     if( isHqvRandomNoise ) /* Noise trun-off noise masking motion protection */
2595         MApi_XC_W2BYTEMSK( REG_SC_BK26_50_L,  0x0000/*Off*/ , 0x0008 );
2596     else
2597         MApi_XC_W2BYTEMSK( REG_SC_BK26_50_L,  0x0008/*On*/ , 0x0008 );
2598     //return isHqvRandomNoise;
2599 }
2600 
2601 #define MF_Gain            6
MDrv_SC_ZoomMoving(const XC_GMvStates gMv,const MS_U16 me1IsNonMv0,const MS_U16 me1IsNotFound,const MS_U16 featherAndMotion,const MS_U16 motion)2602 MS_BOOL MDrv_SC_ZoomMoving( const XC_GMvStates gMv , const MS_U16 me1IsNonMv0, const MS_U16 me1IsNotFound, const MS_U16 featherAndMotion, const MS_U16 motion )
2603 {
2604 
2605     //MS_BOOL isMvY0 = (gMv.minMvYdir == 8) ? true : false;
2606     MS_BOOL isMvY0 = (( abs(32 - gMv.minMvXdir) < 4 )&&(gMv.minMvYdir == 8)) ? true : false;
2607     //MS_BOOL maxBin = true;//( gMv.h1XYsum < 0x30 && gMv.h1XYsum > 0x04 ) ? true : false;
2608     MS_BOOL isMoving = ( motion > 0x200 ) ? true : false;
2609 
2610     MS_BOOL isSmallMoving = FALSE;
2611     static MS_U16 prev_featherAndMotion = 0;
2612     MS_U16 cur_featherAndMotion = 0;
2613     MS_BOOL withoutFeather = false;
2614     static MS_U8 confirm_cnt = 0;
2615 
2616     cur_featherAndMotion = featherAndMotion;
2617 
2618     //denyMoving = ( me1IsNonMv0 + me1IsNotFound );
2619 
2620     cur_featherAndMotion = (prev_featherAndMotion*3 + cur_featherAndMotion ) >> 2;
2621     prev_featherAndMotion = cur_featherAndMotion;
2622 
2623     withoutFeather = ( cur_featherAndMotion < 8 ) ? true : false;
2624 
2625     if( (( me1IsNotFound > (me1IsNonMv0*MF_Gain)) && ( me1IsNotFound > 0x30 )) && withoutFeather && isMvY0 && isMoving )
2626         isSmallMoving = true;
2627     else
2628         isSmallMoving = false;
2629 
2630     if( isSmallMoving )
2631     {
2632         if( confirm_cnt < 40 )
2633             confirm_cnt++;
2634     }
2635     else
2636     {
2637         if( confirm_cnt > 0 )
2638             confirm_cnt--;
2639     }
2640 
2641 
2642     return ( confirm_cnt > 30 );
2643 }
2644 
2645 
MDrv_SC_EODi_Armored(const XC_GMvStates gMv,const MS_U16 mv0Comfirm,const MS_U16 nonMv0Comfirm)2646 void MDrv_SC_EODi_Armored( const XC_GMvStates gMv , const MS_U16 mv0Comfirm , const MS_U16 nonMv0Comfirm )
2647 {
2648     MS_BOOL is_still = FALSE;
2649     MS_BOOL isMv0 = ( ( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 ) ) ? true : false;
2650     static MS_U8 confirm_cnt = 0;
2651     static MS_BOOL reg_eodi_pwsam_en = false;
2652 
2653     if( isMv0 && (mv0Comfirm > 0x15) && (nonMv0Comfirm < 8))
2654         is_still = true;
2655     else
2656         is_still = false;
2657 
2658     if( is_still )
2659     {
2660         confirm_cnt = confirm_cnt + 5;
2661 
2662         if(confirm_cnt > 20)
2663             confirm_cnt = 20;
2664     }
2665     else
2666     {
2667         if(confirm_cnt > 0)
2668             confirm_cnt--;
2669         else
2670             confirm_cnt = 0;
2671     }
2672 
2673     if( confirm_cnt >= 10)
2674     {
2675         reg_eodi_pwsam_en = true;
2676     }
2677     else
2678     {
2679         reg_eodi_pwsam_en = false;
2680     }
2681     MApi_XC_W2BYTEMSK( REG_SC_BK21_3D_L, (MS_U16)( reg_eodi_pwsam_en << 3) , 0x0008 );
2682 }
2683 
2684 #define S_UPPERBOUND_TH 15
2685 #define S_MATCH_TH 10
MDrv_SC_Agate_ukoSabihS(const XC_ApiStatus * stXCStatus,const XC_GMvStates gMv,const MS_U16 nonMv0Comfirm,const XC_FilmStates filmstatus,const MS_BOOL isMcFilm,MS_BOOL * isUkosabihsMotion,MS_BOOL * isUkosabihsMc,MS_BOOL * isUkosabihsForFilm,const MS_U16 mv0Comfirm,MS_BOOL * isUkosabihsMv0,const MS_BOOL isHDSrc)2686 MS_BOOL MDrv_SC_Agate_ukoSabihS( const XC_ApiStatus *stXCStatus, const XC_GMvStates gMv ,const MS_U16 nonMv0Comfirm, const XC_FilmStates filmstatus, const MS_BOOL isMcFilm,
2687                 MS_BOOL *isUkosabihsMotion, MS_BOOL *isUkosabihsMc, MS_BOOL *isUkosabihsForFilm, const MS_U16 mv0Comfirm, MS_BOOL *isUkosabihsMv0, const MS_BOOL isHDSrc )
2688 {
2689     MS_BOOL is_ukoSabihS = FALSE, is_ukoSabihSmv0 = FALSE;
2690     MS_BOOL isMv0 = (( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 )) ? true : false;
2691     MS_BOOL isFilm = ( filmstatus.film_act || isMcFilm ) ? true : false;
2692     MS_BOOL isWithoutMv0Comfirm = ( mv0Comfirm < 0x20 ) ? true : false;
2693     MS_BOOL isCVBSinput,isTVinput;
2694     MS_U8 XYDiffTH= 0,SpeedUp_TH = 0,Confirm_TH = 0;
2695     int h2XYsumTH = 0, h2XYsumTH2 = 0,nonMv0ComfirmTH = 0, mv0ComfirmTH=0;
2696 
2697     static MS_U8 confirm_cnt = 0;
2698     static MS_U8 confirm_cnt_mv0 = 0;
2699     static MS_U8 even_cnt = 0;
2700 
2701     static MS_U8 confirm_cnt_film = 0;
2702 
2703     //MS_BOOL is_ukoSabihS_isHBurst = ( isHBurstMoving && ( gMv.h2XYdiff > 0x45 )) ? true : false;
2704 
2705 
2706     isCVBSinput = ((stXCStatus->bInterlace) && (stXCStatus->enInputSourceType >= INPUT_SOURCE_CVBS)&& (stXCStatus->enInputSourceType <= INPUT_SOURCE_CVBS_MAX));
2707     isTVinput = ((stXCStatus->bInterlace) && (stXCStatus->enInputSourceType == INPUT_SOURCE_TV));
2708 
2709     if(isHDSrc)
2710     {
2711         SpeedUp_TH = 200;
2712     }
2713     else
2714     {
2715         SpeedUp_TH = 40;
2716     }
2717 
2718     if(isCVBSinput || isTVinput)
2719     {
2720         XYDiffTH = 0x01;
2721     Confirm_TH =  0x80;
2722     }
2723     else
2724     {
2725         XYDiffTH = 0x06;
2726     Confirm_TH =0x40 ;
2727     }
2728 
2729     SpeedUp_TH = 200;
2730     nonMv0ComfirmTH = 0x40;
2731     mv0ComfirmTH = 0x200;
2732     h2XYsumTH = 0x16;
2733     h2XYsumTH2 = 0x32;
2734 
2735     nonMv0ComfirmTH = (nonMv0ComfirmTH * normalize_factor) / 256;
2736     mv0ComfirmTH = (mv0ComfirmTH * normalize_factor) / 256;
2737     h2XYsumTH = (h2XYsumTH * normalize_factor) / 256;
2738     h2XYsumTH2 = (h2XYsumTH2 * normalize_factor) / 256;
2739     SpeedUp_TH = (SpeedUp_TH * normalize_factor) / 256;
2740     XYDiffTH = (XYDiffTH *normalize_factor) / 256;
2741     Confirm_TH = (Confirm_TH *normalize_factor) / 256;
2742 
2743 
2744     if(isCVBSinput||isTVinput)
2745     {
2746         is_ukoSabihS = false;
2747     }
2748     else if((gMv.h2XYsum > h2XYsumTH)&& (gMv.h2XYdiff <= XYDiffTH)&& (!isMv0) && (nonMv0Comfirm> Confirm_TH ) && isWithoutMv0Comfirm && (isHDSrc) )
2749     {
2750         is_ukoSabihS = true;
2751     }
2752     else if((gMv.h2XYsum > h2XYsumTH2)&& (gMv.h2XYdiff <= XYDiffTH)&& (!isMv0) && (nonMv0Comfirm> Confirm_TH ) && isWithoutMv0Comfirm )
2753    {
2754         is_ukoSabihS = true;
2755     }
2756     else
2757     {
2758         is_ukoSabihS = false;
2759     }
2760 
2761     if( (!gMv.yMvIsMovingOdd) )
2762     {
2763         even_cnt++;
2764 
2765         if(even_cnt > S_UPPERBOUND_TH)
2766             even_cnt = S_UPPERBOUND_TH;
2767     }
2768     else
2769     {
2770         even_cnt = 0;
2771     }
2772 
2773     if( is_ukoSabihS )
2774     {
2775         if(gMv.h2XYsum > SpeedUp_TH )    /*for Speed up*/
2776         {
2777             confirm_cnt = confirm_cnt + 2;
2778         }
2779         else
2780         {
2781             confirm_cnt++;
2782         }
2783 
2784         if(confirm_cnt > S_UPPERBOUND_TH)
2785             confirm_cnt = S_UPPERBOUND_TH;
2786     }
2787     else
2788     {
2789         if(gMv.h2XYsum > SpeedUp_TH )    /*for Speed up*/
2790         {
2791             if( confirm_cnt > 0 )
2792                 confirm_cnt--;
2793         }
2794         else
2795             confirm_cnt = 0;
2796     }
2797 
2798     if (isMcFilm)
2799     {
2800         confirm_cnt = 0;
2801     }
2802 
2803     if(( confirm_cnt >= S_MATCH_TH)&&( even_cnt >= S_MATCH_TH) )
2804     {
2805         *isUkosabihsMc = true;
2806         //MApi_XC_W2BYTEMSK( REG_SC_BK22_7A_L, 0x1000 , 0x1000 );
2807     }
2808     else
2809     {
2810         *isUkosabihsMc = false;
2811         //MApi_XC_W2BYTEMSK( REG_SC_BK22_7A_L, 0x0000 , 0x1000 );
2812     }
2813 
2814     if( confirm_cnt >= S_MATCH_TH)
2815     {
2816         *isUkosabihsMotion = true;
2817     }
2818     else
2819     {
2820         *isUkosabihsMotion = false;
2821     }
2822 
2823     if( confirm_cnt >= S_MATCH_TH)
2824     {
2825         *isUkosabihsForFilm = true;
2826     }
2827     else
2828     {
2829         *isUkosabihsForFilm = false;
2830     }
2831     if( *isUkosabihsForFilm )
2832     {
2833         confirm_cnt_film++;
2834 
2835         if(confirm_cnt_film > S_UPPERBOUND_TH)
2836             confirm_cnt_film = S_UPPERBOUND_TH;
2837     }
2838     else
2839     {
2840         confirm_cnt_film = 0;
2841     }
2842     if( confirm_cnt_film >= S_MATCH_TH)
2843     {
2844         MApi_XC_W2BYTEMSK( REG_SC_BK30_09_L, 0x0001 , 0x0001 );
2845         //MApi_XC_W2BYTEMSK( REG_SC_BK30_41_L, 0x7000 , 0x7000 );
2846     }
2847     else
2848     {
2849         MApi_XC_W2BYTEMSK( REG_SC_BK30_09_L, 0x0000 , 0x0001 );
2850         //MApi_XC_W2BYTEMSK( REG_SC_BK30_41_L, 0x0000 , 0x7000 );
2851     }
2852 
2853     if( isFilm )
2854     {
2855         //confirm_cnt = 0;
2856         *isUkosabihsMc = false;
2857         *isUkosabihsMotion = false;
2858         even_cnt = 0;
2859     }
2860     //==============================================================================================================
2861 
2862     if((gMv.h2XYsum > 0x3)&& (gMv.h2XYdiff <= 1) && (isMv0) && (mv0Comfirm>mv0ComfirmTH))
2863     {
2864         is_ukoSabihSmv0 = true;
2865     }
2866     else
2867     {
2868         is_ukoSabihSmv0 = false;
2869     }
2870 
2871     if( is_ukoSabihSmv0 )
2872     {
2873         confirm_cnt_mv0++;
2874 
2875         if(confirm_cnt_mv0 > S_UPPERBOUND_TH )
2876             confirm_cnt_mv0 = S_UPPERBOUND_TH;
2877     }
2878     else
2879     {
2880         confirm_cnt_mv0 = 0;
2881     }
2882 
2883     if( confirm_cnt_mv0 >= S_MATCH_TH )
2884     {
2885         *isUkosabihsMv0 = true;
2886     }
2887     else
2888     {
2889         *isUkosabihsMv0 = false;
2890     }
2891     //==============================================================================================================
2892 
2893     return ( *isUkosabihsMc || *isUkosabihsMotion );
2894 }
2895 
MDrv_SC_sweep_ukoSabihS(const XC_GMvStates gMv,const MS_U16 nonMv0Comfirm,const MS_U16 mv0Comfirm,const XC_FilmStates filmstatus,const MS_BOOL isMcFilm,const MS_U32 uComplex,MS_BOOL * isUkosabihsMotionSweep)2896 MS_BOOL MDrv_SC_sweep_ukoSabihS( const XC_GMvStates gMv,
2897                 const MS_U16 nonMv0Comfirm, const MS_U16 mv0Comfirm,
2898                 const XC_FilmStates filmstatus, const MS_BOOL isMcFilm,
2899                 const MS_U32 uComplex,
2900                 MS_BOOL *isUkosabihsMotionSweep )
2901 {
2902     MS_BOOL is_ukoSabihS_sweep = FALSE;
2903     MS_BOOL isMv0 = (( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 )) ? true : false;
2904     MS_BOOL isFilm = ( filmstatus.film22 || filmstatus.film22 || isMcFilm ) ? true : false;
2905     MS_BOOL isUkosabihsMcSweep = FALSE;
2906 
2907     static MS_U8 confirm_cnt = 0;
2908     static MS_U8 even_cnt = 0;
2909 
2910     if((gMv.h2XYsum > 0x9)&& (gMv.h2XYdiff <= 5) && (!isMv0) && (nonMv0Comfirm>0x300) && (uComplex>0x7300) && (mv0Comfirm <= 10) )
2911         is_ukoSabihS_sweep = true;
2912     else
2913         is_ukoSabihS_sweep = false;
2914 
2915     if( (!gMv.yMvIsMovingOdd) )
2916     {
2917         even_cnt++;
2918 
2919         if(even_cnt > 10)
2920             even_cnt = 10;
2921     }
2922     else
2923     {
2924         even_cnt = 0;
2925     }
2926 
2927     if( is_ukoSabihS_sweep )
2928     {
2929         confirm_cnt++;
2930 
2931         if(confirm_cnt > 10)
2932             confirm_cnt = 10;
2933     }
2934     else
2935     {
2936         confirm_cnt = 0;
2937     }
2938 
2939     if( isFilm )
2940     {
2941         confirm_cnt = 0;
2942         even_cnt = 0;
2943     }
2944 
2945     if(( confirm_cnt == 10)&&( even_cnt == 10) )
2946         isUkosabihsMcSweep = true;
2947     else
2948         isUkosabihsMcSweep = false;
2949 
2950     if( confirm_cnt == 10)
2951         *isUkosabihsMotionSweep = true;
2952     else
2953         *isUkosabihsMotionSweep = false;
2954 
2955     return isUkosabihsMcSweep;
2956 }
2957 
MDrv_SC_Agate_GMV(const XC_Me1HisStates H1,const XC_Me1HisStates H2)2958 XC_GMvStates MDrv_SC_Agate_GMV( const XC_Me1HisStates H1,  const XC_Me1HisStates H2 )
2959 {
2960     XC_GMvStates gMv;
2961     memset(&gMv, 0x0, sizeof(XC_GMvStates));
2962 //  MS_BOOL yIsMovingOdd;
2963 //  MS_BOOL xIsMovingOdd;
2964 //  MS_BOOL isMovingOdd;
2965 
2966     const MS_U8 const_GMV_X_LUT[9][8] =
2967     {
2968         {0, 1,  2,  3,  4,  5,  6,  7 },
2969         {8, 9,  10, 11, 12, 13, 14, 15},
2970         {16,    17, 18, 19, 20, 21, 22, 23},
2971         {24,    25, 26, 27, 28, 29, 30, 31},
2972         {33,    34, 35, 36, 37, 38, 39, 40},
2973         {41,    42, 43, 44, 45, 46, 47, 48},
2974         {49,    50, 51, 52, 53, 54, 55, 56},
2975         {57,    58, 59, 60, 61, 62, 63, 64},
2976         {32,    32, 32, 32, 32, 32, 32, 32}
2977     };
2978 
2979     const MS_U8 const_GMV_Y_LUT[9][2] =
2980     {
2981         {0,     1},
2982         {2,     3},
2983         {4,     5},
2984         {6,     7},
2985         {9,     10},
2986         {11,    12},
2987         {13,    14},
2988         {15,    16},
2989         {8,     8}
2990     };
2991 
2992     MS_U8 x_h1_idx = H1.minMvXdir;
2993     MS_U8 x_h2_idx = ( H1.minMvXdir == 8 ) ? 0 : H2.minMvXdir;
2994     MS_U8 y_h1_idx = H1.minMvYdir;
2995     MS_U8 y_h2_idx = ( H1.minMvYdir == 8 ) ? 0 : H2.minMvYdir;
2996 
2997     MS_U8 gm_x = const_GMV_X_LUT[x_h1_idx][x_h2_idx];
2998     MS_U8 gm_y = const_GMV_Y_LUT[y_h1_idx][y_h2_idx];
2999 
3000 //  xIsMovingOdd = ( gm_x % 2 ) ? true : false;
3001 //  yIsMovingOdd = ( gm_y % 2 ) ? true : false;
3002 //  isMovingOdd = ( xIsMovingOdd | yIsMovingOdd );
3003 
3004     gMv.minMvXdir   = gm_x;
3005     //gMv.minMvXbin = H1.minMvXBin;
3006     gMv.h1XYdiff    = abs(H1.minMvXBin-H1.minMvYBin);
3007     gMv.h1XYsum     = H1.minMvXBin+H1.minMvYBin;
3008     gMv.minMvYdir   = gm_y;
3009     //gMv.minMvYbin = H1.minMvYBin;
3010     gMv.h2XYdiff    = abs(H2.minMvXBin-H2.minMvYBin);
3011     gMv.h2XYsum     = H2.minMvXBin+H2.minMvYBin;
3012     gMv.yMvIsMovingOdd = ( gm_y % 2 ) ? true : false;
3013 #if 1
3014     //MApi_XC_W2BYTEMSK(REG_SC_BK30_08_L,  (gm_x<<8), 0xFF00);
3015     //MApi_XC_W2BYTEMSK(REG_SC_BK30_08_L,  gm_y, 0x00FF);
3016 
3017     //DEBUG_LC_Full6bit(gm_x);
3018     //DEBUG_LC_Full6bit2(gm_y);
3019 
3020     //MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L,  (gMv.h2XYdiff), 0xFFFF);
3021     //MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L,  (gMv.h1XYdiff<<8), 0xFF00);
3022     //MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L,  gMv.h2XYdiff, 0x00FF);
3023     //MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L,  (gMv.h2XYsum), 0xFFFF);
3024     //MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L,  (((gMv.h1XYsum)>>2)<<8), 0xFF00);
3025     //MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L,  ((gMv.h2XYsum)>>2), 0x00FF);
3026 #endif
3027 
3028     return gMv;
3029 }
3030 
MDrv_SC_Agate_Hierarchy2(const XC_Me1HisStates H1)3031 XC_Me1HisStates MDrv_SC_Agate_Hierarchy2( const XC_Me1HisStates H1 )
3032 {
3033     MS_U8 me1_X_histogram[8];
3034     MS_U8 me1_Y_histogram[2];
3035     MS_U8 minXdir = 0, minXdirBin = 0;
3036     MS_U8 minYdir = 0, minYdirBin = 0;
3037     XC_Me1HisStates H2States;
3038     int dir = 0;
3039 
3040     MApi_XC_W2BYTEMSK( REG_SC_BK17_5E_L,  H1.minMvXdir , 0x0007 ); /*reg_gmv_h_hier2_sel*/
3041     MApi_XC_W2BYTEMSK( REG_SC_BK17_5E_L,  H1.minMvYdir<<4 , 0x0070 ); /*reg_gmv_h_hier2_sel*/
3042 
3043     me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_64_L, 0x00FF);
3044     me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_64_L, 0xFF00) >> 8;
3045     me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_65_L, 0x00FF);
3046     me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_65_L, 0xFF00) >> 8;
3047     me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_66_L, 0x00FF);
3048     me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_66_L, 0xFF00) >> 8;
3049     me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_67_L, 0x00FF);
3050     me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_67_L, 0xFF00) >> 8;
3051 
3052     me1_Y_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0x00FF);
3053     me1_Y_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0xFF00) >> 8;
3054 
3055    /*FOR Vertical move 8 pixels*/
3056    if((H1.minMvYdir == 7)&&(abs (H1.minMvYBin -(me1_Y_histogram[0] +me1_Y_histogram[1] ))>3))//MV = 7 or 8
3057     {
3058         me1_Y_histogram[1] = (MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0xFF00) >> 8) - MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0x00FF); // MV+8 =  (H1+7)  - (MV+7)
3059     }
3060    else if(H1.minMvYdir == 6 )//MV = 5or 6
3061     {
3062         me1_Y_histogram[0]= MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0x00FF)  - (MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0xFF00)>>8);  // MV+5= (H1+6) - (MV+6)
3063     }
3064 
3065     //find max histogram
3066     minXdir = 0;
3067     minXdirBin = 0;
3068     for (dir=0; dir<=7 ; dir++)
3069     {
3070         if( minXdirBin < me1_X_histogram[dir] )
3071         {
3072             minXdir = dir;
3073             minXdirBin = me1_X_histogram[dir];
3074         }
3075     }
3076 
3077     minYdir = 0;
3078     minYdirBin = 0;
3079     for (dir=0; dir<=1 ; dir++)
3080     {
3081         if( minYdirBin < me1_Y_histogram[dir] )
3082         {
3083             minYdir = dir;
3084             minYdirBin = me1_Y_histogram[dir];
3085         }
3086     }
3087 
3088     if( H1.minMvXdir == 8 ) //MV0
3089     {
3090         H2States.minMvXdir = H1.minMvXdir;
3091         H2States.minMvXBin = H1.minMvXBin;
3092     }
3093     else
3094     {
3095         H2States.minMvXdir = minXdir;
3096         H2States.minMvXBin = minXdirBin;
3097     }
3098 
3099     if( H1.minMvYdir == 8 )
3100     {
3101         H2States.minMvYdir = H1.minMvYdir;
3102         H2States.minMvYBin = H1.minMvYBin;
3103     }
3104     else
3105     {
3106         H2States.minMvYdir = minYdir;
3107         H2States.minMvYBin = minYdirBin;
3108     }
3109 
3110     return H2States;
3111 }
3112 
MDrv_SC_Agate_Hierarchy1(void)3113 XC_Me1HisStates MDrv_SC_Agate_Hierarchy1( void )
3114 {
3115     MS_U8 me1_X_histogram[9];
3116     MS_U8 me1_Y_histogram[9];
3117     MS_U8 minXdir = 0, minXdirBin = 0;
3118     MS_U8 minYdir = 0, minYdirBin = 0;
3119     XC_Me1HisStates H1States;
3120     int dir = 0;
3121 
3122     me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF);
3123     me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8;
3124     me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF);
3125     me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8;
3126     me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF);
3127     me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8;
3128     me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF);
3129     me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8;
3130     me1_X_histogram[8] = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF);
3131 
3132     me1_Y_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_68_L, 0x00FF);
3133     me1_Y_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_68_L, 0xFF00) >> 8;
3134     me1_Y_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_69_L, 0x00FF);
3135     me1_Y_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_69_L, 0xFF00) >> 8;
3136     me1_Y_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6A_L, 0x00FF);
3137     me1_Y_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6A_L, 0xFF00) >> 8;
3138     me1_Y_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0x00FF);
3139     me1_Y_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0xFF00) >> 8;
3140     me1_Y_histogram[8] = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0xFF00) >> 8;
3141 
3142     minXdir = 0;
3143     minXdirBin = 0;
3144     for ( dir = 0; dir <= 8 ; dir ++ )
3145     {
3146         if( minXdirBin < me1_X_histogram[dir] )
3147         {
3148             minXdir = dir;
3149             minXdirBin = me1_X_histogram[dir];
3150         }
3151     }
3152 
3153     minYdir = 0;
3154     minYdirBin = 0;
3155     for ( dir = 0; dir <= 8 ; dir ++ )
3156     {
3157         if( minYdirBin < me1_Y_histogram[dir] )
3158         {
3159             minYdir = dir;
3160             minYdirBin = me1_Y_histogram[dir];
3161         }
3162     }
3163     H1States.minMvXdir = minXdir;
3164     H1States.minMvXBin = minXdirBin;
3165     H1States.minMvYdir = minYdir;
3166     H1States.minMvYBin = minYdirBin;
3167 
3168     return H1States;
3169 }
3170 
3171 /******************************************************************************/
3172 /// Einstein Function
3173 ///
3174 /******************************************************************************/
MDrv_RegC_pdnr_me1_smv_nr_strength(const MS_U8 smvw,const MS_U8 isSourceChange,const MS_BOOL sceneChange)3175 void MDrv_RegC_pdnr_me1_smv_nr_strength( const MS_U8 smvw, const MS_U8 isSourceChange, const MS_BOOL sceneChange )
3176 {
3177     static MS_U8 qMapDefault = 3;
3178     MS_U8 setValue;
3179     static MS_BOOL allowW = false;
3180     MS_U8 smallMovingW;
3181 
3182     smallMovingW = 15 - (smvw >> 4);
3183 
3184     if( (isSourceChange == 1) && (allowW == false) )
3185     {
3186         qMapDefault = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK2A_66_L, 0x0F00) >> 8 );
3187         allowW = true;
3188     }
3189 
3190     if( sceneChange )
3191         setValue = 0x0; /* motion gain is Max when scene change happen */
3192     else if( smallMovingW > qMapDefault )
3193         setValue = qMapDefault;
3194     else
3195         setValue = smallMovingW;
3196 
3197     if( allowW )
3198         MApi_XC_W2BYTEMSK(REG_SC_BK2A_66_L, setValue << 8 , 0x0F00);
3199 }
3200 
MDrv_Adaptive_Coring(const MS_U8 noiseLevel,const MS_U8 isSourceChange,const MS_BOOL sceneChange)3201 void MDrv_Adaptive_Coring( const MS_U8 noiseLevel, const MS_U8 isSourceChange, const MS_BOOL sceneChange )
3202 {
3203     static MS_U8 qMapPostCoringTh1;
3204     static MS_U8 qMapPostCoringTh2;
3205     static MS_U8 noiseL1Cnt = 0, noiseL2Cnt = 0;
3206 
3207     if( isSourceChange )
3208     {
3209         qMapPostCoringTh1 = (MS_U8)MApi_XC_R2BYTEMSK(REG_SC_BK19_13_L, 0x000F );
3210         qMapPostCoringTh2 = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK19_13_L, 0x00F0 ) >> 4 );
3211 
3212         noiseL1Cnt = noiseL2Cnt = 0;
3213     }
3214     else if( sceneChange )
3215     {
3216         MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, qMapPostCoringTh1 , 0x000F );
3217         MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, qMapPostCoringTh2 << 4 , 0x00F0 );
3218 
3219         noiseL1Cnt = noiseL2Cnt = 0;
3220     }
3221     else
3222     {
3223         if( noiseLevel > 0x40 )
3224         {
3225             if( noiseL1Cnt < 16 )
3226                 ++noiseL1Cnt;
3227         }
3228         else if( noiseL1Cnt > 0 )
3229             --noiseL1Cnt;
3230 
3231         if( noiseLevel > 0x80 )
3232         {
3233             if( noiseL2Cnt < 16 )
3234                 ++noiseL2Cnt;
3235         }
3236         else if( noiseL2Cnt > 0 )
3237             --noiseL2Cnt;
3238 
3239         MS_U8 postCoringTh1 = ( 0x9 * noiseL2Cnt + 0xE * (16 - noiseL2Cnt) + 8 ) >> 4;
3240         MS_U8 postCoringTh2 = ( 0xB * noiseL2Cnt + 0xF * (16 - noiseL2Cnt) + 8 ) >> 4;
3241 
3242         postCoringTh1 = ( postCoringTh1 * noiseL1Cnt + qMapPostCoringTh1 * (16 - noiseL1Cnt) + 8 ) >> 4;
3243         postCoringTh2 = ( postCoringTh2 * noiseL1Cnt + qMapPostCoringTh2 * (16 - noiseL1Cnt) + 8 ) >> 4;
3244 
3245         MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, postCoringTh1 , 0x000F );
3246         MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, postCoringTh2 << 4 , 0x00F0 );
3247     }
3248 }
3249 
3250 /******************************************************************************/
3251 /// Agate Function
3252 ///
3253 /******************************************************************************/
3254 
3255 
MDrv_SC_Edison_D3D_driver(void)3256 void MDrv_SC_Edison_D3D_driver( void )
3257 {
3258     MS_U16 LT_Lev[32];
3259     MS_U16 RB_Lev[32];
3260     MS_U8 idx = 0;
3261 
3262     static MS_U32 DIF_LR_sum = 0xFFFF;
3263     static MS_U32 DIF_TB_sum = 0xFFFF;
3264 //  static MS_U8 D3D_mode=0; //0: video, 1: LR mode, 2:TB mode
3265     static MS_U8 D3D_ready=0;
3266     static MS_U8 LRTB_Cnt=0;
3267     static MS_U32 DIF_LR_sum_prv=0xFFFF;
3268     static MS_U32 DIF_TB_sum_prv=0xFFFF;
3269     static MS_BOOL begin_d3d = false;
3270 //  static MS_U16 CB_status = 0;
3271 
3272     //first time
3273     if( (LRTB_Cnt == 0) && (begin_d3d == false))
3274     {
3275         MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x0001, 0x0001);
3276         begin_d3d = true;
3277     }
3278 
3279     if( D3D_ready )
3280     {
3281         LT_Lev[0]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_10_L, 0xFFFF);
3282         LT_Lev[1]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_11_L, 0xFFFF);
3283         LT_Lev[2]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_12_L, 0xFFFF);
3284         LT_Lev[3]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_13_L, 0xFFFF);
3285         LT_Lev[4]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_14_L, 0xFFFF);
3286         LT_Lev[5]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_15_L, 0xFFFF);
3287         LT_Lev[6]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_16_L, 0xFFFF);
3288         LT_Lev[7]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_17_L, 0xFFFF);
3289         LT_Lev[8]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_18_L, 0xFFFF);
3290         LT_Lev[9]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_19_L, 0xFFFF);
3291         LT_Lev[10] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1A_L, 0xFFFF);
3292         LT_Lev[11] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1B_L, 0xFFFF);
3293         LT_Lev[12] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1C_L, 0xFFFF);
3294         LT_Lev[13] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1D_L, 0xFFFF);
3295         LT_Lev[14] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1E_L, 0xFFFF);
3296         LT_Lev[15] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1F_L, 0xFFFF);
3297         LT_Lev[16] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_20_L, 0xFFFF);
3298         LT_Lev[17] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_21_L, 0xFFFF);
3299         LT_Lev[18] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_22_L, 0xFFFF);
3300         LT_Lev[19] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_23_L, 0xFFFF);
3301         LT_Lev[20] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_24_L, 0xFFFF);
3302         LT_Lev[21] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_25_L, 0xFFFF);
3303         LT_Lev[22] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_26_L, 0xFFFF);
3304         LT_Lev[23] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_27_L, 0xFFFF);
3305         LT_Lev[24] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_28_L, 0xFFFF);
3306         LT_Lev[25] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_29_L, 0xFFFF);
3307         LT_Lev[26] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2A_L, 0xFFFF);
3308         LT_Lev[27] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2B_L, 0xFFFF);
3309         LT_Lev[28] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2C_L, 0xFFFF);
3310         LT_Lev[29] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2D_L, 0xFFFF);
3311         LT_Lev[30] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2E_L, 0xFFFF);
3312         LT_Lev[31] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2F_L, 0xFFFF);
3313 
3314         RB_Lev[0]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_30_L, 0xFFFF);
3315         RB_Lev[1]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_31_L, 0xFFFF);
3316         RB_Lev[2]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_32_L, 0xFFFF);
3317         RB_Lev[3]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_33_L, 0xFFFF);
3318         RB_Lev[4]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_34_L, 0xFFFF);
3319         RB_Lev[5]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_35_L, 0xFFFF);
3320         RB_Lev[6]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_36_L, 0xFFFF);
3321         RB_Lev[7]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_37_L, 0xFFFF);
3322         RB_Lev[8]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_38_L, 0xFFFF);
3323         RB_Lev[9]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_39_L, 0xFFFF);
3324         RB_Lev[10] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3A_L, 0xFFFF);
3325         RB_Lev[11] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3B_L, 0xFFFF);
3326         RB_Lev[12] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3C_L, 0xFFFF);
3327         RB_Lev[13] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3D_L, 0xFFFF);
3328         RB_Lev[14] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3E_L, 0xFFFF);
3329         RB_Lev[15] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3F_L, 0xFFFF);
3330         RB_Lev[16] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_40_L, 0xFFFF);
3331         RB_Lev[17] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_41_L, 0xFFFF);
3332         RB_Lev[18] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_42_L, 0xFFFF);
3333         RB_Lev[19] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_43_L, 0xFFFF);
3334         RB_Lev[20] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_44_L, 0xFFFF);
3335         RB_Lev[21] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_45_L, 0xFFFF);
3336         RB_Lev[22] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_46_L, 0xFFFF);
3337         RB_Lev[23] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_47_L, 0xFFFF);
3338         RB_Lev[24] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_48_L, 0xFFFF);
3339         RB_Lev[25] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_49_L, 0xFFFF);
3340         RB_Lev[26] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4A_L, 0xFFFF);
3341         RB_Lev[27] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4B_L, 0xFFFF);
3342         RB_Lev[28] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4C_L, 0xFFFF);
3343         RB_Lev[29] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4D_L, 0xFFFF);
3344         RB_Lev[30] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4E_L, 0xFFFF);
3345         RB_Lev[31] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4F_L, 0xFFFF);
3346 
3347 
3348         if( 0 == (LRTB_Cnt % 2) )
3349         {
3350             DIF_LR_sum = 0;
3351             for( idx = 0; idx < 32; idx++ )
3352             {
3353                 DIF_LR_sum = DIF_LR_sum + abs( LT_Lev[idx] - RB_Lev[idx] );
3354             }
3355 
3356             //IIR filter
3357             DIF_LR_sum = (DIF_LR_sum_prv*3 + DIF_LR_sum)/4;
3358             DIF_LR_sum_prv = DIF_LR_sum;
3359         }
3360         else
3361         {
3362             DIF_TB_sum = 0;
3363             for( idx = 0; idx < 32; idx++ )
3364             {
3365                 DIF_TB_sum = DIF_TB_sum + abs( LT_Lev[idx] - RB_Lev[idx] );
3366             }
3367 
3368             //IIR filter
3369             DIF_TB_sum = (DIF_TB_sum_prv*3 + DIF_TB_sum)/4;
3370             DIF_TB_sum_prv = DIF_TB_sum;
3371         }
3372 
3373         //checkboard status
3374 //      CB_status = MApi_XC_R2BYTEMSK(REG_SC_BK1D_53_L, 0xFFFF);
3375 #if 0
3376         if((DIF_TB_sum > (4*DIF_LR_sum)) && (DIF_LR_sum < 1000))
3377             D3D_mode = 1; //LR mode
3378         else if((DIF_LR_sum > (4*DIF_TB_sum)) && (DIF_TB_sum < 1000))
3379             D3D_mode = 2; //TB mode
3380         else if( CB_status > 1000 )
3381             D3D_mode = 3; //Checkboard mode
3382         else if( (DIF_LR_sum < 400) && (DIF_TB_sum < 400) )
3383             D3D_mode = 4; //repeat previous frame
3384         else
3385             D3D_mode = 0; //video
3386 #endif
3387         //for next D3D frame trigger
3388         if( 0 == (LRTB_Cnt % 2) )
3389             MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x02, 0x02); //for next frame: top-bottom
3390         else
3391             MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x00, 0x02); //for next frame: side-by-side
3392 
3393         MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x0001, 0x0001);
3394     }
3395 
3396     //for next start
3397     if( LRTB_Cnt >= 1 )
3398     {
3399         LRTB_Cnt=0;
3400     }
3401     else
3402     {
3403         LRTB_Cnt++;
3404     }
3405 
3406     //wait ready signal
3407     D3D_ready = MApi_XC_R2BYTEMSK(REG_SC_BK1D_50_L, 0x0080)>>7;
3408 }
3409 
MDrv_SC_ResetSourceChange(const MS_BOOL sourceChangeForME)3410 void MDrv_SC_ResetSourceChange(const MS_BOOL sourceChangeForME ) //review MERESET
3411 {
3412 
3413     static MS_U8 u8CurFrameCnt1 = 0;
3414     static MS_U8 u8CurFrameCnt2 = 0;
3415     static MS_BOOL meReset = false;
3416     static MS_BOOL isReset = false;
3417 
3418     if(sourceChangeForME == 1 )
3419     {
3420         if(u8CurFrameCnt1 != 60 )
3421             u8CurFrameCnt1++;
3422     }
3423     else
3424         u8CurFrameCnt1 = 0;
3425 
3426     if( meReset )
3427     {
3428         if(u8CurFrameCnt2 != 60 )
3429             u8CurFrameCnt2++;
3430     }
3431     else
3432         u8CurFrameCnt2 = 0;
3433 
3434     if( (u8CurFrameCnt1 == 30) && (!meReset) )
3435     {
3436         meReset = true;
3437     }
3438 
3439     if( (u8CurFrameCnt2 == 5) && meReset )
3440     {
3441         meReset = false;
3442         isReset = true;
3443     }
3444     else
3445     {
3446         isReset = false;
3447     }
3448 
3449     if(isReset)
3450     {
3451         MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L,  0x0000, 0x0002); /* Reset Init Bit */
3452         u8CurFrameCnt1 = 0;
3453     }
3454 }
MDrv_SC_Agate_ME_Reset(const MS_U32 u32MotionValue2,const MS_BOOL isSceneChangeMc,const MS_BOOL isSceneChangeY,const MS_BOOL isSourceChange)3455 MS_BOOL MDrv_SC_Agate_ME_Reset( const MS_U32 u32MotionValue2, const MS_BOOL isSceneChangeMc, const MS_BOOL isSceneChangeY, const MS_BOOL isSourceChange  )//review MERESET
3456 {
3457     static MS_U8 u8CurFrameCnt1 = 0;
3458     static MS_U8 u8CurFrameCnt2 = 0;
3459     static MS_BOOL meReset = false;
3460     MS_BOOL meResetFlag = false;
3461 
3462     if (u32MotionValue2 == 0 )
3463     {
3464         if(u8CurFrameCnt1 != 60 )
3465             u8CurFrameCnt1++;
3466     }
3467     else
3468     {
3469         u8CurFrameCnt1 = 0;
3470     }
3471 
3472     if ( meReset )
3473     {
3474         if(u8CurFrameCnt2 != 60 )
3475             u8CurFrameCnt2++;
3476     }
3477     else
3478     {
3479         u8CurFrameCnt2 = 0;
3480     }
3481 
3482     if( (u8CurFrameCnt1 == 30) && (!meReset) )
3483     {
3484         meReset = true;
3485     }
3486 
3487     if( (u8CurFrameCnt2 == 5) && meReset )
3488     {
3489         meReset = false;
3490         meResetFlag = true;
3491     }
3492     else
3493     {
3494         meResetFlag = false;
3495     }
3496 
3497     if( meReset || isSceneChangeMc || isSceneChangeY || isSourceChange)
3498     {
3499         MApi_XC_W2BYTEMSK(REG_SC_BK17_79_L,  0x0011, 0x0011);
3500     }
3501     else
3502     {
3503         MApi_XC_W2BYTEMSK(REG_SC_BK17_79_L,  0x0000, 0x0011);
3504     }
3505     return meResetFlag;
3506 }
3507 
3508 /******************************************************************************/
3509 ///Read ME value (F2 ME status)
3510 ///@return MS_U16: Motion value
3511 /******************************************************************************/
MDrv_SC_read_avgMcnrMovingWeightMin(void)3512 MS_U16 MDrv_SC_read_avgMcnrMovingWeightMin(void)
3513 {
3514     MS_U16 cur;
3515     static MS_U16 prv = 0;
3516 
3517     cur = MApi_XC_R2BYTE(REG_SC_BK09_68_L);
3518     cur = ((prv*3 )+ cur ) >> 2;
3519     prv = cur;
3520 
3521     return prv;
3522 }
3523 
MDrv_SC_read_avgMcnrMovingWeight(void)3524 MS_U16 MDrv_SC_read_avgMcnrMovingWeight(void)
3525 {
3526     MS_U16 cur;
3527     static MS_U16 prv = 0;
3528 
3529     cur = MApi_XC_R2BYTE(REG_SC_BK09_6A_L);
3530     cur = ((prv*3 )+ cur ) >> 2;
3531     prv = cur;
3532 
3533     return prv;
3534 }
3535 
MDrv_SC_read_avgMcnrMovingWeightMax(void)3536 MS_U16 MDrv_SC_read_avgMcnrMovingWeightMax(void)
3537 {
3538     MS_U16 cur;
3539     static MS_U16 prv = 0;
3540 
3541     cur = MApi_XC_R2BYTE(REG_SC_BK09_6B_L);
3542     cur = ((prv*3 )+ cur ) >> 2;
3543     prv = cur;
3544 
3545     return prv;
3546 }
3547 
MDrv_SC_read_avgMv0MovingWeight(void)3548 MS_U16 MDrv_SC_read_avgMv0MovingWeight(void)
3549 {
3550     MS_U16 cur;
3551     static MS_U16 prv = 0;
3552 
3553     cur = MApi_XC_R2BYTE(REG_SC_BK09_69_L);
3554     cur = ((prv*3 )+ cur ) >> 2;
3555     prv = cur;
3556 
3557     return prv;
3558 }
3559 
MDrv_SC_read_me2SadDiff(void)3560 MS_U16 MDrv_SC_read_me2SadDiff(void)
3561 {
3562     MS_U16 cur;
3563     static MS_U16 prv = 0;
3564 
3565     cur = MApi_XC_R2BYTE(REG_SC_BK09_6C_L);
3566     cur = ((prv*3 )+ cur ) >> 2;
3567     prv = cur;
3568 
3569     return prv;
3570 }
3571 
3572 /******************************************************************************/
3573 ///Read motion value (F2 motion status)
3574 ///@return MS_U8: Motion value
3575 /******************************************************************************/
MDrv_SC_read_motion_value1(void)3576 MS_U32 MDrv_SC_read_motion_value1(void)
3577 {
3578     MS_U32 u32MotionValue = 0;
3579     MS_U32 u32RegMadi_1C = 0, u32RegMadi_1B = 0, u32RegMadi_1A = 0;
3580 
3581     u32RegMadi_1C = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0x3F);
3582     u32RegMadi_1B = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0xFF00);
3583     u32RegMadi_1A = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0x00FF);
3584 
3585     u32RegMadi_1C = u32RegMadi_1C * 0x10000UL;
3586 
3587     u32MotionValue = (u32RegMadi_1C + u32RegMadi_1B + u32RegMadi_1A)  ;
3588 
3589     DRVSCA_DBG(PRT_TRP("MotionValue = 0x%x\n", u32MotionValue));
3590 
3591     return u32MotionValue;
3592 }
3593 
3594 /******************************************************************************/
3595 ///Read motion value (Motion count status)
3596 ///@return MS_U8: Motion value
3597 /******************************************************************************/
MDrv_SC_read_motion_value2(void)3598 MS_U32 MDrv_SC_read_motion_value2(void)
3599 {
3600     MS_U32 u32MotionValue = 0;
3601 
3602     u32MotionValue = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK0A_1A_L, 0x7F);
3603 
3604     return u32MotionValue;
3605 }
3606 
3607 /******************************************************************************/
3608 ///Read motion value (Motion count status)
3609 ///@return MS_U32: Motion value
3610 /******************************************************************************/
MDrv_SC_read_motion_value3(void)3611 MS_U32 MDrv_SC_read_motion_value3(void)
3612 {
3613     MS_U32 u32MotionValue = 0;
3614 
3615     u32MotionValue = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK0A_18_L, 0x0FFF);
3616 
3617     return u32MotionValue;
3618 }
3619 
MDrv_SC_read_motion_value4(void)3620 MS_U16 MDrv_SC_read_motion_value4(void)
3621 {
3622     MS_U16 motionValue = 0;
3623 
3624     motionValue = MApi_XC_R2BYTEMSK(REG_SC_BK0A_2E_L, 0x7FFF);
3625 
3626     return motionValue;
3627 }
3628 
3629 //-------------------------------------------------------------------------------------------------
3630 /// Read motion value (Motion count status)
3631 /// @return MS_U8: Motion value
3632 //-------------------------------------------------------------------------------------------------
Hal_PQ_GetCurrentMotionValue(void * pInstance)3633 MS_U8 Hal_PQ_GetCurrentMotionValue(void *pInstance)
3634 {
3635     MS_U8 u8MotionValue = 0;
3636 
3637     u8MotionValue  = (MS_U8)((MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0x3F) << 2)
3638         |(MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0xC000) >> 6));
3639 
3640     return u8MotionValue;
3641 }
3642 
3643 /******************************************************************************/
3644 ///Read VCnt value
3645 ///@return MS_U8: VCnt value
3646 /******************************************************************************/
MDrv_SC_read_v_cnt(void)3647 MS_U8 MDrv_SC_read_v_cnt(void)
3648 {
3649     MS_U8 u8VCnt = 0;
3650     u8VCnt = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0xC0) >> 6);
3651     return u8VCnt;
3652 }
3653 
3654 /******************************************************************************/
3655 ///Read SDHDD Detect Threshold value
3656 ///@return MS_U16: HDSDD_Det_Threshold value
3657 /******************************************************************************/
MDrv_SC_read_HDSDD_Det_Threshold_value(void)3658 MS_U16 MDrv_SC_read_HDSDD_Det_Threshold_value(void)
3659 {
3660     MS_U16 u16Value = 0;
3661 
3662     u16Value = 0x30;    //(MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK22_7F_L, 0xFFFF);
3663 
3664     return u16Value;
3665 }
3666 
3667 /******************************************************************************/
3668 ///Read DLC 32 section Histogram Data
3669 ///@return MS_U16: 32 section Histogram Data
3670 /******************************************************************************/
3671 
MDrv_SC_GetLumaHistogram(void)3672 XC_LumaHistogramStates MDrv_SC_GetLumaHistogram(void)
3673 {
3674        //all registers move to UFSC BK55 in Maserati
3675     XC_LumaHistogramStates lumaStatus;
3676        int i = 0;
3677     lumaStatus.lumaBin[0] =  MDrv_Read2Byte( REG_FSC_BK55_30_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_31_L , 0x000F)<<16);
3678     lumaStatus.lumaBin[1] =  MDrv_Read2Byte( REG_FSC_BK55_32_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_33_L , 0x000F)<<16);
3679     lumaStatus.lumaBin[2] =  MDrv_Read2Byte( REG_FSC_BK55_34_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_35_L , 0x000F)<<16);
3680     lumaStatus.lumaBin[3] =  MDrv_Read2Byte( REG_FSC_BK55_36_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_37_L , 0x000F)<<16);
3681     lumaStatus.lumaBin[4] =  MDrv_Read2Byte( REG_FSC_BK55_38_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_39_L , 0x000F)<<16);
3682     lumaStatus.lumaBin[5] =  MDrv_Read2Byte( REG_FSC_BK55_3A_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_3B_L , 0x000F)<<16);
3683     lumaStatus.lumaBin[6] =  MDrv_Read2Byte( REG_FSC_BK55_3C_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_3D_L , 0x000F)<<16);
3684     lumaStatus.lumaBin[7] =  MDrv_Read2Byte( REG_FSC_BK55_3E_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_3F_L , 0x000F)<<16);
3685     lumaStatus.lumaBin[8] =  MDrv_Read2Byte( REG_FSC_BK55_40_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_41_L , 0x000F)<<16);
3686     lumaStatus.lumaBin[9] =  MDrv_Read2Byte( REG_FSC_BK55_42_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_43_L , 0x000F)<<16);
3687     lumaStatus.lumaBin[10] =  MDrv_Read2Byte( REG_FSC_BK55_44_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_45_L , 0x000F)<<16);
3688     lumaStatus.lumaBin[11] =  MDrv_Read2Byte( REG_FSC_BK55_46_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_47_L , 0x000F)<<16);
3689     lumaStatus.lumaBin[12] =  MDrv_Read2Byte( REG_FSC_BK55_48_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_49_L , 0x000F)<<16);
3690     lumaStatus.lumaBin[13] =  MDrv_Read2Byte( REG_FSC_BK55_4A_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_4B_L , 0x000F)<<16);
3691     lumaStatus.lumaBin[14] =  MDrv_Read2Byte( REG_FSC_BK55_4C_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_4D_L , 0x000F)<<16);
3692     lumaStatus.lumaBin[15] =  MDrv_Read2Byte( REG_FSC_BK55_4E_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_4F_L , 0x000F)<<16);
3693     lumaStatus.lumaBin[16] =  MDrv_Read2Byte( REG_FSC_BK55_50_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_51_L , 0x000F)<<16);
3694     lumaStatus.lumaBin[17] =  MDrv_Read2Byte( REG_FSC_BK55_52_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_53_L , 0x000F)<<16);
3695     lumaStatus.lumaBin[18] =  MDrv_Read2Byte( REG_FSC_BK55_54_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_55_L , 0x000F)<<16);
3696     lumaStatus.lumaBin[19] =  MDrv_Read2Byte( REG_FSC_BK55_56_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_57_L , 0x000F)<<16);
3697     lumaStatus.lumaBin[20] =  MDrv_Read2Byte( REG_FSC_BK55_58_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_59_L , 0x000F)<<16);
3698     lumaStatus.lumaBin[21] =  MDrv_Read2Byte( REG_FSC_BK55_5A_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_5B_L , 0x000F)<<16);
3699     lumaStatus.lumaBin[22] =  MDrv_Read2Byte( REG_FSC_BK55_5C_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_5D_L , 0x000F)<<16);
3700     lumaStatus.lumaBin[23] =  MDrv_Read2Byte( REG_FSC_BK55_5E_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_5F_L , 0x000F)<<16);
3701     lumaStatus.lumaBin[24] =  MDrv_Read2Byte( REG_FSC_BK55_60_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_61_L , 0x000F)<<16);
3702     lumaStatus.lumaBin[25] =  MDrv_Read2Byte( REG_FSC_BK55_62_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_63_L , 0x000F)<<16);
3703     lumaStatus.lumaBin[26] =  MDrv_Read2Byte( REG_FSC_BK55_64_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_65_L , 0x000F)<<16);
3704     lumaStatus.lumaBin[27] =  MDrv_Read2Byte( REG_FSC_BK55_66_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_67_L , 0x000F)<<16);
3705     lumaStatus.lumaBin[28] =  MDrv_Read2Byte( REG_FSC_BK55_68_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_69_L , 0x000F)<<16);
3706     lumaStatus.lumaBin[29] =  MDrv_Read2Byte( REG_FSC_BK55_6A_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_6B_L , 0x000F)<<16);
3707     lumaStatus.lumaBin[30] =  MDrv_Read2Byte( REG_FSC_BK55_6C_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_6D_L , 0x000F)<<16);
3708     lumaStatus.lumaBin[31] =  MDrv_Read2Byte( REG_FSC_BK55_6E_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_6F_L , 0x000F)<<16);
3709 
3710         for (i=0; i<32; i++)
3711         {
3712             lumaStatus.lumaBin[i]= lumaStatus.lumaBin[i]>>4;
3713         }
3714 
3715     return lumaStatus;
3716 }
3717 
3718 #define Confirm_Gain         5
MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset(MS_U16 * me1IsMv0,MS_U16 * me1IsNonMv0,MS_U16 * me1IsNotFound)3719 MS_U16 MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset(MS_U16 *me1IsMv0, MS_U16 *me1IsNonMv0, MS_U16 *me1IsNotFound )
3720 {
3721     MS_U16 MV0_Comfirm = 0,  nonMV0_Comfirm = 0, MV_Contradict = 0;
3722     static MS_U16 Prev_MV0_Comfirm = 0;
3723     static MS_U16 Prev_nonMV0_Comfirm = 0;
3724     static MS_U16 Prev_MV_Contradict = 0;
3725     MS_U16 MV_Comfirm = 0;
3726     MS_U16 MR_Offset = 0;
3727 
3728     MV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
3729     nonMV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
3730     MV_Contradict = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
3731 
3732     MV0_Comfirm = (Prev_MV0_Comfirm * 3 + MV0_Comfirm) >> 2;
3733     Prev_MV0_Comfirm = MV0_Comfirm;
3734 
3735     nonMV0_Comfirm = (Prev_nonMV0_Comfirm * 3 + nonMV0_Comfirm) >> 2;
3736     Prev_nonMV0_Comfirm = nonMV0_Comfirm;
3737 
3738     MV_Contradict = (Prev_MV_Contradict * 3 + MV_Contradict) >> 2;
3739     Prev_MV_Contradict = MV_Contradict;
3740 
3741     MV_Comfirm = MV0_Comfirm + nonMV0_Comfirm;
3742 
3743     if(MV_Comfirm > (MV_Contradict * Confirm_Gain))
3744         MR_Offset = nonMV0_Comfirm;
3745     else
3746         MR_Offset = 0;
3747 
3748     *me1IsMv0 = MV0_Comfirm;
3749     *me1IsNonMv0 = nonMV0_Comfirm;
3750     *me1IsNotFound = MV_Contradict;
3751 
3752     return MR_Offset;
3753 }
3754 
MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset(MS_U16 * me2IsMv0,MS_U16 * me2IsNonMv0,MS_U16 * me2IsNotFound)3755 MS_U16 MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset(MS_U16 *me2IsMv0, MS_U16 *me2IsNonMv0, MS_U16 *me2IsNotFound)
3756 {
3757     MS_U16 MV0_Comfirm = 0,  nonMV0_Comfirm = 0, MV_Contradict = 0;
3758     static MS_U16 Prev_MV0_Comfirm = 0;
3759     static MS_U16 Prev_nonMV0_Comfirm = 0;
3760     static MS_U16 Prev_MV_Contradict = 0;
3761     MS_U16 MV_Comfirm = 0;
3762     MS_U16 MR_Offset = 0;
3763 
3764     MV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
3765     nonMV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
3766     MV_Contradict = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
3767 
3768     MV0_Comfirm = (Prev_MV0_Comfirm * 3 + MV0_Comfirm) >> 2;
3769     Prev_MV0_Comfirm = MV0_Comfirm;
3770 
3771     nonMV0_Comfirm = (Prev_nonMV0_Comfirm * 3 + nonMV0_Comfirm) >> 2;
3772     Prev_nonMV0_Comfirm = nonMV0_Comfirm;
3773 
3774     MV_Contradict = (Prev_MV_Contradict * 3 + MV_Contradict) >> 2;
3775     Prev_MV_Contradict = MV_Contradict;
3776 
3777     MV_Comfirm = MV0_Comfirm + nonMV0_Comfirm;
3778 
3779     if(MV_Comfirm > (MV_Contradict * Confirm_Gain))
3780         MR_Offset = nonMV0_Comfirm;
3781     else
3782         MR_Offset = 0;
3783 
3784     *me2IsMv0 = MV0_Comfirm;
3785     *me2IsNonMv0 = nonMV0_Comfirm;
3786     *me2IsNotFound = MV_Contradict;
3787 
3788     return MR_Offset;
3789 }
3790 
3791 #define ScenceChange_TH        0x1000
MDrv_SC_Agate_SceneChangeY(const XC_LumaHistogramStates lumaHistogram)3792 MS_BOOL MDrv_SC_Agate_SceneChangeY( const  XC_LumaHistogramStates lumaHistogram )
3793 {
3794     //XC_DLC_ApiStatus DLC_Status;
3795     //MApi_XC_DLC_GetStatus_Ex(&DLC_Status,MAIN_WINDOW);
3796     static MS_U16 Pre_LumaHistogram[32], Max_HistogramDiff = 0;
3797     MS_U16 HistogramDiff = 0;
3798     int i = 0;
3799 
3800     for(i=0;i<32;i++)
3801     {
3802         if(lumaHistogram.lumaBin[i] >= Pre_LumaHistogram[i])
3803         {
3804             HistogramDiff = lumaHistogram.lumaBin[i] - Pre_LumaHistogram[i];
3805         }
3806         else
3807         {
3808             HistogramDiff = Pre_LumaHistogram[i] - lumaHistogram.lumaBin[i];
3809         }
3810 
3811         if(HistogramDiff > Max_HistogramDiff)
3812         {
3813             Max_HistogramDiff = HistogramDiff;
3814         }
3815 
3816         Pre_LumaHistogram[i] = lumaHistogram.lumaBin[i];
3817     }
3818 
3819     if( Max_HistogramDiff > ScenceChange_TH )
3820     {
3821         Max_HistogramDiff = 0;
3822         return true;
3823     }
3824     else
3825     {
3826         Max_HistogramDiff = 0;
3827         return false;
3828     }
3829 }
3830 
MDrv_SC_Agate_SceneChangeMc(const MS_U16 me1IsMv0,const MS_U16 me1IsNonMv0,const MS_U16 me1IsNotFound,const MS_U16 me2IsMv0,const MS_U16 me2IsNonMv0,const MS_U16 me2IsNotFound)3831 MS_BOOL MDrv_SC_Agate_SceneChangeMc(const MS_U16 me1IsMv0, const MS_U16 me1IsNonMv0, const MS_U16 me1IsNotFound,
3832                     const MS_U16 me2IsMv0, const MS_U16 me2IsNonMv0, const MS_U16 me2IsNotFound)
3833 {
3834     MS_U16 me1Comfirm = 0;
3835     MS_U16 me2Comfirm = 0;
3836     static MS_BOOL isNotFound           = false;
3837     static MS_BOOL isScencChange        = false;
3838 
3839     static MS_U8 notFoundDelayCnt = 0;
3840     static MS_U8 scencChangeDelayCnt = 0;
3841 
3842     me1Comfirm = me1IsMv0 + me1IsNonMv0;
3843     me2Comfirm = me2IsMv0 + me2IsNonMv0;
3844 
3845     if((me1IsNotFound > me1Comfirm*5)&&(me2IsNotFound > me2Comfirm*5) &&
3846         (me1IsNotFound > 0x10) && (me2IsNotFound > 0x10) )/* not found*/
3847     {
3848         isNotFound = true;
3849     }
3850 
3851     if( isNotFound )
3852     {
3853         if( notFoundDelayCnt != 60 )
3854             notFoundDelayCnt++;
3855     }
3856 
3857     if( notFoundDelayCnt > 10 )
3858     {
3859         if((me1IsNotFound*5 < me1Comfirm)&&(me2IsNotFound*5 < me2Comfirm) &&
3860             (me1Comfirm > 0x10) && (me2Comfirm > 0x10) )/* found */
3861         {
3862             isScencChange = true;
3863         }
3864         else
3865         {
3866             isScencChange = false;
3867         }
3868 
3869         notFoundDelayCnt = 0;
3870         isNotFound = false;
3871     }
3872 
3873     if( isScencChange )
3874     {
3875         if( scencChangeDelayCnt != 60 )
3876             scencChangeDelayCnt++;
3877     }
3878 
3879     if( scencChangeDelayCnt > 5 )
3880     {
3881         scencChangeDelayCnt = 0;
3882         isScencChange = false;
3883     }
3884 
3885     return isScencChange;
3886 }
3887 
3888 #define HIS_MOTION_TH 0x0A
MDrv_SC_Bouncing_Status(const MS_U32 u32MotionValue)3889 MS_BOOL MDrv_SC_Bouncing_Status(const MS_U32 u32MotionValue)
3890 {
3891     if( u32MotionValue < HIS_MOTION_TH )
3892     {
3893         return TRUE;                            //Still pattern
3894     }
3895     else
3896     {
3897         return FALSE;                           //Moving pattern
3898     }
3899 }
3900 
3901 #define HIS_MOTION_TH2 0x30
MDrv_SC_Bouncing_Status2(const MS_U32 u32MotionValue)3902 MS_BOOL MDrv_SC_Bouncing_Status2(const MS_U32 u32MotionValue)
3903 {
3904     if( u32MotionValue < HIS_MOTION_TH2 )
3905     {
3906         return TRUE;                            //Still pattern
3907     }
3908     else
3909     {
3910         return FALSE;                           //Moving pattern
3911     }
3912 }
3913 
3914 
3915 #define Feather_Sum_TH 0x1500
3916 #define Feather_Sum_TH2 0x230
MDrv_SC_TotalFeather_Sum_Status(const MS_U16 featherAndMotion,const MS_BOOL isSD_source,MS_BOOL * Feather_sum_status2)3917 MS_BOOL MDrv_SC_TotalFeather_Sum_Status(const MS_U16 featherAndMotion, const MS_BOOL isSD_source, MS_BOOL *Feather_sum_status2 )
3918 {
3919     MS_U32 SD2HD_Feather = 0;
3920     static MS_U32 SD2HD_Feather_iir = 0;
3921     MS_BOOL isFeatherAndMotion = ( featherAndMotion > 0x10 ) ? true : false;
3922 
3923     MS_BOOL isFeather1 = FALSE, isFeather2 = FALSE;
3924 
3925     static MS_U8 confirm_cnt1 = 0;
3926     static MS_U8 confirm_cnt2 = 0;
3927 
3928     SD2HD_Feather    = MApi_XC_R2BYTE(REG_SC_BK23_56_L);
3929     SD2HD_Feather = ((SD2HD_Feather_iir*3 )+ SD2HD_Feather ) >> 2;
3930     SD2HD_Feather_iir = SD2HD_Feather;
3931 
3932     if( (SD2HD_Feather_iir > Feather_Sum_TH2) &&(isSD_source) && (!isFeatherAndMotion) )
3933         //*Feather_sum_status2 = true;
3934         isFeather2 = true;
3935     else
3936         //*Feather_sum_status2 = false;
3937         isFeather2 = false;
3938 
3939     if( (SD2HD_Feather_iir > Feather_Sum_TH) &&(isSD_source) && (!isFeatherAndMotion) )
3940         isFeather1 = true;
3941     else
3942         isFeather1 = false;
3943 
3944     if( isFeather2 )
3945     {
3946         if( confirm_cnt2 < 120 )
3947             confirm_cnt2++;
3948     }
3949     else
3950     {
3951         confirm_cnt2 = 0;
3952     }
3953 
3954     if( isFeather1 )
3955     {
3956         if( confirm_cnt1 < 120 )
3957             confirm_cnt1++;
3958     }
3959     else
3960     {
3961 
3962         confirm_cnt1 = 0;
3963     }
3964 
3965 
3966     if( confirm_cnt2 > 60 )
3967         *Feather_sum_status2 = true;
3968     else
3969         *Feather_sum_status2 = false;
3970 
3971     return ( confirm_cnt1 > 60 );
3972 }
3973 
MDrv_SC_ScenceChangeDetectByNotFound(const MS_U16 mvNotFound_noIIR)3974 MS_BOOL MDrv_SC_ScenceChangeDetectByNotFound(const MS_U16 mvNotFound_noIIR)
3975 {
3976     static MS_U16 mvNotFound_noIIR_pre = 0;
3977     MS_U16 Diff_notFound = 0;
3978 
3979     if(mvNotFound_noIIR > mvNotFound_noIIR_pre)
3980     {
3981         Diff_notFound = mvNotFound_noIIR - mvNotFound_noIIR_pre;
3982     }
3983     else
3984     {
3985         Diff_notFound = mvNotFound_noIIR_pre - mvNotFound_noIIR;
3986     }
3987 
3988     if(Diff_notFound > 0x10)
3989     {
3990         if( (mvNotFound_noIIR > (mvNotFound_noIIR_pre*2)) || (mvNotFound_noIIR < (mvNotFound_noIIR_pre*2)) )
3991         {
3992             mvNotFound_noIIR_pre = mvNotFound_noIIR;
3993             return true;
3994         }
3995         else
3996         {
3997             mvNotFound_noIIR_pre = mvNotFound_noIIR;
3998             return false;
3999         }
4000     }
4001     else
4002     {
4003         return false;
4004     }
4005 }
4006 
4007 #define TIME_SHARING_DELAY 5
4008 #define TIME_SHARING_MAX_ID 5 //Eva add one 0804
MDrv_SC_TimeSharing(const XC_OpFrameStates opFrameStatusCur,MS_U8 * timingSegment,MS_BOOL isSourceChangeFlag)4009 MS_U8 MDrv_SC_TimeSharing( const XC_OpFrameStates opFrameStatusCur,  MS_U8 *timingSegment , MS_BOOL isSourceChangeFlag)
4010 {
4011     static XC_OpFrameStates opFrameStatusLast;
4012     static MS_U8 timingId = 0;
4013 
4014     if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
4015         timingId++;
4016 
4017     if( timingId == (TIME_SHARING_DELAY*TIME_SHARING_MAX_ID) || isSourceChangeFlag == 1)
4018         timingId = 0;
4019 
4020     opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
4021 
4022     // return
4023     *timingSegment = ( timingId % TIME_SHARING_DELAY ) ;
4024     return ( timingId / TIME_SHARING_DELAY );
4025 }
4026 
MDrv_SC_OpFrame_Status(void)4027 XC_OpFrameStates MDrv_SC_OpFrame_Status(void)
4028 {
4029     XC_OpFrameStates opFrameStatus;
4030 
4031     opFrameStatus.curOpFrame = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK12_3A_L, 0x00F0) >> 4 );
4032     opFrameStatus.maxOpFrame = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK12_19_L, 0x001F) >> 0 );
4033 
4034     return opFrameStatus;
4035 }
4036 
MDrv_SC_Film_Status(void)4037 XC_FilmStates MDrv_SC_Film_Status(void)
4038 {
4039     XC_FilmStates filmstatus;
4040 
4041     filmstatus.film22 = FALSE;
4042     filmstatus.film32 = FALSE;
4043     filmstatus.filmany = FALSE;
4044     filmstatus.film_act = FALSE;
4045 
4046     if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0008) == 0x0008)   // film22
4047     {
4048         filmstatus.film22 = TRUE;
4049     }
4050     if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0010) == 0x0010)   // film32
4051     {
4052         filmstatus.film32 = TRUE;
4053     }
4054 
4055     if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0040) == 0x0040)   // film any
4056     {
4057         filmstatus.filmany = TRUE;
4058     }
4059 
4060     if(filmstatus.film22 ||filmstatus.film32 ||filmstatus.filmany)
4061     {
4062         filmstatus.film_act = TRUE;
4063     }
4064 
4065     return filmstatus;
4066 }
4067 
MDrv_SC_KFC_EODiW_Ctrl(const MS_BOOL isUkosabihsMc)4068 void MDrv_SC_KFC_EODiW_Ctrl( const MS_BOOL isUkosabihsMc )
4069 {
4070     MS_U16 reg = 0;
4071 
4072     if( isUkosabihsMc )
4073         reg = 0x0000; /* disable kfcEodiW  */
4074     else
4075         reg = 0x00C0; /* enable kfcEodiW  */
4076 
4077     MApi_XC_W2BYTEMSK( REG_SC_BK22_28_L, reg, 0x00C0 );
4078 }
4079 
MDrv_SC_Mcdi_EODiW_Ctrl(const MS_BOOL isUkosabihsMc,const MS_BOOL isL107)4080 void MDrv_SC_Mcdi_EODiW_Ctrl( const MS_BOOL isUkosabihsMc, const MS_BOOL isL107 )
4081 {
4082     MS_U16 reg = 0;
4083 
4084     if( isUkosabihsMc || isL107 )
4085     {
4086         reg = 0x0000; /* disable mcEodiW */
4087         //printf("MDrv_SC_Mcdi_EODiW_Ctrl ==0\n\n");
4088     }
4089     else
4090     {
4091         reg = 0x0080; /* enable mcEodiW */
4092         //printf("MDrv_SC_Mcdi_EODiW_Ctrl ==80\n\n");
4093     }
4094 
4095     MApi_XC_W2BYTEMSK( REG_SC_BK22_28_L, reg, 0x0080 );
4096 }
4097 
MDrv_SC_Force_Mcdi_Ctrl(const MS_BOOL isUkosabihsMc)4098 void MDrv_SC_Force_Mcdi_Ctrl( const MS_BOOL isUkosabihsMc)
4099 {
4100     MS_U16 reg_force_mcdi = 0;
4101 
4102     if( isUkosabihsMc )
4103         reg_force_mcdi = 0x8080;
4104     else
4105         reg_force_mcdi = 0x0000;
4106 
4107     MApi_XC_W2BYTEMSK( REG_SC_BK2A_2F_L, reg_force_mcdi , 0xFFFF );
4108 }
4109 
MDrv_SC_Force_Motion_Ctrl(const MS_BOOL isL139,const MS_BOOL isUkosabihsMotion)4110 void MDrv_SC_Force_Motion_Ctrl( const MS_BOOL isL139, const MS_BOOL isUkosabihsMotion )
4111 {
4112     MS_U16 reg_force_motion;
4113     MS_U32 mv0_feather, nonMv0_feather;
4114     MS_U32 total_feather;
4115 
4116     mv0_feather      = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4117     nonMv0_feather   = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
4118 
4119     total_feather =  mv0_feather + nonMv0_feather;
4120 
4121     if( (isUkosabihsMotion)&&(total_feather< 0x1200))
4122     {
4123         reg_force_motion = 0x008F; /* full motion */
4124     }
4125     else if( isL139 )
4126     {
4127         reg_force_motion = 0x0080; /* full still */
4128     }
4129     else
4130     {
4131         reg_force_motion = 0x0000;
4132     }
4133 
4134     MApi_XC_W2BYTEMSK(REG_SC_BK22_78_L, reg_force_motion, 0x00FF);
4135 }
4136 
4137 #define reg_mcdi_feather_gain_MaxValue 0x02
4138 #define reg_mcdi_feather_gain_MinValue 0x00
MDrv_SC_KFC_Ctrl(const MS_BOOL isAbihsot)4139 void MDrv_SC_KFC_Ctrl( const MS_BOOL isAbihsot )
4140 {
4141     static MS_U16 u16regmcdifeathergain = reg_mcdi_feather_gain_MaxValue;
4142 
4143     if( isAbihsot )
4144     {
4145         if(u16regmcdifeathergain > reg_mcdi_feather_gain_MinValue)
4146             u16regmcdifeathergain--;
4147         else
4148             u16regmcdifeathergain = reg_mcdi_feather_gain_MinValue;
4149     }
4150     else
4151     {
4152         if(u16regmcdifeathergain < reg_mcdi_feather_gain_MaxValue)
4153             u16regmcdifeathergain++;
4154         else
4155             u16regmcdifeathergain = reg_mcdi_feather_gain_MaxValue;
4156     }
4157 
4158         //Dummy to control write value, add by Bella 20150708
4159         if((MApi_XC_R2BYTE(REG_SC_BK23_5D_L)&0x000F)!=0x0000)
4160         {
4161             MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, MApi_XC_R2BYTE(REG_SC_BK23_5D_L), 0x0F00);
4162          }
4163         else
4164          {
4165         MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, (MS_U16)u16regmcdifeathergain << 8, 0x0F00);
4166          }
4167 }
MDrv_SC_SourceChange(void)4168 MS_BOOL MDrv_SC_SourceChange(void)
4169 {
4170     static MS_BOOL bprevSourceChange = false;
4171 
4172     MS_BOOL sourceChangeInitReg = MApi_XC_R2BYTEMSK(REG_SC_BK30_07_L, 0x0001);
4173     sourceChangeInitReg = sourceChangeInitReg&&(!bprevSourceChange);
4174 
4175     if( sourceChangeInitReg == 1 )
4176     {
4177         MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L, sourceChangeInitReg << 1, 0x0002);
4178     }
4179     else
4180         MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L, 0x0000, 0x0001);
4181 
4182     bprevSourceChange = sourceChangeInitReg;
4183     return sourceChangeInitReg;
4184 }
4185 
MDrv_SC_SourceChangeFlag(MS_BOOL SourceChangeLastTime)4186 MS_BOOL MDrv_SC_SourceChangeFlag(MS_BOOL SourceChangeLastTime)
4187 {
4188     static MS_BOOL bsourceChangeFrm1 = false;
4189     static MS_BOOL bsourceChangeFrm2 = false;
4190     static MS_BOOL bsourceChangeFrm3 = false;
4191 
4192     MS_BOOL sourceChangeFlag = bsourceChangeFrm1 || bsourceChangeFrm2 || bsourceChangeFrm3 || SourceChangeLastTime;
4193 
4194     bsourceChangeFrm1 = bsourceChangeFrm2;
4195     bsourceChangeFrm2 = bsourceChangeFrm3;
4196     bsourceChangeFrm3 = SourceChangeLastTime;
4197 
4198 
4199     return sourceChangeFlag;
4200 }
4201 
4202 #define VerticalMovingUdRatio_MaxValue 0x0F
4203 #define VerticalMovingUdRatio_MinValue 0x07
MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl(const MS_U32 inSearchUseFeather,MS_BOOL isfilmLike)4204 void MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl(const MS_U32 inSearchUseFeather, MS_BOOL isfilmLike )
4205 {
4206     static MS_U16 u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MaxValue;
4207 
4208     if( inSearchUseFeather > 0x300 )
4209     {
4210         if ( u16VerticalMovingUdRatioValue > VerticalMovingUdRatio_MinValue)
4211             u16VerticalMovingUdRatioValue--;
4212         else
4213             u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MinValue;
4214     }
4215     else
4216     {
4217         if ( u16VerticalMovingUdRatioValue < VerticalMovingUdRatio_MaxValue)
4218             u16VerticalMovingUdRatioValue++;
4219         else
4220             u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MaxValue;
4221     }
4222 
4223     if ( isfilmLike )
4224         MApi_XC_W2BYTEMSK(REG_SC_BK2A_28_L, 0, 0x000F);
4225     else
4226         MApi_XC_W2BYTEMSK(REG_SC_BK2A_28_L, (MS_U16)u16VerticalMovingUdRatioValue, 0x000F);
4227 
4228 }
4229 
4230 #define KFC_8bitMotionGain_MaxValue 0x08
4231 #define KFC_8bitMotionGain_MinValue 0x04 //0 have feather issue.
MDrv_SC_KFC_8bitMotionGain_Ctrl(const MS_BOOL isZoomIn,const MS_BOOL isFilmLike,const MS_BOOL McSmallMoving)4232 void MDrv_SC_KFC_8bitMotionGain_Ctrl(const MS_BOOL isZoomIn, const MS_BOOL isFilmLike, const MS_BOOL McSmallMoving )
4233 {
4234     static MS_U16 u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MaxValue;
4235 
4236     if( isFilmLike || McSmallMoving )
4237     {
4238         if ( u16KFC8bitMotionGainValue < 0x0F/*Max*/ )
4239             u16KFC8bitMotionGainValue++;
4240         else
4241             u16KFC8bitMotionGainValue = 0x0F;
4242     }
4243     else if( isZoomIn  )
4244     {
4245         //MApi_XC_W2BYTEMSK(REG_SC_BK22_7A_L, 0x1000, 0x1000);
4246         if ( u16KFC8bitMotionGainValue > KFC_8bitMotionGain_MinValue)
4247             u16KFC8bitMotionGainValue--;
4248         else
4249             u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MinValue;
4250     }
4251     else
4252     {
4253         //MApi_XC_W2BYTEMSK(REG_SC_BK22_7A_L, 0x0000, 0x1000);
4254         if ( u16KFC8bitMotionGainValue < KFC_8bitMotionGain_MaxValue)
4255             u16KFC8bitMotionGainValue++;
4256         else
4257             u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MaxValue;
4258     }
4259 
4260     MApi_XC_W2BYTEMSK(REG_SC_BK2A_3B_L, (MS_U16)u16KFC8bitMotionGainValue<<4, 0x00F0);
4261 }
4262 
4263 #define DNR_DIV_MAX 4
MDrv_SC_DNR_DIV0_Ctrl(const MS_BOOL isWeakMcNrFilm,const MS_U8 isSourceChange)4264 void MDrv_SC_DNR_DIV0_Ctrl( const MS_BOOL isWeakMcNrFilm, const MS_U8 isSourceChange    )
4265 {
4266     static MS_U8 orgDiv0 = 0;
4267     static MS_U8 curDiv0 = 0;
4268 
4269     if( isSourceChange )
4270         orgDiv0 = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK06_27_L, 0x001C)) >> 2;
4271 
4272 
4273     if( isWeakMcNrFilm )
4274     {
4275         if( curDiv0 < DNR_DIV_MAX )
4276             curDiv0++;
4277     }
4278     else
4279     {
4280         if( curDiv0 > orgDiv0 )
4281             curDiv0--;
4282     }
4283 
4284     MApi_XC_W2BYTEMSK(REG_SC_BK06_27_L, ( curDiv0 << 2 ), 0x001C);
4285 }
4286 
4287 #define REG_W3_FinialGain_MAX  0x0F
4288 #define REG_W3_FinialGain_MIN   0x08
MDrv_SC_MCNR_PatchW3FinalGain_Ctrl(const MS_BOOL isWeakMcNrFilm)4289 void MDrv_SC_MCNR_PatchW3FinalGain_Ctrl( const MS_BOOL isWeakMcNrFilm  )
4290 {
4291     static MS_U8 reg_patch_w3_final_gain = REG_W3_FinialGain_MIN;
4292 
4293     if( isWeakMcNrFilm )
4294     {
4295         if( reg_patch_w3_final_gain < REG_W3_FinialGain_MAX )
4296             reg_patch_w3_final_gain++;
4297     }
4298     else
4299     {
4300         if( reg_patch_w3_final_gain > REG_W3_FinialGain_MIN )
4301             reg_patch_w3_final_gain--;
4302     }
4303 
4304     MApi_XC_W2BYTEMSK(REG_SC_BK2A_10_L, ( reg_patch_w3_final_gain << 4 ), 0x00F0 );
4305 }
4306 
MDrv_SC_MotionLimitGain_Ctrl(const MS_BOOL isL153)4307 void MDrv_SC_MotionLimitGain_Ctrl( const MS_BOOL isL153 )
4308 {
4309     if( isL153 )
4310     {
4311         MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0000, 0x000F);
4312     }
4313     else
4314     {
4315         MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0008, 0x000F);
4316     }
4317 }
4318 
MDrv_SC_UCDi_Weight_Boundary_Ctrl(const XC_Me1HisStates H1)4319 void MDrv_SC_UCDi_Weight_Boundary_Ctrl( const XC_Me1HisStates H1)
4320 {
4321     MS_BOOL isHorizontalscroll =  ( H1.minMvXdir != 8 ) ? true : false;
4322     if( isHorizontalscroll )
4323     {
4324         MApi_XC_W2BYTEMSK(REG_SC_BK22_77_L, 0x1807, 0xFFFF);
4325     }
4326     else
4327     {
4328         MApi_XC_W2BYTEMSK(REG_SC_BK22_77_L, 0x0000, 0xFFFF);
4329     }
4330 }
4331 
4332 #define FeatherSstGain_Max 0x0F
4333 #define FeatherSstGain_Min  0x02
MDrv_SC_featherSstGain_Ctrl(const MS_BOOL isMcFilmSlowMotion)4334 void MDrv_SC_featherSstGain_Ctrl( const MS_BOOL  isMcFilmSlowMotion )
4335 {
4336     static MS_U8 reg_featherSstGain =  FeatherSstGain_Min;
4337 
4338     if( isMcFilmSlowMotion )
4339     {
4340         if( reg_featherSstGain < FeatherSstGain_Max )
4341             reg_featherSstGain++;
4342     }
4343     else
4344     {
4345         if( reg_featherSstGain > FeatherSstGain_Min )
4346             reg_featherSstGain--;
4347     }
4348 
4349     MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, (MS_U16)(reg_featherSstGain << 12 ), 0xF000);
4350 }
4351 
4352 #define FeatherSstOffset_Max 0x01 /* default */
4353 #define FeatherSstOffset_Min  0x00
MDrv_SC_featherSstOffset_Ctrl(const XC_OpFrameStates opFrameStatusCur,const MS_BOOL isMcFilmSlowMotion,const MS_BOOL favorStill)4354 void MDrv_SC_featherSstOffset_Ctrl( const XC_OpFrameStates opFrameStatusCur, const MS_BOOL  isMcFilmSlowMotion, const MS_BOOL favorStill )
4355 {
4356     static MS_U8 reg_featherSstOffset =  FeatherSstOffset_Max;
4357     static XC_OpFrameStates opFrameStatusLast;
4358     static MS_U8 frameCnt = 0;
4359 
4360     if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
4361     {
4362         if( frameCnt < 16 )
4363             frameCnt++;
4364         else
4365             frameCnt = 0;
4366     }
4367 
4368     if( isMcFilmSlowMotion )
4369     {
4370         if( reg_featherSstOffset > FeatherSstOffset_Min )
4371             reg_featherSstOffset--;
4372     }
4373     else if( favorStill )
4374     {
4375         if( frameCnt == 15 )
4376         {
4377             if( reg_featherSstOffset < 0x0F/* max of offset value */ )
4378                 reg_featherSstOffset++;
4379         }
4380     }
4381     else
4382     {
4383         if( reg_featherSstOffset < FeatherSstOffset_Max )
4384             reg_featherSstOffset++;
4385         else if( reg_featherSstOffset > FeatherSstOffset_Max )
4386             reg_featherSstOffset--;
4387     }
4388 
4389     //PRT_TRP("==reg_featherSstOffset=%x\n",reg_featherSstOffset);
4390 
4391     opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
4392 
4393         //Dummy to control write value, add by Bella 20150708
4394         if((MApi_XC_R2BYTE(REG_SC_BK23_5C_L)&0x0F00)!=0x0000)
4395         {
4396             MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, MApi_XC_R2BYTE(REG_SC_BK23_5C_L), 0x0F00);
4397          }
4398         else
4399          {
4400            MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, (MS_U16)(reg_featherSstOffset << 8 ), 0x0F00);
4401          }
4402 }
4403 
MDrv_SC_NR_CheckMotionBigChange(const MS_BOOL isHDSrc,MS_BOOL * motionBigChange,MS_BOOL * motionBigChange2)4404 void MDrv_SC_NR_CheckMotionBigChange( const MS_BOOL isHDSrc, MS_BOOL *motionBigChange, MS_BOOL *motionBigChange2 )
4405 {
4406     static MS_U16 motionValuePrv;
4407     MS_U16 motionValue = 0;
4408 
4409     motionValue = MApi_XC_R2BYTEMSK(REG_SC_BK0A_2E_L, 0xFFFF);
4410 
4411     *motionBigChange = false;
4412     *motionBigChange2 = false;
4413     if ( motionValue != motionValuePrv )
4414     {
4415         *motionBigChange =
4416             ( motionValue & 0x7fff )    > 0x80 && ( ( motionValue & 0x7fff )    /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4417             ( motionValuePrv & 0x7fff ) > 0x80 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4418 
4419         if ( isHDSrc )
4420             *motionBigChange2 =
4421             ( motionValue & 0x7fff )    > 0x800 && ( ( motionValue & 0x7fff )    /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4422             ( motionValuePrv & 0x7fff ) > 0x800 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4423         else
4424             *motionBigChange2 =
4425             ( motionValue & 0x7fff )    > 0x200 && ( ( motionValue & 0x7fff )    /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4426             ( motionValuePrv & 0x7fff ) > 0x200 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4427 
4428     }
4429     motionValuePrv = motionValue;
4430 }
4431 
4432 #define ME_MovingWeight_Max_SD 0x10
4433 #define ME_MovingWeight_Max_HD 0x10
4434 #define ME_MovingWeight_Max2_SD 0x12
4435 #define ME_MovingWeight_Max2_HD 0x12
4436 #define ME_MovingWeight_Min  0x08
4437 
4438 #define MCNR_MOTIONGAIN_MAX2 0xC
4439 #define MCNR_MOTIONGAIN_MAX  0x8
4440 #define MCNR_MOTIONGAIN_MIN  0x7
4441 
4442 #define PDNR_MOTIONGAIN_MAX2 0xC
4443 #define PDNR_MOTIONGAIN_MAX  0x8
4444 #define PDNR_MOTIONGAIN_MIN  0x4
4445 
MDrv_SC_NR_Driver(const XC_FilmStates filmstatus,const MS_BOOL isHDSrc)4446 void MDrv_SC_NR_Driver( const XC_FilmStates filmstatus, const MS_BOOL isHDSrc )
4447 {
4448     static MS_U8 movingWeight = ME_MovingWeight_Max_SD;
4449     static MS_U8 mcnr_motionGain = MCNR_MOTIONGAIN_MAX;
4450     static MS_U8 pdnr_motionGain = 0x8;
4451     static MS_U8 isFilmandMotion = 0;
4452     static MS_U8 stillFrameCnt = 0;
4453 
4454     // special patch for HQVSD random noise pattern
4455     static MS_U8 patchHQVSDSlowMotionScenCnt = 0;
4456     MS_U8 me1_X_histogram[8];
4457     MS_U16 mv0featheringCnt = 0;
4458     MS_U16 mvhistogramMV0Cnt = 0;
4459     MS_U16 mvhistogramNonMV0Cnt = 0;
4460     // special patch for sec woman in dark
4461     static MS_U8 patchSecWomanInDarkScnenCnt = 0;
4462     static MS_U8 mcnrUpdateTableLevelCnt = 0x80;
4463     MS_U8 mcnrUpdateTableLevel = 0;
4464     MS_U16 mcnrMoveStep = 0;
4465 
4466     MS_U32 me1_mv0blk = 0, me1_nonMv0blk = 0;
4467     MS_U32 me2_mv0blk = 0, me2_nonMv0blk = 0;
4468     MS_BOOL movingBlkMoreThanMV0Blk1 = FALSE;
4469     MS_BOOL movingBlkMoreThanMV0Blk2 = FALSE;
4470     MS_BOOL isStill = FALSE;
4471     MS_BOOL isfilmNotfilm22 = FALSE;
4472 
4473     MS_BOOL motionBigChange = FALSE, motionBigChange2 = FALSE;
4474     MDrv_SC_NR_CheckMotionBigChange( isHDSrc, &motionBigChange, &motionBigChange2  );
4475 
4476     // read status
4477     me1_mv0blk    = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
4478     me1_nonMv0blk = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
4479     me2_mv0blk    = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
4480     me2_nonMv0blk = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
4481 
4482     movingBlkMoreThanMV0Blk1 =
4483         isHDSrc ? ( ( me2_nonMv0blk == 0XFFF ) || ( ( me2_nonMv0blk > 0x1000 ) && ( me2_nonMv0blk > me1_mv0blk*2 ) ) ):
4484         ( ( me1_nonMv0blk > 0x40  ) && ( me1_nonMv0blk > me1_mv0blk/2 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me1_mv0blk/2 ) );
4485 
4486     movingBlkMoreThanMV0Blk2 =
4487         isHDSrc ? ( ( me1_nonMv0blk > 0x10  ) && ( me1_nonMv0blk > me1_mv0blk*2 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me2_mv0blk*2 ) ) :
4488         ( ( me1_nonMv0blk > 0x10  ) && ( me1_nonMv0blk > me1_mv0blk/8 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me2_mv0blk/4 ) );
4489 
4490     isStill = ( ( me1_mv0blk > 0x40 ) && ( me1_mv0blk > me1_nonMv0blk/8 ) ) ||
4491         ( ( me1_mv0blk > 0x4  ) && ( me1_nonMv0blk == 0 ) && ( me2_nonMv0blk < 0x40 ) ); // patch for sony tree
4492 
4493     // special patch for HQVSD random noise pattern
4494     me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF);
4495     me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8;
4496     me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF);
4497     me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8;
4498     me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF);
4499     me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8;
4500     me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF);
4501     me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8;
4502 
4503     mv0featheringCnt = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4504     mvhistogramMV0Cnt = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF);
4505     mvhistogramNonMV0Cnt = me1_X_histogram[0] + me1_X_histogram[1] + me1_X_histogram[2] + me1_X_histogram[3] +
4506         me1_X_histogram[4] + me1_X_histogram[5] + me1_X_histogram[6] + me1_X_histogram[7];
4507 
4508     if ( motionBigChange || motionBigChange2 )
4509         patchHQVSDSlowMotionScenCnt = 0;
4510     else if ( mv0featheringCnt == 0 && // mv0 feathering count
4511         me2_mv0blk > 0x140 && me2_nonMv0blk < 0xC0 &&
4512         mvhistogramNonMV0Cnt < 8 &&
4513         mvhistogramMV0Cnt < 0x20 )
4514     {
4515         if ( patchHQVSDSlowMotionScenCnt <= 0xf0 )
4516             patchHQVSDSlowMotionScenCnt ++;
4517     }
4518     else
4519     {
4520         if ( patchHQVSDSlowMotionScenCnt > 0x10 )
4521             patchHQVSDSlowMotionScenCnt -= 0x10;
4522         else
4523             patchHQVSDSlowMotionScenCnt = 0;
4524     }
4525 
4526     // special patch for sec woman in dark
4527     // 1. when in dark scene
4528     if ( mv0featheringCnt ==0  && // mv0 feathering count
4529         me2_nonMv0blk > me2_mv0blk/4 && me2_nonMv0blk > 0x25 &&
4530         mvhistogramNonMV0Cnt < 4 && mvhistogramMV0Cnt < 8 )
4531     {
4532         if ( patchSecWomanInDarkScnenCnt < 0xf0 )
4533             patchSecWomanInDarkScnenCnt ++;
4534     }
4535     else if (
4536         me2_nonMv0blk > me2_mv0blk/4 && me2_nonMv0blk > 0x30 &&
4537         mvhistogramNonMV0Cnt < 8 && mvhistogramMV0Cnt < 0x20 )
4538     {
4539         if ( patchSecWomanInDarkScnenCnt < 0xf0 )
4540             patchSecWomanInDarkScnenCnt ++;
4541     }
4542     else
4543     {
4544         if ( patchSecWomanInDarkScnenCnt > 0x10 )
4545             patchSecWomanInDarkScnenCnt -= 0x10;
4546         else
4547             patchSecWomanInDarkScnenCnt = 0;
4548     }
4549 
4550 
4551     mcnrMoveStep = 4; //(MApi_XC_R2BYTE(REG_SC_BK30_08_L)) >> 8;
4552     if ( isHDSrc || motionBigChange || motionBigChange2 )
4553     {
4554         mcnrUpdateTableLevelCnt = 0x80;
4555     }
4556     else if ( patchHQVSDSlowMotionScenCnt >= 0x10 )
4557     {
4558         if ( mcnrUpdateTableLevelCnt < 0xF0 )
4559             mcnrUpdateTableLevelCnt += mcnrMoveStep;
4560     }
4561     else if ( patchSecWomanInDarkScnenCnt >= 0x10 )
4562     {
4563         if ( mcnrUpdateTableLevelCnt > 10 )
4564             mcnrUpdateTableLevelCnt -= mcnrMoveStep;
4565     }
4566     else // go back to 0x80
4567     {
4568         if ( mcnrUpdateTableLevelCnt > 0x80 )
4569             mcnrUpdateTableLevelCnt -= mcnrMoveStep;
4570         else if ( mcnrUpdateTableLevelCnt < 0x80 )
4571             mcnrUpdateTableLevelCnt += mcnrMoveStep;
4572     }
4573     mcnrUpdateTableLevel = mcnrUpdateTableLevelCnt >> 4;
4574 
4575     if ( false == isHDSrc )
4576     {
4577         // Reduce PDNR
4578         if ( mcnrUpdateTableLevel <= 2 )
4579         {
4580             MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x4444 );
4581             MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x4444 );
4582             MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x3333 );
4583             MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x3300 );
4584 
4585             MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x4444 );
4586             MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x4444 );
4587             MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x3333 );
4588             MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x3300 );
4589 
4590             MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x2222 );
4591             MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x1111 );
4592         }
4593         else if ( mcnrUpdateTableLevel <= 6 )
4594         {
4595             MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x6666 );
4596             MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x5555 );
4597             MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x5555 );
4598             MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x4400 );
4599 
4600             MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x6666 );
4601             MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x5555 );
4602             MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x5555 );
4603             MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x4400 );
4604 
4605             MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x3333 );
4606             MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x2211 );
4607         }
4608         else //if ( mcnrUpdateTableLevel <= 10 ) // 6 ~ 10 default
4609         {
4610             MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x8888 );
4611             MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x7777 );
4612             MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x6666 );
4613             MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x6600 );
4614 
4615             MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x8888 );
4616             MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x7777 );
4617             MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x6666 );
4618             MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x6600 );
4619 
4620             MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x4444 );
4621             MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x4432 );
4622         }
4623 
4624         // Increase Chroma NR
4625         if ( mcnrUpdateTableLevel >= 0xC )
4626         {
4627             MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0xCCCC );
4628             MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0xCCCC );
4629             MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0xCCBA );
4630             MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x8640 );
4631         }
4632         else if ( mcnrUpdateTableLevel >= 0xA )
4633         {
4634             MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0xAAAA );
4635             MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0xAAAA );
4636             MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0xA865 );
4637             MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x4320 );
4638         }
4639         else //default
4640         {
4641             MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0x8888 );
4642             MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0x7766 );
4643             MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0x5432 );
4644             MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x0000 );
4645         }
4646     }
4647 
4648     isfilmNotfilm22 = ( filmstatus.filmany || filmstatus.film32 ); // keep film22 as same NR strength
4649     if ( isfilmNotfilm22 )
4650     {
4651         if ( movingBlkMoreThanMV0Blk2 )
4652             isFilmandMotion = 0x10;
4653         else if ( isFilmandMotion != 0 )
4654             isFilmandMotion --;
4655     }
4656     else
4657         isFilmandMotion = 0;
4658 
4659     // patch of increase or reduce MV0moving weight
4660     if ( movingBlkMoreThanMV0Blk1 /*|| motionBigChange2*/ )
4661         movingWeight = ME_MovingWeight_Min;
4662     else if( movingBlkMoreThanMV0Blk2 )
4663     {
4664         if( movingWeight > ME_MovingWeight_Min )
4665             movingWeight--;
4666         else
4667             movingWeight = ME_MovingWeight_Min;
4668     }
4669     else if ( isStill || mcnrUpdateTableLevel >= 0xA )
4670     {
4671         if ( isHDSrc )
4672         {
4673             if( movingWeight < ME_MovingWeight_Max2_HD )
4674                 movingWeight++;
4675             else
4676                 movingWeight = ME_MovingWeight_Max2_HD;
4677         }
4678         else
4679         {
4680             if( movingWeight < ME_MovingWeight_Max2_SD )
4681                 movingWeight++;
4682             else
4683                 movingWeight = ME_MovingWeight_Max2_SD;
4684         }
4685     }
4686     else
4687     {
4688         if ( isHDSrc )
4689         {
4690             if( movingWeight < ME_MovingWeight_Max_HD )
4691                 movingWeight++;
4692             else
4693                 movingWeight = ME_MovingWeight_Max_HD;
4694         }
4695         else
4696         {
4697             if( movingWeight < ME_MovingWeight_Max_SD )
4698                 movingWeight++;
4699             else
4700                 movingWeight = ME_MovingWeight_Max_SD;
4701         }
4702     }
4703 
4704     MApi_XC_W2BYTEMSK(REG_SC_BK17_19_L, ( movingWeight<<8 )  | movingWeight, 0x1F1F);
4705 
4706     // 2. patch mcnr/pdnr motion gain
4707     if ( motionBigChange2 ) // for scene change or film mode moving
4708     {
4709         mcnr_motionGain = MCNR_MOTIONGAIN_MAX2;
4710     }
4711     else if ( motionBigChange ) // reduce MCNR when mv is changing...
4712     {
4713         if( mcnr_motionGain < MCNR_MOTIONGAIN_MAX )
4714             mcnr_motionGain ++;
4715         //else
4716         //  mcnr_motionGain = MCNR_MOTIONGAIN_MAX;
4717     }
4718     else //PDNR default park at min
4719     {
4720         if( mcnr_motionGain > MCNR_MOTIONGAIN_MIN )
4721             mcnr_motionGain --;
4722         else
4723             mcnr_motionGain = MCNR_MOTIONGAIN_MIN;
4724     }
4725 
4726     // reduce PDNR when bigChange, film & motion
4727     if ( motionBigChange2 )
4728     {
4729         pdnr_motionGain = PDNR_MOTIONGAIN_MAX2;
4730     }
4731     else if ( motionBigChange || movingBlkMoreThanMV0Blk2 || isFilmandMotion || mcnrUpdateTableLevel <= 0x4 )
4732     {
4733         if( pdnr_motionGain < PDNR_MOTIONGAIN_MAX )
4734             pdnr_motionGain ++;
4735         else
4736             pdnr_motionGain = PDNR_MOTIONGAIN_MAX;
4737     }
4738     else if ( isStill || mcnrUpdateTableLevel >= 0xA ) // for sony temple tree, only reduce NR when isStill
4739     {
4740         if( pdnr_motionGain > PDNR_MOTIONGAIN_MIN )
4741             pdnr_motionGain --;
4742         else
4743             pdnr_motionGain = PDNR_MOTIONGAIN_MIN;
4744     }
4745     else
4746     {
4747         if( pdnr_motionGain > PDNR_MOTIONGAIN_MIN )
4748             pdnr_motionGain --;
4749         else
4750             pdnr_motionGain = PDNR_MOTIONGAIN_MIN;
4751     }
4752 
4753     MApi_XC_W2BYTEMSK(REG_SC_BK2A_10_L, mcnr_motionGain<<8, 0x0F00);
4754     MApi_XC_W2BYTEMSK(REG_SC_BK2A_15_L, (pdnr_motionGain<<4) | pdnr_motionGain, 0x00FF);
4755 
4756 
4757     // Adjust NR table... strong NR table can reduce Noise
4758     if ( isStill )
4759     {
4760         if ( stillFrameCnt < 0x80 )
4761             stillFrameCnt ++;
4762     }
4763     else if ( motionBigChange || movingBlkMoreThanMV0Blk2 || isFilmandMotion )
4764     {
4765         stillFrameCnt = 0;
4766     }
4767 
4768 }
4769 
4770 
MDrv_SC_MCDi_En_Ctrl(const MS_BOOL disable)4771 void MDrv_SC_MCDi_En_Ctrl( const MS_BOOL disable )
4772 {
4773     if( disable )
4774     {
4775         MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, 0x0000, 0x0080); // disable MCDi
4776         MApi_XC_W2BYTEMSK(REG_SC_BK2A_04_L, 0x0000, 0x0002); // disable MCDi_KFC
4777         MApi_XC_W2BYTEMSK(REG_SC_BK22_10_L, 0x0080, 0x0080); // ensable MADi_DFK
4778         //MApi_XC_W2BYTEMSK(REG_SC_BK22_18_L, 0x0080, 0x0080); // Enable MADi_SST
4779     }
4780     else
4781     {
4782         MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, 0x0080, 0x0080);// enable MCDi
4783         MApi_XC_W2BYTEMSK(REG_SC_BK2A_04_L, 0x0002, 0x0002); // disable MCDi_KFC
4784         MApi_XC_W2BYTEMSK(REG_SC_BK22_10_L, 0x0000, 0x0080); // disable MADi_DFK
4785         //MApi_XC_W2BYTEMSK(REG_SC_BK22_18_L, 0x0000, 0x0080); // disable MADi_SST
4786     }
4787 }
4788 
MDrv_SC_SST_Ctrl(const MS_BOOL disable,const MS_U32 FeatherSum,const MS_BOOL isHDSrc)4789 void MDrv_SC_SST_Ctrl( const MS_BOOL disable, const MS_U32 FeatherSum, const MS_BOOL isHDSrc )
4790 {
4791     static MS_BOOL reg_sst_en = true;
4792     MS_U32 mv0_feather;
4793     mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4794     if( disable ||((FeatherSum > 0x1200)&&(mv0_feather>0x1100)&&(!isHDSrc)&&(SZ_PATTERN_ENABLE ==1))) //Add feathersum for TSB#3 capter4 white noise
4795     {
4796         reg_sst_en = false;
4797     }
4798     else
4799     {
4800         reg_sst_en = true;
4801     }
4802 
4803     MApi_XC_W2BYTEMSK(REG_SC_BK2A_04_L, (MS_U16)(reg_sst_en << 8), 0x0100);
4804 
4805 }
4806 
checkHQVMovingBarPatch(const MS_U8 colorSum)4807 MS_BOOL checkHQVMovingBarPatch( const MS_U8 colorSum )  // special patch for SEC : HQV 2.0 moving white bar, need to reduce history weight
4808 {
4809     MS_BOOL isHQVMovingBarPattern = false;
4810 
4811     if ( // BK17
4812          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF)      ) < 0x4 &&
4813          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8 ) < 0x4 &&
4814          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF)      ) < 0x4 &&
4815          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8 ) < 0x4 &&
4816          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF)      ) < 0x4 &&
4817          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8 ) < 0x4 &&
4818          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF)      ) < 0x4 &&
4819          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8 ) < 0x4 &&
4820          ( MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF)      ) > 0x40 &&
4821          // BK2A
4822          ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_78_L, 0xFFFF)      ) > 0xB00 &&
4823          ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_7B_L, 0xFFFF)      ) < 0x50 &&
4824          ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_7F_L, 0xFFFF)      ) < 0x40 &&
4825          ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_74_L, 0xFFFF)      ) < 0x100 &&
4826          ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_77_L, 0xFFFF)      ) < 0x100 &&
4827          colorSum == 0 )
4828         isHQVMovingBarPattern = true;
4829             return isHQVMovingBarPattern;
4830 }
4831 
4832 #define UCDi_OP1_HisWeight_MaxValue 0x0E    // history weight = 6
4833 #define UCDi_OP1_HisWeight_MinValue 0x04    // history weight = 2
MDrv_SC_UCDi_OP1_HisWeight_Ctrl(const MS_BOOL Bouncing_status,const MS_BOOL Feather_sum_status,const XC_FilmStates filmstatus,const MS_U8 colorSum,const MS_U32 FeatherSum,const MS_BOOL isHDSrc)4834 void MDrv_SC_UCDi_OP1_HisWeight_Ctrl(const MS_BOOL Bouncing_status,const MS_BOOL Feather_sum_status,const XC_FilmStates filmstatus, const MS_U8 colorSum, const MS_U32 FeatherSum, const MS_BOOL isHDSrc)
4835 {
4836     static MS_U32 reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4837     static MS_U32 mv0_feather_prv = 0x0000;
4838     MS_U32 mv0_feather;
4839     MS_U8 u8MotionValue;
4840 
4841     u8MotionValue = MApi_XC_R2BYTE(REG_SC_BK0A_1A_L)& 0x007F;
4842 
4843     mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4844     //Add iir filter
4845     mv0_feather = (mv0_feather_prv*3 + mv0_feather)/4;
4846     mv0_feather_prv = mv0_feather;
4847 
4848     if((u8MotionValue<0x0A) && (SZ_PATTERN_ENABLE ==1))//Add for AV patterns, titles are shaking issue
4849     {
4850         reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4851         //printf("u8MotionValue = %d, SZ_PATTERN_ENABLE = %d\n\n",u8MotionValue, SZ_PATTERN_ENABLE);
4852     }
4853     else if(((FeatherSum > 0x1200)&&(mv0_feather>0x1100)&&(!isHDSrc))&& (SZ_PATTERN_ENABLE ==1)) //Add feathersum for TSB#3 capter4 white noise
4854     {
4855         reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4856         MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0000, 0x0002);
4857         //printf("FeatherSum = %d, mv0_feather = %d\n\n",(int)FeatherSum, (int)mv0_feather);
4858     }
4859     else if( Bouncing_status || Feather_sum_status )
4860     {
4861         reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4862         MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4863         //printf("Bouncing_status = %d, Feather_sum_status = %d\n\n",Bouncing_status, Feather_sum_status);
4864     }
4865 #if SEC_HQV_PATTERN
4866     else if ( checkHQVMovingBarPatch( colorSum ) ) // special patch for SEC : HQV 2.0 moving white bar, need to reduce history weight
4867     {
4868         if( reg_uc_his_weight > 0x8 )
4869             reg_uc_his_weight--;
4870         MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4871         //printf("reg_uc_his_weight = %d\n\n",(int)reg_uc_his_weight);
4872     }
4873 #endif
4874     else
4875     {
4876         MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4877         if( reg_uc_his_weight < UCDi_OP1_HisWeight_MaxValue )
4878             reg_uc_his_weight++;
4879         else
4880             reg_uc_his_weight = UCDi_OP1_HisWeight_MaxValue;
4881         //printf("else reg_uc_his_weight= %d\n\n",(int)reg_uc_his_weight);
4882     }
4883 
4884     if(filmstatus.film_act)
4885     {
4886         reg_uc_his_weight = UCDi_OP1_HisWeight_MaxValue;
4887     }
4888 
4889         //Dummy to control write value, add by Bella 20150708
4890         if((MApi_XC_R2BYTE(REG_SC_BK23_5C_L)&0x000E)!=0x0000)
4891         {
4892             MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, MApi_XC_R2BYTE(REG_SC_BK23_5C_L), 0x000E);
4893          }
4894         else
4895          {
4896         MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, reg_uc_his_weight, 0x000E);
4897          }
4898 
4899 }
4900 
4901 #define SPF_OP1_HisWeight_MaxValue 0x06    // history weight = 6
4902 #define SPF_OP1_HisWeight_MinValue 0x02    // history weight = 2
MDrv_SC_SPF_OP1_HisWeight_Ctrl(const MS_BOOL Bouncing_status)4903 void MDrv_SC_SPF_OP1_HisWeight_Ctrl(const MS_BOOL Bouncing_status)
4904 {
4905     static MS_U32 reg_uc_his_weight = SPF_OP1_HisWeight_MinValue;
4906 
4907     if( Bouncing_status  )
4908     {
4909         reg_uc_his_weight = SPF_OP1_HisWeight_MinValue;
4910 #ifdef DBG_HISW8T_LC
4911         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0007, 0x000F );
4912 #endif
4913     }
4914     else
4915     {
4916         if( reg_uc_his_weight < SPF_OP1_HisWeight_MaxValue )
4917             reg_uc_his_weight++;
4918         else
4919             reg_uc_his_weight = SPF_OP1_HisWeight_MaxValue;
4920 #ifdef DBG_HISW8T_LC
4921         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x000F );
4922 #endif
4923     }
4924 
4925     MApi_XC_W2BYTEMSK(REG_SC_BK09_5C_L, reg_uc_his_weight, 0x0007);
4926 
4927 }
4928 
4929 //
4930 //      MV0 comfirm for such as like "Piano Bar" motionless pattern
4931 //
4932 #define KFCnonHistoryMotionDivideMode_MaxValue 0x02
4933 #define KFCnonHistoryMotionDivideMode_MinValue 0x01
4934 
MDrv_SC_KFC_EODiW_Motionless(void)4935 void MDrv_SC_KFC_EODiW_Motionless(void)
4936 {
4937     MS_U32 mv0Comfirm = 0,  nonMV0Comfirm = 0, mvNotFound = 0, luma = 0;
4938     static MS_U32 prevMV0Comfirm = 0;
4939     static MS_U32 prevNonMV0Comfirm = 0;
4940     static MS_U32 prevMvNotFound = 0;
4941     static MS_U32 prevLuma = 0;
4942     static MS_U32 prevComfirmValue = 0;
4943     MS_U32 comfirmValue = 0;
4944     static MS_U32 prevComfirmValue2 = 0;
4945     MS_U32 comfirmValue2 =0;
4946     static MS_U32 KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MaxValue;
4947 
4948     mv0Comfirm          = MApi_XC_R2BYTE(REG_SC_BK09_78_L);
4949     nonMV0Comfirm     = MApi_XC_R2BYTE(REG_SC_BK09_79_L);
4950     mvNotFound          = MApi_XC_R2BYTE(REG_SC_BK09_7A_L);
4951     luma            = MDrv_Read2Byte(REG_FSC_BK55_1A_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1B_L, 0x000F )<<16); //move to UFSC in Maserati
4952 
4953     mv0Comfirm = (prevMV0Comfirm * 3 + mv0Comfirm) >> 2;
4954     prevMV0Comfirm = mv0Comfirm;
4955 
4956     nonMV0Comfirm = (prevNonMV0Comfirm * 3 + nonMV0Comfirm) >> 2;
4957     prevNonMV0Comfirm = nonMV0Comfirm;
4958 
4959     mvNotFound = (prevMvNotFound * 3 + mvNotFound) >> 2;
4960     prevMvNotFound = mvNotFound;
4961 
4962     luma = (prevLuma * 3 + luma) >> 2;
4963     prevLuma = luma;
4964     //  ==================================================  //
4965     /* mv0 check !! */
4966     if(mv0Comfirm > (mvNotFound * 20) )
4967         comfirmValue = mv0Comfirm - mvNotFound * 20;
4968     else
4969         comfirmValue = 0;
4970 
4971     comfirmValue = (prevComfirmValue * 3 + comfirmValue) >> 2;
4972     prevComfirmValue = comfirmValue;
4973 
4974     //  ==================================================  //
4975     /* Small moving check !! */
4976     if(mv0Comfirm > (nonMV0Comfirm * 1) )
4977         comfirmValue2 = mv0Comfirm - nonMV0Comfirm * 1;
4978     else
4979         comfirmValue2 = 0;
4980 
4981     comfirmValue2 = (prevComfirmValue2 * 3 + comfirmValue2) >> 2;
4982     prevComfirmValue2 = comfirmValue2;
4983 
4984     //  ==================================================  //
4985     if( (comfirmValue > 100) && (comfirmValue2 > 100) && (luma < 0x2000) )
4986     {
4987         //KFCnonHistoryMotionDivideMode = 0x00;
4988         if(KFCnonHistoryMotionDivideMode > KFCnonHistoryMotionDivideMode_MinValue)
4989             KFCnonHistoryMotionDivideMode--;
4990         else
4991             KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MinValue;
4992     }
4993     else
4994     {
4995         if(KFCnonHistoryMotionDivideMode < KFCnonHistoryMotionDivideMode_MaxValue)
4996             KFCnonHistoryMotionDivideMode++;
4997         else
4998             KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MaxValue;
4999     }
5000     /* Main window KFC non-history motion divide mode */
5001     MApi_XC_W2BYTEMSK(REG_SC_BK22_28_L, KFCnonHistoryMotionDivideMode << 4, 0x0030);
5002 }
5003 
MDrv_SC_Edison_VectorNR0(const MS_U16 isFeatherAndMotion,const MS_BOOL isMcFilm,const MS_BOOL isLrLetterBox,const MS_U32 uComplex,const MS_U16 mv0Comfirm,const MS_BOOL isMcOutOfSearchRange)5004 void MDrv_SC_Edison_VectorNR0( const MS_U16 isFeatherAndMotion, const MS_BOOL isMcFilm,
5005                   const MS_BOOL isLrLetterBox, const MS_U32 uComplex, const MS_U16 mv0Comfirm,
5006                   const MS_BOOL isMcOutOfSearchRange )
5007 {
5008     MS_U16 FAM = 0;
5009     static MS_U16 FAM_iir = 0;
5010     static MS_U8 _noFeatherCnt = 0;
5011     MS_BOOL mcnr_vector0 = FALSE;
5012     MS_BOOL isCplx = FALSE;
5013     MS_BOOL isRealMv0 = FALSE;
5014 
5015     isRealMv0 = ( mv0Comfirm > 0x20 ) ? true : false;
5016     isCplx = ( uComplex > 0x1500 ) ? true : false;
5017 
5018     FAM = isFeatherAndMotion;
5019     FAM = ((FAM_iir*3 )+ FAM ) >> 2;
5020     FAM_iir = FAM;
5021 
5022     if( FAM_iir < 5 )
5023     {
5024         if( _noFeatherCnt <= 64)
5025             _noFeatherCnt++;
5026     }
5027     else
5028     {
5029         _noFeatherCnt = 0;
5030     }
5031 
5032     mcnr_vector0 = ( _noFeatherCnt > 50 ) ? true : false;
5033 
5034     if ( ( mcnr_vector0 && isCplx && isRealMv0 ) || isMcFilm || isLrLetterBox || isMcOutOfSearchRange )
5035     {
5036         MApi_XC_W2BYTEMSK(REG_SC_BK17_70_L, 0x0002, 0x0002); /*F2 Force MNR interpolation MV enable*/
5037         MApi_XC_W2BYTEMSK(REG_SC_BK17_72_L, 0x0000, 0x3F3F); /*F2 Force MCNR interpolation YMV/XMV */
5038     }
5039     else/*disable*/
5040     {
5041         MApi_XC_W2BYTEMSK(REG_SC_BK17_70_L, 0x0000, 0x0002); /*F2 Force MNR interpolation MV enable*/
5042         MApi_XC_W2BYTEMSK(REG_SC_BK17_72_L, 0x0000, 0x3F3F); /*F2 Force MCNR interpolation YMV/XMV */
5043     }
5044 }
5045 
5046 #define L139_COLORSUM 0x0A /*CVBS*/
MDrv_SC_Agate_L139(const MS_U32 mvComfirm,const MS_U32 colorSum,const MS_U32 uComplex,const MS_BOOL meStill,const XC_Me1HisStates H2)5047 MS_BOOL MDrv_SC_Agate_L139( const MS_U32 mvComfirm, const MS_U32 colorSum, const MS_U32 uComplex, const MS_BOOL meStill, const  XC_Me1HisStates H2 /*, const MS_BOOL ukoSabihS_en*/ )
5048 {
5049     MS_BOOL me1IsMv0 = 0;
5050     MS_BOOL isL139 = 0;
5051 
5052     if((H2.minMvXdir == 8) && (H2.minMvYdir == 8) &&(H2.minMvXBin > 13) && (H2.minMvYBin > 13))
5053     {
5054         me1IsMv0 = true;
5055     }
5056     else
5057     {
5058         me1IsMv0 = false;
5059     }
5060 
5061     if( (mvComfirm > 95) && (colorSum < L139_COLORSUM)&&(uComplex > 3456) && meStill && me1IsMv0 )
5062     {
5063         isL139 = true;
5064     }
5065     else
5066     {
5067         isL139 = false;
5068     }
5069     //printf("isL139== %d \n\n",isL139);
5070     return isL139;
5071 }
5072 
MDrv_SC_Agate_L107(const MS_U32 mvComfirm,const MS_U32 uComplex,const XC_GMvStates gMv,const MS_U32 u32MotionValue,const MS_U32 total_feather,const MS_U8 inputSource)5073 MS_BOOL MDrv_SC_Agate_L107( const MS_U32 mvComfirm, const MS_U32 uComplex, const XC_GMvStates gMv, const MS_U32 u32MotionValue, const MS_U32 total_feather, const MS_U8 inputSource )
5074 {
5075     MS_BOOL mvComfirmId = FALSE, colorId = FALSE, cplxId = FALSE, motionId = FALSE, featherId = FALSE;
5076     MS_BOOL notFoundMvId = FALSE, foundMvId = FALSE, foundNonMv0Id = FALSE;
5077     MS_BOOL gMvId = FALSE;
5078     MS_BOOL L107 = FALSE;
5079 
5080     MS_U32 notFoundMv = 0;
5081     static MS_U32 notFoundMv_iir = 0;
5082     MS_U32 foundMv0 = 0;
5083     static MS_U32 foundMv0_iir = 0;
5084     MS_U32 foundNonMv0 = 0;
5085     static MS_U32 foundNonMv0_iir = 0;
5086     MS_U32 colorSum = 0;
5087     static MS_U32 colorSum_iir = 0;
5088 
5089     foundMv0 = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5090     foundMv0 = ((foundMv0_iir*3 )+ foundMv0 ) >> 2;
5091     foundMv0_iir = foundMv0;
5092 
5093     foundNonMv0 = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5094     foundNonMv0 = ((foundNonMv0_iir*3 )+ foundNonMv0 ) >> 2;
5095     foundNonMv0_iir = foundNonMv0;
5096 
5097     notFoundMv = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5098     notFoundMv = ((notFoundMv_iir*3 )+ notFoundMv ) >> 2;
5099     notFoundMv_iir = notFoundMv;
5100 
5101     colorSum = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC in Maserati
5102     colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
5103     colorSum_iir = colorSum;
5104 
5105     motionId = (u32MotionValue > 0x2C00) ? true : false;
5106     mvComfirmId = ( mvComfirm < 16 ) ? true : false;
5107     if( inputSource == 1 ) /*CVBS*/
5108         colorId = ( (colorSum > 0x2300) && (colorSum < 0x2B00) ) ? true : false;
5109     else if( inputSource == 2 )
5110         colorId = ( (colorSum > 0x1700) && (colorSum < 0x1B00) ) ? true : false;
5111     else
5112         colorId = false;
5113 
5114     cplxId = ( (uComplex > 0x200) && (uComplex < 0x600) ) ? true : false;
5115     featherId = ( (total_feather < 0x40) && (total_feather > 0x20) ) ? true : false;
5116 
5117     foundMvId =( (foundMv0_iir < 0x90) && (foundMv0_iir > 0x50) ) ? true : false;
5118     foundNonMv0Id =( (foundNonMv0_iir < 0x20) && (foundNonMv0_iir > 0x01) ) ? true : false;
5119     notFoundMvId = ( notFoundMv_iir < 0x2F ) ? true : false;
5120 
5121     if( ( gMv.h1XYsum > 10) && ( gMv.h2XYsum > 10)&&( gMv.h1XYdiff < 5)
5122         && ( gMv.h2XYdiff < 5) &&( gMv.minMvXdir == 0x20) && (gMv.minMvYdir == 8))
5123     {
5124         gMvId = true;
5125     }
5126     else
5127     {
5128         gMvId = false;
5129     }
5130 
5131     if( mvComfirmId && colorId && cplxId && gMvId && motionId && featherId
5132         &&foundMvId && foundNonMv0Id && notFoundMvId )
5133     {
5134         L107 = true;
5135     }
5136     else
5137     {
5138         L107 = false;
5139     }
5140     //printf("isL107 == %d\n\n",L107);
5141     return L107;
5142 }
5143 
MDrv_SC_Agate_L153(const MS_BOOL movingWithoutFeather,const MS_U32 colorSum,const MS_U32 uComplex,const XC_Me1HisStates H2)5144 MS_BOOL MDrv_SC_Agate_L153( const MS_BOOL movingWithoutFeather, const MS_U32 colorSum, const MS_U32 uComplex, const  XC_Me1HisStates H2 )
5145 {
5146     MS_BOOL notXmoving = FALSE;
5147     MS_BOOL YmovingNotFocus = FALSE;
5148     MS_BOOL CplxRange = FALSE;
5149     MS_BOOL withoutColor = FALSE;
5150     MS_BOOL L153 = FALSE;
5151 
5152     if( colorSum < 5 )
5153         withoutColor = true;
5154     else
5155         withoutColor = false;
5156 
5157     if((H2.minMvXdir == 8) && (H2.minMvXBin > 10))
5158         notXmoving = true;
5159     else
5160         notXmoving = false;
5161 
5162     if( H2.minMvYBin < 5)
5163         YmovingNotFocus = true;
5164     else
5165         YmovingNotFocus = false;
5166 
5167     if(( uComplex > 0x200 ) && ( uComplex < 0x300 ))
5168         CplxRange = true;
5169     else
5170         CplxRange = false;
5171 
5172     if(notXmoving && YmovingNotFocus && movingWithoutFeather && withoutColor && CplxRange)
5173     {
5174         L153 = true;
5175         //MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0000, 0x000F);
5176     }
5177     else
5178     {
5179         L153 = false;
5180         //MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0008, 0x000F);
5181     }
5182     //printf("L153 == %d \n\n",L153);
5183     return L153;
5184 }
5185 
MDrv_SC_AbihsotArtifactFeatherPattern(const MS_BOOL Feather_sum_status,const MS_BOOL Feather_sum_status2,const MS_U16 me1IsMv0,const MS_U16 me1IsNonMv0)5186 MS_BOOL MDrv_SC_AbihsotArtifactFeatherPattern(const MS_BOOL Feather_sum_status, const MS_BOOL Feather_sum_status2,
5187                           const MS_U16 me1IsMv0, const MS_U16 me1IsNonMv0 )
5188 {
5189     static MS_BOOL isAbihsot = false;
5190     static MS_BOOL isStill = false;
5191     static MS_BOOL isStillFeather = false;
5192 
5193     isStill = ( me1IsMv0 > me1IsNonMv0*26 ) ? true : false;
5194 
5195     isStillFeather = ( isStill && Feather_sum_status2 ) ? true : false;
5196 
5197     if( Feather_sum_status || isStillFeather )
5198     {
5199         isAbihsot = true;
5200     }
5201     else
5202     {
5203         isAbihsot = false;
5204     }
5205 
5206     return ( isAbihsot );
5207 }
5208 
MDrv_SC_SBlueShirt(const MS_U16 nonMv0Comfirm,const MS_U16 mv0Comfirm,const MS_U16 mvNotFound,const MS_U16 mvNotFoundME2,const MS_U32 uComplex,const XC_Me1HisStates H2,const XC_GMvStates gMv)5209 MS_BOOL MDrv_SC_SBlueShirt(const MS_U16 nonMv0Comfirm, const MS_U16 mv0Comfirm, const MS_U16 mvNotFound ,
5210                const MS_U16 mvNotFoundME2, const MS_U32 uComplex, const  XC_Me1HisStates H2, const XC_GMvStates gMv )
5211 {
5212     MS_BOOL XmovingNotFocus = FALSE;
5213     MS_BOOL Cplx_Range = FALSE;
5214     MS_BOOL is_SBlueWoman = FALSE,isSBlueShirtWoman = FALSE;
5215 
5216     if((gMv.h2XYdiff < 0x10) && (nonMv0Comfirm < 0x55) &&
5217         (mv0Comfirm < 0x40)&& (mvNotFound < 0x100)&& (mvNotFoundME2 > 0x350) )
5218     {
5219         is_SBlueWoman = true;
5220     }
5221     else
5222     {
5223         is_SBlueWoman = false;
5224     }
5225 
5226     if( H2.minMvXBin < 0x15)
5227         XmovingNotFocus = true;
5228     else
5229         XmovingNotFocus = false;
5230 
5231     if(( uComplex > 2000 ) && ( uComplex < 3000 ))
5232         Cplx_Range = true;
5233     else
5234         Cplx_Range = false;
5235 
5236     if(XmovingNotFocus && is_SBlueWoman && Cplx_Range)
5237     {
5238         isSBlueShirtWoman = true;
5239     }
5240     else
5241     {
5242         isSBlueShirtWoman = false;
5243     }
5244 
5245     return isSBlueShirtWoman;
5246 }
5247 
5248 
5249 #define L107_FEATHER_GAIN_MAX 2
5250 #define L107_FEATHER_GAIN_MIN 0
5251 #define L107_CPLX_OFFSET_MAX 6
5252 #define L107_CPLX_OFFSET_MIN 0
5253 #define L107_CPLX_GAIN_MAX 15
5254 #define L107_CPLX_GAIN_MIN 4
MDrv_SC_A5_L107(const MS_U32 IsVerticalMoving,const MS_U32 IsHorizontalMoving,const MS_U32 total_feather,const MS_U32 mvComfirm,const MS_U32 colorSum,const MS_U32 u32MotionValue,const MS_U32 uComplex)5255 MS_BOOL MDrv_SC_A5_L107(const MS_U32 IsVerticalMoving, const MS_U32 IsHorizontalMoving, const MS_U32 total_feather, const MS_U32 mvComfirm, const MS_U32 colorSum,const MS_U32 u32MotionValue, const MS_U32 uComplex )
5256 {
5257     static MS_U32 reg_mcdi_feather_gain = L107_FEATHER_GAIN_MAX ;
5258     static MS_U32 reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MAX ;
5259     static MS_U32 reg_mcdi_cplx_gain = L107_CPLX_GAIN_MIN ;
5260     MS_BOOL bL107_en = FALSE;
5261 
5262     if((IsVerticalMoving < 20) && (IsHorizontalMoving < 200) && (total_feather < 100)
5263         && (mvComfirm > 200) && (colorSum > 200) && (u32MotionValue > 0x3500) && (uComplex < 0x700))
5264     {
5265         bL107_en = TRUE;
5266 
5267         if( reg_mcdi_feather_gain > L107_FEATHER_GAIN_MIN )
5268             reg_mcdi_feather_gain--;
5269         else
5270             reg_mcdi_feather_gain = L107_FEATHER_GAIN_MIN;
5271 
5272         if( reg_mcdi_cplx_offset > L107_CPLX_OFFSET_MIN )
5273             reg_mcdi_cplx_offset--;
5274         else
5275             reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MIN;
5276 
5277         if( reg_mcdi_cplx_gain < L107_CPLX_GAIN_MAX )
5278             reg_mcdi_cplx_gain++;
5279         else
5280             reg_mcdi_cplx_gain = L107_CPLX_GAIN_MAX;
5281     }
5282     else
5283     {
5284         bL107_en = FALSE;
5285 
5286         if( reg_mcdi_feather_gain < L107_FEATHER_GAIN_MAX )
5287             reg_mcdi_feather_gain++;
5288         else
5289             reg_mcdi_feather_gain = L107_FEATHER_GAIN_MAX;
5290 
5291         if( reg_mcdi_cplx_offset < L107_CPLX_OFFSET_MAX )
5292             reg_mcdi_cplx_offset++;
5293         else
5294             reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MAX;
5295 
5296         if( reg_mcdi_cplx_gain > L107_CPLX_GAIN_MIN )
5297             reg_mcdi_cplx_gain--;
5298         else
5299             reg_mcdi_cplx_gain = L107_CPLX_GAIN_MIN;
5300     }
5301     MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, (MS_U16)reg_mcdi_feather_gain<<12, 0xF000); // 2 to 0
5302     MApi_XC_W2BYTEMSK(REG_SC_BK2A_2E_L, (MS_U16)reg_mcdi_cplx_offset<<4, 0x00F0);// 6 to 0
5303     MApi_XC_W2BYTEMSK(REG_SC_BK2A_2E_L, (MS_U16)reg_mcdi_cplx_gain<<8, 0x0F00);// 4 to F
5304 
5305     return bL107_en;
5306 }
5307 
MDrv_SC_Agate_ComplexSum(void)5308 MS_U32 MDrv_SC_Agate_ComplexSum(void)
5309 {
5310     static MS_U32 IsComplex_iir = 0xFFFF;
5311     MS_U32 IsComplex = 0;
5312 
5313     IsComplex = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5314 
5315     IsComplex = (IsComplex_iir*3 + IsComplex ) >> 2;
5316     IsComplex_iir = IsComplex;
5317 
5318     return IsComplex_iir;
5319 }
5320 
MDrv_SC_A5_KFC_IsVerticalMoving(void)5321 MS_U32 MDrv_SC_A5_KFC_IsVerticalMoving( void )
5322 {
5323     MS_U32 u32_mvc = 0, u32_mvu = 0, u32_mvd = 0;
5324     MS_U32 me_vertical = 0;
5325     static MS_U32 IsVerticalMoving_iir = 0;
5326 
5327     u32_mvc     = MApi_XC_R2BYTE(REG_SC_BK2A_7C_L);
5328     u32_mvu     = MApi_XC_R2BYTE(REG_SC_BK2A_7D_L);
5329     u32_mvd     = MApi_XC_R2BYTE(REG_SC_BK2A_7E_L);
5330 
5331     if ((u32_mvu > u32_mvc) && (u32_mvu > u32_mvd))
5332     {
5333         if( u32_mvu > (u32_mvc+u32_mvd)/2 )
5334             me_vertical = (u32_mvu - (u32_mvc+u32_mvd)/2);
5335         else
5336             me_vertical = 0;
5337     }
5338     else if((u32_mvd > u32_mvc) && (u32_mvd > u32_mvu) )
5339     {
5340         if( u32_mvd > (u32_mvc+u32_mvu)/2 )
5341             me_vertical = (u32_mvd - (u32_mvc+u32_mvu)/2);
5342         else
5343             me_vertical = 0;
5344     }
5345     else
5346     {
5347         me_vertical = 0;
5348     }
5349 
5350     if( me_vertical > 255 )
5351         me_vertical = 255;
5352 
5353     me_vertical = (IsVerticalMoving_iir*3 + me_vertical ) >> 2;
5354     IsVerticalMoving_iir = me_vertical;
5355 
5356     _bVerticalMovingForDHD = (((u32_mvu > 0x100) && (u32_mvu > u32_mvd*2) && (u32_mvu > u32_mvc))  //moving up
5357         ||( (u32_mvd > 0x100) && (u32_mvd > u32_mvu*2) && (u32_mvd > u32_mvc))  //moving down
5358         ||( ((u32_mvu + u32_mvd) > 0x100) && ((u32_mvu/8 + u32_mvd/8) > u32_mvc))); // u/d motion is much than mvc
5359 
5360     return me_vertical;
5361 }
5362 
MDrv_SC_A5_ColorPixelSum(void)5363 MS_U32 MDrv_SC_A5_ColorPixelSum(void)
5364 {
5365     MS_U32 colorSum;
5366     static MS_U32 colorSum_iir = 0;
5367 
5368     colorSum  = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC IN Masrati
5369     colorSum  = colorSum / 8;
5370 
5371     if( colorSum > 255 )
5372         colorSum = 255;
5373 
5374     colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
5375     colorSum_iir = colorSum;
5376 
5377     return colorSum_iir;
5378 }
5379 
MDrv_SC_Agate_TotalFeather(void)5380 MS_U32 MDrv_SC_Agate_TotalFeather(void)
5381 {
5382     MS_U32 mv0_feather, nonMv0_feather;
5383     MS_U32 total_feather;
5384     static MS_U32 total_feather_iir = 255;
5385 
5386     mv0_feather      = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5387     nonMv0_feather   = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5388 
5389     total_feather = ( mv0_feather + nonMv0_feather ) / 4;
5390 
5391     if( total_feather > 255 )
5392         total_feather = 255;
5393 
5394     total_feather = ((total_feather_iir*3 )+ total_feather ) >> 2;
5395     total_feather_iir = total_feather;
5396 
5397     return total_feather_iir;
5398 }
5399 
MDrv_SC_TotalFeather_Sum(void)5400 MS_U32 MDrv_SC_TotalFeather_Sum(void)
5401 {
5402     MS_U32 mv0_feather, nonMv0_feather;
5403     MS_U32 total_feather;
5404     static MS_U32 total_feather_iir = 0;
5405 
5406     mv0_feather      = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5407     nonMv0_feather   = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5408 
5409     total_feather =  mv0_feather + nonMv0_feather;
5410 
5411     total_feather = ((total_feather_iir*3 )+ total_feather ) >> 2;
5412     total_feather_iir = total_feather;
5413 
5414     return total_feather_iir;
5415 }
5416 
5417 #define OOSRF_Gain          4
5418 #define OOSRF_Power        2
MDrv_SC_McInSearchRangeUseFeather(void)5419 MS_U32 MDrv_SC_McInSearchRangeUseFeather( void )
5420 {
5421     MS_U32 before_MC_feather = 0, after_MC_feather = 0;
5422     MS_U32 MC_OOSRF = 0;
5423     static MS_U32 Prev_before_MC_feather = 0;
5424     static MS_U32 Prev_after_MC_feather = 0;
5425 
5426     before_MC_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L) ;//mv0_feather
5427     after_MC_feather = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);//nonMv0_feather
5428 
5429     before_MC_feather = (Prev_before_MC_feather*3 + before_MC_feather ) >> 2;
5430     Prev_before_MC_feather = before_MC_feather;
5431 
5432     after_MC_feather = (Prev_after_MC_feather*3 + after_MC_feather ) >> 2;
5433     Prev_after_MC_feather = after_MC_feather;
5434 
5435     if( before_MC_feather > (after_MC_feather*OOSRF_Gain) >> OOSRF_Power  )//mv0_feather >> nonMv0_feather: MCDI is correct, therefore in search range
5436         MC_OOSRF = before_MC_feather - ((after_MC_feather*OOSRF_Gain) >> OOSRF_Power) ;
5437     else
5438         MC_OOSRF = 0;
5439 
5440     return MC_OOSRF;  // "Big": in seach range "Small": out of seach range
5441 }
5442 
5443 #define TOTAL_MV_TIME 10
MDrv_SC_Agate_TotalMvComfirm(void)5444 MS_U32 MDrv_SC_Agate_TotalMvComfirm(void)
5445 {
5446     MS_U32 mv0 = 0, nonMv0 = 0, notFound = 0;
5447     MS_U32 total_mv = 0, mvComfirm = 0;
5448     static MS_U32 mvComfirm_iir = 0;
5449 
5450     mv0      = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5451     nonMv0   = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5452     notFound   = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5453 
5454     total_mv = mv0 + nonMv0;
5455 
5456     if( total_mv > (notFound*TOTAL_MV_TIME))
5457         mvComfirm =   total_mv - notFound*TOTAL_MV_TIME;
5458     else
5459         mvComfirm = 0;
5460 
5461     if( mvComfirm > 255 )
5462         mvComfirm = 255;
5463 
5464     mvComfirm = ((mvComfirm_iir*3 )+ mvComfirm ) >> 2;
5465     mvComfirm_iir = mvComfirm;
5466 
5467     return mvComfirm_iir;
5468 }
5469 
MDrv_SC_Agate_ME1_nonMv0Comfirm(void)5470 MS_U16 MDrv_SC_Agate_ME1_nonMv0Comfirm(void)
5471 {
5472     MS_U16 nonmv0Comfirm = 0;
5473     static MS_U16 nonmv0Comfirm_iir = 0;
5474 
5475     nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5476 
5477     nonmv0Comfirm = ((nonmv0Comfirm_iir*3 )+ nonmv0Comfirm ) >> 2;
5478     nonmv0Comfirm_iir = nonmv0Comfirm;
5479 
5480     return nonmv0Comfirm_iir;
5481 }
5482 
MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR(void)5483 MS_U16 MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR(void)
5484 {
5485     MS_U16 nonmv0Comfirm = 0;
5486 
5487     nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5488     return nonmv0Comfirm;
5489 }
5490 
MDrv_SC_Agate_ME1_mv0Comfirm_noIIR(void)5491 MS_U16 MDrv_SC_Agate_ME1_mv0Comfirm_noIIR(void)
5492 {
5493     MS_U16 mv0Comfirm = 0;
5494 
5495     mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5496     return mv0Comfirm;
5497 }
5498 
MDrv_SC_Agate_ME1_mvNotFound(void)5499 MS_U16 MDrv_SC_Agate_ME1_mvNotFound(void)
5500 {
5501     MS_U16 mvNotFound = 0;
5502     static MS_U16 mvNotFound_iir = 0;
5503 
5504     mvNotFound = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5505 
5506     mvNotFound = ((mvNotFound_iir*3 )+ mvNotFound ) >> 2;
5507     mvNotFound_iir = mvNotFound;
5508 
5509     return mvNotFound_iir;
5510 }
5511 
5512 #if 0
5513 MS_U16 MDrv_SC_Agate_ME1_mvNotFound_noIIR(void)
5514 {
5515     MS_U16 mvNotFound_noIIR = 0;
5516 
5517     mvNotFound_noIIR = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5518 
5519     return mvNotFound_noIIR;
5520 }
5521 #endif
5522 
MDrv_SC_Agate_ME1_mv0Comfirm(void)5523 MS_U16 MDrv_SC_Agate_ME1_mv0Comfirm(void)
5524 {
5525     MS_U16 mv0Comfirm = 0;
5526     static MS_U16 mv0Comfirm_iir = 0;
5527 
5528     mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5529 
5530     mv0Comfirm = ((mv0Comfirm_iir*3 )+ mv0Comfirm ) >> 2;
5531     mv0Comfirm_iir = mv0Comfirm;
5532 
5533     return mv0Comfirm_iir;
5534 }
5535 
MDrv_SC_Agate_ME2_nonMv0Comfirm(void)5536 MS_U16 MDrv_SC_Agate_ME2_nonMv0Comfirm(void)
5537 {
5538     MS_U16 nonmv0Comfirm = 0;
5539     static MS_U16 nonmv0Comfirm_iir = 0;
5540 
5541     nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
5542 
5543     nonmv0Comfirm = ((nonmv0Comfirm_iir*3 )+ nonmv0Comfirm ) >> 2;
5544     nonmv0Comfirm_iir = nonmv0Comfirm;
5545 
5546     return nonmv0Comfirm_iir;
5547 }
5548 
MDrv_SC_Agate_ME2_mv0Comfirm(void)5549 MS_U16 MDrv_SC_Agate_ME2_mv0Comfirm(void)
5550 {
5551     MS_U16 mv0Comfirm = 0;
5552     static MS_U16 mv0Comfirm_iir = 0;
5553 
5554     mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
5555 
5556     mv0Comfirm = ((mv0Comfirm_iir*3 )+ mv0Comfirm ) >> 2;
5557     mv0Comfirm_iir = mv0Comfirm;
5558 
5559     return mv0Comfirm_iir;
5560 }
5561 
MDrv_SC_Agate_ME2_mvNotFound(void)5562 MS_U16 MDrv_SC_Agate_ME2_mvNotFound(void)
5563 {
5564     MS_U16 mvNotFound = 0;
5565     static MS_U16 mvNotFound_iir = 0;
5566 
5567     mvNotFound = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
5568 
5569     mvNotFound = ((mvNotFound_iir*3 )+ mvNotFound ) >> 2;
5570     mvNotFound_iir = mvNotFound;
5571 
5572     return mvNotFound_iir;
5573 }
5574 
MDrv_SC_McOutOfSearchRange(const MS_U16 mvNotFound,const MS_U16 mv0Comfirm,const MS_U16 nonMv0Comfirm,const MS_U16 isFeatherAndMotion,const XC_GMvStates gMv)5575 MS_BOOL MDrv_SC_McOutOfSearchRange( const MS_U16 mvNotFound, const MS_U16 mv0Comfirm, const MS_U16 nonMv0Comfirm, const MS_U16 isFeatherAndMotion, const XC_GMvStates gMv )
5576 {
5577 
5578     MS_BOOL isBigGmvDiff = (( abs(32 - gMv.minMvXdir) > 15 ) || ( abs(8 - gMv.minMvYdir) > 4 ) ) ? true : false;
5579     MS_BOOL  isOutOfSearchRange = 0;
5580     static MS_U8 isCnt = 0;
5581 
5582     int notFound = (int)mvNotFound;
5583     int mv0 = (int) mv0Comfirm;
5584     int nonmv0 = (int) nonMv0Comfirm;
5585 
5586     /* where are nonMv0Comfirm ??? >_< */
5587     isOutOfSearchRange = ( (notFound > ((mv0+nonmv0)*8)) && ( (notFound) > 0x80 ) ) ? true : false;
5588 
5589     if( isOutOfSearchRange && (isFeatherAndMotion > 5) && isBigGmvDiff )
5590     {
5591         if( isCnt < 255 )
5592             isCnt++;
5593     }
5594     else
5595     {
5596         if( isCnt > 0 )
5597             isCnt--;
5598     }
5599 
5600     return ( isCnt > 15 ) ? true : false;
5601 }
5602 
5603 /*Added for VG846 Sparse Pattern to avoid forcing MCDi function */
MDrv_SC_ukoSabihS_SparsePattern(const MS_U16 mvNotFound,const MS_U16 mvNotFoundME2,const MS_U16 mv0Comfirm,const MS_U16 nonMv0Comfirm,const MS_U16 mv0ComfirmME2,const MS_U16 nonMv0ComfirmME2,const MS_BOOL isHDSrc)5604 MS_BOOL MDrv_SC_ukoSabihS_SparsePattern( const MS_U16 mvNotFound, const MS_U16 mvNotFoundME2, const MS_U16 mv0Comfirm, const MS_U16 nonMv0Comfirm, const MS_U16 mv0ComfirmME2, const MS_U16 nonMv0ComfirmME2, const MS_BOOL isHDSrc )
5605 {
5606 
5607     MS_BOOL  isSparse = 0;
5608 
5609     int notFound = (int)mvNotFound;
5610     int notFoundME2 = (int)mvNotFoundME2;
5611     int MVConfirm = (int) mv0Comfirm;
5612     int MVConfirmME2 = (int) mv0ComfirmME2;
5613     int nonmv0 = (int) nonMv0Comfirm;
5614     int nonmv0ME2 = (int) nonMv0ComfirmME2;
5615     int notFoundTH = 0;
5616     int notFoundME2TH = 0;
5617 
5618     /*if(isHDSrc)
5619     {
5620         isSparse = ( notFound > 0x200 ) && ( notFoundME2 > 0xF00 ) ? true : false;
5621     }
5622     else
5623     {
5624         isSparse = ( notFound > 0x40 ) && ( notFoundME2 > 0x800 ) ? true : false;
5625     }*/
5626 
5627     if(isHDSrc)
5628     {
5629          notFoundTH = (0x200* normalize_factor)/256;
5630      notFoundME2TH = (0xF00* normalize_factor)/256;
5631     }
5632     else
5633     {
5634        notFoundTH = (0x40* normalize_factor)/256;
5635        notFoundME2TH = (0x800* normalize_factor)/256;
5636     }
5637     isSparse = ( notFound > notFoundTH ) && ( notFoundME2 > notFoundME2TH ) ? true : false;
5638 
5639     if (isSparse && (notFound >(MVConfirm+nonmv0))&& (notFoundME2 >(MVConfirmME2+nonmv0ME2)))
5640     {
5641             return true;
5642     }
5643     else
5644     {
5645             return false;
5646      }
5647 
5648 }
5649 
5650 
MDrv_SC_Agate_FeatherAndMotion(void)5651 MS_U16 MDrv_SC_Agate_FeatherAndMotion(void)
5652 {
5653     MS_U16 FAM = 0;
5654     FAM = MApi_XC_R2BYTE(REG_SC_BK2A_7F_L); //feather and motion pixels
5655     return FAM;
5656 }
5657 
MDrv_SC_ukoSabihS_HBurstMoving(const MS_U32 _hpfSdCntReport)5658 MS_BOOL MDrv_SC_ukoSabihS_HBurstMoving( const MS_U32 _hpfSdCntReport )
5659 {
5660     MS_U32 mv0_feather = 0;
5661     MS_BOOL isHBurst_act = FALSE;
5662     static MS_U8 u8HBurstConfirmCnt = 0;
5663 
5664     mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5665 
5666     isHBurst_act = ( ((mv0_feather) > (_hpfSdCntReport*100)) && ( _hpfSdCntReport < 0x10 ) ) ? true : false;
5667 
5668     if(isHBurst_act)
5669     {
5670         if(u8HBurstConfirmCnt <= 0x20)
5671         {
5672             u8HBurstConfirmCnt++;
5673         }
5674     }
5675     else
5676     {
5677         u8HBurstConfirmCnt = 0;
5678     }
5679 
5680     if(u8HBurstConfirmCnt > 10)
5681     {
5682         return true;
5683     }
5684     else
5685     {
5686         return false;
5687     }
5688 }
5689 
MDrv_SC_ukoSabihS_ArtifactPattern(const MS_U32 _hpfHdTolerantReport,const MS_BOOL isHDSrc)5690 MS_BOOL MDrv_SC_ukoSabihS_ArtifactPattern( const MS_U32 _hpfHdTolerantReport,const MS_BOOL isHDSrc )
5691 {
5692     MS_BOOL isArtifactPattern_act = 0;
5693     static MS_U8 u8ArtifactPatternConfirmCnt = 0;
5694 
5695     if(isHDSrc)
5696     {
5697         isArtifactPattern_act = ( _hpfHdTolerantReport > 0x18000 ) ? true : false;
5698     }
5699     else
5700     {
5701         isArtifactPattern_act = ( _hpfHdTolerantReport > 0x4000 ) ? true : false;
5702     }
5703 
5704     if(isArtifactPattern_act)
5705     {
5706         if(u8ArtifactPatternConfirmCnt < 20)
5707         {
5708             u8ArtifactPatternConfirmCnt++;
5709         }
5710     }
5711     else
5712     {
5713         if(u8ArtifactPatternConfirmCnt > 0)
5714         {
5715             u8ArtifactPatternConfirmCnt--;
5716         }
5717     }
5718 
5719     if(u8ArtifactPatternConfirmCnt > 10)
5720     {
5721         return true;
5722     }
5723     else
5724     {
5725         return false;
5726     }
5727 
5728     //return isHBurstMoving;
5729 }
5730 
MDrv_SC_ukoSabihS_noLumaCplx(void)5731 MS_BOOL MDrv_SC_ukoSabihS_noLumaCplx( void )
5732 {
5733     MS_U8 reg_main_max_pixel_sat = 0;
5734     MS_U8 reg_main_min_pixel_sat = 0;
5735 
5736     MS_U16 reg_feather_and_motion_pixel = 0;
5737 
5738     static MS_U8 confirmCnt = 0;
5739 
5740     reg_main_max_pixel_sat = (MS_U8)( MDrv_Read2Byte(REG_FSC_BK1A_61_L) & 0x00FF ); //Move to UFSC in Maserati
5741     reg_main_min_pixel_sat = (MS_U8)( MDrv_Read2Byte(REG_FSC_BK1A_61_L) & 0xFF00 ) >> 8; //Move to UFSC in Maserati
5742     reg_feather_and_motion_pixel = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5743 
5744     if( ( reg_main_min_pixel_sat == 0 ) &&
5745         ( reg_main_max_pixel_sat == 0 ) &&
5746         ( reg_feather_and_motion_pixel > 0x5000 ) )
5747     {
5748         if( confirmCnt < 30 )
5749             confirmCnt++;
5750     }
5751     else
5752         confirmCnt = 0;
5753 
5754     return ( confirmCnt > 20 );
5755 }
5756 
MDrv_SC_ukoSabihS_HBurst(const MS_U32 _hpfSdCntReport,const MS_U32 uComplex)5757 MS_BOOL MDrv_SC_ukoSabihS_HBurst( const MS_U32 _hpfSdCntReport, const MS_U32 uComplex )
5758 {
5759     MS_BOOL isHBurst = FALSE;
5760 
5761     isHBurst = ( ((uComplex) > (_hpfSdCntReport*100)) && ( _hpfSdCntReport < 0x10 ) ) ? true : false;
5762 
5763     return isHBurst;
5764 }
5765 
MDrv_SC_Agate_ME1Still(void)5766 MS_BOOL MDrv_SC_Agate_ME1Still(void)
5767 {
5768     MS_U32 mv0 = 0, nonMv0 = 0;
5769     MS_BOOL isStill = FALSE;
5770 
5771     static MS_U32 mv0_iir = 0;
5772     static MS_U32 nonMv0_iir = 0;
5773 
5774     mv0      = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5775     nonMv0   = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5776 
5777     if( mv0_iir > (nonMv0_iir*6) )
5778         isStill = true;
5779     else
5780         isStill = false;
5781 
5782     mv0 = ((mv0_iir*3 )+ mv0 ) >> 2;
5783     mv0_iir = mv0;
5784 
5785     nonMv0 = ((nonMv0_iir*3 )+ nonMv0 ) >> 2;
5786     nonMv0_iir = nonMv0;
5787 
5788     return isStill;
5789 }
5790 
MDrv_SC_Agate_MovingWithoutFeather(void)5791 MS_BOOL MDrv_SC_Agate_MovingWithoutFeather(void)
5792 {
5793     MS_U32 mv0_feather = 0, nonMv0_feather = 0;
5794     MS_BOOL isMovingWithoutFeather = FALSE;
5795 
5796     static MS_U32 mv0_feather_iir = 0;
5797     static MS_U32 nonMv0_feather_iir = 0;
5798 
5799     mv0_feather      = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5800     nonMv0_feather   = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5801 
5802     if( mv0_feather_iir > (nonMv0_feather_iir*60) )
5803         isMovingWithoutFeather = true;
5804     else
5805         isMovingWithoutFeather = false;
5806 
5807     mv0_feather = ((mv0_feather_iir*3 )+ mv0_feather ) >> 2;
5808     mv0_feather_iir = mv0_feather;
5809 
5810     nonMv0_feather = ((nonMv0_feather_iir*3 )+ nonMv0_feather ) >> 2;
5811     nonMv0_feather_iir = nonMv0_feather;
5812 
5813     return isMovingWithoutFeather;
5814 }
5815 
5816 /******************************************************************************/
5817 ///Extend MCNR Driver
5818 /******************************************************************************/
MDrv_SC_Extend_UCNR_driver(void)5819 void MDrv_SC_Extend_UCNR_driver(void)
5820 {
5821     MS_U32 u32_is_mv0 = 0, u32_non_mv0 = 0, u32_mvNotFound = 0, u32_mvc = 0, u32_mvu = 0, u32_mvd = 0;
5822     MS_BOOL me_not_confirm = FALSE, me_vertical = FALSE, still_pattern = FALSE;
5823     static MS_U8 u8notConfirmCnt;
5824 //  static MS_U32 last_u32_mvNotFound;
5825 
5826     u32_is_mv0  = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5827     u32_non_mv0 = MApi_XC_R2BYTE(REG_SC_BK2A_79_L);
5828     u32_mvNotFound = MApi_XC_R2BYTE(REG_SC_BK2A_7A_L);
5829     u32_mvc     = MApi_XC_R2BYTE(REG_SC_BK2A_7C_L);
5830     u32_mvu     = MApi_XC_R2BYTE(REG_SC_BK2A_7D_L);
5831     u32_mvd     = MApi_XC_R2BYTE(REG_SC_BK2A_7E_L);
5832 
5833     /////////////////////////////////////////////////////////////////
5834     //  NR Patch 1
5835     /////////////////////////////////////////////////////////////////
5836 
5837     me_not_confirm = (u32_is_mv0 < 0x0200) && (u32_non_mv0 < 0x0200) ;
5838     me_vertical    = ((u32_mvu > u32_mvc) && (u32_mvu > u32_mvd) && (u32_mvu > 0x200))
5839         ||((u32_mvd > u32_mvc) && (u32_mvd > u32_mvu) && (u32_mvd > 0x200));
5840 
5841     still_pattern = (u32_is_mv0 < 0x0020) && (u32_non_mv0 < 0x0020) && (u32_mvNotFound < 0x0020);
5842 
5843     if(!still_pattern)
5844     {
5845         if(false == me_not_confirm)
5846         {
5847             if(u8notConfirmCnt > 0)
5848             {
5849                 u8notConfirmCnt--;
5850             }
5851         }
5852         else
5853         {
5854             if(u8notConfirmCnt <= 0x40)
5855             {
5856                 u8notConfirmCnt++;
5857             }
5858         }
5859     }
5860 
5861     if ( (u8notConfirmCnt > 0x30)|| me_vertical ) // low nr strength
5862     {
5863         MApi_XC_W2BYTEMSK(REG_SC_BK2A_08_L, (MS_U16)0xAAAA, 0xFFFF);
5864         MApi_XC_W2BYTEMSK(REG_SC_BK2A_09_L, (MS_U16)0xAAAA, 0xFFFF);
5865         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0A_L, (MS_U16)0xAAAA, 0xFFFF);
5866         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0B_L, (MS_U16)0xAAAA, 0xFFFF);
5867         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0C_L, (MS_U16)0xAAAA, 0xFFFF);
5868         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0D_L, (MS_U16)0xAA98, 0xFFFF);
5869         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0E_L, (MS_U16)0x7654, 0xFFFF);
5870         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0F_L, (MS_U16)0x3210, 0xFFFF);
5871         MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0064, 0x00FF); // moving picture, increase random motion
5872     }
5873     else
5874     {
5875         MApi_XC_W2BYTEMSK(REG_SC_BK2A_08_L, (MS_U16)0xAAAA, 0xFFFF);
5876         MApi_XC_W2BYTEMSK(REG_SC_BK2A_09_L, (MS_U16)0xAAAA, 0xFFFF);
5877         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0A_L, (MS_U16)0xAAAA, 0xFFFF);
5878         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0B_L, (MS_U16)0xAAAA, 0xFFFF);
5879         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0C_L, (MS_U16)0xAAAA, 0xFFFF);
5880         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0D_L, (MS_U16)0xAA98, 0xFFFF);
5881         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0E_L, (MS_U16)0x7654, 0xFFFF);
5882         MApi_XC_W2BYTEMSK(REG_SC_BK2A_0F_L, (MS_U16)0x3210, 0xFFFF);
5883     }
5884 
5885     if ( (u32_is_mv0 > 0x200) && ((u32_is_mv0/2) > u32_non_mv0) && ((u32_is_mv0/2) > u32_mvNotFound) )
5886     {
5887         MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // still picture, reduce random motion
5888     }
5889     else if(u32_non_mv0 > u32_is_mv0)
5890     {
5891         MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // moving picture, increase random motion
5892     }
5893     else
5894     {
5895         MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // default random motion
5896     }
5897 
5898     //last_u32_mvNotFound = u32_mvNotFound;
5899 }
5900 
5901 /******************************************************************************/
5902 ///Noise Estimation Driver
5903 /******************************************************************************/
MDrv_SC_GetNoiseLevel(MS_U8 * estNoise,const XC_LetterBoxState * letterBoxState,const XC_ApiStatus * stXCStatus,const MS_BOOL bInterlace,const MS_BOOL isOpFrameChanged)5904 MS_U8 MDrv_SC_GetNoiseLevel( MS_U8 *estNoise, const XC_LetterBoxState *letterBoxState, const XC_ApiStatus *stXCStatus, const MS_BOOL bInterlace, const MS_BOOL isOpFrameChanged )
5905 {
5906     const int defaultnoise = 35;
5907     static int noiseIIR = 35;
5908     static int noisehistory[5] = {0,0,0,0,0};
5909     static MS_BOOL long_noisehistory[11] = {0,0,0,0,0,0,0,0,0,0,0};
5910     static int safenoise = 0;
5911     static int resetcount = 0;
5912     MS_U8 reg_noise_confirm_level = 2;
5913     static MS_BOOL is_ne_set = false;
5914 
5915     int avgpixeldiff = defaultnoise;
5916     int NE_histogram[25];
5917     int MV0count = 0;
5918 
5919     if( isOpFrameChanged )
5920     {
5921         MS_U16 height = bInterlace ? stXCStatus->ScaledCropWin.height/2 : stXCStatus->ScaledCropWin.height;
5922         MS_U16 width = stXCStatus->ScaledCropWin.width;
5923 
5924         MS_U16 hSt = (letterBoxState->lbCntL + 49 )/ 10;
5925         MS_U16 hEnd = ( __max( width - letterBoxState->lbCntR - 50, 0 ) ) / 10;
5926 
5927         MS_U16 vSt = (letterBoxState->lbCntT + 29 )/ 6;
5928         MS_U16 vEnd = ( __max( height - letterBoxState->lbCntB - 30, 0 ) ) / 6;
5929 
5930         MApi_XC_W2BYTE(REG_SC_BK39_0E_L, (hEnd << 8) | hSt );
5931         MApi_XC_W2BYTE(REG_SC_BK39_0F_L, (vEnd << 8) | vSt );
5932 
5933         MS_U16 total_block_num=__max((vEnd+1)/4-(vSt+3)/4,0)*__max((hEnd+1)/4-(hSt+3)/4,0);
5934 
5935 
5936         if( !is_ne_set )
5937         {
5938             MApi_XC_W2BYTEMSK(REG_SC_BK39_08_L, 0x0001, 0x0001);
5939             is_ne_set = true;
5940 
5941             MApi_XC_W2BYTEMSK(REG_SC_BK39_0A_L, 0x0000, 0x0100);
5942             MApi_XC_W2BYTEMSK(REG_SC_BK39_0D_L, 0x0001, 0x0001); // active window en
5943         }
5944         else if (MApi_XC_R2BYTEMSK(REG_SC_BK39_08_L, 0x0080)!=0)//ready
5945         {
5946             NE_histogram[0]=MApi_XC_R2BYTEMSK(REG_SC_BK39_10_L,0x07FF);
5947             NE_histogram[1]=MApi_XC_R2BYTEMSK(REG_SC_BK39_11_L,0x07FF);
5948             NE_histogram[2]=MApi_XC_R2BYTEMSK(REG_SC_BK39_12_L,0x07FF);
5949             NE_histogram[3]=MApi_XC_R2BYTEMSK(REG_SC_BK39_13_L,0x07FF);
5950             NE_histogram[4]=MApi_XC_R2BYTEMSK(REG_SC_BK39_14_L,0x07FF);
5951             NE_histogram[5]=MApi_XC_R2BYTEMSK(REG_SC_BK39_15_L,0x07FF);
5952             NE_histogram[6]=MApi_XC_R2BYTEMSK(REG_SC_BK39_16_L,0x07FF);
5953             NE_histogram[7]=MApi_XC_R2BYTEMSK(REG_SC_BK39_17_L,0x07FF);
5954             NE_histogram[8]=MApi_XC_R2BYTEMSK(REG_SC_BK39_18_L,0x07FF);
5955             NE_histogram[9]=MApi_XC_R2BYTEMSK(REG_SC_BK39_19_L,0x07FF);
5956             NE_histogram[10]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1A_L,0x07FF);
5957             NE_histogram[11]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1B_L,0x07FF);
5958             NE_histogram[12]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1C_L,0x07FF);
5959             NE_histogram[13]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1D_L,0x07FF);
5960             NE_histogram[14]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1E_L,0x07FF);
5961             NE_histogram[15]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1F_L,0x07FF);
5962             NE_histogram[16]=MApi_XC_R2BYTEMSK(REG_SC_BK39_20_L,0x07FF);
5963             NE_histogram[17]=MApi_XC_R2BYTEMSK(REG_SC_BK39_21_L,0x07FF);
5964             NE_histogram[18]=MApi_XC_R2BYTEMSK(REG_SC_BK39_22_L,0x07FF);
5965             NE_histogram[19]=MApi_XC_R2BYTEMSK(REG_SC_BK39_23_L,0x07FF);
5966             NE_histogram[20]=MApi_XC_R2BYTEMSK(REG_SC_BK39_24_L,0x07FF);
5967             NE_histogram[21]=MApi_XC_R2BYTEMSK(REG_SC_BK39_25_L,0x07FF);
5968             NE_histogram[22]=MApi_XC_R2BYTEMSK(REG_SC_BK39_26_L,0x07FF);
5969             NE_histogram[23]=MApi_XC_R2BYTEMSK(REG_SC_BK39_27_L,0x07FF);
5970             NE_histogram[24]=MApi_XC_R2BYTEMSK(REG_SC_BK39_28_L,0x07FF);
5971 
5972             int i;
5973             for (i = 4; i > 0; i-- )
5974                 noisehistory[i]=noisehistory[i-1];
5975             for (i = 10; i > 0; i-- )
5976                 long_noisehistory[i]=long_noisehistory[i-1];
5977             for (i=0;i<25;i++)
5978                 MV0count+=NE_histogram[i];
5979             if (MV0count<total_block_num/12 || total_block_num<24)
5980             {
5981                 if (safenoise>0)
5982                 {
5983                     avgpixeldiff=safenoise;
5984                     resetcount++;
5985                     reg_noise_confirm_level=8;
5986                 }
5987                 else
5988                 {
5989                     avgpixeldiff=noiseIIR;
5990                     reg_noise_confirm_level=0;
5991                 }
5992                 noisehistory[0]=0;
5993                 long_noisehistory[0]=0;
5994             }
5995             else
5996             {
5997                 int maxhis=1;
5998                 int maxval=0;
5999                 for (i=0;i<24;i++)
6000                 {
6001                     int curva;
6002                     if (i==0)
6003                         curva=2*NE_histogram[i]+NE_histogram[i+1];
6004                     else if (i==23)
6005                         curva=2*NE_histogram[i]+NE_histogram[i-1];
6006                     else
6007                         curva=NE_histogram[i-1]+2*NE_histogram[i]+NE_histogram[i+1];
6008 
6009                     if (curva>maxval)
6010                     {
6011                         maxval=curva;
6012                         maxhis=i;
6013                     }
6014                 }
6015                 int thre1=4;
6016                 int thre2=13;
6017                 if (maxhis>12)
6018                 {
6019                     thre1=3;
6020                     thre2=10;
6021                 }
6022                 if ((maxval>total_block_num/10 && (maxval-NE_histogram[maxhis])*10/MV0count>=thre1 && NE_histogram[maxhis] * 100 / MV0count>thre2))// || MV0count<total_block_num/24)
6023                 {
6024                     noisehistory[0]=10*maxhis+5;
6025                     long_noisehistory[0]=1;
6026                     int nonzerocount=0;
6027                     int historytotal=0;
6028                     int firstnoise=0;
6029                     int long_nonzerocount=0;
6030                     for ( i=0;i<5;i++)
6031                     {
6032                         historytotal=historytotal+noisehistory[i];
6033                         if (noisehistory[i]>0)
6034                         {
6035                             nonzerocount++;
6036                             firstnoise=noisehistory[i];
6037                         }
6038                     }
6039                     for ( i=0;i<11;i++)
6040                         long_nonzerocount+=long_noisehistory[i];
6041                     if (nonzerocount>=3 && (maxhis<=3 || long_nonzerocount>=7))
6042                     {
6043                         int removefirstavg=(historytotal-firstnoise)/(nonzerocount-1);
6044                         if ((removefirstavg+20)<firstnoise)
6045                             safenoise=removefirstavg;
6046                         else
6047                             safenoise=historytotal/nonzerocount;
6048                         resetcount=0;
6049                         avgpixeldiff=noisehistory[0];
6050                         reg_noise_confirm_level=8;
6051                     }
6052                     else if (safenoise>0)
6053                     {
6054                         avgpixeldiff=safenoise;
6055                         resetcount++;
6056                         reg_noise_confirm_level=8;
6057                     }
6058                     else
6059                     {
6060                         avgpixeldiff=noisehistory[0];
6061                         reg_noise_confirm_level=1;
6062                     }
6063                 }
6064                 else
6065                 {
6066                     noisehistory[0]=0;
6067                     long_noisehistory[0]=0;
6068                     if (safenoise>0)
6069                     {
6070                         avgpixeldiff=safenoise;
6071                         resetcount++;
6072                         reg_noise_confirm_level=8;
6073                     }
6074                     else
6075                     {
6076                         avgpixeldiff=10*maxhis+5;
6077                         reg_noise_confirm_level=1;
6078                     }
6079                 }
6080             }
6081             if (resetcount>8)
6082             {
6083                 safenoise=0;
6084                 resetcount=0;
6085             }
6086             int tmpcount=0;
6087             int prenoise=0;
6088             for ( i = 0; i < 5; i++ )
6089             {
6090                 if (noisehistory[i]<250 && noisehistory[i]>0)
6091                 {
6092                     tmpcount++;
6093                     prenoise=prenoise+noisehistory[i];
6094                 }
6095             }
6096             if (tmpcount>0)
6097                 prenoise=prenoise/tmpcount;
6098             int reg_ne_mv0cost_th =2*prenoise/10;
6099             reg_ne_mv0cost_th = reg_ne_mv0cost_th > 3 ? reg_ne_mv0cost_th : 3;
6100             if (tmpcount==0)
6101                 reg_ne_mv0cost_th =60;
6102             MApi_XC_W2BYTEMSK(REG_SC_BK39_0A_L, reg_ne_mv0cost_th, 0x003F);
6103 
6104             if (reg_noise_confirm_level==8)
6105                 noiseIIR = (noiseIIR*3+avgpixeldiff) >> 2;
6106 
6107             MApi_XC_W2BYTEMSK(REG_SC_BK39_08_L, 0x0001, 0x0001);
6108             is_ne_set = true;
6109         }
6110     }
6111 
6112     *estNoise = (MS_U8)( noiseIIR <= 255 ? noiseIIR : 255 );
6113 
6114     return reg_noise_confirm_level;
6115 }
6116 
6117 /******************************************************************************/
6118 ///UCNR Driver
6119 /******************************************************************************/
Hal_PQ_LoadMCNRLutQmapSetting()6120 MS_BOOL Hal_PQ_LoadMCNRLutQmapSetting()
6121 {
6122     //UCNR LUT
6123 #if MCNR_LUT_LOAD_FROM_QMAP
6124     m_stMCNRLutQmapSetting.mcnrLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_08_L);
6125     m_stMCNRLutQmapSetting.mcnrLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_09_L);
6126     m_stMCNRLutQmapSetting.mcnrLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_0A_L);
6127     m_stMCNRLutQmapSetting.mcnrLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_0B_L);
6128     m_stMCNRLutQmapSetting.mcnrLut[4] = MApi_XC_R2BYTE(REG_SC_BK2A_0C_L);
6129     m_stMCNRLutQmapSetting.mcnrLut[5] = MApi_XC_R2BYTE(REG_SC_BK2A_0D_L);
6130     m_stMCNRLutQmapSetting.mcnrLut[6] = MApi_XC_R2BYTE(REG_SC_BK2A_0E_L);
6131     m_stMCNRLutQmapSetting.mcnrLut[7] = MApi_XC_R2BYTE(REG_SC_BK2A_0F_L);
6132 #else
6133     m_stMCNRLutQmapSetting.mcnrLut[0] = 0xFFEE;
6134     m_stMCNRLutQmapSetting.mcnrLut[1] = 0xDDCC;
6135     m_stMCNRLutQmapSetting.mcnrLut[2] = 0xBBAA;
6136     m_stMCNRLutQmapSetting.mcnrLut[3] = 0x9988;
6137     m_stMCNRLutQmapSetting.mcnrLut[4] = 0x7766;
6138     m_stMCNRLutQmapSetting.mcnrLut[5] = 0x5544;
6139     m_stMCNRLutQmapSetting.mcnrLut[6] = 0x3322;
6140     m_stMCNRLutQmapSetting.mcnrLut[7] = 0x1100;
6141 #endif
6142 
6143     //PDNR LUT
6144 #if PDNR_LUT_LOAD_FROM_QMAP
6145     m_stMCNRLutQmapSetting.pdnrlowLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_1C_L);
6146     m_stMCNRLutQmapSetting.pdnrlowLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_1D_L);
6147     m_stMCNRLutQmapSetting.pdnrlowLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_1E_L);
6148     m_stMCNRLutQmapSetting.pdnrlowLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_1F_L);
6149     m_stMCNRLutQmapSetting.pdnrlow2Lut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_20_L);
6150     m_stMCNRLutQmapSetting.pdnrlow2Lut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_21_L);
6151     m_stMCNRLutQmapSetting.pdnrlow2Lut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_22_L);
6152     m_stMCNRLutQmapSetting.pdnrlow2Lut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_23_L);
6153     m_stMCNRLutQmapSetting.pdnrhighLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_24_L);
6154     m_stMCNRLutQmapSetting.pdnrhighLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_25_L);
6155     m_stMCNRLutQmapSetting.pdnrhighLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_26_L);
6156     m_stMCNRLutQmapSetting.pdnrhighLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_27_L);
6157 #else
6158     m_stMCNRLutQmapSetting.pdnrlowLut[0] = 0x8888;
6159     m_stMCNRLutQmapSetting.pdnrlowLut[1] = 0x8888;
6160     m_stMCNRLutQmapSetting.pdnrlowLut[2] = 0x7654;
6161     m_stMCNRLutQmapSetting.pdnrlowLut[3] = 0x3210;
6162     m_stMCNRLutQmapSetting.pdnrlow2Lut[0] = 0x2100;
6163     m_stMCNRLutQmapSetting.pdnrlow2Lut[1] = 0x0000;
6164     m_stMCNRLutQmapSetting.pdnrlow2Lut[2] = 0x0000;
6165     m_stMCNRLutQmapSetting.pdnrlow2Lut[3] = 0x0000;
6166     if(_bIsHDSource)
6167     {
6168         m_stMCNRLutQmapSetting.pdnrhighLut[0] = 0x8888;
6169         m_stMCNRLutQmapSetting.pdnrhighLut[1] = 0x8888;
6170         m_stMCNRLutQmapSetting.pdnrhighLut[2] = 0x8887;
6171         m_stMCNRLutQmapSetting.pdnrhighLut[3] = 0x6420;
6172     }
6173     else
6174     {
6175         m_stMCNRLutQmapSetting.pdnrhighLut[0] = 0x8876;
6176         m_stMCNRLutQmapSetting.pdnrhighLut[1] = 0x5432;
6177         m_stMCNRLutQmapSetting.pdnrhighLut[2] = 0x1000;
6178         m_stMCNRLutQmapSetting.pdnrhighLut[3] = 0x0000;
6179     }
6180 #endif
6181 
6182     return true;
6183 }
6184 
MDrv_SC_NR_LUT_Aux(MS_U16 nr_lut,MS_U8 sc)6185 MS_U16 MDrv_SC_NR_LUT_Aux( MS_U16 nr_lut, MS_U8 sc)
6186 {
6187     sc = sc < 16 ? sc : 16;
6188 
6189     MS_U8 h0 = (nr_lut >>  0) & 0xF;
6190     MS_U8 h1 = (nr_lut >>  4) & 0xF;
6191     MS_U8 h2 = (nr_lut >>  8) & 0xF;
6192     MS_U8 h3 = (nr_lut >> 12) & 0xF;
6193 
6194     XC_ApiStatus DrvStatus = {0};
6195     MApi_XC_GetStatus(&DrvStatus, MAIN_WINDOW);
6196     if ((!DrvStatus.bInterlace) && (DrvStatus.u16InputVFreq < 300)) //reduce gain value if 24p
6197     {
6198         h0 = ((h0 * sc)/3) >> 4;
6199         h1 = ((h1 * sc)/3) >> 4;
6200         h2 = ((h2 * sc)/3) >> 4;
6201         h3 = ((h3 * sc)/3) >> 4;
6202     }
6203     else
6204     {
6205         h0 = (h0 * sc) >> 4;
6206         h1 = (h1 * sc) >> 4;
6207         h2 = (h2 * sc) >> 4;
6208         h3 = (h3 * sc) >> 4;
6209     }
6210 
6211     return (h3 << 12) | (h2 << 8) | (h1 << 4) | (h0 << 0);
6212 }
6213 
MDrv_SC_NR_LUT_Offset_Aux(MS_U16 nr_lut,MS_U8 sc)6214 MS_U16 MDrv_SC_NR_LUT_Offset_Aux( MS_U16 nr_lut, MS_U8 sc)
6215 {
6216     sc = sc < 0xF ? sc : 0xF;
6217 
6218     MS_U8 h0 = (nr_lut >>  0) & 0xF;
6219     MS_U8 h1 = (nr_lut >>  4) & 0xF;
6220     MS_U8 h2 = (nr_lut >>  8) & 0xF;
6221     MS_U8 h3 = (nr_lut >> 12) & 0xF;
6222 
6223     h0 = (h0 > sc) ? h0 - sc : 0;
6224     h1 = (h1 > sc) ? h1 - sc : 0;
6225     h2 = (h2 > sc) ? h2 - sc : 0;
6226     h3 = (h3 > sc) ? h3 - sc : 0;
6227 
6228     return (h3 << 12) | (h2 << 8) | (h1 << 4) | (h0 << 0);
6229 }
6230 
MDrv_SC_Luma_PK_LUT_Aux(const MS_U8 table[],MS_U8 sc)6231 MS_U16 MDrv_SC_Luma_PK_LUT_Aux( const MS_U8 table[], MS_U8 sc)
6232 {
6233     sc = sc < 16 ? sc : 16;
6234 
6235     MS_U8 h0 = ( 8 * (16-sc) + table[0] * sc + 8) >> 4;
6236     MS_U8 h1 = ( 8 * (16-sc) + table[1] * sc + 8) >> 4;
6237     MS_U8 h2 = ( 8 * (16-sc) + table[2] * sc + 8) >> 4;
6238     MS_U8 h3 = ( 8 * (16-sc) + table[3] * sc + 8) >> 4;
6239 
6240     return (h0 << 12) | (h1 << 8) | (h2 << 4) | (h3 << 0);
6241 }
6242 
MDrv_SC_Set_PDNR_Gain(MS_U8 gain,MS_BOOL isSourceChange)6243 void MDrv_SC_Set_PDNR_Gain( MS_U8 gain, MS_BOOL isSourceChange )
6244 {
6245     MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlowLut[0], gain ) );
6246     MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlowLut[1], gain ) );
6247     MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlowLut[2], gain ) );
6248     MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlowLut[3], gain ) );
6249     MApi_XC_W2BYTE(REG_SC_BK2A_20_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlow2Lut[0], gain ) );
6250     MApi_XC_W2BYTE(REG_SC_BK2A_21_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlow2Lut[1], gain ) );
6251     MApi_XC_W2BYTE(REG_SC_BK2A_22_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlow2Lut[2], gain ) );
6252     MApi_XC_W2BYTE(REG_SC_BK2A_23_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlow2Lut[3], gain ) );
6253     MApi_XC_W2BYTE(REG_SC_BK2A_24_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrhighLut[0], gain ) );
6254     MApi_XC_W2BYTE(REG_SC_BK2A_25_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrhighLut[1], gain ) );
6255     MApi_XC_W2BYTE(REG_SC_BK2A_26_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrhighLut[2], gain ) );
6256     MApi_XC_W2BYTE(REG_SC_BK2A_27_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrhighLut[3], gain ) );
6257 }
6258 
MDrv_SC_Set_MCNR_Gain(MS_U8 gain,MS_BOOL isSourceChange)6259 void MDrv_SC_Set_MCNR_Gain( MS_U8 gain, MS_BOOL isSourceChange )
6260 {
6261     MApi_XC_W2BYTE(REG_SC_BK2A_08_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[0], gain ) );
6262     MApi_XC_W2BYTE(REG_SC_BK2A_09_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[1], gain ) );
6263     MApi_XC_W2BYTE(REG_SC_BK2A_0A_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[2], gain ) );
6264     MApi_XC_W2BYTE(REG_SC_BK2A_0B_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[3], gain ) );
6265     MApi_XC_W2BYTE(REG_SC_BK2A_0C_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[4], gain ) );
6266     MApi_XC_W2BYTE(REG_SC_BK2A_0D_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[5], gain ) );
6267     MApi_XC_W2BYTE(REG_SC_BK2A_0E_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[6], gain ) );
6268     MApi_XC_W2BYTE(REG_SC_BK2A_0F_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[7], gain ) );
6269 }
6270 
MDrv_SC_Set_PostDINR_Gain(MS_U8 gain,MS_BOOL isSourceChange)6271 void MDrv_SC_Set_PostDINR_Gain( MS_U8 gain, MS_BOOL isSourceChange )
6272 {
6273     static MS_U16 lut[4];
6274     if( isSourceChange )
6275     {
6276         lut[0] = MApi_XC_R2BYTE(REG_SC_BK61_08_L);
6277         lut[1] = MApi_XC_R2BYTE(REG_SC_BK61_09_L);
6278         lut[2] = MApi_XC_R2BYTE(REG_SC_BK61_0A_L);
6279         lut[3] = MApi_XC_R2BYTE(REG_SC_BK61_0B_L);
6280     }
6281     else
6282     {
6283         MApi_XC_W2BYTE(REG_SC_BK61_08_L, MDrv_SC_NR_LUT_Aux( lut[0], gain ) );
6284         MApi_XC_W2BYTE(REG_SC_BK61_09_L, MDrv_SC_NR_LUT_Aux( lut[1], gain ) );
6285         MApi_XC_W2BYTE(REG_SC_BK61_0A_L, MDrv_SC_NR_LUT_Aux( lut[2], gain ) );
6286         MApi_XC_W2BYTE(REG_SC_BK61_0B_L, MDrv_SC_NR_LUT_Aux( lut[3], gain ) );
6287     }
6288 }
6289 
MDrv_SC_Set_Luma_PK_Gain(MS_U8 gain)6290 void MDrv_SC_Set_Luma_PK_Gain( MS_U8 gain )
6291 {
6292     const MS_U8 tableL[4] = { 2, 2, 8, 8 };
6293     const MS_U8 tableH[4] = { 10, 8, 8, 6 };
6294 
6295     MApi_XC_W2BYTE(REG_SC_BK19_55_L, 0x21 );
6296     MApi_XC_W2BYTE(REG_SC_BK19_56_L, MDrv_SC_Luma_PK_LUT_Aux( tableL, gain ) );
6297     MApi_XC_W2BYTE(REG_SC_BK19_57_L, MDrv_SC_Luma_PK_LUT_Aux( tableH, gain ) );
6298 }
6299 
MDrv_SC_GMV_Stability(MS_U16 * gmvDiff,MS_U8 * gmvAvgX,MS_U8 * gmvAvgY,const XC_GMvStates * GMV,const MS_BOOL isOpFrameChanged)6300 void MDrv_SC_GMV_Stability( MS_U16 *gmvDiff, MS_U8 *gmvAvgX, MS_U8 *gmvAvgY, const XC_GMvStates *GMV, const MS_BOOL isOpFrameChanged )
6301 {
6302     static XC_GMvStates gmvHist[8];
6303     static MS_U8 histPos = 0;
6304     static MS_U16 mvDiff = 0;
6305     static MS_U16 mvAvgX = 0, mvAvgY = 0;
6306 
6307     if( isOpFrameChanged )
6308     {
6309         gmvHist[histPos] = *GMV;
6310         histPos = histPos < 7 ? histPos+1 : 0;
6311 
6312         mvDiff = 0;
6313         mvAvgX = mvAvgY = 0;
6314         int i;
6315         for( i = 0 ; i < 8 ; ++i )
6316         {
6317             if( i != 0 )
6318                 mvDiff += abs( gmvHist[i].minMvXdir - gmvHist[i-1].minMvXdir ) + abs( gmvHist[i].minMvYdir - gmvHist[i-1].minMvYdir );
6319             mvAvgY += gmvHist[i].minMvYdir;
6320             mvAvgX += gmvHist[i].minMvXdir;
6321         }
6322         mvAvgY = ( mvAvgY + 4 ) >> 3;
6323         mvAvgX = ( mvAvgX + 4 ) >> 3;
6324     }
6325 
6326     *gmvDiff = mvDiff;
6327     *gmvAvgX = mvAvgX;
6328     *gmvAvgY = mvAvgY;
6329 }
6330 
MDrv_SC_NR_HouseMD_Patch(const MS_U16 me1NotFoundBlk,const XC_LumaHistogramStates * lumaHistogramStates,const MS_BOOL isSceneChange)6331 MS_U8 MDrv_SC_NR_HouseMD_Patch(
6332     /*const MS_U8 gmvAvgX, const MS_U8 gmvAvgY, const int blkConfidence,*/ const MS_U16 me1NotFoundBlk, const XC_LumaHistogramStates *lumaHistogramStates,
6333     const MS_BOOL isSceneChange
6334 )
6335 {
6336     static MS_U8 u8LowLumaVerMovingCnt = 0;
6337 
6338     MS_U32 darkSum = 0, lowLumaSum = 0, avgLuma = 0, totalSum = 0;
6339     int i = 0;
6340     for( i = 0 ; i < 32 ; ++i )
6341     {
6342         if( i < 4 ) darkSum += lumaHistogramStates->lumaBin[i];
6343         if( i < 8 ) lowLumaSum += lumaHistogramStates->lumaBin[i];
6344         totalSum += lumaHistogramStates->lumaBin[i];
6345         avgLuma += lumaHistogramStates->lumaBin[i] * i;
6346     }
6347     if( totalSum != 0 )
6348     {
6349         avgLuma /= totalSum;
6350         darkSum = darkSum * 256 / totalSum;
6351         lowLumaSum = lowLumaSum * 256 / totalSum;
6352     }
6353     else
6354     {
6355         avgLuma = 0;
6356         darkSum = 0;
6357         lowLumaSum = 0;
6358     }
6359 
6360     MS_U16 u16TopCnt = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0D_L, 0x03FF );
6361     MS_U16 u16BottomCnt = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0E_L, 0x03FF );
6362 
6363     //PRT_TRP( "Luma dark, low, avg: %d, %d, %d\n", (int)darkSum, (int)lowLumaSum, (int)avgLuma );
6364 
6365     if(
6366         ( u8LowLumaVerMovingCnt <= 8 ? (darkSum > 170) : (darkSum > 160)  )
6367         && lowLumaSum > 230
6368         && avgLuma < 4
6369         /*&& blkConfidence > 70*/
6370         && me1NotFoundBlk > 0x300
6371         && ( u8LowLumaVerMovingCnt <= 8 ? (u16TopCnt > 0xFF || u16BottomCnt > 0xFF) : (u16TopCnt > 0xF || u16BottomCnt > 0xF) )
6372     )
6373     {
6374         u8LowLumaVerMovingCnt = u8LowLumaVerMovingCnt < 64 ? u8LowLumaVerMovingCnt+1 : 64;
6375     }
6376     else
6377     {
6378         u8LowLumaVerMovingCnt = u8LowLumaVerMovingCnt > 0 ? u8LowLumaVerMovingCnt-1 : 0;
6379     }
6380 
6381     if( isSceneChange )
6382     {
6383         u8LowLumaVerMovingCnt = 0;
6384     }
6385 
6386     //MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, isVerMoving ? 0x0020 : 0x0010, 0x00F0 );
6387 
6388     return u8LowLumaVerMovingCnt;
6389 }
6390 
6391 #define NR_DIRECT_OVERWRITE_EN 0
MDrv_SC_NR_Driver_E28(const MS_U16 u16MotionValue4,const XC_LumaHistogramStates * lumaHistogramStates,const XC_FilmStates * filmstatus,const XC_GMvStates * GMV,const MS_BOOL isUkosabihsMotion,const MS_BOOL isSceneChangeExt,const MS_BOOL bInterlace,const MS_BOOL isHDSrc,const MS_BOOL isSourceChange,const MS_BOOL isOpFrameChanged,const MS_U8 * estNoise,const MS_U8 NE_confirm)6392 void MDrv_SC_NR_Driver_E28
6393 (
6394     const MS_U16 u16MotionValue4,
6395 /*  const int blkConfidence,*/
6396     //const MS_U32 hpfHdTolerantReport,
6397     const XC_LumaHistogramStates *lumaHistogramStates,
6398     const XC_FilmStates *filmstatus,
6399     //const XC_LetterBoxState *letterBoxState,
6400     //const XC_ApiStatus *stXCStatus,
6401     const XC_GMvStates *GMV,
6402     const MS_BOOL isUkosabihsMotion,
6403     const MS_BOOL isSceneChangeExt,
6404     const MS_BOOL bInterlace,
6405     const MS_BOOL isHDSrc,
6406     const MS_BOOL isSourceChange,
6407     const MS_BOOL isOpFrameChanged,
6408     const MS_U8 *estNoise,
6409     const MS_U8 NE_confirm
6410 )
6411 {
6412     // Update MCNR/PDNR LUT from Qmap
6413     MS_BOOL bMCNR_LUT_Reload = (MApi_XC_R2BYTEMSK(REG_SC_BK30_0C_L, 0x0400)>>8);
6414     if(bMCNR_LUT_Reload)
6415     {
6416         if(Hal_PQ_LoadMCNRLutQmapSetting())
6417             MApi_XC_W2BYTEMSK(REG_SC_BK30_0C_L, 0x0000, 0x0400);
6418     }
6419 
6420     // debug en
6421     MS_BOOL dbgEn = MApi_XC_R2BYTEMSK(REG_SC_BK30_38_L, 0x0001 ) & (MApi_XC_R2BYTEMSK(REG_SC_BK30_39_L, 0x0001 ));
6422     if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_3A_L, 0x0003, 0x0003 );
6423 
6424     static MS_BOOL prevIsSceneChangeExt = 0;
6425     MS_BOOL isSceneChange = 0;
6426     if( (!prevIsSceneChangeExt) && isSceneChangeExt )
6427         isSceneChange = 1;
6428 
6429     prevIsSceneChangeExt = isSceneChangeExt;
6430 
6431     static MS_U8 mcnrMotionCnt = 0;
6432     static MS_U8 noiseLevel = 0;
6433     //static MS_U8 smvFrameCnt = 0;
6434     static MS_U8 panScanCnt = 0;
6435 
6436     /* Get UCNR Status */
6437     MS_U16 me1MovingWeight3x3Min = MDrv_SC_read_avgMcnrMovingWeightMin();
6438     //MS_U16 me1MovingWeight3x3Max = MDrv_SC_read_avgMcnrMovingWeightMax();
6439     MS_U16 me1MovingWeight = MDrv_SC_read_avgMcnrMovingWeight();
6440     MS_U16 me1Mv0Cost = MDrv_SC_read_avgMv0MovingWeight();
6441     MS_U16 me2SadDiff = MDrv_SC_read_me2SadDiff();
6442 
6443     MS_U16 mcnrWPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_70_L);
6444     //MS_U16 mcnr2WPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_71_L);
6445     MS_U16 pdnrWPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_72_L);
6446 
6447     MS_U8 smallMovingW = MDrv_SC_McSmallMoving( me1MovingWeight3x3Min, me1Mv0Cost );
6448     if (dbgEn)
6449     DEBUG_LC_40( smallMovingW );
6450 
6451     MS_U8 motion4StillCnt = MDrv_SC_Motion4StillCnt( u16MotionValue4 ); // 0 ~ 15
6452     //MS_U8 stillW = MDrv_SC_Me1Still( me1MovingWeight3x3Max, me1Mv0Cost );
6453 
6454     /*1D motion status*/
6455     MS_U16 mv0pixels  = MApi_XC_R2BYTE(REG_SC_BK09_78_L);
6456     MS_U16 nonMv0Pixels = MApi_XC_R2BYTE(REG_SC_BK09_79_L);
6457     MS_U16 mvNotFoundPixels = MApi_XC_R2BYTE(REG_SC_BK09_7A_L);
6458 
6459     /*2D motion status*/
6460     MS_U16 me1Mv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
6461     MS_U16 me1NonMv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
6462     MS_U16 me1NotFoundBlk = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
6463     MS_U16 me2Mv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
6464     MS_U16 me2NonMv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
6465     MS_U16 me2NotFoundBlk = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
6466 
6467     static MS_BOOL lastEN = 0;
6468 
6469 
6470     if( isSceneChange || isSourceChange )
6471         noiseLevel = 0;
6472     else
6473     {
6474         //NE_confirm = MDrv_SC_GetNoiseLevel( &estNoise, letterBoxState, stXCStatus, bInterlace, isOpFrameChanged );
6475         if (NE_confirm==8)
6476             lastEN=1;
6477         else if (NE_confirm==0 || NE_confirm==1)
6478             lastEN=0;
6479         if( NE_confirm == 8 || (NE_confirm==2 && lastEN==1))
6480         noiseLevel = *estNoise;
6481         else
6482         noiseLevel = 0;
6483     }
6484     //printf("noise level : %d, %d\n", noiseLevel, NE_confirm);
6485     //printf("noise opframe change : %d\n", (int)isOpFrameChanged);
6486 
6487     // NE adaptive debug en
6488     MS_BOOL neAdptDbgEn = /*(MApi_XC_R2BYTE(REG_SC_BK2A_51_L) == 0x0100) && */(!isUkosabihsMotion);
6489 
6490     // NE adaptive dnr4w_max
6491     MS_U8 dnr4Max = noiseLevel > 40 ? (noiseLevel-40)/4 + 0xC : 0xC;
6492     dnr4Max = dnr4Max < 0xF ? dnr4Max : 0xF;
6493     dnr4Max = neAdptDbgEn ? dnr4Max : 0xC;
6494     MApi_XC_W2BYTEMSK(REG_SC_BK2A_4D_L, dnr4Max << 12, 0xF000 );
6495 
6496     // NE adaptive mcnr noise level
6497     MS_U8 nlMax = noiseLevel > 40 ? (noiseLevel-40)/4 + 8 : 8;
6498     nlMax = nlMax < 0xF ? nlMax : 0xF;
6499     nlMax = neAdptDbgEn ? nlMax : 8;
6500     MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, nlMax << 8, 0x0F00 );
6501 
6502     MS_U16 gmvDiff = 0;
6503     MS_U8 gmvAvgX = 0, gmvAvgY = 0;
6504     MDrv_SC_GMV_Stability( &gmvDiff, &gmvAvgX, &gmvAvgY, GMV, isOpFrameChanged );
6505     //printf( "GMV diff, avgX, avgY: %d, %d %d\n", gmvDiff, gmvAvgX, gmvAvgY );
6506 
6507     //DEBUG_LC_41( motion4StillCnt );
6508     //DEBUG_LC_43( noiseLevel );
6509     //printf( "noise level : %d\n", noiseLevel );
6510 
6511     // force film-like/m2s weight to max if source is progressive/film
6512     if( (!bInterlace) || filmstatus->film_act )
6513     {
6514         MApi_XC_W2BYTEMSK(REG_SC_BK2A_6E_L, 0xE000, 0xFF00);
6515         if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x5000, 0xF000 );
6516     }
6517     else
6518     {
6519         MApi_XC_W2BYTEMSK(REG_SC_BK2A_6E_L, 0x0000, 0xFF00);
6520         if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x3000, 0xF000 );
6521     }
6522 
6523     MS_U16 mcnrWPixCntThL, pdnrWPixCntThL, mcnrWPixCntThH, pdnrWPixCntThH;
6524 //  MS_U16 smvTh;
6525     MS_U16 panScanThL, panScanThH;
6526     MS_U16 almostStillTh;
6527     if( isHDSrc )
6528     {
6529         mcnrWPixCntThL = 0xF0;
6530         pdnrWPixCntThL = 0xF0;
6531         mcnrWPixCntThH = 0x3800;
6532         pdnrWPixCntThH = 0x3800;
6533         panScanThH = 0x3000;
6534         panScanThL = 0x2000;
6535         almostStillTh = 0x200;
6536 #if 0
6537         if( noiseLevel > 0x40 )
6538             smvTh = 0xFF;
6539         else
6540             smvTh = 0x00;
6541 #endif
6542     }
6543     else
6544     {
6545         mcnrWPixCntThL = 0xF0;
6546         pdnrWPixCntThL = 0xF0;
6547         mcnrWPixCntThH = 0x980; //0x580;
6548         pdnrWPixCntThH = 0xB80; //0xA00;
6549         panScanThH = 0x800;
6550         panScanThL = 0x500;
6551         almostStillTh = 0x30;
6552 #if 0
6553         if( noiseLevel > 0x40 )
6554             smvTh = 0xFF;
6555         else
6556             smvTh = 0x00;
6557 #endif
6558     }
6559 
6560     static MS_BOOL isStill = true, isStillDelay = true, isStillNoSceneChane = true, isStillDelayNoSceneChane = true;
6561     if( (mcnrWPixCnt < mcnrWPixCntThL && pdnrWPixCnt < pdnrWPixCntThL && motion4StillCnt > 8 )
6562         || ( mcnrWPixCnt < mcnrWPixCntThH && pdnrWPixCnt < pdnrWPixCntThH && motion4StillCnt > 12 )
6563         )
6564     {
6565         mcnrMotionCnt = 0;
6566         isStill = isStillDelay = true;
6567         isStillNoSceneChane = isStillDelayNoSceneChane = isSceneChange ? false : true;
6568     }
6569     else
6570     {
6571         if( mcnrMotionCnt > 16 )
6572         {
6573             isStill = isStillNoSceneChane = false;
6574 
6575             if( mcnrMotionCnt > 32 )
6576                 isStillDelay = isStillDelayNoSceneChane = false;
6577             else
6578             {
6579                 isStillDelay = true;
6580                 isStillDelayNoSceneChane = ( isSceneChange || !isStillDelayNoSceneChane ) ? false : true;
6581                 ++mcnrMotionCnt;
6582             }
6583         }
6584         else
6585         {
6586             isStill = isStillDelay = true;
6587             isStillNoSceneChane = ( isSceneChange || !isStillNoSceneChane ) ? false : true;
6588             isStillDelayNoSceneChane = ( isSceneChange || !isStillDelayNoSceneChane ) ? false : true;
6589             ++mcnrMotionCnt;
6590         }
6591     }
6592 
6593     // reduce pdnr weight by ME1 smv at small moving or almost still scenes
6594 //  MS_BOOL isAlmostStill;
6595     if( me1MovingWeight < almostStillTh )
6596     {
6597 //      isAlmostStill = true;
6598         if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0010, 0x00F0 );
6599     }
6600     else
6601     {
6602 //      isAlmostStill = false;
6603         if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0020, 0x00F0 );
6604     }
6605 
6606     // panScan
6607     static MS_BOOL isPanScan = false;
6608     if( me1MovingWeight > panScanThH )
6609     {
6610         if( panScanCnt < 16 )
6611             ++panScanCnt;
6612     }
6613     else
6614     {
6615         if( !(isPanScan && me1MovingWeight > panScanThL) )
6616         {
6617             if( panScanCnt > 0 )
6618                 --panScanCnt;
6619         }
6620     }
6621 
6622     if( panScanCnt > 6 )
6623     {
6624         isPanScan = true;
6625         if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0100, 0x0F00 );
6626     }
6627     else
6628     {
6629         isPanScan = false;
6630         if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0200, 0x0F00 );
6631     }
6632 
6633     // low texture moving
6634     static MS_U8 lowTexMovingCnt = 0; // 0~32
6635     MS_BOOL isMe1Moving = false, isMe2Moving = false, is1DLowTexMoving = false;
6636     if( me1Mv0Blk < 0x20 && me1NonMv0Blk < 0x40 && me1NotFoundBlk > 0x3D0 && me1MovingWeight > 0x500/*0x1300*/ )
6637     {
6638         isMe1Moving = true;
6639     }
6640 
6641     if( me2Mv0Blk < 0x800 && me2NonMv0Blk > 0x700 && me2NotFoundBlk > 0xD00 )
6642     {
6643         isMe2Moving = true;
6644     }
6645 
6646     if( mv0pixels < 0x2FF && nonMv0Pixels < 0xF00 && mvNotFoundPixels < 0x160 )
6647     {
6648         is1DLowTexMoving = true;
6649     }
6650 
6651     if( isMe1Moving && isMe2Moving && is1DLowTexMoving )
6652     {
6653         if( lowTexMovingCnt < 32 )
6654             ++lowTexMovingCnt;
6655     }
6656     else if( lowTexMovingCnt > 0 )
6657     {
6658         --lowTexMovingCnt;
6659     }
6660 
6661     MS_BOOL isLowTexMoving = false;
6662     if( lowTexMovingCnt > 8 )
6663     {
6664         // enable keep detail
6665         isLowTexMoving = true;
6666         MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, 0x1000, 0xF000);
6667     }
6668     else
6669     {
6670         MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, 0xF000, 0xF000);
6671     }
6672 
6673     static MS_U8 pdnrGain = 16;
6674     static MS_U8 me1NRStrength = 0xF;
6675 
6676     // isUkosabihsMotion then reduce PDNR table
6677     if( isUkosabihsMotion && isPanScan && !isLowTexMoving )
6678     {
6679         // maximum PDNR gain 12
6680         pdnrGain = pdnrGain > 12 ? pdnrGain-1 : (pdnrGain < 12 ? pdnrGain + 1 : pdnrGain );
6681         // reduce ME1_moving_w_nr_strength to 3
6682         me1NRStrength = me1NRStrength > 3 ? me1NRStrength - 1 : me1NRStrength;
6683     }
6684     // isLowTexMoving or isUkosabihsMotion but me1 moving weight is small then turn off PDNR
6685     else if( ( isUkosabihsMotion && !isPanScan ) || isLowTexMoving )
6686     {
6687         // turn off PDNR
6688             pdnrGain = pdnrGain > 6 ? pdnrGain - 6 : 0;
6689             me1NRStrength = me1NRStrength < 0xE ? me1NRStrength + 2 : 0xF;
6690     }
6691     else
6692     {
6693             pdnrGain = pdnrGain < 10 ? pdnrGain + 6 : 16;
6694             me1NRStrength = me1NRStrength < 0xB ? me1NRStrength + 4 : 0xF;
6695     }
6696 
6697     static MS_U8 maxSnrStrength = 32;
6698     // isUkosabihsMotion || isPanScan then turn off SNR
6699     if( isUkosabihsMotion || isPanScan )
6700         maxSnrStrength = maxSnrStrength > 0 ? maxSnrStrength-1 : 0;
6701     else
6702         maxSnrStrength = maxSnrStrength < 32 ? maxSnrStrength+1 : 32;
6703 
6704     // max SNR Weight
6705     MApi_XC_W2BYTEMSK(REG_SC_BK2A_69_L, maxSnrStrength << 8, 0x3F00);
6706 
6707 #if HOUSE_MD_PATTERN_ENABLE
6708     // House MD patch
6709     MS_U8 u8LowLumaVerMovingCnt = MDrv_SC_NR_HouseMD_Patch( /*gmvAvgX, gmvAvgY, blkConfidence, */me1NotFoundBlk, lumaHistogramStates, isSceneChange );
6710 #else
6711     static MS_U8 u8LowLumaVerMovingCnt = 0;
6712 #endif
6713 
6714 
6715     // force 2D for stable vertical moving
6716     static MS_U8 force2DCnt = 0;
6717     static MS_U8 force1Dcnt = 0;
6718     //if( isUkosabihsMotion && gmvDiff < 2 && gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7)
6719     if( isUkosabihsMotion && gmvDiff < 2 &&
6720         ( (gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7) || ( abs( gmvAvgX - 32 ) < 16 && abs( gmvAvgX - 32 ) > 9 ) )
6721     )
6722     {
6723         if( force2DCnt < 32 )
6724             ++force2DCnt;
6725     }
6726     else if(  gmvDiff < 5 &&
6727         (gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7) && isPanScan && ( abs( gmvAvgX - 32 ) < 3)  )
6728     {
6729         if( force2DCnt < 32 )
6730             ++force2DCnt;
6731     }
6732     else
6733     {
6734         if( force2DCnt > 0 )
6735             --force2DCnt;
6736     }
6737 
6738     // force 1D if small moving horizontal burst ( me2 not stable )
6739     if( !isUkosabihsMotion /*&& hpfHdTolerantReport > 0xC000*/ && me1Mv0Cost > 0x1900 && me2SadDiff < 0x100 )
6740     {
6741         if( force1Dcnt < 32 )
6742             ++force1Dcnt;
6743     }
6744     else
6745     {
6746         if( force1Dcnt > 0 )
6747             --force1Dcnt;
6748     }
6749 
6750     if( !isUkosabihsMotion && u8LowLumaVerMovingCnt > 8 )
6751     {
6752         MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x4100, 0x7F00 );
6753         MApi_XC_W2BYTEMSK(REG_SC_BK2A_07_L, 0x0000, 0x0008 );
6754     }
6755     else
6756     {
6757         MApi_XC_W2BYTEMSK(REG_SC_BK2A_07_L, 0x0008, 0x0008 );
6758 
6759     if( force2DCnt > 16 )
6760     {
6761         MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x4000, 0x7F00 );
6762     }
6763     else if( force1Dcnt > 16 )
6764     {
6765         MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x6000, 0x7F00 );
6766     }
6767     else if( force2DCnt < 8 || force1Dcnt < 8 )
6768     {
6769         MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x0000, 0x7F00 );
6770     }
6771     }
6772 
6773     // still and vertical pan scan
6774     static MS_U8 mcnrGain = 16;
6775     if( isUkosabihsMotion )
6776     {
6777         if( gmvDiff < 2 && gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 && abs( gmvAvgX - 32 ) < 16 )
6778         {
6779             // stable vertical moving
6780             mcnrGain = mcnrGain > 8 ? mcnrGain  - 1 : ( mcnrGain < 8 ? mcnrGain + 1 : 8 );
6781         }
6782         else if( gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 && abs( gmvAvgX - 32 ) < 16 )
6783         {
6784             mcnrGain = mcnrGain > 4 ? mcnrGain  - 1 : ( mcnrGain < 4 ? mcnrGain + 1 : 4 );
6785         }
6786         else if( abs( gmvAvgY - 8 ) >= 7 || abs( gmvAvgX - 32 ) >= 16 )
6787         {
6788             // high mv vertical moving
6789             mcnrGain = mcnrGain > 0 ? mcnrGain  - 1 : 0;
6790         }
6791         else
6792         {
6793             mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6794         }
6795     }
6796     else if( isPanScan )
6797     {
6798         // not isUkosabihsMotion
6799         if( gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 )
6800         {
6801             if( force2DCnt > 16 )
6802             {
6803                 mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6804             }
6805             else
6806             {
6807             mcnrGain = mcnrGain > 4 ? mcnrGain  - 1 : ( mcnrGain < 4 ? mcnrGain + 1 : 4 );
6808         }
6809         }
6810         else if( abs( gmvAvgY - 8 ) >= 7 )
6811         {
6812             // high mv vertical moving
6813             mcnrGain = mcnrGain > 0 ? mcnrGain  - 1 : 0;
6814         }
6815         else
6816         {
6817             mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6818         }
6819     }
6820     else if( (abs( gmvAvgX - 32 ) >= 16) && (force2DCnt < 16) )
6821     {
6822         // motion is out of 1D search range
6823         // MCNR creates contours
6824         mcnrGain = mcnrGain > 8 ? mcnrGain  - 1 : mcnrGain;
6825         pdnrGain = pdnrGain < 20 ? pdnrGain + 2 : pdnrGain;
6826     }
6827     else
6828     {
6829         //mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6830         //mcnrGain = isSceneChange ? 16 : ( mcnrGain < 16 ? mcnrGain + 1 : 16 );
6831          mcnrGain = isSceneChange ? 16 : ( mcnrGain < 12 ? mcnrGain + 4 :16 );
6832     }
6833 
6834     //20160126 marked by Bella due to still pattern in this condition has too much noise
6835     // direct overwrite
6836     if (NR_DIRECT_OVERWRITE_EN)
6837     {
6838         if( isStillNoSceneChane /*isStill*/ || ( isStillDelayNoSceneChane/*isStillDelay*/ && gmvAvgY != 8) )
6839         {
6840             mcnrGain = 3;
6841         }
6842     }
6843 
6844     // MCNR gain
6845     MDrv_SC_Set_MCNR_Gain( mcnrGain, isSourceChange );
6846 
6847     // direct overwite
6848     if (NR_DIRECT_OVERWRITE_EN)
6849     {
6850         if( isStill || isSceneChange )
6851         {
6852             pdnrGain = 0;
6853         }
6854     }
6855 
6856     // PDNR gain
6857      MDrv_SC_Set_PDNR_Gain( pdnrGain, isSourceChange ); // For UCNR delay Issue: 1078573, solution: open this line and mark"MDrv_SC_Set_PDNR_Gain( ( isStill || isSceneChange ) ? 0 : pdnrGain,isSourceChange );" by Jay Huang
6858     //MDrv_SC_Set_PDNR_Gain( ( isStill || isSceneChange ) ? 0 : pdnrGain,isSourceChange );
6859     // ME1_moving_w_nr_strength
6860     MApi_XC_W2BYTEMSK(REG_SC_BK2A_66_L, me1NRStrength << 12, 0xF000);
6861 
6862 
6863     // For BWS1&UCNR both ON, image sticking @scene change (turn on UCNR dither @scene change 12 times.)
6864     // 2014.9.16 Ryan
6865     static MS_U16 SceneCnt=0;
6866     if( ((MApi_XC_R2BYTE(REG_SC_BK08_01_L)& 0x0001) == 0x0000) && (isSceneChangeExt) ) //Due to compress issue, when BWS enable and scenechange, dither enable
6867     {
6868         SceneCnt = 12; //
6869     }
6870     else
6871     {
6872         if(SceneCnt>0)
6873         {
6874             SceneCnt = SceneCnt - 1;
6875         }
6876         else
6877         {
6878             SceneCnt = 0;
6879         }
6880     }
6881 
6882     if(SceneCnt>0)
6883     {
6884         MApi_XC_W2BYTEMSK(REG_SC_BK2A_5C_L, 0x003C, 0x007F);
6885     }
6886     else
6887     {
6888         MApi_XC_W2BYTEMSK(REG_SC_BK2A_5C_L, 0x007F, 0x007F);
6889     }
6890 
6891 
6892     static MS_U8 postDINRGain = 16;
6893     if( isUkosabihsMotion || isPanScan || is1DLowTexMoving )
6894     {
6895         postDINRGain = postDINRGain > 4 ? postDINRGain  - 4 : 0;
6896     }
6897     else
6898     {
6899         postDINRGain = postDINRGain < 16 ? postDINRGain + 1 : 16;
6900     }
6901 
6902     // PostDI NR gain
6903     MDrv_SC_Set_PostDINR_Gain( postDINRGain, isSourceChange );
6904 
6905     //printf( "Gain : %d, %d, %d \n", mcnrGain, pdnrGain, postDINRGain );
6906 
6907 #if 0
6908     // luma peaking
6909     if( isPanScan && gmvAvgX != 32 && gmvAvgY == 8 && !isUkosabihsMotion )
6910     {
6911         MDrv_SC_Set_Luma_PK_Gain( panScanCnt );
6912     }
6913     else
6914     {
6915         MDrv_SC_Set_Luma_PK_Gain( 0 );
6916     }
6917 #endif
6918 
6919     if( dbgEn )
6920     {
6921         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isMe1Moving ? 0x0002 : 0x0001), 0x000F );
6922         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isMe2Moving ? 0x0020 : 0x0010), 0x00F0 );
6923         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (is1DLowTexMoving ? 0x0200 : 0x0100), 0x0F00 );
6924         MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isLowTexMoving ? 0x2000 : 0x1000), 0xF000 );
6925 
6926         MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, (pdnrGain == 0) ? 0x0001 : 0x0002, 0x000F );
6927 
6928         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, isUkosabihsMotion ? 0x0020 : 0x0010, 0x00F0 );
6929         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, force1Dcnt > 16 ? 0x0200 : 0x0100, 0x0F00 );
6930         MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, mcnrGain == 16 ? 0x2000 : 0x1000, 0xF000 );
6931         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, (isSceneChange ? 0x0002 : 0x0001), 0x000F );
6932         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, (isStillNoSceneChane ? 0x0020 : 0x0010), 0x00F0 );
6933 
6934         MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, ( ( (NE_confirm == 8) || (NE_confirm==2 && lastEN==1) ) ? 0x2000 : 0x1000), 0xF000 );
6935 
6936         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 10 ? 0x0002 : 0x0), 0x000F );
6937         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 20 ? 0x0020 : 0x0), 0x00F0 );
6938         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 30 ? 0x0200 : 0x0), 0x0F00 );
6939         MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 40 ? 0x2000 : 0x0), 0xF000 );
6940 
6941         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 50 ? 0x0002 : 0x0), 0x000F );
6942         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 60 ? 0x0020 : 0x0), 0x00F0 );
6943         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 70 ? 0x0200 : 0x0), 0x0F00 );
6944         MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 80 ? 0x2000 : 0x0), 0xF000 );
6945 
6946         MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, (noiseLevel >  90 ? 0x0002 : 0x0), 0x000F );
6947         MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, (noiseLevel > 100 ? 0x0020 : 0x0), 0x00F0 );
6948         MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, (noiseLevel > 110 ? 0x0200 : 0x0), 0x0F00 );
6949         MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, (noiseLevel > 120 ? 0x2000 : 0x0), 0xF000 );
6950     }
6951 
6952     // adaptive coring
6953     //MDrv_Adaptive_Coring( noiseLevel, isSourceChange, isSceneChange );
6954 }
6955 /******************************************************************************/
6956 ///LetterBox Driver
6957 /******************************************************************************/
MDrv_SC_Letter_Box_Driver(const MS_BOOL isSceneChange,const MS_BOOL isSourceChange,const MS_BOOL isOpFrameChanged)6958 XC_LetterBoxState MDrv_SC_Letter_Box_Driver( /*const MS_BOOL isHDSrc,*/ const MS_BOOL isSceneChange, const MS_BOOL isSourceChange, const MS_BOOL isOpFrameChanged )
6959 {
6960     //static MS_U8 lbConfirmLevel = 0;
6961     static MS_U8 triggerCnt = 0;
6962     static MS_U8 hisPos = 0;
6963     static MS_U8 hisCnt = 0;
6964     static MS_U16 au16HisCntT[16] = {0};
6965     static MS_U16 au16HisCntB[16] = {0};
6966     static MS_U16 au16HisCntL[16] = {0};
6967     static MS_U16 au16HisCntR[16] = {0};
6968     static MS_U16 cntIIRT = 0, cntIIRB = 0, cntIIRL = 0, cntIIRR = 0;
6969     static MS_U16 prevMinCntT = 0, prevMinCntB = 0, prevMinCntL = 0, prevMinCntR = 0;
6970     //static XC_LetterBoxState lbState;
6971 
6972     MS_U16 triggerMask = MApi_XC_R2BYTEMSK(REG_SC_BK0B_15_L, 0xF000) >> 12;
6973     triggerMask = triggerMask < 3 ? 3 : triggerMask;
6974 
6975     MApi_XC_W2BYTEMSK(REG_SC_BK0B_05_L, 0x7F, 0x1FFF );
6976 
6977     if( isSceneChange || isSourceChange )
6978     {
6979         lbConfirmLevel = 0;
6980         hisCnt = 0;
6981         memset( au16HisCntT, 0xFF, sizeof(au16HisCntT) );
6982         memset( au16HisCntB, 0xFF, sizeof(au16HisCntB) );
6983         memset( au16HisCntL, 0xFF, sizeof(au16HisCntL) );
6984         memset( au16HisCntR, 0xFF, sizeof(au16HisCntR) );
6985     }
6986 
6987     if( isOpFrameChanged )
6988     {
6989         if( (triggerCnt & triggerMask) == 0 )
6990         {
6991             au16HisCntT[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0D_L, 0x03FF );
6992             au16HisCntB[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0E_L, 0x03FF );
6993             au16HisCntL[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0F_L, 0x07FF );
6994             au16HisCntR[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_10_L, 0x07FF );
6995 
6996             MS_U16 minCntT = au16HisCntT[0], minCntB = au16HisCntB[0], minCntL = au16HisCntL[0], minCntR = au16HisCntR[0];
6997             int i;
6998             for( i = 1 ; i < 16 ; ++i )
6999             {
7000                 minCntT = au16HisCntT[i] < minCntT ? au16HisCntT[i] : minCntT;
7001                 minCntB = au16HisCntB[i] < minCntB ? au16HisCntB[i] : minCntB;
7002                 minCntL = au16HisCntL[i] < minCntL ? au16HisCntL[i] : minCntL;
7003                 minCntR = au16HisCntR[i] < minCntR ? au16HisCntR[i] : minCntR;
7004             }
7005 
7006             if( hisPos == 15 )
7007                 hisPos = 0;
7008             else
7009                 ++hisPos;
7010 
7011             if( hisCnt < 16 )
7012                 ++hisCnt;
7013 
7014             MS_U16 conf = abs( (int)(minCntT + minCntB + minCntL + minCntR) - (int)(prevMinCntT + prevMinCntB + prevMinCntL + prevMinCntR) );
7015             conf = conf < 256 ? 255 - conf : 0;
7016             if ( minCntL == 0x01FFF || minCntR == 0x01FFF || minCntT == 0x01FFF || minCntB == 0x01FFF)
7017                 conf = 0;
7018 
7019             lbConfirmLevel = (lbConfirmLevel*6 + conf*2 )>> 3;
7020             lbState.lbComfirmLevel = conf;
7021             lbState.lbCntT = cntIIRT = ( cntIIRT * 7 + minCntT ) >> 3;
7022             lbState.lbCntB = cntIIRB = ( cntIIRB * 7 + minCntB ) >> 3;
7023             lbState.lbCntL = cntIIRL = ( cntIIRL * 7 + minCntL ) >> 3;
7024             lbState.lbCntR = cntIIRR = ( cntIIRR * 7 + minCntR ) >> 3;
7025 
7026             prevMinCntT = minCntT;
7027             prevMinCntB = minCntB;
7028             prevMinCntL = minCntL;
7029             prevMinCntR = minCntR;
7030             /*
7031             if( isHDSrc )
7032             {
7033                 int ratio = 0x1FA4000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080-cntIIRT-cntIIRB) );
7034                 lbState.lbRatioC = ratio < 256 ? ratio : 255;
7035 
7036                 ratio = 0x1FA4000 / ( (int)(1920) * (int)(1080-cntIIRT-cntIIRB) );
7037                 lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7038 
7039                 ratio = 0x1FA4000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080) );
7040                 lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7041             }
7042             else
7043             {
7044                 int ratio = 0x546000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080-cntIIRT-cntIIRB) );
7045                 lbState.lbRatioC = ratio < 256 ? ratio : 255;
7046 
7047                 ratio = 0x546000 / ( (int)(1920) * (int)(1080-cntIIRT-cntIIRB) );
7048                 lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7049 
7050                 ratio = 0x546000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080) );
7051                 lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7052             }*/
7053             int windowWidth  = __max((int)(frameWidth-cntIIRL-cntIIRR), 1);
7054             int windowHeight = __max((int)(frameHeight-cntIIRT-cntIIRB), 1);
7055             int ratio = 0x1FA40000 / ( windowWidth * windowHeight );
7056             lbState.lbRatioC = ratio < 256 ? ratio : 255;
7057 
7058             ratio = 0x1FA40000 / ( frameWidth * windowHeight );
7059             lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7060 
7061             ratio = 0x1FA40000 / ( windowWidth * frameHeight );
7062             lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7063 
7064 
7065             MApi_XC_W2BYTEMSK(REG_SC_BK0B_15_L, cntIIRL, 0x01FF);
7066             MApi_XC_W2BYTEMSK(REG_SC_BK0B_16_L, cntIIRR, 0x01FF);
7067 
7068             //PRT_TRP( "Letter Box L : %03d, R : %03d, confirm : %03d, ratio C/TB/LR : %02d.%2d, %02d.%2d, %02d.%2d \n", cntIIRL, cntIIRR, conf,
7069             //lbState.lbRatioC/16, (lbState.lbRatioC&0xF)*10/16, lbState.lbRatioTB/16, (lbState.lbRatioTB&0xF)*10/16, lbState.lbRatioLR/16, (lbState.lbRatioLR&0xF)*10/16 );
7070         }
7071         ++triggerCnt;
7072 
7073         if (lbConfirmLevel > 224 && !(isSceneChange ||isSourceChange) && (lbState.lbCntL > 100) && (lbState.lbCntR > 100) )
7074         {
7075                 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
7076                 MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, lbState.lbCntL + 50, 0x1FFF);
7077                 MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, frameWidth - lbState.lbCntR - 50, 0x1FFF);
7078                 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7000, 0x7000);
7079         }
7080         else
7081         {
7082                 const int boundary = 10;
7083                 MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
7084 
7085                 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
7086                 MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, boundary, 0x1FFF); /* set start */
7087                 MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);/* set end */
7088                 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x7000);
7089         }
7090     }
7091 
7092     return lbState;
7093 }
7094 
7095 /******************************************************************************/
7096 ///DeFeathering
7097 ///@param u32MotionValue \     IN: Motion value
7098 /******************************************************************************/
MDrv_SC_de_feathering(MS_U32 u32MotionValue)7099 void MDrv_SC_de_feathering(MS_U32 u32MotionValue)
7100 {
7101     static MS_U32 u32DeFeatherCntLv1 = 0;
7102     static MS_U32 u32DeFeatherCntLv2 = 0;
7103     static MS_U32 u32DeFeatherCntLv3 = 0;
7104     MS_U8 u8SST_Static_Core_TH = 0;
7105 
7106     MS_U8 u8SST_Dynamic_Core_TH =0;	//YY for SZ feathering 151201
7107     MS_U8 u8SST_Motion_TH =0;       //YY for SZ feathering 151201
7108 
7109     MS_U32 reg_defethering_lv1_cnt = 0;
7110     MS_U32 reg_defethering_lv2_cnt = 0;
7111     MS_U32 reg_mdp_cnt = 0;
7112 
7113     reg_defethering_lv1_cnt = 0x0A;
7114     reg_defethering_lv2_cnt = 0x08;
7115     reg_mdp_cnt = 0x01;
7116 
7117     // motion level count
7118     if(u32MotionValue >= DEFETHERING_LV1_TH)
7119     {
7120         if(u32DeFeatherCntLv1 < reg_defethering_lv1_cnt)
7121             u32DeFeatherCntLv1++;
7122     }
7123     else
7124     {
7125         if(u32DeFeatherCntLv1 >= reg_mdp_cnt)
7126             u32DeFeatherCntLv1 = u32DeFeatherCntLv1 - reg_mdp_cnt;
7127     }
7128 
7129     if(u32MotionValue >= DEFETHERING_LV2_TH)
7130     {
7131         if(u32DeFeatherCntLv2 < reg_defethering_lv2_cnt)
7132             u32DeFeatherCntLv2++;
7133     }
7134     else
7135     {
7136         if(u32DeFeatherCntLv2 >= reg_mdp_cnt)
7137             u32DeFeatherCntLv2 = u32DeFeatherCntLv2 - reg_mdp_cnt;
7138     }
7139 
7140     if(u32MotionValue >= DEFETHERING_LV3_TH)
7141     {
7142         if(u32DeFeatherCntLv3 < DEFETHERING_LV3_CNT)
7143             u32DeFeatherCntLv3++;
7144     }
7145     else
7146     {
7147         if(u32DeFeatherCntLv3 >= reg_mdp_cnt)
7148             u32DeFeatherCntLv3 = u32DeFeatherCntLv3 - reg_mdp_cnt;
7149     }
7150 
7151     //DeFeathering begin
7152     if(u32DeFeatherCntLv1 >= reg_defethering_lv1_cnt)
7153     {
7154         u8SST_Static_Core_TH    = SST_STATIC_CORE_TH_LV1_VALUE;
7155         u8SST_Motion_TH         = SST_MOTION_TH_LV1_VALUE;        //YY for SZ feathering 151201
7156         u8SST_Dynamic_Core_TH   = SST_DYNAMIC_CORE_TH_LV1_VALUE;  //YY for SZ feathering 151201
7157     }
7158     else if(u32DeFeatherCntLv2 >= reg_defethering_lv2_cnt)
7159     {
7160         u8SST_Static_Core_TH    = SST_STATIC_CORE_TH_LV2_VALUE;
7161         u8SST_Motion_TH         = SST_MOTION_TH_LV2_VALUE;        //YY for SZ feathering 151201
7162         u8SST_Dynamic_Core_TH   = SST_DYNAMIC_CORE_TH_LV2_VALUE;  //YY for SZ feathering 151201
7163     }
7164     else if(u32DeFeatherCntLv3 >= DEFETHERING_LV3_CNT)
7165     {
7166         u8SST_Static_Core_TH    = SST_STATIC_CORE_TH_LV3_VALUE;
7167         u8SST_Motion_TH         = SST_MOTION_TH_LV3_VALUE;        //YY for SZ feathering 151201
7168         u8SST_Dynamic_Core_TH   = SST_DYNAMIC_CORE_TH_LV3_VALUE;  //YY for SZ feathering 151201
7169     }
7170     else
7171     {
7172         u8SST_Static_Core_TH    = SST_STATIC_CORE_TH_LV4_VALUE;
7173         u8SST_Motion_TH         = SST_MOTION_TH_LV4_VALUE;        //YY for SZ feathering 151201
7174         u8SST_Dynamic_Core_TH   = SST_DYNAMIC_CORE_TH_LV4_VALUE;  //YY for SZ feathering 151201
7175     }
7176 
7177     MApi_XC_W2BYTEMSK(REG_SC_BK22_1A_L, (MS_U16)u8SST_Static_Core_TH, 0xFF);
7178     MApi_XC_W2BYTEMSK(REG_SC_BK22_18_L, (MS_U16)u8SST_Motion_TH, 0x000F);
7179     MApi_XC_W2BYTEMSK(REG_SC_BK22_19_L, (MS_U16)u8SST_Dynamic_Core_TH, 0x003F);
7180 }
7181 
7182 /******************************************************************************/
7183 ///DeFlickering
7184 ///@param u32MotionValue \     IN: Motion value
7185 /******************************************************************************/
MDrv_SC_de_flickering(MS_U32 u32MotionValue)7186 void MDrv_SC_de_flickering(MS_U32 u32MotionValue)
7187 {
7188     static MS_S32 s32DeFlickerCnt = 0;
7189     MS_U32 reg_m_feat_smooth_hle_th = 0, reg_m_feat_smooth_shrink = 0;
7190 
7191     reg_m_feat_smooth_hle_th = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_1E_L, 0xF000); // Feat Smooth HLE TH
7192     reg_m_feat_smooth_shrink = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_1E_L, 0x8F);
7193 
7194     if(u32MotionValue >= DEFLICKERING_TH)
7195     {
7196         if(s32DeFlickerCnt < 65535)
7197             s32DeFlickerCnt++;
7198     }
7199     else
7200     {
7201         s32DeFlickerCnt = 0;
7202     }
7203 
7204     if(s32DeFlickerCnt >= DEFLICKERING_CNT)
7205     {
7206         reg_m_feat_smooth_hle_th += 0x0300;
7207         reg_m_feat_smooth_shrink += 0x10;
7208     }
7209     else
7210     {
7211         reg_m_feat_smooth_hle_th += 0x0700;
7212         reg_m_feat_smooth_shrink += 0x30;
7213     }
7214 
7215     MApi_XC_W2BYTEMSK(REG_SC_BK22_1E_L, reg_m_feat_smooth_shrink, 0xFF);
7216     MApi_XC_W2BYTEMSK(REG_SC_BK22_1E_L, reg_m_feat_smooth_hle_th, 0xFF00);
7217 }
7218 
7219 /******************************************************************************/
7220 ///DeBouncing
7221 ///@param u32MotionValue \     IN: Motion value
7222 /******************************************************************************/
7223 #define DEBOUNCING_GAIN 1 //0
MDrv_SC_de_bouncing(MS_U32 u32MotionValue)7224 void MDrv_SC_de_bouncing(MS_U32 u32MotionValue)
7225 {
7226     static MS_S32 s32DeBouncingCnt = 0;
7227     MS_U32 u32RegHisWtF2 = 0;
7228     MS_U32 u32regdebouncingth = 0;
7229     int reg_debouncing_cnt = 0;
7230 
7231     u32regdebouncingth = 0x0A;
7232     reg_debouncing_cnt = 0x03;
7233 
7234     u32RegHisWtF2 = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0A_L, 0xF8); // history ratio weighting
7235 
7236     if(u32MotionValue <= u32regdebouncingth * DEBOUNCING_GAIN)
7237     {
7238         s32DeBouncingCnt = 0;
7239     }
7240     else
7241     {
7242         if(s32DeBouncingCnt < 65535)
7243             s32DeBouncingCnt++;
7244     }
7245 
7246     if(s32DeBouncingCnt >= reg_debouncing_cnt)
7247     {
7248         u32RegHisWtF2 += 0x06; // history = 6 moving
7249     }
7250     else
7251     {
7252         u32RegHisWtF2 += 0x03; // history = 3 still
7253     }
7254     MApi_XC_W2BYTEMSK(REG_SC_BK22_0A_L, u32RegHisWtF2, 0xFF);
7255 }
7256 
7257 /******************************************************************************/
7258 
MDrv_SC_Edison_DHD_driver(MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm,XC_GMvStates gMV,MS_U32 _hpfHdCntReport)7259 void MDrv_SC_Edison_DHD_driver( MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm, XC_GMvStates gMV, MS_U32 _hpfHdCntReport )
7260 {
7261     // dhd stadium patch: lower dhd strength
7262     static MS_U32 u32filmCnt = 0;
7263     int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7264 
7265     MS_U32 exactFeatherCnt = 0;
7266     static MS_U32 pre_exactFeatherCnt = 0;
7267     MS_BOOL isMv0 = ( ( gMV.minMvXdir == 32 ) && ( gMV.minMvYdir == 8 ) ) ? true : false;
7268 
7269     exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7270     exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7271     pre_exactFeatherCnt = exactFeatherCnt;
7272 
7273     MS_U32 colorSum = 0;
7274     static MS_U32 colorSum_iir = 0;
7275 
7276     colorSum  = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC in Maserati
7277 
7278     colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7279     colorSum_iir = colorSum;
7280 
7281     if((uComplex>0x680) && (nonMv0Comfirm > 0x70) && (me1Still == false) && (check_width > 0x700) && ((/*exactFeatherCnt > 0x30 &&*/colorSum > 0x1500 && colorSum < 0x2500 )|| mv0Comfirm < 0x50 ) ) //exactFeatherCnt > 0x30 for stadium & mv0Comfirm < 0x50 for building of "KURO" disc
7282     {
7283         u32filmCnt++;
7284 
7285         if( u32filmCnt >= 50 )
7286         {
7287             u32filmCnt = 50;
7288         }
7289     }
7290     else if((gMV.h2XYsum > 0x30)&& (gMV.h2XYdiff <= 0x06)&& (!isMv0) && (nonMv0Comfirm>0x40) && mv0Comfirm < 0x20 )//shibasoku pan
7291     {
7292 
7293         u32filmCnt++;
7294 
7295         if( u32filmCnt >= 50 )
7296         {
7297             u32filmCnt = 50;
7298         }
7299     }
7300     else if ( _hpfHdCntReport > 0xFFFF )
7301     {
7302 
7303         u32filmCnt++;
7304 
7305         if( u32filmCnt >= 50 )
7306         {
7307             u32filmCnt = 50;
7308         }
7309     }
7310     else
7311     {
7312         if( u32filmCnt == 0 )
7313         {
7314             u32filmCnt = 0;
7315         }
7316         else
7317         {
7318             u32filmCnt--;
7319         }
7320     }
7321 
7322     if( u32filmCnt <= 2 )
7323         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0F00, 0x0F00); //dhd user weight
7324     else if( u32filmCnt == 3 )
7325         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0C00, 0x0F00); //dhd user weight
7326     else if( u32filmCnt == 4 )
7327         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0B00, 0x0F00); //dhd user weight
7328     else if( u32filmCnt == 5 )
7329         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0900, 0x0F00); //dhd user weight
7330     else if( u32filmCnt == 6 )
7331         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0700, 0x0F00); //dhd user weight
7332     else if( u32filmCnt == 7 )
7333         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0500, 0x0F00); //dhd user weight
7334     else if( u32filmCnt == 8 )
7335         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0300, 0x0F00); //dhd user weight
7336     else if( u32filmCnt == 9 )
7337         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0100, 0x0F00); //dhd user weight
7338     else if( u32filmCnt >= 10 )
7339         MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00); //dhd user weight
7340 
7341 }
7342 
MDrv_SC_Edison_DHD_Weather_driver(MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm)7343 void MDrv_SC_Edison_DHD_Weather_driver( MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm )
7344 {
7345     // dhd weather patch: enhance dhd strength
7346     static MS_U32 u32filmCnt = 0;
7347     int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7348 
7349     MS_U32 exactFeatherCnt = 0;
7350     static MS_U32 pre_exactFeatherCnt = 0;
7351 
7352     exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7353     exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7354     pre_exactFeatherCnt = exactFeatherCnt;
7355 
7356 
7357     MS_U32 colorSum = 0;
7358     static MS_U32 colorSum_iir = 0;
7359 
7360     colorSum  = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC in Maserati
7361 
7362     colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7363     colorSum_iir = colorSum;
7364 
7365     if((uComplex>0x800) && (mv0Comfirm > 0x140) && (nonMv0Comfirm < 0x40) && (me1Still == true) && (check_width>0x700) && (exactFeatherCnt < 0x10) && (colorSum > 0x700) )
7366     {
7367         u32filmCnt++;
7368 
7369         if( u32filmCnt >= 24 )
7370         {
7371             u32filmCnt = 24;
7372         }
7373     }
7374     else
7375     {
7376         if( u32filmCnt > 0 )
7377             u32filmCnt = u32filmCnt - 2;
7378     }
7379 
7380     if( check_width>0x700 )
7381     {
7382 
7383         if( u32filmCnt <= 2 )
7384         {
7385             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0040, 0x00FF); //dhd c edge diff(hor).
7386             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xA000, 0xFF00); //dhd y edge diff(hor).
7387         }
7388         else if( u32filmCnt == 3 )
7389         {
7390             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0054, 0x00FF); //dhd c edge diff(hor).
7391             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xAB00, 0xFF00); //dhd y edge diff(hor).
7392         }
7393         else if( u32filmCnt == 4 )
7394         {
7395             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0068, 0x00FF); //dhd c edge diff(hor).
7396             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xB600, 0xFF00); //dhd y edge diff(hor).
7397         }
7398         else if( u32filmCnt == 5 )
7399         {
7400             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x007C, 0x00FF); //dhd c edge diff(hor).
7401             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xC100, 0xFF00); //dhd y edge diff(hor).
7402         }
7403         else if( u32filmCnt == 6 )
7404         {
7405             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0090, 0x00FF); //dhd c edge diff(hor).
7406             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xCC00, 0xFF00); //dhd y edge diff(hor).
7407         }
7408         else if( u32filmCnt == 7 )
7409         {
7410             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00A4, 0x00FF); //dhd c edge diff(hor).
7411             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xD700, 0xFF00); //dhd y edge diff(hor).
7412         }
7413         else if( u32filmCnt == 8 )
7414         {
7415             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00B8, 0x00FF); //dhd c edge diff(hor).
7416             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xE200, 0xFF00); //dhd y edge diff(hor).
7417         }
7418         else if( u32filmCnt == 9 )
7419         {
7420             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00CC, 0x00FF); //dhd c edge diff(hor).
7421             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xED00, 0xFF00); //dhd y edge diff(hor).
7422         }
7423         else if( u32filmCnt >= 10 )
7424         {
7425             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00E0, 0x00FF); //dhd c edge diff(hor).
7426             MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xF800, 0xFF00); //dhd y edge diff(hor).
7427         }
7428 
7429     }
7430 
7431 }
7432 
MDrv_SC_Edison_DHD_GSLSM_driver(MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm)7433 void MDrv_SC_Edison_DHD_GSLSM_driver( MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm )
7434 {
7435     // dhd patch for global still & local moving region( dot-crawl on dirty background ): enhance dhd strength
7436     static MS_U32 u32filmCnt = 0;
7437     int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7438 
7439     MS_U32 exactFeatherCnt = 0;
7440     static MS_U32 pre_exactFeatherCnt = 0;
7441 
7442     exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7443     exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7444     pre_exactFeatherCnt = exactFeatherCnt;
7445 
7446     MS_U32 colorSum = 0;
7447     static MS_U32 colorSum_iir = 0;
7448 
7449     colorSum  = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC inMaserati
7450 
7451     colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7452     colorSum_iir = colorSum;
7453 
7454     if((uComplex>0x800) && (mv0Comfirm >= nonMv0Comfirm*3) && (me1Still == true) && (check_width>0x700) && ((exactFeatherCnt > 0x40) || (exactFeatherCnt < 0x10 && colorSum > 0xB00) ) ) //exactFeatherCnt < 0x10 && colorSum > 0xB00 for weather
7455     {
7456         u32filmCnt++;
7457 
7458         if( u32filmCnt >= 24 )
7459         {
7460             u32filmCnt = 24;
7461         }
7462     }
7463     else
7464     {
7465         if( u32filmCnt > 0 )
7466             u32filmCnt = u32filmCnt - 2;
7467     }
7468 
7469     if( check_width>0x700 )
7470     {
7471         if( u32filmCnt <= 2 )
7472             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0024, 0x00FF); //dhd y(n), y(n-4) diff.
7473         else if( u32filmCnt == 3 )
7474             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0026, 0x00FF); //dhd y(n), y(n-4) diff.
7475         else if( u32filmCnt == 4 )
7476             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0029, 0x00FF); //dhd y(n), y(n-4) diff.
7477         else if( u32filmCnt == 5 )
7478             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x002B, 0x00FF); //dhd y(n), y(n-4) diff.
7479         else if( u32filmCnt == 6 )
7480             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x002E, 0x00FF); //dhd y(n), y(n-4) diff.
7481         else if( u32filmCnt == 7 )
7482             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0030, 0x00FF); //dhd y(n), y(n-4) diff.
7483         else if( u32filmCnt == 8 )
7484             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0033, 0x00FF); //dhd y(n), y(n-4) diff.
7485         else if( u32filmCnt == 9 )
7486             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0035, 0x00FF); //dhd y(n), y(n-4) diff.
7487         else if( u32filmCnt >= 10 )
7488             MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0038, 0x00FF); //dhd y(n), y(n-4) diff.
7489     }
7490 
7491 }
7492 
7493 //
7494 //To do (merge with MDrv_SC_Edison_DHD_driver)
7495 //
MDrv_SC_Edison_DHD_Stadium_driver(MS_BOOL isMcFilmHd,const XC_FilmStates filmstatus)7496 void MDrv_SC_Edison_DHD_Stadium_driver(MS_BOOL isMcFilmHd,const XC_FilmStates filmstatus)
7497 {
7498 
7499     int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7500     int currentGain = MApi_XC_R2BYTEMSK(REG_SC_BK05_2B_L, 0x0F00) >> 8 ;
7501     if( check_width > 0x700 )
7502     {
7503         if( isMcFilmHd || filmstatus.filmany) //disable DHD when Film timing
7504             //if( filmstatus.film_act )
7505             MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00);
7506         else
7507             MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, (currentGain<<8), 0x0F00);
7508     }
7509     else
7510     {
7511         if( filmstatus.filmany) //disable DHD when SD film-any
7512             MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00);
7513         else
7514             MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, (currentGain<<8), 0x0F00);
7515     }
7516 
7517 }
7518 
7519 //
7520 //To adjust the CCS_MR HisWeight Ctrl
7521 //
7522 #define CCS_MR_HisWeight_MaxValue 0x1F
7523 #define CCS_MR_HisWeight_MinValue  0x18
MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(const XC_FilmStates filmstatus)7524 void MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(const XC_FilmStates filmstatus)
7525 {
7526     static MS_U8 Reg_CCS_MR_Weight = CCS_MR_HisWeight_MinValue;
7527 
7528     if( (filmstatus.film32) |(filmstatus.filmany))
7529     {
7530         Reg_CCS_MR_Weight = CCS_MR_HisWeight_MaxValue;
7531     }
7532     else
7533     {
7534         if( Reg_CCS_MR_Weight > CCS_MR_HisWeight_MinValue )
7535             Reg_CCS_MR_Weight--;
7536         else
7537             Reg_CCS_MR_Weight = CCS_MR_HisWeight_MinValue;
7538     }
7539     MApi_XC_W2BYTEMSK(REG_SC_BK06_77_L, Reg_CCS_MR_Weight<<8, 0x1F00);
7540 }
7541 
7542 
7543 /******************************************************************************/
7544 ///CCS Driver
7545 /******************************************************************************/
7546 
MDrv_SC_Edison_CCS_driver(const MS_BOOL ukoSabihS_en)7547 void MDrv_SC_Edison_CCS_driver( const MS_BOOL ukoSabihS_en )
7548 {
7549     // horizontal moving => lower ccs weight
7550     static MS_U32 u32CCSvideoCnt = 0;
7551     MS_BOOL isMvPanScan = FALSE;
7552 
7553     //if((gMv.h1XYsum >10) && (gMv.h2XYsum > 10) && ( gMv.h1XYdiff < 5) && (gMv.h2XYdiff < 5))
7554     if( ukoSabihS_en )
7555     {
7556         isMvPanScan = true;
7557     }
7558     else
7559     {
7560         isMvPanScan = false;
7561     }
7562 
7563     if(isMvPanScan)
7564     {
7565         u32CCSvideoCnt++;
7566 
7567         if( u32CCSvideoCnt >= 20 )
7568         {
7569             u32CCSvideoCnt = 20;
7570         }
7571     }
7572     else
7573     {
7574         if( u32CCSvideoCnt == 0 )
7575         {
7576             u32CCSvideoCnt = 0;
7577         }
7578         else
7579         {
7580             u32CCSvideoCnt--;
7581         }
7582     }
7583 
7584     if( u32CCSvideoCnt <= 2 )
7585         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000F, 0x000F); //ccs user weight
7586     else if( u32CCSvideoCnt == 3 )
7587         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000D, 0x000F); //ccs user weight
7588     else if( u32CCSvideoCnt == 4 )
7589         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000B, 0x000F); //ccs user weight
7590     else if( u32CCSvideoCnt == 5 )
7591         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0009, 0x000F); //ccs user weight
7592     else if( u32CCSvideoCnt == 6 )
7593         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0007, 0x000F); //ccs user weight
7594     else if( u32CCSvideoCnt == 7 )
7595         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0005, 0x000F); //ccs user weight
7596     else if( u32CCSvideoCnt == 8 )
7597         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0003, 0x000F); //ccs user weight
7598     else if( u32CCSvideoCnt == 9 )
7599         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0001, 0x000F); //ccs user weight
7600     else if( u32CCSvideoCnt >= 10 )
7601         MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0000, 0x000F); //ccs user weight
7602 }
7603 
MDrv_SC_LowLumaDetection(void)7604 MS_BOOL MDrv_SC_LowLumaDetection(void)
7605 {
7606     MS_BOOL isLowLuma = FALSE;
7607     MS_U16 MaxL_pixel = 0;
7608 
7609     MaxL_pixel = MApi_XC_R2BYTE(REG_SC_BK1A_0B_L)&0x00FF;
7610 
7611     if((MaxL_pixel<100)&&(MApi_XC_DLC_GetAverageValue()< 120))
7612     {
7613         isLowLuma = true;
7614     }
7615     else
7616     {
7617         isLowLuma = false;
7618     }
7619 
7620     return isLowLuma;
7621 }
7622 
LumaAGCLUT(const MS_U8 LumaCheck)7623 MS_U8 LumaAGCLUT(const MS_U8 LumaCheck )
7624 {
7625     MS_U8 lumaAgcGain = 0;
7626 
7627     if( LumaCheck > 120 )
7628         lumaAgcGain = 6;
7629     else if( ( LumaCheck > 114 ) &&  ( LumaCheck <= 120 ))
7630         lumaAgcGain = 7;
7631     else if( ( LumaCheck > 104 ) &&  ( LumaCheck <= 114 ))
7632         lumaAgcGain = 8;
7633     else if( ( LumaCheck > 94 ) &&  ( LumaCheck <= 104 ))
7634         lumaAgcGain = 8;
7635     else if( ( LumaCheck > 83 ) &&  ( LumaCheck <= 94 ))
7636         lumaAgcGain = 9;
7637     else if( ( LumaCheck > 73 ) &&  ( LumaCheck <= 83 ))
7638         lumaAgcGain = 10;
7639     else if( ( LumaCheck > 62 ) &&  ( LumaCheck <= 73 ))
7640         lumaAgcGain = 11;
7641     else if( ( LumaCheck > 51 ) &&  ( LumaCheck <= 62 ))
7642         lumaAgcGain = 13;
7643     else if( ( LumaCheck > 40 ) &&  ( LumaCheck <= 51 ))
7644         lumaAgcGain = 15;
7645     else if( ( LumaCheck > 26 ) &&  ( LumaCheck <= 40 ))
7646         lumaAgcGain = 17;
7647     else
7648         lumaAgcGain = 15;
7649 
7650     return lumaAgcGain;
7651 }
7652 
7653 #define HD_ACT_TH 10
7654 #define HDSDD_SPEED 1
7655 #define HDSDD_DIV 0
7656 #define HD_SPEED 2
7657 #define SD_SPEED 4
7658 
MDrv_SC_Edision_stillFeatherDetection(const MS_U32 u32MotionValue,const MS_BOOL isUkosabihsMotion,const MS_U32 _hpfHdCntReport,const MS_BOOL isHBurstMoving,const MS_BOOL isHBurst,const MS_BOOL isUkosabihsMv0,const MS_BOOL isMcFilmHd,const MS_U32 _hpfSdCntReport)7659 void MDrv_SC_Edision_stillFeatherDetection(const MS_U32 u32MotionValue, const MS_BOOL isUkosabihsMotion,
7660                        const MS_U32 _hpfHdCntReport, const MS_BOOL isHBurstMoving, const MS_BOOL isHBurst, const MS_BOOL isUkosabihsMv0,
7661                        const MS_BOOL isMcFilmHd/*, const MS_BOOL isSceneChange*/, const MS_U32 _hpfSdCntReport )
7662 {
7663     MS_U32 exactFeatherCnt = 0;
7664     static MS_U32 pre_exactFeatherCnt = 0;
7665 
7666     MS_U32 HD_ConfirmCnt_Reg = 0;
7667     static MS_U32 HD_ConfirmCnt_Reg_post = 0;
7668     static MS_U16 HD_ConfirmCnt = 0;
7669 
7670     MS_U8 u8MinPixel = 0;
7671     static MS_U8 u8PrevMinPixel = 0;
7672 
7673     MS_U8 u8MaxPixel = 0;
7674     static MS_U8 u8PrevMaxPixel = 0;
7675 
7676     MS_U32 Luma = 0;
7677     static MS_U32 LumaPrev = 0;
7678     MS_U8 LumaCheck = 0;
7679 
7680     MS_U16 Cplx = 0;
7681     static MS_U16 CplxPrev = 0;
7682     MS_U8 CplxCheck = 0;
7683 
7684     MS_U8 lumaAgcGain = 0;
7685     MS_BOOL cplxLumaPatch = false;
7686 
7687     MS_U8  featherRatio = 0;
7688 
7689 //  MS_BOOL XXX;
7690 
7691     MS_BOOL isMovingImage = ( u32MotionValue!=0 ) ? true : false;
7692 
7693     MS_BOOL isWithoutHsignal = ( _hpfSdCntReport < 0x10 ) ? true : false;
7694 
7695 //  XXX = isSceneChange;
7696     exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7697     exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7698     pre_exactFeatherCnt = exactFeatherCnt;
7699 
7700     u8MaxPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0x00FF);//move to UFSC in Maserati
7701     u8MaxPixel = (u8PrevMaxPixel*3 + u8MaxPixel ) >> 2;
7702     u8PrevMaxPixel = u8MaxPixel;
7703 
7704     u8MinPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0xFF00)>>8; //move to UFSC in Maserati
7705     u8MinPixel = (u8PrevMinPixel*3 + u8MinPixel ) >> 2;
7706     u8PrevMinPixel = u8MinPixel;
7707 
7708     Luma = MDrv_Read2Byte(REG_FSC_BK55_1A_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1B_L, 0x000F )<<16);//move to UFSC in Maserati
7709     Luma = (LumaPrev*3 + Luma ) >> 2;
7710     LumaPrev = Luma;
7711 
7712     Cplx = MApi_XC_R2BYTEMSK(REG_SC_BK2A_78_L, 0xFFFF);
7713     Cplx = (CplxPrev*3 + Cplx ) >> 2;
7714     CplxPrev = Cplx;
7715 
7716     {
7717         LumaCheck = Luma >> 8;
7718         CplxCheck = Cplx >> 8;
7719         lumaAgcGain = LumaAGCLUT( LumaCheck );
7720         cplxLumaPatch = ( CplxCheck > ( LumaCheck * lumaAgcGain ) >> 3 ) ? true : false;
7721     }
7722 
7723     if( ( isUkosabihsMv0 && !isMovingImage) || isMcFilmHd )
7724         featherRatio = 5;
7725     else if( !isUkosabihsMotion && isMovingImage )
7726         featherRatio = 2;
7727     else
7728         featherRatio = 4;
7729 
7730     if((exactFeatherCnt > 0x20)&&( exactFeatherCnt > (_hpfHdCntReport*featherRatio)))
7731     {
7732         if(HD_ConfirmCnt > (0xFF - SD_SPEED))
7733             HD_ConfirmCnt = 0xFF;
7734         else
7735             HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
7736     }
7737     else
7738     {
7739         if(HD_ConfirmCnt < 1)
7740             HD_ConfirmCnt = 0;
7741         else
7742             HD_ConfirmCnt = HD_ConfirmCnt - 1;
7743     }
7744 
7745     if( HD_ConfirmCnt > 0x80 )
7746         HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x80;
7747     else
7748         HD_ConfirmCnt_Reg = 0;
7749 
7750     HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
7751 
7752     if( HD_ConfirmCnt_Reg > 0x3F )
7753         HD_ConfirmCnt_Reg = 0x3F;
7754 
7755     if( cplxLumaPatch )
7756     {
7757         HD_ConfirmCnt_Reg_post = 0;
7758     }
7759     else if( isWithoutHsignal )
7760     {
7761         HD_ConfirmCnt_Reg_post = 0;
7762     }
7763     else if( (isHBurst || isHBurstMoving || isUkosabihsMotion ) && HD_ConfirmCnt_Reg != 0 )
7764     {
7765         if( HD_ConfirmCnt_Reg_post < 8 )
7766             HD_ConfirmCnt_Reg_post = 0;
7767         else
7768             HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg_post - 8;
7769     }
7770     else if( u8MaxPixel < 25 && HD_ConfirmCnt_Reg != 0 )
7771     {
7772         if( HD_ConfirmCnt_Reg_post < 8 )
7773             HD_ConfirmCnt_Reg_post = 0;
7774         else
7775             HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg_post - 8;
7776     }
7777     else
7778         HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg;
7779 
7780     //121 weight
7781 
7782     MApi_XC_W2BYTEMSK(REG_SC_BK23_54_L, (MS_U16)HD_ConfirmCnt_Reg_post, 0x001F);
7783 
7784 }
7785 
MDrv_SC_Edison_NEW_SDHD_DETECT_driver(void)7786 void MDrv_SC_Edison_NEW_SDHD_DETECT_driver(void)
7787 {
7788     MS_U32 HDcnt_Act = 0;
7789     MS_U32 FeatherCnt = 0;
7790     MS_U32 SDcnt_Act = 0;
7791     MS_U32 NEW_FeatherCnt = 0;
7792     MS_U32 HD_ConfirmCnt_Reg = 0;
7793 
7794     static MS_U32 PreHDcnt_Act = 0;
7795     static MS_U32 PreSDcnt_Act = 0;
7796     static MS_U32 PreFeatherCnt = 0;
7797     static MS_U32 PreNEW_FeatherCnt = 0;
7798     static MS_U16 HD_ConfirmCnt = 0;//0xFF; // 0x7FFF == 0
7799 
7800     HDcnt_Act = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7801     HDcnt_Act = ( PreHDcnt_Act*3 + HDcnt_Act ) >> 2;
7802     PreHDcnt_Act = HDcnt_Act;
7803 
7804     SDcnt_Act = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7805     SDcnt_Act = ( PreSDcnt_Act*3 + SDcnt_Act ) >> 2;
7806     PreSDcnt_Act = SDcnt_Act;
7807 
7808     FeatherCnt = MApi_XC_R2BYTE(REG_SC_BK23_56_L); //New add for A1 chip
7809     FeatherCnt = ( PreFeatherCnt*3 + FeatherCnt ) >> 2;
7810     PreFeatherCnt = FeatherCnt;
7811 
7812     NEW_FeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7813     NEW_FeatherCnt = ( PreNEW_FeatherCnt*3 + NEW_FeatherCnt ) >> 2;
7814     PreNEW_FeatherCnt = NEW_FeatherCnt;
7815 
7816     if( (NEW_FeatherCnt > 0x80) && (SDcnt_Act > 0x1800) && (NEW_FeatherCnt < 0xF00) && (HDcnt_Act < 0x3000))
7817     {
7818         if(HD_ConfirmCnt > (0xFF - SD_SPEED))
7819             HD_ConfirmCnt = 0xFF;
7820         else
7821             HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
7822     }
7823     else
7824     {
7825         if(HD_ConfirmCnt < 1)
7826             HD_ConfirmCnt = 0;
7827         else
7828             HD_ConfirmCnt = HD_ConfirmCnt - 1;
7829     }
7830 
7831     if( HD_ConfirmCnt > 0x80 )
7832         HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x80;
7833     else
7834         HD_ConfirmCnt_Reg = 0;
7835 
7836     HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
7837 
7838     if( HD_ConfirmCnt_Reg > 0x3F )
7839         HD_ConfirmCnt_Reg = 0x3F;
7840 
7841     //121 weight
7842     MApi_XC_W2BYTEMSK(REG_SC_BK23_54_L, (MS_U16)HD_ConfirmCnt_Reg, 0x003F);
7843 }
7844 
7845 #define TIMEID_hpfTolerantReport 2
MDrv_SC_hpfTolerantReport(const MS_U8 _timeSharingID,const XC_HpfDefaultRegSetting defaultReg,MS_U32 * _hpfHdTolerantReport,const MS_U8 timingSegment)7846 MS_U32 MDrv_SC_hpfTolerantReport( const MS_U8 _timeSharingID, const XC_HpfDefaultRegSetting defaultReg, MS_U32 *_hpfHdTolerantReport, const MS_U8 timingSegment )
7847 {
7848     static MS_U32 _return_sd = 0;
7849     static MS_U32 _return_hd = 0;
7850 
7851     if( _timeSharingID == TIMEID_hpfTolerantReport )
7852     {
7853         if( timingSegment == 0 )
7854         {
7855             MDrv_SC_hpfDefaultRelod( defaultReg );
7856         //else if( timingSegment == 1 ) /* Set Regiater */
7857         //{
7858 
7859             MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x0100, 0xFFFF);
7860             MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x02)<<12, 0x7000);
7861 
7862             MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0280, 0xFFFF);     /*for HD repot*/
7863             MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x06)<<8, 0x0700);  /*for HD repot*/
7864 
7865             MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x0000 , 0x003F); /* underflow */
7866             MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3F00, 0x3F00); /* overflow */
7867         }
7868         else if ( timingSegment > 1)
7869         {
7870             _return_sd =  (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7871 
7872             _return_hd =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7873 
7874 
7875         }
7876     }
7877     else
7878     {
7879         //MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold, 0xFFFF);
7880         //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode_shift)<<12, 0x7000);
7881 
7882         //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF);  /*for HD repot*/
7883         //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
7884 
7885         //MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, defaultReg.HDSDD_underflow_threshold , 0x003F); /* underflow */
7886         //MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, (defaultReg.HDSDD_overflow_threshold)<<8, 0x3F00); /* overflow */
7887     }
7888 
7889     *_hpfHdTolerantReport = _return_hd;
7890 
7891     return _return_sd;
7892 }
7893 
7894 #define TIMEID_dynamicHDfilterBaseReport 1
MDrv_SC_dynamicHDfilterBaseReport(const MS_U8 _timeSharingID,const MS_U32 u32MotionValue,const MS_BOOL isUkosabihsMv0,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment)7895 MS_U32 MDrv_SC_dynamicHDfilterBaseReport( const MS_U8 _timeSharingID, const MS_U32 u32MotionValue, const MS_BOOL isUkosabihsMv0, const XC_HpfDefaultRegSetting defaultReg, const MS_U8 timingSegment  )
7896 {
7897 
7898     MS_BOOL isStillImage = ( u32MotionValue < 10 ) ? true : false;
7899     MS_U32 hdRepot= 0;
7900     static MS_U32 _return = 0;
7901 
7902     if( _timeSharingID == TIMEID_dynamicHDfilterBaseReport )
7903     {
7904         if( timingSegment == 0 )
7905         {
7906             MDrv_SC_hpfDefaultRelod( defaultReg );
7907         //else if( timingSegment == 1 ) /* Set Regiater */
7908         //{
7909             if( ( isUkosabihsMv0 && isStillImage) )
7910             {
7911                 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0100, 0xFFFF);
7912                 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x02)<<8, 0x0700);
7913             }
7914             else
7915             {
7916                 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF);
7917                 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x04)<<8, 0x0700);
7918             }
7919         }
7920         else if ( timingSegment > 1)
7921         {
7922             hdRepot =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7923 
7924             _return = hdRepot;
7925         }
7926     }
7927     else
7928     {
7929         //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF);  /*for HD repot*/
7930         //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
7931         //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF);
7932         //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x04)<<8, 0x0700);
7933     }
7934     return _return;
7935 }
7936 
7937 #define TIMEID_FilterBaseReport 0
MDrv_SC_SDHD_FilterBaseReport(const MS_U8 _timeSharingID,MS_U32 * _hpfHdCntReport,MS_U32 * _hpfSdCntReport,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment,MS_U32 * hdNactCntRet)7938 MS_U8 MDrv_SC_SDHD_FilterBaseReport( const MS_U8 _timeSharingID, MS_U32 *_hpfHdCntReport, MS_U32 *_hpfSdCntReport, const XC_HpfDefaultRegSetting defaultReg,  const MS_U8 timingSegment , MS_U32 *hdNactCntRet )
7939 {
7940     MS_U8 u8Luma = 0;
7941     MS_U16 u16MinPixel = 0,u16MaxPixel = 0, MaxMinPixel = 0;
7942     static MS_U32 HDcnt_Act = 0, hdNactCnt = 0;
7943     static MS_U32 SDcnt_Act = 0;
7944     MS_U32 HDcnt_Act_Cur = 0;
7945     MS_U32 SDcnt_Act_Cur = 0;
7946     MS_U32 hdNactCntCur;
7947     static MS_U16 HD_ConfirmCnt = 0;//xFF; // 0x7FFF == 0
7948     static MS_U8 u8PrevLuma = 0;
7949     static MS_U16 u16PrevMinPixel = 0;
7950     static MS_U16 u16PrevMaxPixel = 0;
7951     MS_U32 HD_ConfirmCnt_Reg = 0;
7952     MS_U32 HDSDD_Det_threshold = 0;
7953     static MS_U8 _return = 0;
7954 
7955     if( _timeSharingID == TIMEID_FilterBaseReport )
7956     {
7957         if( timingSegment == 0 )
7958         {
7959             MDrv_SC_hpfDefaultRelod( defaultReg );
7960         //else if( timingSegment == 1 ) /* Set Regiater */
7961         //{
7962             u8Luma=(MS_U32)((MS_U32)u8PrevLuma*3 + MApi_XC_DLC_GetAverageValue())>>2;
7963 //          int AVG_LUMA = MApi_XC_DLC_GetAverageValue();
7964             u8PrevLuma = u8Luma;
7965 
7966             u16MaxPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0x00FF); //Register move to UFSC in Maserati
7967             u16MaxPixel = (u16PrevMaxPixel*3 + u16MaxPixel ) >> 2;
7968             u16PrevMaxPixel = u16MaxPixel;
7969 
7970             u16MinPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0xFF00)>>8;  //Register move to UFSC in Maserati
7971             u16MinPixel = (u16PrevMinPixel*3 + u16MinPixel ) >> 2;
7972             u16PrevMinPixel = u16MinPixel;
7973 
7974             MaxMinPixel = u16MaxPixel - u16MinPixel;
7975 
7976             if(u8Luma>=0xFF)
7977                 u8Luma = 0xFF;
7978 
7979             HDSDD_Det_threshold = ((MaxMinPixel*6)>>2) + ((u8Luma*5)>>2);
7980 
7981             if(HDSDD_Det_threshold >=0xFFFF)
7982                 HDSDD_Det_threshold=0xFFFF;
7983 
7984             MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, (MS_U16)HDSDD_Det_threshold, 0xFFFF);
7985             MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, (MS_U16)(HDSDD_Det_threshold>>1), 0xFFFF);
7986         }
7987         else if( timingSegment == 1 )
7988         {
7989 
7990         }
7991         else /* Run */
7992         {
7993             HDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7994             SDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7995                         hdNactCntCur =  (MApi_XC_R2BYTE(REG_SC_BK02_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_78_L)
7996                     + (MApi_XC_R2BYTE(REG_SC_BK82_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK82_78_L);
7997 
7998                         //printf("PQ_LSE: MDrv_SC_SDHD_FilterBaseReport, HDcnt_Act_Cur = %d SDcnt_Act_Cur = %d hdNactCntCur = %d \n",HDcnt_Act_Cur,SDcnt_Act_Cur,hdNactCntCur);
7999 
8000             HDcnt_Act = (HDcnt_Act_Cur+ HDcnt_Act) >> 1;
8001             SDcnt_Act = (SDcnt_Act_Cur+ SDcnt_Act) >> 1;
8002 
8003             *_hpfHdCntReport = HDcnt_Act;
8004             *_hpfSdCntReport = SDcnt_Act;
8005                     *hdNactCntRet = hdNactCnt = (hdNactCntCur+ hdNactCnt) >> 1;
8006 
8007             if( (HDcnt_Act > HD_ACT_TH) && (SDcnt_Act != 0) )
8008             {
8009                 if(HD_ConfirmCnt < HD_SPEED)
8010                     HD_ConfirmCnt = 0;
8011                 else
8012                     HD_ConfirmCnt = HD_ConfirmCnt - HD_SPEED;
8013             }
8014             else if( SDcnt_Act != 0 )
8015             {
8016                 if(HD_ConfirmCnt > (0x80 - SD_SPEED))
8017                     HD_ConfirmCnt = 0x80;
8018                 else
8019                     HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
8020             }
8021             else
8022             {
8023                 if(HD_ConfirmCnt < 1)
8024                     HD_ConfirmCnt = 0;
8025                 else
8026                     HD_ConfirmCnt = HD_ConfirmCnt - 1;
8027             }
8028 
8029             if( HD_ConfirmCnt > 0x20 )
8030                 HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x20;
8031             else
8032                 HD_ConfirmCnt_Reg = 0;
8033 
8034             HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
8035 
8036             if( HD_ConfirmCnt_Reg > 0x3F )
8037                 HD_ConfirmCnt_Reg = 0x3F;
8038 
8039             _return = HD_ConfirmCnt_Reg;
8040         }
8041     }
8042     else
8043     {
8044         //  return to the original condition
8045         //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold , 0xFFFF);
8046         //MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold , 0xFFFF);
8047     }
8048 
8049     return _return;
8050 }
MDrv_UFSC_PQ_2DPK(int menuW,MS_U16 sdw,MS_U16 fhdw,MS_U32 srEnhStr,XC_PqWriteReg * PqWriteReg,MS_U16 u16ArtiW)8051 void MDrv_UFSC_PQ_2DPK(int menuW, MS_U16 sdw, MS_U16 fhdw , MS_U32 srEnhStr ,XC_PqWriteReg *PqWriteReg ,MS_U16 u16ArtiW)
8052 {
8053 
8054     MS_U8 u8Ufsc2DPKfinalGain;
8055     MS_U8 u8FHDfnlGain = ( MDrv_Read2Byte(REG_FSC_BK30_13_L) >>8)&0x7F;
8056     MS_U8 u8HDfnlGain = 0 ;
8057     MS_U8 u8ArtificialfnlGain = ( MDrv_Read2Byte(REG_FSC_BK30_1A_L) >> 8)&0x7F;
8058     MS_U8 u8OsdfnlGain = ( MDrv_Read2Byte(REG_FSC_BK30_16_L) >> 8)&0x7F;
8059 
8060     u8Ufsc2DPKfinalGain = ( fhdw*u8FHDfnlGain + (256-fhdw)*u8HDfnlGain )/256;
8061     u8Ufsc2DPKfinalGain = ( menuW*u8OsdfnlGain + (256-menuW)*u8Ufsc2DPKfinalGain) >>8;
8062     u8Ufsc2DPKfinalGain = ( u16ArtiW*u8ArtificialfnlGain + (256-u16ArtiW)*u8Ufsc2DPKfinalGain)>>8;
8063     u8Ufsc2DPKfinalGain = (u8Ufsc2DPKfinalGain* srEnhStr )>>5;
8064     PqWriteReg->UFSCPk2DfinalGain = u8Ufsc2DPKfinalGain;
8065 
8066 
8067     MS_U8 u8Ufsc2dpkHdGainFhdPtn = MDrv_Read2Byte(REG_FSC_BK30_14_L)&0x1F; //0x08;
8068     MS_U8 u8Ufsc2dpkHdGainHdPtn = (MDrv_Read2Byte(REG_FSC_BK30_14_L)>>8)&0x1F; //0x00;
8069     MS_U8 u8Ufsc2dpkHdGainSdPtn =  MDrv_Read2Byte(REG_FSC_BK30_15_L)&0x1F ; //0x10;
8070 
8071     MS_U8 u8Ufsc2dpkHdGain;
8072     u8Ufsc2dpkHdGain = ( u8Ufsc2dpkHdGainHdPtn*(256-fhdw) + u8Ufsc2dpkHdGainFhdPtn*fhdw )>>8;
8073     u8Ufsc2dpkHdGain = ( u8Ufsc2dpkHdGain*(256-sdw) + u8Ufsc2dpkHdGainSdPtn*sdw )>>8;
8074     u8Ufsc2dpkHdGain = __minmax(u8Ufsc2dpkHdGain , 0 , 0x1F);
8075 
8076     MApi_XC_Write2ByteMask( REG_FSC_BK5F_62_L, u8Ufsc2dpkHdGain , 0x001F );
8077 }
MDrv_SC_2DPK_PQ(MS_U16 sdw,MS_U16 fhdw,MS_U32 srEnhStr,XC_PqWriteReg * PqWriteReg,MS_U16 u16ArtiW)8078 void MDrv_SC_2DPK_PQ(MS_U16 sdw, MS_U16 fhdw , MS_U32 srEnhStr ,XC_PqWriteReg *PqWriteReg ,MS_U16 u16ArtiW)
8079 {
8080     MS_U8 u8SdGain = MDrv_Read2Byte(REG_FSC_BK30_20_L)&0xFF;
8081     MS_U8 u8FhdGain = MDrv_Read2Byte(REG_FSC_BK30_20_L)>>8;
8082     MS_U8 u8HdGain = MDrv_Read2Byte(REG_FSC_BK30_21_L)&0xFF;
8083     MS_U8 u8SCArtificialfnlGain = MDrv_Read2Byte(REG_FSC_BK30_1A_L)&0x7F;
8084     MS_U8 u8HdFhdGainBld;
8085     MS_U16 u16FinalGainBld;
8086 
8087     u8HdFhdGainBld = ( fhdw*u8FhdGain + (256-fhdw)*u8HdGain )/256;
8088     u16FinalGainBld = ( sdw*u8SdGain + (256-sdw)*u8HdFhdGainBld )/256;
8089     u16FinalGainBld = ( u16ArtiW*u8SCArtificialfnlGain + (256-u16ArtiW)*u16FinalGainBld)>>8;
8090     u16FinalGainBld = ( u16FinalGainBld * srEnhStr )>>5;
8091     u16FinalGainBld = __minmax(u16FinalGainBld,0,127); //7bit gain
8092     PqWriteReg->Pk2DfinalGain = u16FinalGainBld;
8093 
8094     //printf("Eva: SDGain = %d , FhdGain = %d , HdGain = %d FHDbld = %d finalBld = %d\n",u8SdGain,u8FhdGain,u8HdGain,u8HdFhdGainBld,u16FinalGainBld);
8095     //u16FinalGainBld = u16FinalGainBld << 8;
8096     //MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L,  u16FinalGainBld , 0xFF00);
8097 
8098 }
8099 
MDrv_UFSC_PQ_SPNN(int menuW,int edgePatW,int srEnhStr,int sdW2,int fHdW2,XC_PqWriteReg * PqWriteReg)8100 void MDrv_UFSC_PQ_SPNN( int menuW, int edgePatW, int srEnhStr , int sdW2 , int fHdW2 ,XC_PqWriteReg *PqWriteReg)
8101 {
8102     MS_U8 u8ReduceW = __max(menuW,edgePatW);
8103     MS_U8 u8SpnnLgain = ( fHdW2*0x06 + (256-fHdW2)*0x08 ) >>8 ;
8104     u8SpnnLgain = (u8SpnnLgain*srEnhStr) >> 5;
8105     u8SpnnLgain = u8SpnnLgain*( 256 - u8ReduceW ) >> 8;
8106     u8SpnnLgain = (u8SpnnLgain*srEnhStr)>>5;
8107     PqWriteReg-> SPNNGL = u8SpnnLgain;
8108 
8109     MS_U8 u8SpnnHgain = 0x04;
8110     u8SpnnHgain = u8SpnnHgain*( 256 - u8ReduceW ) >> 8;
8111     u8SpnnHgain = (u8SpnnHgain*srEnhStr)>>5;
8112     PqWriteReg-> SPNNGH = u8SpnnHgain;
8113 
8114 
8115     //MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u8SpnnLgain , 0x001F );
8116     //MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u8SpnnHgain <<8 , 0x1F00 );
8117 }
MDrv_SC_UFSC_WRITE_REG_UI_SHARPNESS(XC_PqWriteReg * PqWriteReg,MS_U8 u8UFSCCtrl3,MS_U8 ENABLE_SR_DRIVER)8118 void MDrv_SC_UFSC_WRITE_REG_UI_SHARPNESS(XC_PqWriteReg *PqWriteReg , MS_U8 u8UFSCCtrl3 ,MS_U8 ENABLE_SR_DRIVER)
8119 {
8120     #define maserati_2dpk_side_effect_issue
8121     #define UI_LINK_ALL_IP  //for when UI bypass(=0) It looked still has enhancement
8122     //UI Sharpness control register
8123     MS_U8 u8UISharpnessGain = MDrv_Read2Byte(REG_FSC_BK30_11_L)&0xFF;
8124     // re-mapping 0~63 to 0~100 center: 0x1A : 50
8125     MS_U8 min_ui = 0;
8126     MS_U8 max_ui = 63;
8127     MS_U8 center_ui = 0x1A;
8128     //u8UISharpnessGain = minmax( u8UISharpnessGain - center_ui , min_ui - center_ui , max_ui - center_ui);
8129 
8130     //re-mapping 0~63 to 0~128 center: 0x1A : 64
8131     MS_U8 u8Mode = (MDrv_Read2Byte(REG_FSC_BK30_10_L)>>7)&0x01;
8132 
8133     if(u8Mode == 0){
8134         if(u8UISharpnessGain < center_ui)
8135             u8UISharpnessGain = (64*(u8UISharpnessGain - min_ui))/(center_ui-min_ui);
8136         else
8137             u8UISharpnessGain = 64 + (64*(u8UISharpnessGain - center_ui)/(max_ui - center_ui));
8138     }
8139     else if(u8Mode == 1)
8140         u8UISharpnessGain = (64-center_ui) + u8UISharpnessGain ;
8141 
8142     u8UISharpnessGain = __minmax(u8UISharpnessGain , 0 , 128);
8143 
8144     MS_U8 u8SharpnessFor2DPK;
8145 #ifdef maserati_2dpk_side_effect_issue
8146     u8SharpnessFor2DPK = __minmax( u8UISharpnessGain , 0 , 64 ); //soc 2dpk only can decrease strength for hw issue
8147 #else
8148     u8SharpnessFor2DPK = u8UISharpnessGain;
8149 #endif
8150 
8151 
8152     //2DPK write final gain register
8153     /*MS_U16 u16Pk2DFinalGain = PqWriteReg-> Pk2DfinalGain;
8154     MS_U32 posGain = PqWriteReg-> P3x3pkPosfinalGain;
8155     MS_U32 negGain = PqWriteReg-> P3x3pkNegfinalGain;*/
8156     MS_U16 u16Pk2DFinalGain,u16ErcEdgeG,u16ErcDetailG2,u16ErcDetailG3,u16NlmGain,u16UfscPk2DFinalGain ;
8157     MS_U32 posGain,negGain;
8158     MS_U16 u16SpnnLG, u16SpnnHG;
8159 
8160     MS_U16 u16LdefinalGain,u16LdefinalGainH,u16Prepk3x3finalGain,u16P2mfinalGain;
8161 
8162 
8163     /***** for DS FSC SD pattern too weak issue *****/
8164     /*MS_BOOL ds_sd_enhance_disable = (MDrv_Read2Byte(REG_FSC_BK30_10_L)>>8)&0x01;
8165     MS_BOOL ip_ds_en = (MApi_XC_R2BYTE(REG_SC_BK1F_10_L)>>9)&0x1;
8166     MS_BOOL op_ds_en = (MApi_XC_R2BYTE(REG_SC_BK1F_10_L)>>11)&0x1;
8167     MS_U16 u16InputHeight = MApi_XC_R2BYTE(REG_SC_BK01_06_L);
8168     MS_U16 u16InputWidth = MApi_XC_R2BYTE(REG_SC_BK01_07_L);
8169     MS_U32 u32TargetResolution = 337; //720*480>>10
8170     MS_U32 u32InputResolution = (u16InputHeight*u16InputWidth)>>10;
8171     u32InputResolution = minmax(u32InputResolution, u32TargetResolution>>2 ,u32TargetResolution);
8172     */
8173     //printf("EVATEST DS_EN = %d %d , W = %d H = %d \n",ip_ds_en,op_ds_en,u16InputWidth,u16InputHeight);
8174     /*if(ip_ds_en == 1 && op_ds_en == 1){
8175       MS_U16 u16DsSC2DPKsdGain;
8176       u16DsSC2DPKsdGain = PqWriteReg->Pk2DfinalGain;
8177       u16DsSC2DPKsdGain = (u16DsSC2DPKsdGain*u32InputResolution)/u32TargetResolution;
8178       PqWriteReg->Pk2DfinalGain = u16DsSC2DPKsdGain;
8179     }   */
8180     if( u8UFSCCtrl3 & ENABLE_SR_DRIVER)
8181     {
8182         u16Pk2DFinalGain = PqWriteReg-> Pk2DfinalGain;
8183         posGain = PqWriteReg-> P3x3pkPosfinalGain;
8184         negGain = PqWriteReg-> P3x3pkNegfinalGain;
8185         u16ErcEdgeG = PqWriteReg-> ERCEdgeG;
8186 
8187         u16ErcDetailG2 = PqWriteReg-> ERCDetailG2;
8188         u16ErcDetailG3 = PqWriteReg-> ERCDetailG3;
8189         u16NlmGain = PqWriteReg-> NLMGain;
8190         u16SpnnLG = PqWriteReg-> SPNNGL;
8191         u16SpnnHG = PqWriteReg-> SPNNGH;
8192 
8193         u16LdefinalGain = PqWriteReg-> LdefinalGain;
8194         u16LdefinalGainH = PqWriteReg-> LdefinalGainH;
8195         u16Prepk3x3finalGain = PqWriteReg-> Prepk3x3finalGain;
8196         u16P2mfinalGain = PqWriteReg-> P2mfinalGain;
8197 
8198 
8199         /*if(ip_ds_en == 1 && op_ds_en == 1 && ds_sd_enhance_disable != 1){
8200             MS_U16 u16DsSC2DPKsdGain;
8201             u16DsSC2DPKsdGain = u16Pk2DFinalGain;
8202             u16DsSC2DPKsdGain =  (u16DsSC2DPKsdGain*u32TargetResolution)/u32InputResolution;
8203             u16Pk2DFinalGain = u16DsSC2DPKsdGain;
8204         }*/
8205 
8206         u16Pk2DFinalGain = (u16Pk2DFinalGain*u8SharpnessFor2DPK)>>6;
8207         u16Pk2DFinalGain = __minmax( u16Pk2DFinalGain , 0 , 63 );
8208 
8209         u16UfscPk2DFinalGain = PqWriteReg->UFSCPk2DfinalGain;
8210         u16UfscPk2DFinalGain = (u16UfscPk2DFinalGain*u8UISharpnessGain)>>6;
8211         u16UfscPk2DFinalGain = __minmax( u16UfscPk2DFinalGain , 0 , 63 );
8212 
8213         posGain = (posGain*u8UISharpnessGain)>>6;
8214         posGain = __minmax(posGain, 0 , 0xFF);
8215         negGain = (negGain*u8UISharpnessGain)>>6;
8216         negGain = __minmax(negGain, 0 , 0xFF);
8217         u16ErcEdgeG = (u16ErcEdgeG*u8UISharpnessGain)>>6;
8218         u16ErcEdgeG = __minmax(u16ErcEdgeG, 0 , 0x003F);
8219 
8220         u16ErcDetailG2 = (u16ErcDetailG2*u8UISharpnessGain)>>6;
8221         u16ErcDetailG2 = __minmax(u16ErcDetailG2, 0 , 0x003F);
8222         u16ErcDetailG3 = (u16ErcDetailG3*u8UISharpnessGain)>>6;
8223         u16ErcDetailG3 = __minmax(u16ErcDetailG3, 0 , 0x003F);
8224         u16NlmGain = (u16NlmGain*u8UISharpnessGain)>>6;
8225         u16NlmGain = __minmax(u16NlmGain, 0 , 0x00FF);
8226 
8227         u16SpnnLG = (u16SpnnLG*u8UISharpnessGain)>>6;
8228         u16SpnnLG = __minmax(u16SpnnLG, 0 , 0x001F);
8229         u16SpnnHG = (u16SpnnHG*u8UISharpnessGain)>>6;
8230         u16SpnnHG = __minmax(u16SpnnHG, 0 , 0x001F);
8231 
8232 #ifdef UI_LINK_ALL_IP
8233         u16LdefinalGain = (u16LdefinalGain * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8234         u16LdefinalGain = __minmax(u16LdefinalGain, 0 , 0x1F);
8235 
8236         u16LdefinalGainH = (u16LdefinalGainH * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8237         u16LdefinalGainH = __minmax(u16LdefinalGainH, 0 , 0x1F);
8238 
8239         u16Prepk3x3finalGain = (u16Prepk3x3finalGain * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8240         u16Prepk3x3finalGain = __minmax(u16Prepk3x3finalGain, 0 , 0x3F);
8241 
8242         u16P2mfinalGain = (u16P2mfinalGain * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8243         u16P2mfinalGain = __minmax(u16P2mfinalGain, 0 , 0x3F);
8244 #endif
8245         //2DPK write final register
8246         u16Pk2DFinalGain = u16Pk2DFinalGain << 8;
8247         MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L,  u16Pk2DFinalGain , 0x7F00);
8248 
8249         //Post3x3PK write final gain register
8250         MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, posGain, 0x00FF );
8251         MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, negGain<<8, 0xFF00 );
8252 
8253         //ERC write register
8254         MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, u16ErcEdgeG<<8, 0x3F00 );
8255         MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, u16ErcDetailG2<<8, 0x3F00 );
8256         MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, u16ErcDetailG3, 0x003F );
8257 
8258         //NLM write register
8259         MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, u16NlmGain<<8, 0xFF00 );
8260 
8261         //UFSC 2DPK write register
8262         MApi_XC_Write2ByteMask( REG_FSC_BK19_13_L,  u16UfscPk2DFinalGain << 8 , 0x7F00);
8263 
8264         //SPNN write register
8265         MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u16SpnnLG , 0x001F );
8266         MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u16SpnnHG <<8 , 0x1F00 );
8267 
8268         //pre_enhance LDE write register
8269         MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, u16LdefinalGain<<8, 0x1F00 );
8270         MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, u16LdefinalGainH, 0x001F );
8271 
8272         //pre_enhance PK3x3 write register
8273         MApi_XC_Write2ByteMask( REG_FSC_BK4C_48_L, u16Prepk3x3finalGain, 0x003F );
8274 
8275         //P2M write register
8276         MApi_XC_Write2ByteMask( REG_FSC_BK72_41_L, u16P2mfinalGain, 0x003F );
8277 
8278     }
8279     else
8280     {
8281         u16Pk2DFinalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_13_L, 0x003F ) ;//0x20;
8282         u16UfscPk2DFinalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_16_L, 0x003F ) ;
8283         posGain = MDrv_Read2ByteMSK( REG_FSC_BK30_12_L, 0x00FF ) ;//0x30;
8284         negGain = MDrv_Read2ByteMSK( REG_FSC_BK30_12_L, 0xFF00 )>>8 ;//0x30;
8285 
8286         u16LdefinalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_3A_L, 0x001F ) ;
8287         u16LdefinalGainH = MDrv_Read2ByteMSK( REG_FSC_BK30_3A_L, 0x1F00 )>>8 ;
8288         u16Prepk3x3finalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_3B_L, 0x003F ) ;
8289         u16P2mfinalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_3B_L, 0x3F00 )>>8 ;
8290         u16NlmGain = MDrv_Read2ByteMSK( REG_FSC_BK30_3C_L, 0x00FF ) ;
8291         u16ErcEdgeG = MDrv_Read2ByteMSK( REG_FSC_BK30_3C_L, 0x3F00 )>>8 ;
8292         u16ErcDetailG2 = MDrv_Read2ByteMSK( REG_FSC_BK30_3D_L, 0x003F ) ;
8293         u16ErcDetailG3 = MDrv_Read2ByteMSK( REG_FSC_BK30_3D_L, 0x3F00 )>>8 ;
8294         u16SpnnLG = MDrv_Read2ByteMSK( REG_FSC_BK30_09_L, 0x001F ) ;
8295         u16SpnnHG = MDrv_Read2ByteMSK( REG_FSC_BK30_09_L, 0x1F00 )>>8 ;
8296 
8297 
8298         /*if(ip_ds_en == 1 && op_ds_en == 1 && ds_sd_enhance_disable != 1){
8299             MS_U16 u16DsSC2DPKsdGain;
8300             u16DsSC2DPKsdGain = u16Pk2DFinalGain;
8301             u16DsSC2DPKsdGain = (u16DsSC2DPKsdGain*u32TargetResolution)/u32InputResolution;
8302             u16Pk2DFinalGain = u16DsSC2DPKsdGain;
8303         }*/
8304         u16Pk2DFinalGain = u16Pk2DFinalGain*u8SharpnessFor2DPK>>6;
8305         u16Pk2DFinalGain = __minmax( u16Pk2DFinalGain , 0 , 63 );
8306 
8307         u16UfscPk2DFinalGain = (u16UfscPk2DFinalGain*u8UISharpnessGain)>>6;
8308         u16UfscPk2DFinalGain = __minmax( u16UfscPk2DFinalGain , 0 , 63 );
8309 
8310         posGain = posGain*u8UISharpnessGain>>6;
8311         posGain = __minmax(posGain, 0 , 0xFF);
8312         negGain = negGain*u8UISharpnessGain>>6;
8313         negGain = __minmax(negGain, 0 , 0xFF);
8314 
8315         //these function only decrease ui sharpness
8316 #ifdef UI_LINK_ALL_IP
8317 
8318         u16LdefinalGain =(u16LdefinalGain * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8319         u16LdefinalGainH = (u16LdefinalGainH * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8320         u16Prepk3x3finalGain = (u16Prepk3x3finalGain * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8321         u16P2mfinalGain = (u16P2mfinalGain * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8322         u16NlmGain = (u16NlmGain * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8323         u16ErcEdgeG = (u16ErcEdgeG * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8324         u16ErcDetailG2 = (u16ErcDetailG2 * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8325         u16ErcDetailG3 = (u16ErcDetailG3 * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8326         u16SpnnLG = (u16SpnnLG * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8327         u16SpnnHG = (u16SpnnHG * __minmax(u8UISharpnessGain,0,64) )>>6;  //only decrease can't enhance IP
8328 
8329 #endif
8330         //2DPK write final register
8331         u16Pk2DFinalGain = u16Pk2DFinalGain << 8;
8332         MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L,  u16Pk2DFinalGain , 0x7F00);
8333 
8334         //UFSC 2DPK write register
8335         MApi_XC_Write2ByteMask( REG_FSC_BK19_13_L,  u16UfscPk2DFinalGain << 8 , 0x7F00);
8336 
8337         //Post3x3PK write final gain register
8338         MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, posGain, 0x00FF );
8339         MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, negGain<<8, 0xFF00 );
8340 
8341         //pre_enhance LDE write register
8342         MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, u16LdefinalGain<<8, 0x1F00 );
8343         MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, u16LdefinalGainH, 0x001F );
8344 
8345         //pre_enhance PK3x3 write register
8346         MApi_XC_Write2ByteMask( REG_FSC_BK4C_48_L, u16Prepk3x3finalGain, 0x003F );
8347 
8348         //P2M write register
8349         MApi_XC_Write2ByteMask( REG_FSC_BK72_41_L, u16P2mfinalGain, 0x003F );
8350 
8351 
8352         //ERC write register
8353         MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, u16ErcEdgeG<<8, 0x3F00 );
8354         MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, u16ErcDetailG2<<8, 0x3F00 );
8355         MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, u16ErcDetailG3, 0x003F );
8356 
8357         //NLM write register
8358         MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, u16NlmGain<<8, 0xFF00 );
8359 
8360         //SPNN write register
8361         MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u16SpnnLG , 0x001F );
8362         MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u16SpnnHG <<8 , 0x1F00 );
8363     }
8364 
8365 
8366 }
8367 
8368 #define TIMEID_sdhdFilterBaseReport 4
MDrv_SC_SDHD_U11BaseReport(const MS_U8 _timeSharingID,MS_U32 * _hpfHdCntReport4,MS_U32 * _hpfSdCntReport4,const MS_U8 timingSegment,MS_U32 * hdNactCntRet4)8369 void MDrv_SC_SDHD_U11BaseReport( const MS_U8 _timeSharingID, MS_U32 *_hpfHdCntReport4, MS_U32 *_hpfSdCntReport4, const MS_U8 timingSegment , MS_U32 *hdNactCntRet4 )
8370 {
8371     static MS_U32 HDcnt_Act = 0, hdNactCnt = 0;
8372     static MS_U32 SDcnt_Act = 0;
8373     MS_U32 HDcnt_Act_Cur = 0;
8374     MS_U32 SDcnt_Act_Cur = 0;
8375     MS_U32 hdNactCntCur;
8376     static MS_U16 HD_ConfirmCnt = 0;//xFF; // 0x7FFF == 0
8377     MS_U32 HD_ConfirmCnt_Reg = 0;
8378     //static MS_U8 _return = 0;
8379 
8380     if( _timeSharingID == TIMEID_sdhdFilterBaseReport )
8381     {
8382         if( timingSegment == 0 )
8383         {
8384             //MDrv_SC_hpfDefaultRelod( defaultReg );
8385 
8386             MS_U16 TH1 = MDrv_Read2Byte(REG_FSC_BK30_24_L);
8387             MS_U16 TH2 = MDrv_Read2Byte(REG_FSC_BK30_25_L);
8388             MS_U16 TH3 = MDrv_Read2Byte(REG_FSC_BK30_26_L);
8389             MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x4411, 0xFFFF);
8390             //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x00C8, 0xFFFF);
8391             //MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x00C8, 0xFFFF);
8392             //MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x0814, 0xFFFF);
8393             MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, TH1, 0xFFFF);
8394             MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, TH2, 0xFFFF);
8395             MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, TH3, 0xFFFF);
8396             MApi_XC_W2BYTEMSK(REG_SC_BK02_7F_L, 0x0030, 0xFFFF);
8397 
8398         }
8399         else if( timingSegment == 1 )
8400         {
8401 
8402         }
8403         else /* Run */
8404         {
8405             HDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8406             SDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8407             hdNactCntCur =  (MApi_XC_R2BYTE(REG_SC_BK02_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_78_L)
8408                     + (MApi_XC_R2BYTE(REG_SC_BK82_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK82_78_L);
8409 
8410             //printf("PQ_LSE: MY MDrv_SC_SDHD_FilterBaseReport, HDcnt_Act_Cur = %d SDcnt_Act_Cur = %d hdNactCntCur = %d \n",HDcnt_Act_Cur,SDcnt_Act_Cur,hdNactCntCur);
8411 
8412             HDcnt_Act = (HDcnt_Act_Cur+ HDcnt_Act) >> 1;
8413             SDcnt_Act = (SDcnt_Act_Cur+ SDcnt_Act) >> 1;
8414 
8415             *_hpfHdCntReport4 = HDcnt_Act;
8416             *_hpfSdCntReport4 = SDcnt_Act;
8417             *hdNactCntRet4 = hdNactCnt = (hdNactCntCur+ hdNactCnt) >> 1;
8418 
8419             if( (HDcnt_Act > HD_ACT_TH) && (SDcnt_Act != 0) )
8420             {
8421                 if(HD_ConfirmCnt < HD_SPEED)
8422                     HD_ConfirmCnt = 0;
8423                 else
8424                     HD_ConfirmCnt = HD_ConfirmCnt - HD_SPEED;
8425             }
8426             else if( SDcnt_Act != 0 )
8427             {
8428                 if(HD_ConfirmCnt > (0x80 - SD_SPEED))
8429                     HD_ConfirmCnt = 0x80;
8430                 else
8431                     HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
8432             }
8433             else
8434             {
8435                 if(HD_ConfirmCnt < 1)
8436                     HD_ConfirmCnt = 0;
8437                 else
8438                     HD_ConfirmCnt = HD_ConfirmCnt - 1;
8439             }
8440 
8441             if( HD_ConfirmCnt > 0x20 )
8442                 HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x20;
8443             else
8444                 HD_ConfirmCnt_Reg = 0;
8445 
8446             HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
8447 
8448             if( HD_ConfirmCnt_Reg > 0x3F )
8449                 HD_ConfirmCnt_Reg = 0x3F;
8450 
8451             //_return = HD_ConfirmCnt_Reg;
8452         }
8453     }
8454 
8455 
8456     //return _return;
8457 }
8458 
8459 #define TIMEID_FilterOneReport 3
MDrv_SC_SDHD_FilterOneReport(const MS_U8 _timeSharingID,MS_U32 * _hpfHdCntReport,MS_U32 * _hpfSdCntReport,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment)8460 MS_U8 MDrv_SC_SDHD_FilterOneReport( const MS_U8 _timeSharingID, MS_U32 *_hpfHdCntReport, MS_U32 *_hpfSdCntReport, const XC_HpfDefaultRegSetting defaultReg,  const MS_U8 timingSegment  )
8461 {
8462     MS_U8 u8Luma;
8463     MS_U16 u16MinPixel,u16MaxPixel, MaxMinPixel;
8464     static MS_U32 HDcnt_Act = 0;
8465     static MS_U32 SDcnt_Act = 0;
8466     MS_U32 HDcnt_Act_Cur;
8467     MS_U32 SDcnt_Act_Cur;
8468     static MS_U16 HD_ConfirmCnt = 0;//xFF; // 0x7FFF == 0
8469     static MS_U8 u8PrevLuma = 0;
8470     static MS_U16 u16PrevMinPixel = 0;
8471     static MS_U16 u16PrevMaxPixel = 0;
8472     MS_U32 HD_ConfirmCnt_Reg;
8473     MS_U32 HDSDD_Det_threshold;
8474     static MS_U8 _return = 0;
8475 
8476     if( _timeSharingID == TIMEID_FilterOneReport )
8477     {
8478         if( timingSegment == 0 )
8479         {
8480             MDrv_SC_hpfDefaultRelod( defaultReg );
8481             u8Luma=(MS_U32)((MS_U32)u8PrevLuma*3 + MApi_XC_DLC_GetAverageValue())>>2;
8482 
8483             u8PrevLuma = u8Luma;
8484 
8485             u16MaxPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0x00FF); //move to UFSC in Maserati
8486             u16MaxPixel = (u16PrevMaxPixel*3 + u16MaxPixel ) >> 2;
8487             u16PrevMaxPixel = u16MaxPixel;
8488 
8489             u16MinPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0xFF00)>>8; //move to UFSC in Maserati
8490             u16MinPixel = (u16PrevMinPixel*3 + u16MinPixel ) >> 2;
8491             u16PrevMinPixel = u16MinPixel;
8492 
8493             MaxMinPixel = u16MaxPixel - u16MinPixel;
8494 
8495             if(u8Luma>=0xFF)
8496                 u8Luma = 0xFF;
8497 
8498             HDSDD_Det_threshold = ((MaxMinPixel*6)>>2) + ((u8Luma*5)>>2);
8499 
8500             if(HDSDD_Det_threshold >=0xFFFF)
8501                 HDSDD_Det_threshold=0xFFFF;
8502 
8503             MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, (MS_U16)HDSDD_Det_threshold, 0xFFFF);
8504             MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, (MS_U16)(HDSDD_Det_threshold>>1), 0xFFFF);
8505 
8506             MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x1000, 0x7000);
8507             MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0100, 0x0700); /*for HD repot*/
8508 
8509             MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0000 , 0x0001); /* mode */
8510             MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0000 , 0x0010); /* mode */
8511 
8512 
8513            MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x000C, 0x003F); /* underflow */
8514            MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3200, 0x3F00); /* overflow */
8515 
8516 
8517         }
8518         else if( timingSegment == 1 )
8519         {
8520 
8521         }
8522         else /* Run */
8523         {
8524             HDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8525             SDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8526 
8527             HDcnt_Act = (HDcnt_Act_Cur+ HDcnt_Act*3) >> 2;
8528             SDcnt_Act = (SDcnt_Act_Cur+ SDcnt_Act*3) >> 2;
8529 
8530             *_hpfHdCntReport = HDcnt_Act;
8531             *_hpfSdCntReport = SDcnt_Act;
8532 
8533 
8534             if( (HDcnt_Act > HD_ACT_TH) && (SDcnt_Act != 0) )
8535             {
8536                 if(HD_ConfirmCnt < HD_SPEED)
8537                     HD_ConfirmCnt = 0;
8538                 else
8539                     HD_ConfirmCnt = HD_ConfirmCnt - HD_SPEED;
8540             }
8541             else if( SDcnt_Act != 0 )
8542             {
8543                 if(HD_ConfirmCnt > (0x80 - SD_SPEED))
8544                     HD_ConfirmCnt = 0x80;
8545                 else
8546                     HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
8547             }
8548             else
8549             {
8550                 if(HD_ConfirmCnt < 1)
8551                     HD_ConfirmCnt = 0;
8552                 else
8553                     HD_ConfirmCnt = HD_ConfirmCnt - 1;
8554             }
8555 
8556             if( HD_ConfirmCnt > 0x20 )
8557                 HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x20;
8558             else
8559                 HD_ConfirmCnt_Reg = 0;
8560 
8561             HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
8562 
8563             if( HD_ConfirmCnt_Reg > 0x3F )
8564                 HD_ConfirmCnt_Reg = 0x3F;
8565 
8566             _return = HD_ConfirmCnt_Reg;
8567         }
8568     }
8569     else
8570     {
8571         //  return to the original condition
8572         //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold , 0xFFFF);
8573         //MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold , 0xFFFF);
8574     }
8575 
8576     return _return;
8577 }
8578 
MDrv_SC_Edison_NEW_SDHD_DETECT_report(void)8579 MS_U8 MDrv_SC_Edison_NEW_SDHD_DETECT_report(void)
8580 {
8581     MS_U32 HDcnt_Act[5] = {0,0,0,0,0};
8582     MS_U32 SDcnt_Act[5] = {0,0,0,0,0};
8583     MS_U32 FeatherCnt[5] = {0,0,0,0,0};
8584     MS_U32 SDcnt_NonAct[5] = {0,0,0,0,0};
8585     static MS_U32 HDcnt_Act_prv[5] = {0,0,0,0,0};
8586     static MS_U32 SDcnt_Act_prv[5] = {0,0,0,0,0};
8587     static MS_U32 FeatherCnt_prv[5] = {0,0,0,0,0};
8588     static MS_U32 SDcnt_NonAct_prv[5] = {0,0,0,0,0};
8589     static MS_U8 SD2HD_CNT = 0;
8590     static MS_U16 HD_ConfirmCnt[5] = {0,0,0,0,0};//xFF;
8591     static MS_U32 HD_ConfirmCnt_Reg[5] = {0,0,0,0,0};
8592     static MS_U32 HD_ConfirmCnt_Reg_f_prv = 0;
8593     MS_U32 HD_ConfirmCnt_Reg_f = 0;
8594 
8595     if( SD2HD_CNT == 0 )
8596     {
8597         //empty stage
8598     }
8599     else if( SD2HD_CNT == 1 )
8600     {
8601         //Detect corner logo
8602         //left-side
8603         HDcnt_Act[0] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8604         SDcnt_Act[0] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8605         SDcnt_NonAct[0] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8606         FeatherCnt[0]   =  MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8607 
8608         //IIR result
8609         HDcnt_Act[0]    = (HDcnt_Act_prv[0]*3 + HDcnt_Act[0])/4;
8610         SDcnt_Act[0]    = (SDcnt_Act_prv[0]*3 + SDcnt_Act[0])/4;
8611         SDcnt_NonAct[0] = (SDcnt_NonAct_prv[0]*3 + SDcnt_NonAct[0])/4;
8612         FeatherCnt[0]   = (FeatherCnt_prv[0]*3 + FeatherCnt[0])/4;
8613         HDcnt_Act_prv[0]    = HDcnt_Act[0];
8614         SDcnt_Act_prv[0]    = SDcnt_Act[0];
8615         SDcnt_NonAct_prv[0] = SDcnt_NonAct[0];
8616         FeatherCnt_prv[0]   = FeatherCnt[0];
8617 
8618         if((HDcnt_Act[0] > HD_ACT_TH) && (SDcnt_Act[0] != 0)) //debugging
8619         {
8620             if(HD_ConfirmCnt[0] < HD_SPEED*5)
8621                 HD_ConfirmCnt[0] = 0;
8622             else
8623                 HD_ConfirmCnt[0] = HD_ConfirmCnt[0] - HD_SPEED*5;
8624         }
8625         else if( SDcnt_Act[0] != 0 ) //w/o consider feathering
8626         {
8627             if(HD_ConfirmCnt[0] > (0xFF - SD_SPEED*5))
8628                 HD_ConfirmCnt[0] = 0xFF;
8629             else
8630                 HD_ConfirmCnt[0] = HD_ConfirmCnt[0] + SD_SPEED*5;
8631         }
8632         else
8633         {
8634             if(HD_ConfirmCnt[0] < 1)
8635                 HD_ConfirmCnt[0] = 0;
8636             else
8637                 HD_ConfirmCnt[0] = HD_ConfirmCnt[0] - 1;
8638         }
8639 
8640         if( HD_ConfirmCnt[0] > 0x80 )
8641             HD_ConfirmCnt_Reg[0] = HD_ConfirmCnt[0] - 0x80;
8642         else
8643             HD_ConfirmCnt_Reg[0] = 0;
8644 
8645         HD_ConfirmCnt_Reg[0] = (HD_ConfirmCnt_Reg[0]*HDSDD_SPEED) >> HDSDD_DIV;
8646 
8647         if( HD_ConfirmCnt_Reg[0] > 0x3F )
8648             HD_ConfirmCnt_Reg[0] = 0x3F;
8649 
8650         //for SD2HD_CNT == 2 window size
8651         //MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 480, 0x1FFF);
8652         //MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1440, 0x1FFF);
8653     }
8654     else if( SD2HD_CNT == 2 )
8655     {
8656         //empty stage
8657     }
8658     else if( SD2HD_CNT == 3 )
8659     {
8660         HDcnt_Act[1] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8661         SDcnt_Act[1] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8662         SDcnt_NonAct[1] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8663         FeatherCnt[1]   =  MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8664 
8665         //IIR result
8666         HDcnt_Act[1]    = (HDcnt_Act_prv[1]*3 + HDcnt_Act[1])/4;
8667         SDcnt_Act[1]    = (SDcnt_Act_prv[1]*3 + SDcnt_Act[1])/4;
8668         SDcnt_NonAct[1] = (SDcnt_NonAct_prv[1]*3 + SDcnt_NonAct[1])/4;
8669         FeatherCnt[1]   = (FeatherCnt_prv[1]*3 + FeatherCnt[1])/4;
8670         HDcnt_Act_prv[1]    = HDcnt_Act[1];
8671         SDcnt_Act_prv[1]    = SDcnt_Act[1];
8672         SDcnt_NonAct_prv[1] = SDcnt_NonAct[1];
8673         FeatherCnt_prv[1]   = FeatherCnt[1];
8674 
8675         if( (HDcnt_Act[1] > HD_ACT_TH) && (SDcnt_Act[1] != 0) )
8676         {
8677             if(HD_ConfirmCnt[1] < HD_SPEED*5)
8678                 HD_ConfirmCnt[1] = 0;
8679             else
8680                 HD_ConfirmCnt[1] = HD_ConfirmCnt[1] - HD_SPEED*5;
8681 
8682         }
8683         else if( SDcnt_Act[1] != 0 ) //w/o consider feathering
8684         {
8685             if(HD_ConfirmCnt[1] > (0xFF - SD_SPEED*5))
8686                 HD_ConfirmCnt[1] = 0xFF;
8687             else
8688                 HD_ConfirmCnt[1] = HD_ConfirmCnt[1] + SD_SPEED*5;
8689         }
8690         else
8691         {
8692             if(HD_ConfirmCnt[1] < 1)
8693                 HD_ConfirmCnt[1] = 0;
8694             else
8695                 HD_ConfirmCnt[1] = HD_ConfirmCnt[1] - 1;
8696         }
8697 
8698         if( HD_ConfirmCnt[1] > 0x80 )
8699             HD_ConfirmCnt_Reg[1] = HD_ConfirmCnt[1] - 0x80;
8700         else
8701             HD_ConfirmCnt_Reg[1] = 0;
8702 
8703         HD_ConfirmCnt_Reg[1] = (HD_ConfirmCnt_Reg[1]*HDSDD_SPEED) >> HDSDD_DIV;
8704 
8705         if( HD_ConfirmCnt_Reg[1] > 0x3F )
8706             HD_ConfirmCnt_Reg[1] = 0x3F;
8707 
8708         //for SD2HD_CNT == 4 window size
8709         //MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 640, 0x1FFF);
8710         //MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1280, 0x1FFF);
8711     }
8712     else if( SD2HD_CNT == 4 )
8713     {
8714         //empty stage
8715     }
8716     else if( SD2HD_CNT == 5 )
8717     {
8718         HDcnt_Act[2] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8719         SDcnt_Act[2] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8720         SDcnt_NonAct[2] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8721         FeatherCnt[2]   =  MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8722 
8723         //IIR result
8724         HDcnt_Act[2]    = (HDcnt_Act_prv[2]*3 + HDcnt_Act[2])/4;
8725         SDcnt_Act[2]    = (SDcnt_Act_prv[2]*3 + SDcnt_Act[2])/4;
8726         SDcnt_NonAct[2] = (SDcnt_NonAct_prv[2]*3 + SDcnt_NonAct[2])/4;
8727         FeatherCnt[2]   = (FeatherCnt_prv[2]*3 + FeatherCnt[2])/4;
8728         HDcnt_Act_prv[2]    = HDcnt_Act[2];
8729         SDcnt_Act_prv[2]    = SDcnt_Act[2];
8730         SDcnt_NonAct_prv[2] = SDcnt_NonAct[2];
8731         FeatherCnt_prv[2]   = FeatherCnt[2];
8732 
8733         if( (HDcnt_Act[2] > HD_ACT_TH) && (SDcnt_Act[2] != 0) )
8734         {
8735             if(HD_ConfirmCnt[2] < HD_SPEED*5)
8736                 HD_ConfirmCnt[2] = 0;
8737             else
8738                 HD_ConfirmCnt[2] = HD_ConfirmCnt[2] - HD_SPEED*5;
8739 
8740         }
8741         else if( SDcnt_Act[2] != 0 ) //w/o consider feathering
8742         {
8743             if(HD_ConfirmCnt[2] > (0xFF - SD_SPEED*5))
8744                 HD_ConfirmCnt[2] = 0xFF;
8745             else
8746                 HD_ConfirmCnt[2] = HD_ConfirmCnt[2] + SD_SPEED*5;
8747         }
8748         else
8749         {
8750             if(HD_ConfirmCnt[2] < 1)
8751                 HD_ConfirmCnt[2] = 0;
8752             else
8753                 HD_ConfirmCnt[2] = HD_ConfirmCnt[2] - 1;
8754         }
8755 
8756         if( HD_ConfirmCnt[2] > 0x80 )
8757             HD_ConfirmCnt_Reg[2] = HD_ConfirmCnt[2] - 0x80;
8758         else
8759             HD_ConfirmCnt_Reg[2] = 0;
8760 
8761         HD_ConfirmCnt_Reg[2] = (HD_ConfirmCnt_Reg[2]*HDSDD_SPEED) >> HDSDD_DIV;
8762 
8763         if( HD_ConfirmCnt_Reg[2] > 0x3F )
8764             HD_ConfirmCnt_Reg[2] = 0x3F;
8765 
8766         //MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 40, 0x1FFF);
8767         //MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1880, 0x1FFF);
8768     }
8769 
8770     if( SD2HD_CNT == 5 )
8771     {
8772         HD_ConfirmCnt_Reg_f = HD_ConfirmCnt_Reg[2] + ((HD_ConfirmCnt_Reg[0] + HD_ConfirmCnt_Reg[1]*3 )>>2);
8773 
8774         HD_ConfirmCnt_Reg_f = (HD_ConfirmCnt_Reg_f_prv*3 + HD_ConfirmCnt_Reg_f+2)/4;
8775 
8776         if( HD_ConfirmCnt_Reg_f >= 0x3E )
8777             HD_ConfirmCnt_Reg_f = 0x3F;
8778         else if( HD_ConfirmCnt_Reg_f <= 0x02 )
8779             HD_ConfirmCnt_Reg_f = 0;
8780 
8781         HD_ConfirmCnt_Reg_f_prv = HD_ConfirmCnt_Reg_f;
8782     }
8783     else
8784     {
8785         HD_ConfirmCnt_Reg_f = HD_ConfirmCnt_Reg_f_prv;
8786         //HD_ConfirmCnt_Reg_f_prv = HD_ConfirmCnt_Reg_f_prv;
8787     }
8788 
8789     //for next frame start
8790     if( SD2HD_CNT == 5 )
8791         SD2HD_CNT = 0;
8792     else
8793         SD2HD_CNT++;
8794 
8795     return HD_ConfirmCnt_Reg_f;
8796 }
8797 
MDrv_UFSC_PQ_BNF_status(XC_BackgroundState * backgroundState,MS_BOOL isOpFrameChanged)8798 void MDrv_UFSC_PQ_BNF_status( XC_BackgroundState *backgroundState, MS_BOOL isOpFrameChanged  ) //Left half histogram data
8799 {
8800     static MS_U16 iir_Ymax = 0;
8801     static MS_U16 iir_Umax = 0;
8802     static MS_U16 iir_Vmax = 0;
8803     static MS_U32 iir_pbgrate = 0;
8804     static MS_U32 iir_flatSkinCnt = 0;
8805     static MS_U32 iir_cplxCnt = 0;
8806     static MS_U32 iir_prvBgCnt = 0;
8807     static MS_U32 iir_skinRawCnt = 0;
8808     static MS_U32 iir_cplxRawCnt = 0;
8809     static MS_U32 iir_dswRawCnt = 0;
8810 
8811     MS_U32 BNF_Yhist[32], BNF_Uhist[32], BNF_Vhist[32];
8812     static MS_BOOL SetStatus = false;
8813     MS_U16 i, Ymax, Umax, Vmax;
8814     MS_U32 Ymax_cnt, Umax_cnt, Vmax_cnt, maxYUVcnt;
8815     MS_U32 totalPixel, pbgrate;
8816 
8817     MApi_XC_Write2ByteMask(REG_FSC_BK4D_39_L, 0 , 0x0FFF );
8818     MApi_XC_Write2ByteMask(REG_FSC_BK4D_3B_L, frameWidth/2-1 , 0x0FFF );
8819     MApi_XC_Write2ByteMask(REG_FSC_BK4D_3C_L, frameHeight-1 , 0x0FFF );
8820 
8821     MApi_XC_Write2ByteMask(REG_FSC_BKCD_39_L, GuardBandWidth , 0x0FFF );
8822     MApi_XC_Write2ByteMask(REG_FSC_BKCD_3B_L, GuardBandWidth+ frameWidth/2-1 , 0x0FFF );
8823     MApi_XC_Write2ByteMask(REG_FSC_BKCD_3C_L, frameHeight-1 , 0x0FFF );
8824 
8825 
8826     if ( isOpFrameChanged )
8827     {
8828         if( !SetStatus )
8829         {
8830             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0000 , 0x0004 );
8831             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0004 , 0x0004 );
8832 
8833             SetStatus = true;
8834         }
8835         else if (( MDrv_Read2Byte(REG_FSC_BK4D_51_L)& 0x0008 ) &&  SetStatus )
8836         {
8837             // Y histogram
8838             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0000 , 0x0003 );
8839             for( i = 0 ; i < 32 ; ++i )
8840             {
8841                 MS_U16 sh = ((i&0x3)<<2);
8842                             BNF_Yhist[i] = ( MDrv_Read2Byte(REG_FSC_BK4D_58_L+ (i<<1) ) << 3 )
8843                     + ( (MDrv_Read2ByteMSK(REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8844                     + ( MDrv_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8845                     + ( (MDrv_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8846             }
8847 
8848 #if 0
8849             totalPixel = 0;
8850             //printf(" --- Y historgam -- \n");
8851             for ( i = 0 ; i < 32; i ++)
8852             {
8853                 totalPixel = totalPixel + BNF_Yhist[i];
8854                 //printf("Yhist[%d] = %d\n", i, BNF_Yhist[i]);
8855             }
8856             //printf("total pixel = %d\n", totalPixel );
8857 #endif
8858             // U histogram
8859             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0001 , 0x0003 );
8860             for( i = 0 ; i < 32 ; ++i )
8861             {
8862                 MS_U16 sh = ((i&0x3)<<2);
8863                             BNF_Uhist[i] = ( MDrv_Read2Byte( REG_FSC_BK4D_58_L + (i<<1) ) << 3 )
8864                     + ( (MDrv_Read2ByteMSK( REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8865                     + ( MDrv_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8866                     + ( (MDrv_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8867             }
8868 #if 0
8869             totalPixel = 0;
8870             //printf(" --- U historgam -- \n");
8871             for ( i = 0 ; i < 32; i ++)
8872             {
8873                 totalPixel = totalPixel + BNF_Uhist[i];
8874                 //printf("Uhist[%d] = %d\n", i, BNF_Uhist[i]);
8875             }
8876             //printf("total pixel = %d\n", totalPixel );
8877 #endif
8878 
8879 
8880             // V histogram
8881             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0002 , 0x0003 );
8882             for( i = 0 ; i < 32 ; ++i )
8883             {
8884                 MS_U16 sh = ((i&0x3)<<2);
8885                             BNF_Vhist[i] = ( MDrv_Read2Byte( REG_FSC_BK4D_58_L + (i<<1) ) << 3 )
8886                     + ( (MDrv_Read2ByteMSK( REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8887                     + ( MDrv_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8888                     + ( (MDrv_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8889             }
8890 #if 0
8891             totalPixel = 0;
8892             //printf(" --- V historgam -- \n");
8893             for ( i = 0 ; i < 32; i ++)
8894             {
8895                 totalPixel = totalPixel + BNF_Vhist[i];
8896                 //printf("Vhist[%d] = %d\n", i, BNF_Vhist[i]);
8897             }
8898             //printf("total pixel = %d\n", totalPixel );
8899 #endif
8900 
8901 
8902             Ymax = 0;
8903             Umax = 0;
8904             Vmax = 0;
8905             Ymax_cnt = 0;
8906             Umax_cnt = 0;
8907             Vmax_cnt = 0;
8908 
8909             for ( i = 0; i< 32; i++ )
8910             {
8911                 if ( BNF_Yhist[i] > Ymax_cnt )
8912                 {
8913                     Ymax = i << 4;
8914                     Ymax_cnt = BNF_Yhist[i];
8915                 }
8916 
8917                 if ( BNF_Uhist[i] > Umax_cnt )
8918                 {
8919                     Umax = i << 4;
8920                     Umax_cnt = BNF_Uhist[i];
8921                 }
8922 
8923                 if ( BNF_Vhist[i] > Vmax_cnt )
8924                 {
8925                     Vmax = i << 4 ;
8926                     Vmax_cnt = BNF_Vhist[i];
8927                 }
8928 
8929             }
8930 
8931             maxYUVcnt  = __min3(Ymax_cnt, Umax_cnt, Vmax_cnt);
8932             totalPixel = ( frameWidth* frameHeight ) >> 5;
8933             pbgrate = (totalPixel!=0) ? (maxYUVcnt*5000)/totalPixel : 0;
8934 
8935             Ymax = ((3*iir_Ymax)+ Ymax ) >> 2;
8936             iir_Ymax = Ymax;
8937 
8938             Umax = ((3*iir_Umax)+ Umax ) >> 2;
8939             iir_Umax = Umax;
8940 
8941             Vmax = ((3*iir_Vmax )+ Vmax ) >> 2;
8942             iir_Vmax = Vmax;
8943 
8944             pbgrate = ((iir_pbgrate*3 )+ pbgrate) >> 2;
8945             iir_pbgrate = pbgrate;
8946 
8947             Ymax = ( Ymax + 8 )>> 4;
8948             Umax = ( Umax + 8 )>> 4;
8949             Vmax = ( Vmax + 8 )>> 4;
8950 
8951 
8952 #if 0
8953             //printf(" max Ybin = %d, cnt = %d \n", Ymax, Ymax_cnt );
8954             //printf(" max Ubin = %d, cnt = %d \n", Umax, Umax_cnt  );
8955             //printf(" max Vbin = %d, cnt = %d \n", Vmax, Vmax_cnt  );
8956             //printf(" totalPixel = %d \n", totalPixel );
8957             //printf(" maxYUVcnt = %d \n", maxYUVcnt );
8958             //printf(" pbgrate = %d \n", pbgrate );
8959 #endif
8960 
8961             MApi_XC_Write2ByteMask(REG_FSC_BK4D_42_L, Ymax , 0x001F );
8962             MApi_XC_Write2ByteMask(REG_FSC_BK4D_42_L, Umax << 8 , 0x1F00 );
8963             MApi_XC_Write2ByteMask(REG_FSC_BK4D_43_L, Vmax , 0x001F );
8964             MApi_XC_Write2ByteMask(REG_FSC_BK4D_45_L, pbgrate , 0xDFFF );
8965 
8966             MS_U32 flatSkinCnt = ( (MDrv_Read2ByteMSK(REG_FSC_BK4D_53_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BK4D_52_L )
8967                         + (MDrv_Read2ByteMSK(REG_FSC_BKCD_53_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BKCD_52_L ) ) >> 1;
8968             MS_U32 cplxCnt = (( MDrv_Read2ByteMSK(REG_FSC_BK4D_55_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BK4D_54_L )
8969                         + (MDrv_Read2ByteMSK(REG_FSC_BKCD_55_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BKCD_54_L ) ) >> 1;
8970             MS_U32 prvBgCnt = ((MDrv_Read2ByteMSK(REG_FSC_BK4D_57_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BK4D_56_L )
8971                         + (MDrv_Read2ByteMSK(REG_FSC_BKCD_57_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BKCD_56_L ) ) >> 1;
8972             MS_U32 skinRawCnt = ((MDrv_Read2ByteMSK(REG_FSC_BK4D_4B_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BK4D_4A_L )
8973                         + (MDrv_Read2ByteMSK(REG_FSC_BKCD_4B_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BKCD_4A_L ) ) >> 1;
8974             MS_U32 cplxRawCnt = ((MDrv_Read2ByteMSK(REG_FSC_BK4D_4D_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BK4D_4C_L )
8975                         + (MDrv_Read2ByteMSK(REG_FSC_BKCD_4D_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BKCD_4C_L ) ) >> 1;
8976             MS_U32 dswRawCnt = ((MDrv_Read2ByteMSK(REG_FSC_BK4D_4F_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BK4D_4E_L )
8977                         + (MDrv_Read2ByteMSK(REG_FSC_BKCD_4F_L, 0x0007 ) << 16) +  MDrv_Read2Byte(REG_FSC_BKCD_4E_L ) ) >> 1;
8978 
8979 
8980             flatSkinCnt = ((iir_flatSkinCnt*3 )+ flatSkinCnt) >> 2;
8981             iir_flatSkinCnt = flatSkinCnt;
8982 
8983             cplxCnt = ((iir_cplxCnt*3 )+ cplxCnt) >> 2;
8984             iir_cplxCnt = cplxCnt;
8985 
8986             prvBgCnt = ((iir_prvBgCnt*3 )+ prvBgCnt) >> 2;
8987             iir_prvBgCnt = prvBgCnt;
8988 
8989             skinRawCnt = ((iir_skinRawCnt*3 )+ skinRawCnt) >> 2;
8990             iir_skinRawCnt = skinRawCnt;
8991 
8992             cplxRawCnt = ((iir_cplxRawCnt*3 )+ cplxRawCnt) >> 2;
8993             iir_cplxRawCnt = cplxRawCnt;
8994 
8995             dswRawCnt = ((iir_dswRawCnt*3 )+ dswRawCnt) >> 2;
8996             iir_dswRawCnt = dswRawCnt;
8997 
8998 
8999             backgroundState->flatSkinCnt = flatSkinCnt;
9000             backgroundState->cplxCnt = cplxCnt;
9001             backgroundState->prvBgCnt = prvBgCnt;
9002             backgroundState->skinRawCnt = skinRawCnt;
9003             backgroundState->cplxRawCnt = cplxRawCnt;
9004             backgroundState->dswRawCnt = dswRawCnt;
9005 
9006             backgroundState->pbgY = Ymax;
9007             backgroundState->pbgU = Umax;
9008             backgroundState->pbgV = Vmax;
9009             backgroundState->pbgrate = pbgrate;
9010 
9011             SetStatus = false;
9012         }
9013     }
9014 
9015 }
MDrv_UFSC_PQ_BNF(int sdw2)9016 void MDrv_UFSC_PQ_BNF(int sdw2) //Eva
9017 {
9018     short bgw_fnl_gain_sd = MDrv_Read2ByteMSK(REG_FSC_BK30_2D_L, 0x00ff);
9019     short ori_fnl_gain = MDrv_Read2ByteMSK(REG_FSC_BK30_2D_L, 0xFf00)>>8;
9020     short bld_fnl_gain = ( sdw2*bgw_fnl_gain_sd + (256-sdw2)*ori_fnl_gain ) /256;
9021     bld_fnl_gain = __minmax( bld_fnl_gain ,0 ,0x1f);
9022 
9023     MApi_XC_Write2ByteMask( REG_FSC_BK4D_36_L ,bld_fnl_gain<<8, 0x1f00 );
9024 
9025     //decrease skin protection
9026     short skinsum_gain_sd = MDrv_Read2ByteMSK(REG_FSC_BK30_2E_L, 0x000f);
9027     short ori_skinsum_gain = MDrv_Read2ByteMSK(REG_FSC_BK30_2E_L, 0x00f0)>>4;
9028     short bld_skinsum_gain = ( sdw2*skinsum_gain_sd + (256-sdw2)*ori_skinsum_gain ) /256;
9029     bld_skinsum_gain = __minmax( bld_skinsum_gain ,0 ,0xf);
9030 
9031     MApi_XC_Write2ByteMask( REG_FSC_BK4D_2A_L ,bld_skinsum_gain<<12, 0xf000 );
9032 
9033     //printf("BNFDBG: gain sd = %d , hd = %d , bld = %d \n",bgw_fnl_gain_sd,ori_fnl_gain,bld_fnl_gain);
9034     //printf("BNFDBG: gain sd = %d , hd = %d , bld = %d \n",skinsum_gain_sd,ori_skinsum_gain,bld_skinsum_gain);
9035 }
MDrv_UFSC_PQ_LSE(int frNNCnt2,int menuW,int edgePatW,int srEnhStr,int sdW2,int fHdW2,XC_PqWriteReg * PqWriteReg)9036 void MDrv_UFSC_PQ_LSE( int frNNCnt2, int menuW, int edgePatW, int srEnhStr , int sdW2 , int fHdW2 , XC_PqWriteReg *PqWriteReg)
9037 {
9038     #define LSE_EDGE_G_LB 8
9039 
9040     //printf( "PQ_LSE: frNNCnt2 = %d , menuW = %d , edgePatW = %d\n", frNNCnt2, menuW , edgePatW );
9041     //printf( "PQ_LSE: sdW2 = %d , srEnhStr = %d \n", sdW2, srEnhStr );
9042 
9043     //int artW = max( menuW, edgePatW );  //remove bcz maserati has ERC edge patch
9044 
9045     // CG pattern
9046     int nnW = __max( 0, frNNCnt2 - 2048 ) >> 3;
9047     nnW = __min( 256, nnW );
9048 
9049     // LSE adaptive edge gain
9050     int edgeGain = MDrv_Read2ByteMSK( REG_FSC_BK30_38_L, 0x003F);
9051     int edgeGainLb = LSE_EDGE_G_LB;
9052     edgeGain = __max( edgeGain, edgeGainLb );
9053 
9054     //int reduceW = max( artW, artW/*sdW2*/ );  //remove bcz maserati has ERC edge patch
9055     int sdfhdEdgeGain = ( MDrv_Read2ByteMSK( REG_FSC_BK30_38_L, 0x3F00 ) >> 8 );
9056     edgeGain = (edgeGain*(256-fHdW2) + sdfhdEdgeGain *fHdW2)>>8;
9057 
9058     //int adptGain = max( 0, edgeGain * (512-reduceW) >> 9 ); //remove bcz maserati has ERC edge patch
9059     int adptGain = edgeGain ;
9060     adptGain = (adptGain * (256-nnW)) >> 8;
9061     adptGain = (adptGain * srEnhStr) >> 5;
9062     PqWriteReg-> ERCEdgeG = adptGain;
9063     //adptGain = min( adptGain, 0x003F );
9064     //MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, adptGain<<8, 0x3F00 );
9065 
9066     // detail gain
9067     int reduceW = __max(0,256 - nnW);//max( 0, 256 - min( (sdW2>>1), nnW ) );
9068     /*{
9069         int detGain0SD = MDrv_Read2ByteMSK( REG_FSC_BK30_22_L, 0x003F);
9070         int detGain = ( MDrv_Read2ByteMSK( REG_FSC_BK30_38_L, 0x3F00 ) >> 8 );
9071         detGain = ( sdW2 * detGain0SD + (256 - sdW2)*detGain )/256;
9072         detGain = ( detGain * reduceW) >> 8;
9073         detGain = ( detGain * srEnhStr ) >> 5;
9074         detGain = min( 0x003f, detGain );
9075         MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, detGain, 0x003F );
9076 
9077     }*/
9078     {
9079         int detGain1SD = MDrv_Read2ByteMSK( REG_FSC_BK30_22_L, 0x3F00)>>8;
9080         int detGain = MDrv_Read2ByteMSK( REG_FSC_BK30_39_L, 0x003F );
9081         detGain = ( sdW2 * detGain1SD + (256 - sdW2)*detGain )/256;
9082         detGain = (detGain * reduceW) >> 8;
9083         detGain = ( detGain * srEnhStr ) >> 5;
9084         PqWriteReg-> ERCDetailG2 = detGain;
9085         //detGain = min( 0x003f, detGain );
9086         //MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, detGain<<8, 0x3F00 );
9087 
9088     }
9089     {
9090         int detGain2SD = MDrv_Read2ByteMSK( REG_FSC_BK30_23_L, 0x003F);
9091         int detGain = ( MDrv_Read2ByteMSK( REG_FSC_BK30_39_L, 0x3F00 ) >> 8 );
9092         detGain = ( sdW2 * detGain2SD + (256 - sdW2)*detGain )/256;
9093         detGain = ( detGain * reduceW) >> 8;
9094         detGain = ( detGain * srEnhStr ) >> 5;
9095         PqWriteReg-> ERCDetailG3 = detGain;
9096         //detGain = min( 0x003f, detGain );
9097         //MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, detGain, 0x003F );
9098 
9099     }
9100     // lut gain
9101     //int finalLutGain = 0x08 + ( (0x08*sdW2) >> 8 );
9102     //MApi_XC_Write2ByteMask( REG_FSC_BK75_1C_L, finalLutGain, 0x001F );
9103 
9104     //Eva modify fhd 25 ac bld more blur
9105     short fhd_bld_gain_min = MDrv_Read2ByteMSK(REG_FSC_BK30_2E_L, 0xff00)>>8;
9106     short hd_bld_gain_min = 0x20;
9107     short final_gain_min = ( fHdW2*fhd_bld_gain_min + (256-fHdW2)*hd_bld_gain_min )/256;
9108     final_gain_min = __minmax(final_gain_min , 0, 0x1ff);
9109     MApi_XC_Write2ByteMask( REG_FSC_BK75_1A_L, final_gain_min, 0x01FF );
9110 
9111 }
9112 
MDrv_UFSC_PQ_NLM(XC_BackgroundState * backgroundState,int menuW,int edgePatW,int srEnhStr,int sdw2,XC_PqWriteReg * PqWriteReg)9113 void MDrv_UFSC_PQ_NLM( XC_BackgroundState *backgroundState, int menuW, int edgePatW, int srEnhStr , int sdw2 , XC_PqWriteReg *PqWriteReg)
9114 {
9115     //NLM DS patch gain sd pattern use ds patch but hd pattern not use
9116     int ds_patch_gain_sd = MDrv_Read2ByteMSK(REG_FSC_BK30_2F_L, 0xff00)>>8;//0x18;
9117     int ds_patch_gain_final;
9118     ds_patch_gain_final = (sdw2*ds_patch_gain_sd + (256-sdw2)*0)/256;
9119     MApi_XC_Write2ByteMask( REG_FSC_BK70_2A_L, ds_patch_gain_final <<8, 0x3F00 );
9120 
9121     // coring
9122     MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, __max( edgePatW, menuW ) >> 3, 0x00FF );
9123 
9124     // NLM gain for skin, this should use colour adaptive
9125     int pbSkinW = __max( 0, (int)backgroundState->flatSkinCnt - 1200) >> 2;
9126     pbSkinW = __min( 16, pbSkinW );
9127 
9128     // NLM gain
9129     int finGain = /*0xA*/MDrv_Read2ByteMSK( REG_FSC_BK30_30_L, 0x00FF ) - ( (4 * pbSkinW) >> 4 );
9130     finGain = ( finGain * srEnhStr ) >> 5;
9131     PqWriteReg-> NLMGain = finGain;
9132     //finGain = min( 0x00FF, finGain );
9133     //MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, finGain<<8, 0xFF00 );
9134 
9135     //printf( "pbSkinW, NLM gain : %d, %d\n", pbSkinW, finGain );
9136 
9137 }
9138 
MDrv_UFSC_PQ_PreEnh(int fHdw2,int sdw2,MS_U16 estNoise,MS_U8 estConfirm,int srEnhStr,XC_PqWriteReg * PqWriteReg)9139 void MDrv_UFSC_PQ_PreEnh( int fHdw2, int sdw2, MS_U16 estNoise,MS_U8 estConfirm, int srEnhStr,XC_PqWriteReg *PqWriteReg )
9140 {
9141     // BLTI bias gain
9142     int biasGain = ( 0x10 * fHdw2 ) >> 8;
9143     if( fHdw2 == 256 )
9144     {
9145         biasGain = ( 0x10 * (256-sdw2) + 0x20 * sdw2 ) >> 8;
9146     }
9147 
9148     MApi_XC_Write2ByteMask( REG_FSC_BK4C_52_L, biasGain, 0x007F );
9149 
9150     // LTI ac thrd
9151     int acThrd = ( 0x04 * (256-sdw2) + 0x1C * sdw2 ) >> 8;
9152     MApi_XC_Write2ByteMask( REG_FSC_BK4C_53_L, acThrd<<8, 0xFF00 );
9153 
9154     // Pre PK3x3
9155     int finGain = (( MDrv_Read2ByteMSK( REG_FSC_BK30_30_L, 0x3F00 ) >> 8 ) * srEnhStr );
9156     finGain = finGain*(256-fHdw2)>>8;//for maserati 2dpk issue
9157     finGain = finGain* srEnhStr  >> 5;
9158     finGain = __minmax(finGain,0,0x3F);
9159 	PqWriteReg-> Prepk3x3finalGain = finGain;
9160 
9161     //finGain = __min( 0x3F00, finGain );
9162     //MApi_XC_Write2ByteMask( REG_FSC_BK4C_48_L, finGain, 0x003F );
9163 
9164     // LDE
9165 #ifdef BFEvaModify
9166     int ldeDarkGain = MDrv_Read2ByteMSK( REG_FSC_BK30_31_L, 0x1F00) >> 8 ;
9167     int ldeDarkGainSD = MDrv_Read2ByteMSK( REG_FSC_BK30_32_L, 0x001F) ;
9168     int ldeDarkGainFHD = (ldeDarkGain + ldeDarkGainSD) >> 1;
9169     int ldeGain = ( ldeDarkGain/*0xA*/ * (256 - fHdw2) + ldeDarkGainFHD/*0x12*/ * fHdw2 ) >> 8;
9170     if( fHdw2 == 256 )
9171     {
9172         ldeGain = ( ldeDarkGainFHD * (256-sdw2) + ldeDarkGainSD/*0x1A*/ * sdw2 ) >> 8;
9173     }
9174 #else
9175     int ldeDarkGain = MDrv_Read2ByteMSK( REG_FSC_BK30_31_L, 0x1F00) >> 8 ;
9176     int ldeDarkGainSD= MDrv_Read2ByteMSK( REG_FSC_BK30_32_L, 0x001F) ;
9177     int ldeDarkGainFHD=MDrv_Read2ByteMSK( REG_FSC_BK30_32_L, 0x1F00)>>8 ;
9178     int ldeGain = ( ldeDarkGain/*0xA*/ * (256 - fHdw2) + ldeDarkGainFHD/*0x12*/ * fHdw2 ) >> 8;
9179     if( fHdw2 == 256 )
9180     {
9181         ldeGain = ( ldeDarkGainFHD * (256-sdw2) + ldeDarkGainSD/*0x05*/ * sdw2 ) >> 8;
9182     }
9183 #endif
9184 
9185     MS_U8 report_noise = __minmax(estNoise,0,15);
9186     report_noise = (report_noise == 15) ? 16 : report_noise;
9187     MS_U8 report_confirm = __minmax(estConfirm-1,0,7);
9188     report_confirm = __max(0,report_confirm - 2) * 4;
9189     report_confirm = __minmax( report_confirm, 0, 16 );
9190 
9191     int noiseW = estNoise - (16-report_confirm);
9192     noiseW = 16 - __minmax( noiseW, 0, 16 );
9193     // back to default while noise is large
9194     ldeGain = ( ldeDarkGain * (16-noiseW) + ldeGain/*0xA*/ * noiseW ) >> 4;
9195     ldeGain = ( ldeGain * srEnhStr ) >> 5;
9196     ldeGain = __minmax(ldeGain,0,0x1F);
9197 	PqWriteReg-> LdefinalGain = ldeGain;
9198 
9199     //MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, ldeGain<<8, 0x1F00 );
9200 
9201     int ldeGainH =( MDrv_Read2ByteMSK( REG_FSC_BK30_31_L, 0x001F )/*0xA*/ * noiseW ) >> 4;
9202     ldeGainH = ( ldeGainH * srEnhStr ) >> 5;
9203     ldeGainH = __minmax(ldeGainH,0,0x1F);
9204 	PqWriteReg-> LdefinalGainH = ldeGainH;
9205     //MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, ldeGainH, 0x001F );
9206 }
9207 
MDrv_UFSC_PQ_PostPK3x3(int menuW,int edgePatW,int fHdW,int sdW,int srEnhStr,XC_PqWriteReg * PqWriteReg,MS_U16 u16ArtiW)9208 void MDrv_UFSC_PQ_PostPK3x3( int menuW, int edgePatW, int fHdW, int sdW, int srEnhStr , XC_PqWriteReg *PqWriteReg ,MS_U16 u16ArtiW)
9209 {
9210     // ds_minw
9211     edgePatW = __max( edgePatW, menuW );
9212     fHdW = __max( 0, fHdW - edgePatW );
9213     int dsmin = MDrv_Read2ByteMSK( REG_FSC_BK30_33_L, 0xFF00) >> 8;
9214     int dsminSD = __min( 0x00FF, dsmin + MDrv_Read2ByteMSK( REG_FSC_BK30_34_L, 0x00FF) );
9215     int dsminFHD = (dsmin*170 + dsminSD*86) >> 8;
9216     int dsminW = ( dsmin * (256-fHdW) + /*0x20*/dsminFHD * fHdW ) >> 8;
9217     if( fHdW == 256 )
9218     {
9219         dsminW = ( /*0x20*/dsminFHD * (256-sdW) + /*0x60*/dsminSD * sdW ) >> 8;
9220     }
9221     MApi_XC_Write2ByteMask( REG_FSC_BK76_42_L, dsminW<<8, 0xFF00 );
9222 
9223     // ds gain
9224     //int dsw = MApi_XC_R2BYTEMSK( REG_SC_BK30_32_H, 0xFF );
9225     //int dswSD = MApi_XC_R2BYTEMSK( REG_SC_BK30_33_L, 0xFF );
9226     int dsGain = 0xB/*dsw*/ - ( ((0xB/*dswSD*/)*fHdW ) >> 8 );
9227     //int dsGain = ( dsw * (256-fHdW) + dswSD * fHdW ) >> 8;
9228     MApi_XC_Write2ByteMask( REG_FSC_BK76_42_L, (dsGain&0xFF), 0x00FF );
9229 
9230     int post3x3pkGain_FHD = MDrv_Read2ByteMSK(REG_FSC_BK30_2F_L , 0x00ff);
9231     int post3x3pkGain_Arti_pos = MDrv_Read2ByteMSK(REG_FSC_BK30_1B_L , 0x00ff);
9232     int post3x3pkGain_Arti_neg = MDrv_Read2ByteMSK(REG_FSC_BK30_1B_L , 0xff00)>>8;
9233     int posGain = (  0x30*(256-fHdW) + post3x3pkGain_FHD*fHdW )>>8;
9234     posGain = (  posGain*(256-sdW) + 0x18*sdW )>>8;
9235     posGain = (  posGain*(256-u16ArtiW) + post3x3pkGain_Arti_pos*u16ArtiW )>>8;
9236     posGain = ( posGain * srEnhStr ) >> 5;
9237     posGain = __min( 0xFF, posGain );
9238     PqWriteReg-> P3x3pkPosfinalGain = posGain;
9239     //MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, posGain, 0x00FF );
9240 
9241     int negGain = (  0x30*(256-fHdW) + post3x3pkGain_FHD*fHdW )>>8;
9242     negGain = (  negGain*(256-u16ArtiW) + post3x3pkGain_Arti_neg*u16ArtiW )>>8;
9243     negGain = ( negGain * srEnhStr ) >> 5;
9244     negGain = __min( 0xFF, negGain );
9245     PqWriteReg-> P3x3pkNegfinalGain = negGain;
9246     //MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, negGain<<8, 0xFF00 );
9247 
9248 
9249 }
9250 
MDrv_UFSC_PQ_HASC(int sdW,int srEnhStr)9251 void MDrv_UFSC_PQ_HASC( int sdW, int srEnhStr )
9252 {
9253        int lowGain = /*0x28*/( MDrv_Read2ByteMSK( REG_FSC_BK30_36_L, 0x7F00 ) >> 8 )
9254         + ( (/*0x38*/MDrv_Read2ByteMSK( REG_FSC_BK30_37_L, 0x007F ) * sdW) >> 8 );
9255     lowGain = ( lowGain * srEnhStr ) >> 5;
9256     lowGain = __min( lowGain, 0x007F );
9257     MApi_XC_Write2ByteMask( REG_FSC_BK74_2E_L, lowGain<<8, 0x7F00 );
9258 
9259        int highGain = ( /*0x18*/MDrv_Read2ByteMSK( REG_FSC_BK30_36_L, 0x007F ) * srEnhStr ) >> 5;
9260     highGain = __min( 0x007F, highGain );
9261     MApi_XC_Write2ByteMask( REG_FSC_BK74_2E_L, highGain, 0x007F );
9262 }
9263 
MDrv_UFSC_PQ_P2M(int menuW,int edgePatW,int srEnhStr,XC_PqWriteReg * PqWriteReg)9264 void MDrv_UFSC_PQ_P2M( int menuW, int edgePatW, int srEnhStr , XC_PqWriteReg *PqWriteReg)
9265 {
9266     int gain = ( /*9*/( MDrv_Read2ByteMSK( REG_FSC_BK30_37_L, 0x3F00 )>>8 ) * (256 - __max(edgePatW, menuW)) ) >> 8;
9267     gain = (gain * srEnhStr ) >> 5;
9268     gain = __min( 0x3F00, gain );
9269     PqWriteReg-> P2mfinalGain = gain;
9270     //MApi_XC_Write2ByteMask( REG_FSC_BK72_41_L, gain, 0x003F );
9271 }
9272 
MDrv_UFSC_PQ_ANN(int frNNCnt2)9273 void MDrv_UFSC_PQ_ANN( int frNNCnt2 )
9274 {
9275     // CG pattern
9276     int nnW = __max( 0, frNNCnt2 - 2048 ) >> 3;
9277     nnW = __min( 256, nnW );
9278     int artNNW = __max( 0, frNNCnt2 - 8192 ) >> 4;
9279     artNNW = __min( 256, artNNW );
9280 
9281     int colorGain = ( 0x10 * (256-nnW) + 0x7 * nnW ) >> 8;
9282     colorGain = ( colorGain * (256-artNNW) + 0x04 * artNNW ) >> 8;
9283     int colorOffset = ( artNNW * 0x18 ) >> 8;
9284 
9285     int strictGain = ( 0x20 * (256-nnW) + 0x4 * nnW ) >> 8;
9286     strictGain = ( strictGain * (256-artNNW) + 0x2 * artNNW ) >> 8;
9287     int strictOffset = ( 0x17 * nnW ) >> 8;
9288     strictOffset = ( strictOffset * (256-artNNW) + 0x0 * artNNW ) >> 8;
9289 
9290     int nnGain = ( 0x10 * (256-artNNW) + 0x18 * artNNW ) >> 8;
9291 
9292     MApi_XC_Write2ByteMask( REG_FSC_BK72_25_L, ((colorGain<<8)+colorOffset), 0xFF00 );
9293     MApi_XC_Write2ByteMask( REG_FSC_BK72_26_L, ((strictGain<<8)+strictOffset), 0xFF00 );
9294     MApi_XC_Write2ByteMask( REG_FSC_BK72_2D_L, nnGain, 0x001F );
9295 
9296 }
9297 
MDrv_UFSC_PQ_DMS_referBNF(XC_BackgroundState * backgroundState)9298 void MDrv_UFSC_PQ_DMS_referBNF( XC_BackgroundState *backgroundState )
9299 {
9300 
9301     MS_U16 Ymax_idx = backgroundState->pbgY;
9302     MS_U16 Umax_idx = backgroundState->pbgU;
9303     MS_U16 Vmax_idx = backgroundState->pbgV;
9304     MS_U32 confidence = backgroundState->pbgrate;
9305 
9306 
9307     MApi_XC_Write2ByteMask(REG_FSC_BK26_44_L, Ymax_idx , 0x001F );
9308     MApi_XC_Write2ByteMask(REG_FSC_BK26_45_L, Umax_idx , 0x001F );
9309     MApi_XC_Write2ByteMask(REG_FSC_BK26_45_L, Vmax_idx << 8 , 0x1F00 );
9310     MApi_XC_Write2ByteMask(REG_FSC_BK26_46_L, confidence, 0x3FFF );
9311 
9312 }
9313 
9314 //-------------------------------------------------------------------------------------------------
9315 /// LSE PQ function
9316 //  1. Zone plate patch
9317 //-------------------------------------------------------------------------------------------------
9318 
MDrv_UFSC_PQ_LSE_Patch(void)9319 void MDrv_UFSC_PQ_LSE_Patch(void)
9320 {
9321     static int iir_std_stat = 0;
9322     //int std_stat_TH = 5;
9323     int reg_std_stat =  MDrv_Read2Byte(REG_FSC_BK2C_79_L);
9324     int totalPixelCount = (( MDrv_Read2Byte( REG_FSC_BK55_19_L ) << 16 ) + MDrv_Read2Byte( REG_FSC_BK55_18_L ));
9325     int totalPixelYSum= ( MDrv_Read2Byte( REG_FSC_BK55_1B_L ) << 16 ) + MDrv_Read2Byte( REG_FSC_BK55_1A_L );
9326 
9327     totalPixelCount = (totalPixelCount / 256);
9328 
9329     if (totalPixelCount == 0)
9330         return;
9331     //printf("totalPixelCount:%d  ;totalPixelYSum%d \n",totalPixelCount,totalPixelYSum);
9332 
9333     int APL = (totalPixelYSum / totalPixelCount);
9334 
9335     /* IIR states */
9336     reg_std_stat = ((iir_std_stat*3 )+ reg_std_stat ) >> 2;
9337     iir_std_stat = reg_std_stat;
9338 
9339     APL = (APL == 0) ? 1 : APL;
9340 
9341     iir_std_stat = (iir_std_stat / APL );
9342 
9343     /*if ((iir_std_stat > std_stat_TH) || (APL < 20))
9344     {
9345         MApi_XC_Write2ByteMask(REG_FSC_BK75_18_L, 0x00, 0x0F);//reg_lse_local_cplx_lut_gain
9346         MApi_XC_Write2ByteMask(REG_FSC_BK71_31_L, 0x0000 , 0x0100);//reg_lse_nlm_gain_en
9347         MApi_XC_Write2ByteMask(REG_FSC_BK71_30_L, 0x0000 , 0x0100);//reg_lse_uc_en
9348         MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x00, 0x03);//reg_time_of_cross_weight
9349         MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x00, 0x18);//reg_time_of_x_weight
9350         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x00 , 0xF0);//reg_main_lti_jaggy_min
9351         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0000 , 0x1F00);//reg_main_lti_jaggy_slope
9352         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x8000 , 0x8000);//reg_main_lti_jaggy_en
9353     }
9354     else
9355     {
9356         MApi_XC_Write2ByteMask(REG_FSC_BK75_18_L, 0x08, 0x0F);//reg_lse_local_cplx_lut_gain
9357         MApi_XC_Write2ByteMask(REG_FSC_BK71_31_L, 0x0100 , 0x0100);//reg_lse_nlm_gain_en
9358         MApi_XC_Write2ByteMask(REG_FSC_BK71_30_L, 0x0100 , 0x0100);//reg_lse_uc_en
9359         MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x03, 0x03);//reg_time_of_cross_weight
9360         MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x18, 0x18);//reg_time_of_x_weight
9361         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x40 , 0xF0);//reg_main_lti_jaggy_min
9362         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0400 , 0x1F00);//reg_main_lti_jaggy_slope
9363         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0000 , 0x8000);//reg_main_lti_jaggy_en
9364     }
9365 
9366     //printf("reg_std_stat:%d ; iir_std_stat %d APL %d\n",reg_std_stat,iir_std_stat,APL);
9367 
9368 
9369     }*/ //Eva modify
9370 
9371 
9372 
9373 }
heightEstimate(int FrameWidth)9374 int heightEstimate(int FrameWidth)
9375 {
9376     if (FrameWidth < 720)
9377         return FrameWidth*3/4;
9378     else if (FrameWidth == 720)
9379         return 480;
9380     else if ((FrameWidth>720) && (FrameWidth<1440))
9381         return FrameWidth*9/16;
9382     else if (FrameWidth == 1440)
9383         return 900;
9384     else if ((FrameWidth>1440) && (FrameWidth<1920))
9385         return FrameWidth*9/16;
9386     else if (FrameWidth==1920)
9387         return 1080;
9388     else if (FrameWidth>=3840)
9389         return 2160;
9390     else //if (frameWidth>1920)
9391         return FrameWidth*9/16;
9392 }
9393 //---------------- 3DorderDetect begin --------------//
9394 #define sensio_thrd 3
9395 #define format_up_thrd 500
9396 #define format_low_thrd 100
MDrv_SC_3DorderDetect(void)9397 int MDrv_SC_3DorderDetect( void)
9398 {
9399     MApi_XC_W2BYTEMSK(REG_SC_BK3A_01_L, 0x0000, 0x0010 );  // turn on 3d format detection
9400 
9401     int PA_count = MApi_XC_R2BYTE(REG_SC_BK3A_20_L);
9402     int LA_count = MApi_XC_R2BYTE(REG_SC_BK3A_21_L);
9403     int CB_count = MApi_XC_R2BYTE(REG_SC_BK3A_22_L);
9404     int sensio_l_even = MApi_XC_R2BYTE(REG_SC_BK3A_23_L);
9405     int sensio_l_odd  = MApi_XC_R2BYTE(REG_SC_BK3A_24_L);
9406     int sensio_r_even = MApi_XC_R2BYTE(REG_SC_BK3A_25_L);
9407     int sensio_r_odd  = MApi_XC_R2BYTE(REG_SC_BK3A_26_L);
9408 
9409     int sensio_flag = 0;
9410     int format = 0;  // 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
9411 
9412         int sensio_flag_l_ratio =0;
9413         int sensio_flag_r_ratio =0;
9414 //  int sensio_L_is_EVEN= 0;  // =1 EVEN;  =0 ODD
9415 //      int sensio_R_is_EVEN= 0;
9416 
9417         if ((sensio_l_even> sensio_l_odd) && (sensio_l_odd!=0))
9418         {
9419             sensio_flag_l_ratio = sensio_l_even/sensio_l_odd;
9420 //      sensio_L_is_EVEN =1;
9421         }
9422         else if ((sensio_l_odd> sensio_l_even) && (sensio_l_even!=0))
9423             sensio_flag_l_ratio = sensio_l_odd/sensio_l_even;
9424         else
9425             sensio_flag_l_ratio =-1;
9426 
9427         if ((sensio_r_even> sensio_r_odd) && (sensio_r_odd!=0))
9428         {
9429             sensio_flag_r_ratio = sensio_r_even/sensio_r_odd;
9430 //          sensio_R_is_EVEN =1;
9431         }
9432         else if ((sensio_r_odd> sensio_r_even) && (sensio_r_even!=0))
9433             sensio_flag_r_ratio = sensio_r_odd/sensio_r_even;
9434         else
9435             sensio_flag_r_ratio =-1;
9436 
9437         if (sensio_flag_l_ratio> sensio_thrd && sensio_flag_r_ratio> sensio_thrd)
9438             sensio_flag =1;
9439         else
9440             sensio_flag =0;
9441 
9442 
9443         // 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
9444         if(sensio_flag)
9445         {
9446             format = 4;
9447             //MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x0007, 0x0007 );  // debug light
9448         }
9449         else
9450         {
9451                 if  ( ( LA_count < CB_count ) && ( PA_count < CB_count ) )
9452                 {
9453                     format = 3;
9454                     //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0004, 0x0007 );  // debug light
9455                 }
9456                 else if ( ( LA_count < format_low_thrd ) && (PA_count > format_up_thrd) )
9457                 {
9458                     format = 1;
9459                     //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0001, 0x0007 );  // debug light
9460                 }
9461                 else if ( ( PA_count < format_low_thrd ) && (LA_count > format_up_thrd) )
9462                 {
9463                     format = 2;
9464                     //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0002, 0x0007 );  // debug light
9465                 }
9466                 else
9467                 {
9468                     format = 0;
9469                     //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x0007 );  // debug light
9470                 }
9471 
9472         }
9473 
9474     //printf( "3D format is : %d\n", format );
9475     //printf( "PA_count : %d\n", PA_count );
9476     //printf( "LA_count : %d\n", LA_count );
9477     //printf( "CB_count : %d\n", CB_count );
9478     //printf( "sensio_l_even : %d\n", sensio_l_even );
9479     //printf( "sensio_l_odd  : %d\n", sensio_l_odd );
9480     //printf( "sensio_r_even : %d\n", sensio_r_even );
9481     //printf( "sensio_r_odd  : %d\n", sensio_r_odd );
9482     return format;
9483 
9484 }
9485 
9486 //----------------- 3DorderDetect end ---------------//
9487 
9488 //------------- 3DorderDetect_TBLR begin -----------//
9489 //       only support progressive input soure       //
9490 //      every 4 horizontal pixel made one decision  //
9491 //      histogram data has been shifted 1 bit       //
9492 #define TBLR_low_thrd  16
9493 #define TBLR_high_thrd 20
MDrv_SC_3DorderDetect_TBLR(void)9494 int MDrv_SC_3DorderDetect_TBLR(void)
9495 {
9496 
9497   MApi_XC_W2BYTEMSK(REG_SC_BK3A_01_L, 0x0000, 0x0010 );  // turn on 3d format detection
9498     int FrameWidth  = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
9499     int FrameHeight = heightEstimate(FrameWidth);
9500     int totalPix = FrameWidth*FrameHeight/4;
9501 
9502     //printf("FrameWidth = %d, FrameHeight= %d \n", FrameWidth, FrameHeight );
9503 
9504     MS_BOOL TBLR_MODE_flag = true ;
9505     static int TBLR_MODE_CNT = 0 ;
9506     static MS_BOOL isHistSet = false;
9507 
9508     int histbin = 0;
9509     int hist0[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
9510     int hist1[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
9511     int hist2[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
9512     int hist3[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
9513 
9514     int sum0 = 0;
9515     int sum1 = 0;
9516     int sum2 = 0;
9517     int sum3 = 0;
9518 
9519     int Psum0 = 0;
9520     int Psum1 = 0;
9521     int Psum2 = 0;
9522     int Psum3 = 0;
9523 
9524     int diff_02= 0;
9525     int diff_13= 0;
9526     int diff_03= 0;
9527     int diff_12= 0;
9528     int shift = 0;
9529 
9530     int  sum_Diff_02 = 0;
9531     int  sum_Diff_13 = 0;
9532     int  sum_Diff_03 = 0;
9533     int  sum_Diff_12 = 0;
9534     int  sum_Diff_total = 0;
9535 
9536     static int  sum_Diff_TB02 = 0;
9537     static int  sum_Diff_TB13 = 0;
9538     static int  sum_Diff_TB03 = 0;
9539     static int  sum_Diff_TB12 = 0;
9540     static int  sum_Diff_LR02 = 0;
9541     static int  sum_Diff_LR13 = 0;
9542     static int  sum_Diff_LR03 = 0;
9543     static int  sum_Diff_LR12 = 0;
9544     static int  curStatus = 0;
9545 
9546 
9547     if((TBLR_MODE_CNT%2)==0)
9548         TBLR_MODE_flag= true;
9549     else if((TBLR_MODE_CNT%2)==1)
9550         TBLR_MODE_flag= false;
9551 
9552     if (TBLR_MODE_flag)  // TB
9553     {
9554             //printf("----- TB histogram------\n" );
9555             MApi_XC_W2BYTEMSK(REG_SC_BK3A_40_L, 0x0000,                  0x01FFF );         // hist win0 x_start
9556             MApi_XC_W2BYTEMSK(REG_SC_BK3A_41_L, 0x0000,                  0x01FFF );         // hist win0 y_start
9557             MApi_XC_W2BYTEMSK(REG_SC_BK3A_42_L, FrameWidth    -0x0001,   0x01FFF );         // hist win0 x_end
9558             MApi_XC_W2BYTEMSK(REG_SC_BK3A_43_L, FrameHeight/4 -0x0001,   0x01FFF );         // hist win0 y_end
9559 
9560             MApi_XC_W2BYTEMSK(REG_SC_BK3A_44_L, 0x0000 ,                 0x01FFF );         // hist win1 x_start
9561             MApi_XC_W2BYTEMSK(REG_SC_BK3A_45_L, FrameHeight/4  ,         0x01FFF );         // hist win1 y_start
9562             MApi_XC_W2BYTEMSK(REG_SC_BK3A_46_L, FrameWidth    -0x0001,   0x01FFF );         // hist win1 x_end
9563             MApi_XC_W2BYTEMSK(REG_SC_BK3A_47_L, FrameHeight/2 -0x0001,   0x01FFF );         // hist win1 y_end
9564 
9565 
9566             MApi_XC_W2BYTEMSK(REG_SC_BK3A_48_L, 0x0000,                  0x01FFF );         // hist win2 x_start
9567             MApi_XC_W2BYTEMSK(REG_SC_BK3A_49_L, FrameHeight/2 ,          0x01FFF );         // hist win2 y_start
9568             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4A_L, FrameWidth      -0x0001, 0x01FFF );         // hist win2 x_end
9569             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4B_L, FrameHeight*3/4 -0x0001, 0x01FFF );         // hist win2 y_end
9570 
9571             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4C_L, 0x0000,                  0x01FFF );         // hist win3 x_start
9572             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4D_L, FrameHeight*3/4 ,        0x01FFF );         // hist win3 y_start
9573             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4E_L, FrameWidth  -0x0001,     0x01FFF );         // hist win3 x_end
9574             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4F_L, FrameHeight -0x0001,     0x01FFF );         // hist win3 y_end
9575 
9576     }
9577     else
9578     {
9579           //printf("----- LR histogram------\n" );
9580             MApi_XC_W2BYTEMSK(REG_SC_BK3A_40_L, 0x0000, 0x01FFF );                          // hist win0 x_start
9581             MApi_XC_W2BYTEMSK(REG_SC_BK3A_41_L, 0x0000, 0x01FFF );                          // hist win0 y_start
9582             MApi_XC_W2BYTEMSK(REG_SC_BK3A_42_L, FrameWidth/4    -0x0001,    0x01FFF );      // hist win0 x_end
9583             MApi_XC_W2BYTEMSK(REG_SC_BK3A_43_L, FrameHeight     -0x0001,    0x01FFF );      // hist win0 y_end
9584 
9585             MApi_XC_W2BYTEMSK(REG_SC_BK3A_44_L, FrameWidth/4,               0x01FFF );      // hist win1 x_start
9586             MApi_XC_W2BYTEMSK(REG_SC_BK3A_45_L, 0x0000  ,                   0x01FFF );      // hist win1 y_start
9587             MApi_XC_W2BYTEMSK(REG_SC_BK3A_46_L, FrameWidth/2    -0x0001,    0x01FFF );      // hist win1 x_end
9588             MApi_XC_W2BYTEMSK(REG_SC_BK3A_47_L, FrameHeight     -0x0001 ,   0x01FFF );      // hist win1 y_end
9589 
9590             MApi_XC_W2BYTEMSK(REG_SC_BK3A_48_L, FrameWidth/2,               0x01FFF );      // hist win2 x_start
9591             MApi_XC_W2BYTEMSK(REG_SC_BK3A_49_L, 0x0000,                     0x01FFF );      // hist win2 y_start
9592             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4A_L, FrameWidth*3/4  -0x0001,    0x01FFF );      // hist win2 x_end
9593             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4B_L, FrameHeight     -0x0001,    0x01FFF );      // hist win2 y_end
9594 
9595             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4C_L, FrameWidth*3/4,             0x01FFF );      // hist win3 x_start
9596             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4D_L, 0x0000,                     0x01FFF );      // hist win3 y_start
9597             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4E_L, FrameWidth  -0x0001,        0x01FFF );      // hist win3 x_end
9598             MApi_XC_W2BYTEMSK(REG_SC_BK3A_4F_L, FrameHeight -0x0001,        0x01FFF );      // hist win3 y_end
9599 
9600     }
9601 
9602     if( !isHistSet )
9603     {
9604         MApi_XC_W2BYTEMSK(REG_SC_BK3A_39_L, 0x0001, 0x0001);
9605         isHistSet = true;
9606         //printf( "set trigger bit\n" );
9607     }
9608     MS_BOOL histReady = MApi_XC_R2BYTEMSK(REG_SC_BK3A_39_L, 0x0080) >> 7;  // if histogram is ready
9609 
9610 
9611   if( histReady )
9612   {
9613     for ( histbin = 0; histbin< 32 ; histbin++ )
9614         {
9615             // every 4 pixel in horizontal
9616             MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, histbin, 0x001F );          // select hist bin
9617 
9618             MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0000,  0x0300 );          // select hist window0
9619             MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001,  0x0001 );          // toggle histogram read
9620             hist0[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
9621 
9622             MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0100,  0x0300 );          // select hist window1
9623             MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001,  0x0001 );          // toggle histogram read
9624             hist1[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
9625 
9626             MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0200,  0x0300 );          // select hist window2
9627             MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001,  0x0001 );          // toggle histogram read
9628             hist2[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
9629 
9630             MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0300,  0x0300 );          // select hist window3
9631             MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001,  0x0001 );          // toggle histogram read
9632             hist3[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
9633 
9634             sum0 = sum0 + hist0[histbin]*histbin;
9635             sum1 = sum1 + hist1[histbin]*histbin;
9636             sum2 = sum2 + hist2[histbin]*histbin;
9637             sum3 = sum3 + hist3[histbin]*histbin;
9638 
9639 
9640             Psum0 = Psum0 + hist0[histbin];
9641             Psum1 = Psum1 + hist1[histbin];
9642             Psum2 = Psum2 + hist2[histbin];
9643             Psum3 = Psum3 + hist3[histbin];
9644 
9645             //printf( "hist[%d] = %d  %d  %d  %d \n", histbin, hist0[histbin], hist1[histbin], hist2[histbin], hist3[histbin]);
9646 
9647         }
9648 
9649     //printf( "hist total pixel = %d  %d  %d  %d \n", Psum0, Psum1,Psum2, Psum3 );
9650 
9651 
9652     sum0 = 4* sum0 / totalPix;
9653         sum1 = 4* sum1 / totalPix;
9654         sum2 = 4* sum2 / totalPix;
9655         sum3 = 4* sum3 / totalPix;
9656 
9657         shift = ((sum0+ sum1) - (sum2 +  sum3))/2;
9658 
9659         if ((sum0 - sum2)*(sum1 - sum3) <= 0)
9660             shift =0;
9661 
9662         if( abs(shift) >2)
9663             shift =0;
9664 
9665         //printf("sum0= %d, sum1=  %d, sum2=  %d, sum3=  %d, shift= %d \n", sum0, sum1, sum2, sum3, shift );
9666 
9667         //sum all the diff
9668         sum_Diff_02= 0;
9669         sum_Diff_13= 0;
9670         sum_Diff_03= 0;
9671         sum_Diff_12= 0;
9672 
9673         for ( histbin = 0; histbin< 32 ; histbin++)
9674         {
9675 
9676               diff_02= abs(hist0[histbin] - hist2[histbin-shift]);
9677                 diff_13= abs(hist1[histbin] - hist3[histbin-shift]);
9678                 diff_03= abs(hist0[histbin] - hist3[histbin-shift]);
9679                 diff_12= abs(hist1[histbin] - hist2[histbin-shift]);
9680 
9681                 if (TBLR_MODE_flag )
9682                 {
9683                     sum_Diff_02 = sum_Diff_02 + diff_02;
9684                     sum_Diff_13 = sum_Diff_13 + diff_13;
9685                     sum_Diff_03 = sum_Diff_03 + diff_03;
9686                     sum_Diff_12 = sum_Diff_12 + diff_12;
9687 
9688                 //  printf(" sum_diff_TB : %d,  %d, %d, %d, , %d, %d, %d, %d \n", sum_Diff_02, sum_Diff_13, sum_Diff_03, sum_Diff_12 , diff_02, diff_13, diff_03, diff_12);
9689                 }
9690                 else
9691                 {
9692                     sum_Diff_02 = sum_Diff_02 + diff_02;
9693                     sum_Diff_13 = sum_Diff_13 + diff_13;
9694                     sum_Diff_03 = sum_Diff_03 + diff_03;
9695                     sum_Diff_12 = sum_Diff_12 + diff_12;
9696 
9697                 //  printf(" sum_diff_LR : %d,  %d, %d, %d, , %d, %d ,%d ,%d \n", sum_Diff_02, sum_Diff_13, sum_Diff_03, sum_Diff_12,  diff_02, diff_13, diff_03, diff_12);
9698                 }
9699         }
9700 
9701         sum_Diff_total = __max( sum_Diff_02+ sum_Diff_13+ sum_Diff_03+ sum_Diff_12, 1);
9702 
9703         //normalization
9704         if (TBLR_MODE_flag )
9705         {
9706             sum_Diff_TB02= sum_Diff_02*100/sum_Diff_total;
9707             sum_Diff_TB13= sum_Diff_13*100/sum_Diff_total;
9708             sum_Diff_TB03= sum_Diff_03*100/sum_Diff_total;
9709             sum_Diff_TB12= sum_Diff_12*100/sum_Diff_total;
9710         }
9711         else
9712         {
9713             sum_Diff_LR02= sum_Diff_02*100/sum_Diff_total;
9714             sum_Diff_LR13= sum_Diff_13*100/sum_Diff_total;
9715             sum_Diff_LR03= sum_Diff_03*100/sum_Diff_total;
9716             sum_Diff_LR12= sum_Diff_12*100/sum_Diff_total;
9717         }
9718 
9719 
9720         if(TBLR_MODE_CNT%2)
9721         {
9722 
9723             //  printf("normalized TBdiff : %d %d %d %d \n", sum_Diff_TB02, sum_Diff_TB13, sum_Diff_TB03, sum_Diff_TB12 );
9724             //  printf("normalized LRdiff : %d %d %d %d \n", sum_Diff_LR02, sum_Diff_LR13, sum_Diff_LR03, sum_Diff_LR12 );
9725 
9726                 if( __max(sum_Diff_LR02, sum_Diff_LR13) <  __max(sum_Diff_LR03, sum_Diff_LR12) &&  __min (sum_Diff_LR02, sum_Diff_LR13) < TBLR_low_thrd && __max(sum_Diff_TB02, sum_Diff_TB13) > TBLR_high_thrd)
9727                 {
9728                     curStatus = 2;//LR
9729                     //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0020, 0x0070 );  // debug light green
9730                 }
9731                 else if( __max(sum_Diff_TB02, sum_Diff_TB13)<  __max(sum_Diff_TB03, sum_Diff_TB12) && __min (sum_Diff_TB02, sum_Diff_TB13) < TBLR_low_thrd && __max(sum_Diff_LR02, sum_Diff_LR13) > TBLR_high_thrd)
9732                 {
9733                     curStatus = 1;//TB
9734                     //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0010, 0x0070 );  // debug light red
9735                 }
9736                 else
9737                 {
9738                     curStatus = 0;//Video
9739                     //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x0070 );  // debug light off
9740                 }
9741 
9742                 //printf("3d format is : %d \n", curStatus);
9743 
9744         }
9745 
9746         isHistSet = false;
9747         TBLR_MODE_CNT ++;
9748     }
9749 
9750         if (TBLR_MODE_CNT > 300)
9751         {
9752                 TBLR_MODE_CNT = 0;
9753         }
9754         //printf("TBLR_MODE_CNT = %d\n", TBLR_MODE_CNT );
9755 
9756     return curStatus;
9757 }
9758 // -------------- 3DorderDetect_TBLR end ----------- //
9759 
9760 //-------- 3D source format detection begin ---------//
MDrv_SC_3DfmtDetect(void)9761 int MDrv_SC_3DfmtDetect(void)
9762 {
9763     static int format3D = 0;            // 0:2D, 1:TB, 2:LR(SS), 3:PA, 4:LA, 5:CB, 6:Sensio
9764     int isCBPALASensio =  MDrv_SC_3DorderDetect(); // 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
9765     int isTBLR =  MDrv_SC_3DorderDetect_TBLR();                 //0:2D, 1:TB, 2:LR(SS)
9766 
9767     if( isCBPALASensio )
9768         format3D = isCBPALASensio +2;
9769     else
9770         format3D = isTBLR;
9771 
9772         //printf("3D format is = %d\n", format3D );
9773 
9774     return format3D;
9775 
9776 }
9777 //--------- 3D source format detection end  ---------//
NoiseMaskingControl(int DBKStr,MS_BOOL isSceneChange)9778 void NoiseMaskingControl(int DBKStr,MS_BOOL isSceneChange)
9779 {
9780     int NM_Gain = __minmax( DBKStr/10-7, 1, 3);
9781     MApi_XC_W2BYTEMSK(REG_SC_BK0C_52_L, NM_Gain, 0x003F);//Y noise masking gain
9782     if (isSceneChange )
9783     {
9784          MApi_XC_W2BYTEMSK(REG_SC_BK0C_50_L, 0x00, 0x0008); //Y noise masking off
9785     }
9786     else
9787     {
9788          MApi_XC_W2BYTEMSK(REG_SC_BK0C_50_L, 0x08, 0x0008); //Y noise masking on
9789     }
9790 }
normFactorWidth(MS_U32 u32AvgBLKN)9791 MS_S8 normFactorWidth(MS_U32 u32AvgBLKN)
9792 {
9793     MS_S8 s8NormFac = 0;
9794     if (u32AvgBLKN > 1048576*1024)
9795     {
9796          s8NormFac = 25;
9797     }
9798     else if (u32AvgBLKN > 1048576*512)
9799     {
9800          s8NormFac = 24;
9801     }
9802     else if (u32AvgBLKN > 1048576*256)
9803     {
9804          s8NormFac = 23;
9805 }
9806     else if (u32AvgBLKN > 1048576*128)
9807 {
9808          s8NormFac = 22;
9809 }
9810     else if (u32AvgBLKN > 1048576*64)
9811     {
9812          s8NormFac = 21;
9813     }
9814     else if (u32AvgBLKN > 1048576*32)
9815     {
9816          s8NormFac = 20;
9817     }
9818     else if (u32AvgBLKN > 1048576*16)
9819     {
9820          s8NormFac = 19;
9821     }
9822     else if (u32AvgBLKN > 1048576*8)
9823     {
9824          s8NormFac = 18;
9825     }
9826     else if (u32AvgBLKN > 1048576*4)
9827     {
9828          s8NormFac = 17;
9829     }
9830     else if (u32AvgBLKN > 1048576*2)
9831     {
9832          s8NormFac = 16;
9833     }
9834     else if (u32AvgBLKN > 1048576)
9835     {
9836          s8NormFac = 15;
9837     }
9838     else if (u32AvgBLKN > 524288)
9839     {
9840          s8NormFac = 14;
9841     }
9842     else if (u32AvgBLKN > 262144)
9843     {
9844          s8NormFac = 13;
9845     }
9846     else if (u32AvgBLKN > 131072)
9847     {
9848          s8NormFac = 12;
9849     }
9850     else if (u32AvgBLKN > 65536)
9851     {
9852          s8NormFac = 11;
9853     }
9854     else if (u32AvgBLKN > 32768)
9855     {
9856          s8NormFac = 10;
9857     }
9858     else if (u32AvgBLKN > 16384)
9859     {
9860          s8NormFac = 9;
9861     }
9862     else if (u32AvgBLKN > 8192)
9863     {
9864          s8NormFac = 8;
9865     }
9866     else if (u32AvgBLKN > 4096)
9867     {
9868          s8NormFac = 7;
9869     }
9870     else if (u32AvgBLKN > 2048)
9871     {
9872          s8NormFac = 6;
9873     }
9874     else if (u32AvgBLKN > 1024)
9875     {
9876          s8NormFac = 5;
9877     }
9878     else if (u32AvgBLKN > 512)
9879     {
9880          s8NormFac = 4;
9881     }
9882     else if (u32AvgBLKN > 256)
9883     {
9884          s8NormFac = 3;
9885     }
9886     else if (u32AvgBLKN > 128)
9887     {
9888          s8NormFac = 2;
9889     }
9890     else if (u32AvgBLKN > 64)
9891     {
9892          s8NormFac = 1;
9893     }
9894     else if (u32AvgBLKN > 32)
9895     {
9896          s8NormFac = 0;
9897     }
9898     else if (u32AvgBLKN > 16)
9899     {
9900          s8NormFac = -1;
9901     }
9902     else if (u32AvgBLKN > 8)
9903     {
9904          s8NormFac = -2;
9905     }
9906     else
9907     {
9908          s8NormFac = 0;
9909     }
9910 
9911     return s8NormFac;
9912     }
readVHistogramPart(MS_U8 u8PartIndex)9913 MS_U8 readVHistogramPart(MS_U8 u8PartIndex)
9914 {
9915     MS_U8 u8Data_ack_en;
9916     MS_U16 u16MarkGain_ack_en;
9917     MS_U8 u8SuccessAct = 0;
9918     //MS_U16 u16Blkwei_Err= 0;
9919     static MS_U8 u8RequestFlag = 0;
9920 
9921     //--------- Blockiness Histogram Request start ---------//
9922     if (u8PartIndex == 0 && u8RequestFlag == 0)
9923     {
9924         // write 1 to request register
9925         MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 1, 0x0001); //reg_bkn_statistic_ack
9926         u8RequestFlag = 1;
9927         //printf("V Sequence Request 1 \n");
9928     }
9929         //--------- Blockiness Histogram Acknowledge start ---------//
9930     u8Data_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK60_7D_L, 0x0002); //reg_bkn_width_statistic_ack
9931     MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L, 0x8000, 0x8000);//blk_wei sram io enable
9932     //u16Blkwei_Err = MApi_XC_R2BYTEMSK(REG_SC_BK47_7B_L, 0x0100);//blk_wei_err
9933     u16MarkGain_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK47_78_L, 0x2000);
9934     //printf("V Sequence blk_wei IO 1 u16Blkwei_Err:%d u8Data_ack_en:%d u16MarkGain_ack_en:%d\n",u16Blkwei_Err,u8Data_ack_en,u16MarkGain_ack_en);
9935         //--------- Function Process start ---------//
9936     if(u8Data_ack_en)
9937     {
9938         // write 1 to sram_io_en register
9939         MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 0x0100, 0x0100); //reg_bkn_sram_io_en
9940         //printf("V Sequence sram_io_en  1\n");
9941         if(u16MarkGain_ack_en)
9942         {
9943             MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 0, 0x0001);//reg_bkn_statistic_ack
9944             u8SuccessAct = 1;
9945             u8RequestFlag = 0;
9946             //printf("V Sequence Request 0\n");
9947         }
9948     }
9949     else//(!data_ack_en)
9950     {
9951         u8SuccessAct = 0;
9952     }
9953 
9954     return u8SuccessAct;
9955 
9956 }
9957 
readHistogramPart(MS_U8 u8CountForDBK)9958 MS_U8 readHistogramPart(MS_U8 u8CountForDBK)
9959 {
9960     MS_U8 u8Data_ack_en;
9961     MS_U16 u16MarkGain_ack_en;
9962     MS_U8 u8SuccessAct = 0;
9963     //MS_U16 u16Blkwei_Err= 0;
9964     static MS_U8 u8RequestFlag = 0;
9965 
9966     //MS_U16 u16Bin;
9967 
9968     //--------- Blockiness Histogram Request start ---------//
9969     if (u8CountForDBK == 0 && u8RequestFlag == 0)
9970     {
9971     // write 1 to request register
9972     MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 1, 0x0001);
9973     u8RequestFlag = 1;
9974     //printf("Sequence Request 1 \n");
9975     }
9976 
9977     //--------- Blockiness Histogram Acknowledge start ---------//
9978     u8Data_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK0C_0D_L, 0x0002);
9979     MApi_XC_W2BYTEMSK(REG_SC_BK0C_08_L, 0x8000, 0x8000);//blk_wei sram io enable
9980     //u16Blkwei_Err = MApi_XC_R2BYTEMSK(REG_SC_BK47_0B_L, 0x0100);//blk_wei_err
9981     u16MarkGain_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK47_08_L, 0x2000);
9982     //printf("Sequence blk_wei IO 1 u16Blkwei_Err:%d u8Data_ack_en:%d u16MarkGain_ack_en:%d\n",u16Blkwei_Err,u8Data_ack_en,u16MarkGain_ack_en);
9983 
9984     //--------- Function Process start ---------//
9985     if(u8Data_ack_en)//&& u16Blkwei_Err == 0)
9986     {
9987 
9988         MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0x0100, 0x0100);//sram_io_en
9989         //printf("Sequence sram_io_en  1\n");
9990         //u16MarkGain_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK47_08_L, 0x2000);
9991         if(u16MarkGain_ack_en)
9992         {
9993 
9994 #if 0
9995             // write 1 to sram_io_en register
9996             MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0x0100, 0x0100);
9997             for(u16Bin = u16Initial_point; u16Bin < u16End_point; u16Bin++)
9998         {
9999             MApi_XC_W2BYTEMSK(REG_SC_BK0C_0E_L, (MS_U16)(0x8000 + u16Bin), 0xFFFF);
10000             // read data from selected address
10001             au16Histogram[u16Bin] = MApi_XC_R2BYTEMSK(REG_SC_BK0C_0F_L, 0xFFFF);
10002             }
10003 #endif
10004             MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0, 0x0001);
10005             u8SuccessAct = 1;
10006             u8RequestFlag = 0;
10007             //printf("Sequence Request 0\n");
10008         }
10009     }
10010     else//(!data_ack_en)
10011     {
10012         u8SuccessAct = 0;
10013     }
10014 
10015     return u8SuccessAct;
10016 }
VStartPositionAverage(MS_U8 u8StartPosition,MS_BOOL isSceneChangeY)10017 MS_U8 VStartPositionAverage(MS_U8 u8StartPosition,MS_BOOL isSceneChangeY)
10018         {
10019     static MS_U8 u8BufferCount = 1;
10020     MS_U8 u8BufferIndex =0;
10021     static MS_U8 u8StartPositionBuffer[10] = {0};
10022     MS_U16 u16StartPositionSum = 0;
10023     MS_U8 u8StartPositionAvg = 0;
10024     static MS_U8 u8StartPositionLast = 255;
10025     static MS_U8 u8StartPositionConfidence = 0;
10026     MS_U8 u8ConfidenceLevel = 7;
10027     static MS_U8 u8BufferFull = 0;
10028     MS_U8 u8BufferLoop = 0;
10029 
10030     if(isSceneChangeY)
10031             {
10032         u8StartPositionLast = 255;
10033         u8BufferFull = 0;
10034     }
10035 
10036     if(u8StartPositionLast == 255)
10037                 {
10038         u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10039                 }
10040     else
10041     {
10042         if(u8StartPositionLast == u8StartPosition)
10043                 {
10044             u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10045             u8StartPositionConfidence++;
10046             u8StartPositionConfidence = __minmax(u8StartPositionConfidence,0,10);
10047                 }
10048         else
10049                 {
10050             u8StartPositionConfidence--;
10051             u8StartPositionConfidence = __minmax(u8StartPositionConfidence,0,10);
10052             if(u8StartPositionConfidence > u8ConfidenceLevel)
10053                 {
10054                 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPositionLast;
10055                 }
10056             else
10057                 {
10058                 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10059                 }
10060             }
10061         }
10062     u8StartPositionLast = u8StartPositionBuffer[u8BufferCount - 1];
10063 
10064     //printf("u8BufferIndex:%d u8StartPosition:%d u8StartPositionLast:%d\n",(u8BufferCount-1),u8StartPosition,u8StartPositionLast);
10065 
10066     if(u8BufferFull)
10067     {
10068         u8BufferLoop = 10;
10069         }
10070         else
10071     {
10072         u8BufferLoop = u8BufferCount;
10073     }
10074 
10075     for(u8BufferIndex = 0;u8BufferIndex<u8BufferLoop;u8BufferIndex++)
10076     {
10077         u16StartPositionSum+= u8StartPositionBuffer[u8BufferIndex];
10078         //printf("u8StartPositionBuffer[%d]:%d u8BufferCount:%d\n",u8BufferIndex,u8StartPositionBuffer[u8BufferIndex],u8BufferCount);
10079     }
10080     u8StartPositionAvg = u16StartPositionSum/u8BufferLoop;
10081     //printf("u8StartPositionAvg:%d u8StartPositionConfidence:%d \n",u8StartPositionAvg,u8StartPositionConfidence);
10082 
10083     if(u8BufferCount == 10)
10084     {
10085         u8BufferCount = 1;
10086         u8BufferFull = 1;
10087     }
10088     else
10089     {
10090         u8BufferCount++;
10091     }
10092     return u8StartPositionAvg;
10093 }
StartPositionAverage(MS_U8 u8StartPosition,MS_BOOL isSceneChangeY)10094 MS_U8 StartPositionAverage(MS_U8 u8StartPosition,MS_BOOL isSceneChangeY)
10095 {
10096     static MS_U8 u8BufferCount = 1;
10097     MS_U8 u8BufferIndex =0;
10098     static MS_U8 u8StartPositionBuffer[10] = {0};
10099     MS_U16 u16StartPositionSum = 0;
10100     MS_U8 u8StartPositionAvg = 0;
10101     static MS_U8 u8StartPositionLast = 255;
10102     static MS_U8 u8StartPositionConfidence = 0;
10103     MS_U8 u8ConfidenceLevel = 7;
10104     static MS_U8 u8BufferFull = 0;
10105     MS_U8 u8BufferLoop = 0;
10106 
10107     if(isSceneChangeY)
10108     {
10109         u8StartPositionLast = 255;
10110         u8BufferFull = 0;
10111     }
10112 
10113     if(u8StartPositionLast == 255)
10114     {
10115         u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10116     }
10117     else
10118     {
10119         if(u8StartPositionLast == u8StartPosition)
10120         {
10121             u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10122             u8StartPositionConfidence++;
10123             u8StartPositionConfidence = __minmax(u8StartPositionConfidence,0,10);
10124         }
10125         else
10126         {
10127             u8StartPositionConfidence--;
10128             u8StartPositionConfidence = __minmax(u8StartPositionConfidence,0,10);
10129             if(u8StartPositionConfidence > u8ConfidenceLevel)
10130             {
10131                 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPositionLast;
10132             }
10133             else
10134             {
10135                 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10136             }
10137         }
10138     }
10139     u8StartPositionLast = u8StartPositionBuffer[u8BufferCount - 1];
10140 
10141     //printf("u8BufferIndex:%d u8StartPosition:%d u8StartPositionLast:%d\n",(u8BufferCount-1),u8StartPosition,u8StartPositionLast);
10142 
10143     if(u8BufferFull)
10144     {
10145         u8BufferLoop = 10;
10146     }
10147     else
10148     {
10149         u8BufferLoop = u8BufferCount;
10150     }
10151 
10152     for(u8BufferIndex = 0;u8BufferIndex<u8BufferLoop;u8BufferIndex++)
10153     {
10154         u16StartPositionSum+= u8StartPositionBuffer[u8BufferIndex];
10155         //printf("u8StartPositionBuffer[%d]:%d u8BufferCount:%d\n",u8BufferIndex,u8StartPositionBuffer[u8BufferIndex],u8BufferCount);
10156     }
10157     u8StartPositionAvg = u16StartPositionSum/u8BufferLoop;
10158     //printf("u8StartPositionAvg:%d u8StartPositionConfidence:%d \n",u8StartPositionAvg,u8StartPositionConfidence);
10159 
10160     if(u8BufferCount == 10)
10161     {
10162         u8BufferCount = 1;
10163         u8BufferFull = 1;
10164     }
10165     else
10166     {
10167         u8BufferCount++;
10168     }
10169 
10170     return u8StartPositionAvg;
10171 }
VDBK_FindStartPosition(MS_U8 u8VWidth,MS_BOOL isSceneChangeY)10172 MS_U8 VDBK_FindStartPosition(MS_U8 u8VWidth,MS_BOOL isSceneChangeY)
10173 {
10174     MS_U32 u32AccMax[32] = {0};
10175     MS_U32 u32AccMaxSum[32] = {0};
10176     MS_U32 u32Max = 0;
10177     MS_U8 u8StartPosition = 0;
10178     MS_U8 u8StartPositionAverage = 0;
10179     MS_U8 u8FindIndex = 0;
10180     MS_U8 u8InitailPosition = 0;
10181     //printf("easter befor read\n");
10182     u32AccMax[0  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_40_L, 0x1FFF);
10183     u32AccMax[1  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_41_L, 0x1FFF);
10184     u32AccMax[2  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_42_L, 0x1FFF);
10185     u32AccMax[3  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_43_L, 0x1FFF);
10186     u32AccMax[4  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_44_L, 0x1FFF);
10187     u32AccMax[5  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_45_L, 0x1FFF);
10188     u32AccMax[6  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_46_L, 0x1FFF);
10189     u32AccMax[7  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_47_L, 0x1FFF);
10190     u32AccMax[8  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_48_L, 0x1FFF);
10191     u32AccMax[9  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_49_L, 0x1FFF);
10192     u32AccMax[10] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4A_L, 0x1FFF);
10193     u32AccMax[11] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4B_L, 0x1FFF);
10194     u32AccMax[12] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4C_L, 0x1FFF);
10195     u32AccMax[13] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4D_L, 0x1FFF);
10196     u32AccMax[14] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4E_L, 0x1FFF);
10197     u32AccMax[15] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4F_L, 0x1FFF);
10198     u32AccMax[16] = MApi_XC_R2BYTEMSK(REG_SC_BK47_50_L, 0x1FFF);
10199     u32AccMax[17] = MApi_XC_R2BYTEMSK(REG_SC_BK47_51_L, 0x1FFF);
10200     u32AccMax[18] = MApi_XC_R2BYTEMSK(REG_SC_BK47_52_L, 0x1FFF);
10201     u32AccMax[19] = MApi_XC_R2BYTEMSK(REG_SC_BK47_53_L, 0x1FFF);
10202     u32AccMax[20] = MApi_XC_R2BYTEMSK(REG_SC_BK47_54_L, 0x1FFF);
10203     u32AccMax[21] = MApi_XC_R2BYTEMSK(REG_SC_BK47_55_L, 0x1FFF);
10204     u32AccMax[22] = MApi_XC_R2BYTEMSK(REG_SC_BK47_56_L, 0x1FFF);
10205     u32AccMax[23] = MApi_XC_R2BYTEMSK(REG_SC_BK47_57_L, 0x1FFF);
10206     u32AccMax[24] = MApi_XC_R2BYTEMSK(REG_SC_BK47_58_L, 0x1FFF);
10207     u32AccMax[25] = MApi_XC_R2BYTEMSK(REG_SC_BK47_59_L, 0x1FFF);
10208     u32AccMax[26] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5A_L, 0x1FFF);
10209     u32AccMax[27] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5B_L, 0x1FFF);
10210     u32AccMax[28] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5C_L, 0x1FFF);
10211     u32AccMax[29] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5D_L, 0x1FFF);
10212     u32AccMax[30] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5E_L, 0x1FFF);
10213     u32AccMax[31] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5F_L, 0x1FFF);
10214     //printf("easter findstart\n");
10215     u8InitailPosition = MApi_XC_R2BYTEMSK(REG_SC_BK47_64_L, 0x00FF);
10216 
10217     for(u8FindIndex = 0;u8FindIndex<u8VWidth;u8FindIndex++)
10218     {
10219         if(u8FindIndex ==0)
10220         {
10221             u32AccMaxSum[0] = u32AccMax[u8VWidth - 1] + u32AccMax[0] + u32AccMax[1];
10222         }
10223         else if(u8FindIndex == (u8VWidth - 1))
10224         {
10225             u32AccMaxSum[u8VWidth - 1] = u32AccMax[u8VWidth - 2] + u32AccMax[u8VWidth - 1] + u32AccMax[1];
10226         }
10227         else
10228         {
10229             u32AccMaxSum[u8FindIndex] = u32AccMax[u8FindIndex - 1] + u32AccMax[u8FindIndex] + u32AccMax[u8FindIndex + 1];
10230         }
10231 
10232         if(u8VWidth == 8 || u8VWidth == 11)
10233         {
10234             if(u32AccMax[u8FindIndex]>2*u32Max)
10235         {
10236                 u32Max = u32AccMax[u8FindIndex];
10237                 u8StartPosition = u8InitailPosition + u8FindIndex;
10238         }
10239             else if(u32AccMax[u8FindIndex]>u32Max)
10240         {
10241                 u32Max = u32AccMax[u8FindIndex];
10242                 u8StartPosition = u8InitailPosition + u8FindIndex;
10243         }
10244     }
10245         else
10246         {
10247             if(u32AccMaxSum[u8FindIndex]>u32Max)
10248             {
10249                 u32Max = u32AccMaxSum[u8FindIndex];
10250                 u8StartPosition = u8InitailPosition + u8FindIndex;
10251             }
10252             }
10253         //printf("u32AccMaxSum:%d u32AccMax:%d u32Max:%d\n",u32AccMaxSum[u8FindIndex],u32AccMax[u8FindIndex],u32Max);
10254 
10255         }
10256 
10257 
10258     u8StartPositionAverage = VStartPositionAverage(u8StartPosition,isSceneChangeY);
10259 
10260     MApi_XC_W2BYTEMSK(REG_SC_BK47_61_L, u8StartPositionAverage, 0x1FFF);//set start to Max->Mark
10261     return u8StartPositionAverage;
10262     }
DBK_FindStartPosition(MS_U8 u8Width,MS_BOOL isSceneChangeY)10263 MS_U8 DBK_FindStartPosition(MS_U8 u8Width,MS_BOOL isSceneChangeY)
10264 {
10265     MS_U32 u32AccMax[32] = {0};
10266     MS_U32 u32AccMaxSum[32] = {0};
10267     MS_U32 u32Max = 0;
10268     MS_U8 u8StartPosition = 0;
10269     MS_U8 u8StartPositionAverage = 0;
10270     MS_U8 u8FindIndex = 0;
10271     MS_U8 u8InitailPosition = 0;
10272     //printf("easter befor read\n");
10273     u32AccMax[0  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_10_L, 0x1FFF);
10274     u32AccMax[1  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_11_L, 0x1FFF);
10275     u32AccMax[2  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_12_L, 0x1FFF);
10276     u32AccMax[3  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_13_L, 0x1FFF);
10277     u32AccMax[4  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_14_L, 0x1FFF);
10278     u32AccMax[5  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_15_L, 0x1FFF);
10279     u32AccMax[6  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_16_L, 0x1FFF);
10280     u32AccMax[7  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_17_L, 0x1FFF);
10281     u32AccMax[8  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_18_L, 0x1FFF);
10282     u32AccMax[9  ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_19_L, 0x1FFF);
10283     u32AccMax[10] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1A_L, 0x1FFF);
10284     u32AccMax[11] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1B_L, 0x1FFF);
10285     u32AccMax[12] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1C_L, 0x1FFF);
10286     u32AccMax[13] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1D_L, 0x1FFF);
10287     u32AccMax[14] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1E_L, 0x1FFF);
10288     u32AccMax[15] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1F_L, 0x1FFF);
10289     u32AccMax[16] = MApi_XC_R2BYTEMSK(REG_SC_BK47_20_L, 0x1FFF);
10290     u32AccMax[17] = MApi_XC_R2BYTEMSK(REG_SC_BK47_21_L, 0x1FFF);
10291     u32AccMax[18] = MApi_XC_R2BYTEMSK(REG_SC_BK47_22_L, 0x1FFF);
10292     u32AccMax[19] = MApi_XC_R2BYTEMSK(REG_SC_BK47_23_L, 0x1FFF);
10293     u32AccMax[20] = MApi_XC_R2BYTEMSK(REG_SC_BK47_24_L, 0x1FFF);
10294     u32AccMax[21] = MApi_XC_R2BYTEMSK(REG_SC_BK47_25_L, 0x1FFF);
10295     u32AccMax[22] = MApi_XC_R2BYTEMSK(REG_SC_BK47_26_L, 0x1FFF);
10296     u32AccMax[23] = MApi_XC_R2BYTEMSK(REG_SC_BK47_27_L, 0x1FFF);
10297     u32AccMax[24] = MApi_XC_R2BYTEMSK(REG_SC_BK47_28_L, 0x1FFF);
10298     u32AccMax[25] = MApi_XC_R2BYTEMSK(REG_SC_BK47_29_L, 0x1FFF);
10299     u32AccMax[26] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2A_L, 0x1FFF);
10300     u32AccMax[27] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2B_L, 0x1FFF);
10301     u32AccMax[28] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2C_L, 0x1FFF);
10302     u32AccMax[29] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2D_L, 0x1FFF);
10303     u32AccMax[30] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2E_L, 0x1FFF);
10304     u32AccMax[31] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2F_L, 0x1FFF);
10305     //printf("easter findstart\n");
10306     u8InitailPosition = MApi_XC_R2BYTEMSK(REG_SC_BK47_34_L, 0x00FF);
10307     if(u8Width == 8)
10308     {
10309         MApi_XC_W2BYTEMSK(REG_SC_BK47_33_L, 0x0000, 0xC000); //markline_toler_pts 0->3
10310         MApi_XC_W2BYTEMSK(REG_SC_BK47_0B_L, 0x000F, 0x00FF); //max statistic thrd/toler_pts
10311     }
10312     else if(u8Width == 11)
10313     {
10314         MApi_XC_W2BYTEMSK(REG_SC_BK47_33_L, 0x4000, 0xC000); //markline_toler_pts 0->3
10315         MApi_XC_W2BYTEMSK(REG_SC_BK47_0B_L, 0x000F, 0x00FF); //max statistic thrd/toler_pts
10316     }
10317     else
10318     {
10319         MApi_XC_W2BYTEMSK(REG_SC_BK47_33_L, 0xC000, 0xC000); //markline_toler_pts 0->3
10320         MApi_XC_W2BYTEMSK(REG_SC_BK47_0B_L, 0x00C4, 0x00FF); //max statistic thrd/toler_pts
10321     }
10322 
10323     for(u8FindIndex = 0;u8FindIndex<u8Width;u8FindIndex++)
10324     {
10325         if(u8FindIndex ==0)
10326         {
10327             u32AccMaxSum[0] = u32AccMax[u8Width - 1] + u32AccMax[0] + u32AccMax[1];
10328         }
10329         else if(u8FindIndex == (u8Width - 1))
10330         {
10331             u32AccMaxSum[u8Width - 1] = u32AccMax[u8Width - 2] + u32AccMax[u8Width - 1] + u32AccMax[1];
10332         }
10333         else
10334         {
10335             u32AccMaxSum[u8FindIndex] = u32AccMax[u8FindIndex - 1] + u32AccMax[u8FindIndex] + u32AccMax[u8FindIndex + 1];
10336         }
10337 
10338         if(u8Width == 8 || u8Width == 11)
10339         {
10340             if(u32AccMax[u8FindIndex]>2*u32Max)
10341             {
10342                 u32Max = u32AccMax[u8FindIndex];
10343                 u8StartPosition = u8InitailPosition + u8FindIndex;
10344             }
10345             else if(u32AccMax[u8FindIndex]>u32Max)
10346             {
10347                 u32Max = u32AccMax[u8FindIndex];
10348                 u8StartPosition = u8InitailPosition + u8FindIndex;
10349             }
10350         }
10351         else
10352         {
10353             if(u32AccMaxSum[u8FindIndex]>u32Max)
10354             {
10355                 u32Max = u32AccMaxSum[u8FindIndex];
10356                 u8StartPosition = u8InitailPosition + u8FindIndex;
10357             }
10358         }
10359         //printf("u32AccMaxSum:%d u32AccMax:%d u32Max:%d\n",u32AccMaxSum[u8FindIndex],u32AccMax[u8FindIndex],u32Max);
10360 
10361     }
10362 
10363 
10364     u8StartPositionAverage = StartPositionAverage(u8StartPosition,isSceneChangeY);
10365 
10366     MApi_XC_W2BYTEMSK(REG_SC_BK47_31_L, u8StartPositionAverage, 0x1FFF);//set start to Max->Mark
10367     return u8StartPositionAverage;
10368 }
VDBK_WidthPartHW(MS_BOOL isSceneChangeY,MS_U16 * u16WidthDiffHW,MS_U16 * u16MaxMinDiff,MS_U16 * u16WidthAvg,MS_S16 * as16MinDiffIndex,MS_U8 u8Widdth,MS_U8 u8HwidthConfidence,MS_U8 * u8VwidthConfidence)10369 MS_S8 VDBK_WidthPartHW(MS_BOOL isSceneChangeY,MS_U16 *u16WidthDiffHW,MS_U16 *u16MaxMinDiff,MS_U16 *u16WidthAvg,MS_S16 *as16MinDiffIndex
10370     ,MS_U8 u8Widdth,MS_U8 u8HwidthConfidence,MS_U8 *u8VwidthConfidence)
10371 {
10372     MS_U32 u32Avg =0;
10373     MS_U8 u8Index;
10374     MS_U32 u32MaxWidthDiff  = 0;
10375     MS_U32 u32MinWidthDiff  = 0x7FFFFFFF;
10376     MS_U32 u32Min2WidthDiff = 0x7FFFFFFF;
10377     MS_U32 u32Min3WidthDiff = 0x7FFFFFFF;
10378     MS_U32 u32Min4WidthDiff = 0x7FFFFFFF;
10379     MS_S8 s8OutWidth = -1;
10380     MS_S8 s8MinIdx   = -1, s8min2Idx   = -1, s8min3Idx   = -1, s8min4Idx   = -1;
10381     MS_S8 s8MinWidth = -1, s8min2Width = -1, s8min3Width = -1, s8min4Width = -1;
10382     MS_U16 u16DiffThrd = 2048;
10383     static MS_S8 s8ReferHconfidence = 0,s8Vwidthconfidence = 0;
10384     //long ScalingRatio = 1<<20;
10385     // long ScalingRatio = (MApi_XC_R2BYTEMSK(REG_SC_BK23_0A_L,0x00FF)<<16) + MApi_XC_R2BYTEMSK(REG_SC_BK23_09_L,0xFFFF);
10386     //const int OrigWidth = 8;
10387     //long EstWidth = (ScalingRatio*OrigWidth + (1<<19) ) >> 20;
10388     if(isSceneChangeY)
10389     {
10390         s8ReferHconfidence = 0;
10391         s8Vwidthconfidence = 0;
10392     }
10393 
10394     u16WidthDiffHW[0 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_60_L,0xFFFF); // width 5
10395     u16WidthDiffHW[1 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_61_L,0xFFFF); // width 6
10396     u16WidthDiffHW[2 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_62_L,0xFFFF); // width 7
10397     u16WidthDiffHW[3 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_63_L,0xFFFF); // width 8
10398     u16WidthDiffHW[4 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_64_L,0xFFFF); // width 9
10399     u16WidthDiffHW[5 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_65_L,0xFFFF); // width 10
10400     u16WidthDiffHW[6 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_66_L,0xFFFF); // width 11
10401     u16WidthDiffHW[7 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_67_L,0xFFFF); // width 12
10402     u16WidthDiffHW[8 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_68_L,0xFFFF); // width 13
10403     u16WidthDiffHW[9 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_69_L,0xFFFF); // width 14
10404     u16WidthDiffHW[10] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6A_L,0xFFFF); // width 15
10405     u16WidthDiffHW[11] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6B_L,0xFFFF); // width 16
10406     u16WidthDiffHW[12] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6C_L,0xFFFF); // width 17
10407     u16WidthDiffHW[13] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6D_L,0xFFFF); // width 18
10408     u16WidthDiffHW[14] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6E_L,0xFFFF); // width 19
10409     u16WidthDiffHW[15] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6F_L,0xFFFF); // width 20
10410     for(u8Index = 0 ; u8Index < paraVerSize ; u8Index++)
10411     {
10412         if (u16WidthDiffHW[u8Index] > u32MaxWidthDiff)
10413         {
10414             u32MaxWidthDiff = u16WidthDiffHW[u8Index];
10415         }
10416         //printf("V states width :%d u16WidthDiffHW:%d\n",u8Index+5,u16WidthDiffHW[u8Index]);
10417     }
10418     for(u8Index = 0 ; u8Index < paraVerSize -1; u8Index+=2)
10419     {
10420         if ( (u8Index==2 || u8Index==10 ) && (u16WidthDiffHW[u8Index+1] - u16WidthDiffHW[u8Index ] <= u16DiffThrd) )
10421         {
10422             u16WidthDiffHW[u8Index+1]= __min(u16WidthDiffHW[u8Index ], u16WidthDiffHW[u8Index+1]);
10423             u16WidthDiffHW[u8Index  ]= u32MaxWidthDiff;
10424         }
10425     }
10426 
10427     for(u8Index = 0 ; u8Index < paraVerSize ; u8Index++)
10428     {
10429         u32Avg += u16WidthDiffHW[u8Index];
10430 
10431         if (u16WidthDiffHW[u8Index] < u32MinWidthDiff)
10432         {
10433             u32Min4WidthDiff = u32Min3WidthDiff;
10434             s8min4Idx = s8min3Idx;
10435             u32Min3WidthDiff = u32Min2WidthDiff;
10436             s8min3Idx = s8min2Idx;
10437             u32Min2WidthDiff = u32MinWidthDiff;
10438             s8min2Idx = s8MinIdx;
10439 
10440             u32MinWidthDiff = u16WidthDiffHW[u8Index];
10441             s8MinIdx = u8Index;
10442 
10443         }
10444         else if (u16WidthDiffHW[u8Index] < u32Min2WidthDiff)
10445         {
10446             u32Min4WidthDiff = u32Min3WidthDiff;
10447             s8min4Idx = s8min3Idx;
10448             u32Min3WidthDiff = u32Min2WidthDiff;
10449             s8min3Idx = s8min2Idx;
10450 
10451             u32Min2WidthDiff = u16WidthDiffHW[u8Index];
10452             s8min2Idx = u8Index;
10453 
10454         }
10455         else if (u16WidthDiffHW[u8Index] < u32Min3WidthDiff)
10456         {
10457             u32Min4WidthDiff = u32Min3WidthDiff;
10458             s8min4Idx = s8min3Idx;
10459 
10460             u32Min3WidthDiff = u16WidthDiffHW[u8Index];
10461             s8min3Idx = u8Index;
10462 
10463         }
10464         else if (u16WidthDiffHW[u8Index] < u32Min4WidthDiff)
10465         {
10466             u32Min4WidthDiff = u16WidthDiffHW[u8Index];
10467             s8min4Idx = u8Index;
10468         }
10469     }
10470 
10471     *u16WidthAvg = u32Avg / paraVerSize;
10472     *u16MaxMinDiff = u32MaxWidthDiff - u32MinWidthDiff;
10473 
10474     if ( s8MinIdx  != -1)
10475     {
10476         s8MinWidth  = s8MinIdx +5;
10477     }
10478     if ( s8min2Idx != -1)
10479     {
10480         s8min2Width = s8min2Idx+5;
10481     }
10482     if ( s8min3Idx != -1)
10483     {
10484         s8min3Width = s8min3Idx+5;
10485     }
10486     if ( s8min4Idx != -1)
10487     {
10488         s8min4Width = s8min4Idx+5;
10489     }
10490 
10491     as16MinDiffIndex[0] = s8MinIdx;
10492     as16MinDiffIndex[1] = s8min2Idx;
10493     as16MinDiffIndex[2] = s8min3Idx;
10494     as16MinDiffIndex[3] = s8min4Idx;
10495     //PRT_TRP(" --min4WidthDiff = %d, min4Idx=%d, min4Width =%d \n", min4WidthDiff, min4Idx, min4Width);
10496     //PRT_TRP(" --min3WidthDiff = %d, min3Idx=%d, min3Width =%d \n", min3WidthDiff, min3Idx, min3Width);
10497     //PRT_TRP(" --min2WidthDiff = %d, min2Idx=%d, min2Width =%d \n", min2WidthDiff, min2Idx, min2Width);
10498     //PRT_TRP(" --minWidthDiff  = %d, minIdx =%d, minWidth  =%d \n", minWidthDiff , minIdx , minWidth );
10499     //PRT_TRP(" --maxWidthDiff  = %d, maxIdx =%d \n", maxWidthDiff , maxIdx );
10500     //PRT_TRP(" --avg  = %d \n", avg );
10501     //PRT_TRP(" --MaxMinDiff  = %d \n", MaxMinDiff );
10502     //printf("V states s8MinWidth:%d ,s8min2Width:%d , s8min3Width:%d ,s8min4Width:%d\n",s8MinWidth ,s8min2Width , s8min3Width,s8min4Width);
10503     //printf("V states u8HwidthConfidence:%d\n",u8HwidthConfidence);
10504     if (u8HwidthConfidence > 10)
10505     {
10506         if(u8Widdth == 8)
10507         {
10508             if((s8MinWidth == 8 ||s8min2Width == 8 || s8min3Width == 8 || s8min4Width == 8)
10509             ||(s8MinWidth == 16 || s8min2Width == 16 || s8min3Width == 16 || s8min4Width == 16))
10510             {
10511                 s8OutWidth = 8;
10512                 s8ReferHconfidence++;
10513                 s8Vwidthconfidence--;
10514             }
10515         }
10516         else if(u8Widdth == 11)
10517         {
10518             if((s8MinWidth == 8 ||s8min2Width == 8 || s8min3Width == 8 || s8min4Width == 8)
10519             ||(s8MinWidth == 16 || s8min2Width == 16 || s8min3Width == 16 || s8min4Width == 16))
10520             {
10521                 s8OutWidth = 8;
10522                 s8ReferHconfidence++;
10523                 s8Vwidthconfidence--;
10524             }
10525             else if(s8MinWidth == 11 ||s8min2Width == 11|| s8min3Width == 11|| s8min4Width == 11)
10526             {
10527                 s8OutWidth = 11;
10528                 s8ReferHconfidence++;
10529                 s8Vwidthconfidence--;
10530             }
10531         }
10532         else if (u8Widdth == 16)
10533         {
10534             if(s8MinWidth == 16 || s8min2Width == 16 || s8min3Width == 16 || s8min4Width == 16)
10535             {
10536                 s8OutWidth = 16;
10537                 s8ReferHconfidence++;
10538                 s8Vwidthconfidence--;
10539             }
10540             else if((s8MinWidth == 17 ||s8min2Width == 17|| s8min3Width == 17|| s8min4Width == 17)
10541                 &&(s8MinWidth == 18 ||s8min2Width == 18|| s8min3Width == 18|| s8min4Width == 18))
10542             {
10543                 s8OutWidth = 18;
10544                 s8ReferHconfidence++;
10545                 s8Vwidthconfidence--;
10546             }
10547         }
10548         else if (u8Widdth == 21)
10549         {
10550             if((s8MinWidth == 17 ||s8min2Width == 17|| s8min3Width == 17|| s8min4Width == 17)
10551                 &&(s8MinWidth == 18 ||s8min2Width == 18|| s8min3Width == 18|| s8min4Width == 18))
10552             {
10553                 s8OutWidth = 18;
10554                 s8ReferHconfidence++;
10555                 s8Vwidthconfidence--;
10556             }
10557         }
10558     }
10559     else if ((s8MinWidth == 8 ||s8min2Width == 8 || s8min3Width == 8 || s8min4Width == 8)
10560         &&(s8MinWidth == 16 || s8min2Width == 16 || s8min3Width == 16 || s8min4Width == 16))
10561     {
10562     s8OutWidth = 8;
10563     s8ReferHconfidence--;
10564     s8Vwidthconfidence++;
10565     }
10566     else
10567     {
10568         s8OutWidth = -1;
10569         s8Vwidthconfidence--;
10570         s8ReferHconfidence--;
10571     }
10572     s8ReferHconfidence = __minmax(s8ReferHconfidence,0,16);
10573     s8Vwidthconfidence = __minmax(s8Vwidthconfidence,0,16);
10574     if(s8Vwidthconfidence >15)
10575     {
10576         s8ReferHconfidence = 0;
10577     }
10578 
10579     if(s8ReferHconfidence >15)
10580     {
10581         s8Vwidthconfidence = 0;
10582     }
10583 
10584     *u8VwidthConfidence = __max(s8ReferHconfidence,s8Vwidthconfidence);
10585 
10586     return s8OutWidth;
10587 }
DBK_WidthPartHW(MS_U16 * u16WidthDiffHW,MS_U16 * u16Avg,MS_BOOL isSceneChangeY,MS_U8 * u8WidthConfidence)10588 MS_S8 DBK_WidthPartHW(MS_U16 *u16WidthDiffHW, MS_U16* u16Avg,MS_BOOL isSceneChangeY,MS_U8 *u8WidthConfidence)
10589 {
10590     MS_U8 u8Index;
10591     MS_U32 u32MaxWidthDiff  = 0;
10592     MS_U32 u32MinWidthDiff  = 0x7FFFFFFF;
10593     MS_U32 u32Min2WidthDiff = 0x7FFFFFFF;
10594     MS_U32 u32Min3WidthDiff = 0x7FFFFFFF;
10595     MS_U32 u32Min4WidthDiff = 0x7FFFFFFF;
10596     MS_S8 s8MinIdx = -1, s8Min2Idx = -1, s8Min3Idx = -1, s8Min4Idx = -1;// maxIdx = -1;
10597     static MS_U8 u8TempWidth = 4;
10598     MS_U16 u16DiffThrd = 2048;
10599     static MS_S16 s16ConfidenceLevel8 = 0,s16ConfidenceLevel11 = 0,s16ConfidenceLevel16 = 0,s16ConfidenceLevel21 = 0;
10600     int log_en = 5;
10601     //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
10602     if(isSceneChangeY)
10603     {
10604        //printf("H isSceneChangeY:[%d]\n",isSceneChangeY);
10605        s16ConfidenceLevel8 = 0;
10606        s16ConfidenceLevel11 = 0;
10607        s16ConfidenceLevel16 = 0;
10608        s16ConfidenceLevel21 = 0;
10609     }
10610     u16WidthDiffHW[0 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_40_L,0xFFFF) ; // width 4
10611     u16WidthDiffHW[1 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_41_L,0xFFFF) ; // width 5
10612     u16WidthDiffHW[2 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_42_L,0xFFFF) ; // width 6
10613     u16WidthDiffHW[3 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_43_L,0xFFFF) ; // width 7
10614     u16WidthDiffHW[4 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_44_L,0xFFFF) ; // width 8
10615     u16WidthDiffHW[5 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_45_L,0xFFFF) ; // width 9
10616     u16WidthDiffHW[6 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_46_L,0xFFFF) ; // width 10
10617     u16WidthDiffHW[7 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_47_L,0xFFFF) ; // width 11
10618     u16WidthDiffHW[8 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_48_L,0xFFFF) ; // width 12
10619     u16WidthDiffHW[9 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_49_L,0xFFFF) ; // width 13
10620     u16WidthDiffHW[10] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4A_L,0xFFFF) ; // width 14
10621     u16WidthDiffHW[11] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4B_L,0xFFFF) ; // width 15
10622     u16WidthDiffHW[12] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4C_L,0xFFFF) ; // width 16
10623     u16WidthDiffHW[13] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4D_L,0xFFFF) ; // width 17
10624     u16WidthDiffHW[14] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4E_L,0xFFFF) ; // width 18
10625     u16WidthDiffHW[15] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4F_L,0xFFFF) ; // width 19
10626     u16WidthDiffHW[16] = MApi_XC_R2BYTEMSK(REG_SC_BK60_50_L,0xFFFF) ; // width 20
10627     u16WidthDiffHW[17] = MApi_XC_R2BYTEMSK(REG_SC_BK60_51_L,0xFFFF) ; // width 21
10628     u16WidthDiffHW[18] = MApi_XC_R2BYTEMSK(REG_SC_BK60_52_L,0xFFFF) ; // width 22
10629     u16WidthDiffHW[19] = MApi_XC_R2BYTEMSK(REG_SC_BK60_53_L,0xFFFF) ; // width 23
10630     u16WidthDiffHW[20] = MApi_XC_R2BYTEMSK(REG_SC_BK60_54_L,0xFFFF) ; // width 24
10631     u16WidthDiffHW[21] = MApi_XC_R2BYTEMSK(REG_SC_BK60_55_L,0xFFFF) ; // width 25
10632     u16WidthDiffHW[22] = MApi_XC_R2BYTEMSK(REG_SC_BK60_56_L,0xFFFF) ; // width 26
10633     u16WidthDiffHW[23] = MApi_XC_R2BYTEMSK(REG_SC_BK60_57_L,0xFFFF) ; // width 27
10634     u16WidthDiffHW[24] = MApi_XC_R2BYTEMSK(REG_SC_BK60_58_L,0xFFFF) ; // width 28
10635     u16WidthDiffHW[25] = MApi_XC_R2BYTEMSK(REG_SC_BK60_59_L,0xFFFF) ; // width 29
10636     u16WidthDiffHW[26] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5A_L,0xFFFF) ; // width 30
10637     u16WidthDiffHW[27] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5B_L,0xFFFF) ; // width 31
10638     u16WidthDiffHW[28] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5C_L,0xFFFF) ; // width 32
10639     u16WidthDiffHW[29] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5D_L,0xFFFF) ; // width 33
10640     u16WidthDiffHW[30] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5E_L,0xFFFF) ; // width 34
10641     u16WidthDiffHW[31] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5F_L,0xFFFF) ; // width 35
10642 
10643     for(u8Index = 1 ; u8Index < paraSize ; u8Index++)
10644     {
10645         if (u16WidthDiffHW[u8Index] > u32MaxWidthDiff)
10646         {
10647             u32MaxWidthDiff = u16WidthDiffHW[u8Index];
10648         }
10649     }
10650 
10651     for(u8Index = 1 ; u8Index < paraSize -1; u8Index+=2)
10652     {
10653     if ( (u8Index==3 || u8Index==11 || u8Index==19 || u8Index==27) && (u16WidthDiffHW[u8Index+1] - u16WidthDiffHW[u8Index ] <= u16DiffThrd) )
10654     {
10655          u16WidthDiffHW[u8Index+1]= __min(u16WidthDiffHW[u8Index ], u16WidthDiffHW[u8Index+1]);
10656          u16WidthDiffHW[u8Index  ]= u32MaxWidthDiff;
10657     }
10658     else if ( (u8Index==7) && ( (u16WidthDiffHW[u8Index  ] - u16WidthDiffHW[u8Index-1 ] <= u16DiffThrd) || (u16WidthDiffHW[u8Index  ] - u16WidthDiffHW[u8Index+1 ] <= u16DiffThrd)) )
10659     {
10660          u16WidthDiffHW[u8Index  ]= __min3(u16WidthDiffHW[u8Index ], u16WidthDiffHW[u8Index-1], u16WidthDiffHW[u8Index+1]);
10661          u16WidthDiffHW[u8Index-1]= u32MaxWidthDiff;
10662          u16WidthDiffHW[u8Index+1]= u32MaxWidthDiff;
10663     }
10664     }
10665 
10666     for(u8Index = 1 ; u8Index < paraSize ; u8Index++)
10667     {
10668         (*u16Avg) += u16WidthDiffHW[u8Index];
10669         if (u16WidthDiffHW[u8Index] < u32MinWidthDiff)
10670         {
10671             u32Min4WidthDiff = u32Min3WidthDiff;
10672             s8Min4Idx = s8Min3Idx;
10673             u32Min3WidthDiff = u32Min2WidthDiff;
10674             s8Min3Idx = s8Min2Idx;
10675             u32Min2WidthDiff = u32MinWidthDiff;
10676             s8Min2Idx = s8MinIdx;
10677             u32MinWidthDiff = u16WidthDiffHW[u8Index];
10678             s8MinIdx = u8Index;
10679         }
10680         else if (u16WidthDiffHW[u8Index] < u32Min2WidthDiff)
10681         {
10682             u32Min4WidthDiff = u32Min3WidthDiff;
10683             s8Min4Idx = s8Min3Idx;
10684             u32Min3WidthDiff = u32Min2WidthDiff;
10685             s8Min3Idx = s8Min2Idx;
10686             u32Min2WidthDiff = u16WidthDiffHW[u8Index];
10687             s8Min2Idx = u8Index;
10688         }
10689         else if (u16WidthDiffHW[u8Index] < u32Min3WidthDiff)
10690         {
10691             u32Min4WidthDiff = u32Min3WidthDiff;
10692             s8Min4Idx = s8Min3Idx;
10693             u32Min3WidthDiff = u16WidthDiffHW[u8Index];
10694             s8Min3Idx = u8Index;
10695         }
10696         else if (u16WidthDiffHW[u8Index] < u32Min4WidthDiff)
10697         {
10698             u32Min4WidthDiff = u16WidthDiffHW[u8Index];
10699             s8Min4Idx = u8Index;
10700         }
10701     }
10702 
10703     *u16Avg = (*u16Avg) / (paraSize-1);
10704 
10705     s16ConfidenceLevel8 = __minmax(s16ConfidenceLevel8,0,16);
10706     s16ConfidenceLevel11 = __minmax(s16ConfidenceLevel11,0,16);
10707     s16ConfidenceLevel16 = __minmax(s16ConfidenceLevel16,0,16);
10708     s16ConfidenceLevel21 = __minmax(s16ConfidenceLevel21,0,16);
10709     if(s16ConfidenceLevel8>15)
10710     {
10711         s16ConfidenceLevel11 = 0;
10712         s16ConfidenceLevel16 = 0;
10713         s16ConfidenceLevel21 = 0;
10714     }
10715     else if(s16ConfidenceLevel11>15)
10716     {
10717         s16ConfidenceLevel8 = 0;
10718         s16ConfidenceLevel16 = 0;
10719         s16ConfidenceLevel21 = 0;
10720     }
10721     else if(s16ConfidenceLevel16>15)
10722     {
10723         s16ConfidenceLevel8 = 0;
10724         s16ConfidenceLevel11 = 0;
10725         s16ConfidenceLevel21 = 0;
10726     }
10727     else if(s16ConfidenceLevel21>15)
10728     {
10729         s16ConfidenceLevel8 = 0;
10730         s16ConfidenceLevel16 = 0;
10731         s16ConfidenceLevel11 = 0;
10732     }
10733 
10734     if(log_en==5)
10735         {
10736      //printf("s8MinIdx:%d s8Min2Idx:%d s8Min3Idx:%d s8Min4Idx:%d\n",s8MinIdx,s8Min2Idx,s8Min3Idx,s8Min4Idx);
10737      //printf("u16ConfidenceLevel8:%d u16ConfidenceLevel11:%d\n",s16ConfidenceLevel8,s16ConfidenceLevel11);
10738      //printf("u16ConfidenceLevel16:%d u16ConfidenceLevel21:%d\n",s16ConfidenceLevel16,s16ConfidenceLevel21);
10739         }
10740     *u8WidthConfidence = __max3(s16ConfidenceLevel8,s16ConfidenceLevel11,s16ConfidenceLevel16);
10741     *u8WidthConfidence = __max((*u8WidthConfidence),s16ConfidenceLevel21);
10742     /*if(u8TempWidth == 4 )//&& s16ConfidenceLevel8>10)
10743     {
10744      if((abs(s8MinIdx-u8TempWidth) <2)||(abs(s8Min2Idx-u8TempWidth) <2)||(abs(s8Min3Idx-u8TempWidth) <2)||(abs(s8Min4Idx-u8TempWidth) <2))
10745      {
10746          return 4;
10747     }
10748 }
10749     else*/
10750     if(u8TempWidth == 7 && s16ConfidenceLevel11>10)
10751     {
10752         if ((((s8MinIdx == 7) || (s8Min2Idx == 7) || (s8Min3Idx == 7) || (s8Min4Idx == 7))|| ((s8MinIdx == 16) || (s8Min2Idx == 16) || (s8Min3Idx == 16) || (s8Min4Idx == 16))
10753              || ((s8MinIdx == 17) || (s8Min2Idx == 17) || (s8Min3Idx == 17) || (s8Min4Idx == 17)) ) && ((s8MinIdx == 28) || (s8Min2Idx == 28) || (s8Min3Idx == 28) || (s8Min4Idx == 28)))
10754         {
10755             s16ConfidenceLevel11++;
10756              return 7;
10757         }
10758         else if((abs(s8MinIdx-u8TempWidth) <2)||(abs(s8Min2Idx-u8TempWidth) <2)||(abs(s8Min3Idx-u8TempWidth) <2)||(abs(s8Min4Idx-u8TempWidth) <2))
10759         {
10760             s16ConfidenceLevel11--;
10761              return 7;
10762         }
10763     }
10764     else if(u8TempWidth == 17 && s16ConfidenceLevel21>10)
10765     {
10766         if ((((s8MinIdx == 16 || s8Min2Idx == 16 || s8Min3Idx == 16) || (s8MinIdx == 18 || s8Min2Idx == 18 || s8Min3Idx == 18) ) && (s8MinIdx == 17 || s8Min2Idx == 17 || s8Min3Idx == 17)))
10767         {
10768             s16ConfidenceLevel21++;
10769             u8TempWidth = 17;
10770             return 17;
10771         }
10772         else if((abs(s8MinIdx-u8TempWidth) <4)||(abs(s8Min2Idx-u8TempWidth) <4)||(abs(s8Min3Idx-u8TempWidth) <4)||(abs(s8Min4Idx-u8TempWidth) <4))
10773         {
10774             s16ConfidenceLevel21--;
10775             return 17;
10776         }
10777     }
10778 
10779     if ((((s8MinIdx == 7) || (s8Min2Idx == 7) || (s8Min3Idx == 7) || (s8Min4Idx == 7))|| ((s8MinIdx == 16) || (s8Min2Idx == 16) || (s8Min3Idx == 16) || (s8Min4Idx == 16))
10780          || ((s8MinIdx == 17) || (s8Min2Idx == 17) || (s8Min3Idx == 17) || (s8Min4Idx == 17)) ) && ((s8MinIdx == 28) || (s8Min2Idx == 28) || (s8Min3Idx == 28) || (s8Min4Idx == 28)))
10781     {
10782         if(u8TempWidth == 7)
10783         {
10784             s16ConfidenceLevel11++;
10785         }
10786         else
10787         {
10788             s16ConfidenceLevel8--;
10789             s16ConfidenceLevel16--;
10790             s16ConfidenceLevel21--;
10791         }
10792         u8TempWidth = 7;
10793         return 7;
10794     }
10795     else if ((((s8MinIdx == 16 || s8Min2Idx == 16 || s8Min3Idx == 16) || (s8MinIdx == 18 || s8Min2Idx == 18 || s8Min3Idx == 18) ) && (s8MinIdx == 17 || s8Min2Idx == 17 || s8Min3Idx == 17)))
10796     {
10797         if(u8TempWidth == 17)
10798         {
10799             s16ConfidenceLevel21++;
10800         }
10801         else
10802         {
10803             s16ConfidenceLevel8--;
10804             s16ConfidenceLevel16--;
10805             s16ConfidenceLevel11--;
10806         }
10807         u8TempWidth = 17;
10808         return 17;
10809     }
10810 
10811     if (s8MinIdx == 4 || s8Min2Idx == 4 || s8Min3Idx == 4 || s8Min4Idx == 4)
10812     {
10813         if(u8TempWidth == 4)
10814         {
10815             s16ConfidenceLevel8++;
10816         }
10817         else
10818         {
10819             s16ConfidenceLevel11--;
10820             s16ConfidenceLevel16--;
10821             s16ConfidenceLevel21--;
10822         }
10823         u8TempWidth = 4;
10824         return 4;
10825     }
10826     else if (s8MinIdx == 12 || s8Min2Idx == 12 || s8Min3Idx == 12 || s8Min4Idx == 12)
10827     {
10828         if(u8TempWidth == 12)
10829         {
10830             s16ConfidenceLevel16++;
10831         }
10832         else
10833         {
10834             s16ConfidenceLevel8--;
10835             s16ConfidenceLevel11--;
10836             s16ConfidenceLevel21--;
10837         }
10838         u8TempWidth = 12;
10839         return 12;
10840     }
10841 
10842     return -1;
10843 }
DBK_WidthPartTop(MS_U16 * u16WidthDiffHW,MS_U16 * u16MaxMinDiff,MS_U16 * u16Avg,MS_BOOL isSceneChangeY,MS_U8 * u8WidthConfidence)10844 MS_S8 DBK_WidthPartTop(MS_U16 *u16WidthDiffHW, MS_U16* u16MaxMinDiff, MS_U16* u16Avg,MS_BOOL isSceneChangeY,MS_U8* u8WidthConfidence)
10845 {
10846     MS_U8 u8Bin;
10847     MS_U32 u32MinValue = 0x7FFFFFFF;
10848     MS_U16 u16MaxValue = 0;
10849     MS_S8 s8NormFac;
10850     MS_S8 s8MinIndex;
10851     s8MinIndex = DBK_WidthPartHW(u16WidthDiffHW, u16Avg,isSceneChangeY,u8WidthConfidence);
10852     if (s8MinIndex == -1)
10853     {
10854         for (u8Bin =0; u8Bin<paraSize;u8Bin++)
10855         {
10856             if (u16WidthDiffHW[u8Bin] > u16MaxValue )
10857             {
10858                 u16MaxValue = u16WidthDiffHW[u8Bin];
10859             }
10860 
10861             if (u16WidthDiffHW[u8Bin] < u32MinValue )
10862             {
10863             u32MinValue = u16WidthDiffHW[u8Bin];
10864             }
10865         }
10866         *u16MaxMinDiff = u16MaxValue - u32MinValue;
10867         s8NormFac = normFactorWidth(*u16MaxMinDiff);
10868         if(s8NormFac >0)
10869         {
10870             for (u8Bin=0;u8Bin<paraSize;u8Bin++)
10871             {
10872                 u16WidthDiffHW[u8Bin] = (u16WidthDiffHW[u8Bin] - u32MinValue) >> s8NormFac;
10873             }
10874             *u16Avg = (*u16Avg-u32MinValue) >> s8NormFac;
10875             *u16MaxMinDiff = (*u16MaxMinDiff) >>s8NormFac;
10876         }
10877         else if(s8NormFac ==0)
10878         {
10879             for (u8Bin=0;u8Bin<paraSize;u8Bin++)
10880             {
10881                 u16WidthDiffHW[u8Bin] = (u16WidthDiffHW[u8Bin] - u32MinValue);
10882             }
10883             *u16Avg = (*u16Avg-u32MinValue);
10884             *u16MaxMinDiff = (*u16MaxMinDiff);
10885         }
10886         else
10887         {
10888             s8NormFac = 0-s8NormFac;
10889             for (u8Bin=0;u8Bin<paraSize;u8Bin++)
10890             {
10891                 u16WidthDiffHW[u8Bin] = (u16WidthDiffHW[u8Bin] - u32MinValue) << s8NormFac;
10892             }
10893             *u16Avg = (*u16Avg-u32MinValue) <<s8NormFac;
10894             *u16MaxMinDiff = (*u16MaxMinDiff) <<s8NormFac;
10895         }
10896         return -1;
10897     }
10898     else
10899     {
10900         return s8MinIndex;
10901     }
10902 }
WidthIIR_V(MS_U8 u8Width)10903 void WidthIIR_V(MS_U8 u8Width) // Width IIR Protection
10904 {
10905     static MS_U8 u8HysteresisCount = 0;
10906     static MS_U8 u8LastWidth = 8;
10907     int log_en = 5;
10908     //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
10909     if(u8HysteresisCount<6)
10910     {
10911         if(log_en==5)
10912         {
10913         //printf("V new width:%d last width:%d final width:%d hysteresisCount:%d\n",u8Width,u8LastWidth,WidthIIR,u8HysteresisCount);
10914         }
10915 
10916         if(u8Width == u8LastWidth)
10917         {
10918             u8HysteresisCount = 0;
10919             VWidthIIR = u8Width;
10920         }
10921         else
10922         {
10923             u8HysteresisCount++;
10924             VWidthIIR = u8LastWidth;
10925         }
10926     }
10927     else
10928     {
10929         VWidthIIR = u8Width;
10930         u8HysteresisCount = 0;
10931     }
10932     u8LastWidth = VWidthIIR;
10933 }
WidthIIR_H(MS_U8 u8Width)10934 void WidthIIR_H(MS_U8 u8Width) // Width IIR Protection
10935 {
10936     static MS_U8 u8HysteresisCount = 0;
10937     static MS_U8 u8LastWidth = 8;
10938     int log_en = 5;
10939     //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
10940     if(u8HysteresisCount<6)
10941     {
10942         if(log_en==5)
10943         {
10944             //printf("new width:%d last width:%d final width:%d hysteresisCount:%d\n",u8Width,u8LastWidth,WidthIIR,u8HysteresisCount);
10945         }
10946 
10947         if(u8Width == u8LastWidth)
10948         {
10949             u8HysteresisCount = 0;
10950             WidthIIR = u8Width;
10951         }
10952         else
10953         {
10954             u8HysteresisCount++;
10955             WidthIIR = u8LastWidth;
10956         }
10957     }
10958     else
10959     {
10960         WidthIIR = u8Width;
10961         u8HysteresisCount = 0;
10962     }
10963     u8LastWidth = WidthIIR;
10964 }
VDBK_ComputeWidthPart(MS_BOOL isSceneChangeY,MS_U16 * u16WidthDiffHW,MS_U8 u8LastminWidth,MS_U16 u16MaxMinDiff,MS_U16 u16WidthAvg,MS_U8 u8VWidthConfidence,MS_S16 * as16MinDiffIndex)10965 MS_S8 VDBK_ComputeWidthPart(MS_BOOL isSceneChangeY,MS_U16 *u16WidthDiffHW,MS_U8 u8LastminWidth
10966     ,MS_U16 u16MaxMinDiff,MS_U16 u16WidthAvg,MS_U8 u8VWidthConfidence,MS_S16 *as16MinDiffIndex)
10967 {
10968     MS_U8 u8WidthCandidate[paraSize] ={0};
10969     MS_U16 u16minWidthDiff = 0,u16min2WidthDiff = 0,u16min3WidthDiff = 0,u16min4WidthDiff = 0;
10970     MS_S8 s8minWidth = 0,s8min2Width = 0,s8min3Width = 0,s8min4Width = 0;
10971     //MS_U8 u8SNRmin = 0,u8SNR2min = 0,u8SNR3min = 0,u8SNR4min = 0;
10972     MS_S16 s16minIdx = -1,s16min2Idx = -1,s16min3Idx = -1,s16min4Idx = -1,s16OutWidth =  -1;
10973 
10974     //if(isSceneChangeY)
10975    //{
10976         //u8VNconfidence = 0;
10977    //}
10978 
10979     s16minIdx = as16MinDiffIndex[0];
10980     s16min2Idx = as16MinDiffIndex[1];
10981     s16min3Idx = as16MinDiffIndex[2];
10982     s16min4Idx = as16MinDiffIndex[3];
10983 
10984     if(s16minIdx != -1)
10985     {
10986         s8minWidth = s16minIdx + 5;
10987         u16minWidthDiff = u16WidthDiffHW[s16minIdx];
10988     }
10989     if(s16min2Idx != -1)
10990     {
10991         s8min2Width = s16min2Idx + 5;
10992         u16min2WidthDiff = u16WidthDiffHW[s16min2Idx];
10993     }
10994     if(s16min3Idx != -1)
10995     {
10996         s8min3Width = s16min3Idx + 5;
10997         u16min3WidthDiff = u16WidthDiffHW[s16min3Idx];
10998     }
10999     if(s16min4Idx != -1)
11000     {
11001         s8min4Width = s16min4Idx + 5;
11002         u16min4WidthDiff = u16WidthDiffHW[s16min4Idx];
11003     }
11004     //printf("Revise s16minIdx:%d,s16min2Idx:%d,s16min3Idx:%d,s16min4Idx:%d\n",s8minWidth,s8min2Width,s8min3Width,s8min4Width);
11005     //printf("Revise u16minWidthDiff:%d ,u16min2WidthDiff:%d ,u16min3WidthDiff:%d ,u16min4WidthDiff:%d\n",u16minWidthDiff,u16min2WidthDiff,u16min3WidthDiff,u16min4WidthDiff);
11006     //printf("Revise u16MaxMinDiff:%d\n",u16MaxMinDiff);
11007 #if 0
11008     if(u16WidthAvg > 0)
11009 {
11010         if(u16minWidthDiff > u16WidthAvg)
11011     {
11012             u8SNRmin = 0;
11013     }
11014     else
11015     {
11016             u8SNRmin = (u16WidthAvg -u16minWidthDiff)*100/u16WidthAvg;
11017     }
11018 
11019         if(u16min2WidthDiff > u16WidthAvg)
11020     {
11021             u8SNR2min = 0;
11022         }
11023         else
11024         {
11025             u8SNR2min = (u16WidthAvg -u16min2WidthDiff)*100/u16WidthAvg;
11026     }
11027 
11028         if(u16min3WidthDiff > u16WidthAvg)
11029         {
11030             u8SNR3min = 0;
11031 }
11032         else
11033 {
11034             u8SNR3min = (u16WidthAvg -u16min3WidthDiff)*100/u16WidthAvg;
11035 }
11036 
11037         if(u16min4WidthDiff > u16WidthAvg)
11038     {
11039             u8SNR4min = 0;
11040         }
11041         else
11042         {
11043             u8SNR4min = (u16WidthAvg -u16min4WidthDiff)*100/u16WidthAvg;
11044         }
11045     }
11046 #endif
11047     //printf("V states H maxmindiff :%d\n",u16MaxMinDiff);
11048     //printf("V states u16minWidthDiff SNR:%d width :%d\n",u8SNRmin,s8minWidth);
11049     //printf("V states u16min2WidthDiff SNR:%d width :%d\n",u8SNR2min,s8min2Width);
11050     //printf("V states u16min3WidthDiff SNR:%d width :%d\n",u8SNR3min,s8min3Width);
11051     //printf("V states u16min4WidthDiff SNR:%d width :%d\n",u8SNR4min,s8min4Width);
11052     if(s16minIdx >=0 && s16min2Idx>=0 && s16min3Idx>=0 && s16min4Idx>=0)
11053     {
11054         u8WidthCandidate[s16minIdx] = 1;
11055         if (u16MaxMinDiff > 0)
11056         {
11057             if ( (u16min2WidthDiff-u16minWidthDiff)*256/u16MaxMinDiff <48)
11058             {
11059                 u8WidthCandidate[s16min2Idx] = 1;
11060             }
11061 
11062             if ( (u16min3WidthDiff-u16minWidthDiff)*256/u16MaxMinDiff <48)
11063             {
11064                 u8WidthCandidate[s16min3Idx] = 1;
11065             }
11066 
11067             if ( (u16min4WidthDiff-u16minWidthDiff)*256/u16MaxMinDiff <48)
11068             {
11069                 u8WidthCandidate[s16min4Idx] = 1;
11070             }
11071         }
11072         //printf("V states PRE-u8WidthCandidate: 1:%d 2:%d 3:%d 4:%d\n",u8WidthCandidate[s16minIdx],u8WidthCandidate[s16min2Idx],u8WidthCandidate[s16min3Idx],u8WidthCandidate[s16min4Idx]);
11073         if(u8WidthCandidate[u8LastminWidth - 5] == 1 && u8VWidthConfidence >10)
11074         {
11075             return u8LastminWidth;
11076         }
11077         else
11078         {
11079             if(u8WidthCandidate[s16min2Idx] == 1)
11080             {
11081                 if ( abs(s8min2Width - s8minWidth) == 1 )
11082                 {
11083                     if (s16min2Idx < s16minIdx)
11084                     {
11085                         u8WidthCandidate[ s16min2Idx] = 0;
11086                     }
11087                     else
11088                     {
11089                         u8WidthCandidate[ s16minIdx] = 0;
11090                     }
11091                 }
11092             }
11093 
11094             if(u8WidthCandidate[s16min3Idx] == 1)
11095             {
11096                 if ( abs(s8min3Width - s8minWidth) == 1 )
11097                 {
11098                     if (s16min3Idx < s16minIdx)
11099                     {
11100                         u8WidthCandidate[ s16min3Idx] = 0;
11101                     }
11102                     else
11103                     {
11104                         u8WidthCandidate[ s16minIdx] = 0;
11105                     }
11106                 }
11107             }
11108 
11109             if(u8WidthCandidate[s16min4Idx] == 1)
11110             {
11111                 if ( abs(s8min4Width - s8minWidth) == 1 )
11112                 {
11113                     if (s16min4Idx < s16minIdx)
11114                     {
11115                         u8WidthCandidate[ s16min4Idx] = 0;
11116                     }
11117                     else
11118                     {
11119                         u8WidthCandidate[ s16minIdx] = 0;
11120                     }
11121                 }
11122             }
11123 
11124 
11125             if ( abs(s8min3Width - s8min2Width) == 1 )
11126             {
11127                 if (s16min3Idx < s16min2Idx)
11128                 {
11129                     u8WidthCandidate[ s16min3Idx] = 0;
11130                 }
11131                 else
11132                 {
11133                     u8WidthCandidate[ s16min2Idx] = 0;
11134                 }
11135             }
11136 
11137             if ( abs(s8min4Width - s8min2Width) == 1 )
11138             {
11139                 if (s16min4Idx < s16min2Idx)
11140                 {
11141                     u8WidthCandidate[ s16min4Idx] = 0;
11142                 }
11143                 else
11144                 {
11145                     u8WidthCandidate[ s16min2Idx] = 0;
11146                 }
11147             }
11148 
11149             if ( abs(s8min4Width - s8min3Width) == 1)
11150             {
11151                 if (s16min4Idx < s16min3Idx)
11152                 {
11153                     u8WidthCandidate[ s16min4Idx] = 0;
11154                 }
11155                 else
11156                 {
11157                     u8WidthCandidate[ s16min3Idx] = 0;
11158                 }
11159             }
11160 
11161             if (u8WidthCandidate[ s16min4Idx] > 0)
11162             {
11163                 if ( s8min4Width == s8min3Width*2 || s8min4Width == s8min2Width*2 || s8min4Width == s8minWidth*2 )
11164                 {
11165                     u8WidthCandidate[ s16min4Idx] = 0;
11166                 }
11167 
11168                 if ( s8min3Width == s8min4Width*2 || s8min3Width == s8min2Width*2 || s8min3Width == s8minWidth*2 )
11169                 {
11170                     u8WidthCandidate[ s16min3Idx] = 0;
11171                 }
11172 
11173                 if ( s8min2Width == s8min4Width*2 || s8min2Width == s8min3Width*2 || s8min2Width == s8minWidth*2 )
11174                 {
11175                     u8WidthCandidate[ s16min2Idx] = 0;
11176                 }
11177 
11178                 if ( s8minWidth == s8min4Width*2 || s8minWidth == s8min3Width*2 || s8minWidth == s8min2Width*2 )
11179                 {
11180                     u8WidthCandidate[ s16minIdx] = 0;
11181                 }
11182             }
11183             //printf("V states u8WidthCandidate: 1:%d 2:%d 3:%d 4:%d\n",u8WidthCandidate[s16minIdx],u8WidthCandidate[s16min2Idx],u8WidthCandidate[s16min3Idx],u8WidthCandidate[s16min4Idx]);
11184             if (u8WidthCandidate[s16minIdx] + u8WidthCandidate[s16min2Idx] + u8WidthCandidate[s16min3Idx] + u8WidthCandidate[s16min4Idx] == 1)
11185             {
11186                 s16OutWidth = u8WidthCandidate[s16minIdx]* s8minWidth + u8WidthCandidate[s16min2Idx]* s8min2Width + u8WidthCandidate[s16min3Idx]* s8min3Width + u8WidthCandidate[s16min4Idx]* s8min4Width;
11187             }
11188             else
11189             {
11190                 s16OutWidth = -1;
11191             }
11192         }
11193     }
11194 
11195     return s16OutWidth;
11196 }
DBK_ComputeWidthPart(MS_U16 * u16WidthDiffHW,MS_U8 u8LastminIdex,MS_U16 u16Avg,MS_U8 u8WidthConfidence)11197 MS_S8 DBK_ComputeWidthPart(  MS_U16 *u16WidthDiffHW,MS_U8 u8LastminIdex, MS_U16 u16Avg,MS_U8 u8WidthConfidence)
11198 {
11199     MS_BOOL bWidthCandidate[paraSize];
11200     MS_U16 u16WTh = u16Avg;
11201     MS_U8 u8MinIndex=0;
11202     MS_U8 u8NumW=0;
11203     MS_U8 u8Bin;
11204     MS_BOOL bIf8 = 0, bIf11 = 0, bIf21 = 0, bIf32 = 0;
11205 
11206     for (u8Bin=0;u8Bin<paraSize;u8Bin++)
11207     {
11208         if (u16WidthDiffHW[u8Bin]<= u16WTh)
11209         {
11210             bWidthCandidate[u8Bin] = 1;
11211         }
11212         else
11213         {
11214             bWidthCandidate[u8Bin] = 0;
11215         }
11216     }
11217 
11218     if(bWidthCandidate[u8LastminIdex] ==1 && u8WidthConfidence>10)
11219     {
11220         return u8LastminIdex;
11221     }
11222     else
11223     {
11224         if (bWidthCandidate[4] == 1 ) //8
11225         {
11226             if (bWidthCandidate[3] == 1) //7
11227                 bWidthCandidate[3]  = 0;
11228             if (bWidthCandidate[11] == 1) // 15
11229                 bWidthCandidate[11] = 0;
11230             if (bWidthCandidate[12] == 1) // 16
11231                 bWidthCandidate[12] = 0;
11232             if (bWidthCandidate[19] == 1) // 23
11233                 bWidthCandidate[19] = 0;
11234             if (bWidthCandidate[20] == 1) // 24
11235                 bWidthCandidate[20] = 0;
11236 
11237             bIf8 = 1;
11238         }
11239         if (bWidthCandidate[7] == 1 ) //11
11240         {
11241             if (bWidthCandidate[6] == 1) //10
11242                 bWidthCandidate[6]  = 0;
11243             if (bWidthCandidate[8] == 1) //12
11244                 bWidthCandidate[8]  = 0;
11245 
11246             bIf11 = 1;
11247         }
11248 
11249         if ( ( bWidthCandidate[16] == 1 ) || ( bWidthCandidate[17] == 1 ) ||( bWidthCandidate[18] == 1 ) ) //20 21 22
11250         {
11251             bWidthCandidate[16] = 0;
11252             bWidthCandidate[17] = 1;
11253             bWidthCandidate[18] = 0;
11254             bIf21 = 1;
11255         }
11256 
11257         if ( bWidthCandidate[27] == 1 && bWidthCandidate[28] == 1)
11258             bIf32 = 1;
11259 
11260         if (bIf11 && bIf21 && bIf32) //11/21/32 all true -> source = 11 ->delete 21
11261         {
11262             bWidthCandidate[17] = 0;
11263         }
11264 
11265         if (bIf8 || bIf11 || bIf21)
11266         {
11267             if (bWidthCandidate[27] == 1) // 31
11268                 bWidthCandidate[27] = 0;
11269             if (bWidthCandidate[28] == 1) // 32
11270                 bWidthCandidate[28] = 0;
11271         }
11272 
11273     }
11274 
11275     for (u8Bin=0;u8Bin<paraSize;u8Bin++) // count number of frequencies
11276     {
11277         if (bWidthCandidate[u8Bin] == 1)
11278         {
11279              u8MinIndex = u8Bin;
11280              u8NumW++;
11281         }
11282     }
11283     if (u8NumW == 1)
11284     {
11285         return u8MinIndex;
11286     }
11287     else
11288     {
11289         return -1;
11290     }
11291 }
WidthToRegister(MS_U8 u8Width)11292 void WidthToRegister(MS_U8 u8Width) // Write width to register
11293 {
11294     MS_U8 u8Left1,u8Right1;
11295     if(u8Width<8)
11296     {
11297      u8Width = 8;
11298      u8Left1 = 8;
11299      u8Right1 = 9;
11300     }
11301     else if (u8Width==8) //test 0808 for performance
11302     {
11303      u8Left1 = 8;
11304      u8Right1 = 8;
11305     }
11306     else
11307     {
11308      u8Left1 = u8Width - 1; //fix prevent defect
11309      u8Right1 = (u8Width >=31) ? 31 : u8Width + 1;
11310     }
11311     //write interval left && interval right
11312     MApi_XC_W2BYTEMSK(REG_SC_BK0C_39_L, (MS_U16)((u8Left1<<8)|u8Right1), 0xFFFF);
11313 }
VDBK_Width_Detect(MS_BOOL isSceneChangeY,MS_U8 u8Widdth,MS_U8 u8HwidthConfidence,MS_U8 * u8VConfidence2Strength)11314 MS_U8 VDBK_Width_Detect(MS_BOOL isSceneChangeY,MS_U8 u8Widdth,MS_U8 u8HwidthConfidence,MS_U8 *u8VConfidence2Strength)//width detection with hardware accelaration
11315 {
11316     MS_S8 s8MinWidth = -1;     //minIndex+width_offset = candidate width
11317     //For width calculation
11318     //int WidthCandidate[paraSize];
11319     MS_U16 au16WidthDiffHW[paraSize];
11320     MS_S16 as16MinDiffIndex[4] = {0};
11321     MS_U16 u16MaxMinDiff = 0;
11322     MS_U16 u16WidthAvg = 0;
11323     MS_U8 u8Width = 8;
11324     static MS_U8 u8LastminWidth = 8;
11325     MS_U8 u8VWidthConfidence = 0;
11326    // int log_en = 5;
11327     //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
11328     u16MaxMinDiff = 0;
11329     u16WidthAvg = 0;
11330 
11331     s8MinWidth = VDBK_WidthPartHW(isSceneChangeY,au16WidthDiffHW,&u16MaxMinDiff,&u16WidthAvg,as16MinDiffIndex,u8Widdth,u8HwidthConfidence,&u8VWidthConfidence);
11332 
11333     if (s8MinWidth == -1)
11334     {
11335         s8MinWidth = VDBK_ComputeWidthPart(isSceneChangeY,au16WidthDiffHW,u8LastminWidth,u16MaxMinDiff,u16WidthAvg,u8VWidthConfidence,as16MinDiffIndex);
11336     }
11337 
11338     if (s8MinWidth >=5 && s8MinWidth<= 20)            //if (width == 20) //no such pattern yet, only artificials
11339     {
11340         u8Width = s8MinWidth;// + 4;
11341     }
11342     else
11343     {
11344         u8Width = 5;//can't find any possible width set to default value
11345     }
11346 
11347     *u8VConfidence2Strength = u8VWidthConfidence;
11348     WidthIIR_V(u8Width);
11349     //WidthToRegister(WidthIIR_V);
11350     //FeedBackSD2HD(WidthIIR, 0);
11351 
11352     u8LastminWidth = VWidthIIR;
11353 
11354 
11355      //printf("**V bforeIIR[%d]********\n",u8Width);
11356      //printf("*********V [%d]*********\n",VWidthIIR);
11357      //printf("**V Confiden[%d]*********\n",u8WidthConfidence);
11358 
11359 
11360     return VWidthIIR;
11361 }
DBK_Width_Detect(MS_BOOL isSceneChangeY,MS_U8 * u8HwidthConfidence)11362 MS_U8 DBK_Width_Detect(MS_BOOL isSceneChangeY,MS_U8 *u8HwidthConfidence)//width detection with hardware accelaration
11363 {
11364     MS_S8 s8MinIndex = -1;     //minIndex+width_offset = candidate width
11365     //For width calculation
11366     //int WidthCandidate[paraSize];
11367     MS_U16 au16WidthDiffHW[paraSize];
11368     MS_U16 u16MaxMinDiff = 0;
11369     MS_U16 u16WidthAvg = 0;
11370     MS_U8 u8Width = 8;
11371     static MS_U8 u8LastminIdex = 4;
11372     MS_U8 u8WidthConfidence = 0;
11373     int log_en = 5;
11374     //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
11375     u16MaxMinDiff = 0;
11376     u16WidthAvg = 0;
11377 
11378     s8MinIndex = DBK_WidthPartTop( au16WidthDiffHW, &u16MaxMinDiff, &u16WidthAvg,isSceneChangeY,&u8WidthConfidence);
11379     *u8HwidthConfidence = u8WidthConfidence;
11380     if (s8MinIndex == -1)
11381     {
11382         s8MinIndex = DBK_ComputeWidthPart( au16WidthDiffHW ,u8LastminIdex, u16WidthAvg,u8WidthConfidence);
11383     }
11384 
11385     if (s8MinIndex >= 0 && s8MinIndex <28)           //if (width == 32) //no such pattern yet, only artificials
11386     {
11387         u8Width = s8MinIndex + 4;
11388     }
11389     else
11390     {
11391         u8Width = 8;//can't find any possible width set to default value
11392     }
11393 
11394     WidthIIR_H(u8Width);
11395     WidthToRegister(WidthIIR);
11396     //FeedBackSD2HD(WidthIIR, 0);
11397 
11398     if(log_en==5)
11399     {
11400      //printf("**bforeIIR[%d]********\n",u8Width);
11401      //printf("*********[%d]*********\n",WidthIIR);
11402      //printf("**Confiden[%d]*********\n",u8WidthConfidence);
11403     }
11404 
11405     u8LastminIdex = WidthIIR -4;
11406 
11407     return WidthIIR;
11408 }
UIcontrolMpegNR(MS_U8 u8DetailGain_hw,MS_U8 * u8DetailGain_UI_hw)11409 void UIcontrolMpegNR(MS_U8 u8DetailGain_hw,MS_U8 *u8DetailGain_UI_hw)
11410 {
11411     MS_U8 u8UIgain = 0x80;
11412     u8UIgain = MApi_XC_R2BYTEMSK(REG_SC_BK30_0C_L,0x00FF);
11413     (*u8DetailGain_UI_hw) = __minmax(((u8DetailGain_hw*u8UIgain)>>7),0x2,0xF);
11414 }
VSetAdaptiveParameter(MS_U8 u8VWiddth,MS_U8 u8HDBKStrength,MS_U8 u8VConfidence2Strength)11415 void VSetAdaptiveParameter(MS_U8 u8VWiddth,MS_U8 u8HDBKStrength,MS_U8 u8VConfidence2Strength)
11416 {
11417     MS_U32 u32PureBlockSumM = 0;
11418     MS_U32 u32PureBlockSumL = 0;
11419     MS_U32 u32DetailSumM = 0;
11420     MS_U32 u32DetailSumL = 0;
11421     MS_U32 u32PureBlockSumTotal = 0;
11422     MS_U32 u32DetailSumTotal = 0;
11423     MS_U8 u8PostGain = 0xF;
11424     MS_U8 u8VoidGain = 0x8;
11425     MS_S8 s8VDBKGain=6;
11426     MS_U8 u82DfilterDiffth = 0x3F;
11427     static MS_S8 s8VDBKGainTemp = 6;
11428     //double BlockyPercentage = 0.0;
11429     //static double BlockyPercentageIIR = 0.0;
11430     MS_U32 BlockyPercentage = 0.0;
11431     static MS_U32 BlockyPercentageIIR = 0.0;
11432     static MS_BOOL b8Init = FALSE;
11433     MS_BOOL bifPIP_en = (MApi_XC_R2BYTEMSK(REG_SC_BK20_10_L, 0x0003) == 0x0003);
11434     MS_BOOL blineBuffer = (MApi_XC_R2BYTEMSK(REG_SC_BK20_10_L, 0x0010) == 0x0010);
11435     MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L, 0x2000, 0x2000);//weight fun enable
11436     MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0006, 0x0006);
11437     MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x1000);
11438     MApi_XC_W2BYTEMSK(REG_SC_BK60_21_L, 0x0147, 0x0377);
11439     MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, 0x0011, 0x0033);
11440 
11441     MApi_XC_W2BYTEMSK(REG_SC_BK60_23_L, 0x8000, 0xFFFF);
11442     MApi_XC_W2BYTEMSK(REG_SC_BK60_24_L, 0x4088, 0xFFFF);
11443     MApi_XC_W2BYTEMSK(REG_SC_BK60_25_L, 0x0182, 0x07FF);
11444     MApi_XC_W2BYTEMSK(REG_SC_BK60_26_L, 0x008F, 0xFFFF);
11445     MApi_XC_W2BYTEMSK(REG_SC_BK60_27_L, 0x0888, 0x0FFF);
11446     //Statistics
11447     MApi_XC_W2BYTEMSK(REG_SC_BK60_28_L, 0x8000, 0xFFFF);
11448     MApi_XC_W2BYTEMSK(REG_SC_BK60_29_L, 0x4088, 0xFFFF);
11449     MApi_XC_W2BYTEMSK(REG_SC_BK60_2A_L, 0x0182, 0x07FF);
11450     MApi_XC_W2BYTEMSK(REG_SC_BK60_2B_L, 0x008F, 0xFFFF);
11451     MApi_XC_W2BYTEMSK(REG_SC_BK60_2C_L, 0x0888, 0xFFFF);
11452 
11453     u32PureBlockSumM = MApi_XC_R2BYTEMSK(REG_SC_BK47_69_L, 0xFFFF);
11454     u32PureBlockSumL = MApi_XC_R2BYTEMSK(REG_SC_BK47_6A_L, 0xFFFF);
11455     u32DetailSumM = MApi_XC_R2BYTEMSK(REG_SC_BK47_6B_L, 0xFFFF);
11456     u32DetailSumL = MApi_XC_R2BYTEMSK(REG_SC_BK47_6C_L, 0xFFFF);
11457     u32PureBlockSumTotal = (u32PureBlockSumM<<16) + u32PureBlockSumL;
11458     u32DetailSumTotal = (u32DetailSumM<<16) + u32DetailSumL;
11459     BlockyPercentage = 256*(u32PureBlockSumTotal/(u32PureBlockSumTotal+u32DetailSumTotal));
11460     if(FALSE == b8Init)
11461     {
11462         BlockyPercentageIIR = BlockyPercentage;
11463         b8Init = TRUE;
11464     }
11465     BlockyPercentageIIR = (6*BlockyPercentageIIR + 2*BlockyPercentage + 4)>>3;
11466     //printf("Set u32PureBlockSumM :%d,u32PureBlockSumL :%d,u32DetailSumM :%d,u32DetailSumL :%d\n",u32PureBlockSumM,u32PureBlockSumL,u32DetailSumM,u32DetailSumL);
11467     //printf("Set BlockyPercentage:%d,u32DetailSumTotal:%d,u32PureBlockSumTotal:%d\n",BlockyPercentage,u32DetailSumTotal,u32PureBlockSumTotal);
11468     //printf("V Set u8VWiddth:%d u8HDBKStrength:%d,u8VConfidence2Strength:%d BlockyPercentageIIR:%f\n",u8VWiddth,u8HDBKStrength,u8VConfidence2Strength,BlockyPercentageIIR);
11469 
11470     if ((bifPIP_en) || (u8HDBKStrength <= 0x3F))
11471     {
11472         MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0000, 0x0001); //VDBK disable for PIP
11473     }
11474     else
11475     {
11476         MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0001, 0x0001); //VDBK enable
11477     }
11478 
11479     if(u8VConfidence2Strength > 10)
11480     {
11481         if(u8VWiddth == 8)
11482         {
11483             s8VDBKGain = (BlockyPercentageIIR*64+128)>>8;//Casdade mode BlockyPercentageIIR*64 - 8;
11484             MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x3000); //v filter 3tap
11485         }
11486         else if(u8VWiddth == 11)
11487         {
11488             s8VDBKGain = ((BlockyPercentageIIR*256+128)>>8) -44;
11489             MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x3000); //v filter 3tap
11490         }
11491         else
11492         {
11493             s8VDBKGain = 0x0F;
11494             if(1 ==blineBuffer)
11495             {
11496                 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x3000, 0x3000); //v filter 5tap
11497             }
11498             else
11499             {
11500                 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x3000); //v filter 3tap
11501             }
11502         }
11503         u82DfilterDiffth = (MS_U8)((BlockyPercentageIIR*512+128)>>8);
11504         u82DfilterDiffth = __minmax(u82DfilterDiffth,0x3F,0xFF);
11505         s8VDBKGain = __minmax(s8VDBKGain,0x08,0x0F);
11506         s8VDBKGainTemp = s8VDBKGain;
11507     }
11508     else
11509     {
11510         s8VDBKGain = (s8VDBKGainTemp*(10-u8VConfidence2Strength) +6*u8VConfidence2Strength)/10;
11511     }
11512 
11513     u82DfilterDiffth = __minmax(u82DfilterDiffth,0x3F,0xFF);
11514     s8VDBKGain = __minmax(s8VDBKGain,0x08,0x0F);
11515     BlockyPercentageIIR = BlockyPercentageIIR;
11516     MApi_XC_W2BYTEMSK(REG_SC_BK60_18_L, u82DfilterDiffth<<8, 0xFF00); // 2D filter diff th
11517     MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, s8VDBKGain<<8, 0x0F00); //v total gain
11518     MApi_XC_W2BYTEMSK(REG_SC_BK47_60_L, ((u8VoidGain<<12)+(u8PostGain<<8)), 0xFF00); //Post VS Void gain
11519     //printf("set Function V u8VConfidence:%d s8VDBKGain:%d\n",u8VConfidence2Strength,s8VDBKGain);
11520     //printf("Set Function u8DBKGain_hw:%d Blocky:%d\n",s8VDBKGain,BlockyPercentageIIR);
11521 }
SetAdaptiveParameter(MS_U8 u8Widdth,MS_BOOL isSD_source)11522 MS_U8 SetAdaptiveParameter(MS_U8 u8Widdth, MS_BOOL isSD_source)
11523 {
11524     MS_U32 u32PureBlockSumM = 0;
11525     MS_U32 u32PureBlockSumL = 0;
11526     MS_U32 u32DetailSumM = 0;
11527     MS_U32 u32DetailSumL = 0;
11528     MS_U32 u32PureBlockSumTotal = 0;
11529     MS_U32 u32DetailSumTotal = 0;
11530     MS_U8 u8PostGain = 8;
11531     MS_U8 u8VoidGain = 0;
11532     MS_U8 u8DBKGain_hw=0;
11533     MS_U8 u8DBK_coase_TH = 2;
11534     MS_U8 u8DetailGain_hw = 0;
11535     MS_U8 u8STD_Threshold_hw=0;
11536     MS_U32 BlockyPercentage = 0.0;
11537     static MS_U32 BlockyPercentageIIR = 0.0;
11538     static MS_BOOL b8Init = FALSE;
11539     MS_U8 u8DetailGain_UI_hw = 0;
11540 
11541     MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x0002, 0x00C2);//coring enable
11542     MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x0004, 0x00FF);//coring thrd
11543     MApi_XC_W2BYTEMSK(REG_SC_BK0C_40_L, 0x0002, 0x000E);//coase step
11544     MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x0900, 0x0F30);//ref left&right
11545     MApi_XC_W2BYTEMSK(REG_SC_BK0C_08_L, 0x2000, 0x2000);//weight fun enable
11546     MApi_XC_W2BYTEMSK(REG_SC_BK60_30_L, 0x0008, 0x0008);//cont3t
11547     MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0000, 0x0008);//disable real HD
11548     u32PureBlockSumM = MApi_XC_R2BYTEMSK(REG_SC_BK47_39_L, 0xFFFF);
11549     u32PureBlockSumL = MApi_XC_R2BYTEMSK(REG_SC_BK47_3A_L, 0xFFFF);
11550     u32DetailSumM = MApi_XC_R2BYTEMSK(REG_SC_BK47_3B_L, 0xFFFF);
11551     u32DetailSumL = MApi_XC_R2BYTEMSK(REG_SC_BK47_3C_L, 0xFFFF);
11552     u32PureBlockSumTotal = (u32PureBlockSumM<<16) + u32PureBlockSumL;
11553     u32DetailSumTotal = (u32DetailSumM<<16) + u32DetailSumL;
11554     BlockyPercentage = 256*(u32PureBlockSumTotal/(u32PureBlockSumTotal+u32DetailSumTotal));
11555     if(FALSE == b8Init)
11556     {
11557         BlockyPercentageIIR = BlockyPercentage;
11558         b8Init = TRUE;
11559     }
11560     BlockyPercentageIIR = (6*BlockyPercentageIIR + 2*BlockyPercentage)>>3;
11561 
11562     if(u8Widdth == 8)
11563     {
11564         if(BlockyPercentageIIR > 47)
11565         {
11566             u8STD_Threshold_hw = (MS_U8)(((211*BlockyPercentageIIR+128)>>8) - 8);
11567             u8DetailGain_hw = (MS_U8)(((49*BlockyPercentageIIR+128)>>8) -6);
11568             u8DBKGain_hw = (MS_U8)(((42*BlockyPercentageIIR+128)>>8) +1);
11569             u8DBK_coase_TH = (MS_U8)(((13*BlockyPercentageIIR+128)>>8));
11570         }
11571         else if((BlockyPercentageIIR > 38)&&(isSD_source)&&(SZ_PATTERN_ENABLE==1)) //for BOOK1 chapter#5 child face noise pattern
11572         {
11573              u8STD_Threshold_hw = (MS_U8)(((211*BlockyPercentageIIR+128)>>8) - 8);
11574             u8DetailGain_hw = (MS_U8)(((80*BlockyPercentageIIR+128)>>8) -6);
11575             u8DBKGain_hw = (MS_U8)(((42*BlockyPercentageIIR+128)>>8) +1);
11576             u8DBK_coase_TH = (MS_U8)(((13*BlockyPercentageIIR+128)>>8));
11577         }
11578         else
11579         {
11580             u8STD_Threshold_hw = 0x3F;
11581             u8DetailGain_hw = 0x02;
11582             u8DBKGain_hw = 0x08;
11583             u8DBK_coase_TH = 0x02;
11584         }
11585     }
11586     else if(u8Widdth == 11)
11587     {
11588         u8STD_Threshold_hw = 0x8F;
11589         u8DetailGain_hw = 0x0A;
11590         u8DBKGain_hw = 0x0F;
11591         u8DBK_coase_TH = 0x04;
11592     }
11593     else
11594     {
11595         u8STD_Threshold_hw = 0xBF ;
11596         u8DBKGain_hw = 0x0F;
11597         u8DBK_coase_TH = 0x0A;
11598         u8DetailGain_hw = 0x0F;
11599         u8PostGain = 0x04;
11600         u8VoidGain = 0x08;
11601     }
11602     u8STD_Threshold_hw = __minmax(u8STD_Threshold_hw,0x3F,0xFF);
11603     u8DetailGain_hw = __minmax(u8DetailGain_hw,0x02,0x0F);
11604     u8DBKGain_hw = __minmax(u8DBKGain_hw,0x08,0x0F);
11605     u8DBK_coase_TH = __minmax(u8DBK_coase_TH,0x02,0x0A);
11606 
11607     UIcontrolMpegNR(u8DetailGain_hw,&u8DetailGain_UI_hw);
11608     //printf("Set u8DetailGain_UI_hw:%d u8DetailGain_hw:%d\n",u8DetailGain_UI_hw,u8DetailGain_hw);
11609     MApi_XC_W2BYTEMSK(REG_SC_BK0C_11_L, u8DBKGain_hw, 0x000F); //DBK Gain
11610     MApi_XC_W2BYTEMSK(REG_SC_BK0C_10_L, u8STD_Threshold_hw<<8, 0xFF00); //DBK STD threshold
11611     MApi_XC_W2BYTEMSK(REG_SC_BK0C_40_L, (u8DBK_coase_TH<<8), 0xFF00); //DBK coase threshold
11612     MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, (u8DetailGain_UI_hw<<12), 0xF000); //blockness gain
11613     MApi_XC_W2BYTEMSK(REG_SC_BK47_30_L, ((u8VoidGain<<12)+(u8PostGain<<8)), 0xFF00); //Post VS Void gain
11614 
11615     if(u8Widdth == 21 ||u8Widdth == 16)//Scaling up SD2HD
11616     {
11617         MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0001, 0x0001); //hd mode enable
11618         MApi_XC_W2BYTEMSK(REG_SC_BK0C_71_L, 0x00C0, 0x00C0); //switch to Y 7tap filter
11619         MApi_XC_W2BYTEMSK(REG_SC_BK0C_02_L, 0x0006, 0x0006); //switch to C 7tap filter
11620         MApi_XC_W2BYTEMSK(REG_SC_BK0C_72_L, 0x0000, 0x0006); //smooth step 0
11621         MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x0A86, 0x0F87); //blockness extend enable/switch pulse filter
11622     }
11623     else
11624     {
11625         MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0000, 0x0001); //hd mode disable
11626         MApi_XC_W2BYTEMSK(REG_SC_BK0C_71_L, 0x0040, 0x00C0); //switch to Y 5tap filter
11627         MApi_XC_W2BYTEMSK(REG_SC_BK0C_72_L, 0x0002, 0x0006); //smooth step 1
11628         MApi_XC_W2BYTEMSK(REG_SC_BK0C_02_L, 0x0002, 0x0006); //switch to C 3tap filter
11629         MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x0905, 0x0F87); //blockness extend disable/switch pulse filter
11630     }
11631 
11632     //printf("Set Function u8STD_Threshold_hw:%d u8DetailGain_hw:%d\n",u8STD_Threshold_hw,u8DetailGain_hw);
11633     //printf("Set Function u8DBKGain_hw:%d u8DBK_coase_TH:%d\n",u8DBKGain_hw,u8DBK_coase_TH);
11634     BlockyPercentageIIR = BlockyPercentageIIR;
11635     return u8STD_Threshold_hw;
11636 }
ScenceChangeConfirm(MS_U32 u32StaticCount,MS_BOOL isSceneChangeY)11637 MS_BOOL ScenceChangeConfirm(MS_U32 u32StaticCount,MS_BOOL isSceneChangeY)
11638 {
11639     MS_BOOL bRealSceneChange = 0;
11640     static MS_U8 u8SceneChangeCounter = 0,u32StaticCountTemp = 0,u8CounterForSC = 0;
11641     if(u32StaticCountTemp >20 && u32StaticCount ==0)
11642     {
11643         u8CounterForSC = 1;
11644     }
11645 
11646     if(u8CounterForSC ==1)
11647     {
11648         u8SceneChangeCounter++;
11649         if(u8SceneChangeCounter<10)
11650         {
11651             if(isSceneChangeY)
11652             {
11653                 bRealSceneChange = 1;
11654             }
11655         }
11656         else
11657         {
11658             u8CounterForSC = 0;
11659             u8SceneChangeCounter = 0;
11660         }
11661     }
11662 
11663     u32StaticCountTemp = u32StaticCount;
11664     return bRealSceneChange;
11665 }
Mdrv_PQ_DBK(MS_BOOL isSceneChangeY,MS_U16 u16MotionValue,MS_U16 u16Width,MS_U16 u16height,const MS_BOOL isSD_source)11666 void Mdrv_PQ_DBK(MS_BOOL isSceneChangeY,MS_U16 u16MotionValue,MS_U16 u16Width,MS_U16 u16height, const MS_BOOL isSD_source)
11667     {
11668      //DBK Variables
11669     MS_BOOL bSceneChange = 0;
11670     static MS_BOOL bDBK_initial = 0;
11671     MS_U8 u8ReadDBKHistAck = 0,u8VReadDBKHistAck = 0;
11672     static MS_U8 u8CountForSample = 0;
11673     static MS_U8 u8CountForDBK = 0;
11674     static MS_U8 u8Widdth = 8,u8VWidth = 8;
11675     static MS_U32 u32StaticValueTemp=0,u32StaticCount=0;
11676     //int log_en = 5;
11677     //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
11678     //MS_U8 u8StartPosition = 0,u8VStartPosition = 0;
11679     //MS_U8 u8SramError = 0;
11680     MS_U8 u8DebugMode = 0;
11681     static MS_U8 u8HwidthConfidence = 0;
11682     static MS_U8 u8VConfidence2Strength = 0;
11683     MS_U8 u8HDBKStrength = 0;
11684     //u8SramError = MApi_XC_R2BYTEMSK(REG_SC_BK47_0B_L, 0x0100)>>8;
11685     u8DebugMode = MApi_XC_R2BYTEMSK(REG_SC_BK47_37_L, 0x0007 ) |MApi_XC_R2BYTEMSK(REG_SC_BK47_67_L, 0x0007 );
11686     MApi_XC_W2BYTEMSK(REG_SC_BK47_08_L, u16Width, 0x1FFF);//set H maxline_addr_end of readout
11687     MApi_XC_W2BYTEMSK(REG_SC_BK47_78_L, u16height, 0x1FFF);//set V maxline_addr_end of readout
11688     MApi_XC_W2BYTEMSK(REG_SC_BK47_30_L, 0x009B, 0x00FF); //HW enable LPF/Extend enable
11689     MApi_XC_W2BYTEMSK(REG_SC_BK47_60_L, 0x008B, 0x00FF); //HW enable LPF/Extend enable
11690 
11691 
11692     if(u16MotionValue ==0 && u32StaticValueTemp==0)
11693     {
11694         u32StaticCount++;
11695     }
11696     else
11697     {
11698         u32StaticCount = 0;
11699     }
11700     u32StaticValueTemp = u16MotionValue;
11701 
11702     bSceneChange = ScenceChangeConfirm(u32StaticCount,isSceneChangeY);
11703 
11704     if (bSceneChange)
11705     {
11706         u8CountForDBK = 0;
11707     }
11708     //printf("SC u8CountForDBK:%d\n",u8CountForDBK);
11709     //printf("SC u32StaticCount:%d ,isSceneChangeY:%d\n",u32StaticCount,isSceneChangeY);
11710     //printf("SC bRealSceneChange:%d\n",bSceneChange);
11711 
11712     if (u8CountForDBK == 0) // Read Histogram
11713     {
11714         if(u8DebugMode == 0)
11715         {
11716             u8ReadDBKHistAck = readHistogramPart(u8CountForDBK);
11717             u8VReadDBKHistAck = readVHistogramPart(u8CountForDBK);
11718             //printf("easter request histogram\n");
11719         }
11720         bDBK_initial = u8ReadDBKHistAck |u8VReadDBKHistAck;
11721         if((u8ReadDBKHistAck==1)&& (u32StaticCount < 15))
11722         {
11723             u8Widdth = DBK_Width_Detect(bSceneChange,&u8HwidthConfidence);
11724             if(u8Widdth > 2 && u8Widdth<32)
11725             {
11726                 MApi_XC_W2BYTEMSK(REG_SC_BK47_32_L, u8Widdth, 0x003F); //Mark width input
11727                 MApi_XC_W2BYTEMSK(REG_SC_BK47_34_L, u8Widdth, 0x00FF); //Mark initial input
11728                 DBK_FindStartPosition(u8Widdth,bSceneChange);
11729                 //printf("H u8Widdth:%d u8StartPosition:%d\n",u8Widdth,u8StartPosition);
11730             }
11731         }
11732 
11733         if((u8VReadDBKHistAck==1)&& (u32StaticCount < 15))
11734         {
11735             u8VWidth = VDBK_Width_Detect(bSceneChange,u8Widdth,u8HwidthConfidence,&u8VConfidence2Strength);
11736             if(u8VWidth > 2 && u8VWidth <21)
11737             {
11738                 MApi_XC_W2BYTEMSK(REG_SC_BK47_62_L, u8VWidth, 0x003F); //Mark width input
11739                 MApi_XC_W2BYTEMSK(REG_SC_BK47_64_L, u8VWidth, 0x00FF); //Mark initial input
11740                 VDBK_FindStartPosition(u8VWidth,bSceneChange);
11741                 //printf("V u8VWidth:%d u8VStartPosition:%d\n",u8VWidth,u8VStartPosition);
11742             }
11743         }
11744 
11745         if (bDBK_initial)
11746         {
11747             u8CountForDBK++;
11748         }
11749     }
11750     else if  (u8CountForDBK == 1)
11751     {
11752         if ( bDBK_initial == 1)
11753         {
11754             u8HDBKStrength = SetAdaptiveParameter(u8Widdth, isSD_source);
11755             VSetAdaptiveParameter(u8VWidth,u8HDBKStrength,u8VConfidence2Strength);
11756             //printf("u8HDBKStrength:%d\n",u8HDBKStrength);
11757         }
11758         u8CountForDBK++;
11759         u8CountForSample++;
11760 
11761     }
11762 
11763     if(u8CountForDBK >= 2)
11764     {
11765         u8CountForDBK = 0;
11766     }
11767 
11768 }
DMS_SDHDModeCheck(MS_U8 u8SD2HDValue)11769 void DMS_SDHDModeCheck( MS_U8 u8SD2HDValue) //Register Settings to hardware
11770 {
11771 
11772 
11773     if( (u8SD2HDValue>=60) && (frameWidth>0x700)  ) //SD to HD mode
11774         MApi_XC_W2BYTEMSK(REG_SC_BK26_10_L, 0x4000, 0x4000); // HD_enable
11775     else
11776         MApi_XC_W2BYTEMSK(REG_SC_BK26_10_L, 0x0000, 0x4000);
11777 }
11778 static MS_U16 g_u16BK0A_24 = 0;
11779 static MS_U16 g_u16BK0C_10 = 0;
11780 static MS_U16 g_u16BK0C_39 = 0;
11781 static MS_U16 g_u16BK0C_3A = 0;
11782 static MS_U16 g_u16BK0C_40 = 0;
11783 //static MS_U16 g_u16BK0C_41 = 0;
11784 static MS_U16 g_u16BK0C_42 = 0;
11785 static MS_U16 g_u16BK26_10 = 0;
11786 static MS_U16 g_u16BK26_11 = 0;
11787 static MS_U16 g_u16BK26_12 = 0;
11788 static MS_U16 g_u16BK26_13 = 0;
11789 static MS_U16 g_u16BK26_18 = 0;
11790 
11791 /******************************************************************************/
11792 ///Film mode control for Any Candence
11793 ///@param bEnable \     IN: Enable/Disable control
11794 /******************************************************************************/
Hal_PQ_FilmMode_AnyCandence_Enable(void * pInstance,MS_BOOL bEnable)11795 void Hal_PQ_FilmMode_AnyCandence_Enable(void *pInstance,MS_BOOL bEnable)
11796 {
11797     MApi_XC_W2BYTEMSK(REG_SC_BK0A_24_L, (bEnable ? (BIT(15)) : 0), BIT(15));
11798     _bAnyCandenceEnable = bEnable;
11799 }
11800 
11801 /******************************************************************************/
11802 ///Store the Current value
11803 /******************************************************************************/
Hal_PQ_StoreCurrentValue(void * pInstance)11804 void Hal_PQ_StoreCurrentValue(void *pInstance)
11805 {
11806     //for AnyCandence Film Mode
11807     g_u16BK0A_24 = MApi_XC_R2BYTEMSK(REG_SC_BK0A_24_L, BIT(15));
11808 
11809     //for DBK
11810     g_u16BK0C_10 = MApi_XC_R2BYTE(REG_SC_BK0C_10_L);
11811     g_u16BK0C_39 = MApi_XC_R2BYTE(REG_SC_BK0C_39_L);
11812     g_u16BK0C_3A = MApi_XC_R2BYTE(REG_SC_BK0C_3A_L);
11813     g_u16BK0C_40 = MApi_XC_R2BYTE(REG_SC_BK0C_40_L);
11814     //g_u16BK0C_41 = MApi_XC_R2BYTE(REG_SC_BK0C_41_L);
11815     g_u16BK0C_42 = MApi_XC_R2BYTE(REG_SC_BK0C_42_L);
11816 
11817     //for DMS
11818     g_u16BK26_10 = MApi_XC_R2BYTE(REG_SC_BK26_10_L);
11819     g_u16BK26_11 = MApi_XC_R2BYTE(REG_SC_BK26_11_L);
11820     g_u16BK26_12 = MApi_XC_R2BYTE(REG_SC_BK26_12_L);
11821     g_u16BK26_13 = MApi_XC_R2BYTE(REG_SC_BK26_13_L);
11822     g_u16BK26_18 = MApi_XC_R2BYTE(REG_SC_BK26_18_L);
11823 }
11824 
11825 /******************************************************************************/
11826 ///Store the Current value
11827 /******************************************************************************/
Hal_PQ_ReStoreToDefault(void * pInstance)11828 void Hal_PQ_ReStoreToDefault(void *pInstance)
11829 {
11830     //for AnyCandence Film Mode
11831     MApi_XC_W2BYTEMSK(REG_SC_BK0A_24_L, g_u16BK0A_24, BIT(15));
11832 
11833     //for DBK
11834     MApi_XC_W2BYTE(REG_SC_BK0C_10_L, g_u16BK0C_10);
11835     MApi_XC_W2BYTE(REG_SC_BK0C_39_L, g_u16BK0C_39);
11836     MApi_XC_W2BYTE(REG_SC_BK0C_3A_L, g_u16BK0C_3A);
11837     MApi_XC_W2BYTE(REG_SC_BK0C_40_L, g_u16BK0C_40);
11838     //MApi_XC_W2BYTE(REG_SC_BK0C_41_L, g_u16BK0C_41);
11839     MApi_XC_W2BYTE(REG_SC_BK0C_42_L, g_u16BK0C_42);
11840 
11841     //for DMS
11842     MApi_XC_W2BYTE(REG_SC_BK26_10_L, g_u16BK26_10);
11843     MApi_XC_W2BYTE(REG_SC_BK26_11_L, g_u16BK26_11);
11844     MApi_XC_W2BYTE(REG_SC_BK26_12_L, g_u16BK26_12);
11845     MApi_XC_W2BYTE(REG_SC_BK26_13_L, g_u16BK26_13);
11846     MApi_XC_W2BYTE(REG_SC_BK26_18_L, g_u16BK26_18);
11847 }
11848 #define FPLL_PHASE_VAR_LIMIT    (0x10)          // If phase error variation exceed this, means un-stable
11849 #define FPLL_PRD_THRESHOLD      (0x100)         // The PRD must be smaller than this value to indicate almost finished PRD lock
11850 #define FPLL_PRD_VAR_LIMIT      (0x10)          // If PRD variation exceed this, means un-stable
11851 
11852 /*static MS_BOOL _Hal_PQ_FrameLockCheck (void)
11853 {
11854     MS_U16 u16NewPhase,u16NewPrd;
11855     static MS_U16 _u16OrigPhase,_u16OrigPrd;
11856 
11857     u16NewPrd = MApi_XC_R2BYTEMSK(REG_LPLL_13_L, 0xFFFF);
11858     u16NewPhase = MApi_XC_R2BYTEMSK(REG_LPLL_11_L, 0xFFFF);
11859 
11860     if((u16NewPrd < FPLL_PRD_THRESHOLD) && (abs(_u16OrigPrd - u16NewPrd) < FPLL_PRD_VAR_LIMIT)
11861         && (abs(_u16OrigPhase - u16NewPhase) < FPLL_PHASE_VAR_LIMIT))
11862     {
11863         _u16OrigPhase = u16NewPhase;
11864         _u16OrigPrd = u16NewPrd;
11865         return TRUE;
11866     }
11867     else
11868     {
11869         _u16OrigPhase = u16NewPhase;
11870         _u16OrigPrd = u16NewPrd;
11871         return FALSE;
11872     }
11873 }*/
11874 
11875 static MS_BOOL bFakeOutCusEnable = TRUE;
11876 
Hal_PQ_SetFakeOutEnable(void * pInstance,MS_BOOL bEnable)11877 MS_BOOL Hal_PQ_SetFakeOutEnable(void *pInstance,MS_BOOL bEnable)
11878 {
11879     bFakeOutCusEnable = bEnable;
11880     return TRUE;
11881 }
11882 
11883 #define ENABLE_SCALER_DEFEATHERING           0x01   //BK22_7C_L
11884 #define ENABLE_SCALER_DEFLICKERING           0x02
11885 #define ENABLE_SCALER_DEBOUNCING             0x04
11886 #define ENABLE_SCALER_D3D_DRIVER             0x08
11887 
11888 #define ENABLE_SCALER_AUTO_DBK_DRIVER        0x01   //BK22_7C_H[0]
11889 #define ENABLE_SCALER_MCDI_DRIVER            0x02   //BK22_7C_H[1]
11890 #define ENABLE_SCALER_MCNR_DRIVER            0x04   //BK22_7C_H[2]
11891 #define ENABLE_SCALER_SDHD_DETECT_DRIVER     0x08   //BK22_7C_H[3]
11892 
11893 #define ENABLE_SCALER_CCS_DRIVER             0x20   //BK22_7C_H[5]
11894 #define ENABLE_SCALER_DHD_DRIVER             0x40   //BK22_7C_H[6]
11895 #define ENABLE_SCALER_AUTO_DBK_NMR_DRIVER    0x80   //BK22_7C_H[7]
11896 #define ENABLE_SR_DRIVER    0x01  //BK2C30_3F_H[0]
11897 
11898 //-------------------------------------------------------------------------------------------------
11899 /// this function does adaptive tuning periodic
11900 //-------------------------------------------------------------------------------------------------
11901 
Hal_PQ_AdaptiveTuning(void * pInstance)11902 void Hal_PQ_AdaptiveTuning(void *pInstance)
11903 {
11904 #if 0
11905     MS_BOOL ukoSabihS_en = 0;
11906     MS_BOOL isUkosabihsMcSweep = false, isUkosabihsMotionSweep = false;
11907     MS_BOOL isUkosabihsForFilm = 0;
11908     static MS_U8 u8PreviousVcnt = 0;
11909     MS_U8 u8CurrentVcnt;
11910     MS_U8 ColorSum;
11911     //MS_U32 MR_Offset;
11912 //  MS_U16 MR_OffsetME1, MR_OffsetME2;
11913     MS_U32 u32MotionValue,u32MotionValue2,/*u32MotionValue3,*/TotalFeather,TotalMvComfirm;
11914     MS_U16 u16MotionValue4;
11915     MS_U32 uComplex,FeatherSum,u32MotionValue_Sum;
11916        MS_U8 NE_confirm = 0;
11917 
11918     XC_ApiStatus stXCStatus;
11919     memset(&stXCStatus, 0x00, sizeof(stXCStatus));
11920 
11921     MS_BOOL me1Still;
11922     MS_BOOL movingWithoutFeather;
11923     MS_BOOL isMcOutOfSearchRange;
11924        MS_U8 estNoise = 0;
11925     MS_U16 nonMv0Comfirm,mv0Comfirm,mvNotFound,nonMv0ComfirmME2,mv0ComfirmME2,mvNotFoundME2;//nonMv0Comfirm_noIIR,mv0Comfirm_noIIR,mvNotFound_noIIR;
11926 //  MS_U16 mvNotFoundME2,mvNotFound_noIIR;
11927     MS_U16 isFeatherAndMotion = false;
11928 
11929     MS_U16 me1IsMv0, me1IsNonMv0, me1IsNotFound;
11930     MS_U16 me2IsMv0, me2IsNonMv0, me2IsNotFound;
11931     MS_BOOL isSceneChangeMc, isSceneChangeY, isSceneChange = 0;//isScenceChangeByNotFound = 0;
11932     MS_BOOL isAbihsot = false; /* Toshixa */
11933     MS_BOOL isHBurstMoving = false, isHBurst = false;//isLowLuma;
11934     static MS_BOOL isMcFilm = false;
11935 //  static MS_BOOL isMcFilmAny = false;
11936     static MS_BOOL isMcFilmHd = false;
11937     static MS_BOOL isMcFilmukoSabihS = false;
11938 
11939     MS_BOOL isMcFilmSlowMotion = true;
11940 
11941     //MS_BOOL isLrLetterBox = false;
11942     MS_BOOL isL139 = FALSE, isL107 = FALSE, isL153 =FALSE, isUkosabihsMotion = FALSE, isUkosabihsMc = FALSE, isUkosabihsMv0 = FALSE;// isSWoman = FALSE;
11943 //  MS_BOOL isWeakMcNrFilm = false; /* for delay one frame issue */
11944     MS_BOOL Bouncing_status,bBouncing_Status2,Feather_sum_status,Feather_sum_status2;
11945     XC_FilmStates filmstatus;
11946     XC_OpFrameStates opFrameStatus;
11947     MS_BOOL isOpFrameChanged;
11948 
11949     static XC_OpFrameStates prevOpFrameStatus;
11950 
11951     XC_Me1HisStates ME1HisStates_1,ME1HisStates_2;
11952     XC_GMvStates GMV;
11953     //OLD DBK Driver easter 20150805
11954 //  static MS_U8 u8SDHDDReport = 0;
11955     static MS_U8 _timeSharingID = 0;
11956 
11957     static MS_U8 timingSegment = 0;
11958     static MS_U8 _hdsddFilterBaseReport;
11959     static MS_U32 _hpfHdCntReport;
11960     static MS_U32 _hpfSdCntReport;
11961        static MS_U32 hdNactCnt;
11962     static MS_U32 _hdFilterBaseReport;
11963     static MS_U32 _hpfSdTolerantReport;
11964     static MS_U32 _hpfHdTolerantReport;
11965 
11966     static MS_U32 _hpfHdCntReport3;
11967     static MS_U32 _hpfSdCntReport3;
11968 
11969     //Eva Add 0804
11970     static MS_U32 hdNactCnt4;
11971     static MS_U32 _hpfHdCntReport4;
11972     static MS_U32 _hpfSdCntReport4;
11973 
11974 
11975 
11976 //  static MS_BOOL isMEReset;
11977     MS_BOOL isZoomMoving = false;
11978     MS_BOOL isBigFeather = false;
11979     MS_BOOL isSdHqvJaggedTest = false;
11980     XC_LumaHistogramStates lumaHistogramStates;
11981     static XC_HpfDefaultRegSetting hpfDefaultReg;
11982 
11983     MS_BOOL isSourceChange;
11984     MS_BOOL isSourceChangeForME = false;
11985     MS_BOOL isSourceChangeFlag = false;
11986 
11987     MS_U32 inSearchUseFeather;
11988     MS_BOOL isArtifactPattern = false;
11989 //  MS_BOOL isMv0Comfirm = false;
11990        MS_BOOL isSparsePattern = false;
11991 
11992     MS_BOOL isNoLumaCplx = false;
11993     //DBK Variables
11994     //
11995     //****** Check VCnt******//
11996     //
11997     u8CurrentVcnt = MDrv_SC_read_v_cnt();
11998     if (u8PreviousVcnt == u8CurrentVcnt)
11999     {
12000         return;
12001     }
12002     else
12003     {
12004         u8PreviousVcnt = u8CurrentVcnt;
12005     }
12006 
12007     if(MApi_XC_GetStatus(&stXCStatus, MAIN_WINDOW))
12008     {
12009         //MDrv_SC_Edison_ME1_SetStatisticsWindow(stXCStatus.stCropWin.width, stXCStatus.stCropWin.height);
12010         if(stXCStatus.bInterlace)
12011         {
12012             MDrv_SC_Edison_ME1_SetStatisticsWindow(stXCStatus.ScaledCropWin.width, (stXCStatus.ScaledCropWin.height)/2);
12013         }
12014         else
12015         {
12016             MDrv_SC_Edison_ME1_SetStatisticsWindow(stXCStatus.ScaledCropWin.width, stXCStatus.ScaledCropWin.height);
12017         }
12018     }
12019     frameWidth  = __minmax(stXCStatus.ScaledCropWin.width,  1, MaxWidth );
12020     frameHeight = __minmax(stXCStatus.ScaledCropWin.height, 1, MaxHeight);
12021 
12022     //
12023     //****** Get input resolution info******//
12024     //
12025     if( stXCStatus.u16H_SizeAfterPreScaling >= 1280 )
12026     {
12027         _bIsHDSource= true;
12028     }
12029     else
12030     {
12031         _bIsHDSource= false;
12032     }
12033 
12034     //
12035     //****** source change******//
12036     //
12037     isSourceChange = MDrv_SC_SourceChange(); //Trace the rising signal for source change
12038     isSourceChangeForME = (MApi_XC_R2BYTEMSK(REG_SC_BK30_07_L, 0x0002)>>1) ;//hold for 35frames
12039     isSourceChangeFlag = MDrv_SC_SourceChangeFlag(isSourceChange);      //hold for 4 frames
12040 
12041     //
12042     //****** save HPF original setting******/
12043     //
12044     hpfDefaultReg = MDrv_SC_SaveHpfSetting( isSourceChangeFlag );
12045 
12046     //
12047     //******Get adaptive function control******//
12048     //
12049     MS_U8 u8Ctrl  = MDrv_SC_get_adaptive_ctrl();
12050     MS_U8 u8Ctrl2 = MDrv_SC_get_adaptive_ctrl2();
12051     MS_U8 u8UFSCCtrl3 = MDrv_UFSC_get_adaptive_ctrl3();
12052     //MS_U8 u8Ctrl4 = MDrv_SC_get_adaptive_ctrl4();
12053     //MS_U8 u8Ctrl5 = MDrv_SC_get_adaptive_ctrl5();
12054 
12055     //
12056     //****** Get motion value******//
12057     //
12058     u32MotionValue = MDrv_SC_read_motion_value1();
12059     u32MotionValue2 = MDrv_SC_read_motion_value2();
12060     //u32MotionValue3 = MDrv_SC_read_motion_value3();
12061     u16MotionValue4 = MDrv_SC_read_motion_value4(); /* Edison new arrive ( this is no-history motion */
12062 
12063     /*MR_OffsetME1 =*/ MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset( &me1IsMv0, &me1IsNonMv0, &me1IsNotFound );
12064     /*MR_OffsetME2 =*/ MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset( &me2IsMv0, &me2IsNonMv0, &me2IsNotFound );
12065 
12066     u32MotionValue_Sum = u32MotionValue2; //+ ( u16MotionValue4*1 );
12067     //luma, color, complex
12068     lumaHistogramStates = MDrv_SC_GetLumaHistogram();
12069     ColorSum = MDrv_SC_A5_ColorPixelSum(); // #pixels of specified color window
12070     uComplex = MDrv_SC_Agate_ComplexSum();
12071     //DEBUG_LC_uComplex(uComplex);
12072 
12073     //
12074     //******scene change******//
12075     //
12076     isSceneChangeMc = MDrv_SC_Agate_SceneChangeMc( me1IsMv0, me1IsNonMv0, me1IsNotFound, me2IsMv0, me2IsNonMv0, me2IsNotFound );
12077     isSceneChangeY = MDrv_SC_Agate_SceneChangeY( lumaHistogramStates );
12078     isSceneChange = ( isSceneChangeMc | isSceneChangeY );
12079 
12080     //Feather
12081     inSearchUseFeather = MDrv_SC_McInSearchRangeUseFeather();
12082 
12083     TotalFeather = MDrv_SC_Agate_TotalFeather(); //clamp at 255
12084     FeatherSum = MDrv_SC_TotalFeather_Sum(); //no clamp
12085 
12086     //MV
12087     //nonMv0Comfirm_noIIR = MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR();
12088 //  mv0Comfirm_noIIR = MDrv_SC_Agate_ME1_mv0Comfirm_noIIR();
12089     nonMv0Comfirm = MDrv_SC_Agate_ME1_nonMv0Comfirm();
12090     mv0Comfirm = MDrv_SC_Agate_ME1_mv0Comfirm();
12091     mvNotFound = MDrv_SC_Agate_ME1_mvNotFound();
12092        //mvNotFound_noIIR = MDrv_SC_Agate_ME1_mvNotFound_noIIR();
12093 
12094        nonMv0ComfirmME2 = MDrv_SC_Agate_ME2_nonMv0Comfirm();
12095        mv0ComfirmME2 = MDrv_SC_Agate_ME2_mv0Comfirm();
12096        mvNotFoundME2 = MDrv_SC_Agate_ME2_mvNotFound();
12097 
12098     ME1HisStates_1 = MDrv_SC_Agate_Hierarchy1();
12099     ME1HisStates_2 = MDrv_SC_Agate_Hierarchy2(ME1HisStates_1);
12100     GMV = MDrv_SC_Agate_GMV( ME1HisStates_1, ME1HisStates_2 );
12101 
12102     //isMv0Comfirm = ( mv0Comfirm_noIIR > 0xA0 ) ? true : false;
12103 
12104     Bouncing_status = MDrv_SC_Bouncing_Status(u32MotionValue_Sum);
12105     bBouncing_Status2 = MDrv_SC_Bouncing_Status2(u16MotionValue4);
12106 
12107     //Frame Organization: Film and OPFrame
12108 
12109     opFrameStatus = MDrv_SC_OpFrame_Status();
12110     isOpFrameChanged = ( opFrameStatus.curOpFrame != prevOpFrameStatus.curOpFrame );
12111 
12112     filmstatus = MDrv_SC_Film_Status();
12113     isMcFilm    = MDrv_SC_McFilmLike( opFrameStatus, _bIsHDSource );
12114     isMcFilmHd  = MDrv_SC_McFilmLikeHd( opFrameStatus, _bIsHDSource );
12115     //isMcFilmAny   = MDrv_SC_McFilmLikeAny( opFrameStatus, isMcFilm, _bIsHDSource );
12116     //Time Sharing ID
12117     _timeSharingID = MDrv_SC_TimeSharing( opFrameStatus, &timingSegment, isSourceChangeFlag);
12118 
12119     //
12120     //******DI status******//
12121     //
12122     TotalMvComfirm = MDrv_SC_Agate_TotalMvComfirm();
12123     me1Still = MDrv_SC_Agate_ME1Still();
12124     isFeatherAndMotion = MDrv_SC_Agate_FeatherAndMotion();
12125     movingWithoutFeather = MDrv_SC_Agate_MovingWithoutFeather();
12126     //isScenceChangeByNotFound = MDrv_SC_ScenceChangeDetectByNotFound(mvNotFound_noIIR);
12127     Feather_sum_status= MDrv_SC_TotalFeather_Sum_Status( isFeatherAndMotion, ( !_bIsHDSource ), &Feather_sum_status2 );
12128 
12129     //for different picture size case
12130     XC_ApiStatus DrvStatus;
12131     memset(&DrvStatus, 0x0, sizeof(XC_ApiStatus));
12132     MApi_XC_GetStatus(&DrvStatus, MAIN_WINDOW);
12133     if((DrvStatus.stCropWin.width)==0)
12134     {
12135         (DrvStatus.stCropWin.width)=1;
12136     }
12137 
12138      if((DrvStatus.stCropWin.height)==0)
12139     {
12140         (DrvStatus.stCropWin.height)=1;
12141     }
12142 
12143     if((DrvStatus.stCapWin.width)==0)
12144     {
12145         (DrvStatus.stCapWin.width)=1;
12146     }
12147 
12148     if((DrvStatus.stCapWin.height)==0)
12149     {
12150         (DrvStatus.stCapWin.height)=1;
12151     }
12152 
12153     normalize_factor  = ((256 * (DrvStatus.stCropWin.width) * (DrvStatus.stCropWin.height))/( (DrvStatus.stCapWin.width) * (DrvStatus.stCapWin.height)));
12154 
12155     //
12156     //****** Letter Box LR******//
12157     //
12158     //if (!isSourceChangeFlag)
12159     //  isLrLetterBox = MDrv_SC_Edison_LrLetterBox( opFrameStatus, hpfDefaultReg, _timeSharingID,  timingSegment );
12160     XC_LetterBoxState letterBoxState = MDrv_SC_Letter_Box_Driver( /*_bIsHDSource,*/ isSceneChange, isSourceChangeFlag, isOpFrameChanged );
12161 
12162     //
12163     //******DBK status******//
12164     //
12165 #ifdef DBG_SD2HD_LC
12166     DEBUG_LC_Full6bit(_hdsddFilterBaseReport);
12167 #endif
12168 
12169     //isLowLuma = MDrv_SC_LowLumaDetection();
12170     // hdsdd filter base reporter
12171     // Only DBK Use
12172     if (!isSourceChangeFlag)
12173     {
12174        _hdsddFilterBaseReport = MDrv_SC_SDHD_FilterBaseReport( _timeSharingID, &_hpfHdCntReport, &_hpfSdCntReport, hpfDefaultReg, timingSegment, &hdNactCnt  );
12175        _hdFilterBaseReport = MDrv_SC_dynamicHDfilterBaseReport( _timeSharingID, u32MotionValue, isUkosabihsMv0,  hpfDefaultReg, timingSegment  );
12176         _hpfSdTolerantReport = MDrv_SC_hpfTolerantReport( _timeSharingID, hpfDefaultReg, &_hpfHdTolerantReport, timingSegment  );
12177        MDrv_SC_SDHD_FilterOneReport( _timeSharingID, &_hpfHdCntReport3, &_hpfSdCntReport3, hpfDefaultReg, timingSegment  );
12178        MDrv_SC_SDHD_U11BaseReport( _timeSharingID, &_hpfHdCntReport4, &_hpfSdCntReport4, timingSegment, &hdNactCnt4  );
12179     }
12180 
12181 #if 0
12182     MS_U8 _hdsddFilterBaseReportDbg = _hdsddFilterBaseReport / 15;
12183     if( _hdsddFilterBaseReportDbg == 0 )
12184         MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0000 );
12185     else if( _hdsddFilterBaseReportDbg == 1 )
12186         MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0002 );
12187     else if( _hdsddFilterBaseReportDbg == 2 )
12188         MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0022 );
12189     else if( _hdsddFilterBaseReportDbg == 3 )
12190         MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0222 );
12191     else
12192         MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x2222 );
12193 #endif
12194 
12195 
12196     if (u8Ctrl2 & ENABLE_SCALER_AUTO_DBK_DRIVER)  //Edison_DBK_driver 0x01
12197     {
12198          //int log_en = 0;
12199          //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_02_L, 0x000F); //easter 20150805
12200          //if(log_en == 1)
12201         //{
12202         if(MApi_XC_GetStatus(&stXCStatus, MAIN_WINDOW) == FALSE)
12203         {
12204                 printf("MApi_XC_GetStatus failed because of InitData wrong, please update header file and compile again %d\n",_hdsddFilterBaseReport);
12205         }
12206             Mdrv_PQ_DBK(isSceneChangeY,u16MotionValue4,stXCStatus.stCropWin.width,stXCStatus.stCropWin.height, ( !_bIsHDSource ));
12207         //}
12208     }
12209 
12210 
12211     if(u8Ctrl2 & ENABLE_SCALER_MCDI_DRIVER) //Edison_UCDi_driver 0x02
12212     {
12213 
12214         MDrv_SC_KFC_EODiW_Motionless(); /*2012-07-26 Author:sam.hung*/
12215 #if HQV_JAGGY_PATTERN_ENBLE
12216         if(!_bIsHDSource)   //SD case
12217         isSdHqvJaggedTest = MDrv_SC_HQV_JaggedTestPattern( GMV );
12218     //printf("HQV_JAGGY_PATTERN_ENBLE == %d\n\n",HQV_JAGGY_PATTERN_ENBLE);
12219 #endif
12220     MDrv_SC_Agate_SubMvPanScan( GMV, isSceneChangeMc, isSdHqvJaggedTest, u16MotionValue4 );
12221     MDrv_SC_EODi_Armored( GMV, mv0Comfirm , nonMv0Comfirm);
12222 
12223     //isMcFilmSlowMotion = _bIsHDSource ? MDrv_SC_McFilmLikeForSlowMotion( u32MotionValue2, GMV ) : false;
12224 
12225     isSparsePattern = MDrv_SC_ukoSabihS_SparsePattern( mvNotFound, mvNotFoundME2, mv0Comfirm, nonMv0Comfirm, mv0ComfirmME2, nonMv0ComfirmME2, _bIsHDSource); /*FOR VG846 sparse content pattern*/
12226 
12227 #if SHIBASOKU_ENABLE
12228     isHBurstMoving = MDrv_SC_ukoSabihS_HBurstMoving( _hpfSdTolerantReport/*_hpfSdCntReport*/ );
12229     isHBurst = MDrv_SC_ukoSabihS_HBurst( _hpfSdTolerantReport/*_hpfSdCntReport*/, uComplex );
12230     ukoSabihS_en = MDrv_SC_Agate_ukoSabihS(&stXCStatus, GMV,nonMv0Comfirm, filmstatus, isMcFilmukoSabihS, &isUkosabihsMotion, &isUkosabihsMc, &isUkosabihsForFilm, mv0Comfirm, &isUkosabihsMv0, _bIsHDSource);
12231     isUkosabihsMcSweep = MDrv_SC_sweep_ukoSabihS(  GMV, nonMv0Comfirm, mv0Comfirm, filmstatus, isMcFilm, uComplex, &isUkosabihsMotionSweep );
12232     isUkosabihsMc = ( isUkosabihsMc & (!isBigFeather) );  /*isBigFeather for Ukosabihs scence change */
12233     isBigFeather = (isFeatherAndMotion > 0x100)? true   :   false;
12234     isArtifactPattern = MDrv_SC_ukoSabihS_ArtifactPattern(_hpfHdTolerantReport,_bIsHDSource);
12235     isNoLumaCplx =  MDrv_SC_ukoSabihS_noLumaCplx(); //=>no chroma
12236     isMcFilmukoSabihS   = MDrv_SC_McFilmUkoSabihS( opFrameStatus, _bIsHDSource, _hpfHdCntReport );
12237 #else
12238     isBigFeather = isBigFeather;
12239     isMcFilmukoSabihS = isMcFilmukoSabihS;
12240     isUkosabihsForFilm = isUkosabihsForFilm;
12241 #endif
12242 
12243 
12244     isMcOutOfSearchRange = MDrv_SC_McOutOfSearchRange( mvNotFound, mv0Comfirm, nonMv0Comfirm, isFeatherAndMotion, GMV );
12245 
12246     if((_bIsHDSource)&& KURO_PATTERN_ENABLE == 1)   //HD case
12247     {
12248         isMcFilmSlowMotion  = MDrv_SC_McFilmLikeForSlowMotion( u32MotionValue2, GMV ); /*fot Kuro increase SST */
12249         //printf("McFilmLikeForSlowMotion ==1\n\n");
12250     }
12251     else
12252     {
12253     isMcFilmSlowMotion = false;
12254         //printf("McFilmLikeForSlowMotion ==0\n\n");
12255     }
12256 
12257 //isZoomMoving = _bIsHDSource ? false : MDrv_SC_ZoomMoving( GMV, me1IsNonMv0, me1IsNotFound, isFeatherAndMotion, u16MotionValue4 );
12258     if(!_bIsHDSource)   //SD case for S Tree and Flower
12259     {
12260         isZoomMoving = MDrv_SC_ZoomMoving( GMV, me1IsNonMv0, me1IsNotFound, isFeatherAndMotion, u16MotionValue4 );
12261     }
12262     else
12263     {
12264         isZoomMoving = false;
12265     }
12266 
12267 #if LG_SPECIFIC_PATTERN_ENABLE
12268     if(!_bIsHDSource)   //SD case
12269     {
12270         isL139 = MDrv_SC_Agate_L139( TotalMvComfirm, ColorSum, uComplex, me1Still, ME1HisStates_2 );
12271         isL153 = MDrv_SC_Agate_L153( movingWithoutFeather, ColorSum, uComplex, ME1HisStates_2 );
12272         isL107 = MDrv_SC_Agate_L107( TotalMvComfirm, uComplex, GMV, u32MotionValue, TotalFeather, 2/*HDMI only*/ );
12273         //isSWoman = MDrv_SC_SBlueShirt(nonMv0Comfirm, mv0Comfirm, mvNotFound, mvNotFoundME2, uComplex, ME1HisStates_2, GMV );
12274         //isWeakMcNrFilm = filmstatus.film_act;
12275     isAbihsot = false;
12276     }
12277     else    //HD case
12278     {
12279         isL139 = false;
12280         isL153 = false;
12281         isL107 = false;
12282         //isSWoman = false;
12283         //isWeakMcNrFilm = false;
12284         isAbihsot = false;
12285     }
12286 #else
12287     movingWithoutFeather = movingWithoutFeather;
12288     TotalMvComfirm = TotalMvComfirm;
12289     TotalFeather = TotalFeather;
12290 #endif
12291 
12292 //Double Control
12293     MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl( inSearchUseFeather, isMcFilm );
12294     MDrv_SC_KFC_8bitMotionGain_Ctrl( ( (isZoomMoving) & (!isSceneChangeMc)) , isMcFilm, isMcFilmSlowMotion );
12295 
12296     MDrv_SC_featherSstGain_Ctrl( isMcFilmSlowMotion ); /* for kuro propeller.. */
12297     MDrv_SC_featherSstOffset_Ctrl( opFrameStatus, isMcFilmSlowMotion, ( (isZoomMoving) & (!isSceneChangeMc) )); /* for kuro propeller.. */
12298 
12299     MDrv_SC_MotionLimitGain_Ctrl( isL153 );
12300     MDrv_SC_UCDi_Weight_Boundary_Ctrl( ME1HisStates_1 ); /*patch for Boundary flicker issue when vertical scroll*/
12301     MDrv_SC_MCDi_En_Ctrl( ( isNoLumaCplx | isMcFilm | isMcOutOfSearchRange | isArtifactPattern | bBouncing_Status2 | isHBurstMoving | isSceneChangeMc | isMcFilmSlowMotion ) );
12302 
12303     MDrv_SC_Force_Motion_Ctrl( isL139, ( isUkosabihsMotion | isUkosabihsMotionSweep ) );
12304     MDrv_SC_Force_Mcdi_Ctrl(isUkosabihsMc);
12305     MDrv_SC_KFC_EODiW_Ctrl( ( isUkosabihsMc | isUkosabihsMcSweep ) );
12306     MDrv_SC_Mcdi_EODiW_Ctrl( ( isUkosabihsMc | isUkosabihsMcSweep ), isL107 );
12307     MDrv_SC_KFC_Ctrl( isAbihsot );
12308     MDrv_SC_UCDi_OP1_HisWeight_Ctrl(Bouncing_status,Feather_sum_status,filmstatus, ColorSum, FeatherSum, _bIsHDSource);
12309     MDrv_SC_SPF_OP1_HisWeight_Ctrl(Bouncing_status);
12310     MDrv_SC_SST_Ctrl(( isNoLumaCplx | isMcFilm | isMcOutOfSearchRange | isArtifactPattern | bBouncing_Status2 | isHBurstMoving | isSceneChangeMc | isMcFilmSlowMotion ), FeatherSum, _bIsHDSource);
12311 
12312 }
12313     /*isMEReset =*/ MDrv_SC_Agate_ME_Reset(u32MotionValue2,isSceneChangeMc,isSceneChangeY, isSourceChangeForME);
12314 
12315     if(u8Ctrl2 & ENABLE_SCALER_MCNR_DRIVER)  //Edison_UCNR_driver 0x04
12316     {
12317         NE_confirm = MDrv_SC_GetNoiseLevel( &estNoise, &letterBoxState, &stXCStatus, stXCStatus.bInterlace, isOpFrameChanged );
12318         MDrv_SC_NR_Driver_E28( u16MotionValue4, /*blkConfidence,*/ /*_hpfHdTolerantReport,*/ &lumaHistogramStates, &filmstatus, &GMV, isUkosabihsMotion, isSceneChange, stXCStatus.bInterlace, _bIsHDSource, isSourceChangeFlag, isOpFrameChanged,&estNoise, NE_confirm);
12319 #ifdef DBG_SCCHG_LC
12320     DEBUG_LC_42( isSceneChangeY, isSceneChangeMc );
12321 #endif
12322     }
12323 
12324     if(u8Ctrl2 & ENABLE_SCALER_SDHD_DETECT_DRIVER)  //Edison_SDHD_driver 0x08
12325     {
12326         MDrv_SC_Edision_stillFeatherDetection( u32MotionValue, isUkosabihsMotion, _hdFilterBaseReport, isHBurstMoving, isHBurst, isUkosabihsMv0, isMcFilmHd/*, isSceneChange*/, _hpfSdTolerantReport );
12327 
12328         static int DMS_SD2HD_Cnt = 0;
12329     // DMS SDtoHD mode
12330         MS_BOOL GMV_StillLike = (_bIsHDSource) && (GMV.minMvXdir >= 31) && (GMV.minMvXdir <= 33) && (GMV.minMvYdir >= 7) && (GMV.minMvYdir <= 9) ;
12331         MS_BOOL SD2HDCntLike1  = ( (_hpfHdCntReport>>7) > 2) && ( (_hpfHdCntReport>>7) < 8);
12332         MS_BOOL SD2HDCntLike2  = ( (_hpfSdCntReport>>3) > (_hpfHdCntReport*6) );
12333         // MS_BOOL DBKLike = (FrameBLKEdgIIR > 31) && (FrameBLKEdgIIR < 80);//easter 20150805
12334     //DEBUG_LC_Full6bit3(minmax((_hpfHdCntReport>>7), 0, 63) );
12335     //DEBUG_LC_Full6bit4(minmax((FrameBLKEdgIIR>>1), 0, 63) );
12336 #if 0
12337         if ( GMV_StillLike )
12338             MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7000, 0x7000);
12339         else
12340             MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x7000);
12341 
12342         if ( SD2HDCntLike1 )
12343             MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0700, 0x0700);
12344         else
12345             MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0700);
12346 
12347         if ( SD2HDCntLike2 )
12348             MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0070, 0x0070);
12349         else
12350             MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0070);
12351 
12352         if ( DBKLike )
12353             MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0007, 0x0007);
12354         else
12355             MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0007);
12356 #endif
12357         if (isSceneChange || isSourceChangeFlag)
12358         {
12359             DMS_SD2HD_Cnt = 0;
12360         }
12361         else if ( GMV_StillLike && SD2HDCntLike1 && SD2HDCntLike2)// && )DBKLike )easter 20150805
12362         {
12363             DMS_SD2HD_Cnt += 4;
12364         }
12365         else
12366         {
12367             if (!GMV_StillLike)
12368                 DMS_SD2HD_Cnt -= 1;
12369             if (!SD2HDCntLike1)
12370                 DMS_SD2HD_Cnt -= 1;
12371             if (!SD2HDCntLike2)
12372                 DMS_SD2HD_Cnt -= 1;
12373             //if (!DBKLike) easter 20150805
12374             //    DMS_SD2HD_Cnt -= 1;
12375         }
12376             DMS_SD2HD_Cnt = __minmax(DMS_SD2HD_Cnt, 0, 63);
12377             DMS_SDHDModeCheck(DMS_SD2HD_Cnt);
12378         }
12379 
12380 
12381     if(u8Ctrl2 & ENABLE_SCALER_CCS_DRIVER)  //Edison_CCS_driver 0x20
12382     {
12383         //MDrv_SC_Edison_CCS_driver(ukoSabihS_en);
12384         MDrv_SC_Edison_CCS_driver(ukoSabihS_en|isSparsePattern); //Add isSparsePattern for TG59 Variable Dot pattern(Pure Color pattern)
12385     }
12386 
12387     if(u8Ctrl2 & ENABLE_SCALER_DHD_DRIVER)  //Edison_DHD_driver 0x40
12388     {
12389 //      u8SDHDDReport = false;
12390         MDrv_SC_Edison_DHD_driver(uComplex, nonMv0Comfirm, me1Still, mv0Comfirm, GMV, _hpfHdCntReport);
12391         MDrv_SC_Edison_DHD_Weather_driver(uComplex, nonMv0Comfirm, me1Still, mv0Comfirm );
12392         MDrv_SC_Edison_DHD_GSLSM_driver(uComplex, nonMv0Comfirm, me1Still, mv0Comfirm );
12393               MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(filmstatus);
12394         //MDrv_SC_Edison_DHD_Stadium_driver(isMcFilmHd,filmstatus);
12395     }
12396 
12397     if(u8Ctrl & ENABLE_SCALER_D3D_DRIVER)  //Edison_Detect_3D_Source_driver
12398     {
12399          MDrv_SC_3DfmtDetect(); //2012.7.24 mark
12400     }
12401 
12402     if (u8Ctrl & ENABLE_SCALER_DEFEATHERING)
12403     {
12404         MDrv_SC_de_feathering(u32MotionValue);  //2015.04.27 ricky.chen change back
12405         //MDrv_SC_de_feathering(u16MotionValue4);
12406     }
12407 
12408     if (u8Ctrl & ENABLE_SCALER_DEFLICKERING)
12409     {
12410         MDrv_SC_de_flickering(u32MotionValue);
12411     }
12412 
12413     if (u8Ctrl & ENABLE_SCALER_DEBOUNCING)
12414     {
12415         MDrv_SC_de_bouncing(u32MotionValue2);
12416     }
12417 
12418     if( (MApi_XC_R2BYTEMSK(REG_SC_BK0A_10_L, BIT(14)) == BIT(14))
12419             || (MApi_XC_R2BYTEMSK(REG_SC_BK0A_10_L, BIT(15)) == BIT(15)) )
12420     {
12421         if(!_Hal_PQ_FrameLockCheck()) // Make not frame LOCKED then turn off FilmMode
12422         {
12423             MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, BIT(1), BIT(1)); //hardware film mode DISABLE
12424             MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, BIT(1)|BIT(2), BIT(1) | BIT(2)); //software film mode DISABLE
12425         }
12426         else    // Make sure frame LOCKED then turn on FilmMode
12427         {
12428             if(bFakeOutCusEnable)
12429             {
12430                 MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, 0, BIT(1)); //hardware film mode ENABLE
12431                 MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, 0, BIT(1) | BIT(2)); //software film mode ENABLE
12432             }
12433             else
12434             {
12435                 MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, BIT(1), BIT(1)); //hardware film mode DISABLE
12436                 MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, BIT(1)|BIT(2), BIT(1) | BIT(2)); //software film mode DISABLE
12437             }
12438         }
12439     }
12440 //
12441 //******UFSC DRIVER******//
12442 //
12443     MS_U16 FSC_estNoise=0;
12444     MS_U8 FSC_estConfirm=0;
12445 
12446     //NE transfer from SOC GetNoiseLevel
12447     FSC_estNoise = __minmax(estNoise/10, 0, 15);
12448     FSC_estConfirm = __minmax( NE_confirm, 1, 8);
12449 
12450     // SR enhancement strength
12451     int srEnhStr = (MDrv_Read2Byte( REG_FSC_BK30_3E_L)& 0x003F ); // 1.5
12452     static XC_BackgroundState backgroundState;
12453     MDrv_UFSC_PQ_BNF_status( &backgroundState, isOpFrameChanged );
12454 
12455     // OSD info
12456     MS_BOOL isOSDActive = MDrv_Read2Byte(REG_FSC_BK132_4A_L)>>11;
12457     static MS_U8 osdW = 0;
12458     if( isOSDActive )
12459     {
12460         osdW = osdW < 253 ? osdW + 2 : 255;
12461     }
12462     else
12463     {
12464         osdW = osdW > 16 ? osdW - 16 : 0;
12465     }
12466 
12467     static int dsStdCnt = 0, frNNCnt = 0, frNNCnt2 = 0;
12468     static int frDsSum = 0, frFetSum = 0, frNNSum = 0;
12469     {
12470         int dsStdCntTmp = MDrv_Read2Byte(REG_FSC_BK2C_79_L) + MDrv_Read2Byte(REG_FSC_BKAC_79_L);
12471         int frNNCntTmp = MDrv_Read2Byte(REG_FSC_BK72_31_L) + MDrv_Read2Byte(REG_FSC_BKF2_31_L);
12472         int frNNCnt2Tmp = MDrv_Read2Byte(REG_FSC_BK72_33_L) + MDrv_Read2Byte(REG_FSC_BKF2_33_L); // not changed with settings
12473 
12474         int frDsSumTmp = ( (MDrv_Read2Byte(REG_FSC_BK72_7B_L) << 16) + MDrv_Read2Byte(REG_FSC_BK72_7A_L)
12475                     + (MDrv_Read2Byte(REG_FSC_BKF2_7B_L) << 16) + MDrv_Read2Byte(REG_FSC_BKF2_7A_L) ) >> 1;
12476         int frFetSumTmp = ( (MDrv_Read2Byte(REG_FSC_BK72_7D_L) << 16) + MDrv_Read2Byte(REG_FSC_BK72_7C_L)
12477                     + (MDrv_Read2Byte(REG_FSC_BKF2_7D_L) << 16) + MDrv_Read2Byte(REG_FSC_BKF2_7C_L) ) >> 1;
12478         int frNNSumTmp = ( (MDrv_Read2Byte(REG_FSC_BK72_7F_L) << 16) + MDrv_Read2Byte(REG_FSC_BK72_7E_L)
12479                     + (MDrv_Read2Byte(REG_FSC_BKF2_7F_L) << 16) + MDrv_Read2Byte(REG_FSC_BKF2_7E_L) ) >> 1;
12480 
12481         dsStdCnt = ( dsStdCntTmp + dsStdCnt*3 ) >> 2;
12482         frNNCnt = ( frNNCntTmp + frNNCnt*3 ) >> 2;
12483         frNNCnt2 = ( frNNCnt2Tmp + frNNCnt2*3 ) >> 2;
12484         frDsSum = ( frDsSumTmp + frDsSum*3 ) >> 2;
12485         frFetSum = ( frFetSumTmp + frFetSum*3 ) >> 2;
12486         frNNSum = ( frNNSumTmp + frNNSum*3 ) >> 2;
12487     }
12488 
12489 #if 1
12490     int menuW, edgePatW; // for menu and dragon ball like edge pattern
12491     {
12492         // menu pattern
12493     menuW = __max( 0, (int)backgroundState.cplxRawCnt - ((int)backgroundState.dswRawCnt * 3) );
12494     menuW = __min( 256, menuW );
12495     menuW = 256 - menuW;
12496 
12497     int cplxW = __max( 0 , (int)backgroundState.cplxRawCnt - 4096 ) >> 4;
12498     menuW = __max( 0, menuW - cplxW );
12499 
12500     int fetDsW = __max( 0, frFetSum - frDsSum ) >> 2;
12501     menuW = __max( 0, menuW - fetDsW );
12502 
12503     int fetW = __max( 0, frFetSum - 512 ) >> 2;
12504     menuW = __max( 0, menuW - fetW );
12505 
12506     //printf("PQ_LSE : cplxW = %d , fetDsW = %d  fetW = %d  frFetSum = %d  frDsSum = %d  osdW = %d \n",cplxW,fetDsW,fetW,frFetSum,frDsSum,osdW);
12507     // OSD
12508     menuW = __max( menuW, osdW );
12509     }
12510     {
12511     // edge pattern : dragon ball, AUO_0011,12
12512     edgePatW = (__max( 0, (int)backgroundState.cplxRawCnt - ( ((int)backgroundState.dswRawCnt * 19) >> 3 )))>>2;
12513 
12514     //printf("PQ_LSE : cplxRawCnt = %d , dswRawCnt = %d \n",(int)backgroundState.cplxRawCnt,(int)backgroundState.dswRawCnt);
12515     edgePatW = __min( 256, edgePatW );
12516     edgePatW = 256 - edgePatW;
12517 
12518     int dsFetW = __max( 0, frDsSum - frFetSum );
12519     dsFetW = __min( 256, dsFetW );
12520     int stdW = __max( 0, dsStdCnt - 1024 ) >> 2;
12521     dsFetW = __max( 0, dsFetW - stdW );
12522     edgePatW = __max( 0, edgePatW - dsFetW );
12523 
12524     //int flatW = max( 0 , 4096 - (int)backgroundState.cplxRawCnt ) >> 1;
12525     //edgePatW = max( 0, edgePatW - flatW );
12526     }
12527 
12528 
12529 
12530     MS_U16 u16FhdReportOffset = MDrv_Read2Byte(REG_FSC_BK30_17_L) & 0xFFFF;
12531     int fHdW2,fHdW3;
12532     {
12533         int shiftbitnum = MDrv_Read2Byte(REG_FSC_BK30_27_L)>>8;
12534         int offset = u16FhdReportOffset<<shiftbitnum;
12535         int offset2 = u16FhdReportOffset<<(shiftbitnum+1);
12536         fHdW2 = __max( _hpfHdCntReport4 - offset , 0);
12537         fHdW2 = __minmax( fHdW2 >> shiftbitnum , 0 , 256);;
12538 
12539         fHdW3 = __max( _hpfHdCntReport4 - offset2 , 0);
12540         fHdW3 = __minmax( fHdW3 >> shiftbitnum , 0 , 256);;
12541 
12542 
12543         int hdcnt_shift = _hpfHdCntReport4>>8;
12544         int sdcnt_shift = _hpfSdCntReport4>>8;
12545         int bld_alpha;
12546         bld_alpha = __max( sdcnt_shift - ((160*hdcnt_shift)>>6) ,0);
12547         bld_alpha = __minmax( bld_alpha>>3 , 0 , 64 );
12548 
12549         int weight_bld = ( bld_alpha*fHdW3 + (64-bld_alpha)*fHdW2 )>>6;
12550         weight_bld = 256-weight_bld;
12551         fHdW2 = weight_bld;
12552 
12553     }
12554 
12555     int sdW2;
12556     {
12557 
12558         int shiftbitnum = MDrv_Read2Byte(REG_FSC_BK30_27_L)&0x00FF;
12559         int offset = 256<<shiftbitnum;
12560         sdW2 = __max( _hpfHdCntReport4 - offset , 0);
12561         sdW2 = __minmax( sdW2 >> shiftbitnum , 0 , 256);
12562         sdW2 = 256 - sdW2;
12563 
12564         //sdW2 = max( 0 , sdW2 - max( edgePatW, menuW ) );
12565 
12566     }
12567 
12568     //printf("EVATEST: sdW2 = %d, fHdW2 = %d, menuW = %d, edgePatW = %d, new_mode_en = %d\n",sdW2,fHdW2,menuW,edgePatW,new_mode_en);
12569 
12570     MS_U8 u8iirPre = (MDrv_Read2Byte(REG_FSC_BK30_10_L)&0xF000)>>12;
12571 	sdW2 = ( sdW2*(16-u8iirPre) + u32SdW*u8iirPre +8) /16; //iir
12572 	fHdW2 = ( fHdW2*(16-u8iirPre) + u32FhdW*u8iirPre +8) /16;
12573 
12574     //iir
12575     u32SdW = sdW2;
12576     u32FhdW = fHdW2;
12577 
12578 
12579     short mode_sel = MDrv_Read2Byte(REG_FSC_BK30_10_L)&0x000f;
12580     if(mode_sel == 1) //SD
12581     {
12582         sdW2 = 256;
12583         fHdW2 = 256;
12584     }
12585     else if(mode_sel == 2) //FHD
12586     {
12587         sdW2 = 0;
12588         fHdW2 = 256;
12589     }
12590     else if(mode_sel == 3) // HD
12591     {
12592         sdW2 = 0;
12593         fHdW2 = 0;
12594     }
12595     else if(mode_sel == 4)
12596     {
12597         edgePatW = 0;
12598     }
12599     else if(mode_sel == 5)
12600     {
12601         menuW = 0;
12602     }
12603     else if(mode_sel == 6)
12604     {
12605         menuW = 0;
12606         edgePatW = 0;
12607     }
12608 
12609     //artificial pattern detection
12610     MS_U32 u32ArtiReport;
12611     MS_U16 u16ArtiReportH = MDrv_Read2Byte(REG_FSC_BK4F_47_L)&0xFFFF;
12612     MS_U16 u16ArtiReportL = MDrv_Read2Byte(REG_FSC_BK4F_46_L)&0xFFFF;
12613     u32ArtiReport = (u16ArtiReportH<<16) + u16ArtiReportL;
12614 
12615     MS_U32 u32Dist5x5Report;
12616     MS_U16 u16Dist5x5ReportH = MDrv_Read2Byte(REG_FSC_BK4F_45_L)&0xFFFF;
12617     MS_U16 u16Dist5x5ReportL = MDrv_Read2Byte(REG_FSC_BK4F_44_L)&0xFFFF;
12618     u32Dist5x5Report = (u16Dist5x5ReportH<<16) + u16Dist5x5ReportL;
12619 
12620     short arti_detect_disable = ( MDrv_Read2Byte(REG_FSC_BK30_10_L) >>4)&0x0001;
12621     MS_U16 u16ArtiWOffset = MDrv_Read2Byte(REG_FSC_BK30_19_L)&0x0FFF;
12622     MS_U16 u16ArtiW = 0;
12623     if(u32Dist5x5Report != 0)
12624     {
12625         u16ArtiW = __minmax( (u32ArtiReport*1024)/u32Dist5x5Report, 0 , 1024 ) ;
12626         u16ArtiW = __minmax( __max( u16ArtiW - u16ArtiWOffset , 0) , 0 , 256 );
12627     }
12628     if( arti_detect_disable == 1)
12629         u16ArtiW = 0;
12630 
12631 
12632     int hdreport = __minmax( _hpfHdCntReport4 >> 4 , 0 , 0xffff);
12633     int sdreport = __minmax( _hpfSdCntReport4 >> 4 , 0 , 0xffff);
12634 
12635     if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>11)&0x1) == 1 ){
12636         fHdW2 =  MDrv_Read2Byte(REG_FSC_BK30_1E_L);
12637         sdW2 =  MDrv_Read2Byte(REG_FSC_BK30_1F_L);
12638     }
12639     MApi_XC_Write2ByteMask(REG_FSC_BK30_28_L , hdreport , 0xFFFF);
12640     short reduce_osd_w = __max( edgePatW, menuW );
12641     MApi_XC_Write2ByteMask(REG_FSC_BK30_29_L , /*fHdW3 reduce_osd_w*/menuW , 0xFFFF);
12642     MApi_XC_Write2ByteMask(REG_FSC_BK30_2A_L , sdreport , 0xFFFF);
12643     MApi_XC_Write2ByteMask(REG_FSC_BK30_2B_L , sdW2 , 0xFFFF);
12644     MApi_XC_Write2ByteMask(REG_FSC_BK30_2C_L , fHdW2 , 0xFFFF);
12645     MApi_XC_Write2ByteMask(REG_FSC_BK30_18_L ,  /*u16ArtiW*/edgePatW , 0xFFFF);
12646 
12647     //printf("SDHD: HDrep = %d , SDrep = %d , Midrep = %d \n",_hpfHdCntReport4,_hpfSdCntReport4,hdNactCnt4);
12648     //printf("Eva: fHdW2 = %d , sdW2 = %d   hdNactCnt4 = %d \n",fHdW2,sdW2,hdNactCnt4);
12649     //printf("PQ_LSE: _hpfHdCntReport = %d  hdNactCnt = %d\n",_hpfHdCntReport,hdNactCnt);
12650     //printf("MY PQ_LSE: _hpfHdCntReport4 = %d  hdNactCnt4 = %d  fHdW2 = %d  sdW2 = %d \n",_hpfHdCntReport4,hdNactCnt4,fHdW2,sdW2);
12651 
12652 #endif
12653 
12654 #if 0
12655   XC_PqWriteReg PqWriteReg;
12656   memset(&PqWriteReg,0x0,sizeof(XC_PqWriteReg));
12657 
12658   if (u8UFSCCtrl3 & ENABLE_SR_DRIVER)
12659     {
12660         //XC_PqWriteReg PqWriteReg;
12661         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>0)&0x1) != 1 )
12662             MDrv_UFSC_PQ_LSE( frNNCnt2, menuW, edgePatW, srEnhStr ,sdW2 , fHdW2 ,&PqWriteReg);
12663         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>1)&0x1) != 1 )
12664             MDrv_UFSC_PQ_NLM( &backgroundState, menuW, edgePatW, srEnhStr, sdW2 ,&PqWriteReg);
12665         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>2)&0x1) != 1 )
12666             MDrv_UFSC_PQ_PreEnh( fHdW2, sdW2, FSC_estNoise, FSC_estConfirm, srEnhStr ,&PqWriteReg);
12667         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>3)&0x1) != 1 )
12668             MDrv_UFSC_PQ_PostPK3x3( menuW, edgePatW, fHdW2, sdW2, srEnhStr ,&PqWriteReg,u16ArtiW);
12669         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>4)&0x1) != 1 )
12670             MDrv_UFSC_PQ_HASC( sdW2, srEnhStr );
12671         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>5)&0x1) != 1 )
12672             MDrv_UFSC_PQ_P2M( menuW, edgePatW, srEnhStr ,&PqWriteReg);
12673         //MDrv_UFSC_PQ_ANN( frNNCnt2 );
12674         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>6)&0x1) != 1 )
12675             MDrv_UFSC_PQ_DMS_referBNF( &backgroundState );
12676         //MDrv_UFSC_PQ_LSE_Patch();
12677 
12678         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>7)&0x1) != 1 )
12679             MDrv_UFSC_PQ_2DPK(/*menuW*/reduce_osd_w ,sdW2,fHdW2,srEnhStr,&PqWriteReg,u16ArtiW);
12680         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>8)&0x1) != 1 )
12681             MDrv_UFSC_PQ_SPNN( menuW, edgePatW, srEnhStr ,sdW2 , fHdW2 ,&PqWriteReg);
12682         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>9)&0x1) != 1 )
12683             MDrv_SC_2DPK_PQ(sdW2,fHdW2,srEnhStr,&PqWriteReg,u16ArtiW);
12684         if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>10)&0x1) != 1 )
12685             MDrv_UFSC_PQ_BNF(sdW2);
12686 
12687         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x2, 0x000F );
12688     }
12689     else{
12690         MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x1, 0x000F );
12691     }
12692 
12693     MDrv_SC_UFSC_WRITE_REG_UI_SHARPNESS(&PqWriteReg , u8UFSCCtrl3 , ENABLE_SR_DRIVER);
12694 #else
12695     UNUSED(u8UFSCCtrl3);
12696     UNUSED(FSC_estNoise);
12697     UNUSED(FSC_estConfirm);
12698     UNUSED(reduce_osd_w);
12699     UNUSED(srEnhStr);
12700 #endif
12701 
12702     MDrv_SC_ResetSourceChange( isSourceChangeForME );
12703 
12704     prevOpFrameStatus = opFrameStatus;
12705 #else
12706 	UNUSED(_bIsHDSource);
12707 	UNUSED(u32SdW);
12708 	UNUSED(u32FhdW);
12709 
12710 #endif
12711 
12712 }
12713 
12714 #undef DRV_SCALER_ADAPTIVE_C
12715 
12716