xref: /utopia/UTPA2-700.0.x/modules/audio/hal/k6/audio/halSIF.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 
95 
96 //-------------------------------------------------------------------------------------------------
97 //  Include Files
98 //-------------------------------------------------------------------------------------------------
99 // Common Definition
100 #include "MsCommon.h"
101 #include "MsIRQ.h"
102 #include "MsOS.h"
103 
104 // Internal Definition
105 #include "regCHIP.h"
106 #include "drvAUDIO.h"
107 #include "regAUDIO.h"
108 #include "halAUDIO.h"
109 #include "halMAD.h"
110 #include "halMAD2.h"
111 #include "halSIF.h"
112 
113 //-------------------------------------------------------------------------------------------------
114 //  Driver Compiler Options
115 //-------------------------------------------------------------------------------------------------
116 #define DBG_SIF(msg) //msg
117 
118 //-------------------------------------------------------------------------------------------------
119 //  Local Defines
120 //-------------------------------------------------------------------------------------------------
121 #define HINIBBLE(u8Data)    ((u8Data) >> 4)
122 #define LONIBBLE(u8Data)    ((u8Data) << 4)
123 
124 //-------------------------------------------------------------------------------------------------
125 //  Local Structures
126 //-------------------------------------------------------------------------------------------------
127 
128 //-------------------------------------------------------------------------------------------------
129 //  Global Variables
130 //-------------------------------------------------------------------------------------------------
131 extern AUDIO_SHARED_VARS2 *g_AudioVars2;
132 
133 //-------------------------------------------------------------------------------------------------
134 //  Local Variables
135 //-------------------------------------------------------------------------------------------------
136 static MS_BOOL bHiDev_Flag = FALSE;
137 static MS_BOOL bDetect_Main_Std_Only_Flag = FALSE;
138 static MS_U8   hidev_filter_bandwidth_level = 0x10;
139 static MS_BOOL gAutoMute = FALSE;
140 static MS_BOOL gAutoSoundmode = TRUE;
141 static MS_BOOL bADCFromVifPathSupported = TRUE, bADCFromVifPathEnabled = TRUE;   // for T3, default enable vif path.
142 static MS_BOOL beeper_enable = FALSE;
143 static MS_BOOL vif_patch_flag = TRUE; // If it's ture, chips need to be added vif patches for palsum vif 42M & 44M.
144 static AUDIO_DSP_CODE_TYPE   sifDspCodeType = AU_SIF_NONE;
145 static AU_SIF_CLOCK_Type  sif_clock = AUD_SIF_43M;
146 
147 const MS_U16  PRESCALE_STEP_TBL[]=
148 {
149     0x7E2B,       // -0.125dB
150     0x7C5E,       // -0.25dB
151     0x78D6,       // -0.5dB
152     0x7214,       // -1dB
153     0x65AC,       // -2dB
154     0x50C3,       // -4dB
155 };
156 
157 #if 0
158 // for DVB project threshold function..
159 const MS_U16 au_pal_sys_threshold[12]=
160 {
161     M_A2_THRESHOLD_ADDR,
162     BG_A2_THRESHOLD_ADDR,
163     DK_A2_THRESHOLD_ADDR,
164     I_FM_THRESHOLD_ADDR,
165     L_AM_THRESHOLD_ADDR,
166     NICAM_BGDKL_THRESHOLD_ADDR,
167     NICAM_I_THRESHOLD_ADDR,
168     HIDEV_M_THRESHOLD_ADDR,
169     HIDEV_BG_THRESHOLD_ADDR,
170     HIDEV_DK_THRESHOLD_ADDR,
171     HIDEV_I_THRESHOLD_ADDR,
172     BTSC_THRESHOLD_ADDR,
173 };
174 
175 const MS_U16  SIF_PM_GAIN_TBL_PAL[6][2]=
176 {
177    { A2_OUTPUT_GAIN_X_ADDR,  A2_OUTPUT_GAIN_X_ADDR+1},        //A2 / FM-MONO
178    { NICAM_OUTPUT_GAIN_ADDR,  NICAM_OUTPUT_GAIN_ADDR+1},    //NICAM
179    { AM_OUTPUT_GAIN_ADDR,  AM_OUTPUT_GAIN_ADDR+1},              //AM
180    { A2_OUTPUT_GAIN_X_ADDR+2,  A2_OUTPUT_GAIN_X_ADDR+3},  //HIDEV
181    { A2_OUTPUT_GAIN_M_ADDR,  A2_OUTPUT_GAIN_M_ADDR+1},  //FM-MONO M
182    { A2_OUTPUT_GAIN_M_ADDR+2,  A2_OUTPUT_GAIN_M_ADDR+3},  //FM-MONO M HIDEV
183 };
184 
185 const MS_U16  SIF_PM_GAIN_TBL_BTSC[4][2]=
186 {
187    { BTSC_OUTPUT_GAIN_ADDR,  BTSC_OUTPUT_GAIN_ADDR+1},        // BTSC
188    { BTSC_MTS_OUTPUT_GAIN,  BTSC_MTS_OUTPUT_GAIN+1},                    //BTSC Mono
189    { BTSC_MTS_OUTPUT_GAIN+2,  BTSC_MTS_OUTPUT_GAIN+3},                    //BTSC Stereo
190    { BTSC_MTS_OUTPUT_GAIN+4,  BTSC_MTS_OUTPUT_GAIN+5},                //BTSC SAP
191 };
192 #endif
193 
194 //plz re-mapping xbox adrress for ATV if need
195 const MS_U16 au_pal_sys_threshold[12]=
196 {
197     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD,
198     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+1,
199     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+2,
200     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+3,
201     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+4,
202     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+5,
203     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+6,
204     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+7,
205     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+8,
206     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+9,
207     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+10,
208     DSP2XboxAddr_AU_PAL_SYS_THRESHOLD+11,
209 };
210 
211 const MS_U16  SIF_PM_GAIN_TBL_PAL[6][2]=
212 {
213     { DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL, DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+1},
214     { DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+2, DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+3},
215     { DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+4, DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+5},
216     { DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+6, DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+7},
217     { DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+8, DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+9},
218     { DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+10, DSP2XboxAddr_SIF_PM_GAIN_TBL_PAL+11},
219 };
220 
221 const MS_U16  SIF_PM_GAIN_TBL_BTSC[4][2]=
222 {
223     { DSP2XboxAddr_SIF_PM_GAIN_TBL_BTSC, DSP2XboxAddr_SIF_PM_GAIN_TBL_BTSC+1},
224     { DSP2XboxAddr_SIF_PM_GAIN_TBL_BTSC+2, DSP2XboxAddr_SIF_PM_GAIN_TBL_BTSC+3},
225     { DSP2XboxAddr_SIF_PM_GAIN_TBL_BTSC+4, DSP2XboxAddr_SIF_PM_GAIN_TBL_BTSC+5},
226     { DSP2XboxAddr_SIF_PM_GAIN_TBL_BTSC+6, DSP2XboxAddr_SIF_PM_GAIN_TBL_BTSC+7},
227 };
228 
229 //-------------------------------------------------------------------------------------------------
230 //  Debug Functions
231 //-------------------------------------------------------------------------------------------------
232 
233 
234 //-------------------------------------------------------------------------------------------------
235 //  Local Functions
236 //-------------------------------------------------------------------------------------------------
237 //-------------------------------------------------------------------------------------------------
238 //  Global Functions
239 //-------------------------------------------------------------------------------------------------
240 ////////////////////////////////////////////////////////////////////////////////
241 /// @brief \b Function \b Name: HAL_SIF_Init()
242 /// @brief \b Function \b Description: This routine is the initialization for SIF
243 /// @param <IN>        \b NONE  :
244 /// @param <OUT>       \b NONE  :
245 /// @param <RET>       \b NONE  :
246 /// @param <GLOBAL>    \b NONE  :
247 ////////////////////////////////////////////////////////////////////////////////
HAL_SIF_Init(void)248 void HAL_SIF_Init(void)
249 {
250     return;
251 }
252 
253 ////////////////////////////////////////////////////////////////////////////////
254 /// @brief \b Function \b Name: HAL_SIF_TriggerSifPLL()
255 /// @brief \b Function \b Description:  This function is used to initialize SIF analog part .
256 /// @param <IN>        \b u8Index   :
257 /// @param <OUT>       \b NONE  :
258 /// @param <RET>       \b MS_U32    :
259 /// @param <GLOBAL>    \b NONE  :
260 ////////////////////////////////////////////////////////////////////////////////
HAL_SIF_TriggerSifPLL(void)261 void HAL_SIF_TriggerSifPLL(void)
262 {
263        MS_U8 u8MuxSelect;
264        MS_U8 uStandard;
265 
266     if (bADCFromVifPathEnabled == TRUE) //enable VIF
267     {
268         HAL_AUDIO_AbsWriteMaskByte(0x112c02, 0x04, 0x04);
269 
270         HAL_AUDIO_AbsWriteMaskByte(0x112CC8, 0xFF, 0xe0);
271         #if (SIF_DSP_TYPE == 0)
272         HAL_AUDIO_AbsWriteMaskByte(0x112CC9, 0xFF, 0x1E); // Enable VIF
273         #else
274         HAL_AUDIO_AbsWriteMaskByte(0x112CC9, 0xFF, 0x3E); // Enable VIF
275         #endif
276     }
277     else    //enable SIF
278     {
279         HAL_AUDIO_AbsWriteMaskByte(0x000E61, 0x01, 0x00);
280 
281         HAL_AUDIO_AbsWriteMaskByte(0x000E13, 0x04, 0x00);
282 
283         u8MuxSelect=HAL_AUDIO_AbsReadByte(0x101E39);         // Back up MUX setting
284         HAL_AUDIO_AbsWriteMaskByte(0x101E39, 0x03, 0x00);  // Mux switch for HK MCU access bank 0x1120 & 0x1128
285 
286         HAL_AUDIO_AbsWriteMaskByte(0x103314, 0xFF, 0x00);
287         HAL_AUDIO_AbsWriteMaskByte(0x103315, 0xFF, 0x00);
288 
289         HAL_AUDIO_AbsWriteMaskByte(0x112002, 0xFF, 0x74);
290         HAL_AUDIO_AbsWriteMaskByte(0x112003, 0xFF, 0x00);
291 
292         HAL_AUDIO_AbsWriteMaskByte(0x11208E, 0xFF, 0x00);
293         HAL_AUDIO_AbsWriteMaskByte(0x11208F, 0xFF, 0x00);
294 
295         HAL_AUDIO_AbsWriteMaskByte(0x100E13, 0x04, 0x00);
296 
297         HAL_AUDIO_AbsWriteMaskByte(0x112879, 0xF0, 0x00);
298 
299         HAL_AUDIO_AbsWriteMaskByte(0x112840, 0x10, 0x00);
300         HAL_AUDIO_AbsWriteMaskByte(0x112834, 0x10, 0x10);
301 
302         HAL_AUDIO_AbsWriteMaskByte(0x112802, 0xFF, 0x20);
303         HAL_AUDIO_AbsWriteMaskByte(0x112803, 0xFF, 0x02);
304 
305         HAL_AUDIO_AbsWriteMaskByte(0x112816, 0xFF, 0x05);
306         HAL_AUDIO_AbsWriteMaskByte(0x112817, 0xFF, 0x05);
307 
308         HAL_AUDIO_AbsWriteMaskByte(0x11281E, 0xFF, 0x80);
309         HAL_AUDIO_AbsWriteMaskByte(0x11281F, 0xFF, 0x00);
310 
311         HAL_AUDIO_AbsWriteMaskByte(0x112860, 0xFF, 0x00);
312         HAL_AUDIO_AbsWriteMaskByte(0x112861, 0xFF, 0x10);
313 
314         HAL_AUDIO_AbsWriteMaskByte(0x112866, 0xFF, 0x01);
315         HAL_AUDIO_AbsWriteMaskByte(0x112867, 0xFF, 0x12);
316 
317         HAL_AUDIO_AbsWriteMaskByte(0x11286A, 0xFF, 0x83);
318         HAL_AUDIO_AbsWriteMaskByte(0x11286B, 0xFF, 0x00);
319         AUDIO_DELAY1MS(1);
320         HAL_AUDIO_AbsWriteMaskByte(0x11286A, 0xFF, 0x03);
321         HAL_AUDIO_AbsWriteMaskByte(0x11286B, 0xFF, 0x00);
322 
323         HAL_AUDIO_AbsWriteMaskByte(0x11286C, 0xFF, 0x00);
324         HAL_AUDIO_AbsWriteMaskByte(0x11286D, 0xFF, 0x00);
325 
326         HAL_AUDIO_AbsWriteMaskByte(0x112818, 0xFF, 0x00);
327         HAL_AUDIO_AbsWriteMaskByte(0x112819, 0xFF, 0x00);
328 
329         HAL_AUDIO_AbsWriteMaskByte(0x101E39, 0x03, u8MuxSelect);  // Revert MUX setting
330 
331         HAL_AUDIO_AbsWriteMaskByte(0x112c02, 0x04, 0x04);
332         HAL_AUDIO_AbsWriteMaskByte(0x112cb0, 0x80, 0x80);
333 
334         HAL_AUDIO_AbsWriteMaskByte(0x112CC8, 0xFF, 0xe0);
335 
336         #if (SIF_DSP_TYPE == 0)
337         HAL_AUDIO_AbsWriteMaskByte(0x112CC9, 0xFF, 0x0E); // Enable SIF
338         #else
339         HAL_AUDIO_AbsWriteMaskByte(0x112CC9, 0xFF, 0x2E); // Enable SIF
340         #endif
341     }
342 
343         uStandard = HAL_AUDIO_ReadByte(AU_CMD_STANDARD);
344         HAL_AUDIO_WriteByte(AU_CMD_STANDARD, 0x00);
345         AUDIO_DELAY1MS(10);
346         HAL_AUDIO_WriteByte(AU_CMD_STANDARD, 0x20);
347         AUDIO_DELAY1MS(10);
348         HAL_AUDIO_WriteByte(AU_CMD_STANDARD, uStandard);
349 }
350 
351 ////////////////////////////////////////////////////////////////////////////////
352 /// @brief \b Function \b Name: HAL_SIF_GetDspType()
353 /// @brief \b Function \b Description:  This function is used to get the DSP(DSP_DEC or DSP_SE) which SIF module used.
354 /// @param <IN>        \b NONE    :
355 /// @param <OUT>       \b NONE    :
356 /// @param <RET>       \b MS_U8   : DSP which SIF modules (DSP_DEC or DSP_SE)
357 /// @param <GLOBAL>    \b NONE    :
358 ////////////////////////////////////////////////////////////////////////////////
HAL_SIF_GetDspType(void)359 MS_U8 HAL_SIF_GetDspType(void)
360 {
361     if (g_AudioVars2 == NULL)
362     {
363         DBG_SIF(printf("%s() : invalid g_AudioVars2!\n", __FUNCTION__));
364 #if (SIF_DSP_TYPE == 0)
365         return DSP_DEC;
366 #else
367         return DSP_SE;
368 #endif
369     }
370 
371     return g_AudioVars2->g_u8SifDspType;
372 }
373 
374 ////////////////////////////////////////////////////////////////////////////////
375 /// @brief \b Function \b Name: HAL_SIF_SetDspCodeType()
376 /// @brief \b Function \b Description:  This function is used to set the DSP code type SIF module used.
377 /// @param <IN>        \b MS_U8: SIF DSP code type.
378 /// @param <OUT>       \b NONE    :
379 /// @param <RET>       \b NONE    :
380 /// @param <GLOBAL>    \b NONE    :
381 ////////////////////////////////////////////////////////////////////////////////
HAL_SIF_SetDspCodeType(AUDIO_DSP_CODE_TYPE dspCodeType)382 void HAL_SIF_SetDspCodeType(AUDIO_DSP_CODE_TYPE dspCodeType)
383 {
384     if (g_AudioVars2 == NULL)
385     {
386         DBG_SIF(printf("%s() : invalid g_AudioVars2!\n", __FUNCTION__));
387         return;
388     }
389 
390 #if (SIF_DSP_TYPE == 0)
391     g_AudioVars2->g_DspCodeType = dspCodeType;
392 #else
393     g_AudioVars2->g_Dsp2CodeType = dspCodeType;
394 #endif
395 
396     return;
397 }
398 
399 ////////////////////////////////////////////////////////////////////////////////
400 /// @brief \b Function \b Name: HAL_SIF_GetDspCodeType()
401 /// @brief \b Function \b Description:  This function is used to set the DSP code type SIF module used.
402 /// @param <IN>        \b NONE    :
403 /// @param <OUT>       \b NONE    :
404 /// @param <RET>       \b MS_U8: SIF DSP code type.
405 /// @param <GLOBAL>    \b NONE    :
406 ////////////////////////////////////////////////////////////////////////////////
HAL_SIF_GetDspCodeType(void)407 AUDIO_DSP_CODE_TYPE HAL_SIF_GetDspCodeType(void)
408 {
409     if (g_AudioVars2 == NULL)
410     {
411         DBG_SIF(printf("%s() : invalid g_AudioVars2!\n", __FUNCTION__));
412         return AU_DVB_STANDARD_INVALID;
413     }
414 
415 #if (SIF_DSP_TYPE == 0)
416     return g_AudioVars2->g_DspCodeType;
417 #else
418     return g_AudioVars2->g_Dsp2CodeType;
419 #endif
420 }
421 
422 ////////////////////////////////////////////////////////////////////////////////
423 /// @brief \b Function \b Name  : HAL_SIF_SetSoundMode
424 /// @brief \b Function \b Description : This routine is to set the sound mode for SIF module.
425 /// @param <IN>        \b u8Type  : u8Mode_u8Type
426 /// @param <OUT>       \b NONE  :
427 /// @param <RET>       \b NONE  :
428 /// @param <GLOBAL>    \b NONE  :
429 ////////////////////////////////////////////////////////////////////////////////
HAL_SIF_SetSoundMode(AUDIO_SIF_SOUND_MODE u8Mode_Type)430 MS_BOOL HAL_SIF_SetSoundMode(AUDIO_SIF_SOUND_MODE u8Mode_Type)
431 {
432     MS_U8 is_auto, is_auto_mute;
433     DBG_SIF(printf("HAL_SIF_SetSoundMode(mode=%bx)\r\n", u8Mode_Type));
434 
435     if (gAutoMute==TRUE)
436         is_auto_mute = 0x80;
437     else
438         is_auto_mute = 0x00;
439 
440     if (gAutoSoundmode==TRUE)
441         is_auto = 0x80;
442     else
443         is_auto = 0x00;
444 
445     switch (u8Mode_Type)
446     {
447         case AU_MODE_MONO:
448             if ((HAL_SIF_GetDspCodeType()) == AU_SIF_BTSC)
449             {
450                 HAL_AUDIO_WriteByte(AU_CMD_MODE1, 0x00|is_auto_mute);
451             }
452             else if ((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM)
453             {
454                 if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_MONO)
455                 {
456                     HAL_AUDIO_WriteByte(AU_CMD_MODE1, 0x00|is_auto_mute);
457                 }
458                 else if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_A2)
459                 {
460                     HAL_AUDIO_WriteByte(AU_CMD_MODE1, 0x00|is_auto_mute);
461                 }
462                 else if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_NICAM)
463                 {
464                     HAL_AUDIO_WriteByte(AU_CMD_MODE2, 0x01);
465                     HAL_AUDIO_WriteByte(AU_CMD_MODE1, 0x00|is_auto_mute);
466                 }
467             }
468             else if ((HAL_SIF_GetDspCodeType()) == AU_SIF_EIAJ)
469             {
470                 HAL_AUDIO_WriteByte(AU_CMD_MODE1, 0x00|is_auto_mute);
471             }
472             else
473             {
474                 DBG_SIF(printf("\r\n set sound mode error1!! \r\n"));
475                 return FALSE;
476             }
477             break;
478 
479         case AU_MODE_STEREO:
480             if ((HAL_SIF_GetDspCodeType()) == AU_SIF_BTSC)
481             {
482                 HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x01|is_auto);
483             }
484             else if ((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM)
485             {
486                 if((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_A2)
487                 {
488                     HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x01|is_auto);
489                 }
490                 else if((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_NICAM)
491                 {
492                     HAL_AUDIO_WriteByte(AU_CMD_MODE2,  0x02);
493                 }
494             }
495             else if((HAL_SIF_GetDspCodeType()) == AU_SIF_EIAJ)
496             {
497                 HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x01|is_auto);
498             }
499             else
500             {
501                 DBG_SIF(printf("\r\n set sound mode error2!! \r\n"));
502                 return FALSE;
503             }
504             break;
505 
506         case AU_MODE_SAP:
507             if ((HAL_SIF_GetDspCodeType()) == AU_SIF_BTSC)
508             {
509                 HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x02|is_auto);
510             }
511             else if ((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM)
512             {
513                 if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_A2)
514                     HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x02|is_auto);
515             }
516             else if((HAL_SIF_GetDspCodeType()) == AU_SIF_EIAJ)
517             {
518                 HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x02|is_auto);
519             }
520             else
521             {
522                 DBG_SIF(printf("\r\n set sound mode error3!! \r\n"));
523                 return FALSE;
524             }
525             break;
526 
527         case AU_MODE_LANG_A:
528             if ((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM)
529             {
530                 if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_A2)
531                 {
532                     HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x00|is_auto);
533                 }
534                 else if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_NICAM)
535                 {
536                     HAL_AUDIO_WriteByte(AU_CMD_MODE2,  0x06);
537                 }
538             }
539             else
540             {
541                 DBG_SIF(printf("\r\n set sound mode error4!! \r\n"));
542                 return FALSE;
543             }
544             break;
545 
546         case AU_MODE_LANG_B:
547             if ((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM)
548             {
549                 if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_A2 )
550                 {
551                     HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x02|is_auto);
552                 }
553                 else if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_NICAM )
554                 {
555                     HAL_AUDIO_WriteByte(AU_CMD_MODE2,  0x07);
556                 }
557             }
558             else
559             {
560                 DBG_SIF(printf("\r\n set sound mode error5!! \r\n"));
561                 return FALSE;
562             }
563             break;
564 
565         case AU_MODE_LANG_AB:
566             if ((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM)
567             {
568                 if ((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_A2 )
569                 {
570                     HAL_AUDIO_WriteByte(AU_CMD_MODE1,  0x03|is_auto);
571                 }
572                 else if((HAL_AUDIO_ReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_NICAM )
573                 {
574                     HAL_AUDIO_WriteByte(AU_CMD_MODE2,  0x05);
575                 }
576             }
577             else
578             {
579                 DBG_SIF(printf("\r\n set sound mode error6!! \r\n"));
580                 return FALSE;
581             }
582             break;
583 
584         case AU_MODE_NICAM_MONO:
585             if (((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM) && ((HAL_AUDIO_DecReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_NICAM))
586             {
587                 HAL_AUDIO_WriteByte(AU_CMD_MODE2, 0x08);
588             }
589             else
590             {
591                 DBG_SIF(printf("\r\n set sound mode error7!! \r\n"));
592                 return FALSE;
593             }
594             break;
595 
596         case AU_MODE_FORCE_NICAM:
597             if (((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM) && ((HAL_AUDIO_DecReadByte(AU_CMD_STANDARD)&0xF0) == SIF_MODE_NICAM))
598             {
599                 HAL_AUDIO_WriteByte(AU_CMD_MODE2, 0x80);
600             }
601             else
602             {
603                 DBG_SIF(printf("\r\n set sound mode error8!! \r\n"));
604                 return FALSE;
605             }
606             break;
607 
608         default:
609             break;
610     }
611 
612     return TRUE;
613 }
614 
615 ////////////////////////////////////////////////////////////////////////////////
616 /// @brief \b Function \b Name  : HAL_SIF_StartAutoDetect
617 /// @brief \b Function \b Description : This routine is to start to detect the sound system for SIF Palsum module.
618 /// @param <IN>        \b NONE  :
619 /// @param <OUT>       \b NONE  :
620 /// @param <RET>       \b NONE  :
621 /// @param <GLOBAL>    \b NONE  :
622 ////////////////////////////////////////////////////////////////////////////////
HAL_SIF_StartAutoDetect(void)623 MS_BOOL HAL_SIF_StartAutoDetect(void)
624 {
625     if ((HAL_SIF_GetDspCodeType()) != AU_SIF_PALSUM)
626         return FALSE;
627 
628     HAL_AUDIO_WriteMaskByte(AU_CMD_STANDARD,0xFF,0x00);
629     AUDIO_DELAY1MS(1);
630     if (bHiDev_Flag==0)
631     {
632         HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x30, 0x00);
633         if(bDetect_Main_Std_Only_Flag == 0)
634             HAL_AUDIO_WriteByte(AU_CMD_STANDARD, 0xE0);
635         else
636             HAL_AUDIO_WriteByte(AU_CMD_STANDARD, 0xC0);
637     }
638     else
639     {
640         HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x30, 0x10);
641         if(bDetect_Main_Std_Only_Flag == 0)
642             HAL_AUDIO_WriteByte(AU_CMD_STANDARD, 0xF0);
643         else
644             HAL_AUDIO_WriteByte(AU_CMD_STANDARD, 0xD0);
645     }
646     return TRUE;
647 }
648 
649 ////////////////////////////////////////////////////////////////////////////////
650 /// @brief \b Function \b Name  : HAL_SIF_SendCmd
651 /// @brief \b Function \b Description : This routine is to send command to SIF module to do corresponding action.
652 /// @param <IN>        \b AU_SIF_CMD : u8DecCmd, MS_U8 : comm_arg1, MS_U8 : comm_arg2
653 /// @param <OUT>       \b NONE  :
654 /// @param <RET>       \b MS_U8 :
655 /// @param <GLOBAL>    \b NONE  :
656 ////////////////////////////////////////////////////////////////////////////////
HAL_SIF_SendCmd(AU_SIF_CMD u8DecCmd,MS_U8 comm_arg1,MS_U8 comm_arg2)657 MS_U8 HAL_SIF_SendCmd(AU_SIF_CMD u8DecCmd, MS_U8 comm_arg1, MS_U8 comm_arg2)
658 {
659     MS_U8 SifDspType;
660     MS_U8 u8OrigDecCmd = 0;
661     MS_U8 u8Return = 0;
662     MS_U16 u16cmd = 0;
663 
664     switch( u8DecCmd )
665     {
666         case AU_SIF_CMD_SET_STOP:
667         case AU_SIF_CMD_SET_PLAY:
668             SifDspType = HAL_SIF_GetDspType();
669             if (SifDspType == DSP_DEC) {
670                 u8OrigDecCmd = HAL_MAD_GetDecCmd(DVB_Audio_Decoder1);
671                 HAL_MAD_SetDecCmd((AU_DVB_DECCMD)(u8DecCmd|(u8OrigDecCmd&0xFE)));
672             }
673             else if (SifDspType == DSP_SE) {
674                 u8OrigDecCmd = HAL_MAD2_GetDecCmd();
675                 u16cmd = (u8DecCmd|(u8OrigDecCmd&0xFE)) + 0x100;
676                 HAL_MAD2_SetDecCmd((AU_DVB_DECCMD)u16cmd);
677             }
678             break;
679 
680         case AU_SIF_CMD_ENABLE_HIDEV:
681             bHiDev_Flag = (MS_BOOL)comm_arg1;
682 
683             if ((HAL_SIF_GetDspCodeType()) != AU_SIF_PALSUM)
684                 break;
685 
686             u8Return = HAL_AUDIO_ReadReg(AU_CMD_STANDARD);
687             if((u8Return&0xF0)<=SIF_MODE_HIDEV)
688             {
689                 u8Return = u8Return & 0x0F;
690                 if(bHiDev_Flag)
691                 {
692                     HAL_AUDIO_WriteByte(AU_CMD_STANDARD, u8Return|SIF_MODE_HIDEV);
693                     HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x01, 0x01);  //Reset FC tracking
694                     AUDIO_DELAY1MS(5);
695                     HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x01, 0x00);
696                     HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x02, 0x02);  //Enable FC tracking
697                     AUDIO_DELAY1MS(1);
698                 }
699                 else
700                 {
701                     HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x02, 0x00);  //Disable FC tracking
702                     AUDIO_DELAY1MS(1);
703                     HAL_AUDIO_WriteByte(AU_CMD_STANDARD, u8Return|SIF_MODE_MONO);
704                 }
705             }
706             break;
707 
708         case AU_SIF_CMD_SET_HIDEV_FILTER_BW_LEVEL:
709             hidev_filter_bandwidth_level= comm_arg1;
710             HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x30, hidev_filter_bandwidth_level);
711             break;
712 
713         case AU_SIF_CMD_RESET_FC_TRACKING:
714             if ((HAL_SIF_GetDspCodeType()) != AU_SIF_PALSUM)
715                 break;
716 
717             HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x01, 0x01);
718             AUDIO_DELAY1MS(5);
719             HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x01, 0x00);
720             break;
721 
722         case AU_SIF_CMD_ENABLE_FC_TRACKING:
723             if ((HAL_SIF_GetDspCodeType()) != AU_SIF_PALSUM)
724                 break;
725 
726             if ((MS_BOOL)comm_arg1 == TRUE) {
727                 HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x02, 0x02);
728                 AUDIO_DELAY1MS(1);
729             }
730             else {
731                 HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x02, 0x00);
732                 AUDIO_DELAY1MS(1);
733             }
734             break;
735 
736         case AU_SIF_CMD_SET_ADC_FROM_VIF_PATH:
737             if (bADCFromVifPathSupported == TRUE) {
738                 if ((MS_BOOL)comm_arg1 == TRUE) {
739                     if (bADCFromVifPathEnabled == FALSE) {
740                         //HAL_AUDIO_AbsWriteMaskByte(0x112CC9, 0x10, 0x10); //  enable VIF
741                         bADCFromVifPathEnabled = TRUE;
742                         sif_clock = AUD_SIF_43M;
743                     }
744                 }
745                 else {
746                     if (bADCFromVifPathEnabled == TRUE) {
747                         //HAL_AUDIO_AbsWriteMaskByte(0x112CC9, 0x10, 0x00); //  disalbe VIF
748                         bADCFromVifPathEnabled = FALSE;
749                         sif_clock = AUD_SIF_48M;
750                     }
751                 }
752             }
753             break;
754 
755         case AU_SIF_CMD_SET_SIFFIFO_MODE:
756             // 2-stage or 4-stage SIF FIFO Mode.
757             break;
758 
759         case AU_SIF_CMD_ENABLE_CHANNEL:
760             if ((MS_BOOL)comm_arg1 == TRUE)
761             {
762                 if (HAL_SIF_SendCmd(AU_SIF_CMD_GET_ADC_FROM_VIF_PATH, 0, 0) == TRUE) // VIF mode
763                 {
764                     HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x70, 0x00);
765 
766                     if (sif_clock == AUD_SIF_42M)
767                     {
768                         HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x30, 0x20); // SIF CLK: 42MHZ
769                     }
770                     else if (sif_clock == AUD_SIF_43M)
771                     {
772                         HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x30, 0x00); // SIF CLK: 43MHZ
773                     }
774                     else if (sif_clock == AUD_SIF_44M)
775                     {
776                         HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x30, 0x30); // SIF CLK: 44MHZ
777                     }
778                 }
779                 else // SIF mode
780                 {
781                     HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x70, 0x40); // SIF CLK: 48MHZ
782                 }
783             }
784             break;
785 
786         case AU_SIF_CMD_ENABLE_AUTO_MUTE:
787             gAutoMute= (MS_BOOL)comm_arg1;
788             HAL_AUDIO_WriteMaskByte(AU_CMD_MODE1, 0x80, ((MS_U8)gAutoMute<<7));
789             break;
790 
791         case AU_SIF_CMD_ENABLE_AUTO_SOUNDMODE:
792             gAutoSoundmode= (MS_BOOL)comm_arg1;
793             break;
794 
795         case AU_SIF_CMD_ENABLE_BEEPER_FUNCTION:
796             beeper_enable = (MS_BOOL)comm_arg1;
797             if(beeper_enable)
798                 HAL_AUDIO_WriteMaskByte(AU_CMD_TONE, 0x80, 0x80);
799             else
800                 HAL_AUDIO_WriteMaskByte(AU_CMD_TONE, 0x80, 0x00);
801 
802             break;
803 
804         case AU_SIF_CMD_SET_BEEPER_TONE:
805             // tone = comm_arg1;
806             // volume = comm_arg2;
807             ///////////////////////////////////////////////////////////////////////////////////
808             //Volume control.
809             //Gain setting = 0db _ VOL*L0 dB (0db ~ -114db)
810             //VOL = 0 ~ 11 (+12~+1db)
811             //VOL = 12 (0db)
812             //VOL = 13 ~ 126 (-1 ~ -114db)
813             //VOL = 127, mute
814             ///////////////////////////////////////////////////////////////////////////////////
815             //REG_2D2E[6:0]: beeper tone frequency (maximum 32 step(4KHz))
816             //0x01: 125Hz
817             //0x02: 250Hz
818             //...
819             //0x08: 1kHz
820             //...
821             //0x11: 2kHz
822             //...
823             //0x19: 3kHz
824             //...
825             //0x21: 4kHz
826             ///////////////////////////////////////////////////////////////////////////////////
827             HAL_AUDIO_WriteMaskByte(AU_CMD_TONE, 0x7F, comm_arg1);
828             break;
829 
830         case AU_SIF_CMD_SET_STD:
831             HAL_AUDIO_WriteMaskByte(AU_CMD_STANDARD, 0x0f, comm_arg1);
832             break;
833 
834         case AU_SIF_CMD_SET_SUB_CARRIER_STD:
835             HAL_AUDIO_WriteByte(AU_CMD_STANDARD, comm_arg1);
836             break;
837 
838         case AU_SIF_CMD_SET_CARRIER_DEBOUNCE:
839             HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x80, comm_arg1);
840             break;
841 
842         case AU_SIF_CMD_ENABLE_SIF_SYNTHESIZER:
843             HAL_AUDIO_WriteMaskByte(REG_AUDIO_INPUT_CFG , 0x04, comm_arg2);
844             break;
845 #if 1
846         case AU_SIF_CMD_ENABLE_AGC:
847             if ((MS_BOOL)comm_arg1 == TRUE) {
848                 HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x01, 0x01);
849                 AUDIO_DELAY1MS(3);
850             }
851             else {
852                 HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x01, 0x00);
853                 AUDIO_DELAY1MS(3);
854             }
855             break;
856 
857         case AU_SIF_CMD_RESET_AGC:
858             HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x02, 0x02);
859             AUDIO_DELAY1MS(3);
860             HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x02, 0x00);
861             AUDIO_DELAY1MS(3);
862             break;
863 
864         case AU_SIF_CMD_STANDARD_RESET:
865             HAL_AUDIO_WriteByte(AU_CMD_STANDARD, 0x00);  //Clear SIF Carrier1 bit
866             HAL_AUDIO_WriteMaskByte(AU_CMD_PFIRBANDWIDTH, 0x02, 0x00);  //Disable FC tracking
867             AUDIO_DELAY1MS(10);
868             break;
869 #endif
870         case AU_SIF_CMD_DK123_MONITOR:
871             if ((MS_BOOL)comm_arg1 == TRUE) {
872                 HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x08, 0x08);
873                 AUDIO_DELAY1MS(3);
874             }
875             else {
876                 HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x08, 0x00);
877                 AUDIO_DELAY1MS(3);
878             }
879             break;
880 
881         case AU_SIF_CMD_DETECT_MAIN_STD_ONLY:
882             bDetect_Main_Std_Only_Flag = (MS_BOOL)comm_arg1;
883             break;
884 
885         // GET INFO
886         case AU_SIF_CMD_GET_HIDEV_ENABLE:
887             u8Return = (MS_U8)bHiDev_Flag;
888             break;
889 
890         case AU_SIF_CMD_GET_HIDEV_FILTER_BW_LEVEL:
891             u8Return = (MS_U8)hidev_filter_bandwidth_level;
892             break;
893 
894         case AU_SIF_CMD_GET_ADC_FROM_VIF_PATH:
895             u8Return = (MS_U8)bADCFromVifPathEnabled;
896             break;
897 
898         case AU_SIF_CMD_GET_FM_A2_MODE_STATUS:
899             if ((HAL_SIF_GetDspCodeType()) != AU_SIF_PALSUM)
900             {
901                 DBG_SIF(printf("DSP type not palsum\n"));
902                 break;
903             }
904             u8Return = HAL_AUDIO_ReadReg(AU_STATUS_MODE1);
905             break;
906 
907         case AU_SIF_CMD_GET_BTSC_MODE_STATUS:
908             if ((HAL_SIF_GetDspCodeType()) != AU_SIF_BTSC) {
909                 DBG_SIF(printf("DSP type not btsc\n"));
910                 break;
911             }
912             u8Return = HAL_AUDIO_ReadReg(AU_STATUS_MODE1);
913             break;
914 
915         case AU_SIF_CMD_GET_NICAM_MODE_STATUS:
916             if ((HAL_SIF_GetDspCodeType()) != AU_SIF_PALSUM)
917             {
918                 DBG_SIF(printf("DSP type not palsum\n"));
919                 break;
920             }
921             u8Return = HAL_AUDIO_ReadReg(AU_STATUS_MODE2);
922             break;
923 
924         case AU_SIF_CMD_GET_STANDARD_STATUS:
925             if ((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM)
926             {
927                 u8Return = HAL_AUDIO_ReadReg(AU_STATUS_STANDARD);
928             }
929             else if ((HAL_SIF_GetDspCodeType()) == AU_SIF_BTSC)
930             {
931                 u8Return = AU_SYS_M_BTSC;
932             }
933             else
934             {
935                 DBG_SIF(printf("DSP type not SIF \n"));
936                 return FALSE;
937             }
938             break;
939         case AU_SIF_CMD_GET_STANDARD_CMD:
940             u8Return = HAL_AUDIO_ReadReg(AU_CMD_STANDARD);
941             break;
942 
943         case AU_SIF_CMD_GET_NSR_CMD:
944             HAL_AUDIO_WriteMaskByte(AU_CMD_DBG_CMD, 0xFF, 0x3C);
945             HAL_AUDIO_WriteMaskByte(AU_CMD_DBG_DATA_H, 0xFF, 0x00);
946             HAL_AUDIO_WriteMaskByte(AU_CMD_DBG_DATA_M, 0xFF, 0x00);
947             HAL_AUDIO_WriteMaskByte(AU_CMD_DBG_DATA_L, 0xFF, 0x00);
948             u8Return = HAL_AUDIO_ReadReg(AU_STATUS_DBG_H);
949             break;
950 
951         case AU_SIF_CMD_GET_AMP_CMD:
952             HAL_AUDIO_WriteMaskByte(AU_CMD_DBG_CMD, 0xFF, 0x30);
953             u8Return = HAL_AUDIO_ReadReg(AU_STATUS_DBG_H);
954             u8Return = HAL_AUDIO_ReadReg(AU_STATUS_DBG_M);
955             break;
956 
957         case AU_SIF_CMD_GET_VIF_PATCH_ENABLE:
958             u8Return = (MS_U8)vif_patch_flag;
959             break;
960 
961         case AU_SIF_CMD_SET_SIF_SHIFT_CLK:
962             if (HAL_SIF_SendCmd(AU_SIF_CMD_GET_ADC_FROM_VIF_PATH, 0, 0) == TRUE) // VIF mode
963             {
964                 HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x70, 0x00);
965 
966                 if (comm_arg1 == 0x00)
967                 {
968                     sif_clock = AUD_SIF_42M;
969                     HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x30, 0x20); // SIF CLK: 42MHZ
970                 }
971                 else if (comm_arg1 == 0x01)
972                 {
973                     sif_clock = AUD_SIF_43M;
974                     HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x30, 0x00); // SIF CLK: 43MHZ
975                 }
976                 else if (comm_arg1 == 0x02)
977                 {
978                     sif_clock = AUD_SIF_44M;
979                     HAL_AUDIO_WriteMaskByte(AU_CMD_AGC, 0x30, 0x30); // SIF CLK: 44MHZ
980                 }
981                 HAL_SIF_SetSystem(sifDspCodeType);
982             }
983             break;
984         case AU_SIF_CMD_FMTX_SET_PREEMP:
985             if ((MS_BOOL)comm_arg1 == TRUE)  // Pre-emphasis coefficient for NTSC
986                 HAL_AUDIO_WriteMaskByte(AU_CMD_STANDARD, 0x10, 0x10);
987             else // Pre-emphasis coefficient for PAL
988                 HAL_AUDIO_WriteMaskByte(AU_CMD_STANDARD, 0x10, 0x00);
989             break;
990 
991         case AU_SIF_CMD_SET_ENC_CMD:
992             if ((MS_BOOL)comm_arg1 == TRUE)  //enable data_IO for SIF_Enc
993                 HAL_AUDIO_WriteMaskByte(AU_CMD_STANDARD+1, 0x80, 0x80);
994             else //disable data_IO for SIF_Enc
995                 HAL_AUDIO_WriteMaskByte(AU_CMD_STANDARD+1, 0x80, 0x00);
996             break;
997 
998         case AU_SIF_CMD_SET_ENC_Input_attenuation:
999             HAL_MAD2_Write_DSP_Xbox(DSP2XboxAddr_ATVEnc_input_attenuation_ADDR,  ((comm_arg1&0xFF)<<16)+((comm_arg2&0xFF)<<8));
1000             break;
1001 
1002         case AU_SIF_CMD_SET_ENC_Output_scaling:
1003             HAL_MAD2_Write_DSP_Xbox(DSP2XboxAddr_ATVEnc_output_scaling_ADDR,  ((comm_arg1&0xFF)<<16)+((comm_arg2&0xFF)<<8));
1004             break;
1005 
1006         case AU_SIF_CMD_SET_BTSC_Enc_M_Gain:
1007             HAL_MAD2_Write_DSP_Xbox(DSP2XboxAddr_BTSCEnc_output_M_gain_ADDR,  ((comm_arg1&0xFF)<<16)+((comm_arg2&0xFF)<<8));
1008             break;
1009 
1010         case AU_SIF_CMD_SET_BTSC_Enc_D_Gain:
1011             HAL_MAD2_Write_DSP_Xbox(DSP2XboxAddr_BTSCEnc_output_D_gain_ADDR,  ((comm_arg1&0xFF)<<16)+((comm_arg2&0xFF)<<8));
1012             break;
1013 
1014         case AU_SIF_CMD_SET_BTSC_Enc_SAP_Gain:
1015             HAL_MAD2_Write_DSP_Xbox(DSP2XboxAddr_BTSCEnc_output_SAP_gain_ADDR,  ((comm_arg1&0xFF)<<16)+((comm_arg2&0xFF)<<8));
1016             break;
1017         default:
1018             break;
1019     }
1020     return u8Return;
1021 }
1022 
HAL_SIF_AccessThreshold(AUDIO_SIF_SYSTEM_TYPE rw_standard_type,AUDIO_SIF_THRESHOLD_TYPE u8Threshold_type,MS_U16 u16Value)1023 MS_U32 HAL_SIF_AccessThreshold(AUDIO_SIF_SYSTEM_TYPE rw_standard_type, AUDIO_SIF_THRESHOLD_TYPE  u8Threshold_type, MS_U16 u16Value)
1024 {
1025     MS_BOOL  writethd;
1026     MS_U16 standard_type;
1027 
1028     writethd = HINIBBLE(rw_standard_type) ;
1029     standard_type = LONIBBLE(rw_standard_type) ;
1030 
1031     if (((HAL_SIF_GetDspCodeType()) == AU_SIF_PALSUM) &&( standard_type >= BTSC_STANDARD))
1032         return FALSE;
1033     else if(((HAL_SIF_GetDspCodeType()) == AU_SIF_BTSC) &&( standard_type != BTSC_STANDARD))
1034         return FALSE;
1035 
1036     if (u16Value > 0x7fff)
1037     {
1038         DBG_SIF(printf("Threshold value is too large\n"));
1039         return FALSE;
1040     }
1041 
1042     if (writethd)
1043     {
1044         if (HAL_SIF_GetDspType() == DSP_DEC)
1045             HAL_MAD_Write_DSP_sram(au_pal_sys_threshold[standard_type]+u8Threshold_type,((MS_U32)u16Value)<<8, DSP_MEM_TYPE_PM);
1046         else if (HAL_SIF_GetDspType() == DSP_SE)
1047             HAL_MAD2_Write_DSP_Xbox(au_pal_sys_threshold[standard_type]+u8Threshold_type,((MS_U32)u16Value)<<8);
1048         return TRUE;
1049     }
1050     else
1051     {
1052         if (HAL_SIF_GetDspType() == DSP_DEC)
1053             return (HAL_MAD_Read_DSP_sram((au_pal_sys_threshold[standard_type]+u8Threshold_type),DSP_MEM_TYPE_PM));
1054         else // if (HAL_SIF_GetDspType() == DSP_SE)
1055             return (HAL_MAD2_Read_DSP_Xbox(au_pal_sys_threshold[standard_type]+u8Threshold_type));
1056     }
1057 }
1058 
HAL_SIF_GetOrginalGain(void)1059 MS_BOOL HAL_SIF_GetOrginalGain(void)
1060 {
1061     MS_U8  i;
1062 
1063     if (g_AudioVars2 == NULL)
1064     {
1065         DBG_SIF(printf("%s() : invalid g_AudioVars2!\n", __FUNCTION__));
1066         return FALSE;
1067     }
1068 
1069     if ((HAL_SIF_GetDspCodeType())== AU_SIF_BTSC)
1070     {
1071         for(i = 0; i< sizeof(SIF_PM_GAIN_TBL_BTSC)/(sizeof(MS_U16)*2); i++)
1072         {
1073             if (HAL_SIF_GetDspType() == DSP_DEC) {
1074                 g_AudioVars2->sif_gain_0[i] = (HAL_MAD_Read_DSP_sram (SIF_PM_GAIN_TBL_BTSC[i][0],DSP_MEM_TYPE_PM) >> 8);
1075                 g_AudioVars2->sif_shift_0[i] = HAL_MAD_Read_DSP_sram (SIF_PM_GAIN_TBL_BTSC[i][1],DSP_MEM_TYPE_PM);
1076             }
1077             else if (HAL_SIF_GetDspType() == DSP_SE) {
1078                 g_AudioVars2->sif_gain_0[i] = (HAL_MAD2_Read_DSP_Xbox (SIF_PM_GAIN_TBL_BTSC[i][0]) >> 8);
1079                 g_AudioVars2->sif_shift_0[i] = HAL_MAD2_Read_DSP_Xbox (SIF_PM_GAIN_TBL_BTSC[i][1]);
1080             }
1081         }
1082     }
1083     else if ((HAL_SIF_GetDspCodeType())== AU_SIF_PALSUM)
1084     {
1085         for(i = 0; i< sizeof(SIF_PM_GAIN_TBL_PAL)/(sizeof(MS_U16)*2); i++)
1086         {
1087             if (HAL_SIF_GetDspType() == DSP_DEC) {
1088                 g_AudioVars2->sif_gain_0[i] = (HAL_MAD_Read_DSP_sram (SIF_PM_GAIN_TBL_PAL[i][0],DSP_MEM_TYPE_PM) >> 8);
1089                 g_AudioVars2->sif_shift_0[i] = HAL_MAD_Read_DSP_sram (SIF_PM_GAIN_TBL_PAL[i][1],DSP_MEM_TYPE_PM);
1090             }
1091             else if (HAL_SIF_GetDspType() == DSP_SE) {
1092                 g_AudioVars2->sif_gain_0[i] = (HAL_MAD2_Read_DSP_Xbox (SIF_PM_GAIN_TBL_PAL[i][0]) >> 8);
1093                 g_AudioVars2->sif_shift_0[i] = HAL_MAD2_Read_DSP_Xbox (SIF_PM_GAIN_TBL_PAL[i][1]);
1094             }
1095         }
1096     }
1097     else if ((HAL_SIF_GetDspCodeType())== AU_SIF_EIAJ)
1098     {
1099     }
1100     else
1101     {
1102         DBG_SIF(printf("\r\n get original gain DSP type error!! \r\n"));
1103         return FALSE;
1104     }
1105     return TRUE;
1106 }
1107 
HAL_SIF_SetPrescale(MS_U8 u8Type,int db_value)1108 MS_BOOL HAL_SIF_SetPrescale(MS_U8 u8Type,int db_value)
1109 {
1110     MS_U8  i, i_min, i_max;
1111     MS_U8 u8DspCodeType;
1112     int  normalized_db;
1113     MS_U16 sif_shift, sif_gain, shift_value;
1114     MS_U32 gain;
1115 
1116     u8DspCodeType=HAL_SIF_GetDspCodeType();
1117     if (db_value == 99)
1118     {
1119         if (u8DspCodeType == AU_SIF_BTSC)
1120         {
1121             if (HAL_SIF_GetDspType() == DSP_DEC) {
1122                 HAL_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_BTSC[u8Type][0],0, DSP_MEM_TYPE_PM);
1123                 HAL_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_BTSC[u8Type][1],0, DSP_MEM_TYPE_PM);
1124             }
1125             else if (HAL_SIF_GetDspType() == DSP_SE) {
1126                 HAL_MAD2_Write_DSP_Xbox(SIF_PM_GAIN_TBL_BTSC[u8Type][0],0);
1127                 HAL_MAD2_Write_DSP_Xbox(SIF_PM_GAIN_TBL_BTSC[u8Type][1],0);
1128             }
1129         }
1130         else if (u8DspCodeType == AU_SIF_PALSUM)
1131         {
1132             if (HAL_SIF_GetDspType() == DSP_DEC) {
1133                 HAL_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_PAL[u8Type][0],0, DSP_MEM_TYPE_PM);
1134                 HAL_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_PAL[u8Type][1],0, DSP_MEM_TYPE_PM);
1135             }
1136             else if (HAL_SIF_GetDspType() == DSP_SE) {
1137                 HAL_MAD2_Write_DSP_Xbox(SIF_PM_GAIN_TBL_PAL[u8Type][0],0);
1138                 HAL_MAD2_Write_DSP_Xbox(SIF_PM_GAIN_TBL_PAL[u8Type][1],0);
1139             }
1140         }
1141         else if (u8DspCodeType == AU_SIF_EIAJ)
1142         {
1143             //MDrv_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_EIAJ[u8Type][0],0, PM);
1144             //MDrv_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_EIAJ[u8Type][1],0, PM);
1145         }
1146         else
1147         {
1148             DBG_SIF(printf("\r\n set prescale DSP type error!! %x \r\n",u8DspCodeType));
1149             return FALSE;
1150         }
1151         return TRUE;
1152     }
1153 
1154     if (g_AudioVars2 != NULL)
1155     {
1156         sif_gain = g_AudioVars2->sif_gain_0[u8Type];
1157         sif_shift = g_AudioVars2->sif_shift_0[u8Type];
1158     }
1159     else
1160     {
1161         sif_gain = 0x7FFF;
1162         sif_shift = 0x0000;
1163     }
1164     //printf("\r\n dB_value *4 is %d  \r\n ",(MS_U16)db_value);
1165     //printf("\r\n original_sif_gain is %x",(MS_U16)g_AudioVars2->sif_gain);
1166     //printf("\r\n original_sif_shift is %x",(MS_U16)g_AudioVars2->sif_shift);
1167 
1168     //read user DB setting
1169     i_min = 8/PRESCALE_STEP_ONE_DB-1;
1170     i_max = sizeof(PRESCALE_STEP_TBL)/sizeof(MS_U16);
1171     //caculate new gain & shift
1172     if(db_value>(18*PRESCALE_STEP_ONE_DB))
1173     {
1174         shift_value = 5;// 3;
1175         db_value = 0;
1176     }
1177     else if (db_value > (12*PRESCALE_STEP_ONE_DB))
1178     {
1179         shift_value = 5;// 3;
1180         db_value = db_value - (18*PRESCALE_STEP_ONE_DB);
1181     }
1182     else if (db_value > (6*PRESCALE_STEP_ONE_DB))
1183     {
1184         shift_value = 4;// 2;
1185         db_value = db_value - (12*PRESCALE_STEP_ONE_DB);
1186     }
1187     else if (db_value > 0 )
1188     {
1189         shift_value = 3;// 1;
1190         db_value = db_value - (6*PRESCALE_STEP_ONE_DB);
1191     }
1192     else if (db_value > (-6*PRESCALE_STEP_ONE_DB) )
1193     {
1194         shift_value = 2;//0;
1195     }
1196     else if (db_value > (-12*PRESCALE_STEP_ONE_DB) )
1197     {
1198         shift_value = 1;//-1;
1199         db_value = db_value + (6*PRESCALE_STEP_ONE_DB);
1200     }
1201     else
1202     {
1203         shift_value = 0;//-2;
1204         db_value = 0;
1205     }
1206     gain = 0x7FFF;
1207     normalized_db = -db_value;
1208 
1209     for(i=i_min;i<i_max;i++)
1210     {
1211         if(normalized_db & (1<<(i-i_min)))
1212         {
1213             gain = ((MS_U32)PRESCALE_STEP_TBL[i])*((MS_U32)gain);
1214             gain = gain>>15;
1215         }
1216     }
1217     // check for
1218     while ((sif_shift+shift_value) <2)
1219     {
1220         gain = (0x4000*gain);
1221         gain = gain>>15;
1222         shift_value++;
1223     }
1224 
1225     gain = (gain*((MS_U32)sif_gain))>>15;
1226     sif_gain = (MS_U16) gain;
1227     sif_shift = sif_shift+shift_value-2;
1228     //set new gain & shift to PM
1229     if (u8DspCodeType   == AU_SIF_BTSC)
1230     {
1231         if (HAL_SIF_GetDspType() == DSP_DEC) {
1232             HAL_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_BTSC[u8Type][0], (((MS_U32)sif_gain)<<8), DSP_MEM_TYPE_PM);
1233             HAL_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_BTSC[u8Type][1], (MS_U32)sif_shift, DSP_MEM_TYPE_PM);
1234         }
1235         else if (HAL_SIF_GetDspType() == DSP_SE) {
1236             HAL_MAD2_Write_DSP_Xbox(SIF_PM_GAIN_TBL_BTSC[u8Type][0], (((MS_U32)sif_gain)<<8));
1237             HAL_MAD2_Write_DSP_Xbox(SIF_PM_GAIN_TBL_BTSC[u8Type][1], (MS_U32)sif_shift);
1238         }
1239     }
1240     else if (u8DspCodeType == AU_SIF_PALSUM)
1241     {
1242         if (HAL_SIF_GetDspType() == DSP_DEC) {
1243             HAL_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_PAL[u8Type][0], (((MS_U32)sif_gain)<<8), DSP_MEM_TYPE_PM);
1244             HAL_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_PAL[u8Type][1], (MS_U32)sif_shift, DSP_MEM_TYPE_PM);
1245         }
1246         else if (HAL_SIF_GetDspType() == DSP_SE) {
1247             HAL_MAD2_Write_DSP_Xbox(SIF_PM_GAIN_TBL_PAL[u8Type][0], (((MS_U32)sif_gain)<<8));
1248             HAL_MAD2_Write_DSP_Xbox(SIF_PM_GAIN_TBL_PAL[u8Type][1], (MS_U32)sif_shift);
1249         }
1250     }
1251     else if (u8DspCodeType == AU_SIF_EIAJ)
1252     {
1253         //MDrv_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_EIAJ[u8Type][0],0, PM);
1254         //MDrv_MAD_Write_DSP_sram(SIF_PM_GAIN_TBL_EIAJ[u8Type][1],0, PM);
1255     }
1256     else
1257     {
1258          DBG_SIF(printf("\r\n set prescale DSP type error!! %x \r\n",u8DspCodeType));
1259          return FALSE;
1260     }
1261     return TRUE;
1262 }
1263 
HAL_SIF_ReLoadCode(AUDIO_DSP_CODE_TYPE dspCodeType)1264 MS_BOOL HAL_SIF_ReLoadCode(AUDIO_DSP_CODE_TYPE dspCodeType)
1265 {
1266     if ((HAL_SIF_GetDspCodeType())== dspCodeType)
1267             return TRUE;
1268 
1269     DBG_SIF(printf("MDrv_SIF_ReLoadCode(u8Type= SIF(%x))\r\n",dspCodeType));
1270 
1271     HAL_SIF_SendCmd(AU_SIF_CMD_ENABLE_CHANNEL, FALSE, NULL); // REset SIF
1272     HAL_SIF_SendCmd(AU_SIF_CMD_ENABLE_SIF_SYNTHESIZER, FALSE, 0x00); // disable SIF Audio sythesizer & disable DVB fix-sync mode
1273 
1274     if (HAL_SIF_GetDspType() == DSP_SE)
1275     {
1276         HAL_AUDIO_AbsWriteMaskByte(0x112CC9, 0x20, 0x20);   //0x112CC8[13] = 1 to IDMA port selection to SE DSP
1277 
1278         MsOS_DisableInterrupt(E_INT_FIQ_DEC_DSP2UP);
1279         // Reset MAD module
1280         HAL_MAD2_DisEn_MIUREQ();
1281         if(HAL_AUDIO_Alg2ReloadCode(dspCodeType) == TRUE)
1282         {
1283             HAL_SIF_SetDspCodeType(dspCodeType);
1284         }
1285         MsOS_EnableInterrupt(E_INT_FIQ_DEC_DSP2UP);
1286     }
1287 
1288     HAL_SIF_GetOrginalGain();
1289 
1290     HAL_SIF_SendCmd(AU_SIF_CMD_ENABLE_CHANNEL, TRUE, NULL);
1291     // Enable SIF Audio synthesizer here to prevent reload unstable noise.
1292     HAL_SIF_SendCmd(AU_SIF_CMD_ENABLE_SIF_SYNTHESIZER, TRUE, 0x04); // enable SIF Audio sythesizer
1293 
1294     if (dspCodeType == AU_SIF_PALSUM)
1295     {
1296         HAL_SIF_SendCmd(AU_SIF_CMD_SET_CARRIER_DEBOUNCE, 0x80, NULL);
1297         HAL_SIF_SendCmd(AU_SIF_CMD_ENABLE_AGC, TRUE, NULL);
1298         HAL_SIF_SendCmd(AU_SIF_CMD_DK123_MONITOR, TRUE, NULL);
1299     }
1300 
1301     HAL_SIF_SendCmd(AU_SIF_CMD_ENABLE_AUTO_MUTE, FALSE, NULL);
1302     HAL_SIF_SendCmd(AU_SIF_CMD_ENABLE_AUTO_SOUNDMODE, TRUE, NULL);
1303 
1304     return TRUE;
1305 }
1306 
HAL_SIF_SetSystem(AUDIO_DSP_CODE_TYPE dspCodeType)1307 MS_BOOL HAL_SIF_SetSystem(AUDIO_DSP_CODE_TYPE dspCodeType)
1308 {
1309     sifDspCodeType = dspCodeType;
1310     HAL_SIF_ReLoadCode(sifDspCodeType);
1311     HAL_SIF_TriggerSifPLL();
1312     HAL_SIF_SendCmd(AU_SIF_CMD_ENABLE_CHANNEL, TRUE, NULL);
1313     return TRUE;
1314 }
1315 
HAL_SIF_CheckDecSys(En_DVB_decSystemType enDecSystem)1316 MS_BOOL HAL_SIF_CheckDecSys(En_DVB_decSystemType enDecSystem)
1317 {
1318     AUDIO_DSP_CODE_TYPE dspCodeType1, dspCodeType2;
1319     dspCodeType1 = HAL_SIF_GetDspCodeType();
1320     dspCodeType2 = HAL_AUDIO_Convert_EnDVBdecSystemType_to_AudioDspCodeType(enDecSystem);
1321 
1322     if (dspCodeType1 == dspCodeType2)
1323         return TRUE;
1324     else
1325         return FALSE;
1326 }