UartComm.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:10k
源码类别:

DVD

开发平台:

C/C++

  1. #include "UartComm.h"
  2. #include "global.h"
  3. #include "io_uart1.h"
  4. #include "emuio.h"
  5. #include "memmap.h"
  6. #include "memmap0.h"
  7. #include "memcfg.h"
  8. #include "kernel.h"
  9. #include "osd.h"
  10. #include "iop.h"
  11. #include "ircode.h"
  12. #include "cchar.h"
  13. #include "epp.h"
  14. #include "fsGUI1.h"
  15. #include "fsGUI.h"
  16. #include "func.h"
  17. #include "setup.h"
  18. #include "timer.h"
  19. extern const BYTE ir_mapcode[256];  //Jefftest 20020606
  20. // external functions
  21. extern UINT16 FlashReadID();
  22. extern void osd_init_setup(void);
  23. extern void osd_draw_rect(UINT32 xStart, UINT32 yStart, UINT32 xLen, UINT32 yLen, BYTE bkColor);
  24. extern void osd_DrawLine(UINT32 xStart, UINT32 yStart, UINT32 xEnd, UINT32 yEnd, BYTE color, BYTE lineWidth);
  25. extern void DrawOSD_XO(BYTE bXO);
  26. extern int FlashEraseUpgrade(unsigned char *pBuf, unsigned int dwSize);
  27. // external variables
  28. extern UINT16 save_srn_start_t;
  29. #ifdef SUPPORT_UART_UPGRADE
  30. int nInputLevel = 0;
  31. UINT32 g_dwFileSize = 0;
  32. UINT16 g_uID;
  33. inline int pollingUARTRx(void)
  34. {
  35.     while (!IsEPPRxEmpty())
  36.     {
  37.         char c = EPP_GETC();
  38.         if (c == 'u')
  39.             nInputLevel = 1;
  40.         else if (c == 'a')
  41.             nInputLevel = (nInputLevel == 1) ? 2 : 0;
  42.         else if (c == 'r')
  43.             nInputLevel = (nInputLevel == 2) ? 3 : 0;
  44.         else if (c == 't' && nInputLevel == 3)
  45.         {
  46.             nInputLevel = 0;
  47.             EPP_PUTC_EXACT('3'); // the character '3' is just for communication with pc side AP.
  48.             return 1;
  49.         }
  50.         else nInputLevel = 0;
  51.     }
  52.     return 0;
  53. }
  54. inline void DoMoveUARTRxData(void)
  55. {
  56.     BYTE szFileSize[4] = {0};
  57.     UINT32 nIndex = 0;
  58.     BYTE* pDVDROM;
  59.     BYTE c;
  60.     // check file size.
  61.     do
  62.     {
  63.         if (!IsEPPRxEmpty())
  64.         {
  65.             c = EPP_GETC();
  66.             szFileSize[nIndex] = c;
  67.             nIndex++;
  68.         }
  69.     }
  70.     while (nIndex <= 3);
  71.     g_dwFileSize = getUINT32_li(szFileSize);
  72.     //printf("g_dwFileSize = %dn", g_dwFileSize);
  73.     EPP_PUTC_EXACT('1'); // communication signal
  74.     // should disable screen saver and show upgrade menu here...
  75.     disable_video();
  76.     delay_1ms(20);
  77.     config_memory(MEMORY_GRAPH_SMALL);
  78.     setup_tv_format(tv_format);
  79.     setVPP_TVformat(tv_format);
  80.     FSGUI_FillFrameBuf(0, 0, 352, 288, BK_GROUNDY, BK_GROUNDCRCB);
  81.     delay_1ms(20);
  82.     enable_video();
  83.     FSGUI_UpdateInfoArea("DOWNLOADING ROM FILE...");
  84.     PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  85.     //receive file data and put into SDRAM
  86.     nIndex = 0;
  87.     pDVDROM = (BYTE *)(SDRAM_BASE + (A_UDF_WORK_BUF+UDF_WORK_BUF_SIZE) * 1024);
  88.     do
  89.     {
  90.         if (!IsEPPRxEmpty())
  91.         {
  92.             c = EPP_GETC();
  93.             *(pDVDROM + nIndex) = c;
  94.             save_srn_start_t = get_rtc_val(); // prevent entering screen saver
  95.             nIndex++;
  96.             if ((nIndex % 12) == 0) // send a response every 12 bytes
  97.                 EPP_PUTC_EXACT('=');
  98.         }
  99.     }
  100.     while (nIndex < g_dwFileSize);
  101.     EPP_PUTC_EXACT('=');
  102.     //epp_write_wait("nFinish downloading rom file.n");
  103.     if (g_dwFileSize)
  104.     {
  105.         BYTE    strVersion[10];
  106.         int     i;
  107.         for (i = 0; i < 7; i++)
  108.         {
  109.             strVersion[i] = *(pDVDROM + 0x30 + i);
  110.         }
  111.         strVersion[7] = '';
  112.         g_uID = FlashReadID();
  113.         if (g_uID != 0xdead) //Jeff 20021023
  114.         {
  115.             // call upgrading function here...
  116.             FSGUI_UpdateInfoArea("CHECKING ROM FILE...");
  117.             DoUpgrade(strVersion);
  118.         }
  119.         else
  120.         {
  121.             // Flash rom ID doesn't match.
  122.             FSGUI_UpdateInfoArea("FLASH ID IS WRONG!!");
  123.             while(1);
  124.         }
  125.     }
  126. }
  127. void DoUpgrade(BYTE* strVersion)
  128. {
  129.     BYTE buf[30];
  130.     BYTE len, bOK = 0;
  131.     BYTE *pDVDROM = (BYTE *)(SDRAM_BASE + (A_UDF_WORK_BUF+UDF_WORK_BUF_SIZE) * 1024);
  132.     ircmd_callback_check = NULL;
  133.     cd_subtype = CDROM_BIN;
  134.     osd_init_setup();
  135.     if (IsOSDChinese())
  136.         psprintf(buf, "         %s           ", &_OsdMessegeFont1[osd_font_mode][STR_OS_SMART_UPGRADE][0]);
  137.     else
  138.         psprintf(buf, "        %s       ", &_OsdMessegeFont1[osd_font_mode][STR_OS_SMART_UPGRADE][0]);
  139.     len = strlen(buf);
  140.     osd_draw_rect(4*16, 3*26, 28*16, 7*26, 6);
  141.     
  142.     //top
  143.     osd_DrawLine(4*16, 3*26, 4*16+28*16, 3*26, 2, 1);
  144.     //left
  145.     osd_DrawLine(4*16-2, 3*26, 4*16-2, 3*26+7*26, 2, 1);
  146.     //bottom
  147.     osd_DrawLine(4*16, 3*26+7*26, 4*16+28*16, 3*26+7*26, 11, 1);
  148.     //right
  149.     osd_DrawLine(4*16+28*16, 3*26, 4*16+7*26, 3*26+28*16, 11, 1);
  150.     osd_DrawString(4, 3, buf, 2, 6); //2:font color, 6:background color
  151.     //psprintf(buf, "%s", "LOADING...");
  152.     psprintf(buf, "%s", &_OsdMessegeFont1[osd_font_mode][STR_OS_READ][0]); //Jeff 20020527
  153.     len = strlen(buf);
  154.     osd_DrawString(6, 5, buf, 2, 6); //2:font color, 6:background color
  155.     
  156.     //Calculate CheckSum
  157.     {
  158.         BYTE    *p, bl, bh;
  159.         UINT32  *pSum, iSum = 0, iNext = 0;
  160.         UINT32  iIndex = 31;
  161.         //we store check in 20th byte
  162.         pSum = (UINT32 *)(pDVDROM + 0x20);
  163.         //printf("Origional checksum=%08xn", *pSum);
  164.         //from 80th byte to caculate checksum
  165.         p = (BYTE *)(pDVDROM + 0x50);
  166.         while (iIndex < g_dwFileSize)
  167.         {
  168.             bl = *p++;
  169.             iIndex++;
  170.             
  171.             if (iIndex < g_dwFileSize)
  172.             {
  173.                 bh = *p++;
  174.                 iIndex++;
  175.             }
  176.             else
  177.             {
  178.                 bl = 0;
  179.                 bh = 0;
  180.             }
  181.             iSum = iSum + iNext;
  182.             iNext = (unsigned int)bh * 256U + (unsigned int)bl;
  183.         }
  184.         iNext &= 0xFF;
  185.         iSum += iNext;
  186.         //printf("Read checksum=%08xn", iSum);
  187.         
  188.         if (*pSum != iSum)
  189.         {
  190.             //printf("Checksum Errorn");
  191.             FSGUI_UpdateInfoArea("CHECKSUM ERROR...");
  192.             while(1);
  193.         }
  194.     }
  195.     /*
  196.     //check FLASH id, Jeff 20020708
  197.     {
  198. BYTE    *p;
  199. UINT16  iFlashID;
  200.   //we add flash-id in init0.s, offset=0x30
  201.   p = (BYTE *)(SDRAM_BASE + (P_BIDIR_LUMA) * 1024 + 0x30);
  202.   iFlashID = ((*(p + 1)) << 8) & 0xff00;
  203.   iFlashID = iFlashID | *(p);
  204.   
  205.         //for old version, iFlashID should be 0
  206.         if (iFlashID)
  207.         {
  208. if (iFlashID != g_uID)
  209. {
  210. psprintf(buf, "%s:%x %xn", "FLASH MISMATCH", iFlashID, g_uID);
  211. len = strlen(buf);
  212. osd_DrawString(6, 5, buf, 2, 6); //2:font color, 6:background color
  213. while(1);
  214. }
  215.         }
  216. }
  217.     */
  218.     if (IsOSDChinese())
  219.         psprintf(buf, "%s %s %s %s", &_OsdMessegeFont1[osd_font_mode][STR_OS_UPGRADE_TO][0], strVersion, Ch_ban, Ch_question);
  220.     else
  221.         psprintf(buf, "%s%s %s", &_OsdMessegeFont1[osd_font_mode][STR_OS_UPGRADE_TO][0], strVersion, Ch_question);
  222.     len = strlen(buf);
  223.     
  224.     osd_DrawString(6, 5, buf, 2, 6); //2:font color, 6:background color
  225.     //Draw O-X selection
  226.     DrawOSD_XO(0);
  227.     
  228.     // pop up an OSD menu for users to decide to upgrade flash or not
  229.     do
  230.     {
  231.         UINT32  rx;
  232. #ifndef OLD_VFD_DRV
  233.         UINT32  nVFDkey = 0;
  234. nVFDkey = CheckVFDkey();
  235. #endif
  236.         extern UINT16 GetIRCode();  // 2004/10/01 yltseng, move to ir_parser.c GetIRCode()
  237.         rx = GetIRCode();
  238.         
  239.         if( rx != IR_CODE_MAX_NUM )
  240.         {            
  241.             if (rx == IRC_LEFT) 
  242.             {
  243.                 if (bOK == 1)
  244.                 {
  245.                     bOK = 0;
  246.                     DrawOSD_XO(0);
  247.                 }
  248.             }
  249.             else if (rx == IRC_RIGHT)
  250.             {
  251.                 if (bOK == 0)
  252.                 {
  253.                     bOK = 1;
  254.                     DrawOSD_XO(1);
  255.                 }
  256.             }
  257.             else if( (rx == IRC_SELECT)||(rx == IRC_PLAY_SELECT) )
  258.             {
  259.                 if (bOK == 1)
  260.                 {
  261.                     bOK = 2;
  262.                 }
  263.                 // user don't want to do the upgrading action.
  264.                 break;
  265.             }
  266.         }
  267.         
  268. #ifndef OLD_VFD_DRV     // 2004/10/14 yltseng
  269.         if (nVFDkey != IR_CODE_MAX_NUM)
  270.         {
  271.             if (nVFDkey == IRC_LEFT)
  272.             {
  273.                 if (bOK == 1)
  274.                 {
  275.                     bOK = 0;
  276.                     DrawOSD_XO(0);
  277.                 }
  278.             }
  279.             else if (nVFDkey == IRC_RIGHT)
  280.             {
  281.                 if (bOK == 0)
  282.                 {
  283.                     bOK = 1;
  284.                     DrawOSD_XO(1);
  285.                 }
  286.             }
  287.             else if ((nVFDkey == IRC_PLAY) || (nVFDkey == IRC_PAUSEPLAY))
  288.             {
  289.                 if (bOK == 1)
  290.                 {
  291.                     bOK = 2;
  292.                 }
  293.                 break;
  294.             }
  295.         }
  296. #endif        
  297.     } while (bOK != 2);
  298.     if (bOK == 2)
  299.     {
  300.         FSGUI_UpdateInfoArea("UPGRADING...");
  301.         //write system image to flash
  302.         osd_init_setup();
  303.         
  304.         if (IsOSDChinese())
  305.             psprintf(buf, "         %s           ", &_OsdMessegeFont1[osd_font_mode][STR_OS_SMART_UPGRADE][0]);
  306.         else
  307.             psprintf(buf, "        %s       ", &_OsdMessegeFont1[osd_font_mode][STR_OS_SMART_UPGRADE][0]);
  308.         len = strlen(buf);
  309.         osd_draw_rect(4*16, 3*26, 28*16, 7*26, 6);
  310.         //top
  311.         osd_DrawLine(4*16, 3*26, 4*16+28*16, 3*26, 2, 1);
  312.         //left
  313.         osd_DrawLine(4*16-2, 3*26, 4*16-2, 3*26+7*26, 2, 1);
  314.         //bottom
  315.         osd_DrawLine(4*16, 3*26+7*26, 4*16+28*16, 3*26+7*26, 11, 1);
  316.         //right
  317.         osd_DrawLine(4*16+28*16, 3*26, 4*16+7*26, 3*26+28*16, 11, 1);
  318.         osd_DrawString(4, 3, buf, 2, 6); //2:font color, 6:background color
  319.         psprintf(buf, "%s...", &_OsdMessegeFont1[osd_font_mode][STR_OS_UPGRADING][0]);
  320.         osd_DrawString(6, 5, buf, 2, 6); //2:font color, 6:background color
  321.         psprintf(buf, "%s", &_OsdMessegeFont1[osd_font_mode][STR_OS_NOT_POWEROFF][0]);
  322.         osd_DrawString(6, 6, buf, 2, 5); //2:font color, 6:background color
  323.         FlashEraseUpgrade(pDVDROM, g_dwFileSize);
  324.         while (1);
  325.     }
  326.     FSGUI_UpdateInfoArea("PLEASE REBOOT THE MACHINE.");
  327.     while (1);
  328. }
  329. #endif