flash.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:4k
源码类别:

uCOS

开发平台:

C/C++

  1. //====================================================================
  2. // File Name : flash.c
  3. // Function  : S3C2440 Flash Program
  4. // Program   : Kong, In Wook (KIW)
  5. // Date      : May 30, 2002
  6. // Version   : 0.0
  7. // History
  8. //   0.0 : Programming start (May 30,2002) -> KIW
  9. //          Arrangement source code(8/01/2002)-> SOP 
  10. // Edited for SMDK2440(07/07/2003) -> Junon
  11. //====================================================================
  12. #include <string.h>
  13. #include "def.h"
  14. #include "option.h"
  15. #include "2440addr.h"
  16. #include "2440lib.h"
  17. #include "2440slib.h" 
  18. #include "mmu.h"
  19. #include "am29f800.h"
  20. #include "strata32.h"
  21. static int DownloadData(void);
  22. //#if 1
  23.     // removed because of multiple definition
  24. U32 downloadAddress; 
  25. U32 downloadProgramSize;
  26. //#else
  27. //   U32 downloadAddress; 
  28. //   U32 downloadProgramSize;
  29. //#endif
  30. //==========================================================================================
  31. void *flashType[][2]=
  32. {
  33.     (void *)ProgramAM29F800,     "AM29LV800BB x1      ",
  34. //  (void *)Program28F640J3A,    "28F640J3A x2        ",    
  35.     (void *)Program28F128J3A,    "28F128J3A(16MB) x2  ",    
  36. (void *)Erase28F128J3A,   "Erase 28F128J3A ", // added by junon 10/29    
  37.     0,0
  38. };
  39. //==========================================================================================
  40. void ProgramFlash(void)
  41. {
  42.     int i=0,whichFlash;
  43.     char key;
  44.     Uart_Printf("n[ NOR Flash Memory Writer Ver 0.1 ]nn");
  45.     Uart_Printf("The program buffer : 0x31000000 ~ 0x33ff0000n");
  46.     
  47.     downloadAddress=0x31000000;
  48.     downloadProgramSize=0x0;
  49.     //MMU_Init();
  50.     ChangeRomCacheStatus(RW_NCNB);
  51.     
  52.     while(1)
  53.     {   //display menu
  54.         Uart_Printf("%c : %s",'a'+i,flashType[i][1]);
  55.         i++;
  56.         if((int)(flashType[i][0])==0)
  57.         {
  58.             Uart_Printf("n");
  59.             break;
  60.         }
  61.         if((i%4)==0) 
  62.             Uart_Printf("n");
  63.     }
  64.     Uart_Printf("Select the type of a flash memory ? ");
  65.     whichFlash=Uart_Getch()-'a';
  66.     Uart_Printf("%cn",(whichFlash+'a'));
  67.     //Uart_Printf("n");
  68.     if( i<0 || (i>=(sizeof(flashType)/8)) )
  69.         return;
  70.     Uart_Printf("Do you want to download through UART0 from 0x%x? [y/n] : ",downloadAddress);
  71.     key=Uart_Getch();
  72.     Uart_Printf("%cn",key);
  73.     if(key=='y')
  74.     {
  75.         if(!DownloadData())
  76.             return;
  77.     }
  78.     ( (void (*)(void))(flashType[whichFlash][0]) )();
  79. }
  80. //==========================================================================================
  81. static int DownloadData(void)
  82. {
  83.     int i,tmp;
  84.     U16 checkSum=0,dnCS;
  85.     U32 fileSize=10;
  86.     U8 *downPt;
  87.     downPt=(U8 *)downloadAddress;
  88.    
  89.     Uart_Printf("ndownloadAddress = %xn",downloadAddress);
  90.     Uart_Printf("Download the plain binary file(.BHC) to be writtenn");
  91.     Uart_Printf("The file format : <n+6>(4)+(n)+CS(2)n");
  92.     Uart_Printf("To transmit .BIN file : wkocm2 xxx.BIN /1 /d:1n");
  93.     Uart_Printf("Download methods : COM:8Bit,NP,1STOPn");
  94.  
  95.     Uart_Printf("nSTATUS : ");
  96.     rINTMSK=BIT_ALLMSK;
  97.     
  98.     tmp=RdURXH1(); //To remove overrun error state.
  99.     i=0;    
  100.     while(i<fileSize)
  101.     {
  102.         while(!(rUTRSTAT1&0x1));
  103.             *(downPt+i)=RdURXH1();
  104.         if(i==3)
  105.         {
  106.             fileSize=*((U8 *)(downloadAddress+0))+
  107.             (*((U8 *)(downloadAddress+1))<<8)+
  108.             (*((U8 *)(downloadAddress+2))<<16)+
  109.             (*((U8 *)(downloadAddress+3))<<24);
  110.         }
  111.     
  112.         if((i%1000)==0)
  113.             WrUTXH1('#');
  114.         i++;
  115.     }
  116.     downloadProgramSize=fileSize-6;
  117.     for(i=4;i<(fileSize-2);i++)
  118.     {
  119.         checkSum+=*((U8 *)(i+downloadAddress));
  120.     }
  121.     dnCS=*((U8 *)(downloadAddress+fileSize-2))+
  122.           (*( (U8 *)(downloadAddress+fileSize-1) )<<8);
  123.     if(checkSum!=dnCS)
  124.     {
  125.         Uart_Printf("Checksum Error!!! MEM : %x  DN : %xn",checkSum,dnCS);
  126.         return 0;
  127.     }
  128.     Uart_Printf("nDownload O.K.n");
  129.     return 1;
  130. }