source: svn/zas_dstar/hal/common/dsthalfe.c @ 22

Last change on this file since 22 was 22, checked in by phkim, 11 years ago
  1. phkim
  2. newcon3sk 를 kctv 로 브랜치 함
File size: 101.9 KB
Line 
1/****************************************************************************
2 *_Copyright (c) 2004 Digital Stream Technologies Inc.  All Rights Reserved.
3 *
4 * Module:      dsthalfe.cpp
5 * Author:              Jun-ku Park, hwatk@dstreamtech.com
6 * Description: DST HAL [Front End] Platform/Project Indepedent Sources
7 *
8 * notes: hwatk20050708
9 *
10 * TO DO LIST
11 *              - Implement BERT Functions.
12 *
13 ***************************************************************************/
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <errno.h>   
18#include <sys/stat.h>
19
20#include "dsthalcommon.h"
21#include "dstdddtv.h"
22#include "dstddaud.h"
23#include "dstddfe.h"
24#include "dstddsys.h"
25
26#ifdef DMALLOC
27#include <dmalloc.h>
28#endif
29
30/******************************************************************************
31 * Global variable declaration
32 ******************************************************************************/
33DST_FE sDSTFE_Tuner[TUNER_MAX-1] = { {0}, {0} };
34int gdhlFeDbgLvl = 2;
35int g_AnalogSearchDelay = 1000;
36int g_PreAudioModeDelay = 200;
37int g_AftAudioModeDelay = 200;
38
39/******************************************************************************
40 * Imported variable declaration
41 ******************************************************************************/
42extern DHL_DTV_CONFIG   g_dhlav;
43extern DHL_CAP_CONFIG   g_dhlcap;
44extern DHL_CAP_VideoTiming_t PrevVideoTiming, PrevVideoTimingPIP;
45
46/******************************************************************************
47 * Imported function declaration
48 ******************************************************************************/
49
50
51/******************************************************************************
52 * Local definitions and typedefs
53 ******************************************************************************/
54#define USE_NTSCCALLBACK                        1               // NTSC Call Back »ç¿ë ¿©ºÎ
55#define USE_DIGITAL_CALLBACK            0               // Digital Callback »ç¿ë ¿©ºÎ
56#define USE_ANALOGLOCKSTATUS            0
57#define MDELAY(x)                       OS_mDelay((x))
58#define USE_IN_KHZ                      0               // Frequency TableÀ» KHz ´ÜÀ§·Î »ç¿ëÇÒ °ÍÀÎÁö
59                                                                        // MHz ´ÜÀ§·Î »ç¿ëÇÒ °ÍÀÎÁö ¿©ºÎ
60
61/******************************************************************************
62 * Local variables declaration
63 ******************************************************************************/
64int g_fe_debug = 0;
65int g_force_ss = 0;
66int g_test_weak_interval = 0;
67
68/******************************************************************************
69 * Local function prototypes
70 ******************************************************************************/
71#if USE_NTSCCALLBACK
72static DHL_RESULT DHL_FE_NTSCCallbackInit(void);
73#endif
74void set_lock(int l);
75
76#if 0
77___Frequency_Table__________() {}
78#endif
79/* Frequency Conversion Table from HDMB - Tuner.c */
80#if USE_IN_KHZ  /* 2005.05.30 - Frequency Table ¼öÁ¤ */
81DS_U16  Air_Freq[69+2] = {
82                  0,  0, 57, 63, 69, 79, 85,177,183,189,
83                195,201,207,213,473,479,485,491,497,503,
84                509,515,521,527,533,539,545,551,557,563,
85                569,575,581,587,593,599,605,611,617,623,
86                629,635,641,647,653,659,665,671,677,683,
87                689,695,701,707,713,719,725,731,737,743,
88                749,755,761,767,773,779,785,791,797,803,
89};
90
91DS_U16  Cable_Freq[160] = {
92                  0, 75, 57, 63, 69, 79, 85,177,183,189,
93                195,201,207,213,123,129,135,141,147,153,
94                159,165,171,219,225,231,237,243,249,255,
95                261,267,273,279,285,291,297,303,309,315,
96                321,327,333,339,345,351,357,363,369,375,
97                381,387,393,399,405,411,417,423,429,435,
98                441,447,453,459,465,471,477,483,489,495,
99                501,507,513,519,525,531,537,543,549,555,
100                561,567,573,579,585,591,597,603,609,615,
101                621,627,633,639,645, 93, 99,105,111,117,
102                651,657,663,669,675,681,687,693,699,705,
103                711,717,723,729,735,741,747,753,759,765,
104                771,777,783,789,795,801,807,813,819,825,
105                831,837,843,849,855,861,867,873,879,885,
106                891,897,903,909,915,921,927,933,939,945,
107                951,957,963,969,975,981,987,993,999,
108};
109
110DS_U16  Cable_Freq_IRC[160] = {
111                  0, 75, 57, 63, 69, 81, 87,177,183,189,
112                195,201,207,213,123,129,135,141,147,153,
113                159,165,171,219,225,231,237,243,249,255,
114                261,267,273,279,285,291,297,303,309,315,
115                321,327,333,339,345,351,357,363,369,375,
116                381,387,393,399,405,411,417,423,429,435,
117                441,447,453,459,465,471,477,483,489,495,
118                501,507,513,519,525,531,537,543,549,555,
119                561,567,573,579,585,591,597,603,609,615,
120                621,627,633,639,645, 93, 99,105,111,117,
121                651,657,663,669,675,681,687,693,699,705,
122                711,717,723,729,735,741,747,753,759,765,
123                771,777,783,789,795,801,807,813,819,825,
124                831,837,843,849,855,861,867,873,879,885,
125                891,897,903,909,915,921,927,933,939,945,
126                951,957,963,969,975,981,987,993,999,
127};
128
129DS_U16  Cable_Freq_HRC[160] = {
130                  0, 74, 56, 62, 68, 80, 86,176,182,188,
131                194,200,206,212,122,128,134,140,146,152,
132                158,164,170,218,224,230,236,242,248,254,
133                260,266,272,278,284,290,296,302,308,314,
134                320,326,332,338,344,350,356,362,368,374,
135                380,386,392,398,404,410,416,422,428,434,
136                440,446,452,458,464,470,476,482,488,494,
137                500,506,512,518,524,530,536,542,548,554,
138                560,566,572,578,584,590,596,602,608,614,
139                620,626,632,638,644, 92, 98,104,110,116,
140                650,656,662,668,674,680,686,692,698,704,
141                710,716,722,728,734,740,746,752,758,764,
142                770,776,782,788,794,800,806,812,818,824,
143                830,836,842,848,854,860,866,872,878,884,
144                890,896,902,908,914,920,926,932,938,944,
145                950,956,962,968,974,980,986,992,998,
146};
147#else
148DS_U32  Air_Freq[83+2] = {
149                     0,     0, 57000, 63000, 69000, 79000, 85000,177000,183000,189000,
150                195000,201000,207000,213000,473000,479000,485000,491000,497000,503000,
151                509000,515000,521000,527000,533000,539000,545000,551000,557000,563000,
152                569000,575000,581000,587000,593000,599000,605000,611000,617000,623000,
153                629000,635000,641000,647000,653000,659000,665000,671000,677000,683000,
154                689000,695000,701000,707000,713000,719000,725000,731000,737000,743000,
155                749000,755000,761000,767000,773000,779000,785000,791000,797000,803000,
156                809000,815000,821000,827000,833000,839000,845000,851000,857000,863000,
157                869000,875000,881000,887000
158};
159
160DS_U32  Cable_Freq[160] = {
161                     0, 75000, 57000, 63000, 69000, 79000, 85000,177000,183000,189000,
162                195000,201000,207000,213000,123000,129000,135000,141000,147000,153000,
163                159000,165000,171000,219000,225000,231000,237000,243000,249000,255000,
164                261000,267000,273000,279000,285000,291000,297000,303000,309000,315000,
165                321000,327000,333000,339000,345000,351000,357000,363000,369000,375000,
166                381000,387000,393000,399000,405000,411000,417000,423000,429000,435000,
167                441000,447000,453000,459000,465000,471000,477000,483000,489000,495000,
168                501000,507000,513000,519000,525000,531000,537000,543000,549000,555000,
169                561000,567000,573000,579000,585000,591000,597000,603000,609000,615000,
170                621000,627000,633000,639000,645000, 93000, 99000,105000,111000,117000,
171                651000,657000,663000,669000,675000,681000,687000,693000,699000,705000,
172                711000,717000,723000,729000,735000,741000,747000,753000,759000,765000,
173                771000,777000,783000,789000,795000,801000,807000,813000,819000,825000,
174                831000,837000,843000,849000,855000,861000,867000,873000,879000,885000,
175                891000,897000,903000,909000,915000,921000,927000,933000,939000,945000,
176                951000,957000,963000,969000,975000,981000,987000,993000,999000,
177};
178
179DS_U32  Cable_Freq_IRC[160] = {
180                     0, 75000, 57000, 63000, 69000, 81000, 87000,177000,183000,189000,
181                195000,201000,207000,213000,123000,129000,135000,141000,147000,153000,
182                159000,165000,171000,219000,225000,231000,237000,243000,249000,255000,
183                261000,267000,273000,279000,285000,291000,297000,303000,309000,315000,
184                321000,327000,333000,339000,345000,351000,357000,363000,369000,375000,
185                381000,387000,393000,399000,405000,411000,417000,423000,429000,435000,
186                441000,447000,453000,459000,465000,471000,477000,483000,489000,495000,
187                501000,507000,513000,519000,525000,531000,537000,543000,549000,555000,
188                561000,567000,573000,579000,585000,591000,597000,603000,609000,615000,
189                621000,627000,633000,639000,645000, 93000, 99000,105000,111000,117000,
190                651000,657000,663000,669000,675000,681000,687000,693000,699000,705000,
191                711000,717000,723000,729000,735000,741000,747000,753000,759000,765000,
192                771000,777000,783000,789000,795000,801000,807000,813000,819000,825000,
193                831000,837000,843000,849000,855000,861000,867000,873000,879000,885000,
194                891000,897000,903000,909000,915000,921000,927000,933000,939000,945000,
195                951000,957000,963000,969000,975000,981000,987000,993000,999000
196};
197
198DS_U32  Cable_Freq_HRC[160] = {
199                //    0       1       2       3       4       5       6       7       8       9
200                     0, 73750, 55750, 61750, 67750, 79750, 85750,175750,181750,187750, //   0~  9
201                193750,199750,205750,211750,121750,127750,133750,139750,145750,151750, //  10~ 19
202                157750,163750,169750,217750,223750,229750,235750,241750,247750,253750, //  20~ 29
203                259750,265750,271750,277750,283750,289750,295750,301750,307750,313750, //  30~ 39
204                319750,325750,331750,337750,343750,349750,355750,361750,367750,373750, //  40~ 49
205                379750,385750,391750,397750,403750,409750,415750,421750,427750,433750, //  50~ 59
206                439750,445750,451750,457750,463750,469750,475750,481750,487750,493750, //  60~ 69
207                499750,505750,511750,517750,523750,529750,535750,541750,547750,553750, //  70~ 79
208                559750,565750,571750,577750,583750,589750,595750,601750,607750,613750, //  80~ 89
209                619750,625750,631750,637750,643750, 91750, 97750,103750,109750,115750, //  90~ 99
210                649750,655750,661750,667750,673750,679750,685750,691750,697750,703750, // 100~109
211                709750,715750,721750,727750,733750,739750,745750,751750,757750,763750, // 110~119
212                769750,775750,781750,787750,793750,799750,805750,811750,817750,823750, // 120~129
213                829750,835750,841750,847750,853750,859750,865750,871750,877750,884750,
214                890750,896750,902750,908750,914750,920750,926750,932750,938750,944750,
215                950750,956750,962750,968750,974750,980750,986750,992750,998750,                                 // 130~135
216};
217#endif
218
219#if USE_IN_KHZ
220static DS_U32 ConvertChannelToFrequency( DS_U32 Channel, FreqStandardType FreqStd )
221{
222        DS_U32 Frequency;
223       
224        switch ( FreqStd )
225        {
226                case FREQ_AIR:
227                        Frequency = Air_Freq[Channel] * 1000;
228                        break;
229                case FREQ_STD:
230                        Frequency = Cable_Freq[Channel] * 1000;
231                        break;
232                case FREQ_IRC:
233                        Frequency = Cable_Freq_IRC[Channel] * 1000;
234                        break;
235                case FREQ_HRC:
236                        Frequency = Cable_Freq_HRC[Channel] * 1000;
237                        break;
238                default:
239                        DHL_DbgPrintf( 0, DHLDBG_FE, "Error with Channel = %lu, FreqStd = %d\n", Channel, FreqStd );
240                        return 0;
241        }
242       
243        return Frequency;
244}
245#else
246static DS_U32 ConvertChannelToFrequency( DS_U32 Channel, FreqStandardType FreqStd )
247{
248        DS_U32 Frequency;
249       
250        switch ( FreqStd )
251        {
252                case FREQ_AIR:
253                        Frequency = Air_Freq[Channel];
254                        break;
255                case FREQ_STD:
256                        Frequency = Cable_Freq[Channel];
257                        break;
258                case FREQ_IRC:
259                        Frequency = Cable_Freq_IRC[Channel];
260                        break;
261                case FREQ_HRC:
262                        Frequency = Cable_Freq_HRC[Channel];
263                        break;
264                default:
265                        DHL_DbgPrintf( 0, DHLDBG_FE, "Error with Channel = %lu, FreqStd = %d\n", Channel, FreqStd );
266                        return 0;
267        }
268       
269        return Frequency;
270}
271#endif
272
273#if 0
274___Main_FE_Functions_________()
275#endif
276/****************************************************************************
277
278        DHL_RESULT DHL_FE_Init
279                - Summary : Initialize Front End, including Tuner/Demodulator.
280                - Argument : Tuner to use, TunerType { TUNER_FAT, TUNER_FDC }
281                - Returns : DHL_OK on success, DHL_FAIL on failure.
282
283 ***************************************************************************/
284DHL_RESULT DHL_FE_Init( TunerType Tuner )
285{
286        P_DST_FE pDSTFETuner;
287        int RetVal;
288        int i;
289
290        if ( Tuner >= TUNER_MAX || Tuner <= TUNER_UNKNOWN )     {
291                DHL_DbgPrintf( 0, DHLDBG_FE, "Error : Tuner is unknown!\n" );
292                return DHL_FAIL;
293        }
294       
295        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
296        if ( pDSTFETuner->bCurState != TUNERSTATE_UNKNOWN ) {
297                DHL_DbgPrintf( 0, DHLDBG_FE, "Error : Tuner State is unknown!\n" );
298                return DHL_FAIL;
299        }
300       
301        pDSTFETuner->bFreqStd = FREQ_AIR;                       /* Default AIR */
302        pDSTFETuner->bCurDemod = DEMOD_UNKNOWN;         /* Default 8VSB */
303        pDSTFETuner->bChannel = 0;
304        pDSTFETuner->uFrequency = 0;
305        pDSTFETuner->bCarrierMute = 0;
306       
307        for (i=0; i<(FECALLBACK_MAX-1); i++) {
308                pDSTFETuner->fnFECallback[i] = (P_DHL_FE_CALLBACK)0;
309                pDSTFETuner->FECallbackUserArg[i] = 0;
310        }
311       
312        RetVal = DD_FE_Init( Tuner, pDSTFETuner );
313        if ( RetVal != DHL_OK ) {
314                DHL_DbgPrintf( 0, DHLDBG_FE, "Error : DD_FE_Init()\n" );
315                return DHL_FAIL;
316        }
317
318#if USE_NTSCCALLBACK
319        if ( Tuner == TUNER_FAT )
320                DHL_FE_NTSCCallbackInit();
321#endif
322
323        pDSTFETuner->bTuner = Tuner;
324        pDSTFETuner->bCurState = TUNERSTATE_INIT;
325        pDSTFETuner->bBERTStarted = _FALSE_;            /* FALSE means NOT-STARTED. */
326       
327        /* Initialize MUTEX */
328       
329       
330        return DHL_OK;
331}
332
333/****************************************************************************
334
335        DHL_RESULT DHL_FE_SetChannelStandard
336                - Summary : Set Channel Standard for Tuner.
337                - Argument
338                        TunerType { TUNER_FAT, TUNER_FDC }
339                        FreqStandardType { FREQ_AIR, FREQ_STD, FREQ_IRC, FREQ_IRC }
340                - Returns : DHL_OK on success, DHL_FAIL on failure
341                - Note
342                        . Don't use MUTEX.
343                       
344 ***************************************************************************/
345DHL_RESULT DHL_FE_SetChannelStandard( TunerType Tuner, FreqStandardType FreqStd )
346{
347        P_DST_FE pDSTFETuner;
348        if ( (Tuner >= TUNER_MAX) || (Tuner <= TUNER_UNKNOWN) ) {
349                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
350                return DHL_FAIL;
351        }
352
353        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
354        if ( (pDSTFETuner->bCurState != TUNERSTATE_INIT) && (pDSTFETuner->bCurState != TUNERSTATE_STOP) ) {
355                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: This function should be called in TUNER_INIT, TUNER_STOP\n" );
356                return DHL_FAIL;
357        }
358       
359        if ( (FreqStd <= FREQ_UNKNOWN) || FreqStd >= (FREQ_MAX) ) {
360                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Frequency Standard is invalid, %d\n", FreqStd );
361                return DHL_FAIL;
362        }
363       
364        pDSTFETuner->bFreqStd = FreqStd;
365        return DHL_OK;
366}
367
368/****************************************************************************
369       
370        DHL_RESULT DHL_FE_Start
371                - Summary : Set Channel / Frequency on Tuner.
372                - Argument
373                        TunerType { TUNER_FAT, TUNER_FDC }
374                        ChannelFreq
375                                if      ( Tuner == TUNER_FAT ) ChannelFreq = Channel
376                                else if ( Tuner == TUNER_FDC ) ChannelFreq = Frequency, 1 unit = 1000 Hz
377                        Demod { DEMOD_8VSB, DEMOD_64QAM, DEMOD_256QAM, DEMOD_NTSC, DEMOD_ISDBT, DEMOD_ISDBT_MANUAL }
378                        bFreq { CHANNEL, FREQ }
379                       
380                - Returns : DHL_OK on  success, DHL_FAIL on failure
381               
382 ***************************************************************************/
383DHL_RESULT DHL_FE_Start( TunerType Tuner, DS_U32 ChannelFreq, TunerDemod Demod, TuneType bFreq )
384{
385        P_DST_FE pDSTFETuner;
386        DHL_RESULT dhlResult = DHL_OK;
387        DS_U32 Frequency = 0;
388       
389        if ( Tuner >= TUNER_MAX || Tuner <= TUNER_UNKNOWN )     
390        {
391                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
392                return DHL_FAIL;
393        }
394        //JFET20050513 | ADD LOG - for the tuner IF select
395        //FE_SelectTunerIF(Demod);
396
397        if ( Tuner == TUNER_FAT )
398        {
399                if ( (Demod <= DEMOD_UNKNOWN) || (Demod > DEMOD_OFF) )
400                {
401                        DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Demodulation Type is invalid, %d\n", Demod );
402                        return DHL_FAIL_INVALID_PARAM;
403                }
404                if ( bFreq == CHANNEL ) 
405                {
406                        if ( (ChannelFreq < MIN_FAT_CH) || (ChannelFreq > MAX_FAT_CH) )
407                        {
408                                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Channel is over limited area, %lu\n", ChannelFreq );
409                                return DHL_FAIL;
410                        }
411                }
412                else
413                {
414                        /* Frequency Check is done at lower Tuner Driver */
415                       
416                }
417        }
418        else
419        {
420                /* FDC Check is not implemented yet */
421                if ( (Demod != DEMOD_MODEA) && (Demod != DEMOD_MODEB) )
422                {
423                        DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Demodulation Type is invalid, 0x%x\n", Demod );
424                        return DHL_FAIL_INVALID_PARAM;
425                }
426        }
427       
428        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
429       
430        /* Take the MUTEX */
431       
432       
433       
434        if ( pDSTFETuner->bCurState == TUNERSTATE_UNKNOWN ) 
435        {
436                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is %d\n", pDSTFETuner->bCurState );
437                dhlResult = DHL_FAIL;
438                goto done;
439        }
440       
441        if ( (pDSTFETuner->bFreqStd <= FREQ_UNKNOWN) || (pDSTFETuner->bFreqStd >= FREQ_MAX) )
442        {
443                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Frequency Standard is invalid, %d\n", pDSTFETuner->bFreqStd );
444                dhlResult = DHL_FAIL;
445                goto done;
446        }
447#if 0
448        if ( (Demod == DEMOD_8VSB) && (pDSTFETuner->bFreqStd != FREQ_AIR) )
449        {
450                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Demodulation is 8VSB, but Frequency Standard is not FREQ_AIR!\n" );
451                dhlResult = DHL_FAIL;
452                goto done;
453        }
454#endif
455
456        /*
457         * Convert Channel to Frequency if bFreq = CHANNEL.
458         */
459        if ( bFreq == CHANNEL ) {
460                Frequency = ConvertChannelToFrequency( ChannelFreq, pDSTFETuner->bFreqStd );
461        } else {
462                Frequency = ChannelFreq;
463        }
464
465        if ( (Tuner == TUNER_FDC) && (bFreq != FREQ) )
466        {
467                dhlResult = DHL_FAIL;
468                goto done;
469        }
470       
471        if ( Tuner == TUNER_FAT )
472                dhlResult = DD_FE_SetChannelFAT( pDSTFETuner, Frequency * 1000, &Demod );
473        else
474                dhlResult = DD_FE_SetChannelFDC( pDSTFETuner, Frequency * 1000, &Demod );
475       
476        if ( dhlResult != DHL_OK )
477                goto done;
478               
479        pDSTFETuner->bCurState = TUNERSTATE_START;
480        pDSTFETuner->bCurDemod = Demod;
481        pDSTFETuner->uFrequency = Frequency;
482        if ( bFreq == CHANNEL )
483                pDSTFETuner->bChannel = ChannelFreq;
484
485        //
486        // Digital CallbackÀ» »ç¿ëÇÏÁö ¾Ê´Â °æ¿ì, (ÇÏÀ§ FE Driver°¡ Áö¿øÇÏ´Â °æ¿ì)
487        // NTSC Callback Function¸¸À» »ç¿ëÇϵµ·Ï ÇÔ.
488        //
489#if USE_NTSCCALLBACK
490        if ( pDSTFETuner->bCurDemod == DEMOD_NTSC ) 
491        {
492                if ( pDSTFETuner->fnFECallbackNTSC[FECALLBACK_ACQSTART-1] ) {
493                        (pDSTFETuner->fnFECallbackNTSC[FECALLBACK_ACQSTART-1])(pDSTFETuner->bTuner, FECALLBACK_ACQSTART, pDSTFETuner->FECallbackNTSCUserArg[FECALLBACK_ACQSTART-1]);
494                }
495
496                if ( g_fe_debug ) {
497                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "[FAT] %s Acqusition start.\n", Demod == DEMOD_8VSB ? "8VSB" : 
498                                                                                        Demod == DEMOD_64QAM ? "64QAM" :
499                                                                                        Demod == DEMOD_256QAM ? "256QAM" :
500                                                                                        Demod == DEMOD_QAM ? "QAM" :
501                                                                                        Demod == DEMOD_NTSC ? "NTSC" :
502                                                                                        Demod == DEMOD_ISDBT ? "ISDB-T" :
503                                                                                        Demod == DEMOD_ISDBT_MANUAL ? "ISDB-T Manual" :
504                                                                                        Demod == DEMOD_MODEA ? "MODEA" :
505                                                                                        Demod == DEMOD_MODEB ? "MODEB" : "Unknown");
506                }
507        } 
508#endif
509
510#if USE_DIGITAL_CALLBACK
511        if ( pDSTFETuner->bCurDemod != DEMOD_NTSC ) 
512        {
513                if ( pDSTFETuner->fnFECallback[FECALLBACK_ACQSTART-1] ) {
514                        (pDSTFETuner->fnFECallback[FECALLBACK_ACQSTART-1])(pDSTFETuner->bTuner, FECALLBACK_ACQSTART, pDSTFETuner->FECallbackUserArg[FECALLBACK_ACQSTART-1]);
515                }
516
517                if ( g_fe_debug ) {
518                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "[FAT] %s Acqusition start.\n", Demod == DEMOD_8VSB ? "8VSB" : 
519                                                                                        Demod == DEMOD_64QAM ? "64QAM" :
520                                                                                        Demod == DEMOD_256QAM ? "256QAM" :
521                                                                                        Demod == DEMOD_QAM ? "QAM" :
522                                                                                        Demod == DEMOD_NTSC ? "NTSC" :
523                                                                                        Demod == DEMOD_ISDBT ? "ISDB-T" :
524                                                                                        Demod == DEMOD_ISDBT_MANUAL ? "ISDB-T Manual" :
525                                                                                        Demod == DEMOD_MODEA ? "MODEA" :
526                                                                                        Demod == DEMOD_MODEB ? "MODEB" : "Unknown");
527                }
528        }
529#endif
530
531        //
532        // Monitor Thread Activate´Â Callback Function È£Ãâ ÀÌÈÄ¿¡...
533        //
534        if ( Tuner == TUNER_FAT ) {
535                pDSTFETuner->NotifyState = FE_WAIT_FOR_LOCK;
536                pDSTFETuner->bThreadActive = _TRUE_;
537        }
538       
539done:
540        /* Give the MUTEX */
541       
542
543        return dhlResult;
544}
545
546/****************************************************************************
547       
548        DHL_RESULT DHL_FE_Stop
549                - Summary : Stop the Tuner.
550                - Argument
551                        TunerType { TUNER_FAT, TUNER_FDC }
552                       
553                - Returns : DHL_OK on  success, DHL_FAIL on failure
554               
555 ***************************************************************************/
556DHL_RESULT DHL_FE_Stop( TunerType Tuner )
557{
558        P_DST_FE pDSTFETuner;
559        DHL_RESULT dhlResult;
560
561        if ( Tuner >= TUNER_MAX || Tuner <= TUNER_UNKNOWN )     {
562                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
563                return DHL_FAIL;
564        }
565
566        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
567
568        /* Take the MUTEX */
569       
570       
571       
572        /* State Checking */
573        if ( pDSTFETuner->bCurState != TUNERSTATE_START ) {
574                //DHL_DbgPrintf( 0, DHLDBG_FE, " WARNING: Tuner State is NOT TUNERSTATE_START, %d\n", pDSTFETuner->bCurState );
575                dhlResult = DHL_OK;
576                goto done;
577        }
578       
579        /* Call the lower device driver */
580        dhlResult = DD_FE_Stop( pDSTFETuner );
581        if ( dhlResult != DHL_OK )
582                goto done;
583               
584        pDSTFETuner->bCurState = TUNERSTATE_STOP;
585        if ( Tuner == TUNER_FAT ) {
586                pDSTFETuner->NotifyState = FE_WAIT_FOR_LOCK;   
587                pDSTFETuner->bThreadActive = _FALSE_;
588        }
589       
590done:
591        /* Give the MUTEX */
592       
593       
594        return dhlResult;
595}
596
597/****************************************************************************
598       
599        DHL_RESULT DHL_FE_Close
600                - Summary
601                        Close Front End. (Used to re-initialize FE.)
602                - Argument
603                        TunerType { TUNER_FAT, TUNER_FDC }
604                - Returns
605                        DHL_OK on success, DHL_FAIL on failure.
606                - Note
607
608 ***************************************************************************/
609DHL_RESULT DHL_FE_Close( TunerType Tuner )
610{
611        P_DST_FE pDSTFETuner;
612        DHL_RESULT dhlResult = DHL_OK;
613
614        if ( Tuner >= TUNER_MAX || Tuner <= TUNER_UNKNOWN )     {
615                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
616                return DHL_FAIL;
617        }
618
619        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
620       
621        /* Take the MUTEX */
622       
623       
624       
625        /* State Checking */
626        if ( pDSTFETuner->bCurState == TUNERSTATE_UNKNOWN )
627        {
628                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: This tuner is not initialized or closed already.\n" );
629                dhlResult = DHL_FAIL;
630                goto done;
631        }
632       
633        if ( (pDSTFETuner->bCurState == TUNERSTATE_START) || (pDSTFETuner->bCurState == TUNERSTATE_INIT) )
634        {
635                dhlResult = DD_FE_Stop( pDSTFETuner );
636                if ( dhlResult != DHL_OK )
637                        goto done;
638                pDSTFETuner->bCurState = TUNERSTATE_STOP;
639        }
640       
641        /* Call the lower device driver */
642        dhlResult = DD_FE_Close( pDSTFETuner ); 
643        if ( dhlResult != DHL_OK )
644                goto done;
645       
646        pDSTFETuner->bTuner = TUNER_UNKNOWN;
647        pDSTFETuner->bCurState = TUNERSTATE_UNKNOWN;
648       
649        pDSTFETuner->bFreqStd = FREQ_UNKNOWN;                   /* Default AIR */
650        pDSTFETuner->bCurDemod = DEMOD_UNKNOWN;         /* Default 8VSB */
651        pDSTFETuner->bChannel = 0;
652        pDSTFETuner->uFrequency = 0;
653
654done:
655        /* Give the MUTEX */
656       
657       
658       
659        return dhlResult;
660}
661
662/****************************************************************************
663       
664        DHL_RESULT DHL_FE_SetCallback
665                - Summary
666                        Register/Unregister FE Callback Function.
667                - Argument
668                        TunerType { TUNER_FAT, TUNER_FDC }
669                        FECallbackSource { FECALLBACK_ACQSTART, FECALLBACK_LOCK, FECALLBACK_UNLOCK }
670                        P_DHL_FE_CALLBACK fn, if fn is NULL, then unregister FE callback function.
671                        DS_U32 userArg, passed to fn.
672                - Returns : DHL_OK on  success, DHL_FAIL on failure
673                - Note
674                        typedef void (*P_DHL_FE_CALLBACK)(TunerType Tuner,
675                                                                                        FECallbackSource eventSource,
676                                                                                        DS_U32 userArg);
677
678 ***************************************************************************/
679DHL_RESULT DHL_FE_SetCallback( TunerType Tuner, FECallbackSource eventSource, 
680                                                                        P_DHL_FE_CALLBACK fn, DS_U32 userArg )
681{
682        DHL_RESULT dhlResult = DHL_OK;
683        P_DST_FE pDSTFETuner;
684       
685        if ( (Tuner >= TUNER_MAX) || (Tuner <= TUNER_UNKNOWN) ) {
686                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
687                return DHL_FAIL;
688        }
689       
690        if ( (eventSource >= FECALLBACK_MAX) || (eventSource <= FECALLBACK_UNKNOWN) ) {
691                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Callback Event Source is invalid, %d\n", eventSource );
692                return DHL_FAIL;
693        }
694
695        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
696
697        /* Take the MUTEX */
698       
699       
700       
701        /* State Checking */
702        if ( (pDSTFETuner->bCurState != TUNERSTATE_INIT) && (pDSTFETuner->bCurState != TUNERSTATE_STOP) ) {
703                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Should be called TUNERSTATE_INIT or TUNERSTATE_STOP, bCurState= %d\n", pDSTFETuner->bCurState );
704                dhlResult = DHL_FAIL;
705                goto done;
706        }
707       
708        pDSTFETuner->fnFECallback[eventSource-1] = fn;
709        pDSTFETuner->FECallbackUserArg[eventSource-1] = userArg;
710
711done:
712        /* Give the MUTEX */
713       
714       
715       
716        return dhlResult;
717}
718                                                                               
719DHL_RESULT DHL_FE_SetCallbackNTSC( TunerType Tuner, FECallbackSource eventSource, 
720                                                                        P_DHL_FE_CALLBACK fn, DS_U32 userArg )
721{
722        DHL_RESULT dhlResult = DHL_OK;
723        P_DST_FE pDSTFETuner;
724       
725        if ( Tuner != TUNER_FAT )       {
726                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
727                return DHL_FAIL;
728        }
729       
730        if ( (eventSource >= FECALLBACK_MAX) || (eventSource <= FECALLBACK_UNKNOWN) ) {
731                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Callback Event Source is invalid, %d\n", eventSource );
732                return DHL_FAIL;
733        }
734
735        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
736
737        /* Take the MUTEX */
738       
739       
740       
741        pDSTFETuner->fnFECallbackNTSC[eventSource-1] = fn;
742        pDSTFETuner->FECallbackNTSCUserArg[eventSource-1] = userArg;
743
744        /* Give the MUTEX */
745       
746       
747       
748        return dhlResult;
749}
750
751/****************************************************************************
752
753        DHL_RESULT DHL_FE_GetLockStatus
754                - Summary : Get the lock status from tuner.
755                - Argument
756                        TunerType { TUNER_FAT, TUNER_FDC }
757                        pLockStatus : Lock State loaded into.
758                - Returns : DHL_OK on success, DHL_FAIL on failure
759               
760 ***************************************************************************/
761DHL_RESULT DHL_FE_GetLockStatus( TunerType Tuner, DS_U8 *pLockStatus )
762{
763        P_DST_FE pDSTFETuner = (P_DST_FE)0;
764        DS_U8 LockStatus;
765        DHL_RESULT dhlResult = DHL_OK;
766       
767        if ( (Tuner >= TUNER_MAX) || (Tuner <= TUNER_UNKNOWN) ) {
768                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
769                return DHL_FAIL;
770        }
771
772        /* Argument Checking */
773        if ( pLockStatus == (DS_U8 *)0 ) {
774                return DHL_FAIL;
775        }
776       
777        /* Take the MUTEX */
778       
779       
780        /* Tuner State Checking */
781        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
782        if ( (pDSTFETuner->bCurState <= TUNERSTATE_UNKNOWN) || (pDSTFETuner->bCurState >= TUNERSTATE_MAX) ) {
783                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is Invalid, %d\n", pDSTFETuner->bCurState );
784                dhlResult = DHL_FAIL;
785                goto done;
786        }
787       
788        /* Put invalid on DST_FE information */
789        pDSTFETuner->bLockStatus = -1;
790
791        dhlResult = DD_FE_GetLockStatus( pDSTFETuner, &LockStatus );
792        if ( dhlResult != DHL_OK ) {
793                *pLockStatus = 0;
794                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetLockStatus()\n" );
795                goto done;
796        }
797       
798        pDSTFETuner->bLockStatus = LockStatus;
799        *pLockStatus = LockStatus;
800
801        if ( g_force_ss == 1 ) {
802                *pLockStatus= 1;
803        } else if ( g_force_ss == 2 ) {
804                *pLockStatus= 0;
805        }
806
807done:
808        /* Give the MUTEX */
809       
810       
811        return dhlResult;
812}
813
814/****************************************************************************
815
816        DHL_RESULT DHL_FE_GetModFormat
817                - Summary : Get the modulation format from tuner.
818                - Argument
819                        TunerType { TUNER_FAT, TUNER_FDC }
820                        pModFormat : Modulation Format
821                - Returns : DHL_OK on success, DHL_FAIL on failure
822               
823 ***************************************************************************/
824DHL_RESULT DHL_FE_GetModFormat( TunerType Tuner, TunerDemod *pModFormat )
825{
826        P_DST_FE pDSTFETuner = (P_DST_FE)0;
827        DHL_RESULT dhlResult = DHL_OK;
828        TunerDemod ModFormat;
829       
830        if ( (Tuner >= TUNER_MAX) || (Tuner <= TUNER_UNKNOWN) ) {
831                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
832                return DHL_FAIL;
833        }
834
835        /* Argument Checking */
836        if ( pModFormat == (TunerDemod *)0 ) {
837                return DHL_FAIL;
838        }
839       
840        /* Take the MUTEX */
841       
842       
843        /* Tuner State Checking */
844        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
845        if ( (pDSTFETuner->bCurState <= TUNERSTATE_UNKNOWN) || (pDSTFETuner->bCurState >= TUNERSTATE_MAX) ) {
846                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is Invalid, %d\n", pDSTFETuner->bCurState );
847                dhlResult = DHL_FAIL;
848                goto done;
849        }
850
851        /* Put invalid on DST_FE information */
852        //pDSTFETuner->bCurDemod = DEMOD_UNKNOWN;
853        *pModFormat = pDSTFETuner->bCurDemod;
854       
855        dhlResult = DD_FE_GetModFormat( pDSTFETuner, &ModFormat );
856        if ( dhlResult != DHL_OK ) {
857                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetLockStatus()\n" );
858                goto done;
859        }
860       
861        pDSTFETuner->bCurDemod = ModFormat;
862        *pModFormat = ModFormat;
863
864done:
865        /* Give the MUTEX */
866       
867       
868        return dhlResult;
869}
870
871/****************************************************************************
872
873        DHL_RESULT DHL_FE_GetSNR
874                - Summary : Calculate the demodulator (Equalizer) SNR from SQI.
875                - Arguments
876                        TunerType { TUNER_FAT, TUNER_FDC }
877                        pSNR : SNR loaded into.
878                - Returns : DHL_OK on success, DHL_FAIL on failure
879                - Note
880                        . Valid only if the tuner is locked.
881                                       
882 ***************************************************************************/
883DHL_RESULT DHL_FE_GetSNR( TunerType Tuner, float *pSNR )
884{
885        P_DST_FE pDSTFETuner = (P_DST_FE)0;
886        DS_U8 LockStatus;
887        DHL_RESULT dhlResult = DHL_OK;
888        float SNR;
889       
890        if ( (Tuner >= TUNER_MAX) || (Tuner <= TUNER_UNKNOWN) ) {
891                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
892                return DHL_FAIL;
893        }
894
895        /* Argument Checking */
896        if ( pSNR == (float *)0 ) {
897                return DHL_FAIL;
898        }
899
900        /* Take the MUTEX */
901       
902       
903        /* Tuner State Checking */
904        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
905        if ( (pDSTFETuner->bCurState <= TUNERSTATE_UNKNOWN) || (pDSTFETuner->bCurState >= TUNERSTATE_MAX) ) {
906                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is Invalid, %d\n", pDSTFETuner->bCurState );
907                dhlResult = DHL_FAIL;
908                goto done;
909        }
910
911        dhlResult = DD_FE_GetLockStatus( pDSTFETuner, &LockStatus );
912        if ( dhlResult != DHL_OK ) {
913                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetLockStatus()\n" );
914                dhlResult = DHL_FAIL;
915                goto done;
916        }
917
918#if 0   /* hwatk/041109, lockÀÌ ¾ÈµÇ¾îµµ snr °Ë»ç¸¦ ÇÒ ¼ö ÀÖ¾î¾ß ÇÔ.. */
919        if ( LockStatus == 0 )
920        {
921                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner is not locked!\n" );
922                dhlResult = DHL_FAIL;
923                goto done;
924        }
925#endif
926
927        /* Call the lower device driver */
928        dhlResult = DD_FE_GetSNR( pDSTFETuner, &SNR );
929        if ( dhlResult != DHL_OK ) {
930                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetSNR()\n" );
931                dhlResult = DHL_FAIL;
932                goto done;
933        }
934       
935        *pSNR = SNR;
936
937done:
938        /* Give the MUTEX */
939       
940        return dhlResult;
941}
942
943/****************************************************************************
944       
945        DHL_RESULT DHL_FE_GetTrellisSNR
946                - Summary : Get the Trellis Decoder Output SNR.
947                - Arguments
948                        TunerType { TUNER_FAT, TUNER_FDC }
949                        pTrellisSNR : Trellis SNR loaded into.
950                - Returns : DHL_OK on success, DHL_FAIL on failure.
951                - Note
952                        . Valid only if the tuner is FAT. ???   
953                        . Valid only if the tuner is locked.
954       
955 ***************************************************************************/
956DHL_RESULT DHL_FE_GetTrellisSNR( TunerType Tuner, double *pTrellisSNR )
957{
958        P_DST_FE pDSTFETuner = (P_DST_FE)0;
959        DS_U8 LockStatus;
960        DHL_RESULT dhlResult = DHL_OK;
961        double TrellisSNR;
962       
963        if ( Tuner != TUNER_FAT )       {
964                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: This function is excuted only if TUNER_FAT, Tuner = %d\n", Tuner );
965                return DHL_FAIL;
966        }
967
968        /* Argument Checking */
969        if ( pTrellisSNR == (double *)0 ) {
970                return DHL_FAIL;
971        }
972       
973        /* Take the MUTEX */
974       
975       
976        /* Tuner State Checking */
977        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
978        if ( (pDSTFETuner->bCurState <= TUNERSTATE_UNKNOWN) || (pDSTFETuner->bCurState >= TUNERSTATE_MAX) ) {
979                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is Invalid, %d\n", pDSTFETuner->bCurState );
980                dhlResult = DHL_FAIL;
981                goto done;
982        }
983
984        dhlResult = DD_FE_GetLockStatus( pDSTFETuner, &LockStatus );
985        if ( dhlResult != DHL_OK ) {
986                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetLockStatus()\n" );
987                dhlResult = DHL_FAIL;
988                goto done;
989        }
990
991        if ( LockStatus == 0 )
992        {
993                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner is not locked!\n" );
994                dhlResult = DHL_FAIL;
995                goto done;
996        }
997       
998        dhlResult = DD_FE_GetTrellisSNR( pDSTFETuner, &TrellisSNR );
999        if ( dhlResult != DHL_OK ) {
1000                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetTrellisSNR()\n" );
1001                dhlResult = DHL_FAIL;
1002                goto done;
1003        }
1004
1005        pDSTFETuner->dTrellisSNR = TrellisSNR;
1006        *pTrellisSNR = TrellisSNR;
1007
1008done:
1009        /* Give the MUTEX */
1010        return dhlResult;
1011}
1012
1013/****************************************************************************
1014       
1015        DHL_RESULT DHL_FE_GetSignalStrength
1016                - Summary : Get the SQI (Signal Quality Indicator) from the Tuner.
1017                - Arguments
1018                        TunerType { TUNER_FAT, TUNER_FDC }
1019                        pSQI : SQI loaded into
1020                - Returns : DHL_OK on success, DHL_FAIL on failure
1021                - Note
1022                        . Can be get the signal strength on both locked and unlocked.
1023                          - Locked : From Equalizer SNR.
1024                          - Unlocked : From Current AGC Value.
1025 
1026 ***************************************************************************/
1027DHL_RESULT DHL_FE_GetSignalStrength( TunerType Tuner, DS_U32 *pSQI )
1028{
1029        P_DST_FE pDSTFETuner = (P_DST_FE)0;
1030        DHL_RESULT dhlResult = DHL_OK;
1031        DS_U32 SQI;
1032       
1033        /* Argument checking */
1034        if ( pSQI == (DS_U32 *)0 ) {
1035                return DHL_FAIL;
1036        }
1037
1038        /* Take the MUTEX */
1039       
1040       
1041        /* Tuner State Checking */
1042        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1043        if ( (pDSTFETuner->bCurState <= TUNERSTATE_UNKNOWN) || (pDSTFETuner->bCurState >= TUNERSTATE_MAX) ) {
1044                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is Invalid, %d\n", pDSTFETuner->bCurState );
1045                dhlResult = DHL_FAIL;
1046                goto done;
1047        }
1048
1049       
1050       
1051        dhlResult = DD_FE_GetSignalStrength( pDSTFETuner, &SQI );
1052        if ( dhlResult != DHL_OK ) {
1053                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetSignalStrength()\n" );
1054                goto done;
1055        }
1056
1057        pDSTFETuner->uSQI = SQI;
1058        *pSQI = SQI;
1059
1060        if ( g_force_ss == 1 )
1061        {
1062                *pSQI = 100;
1063        }
1064
1065done:
1066        /* Give the MUTEX */
1067       
1068       
1069        return dhlResult;
1070}
1071
1072DHL_RESULT DHL_FE_GetSignalPower( TunerType Tuner, DS_U32 *pSQI )
1073{
1074        P_DST_FE pDSTFETuner = (P_DST_FE)0;
1075        DHL_RESULT dhlResult = DHL_OK;
1076        DS_U32 SQI;
1077       
1078        /* Argument checking */
1079        if ( pSQI == (DS_U32 *)0 ) {
1080                return DHL_FAIL;
1081        }
1082
1083        /* Take the MUTEX */
1084       
1085       
1086        /* Tuner State Checking */
1087        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1088        if ( (pDSTFETuner->bCurState <= TUNERSTATE_UNKNOWN) || (pDSTFETuner->bCurState >= TUNERSTATE_MAX) ) {
1089                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is Invalid, %d\n", pDSTFETuner->bCurState );
1090                dhlResult = DHL_FAIL;
1091                goto done;
1092        }
1093
1094        dhlResult = DD_FE_GetSignalPower( pDSTFETuner, &SQI );
1095        if ( dhlResult != DHL_OK ) {
1096                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetSignalStrength()\n" );
1097                goto done;
1098        }
1099
1100        *pSQI = SQI;
1101
1102        if ( g_force_ss == 1 )
1103        {
1104                *pSQI= 100;
1105        }
1106
1107done:
1108        /* Give the MUTEX */
1109       
1110       
1111        return dhlResult;
1112}
1113
1114/****************************************************************************
1115       
1116        DHL_RESULT DHL_FE_GetEqSNR
1117                - Summary : Calculate the demodulator (Equalizer) SNR from SQI.
1118                - Arguments
1119                        TunerType { TUNER_FAT, TUNER_FDC }
1120                        pSNR : SNR loaded into.
1121                - Returns : DHL_OK on success, DHL_FAIL on failure
1122                - Note
1123                        . Valid only if the tuner is locked.
1124
1125 ***************************************************************************/
1126DHL_RESULT DHL_FE_GetEqSNR( TunerType Tuner, float *pSNR )
1127{
1128        return DHL_FE_GetSNR( Tuner, pSNR );
1129}
1130
1131DS_U32 DHL_FE_GetFrequency( TunerType Tuner )
1132{
1133        P_DST_FE pDSTFETuner = (P_DST_FE)0;
1134
1135        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1136
1137        return DD_FE_GetFrequency(pDSTFETuner);
1138}
1139
1140/****************************************************************************
1141
1142        DHL_RESULT DHL_FE_GetRSError
1143                - Summary
1144                        Get the Reed-Solomon Decoder Error Count and calculate
1145                                error count per unit second.
1146                - Arguments
1147                        TunerType { TUNER_FAT, TUNER_FDC }
1148                        pRSErrorCnt : RS Decoder Error Count loaded into.
1149                        pRSErrorRate : RS Decoder Error Rate loaded into.
1150                - Returns : DHL_OK on success, DHL_FAIL on failure.
1151                - Note
1152                        . Valid only if the tuner is FAT.
1153
1154 ***************************************************************************/
1155DHL_RESULT DHL_FE_GetRSError( TunerType Tuner, DS_U32 *pRSErrorCnt, float *pRSErrorRate )
1156{
1157        P_DST_FE pDSTFETuner = (P_DST_FE)0;
1158        DS_U8 LockStatus;
1159        DHL_RESULT dhlResult;
1160        DS_U32 RSErrorCnt;
1161        float RSErrorRate;
1162       
1163        if ( Tuner != TUNER_FAT )       {
1164                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: This function is valid only if TUNER_FAT, Tuner = %d\n", Tuner );
1165                return DHL_FAIL;
1166        }
1167
1168        if ( (pRSErrorCnt == (DS_U32 *)0) || (pRSErrorRate == (float *)0) ) {
1169                return DHL_FAIL;
1170        }
1171       
1172        /* Take the MUTEX */
1173       
1174       
1175        /* Tuner State Checking */
1176        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1177        if ( (pDSTFETuner->bCurState <= TUNERSTATE_UNKNOWN) || (pDSTFETuner->bCurState >= TUNERSTATE_MAX) ) {
1178                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is Invalid, %d\n", pDSTFETuner->bCurState );
1179                dhlResult = DHL_FAIL;
1180                goto done;
1181        }
1182
1183        /* Put invalid on DST_FE information */
1184        pDSTFETuner->uRSErrorCnt = -1;
1185        pDSTFETuner->fRSErrorRate = -1.0f;
1186       
1187        /* Call the lower device driver */
1188        dhlResult = DD_FE_GetLockStatus( pDSTFETuner, &LockStatus );
1189        if ( dhlResult != DHL_OK ) {
1190                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetLockStatus()\n" );
1191                goto done;
1192        }
1193
1194        if ( LockStatus == 0 )
1195        {
1196                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner is not locked!\n" );
1197                dhlResult = DHL_FAIL;
1198                goto done;
1199        }
1200       
1201        /* Call the lower device driver */
1202        dhlResult = DD_FE_GetRSError( pDSTFETuner, &RSErrorCnt, &RSErrorRate );
1203        if ( dhlResult != DHL_OK ) {
1204                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: DD_FE_GetRSError()\n" );
1205                dhlResult = DHL_FAIL;
1206                goto done;
1207        }
1208
1209        pDSTFETuner->uRSErrorCnt = RSErrorCnt;
1210        *pRSErrorCnt = RSErrorCnt;
1211        pDSTFETuner->fRSErrorRate = RSErrorRate;
1212        *pRSErrorRate = RSErrorRate;
1213
1214done:
1215        /* Give the MUTEX */
1216       
1217       
1218        return dhlResult;       
1219}
1220
1221/****************************************************************************
1222       
1223        DHL_RESULT DHL_FE_BERTStart
1224                - Summary :
1225                - Arguments
1226                        TunerType { TUNER_FAT, TUNER_FDC }
1227                        HdrRm - Header Remove Bytes
1228                                        { FEBERT_RM_0, FEBERT_RM_1, FEBERT_RM_3, FEBERT_RM_4 }
1229                        Source - Source Selection
1230                                        { FEBERT_INPUT_FAT, FEBERT_INPUT_DI,
1231                                          FEBERT_INPUT_FDC, FEBERT_INPUT_TRELLIS }
1232                        PNInv - PN Inversion { FEBERT_INVERTED, FEBERT_NON_INVERTED }
1233                        PNSeq - PN Sequence { FEBERT_PN_15, FEBERT_PN_23 }
1234                - Returns : DHL_OK on success, DHL_FAIL on failure
1235                - Note
1236
1237 ***************************************************************************/
1238DHL_RESULT DHL_FE_BERTStart( TunerType Tuner, FEBertRm HdrRm, FEBertSource Source, 
1239                            FEBertPNInv PNInv, FEBertPNSeq PNSeq)
1240{
1241        DHL_RESULT dhlResult;
1242        P_DST_FE pDSTFETuner;
1243
1244        /* Tuner Id. Checking */       
1245        if ( Tuner >= TUNER_MAX || Tuner <= TUNER_UNKNOWN )     {
1246                DHL_DbgPrintf( 0, DHLDBG_FE, "Error : Tuner is unknown!\n" );
1247                return DHL_FAIL;
1248        }
1249
1250        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1251
1252        /* Is BERT started ? */
1253        if ( pDSTFETuner->bBERTStarted == _TRUE_ ) {
1254                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: BERT is already started.\n" );
1255                return DHL_FAIL;
1256        }
1257       
1258        /* Take the MUTEX */
1259       
1260       
1261        /* Tuner State Checking */
1262        if ( pDSTFETuner->bCurState != TUNERSTATE_START ) {
1263                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is NOT TUNERSTATE_START, %d\n", pDSTFETuner->bCurState );
1264                dhlResult = DHL_FAIL;
1265                goto done;
1266        }
1267
1268        /* Call the lower device driver */
1269        dhlResult = DD_FE_BERTStart( pDSTFETuner, HdrRm, Source, PNInv, PNSeq );
1270        if ( dhlResult != DHL_OK )
1271                goto done;
1272
1273        pDSTFETuner->bBERTStarted = _TRUE_;
1274       
1275done:
1276        /* Give the MUTEX */
1277       
1278       
1279        return dhlResult;
1280}
1281
1282/****************************************************************************
1283       
1284        DHL_RESULT DHL_FE_BERTStop
1285                - Summary :
1286                - Arguments
1287                        TunerType { TUNER_FAT, TUNER_FDC }
1288                - Returns : DHL_OK on success, DHL_FAIL on failure
1289                - Note
1290
1291 ***************************************************************************/
1292DHL_RESULT DHL_FE_BERTStop( TunerType Tuner )
1293{
1294        DHL_RESULT dhlResult;
1295        P_DST_FE pDSTFETuner;
1296
1297        /* Tuner Id. Checking */       
1298        if ( Tuner >= TUNER_MAX || Tuner <= TUNER_UNKNOWN )     {
1299                DHL_DbgPrintf( 0, DHLDBG_FE, "Error : Tuner is unknown!\n" );
1300                return DHL_FAIL;
1301        }
1302
1303        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1304
1305        /* Is BERT started ? */
1306        if ( pDSTFETuner->bBERTStarted == _FALSE_ ) {
1307                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: BERT is already started.\n" );
1308                return DHL_FAIL;
1309        }
1310       
1311        /* Take the MUTEX */
1312       
1313       
1314        /* Tuner State Checking */
1315        if ( pDSTFETuner->bCurState != TUNERSTATE_START ) {
1316                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is NOT TUNERSTATE_START, %d\n", pDSTFETuner->bCurState );
1317                dhlResult = DHL_FAIL;
1318                goto done;
1319        }
1320
1321        /* Call the lower device driver */
1322        dhlResult = DD_FE_BERTStop( pDSTFETuner );
1323        if ( dhlResult != DHL_OK )
1324                goto done;
1325
1326        pDSTFETuner->bBERTStarted = _TRUE_;
1327
1328done:
1329        /* Give the MUTEX */
1330       
1331       
1332        return dhlResult;
1333}
1334
1335/****************************************************************************
1336       
1337        DHL_RESULT DHL_FE_GetBERT
1338                - Summary :
1339                - Arguments
1340                        TunerType { TUNER_FAT, TUNER_FDC }
1341                - Returns : DHL_OK on success, DHL_FAIL on failure
1342                - Note
1343
1344 ***************************************************************************/
1345DHL_RESULT DHL_FE_GetBERT( TunerType Tuner, DS_U32 *pErrorCnt, float *pErrorRate )
1346{
1347        DHL_RESULT dhlResult = DHL_OK;
1348        P_DST_FE pDSTFETuner;
1349
1350        /* Tuner Id. Checking */       
1351        if ( Tuner >= TUNER_MAX || Tuner <= TUNER_UNKNOWN )     {
1352                DHL_DbgPrintf( 0, DHLDBG_FE, "Error : Tuner is unknown!\n" );
1353                return DHL_FAIL;
1354        }
1355
1356        /* Argument Checking */
1357        if ( (pErrorCnt == (DS_U32 *)0) || (pErrorRate == (float *)0) ) {
1358                DHL_DbgPrintf( 0, DHLDBG_FE, "Error : Arguments are invalid!,\
1359                               pErrorCnt = %lx, pErrorRate = %lx", pErrorCnt, pErrorRate );
1360                return DHL_FAIL_NULL_POINTER;
1361        }
1362       
1363        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1364       
1365        /* Take the MUTEX */
1366       
1367       
1368        /* Tuner State Checking */
1369        if ( pDSTFETuner->bCurState != TUNERSTATE_START ) {
1370                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Tuner State is NOT TUNERSTATE_START, %d\n", pDSTFETuner->bCurState );
1371                dhlResult = DHL_FAIL;
1372                goto done;
1373        }
1374
1375        /* Put invalid on DST_FE information */
1376        pDSTFETuner->ulBERTErrorCnt = -1;
1377        pDSTFETuner->dBERTErrorRate = -1.0f;
1378        *pErrorCnt = -1;
1379        *pErrorRate = -1.0f;
1380       
1381        /* Call the lower device driver */
1382        dhlResult = DD_FE_GetBERT( pDSTFETuner, pErrorCnt, pErrorRate );
1383        if ( dhlResult != DHL_OK )
1384                goto done;
1385
1386        pDSTFETuner->ulBERTErrorCnt = *pErrorCnt;
1387        pDSTFETuner->dBERTErrorRate = *pErrorRate;
1388       
1389done:
1390        /* Give the MUTEX */
1391       
1392       
1393        return dhlResult;
1394}
1395
1396/****************************************************************************
1397       
1398        DHL_RESULT DHL_FE_SetFDCConfig
1399                - Summary : FDC °ü·Ã Data Mode ¼³Á¤
1400                - Arguments
1401                        TunerType       { TUNER_FAT, TUNER_FDC }
1402                        RFFreq          FDC Frequency
1403                        SymbolRate      { FDC_SYMBOL_RATE_772, FDC_SYMBOL_RATE_1024, FDC_SYMBOL_RATE_1544 }
1404                        ClockPol        { FDC_INVERT_SIGNAL, FDC_NO_INVERT_SIGNAL }
1405                        DataPol         { FDC_INVERT_SIGNAL, FDC_NO_INVERT_SIGNAL }
1406                        DecoderMode     { FDC_INVERT_SIGNAL, FDC_NO_INVERT_SIGNAL }
1407                - Returns : DHL_OK on success, DHL_FAIL on failure
1408                - Note
1409
1410 ***************************************************************************/
1411DHL_RESULT DHL_FE_SetFDCConfig( TunerType Tuner, DS_U32 RFFreq, FdcSymbolRate_t SymbolRate, 
1412                                                                FdcSignalPolarity_t ClockPol, FdcSignalPolarity_t DataPol, 
1413                                                                FdcSignalPolarity_t DecoderMode, DS_U32 RefDivider )
1414{
1415        P_DST_FE pDSTFETuner;
1416        DHL_RESULT dhlResult = DHL_OK;
1417
1418        if ( Tuner >= TUNER_MAX || Tuner <= TUNER_UNKNOWN )     {
1419                DHL_DbgPrintf( 0, DHLDBG_FE, "Error: Selected Tuner is %d\n", Tuner );
1420                return DHL_FAIL;
1421        }
1422
1423        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1424
1425        /* Take the MUTEX */
1426       
1427       
1428        /* State Checking */
1429        if ( (pDSTFETuner->bCurState != TUNERSTATE_INIT) && (pDSTFETuner->bCurState != TUNERSTATE_STOP) ) {
1430                DHL_DbgPrintf( 0, DHLDBG_FE, " Error: Should be INIT or STOP, %d\n", pDSTFETuner->bCurState );
1431                dhlResult = DHL_FAIL;
1432                goto done;
1433        }
1434
1435
1436#if 0
1437        /* ÀÌ ÇÔ¼ö¿¡¼­´Â ¼³Á¤¸¸ Çϰí, ½ÇÁ¦ Àû¿ëÀº DD_FE_SetChannelFDC()¿¡¼­ Çϵµ·Ï ÇÔ.
1438           hwatk - 2004.07.28 */
1439           
1440        /* Call the lower device driver */
1441        dhlResult = DD_FE_SetFDCConfig( pDSTFETuner, RFFreq, SymbolRate, ClockPol, DataPol, DecoderMode, RefDivider );
1442        if ( dhlResult != DHL_OK )
1443                goto done;
1444#endif
1445
1446        pDSTFETuner->uFrequency = RFFreq;
1447        pDSTFETuner->FdcSymbolRate = SymbolRate;
1448        pDSTFETuner->FdcClockPolarity = ClockPol;
1449        pDSTFETuner->FdcDataPolarity = DataPol;
1450        pDSTFETuner->FdcDecoderMode = DecoderMode;
1451        pDSTFETuner->RefDivider = RefDivider;
1452       
1453done:
1454        /* Give the MUTEX */
1455       
1456       
1457        return dhlResult;
1458}
1459
1460DHL_RESULT DHL_FE_CheckAlive( TunerType Tuner )
1461{
1462        DHL_RESULT dhlResult = DHL_OK;
1463        P_DST_FE pDSTFETuner;
1464        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1465
1466        //JFET_20050125
1467        //Remove the Av drop at qam64 channels
1468        //Tempopary
1469        return  DHL_OK;
1470       
1471        /* Take the MUTEX */
1472
1473
1474
1475        dhlResult = DD_FE_CheckAlive(pDSTFETuner);
1476        if ( dhlResult != DHL_OK ) {
1477                DHL_DbgPrintf( 0, DHLDBG_FE, " Error: line = %d, dhlResult = 0x%x\n", __LINE__, dhlResult );
1478        }
1479       
1480        return dhlResult;
1481}
1482
1483DHL_RESULT DHL_FE_SetInput( TunerType Tuner, int Cable )
1484{
1485        DHL_RESULT dhlResult = DHL_OK;
1486        P_DST_FE pDSTFETuner;
1487        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1488
1489        dhlResult = DD_FE_SetInput( pDSTFETuner, Cable );
1490
1491        return dhlResult;
1492}
1493
1494DHL_RESULT DHL_FE_SetGPIOC( TunerType Tuner, int mask, int value )
1495{
1496        DHL_RESULT dhlResult = DHL_OK;
1497        P_DST_FE pDSTFETuner;
1498        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1499
1500        dhlResult = DD_FE_SetGPIOC( pDSTFETuner, mask, value );
1501
1502        return dhlResult;
1503}
1504
1505DHL_RESULT DHL_FE_GetGPIOC( TunerType Tuner, int mask, int *value )
1506{
1507        DHL_RESULT dhlResult = DHL_OK;
1508        P_DST_FE pDSTFETuner;
1509        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1510
1511        dhlResult = DD_FE_GetGPIOC( pDSTFETuner, mask, value );
1512
1513        return dhlResult;
1514}
1515
1516DHL_RESULT DHL_FE_GetAudioMode( TunerType Tuner, FEAudioMode_t *audioMode, FEAudioStandard_t *audioStandard )
1517{
1518        DHL_RESULT dhlResult = DHL_OK;
1519        P_DST_FE pDSTFETuner;
1520        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1521
1522        dhlResult = DD_FE_GetAudioMode( audioMode, audioStandard );
1523       
1524        return dhlResult;
1525}
1526 
1527DHL_RESULT DHL_FE_SetAudioMode( TunerType Tuner, FEAudioMode_t audioMode, FEAudioStandard_t audioStandard )
1528{
1529        DHL_RESULT dhlResult = DHL_OK;
1530        P_DST_FE pDSTFETuner;
1531        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1532
1533    /*
1534     * Just before Audio Mode Change, have to do audio mute.
1535     * (or equivalent function such as Fade Out).
1536     */
1537        if ( DHL_AUD_IsMainMuted() == _FALSE_ ) 
1538        {
1539                DD_AUD_VolumeFadeInOut_I2S(0);
1540                if (g_PreAudioModeDelay)
1541                        OS_mDelay(g_PreAudioModeDelay);
1542        }
1543       
1544        if ( DHL_IsVideoSourceATV(DHL_CAP_GetVideoSrc(0)) == 0 )
1545        {
1546                DHL_DbgPrintf( 0, DHLDBG_FE, " Error: line = %d, Current Mode is Not ATV mode", __LINE__);
1547                dhlResult = DHL_FAIL;
1548                goto done;
1549           
1550        }
1551
1552        dhlResult = DD_FE_SetAudioMode( audioMode, audioStandard );
1553    SysASSERT( dhlResult == DHL_OK );
1554   
1555    /*
1556     * Just after Audio Mode Change, have to release audio mute.
1557     * (or equivalent function such as Fade In).
1558     */
1559        if ( DHL_AUD_IsMainMuted() == _FALSE_ ) 
1560    {
1561                if (g_AftAudioModeDelay)
1562                        OS_mDelay(g_AftAudioModeDelay);
1563
1564                DD_AUD_VolumeFadeInOut_I2S(1);
1565        }
1566       
1567done:           
1568        return dhlResult;
1569}
1570
1571DHL_RESULT DHL_FE_SetCarrierMute( TunerType Tuner, DS_BOOL bEn )
1572{
1573    DHL_RESULT dhlResult = DHL_OK;
1574    P_DST_FE pDSTFETuner;
1575    pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1576   
1577    pDSTFETuner->bCarrierMute = bEn;
1578   
1579    return dhlResult;
1580}
1581
1582
1583DHL_RESULT DHL_FE_SetFrequency( TunerType Tuner, DS_U32 Frequency, TunerDemod Demod )
1584{
1585        DHL_RESULT dhlResult = DHL_OK;
1586        P_DST_FE pDSTFETuner;
1587
1588        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1589        dhlResult = DD_FE_SetFrequency( pDSTFETuner, Frequency, Demod, 1 );
1590
1591        pDSTFETuner->bCurDemod = Demod;
1592
1593        //
1594        // Digital CallbackÀ» »ç¿ëÇÏÁö ¾Ê´Â °æ¿ì, (ÇÏÀ§ FE Driver°¡ Áö¿øÇÏ´Â °æ¿ì)
1595        // NTSC Callback Function¸¸À» »ç¿ëÇϵµ·Ï ÇÔ.
1596        //
1597#if USE_NTSCCALLBACK
1598        if ( pDSTFETuner->bCurDemod == DEMOD_NTSC ) 
1599        {
1600                if ( pDSTFETuner->fnFECallbackNTSC[FECALLBACK_ACQSTART-1] )
1601                        (pDSTFETuner->fnFECallbackNTSC[FECALLBACK_ACQSTART-1])(pDSTFETuner->bTuner, FECALLBACK_ACQSTART, pDSTFETuner->FECallbackNTSCUserArg[FECALLBACK_ACQSTART-1]);
1602
1603                if ( g_fe_debug ) 
1604                {
1605                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "[FAT] %s Acqusition start.\n", Demod == DEMOD_8VSB ? "8VSB" : 
1606                                                                                        Demod == DEMOD_64QAM ? "64QAM" :
1607                                                                                        Demod == DEMOD_256QAM ? "256QAM" :
1608                                                                                        Demod == DEMOD_QAM ? "QAM" :
1609                                                                                        Demod == DEMOD_NTSC ? "NTSC" :
1610                                                                                        Demod == DEMOD_ISDBT ? "ISDB-T" :
1611                                                                                        Demod == DEMOD_ISDBT_MANUAL ? "ISDB-T Manual" :
1612                                                                                        Demod == DEMOD_MODEA ? "MODEA" :
1613                                                                                        Demod == DEMOD_MODEB ? "MODEB" : "Unknown");
1614                }
1615        } 
1616#endif
1617
1618#if USE_DIGITAL_CALLBACK
1619        if ( pDSTFETuner->bCurDemod != DEMOD_NTSC ) 
1620        {
1621                if ( pDSTFETuner->fnFECallback[FECALLBACK_ACQSTART-1] )
1622                        (pDSTFETuner->fnFECallback[FECALLBACK_ACQSTART-1])(pDSTFETuner->bTuner, FECALLBACK_ACQSTART, pDSTFETuner->FECallbackUserArg[FECALLBACK_ACQSTART-1]);
1623
1624                if ( g_fe_debug ) 
1625                {
1626                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "[FAT] %s Acqusition start.\n", Demod == DEMOD_8VSB ? "8VSB" : 
1627                                                                                        Demod == DEMOD_64QAM ? "64QAM" :
1628                                                                                        Demod == DEMOD_256QAM ? "256QAM" :
1629                                                                                        Demod == DEMOD_QAM ? "QAM" :
1630                                                                                        Demod == DEMOD_NTSC ? "NTSC" :
1631                                                                                        Demod == DEMOD_ISDBT ? "ISDB-T" :
1632                                                                                        Demod == DEMOD_ISDBT_MANUAL ? "ISDB-T Manual" :
1633                                                                                        Demod == DEMOD_MODEA ? "MODEA" :
1634                                                                                        Demod == DEMOD_MODEB ? "MODEB" : "Unknown");
1635                }
1636        }
1637#endif
1638
1639        //
1640        // Monitor Thread Activate´Â Callback Function È£Ãâ ÀÌÈÄ¿¡...
1641        //
1642        if ( Tuner == TUNER_FAT ) 
1643        {
1644                pDSTFETuner->NotifyState = FE_WAIT_FOR_LOCK;
1645                pDSTFETuner->bThreadActive = _TRUE_;
1646        }
1647
1648        return dhlResult;
1649}
1650
1651#if 0
1652___Analog_Tune_Functions___()
1653#endif
1654
1655/****************************************************************************
1656
1657        Analog (NTSC) Search/Tune Function
1658
1659        DHL_FE_AnalogFullSearch()               Full Search ÇÔ¼ö / TDA9885 ±â¹Ý
1660        DHL_FE_AnalogShortSearch()              Short Search ÇÔ¼ö / TDA9885 ±â¹Ý
1661        DHL_FE_FullSearchEx()                   Full Search ÇÔ¼ö / ORION ±â¹Ý
1662
1663
1664        Sanyo Tuner ¾Ë°í¸®Áò.
1665                1. 450 kHz ´ÜÀ§·Î, 0ÀÎ ÁöÁ¡À» °Ë»ö.
1666                2. 100 kHz ´ÜÀ§·Î °¨¼Ò½Ã۸ç, Edge ÁöÁ¡À» ãÀ½.
1667                3. 50 khz ´ÜÀ§·Î Áõ°¡½Ã۸ç, ÃÖÀû Á֯ļö¸¦ ãÀ½.
1668
1669 ****************************************************************************/
1670typedef union{
1671        struct{
1672#if 0
1673                unsigned        PONR    :1;
1674                signed          AFC             :4;     // AFC4, AFC3, AFC2, AFC1
1675                unsigned        FMIFL   :1;
1676                unsigned        VIFL    :1;
1677                unsigned        AFCWIN  :1;
1678#else
1679                unsigned        AFCWIN  :1;
1680                unsigned        VIFL    :1;
1681                unsigned        FMIFL   :1;
1682                signed          AFC             :4;     // AFC4, AFC3, AFC2, AFC1
1683                unsigned        PONR    :1;
1684#endif
1685        } Part;                 // ±¸Á¶Ã¼ ¸É¹ö Á¢±Ù
1686        DS_U8                   Byte;                   // ¹ÙÀÌÆ® Á¢±Ù
1687}UTda9885ReadReg;
1688
1689#define SEARCH_FREQ_STEP_SANYO          125                     // 500 kHz
1690#define SEARCH_FREQ_FINE_STEP1          125                     // 125 kHz
1691#define SEARCH_FREQ_FINE_STEP2          62.50           // 62.50 kHz
1692
1693/*****************************************************************************
1694
1695        AnalogCheckChannelStart()
1696        AnalogCheckChannel()
1697        AnalogOneChannelSearch()
1698        AnalogSearchEnd()
1699               
1700                - Summary: TDA9885 ±â¹ÝÀÇ NTSC Signal ¿©ºÎ °Ë»ç ÇÔ¼ö.
1701                       
1702 ****************************************************************************/
1703int AnalogIsSignal(DS_U8 afc_status)
1704{
1705#if NIMTN_TYPE==NIMTN_U7A06 || NIMTN_TYPE==NIMTN_U7A26
1706       
1707        #if 0
1708        DS_U8 lockStatus = 0;
1709        OS_mDelay(100);
1710        DHL_FE_AnalogGetLockStatus( TUNER_FAT, &lockStatus );
1711        if (lockStatus)
1712                return afc_status <= 2;
1713        else
1714                return 0;
1715        #else
1716                return afc_status <= 2;
1717        #endif
1718                       
1719#else
1720        return afc_status != 7 && afc_status != 8;
1721#endif
1722}
1723       
1724static char AnalogCheckChannelStart( TunerType Tuner, float freq, DS_BOOL (*fnCancelCk1)(), DS_BOOL (*fnCancelCk2)() )
1725{
1726        P_DST_FE pDSTFETuner;
1727        DHL_RESULT dhlResult = DHL_OK;
1728        DS_U8 afc_status = 0xFF;
1729#if NIMTN_TYPE==NIMTN_TDQU || NIMTN_TYPE==NIMTN_U7A06 || NIMTN_TYPE==NIMTN_U7A26
1730        DS_U8 tdaData;
1731#elif NIMTN_TYPE==NIMTN_TDQU
1732        UTda9885ReadReg tdaData;
1733#endif
1734//      int retry = 0;
1735
1736        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1737
1738        dhlResult = DD_FE_SetFrequency( pDSTFETuner, (DS_U32)(freq * 1000), DEMOD_NTSC, 1 );
1739        if ( dhlResult != DHL_OK ) 
1740        {
1741                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1742                goto done;
1743        }
1744       
1745        MDELAY(200);
1746       
1747        //
1748        // óÀ½ Æ©´× ÈÄ 200 mSec ±â´Ù¸². (100msec --> 200msec / 2007.04.06 hwatk)
1749        // --> ä³ÎÀÌ BAND°£¿¡ º¯°æµÈ °æ¿ì, TDA9885 Status º¯°æ¿¡ ½Ã°£ÀÌ °É¸².
1750        //
1751#if NIMTN_TYPE==NIMTN_TDQU
1752
1753        dhlResult = DD_FE_GetTdquReg( pDSTFETuner, (DS_U8 *)&tdaData );
1754        if ( dhlResult != DHL_OK ) 
1755                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1756        afc_status=tdaData;
1757#elif NIMTN_TYPE==NIMTN_DTT7611
1758        dhlResult = DD_FE_GetTDA9885Reg( pDSTFETuner, (DS_U8 *)&tdaData );
1759        if ( dhlResult != DHL_OK ) 
1760                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1761       
1762        afc_status = tdaData.Part.AFC;
1763#elif NIMTN_TYPE==NIMTN_U7A06
1764        do {
1765                OS_mDelay(10);
1766               
1767                dhlResult = DD_FE_GetAFCReg( pDSTFETuner, (DS_U8 *)&tdaData );
1768                if ( dhlResult != DHL_OK ) 
1769                        DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1770               
1771                afc_status = tdaData & 0x7;
1772
1773                // If cancel is raised, then just return with afc_status = unlock (-8).
1774                if ( fnCancelCk1 ) {
1775                        if ( fnCancelCk1() ) {
1776                                afc_status = 8;
1777                                goto done;
1778                        }
1779                }
1780                if ( fnCancelCk2 ) {
1781                        if ( fnCancelCk2() ) {
1782                                afc_status = 8;
1783                                goto done;
1784                        }
1785                }
1786               
1787        } while( !(tdaData & 0x40) );
1788#elif NIMTN_TYPE==NIMTN_U7A26
1789        do {
1790                OS_mDelay(10);
1791               
1792                dhlResult = DD_FE_GetAFCReg( pDSTFETuner, (DS_U8 *)&tdaData );
1793                if ( dhlResult != DHL_OK ) 
1794                        DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1795               
1796                afc_status = tdaData & 0x7;
1797
1798                // If cancel is raised, then just return with afc_status = unlock (-8).
1799                if ( fnCancelCk1 ) {
1800                        if ( fnCancelCk1() ) {
1801                                afc_status = 8;
1802                                goto done;
1803                        }
1804                }
1805                if ( fnCancelCk2 ) {
1806                        if ( fnCancelCk2() ) {
1807                                afc_status = 8;
1808                                goto done;
1809                        }
1810                }
1811                               
1812        } while( !(tdaData & 0x40) );
1813#endif 
1814
1815done:
1816        return afc_status;
1817}
1818
1819static char AnalogCheckChannel( TunerType Tuner, float freq, DS_BOOL (*fnCancelCk1)(), DS_BOOL (*fnCancelCk2)() )
1820{
1821        P_DST_FE pDSTFETuner;
1822        DHL_RESULT dhlResult = DHL_OK;
1823        char afc_status;
1824#if NIMTN_TYPE==NIMTN_TDQU || NIMTN_TYPE==NIMTN_U7A06 || NIMTN_TYPE==NIMTN_U7A26
1825        char tdaData;
1826#elif NIMTN_TYPE==NIMTN_DTT7611
1827        UTda9885ReadReg tdaData;
1828#endif
1829        int retry = 0;
1830
1831        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1832
1833        dhlResult = DD_FE_SetFrequency( pDSTFETuner, (DS_U32)(freq * 1000), DEMOD_NTSC, 0 );
1834        if ( dhlResult != DHL_OK ) 
1835                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1836#if NIMTN_TYPE==NIMTN_TDQU
1837        dhlResult = DD_FE_GetTdquReg( pDSTFETuner, (DS_U8*)&tdaData );
1838        if ( dhlResult != DHL_OK ) 
1839                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1840       
1841        afc_status =(char) tdaData;
1842        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "++++Tdqu AFT==0x%x\n",afc_status);
1843
1844#elif NIMTN_TYPE==NIMTN_DTT7611
1845
1846        dhlResult = DD_FE_GetTDA9885Reg( pDSTFETuner, (DS_U8 *)&tdaData );
1847        if ( dhlResult != DHL_OK ) 
1848                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1849       
1850        afc_status = tdaData.Part.AFC;
1851#elif NIMTN_TYPE==NIMTN_U7A06
1852    retry = 0;
1853        do {
1854                OS_mDelay(10);
1855               
1856                dhlResult = DD_FE_GetAFCReg( pDSTFETuner, (DS_U8 *)&tdaData );
1857                if ( dhlResult != DHL_OK ) 
1858                        DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1859               
1860                afc_status = tdaData & 0x7;
1861
1862                // If cancel is raised, then just return with afc_status = unlock (-8).
1863                if ( fnCancelCk1 ) {
1864                        if ( fnCancelCk1() ) {
1865                                afc_status = 8;
1866                                goto done;
1867                        }
1868                }
1869                if ( fnCancelCk2 ) {
1870                        if ( fnCancelCk2() ) {
1871                                afc_status = 8;
1872                                goto done;
1873                        }
1874                }
1875        } while( !(tdaData & 0x40) && retry++ < 10 );
1876#elif NIMTN_TYPE==NIMTN_U7A26
1877    retry = 0;
1878        do {
1879                OS_mDelay(10);
1880               
1881                dhlResult = DD_FE_GetAFCReg( pDSTFETuner, (DS_U8 *)&tdaData );
1882                if ( dhlResult != DHL_OK ) 
1883                        DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
1884               
1885                afc_status = tdaData & 0x7;
1886
1887                // If cancel is raised, then just return with afc_status = unlock (-8).
1888                if ( fnCancelCk1 ) {
1889                        if ( fnCancelCk1() ) {
1890                                afc_status = 8;
1891                                goto done;
1892                        }
1893                }
1894                if ( fnCancelCk2 ) {
1895                        if ( fnCancelCk2() ) {
1896                                afc_status = 8;
1897                                goto done;
1898                        }
1899                }
1900        } while( !(tdaData & 0x40) && retry++ < 10  );
1901#else   
1902        afc_status = 0xFF;
1903       
1904#endif
1905
1906done:
1907        return afc_status;
1908}
1909
1910static int AnalogOneChannelSearchConfirm( TunerType Tuner, float *try_freq, float start_freq, float end_freq, DS_U8 afc_status, DS_BOOL (*fnCancelCk1)(), DS_BOOL (*fnCancelCk2)() )
1911{
1912        int bFound = 0;
1913       
1914        if (afc_status <=2 ) {
1915                for(*try_freq=*try_freq-SEARCH_FREQ_FINE_STEP1; *try_freq>=start_freq; *try_freq-=SEARCH_FREQ_FINE_STEP1) {
1916                        afc_status=AnalogCheckChannel(Tuner, *try_freq, fnCancelCk1, fnCancelCk2);
1917                        fprintf(stderr,"|%s|%d %d\n",__FUNCTION__,__LINE__,(int)*try_freq);
1918                        if (afc_status > 3) {
1919                                bFound = 1;
1920                                break;
1921                        }
1922                }
1923               
1924                if (bFound) {
1925                        for(*try_freq=*try_freq+SEARCH_FREQ_FINE_STEP2; *try_freq<=end_freq; *try_freq+=SEARCH_FREQ_FINE_STEP2) {
1926                                afc_status=AnalogCheckChannel(Tuner, *try_freq, fnCancelCk1, fnCancelCk2);
1927                                if (afc_status < 3) {
1928//                                      *try_freq -= SEARCH_FREQ_FINE_STEP2*3;
1929//                                      AnalogCheckChannel(Tuner,*try_freq);
1930                                        bFound = 1;
1931                                        break;
1932                                }
1933                        }
1934                }
1935        }
1936        return bFound;
1937}
1938
1939
1940static char AnalogOneChannelSearch_Sanyo( TunerType Tuner, float start_freq, float end_freq, float step_freq, float *tune_freq, DS_BOOL (*fnCancelCk1)(), DS_BOOL (*fnCancelCk2)() )
1941{       
1942        P_DST_FE pDSTFETuner;
1943        char afc_status;
1944        float freq;     
1945        DS_U8 lockStatus;
1946        volatile DS_U32 startTick;
1947        int bFound = 0;
1948
1949        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
1950
1951        /* ¿ì¼± Center Frequency + 250 kHz·Î ãÀ½. */
1952        freq = (start_freq+end_freq)/2;
1953        freq += SEARCH_FREQ_FINE_STEP1*3;
1954        afc_status = AnalogCheckChannelStart(TUNER_FAT, freq, fnCancelCk1, fnCancelCk2);
1955        if( afc_status==0 ) {
1956                // MDELAY 200
1957                startTick = OS_GetTickCount();
1958                do {
1959                        MDELAY(10);
1960
1961                        // If cancel is raised, then just return with afc_status = unlock (-8).
1962                        if ( fnCancelCk1 ) {
1963                                if ( fnCancelCk1() ) {
1964                                        afc_status = 8;
1965                                        goto done;
1966                                }
1967                        }
1968                        if ( fnCancelCk2 ) {
1969                                if ( fnCancelCk2() ) {
1970                                        afc_status = 8;
1971                                        goto done;
1972                                }
1973                        }
1974
1975                } while ( (OS_GetTickCount()-startTick) < 20 );
1976               
1977                startTick = OS_GetTickCount();
1978                do {
1979                        lockStatus = 0;                 // Cortez¿¡¼­ ¿¡·¯¸¦ ¹ÝȯÇÏ´Â °æ¿ì, Àç½ÃµµÇϵµ·Ï 0À¸·Î ¼³Á¤.
1980                        DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
1981                        if ( lockStatus )       
1982                                goto done;
1983
1984                        // If cancel is raised, then just return with afc_status = unlock (-8).
1985                        if ( fnCancelCk1 ) {
1986                                if ( fnCancelCk1() ) {
1987                                        afc_status = 8;
1988                                        goto done;
1989                                }
1990                        }
1991                        if ( fnCancelCk2 ) {
1992                                if ( fnCancelCk2() ) {
1993                                        afc_status = 8;
1994                                        goto done;
1995                                }
1996                        }
1997
1998                        MDELAY(50);
1999                } while( (OS_GetTickCount()-startTick) < (g_AnalogSearchDelay/10) );
2000                printf("|%s:%d| UNLOCK!\n", __FUNCTION__, __LINE__);
2001        }
2002#if 0   
2003        else{
2004                goto done;
2005        }
2006#endif 
2007        /* ¸ø ã¾ÒÀ¸¸é, start_freq ~ end_freq·Î ã±â ½ÃÀÛÇÏÀÚ. */
2008        for(freq=start_freq; freq<=end_freq; freq+=step_freq) {
2009                afc_status=AnalogCheckChannel(Tuner, freq, fnCancelCk1, fnCancelCk2);           
2010                if(afc_status<=0)//&&   H_Sync_Status==1)
2011                {
2012                        // MDELAY 200
2013                        startTick = OS_GetTickCount();
2014                        do {
2015                                MDELAY(10);
2016       
2017                                // If cancel is raised, then just return with afc_status = unlock (-8).
2018                                if ( fnCancelCk1 ) {
2019                                        if ( fnCancelCk1() ) {
2020                                                afc_status = 8;
2021                                                goto done;
2022                                        }
2023                                }
2024                                if ( fnCancelCk2 ) {
2025                                        if ( fnCancelCk2() ) {
2026                                                afc_status = 8;
2027                                                goto done;
2028                                        }
2029                                }
2030                        } while ( (OS_GetTickCount()-startTick) < 20 );
2031                       
2032                        startTick = OS_GetTickCount();
2033                        do {
2034                                lockStatus = 0;                 // Cortez¿¡¼­ ¿¡·¯¸¦ ¹ÝȯÇÏ´Â °æ¿ì, Àç½ÃµµÇϵµ·Ï 0À¸·Î ¼³Á¤.
2035                                DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2036                                if ( lockStatus )       
2037                                        goto done;
2038                                // If cancel is raised, then just return with afc_status = unlock (-8).
2039                                if ( fnCancelCk1 ) {
2040                                        if ( fnCancelCk1() ) {
2041                                                afc_status = 8;
2042                                                goto done;
2043                                        }
2044                                }
2045                                if ( fnCancelCk2 ) {
2046                                        if ( fnCancelCk2() ) {
2047                                                afc_status = 8;
2048                                                goto done;
2049                                        }
2050                                }
2051       
2052                                MDELAY(50);
2053                        } while( (OS_GetTickCount()-startTick) < (g_AnalogSearchDelay/10) );
2054                        printf("|%s:%d| UNLOCK!\n", __FUNCTION__, __LINE__);
2055                }
2056    }
2057
2058done:
2059//static int AnalogOneChannelSearchConfirm( TunerType Tuner, float try_freq, float start_freq, float end_freq, DS_U8 afc_status )
2060        if (lockStatus && afc_status <=0){
2061                bFound = AnalogOneChannelSearchConfirm( Tuner, &freq, start_freq, end_freq, afc_status, fnCancelCk1, fnCancelCk2 );
2062        }
2063       
2064        if (bFound)
2065                *tune_freq = freq;
2066    else
2067        *tune_freq = -1;
2068       
2069    return afc_status;
2070}
2071
2072#if NIMTN_TYPE==NIMTN_TDQU
2073static char AnalogOneCenterSearch( TunerType Tuner, float start_freq, float end_freq, float step_freq, float *tune_freq, DS_BOOL (*fnCancelCk1)(), DS_BOOL (*fnCancelCk2)())
2074{       
2075        P_DST_FE pDSTFETuner;
2076        char afc_status = 0;
2077        DS_U8 lockStatus = 0;   
2078        float saved_freq = 0;
2079        int state_cnt = 0;
2080        char status = 0;
2081        float freq;     
2082       
2083        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
2084        /* ¿ì¼± Center Frequency·Î ãÀ½. */
2085        freq = (start_freq+end_freq)/2 + 400; //
2086        afc_status = AnalogCheckChannelStart( TUNER_FAT, freq, fnCancelCk1, fnCancelCk2);       
2087        if(afc_status == 0){    // if correct frequency exist near center frequency
2088                for(freq=(start_freq+end_freq)/2 + 400;freq>=start_freq;freq-=step_freq){
2089                        afc_status=AnalogCheckChannel(Tuner, freq, fnCancelCk1, fnCancelCk2);
2090                        if(status == 0){
2091                                if(afc_status >= 2){
2092                                        state_cnt++;
2093                                        saved_freq = freq;
2094                                        status = 1;
2095                                }
2096                        }else if(status == 1){
2097                                if(afc_status == 3){
2098                                        state_cnt++;
2099                                        saved_freq = freq;
2100                                }else {
2101                                        status = 2;
2102                                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "***check the frequency****\n");
2103                                        afc_status=AnalogCheckChannelStart(Tuner, saved_freq, fnCancelCk1, fnCancelCk2);
2104                                        DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2105                                        if ( lockStatus )       {
2106                                                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "****Analog Locked ****\n");
2107                                                status = 2;
2108                                                afc_status = 3;
2109                                                *tune_freq = saved_freq;
2110                                                return afc_status;
2111                                        }else{
2112                                                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "****Faked Lock Status****\n");
2113                                                status = 0;
2114                                                state_cnt = 0;
2115                                                saved_freq = 0;         
2116                                                afc_status = 0;
2117                                                *tune_freq = saved_freq;
2118                                                return afc_status;
2119                                        }               
2120                                }
2121                        }
2122                }
2123        }else {
2124                afc_status = 0;
2125                saved_freq = 0;
2126        }
2127
2128        if(saved_freq){
2129        *tune_freq = saved_freq;
2130  }else{
2131        *tune_freq = freq;
2132  }
2133  return afc_status;
2134}
2135
2136
2137static char AnalogOneChannelSearchX( TunerType Tuner, float start_freq, float end_freq, float step_freq, float *tune_freq, DS_BOOL (*fnCancelCk1)(), DS_BOOL (*fnCancelCk2)())
2138{       
2139        P_DST_FE pDSTFETuner;
2140        char afc_status = 0;
2141        float saved_freq = 0;
2142        int state_cnt = 0;
2143        DS_U8 lockStatus = 0;
2144        char status = 0;
2145        char bottom = 0;
2146        float freq;     
2147        char first = 0;
2148        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
2149        /* ¿ì¼± Center Frequency·Î ãÀ½. */
2150        for(freq=start_freq; freq<=end_freq; freq+=step_freq) {
2151                if(!first){
2152                        afc_status=AnalogCheckChannelStart(Tuner, freq, fnCancelCk1, fnCancelCk2);
2153                        first = 1;
2154                }else{
2155                        afc_status=AnalogCheckChannel(Tuner,freq, fnCancelCk1, fnCancelCk2);
2156                }
2157                if(status == 0){
2158                        if(afc_status <= 3){
2159                                state_cnt++;
2160                                saved_freq = freq;
2161                                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "1");
2162                                status = 1;
2163                        }
2164                }else if(status == 1){
2165                        if(afc_status == 2 || afc_status == 1){
2166                                bottom = 1;
2167                        }
2168                        if(afc_status == 0){
2169                                afc_status=AnalogCheckChannelStart(Tuner, saved_freq, fnCancelCk1, fnCancelCk2);
2170                                MDELAY(200);
2171                                DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2172                                if ( lockStatus )       {
2173                                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "****Analog Locked ****\n");
2174                                        status = 2;
2175                                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "2");
2176                                        afc_status = 3;
2177                                        goto finish;
2178        //                      if(afc_status == 3 || afc_status == 4)
2179        //                      goto done;                     
2180                                }else{
2181                                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "****Faked Lock Status****\n");
2182                                        status = 0;
2183                                        state_cnt = 0;
2184                                        bottom = 0;
2185                                        saved_freq = 0;         
2186                                        bottom = 0;
2187                                }               
2188                        }else if(afc_status == 4){
2189                                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "0");
2190                                if(bottom){
2191                                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "wrong region\n");
2192                                        bottom = 0;
2193                                }                               
2194                                status = 0;
2195                                state_cnt = 0;
2196                                bottom = 0;
2197                                saved_freq = 0;
2198                        }else if(afc_status == 3){
2199                                if(bottom){
2200                                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "wrong region\n");
2201                                        saved_freq = freq;
2202                                        bottom = 0;
2203                                }
2204                                state_cnt = 1;
2205                        }
2206                }
2207        }
2208        afc_status = 0;
2209finish:
2210        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "status count is %d\n",state_cnt);     
2211        if(saved_freq){
2212        *tune_freq = saved_freq;
2213  }else{
2214        *tune_freq = freq;
2215  }
2216        return afc_status;
2217}
2218#endif
2219static char AnalogOneChannelSearch( TunerType Tuner, float start_freq, float end_freq, float step_freq, float *tune_freq, DS_BOOL (*fnCancelCk1)(), DS_BOOL (*fnCancelCk2)() )
2220{       
2221        P_DST_FE pDSTFETuner;
2222        char afc_status;
2223        float freq;     
2224        DS_U8 lockStatus;
2225        volatile DS_U32 startTick;
2226
2227        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
2228
2229        /* ¿ì¼± Center Frequency·Î ãÀ½. */
2230        freq = (start_freq+end_freq)/2;
2231        afc_status = AnalogCheckChannelStart(TUNER_FAT, freq, fnCancelCk1, fnCancelCk2);
2232        printf("|%s:%d| afc_status=%d\n", __FUNCTION__, __LINE__, afc_status);
2233
2234        /* ã¾ÒÀ¸¸é ³ª°¡ÀÚ. */ 
2235#if NIMTN_TYPE==NIMTN_TDQU
2236        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "*****AnalogOneChannelSearch******afc_status=%d\n",afc_status);
2237        //if(afc_status != 0 && afc_status != 4 )//&&   H_Sync_Status==1)
2238        if(afc_status !=5)//afc_status: error
2239        {
2240                lockStatus = 1;
2241                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "****Analog Locked Directly****\n");
2242                lockStatus = 1; 
2243                MDELAY(300);
2244                DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2245                if ( lockStatus )       {
2246                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "****Analog Locked by Directly****\n");
2247//                      if(afc_status == 3 || afc_status == 4)
2248//                              goto done;                     
2249                }
2250        }
2251       
2252#elif (NIMTN_TYPE==NIMTN_DTT7611)
2253        if(AnalogIsSignal(afc_status)) {
2254                // MDELAY 200
2255                startTick = OS_GetTickCount();
2256                do {
2257                        MDELAY(10);
2258
2259                        // If cancel is raised, then just return with afc_status = unlock (-8).
2260                        if ( fnCancelCk1 ) {
2261                                if ( fnCancelCk1() ) {
2262                                        afc_status = -8;
2263                                        goto done;
2264                                }
2265                        }
2266                        if ( fnCancelCk2 ) {
2267                                if ( fnCancelCk2() ) {
2268                                        afc_status = -8;
2269                                        goto done;
2270                                }
2271                        }
2272
2273                } while ( (OS_GetTickCount()-startTick) < 20 );
2274               
2275                startTick = OS_GetTickCount();
2276                do {
2277                        lockStatus = 0;                 // Cortez¿¡¼­ ¿¡·¯¸¦ ¹ÝȯÇÏ´Â °æ¿ì, Àç½ÃµµÇϵµ·Ï 0À¸·Î ¼³Á¤.
2278                        DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2279                        if ( lockStatus )       
2280                                goto done;
2281
2282                        // If cancel is raised, then just return with afc_status = unlock (-8).
2283                        if ( fnCancelCk1 ) {
2284                                if ( fnCancelCk1() ) {
2285                                        afc_status = -8;
2286                                        goto done;
2287                                }
2288                        }
2289                        if ( fnCancelCk2 ) {
2290                                if ( fnCancelCk2() ) {
2291                                        afc_status = -8;
2292                                        goto done;
2293                                }
2294                        }
2295
2296                        MDELAY(50);
2297                } while( (OS_GetTickCount()-startTick) < (g_AnalogSearchDelay/10) );
2298                printf("|%s:%d| UNLOCK!\n", __FUNCTION__, __LINE__);
2299        }
2300#else
2301        if(afc_status==0) {
2302                // MDELAY 200
2303                startTick = OS_GetTickCount();
2304                do {
2305                        MDELAY(10);
2306
2307                        // If cancel is raised, then just return with afc_status = unlock (-8).
2308                        if ( fnCancelCk1 ) {
2309                                if ( fnCancelCk1() ) {
2310                                        afc_status = -8;
2311                                        goto done;
2312                                }
2313                        }
2314                        if ( fnCancelCk2 ) {
2315                                if ( fnCancelCk2() ) {
2316                                        afc_status = -8;
2317                                        goto done;
2318                                }
2319                        }
2320
2321                } while ( (OS_GetTickCount()-startTick) < 20 );
2322               
2323                startTick = OS_GetTickCount();
2324                do {
2325                        lockStatus = 0;                 // Cortez¿¡¼­ ¿¡·¯¸¦ ¹ÝȯÇÏ´Â °æ¿ì, Àç½ÃµµÇϵµ·Ï 0À¸·Î ¼³Á¤.
2326                        DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2327                        if ( lockStatus )       
2328                                goto done;
2329
2330                        // If cancel is raised, then just return with afc_status = unlock (-8).
2331                        if ( fnCancelCk1 ) {
2332                                if ( fnCancelCk1() ) {
2333                                        afc_status = -8;
2334                                        goto done;
2335                                }
2336                        }
2337                        if ( fnCancelCk2 ) {
2338                                if ( fnCancelCk2() ) {
2339                                        afc_status = -8;
2340                                        goto done;
2341                                }
2342                        }
2343
2344                        MDELAY(50);
2345                } while( (OS_GetTickCount()-startTick) < (g_AnalogSearchDelay/10) );
2346                printf("|%s:%d| UNLOCK!\n", __FUNCTION__, __LINE__);
2347        }
2348
2349#endif 
2350
2351       
2352        /* ¸ø ã¾ÒÀ¸¸é, start_freq ~ end_freq·Î ã±â ½ÃÀÛÇÏÀÚ. */
2353        for(freq=start_freq; freq<=end_freq; freq+=step_freq) {
2354                afc_status=AnalogCheckChannel(Tuner, freq, fnCancelCk1, fnCancelCk2);
2355#if NIMTN_TYPE==NIMTN_TDQU
2356                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "**********Frequency Checking**********\n");
2357                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "*****AnalogOneChannelSearch******afc_status=%d\n",afc_status);
2358                //if(afc_status !=0 && afc_status != 4)//&&     H_Sync_Status==1)
2359                if(afc_status !=5)
2360                {
2361                        lockStatus = 1;
2362                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "****Analog Locked by AFT****\n");
2363                        MDELAY(300);
2364                        DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2365                        if ( lockStatus )       {
2366                                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "****Analog Locked by AFT****\n");
2367//                              if(afc_status == 3 || afc_status == 4)
2368//                                      goto done;
2369                        }       
2370                }
2371               
2372#elif (NIMTN_TYPE==NIMTN_DTT7611)
2373                if(AnalogIsSignal(afc_status))//&&      H_Sync_Status==1)
2374                {
2375                        // MDELAY 200
2376                        startTick = OS_GetTickCount();
2377                        do {
2378                                MDELAY(10);
2379       
2380                                // If cancel is raised, then just return with afc_status = unlock (-8).
2381                                if ( fnCancelCk1 ) {
2382                                        if ( fnCancelCk1() ) {
2383                                                afc_status = -8;
2384                                                goto done;
2385                                        }
2386                                }
2387                                if ( fnCancelCk2 ) {
2388                                        if ( fnCancelCk2() ) {
2389                                                afc_status = -8;
2390                                                goto done;
2391                                        }
2392                                }
2393                        } while ( (OS_GetTickCount()-startTick) < 20 );
2394                       
2395                        startTick = OS_GetTickCount();
2396                        do {
2397                                lockStatus = 0;                 // Cortez¿¡¼­ ¿¡·¯¸¦ ¹ÝȯÇÏ´Â °æ¿ì, Àç½ÃµµÇϵµ·Ï 0À¸·Î ¼³Á¤.
2398                                DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2399                                if ( lockStatus )       
2400                                        goto done;
2401       
2402                                // If cancel is raised, then just return with afc_status = unlock (-8).
2403                                if ( fnCancelCk1 ) {
2404                                        if ( fnCancelCk1() ) {
2405                                                afc_status = -8;
2406                                                goto done;
2407                                        }
2408                                }
2409                                if ( fnCancelCk2 ) {
2410                                        if ( fnCancelCk2() ) {
2411                                                afc_status = -8;
2412                                                goto done;
2413                                        }
2414                                }
2415       
2416                                MDELAY(50);
2417                        } while( (OS_GetTickCount()-startTick) < (g_AnalogSearchDelay/10) );
2418                        printf("|%s:%d| UNLOCK!\n", __FUNCTION__, __LINE__);
2419                }
2420#else
2421                if(afc_status==0)//&&   H_Sync_Status==1)
2422                {
2423                        // MDELAY 200
2424                        startTick = OS_GetTickCount();
2425                        do {
2426                                MDELAY(10);
2427       
2428                                // If cancel is raised, then just return with afc_status = unlock (-8).
2429                                if ( fnCancelCk1 ) {
2430                                        if ( fnCancelCk1() ) {
2431                                                afc_status = -8;
2432                                                goto done;
2433                                        }
2434                                }
2435                                if ( fnCancelCk2 ) {
2436                                        if ( fnCancelCk2() ) {
2437                                                afc_status = -8;
2438                                                goto done;
2439                                        }
2440                                }
2441                        } while ( (OS_GetTickCount()-startTick) < 20 );
2442                       
2443                        startTick = OS_GetTickCount();
2444                        do {
2445                                lockStatus = 0;                 // Cortez¿¡¼­ ¿¡·¯¸¦ ¹ÝȯÇÏ´Â °æ¿ì, Àç½ÃµµÇϵµ·Ï 0À¸·Î ¼³Á¤.
2446                                DHL_FE_AnalogGetLockStatus( Tuner, &lockStatus );
2447                                if ( lockStatus )       
2448                                        goto done;
2449       
2450                                // If cancel is raised, then just return with afc_status = unlock (-8).
2451                                if ( fnCancelCk1 ) {
2452                                        if ( fnCancelCk1() ) {
2453                                                afc_status = -8;
2454                                                goto done;
2455                                        }
2456                                }
2457                                if ( fnCancelCk2 ) {
2458                                        if ( fnCancelCk2() ) {
2459                                                afc_status = -8;
2460                                                goto done;
2461                                        }
2462                                }
2463       
2464                                MDELAY(50);
2465                        } while( (OS_GetTickCount()-startTick) < (g_AnalogSearchDelay/10) );
2466                        printf("|%s:%d| UNLOCK!\n", __FUNCTION__, __LINE__);
2467                }
2468#endif
2469    }
2470#if NIMTN_TYPE!=NIMTN_TDQU
2471done:
2472#endif
2473    *tune_freq = freq;
2474    return afc_status;
2475}
2476
2477static char AnalogSearchEnd(TunerType Tuner, float freq, char afc_status, float *tune_freq)
2478{               
2479#if NIMTN_TYPE==NIMTN_TDQU
2480        char afc = afc_status;
2481        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "*******AnalogSearchEnd*****Afc_Freq=%d\n",afc_status);
2482#if 0   
2483        switch(afc_status)
2484        {
2485        case 0: freq+=162.5; break;
2486        case 1: freq+=112.5; break;
2487        case 2: freq+=62.5; break;
2488        case 4: freq-=62.5; break;
2489        case 3:
2490                return afc_status;
2491                break;
2492                               
2493        default :
2494                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "Invalid afc_status = %d\n", afc_status );
2495                return afc_status;     
2496        }
2497#endif 
2498        afc_status=AnalogCheckChannel(Tuner, freq, fnCancelCk1, fnCancelCk2);
2499        *tune_freq = freq;
2500        return afc;     
2501
2502#elif NIMTN_TYPE==NIMTN_DTT7611
2503        switch(afc_status)
2504        {       
2505                // TDA9885 - AFC Status ÂüÁ¶
2506                case  6 :       freq+=162.5; break;
2507                case  5 :       freq+=137.5; break;
2508                case  4 :       freq+=112.5; break;
2509                case  3 :       freq+= 87.5; break;
2510                case  2 :       freq+= 62.5; break;
2511                case -3 :       freq-= 62.5; break;
2512                case -4 :       freq-= 87.5; break;
2513                case -5 :       freq-=112.5; break;
2514                case -6 :       freq-=137.5; break;
2515                case -7 :       freq-=162.5; break;     
2516               
2517                case -1 :
2518                case 0 :
2519                case 1 :
2520                case -2:
2521                        return afc_status;
2522                        break;
2523                               
2524                default :
2525                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "Invalid afc_status = %d\n", afc_status );
2526                        return afc_status;     
2527        }
2528       
2529        afc_status=AnalogCheckChannel(Tuner, freq, fnCancelCk1, fnCancelCk2);
2530        *tune_freq = freq;
2531        return afc_status;     
2532#else
2533        return afc_status;
2534#endif
2535}
2536
2537#if 0
2538static char AnalogSearchEnd_Sanyo(TunerType Tuner, float freq, char afc_status, float *tune_freq)
2539{
2540        if (afc_status <= 2) {
2541                afc_status=AnalogCheckChannel(Tuner, freq, fnCancelCk1, fnCancelCk2);
2542                *tune_freq = freq;
2543        }
2544       
2545        return afc_status;     
2546}
2547#endif
2548
2549//
2550//      DHL_FE_AnalogFullSearch()       
2551//     
2552//              search_range = 0ÀÎ °æ¿ì, ´ÙÀ½ Range·Î ¼³Á¤ÇÏ¿© ãÀ½.
2553//
2554//                      if AIR
2555//                                                      +/- 2.25MHz
2556//
2557//                      if STD
2558//                              Ch 5/6          +/- 3.00MHz
2559//                              Others          -2.25MHz ~ +2.25MHz
2560//                      if HRC
2561//                              Ch 5/6          - 3.00MHz ~ + 2.25MHz
2562//                              Others          -2.25MHz ~ +2.25MHz
2563//                      if IRC
2564//                              Ch 5/6          - 3.00MHz ~ + 1.75MHz
2565//                              Others          -2.25MHz ~ +2.25MHz
2566//
2567//              ** Autoscan µî¿¡¼­´Â ²À(!) CVBS Decoder¸¦ Active ½ÃŲ »óÅ¿¡¼­ »ç¿ëÇØ¾ß ÇÔ.
2568//
2569DHL_RESULT DHL_FE_AnalogFullSearch(TunerType Tuner, DS_U32 channel, DS_S32 *offset, TuneType bFreq, float search_range, DS_BOOL (*fnCancelCk1)(), DS_BOOL (*fnCancelCk2)() )
2570{
2571        DHL_RESULT dhlResult = DHL_OK;
2572        P_DST_FE pDSTFETuner;
2573        float try_freq, tune_freq, old_freq;
2574        char afc_status;               
2575        float range_low, range_high;
2576        //////// analog full search ½Ã signalÀÌ NTSC¿¡¼­ º¯ÇÏÁö ¾Ê´Â °æ¿ì SIGNAL CALLBACKÀ» ¾È¿Ã·ÁÁà ³ë ½Ã±×³¯ÀÌ µÇ´Â ¹®Á¦¶§¹®¿¡ Ãß°¡.
2577        /////////
2578        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
2579
2580        /*
2581         * Convert Channel to Frequency if bFreq == CHANNEL.
2582         */
2583        if ( bFreq == CHANNEL ) {
2584                try_freq = ConvertChannelToFrequency( channel, pDSTFETuner->bFreqStd );
2585        } else {
2586                try_freq = channel;
2587        }
2588
2589        if ( search_range == 0 ) {
2590                switch( pDSTFETuner->bFreqStd ) {
2591                        case FREQ_AIR:
2592                                range_low = 2250;
2593                                range_high = 2250;
2594                                break;
2595       
2596                        case FREQ_STD:
2597                                if ( bFreq == CHANNEL && (channel == 5 || channel == 6) ) {
2598                                        range_low = 3000;
2599                                        range_high = 3000;
2600                                } else {
2601                                        range_low = 2250;
2602                                        range_high = 2250;
2603                                }
2604                                break;
2605                               
2606                        case FREQ_IRC:
2607                                if ( bFreq == CHANNEL && (channel == 5 || channel == 6) ) {
2608                                        range_low = 3000;
2609                                        range_high = 1750;
2610                                } else {
2611                                        range_low = 2250;
2612                                        range_high = 2250;
2613                                }
2614                                break;                         
2615                               
2616                        case FREQ_HRC:
2617                                if ( bFreq == CHANNEL && (channel == 5 || channel == 6) ) {
2618                                        range_low = 3000;
2619                                        range_high = 2250;
2620                                } else {
2621                                        range_low = 2250;
2622                                        range_high = 2250;
2623                                }
2624                                break;
2625                       
2626                        default:
2627                                DHL_DbgPrintf( 0, DHLDBG_FE, "*** Frequency standards is not initialized!\n");
2628                                return DHL_FAIL;
2629                } 
2630        } else {
2631                range_low = search_range;
2632                range_high = search_range;
2633        }
2634       
2635        old_freq = try_freq;
2636#if NIMTN_TYPE==NIMTN_TDQU     
2637        afc_status=AnalogOneCenterSearch(Tuner, try_freq-range_low, try_freq+range_high, XOCECO_STEP_FREQ, &tune_freq);
2638        if(afc_status == 0){
2639                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "aft search start\n");
2640                afc_status=AnalogOneChannelSearchX(Tuner, try_freq-range_low, try_freq+range_high, XOCECO_STEP_FREQ, &tune_freq);
2641        afc_status=AnalogSearchEnd(Tuner, tune_freq, afc_status, &tune_freq);
2642        }
2643        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "tune : %lf\n old : %lf",tune_freq,old_freq);
2644        if(afc_status == 3){
2645                *offset = (DS_S32)((tune_freq-old_freq)*1000);
2646        }else{
2647                *offset = -1;
2648        }
2649#elif NIMTN_TYPE==NIMTN_DTT7611
2650        afc_status=AnalogOneChannelSearch(Tuner, try_freq-range_low, try_freq+range_high, SEARCH_STEP_FREQ, &tune_freq, fnCancelCk1, fnCancelCk2 );
2651        afc_status=AnalogSearchEnd(Tuner, tune_freq, afc_status, &tune_freq);
2652        if( afc_status >= -3 && afc_status <= 2 )/*BK(12.15ÃâÀåmerge) <- afc_status < 2*/ {     // Æ©´× ¼º°ø           
2653                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "tune_freq = %f, old_freq = %f\n", tune_freq, old_freq );
2654                *offset = (DS_S32)((tune_freq-old_freq)*1000);          // offset => xxxxx Hz           
2655        }
2656        else 
2657        {
2658                afc_status=AnalogCheckChannel(Tuner,try_freq, fnCancelCk1, fnCancelCk2);
2659                *offset = -1;
2660        }
2661#else
2662        // +200 kHz ÁöÁ¡ºÎÅÍ Ã£±â ½ÃÀÛ.
2663#if 1
2664        tune_freq += SEARCH_FREQ_FINE_STEP1*2;
2665        afc_status=AnalogOneChannelSearch_Sanyo(Tuner, try_freq-range_low, try_freq+range_high, SEARCH_FREQ_STEP_SANYO, &tune_freq, fnCancelCk1, fnCancelCk2 );
2666        //printf("|%s| afc_status=%d\n", __FUNCTION__, afc_status);
2667        //afc_status=AnalogSearchEnd_Sanyo(Tuner, tune_freq, afc_status, &tune_freq);
2668        if( afc_status <= 2 && tune_freq != -1 )/*BK(12.15ÃâÀåmerge) <- afc_status < 2*/ {      // Æ©´× ¼º°ø           
2669                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "tune_freq = %f, old_freq = %f\n", tune_freq, old_freq );
2670                *offset = (DS_S32)((tune_freq-old_freq)*1000);          // offset => xxxxx Hz           
2671        }
2672        else 
2673        {
2674                afc_status=AnalogCheckChannel(Tuner,try_freq, fnCancelCk1, fnCancelCk2);
2675                *offset = -1;
2676        }
2677#else
2678        DHL_FE_SetFrequency( TUNER_FAT, try_freq*1000, DEMOD_NTSC );
2679        afc_status = 1;
2680        if(afc_status != 1){
2681                AnalogOneChannelSearch_Sanyo(Tuner, try_freq-range_low, try_freq+range_high, SEARCH_FREQ_STEP_SANYO, &tune_freq, fnCancelCk1, fnCancelCk2 );
2682        }
2683        tune_freq = old_freq;
2684#endif 
2685#endif 
2686        pDSTFETuner->bCurDemod = DEMOD_NTSC;
2687        pDSTFETuner->NotifyState = FE_WAIT_FOR_LOCK;   
2688        pDSTFETuner->bThreadActive = _TRUE_;
2689       
2690        return dhlResult;
2691}
2692
2693#if NIMTN_TYPE==NIMTN_TDQU
2694DHL_RESULT DHL_FE_AnalogFullSearchXO(TunerType Tuner, DS_U32 channel, DS_S32 *offset, TuneType bFreq, float search_range )
2695        {
2696        DHL_RESULT dhlResult = DHL_OK;
2697        P_DST_FE pDSTFETuner;
2698        float try_freq, tune_freq, old_freq;
2699        char afc_status;               
2700        float range_low, range_high;
2701       
2702        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
2703
2704        /*
2705         * Convert Channel to Frequency if bFreq == CHANNEL.
2706         */
2707        if ( bFreq == CHANNEL ) {
2708                try_freq = ConvertChannelToFrequency( channel, pDSTFETuner->bFreqStd );
2709        } else {
2710                try_freq = channel;
2711        }
2712
2713        if ( search_range == 0 ) {
2714                switch( pDSTFETuner->bFreqStd ) {
2715                        case FREQ_AIR:
2716                                range_low = 2250;
2717                                range_high = 2250;
2718                                break;
2719       
2720                        case FREQ_STD:
2721                                if ( bFreq == CHANNEL && (channel == 5 || channel == 6) ) {
2722                                        range_low = 3000;
2723                                        range_high = 3000;
2724                                } else {
2725                                        range_low = 2250;
2726                                        range_high = 2250;
2727                                }
2728                                break;
2729                               
2730                        case FREQ_IRC:
2731                                if ( bFreq == CHANNEL && (channel == 5 || channel == 6) ) {
2732                                        range_low = 3000;
2733                                        range_high = 1750;
2734                                } else {
2735                                        range_low = 2250;
2736                                        range_high = 2250;
2737                                }
2738                                break;                         
2739                               
2740                        case FREQ_HRC:
2741                                if ( bFreq == CHANNEL && (channel == 5 || channel == 6) ) {
2742                                        range_low = 3000;
2743                                        range_high = 2250;
2744                                } else {
2745                                        range_low = 2250;
2746                                        range_high = 2250;
2747                                }
2748                                break;
2749                       
2750                        default:
2751                                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "*** Frequency standards is not initialized!\n");
2752                                return DHL_FAIL;
2753                } 
2754        } else {
2755                range_low = search_range;
2756                range_high = search_range;
2757        }
2758       
2759        old_freq = try_freq;
2760       
2761        afc_status=AnalogOneChannelSearchX(Tuner, try_freq-range_low, try_freq+range_high, SEARCH_STEP_FREQ, &tune_freq);
2762//      afc_status=AnalogSearchEnd(Tuner, tune_freq, afc_status, &tune_freq);
2763        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "tune : %lf\n old : %lf",tune_freq,old_freq);
2764        if(afc_status == 3){
2765                *offset = (DS_S32)((tune_freq-old_freq)*1000);
2766        }else{
2767                *offset = 0;
2768        }
2769       
2770        pDSTFETuner->bCurDemod = DEMOD_NTSC;
2771        pDSTFETuner->NotifyState = FE_WAIT_FOR_LOCK;   
2772        pDSTFETuner->bThreadActive = _TRUE_;
2773       
2774        return dhlResult;
2775}
2776#endif
2777
2778DHL_RESULT DHL_FE_AnalogShortSearch(TunerType Tuner, DS_U32 channel, DS_S32 *offset, TuneType bFreq )
2779{
2780        DHL_RESULT dhlResult = DHL_OK;
2781        P_DST_FE pDSTFETuner;
2782        float try_freq, tune_freq, old_freq;
2783        char afc_status;               
2784       
2785        pDSTFETuner = &sDSTFE_Tuner[Tuner-1];
2786
2787        /*
2788         * Convert Channel to Frequency if bFreq == CHANNEL.
2789         */
2790        if ( bFreq == CHANNEL ) {
2791                try_freq = ConvertChannelToFrequency( channel, pDSTFETuner->bFreqStd );
2792        } else {
2793                try_freq = channel;
2794        }
2795
2796        old_freq = try_freq;
2797        afc_status=AnalogOneChannelSearch(Tuner, try_freq-SHORT_SEARCH_HALF_BOUND, try_freq+SHORT_SEARCH_HALF_BOUND, SEARCH_STEP_FREQ, &tune_freq, 0, 0);
2798        afc_status=AnalogSearchEnd(Tuner, tune_freq, afc_status, &tune_freq);
2799       
2800        if( afc_status >= -3 && afc_status <= 2 )/*BK(12.15ÃâÀåmerge) <- afc_status < 2*/
2801        {       // Æ©´× ¼º°ø           
2802                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "tune_freq = %f, old_freq = %f\n", tune_freq, old_freq );
2803                *offset = (DS_S32)((tune_freq-old_freq)*1000);          // offset => xxxxx Hz           
2804        }
2805        else 
2806                *offset = -1;
2807
2808        pDSTFETuner->bCurDemod = DEMOD_NTSC;
2809        pDSTFETuner->NotifyState = FE_WAIT_FOR_LOCK;   
2810        pDSTFETuner->bThreadActive = _TRUE_;
2811
2812        return dhlResult;
2813}
2814
2815/****************************************************************************
2816
2817        DHL_RESULT DHL_FE_AnalogFullSearchEx
2818                - Summary : Full search for NTSC channel.
2819                - Argument
2820                        Tuner to use, TunerType { TUNER_FAT, TUNER_FDC }
2821                        channel
2822                        returns offset in pOffset.
2823                - Returns : DHL_OK on success, DHL_FAIL on failure.
2824
2825
2826        AFT Range       (OMEGA Requirements)
2827       
2828                Air Channel
2829                        All channel             +/- 2.25MHz
2830                       
2831                Cable Channel
2832                        if HRC
2833                                Ch 5/6          +/- 3.00MHz
2834                                Others          -2.25MHz ~ +3.00MHz
2835                        else
2836                                Ch 5/6          +/- 3.00MHz
2837                                Others          -3.00MHz ~ +2.25MHz
2838
2839        AFT Sequences
2840       
2841                ORION AFT ¹®¼­ ÂüÁ¶.   
2842               
2843                E.g.
2844               
2845                PHASE1:         Center¿¡¼­ Low Limit±îÁö Lock ¿©ºÎ °Ë»ç.
2846                PHASE2:         AFT High °Ë»ö   (°Ë»öµÇ¸é PHASE3À¸·Î)
2847                PHASE3:         AFT Low  °Ë»ö   (°Ë»öµÇ¸é PHASE9À¸·Î)
2848                PHASE9:         AFT High °Ë»ö   (°Ë»öµÇ¸é PHASE8À¸·Î)
2849                PHASE8:         AFT Low °Ë»ö    (°Ë»öµÇ¸é END)
2850
2851 ***************************************************************************/
2852//
2853// AFT Range
2854//
2855#define AFT_RANGE_AIR                   2250000
2856#define AFT_RANGE_STD_LOW               3000000                 
2857#define AFT_RANGE_STD_HIGH              2250000
2858#define AFT_RANGE_HRC_LOW               2250000
2859#define AFT_RANGE_HRC_HIGH              3000000
2860#define AFT_RANGE_CH5_6                 3000000
2861
2862DHL_RESULT DHL_FE_AnalogFullSearchEx( TunerType Tuner, DS_U32 channel, DS_S32 *pOffset, TuneType bFreq, DS_S32 RangeLow, DS_S32 RangeHigh )
2863{
2864        DHL_RESULT dhlResult = DHL_OK;
2865
2866        return dhlResult;
2867}
2868
2869static int m_ALockMethod = 1;
2870DHL_RESULT DHL_FE_AnalogGetLockStatus(TunerType Tuner, DS_U8 *lockStatus)
2871{
2872        DHL_RESULT dhlResult = DHL_OK;
2873        P_DST_FE pDSTFETuner=&sDSTFE_Tuner[Tuner-1];
2874
2875#if USE_ANALOGLOCKSTATUS
2876        if (m_ALockMethod)
2877                dhlResult = DD_FE_AnalogGetLockStatusEx( pDSTFETuner, lockStatus);
2878        else
2879                dhlResult = DD_FE_AnalogGetLockStatus( pDSTFETuner, lockStatus);
2880#else
2881        pDSTFETuner = pDSTFETuner;
2882        *lockStatus = 1;
2883        //dhlResult = DHL_FAIL_NOT_IMPLEMENTED;
2884#endif
2885        return dhlResult;
2886}
2887
2888void DHL_FE_SetAnalogLockMethod(int Method)
2889{
2890        m_ALockMethod = Method;
2891}
2892
2893//
2894// NTSC CallbackÀ» À§ÇÑ Monitor Thread
2895//
2896
2897#define FE_THREAD_DELAY         40
2898
2899void DHL_FE_MonitorThread(DS_U32 arg)
2900{
2901        DHL_CAP_VIDEO_INPUT     mainSrc, subSrc;
2902        P_DST_FE pDSTFETuner;
2903        DS_U8 isLocked;
2904#if NIMTN_TYPE!=NIMTN_TDQU
2905        int w_count=0, flag=0;
2906#endif
2907       
2908        pDSTFETuner = (P_DST_FE)arg;
2909       
2910        while( 1 ) {
2911#if NIMTN_TYPE!=NIMTN_TDQU
2912                //
2913                // ´ÙÀ½Àº Weak Signal Å×½ºÆ® ¿ëµµ·Î »ç¿ëµÊ.
2914                //
2915                if ( g_test_weak_interval ) {
2916                        if ( w_count++ > g_test_weak_interval ) {
2917                                flag = flag == 0 ? 2 : 0;
2918                                set_lock( flag );
2919                                w_count = 0;
2920                        }
2921                }
2922#endif         
2923                if ( pDSTFETuner->bThreadActive == _FALSE_ ) {
2924                        MDELAY(FE_THREAD_DELAY);
2925                        continue;
2926                }
2927               
2928#if !USE_DIGITAL_CALLBACK
2929                if ( pDSTFETuner->bCurDemod != DEMOD_NTSC ) {
2930                        pDSTFETuner->bThreadActive = _FALSE_;
2931                        pDSTFETuner->NotifyState = FE_WAIT_FOR_LOCK;
2932                        MDELAY(FE_THREAD_DELAY);
2933                        continue;
2934                }
2935#endif
2936                mainSrc = DHL_CAP_GetVideoSrc(0);
2937                subSrc = DHL_CAP_GetVideoSrc(1);
2938                if ( mainSrc != DHL_CAP_ATV0_VIDEO && subSrc != DHL_CAP_ATV0_VIDEO ) {
2939                        MDELAY(FE_THREAD_DELAY);
2940                        continue;
2941                }
2942               
2943                //
2944                // ATV°¡ Main¿¡ ÀÖÀ»¶§¸¸, NTSC Adaptive NR ½ÇÇà.
2945                //
2946                if ( mainSrc == DHL_CAP_ATV0_VIDEO )
2947                        DHL_CAP_SetAdaptiveNR();
2948               
2949                /* Get NTSC lock status. */
2950                if ( pDSTFETuner->bCurDemod == DEMOD_NTSC )
2951                        DD_FE_AnalogGetLockStatus(pDSTFETuner, &isLocked);
2952                else
2953                        DD_FE_GetLockStatus(pDSTFETuner, &isLocked);
2954               
2955                //isLocked = 0;
2956               
2957                /* Send callback to upper layer. */
2958                if ( isLocked && (pDSTFETuner->NotifyState != FE_SENT_LOCK) ) {
2959                        pDSTFETuner->NotifyState = FE_SENT_LOCK;
2960                        if ( g_fe_debug ) {
2961                                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "[FAT] %s Locked.\n", pDSTFETuner->bCurDemod == DEMOD_8VSB ? "8VSB" : 
2962                                                                                                pDSTFETuner->bCurDemod == DEMOD_64QAM ? "64QAM" :
2963                                                                                                pDSTFETuner->bCurDemod == DEMOD_256QAM ? "256QAM" :
2964                                                                                                pDSTFETuner->bCurDemod == DEMOD_QAM ? "QAM" :
2965                                                                                                pDSTFETuner->bCurDemod == DEMOD_NTSC ? "NTSC" :
2966                                                                                            pDSTFETuner->bCurDemod == DEMOD_ISDBT ? "ISDB-T" :
2967                                                                                            pDSTFETuner->bCurDemod == DEMOD_ISDBT_MANUAL ? "ISDB-T Manual" :
2968                                                                                                pDSTFETuner->bCurDemod == DEMOD_MODEA ? "MODEA" :
2969                                                                                                pDSTFETuner->bCurDemod == DEMOD_MODEB ? "MODEB" : "Unknown");
2970                        }
2971                        if ( pDSTFETuner->bCurDemod == DEMOD_NTSC ) {
2972                                if ( pDSTFETuner->fnFECallbackNTSC[FECALLBACK_LOCK-1] ) {
2973                                        (pDSTFETuner->fnFECallbackNTSC[FECALLBACK_LOCK-1])(pDSTFETuner->bTuner, FECALLBACK_LOCK, pDSTFETuner->FECallbackUserArg[FECALLBACK_LOCK-1]);
2974                                }
2975                        } else {
2976                                if ( pDSTFETuner->fnFECallback[FECALLBACK_LOCK-1] ) {
2977                                        (pDSTFETuner->fnFECallback[FECALLBACK_LOCK-1])(pDSTFETuner->bTuner, FECALLBACK_LOCK, pDSTFETuner->FECallbackUserArg[FECALLBACK_LOCK-1]);
2978                                }
2979                        }                               
2980                }
2981                else if ( !isLocked && (pDSTFETuner->NotifyState == FE_SENT_LOCK) ) {
2982                        pDSTFETuner->NotifyState = FE_SENT_UNLOCK;
2983                        if ( g_fe_debug ) {
2984                                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "[FAT] %s Unlocked.\n", pDSTFETuner->bCurDemod == DEMOD_8VSB ? "8VSB" : 
2985                                                                                                pDSTFETuner->bCurDemod == DEMOD_64QAM ? "64QAM" :
2986                                                                                                pDSTFETuner->bCurDemod == DEMOD_256QAM ? "256QAM" :
2987                                                                                                pDSTFETuner->bCurDemod == DEMOD_QAM ? "QAM" :
2988                                                                                                pDSTFETuner->bCurDemod == DEMOD_NTSC ? "NTSC" :
2989                                                                                            pDSTFETuner->bCurDemod == DEMOD_ISDBT ? "ISDB-T" :
2990                                                                                            pDSTFETuner->bCurDemod == DEMOD_ISDBT_MANUAL ? "ISDB-T Manual" :
2991                                                                                                pDSTFETuner->bCurDemod == DEMOD_MODEA ? "MODEA" :
2992                                                                                                pDSTFETuner->bCurDemod == DEMOD_MODEB ? "MODEB" : "Unknown");
2993                        }
2994                       
2995                        if ( pDSTFETuner->bCurDemod == DEMOD_NTSC ) {
2996                                if ( pDSTFETuner->fnFECallbackNTSC[FECALLBACK_UNLOCK-1] ) {
2997                                        (pDSTFETuner->fnFECallbackNTSC[FECALLBACK_UNLOCK-1])(pDSTFETuner->bTuner, FECALLBACK_UNLOCK, pDSTFETuner->FECallbackNTSCUserArg[FECALLBACK_UNLOCK-1]);
2998                                }
2999                        } else {
3000                                if ( pDSTFETuner->fnFECallback[FECALLBACK_UNLOCK-1] ) {
3001                                        (pDSTFETuner->fnFECallback[FECALLBACK_UNLOCK-1])(pDSTFETuner->bTuner, FECALLBACK_UNLOCK, pDSTFETuner->FECallbackUserArg[FECALLBACK_UNLOCK-1]);
3002                                }
3003                        }
3004                }
3005                /*
3006                else {
3007                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "NTSC = %s, NotifyState = %d\n", isLocked ? "Locked" : "Unlocked", pDSTFETuner->NotifyState );
3008                }
3009                */
3010               
3011                MDELAY(FE_THREAD_DELAY);
3012        }
3013}
3014
3015#if USE_NTSCCALLBACK
3016static DHL_RESULT DHL_FE_NTSCCallbackInit(void)
3017{
3018        DHL_RESULT dhlResult = DHL_OK;
3019        int i;
3020        P_DST_FE pDSTFETuner=&sDSTFE_Tuner[TUNER_FAT-1];
3021       
3022        for (i=0; i<(FECALLBACK_MAX-1); i++) {
3023                pDSTFETuner->fnFECallbackNTSC[i] = (P_DHL_FE_CALLBACK)0;
3024                pDSTFETuner->FECallbackNTSCUserArg[i] = 0;
3025        }
3026
3027        pDSTFETuner->NotifyState = FE_WAIT_FOR_LOCK;
3028        pDSTFETuner->bThreadActive = _FALSE_;   
3029        pDSTFETuner->feThreadId = OS_SpawnTask( DHL_FE_MonitorThread, "tFEMonitor", 60, 4096, (DS_U32)pDSTFETuner);
3030        if ( pDSTFETuner->feThreadId == 0 )
3031                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: Cannot create FE thread!\n");
3032        else
3033                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "FE Thread ID = 0x%lx\n", pDSTFETuner->feThreadId );
3034       
3035        return dhlResult;
3036}
3037#endif
3038
3039void dhl_fe_t_btsc( int Enable )
3040{
3041        P_DST_FE pDSTFETuner;
3042        pDSTFETuner = &sDSTFE_Tuner[TUNER_FAT-1];
3043       
3044        //DD_FE_I2SEnable( pDSTFETuner, Enable );
3045}
3046
3047#if 0
3048___Debugging_Functions___()
3049#endif
3050
3051/*************************************************************************
3052
3053        Debugging Functions
3054       
3055 *************************************************************************/
3056void set_am(int am, int as)
3057{
3058        DHL_RESULT dhlResult = DHL_OK;
3059       
3060        DHL_DbgPrintf( 0, DHLDBG_FE, "*** Set NTSC Audio Mode ***\n");
3061        DHL_DbgPrintf( 0, DHLDBG_FE, "   AudioMode = %s (%d)\n", 
3062                am == FE_AUDIO_MONO ? "MONO" : 
3063                am == FE_AUDIO_STEREO ? "STEREO" : 
3064                am == FE_AUDIO_MONO_SAP ? "MONO_SAP" : 
3065                am == FE_AUDIO_SAP ? "SAP" : "Unknown", am );
3066        DHL_DbgPrintf( 0, DHLDBG_FE, "   AudioStandard = %s (%d)\n",
3067                as == FE_AUDIO_OFF ? "OFF" :
3068                as == FE_AUDIO_BTSC ? "BTSC" :
3069                as == FE_DUALFM ? "DUALFM" :
3070                as == FE_AUTODETECT ? "AUTODETECT" : "Unknown", as );
3071       
3072        dhlResult = DHL_FE_SetAudioMode( TUNER_FAT, am, as );
3073        if ( dhlResult == DHL_OK )
3074                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "success.\n");
3075        else
3076                DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "failure.\n");
3077}
3078
3079void get_am(void)
3080{
3081        DHL_RESULT dhlResult = DHL_OK;
3082        FEAudioMode_t am;
3083        FEAudioStandard_t as;
3084       
3085        dhlResult = DHL_FE_GetAudioMode( TUNER_FAT, &am, &as );
3086        if ( dhlResult == DHL_OK )
3087                DHL_DbgPrintf( 0, DHLDBG_FE, "success.\n");
3088        else
3089                DHL_DbgPrintf( 0, DHLDBG_FE, "failure.\n");
3090       
3091        DHL_DbgPrintf( 0, DHLDBG_FE, "*** Get NTSC Audio Mode ***\n");
3092        DHL_DbgPrintf( 0, DHLDBG_FE, "   AudioMode = %s (%d)\n", 
3093                am == FE_AUDIO_MONO ? "MONO" : 
3094                am == FE_AUDIO_STEREO ? "STEREO" : 
3095                am == FE_AUDIO_MONO_SAP ? "MONO_SAP" : 
3096                am == FE_AUDIO_SAP ? "SAP" : "Unknown", am );
3097        DHL_DbgPrintf( 0, DHLDBG_FE, "   AudioStandard = %s (%d)\n",
3098                as == FE_AUDIO_OFF ? "OFF" :
3099                as == FE_AUDIO_BTSC ? "BTSC" :
3100                as == FE_DUALFM ? "DUALFM" :
3101                as == FE_AUTODETECT ? "AUTODETECT" : "Unknown", as );
3102}
3103
3104void tune( DS_U32 Frequency, int Demod )
3105{
3106        Frequency *= 1000;
3107#if NIMTN_TYPE==NIMTN_TDQU
3108        DS_U8 lockStatus = 0;
3109        char aft = 0;
3110#endif
3111        DHL_DbgPrintf( 0, DHLDBG_FE, "tune to %ld\n", Frequency );
3112
3113        switch ( Demod ) {
3114                case DEMOD_8VSB:        DHL_DbgPrintf( 0, DHLDBG_FE, "Demod to 8VSB\n");        break;
3115                case DEMOD_64QAM:       DHL_DbgPrintf( 0, DHLDBG_FE, "Demod to QAM64\n");       break;
3116                case DEMOD_256QAM:      DHL_DbgPrintf( 0, DHLDBG_FE, "Demod to QAM256\n");      break;
3117                case DEMOD_QAM:         DHL_DbgPrintf( 0, DHLDBG_FE, "Demod to QAM\n"); break;
3118                case DEMOD_NTSC:        DHL_DbgPrintf( 0, DHLDBG_FE, "Demod to NTSC/BTSC\n");   break;
3119                case DEMOD_ISDBT:       DHL_DbgPrintf( 0, DHLDBG_FE, "Demod to ISDB-T\n");      break;
3120                case DEMOD_ISDBT_MANUAL:        DHL_DbgPrintf( 0, DHLDBG_FE, "Demod to ISDB-T Manual\n");       break;
3121                case DEMOD_OFF:         DHL_DbgPrintf( 0, DHLDBG_FE, "Demod to OFF\n"); break;
3122                default:
3123                        DHL_DbgPrintf( 0, DHLDBG_FE, "Usage: tune [frenInKHz] [demod]\n");
3124                        DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_8VSB, "8VSB");
3125                        DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_64QAM, "64QAM");
3126                        DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_256QAM, "256QAM");
3127                        DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_QAM, "QAM");
3128                        DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_NTSC, "NTSC");
3129                        DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_ISDBT, "ISDB-T");
3130                        DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_ISDBT_MANUAL, "ISDB-T Manual");
3131                        DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_OFF, "OFF");
3132                        return;
3133        }       
3134
3135        DHL_FE_SetFrequency( TUNER_FAT, Frequency, Demod );
3136#if NIMTN_TYPE==NIMTN_TDQU
3137        DHL_FE_AnalogGetLockStatus( TUNER_FAT, &lockStatus);
3138       
3139        aft = AnalogCheckChannelStart( TUNER_FAT, Frequency, fnCancelCk1, fnCancelCk2);
3140        DHL_DbgPrintf( 0, DHLDBG_FE, "H lock status is %d\n",lockStatus);
3141        DHL_DbgPrintf( 0, DHLDBG_FE, "AFT lock status is %d\n",aft);
3142#endif 
3143}
3144
3145void isLocked(void)
3146{
3147        DHL_RESULT dhlResult = DHL_OK;
3148        DS_U8 isLocked;
3149       
3150        dhlResult = DHL_FE_GetLockStatus( TUNER_FAT, &isLocked );
3151        if ( dhlResult != DHL_OK ) {
3152                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
3153                return;
3154        }
3155       
3156        DHL_DbgPrintf( 0, DHLDBG_FE, "FAT is %s\n", isLocked == 1 ? "locked" : isLocked == 0 ? "unlocked" : "unknown" );
3157}
3158
3159void gettda()
3160{
3161        P_DST_FE pDSTFETuner;
3162        UTda9885ReadReg tdaData;
3163       
3164        pDSTFETuner = &sDSTFE_Tuner[TUNER_FAT-1];
3165
3166        DD_FE_GetTDA9885Reg( pDSTFETuner, (DS_U8 *)&tdaData );
3167
3168        DHL_DbgPrintf( 0, DHLDBG_FE, "tdaData = 0x%x\n", tdaData.Byte );
3169        DHL_DbgPrintf( 0, DHLDBG_FE, "afc_status = %d\n", tdaData.Part.AFC );
3170}
3171
3172
3173int get_analoglock()
3174{
3175        DS_U8 isLocked;
3176       
3177        isLocked = 0;
3178        if ( DHL_FE_AnalogGetLockStatus( TUNER_FAT, &isLocked ) != DHL_OK ) 
3179                isLocked = 0;
3180
3181        DHL_DbgPrintf( 0, DHLDBG_FE, "analog lock = %d (%s)\n", isLocked, isLocked ? "Locked" : "Unlocked" );
3182       
3183        return (int)isLocked;
3184}
3185
3186void TestAFT( DS_U32 channel, DS_U32 isCable )
3187{
3188        DHL_RESULT dhlResult = DHL_OK;
3189        DS_S32 Offset;
3190        P_DST_FE pDSTFETuner = &sDSTFE_Tuner[TUNER_FAT-1];
3191        DS_U32 ori_freq;
3192        DS_U8 lockStatus;
3193        volatile DS_U32 startTick, endTick;
3194
3195        DHL_FE_Stop( TUNER_FAT );
3196       
3197        if (!channel && !isCable) {
3198                printf("Usage: %s [channel] [isCable]\n", __FUNCTION__);
3199                printf("   channel: ch #\n");
3200                printf("   isCable: %d: AIR  %d:STD %d:HRC %d: IRC\n", FREQ_AIR, FREQ_STD, FREQ_HRC, FREQ_IRC);
3201                return;
3202        }
3203                       
3204        if ( isCable <= FREQ_UNKNOWN || isCable >= FREQ_MAX )
3205                isCable = FREQ_AIR;
3206               
3207        DHL_FE_SetChannelStandard( TUNER_FAT, isCable );
3208
3209        ori_freq = ConvertChannelToFrequency( channel, pDSTFETuner->bFreqStd );
3210        ori_freq *= 1000;
3211
3212        DHL_DbgPrintf( 0, DHLDBG_FE, "Frequency Standard: %s, Freq: %d\n", isCable == FREQ_AIR ? "AIR" : \
3213                                                                        isCable == FREQ_STD ? "STD" : \
3214                                                                        isCable == FREQ_HRC ? "HRC" : \
3215                                                                        isCable == FREQ_IRC ? "IRC" : "Unknown", ori_freq );
3216
3217        startTick = OS_GetTickCount();
3218        dhlResult = DHL_FE_AnalogFullSearch( TUNER_FAT, channel, &Offset, CHANNEL, 0, 0, 0 );
3219        if ( dhlResult != DHL_OK ) {
3220                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: line = %d\n", __LINE__);
3221                return;
3222        }
3223        endTick = OS_GetTickCount();
3224        printf("Elapsed Time: %ld.%ld sec\n", (endTick-startTick)/100, (endTick-startTick)%100);
3225
3226        DHL_FE_GetLockStatus( TUNER_FAT, &lockStatus ); 
3227        DHL_DbgPrintf( 0, DHLDBG_FE, "Lock Status: %d\n", lockStatus );
3228
3229        DHL_DbgPrintf( 0, DHLDBG_FE, "Original Frequency: %ld\n", ori_freq);
3230        DHL_DbgPrintf( 0, DHLDBG_FE, "New Frequency:    %ld (%ld diff)\n", ori_freq + Offset, Offset);
3231}
3232
3233DHL_RESULT PrintTunerStatus(void)
3234{
3235        DHL_RESULT dhlResult = DHL_OK;
3236        DS_U8 LockStatus;
3237        DS_U8 ana_LockStat = 0;
3238        static float SNR;
3239        static float eqSNR;
3240        DS_U32 PWR;
3241        DS_U32 SQI;
3242        DS_U32 RSErr;
3243        float RSErrRate;
3244        TunerDemod Demod;
3245       
3246        DHL_FE_GetLockStatus( TUNER_FAT, &LockStatus );
3247        DHL_FE_AnalogGetLockStatus( TUNER_FAT, &ana_LockStat );
3248        DHL_FE_GetSignalStrength( TUNER_FAT, &SQI );
3249        dhlResult = DHL_FE_GetSignalPower( TUNER_FAT, &PWR );
3250        if ( dhlResult != DHL_OK )
3251                PWR = -1;
3252
3253        if ( LockStatus == 1 ) {
3254                dhlResult = DHL_FE_GetSNR( TUNER_FAT, &SNR );
3255                dhlResult = DHL_FE_GetEqSNR( TUNER_FAT, &eqSNR );
3256                dhlResult = DHL_FE_GetRSError( TUNER_FAT, &RSErr, &RSErrRate );
3257                dhlResult = DHL_FE_GetModFormat( TUNER_FAT, &Demod );
3258        } else {
3259                SNR = -1.0f;
3260                eqSNR = SNR;
3261                RSErr = (DS_U32)-1;
3262                RSErrRate = -1.0f;
3263                Demod = DEMOD_UNKNOWN;
3264        }
3265
3266        DHL_DbgPrintf( 0, DHLDBG_FE, " <<< FAT Tuner Status >>>\n" );
3267        DHL_DbgPrintf( 0, DHLDBG_FE, "   SQI        : %lu\n", SQI );
3268        DHL_DbgPrintf( 0, DHLDBG_FE, "   Power           : %lu\n", PWR );
3269        DHL_DbgPrintf( 0, DHLDBG_FE, "   LockStatus : %u (%s)\n", LockStatus, LockStatus == 1 ? "Locked" : "Unlocked" );
3270        DHL_DbgPrintf( 0, DHLDBG_FE, "   Analog Lock: %u (%s)\n", ana_LockStat, ana_LockStat == 1 ? "Locked" : "Unlocked" );
3271        DHL_DbgPrintf( 0, DHLDBG_FE, "   SNR        : %f (%s)\n", SNR, SNR == -1.0f ? "Invalid" : "Valid" );
3272        DHL_DbgPrintf( 0, DHLDBG_FE, "   EQ-SNR     : %f (%s)\n", eqSNR, eqSNR == -1.0f ? "Invalid" : "Valid" );
3273        DHL_DbgPrintf( 0, DHLDBG_FE, "   RS Err Cnt : %lu(%s)\n", RSErr, RSErr ==(DS_U32) -1 ? "Invalid" : "Valid" );
3274        DHL_DbgPrintf( 0, DHLDBG_FE, "   RS Err Cnt : %f(%s)\n", RSErrRate, RSErrRate== -1.0f ? "Invalid" : "Valid" );
3275        DHL_DbgPrintf( 0, DHLDBG_FE, "   Modulation : %d(%s)\n", Demod, 
3276            (Demod==DEMOD_8VSB)     ? "8VSB" : 
3277            (Demod==DEMOD_64QAM)    ? "64QAM" : 
3278            (Demod==DEMOD_256QAM)   ? "256QAM" : 
3279            (Demod==DEMOD_NTSC)     ? "NTSC" : 
3280            (Demod==DEMOD_ISDBT)    ? "ISDB-T" :
3281            (Demod==DEMOD_ISDBT_MANUAL) ? "ISDB-T Manual" : "UNKNOWN");
3282
3283#if 0
3284        LockStatus = 0;
3285        dhlResult = DHL_FE_GetLockStatus( TUNER_FDC, &LockStatus );
3286        dhlResult = DHL_FE_GetSignalStrength( TUNER_FDC, &SQI );
3287
3288        if ( LockStatus == 1 ) {
3289                dhlResult = DHL_FE_GetSNR( TUNER_FDC, &SNR );
3290                dhlResult = DHL_FE_GetEqSNR( TUNER_FDC, &eqSNR );
3291                dhlResult = DHL_FE_GetModFormat( TUNER_FDC, &Demod );
3292
3293        //      dhlResult = DHL_FE_GetBERT( TUNER_FDC, &bertErrCnt, &bertErrRate );
3294
3295        } else {
3296                SNR = -1.0f;
3297                eqSNR = SNR;
3298                Demod = DEMOD_UNKNOWN;
3299                bertErrCnt = (DS_U32)-1;
3300                bertErrRate = -1.0f;
3301        }
3302
3303        DHL_DbgPrintf( 0, DHLDBG_FE, " <<< FDC Tuner Status >>> \n" );
3304        DHL_DbgPrintf( 0, DHLDBG_FE, "   SQI        : %lu\n", SQI );
3305        DHL_DbgPrintf( 0, DHLDBG_FE, "   LockStatus : %u (%s)\n", LockStatus, LockStatus == 1 ? "Locked" : "Unlocked" );
3306        DHL_DbgPrintf( 0, DHLDBG_FE, "   SNR        : %f (%s)\n", SNR, SNR == -1.0f ? "Invalid" : "Valid" );
3307        DHL_DbgPrintf( 0, DHLDBG_FE, "   Modulation : %d(%s)\n", Demod, (Demod==DEMOD_MODEA) ? "MODEA" : ((Demod==DEMOD_MODEB) ? "MODEB" : "UNKNOWN") );
3308//      DHL_DbgPrintf( 0, DHLDBG_FE, "   BERT       : %ld (%s)\n", bertErrCnt, bertErrCnt == -1 ? "Invalid" : "Valid" );
3309#endif
3310        return DHL_OK;
3311}
3312
3313void FE_AgingTest(int mod, int count, int cable)
3314{
3315        TunerDemod demod;
3316        DHL_RESULT dhlResult = DHL_OK;
3317        int curChannel, startChannel, stopChannel;
3318       
3319        if ( mod == 0 || mod > 3 ) {
3320                DHL_DbgPrintf( 0, DHLDBG_FE, "Usage: %s [modulationType]\n", __FUNCTION__);
3321                DHL_DbgPrintf( 0, DHLDBG_FE, "   modulationType\n");
3322                DHL_DbgPrintf( 0, DHLDBG_FE, "      0:8VSB  /  1:64QAM  /  2:256QAM  /  3:NTSC\n");
3323                return;
3324        }
3325       
3326        switch(mod) {
3327                case 1: demod = DEMOD_8VSB; break;
3328                case 2: demod = DEMOD_64QAM; break;
3329                case 3: demod = DEMOD_256QAM; break;
3330                case 4: demod = DEMOD_NTSC; break;
3331                case 5: demod = DEMOD_ISDBT; break;
3332                case 6: demod = DEMOD_ISDBT_MANUAL; break;
3333                default:
3334                        demod = DEMOD_8VSB; 
3335        }
3336       
3337        if ( count <= 0 )
3338                count = 1;
3339
3340        DHL_FE_Stop( TUNER_FAT );
3341        if ( cable == 1 ) {
3342                startChannel = 1;
3343                stopChannel = 135;
3344               
3345                DHL_FE_SetChannelStandard( TUNER_FAT, FREQ_STD );
3346                DHL_FE_SetInput(TUNER_FAT, 0);
3347        } else {
3348                startChannel = 2;
3349                stopChannel = 69;
3350               
3351                DHL_FE_SetChannelStandard( TUNER_FAT, FREQ_AIR );
3352                DHL_FE_SetInput(TUNER_FAT, 1);
3353        }               
3354       
3355        while ( count-- ) {
3356                for (curChannel=startChannel; curChannel<=stopChannel; curChannel++) {
3357                        dhlResult = DHL_FE_Start( TUNER_FAT, curChannel, demod, CHANNEL );
3358                        if ( dhlResult != DHL_OK )
3359                                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR, LINE=%d\n", __LINE__);
3360                       
3361                        dhlResult = DHL_FE_Stop( TUNER_FAT );
3362                        if ( dhlResult != DHL_OK )
3363                                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR, LINE=%d\n", __LINE__);
3364                       
3365                        MDELAY(1000);
3366                }
3367        }
3368}
3369
3370static void TestNTSCFunc( TunerType Tuner, FECallbackSource eventSource, DS_U32 userArg )
3371{
3372        switch(eventSource) {
3373                case FECALLBACK_LOCK:
3374                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "[NTSC] Locked. userArg = 0x%lx\n", userArg);
3375                        break;
3376                       
3377                case FECALLBACK_UNLOCK:
3378                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "[NTSC] Unlocked. userArg = 0x%lx\n", userArg);
3379                        break;
3380                       
3381                default:
3382                        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "Spurious Signal. eventSource = %d\n", eventSource);
3383        }
3384}
3385
3386void installTestNTSCCb(void)
3387{
3388        DHL_RESULT dhlResult;
3389       
3390        DHL_DbgPrintf( gdhlFeDbgLvl, DHLDBG_FE, "Install Test NTSC Callback Function.\n");
3391
3392        dhlResult = DHL_FE_SetCallbackNTSC(TUNER_FAT, FECALLBACK_ACQSTART, TestNTSCFunc, 0x1234 );
3393        if ( dhlResult != DHL_OK )
3394                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: LINE=%d\n", __LINE__);
3395       
3396        dhlResult = DHL_FE_SetCallbackNTSC(TUNER_FAT, FECALLBACK_LOCK, TestNTSCFunc, 0x1234 );
3397        if ( dhlResult != DHL_OK )
3398                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: LINE=%d\n", __LINE__);
3399       
3400        dhlResult = DHL_FE_SetCallbackNTSC(TUNER_FAT, FECALLBACK_UNLOCK, TestNTSCFunc, 0x4321 );
3401        if ( dhlResult != DHL_OK )
3402                DHL_DbgPrintf( 0, DHLDBG_FE, "ERROR: LINE=%d\n", __LINE__);
3403}
3404
3405
3406void check_freq_table(void)
3407{
3408        DS_U32 freqHRC, freqSTD;
3409        int i, err;
3410       
3411        DHL_DbgPrintf( 0, DHLDBG_FE, "Check Frequency Table\n");
3412       
3413        err = 0;
3414        for (i=1; i<=135; i++ ) {
3415                freqHRC = Cable_Freq_HRC[i];
3416                freqSTD = Cable_Freq[i];
3417                if ( (freqSTD - freqHRC) != 1250 ) {
3418                        DHL_DbgPrintf( 0, DHLDBG_FE, "Ch[%d] HRC = %ld, IRC = %ld\n", i, freqHRC, freqSTD );
3419                        err ++;
3420                }
3421        }
3422       
3423        if ( !err )
3424                DHL_DbgPrintf( 0, DHLDBG_FE, "Frequency Table is OK\n");
3425        else
3426                DHL_DbgPrintf( 0, DHLDBG_FE, "Frequency Table is INVALID, err cnt = %d\n", err);
3427}
3428
3429void set_lock(int l)
3430{
3431        if ( l == 1 )
3432                DHL_DbgPrintf( 0, DHLDBG_FE, "Force to locked status.\n");
3433        else if ( l == 0 )
3434                DHL_DbgPrintf( 0, DHLDBG_FE, "Reset to normal status.\n");
3435        else
3436                DHL_DbgPrintf( 0, DHLDBG_FE, "Force to unlocked status.\n");
3437       
3438        g_force_ss = l;
3439}
3440
3441void test_weaksignal(int interval)
3442{
3443        if (interval)
3444                DHL_DbgPrintf( 0, DHLDBG_FE, "Set weak signal status with %d msec interval.\n", interval);
3445        else
3446                DHL_DbgPrintf( 0, DHLDBG_FE, "Clear weak signal status.\n");
3447       
3448        g_test_weak_interval = interval;
3449}
3450
3451void test_lockstatus(int n)
3452{
3453        int i;
3454        DS_U32 SQI;
3455       
3456        for (i=0; i<n; i++) {
3457                DHL_DbgPrintf( 0, DHLDBG_FE, "loop %d ... ", i+1);
3458
3459                DHL_FE_GetSignalStrength(TUNER_FAT, &SQI);
3460                DHL_DbgPrintf( 0, DHLDBG_FE, "SQI = %d\n", (int) SQI);
3461        }
3462}
3463
3464void test_locktime(int prev_freq, int prev_mod, int freq, int mod, int n)
3465{
3466        int i;
3467        volatile DS_U32 startTime, elapsedTime, timeOut = 200;
3468        DS_U8 lockStat;
3469       
3470        if ( !prev_freq || !prev_mod || !freq || !mod || !n ) {
3471                DHL_DbgPrintf( 0, DHLDBG_FE, "Usage: test_locktime [prev_freq] [prev_demod] [freqInKHz] [demod] [n]\n");
3472                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_8VSB, "8VSB");
3473                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_64QAM, "64QAM");
3474                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_256QAM, "256QAM");
3475                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_QAM, "QAM");
3476                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_NTSC, "NTSC");
3477                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_ISDBT, "ISDB-T");
3478                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_ISDBT_MANUAL, "ISDB-T Manual");
3479        }
3480       
3481        for (i=0; i<n; i++) {
3482                tune(prev_freq, prev_mod);
3483                OS_mDelay(500);
3484
3485                startTime = OS_GetTickCount();
3486                tune( freq, mod );
3487               
3488                do {
3489                        lockStat = 0;
3490                        DHL_FE_GetLockStatus( TUNER_FAT, &lockStat );
3491                       
3492                        elapsedTime = OS_GetTickCount() - startTime;
3493                        if ( elapsedTime > timeOut )
3494                                break;
3495                        if ( lockStat )
3496                                break;
3497                } while ( 1 );
3498               
3499                if (elapsedTime>timeOut)
3500                        DHL_DbgPrintf( 0, DHLDBG_FE, "FAILURE: Timeout\n");
3501                if (lockStat)
3502                        DHL_DbgPrintf( 0, DHLDBG_FE, "ElapsedTime = %d msec\n", (int)elapsedTime*10);
3503        }
3504}
3505
3506void test_locktime1(int freq1, int mod1, int freq2, int mod2, int n)
3507{
3508        int i;
3509        volatile DS_U32 startTime, elapsedTime, timeOut = 300;
3510        DS_U8 lockStat;
3511        int flag = 0;
3512       
3513        if ( !freq1 || !freq2 || !mod1 || !mod2 || !n ) {
3514                DHL_DbgPrintf( 0, DHLDBG_FE, "Usage: test_locktime [freqInKHz_1] [demod_1] [freqInKHz_2] [demod_2] [n]\n");
3515                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_8VSB, "8VSB");
3516                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_64QAM, "64QAM");
3517                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_256QAM, "256QAM");
3518                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_QAM, "QAM");
3519                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_NTSC, "NTSC");
3520                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_ISDBT, "ISDB-T");
3521                DHL_DbgPrintf( 0, DHLDBG_FE, "   [demod] = %d for %s\n", DEMOD_ISDBT_MANUAL, "ISDB-T Manual");
3522        }
3523       
3524        for (i=0; i<n; i++) {
3525                startTime = OS_GetTickCount();
3526               
3527                if ( flag ) {
3528                        flag = !flag;
3529                        tune( freq1, mod1 );
3530                } else {
3531                        flag = !flag;
3532                        tune( freq2, mod2 );
3533                }
3534                               
3535                do {
3536                        lockStat = 0;
3537                        DHL_FE_GetLockStatus( TUNER_FAT, &lockStat );
3538                       
3539                        elapsedTime = OS_GetTickCount() - startTime;
3540                        if ( elapsedTime > timeOut )
3541                                break;
3542                        if ( lockStat )
3543                                break;
3544                } while ( 1 );
3545               
3546                if (elapsedTime>timeOut)
3547                        DHL_DbgPrintf( 0, DHLDBG_FE, "FAILURE: Timeout\n");
3548                if (lockStat)
3549                        DHL_DbgPrintf( 0, DHLDBG_FE, "ElapsedTime = %d msec\n", (int)elapsedTime*10);
3550        }
3551}
3552
3553void set_air_freq( int n, int freq )
3554{
3555        DS_U32 old_freq;
3556       
3557        if ( !n || !freq ) {
3558                DHL_DbgPrintf( 0, DHLDBG_FE, "Usage: %s [ch #] [freqInKHz]\n", __FUNCTION__ );
3559                return;
3560        }
3561       
3562        old_freq = Air_Freq[n];
3563        Air_Freq[n] = (DS_U32)freq;
3564        DHL_DbgPrintf( 0, DHLDBG_FE, "Old: Air_Freq[%d] = %ld\n", n, old_freq);
3565        DHL_DbgPrintf( 0, DHLDBG_FE, "New: Air_Freq[%d] = %ld\n", n, Air_Freq[n]);
3566}
3567
3568void set_am_delay(int b, int a)
3569{
3570        DHL_DbgPrintf( 0, DHLDBG_FE, "g_PreAudioModeDelay: %d --> %d\n", g_PreAudioModeDelay, b);
3571        DHL_DbgPrintf( 0, DHLDBG_FE, "g_AftAudioModeDelay: %d --> %d\n", g_AftAudioModeDelay, a);
3572       
3573        g_PreAudioModeDelay = b;
3574        g_AftAudioModeDelay = a;
3575}
3576
3577void set_analog_delay(int d)
3578{
3579        printf("Analog Full Search delay: %d --> %d\n", g_AnalogSearchDelay, d);
3580        g_AnalogSearchDelay = d;
3581}
3582
3583void test_tuner_ch(int std)
3584{
3585        int i=0;
3586       
3587        if (std==0) {
3588                printf("Usage: %s [std] [ch]\n", __FUNCTION__);
3589                printf("    where 1: AIR\n");
3590                printf("    where 2: STD\n");
3591                printf("    where 3: IRC\n");
3592                printf("    where 4: HRC\n");
3593                return;
3594        }
3595       
3596        switch(std) {
3597                case 1:
3598                        printf("Standard: AIR (2-69)\n");
3599                        for (i=2; i<=69; i++) {
3600                                tune(Air_Freq[i], 1);
3601                        }
3602                        break;
3603               
3604                case 2:
3605                        printf("Standard: STD (1-135)\n");
3606                        for (i=1; i<=135; i++) {
3607                                tune(Cable_Freq[i], 3);
3608                        }
3609                        break;
3610
3611                case 3:
3612                        printf("Standard: HRC (1-135)\n");
3613                        for (i=1; i<=135; i++) {
3614                                tune(Cable_Freq_IRC[i], 3);
3615                        }
3616                        break;
3617
3618                case 4:
3619                        printf("Standard: IRC (1-135)\n");
3620                        for (i=1; i<=135; i++) {
3621                                tune(Cable_Freq_HRC[i], 3);
3622                        }
3623                        break;
3624        }
3625}
3626
3627void test_aft_value(int ch)
3628{
3629        DS_U32 startFreq, endFreq, stepFreq, curFreq;
3630        DS_U8 tdaData;
3631       
3632        if (!ch) {
3633                printf("Usage: %s [ch]\n", __FUNCTION__);
3634                return;
3635        }
3636
3637        startFreq = Cable_Freq[ch] - 2250;
3638        endFreq = Cable_Freq[ch] + 2250;
3639        stepFreq = 50;
3640       
3641        for (curFreq=startFreq; curFreq<endFreq; curFreq += stepFreq) {
3642                tune( curFreq, 5 );
3643                OS_mDelay(100);
3644                DD_FE_GetAFCReg( 0, (DS_U8 *)&tdaData );
3645                printf("FREQ[%ld] AFC=%d\n", curFreq, tdaData & 0x7 );
3646        }
3647}
3648
Note: See TracBrowser for help on using the repository browser.