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

uCOS

开发平台:

C/C++

  1. //====================================================================
  2. // File Name : strata32.c
  3. // Function  : S3C2440 Intel Strata NOR Flash
  4. // Program   : Lee, Sang Jo (LSJ)
  5. // Date      : June 14, 2002
  6. // Version   : 0.0
  7. // History
  8. //   0.0 : Programming start (June 14, 2002) -> LSJ
  9. //         Arrangement source code(8/01/2002)-> SOP   
  10. //====================================================================
  11. #include <stdlib.h>
  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 "strata32.h"
  19. static void InputAddresses(void);
  20. static int  Strata_ProgFlash(U32 realAddr,U32 data);
  21. static void Strata_EraseSector(int targetAddr);
  22. static int  Strata_CheckID(int targetAddr);
  23. static int  Strata_CheckDevice(int targetAddr);
  24. static int  Strata_CheckBlockLock(int targetAddr);
  25. static int  Strata_BlankCheck(int targetAddr,int targetSize);
  26. static int  _WAIT(void);
  27. extern U32 downloadAddress;
  28. extern U32 downloadProgramSize;
  29. static U32 srcAddress;
  30. static U32 targetOffset; 
  31. static U32 targetAddress; 
  32. static U32 targetSize; 
  33. // Because S3C2440 is connected to Intel StrataFlash 28F128J3A,
  34. // the addr parameter has to be a WORD address, so called in Intel specification.
  35.     // by chc
  36. #define _WR(addr,data)  *((volatile U32 *)(addr))=(U32)data 
  37. #define _RD(addr)       ( *((volatile U32 *)(addr)) )       
  38.     // _RESET() : Read Array
  39. #define _RESET()    _WR(targetAddress,0x00ff00ff)
  40. extern U32 downloadAddress;
  41. extern U32 downloadProgramSize;
  42. static int error_erase=0;       // Read Status Register, SR.5
  43. static int error_program=0;     // Read Status Register, SR.4
  44. //==========================================================================================
  45. int Strata_CheckID(int targetAddr) 
  46. {
  47.     _RESET();
  48.     _WR(targetAddr, 0x00900090); 
  49.     return _RD(targetAddr); // Read Identifier Code, including lower, higher 16-bit, 8MB, Intel Strate Flash ROM
  50.                             // targetAddress must be the beginning location of a Block Address
  51. }
  52. //==========================================================================================
  53. int Strata_CheckDevice(int targetAddr) 
  54. {
  55.     _RESET();
  56.     _WR(targetAddr, 0x00900090);
  57.     return _RD(targetAddr+0x4); // Read Device Code, including lower, higher 16-bit, 8MB, Intel Strate Flash ROM
  58.                                 // targetAddress must be the beginning location of a Block Address
  59. }
  60. //==========================================================================================
  61. int Strata_CheckBlockLock(int targetAddr) 
  62. {
  63.     _RESET();
  64.     _WR(targetAddr, 0x00900090);
  65.     return _RD(targetAddr+0x8); // Read Block Lock configuration, 
  66.                                 // targetAddress must be the beginning location of a Block Address
  67. }
  68. void Strata_Unlock(int targetAddr) 
  69. {
  70.     _RESET();
  71.     _WR(targetAddr, 0x00600060);
  72.     _WR(targetAddr, 0x00D000D0);
  73. }
  74. void Strata_SetBlockLock(int targetAddr)
  75. {
  76. _RESET();
  77. _WR(targetAddr, 0x00600060);
  78. _WR(targetAddr, 0x00010001);
  79. }
  80. //==========================================================================================
  81. void Strata_EraseSector(int targetAddress) 
  82. {
  83.     unsigned long ReadStatus;
  84.     unsigned long bSR5;     // Erase and Clear Lock-bits Status, lower 16bit, 8MB Intel Strate Flash ROM
  85.     unsigned long bSR5_2;   // Erase and Clear Lock-bits Status, higher 16bit, 8MB Intel Strate Flash ROM
  86.     unsigned long bSR7;     // Write State Machine Status, lower 16bit, 8MB Intel Strate Flash ROM
  87.     unsigned long bSR7_2;   // Write State Machine Status, higher 16bit, 8MB Intel Strate Flash ROM
  88.     //_RESET();
  89. //  _WR(targetAddress, 0x00200020);
  90. //  _WR(targetAddress, 0x00d000d0);
  91.     _WR(targetAddress, 0x00200020); // Block Erase, First Bus Cycle, targetAddress is the address withint the block
  92.     _WR(targetAddress, 0x00d000d0); // Block Erase, Second Bus Cycle, targetAddress is the address withint the block
  93.     
  94.     //_RESET();
  95.     _WR(targetAddress, 0x00700070); // Read Status Register, First Bus Cycle, targetAddress is any valid address within the device
  96.     ReadStatus=_RD(targetAddress);  // Read Status Register, Second Bus Cycle, targetAddress is any valid address within the device
  97.     bSR7=ReadStatus & (1<<7);       // lower 16-bit 8MB Strata
  98.     bSR7_2=ReadStatus & (1<<(7+16));// higher 16-bit 8MB Strata
  99.     while(!bSR7 | !bSR7_2) 
  100.     {
  101.         _WR(targetAddress, 0x00700070);
  102.         ReadStatus=_RD(targetAddress);
  103.         bSR7=ReadStatus & (1<<7);
  104.         bSR7_2=ReadStatus & (1<<(7+16));
  105. //      Uart_Printf("wait !!n");
  106.     }
  107.     _WR(targetAddress, 0x00700070); // When the block erase is complete, status register bit SR.5 should be checked. 
  108.                     // If a block erase error is detected, the status register should be cleared before
  109.                     // system software attempts correct actions.
  110.     ReadStatus=_RD(targetAddress);  
  111.     bSR5=ReadStatus & (1<<5);           // lower 16-bit 8MB Strata 
  112.     bSR5_2=ReadStatus & (1<<(5+16));    // higher 16-bit 8MB Strata 
  113.     if (bSR5==0 && bSR5_2==0) 
  114.     {
  115.         Uart_Printf("Block_%x Erase O.K. n",targetAddress);
  116.     } 
  117.     else 
  118.     {
  119.         //Uart_Printf("Error in Block Erasure!!n");
  120.         _WR(targetAddress, 0x00500050); // Clear Status Register
  121.         error_erase=1;                  // But not major, is it casual ?
  122.     }
  123.     _RESET();   // write 0xffh(_RESET()) after the last opoeration to reset the device to read array mode.
  124. }
  125. //==========================================================================================
  126. int Strata_BlankCheck(int targetAddr,int targetSize) 
  127. {
  128.     int i,j;
  129.     for (i=0; i<targetSize; i+=4) 
  130.     {
  131.         j=*((volatile U32 *)(i+targetAddr));
  132.         if (j!=0xffffffff)      // In erasure it changes all block dta to 0xff
  133.         {
  134.             Uart_Printf("E : %x = %xn", (i+targetAddr), j);
  135.             return 0;
  136.         }
  137.     }
  138.     return 1;
  139. }
  140. //==========================================================================================
  141. int Strata_ProgFlash(U32 realAddr,U32 data) 
  142. {
  143.     volatile U32 *ptargetAddr;
  144.     unsigned long ReadStatus;
  145.     unsigned long bSR4;    // Erase and Clear Lock-bits Status, lower 16bit, 8MB Intel Strate Flash ROM
  146.     unsigned long bSR4_2;  // Erase and Clear Lock-bits Status, higher 16bit, 8MB Intel Strate Flash ROM
  147.     unsigned long bSR7;    // Write State Machine Status, lower 16bit, 8MB Intel Strate Flash ROM
  148.     unsigned long bSR7_2;  // Write State Machine Status, higher 16bit, 8MB Intel Strate Flash ROM
  149.     ptargetAddr = (volatile U32 *)realAddr;
  150.     //_RESET();
  151.     _WR(realAddr, 0x00400040);  // realAddr is any valid adress within the device
  152.                                 // Word/Byte Program(or 0x00100010 can be used)
  153.     *ptargetAddr=data;          // 32 bit data
  154.     //_RESET();
  155.     _WR(realAddr, 0x00700070);  // Read Status Register
  156.     ReadStatus=_RD(realAddr);   // realAddr is any valid address within the device
  157.     bSR7=ReadStatus & (1<<7);
  158.     bSR7_2=ReadStatus & (1<<(7+16));
  159.     while(!bSR7 || !bSR7_2) 
  160.     {
  161.         // _RESET();
  162.         _WR(realAddr, 0x00700070);        // Read Status Register
  163.         ReadStatus=_RD(realAddr);
  164.         bSR7=ReadStatus & (1<<7);
  165.         bSR7_2=ReadStatus & (1<<(7+16));
  166.     }
  167.     
  168.     _WR(realAddr, 0x00700070); 
  169.     ReadStatus=_RD(realAddr);             // Real Status Register
  170.     bSR4=ReadStatus & (1<<4);
  171.     bSR4_2=ReadStatus & (1<<(4+16));
  172.     
  173.     if (bSR4==0 && bSR4_2==0) 
  174.     {
  175.         //Uart_Printf("Successful Program!!n");
  176.         ;
  177.     } 
  178.     else 
  179.     {
  180.         //Uart_Printf("Error Program!!n");
  181.         _WR(realAddr, 0x00500050);          // Clear Status Register
  182.         error_program=1;                    // But not major, is it casual ?
  183.     }
  184.     _RESET();
  185.     return 0;
  186. }
  187. #define TARGET_ADDR_28F128      0x08000000  // nGCS4, 128MB area
  188. #define SOURCE_ADDR_FOR_28F128  0x31000000  // After 16MB of SDRAM
  189.                                             // 0x30000000 - 0x30ffffff : Area for this test program
  190. //==========================================================================================                                            
  191. void Program28F128J3A(void)
  192. {
  193. // FlashROM write program must reside at RAM region NOT ROM region
  194. // In reading and writing all interrupts are disabled because the flash ROM
  195. // strongly dislike to be disturbed by other stuff.
  196. // And the region of flash ROM must be I/O region which means NO cacheable
  197. // and NO bufferable in MMU. Check it out !!!
  198. // 2001.6.18. Mon. It's local rain. I'll hope it eliminates the drought in Korea. by chc
  199.     unsigned long interrupt_reservoir;
  200.     int i;
  201.     Uart_Printf("n[ 28F128J3A Flash Writing Program ]nn");
  202.     Uart_Printf("     *** Very Important Notes ***n");
  203.     Uart_Printf("1. 28F128J3A must be located at 0x08000000.n"
  204.             " J1:1-2, J2:2-3, J3:2-3, J4:1-2 n");
  205.     Uart_Printf("2. After programming, 28F128J3A may be located at 0x0.n"
  206.  " J1:2-3, J2:1-2, J3:1-2, J4:2-3 n");
  207.     rINTMSK = BIT_ALLMSK;   
  208.     targetAddress=TARGET_ADDR_28F128;
  209.     targetSize=downloadProgramSize;
  210.     //downloadAddress=0x31000000;
  211.     if(targetSize==0)
  212.     {
  213.         Uart_Printf("nThe data must be downloaded using ICE or USB from 0x31000000n");
  214.         srcAddress=downloadAddress; 
  215.     }
  216.     else
  217.     { 
  218.         srcAddress=downloadAddress+4; //to discard the data head for the size
  219.     }
  220.     InputAddresses(); //srcAddress,targetSize,targetOffset will be determined.      
  221.     Uart_Printf("Source base address(0x31000000) = 0x%xn",srcAddress);
  222.     Uart_Printf("Target base address(0x08000000) = 0x%xn",targetAddress);
  223.     Uart_Printf("Target offset      (0x0)        = 0x%xn",targetOffset);
  224.     Uart_Printf("Target size        (0x20000*n)  = 0x%xn",targetSize);
  225.     if ( (Strata_CheckID(targetAddress) & 0xffff) != 0x0089 )       // ID number = 0x0089
  226.     {
  227. Uart_Printf("Read ID : 0x%xn", Strata_CheckID(targetAddress));
  228.         Uart_Printf("Identification check error !!n");
  229.         return ;
  230.     }
  231.     if ( (Strata_CheckDevice(targetAddress) & 0xffff) != 0x0018 )   // Device number=0x0018
  232.     {
  233.         Uart_Printf("Device check error !!n");
  234.         return ;
  235.     }
  236.     Uart_Printf("nErase the sector : 0x%x.n", targetAddress);
  237.     for(i=0;i<targetSize;i+=0x20000)
  238.     {
  239.         Strata_EraseSector(targetAddress+targetOffset+i);
  240.     }
  241.     
  242.     if(!Strata_BlankCheck(targetAddress+targetOffset,targetSize))
  243.     {
  244.         Uart_Printf("Blank Check Error!!!n");
  245.         return;
  246.     }
  247.     Uart_Printf("nStart of the data writing...n");
  248.     for (i=0; i<targetSize; i+=4) 
  249.     {
  250.         Strata_ProgFlash(i+targetAddress+targetOffset, *((U32 *)(srcAddress+i)));
  251.         if(i%0x10000==0xfffc)
  252.             Uart_Printf("[%x]",(i+4)/0x10000);
  253.     }
  254.     Uart_Printf("nEnd of the data writing n");
  255.     _RESET();
  256.     Uart_Printf("Verifying Start...n");
  257.     for (i=0; i<targetSize; i+=4) 
  258.     {
  259.         if (*((U32 *)(i+targetAddress+targetOffset)) !=*((U32 *)(srcAddress+i))) 
  260.         {
  261.             Uart_Printf("verify error  src %08x = %08xn", srcAddress+i, *((U32 *)(srcAddress+i)));
  262.             Uart_Printf("verify error  des %08x = %08xn", i+targetAddress+targetOffset, *((U32 *)(i+targetAddress)));
  263.             return;
  264.         }
  265.     }
  266.     Uart_Printf("Verifying End!!!");
  267. }
  268. void Erase28F128J3A(void)  // added by junon 10/29
  269. {
  270. // FlashROM write program must reside at RAM region NOT ROM region
  271. // In reading and writing all interrupts are disabled because the flash ROM
  272. // strongly dislike to be disturbed by other stuff.
  273. // And the region of flash ROM must be I/O region which means NO cacheable
  274. // and NO bufferable in MMU. Check it out !!!
  275. // 2001.6.18. Mon. It's local rain. I'll hope it eliminates the drought in Korea. by chc
  276.     unsigned long interrupt_reservoir;
  277.     int i;
  278.     Uart_Printf("n[ 28F128J3A Flash Writing Program ]nn");
  279.     Uart_Printf("     *** Very Important Notes ***n");
  280.     Uart_Printf("1. 28F128J3A must be located at 0x08000000.n"
  281.             " J1:1-2, J2:2-3, J3:2-3, J4:1-2 n");
  282.     Uart_Printf("2. After programming, 28F128J3A may be located at 0x0.n"
  283.  " J1:2-3, J2:1-2, J3:1-2, J4:2-3 n");
  284.     rINTMSK = BIT_ALLMSK;   
  285.     targetAddress=TARGET_ADDR_28F128;
  286.     targetSize=downloadProgramSize;
  287.     //downloadAddress=0x31000000;
  288.     if(targetSize==0)
  289.     {
  290.         Uart_Printf("nThe data must be downloaded using ICE or USB from 0x31000000n");
  291.         srcAddress=downloadAddress; 
  292.     }
  293.     else
  294.     { 
  295.         srcAddress=downloadAddress+4; //to discard the data head for the size
  296.     }
  297.     InputAddresses(); //srcAddress,targetSize,targetOffset will be determined.      
  298.     Uart_Printf("Source base address(0x31000000) = 0x%xn",srcAddress);
  299.     Uart_Printf("Target base address(0x08000000) = 0x%xn",targetAddress);
  300.     Uart_Printf("Target offset      (0x0)        = 0x%xn",targetOffset);
  301.     Uart_Printf("Target size        (0x20000*n)  = 0x%xn",targetSize);
  302.     if ( Strata_CheckID(targetAddress)  != 0x00890089 )       // ID number = 0x0089
  303.     {
  304. Uart_Printf("Read ID : 0x%xn", Strata_CheckID(targetAddress));
  305.         Uart_Printf("Identification check error !!n");
  306.         return ;
  307.     }
  308.     if ( Strata_CheckDevice(targetAddress) != 0x00180018 )   // Device number=0x0018
  309.     {
  310.         Uart_Printf("Device check error !!n");
  311.         return ;
  312.     }
  313. #if 1 // lock bit setting test 
  314. // Strata_SetBlockLock(targetAddress+0x10000); //just test
  315.     for(i=0;i<10;i++)
  316. Uart_Printf("%d block value is %dn", i, Strata_CheckBlockLock(targetAddress+0x20000*i)&0x00010001);
  317. //     if ( Strata_CheckBlockLock(targetAddress+0x20000*i) != 0x0 )   // Device number=0x0018
  318. //         Uart_Printf("%d block is locked !!n", i);
  319. Strata_Unlock(targetAddress);
  320. for(i=0;i<10;i++)
  321. Uart_Printf("%d block value is %dn", i, Strata_CheckBlockLock(targetAddress+0x20000*i)&0x00010001);
  322. #endif
  323. // Strata_Unlock(targetAddress);
  324.     Uart_Printf("nErase the sector : 0x%x.n", targetAddress);
  325.     for(i=0;i<targetSize;i+=0x20000)
  326.     {
  327.         Strata_EraseSector(targetAddress+targetOffset+i);
  328.     }
  329.     
  330.     if(!Strata_BlankCheck(targetAddress+targetOffset,targetSize))
  331.     {
  332.         Uart_Printf("Blank Check Error!!!n");
  333.         return;
  334.     }
  335. }
  336. //==========================================================================================
  337. static void InputAddresses(void)
  338. {
  339.     Uart_Printf("n[ 28F128J3A Writing Program ]n");
  340.     Uart_Printf("nSource size [0x?] : 0h~%xhn",downloadProgramSize);
  341.     Uart_Printf("nAvailable Target Offset Address [0x?] : n"); 
  342.     Uart_Printf("0h,20000h,40000h, ..., 1ce0000hn");
  343.     Uart_Printf("Input target address offset [0x?] : ");
  344.     targetOffset=Uart_GetIntNum();
  345.     if(targetSize==0)
  346.     {
  347.         Uart_Printf("Input target size [0x?] : ");
  348.         targetSize=Uart_GetIntNum();
  349.     }
  350. }