source: svn/newcon3bcm2_21bu/dst/app/src/Function/App_Fnc_Sdds2.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 52.0 KB
Line 
1/****************************************************************************
2* NAME: App_Fnc_Sdds.c
3*----------------------------------------------------------------------------
4* Copyright (c) DIGITAL STREAM Technology Inc.
5*----------------------------------------------------------------------------
6* CREATED_BY: Do Gon Lee
7* CREATION_DATE: 2009/08/20
8* $Author: foxhunt $
9* $Revision: 1.0 $
10* $Date: 2009/08/20 11:32:07 $
11*----------------------------------------------------------------------------
12* PURPOSE:
13* - EPG Init, update start/cancel, delete wrapping.
14* - program change envent procedure implement.
15*****************************************************************************/
16
17/*_____ I N C L U D E __________________________________________*/
18
19#include "App_Main.h"
20#include "App_Proc.h"
21
22#if SUPPORT_SDDS
23
24#include "DHL_Timer.h"
25#include "DHL_NVM.h"
26#include "DHL_UTL.h"
27#include "DHL_UIO.h"
28
29//#include "DMW_CodeConv.h"
30#include "DMW_PsiSdds.h"
31
32#include "App_Fnc_Common.h"
33
34#include "App_Fnc_Time.h"
35#include "App_Fnc_EPG.h"
36#include "App_Fnc_Sdds.h"
37#include "App_Fnc_AutoScan.h"
38//#include "App_Fnc_ChTune.h"
39
40//#include "App_Fnc_Rating.h"
41//#include "App_Fnc_RRT.h"
42//#include "App_Fnc_CC.h"
43
44#include "App_Res_Resources.h"
45
46
47
48
49
50
51/*_____ D E F I N I T I O N ____________________________________*/
52
53#if COMMENT
54____DbgPrint____(){}
55#endif
56
57DHL_MODULE("@f_sds", 0);
58
59
60
61#if COMMENT
62____Overview____(){}
63#endif
64
65
66/*
67        special ¸ðµå ¿¹¿Ü µ¿ÀÛ:
68
69                rf tuner ¼³Á¤À» caller°¡ ¼öÇàÇÑ´Ù.
70                pid µµ ¹Ì¸® caller°¡ ¾Ë¾Æ¼­ Àü´ÞÇÑ´Ù.
71                download delay ¾øÀÌ ¹Ù·Î µ¿ÀÛ ÇÑ´Ù.
72                download ÁøÇà Áß¿¡ LED blinking µ¿ÀÛÇÑ´Ù.
73                download ¿Ï·á ÈÄ¿¡ power on ¸ðµå¿¡¼­ ¹Ù·Î upgrade ½ÃÀÛÇÑ´Ù.
74                upgrade ¿Ï·á ÈÄ¿¡´Â ÀÚµ¿ ´ë±â ¸ðµå ÁøÀÔÇÑ´Ù.
75
76
77        LED blinking ¹æ½Ä Á¤ÀÇ:
78                off, stby (red), full (blue)
79
80                downloading in progress:
81                        normal blue blinking
82
83                flashing ready:
84                        blue on
85
86                flashing in progress:
87                        fast blue blinking
88
89                all completed:
90                        off
91
92                error found
93                        red/blue toggle
94*/
95
96
97
98#if COMMENT
99____Config____(){}
100#endif
101
102
103
104/*
105        1 À̸é flash update¸¦ À§ÇÑ º°µµÀÇ task »ç¿ë.
106        Áö±ÝÀº ±×³É mw sdds task¸¦ Ȱ¿ëÇÑ´Ù.
107
108        ´Ü flash update µµÁß¿¡´Â task ÀÀ´ä¼º
109        ¾îÂ÷ÇÇ flash update´Â ÀÏ´Ü ½ÃÀ۵Ǹé Ãë¼Ò µÉ ¼öµµ ¾øÀ¸¹Ç·Î
110        Àá½Ã blocking µÇ¾îµµ ±¦Âú´Ù.
111*/
112#define USE_FUPDATE_TASK 0
113
114
115/*
116        sdds ¾÷µ¥ÀÌÆ® ÈÄ¿¡ autoscanÀ» ¼öÇàÇÑ´Ù.
117        autoscanÀº ±âÁ¸¿¡ ½ÅÈ£°¡ ÀâÇû´ø rf¿¡ ´ëÇØ¼­¸¸ ¼öÇàÇÑ´Ù.
118*/
119#define USE_AUTOSCAN_AFTER_UPDATE 0
120
121
122/*
123        °øÀå¿¡¼­ RF ¾÷µ¥ÀÌÆ® ¿ëµµ·Î »ç¿ëÇÑ´Ù.
124        BOOT¿Í APPÀ¸·Î À̹ÌÁö¸¦ ³ª´©Áö ¾Ê°í ·Ò¶óÀÌÅÍ À̹ÌÁö¸¦ »ç¿ëÇÑ´Ù.
125*/
126#define USE_RF_UPDATE_ONLY 1
127
128
129/*
130        °¢ sdds ½ºÆ®¸²¿¡´Â Á¦Á¶»ç OUI Äڵ尡 Æ÷ÇԵǾî ÀÖ°í,
131        ÇØ´ç OUI ¿Í ÀÏÄ¡ÇÏ´Â °æ¿ì¿¡¸¸ 󸮵ǵµ·Ï µÇ¾î ÀÖ´Ù.
132
133        ÀÌ Á¦Ç°¿¡¼­ »ç¿ëÇØ¾ß ÇÏ´Â OUI°¡ DST OUI°¡ ¾Æ´Ñ °æ¿ì¶ó¸é ¼öÁ¤ ÇÊ¿ä.
134        ¿¹: ¸¸¾à OEM/ODM Á¦Ç°ÀÇ °æ¿ì..
135       
136        ÀÌ ÄÚµå´Â APP_CONFIG µî°ú °°Àº ¾îµò°¡¿¡¼­ Áß¾Ó °ü¸®°¡ ¹Ù¶÷Á÷ÇÏ´Ù.
137*/
138#define APP_SDDS_CFG_MFG_OUI  IEEE_OUI_DST
139
140/*
141        ¾Æ·¡ °ªµéÀº DST SDDS ±Ô°Ý¿¡¼­ Á¤ÇÑ °¢ Á¦Ç°º° ¸ðµ¨ ¹øÈ£ÀÌ´Ù.
142
143*/
144#define APP_SDDS_CFG_MODEL_NEWCON2  0x03
145//#define APP_SDDS_CFG_MODEL_KVCONVERTER 0x02
146
147#define APP_SDDS_CFG_MODEL  APP_SDDS_CFG_MODEL_NEWCON2
148
149
150
151// address & offsets
152//BKTODO: newcon2 Àü¿ëÀ¸·Î º¸ÀÓ.. ¼öÁ¤ÇÊ¿äÇÔ.
153#define ADDR_FLASHBASE  0xbec00000//BKTODO: 0xbc000000->0xbec00000      //#define FLASH_BASE 0xbec00000 @ramheader.h
154
155#define OFFSET_BOOTLD 0x0
156#define OFFSET_APPIMG 0x0
157
158#define ADDR_BOOTLD (ADDR_FLASHBASE+OFFSET_BOOTLD)
159#define ADDR_APPIMG (ADDR_FLASHBASE+OFFSET_APPIMG)
160//BKTODO: bootloader id³ª versionÀÌ BCM°ú ´Ù¸¦ °ÍÀ¸·Î »ý°¢µÊ. ÃßÈÄ ¼öÁ¤ÇÒ °Í.
161#define ADDR_BOOTLD_ID  (ADDR_BOOTLD+0xc0)
162#define ADDR_BOOTLD_VER (ADDR_BOOTLD+0xd0)
163
164#define ADDR_APPIMG_ID  (ADDR_APPIMG+0x00)
165#define ADDR_APPIMG_VER (ADDR_APPIMG+0x10)
166
167
168
169#define APP_FLASH_ID 0
170
171
172
173/*
174        download ¿Ï·á µÈ »óÅ¿¡¼­ standby ¸ðµå ÁøÀÔ ÈÄ
175        ¾ó¸¶ ÈÄ¿¡ flash upgrade°¡ ½ÃÀ۵ǴÂÁö¸¦ ³ªÅ¸³»´Â delay °ª.
176
177        ÃÊ ´ÜÀ§À̸ç, Å×½ºÆ®¸¦ À§Çؼ­ º¯¼ö·Î ¸¸µë.
178*/
179int g_SddsUpgradeDelayInStandbyModeSeconds = 60*10;
180
181/*
182        1À̸é upgrade delay¸¦ 1ȸ¿¡ ÇÑÇÏ¿© skip ÇÏ°í ¹Ù·Î ½ÃÀÛÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
183        Å×½ºÆ® ¸ñÀûÀÓ..
184*/
185BOOL g_SddsUpgradeSkipDelay;
186
187
188
189#if COMMENT
190____Types____(){}
191#endif
192
193
194const char *SddsCbTypeString(E_SDDS_CB_TYPE t)
195{
196        return (\
197        (t)==eSDDS_CB_TYPE_GetOUI          ? "GetOUI" :\
198        (t)==eSDDS_CB_TYPE_CheckCompatDesc ? "CompatDesc" :\
199        (t)==eSDDS_CB_TYPE_NotifySchedules ? "Schedule" :\
200        (t)==eSDDS_CB_TYPE_CheckModuleInfo ? "ModuleInfo" :\
201        (t)==eSDDS_CB_TYPE_DownloadNotRequired ? "NoDownload" :\
202        (t)==eSDDS_CB_TYPE_DownloadStarted ? "DLStart" :\
203        (t)==eSDDS_CB_TYPE_BlockReceived   ? "BlockRx" :\
204        (t)==eSDDS_CB_TYPE_DownloadCompleted ? "DLComplete" :\
205        (t)==eSDDS_CB_TYPE_DownloadStopped ? "DLStop" :\
206        (t)==eSDDS_CB_TYPE_ResetDownload   ? "Reset" :\
207        (t)==eSDDS_CB_TYPE_UserAction      ? "User" :\
208        "?");
209}
210
211const char *SddsStateString(APP_SDDS_STATE s) 
212{
213        return (\
214                (s)==eSDDS_STATE_INIT ? "Init" :\
215                (s)==eSDDS_STATE_DOWNLOADING ? "Downloading" :\
216                (s)==eSDDS_STATE_READY_FOR_FLASHING ? "ReadyForFlasing" :\
217                (s)==eSDDS_STATE_FLASHING ? "Flashing" :\
218                (s)==eSDDS_STATE_FLASH_END ? "FlashEnd" :\
219                (s)==eSDDS_STATE_COMPELTED ? "Completed" :\
220                "?");
221}
222
223
224
225typedef struct
226{
227        APP_SDDS_STATE state; 
228
229        int id; // ¿ø·¡ module id´Â 16 bit ÀÌ´Ù. -1 À̸é invalid¸¦ ÀǹÌÇÔ.
230        UINT32 size;
231        UINT8 *buffer;
232
233        UINT32 crc;
234        //BOOL bCompleted;
235       
236        UINT32 received_blocks;
237
238        int err; // if non-zero, error occurred during operation.
239       
240} APP_SDDS_FILE;
241
242typedef struct
243{
244        UINT32 start_time;
245        UINT32 duration;
246       
247} APP_SDDS_SCHEDULE;
248
249typedef struct
250{
251        //-------
252        // ÀÌ ºÎºÐÀÇ ÇʵåµéÀº ÀÏ¹Ý task¿¡¼­ update µÈ´Ù.
253        // º°µµÀÇ º¸È£¸¦ Çϰí ÀÖÁö ¾ÊÀ¸¹Ç·Î ¹®Á¦°¡ µÉ ¼ÒÁö°¡ ÀÖÀ½.
254        // ÇÏÁö¸¸ º¯°æ µÇ´Â °÷ÀÌ Á¦ÇÑÀûÀ̹ǷÎ, ÀÏ´Ü ÁøÇà.
255
256        // App_SddsServiceFound() ¿¡¼­ update µÇ´Â Çʵå. º¸Åë epg task ¿¡¼­ È£ÃâµÊ.
257        int    chtype;  // 0: air, 1: cable
258        int    rf;       // ÁøÇà ¿¹Á¤ ¶Ç´Â ÁøÇà ÁßÀÎ rf..
259
260        // App_SddsStart() ¿¡¼­ update µÇ´Â Çʵå.
261        //   °øÀå rfupdate Áß¿¡´Â menu task¿¡¼­, ÀÏ¹Ý sddsÀÇ °æ¿ì´Â timer task¿¡¼­ È£ÃâµÈ´Ù.
262        UINT16 pid;
263        UINT32 special; // °øÀå upgrade µîÀÇ special mode
264                // special ¸ðµå ¿¹¿Ü µ¿ÀÛ ºÎºÐ ¼³¸í Âü°í.
265       
266        //-------
267        // ¾Æ·¡ Çʵå´Â sdds mw task callback ¹× fupdate task ¿¡¼­¸¸ º¯°æµÈ´Ù.
268       
269        APP_SDDS_STATE state;  // Àüü state.
270
271        //-------
272        // ¾Æ·¡ ÇʵåµéÀº sdds mw task callback ¿¡¼­¸¸ º¯°æ µÈ´Ù.
273
274        int sched_chtype;
275        int sched_rf;
276        int sched_pid;
277
278        int n_sched;
279        APP_SDDS_SCHEDULE sched[10]; 
280                // 10 À̸é ÃæºÐÇÔ..
281                // »ç½Ç °¡Àå ½Ã°£ÀÌ °¡±î¿î °Í ¸î °³¸¸ ±â¾ïÇØµµ µÊ.
282
283        APP_SDDS_FILE file[2]; // boot loader and app
284        UINT32 total_blocks;
285
286        //-------
287        // ¾Æ·¡ Çʵå´Â fupdate task ¿¡¼­¸¸ º¯°æµÈ´Ù.
288
289        int total_bytes_to_write;
290        int already_done_bytes;
291        int flash_update_progress;     
292
293} APP_SDDS_INFO;
294
295
296#define APP_FW_ID_LEN 16
297#define APP_FW_VER_LEN 8
298
299typedef struct 
300{
301        // ¿ø·¡ Flash¿¡¼­ ÀÐÀº µ¥ÀÌÅÍ´Â null-termÀÌ ¾ÈµÇ¾î ÀÖÀ» ¼öµµ Àִµ¥
302        // ó¸®ÀÇ ÆíÀǸ¦ À§ÇØ nullz °ø°£±îÁö È®º¸ÇÑ´Ù.
303        char name[APP_FW_ID_LEN+1];
304        char ver[APP_FW_VER_LEN+1];
305       
306} APP_FW_VER;
307
308
309
310#define LIGHT_OFF  0
311#define LIGHT_RED  1
312#define LIGHT_BLUE 2
313
314#define LED_SEQ_OFF               0
315#define LED_SEQ_STEADY_BLUE       1
316#define LED_SEQ_BLUE_BLINK_NORMAL 2
317#define LED_SEQ_BLUE_BLINK_FAST   3
318#define LED_SEQ_STEADY_RED        4
319#define LED_SEQ_RED_BLINK_NORMAL  5
320#define LED_SEQ_RED_BLINK_FAST    6
321#define LED_SEQ_RED_BLUE_TOGGLE   7
322
323
324
325typedef struct {
326        int light;
327        UINT32 duration_ms;
328} APP_LED_OPERATION;
329
330
331
332
333
334#if COMMENT
335____Variables____(){}
336#endif
337
338/*
339        ÀÌ Å×½ºÆ® Ç÷¡±× º¯¼ö´Â Å×½ºÆ® ¿ëµµ·Î¸¸ »ç¿ëÇÑ´Ù.
340        Á¦Á¶»ç OUI¸¦ ¹«½ÃÇÏ°í ¸ðµç ±×·ìÀ» ´Ù accept ÇÑ´Ù.
341*/
342BOOL g_bSddsTestAllowAnyOUI;
343
344/*
345        1ÀÌ¸é ÆÄÀÏ id, version Á¤º¸°¡ µ¿ÀÏÇÏ´õ¶óµµ ´Ù½Ã ¹Þ´Â´Ù.
346        Å×½ºÆ® ¸ñÀûÀÌ´Ù.
347*/
348BOOL g_bSddsTestAcceptSameFile = 0;
349
350
351// DHL_SYS_
352UINT16 g_SddsVer2BdRevs[] =
353{
354        eREV_010, // ES board
355        eREV_020, // DS & 1st MP (600) board
356        eREV_030, // DS & 2nd MP board
357        eREV_040, // DS with MICOM
358};
359
360
361APP_SDDS_INFO g_SddsInfo;
362
363
364
365APP_FW_VER g_SddsFwVer[2];
366        // init °úÁ¤¿¡¼­ ä¿öÁø´Ù.
367        // [0] Àº boot loader
368        // [1] Àº app image
369
370
371BOOL g_SddsPowerOnMode;
372        // TRUE À̸é power on ¸ðµåÀÓ.
373
374
375
376APP_LED_OPERATION g_LedSequence[][2] =
377{
378        // 0: off
379        {
380                { LIGHT_OFF, 1000, }, { LIGHT_OFF, 1000, },
381        },
382        // 1: steady blue
383        {
384                { LIGHT_BLUE, 1000, }, { LIGHT_BLUE, 1000, },
385        },
386        // 2: blue blinking, normal
387        {
388                { LIGHT_BLUE, 500, }, { LIGHT_OFF, 500, },
389        },
390        // 3: blue blinking, fast
391        {
392                { LIGHT_BLUE, 150, }, { LIGHT_OFF, 150, },
393        },
394        // 4: steady red
395        {
396                { LIGHT_RED, 1000, }, { LIGHT_RED, 1000, },
397        },
398        // 5: red blinking, normal
399        {
400                { LIGHT_RED, 500, }, { LIGHT_OFF, 500, },
401        },
402        // 6: red blinking, fast
403        {
404                { LIGHT_RED, 150, }, { LIGHT_OFF, 150, },
405        },
406        // 7: red/blue toggle
407        {
408                { LIGHT_RED, 500, }, { LIGHT_BLUE, 500, },
409        },
410};
411
412
413
414#if COMMENT
415____Led____(){}
416#endif
417
418
419#define SDDS_LED_DOWNLOAD_START LED_SEQ_BLUE_BLINK_NORMAL
420#define SDDS_LED_UPGRADE_START LED_SEQ_BLUE_BLINK_FAST
421#define SDDS_LED_ERROR LED_SEQ_RED_BLUE_TOGGLE
422#define SDDS_LED_COMPELTED LED_SEQ_OFF
423
424void SddsLedBlinkTimerProc(UINT32 nIDTimer, UINT32 param)
425{
426        // nIDTimer == TIMER_ID_SDDS_LED
427
428        int type = (param >> 16) & 0x7;
429        int count = param & 1;
430       
431        DHL_UIO_Control(eDHL_UIO_CT_Indicator, eDHL_UIO_IT_Power, g_LedSequence[type][count].light);
432
433        DHL_SYS_StartTimer(eDHL_TIMER_IR_LED, g_LedSequence[type][count].duration_ms,
434                        SddsLedBlinkTimerProc, param ^ 1, TRUE);
435}
436
437void SddsStartLedBlink(int type)
438{
439        // sdds task º¸´Ù´Â priority°¡ ³ô¾Æ¾ß led°¡ µ¿ÀÛÇÑ´Ù.
440        // ¿Ö³Ä¸é flash upgrade Áß¿¡´Â cpu ¸®¼Ò½º¸¦ 100% Á¡À¯ÇϹǷÎ..
441       
442        DHL_SYS_StartTimer(eDHL_TIMER_IR_LED, 0,
443                        SddsLedBlinkTimerProc, type << 16UL, TRUE);
444}
445
446void SddsStopLedBlink(void)
447{
448        DHL_SYS_KillTimer(eDHL_TIMER_IR_LED);
449        DHL_UIO_Control(eDHL_UIO_CT_Indicator, eDHL_UIO_IT_Power, g_SddsPowerOnMode ? 2 : 1);
450}
451
452
453/*_____ F U N C T I O N ________________________________________*/
454
455
456#if COMMENT
457____Function____(){}
458#endif
459
460
461void SddsPrintInfo(void)
462{
463        int i;
464        UINT32 total_blocks = 0;
465       
466        //if (index != 0 && index != 1) return;
467
468        DHL_OS_Printf("-------- app sdds info --------\n");
469        DHL_OS_Printf(" rf %d, pid 0x%04x\n", g_SddsInfo.rf, g_SddsInfo.pid);
470        DHL_OS_Printf(" state: %s \n", SddsStateString(g_SddsInfo.state));
471
472        for (i=0; i<2; i++)
473        {
474                if (g_SddsInfo.file[i].state == eSDDS_STATE_INIT)
475                        DHL_OS_Printf(" file[%d]: %s\n", i, SddsStateString(g_SddsInfo.file[i].state));
476               
477                else
478                        DHL_OS_Printf(" file[%d]: (id 0x%04x, size %d, buf 0x%x) %s \n",
479                                i,
480                                g_SddsInfo.file[i].id,
481                                g_SddsInfo.file[i].size,
482                                g_SddsInfo.file[i].buffer,
483                                SddsStateString(g_SddsInfo.file[i].state));
484
485                if (g_SddsInfo.file[i].state == eSDDS_STATE_DOWNLOADING) {
486                        DHL_OS_Printf("    %u block received\n", g_SddsInfo.file[i].received_blocks);
487                        total_blocks += g_SddsInfo.file[i].received_blocks;
488                }
489                if (g_SddsInfo.file[i].state == eSDDS_STATE_READY_FOR_FLASHING)
490                        memdump(g_SddsInfo.file[i].buffer, 0x20, "");
491        }
492        if (g_SddsInfo.state == eSDDS_STATE_DOWNLOADING)
493                DHL_OS_Printf(" %u of total %u block received\n", total_blocks, g_SddsInfo.total_blocks);
494       
495}
496
497
498/*
499        App_SddsDeleteAll() api ¿¡ ÀÇÇØ¼­µµ callback µÇÁö¸¸,
500        table version ÀÌ º¯°æµÇ¾ú´Ùµç°¡ ÇÏ´Â ¿ÜºÎÀû ¿äÀο¡ ÀÇÇØ¼­µµ
501        reset µÇ±âµµ ÇÑ´Ù.
502
503        ¸ðµç ¸®¼Ò½º Á¾·áÇϰí, eSDDS_STATE_INIT »óÅ·Î..
504*/
505void SddsResetDownloadCallback(void)
506{
507        int i;
508        dprint(1, "sdds reset called\n");
509        for (i=0; i<2; i++) 
510        {
511                if (g_SddsInfo.file[i].buffer) {
512                        dprint(2, "  free file[%d] buffer %x\n", i, g_SddsInfo.file[i].buffer);
513                        DHL_OS_Free((void **)&g_SddsInfo.file[i].buffer);
514                }
515
516                memset(&g_SddsInfo.file[i], 0, sizeof(g_SddsInfo.file[0]));
517
518                g_SddsInfo.file[i].state = eSDDS_STATE_INIT;
519                g_SddsInfo.file[i].id = -1; // module id init value.
520        }
521
522        if (g_SddsInfo.special) {
523                SddsStopLedBlink();
524        }
525
526        g_SddsInfo.sched_chtype = 0;
527        g_SddsInfo.sched_rf = 0;
528        g_SddsInfo.sched_pid = 0;
529
530        g_SddsInfo.state = eSDDS_STATE_INIT;
531}
532
533
534void SddsReadCurrentFwVersion(void)
535{
536        /*
537                ¾Æ·¡ memcpy·Î ÀÎÇØ¼­ flash rom¿¡ Á÷Á¢ Á¢±ÙÇϴµ¥,
538                NVM ±â·Ï ÀÛ¾÷ µî¿¡ ¿µÇâÀÌ ÀÖÀ» ¼öµµ ÀÖ´Ù.
539                NVM ÂÊ mutex·Î º¸È£¸¦ ¹Þ¾Æ¾ß ÇÏ´Â °ÍÀÎÁö üũ ÇÊ¿ä.
540                ¾Æ´Ï¸é ½Ã½ºÅÛ ÃʱâÈ­ Áß¿¡ 1ȸ Àд ¹æ¹ý »ç¿ë.
541        */
542        int i;
543        char *p;
544        memset(g_SddsFwVer, 0, sizeof(g_SddsFwVer));
545
546        for (i=0; i<2; i++)
547        {
548#if 0//org. BKTODO
549                if (i==0) {
550                        // »ç½Ç loaderÀÇ ver °ø°£Àº 16À̳ª, 8¸¸ ºñ±³ÇÏÀÚ.
551                        memcpy(g_SddsFwVer[i].name, (UINT8 *)ADDR_BOOTLD_ID, 16);
552                        memcpy(g_SddsFwVer[i].ver,  (UINT8 *)ADDR_BOOTLD_VER, 8);
553                }
554                else {
555                        memcpy(g_SddsFwVer[i].name, (UINT8 *)ADDR_APPIMG_ID, 16);
556                        memcpy(g_SddsFwVer[i].ver,  (UINT8 *)ADDR_APPIMG_VER, 8);
557                }
558#else
559        memset(g_SddsFwVer[i].name, 0, 16);
560        memset(g_SddsFwVer[i].ver,      0, 8);
561#endif
562                // name °ú version ¹®ÀÚ¿­À» trim ÇÑ´Ù. ¸Ç µÚÀÇ space µéÀº Á¦°Å..
563                // sdds stream¿¡¼­ µé¾î¿À´Â °ÍµéÀº space°¡ ¾øÀ¸¹Ç·Î..
564               
565                p = g_SddsFwVer[i].name;
566                while (strlen(p) > 0 && p[strlen(p)-1] == ' ')
567                        p[strlen(p)-1] = 0;
568
569                p = g_SddsFwVer[i].ver;
570                while (strlen(p) > 0 && p[strlen(p)-1] == ' ')
571                        p[strlen(p)-1] = 0;
572        }
573}
574
575/*
576        Æß¿þ¾î¸¦ ´Ù¿î·Îµå ÇÒ Çʿ䰡 ÀÖ´Â °ÍÀÎÁö üũÇÑ´Ù.
577        ´Ù¿î·Îµå°¡ ÇÊ¿äÇÏ´Ù°í ÆÇ´ÜµÇ¸é TRUE¸¦ ¸®ÅÏÇÑ´Ù.
578
579        policy:
580                ½ºÆ®¸² ÀÌ»ó --> °¡´ÉÇϸé reject ÇÏ´Â ¹æÇâÀ¸·Î..
581                º¸µå Á¤º¸ ÀÌ»ó --> °¡´ÉÇϸé accept ÇÏ´Â ¹æÇâÀ¸·Î..
582               
583        ÇØ´ç sdds ½ºÆ®¸²¿¡ moduleinfodesc Á¤º¸°¡ ¾ø´Â °æ¿ì,
584        name, versionÀº NULL ÀÏ ¼ö ÀÖ´Ù.
585        ±×·² °æ¿ì Á¦´ë·Î µÈ ½ºÆ®¸²ÀÌ ¾Æ´Ñ °ÍÀ¸·Î ÆÇ´ÜÇϰí reject ÇÑ´Ù.
586
587        ÇöÀç º¸µåÀÇ Á¤º¸¸¦ Àд °úÁ¤¿¡¼­ ¹®Á¦°¡ ÀÖ´Ù°í ÆÇ´ÜµÇ¸é
588        accept ÇÑ´Ù.
589       
590        name, version stringÀÇ trailing space´Â ºñ±³¿¡¼­ Á¦¿ÜÇÑ´Ù.
591*/
592BOOL SddsCheckFirmwareAcceptable(UINT8 type, UINT8 *name, UINT8 *version, UINT32 crc32)
593{
594        BOOL bAccept = FALSE;
595        char *CurName, *CurVer;
596
597        if (!name || !version) {
598                dprint(0, "!! fw info invalid. type %x\n", type);
599                return FALSE; // reject. invalid stream.
600        }
601
602        /*
603                ¾Æ·¡ memcpy·Î ÀÎÇØ¼­ flash rom¿¡ Á÷Á¢ Á¢±ÙÇϴµ¥,
604                NVM ±â·Ï ÀÛ¾÷ µî¿¡ ¿µÇâÀÌ ÀÖÀ» ¼öµµ ÀÖ´Ù.
605                NVM ÂÊ mutex·Î º¸È£¸¦ ¹Þ¾Æ¾ß ÇÏ´Â °ÍÀÎÁö üũ ÇÊ¿ä.
606                ¾Æ´Ï¸é ½Ã½ºÅÛ ÃʱâÈ­ Áß¿¡ 1ȸ Àд ¹æ¹ý »ç¿ë.
607        */
608        if (type == ModuleType_BootLoader) {
609                CurName = (char *)g_SddsFwVer[0].name;
610                CurVer  = (char *)g_SddsFwVer[0].ver;
611        }
612        else if (type == ModuleType_Application) {
613                CurName = (char *)g_SddsFwVer[1].name;
614                CurVer  = (char *)g_SddsFwVer[1].ver;
615        }
616        else {
617                dprint(0, "!! unknown firmware type %x. skip!\n", type);
618                return FALSE; // reject. invalid stream.
619        }
620
621        // name °ú version ¹®ÀÚ¿­À» trim ÇÑ´Ù.
622        while (strlen(CurName) > 0 && CurName[strlen(CurName)-1] == ' ')
623                CurName[strlen(CurName)-1] = 0;
624        while (strlen(CurVer) > 0 && CurVer[strlen(CurVer)-1] == ' ')
625                CurVer[strlen(CurVer)-1] = 0;
626
627        dprint(2, "  check firmware: type %x, crc %08x\n", type, crc32);
628        dprint(2, "  sdds '%s' '%s' vs. cur '%s' '%s'\n", name, version, CurName, CurVer);
629
630        if (strlen(CurName) < 4 || strlen(CurVer) < 2)
631                bAccept = TRUE; // accept. strange board id & version.
632
633        if (strcmp((char *)name, CurName))
634                bAccept = TRUE; // accept. name is different.
635       
636        if (strcmp((char *)version, (char *)CurVer))
637                bAccept = TRUE; // accept. version is different.
638
639        // todo
640        // Á÷Á¢ flash¿¡ ±â·ÏµÈ fwÀÇ crc°ªÀ» °è»êÇÏ¿© ºñ±³Çصµ µÈ´Ù.
641        // ±×·¯³ª flash¿¡ ±â·ÏµÈ fwÀÇ Á¤È®ÇÑ Å©±â´Â ÇöÀç ¾Ë ¹æ¹ýÀº ¾ø´Ù.
642
643        if (bAccept == FALSE && g_bSddsTestAcceptSameFile) {
644                dprint(0, "!! test mode: accept file '%s' although it is same in flash\n", name);
645                bAccept = TRUE;
646        }
647        if (!bAccept)
648                dprint(2, "  no need to download this firmware\n");
649                // exactly same? then reject.
650       
651        return bAccept;
652}
653       
654
655/*
656        ÇöÀç ¿ì¸®ÀÇ º¸µå°¡ SDDS ½ºÆ®¸²ÀÇ firmware¿¡ ÀûÇÕÇÑÁö¸¦ üũÇÑ´Ù.
657
658        SDDS ½ºÆ®¸²¿¡´Â ÇØ´ç firmware°¡ µ¿ÀÛ °¡´ÉÇÑ º¸µå ¹öÀü ¸®½ºÆ®¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù.
659        ±× ¸®½ºÆ®¿¡ ÇöÀç ÀڽŠº¸µåÀÇ ¹öÀü (¸®ºñÀü)ÀÌ Æ÷ÇԵǾî ÀÖ´ÂÁö¸¦ üũÇÏ¸é µÈ´Ù.
660
661        »ç¿ë °¡´ÉÇÏ´Ù¸é TRUE¸¦ ¸®ÅÏÇÑ´Ù. (accept)
662        »ç¿ëÀÌ ºÒ°¡´ÉÇÏ´Ù¸é FALSE¸¦ ¸®ÅÏÇÑ´Ù. (reject)
663*/
664BOOL SddsCheckBoardAcceptable(int NumBoard, UINT8 *BoardList)
665{
666        /*
667                SDDS ¿¡¼­ »ç¿ëµÇ´Â º¸µå ¹öÀü Á¤º¸¸¦ ¾ò´Â´Ù.
668                DHLÀÇ º¸µå ¸®ºñÀü Á¤º¸´Â 16bitÀÇ enum »ó¼öÀÌÁö¸¸,
669                SDDS ¿¡¼­´Â 1¹ÙÀÌÆ® ¹öÀü Á¤º¸¸¦ »ç¿ëÇϹǷÎ,
670                º°µµÀÇ numberingÀ» »ç¿ëÇϰí ÀÖ´Ù.
671                SDDS ¿¡¼­´Â º¸µå Ãâ½Ã ¼ø¼­´ë·Î ¹øÈ£¸¦ ºÎ¿©ÇÑ´Ù.
672        */
673        int i;
674        DHL_BOARD_TYPE dhl_type;
675        DHL_BOARD_REV  dhl_ver;
676        int SddsBdVer = -1; // sdds ½ºÆ®¸²¿¡¼­ »ç¿ëÇÏ´Â º¸µå ¹öÀü.
677       
678        DHL_SYS_GetBoardTypeVersion(&dhl_type, &dhl_ver);
679
680        for (i=0; i<sizeof(g_SddsVer2BdRevs)/sizeof(g_SddsVer2BdRevs[0]); i++) {
681                if (g_SddsVer2BdRevs[i] == dhl_ver)
682                        SddsBdVer = i;
683        }
684
685        // ÇöÀç º¸µå ¸®ºñÀüÀº ¹Ýµå½Ã À§ ¸®½ºÆ® 'g_SddsVer2BdRevs'¿¡ ÀÖ¾î¾ß ÇÑ´Ù.
686        // ¸¸¾à PCB HWBIT Á¤º¸°¡ À߸ø ÀÐÇô¼­ ±×·± °æ¿ì¶ó¸é º¸µå ¼ö¸®°¡ ÇÊ¿äÇÏ´Ù.
687        // ±×·¸Áö ¾Ê´Ù¸é g_SddsVer2BdRevs ¸®½ºÆ®¸¦ À߸ø ¸¸µç °ÍÀÌ´Ù.
688        //
689        /* tip:
690                ¾ç»êµÈ º¸µå¿¡ ¹®Á¦°¡ À־ (¶Ç´Â g_SddsVer2BdRevs ¹× DHL ¿¡ ¹ö±×°¡ À־)
691                ´ë·®À¸·Î update°¡ ¾ÈµÇ´Â °æ¿ì,
692                rfupdate(sdds) ½ºÆ®¸²¿¡¼­ numSupportedHwVersions¸¦ 0À¸·Î ÇÏ¿© ½ºÆ®¸²À» ¸¸µé¸é
693                ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.
694        */
695        DHL_ASSERT(SddsBdVer >= 0, "Err! Check BdRev List or Hardware failure!!\n");
696        dprint(2, "  sdds bdver %u, dhl rev 0x%04x\n", SddsBdVer, dhl_ver);
697       
698        for (i=0; i<NumBoard; i++) 
699        {
700                if (BoardList[i] == SddsBdVer) {
701                        dprint(2, "  sdds bdver %u accepted\n", SddsBdVer);
702                        return TRUE; // accept.
703                }
704        }
705        dprint(2, "  this firmware not support this board\n");
706        return FALSE; // sorry. our board cannot use this firmware.
707}
708
709
710
711
712/*
713        °¢ ÆÄÀϺ° »óÅÂ:
714                * --> eSDDS_STATE_DOWNLOADING
715        Àüü »óÅÂ:
716                º¯°æ ¾øÀ½.
717
718        ¸¸¾à ¼º°øÇÏÁö ¸øÇÏ¸é ¿¡·¯ ¸®ÅÏ..
719
720        index´Â 0: loader, 1: app À¸·Î °íÁ¤Çؼ­ »ç¿ëÇÑ´Ù. sdds ¼½¼ÇÀÇ index°¡ ¾Æ´Ï´Ù.
721*/
722int SddsPrepareDownload(int index, UINT16 id, UINT32 size, UINT32 crc)
723{
724        int err = -1;
725        UINT8 *buffer;
726
727        if (index != 0 && index != 1) {
728                //DHL_ASSERT(FALSE, "");
729                dprint(0, "!! invalid fw index %d\n", index);
730                goto end;
731        }
732
733        if (g_SddsInfo.state != eSDDS_STATE_INIT) {
734                // ±×·² ¼ö ÀÖ´ÂÁö Á¶»ç ÇÊ¿ä..
735                // download Áß¿¡ ´Ù½Ã dsi ºÎÅÍ ¶Ç ½ÃÀÛ?
736                dprint(0, "!! prepare download, but not init state, state %d\n", g_SddsInfo.state);
737                SddsPrintInfo();
738                //DHL_ASSERT(FALSE, "");
739
740                SddsResetDownloadCallback(); // reset ÇÏ°í °è¼Ó ÁøÇàÇÏÀÚ.
741                goto end;
742        }
743
744        // check module id overlap..
745        // µÎ°³ÀÇ ÆÄÀÏ Áß¿¡ ´Ù¸¥ Çϳª°¡ ÀÌ¹Ì ÁøÇà ÁßÀε¥,
746        // ±× id ¿Í µ¿ÀÏÇØ ¹ö¸®¸é block ±¸ºÐÀÌ ¾ÈµÇ¾î ÁøÇàÀÌ ºÒ°¡´ÉÇÏ´Ù.
747        // ½ºÆ®¸²ÀÌ À߸ø ¸¸µé¾îÁø °æ¿ìÀÓ..
748        //
749        if (g_SddsInfo.file[1-index].id >= 0 &&
750                g_SddsInfo.file[1-index].id == id) 
751        {
752                dprint(0, "!! module id overap! [0] %d, [1] %d\n",
753                                g_SddsInfo.file[0].id, g_SddsInfo.file[1].id);
754                DMW_SDDS_Reset();
755                goto end;
756        }
757
758        if (g_SddsInfo.file[index].id >= 0) 
759        {
760                // ±âÁ¸¿¡ download ÇÏ´Ù°¡ ÀϽà ÁßÁöµÈ °æ¿ì¶ó¸é
761                // id, size, buffer µîÀÌ ¸ðµÎ Á¸ÀçÇØ¾ß ÇÔ. id´Â >=0 À̸é À¯È¿ÇÑ °ÍÀÓ.
762               
763                if (g_SddsInfo.file[index].id != id ||
764                        g_SddsInfo.file[index].size != size ||
765                        g_SddsInfo.file[index].buffer == NULL)
766                {
767                        dprint(0, "!! previous file info mismatch. %d %u %p\n",
768                                g_SddsInfo.file[index].id, g_SddsInfo.file[index].size, 
769                                g_SddsInfo.file[index].buffer);
770
771                        // id, size µîÀÌ ´Þ¶óÁö¸é MW ³»¿¡¼­ ¸ÕÀú ÀÌ »ç½ÇÀ» ¾Ë°í
772                        // resetÀ» Çϵµ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î, ÀÌ·± °æ¿ì´Â ¹ß»ýÇÏÁö´Â ¾Ê´Â´Ù.
773                        //DHL_ASSERT(FALSE, "");
774                       
775                        // ±×³É reset Çϰí óÀ½ºÎÅÍ ´Ù½Ã ½ÃÀÛÇÏ´Â ¹æ¹ýÀº ÁÁÁö ¾ÊÀ½.
776                        // ¿Ö³Ä¸é DMW ÀÇ ³»ºÎ state¶û sync°¡ ¾È¸ÂÀ¸¹Ç·Î..
777                        // ±×³É ¿¡·¯·Î ¸®ÅÏÇÏÀÚ. ´Ù¿î·Îµå ÇÏÁö ¾Ê´Â´Ù.
778
779                        DMW_SDDS_Reset();
780                        goto end;
781                }
782        }
783       
784        if (g_SddsInfo.file[index].buffer) {
785                buffer = g_SddsInfo.file[index].buffer;
786                dprint(2, "use previous file[%d] buffer 0x%x\n", index, buffer);       
787        }
788        else {
789                buffer = DHL_OS_Malloc(size + 4); // add some safe margin.
790                if (!buffer) {
791                        dprint(0, "!! out of memory for file[%d] blk, size %u\n", index, size);
792                        //DHL_ASSERT(FALSE, "");
793                        DMW_SDDS_Reset();
794                        goto end;
795                }
796        }
797
798        dprint(2, "file[%d] is (size %u) accepted for download.\n", index, size);
799
800        g_SddsInfo.file[index].id = id; // module id.
801        g_SddsInfo.file[index].size = size;
802        g_SddsInfo.file[index].buffer = buffer;
803        g_SddsInfo.file[index].crc = crc;
804        g_SddsInfo.file[index].state = eSDDS_STATE_DOWNLOADING;
805
806        // µû·Î eSDDS_CB_TYPE_DownloadStarted Ãß°¡ ÇÏ¿´À¸¹Ç·Î ±× ¶§ »óÅ Àüȯ.
807#if 0
808        // µÎ ÆÄÀÏ Áß Çϳª¶óµµ download ¸ðµå¶ó¸é Àüüµµ download ¸ðµå¶ó°í º»´Ù.
809        //if (g_SddsInfo.file[1-index].state == eSDDS_STATE_DOWNLOADING)
810        g_SddsInfo.state = eSDDS_STATE_DOWNLOADING;
811#endif
812
813        dprint(0, "******** sdds file[%d] download start ********\n", index);
814        err = 0;
815        App_Menu_StartFactory(eAPP_FAC_RF_UPDATE); // megakiss 2012.10.30
816end:
817        if (dprintable(2))
818                SddsPrintInfo();
819       
820        return err;
821}
822
823/*
824        dii Á¤º¸ ºñ±³ °á°ú, ´Ù¿î·Îµå°¡ ÇÊ¿ä ¾øÀ» ¶§ È£ÃâµÈ´Ù.
825*/
826void SddsDownloadNotRequiredCallback(void)
827{
828        dprint(0, "******** no sdds file download required ********\n");
829
830        g_SddsInfo.file[0].state = eSDDS_STATE_COMPELTED;
831        g_SddsInfo.file[1].state = eSDDS_STATE_COMPELTED;
832        g_SddsInfo.state = eSDDS_STATE_COMPELTED;
833
834        // DMW_SDDS_Reset(); // reset Çϸé led°¡ reset µÇ¾î ¹ö¸²..
835
836        if (dprintable(2)) SddsPrintInfo();
837
838        if (g_SddsInfo.special)
839                SddsStartLedBlink(SDDS_LED_COMPELTED);
840}
841
842/*
843        ÆÄÀÏ ´Ù¿î·Îµå ¿©ºÎ üũ °¡ ³¡³ª°í, ½ÇÁ¦·Î ´Ù¿î·Îµå ¹Þ±â Á÷Àü¿¡ È£ÃâµÈ´Ù.
844        ¾î¶² ÆÄÀÏÀº ´Ù¿î·Îµå ´ë»óÀÌ ¾Æ´Ò ¼ö ÀÖ´Ù.
845        ÀÌ·± ÆÄÀÏÀº ±×³É eSDDS_STATE_COMPELTED »óÅ·ΠÀüȯ½ÃŲ´Ù.
846
847        °¢ ÆÄÀÏ º° »óÅÂ:
848                eSDDS_STATE_DOWNLOADING -> Çö»ó À¯Áö.
849                eSDDS_STATE_INIT -> eSDDS_STATE_COMPELTED
850        Àüü »óÅÂ:
851                ´Ù¿î·Îµå ÇÊ¿äÇϸé.. eSDDS_STATE_DOWNLOADING
852                ´Ù¿î·Îµå ÇÒ °ÍÀÌ ¾øÀ¸¸é.. eSDDS_STATE_COMPELTED
853*/
854void SddsDownloadStartCallback(S_SDDS_CBPARAM_DOWNLOAD_START *param)
855{
856        // µÎ ÆÄÀÏ Áß ¾î¶² °ÍÀº ´Ù¿î·Îµå ´ë»óÀÌ ¾Æ´Ò ¼öµµ ÀÖÀ½.
857       
858        if (g_SddsInfo.file[0].state < eSDDS_STATE_DOWNLOADING) {
859                dprint(0, "  file 0 is not for downloding.\n");
860                g_SddsInfo.file[0].state = eSDDS_STATE_COMPELTED;
861        }
862        if (g_SddsInfo.file[1].state < eSDDS_STATE_DOWNLOADING) {
863                dprint(0, "  file 1 is not for downloding.\n");
864                g_SddsInfo.file[1].state = eSDDS_STATE_COMPELTED;
865        }
866
867        // µÎ ÆÄÀÏ ´Ù download ´ë»óÀÌ ¾Æ´Ò °æ¿ì..
868        // ÀÌ callback ÀÌ ºÒ¸®Áö ¾Ê´Â°Ô Á¤»óÀ̰ÚÁö¸¸ Ȥ½Ã ºÒ¸®´õ¶óµµ nicely Á¾·á ÇÑ´Ù.
869        if (g_SddsInfo.file[0].state == eSDDS_STATE_COMPELTED &&
870                g_SddsInfo.file[1].state == eSDDS_STATE_COMPELTED) {
871                dprint(0, "!! both file not for download.. stop.\n");
872                g_SddsInfo.state = eSDDS_STATE_COMPELTED;
873
874                if (g_SddsInfo.special)
875                        SddsStartLedBlink(SDDS_LED_ERROR);
876               
877                DMW_SDDS_Reset();
878                return;
879        }
880        g_SddsInfo.total_blocks = param->total_blocks;
881
882        if (dprintable(2)) SddsPrintInfo();
883
884        // backup data for later operation.
885        // ³ªÁß¿¡ ´ë±â ¸ðµå ÁøÀÔ ÈÄ¿¡ ÀÚµ¿ update ½Ã¿¡ »ç¿ëµÈ´Ù.
886        //
887        g_SddsInfo.sched_chtype = g_SddsInfo.chtype;
888        g_SddsInfo.sched_rf = g_SddsInfo.rf;
889        g_SddsInfo.sched_pid = g_SddsInfo.pid;
890
891        if (g_SddsInfo.special)
892                SddsStartLedBlink(SDDS_LED_DOWNLOAD_START);
893
894        /* ÀÌ¹Ì ´Ù¿î·Îµå ¿Ï·á µÈ »óÅÂÀε¥µµ, ´Ù¸¥ ä³Î °¬´Ù µÇµ¹¾Æ¿À¸é
895                EpgMw µî¿¡¼­´Â ´Ù½Ã sdds download start¸¦ Çϵµ·Ï ÇÑ´Ù.
896                ±×·² °æ¿ì ´Ù½Ã downloading »óÅ·ΠÀüȯµÈ´Ù. ³í¸®ÀûÀ¸·Î´Â À߸øµÈ °ÍÀÓ.
897                ÇÏÁö¸¸ MW¿¡¼­ ¹Ù·Î download complete¸¦ ¾Ë·ÁÁֹǷÎ, Å« ¹®Á¦°¡ µÇÁö´Â ¾ÊÀ½.
898        */
899        g_SddsInfo.state = eSDDS_STATE_DOWNLOADING;
900       
901}
902
903
904void SddsReceivedOneBlockCallback(S_SDDS_CBPARAM_BLOCK_RECEIVED *cbp)
905{
906        int index;
907       
908        // module id ·ÎºÎÅÍ file index ãÀ½.
909        //
910        // file state´Â INIT »óÅÂÀÏ ¼ö ÀÖÀ½.
911
912        if (g_SddsInfo.state != eSDDS_STATE_DOWNLOADING) {
913                dprint(0, "!! blk received in not-downloading state %d.\n", g_SddsInfo.state);
914                if (dprintable(2)) SddsPrintInfo();
915                return;
916        }
917       
918        if (g_SddsInfo.file[0].id == cbp->ddb->moduleId)
919                index = 0;
920        else if (g_SddsInfo.file[1].id == cbp->ddb->moduleId)
921                index = 1;
922        else {
923                dprint(2, "!! unrecognized module id %x\n", cbp->ddb->moduleId);
924                if (dprintable(2)) SddsPrintInfo();
925                return;
926        }
927       
928        // ÇØ´ç ¸ðµâÀÌ downloading »óŰ¡ ¾Æ´Ò ¼öµµ ÀÖ´Ù.
929        // ¿¹¸¦ µé¾î ÀÌ¹Ì µ¿ÀÏÇÑ ÆÄÀÏÀÎ °æ¿ì ÇØ´ç ¸ðµâÀº upgrade ´ë»óÀÌ ¾Æ´Ò ¼ö ÀÖÀ½.
930        if (g_SddsInfo.file[index].state != eSDDS_STATE_DOWNLOADING) {
931                dprint(0, "!! file[%d] not for download\n", index);
932                return;
933        }
934       
935        if (cbp->offset + cbp->ddb->blockDataLength > g_SddsInfo.file[index].size) {
936                dprint(0, "!! offset %x + len %x exceed buffer limit %x\n",
937                                cbp->offset, cbp->ddb->blockDataLength, g_SddsInfo.file[index].size);
938                return;
939        }
940        if (g_SddsInfo.file[index].buffer == NULL) {
941                dprint(0, "!! no buffer for file[%d]\n", index);
942                return;
943        }
944
945        memcpy(g_SddsInfo.file[index].buffer + cbp->offset, 
946                cbp->ddb->blockDataBytePtr, cbp->ddb->blockDataLength);
947
948        dprint(2, "  file[%d]: #%u, %u/%u blocks rx\n", index, cbp->idxblk,
949                                cbp->received_blocks, cbp->total_blocks);
950
951        g_SddsInfo.file[index].received_blocks = cbp->received_blocks;
952
953        if (cbp->received_blocks == cbp->total_blocks) 
954        {
955                dprint(2, "  file[%d] download completed\n", index);
956
957                g_SddsInfo.file[index].state = eSDDS_STATE_READY_FOR_FLASHING;
958
959                // µÎ ÆÄÀÏ ´Ù ready µÈ °Å¸é Àüü »óŵµ ready.
960                // ´Ù¸¥ ÆÄÀÏÀº skip ÀÏ ¼öµµ ÀÖÀ½. ±×·² °æ¿ì ÀÌ¹Ì eSDDS_STATE_COMPELTED »óÅÂÀÓ.
961                if (g_SddsInfo.file[1-index].state >= eSDDS_STATE_READY_FOR_FLASHING) {
962
963                        dprint(2, "  all files are downloaded\n");
964                        g_SddsInfo.state = eSDDS_STATE_READY_FOR_FLASHING;
965
966                        // SDDS download ´Â ÀÌÁ¦ Áß´ÜÇØµµ µÈ´Ù.
967                        DMW_SDDS_Stop();
968                }
969        }
970}
971
972
973/*
974        MW¿¡¼­ ÆÄÀÏÀÇ download°¡ ¿Ï·áµÇ¸é È£ÃâµÈ´Ù.
975
976        ÁÖÀÇ»çÇ×:
977                stream¿¡ µé¾î ÀÖ´Â ¸ðµç ÆÄÀÏÀ» ´Ù ¹Þ´Â °ÍÀº ¾Æ´Ï´Ù.
978                ¾î¶² ÆÄÀÏÀº ÀÌ¹Ì update µÇ¾î À־ download ¹ÞÀ» Çʿ䰡 ¾øÀ» ¼öµµ ÀÖ´Ù.
979       
980        id´Â module_id ·Î¼­, ¿ì¸®°¡ »ç¿ëÇÏ´Â file index¿Í´Â ´Ù¸£´Ù.
981
982        id °¡ (UINT32)-1 À̸é ÇÊ¿äÇÑ ÆÄÀÏÀ» ´Ù ´Ù¿î·Îµå ¹Þ¾Ò´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
983*/
984void SddsDownloadCompletedCallback(int id)
985{
986        int i;
987        UINT32 crc;
988        BOOL bCrcError;
989       
990        if (id == (UINT32)-1) 
991        {
992                // all download completed.
993
994                dprint(0, "******** sdds download completed ********\n");
995
996                // blockÀ» ¹Þ´Â ¸Å ¼ø°£¸¶´Ù download complete üũ¸¦ ÇßÀ¸¹Ç·Î,
997                // MW¿¡¼­ complete callbackÀ» ºÎ¸¥ Çö ½ÃÁ¡¿¡¼­´Â ÀÌ¹Ì flashing Áغñ »óÅ¿¡ ÀÖ¾î¾ß ÇÑ´Ù.
998
999                // ±×·¯³ª download ´ë»óÀÌ ¾Æ´Ñ ÆÄÀϵ鵵 ÀÖÀ½¿¡ À¯ÀÇ.
1000                // ÀÌ ÆÄÀϵéÀº ÀÌ¹Ì eSDDS_STATE_COMPELTED »óŰ¡ µÇ¾î ÀÖ´Ù.
1001
1002        #if 0
1003                // ´Ù¿î·Îµå°¡ Á¦´ë·Î ¾ÈµÈ »óŶó¸é ¾îÂ÷ÇÇ crc ¿¡·¯ ¹ß»ýÇÒ °ÍÀ̰í, ÀÚµ¿ reset µÈ´Ù.
1004                if (g_SddsInfo.state != eSDDS_STATE_READY_FOR_FLASHING)
1005                        ;//DHL_ASSERT(FALSE, "");
1006        #else
1007                /*      ÀÌ¹Ì ´Ù¿î·Îµå ¿Ï·á µÈ »óÅ¿¡¼­ ä³Î º¯°æ¿¡ ÀÇÇØ ´Ù½Ã download start µÇ´Â °æ¿ì
1008                        state°¡ ready_for_flashing ¿¡¼­ ´Ù½Ã downloadingÀ¸·Î º¯°æµÇ¾î ¹ö¸®´Â ¹®Á¦°¡ ÀÖ´Ù.
1009                        °¡Àå ¹Ù¶÷Á÷ÇÑ ÇØ°áÃ¥Àº download start ÀÚü¸¦ ÇÏÁö ¾Ê´Â °ÍÀÓ.. À̰ÍÀº ³ªÁß¿¡ õõÈ÷ Çϰí,
1010                        ÀÏ´Ü completed callbackÀÌ ¿À´Â °ÍÀ» Ȱ¿ëÇÏ¿© ÀÌ ¹®Á¦¸¦ ÇÇÇØ°£´Ù.
1011                */
1012                g_SddsInfo.state = eSDDS_STATE_READY_FOR_FLASHING;
1013        #endif
1014       
1015                // crc üũ Çѹø ÇØº¸ÀÚ. ¸¸¾à ¿©±â¼­ mismatch ³ª¸é Áß´ÜÇØ¾ß ÇÒ±î? -> yes.
1016                bCrcError = FALSE;
1017                for (i=0; i<2; i++) 
1018                {
1019                        // ´Ù¿î·Îµå ÇÏÁö ¾ÊÀº ÆÄÀÏÀº ´ç¿¬È÷ crc °è»êÇÏ¸é ¾ÈµÊ.
1020                        if (g_SddsInfo.file[i].state > eSDDS_STATE_READY_FOR_FLASHING)
1021                                continue;
1022
1023                        crc = DHL_UTL_CalcCRC32(DHL_CRC_START, g_SddsInfo.file[i].buffer, g_SddsInfo.file[i].size);
1024                        if (crc !=      g_SddsInfo.file[i].crc) {
1025                                dprint(0, "!! file[%d] crc mismatch! calc %x, stream %x\n", i, crc, g_SddsInfo.file[i].crc);
1026                                bCrcError = TRUE;
1027                        }
1028                        else
1029                                dprint(2, "  file[%d] crc ok\n", i);
1030                }
1031                if (bCrcError) {
1032                        DMW_SDDS_Reset();
1033                        return;
1034                }
1035               
1036                /*
1037                        ´ë±â ¸ðµå »óŶó¸é ¹Ù·Î upgrade¸¦ ½ÃÀÛÇØµµ ÁÁ´Ù.
1038
1039                        ÇöÀç ÀÌ task´Â sdds taskÀÌ´Ù.
1040                        ÀÌÁ¦ ÀÌ task´Â Ưº°È÷ ÇÏ´Â ÀÏÀº ¾ø´Ù.                   
1041                */
1042                if (g_SddsPowerOnMode == FALSE) 
1043                {
1044                        App_SddsUpgradeStart(0);
1045                        // µ¿ÀÏÇÑ sdds task·Î command¸¦ º¸³»´Â ÀÛ¾÷ÀÓ..
1046
1047                        // ÀÌ Âû³ª¿¡ power on ۰¡ ´­·Á¼­ ÀÌ¹Ì App_SddsStop() api°¡ ºÒ¸± ¼ö ÀÖ´Ù.
1048                        // ±×·¯¸é SddsDownloadStopped() °¡ ºÒ¸°´Ù.
1049                        //
1050                }
1051                else // power on ¸ðµåÀÎ °æ¿ì..
1052                {
1053                        // ´ë±â »óÅ·Πµé¾î°£ ÈÄ¿¡ ½Ç½Ã..
1054
1055                        // ±×·¯³ª °øÀå ¸ðµå µî Ư¼ö ¸ðµåÀÏ °æ¿ì´Â ¹Ù·Î ½ÃÀÛÇÑ´Ù.
1056                        if (g_SddsInfo.special) {
1057                                dprint(2, "special mode!\n");
1058                                App_SddsUpgradeStart(0);
1059                        }
1060                }
1061               
1062        }
1063        else 
1064        {
1065                // --- ÀϺΠ¸ðµâ ¸¸ ¿Ï·á µÇ¾úÀ½.
1066               
1067                dprint(2, "  module id %x completed\n", id);
1068
1069                // ÀÌ¹Ì ¸Å block ¼ö½Å Çϸ鼭 complete ¿©ºÎ¸¦ üũÇÏ¿© ÆÄÀÏ º° state´Â À̹Ì
1070                // ready for flashing »óŰ¡ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
1071                // double check!
1072                if (g_SddsInfo.file[0].id == id) {
1073                        if (g_SddsInfo.file[0].state != eSDDS_STATE_READY_FOR_FLASHING) {
1074                                //dprint(0, "!! file[%d] all blk download but wrong state\n");
1075                                DHL_ASSERT(FALSE, "");
1076                                g_SddsInfo.file[0].state = eSDDS_STATE_READY_FOR_FLASHING;
1077                        }
1078                }
1079                else if (g_SddsInfo.file[1].id == id) {
1080                        if (g_SddsInfo.file[1].state != eSDDS_STATE_READY_FOR_FLASHING) {
1081                                //dprint(0, "!! file[%d] all blk download but wrong state\n");
1082                                DHL_ASSERT(FALSE, "");
1083                                g_SddsInfo.file[1].state = eSDDS_STATE_READY_FOR_FLASHING;
1084                        }
1085                }
1086                else {
1087                        dprint(0, "!! dn completed cb: wrong id %d\n", id);
1088                }
1089        }
1090}
1091
1092
1093/*
1094        App_SddsStop() api¿¡ ´ëÇÑ callback.
1095       
1096        È£Ã⠵Ǵ °æ¿ì:
1097                - »ç¿ëÀÚ Ã¤³Î º¯°æ½Ã ¸¶´Ù..
1098                - Standby -> Power ON ½Ã¿¡..
1099*/
1100void SddsDownloadStoppedCallback(void)
1101{
1102        dprint(2, "download stopped\n");
1103
1104        // Ưº°È÷ ÇØ ÁÙ ÀÏ ¾øÀ½.
1105}
1106
1107
1108void SddsAllCompleted(void)
1109{
1110        if (g_SddsInfo.state != eSDDS_STATE_FLASH_END) {
1111                dprint(0, "!! not ready for complete !\n");
1112                return;
1113        }
1114       
1115#if USE_AUTOSCAN_AFTER_UPDATE
1116       
1117        App_NVM_SetBootingScan(TRUE);
1118        App_NVM_Sync();
1119        DHL_OS_Delay(3000);
1120                //ÀçºÎÆÃµÇ¸é scanÀ» Çϵµ·Ï ÇÔ.
1121       
1122#endif
1123
1124        g_SddsInfo.file[0].state = eSDDS_STATE_COMPELTED;
1125        g_SddsInfo.file[1].state = eSDDS_STATE_COMPELTED;
1126        g_SddsInfo.state = eSDDS_STATE_COMPELTED;
1127
1128        dprint(0, "******** sdds all update completed ********\n");
1129
1130        if (g_SddsInfo.special) 
1131        {
1132                if (g_SddsInfo.file[0].err || g_SddsInfo.file[1].err) {
1133                        // ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì´Â »ý»ê¶óÀÎ ÀÛ¾÷ÀÚ°¡ ÀÌ »óȲÀ» ¾Ë ¼ö ÀÖµµ·Ï led Ãâ·ÂÀ» ÇØ ÁÖ°í,
1134                        // ¸®ºÎÆÃÇÏÁö ¾Ê°í ¹«ÇÑ ´ë±âÇÑ´Ù.
1135                        BOOL bExit = FALSE;
1136                        SddsStartLedBlink(SDDS_LED_ERROR);
1137                        while (!bExit) 
1138                                DHL_OS_Delay(1000);
1139                }
1140                else { //¹«Á¶°Ç ±â´Ù¸®°Ô ÇÏ´Â °Ô ³ªÀ» °Í °°À½
1141                        BOOL bExit = FALSE;
1142                        SddsStartLedBlink(SDDS_LED_COMPELTED);
1143                        while (!bExit) 
1144                                DHL_OS_Delay(1000);
1145                }
1146        }
1147       
1148        /*
1149                ´Ù ¿Ï·á µÇ¸é ¹«¾ùÀ» ÇÏ¸é µÇ´Â°¡?
1150
1151                ´ë±â¸ðµå¶ó¸é ±×³É reboot ÇÏ¸é µÈ´Ù.
1152                PowerOn »óŶó¸é »ç¿ëÀÚ°¡ OSD·Î ÀÌ »óȲÀ» ÁöÄѺ¸°í ÀÖÀ» °ÍÀÌ´Ù.
1153        */
1154
1155#if 0 //neverdai 110104 App_Proc_Standby¿¡¼­ ¾Ë¾Æ¼­ ó¸®ÇÔ..
1156        if (g_SddsPowerOnMode) // ON ¸ðµå
1157        {
1158                BOOL bExit = 0;
1159                /*
1160                        todo..
1161                        power on »óÅ¿¡¼­ upgrade°¡ ÀÌ·ç¾îÁø °æ¿ì´Â SDDS UI°¡ ¶° ÀÖ´Â »óÅÂÀÌ´Ù.
1162                        ±×³É ±â´Ù¸®°í ÀÖÀ¸¸é Proc_Power ÂÊ¿¡¼­ (¶Ç´Â menu task ¾îµð¼±°¡)
1163                        complete ¿Ï·á¸¦ ¾Ë¾Æ³»°í resetÀ» ÇÒ °ÍÀÓ..
1164                */
1165                while (!bExit) {
1166                        dprint(0, "!! wait system reset..\n");
1167                        DHL_OS_Delay(4000);
1168                        DHL_SYS_Reset(eDHL_RESET_Reboot);
1169                }
1170        }
1171        else // ´ë±â ¸ðµå
1172        {
1173                BOOL bExit = 0;
1174               
1175                while (!bExit) {
1176                        dprint(0, "!! reset system...\n");
1177                        DHL_SYS_Reset(eDHL_RESET_Reboot);
1178                        DHL_OS_Delay(4000);                     
1179                }
1180        }       
1181#endif
1182}
1183
1184
1185
1186
1187
1188
1189/*
1190        addrÀº Àý´ë ÁÖ¼Ò°¡ ¾Æ´Ï°í flash start ºÎÅÍÀÇ offset ÀÌ´Ù.
1191*/
1192int SddsFlashUpdateFile(int addr, int size, UINT8 *buf)
1193{
1194        DHL_RESULT dhr;
1195        int offset; // ±â·ÏÇÒ ÁÖ¼Ò ·ÎºÎÅÍÀÇ offset.
1196
1197        #define CHUNK_SZ 65536
1198       
1199        dprint(2, "update flash at addr %x, size %d (0x%x)..\n",
1200                        addr, size, size);
1201
1202        // size°¡ Ȧ¼öÀÎ °æ¿ì 16-bit flash¿¡¼­ ¹®Á¦°¡ µÈ´Ù.
1203        if (size & 1) {
1204                buf[size] = 0xff; // buf´Â marginÀ» °¡Áö°í ÀÖÀ¸¹Ç·Î 1¹ÙÀÌÆ® Á¤µµ´Â ±¦ÂúÀ½.
1205                size ++;
1206        }
1207        /* ÀûÀº Å©±â º°·Î ³ª´©¾î¼­ Ç¥½Ã¸¦ Çϵµ·Ï ÇÏÀÚ. ÁøÇà »óȲµµ Ç¥½Ã.
1208        */
1209        for (offset=0; offset<size; offset+=CHUNK_SZ)
1210        {
1211                int len = min(size-offset, CHUNK_SZ);
1212
1213                dprint(2, "  updating %x, size %x.. %d/100\n", addr+offset, len, offset*100/size);
1214                dhr = DHL_NVM_FlashWrite(APP_FLASH_ID, addr+offset, buf+offset, len);
1215                if (dhr) {
1216                        dprint(0, "!! flash update err %d\n", dhr);
1217                        return -2;
1218                }
1219
1220                g_SddsInfo.flash_update_progress = 
1221                        (g_SddsInfo.already_done_bytes + offset+len)*100 /
1222                        g_SddsInfo.total_bytes_to_write;
1223
1224                dprint(2, "  total update progress: %d\n", g_SddsInfo.flash_update_progress);
1225
1226                // ÀÌ task ¶§¹®¿¡ ³·Àº priority task°¡ ÀüÇô µ¿ÀÛÇÏÁö ¸øÇؼ­
1227                // ¹®Á¦°¡ »ý±ä´Ù.
1228                // ÃÖ¼ÒÇÑ DMW_Timer ´Â µ¿ÀÛÇÒ ¼ö ÀÖµµ·ÏÀÇ delay¸¸ ÁÖµµ·Ï ÇÔ.
1229                DHL_OS_Delay(20);
1230        }
1231        dprint(2, "flash update ok\n");
1232       
1233        return 0;
1234}
1235
1236
1237void SddsFlashUpdateCallback(UINT32 param)
1238{
1239        int i, r;
1240        char *name[2] = { "loader", "app", };
1241        UINT32 flashoffset[2] = { OFFSET_BOOTLD, OFFSET_APPIMG, };
1242
1243        /*
1244                todo..
1245                update ¸¦ Çϱâ Àü¿¡ ´Ù¸¥ task¿¡¼­ NVM ¿¡ Á¢±ÙÇÏÁö ¸øÇϵµ·Ï
1246                ¸·À» ¼ö ÀÖ´Â ¹æ¾È ÇÊ¿ä.
1247        */
1248
1249        for (i=0; i<2; i++) 
1250                g_SddsInfo.total_bytes_to_write += g_SddsInfo.file[i].size;
1251
1252        g_SddsInfo.already_done_bytes = 0;
1253        g_SddsInfo.flash_update_progress = 0;
1254
1255        if (g_SddsInfo.state != eSDDS_STATE_READY_FOR_FLASHING) {
1256                dprint(0, "!! not ready for flashing! state %u\n", g_SddsInfo.state);
1257                return;
1258        }
1259
1260        dprint(0, "******** sdds flash upgrade start ********\n");
1261        g_SddsInfo.state = eSDDS_STATE_FLASHING;
1262
1263        if (g_SddsInfo.special)
1264                SddsStartLedBlink(SDDS_LED_UPGRADE_START);
1265       
1266        /*
1267                task priority ¶§¹®¿¡ ´Ù¸¥ ÀÛ¾÷ÀÌ ¿øÈ° Ä¡ ¾ÊÀ» ¼ö ÀÖ´Ù.
1268                ÇÊ¿äÇϸé priority¸¦ ³·Ãß¾î¾ß ÇÑ´Ù.
1269               
1270                is it possible??
1271                todo..
1272        */
1273
1274        for (i=0; i<2; i++)
1275        {
1276                // skip ÇÏ´Â ÆÄÀÏÀÇ °æ¿ì..
1277                if (g_SddsInfo.file[i].state > eSDDS_STATE_FLASHING)
1278                        continue;
1279               
1280                dprint(2, "  update %s..\n", name[i]);
1281                g_SddsInfo.file[i].state = eSDDS_STATE_FLASHING;
1282
1283                if (dprintable(2))
1284                        memdump(g_SddsInfo.file[i].buffer, 0xe0, name[i]);
1285
1286                r = SddsFlashUpdateFile(flashoffset[i], 
1287                                g_SddsInfo.file[i].size, g_SddsInfo.file[i].buffer);
1288                if (r) {
1289                        dprint(0, "!! update %s err!\n", name[i]);
1290                        g_SddsInfo.file[i].err = 1;
1291                }
1292                //---- state Àüȯ.
1293                g_SddsInfo.file[i].state = eSDDS_STATE_FLASH_END;
1294
1295                //---- ÁøÇà »óȲ update
1296                g_SddsInfo.already_done_bytes += g_SddsInfo.file[i].size;
1297                g_SddsInfo.flash_update_progress = 
1298                        g_SddsInfo.already_done_bytes*100 / g_SddsInfo.total_bytes_to_write;
1299        }
1300
1301        g_SddsInfo.state = eSDDS_STATE_FLASH_END;
1302
1303        SddsAllCompleted();
1304
1305}
1306
1307
1308void SddsUserAction(UINT32 param)
1309{
1310        SddsFlashUpdateCallback(param);
1311}
1312
1313
1314void SddsDownloadStartTimerProc(UINT32 nIDTimer, UINT32 param)
1315{
1316        // nIDTimer == TIMER_ID_SDDS_WAIT_1
1317
1318        // »óÀ§ 16 bit´Â pid, ÇÏÀ§ 16 bit´Â program_number
1319        UINT16 program_number = (param >> 16);
1320        UINT16 pid = param & 0xffff;
1321
1322        // Âü°í: pid°¡ ÀÌ¹Ì È®Á¤µÈ °æ¿ì¶ó¸é program_number Á¤º¸´Â 0ÀÏ ¼öµµ ÀÖÀ½.
1323        dprint(2, "download start timer: pid 0x%x, p#%d\n", pid, program_number);
1324
1325        if (pid) {
1326#if USE_RF_UPDATE_ONLY
1327                App_SddsStart(pid, 1);
1328#else
1329                App_SddsStart(pid, 0);
1330#endif
1331                return;
1332        }
1333        if (program_number == 0)
1334                return;
1335       
1336        // program_number ·ÎºÎÅÍ pid ¸¦ ã¾Æ³»¾ß ÇÑ´Ù.
1337        // pat, pmtlist°¡ ¾ÆÁ÷ Áغñ°¡ ¾ÈµÇ¾ú´Ù¸é Á» ´õ ±â´Ù¸°´Ù.
1338
1339        if (1) 
1340        {
1341                ProgramAVInfo *av = Dmc_LockAVMutex();
1342                int i, index;
1343                MPEG_PMT *pmt = NULL;
1344
1345                /*
1346                        ¾Æ·¡ÀÇ ¿À·ù ¸Þ½ÃÁö¿¡ ÇØ´çµÇ´Â ¿À·ù´Â ¾ÆÁÖ ½É°¢ÇÑ ¿À·ùÀÌ´Ù.
1347                        ÀÌ ºÎºÐ¿¡ ¿À·ù°¡ ¹ß»ýÇÒ °æ¿ì sdds °¡ Á¦´ë·Î ¼öÇàµÇÁö ¸øÇϱ⠶§¹®ÀÌ´Ù.
1348
1349                        1¹ø ¿À·ùÀÇ °æ¿ì, ÀϽÃÀûÀ¸·Î pat, pmt°¡ ¾ÆÁ÷ ¹Ì¼ö½Å »óÅÂÀÏ ¼ö´Â ÀÖ´Ù.
1350                        ÇÏÁö¸¸ 5Ãʳª ¿©À¯¸¦ µÎ¾ú±â ¶§¹®¿¡ Á¤»ó »óȲÀº ¾Æ´Ï¶ó°í º¼ ¼ö ÀÖ´Ù.
1351
1352                        ¾î·µç ÀÌ sdds ¼­ºñ½º´Â ¸Å¿ì Áß¿äÇϹǷÎ, ¼º°øÇÒ ¶§ ±îÁö °è¼Ó ¹Ýº¹ ½ÃµµÇÑ´Ù.
1353                */
1354                do {
1355                        // 1. pat, pmt °¡ ¼ö½Å µÇ¾ú´ÂÁö È®ÀÎ.
1356                        if (!av->pat || !av->pmtList) {
1357                                dprint(0, "!! av pat/pmtlist not ready!\n");
1358                                break;
1359                        }
1360                        // 2. pat ¿¡¼­ program_number ¿¡ ÇØ´çµÇ´Â program °Ë»ö.
1361                        for (i=0, index=-1; i<av->pat->numPrograms; i++) {
1362                                if (av->pat->programs[i].program_number != program_number) continue;
1363                                index = i;
1364                                break;
1365                        }
1366                        if (index < 0) {
1367                                dprint(0, "!! program number %d not found in pat!\n", program_number);
1368                                break;
1369                        }
1370                        dprint(2, "  #%u of pmt[%d] selected\n", program_number, index);
1371                        // 3. pmt¸¦ ¾ò´Â´Ù.                     
1372                        pmt = av->pmtList[index];
1373                        // ÇöÀç ½Ãû ÇÁ·Î±×·¥ÀÇ pmt ÀÎ °æ¿ì, av->pmtList¿¡ ÀÖ´Â °ÍÀÌ ¾Æ´Ï°í av->pmt ¿¡ ÀÖ´Ù.
1374                        if (pmt == NULL && av->pmt && av->pmt->program_number == program_number) {
1375                                pmt = av->pmt;
1376                        }
1377                        if (pmt == NULL) {
1378                                dprint(0, "!! cannot find pmt of #%d\n", program_number);
1379                                break;
1380                        }
1381                        // 4. pmt ¾È¿¡¼­ sdds streamÀ» ã¾Æ pid Á¤º¸¸¦ ¾ò¾î³½´Ù.
1382                        for (i=0; pmt->streams && i<pmt->numStreams; i++) {
1383                                // ÇöÀç ½Ãû ÁßÀÎ pmtÀÇ °æ¿ì, pmtList¿¡ ¾ø´Ù.
1384                                if (pmt->streams[i].stream_type == StreamType_A97SDDS) {
1385                                        pid = pmt->streams[i].elementary_PID;
1386                                        break;
1387                                }
1388                        }
1389                        if (pid == 0) {
1390                                dprint(0, "!! sdds stream type not found in pmt!\n");
1391                                break;
1392                        }
1393                        dprint(2, "  pid 0x%x found\n", pid);
1394                } while (0);
1395               
1396                Dmc_UnlockAVMutex();
1397               
1398        }
1399
1400        if (pid) {
1401#if USE_RF_UPDATE_ONLY
1402                App_SddsStart(pid, 1);
1403#else
1404                App_SddsStart(pid, 0);
1405#endif
1406                return;
1407        }
1408        else {
1409                // ´Ù½Ã ´õ ±â´Ù¸².. ¼º°ø ÇÒ ¶§ ±îÁö °è¼Ó ¹Ýº¹ÇÑ´Ù.
1410                dprint(2, "  pat/pmt not ready or sdds stream not found.. wait more..\n");
1411                DMW_SYS_SetTimer(TIMER_ID_SDDS_WAIT_1, 5000, SddsDownloadStartTimerProc, param, TRUE);         
1412        }
1413
1414       
1415}
1416
1417void SddsUpgradeStartTimerProc(UINT32 nIDTimer, UINT32 count)
1418{
1419        // nIDTimer == TIMER_ID_SDDS_WAIT_2
1420
1421        if (g_SddsUpgradeSkipDelay) {
1422                g_SddsUpgradeSkipDelay = count = 0;
1423        }
1424        dprint(0, "%d seconds left to flash upgrade..\n", count);
1425
1426        if (count == 0) {
1427                App_SddsUpgradeStart(0);
1428        }
1429        else {
1430                DMW_SYS_SetTimer(TIMER_ID_SDDS_WAIT_2, 1000, 
1431                                SddsUpgradeStartTimerProc, count-1, TRUE);
1432        }
1433}
1434
1435
1436void SddsTunerCheckTimerProc(UINT32 nIDTimer, UINT32 param)
1437{
1438        // nIDTimer == TIMER_ID_SDDS_WAIT_0
1439        BOOL bLock;
1440        tDHL_Demod demod;
1441        DHL_RESULT dhr;
1442       
1443        dhr = DHL_FE_GetLockStatus((tDHL_TunerID)0, &bLock, &demod);
1444        if (dhr != DHL_OK || bLock == FALSE) {
1445                dprint(0, "!! tuner not locked\n");
1446                // wait one more time..
1447                DMW_SYS_SetTimer(TIMER_ID_SDDS_WAIT_0, 1000, SddsTunerCheckTimerProc, param, TRUE);
1448                return;
1449        }
1450       
1451        // pid Á¤º¸¸¦ ¾Ë°í ÀÖÀ¸¹Ç·Î program_number Á¤º¸´Â ÇÊ¿ä ¾ø´Ù.
1452        DMW_SYS_SetTimer(TIMER_ID_SDDS_WAIT_1, 5000, SddsDownloadStartTimerProc, 
1453                        g_SddsInfo.sched_pid, TRUE);           
1454}
1455
1456
1457
1458#if COMMENT
1459____UpdateTask____(){}
1460#endif
1461
1462
1463#if USE_FUPDATE_TASK
1464
1465DHL_TMHANDLE g_fupdate_task;
1466
1467#define UPDATE_TASK_CMD_Start 0x10
1468
1469
1470void SddsInitUpdateTask(void)
1471{
1472        DHL_RESULT dhr;
1473        DHL_TIMER_INIT_PARAM param;
1474
1475        memset(&param, 0, sizeof(param));
1476
1477        param.name = "FUpdate";
1478        param.max_timer_entry = 4;
1479        param.task_priority = TASK_PRI_DMW_FLASH;
1480        param.stack_size = 16384;
1481        param.use_mutex_lock = 0;
1482
1483        dhr = DHL_TIMER_Initialize(&param, &g_fupdate_task);
1484
1485        DHL_ASSERT(dhr == DHL_OK, "");
1486}
1487
1488void SddsUpdateTaskDispatcher(UINT32 cmd, UINT32 param)
1489{
1490        if (cmd == UPDATE_TASK_CMD_Start) {
1491                dprint(2, "start fwupdate..\n");
1492                SddsFlashUpdateCallback(0);
1493        }
1494}
1495
1496#endif // USE_FUPDATE_TASK
1497
1498
1499#if COMMENT
1500____EventProc____(){}
1501#endif
1502
1503
1504/******************************************************************************************
1505FUNCTION:
1506  - _App_SddsEventProc
1507
1508Purpose:
1509  - SDDS MW¿¡¼­ È£ÃâµÇ´Â °¢Á¾ callback 󸮱â.
1510
1511******************************************************************************************/
1512
1513static void _App_SddsEventProc(E_SDDS_CB_TYPE cbtype, void *param)
1514{
1515        dprint(3, "------- callback, cbtype %d (%s)\n", cbtype, SddsCbTypeString(cbtype));
1516
1517        if (0);
1518
1519#if 0
1520        else if (cbtype == eSDDS_CB_TYPE_GetOUI)
1521        {
1522                S_SDDS_CBPARAM_GET_OUI *cbp = (S_SDDS_CBPARAM_GET_OUI *)param;
1523                cbp->oui = APP_SDDS_CFG_MFG_OUI;
1524                if (g_bSddsTestAllowAnyOUI)
1525                        cbp->oui = 0x80000000; // special marker.. meaning accept anyone.
1526                /*  ÁÖÀÇ !!!!!!!!
1527                        ÀÌ ½ºÆä¼È ¸¶Ä¿´Â °³¹ß¿ëÀ¸·Î¸¸ »ç¿ëµÇ¾î¾ß ÇÔ!!!!
1528                        OUI´Â 24ºñÆ® À̹ǷÎ, À§ °ªÀº ½ÇÁ¦·Î´Â »ç¿ëµÇÁö ¾Ê´Â ¹üÀ§ÀÓ.
1529                */
1530                cbp->model = APP_SDDS_CFG_MODEL; // NEWBY
1531                cbp->version = 0xFFFF; // any version. we don't use version info.
1532        }
1533#else
1534        else if (cbtype == eSDDS_CB_TYPE_CheckCompatDesc) 
1535        {
1536                S_SDDS_CBPARAM_CHECK_DESC *cbp = (S_SDDS_CBPARAM_CHECK_DESC *)param;
1537                int i;
1538                for (i=0; i<cbp->desc->descriptorCount; i++) {
1539                        sddsCompatDescEntry_t *desc = &cbp->desc->desc[i];
1540                        if (desc->descriptorType != eSystemHardwareDescriptor &&
1541                                desc->descriptorType != eSystemSoftwareDescriptor)
1542                                continue;
1543                        if (desc->specifierType != compatSpecifierType_IEEE_OUI)
1544                                continue;
1545                        if (desc->specifierData != IEEE_OUI_DST)
1546                                continue;
1547                        if (desc->model != APP_SDDS_CFG_MODEL) // NEWCON2
1548                                continue;
1549                        cbp->isOk = TRUE;
1550                        break;
1551                }
1552        }
1553#endif
1554
1555        else if (cbtype == eSDDS_CB_TYPE_NotifySchedules) 
1556        {
1557                /*
1558                        ½ºÄÉÁÙ Á¤º¸´Â Ȱ¿ë ÇØµµ µÇ°í ¾ÈÇØµµ µÈ´Ù.
1559                        ´ë±â ¸ðµå µé¾î°¡¸é ±×³É ÁöÁ¤µÈ RF ¿¡ °¡¼­ sdds start ÇØµµ µÊ.
1560                        ¼­ºñ½º°¡ °ø½Ä ½ÃÀ۵DZâ Àü¿¡´Â ¾îÂ÷ÇÇ dii ºÎÅÍ´Â ÁøÇàÀÌ ¾ÈµÉ Å״ϱî..
1561                */
1562                int i;
1563                sddsScheduleDesc_t *sch = (sddsScheduleDesc_t *)param;
1564                for (i=0; sch && sch->schedules && i<sch->numSchedules; i++) {
1565                        dprint(2, "  sched[%d] %x, %d seconds\n", i,
1566                                sch->schedules[i].startTime,
1567                                sch->schedules[i].lengthInSeconds);
1568                }
1569        }
1570
1571        else if (cbtype == eSDDS_CB_TYPE_CheckModuleInfo) 
1572        {
1573        /*
1574                °¢ ¸ðµâ ÀÌ ¾î¶² °ÍÀÎÁö, download°¡ ÇÊ¿äÇÑ °ÍÀÎÁö µîÀ» Ã¼Å©ÇØ¼­ ¾Ë·ÁÁØ´Ù.
1575                ¸ðµâ Çϳª ¿¡ callbackÀÌ Çѹø ºÒ¸°´Ù. (Áï ¸ðµâ °¹¼ö¸¸Å­ ºÒ¸²)
1576
1577                ok (accept)¸¦ ¸®ÅÏÇϱâ Àü¿¡ ¹öÆÛ±îÁö ¹Ì¸® ÁغñÇØ µÎ¾î¾ß ÇÑ´Ù.
1578                ÀÌ callback ÀÌÈÄ¿¡ ¹Ù·Î À̾ data download callbackÀÌ ºÒ¸°´Ù.
1579        */
1580                S_SDDS_CBPARAM_CHECK_FILE *cbp = (S_SDDS_CBPARAM_CHECK_FILE *)param;
1581                BOOL bOk = TRUE;
1582                int err;
1583
1584                dprint(2, "check file: module id %u, '%s' '%s', %d bytes\n", cbp->id, cbp->name, cbp->version, cbp->size);
1585
1586#if USE_RF_UPDATE_ONLY
1587                dprint(0, "skip version check\n");
1588#else
1589                if (bOk)
1590                        bOk = SddsCheckFirmwareAcceptable(cbp->type, cbp->name, cbp->version, cbp->crc32);
1591
1592                // cafrii 100812 add
1593                // numSupportedHwVersions °¡ 0ÀÌ¸é ¸ðµç º¸µå¿¡ ´ëÇØ ´Ù Àû¿ë°¡´ÉÇÑ °ÍÀ¸·Î µ¿ÀÛÇÑ´Ù.
1594                if (bOk && cbp->numSupportedHwVersions)
1595                        bOk = SddsCheckBoardAcceptable(cbp->numSupportedHwVersions, cbp->supportedHwVersions);
1596#endif
1597
1598                if (bOk) {
1599                        // ÀÌÁ¦ ÀÌ ÆÄÀÏÀº download ÇÒ ÀÚ°ÝÀÌ µÇ¾úÀ½.
1600                        // ÀÌÁ¦ ´Ù¿î·Îµå Áغñ¸¦ ÇÑ´Ù.
1601                        int index = cbp->type == ModuleType_BootLoader ? 0 : 1;
1602                        err = SddsPrepareDownload(index, cbp->id, cbp->size, cbp->crc32);
1603                        if (err) bOk = FALSE;
1604                }
1605
1606                cbp->isOk = bOk;
1607
1608        }
1609
1610        else if (cbtype == eSDDS_CB_TYPE_DownloadNotRequired)
1611        {
1612                SddsDownloadNotRequiredCallback();
1613        }
1614       
1615        else if (cbtype == eSDDS_CB_TYPE_DownloadStarted)
1616        {
1617                SddsDownloadStartCallback((S_SDDS_CBPARAM_DOWNLOAD_START *)param);
1618        }
1619       
1620        else if (cbtype == eSDDS_CB_TYPE_BlockReceived) 
1621        {
1622                SddsReceivedOneBlockCallback((S_SDDS_CBPARAM_BLOCK_RECEIVED *)param);
1623        }
1624
1625        else if (cbtype == eSDDS_CB_TYPE_DownloadStopped) 
1626        {
1627                SddsDownloadStoppedCallback();
1628        }
1629
1630        else if (cbtype == eSDDS_CB_TYPE_ResetDownload)
1631        {
1632                SddsResetDownloadCallback();
1633        }
1634
1635        else if (cbtype == eSDDS_CB_TYPE_DownloadCompleted)
1636        {
1637                SddsDownloadCompletedCallback((int)param);
1638        }
1639       
1640#if !USE_FUPDATE_TASK
1641        else if (cbtype == eSDDS_CB_TYPE_UserAction)
1642        {
1643                SddsUserAction((UINT32)param);
1644        }
1645#endif
1646
1647}
1648
1649
1650
1651#if COMMENT
1652____API____(){}
1653#endif
1654
1655/******************************************************************************************
1656FUNCTION:
1657  - App_SddsStart
1658
1659Purpose:
1660  - ÁÖ¾îÁø pid Á¤º¸·Î sdds ±â´ÉÀ» ½ÃÀÛÇÑ´Ù.
1661    ´çÀåÀº dsi, dii µîÀÇ ¸Þ½ÃÁö¸¸ ¼ö½ÅÇÏ°Ô µÈ´Ù.
1662    ½ÇÁ¦·Î µ¥ÀÌÅÍ ´Ù¿î·Îµå¸¦ ÇÏ´Â ½ÃÁ¡Àº ³ªÁßÀÌ´Ù.
1663
1664    ÇÏÁö¸¸ ÀÌ ÇÔ¼ö°¡ Á÷Á¢ È£ÃâµÇ´Â °æ¿ì´Â º°·Î ¾ø´Ù.
1665    sdds ¼­ºñ½º°¡ Á¦°øµÇ°í ÀÖ´ÂÁö, Á¦°øµÇ°í ÀÖ´Ù¸é ¾î¶² pid ÀÎÁö µîÀÌ
1666    ã±âµµ ½±Áö ¾ÊÀ¸¹Ç·Î, º¸ÅëÀº EPG MW, Channel MW µî¿¡ discovery °úÁ¤À» ÀÇÁ¸ÇÑ´Ù.
1667   
1668******************************************************************************************/
1669void App_SddsStart(UINT16 pid, UINT32 special)
1670{
1671        dprint(2, "start sdds.. pid %x\n", pid);
1672
1673        g_SddsInfo.pid = pid;
1674        g_SddsInfo.special = special;
1675
1676        DMW_SDDS_Start(pid);
1677}
1678
1679
1680/******************************************************************************************
1681FUNCTION:
1682  - App_SddsStop
1683
1684Purpose:
1685  - ÇöÀç ä³Î¿¡¼­ ÁøÇà ÁßÀÎ sdds ´Ù¿î·Îµå¸¦ ÀϽà ÁßÁöÇÑ´Ù.
1686    ½ÇÁ¦·Î download°¡ µ¿ÀÛ ÁßÀÌÁö ¾Ê´õ¶óµµ È£ÃâÇÒ ¼ö ÀÖ´Ù.
1687
1688        º¸Åë ÇöÀç ä³Î ½Ãû ÇÏ´Ù°¡ ´Ù¸¥ ä³Î·Î ÀüȯÇϱâ Àü¿¡
1689        ÀÌ ÇÔ¼ö¸¦ ºÒ·¯ÁÖ¾î¾ß ¾ÈÀüÇÏ´Ù.
1690       
1691        --> 100803 Ãß°¡. ÀÌ ÇÔ¼ö¸¦ ¹Ýµå½Ã ºÒ·¯ÁÖ¾î¾ß ÇÑ´Ù.
1692        ¿Ö³Ä¸é sdds start launch ÇÏ´Â timer¸¦ ¿©±â¼­ cancel ½Ã۱⠶§¹®.
1693
1694    ³ªÁß¿¡ ´Ù½Ã ÇØ´ç ä³Î·Î µ¹¾Æ¿Í¼­ SddsStart·Î resumeÀÌ °¡´ÉÇÏ´Ù.
1695******************************************************************************************/
1696void App_SddsStop(void)
1697{
1698        DMW_SYS_KillTimer(TIMER_ID_SDDS_WAIT_0);
1699        DMW_SYS_KillTimer(TIMER_ID_SDDS_WAIT_1);
1700        DMW_SDDS_Stop();
1701}
1702
1703
1704/******************************************************************************************
1705FUNCTION:
1706  - App_SddsDeleteAll
1707
1708Purpose:
1709  - ÇöÀç
1710        µ¥ÀÌÅ͸¦ »èÁ¦Çϱâ À§Çؼ­ ÇöÀç µ¿ÀÛ ÁßÀÎ ´Ù¿î·Îµå ÀÛ¾÷µµ ÁßÁöµÈ´Ù.
1711        ¾î¶°ÇÑ »óȲ¿¡¼­ ÀÌ ÇÔ¼ö°¡ ÇÊ¿äÇÑÁö ¾ÆÁ÷ ¸íÈ®ÇÏÁö ¾ÊÀ½.
1712******************************************************************************************/
1713void App_SddsDeleteAll(void)
1714{
1715        dprint(2, "delete all!\n");
1716
1717        DMW_SDDS_Reset();
1718        // SddsResetDownloadCallback ÀÌ È£Ãâ µÊ.
1719}
1720
1721/******************************************************************************************
1722FUNCTION:
1723  - App_SddsServiceFoundCallback
1724
1725Purpose:
1726  - SDDS ¼­ºñ½º°¡ ¹ß°ßµÇ¸é EPG ¸ðµâ¿¡¼­ È£ÃâµÊ.
1727******************************************************************************************/
1728void App_SddsServiceFound(UINT32 n_ch, DmcEpgSddsProgramInfo *ch_list)
1729{
1730        // param: ¹ß°ßµÈ sdds ¼­ºñ½º ä³Î ¸®½ºÆ® Á¤º¸.
1731
1732        UINT16 sdds_pid = 0x1200; // todo Å×½ºÆ®..
1733        int rf, i;
1734
1735        dprint(2, "sdds service found. %d channels..\n", n_ch);
1736
1737        // ¿©·¯°³ÀÇ sdds ä³ÎÀÌ µ¿½Ã¿¡ ¼­ºñ½º µÇ°í ÀÖ´Â °æ¿ì´Â ÀÏ´Ü Á¦¿ÜÇÑ´Ù.
1738        // ºñ·Ï,
1739        //   1) ±¹³» ±Ô°ÝÀÇ ½Ã³ª¸®¿À 3Àº ÀÌ·± »óȲÀ» °¡Á¤Çϰí ÀÖÀ¸¸ç,
1740        //   2) EPG MWÀÇ discovery ±â´É ¹× ÀÎÅÍÆäÀ̽º´Â ÀÌ »óȲÀ» cover ÇÒ ¼ö ÀÖ°í,
1741        //   3) SDDS MWµµ (¾Æ¸¶µµ) º¹¼ö ä³Î ij·¯¼¿ ´Ù¿î·Îµå°¡ °¡´ÉÇÒ °Íµµ °°Áö¸¸,
1742        // app ·¹º§¿¡¼­´Â ÀÏ´Ü ´ÜÀÏ Ã¤³Î¸¸À» °í·ÁÇϵµ·Ï ÇÏÀÚ.
1743        //
1744        // Âü°í·Î ÇöÀç Á¦À۵Ǿî ÀÔ¼öµÈ KBS Å×½ºÆ® SDDS ½ºÆ®¸²Àº ½Ã³ª¸®¿À 1ÀÌ´Ù.
1745        // (´ÜÀÏ Ã¤³Î, ´ÜÀÏ ±×·ì case)
1746
1747        if (n_ch <= 0 || !ch_list) 
1748                return;
1749
1750        for (i=0; i<n_ch; i++) {
1751                dprint(2, "  (%d) rf %d, #%u, pid 0x%x\n", i, ch_list[i].id, ch_list[i].program_number, ch_list[i].pid);
1752        }
1753
1754        if (1) {
1755                UINT32 param;
1756                DST_CURCHANNEL *cur;
1757               
1758                cur = App_Ucm_GetCurChInfo(NULL);
1759
1760                // tuner °ü·Ã Á¤º¸´Â ±â·ÏÀ» ÇØ µÎ°í,
1761                g_SddsInfo.chtype = cur->nChannelType ? 1 : 0;
1762                g_SddsInfo.rf = cur->nRF;
1763
1764                // delay timer¸¦ °¡µ¿.
1765                param = (ch_list[0].program_number << 16UL) | (ch_list[0].pid);
1766                DMW_SYS_SetTimer(TIMER_ID_SDDS_WAIT_1, 5000, SddsDownloadStartTimerProc, param, TRUE);         
1767        }
1768}
1769
1770
1771/*
1772        ÀÌ callbackÀº menu task ¿¡¼­ È£ÃâµÈ´Ù.
1773
1774        flash upgrade °¡ ½ÃÀÛµÉ Âû³ª¿¡ power on µîÀÌ µÇ´Â Àý¹¦ÇÑ »óȲÀ» °í·ÁÇØ º¸ÀÚ.
1775       
1776*/
1777void App_SddsPowerModeChanged(BOOL bPowerOn)
1778{
1779        if (bPowerOn) // ´ë±â¸ðµå -> ON ¸ðµå
1780        {
1781                /*
1782                        ÀÌ º¯¼ö¸¦ ¼³Á¤ Çϸé download°¡ ¿Ï·á µÇ¾îµµ flashing ½ÃÀÛÀº ¾ÈÇÑ´Ù.
1783                        ±×·¯³ª ¹Ù·Î Á÷Àü¿¡ download complete°¡ µÇ¾úÀ» ¼ö ÀÖ´Ù.
1784                        ±×·¯¸é Á¤ÇØÁø ¼ö¼ø¿¡ ÀÇÇØ flash update°¡ ½ÃÀ۵ȴÙ.
1785                */
1786                g_SddsPowerOnMode = TRUE;
1787
1788
1789                /*
1790                        ÀÏ´Ü Å¸À̸ӵµ ÁßÁöÇϰí stop message¸¦ º¸³» µÐ´Ù.
1791                        wait ¶Ç´Â download ÁøÇà ÁßÀÌ ¾ú´Ù¸é Áß´ÜÇØ¾ß ÇϹǷÎ..
1792                */
1793                DMW_SYS_KillTimer(TIMER_ID_SDDS_WAIT_2);
1794                App_SddsStop(); 
1795
1796                /*
1797                        Âü°í·Î ÀÌ¹Ì flash update°¡ ½ÃÀÛÇØ ¹ö·È´Ù¸é
1798                        À§ÀÇ stop message´Â Àû¿ëµÇÁö ¾Ê°í sdds task message queue¿¡¼­ ´ë±âµÈ´Ù.
1799
1800                        flash update°¡ ½ÃÀÛµÇ¸é °ð À̾ »óŰ¡ ÀüȯµÈ´Ù.
1801                        g_SddsInfo.state:
1802                                eSDDS_STATE_READY_FOR_FLASHING -> eSDDS_STATE_FLASHING
1803                       
1804                        ¾ÆÁÖ ¾à°£¸¸ ±â´Ù·È´Ù°¡ »óÅ üũ¸¦ ÇØ ÁÖ¸éµÈ´Ù.
1805                       
1806                        SddsDownloadCompleted --> SddsFlashUpdate ±îÁö °É¸®´Â ½Ã°£Àº
1807                        100ms º¸´Ù´Â ÈξÀ ªÀ» °ÍÀÌ´Ù.
1808                */
1809                DHL_OS_Delay(100);
1810
1811                if (g_SddsInfo.state == eSDDS_STATE_FLASHING)
1812                {
1813                        /*
1814                                ÀÌÁ¦ flash update°¡ µ¿ÀÛ ÁßÀÓÀÌ È®½ÇÇÏ´Ù.
1815                                ÇöÀç fw upgrade°¡ ÁøÇà ÁßÀ̶ó¸é ÇØ¾ß ÇÒ ÀÏÀÌ ¸¹À½.
1816                        */
1817                        dprint(0, "\n\n ********* fupdate is in progress ********\n\n\n");
1818                       
1819                       
1820                       
1821                        // show alert osd..
1822                        // DMG_MenuStart(MID_MESSAGE, ..)
1823                        /*
1824                                ÁøÇà »óȲÀº g_SddsInfo.flash_update_progress º¯¼ö¸¦ Âü°íÇÏ¸é µÈ´Ù.
1825                                api°¡ ÇÊ¿äÇÏ¸é ¸¸µéÀÚ.
1826                        */
1827                }
1828        }
1829        else  // ON ¸ðµå --> ´ë±â ¸ðµå
1830        {
1831                g_SddsPowerOnMode = FALSE;
1832
1833                if (g_SddsInfo.state > eSDDS_STATE_READY_FOR_FLASHING) {
1834                        // do nothing..
1835                        dprint(0, "!! flashing is in progress\n");
1836                }
1837                /*
1838                        ´Ù¿î·Îµå°¡ ´Ù µÇ¾î ready »óÅÂÀÎ °æ¿ì flash upgrade¸¦ ½ÃÀÛÇÑ´Ù.
1839                        ±Ô°Ý¿¡ µû¶ó ÀÏÁ¤ ½Ã°£ÀÌ Áö³­ ÈÄ¿¡ ¼öÇà..
1840                */
1841                else if (g_SddsInfo.state == eSDDS_STATE_READY_FOR_FLASHING) {
1842                        dprint(2, "ready for flashing. countdown...\n");
1843                        // ŸÀ̸Ӹ¦ µ¿ÀÛ??
1844                        // ÀÌ Å¸À̸Ӵ power onÀÌ µÉ ¶§ ´Ù½Ã cancel µÇ¾î¾ß ÇÔ.
1845
1846                        DMW_SYS_SetTimer(TIMER_ID_SDDS_WAIT_2, 1000, 
1847                                                SddsUpgradeStartTimerProc, g_SddsUpgradeDelayInStandbyModeSeconds, TRUE);
1848                        //App_SddsUpgradeStart(0);
1849                }
1850                /*
1851                        download°¡ ÁøÇàÇÏ´Ù°¡ Áß´ÜÇÑ °æ¿ì,
1852                        ¶Ç´Â announcement°¡ µÇ¾î ÀÖ´Â °æ¿ì
1853                        Áö±ÝÀº micomÀÌ ¾øÀ¸¹Ç·Î ±»ÀÌ sdds ¼­ºñ½º°¡ ½ÃÀ۵Ǵ Á¤È®ÇÑ ½Ã°£¿¡ ¸ÂÃç
1854                        download¸¦ ½ÃÀÛÇÒ Çʿ䰡 ¾ø´Ù. ±×³É ¹«Á¶°Ç ½ÃÀÛÇÏ¸é µÈ´Ù.
1855                */
1856
1857                else if (g_SddsInfo.sched_rf && g_SddsInfo.sched_pid) 
1858                {
1859                        dprint(2, "---- start sdds in stdby mode, type %d, rf %d, pid %x \n", 
1860                                        g_SddsInfo.sched_chtype, g_SddsInfo.sched_rf, g_SddsInfo.sched_pid);
1861
1862                        // ´ë±â ¸ðµå ÁøÀԽÿ¡ proc_power ¿¡¼­ 5V Àü¿ø µîÀ» off ÇØ ¹ö·ÈÀ¸¹Ç·Î ´Ù½Ã ÄÑ¾ß ÇÔ.
1863                        dprint(2, "  turn on tuner 5V\n");
1864#if 0
1865                        DHL_SYS_SetGPIO(GPIO_5VDC_CTRL);
1866#endif
1867
1868                        // start tuner
1869                        DHL_FE_Start((tDHL_TunerID)0, 
1870                                        DHL_FE_ChannelToFrequency(g_SddsInfo.sched_rf, 
1871                                        g_SddsInfo.sched_chtype ? eDHL_FREQ_STD : eDHL_FREQ_AIR),
1872                                        eDHL_DEMOD_8VSB, NULL);
1873               
1874                        DMW_SYS_SetTimer(TIMER_ID_SDDS_WAIT_0, 1000, SddsTunerCheckTimerProc, 
1875                                        g_SddsInfo.sched_pid, TRUE);
1876                }
1877                else
1878                {
1879                        dprint(2, "no pending sdds jobs..\n");
1880                }
1881        }
1882}
1883
1884
1885
1886/******************************************************************************************
1887FUNCTION:
1888  - App_SddsUpgradeStart
1889
1890Purpose:
1891  - SDDS flash update ½ÃÀÛÇÑ´Ù.
1892 
1893******************************************************************************************/
1894void App_SddsUpgradeStart(UINT32 param)
1895{
1896        // background·Î ÀÛ¾÷ÇØ¾ß ÇÒ °Í °°À½..
1897
1898        // DMW_NvRam ÀÇ worker task¸¦ ¼öÁ¤Çؼ­ fupdate¿¡µµ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏÀÚ.
1899        // todo..
1900
1901        // ÀÌ ÀÛ¾÷ µ¿¾ÈÀº NVM ¼öÁ¤ ÀÛ¾÷ µîÀÌ ¾ø¾î¾ß ÇÑ´Ù.
1902        // how to prevent this??
1903        //
1904
1905        DHL_RESULT dhr;
1906       
1907
1908#if USE_FUPDATE_TASK
1909        // paramÀº wait timeÀ¸·Î »ç¿ë..
1910        dprint(2, "upgrade will be started after %d sec..\n", param);
1911        dhr = DHL_TIMER_Start(g_fupdate_task, UPDATE_TASK_CMD_Start, 0, 
1912                        SddsUpdateTaskDispatcher, param*1000, TRUE);
1913
1914        if (dhr) {
1915                // ÀÌ °æ¿ì ´ëÃ¥ÀÌ ¾øÀ½..
1916        }
1917#else
1918        dprint(2, "upgrade is being started..\n");
1919        DMW_SDDS_UserAction(0); 
1920                // jump to SddsUserAction
1921                // »ç¿ëÀÚ ¸Þ½ÃÁö. ¿ì¸®ÀÇ °æ¿ì flash update Çϴµ¥ »ç¿ë.
1922       
1923#endif
1924
1925}
1926
1927
1928void App_SddsGetInfo(APP_SDDS_SHORT_INFO *pinfo)
1929{
1930        pinfo->state=g_SddsInfo.state;
1931        pinfo->update_progress=g_SddsInfo.flash_update_progress;
1932       
1933        if (g_SddsInfo.total_blocks != 0)
1934        {
1935                pinfo->download_progress=
1936                        (g_SddsInfo.file[0].received_blocks + g_SddsInfo.file[1].received_blocks)*100/
1937                        g_SddsInfo.total_blocks;
1938        }
1939        else
1940        {
1941                pinfo->download_progress = 0;
1942        }
1943       
1944        pinfo->chtype=g_SddsInfo.chtype;
1945        pinfo->rf=g_SddsInfo.rf;
1946        pinfo->pid=g_SddsInfo.pid;     
1947}
1948
1949
1950/******************************************************************************************
1951FUNCTION:
1952  - App_SddsInit
1953
1954Purpose:
1955  - SDDS ¸ðµâÀ» ÃʱâÈ­ ÇÑ´Ù.
1956 
1957******************************************************************************************/
1958void App_SddsInit(void)
1959{
1960        DMW_SDDS_Init();
1961
1962#if 0
1963        DHL_DBG_RegisterFunctionSymbol("epg_start", App_EpgUpdateStart);
1964        DHL_DBG_RegisterFunctionSymbol("epg_stop", App_EpgUpdateCancel);
1965        DHL_DBG_RegisterFunctionSymbol("epg_delete", App_EpgDeleteAll);
1966        DHL_DBG_RegisterFunctionSymbol("epg_list", Dmc_EpgPrintAllTables);
1967#endif
1968        DHL_DBG_RegisterVarSymbol(DHL_VAR_SYM_ARGS(g_bSddsTestAllowAnyOUI));
1969        DHL_DBG_RegisterVarSymbol(DHL_VAR_SYM_ARGS(g_SddsUpgradeDelayInStandbyModeSeconds));
1970        DHL_DBG_RegisterVarSymbol(DHL_VAR_SYM_ARGS(g_SddsUpgradeSkipDelay));
1971
1972        DMW_SDDS_RegisterCallback(_App_SddsEventProc);
1973
1974        SddsResetDownloadCallback();
1975
1976        SddsReadCurrentFwVersion();
1977
1978#if USE_FUPDATE_TASK
1979        SddsInitUpdateTask();
1980#endif
1981
1982}
1983
1984
1985#endif /* SUPPORT_SDDS */
1986
1987
1988int get_sdds_state()
1989{
1990        APP_SDDS_SHORT_INFO info;
1991
1992        App_SddsGetInfo(&info);
1993       
1994        return info.state;
1995}
1996
1997
1998/* end of file */
Note: See TracBrowser for help on using the repository browser.