wts_main.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:31k
源码类别:

DVD

开发平台:

C/C++

  1. /*****************************************************************************
  2. File name   : main.c
  3.  
  4. Description : Main entry point
  5. COPYRIGHT (C) 2004 STMicroelectronics
  6. *****************************************************************************/
  7. /* Includes --------------------------------------------------------------- */
  8. /* Standard Headers */
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include "stddefs.h"
  12. #include "stlite.h"
  13. #include "stdevice.h"
  14. /* STAPI Headers */
  15. #include "stpio.h"
  16. #include "stcommon.h"
  17. #include "stboot.h"
  18. #include "stflash.h"
  19. #include "sttbx.h"
  20. #include "stuart.h"
  21. #include "testtool.h"
  22. /* Local Headers */
  23. #define GLOBAL_DATA
  24. #include "wts_app_data.h"
  25. #include "wts_flash.h"
  26. /*
  27. #include "wt_flash.h"
  28. */
  29. /* Private Types ------------------------------------------------------ */
  30. U32 wtFlashBankBaseAddr;
  31. #ifdef rayf
  32. #include <debug.h>
  33.   #define BUF_LEN 512
  34. U32             read_start_address;             /********/  
  35. U32             read_size;                      /********/ 
  36. BOOL            rom_serial = FALSE;             /* ROM serial number update     */
  37. BOOL            report_verbose = TRUE;         /* reporting level           LP's init for debugging   */
  38. FILE_STRING     rom_datafile;                   /* datafile name                */
  39. FILE_STRING     rom_serialno;                   /* Serial number/code           */
  40. ROMTOOL_REPORT  rom_report = NULL_REPORT;     /* reporting level              */
  41. ROMTOOL_MODE    rom_operation = NULL_MODE;      /* operational mode             */
  42. ROMTOOL_BOARD   rom_board = STB3;               /* board                        */
  43. ROMTOOL_ERASE    erase_type=NULL_ERASE;
  44. ROMTOOL_IMAGE   image_type;
  45. UBYTE           byteBuffer[1*1024*1024 /* 4096 */] ;              /* a buffer */
  46. UBYTE lnbByteBuffer[32*1024];
  47. char     buf1[0xff];
  48. /* ============================= PRIVATE CONSTANTS ================================ */
  49. static const char *Version = "ROMTOOL V1.0:n"
  50.    #if __ICC_VERSION_NUMBER__ == 50600
  51.    "tChain : DCU: Osprey1.6.2n"
  52.    #elif __ICC_VERSION_NUMBER__ == 50600
  53.    "tChain : DCU: Osprey1.8n"
  54.     #elif __ICC_VERSION_NUMBER__ == 60100
  55.    "tChain : DCU: Osprey1.8.1n"
  56.    #else
  57.    "tChain : DCU: Osprey2.0.0n"
  58.    #endif
  59. ;
  60. /* =============================GLOBAL_VARIABLES=============================== */
  61. #endif
  62. /* Private Constants -------------------------------------------------- */
  63. #if 0
  64. #define SYSTEM_MEMORY_SIZE 0x00400000 /*0x0800000*/ /* 8Mb */
  65. #define NCACHE_MEMORY_SIZE 0x00080000 /*0x0080000*/ /* 0.5Mb */
  66. #else
  67. #define SYSTEM_MEMORY_SIZE 0x00A00000//0x00200000 /*0x0800000*/ /* 8Mb */
  68. #define NCACHE_MEMORY_SIZE 0x00080000 /*0x0080000*/ /* 0.5Mb */
  69. #endif
  70. /* if BANK_1 defined it is available */
  71. #if defined(FLASH_BANK_1_BASE_ADDRESS)
  72.     #define STFLASH_BANK_1_BASE     FLASH_BANK_1_BASE_ADDRESS
  73. #endif
  74. /* Private Variables -------------------------------------------------- */
  75. /* Allow room for OS20 segments in internal memory */
  76. static unsigned char    InternalMemory[ST20_INTERNAL_MEMORY_SIZE-1200];
  77. static unsigned char    SystemMemory[SYSTEM_MEMORY_SIZE];
  78. static unsigned char    NcacheMemory[NCACHE_MEMORY_SIZE];
  79. static ST_Partition_t   TheInternalPartition;
  80. static ST_Partition_t   TheSystemPartition;
  81. static ST_Partition_t   TheNcachePartition;
  82. #pragma ST_section      (InternalMemory, "internal_section")
  83. #pragma ST_section      (SystemMemory, "system_section")
  84. #pragma ST_section      (NcacheMemory, "ncache_section")
  85. STBOOT_DCache_Area_t DCacheMap[] = { {NULL, NULL} }; /* Dcache must be disabled for flash program*/
  86. /* Private Macros ----------------------------------------------------- */
  87. /* Global ----------------------------------------------------------------- */
  88. ST_Partition_t          *InternalPartition    = &TheInternalPartition;
  89. ST_Partition_t          *SystemPartition      = &TheSystemPartition;
  90. ST_Partition_t          *NcachePartition      = &TheNcachePartition;
  91. /* PTI/OS20 */
  92. ST_Partition_t          *internal_partition   = &TheInternalPartition;
  93. ST_Partition_t          *system_partition     = &TheSystemPartition;
  94. ST_Partition_t          *ncache_partition     = &TheNcachePartition;
  95. /* Private Function prototypes ---------------------------------------- */
  96. #if 1
  97. extern int atoi();
  98. extern int exit();
  99. #endif
  100. /* Functions -------------------------------------------------------------- */
  101. /*-------------------------------------------------------------------------
  102.  * Function : wts_BOOT_Init
  103.  *            Initialise boot process
  104.  * Input    : None
  105.  * Output   :Initialize the st20 kur
  106.  * Return   : Error Code
  107.  * ----------------------------------------------------------------------*/
  108. static ST_ErrorCode_t wts_BOOT_Init( void )
  109. {
  110.     ST_ErrorCode_t      ErrCode;
  111.     STBOOT_InitParams_t BootParams;
  112.     BootParams.SDRAMFrequency               = SDRAM_FREQUENCY;
  113.     BootParams.CacheBaseAddress             = (U32*) CACHE_BASE_ADDRESS;
  114.     BootParams.DCacheMap                    = DCacheMap;
  115.     BootParams.ICacheEnabled                = TRUE;
  116.     BootParams.BackendType.DeviceType       = STBOOT_DEVICE_UNKNOWN;
  117.     BootParams.BackendType.MajorRevision    = STBOOT_REVISION_UNKNOWN;
  118.     BootParams.BackendType.MinorRevision    = STBOOT_REVISION_UNKNOWN;
  119.     BootParams.MemorySize                   = STBOOT_DRAM_MEMORY_SIZE_0;/*Originally SDRAM_SIZE*/
  120.     ErrCode = STBOOT_Init(BOOTDeviceName, &BootParams);
  121.     #ifdef STTBX_PRINT
  122.         printf("STBOOT_Init()=%sn", wts_GetErrorText(ErrCode));
  123.     #endif
  124.     return ( ErrCode );
  125. } /* end wts_BOOT_Init */
  126. /*-------------------------------------------------------------------------
  127.  * Function : wts_PIO_Init
  128.  *            PIO Init function
  129.  * Input    : None
  130.  * Output   :Initialise the required PIO Port
  131.  * Return   : Error Code
  132.  * ----------------------------------------------------------------------*/
  133. static ST_ErrorCode_t wts_PIO_Init( void )
  134. {
  135.     ST_ErrorCode_t      ErrCode;
  136.     int Count;
  137.     STPIO_InitParams_t  PIOInitParams[NUM_PIO_PORTS];
  138.     /* --- initialise multi-purpose PIO port inputs and outputs --- */
  139.     PIOInitParams[0].BaseAddress        = (U32 *)PIO_0_BASE_ADDRESS;
  140.     PIOInitParams[0].InterruptNumber    = PIO_0_INTERRUPT;
  141.     PIOInitParams[0].InterruptLevel     = PIO_0_INTERRUPT_LEVEL;
  142.     PIOInitParams[1].BaseAddress        = (U32 *)PIO_1_BASE_ADDRESS;
  143.     PIOInitParams[1].InterruptNumber    = PIO_1_INTERRUPT;
  144.     PIOInitParams[1].InterruptLevel     = PIO_1_INTERRUPT_LEVEL;
  145.     PIOInitParams[2].BaseAddress        = (U32 *)PIO_2_BASE_ADDRESS;
  146.     PIOInitParams[2].InterruptNumber    = PIO_2_INTERRUPT;
  147.     PIOInitParams[2].InterruptLevel     = PIO_2_INTERRUPT_LEVEL;
  148.     PIOInitParams[3].BaseAddress        = (U32 *)PIO_3_BASE_ADDRESS;
  149.     PIOInitParams[3].InterruptNumber    = PIO_3_INTERRUPT;
  150.     PIOInitParams[3].InterruptLevel     = PIO_3_INTERRUPT_LEVEL;
  151. #ifndef ST_5105
  152.     PIOInitParams[4].BaseAddress        = (U32 *)PIO_4_BASE_ADDRESS;
  153.     PIOInitParams[4].InterruptNumber    = PIO_4_INTERRUPT;
  154.     PIOInitParams[4].InterruptLevel     = PIO_4_INTERRUPT_LEVEL;
  155.     PIOInitParams[5].BaseAddress        = (U32 *)PIO_5_BASE_ADDRESS;
  156.     PIOInitParams[5].InterruptNumber    = PIO_5_INTERRUPT;
  157.     PIOInitParams[5].InterruptLevel     = PIO_5_INTERRUPT_LEVEL;
  158. #endif
  159.     for ( Count = 0; Count < NUM_PIO_PORTS; Count++)
  160.     {
  161.         PIOInitParams[Count].DriverPartition = SystemPartition;
  162.         ErrCode = STPIO_Init (PIODeviceName[Count], &(PIOInitParams[Count]));
  163.         if ( ErrCode != ST_NO_ERROR )
  164.             break;
  165.     }
  166.     #ifdef STTBX_PRINT
  167.         printf("STPIO_Init(0-4)=%sn", wts_GetErrorText(ErrCode));
  168.     #endif
  169.     return ( ErrCode );
  170. } /* end wts_PIO_Init */
  171. /*-------------------------------------------------------------------------
  172.  * Function : wts_TBX_Init
  173.  *            Toolbox Init
  174.  * Input    : None
  175.  * Output   :
  176.  * Return   : Error Code
  177.  * ----------------------------------------------------------------------*/
  178. static ST_ErrorCode_t wts_TBX_Init( void )
  179. {
  180.     ST_ErrorCode_t      ErrCode;
  181.     STTBX_InitParams_t  InitParams;
  182.     InitParams.SupportedDevices     = STTBX_DEVICE_DCU;
  183.     InitParams.DefaultOutputDevice  = STTBX_DEVICE_DCU;
  184.     InitParams.DefaultInputDevice   = STTBX_DEVICE_DCU;
  185.     /* for STTBX 2.0.0 and later */
  186.     InitParams.CPUPartition_p       = SystemPartition;
  187.     strcpy(InitParams.UartDeviceName, UARTDeviceName);
  188.     ErrCode = STTBX_Init(TBXDeviceName, &InitParams );
  189.     #ifdef STTBX_PRINT
  190.         printf("STTBX_Init()=%sn", wts_GetErrorText(ErrCode));
  191.     #endif
  192.     return ( ErrCode );
  193. } /* end wts_TBX_Init */
  194. #if defined(TESTTOOL)
  195. /*-------------------------------------------------------------------------
  196.  * Function : wts_TST_Init
  197.  *          : Initialise the TESTOOL driver
  198.  * Input    : None
  199.  * Output   :
  200.  * Return   : Error Code
  201.  * ----------------------------------------------------------------------*/
  202. static ST_ErrorCode_t wts_TST_Init()
  203. {
  204.     ST_ErrorCode_t      ErrCode = ST_NO_ERROR;
  205.     STTST_InitParams_t  STTST_InitParams;
  206.     memset (STTST_InitParams.InputFileName, 0, sizeof(STTST_InitParams.InputFileName));
  207.     STTST_InitParams.CPUPartition_p = SystemPartition;
  208.     STTST_InitParams.NbMaxOfSymbols = 1000;
  209.     if ( STTST_InitParams.CPUPartition_p == NULL )
  210.     {
  211.         STTBX_Print(("Memory partition undefined, STTST cannot be started !!n"));
  212.         return -1;
  213.     }
  214.     else
  215.     {
  216.         ErrCode = STTST_Init(&STTST_InitParams);
  217.     }
  218.     return ( ErrCode );
  219. } /* end wts_TST_Init */
  220. #endif
  221. /*-------------------------------------------------------------------------
  222.  * Function : wts_UART_Init
  223.  *          : Initialise the UART driver
  224.  * Input    : None
  225.  * Output   :
  226.  * Return   : Error Code
  227.  * ----------------------------------------------------------------------*/
  228. static ST_ErrorCode_t wts_UART_Init( void )
  229. {
  230.     ST_ErrorCode_t ErrCode;
  231.     STUART_InitParams_t UartInitParams;
  232.     STUART_Params_t UartDefaultParams;
  233.     
  234.     UartDefaultParams.RxMode.DataBits           = STUART_8BITS_NO_PARITY;
  235.     UartDefaultParams.RxMode.StopBits           = STUART_STOP_1_0;
  236.     UartDefaultParams.RxMode.FlowControl        = STUART_NO_FLOW_CONTROL;
  237.     UartDefaultParams.RxMode.BaudRate           = 115200;
  238.     UartDefaultParams.RxMode.TermString         = NULL;
  239.     UartDefaultParams.RxMode.TimeOut            = 1; 
  240.     UartDefaultParams.RxMode.NotifyFunction     = NULL;
  241.     UartDefaultParams.TxMode.DataBits           = STUART_8BITS_NO_PARITY;
  242.     UartDefaultParams.TxMode.StopBits           = STUART_STOP_1_0;
  243.     UartDefaultParams.TxMode.FlowControl        = STUART_NO_FLOW_CONTROL;
  244.     UartDefaultParams.TxMode.BaudRate           = 115200;
  245.     UartDefaultParams.TxMode.TermString         = NULL;
  246.     UartDefaultParams.TxMode.TimeOut            = 0; /* No time-out */
  247.     UartDefaultParams.TxMode.NotifyFunction     = NULL; /* No callback */
  248.     UartDefaultParams.SmartCardModeEnabled      = FALSE;
  249.     UartDefaultParams.GuardTime                 = 0;
  250.     /* Initialise UART */
  251.     UartInitParams.UARTType         = STUART_RTSCTS;
  252.     UartInitParams.DriverPartition  = SystemPartition;
  253.     UartInitParams.BaseAddress      = (U32 *) UART_BASE_ADDRESS;
  254.     UartInitParams.InterruptNumber  = UART_INTERRUPT;
  255.     UartInitParams.InterruptLevel   = UART_INTERRUPT_LEVEL;
  256.     UartInitParams.ClockFrequency   = ST_GetClockSpeed();
  257.     printf("ST_GetClockSpeed() = %d n",ST_GetClockSpeed());
  258.     UartInitParams.SwFIFOEnable     = TRUE;
  259.     UartInitParams.FIFOLength       = 256;
  260.     
  261. #ifdef ST_5105
  262.     strcpy(UartInitParams.RXD.PortName, PIODeviceName[1]);
  263.     UartInitParams.RXD.BitMask      = UART_RXD_BIT;
  264.     strcpy(UartInitParams.TXD.PortName, PIODeviceName[1]);
  265.     UartInitParams.TXD.BitMask      = UART_TXD_BIT;
  266.     
  267.     strcpy(UartInitParams.RTS.PortName, PIODeviceName[1]);
  268.     strcpy(UartInitParams.CTS.PortName, PIODeviceName[1]);
  269.     UartInitParams.RTS.BitMask = PIO_BIT_4;
  270.     UartInitParams.CTS.BitMask = PIO_BIT_5;
  271. #elif defined(ST_5100)
  272.     strcpy(UartInitParams.RXD.PortName, PIODeviceName[4]);
  273.     UartInitParams.RXD.BitMask      = UART_RXD_BIT;
  274.     strcpy(UartInitParams.TXD.PortName, PIODeviceName[4]);
  275.     UartInitParams.TXD.BitMask      = UART_TXD_BIT;
  276.     
  277.     strcpy(UartInitParams.RTS.PortName, PIODeviceName[4]);
  278.     strcpy(UartInitParams.CTS.PortName, PIODeviceName[4]);
  279.     UartInitParams.RTS.BitMask = PIO_BIT_2;
  280.     UartInitParams.CTS.BitMask = PIO_BIT_3;
  281. #endif
  282.     UartInitParams.DefaultParams    = &UartDefaultParams;    
  283.     
  284.     ErrCode = STUART_Init(UARTDeviceName, &UartInitParams);
  285.     #ifdef STTBX_PRINT
  286.         printf("STUART_Init()=%sn", wts_GetErrorText(ErrCode));
  287.     #endif
  288.     return ( ErrCode );
  289. } /* end wts_UART_Init() */
  290. #if defined(TESTTOOL)
  291. /*-------------------------------------------------------------------------
  292.  * Function : GetRevision
  293.  *            Function to return all driver revisions
  294.  * Input    :
  295.  * Output   :
  296.  * Return   : FALSE
  297.  * ----------------------------------------------------------------------*/
  298. BOOL wts_TT_GetRevisions( STTST_Parse_t *pars_p, char *Result )
  299. {
  300.     /* get revisions for all drivers used */
  301.     STTBX_Print(("STBOOT  = %sn", STBOOT_GetRevision()));
  302.     STTBX_Print(("STFLASH = %sn", STFLASH_GetRevision()));
  303.     STTBX_Print(("STPIO   = %sn", STPIO_GetRevision()));
  304.     STTBX_Print(("STTBX   = %sn", STTBX_GetRevision()));
  305.     STTBX_Print(("STUART  = %sn", STUART_GetRevision()));
  306.     return (FALSE);
  307. } /* end GetRevisions */
  308. #endif
  309. int wts_htod(const char *p /*nptr*/){
  310.   int            i,j,ss,sum=0 ;
  311.   int            nameLength ;
  312.   char           bit; 
  313.   
  314.   nameLength = strlen( p ) ;
  315.   if (*p =='0' && (*(p+1) == 'x' || *(p+1) == 'X'))
  316.    for(i=2;i<nameLength;i++){
  317.     switch (*(p+i)) {
  318.       case 'A':
  319.         bit = 10 ;
  320.         break ;
  321.       case 'a':
  322.         bit = 10 ;
  323.         break ;
  324.       case 'B':
  325.         bit = 11 ;
  326.         break ;
  327.       case 'b':
  328.         bit = 11 ;
  329.         break ;
  330.       case 'C':
  331.         bit = 12 ;
  332.         break ;
  333.       case 'c':
  334.         bit = 12 ;
  335.         break ;
  336.       case 'D':
  337.         bit = 13 ;
  338.         break ;
  339.       case 'd':
  340.         bit = 13 ;
  341.         break ;
  342.       case 'E':
  343.         bit = 14 ;
  344.         break ;
  345.       case 'e':
  346.         bit = 14 ;
  347.         break ;
  348.       case 'F':
  349.         bit = 15 ;
  350.         break ;
  351.       case 'f':
  352.         bit = 15 ;
  353.         break ;
  354.       default:
  355.         if(*(p+i)>='0' && *(p+i)<='9')
  356.           bit = *(p+i)-0X30;
  357.         else
  358.           return 0;  
  359.       }/* end switch */  
  360.       ss=1;
  361.       for(j=0;j<nameLength-i-1;j++)
  362.       ss*=0x10;
  363.     sum += bit*ss; 
  364.    }/* end for */
  365.   else 
  366.     return atoi(p);
  367.   
  368.   return sum;  
  369. }/* end wts_htod */
  370. /*-------------------------------------------------------------------------
  371.  * Function : main
  372.  *            Main entry point
  373.  * Input    : command line arguments
  374.  * Output   :
  375.  * Return   : TRUE if error, FALSE if success
  376.  * ----------------------------------------------------------------------*/
  377. int main(int argc, char *argv[])
  378. {
  379.     ST_ErrorCode_t ErrCode  = ST_NO_ERROR;
  380.     char Filename[]         = "flash.hex";
  381. char LogoName[] = "logo.bin";
  382. char LangName[] = "lang.bin";
  383. char LNBName[] = "lnb.bin";
  384. #ifdef rayf
  385.   char  buf[BUF_LEN];
  386.   int     valid ;
  387.   BOOL prev_menu;
  388.   int status = FALSE;
  389.   BOOL help  = FALSE ;
  390. #endif
  391.  
  392.     partition_init_simple(&TheInternalPartition, (U8 *)InternalMemory, sizeof(InternalMemory));
  393.     partition_init_heap(  &TheSystemPartition,   (U8 *)SystemMemory,   sizeof(SystemMemory));
  394.     partition_init_heap(  &TheNcachePartition,   (U8 *)NcacheMemory ,  sizeof(NcacheMemory));
  395.     /* Initialisation */
  396.     if ( wts_BOOT_Init() != ST_NO_ERROR )
  397.         return 2;
  398.     if ( ErrCode == ST_NO_ERROR )
  399.         ErrCode  = wts_PIO_Init();
  400.     if ( ErrCode == ST_NO_ERROR )
  401.         ErrCode  = wts_UART_Init();             /* Needs PIO */
  402.     if ( ErrCode == ST_NO_ERROR )
  403.         ErrCode  = wts_TBX_Init();              /* Needs UART */
  404. #if 0
  405. printf("b4 FLASH_SetupBlockInfon");
  406.     if ( ErrCode == ST_NO_ERROR )
  407.         ErrCode  = wts_FLASH_SetupBlockInfo();
  408.     if ( ErrCode == ST_NO_ERROR )
  409.         {
  410.             ErrCode = wts_FLASH_Init(BANK0);
  411.             if ( ErrCode == ST_NO_ERROR )
  412.             ErrCode = wts_FLASH_Open(BANK0);
  413.         }
  414.     #ifdef STFLASH_BANK_1_BASE
  415.         if ( ErrCode == ST_NO_ERROR )
  416.         {
  417.             ErrCode = wts_FLASH_Init(BANK1);
  418.             if ( ErrCode == ST_NO_ERROR )
  419.                 ErrCode = wts_FLASH_Open(BANK1);
  420.         }
  421.     #endif
  422. #endif
  423.     if ( ErrCode == ST_NO_ERROR )
  424.     {
  425.         STTBX_Print(("n==============================================n"));
  426.         STTBX_Print(("t     STAPI Demo Software n"));
  427.         STTBX_Print(("t  %s at %sn", __DATE__, __TIME__  ));
  428.         STTBX_Print(("tChip %s in board %sn", __FRONTEND, __PLATFORM ));
  429.         STTBX_Print(("t CPU Clock Speed = %dn", ST_GetClockSpeed() ));
  430.         STTBX_Print(("==============================================nn"));
  431.     }   
  432. #ifdef rayf
  433.   /* Initialise the OS20 kernel */
  434.      debugmessage(Version);
  435. #if 1
  436.     debugmessage( "nROMTOOL> Enter Flash Base address (default: STx5105--0x40000000): " );
  437.     debuggets(buf, BUF_LEN);
  438.     wtFlashBankBaseAddr = wts_htod(buf);
  439. if(wtFlashBankBaseAddr == 0)
  440. wtFlashBankBaseAddr=0x40000000;
  441.     sprintf(buf1,"Flash Base address = [0x%x]n", wtFlashBankBaseAddr);
  442.     debugmessage(buf1);
  443. #endif
  444. do{
  445.   prev_menu = FALSE ;
  446.   valid = FALSE ;
  447.   while (!valid)
  448.   {
  449.     debugmessage("nROMTOOL>Operation: n");
  450.     debugmessage(" 1) Erase n");
  451.     debugmessage(" 2) Program n");
  452.     debugmessage(" 3) Verify n");
  453.     debugmessage(" 4) Read n");
  454.     debugmessage(" 5) Exit n");
  455.     debugmessage(" Enter a number : ");
  456.     debuggets( buf, BUF_LEN ) ;
  457.     switch (buf[0]) {
  458.       case '1':
  459.         rom_operation = ERASE ;
  460.         valid = TRUE ;
  461.         break ;
  462.       case '2':
  463.         rom_operation = PROGRAM ;
  464.         valid = TRUE ;
  465.         break ;
  466.       case '3':
  467.         rom_operation = VERIFY ;
  468.         valid = TRUE ;
  469.         break ;
  470.       case '4':
  471.         rom_operation = READ ;
  472.         valid = TRUE ;
  473.         break ;
  474.       case '5':
  475.         exit(0) ;
  476.       default:
  477.         debugmessage("nInvalid selection, try again : ");
  478.         break ;
  479.     }
  480.   }
  481. if (rom_operation==PROGRAM || rom_operation==VERIFY)
  482.   {
  483.     valid = FALSE ;
  484.     while (!valid) {
  485.       debugmessage("nROMTOOL> image type: n");
  486.       debugmessage(" 1) HexCode Image n");
  487.       debugmessage(" 2) BinCode Image n");
  488.       debugmessage(" 3) LNB List n");
  489.       debugmessage(" 4) Logo Image n");
  490.       debugmessage(" 5) Language Image n");
  491.       debugmessage(" 6) Chnl List n");
  492.       debugmessage(" 7) All FLASH  n");
  493.   #if 0
  494.       debugmessage(" 8) PREV MENU     n");
  495.   #endif
  496.       debugmessage(" 9) EXIT     n");
  497.       debugmessage(" Enter a number : ");
  498.       debuggets( buf, BUF_LEN ) ;
  499.       switch (buf[0]) {
  500.         case '1':
  501.         image_type = HexCode ;
  502.         valid = TRUE ;
  503.         break ;
  504.         case '2':
  505.         image_type = BinCode ;
  506.         valid = TRUE ;
  507.         break ;
  508.         case '3':
  509.         image_type = LNBList ;
  510.         valid = TRUE ;
  511.         break ;
  512.         case '4' :
  513.         image_type = LogoImage ;
  514.         valid = TRUE ;
  515.         break ;
  516.         case '5' :
  517.         image_type = LanguageImage ;
  518.         valid = TRUE ;
  519.         break ;
  520.         case '6' :
  521.         image_type = CHNList ;
  522.         valid = TRUE ;
  523.         break ;
  524.         case '7' :
  525.         image_type = All ;
  526.         valid = TRUE ;
  527.         break ;
  528. #if 0
  529.         case '8' :
  530.         prev_menu = TRUE;
  531.         valid = TRUE ;
  532.         break;
  533. #endif
  534.         case '9' :
  535.         exit(0);
  536.         default:
  537.         debugmessage("nInvalid selection, try again : ");
  538.         break ;
  539.       }
  540.     } 
  541.     /* init partitions */
  542.   if(image_type == HexCode){
  543.     if ( ErrCode == ST_NO_ERROR )
  544.         ErrCode  = wts_FLASH_SetupBlockInfo();
  545.     if ( ErrCode == ST_NO_ERROR )
  546.         {
  547.             ErrCode = wts_FLASH_Init(BANK0);
  548.             if ( ErrCode == ST_NO_ERROR )
  549.             ErrCode = wts_FLASH_Open(BANK0);
  550.         }
  551.     #ifdef STFLASH_BANK_1_BASE
  552.         if ( ErrCode == ST_NO_ERROR )
  553.         {
  554.             ErrCode = wts_FLASH_Init(BANK1);
  555.             if ( ErrCode == ST_NO_ERROR )
  556.                 ErrCode = wts_FLASH_Open(BANK1);
  557.         }
  558.     #endif
  559.     if ( wts_FLASH_ReadFile(Filename) != 0 )
  560.         if ( wts_VerifyFlash() == TRUE )
  561.             if ( wts_EraseFlash(FALSE) == FALSE )
  562.                 if ( wts_ProgramFlash() == FALSE )
  563.                     wts_VerifyFlash();
  564.    #ifdef STFLASH_BANK_1_BASE
  565.         wts_FLASH_Close(BANK1);
  566.         wts_FLASH_Term(TRUE, BANK1);
  567.    #endif
  568.    wts_FLASH_Close(BANK0);
  569.    wts_FLASH_Term(TRUE, BANK0);
  570.    return (0);
  571.   }
  572.     if ( ErrCode == ST_NO_ERROR )
  573.         ErrCode  = FLASH_SetupBlockInfo();
  574.     if ( ErrCode == ST_NO_ERROR )
  575.         {
  576.             ErrCode = FLASH_Init(BANK0);
  577.             if ( ErrCode == ST_NO_ERROR )
  578.             ErrCode = FLASH_Open(BANK0);
  579.         }
  580.     #ifdef STFLASH_BANK_1_BASE
  581.         if ( ErrCode == ST_NO_ERROR )
  582.         {
  583.             ErrCode = FLASH_Init(BANK1);
  584.             if ( ErrCode == ST_NO_ERROR )
  585.                 ErrCode = FLASH_Open(BANK1);
  586.         }
  587.     #endif
  588.     debugmessage( "nROMTOOL> Enter filename Write into Flash : " );
  589.     debuggets(buf, BUF_LEN);
  590.     strcpy(rom_datafile, buf);
  591.     if ( FLASH_ReadFile(rom_datafile) == 0 )
  592.     {
  593.        debugmessage("read file failedn") ;
  594.       exit(1) ;
  595.     }
  596.   }
  597. else if(rom_operation==ERASE){
  598.     valid = FALSE ;
  599.     while (!valid) {
  600.       debugmessage("nROMTOOL> Erase type: n");
  601.       debugmessage(" 1) Erase All Flash  n");
  602.       debugmessage(" 2) Erase Code Image n");
  603.       debugmessage(" 3) Erase LNB List n");
  604.       debugmessage(" 4) Erase Logo Image n");
  605.       debugmessage(" 5) Erase Language Image n");
  606.       debugmessage(" 6) PREV MENU     n");
  607.       debugmessage(" 7) EXIT     n");
  608.       debugmessage(" Enter a number : ");
  609.       debuggets( buf, BUF_LEN ) ;
  610.       switch (buf[0]) {
  611.         case '1':
  612.         erase_type = ERASE_ALL ;
  613.         valid = TRUE ;
  614.         break ;
  615.         case '2':
  616.         erase_type = ERACODE ;
  617.         valid = TRUE ;
  618.         break ;
  619.         case '3':
  620.         erase_type = ERALNB ;
  621.         valid = TRUE ;
  622.         break ;
  623.         case '4' :
  624.         erase_type = ERALOGO ;
  625.         valid = TRUE ;
  626.         break ;
  627.         case '5' :
  628.         erase_type = ERALANGUAGE ;
  629.         valid = TRUE ;
  630.         break ;
  631.         case '6' :
  632.         prev_menu = TRUE;
  633.         valid = TRUE ;
  634.         break;
  635.         case '7' :
  636.         exit(0);
  637.         default:
  638.         debugmessage("nInvalid selection, try again : ");
  639.         break ;
  640.       }
  641.     } 
  642.     if ( ErrCode == ST_NO_ERROR )
  643.         ErrCode  = wts_FLASH_SetupBlockInfo();
  644.     if ( ErrCode == ST_NO_ERROR )
  645.         {
  646.             ErrCode = wts_FLASH_Init(BANK0);
  647.             if ( ErrCode == ST_NO_ERROR )
  648.             ErrCode = wts_FLASH_Open(BANK0);
  649.         }
  650.     #ifdef STFLASH_BANK_1_BASE
  651.         if ( ErrCode == ST_NO_ERROR )
  652.         {
  653.             ErrCode = wts_FLASH_Init(BANK1);
  654.             if ( ErrCode == ST_NO_ERROR )
  655.                 ErrCode = wts_FLASH_Open(BANK1);
  656.         }
  657.     #endif
  658. }
  659. else if (rom_operation==READ)
  660.   {
  661.     debugmessage( "nROMTOOL> Enter Flash to filename : " );
  662.     debuggets(buf, BUF_LEN);
  663.     strcpy(rom_datafile, buf);
  664.     debugmessage( "nROMTOOL> Enter Read start address : " );
  665.     debuggets(buf, BUF_LEN);
  666.     read_start_address = wts_htod(buf);
  667.     sprintf(buf1,"read_start_address    = 0x%xn", read_start_address);
  668.   debugmessage(buf1);
  669.         
  670.     debugmessage( "nROMTOOL> Enter Read Size (byte) : " );
  671.     debuggets(buf, BUF_LEN);
  672.     read_size = wts_htod(buf);
  673.     sprintf(buf1,"read_size    = 0x%xn", read_size);
  674.   debugmessage(buf1);    
  675.   
  676.     if ( ErrCode == ST_NO_ERROR )
  677.         ErrCode  = FLASH_SetupBlockInfo();
  678.     if ( ErrCode == ST_NO_ERROR )
  679.         {
  680.             ErrCode = FLASH_Init(BANK0);
  681.             if ( ErrCode == ST_NO_ERROR )
  682.             ErrCode = FLASH_Open(BANK0);
  683.         }
  684.     #ifdef STFLASH_BANK_1_BASE
  685.         if ( ErrCode == ST_NO_ERROR )
  686.         {
  687.             ErrCode = FLASH_Init(BANK1);
  688.             if ( ErrCode == ST_NO_ERROR )
  689.                 ErrCode = FLASH_Open(BANK1);
  690.         }
  691.     #endif
  692.   }
  693. }while(prev_menu);
  694.   rom_report = FULL ;
  695.   status = TRUE ;
  696. /*******************************************************/
  697.   debugmessage("nFlash Programmer V2.0  .");
  698.   debugmessage("n(c) WTMEC Microelectronics Ltd 2005.11.11nn");
  699. if(rom_operation==PROGRAM  || rom_operation==VERIFY){
  700.   if(image_type == LNBList)
  701.     debugmessage("Image type: LNB Listnn");
  702.   else if(image_type == LogoImage)
  703.     debugmessage("Image type: Logonn");
  704.   else if(image_type == LanguageImage)
  705.     debugmessage("Image type: Languagenn");
  706.   else if(image_type == CHNList)
  707.     debugmessage("Image type: Channel Listnn");
  708.   else if(image_type == HexCode)
  709.     debugmessage("Image type: *.hex Codenn");
  710.   else if(image_type == BinCode)
  711.     debugmessage("Image type: *.bin Codenn");
  712.   else  
  713.     debugmessage("Image type: Total flashnn");
  714. }
  715. else if(rom_operation == ERASE){
  716.     debugmessage("Erase flash nn");
  717. }
  718. else{
  719.     debugmessage("Read flash nn");
  720. }
  721.   if (rom_datafile[0]!='')
  722.     sprintf(buf1,"file        = %sn", rom_datafile);
  723. debugmessage(buf1);
  724. #if 0
  725.   if (TRUE)
  726.     sprintf(buf1,"address     = 0x%xn", address_load);
  727. debugmessage(buf1);
  728. #endif
  729. /***********************************************/
  730.   if (rom_operation==ERASE)
  731.   {
  732.   if (erase_type==ERASE_ALL) {
  733.     debugmessage("Erase Total flash nn");
  734.     status = wts_EraseFlash(TRUE) ;
  735.     if (status) {
  736.        debugmessage("Erase failedn") ;
  737.       exit(1) ;
  738.     }
  739.   }
  740.   if(erase_type==ERACODE){
  741.     debugmessage("Erase code nn");
  742.     status = wts_EraseCodeFlash(TRUE) ;
  743.     if (status) {
  744.        debugmessage("Erase failedn") ;
  745.       exit(1) ;
  746.     }
  747. }
  748.   if(erase_type==ERALOGO){
  749.     debugmessage("Erase logo nn");
  750.     status = wts_EraseLogoFlash(TRUE) ;
  751.     if (status) {
  752.        debugmessage("Erase failedn") ;
  753.       exit(1) ;
  754.     }
  755. }
  756.   if(erase_type==ERALANGUAGE){
  757.     debugmessage("Erase language nn");
  758.     status = wts_EraseLanguageFlash(TRUE) ;
  759.     if (status) {
  760.        debugmessage("Erase failedn") ;
  761.       exit(1) ;
  762.     }
  763. }
  764.   
  765.   if(erase_type==ERALNB){
  766.     debugmessage("Erase LNB nn");
  767.     status = wts_EraseLNBFlash(TRUE) ;
  768.     if (status) {
  769.        debugmessage("Erase failedn") ;
  770.       exit(1) ;
  771.     }
  772. }
  773.  debugmessage("Operation completed successfullyn");
  774.  
  775.    #ifdef STFLASH_BANK_1_BASE
  776.         wts_FLASH_Close(BANK1);
  777.         wts_FLASH_Term(TRUE, BANK1);
  778.    #endif
  779.    wts_FLASH_Close(BANK0);
  780.    wts_FLASH_Term(TRUE, BANK0);
  781.    return (0);
  782.   
  783. }
  784.  else if (rom_operation==PROGRAM || rom_operation==VERIFY)
  785.    {
  786.    if(image_type == BinCode ){
  787.     if(rom_operation==PROGRAM){
  788.        debugmessage("begin --------- Program/verify BinCode n") ;
  789. status = ProgramFlash() ;
  790. if (status)
  791. {
  792.       debugmessage("Program failedn") ;
  793.       exit (1) ;
  794. }
  795. status = VerifyFlash() ;
  796. if (status)
  797. {
  798.       debugmessage("verify failedn") ;
  799.       exit (1) ;
  800. }
  801. }
  802. else{
  803.        debugmessage("begin --------- verify BinCode n") ;
  804.         status = VerifyFlash() ;
  805.        if (status)
  806.     {
  807.            debugmessage("verify failedn") ;
  808.            exit (1) ;
  809.     }
  810. }
  811. }
  812.    else if(((image_type == LNBList) || (image_type == CHNList)) ){
  813.     if( rom_operation==PROGRAM ){
  814. debugmessage("begin ----- Program/verify LNB or Channel listn") ;
  815.    status = ProgramLNBFlash();
  816. if (status)
  817. {
  818.       debugmessage("Program failedn") ;
  819.       exit (1) ;
  820. }
  821. status = VerifyLNBFlash() ;
  822. if (status)
  823. {
  824.       debugmessage("verify failedn") ;
  825.       exit (1) ;
  826. }
  827.     }
  828. else{
  829.        debugmessage("begin --------- verify LNB or Channel list n") ;
  830.         status = VerifyLNBFlash() ;
  831.        if (status)
  832.     {
  833.            debugmessage("verify failedn") ;
  834.            exit (1) ;
  835.     }
  836. }
  837. }
  838.    else if(image_type == LogoImage ){
  839.     if( rom_operation==PROGRAM ){
  840. debugmessage("begin ----- Program/verify Logon") ;
  841.    status = ProgramLogoFlash();
  842. if (status)
  843. {
  844.       debugmessage("Program failedn") ;
  845.       exit (1) ;
  846. }
  847. #if 0
  848. status = VerifyLogoFlash() ;
  849. if (status)
  850. {
  851.       debugmessage("verify failedn") ;
  852.       exit (1) ;
  853. }
  854. #endif
  855.     }
  856. #if 0
  857. else{
  858.        debugmessage("begin --------- verify Logo n") ;
  859.         status = VerifyLogoFlash() ;
  860.        if (status)
  861.     {
  862.            debugmessage("verify failedn") ;
  863.            exit (1) ;
  864.     }
  865. }
  866. #endif
  867. }
  868.    else if(image_type == LanguageImage ){
  869.     if( rom_operation==PROGRAM ){
  870. debugmessage("begin ----- Program/verify Language n") ;
  871.    status = ProgramLanguageFlash();
  872. if (status)
  873. {
  874.       debugmessage("Program failedn") ;
  875.       exit (1) ;
  876. }
  877. status = VerifyLanguageFlash() ;
  878. if (status)
  879. {
  880.       debugmessage("verify failedn") ;
  881.       exit (1) ;
  882. }
  883.     }
  884. else{
  885.        debugmessage("begin --------- verify Language  n") ;
  886.         status = VerifyLanguageFlash() ;
  887.        if (status)
  888.     {
  889.            debugmessage("verify failedn") ;
  890.            exit (1) ;
  891.     }
  892. }
  893. }
  894.    else if( image_type == All ){
  895.     if( rom_operation==PROGRAM ){
  896. debugmessage("begin ----- Program/verify 2M Flash  n") ;
  897.    status = ProgramAllFlash();
  898. if (status)
  899. {
  900.       debugmessage("Program failedn") ;
  901.       exit (1) ;
  902. }
  903. status = VerifyAllFlash() ;
  904. if (status)
  905. {
  906.       debugmessage("verify failedn") ;
  907.       exit (1) ;
  908. }
  909.     }
  910. else{
  911.        debugmessage("begin --------- verify 2M Flash   n") ;
  912.         status = VerifyAllFlash() ;
  913.        if (status)
  914.     {
  915.            debugmessage("verify failedn") ;
  916.            exit (1) ;
  917.     }
  918. }
  919. }
  920.    else
  921.     return FALSE;
  922.  debugmessage("Operation completed successfullyn");
  923.    #ifdef STFLASH_BANK_1_BASE
  924.         FLASH_Close(BANK1);
  925.         FLASH_Term(TRUE, BANK1);
  926.    #endif
  927.    FLASH_Close(BANK0);
  928.    FLASH_Term(TRUE, BANK0);
  929.  exit (0);
  930.    
  931.   }
  932.   else 
  933.     if (rom_operation==READ)     
  934.     {
  935.      debugmessage("begin --------- read n") ;
  936.      status = ReadProgram( rom_datafile, read_start_address, read_size );
  937.      if (!status)
  938.   {
  939.       debugmessage("Read failedn") ;
  940.       exit (1) ;
  941.     }
  942.  debugmessage("Operation completed successfullyn");
  943.    #ifdef STFLASH_BANK_1_BASE
  944.         FLASH_Close(BANK1);
  945.         FLASH_Term(TRUE, BANK1);
  946.    #endif
  947.    FLASH_Close(BANK0);
  948.    FLASH_Term(TRUE, BANK0);
  949.  exit (0);
  950.     }
  951.  debugmessage("Operation completed successfullyn");
  952.  exit (0);
  953. /*******************gleam****************************/
  954. #else
  955. #endif
  956.    return (0);
  957. } /* end main */
  958. /* EOF --------------------------------------------------------------------- */