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 }