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

uCOS

开发平台:

C/C++

  1. #include <string.h>
  2. #include "def.h"
  3. #include "option.h"
  4. #include "2440addr.h"
  5. #include "2440lib.h"
  6. #include "2440slib.h" 
  7. #include "Am29f800.h"
  8. //Revision History
  9. // 2001.8.25:purnnamu:If the data is downloaded by ICE, the writing isn't done correct.
  10.  
  11. int AM29F800_ProgFlash(U32 realAddr,U16 data);
  12. void AM29F800_EraseSector(int targetAddr);
  13. int AM29F800_CheckId(void);
  14. int BlankCheck(int targetAddr,int targetSize);
  15. int _WAIT(void);
  16. static void InputTargetAddr(void);
  17. // Because KS32C41000_A1 is connected to AM29LV800_A0,
  18. // the addr parameter has to be a WORD address, so called in AMD specification.
  19. #define _WR(addr,data) *((U16 *)(addr<<1))=(U16)data
  20. #define _RD(addr) ( *((U16 *)(addr<<1)) )
  21. #define _RESET() _WR(0x0,0xf0f0)
  22. #define BADDR2WADDR(addr)   (addr>>1)
  23. extern U32 downloadAddress;
  24. extern U32 downloadProgramSize;
  25. static U32 srcAddress;
  26. static U32 srcOffset;
  27. static U32 targetAddress;
  28. static U32 targetSize;
  29. void ProgramAM29F800(void)
  30. {
  31.     int i;
  32.     InputTargetAddr();
  33.     
  34.     if(downloadProgramSize==0)
  35.     {
  36.         Uart_Printf("The data must be downloaded using ICE from %xn",downloadAddress);
  37.      srcAddress=downloadAddress;
  38.     }
  39.     else
  40.      srcAddress=downloadAddress+4; //to discard the data head for the size
  41.     
  42.     Uart_Printf("[Check AM29LVxxx]n");
  43.     switch(AM29F800_CheckId())  //04.01.12 junon
  44.     {
  45. case 1 :
  46.     Uart_Printf("This device is AM29LV200B!n");
  47.     break;
  48. case 2 :
  49.     Uart_Printf("This device is AM29LV400B!n");
  50.     break;
  51. case 3 :
  52.     Uart_Printf("This device is AM29LV800B!n");
  53.     break;
  54. case 4 :
  55.     Uart_Printf("This device is AM29LV160B!n");
  56.     break;
  57.      default:
  58.     Uart_Printf("ID Check Error!!!n");
  59.     return;
  60.     }
  61.     
  62.     Uart_Printf("nErase the sector:0x%x.n",targetAddress);
  63.     
  64.     AM29F800_EraseSector(targetAddress);
  65.     if(!BlankCheck(targetAddress,targetSize))
  66.     {
  67. Uart_Printf("Blank Check Error!!!n");
  68. return;
  69.     }
  70.     Uart_Printf("nStart of the data writing.n");
  71.     for(i=0x0;i<targetSize;i+=2) 
  72.     {
  73.         AM29F800_ProgFlash(  i+targetAddress,*( (U16 *)(srcAddress+srcOffset+i) )  );
  74.         if((i%0x1000)==0)Uart_Printf("%x ",i);
  75.     }
  76.     Uart_Printf("nEnd of the data writing!!!n");
  77.     _RESET();
  78.     Uart_Printf("nVerifying Start.n");
  79.     for(i=0x0;i<targetSize;i+=2) 
  80.     {
  81.         if(*( (U16 *)(i+targetAddress) )!=*( (U16 *)(srcAddress+srcOffset+i) )  )
  82. {    
  83.     Uart_Printf("%x=verify errorn",i+targetAddress);
  84.     return;
  85. }
  86.         if((i%0x1000)==0)Uart_Printf("%x ",i);
  87.     }
  88.     Uart_Printf("nVerifying End!!!n");
  89.     Uart_Printf("Do you want another programming without additional download? [y/n]n");
  90.     if(Uart_Getch()=='y')ProgramAM29F800();
  91. }
  92. static void InputTargetAddr(void)
  93. {
  94.     static U32 nextTargetAddr=0,nextSrcOffset=0;
  95.     Uart_Printf("[AM29F800 Writing Program]n");
  96.     Uart_Printf("nCAUTION: Check AM29LV800 BYTE#(47) pin is connected to VDD.n");
  97.     Uart_Printf("nSource size:0h~%xhn",downloadProgramSize);
  98.     Uart_Printf("nAvailable Target/Source Address:n"); 
  99.     Uart_Printf("    0x0, 0x4000, 0x6000, 0x8000,0x10000,0x20000,0x30000,0x40000,n");
  100.     Uart_Printf("0x50000,0x60000,0x70000,0x80000,0x90000,0xa0000,0xb0000,0xc0000,n");
  101.     Uart_Printf("0xd0000,0xe0000,0xf0000n");
  102.     Uart_Printf("Input source offset[0x%x]:",nextSrcOffset);
  103.     srcOffset=Uart_GetIntNum();
  104.     if(srcOffset==(U32)(-1))srcOffset=nextSrcOffset;
  105.     
  106.     Uart_Printf("Input target address among above addresses[0x%x]:",nextTargetAddr);
  107.     targetAddress=Uart_GetIntNum();
  108.     if(targetAddress==(U32)(-1))targetAddress=nextTargetAddr;
  109.  
  110.     if(targetAddress<0x4000)targetSize=0x4000;
  111.     else if(targetAddress<0x6000)targetSize=0x2000;
  112.     else if(targetAddress<0x8000)targetSize=0x2000;
  113.     else if(targetAddress<0x10000)targetSize=0x8000; 
  114.     else targetSize=0x10000;
  115.     Uart_Printf("source offset=0x%xn",srcOffset);
  116.     Uart_Printf("target address=0x%xn",targetAddress);
  117.     Uart_Printf("target block size=0x%xn",targetSize);
  118.     
  119.     if(srcOffset<0x4000)nextSrcOffset=0x4000;
  120.     else if(srcOffset<0x6000)nextSrcOffset=0x6000;
  121.     else if(srcOffset<0x8000)nextSrcOffset=0x8000;
  122.     else if(srcOffset<0x10000)nextSrcOffset=0x10000; 
  123.     else nextSrcOffset=srcOffset+0x10000;
  124.     
  125.     if(targetAddress<0x4000)nextTargetAddr=0x4000;
  126.     else if(targetAddress<0x6000)nextTargetAddr=0x6000;
  127.     else if(targetAddress<0x8000)nextTargetAddr=0x8000;
  128.     else if(targetAddress<0x10000)nextTargetAddr=0x10000; 
  129.     else nextTargetAddr=targetAddress+0x10000;
  130.  
  131. }
  132. int AM29F800_CheckId(void)
  133. {
  134.     U16 manId,devId;
  135.     _RESET();
  136.     
  137.     _WR(0x555,0xaaaa);
  138.     _WR(0x2aa,0x5555);
  139.     _WR(0x555,0x9090);
  140.     manId=_RD(0x0);
  141.     _RESET(); // New 5V AM29F800 needs this command. 
  142.     _WR(0x555,0xaaaa);
  143.     _WR(0x2aa,0x5555);
  144.     _WR(0x555,0x9090);
  145.     devId=_RD(0x1);
  146.     _RESET();   
  147.     Uart_Printf("Manufacture ID(0x0001)=%4x, Device ID(0x22xx)=%4xn",manId,devId);
  148.     if(manId==0x0001 && devId==0x22bf) return 1; // AM29LV200B
  149.     else if(manId==0x0001 && devId==0x22ba) return 2; // AM29LV400B
  150.     else if(manId==0x0001 && devId==0x225b) return 3; // AM29LV800B
  151.     else if(manId==0x0001 && devId==0x2249) return 4; // AM29LV160B        
  152.     else if(manId==0x0004 && devId==0x2249) return 4; // 29LV160B fairchild        
  153.     else return 0;
  154. }
  155. void AM29F800_EraseSector(int targetAddr)
  156. {
  157.         Uart_Printf("Sector Erase is started!n");
  158.         _RESET();
  159.         _WR(0x555,0xaaaa);
  160.         _WR(0x2aa,0x5555);
  161.         _WR(0x555,0x8080);
  162.         _WR(0x555,0xaaaa);
  163.         _WR(0x2aa,0x5555);
  164.         _WR(BADDR2WADDR(targetAddr),0x3030);
  165.         _WAIT();
  166.         _RESET();
  167. }
  168. int BlankCheck(int targetAddr,int targetSize)
  169. {
  170.     int i,j;
  171.     for(i=0;i<targetSize;i+=2)
  172.     {
  173. j=*((U16 *)(i+targetAddr));
  174. if( j!=0xffff)
  175. {
  176.     Uart_Printf("E:%x=%xn",(i+targetAddr),j);
  177.     return 0;
  178. }
  179.     }
  180.     return 1;
  181. }
  182. int _WAIT(void) //Check if the bit6 toggle ends.
  183. {
  184.         volatile U16 flashStatus,old;
  185. old=*((volatile U16 *)0x0);
  186.         while(1)
  187. {
  188.     flashStatus=*((volatile U16 *)0x0);
  189.             if( (old&0x40) == (flashStatus&0x40) )break;
  190.             if( flashStatus&0x20 )
  191.     {
  192. //Uart_Printf("[DQ5=1:%x]n",flashStatus);
  193. old=*((volatile U16 *)0x0);
  194. flashStatus=*((volatile U16 *)0x0);
  195. if( (old&0x40) == (flashStatus&0x40) )
  196.     return 0;
  197. else return 1;
  198.     }
  199.     //Uart_Printf(".");
  200.     old=flashStatus;
  201.         }
  202.         //Uart_Printf("!n");
  203. return 1;
  204. }
  205. int AM29F800_ProgFlash(U32 realAddr,U16 data)
  206. {
  207. volatile U16 *tempPt;
  208.         tempPt=(volatile U16 *)realAddr;
  209.         _WR(0x555,0xaaaa);
  210.         _WR(0x2aa,0x5555);
  211.         _WR(0x555,0xa0a0);
  212.         *tempPt=data;
  213.         
  214. return _WAIT();
  215. }