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

uCOS

开发平台:

C/C++

  1. //====================================================================
  2. // File Name : K9k2g16.c
  3. // Function  : S3C2440 16-bit interface Nand Test program(this program used by nand.c).
  4. // Date      : May xx, 2003
  5. // Version   : 0.0
  6. // History
  7. //   R0.0 (200305xx): Modified for 2440 from 2410. -> DonGo
  8. //====================================================================
  9. /**************** K9s1206 NAND flash ********************/
  10. // 1block=(NF8_PAGE_BYTE+16)bytes x 32pages
  11. // 4096block
  12. // Block: A[23:14], Page: [13:9]
  13. /**************** K9K2G16 NAND flash *******************/
  14. // 1block=(2048+64)bytes x 64pages
  15. // 2048block
  16. // Block: A[23:14], page: [13:9]
  17. /*****************************************************/
  18. #include <string.h>
  19. #include <stdlib.h>
  20. #include "def.h"
  21. #include "option.h"
  22. #include "2440addr.h"
  23. #include "2440lib.h"
  24. #include "2440slib.h" 
  25. #include "K9K2G16.h"
  26. #include "nand.h"
  27. #define BAD_CHECK (0)
  28. #define ECC_CHECK (0)
  29. #define C_LANG 1
  30. #define DMA 2
  31. #define TRANS_MODE16  2
  32. extern void Nand_Reset(void);
  33. extern U32 srcAddress;
  34. extern U32 targetBlock;     // Block number (0 ~ 4095)
  35. extern U32 targetSize;     // Total byte size 
  36. extern U32 downloadAddress;
  37. extern U32 downloadProgramSize;
  38. U32 NF16_Spare_Data[32/2];
  39. volatile int NFConDone16;
  40. void __irq NFCon_Int16(void);
  41. void * n16_func[][2]=
  42. {
  43. (void *)Test_NF16_Block_Erase, "Block erase         ",
  44. (void *)Test_NF16_Page_Read, "Page read           ",
  45. (void *)Test_NF16_Page_Write, "Page write          ",
  46. (void *)Test_NF16_Rw, "Nand R/W test       ",
  47. (void *)NF16_Program, "K9K2G16_Program     ",
  48. (void *)NF16_Print_Id, "Read ID             ",
  49. (void *)K9K2G16_PrintBadBlockNum, "Check bad block     ",
  50. (void *)Test_NF16_Lock,         "Nand Block lock test",
  51. (void *)Test_NF16_SoftUnLock,         "Soft Unlock test      ",
  52. 0,0
  53. };
  54. void Test_K9K2G16(void)
  55. {
  56. int i;
  57. U32 blocknum, pagenum;
  58. Uart_Printf("nK9K2G16 Nand flash test start.n");
  59. NF16_Init();
  60. while(1) {
  61. Print16SubMessage();
  62. Uart_Printf("nSelect(-1 to exit): ");
  63. i = Uart_GetIntNum();
  64. if(i==-1) break;
  65. if(i>=0 && (i<(sizeof(n16_func)/8)) ) 
  66.      ( (void (*)(void)) (n16_func[i][0]) )(); // execute selected function.
  67. }
  68. }
  69. void Print16SubMessage(void)
  70. {
  71. int i;
  72. i=0;
  73. Uart_Printf("nn");
  74. while(1)
  75. {   //display menu
  76. Uart_Printf("%2d:%s",i,n16_func[i][1]);
  77.     i++;
  78.     if((int)(n16_func[i][0])==0)
  79.     {
  80. Uart_Printf("n");
  81. break;
  82.     }
  83.     if((i%4)==0) Uart_Printf("n");
  84. }
  85. }
  86. void NF16_Print_Id(void)
  87. {
  88. U32 id;
  89. U8 maker, device, id4th;
  90. // NF16_Init();
  91. id = NF16_CheckId();
  92. device = (U8)id;
  93. maker = (U8)(id>>8);
  94. Uart_Printf("Maker:%x, Device:%xn", maker, device);
  95. }
  96. void Test_NF16_Block_Erase(void)
  97. {
  98. U32 block=0;
  99. Uart_Printf("SOP(K9K2G160UM) NAND Block erasen");
  100. Uart_Printf("Block # to erase: ");
  101. block = Uart_GetIntNum();
  102. if(NF16_EraseBlock(block)==FAIL) return;
  103. Uart_Printf("%d-block erased.n", block);
  104. }
  105. void Test_NF16_Lock(void)
  106. {
  107.        U32 num;
  108.        U32 S_block, E_block;
  109. Uart_Printf("SOP(K9K2G16U0M) NAND Lock Test !!!n");
  110. Uart_Printf("Select Lock type, Softlock(1)/Lock-tight(2) : ");
  111. num=Uart_GetIntNum();;
  112. Uart_Printf("nEnter programmable start block address ");
  113. S_block = Uart_GetIntNum();
  114. Uart_Printf("Enter programmable end block address ");
  115.        E_block = Uart_GetIntNum();
  116. rNFSBLK=(S_block<<6);
  117. rNFEBLK=(E_block<<6);
  118. if(num==1){
  119. rNFCONT|=(1<<12);
  120.               Uart_Printf("Software Lockedn ");
  121. }
  122. if(num==2){
  123. rNFCONT|=(1<<13);
  124.               Uart_Printf("Lock-tight: To clear Lock-tight, reset S3C2440!!!n ");
  125. }
  126.       Uart_Printf("%d block ~ %d block are Programmablen ", S_block, (E_block-1));
  127. }
  128. void Test_NF16_SoftUnLock(void)
  129. {
  130.        U32 S_block, E_block;
  131. Uart_Printf("SOP(K9K2G16U0M) NAND SoftUnLock Test !!!n");
  132. rNFSBLK=0x0;
  133. rNFEBLK=0x0;
  134. rNFCONT&=~(1<<12);
  135. if(rNFCONT&(1<<13)){
  136.    rNFCONT&=~(1<<13);
  137.    Uart_Printf("Lock-tightn ");
  138.    Uart_Printf("You can't unlock Protected blocks !!!n ");
  139.    Uart_Printf("%d block ~ %d block are Programmablen ", (rNFSBLK>>6), ((rNFEBLK>>6)-1));
  140. }
  141.        else Uart_Printf("All blocks are Programmablen ");
  142. }
  143. void Test_NF16_Page_Read(void)
  144. {
  145. U32 block=0, page=0;
  146. U32 i;
  147.        unsigned int * srcPt;
  148. srcPt=(unsigned int *)0x31000000;
  149. Uart_Printf("SOP(K9K2G16U0M) NAND Page Read.n");
  150. Uart_Printf("Block # to read: ");
  151. block = Uart_GetIntNum();
  152. Uart_Printf("Page # to read: ");
  153. page = Uart_GetIntNum();
  154. if(NF16_ReadPage(block, page, srcPt)==FAIL) {
  155. Uart_Printf("Read error.n");
  156. } else {
  157. Uart_Printf("Read OK.n");
  158. };
  159. // Print data.
  160. Uart_Printf("Read data(%d-block,%d-page)n", block, page);
  161. for(i=0; i<512; i++) {
  162. if((i%4)==0) Uart_Printf("n%2x: ", i);
  163. Uart_Printf("%08x ", *srcPt++);
  164. }
  165. Uart_Printf("n");
  166. Uart_Printf("Spare:");
  167. for(i=0; i<16; i++) {
  168.   Uart_Printf("%08x ", NF16_Spare_Data[i]);
  169. }
  170. Uart_Printf("n");
  171. }
  172. void Test_NF16_Page_Write(void)
  173. {
  174. U32 block=0, page=0;
  175. int i, offset;
  176. unsigned int *srcPt;
  177. srcPt=(unsigned int *)0x31100000;
  178. Uart_Printf("SOP(K9K2G16U0M) NAND Page Write.n");
  179. Uart_Printf("Block # to write: ");
  180. block = Uart_GetIntNum();
  181. Uart_Printf("Page # to write: ");
  182. page = Uart_GetIntNum();
  183. Uart_Printf("offset data(-1:random): ");
  184. offset = Uart_GetIntNum();
  185. #if ADS10==TRUE
  186. srand(0);
  187. #endif
  188. // Init wdata.
  189. for(i=0; i<512; i++) {
  190. #if ADS10==TRUE
  191. if(offset==-1) *srcPt++ = rand()%0xffffffff;
  192. #else
  193. if(offset==-1) *srcPt++ = i;
  194. #endif
  195. else *srcPt++ =i+offset;
  196. }
  197.      
  198.        srcPt=(unsigned int *)0x31100000;
  199. Uart_Printf("Write data[%d block, %d page].n", block, page);
  200. if(NF16_WritePage(block, page, srcPt)==FAIL) {
  201. Uart_Printf("Write Error.n");
  202. } else {
  203. Uart_Printf("Write OK.n");
  204. Uart_Printf("Write data is");
  205. for(i=0; i<512; i++) {
  206. if((i%4)==0) Uart_Printf("n%2x: ", i);
  207. Uart_Printf("%08x ", *srcPt++);
  208. }
  209. Uart_Printf("n");
  210. Uart_Printf("Spare:");
  211. for(i=0; i<32/2; i++) {
  212.   Uart_Printf("%08x ", NF16_Spare_Data[i]);
  213. }
  214. Uart_Printf("nn");
  215. }
  216. }
  217. void Test_NF16_Rw(void)
  218. {
  219. U32 block=0, page=0;
  220. U32 i, status=FAIL, error, offset;
  221. unsigned int *srcPt, *dstPt;
  222. srcPt=(unsigned int *)0x31100000;
  223. dstPt=(unsigned int *)0x31200000;
  224. Uart_Printf("SOP(K9K2G16U0M) NAND Flash R/W test.n");
  225. Uart_Printf("Block number: ");
  226. block = Uart_GetIntNum();
  227. Uart_Printf("Page nember: ");
  228. page = Uart_GetIntNum();
  229. Uart_Printf("offset data(-1:random): ");
  230. offset = Uart_GetIntNum();
  231. #if ADS10==TRUE 
  232. srand(0); 
  233. #endif
  234. // Init R/W data.
  235. for(i=0; i<512; i++) *dstPt++=0x0;
  236. for(i=0; i<512; i++) {
  237. #if ADS10==TRUE
  238. if(offset==-1) *srcPt++= rand()%0xffffffff;
  239. #else
  240. if(offset==-1) *srcPt++= i;
  241. #endif
  242. else *srcPt++ = i+offset;
  243. }
  244.        srcPt=(unsigned int *)0x31100000;
  245. dstPt=(unsigned int *)0x31200000;
  246. // Block erase
  247. Uart_Printf("%d block erase.n", block);
  248. if(NF16_EraseBlock(block)==FAIL) return;
  249. Uart_Printf("Write data[%d block, %d page].n", block, page);
  250. if(NF16_WritePage(block, page, srcPt)==FAIL) return;
  251. Uart_Printf("Read data.n");
  252. if(NF16_ReadPage(block, page, dstPt)==FAIL) return;
  253. Uart_Printf("Checking data.n");
  254. for(error=0, i=0; i<512; i++) {
  255. if(*srcPt++!=*dstPt++) {
  256. Uart_Printf("Error:%d[W:%x,R:%x]n", i, *srcPt, *dstPt);
  257. error++;
  258. }
  259. }
  260. if(error!=0) 
  261. Uart_Printf("Fail to R/W test(%d).n", error);
  262. else
  263. Uart_Printf("R/W test OK.n");
  264. }
  265. void NF16_Program(void)
  266. {
  267.     int i, page_num;
  268.     int programError=0;
  269.     U32 *srcPt,*saveSrcPt;
  270.     U32 blockIndex;
  271.     Uart_Printf("n[SOP(K9K2G16U0M) NAND Flash writing program]n");
  272.     Uart_Printf("The program buffer: 0x30100000~0x31ffffffn");
  273. //     NF16_Init();
  274.      rINTMSK = BIT_ALLMSK; 
  275.      srcAddress=0x30100000; 
  276.      InputTargetBlock16();
  277.      srcPt=(U32 *)srcAddress;
  278.      blockIndex=targetBlock;
  279.      while(1) {
  280.              saveSrcPt=srcPt;
  281.               
  282.       #if BAD_CHECK
  283.         if(NF16_IsBadBlock(blockIndex)==FAIL) {
  284.     blockIndex++;   // for next block
  285.     continue;
  286.   }
  287.       #endif
  288.       if(NF16_EraseBlock(blockIndex)==FAIL) {
  289.     blockIndex++;   // for next block
  290.     continue;
  291.       }
  292.     // After 1-Block erase, Write 1-Block(64 pages).
  293. for(i=0;i<64;i++) {
  294.     if(NF16_WritePage(blockIndex,i,srcPt)==FAIL) {// block num, page num, buffer
  295.         programError=1;
  296.         break;
  297.     }
  298. #if ECC_CHECK
  299.     if(NF16_ReadPage(blockIndex,i,srcPt)==FAIL) {
  300. Uart_Printf("ECC Error(block=%d,page=%d!!!n",blockIndex,i);
  301.     }
  302. #endif
  303. srcPt+=512; // Increase buffer addr one pase size
  304.      if(i==0)  Uart_Printf(".");
  305. if((U32)srcPt>=(srcAddress+targetSize)) // Check end of buffer
  306. break; // Exit for loop
  307.     }
  308. if(programError==1) {
  309.     blockIndex++;
  310.     srcPt=saveSrcPt;
  311.     programError=0;
  312.     continue;
  313. }
  314. if((U32)srcPt>=(srcAddress+targetSize)) break; // Exit while loop
  315. blockIndex++;
  316.     }
  317. }
  318. void K9K2G16_PrintBadBlockNum(void)
  319. {
  320.     int i;
  321.     U32 id;
  322.     Uart_Printf("n[SMC(K9S1208V0M) NAND Flash bad block check]n");
  323.     
  324. //    NF16_Init();
  325.     for(i=0;i<2048;i++)
  326.     {
  327. NF16_IsBadBlock(i);   // Print bad block
  328.     }
  329. }
  330. //*************************************************
  331. //*************************************************
  332. //**           H/W dependent functions           **
  333. //************************************************* 
  334. //*************************************************
  335. //The code is made for bi-endian mode
  336. // block0: reserved for boot strap
  337. // block1~4095: used for OS image
  338. // badblock SE: xx xx xx xx xx 00 ....
  339. // good block SE: ECC0 ECC1 ECC2 FF FF FF ....
  340. #define NF_MECC_UnLock()         {rNFCONT&=~(1<<5);}
  341. #define NF_MECC_Lock()         {rNFCONT|=(1<<5);}
  342. #define NF_SECC_UnLock()         {rNFCONT&=~(1<<6);}
  343. #define NF_SECC_Lock()         {rNFCONT|=(1<<6);}
  344. #define NF_CMD(cmd) {rNFCMD=cmd;}
  345. #define NF_ADDR(addr) {rNFADDR=addr;}
  346. #define NF_nFCE_L() {rNFCONT&=~(1<<1);}
  347. #define NF_nFCE_H() {rNFCONT|=(1<<1);}
  348. #define NF_RSTECC() {rNFCONT|=(1<<4);}
  349. #define NF_RDDATA()  (rNFDATA)
  350. #define NF_RDDATA16()  ((*(volatile unsigned short*)0x4E000010) )
  351. #define NF_WRDATA(data)  {rNFDATA=data;}
  352. // RnB Signal
  353. #define NF_CLEAR_RB()     {rNFSTAT |= (1<<2);} // Have write '1' to clear this bit.
  354. #define NF_DETECT_RB()     {while(!(rNFSTAT&(1<<2)));} // edge detect.
  355. #define ID_K9S1208V0M 0xec76
  356. #define ID_K9K2G16U0M 0xecca
  357. #define BAD_MARK (0x44444444)
  358. #if 1
  359. // HCLK=100Mhz
  360. #define TACLS 0 // 1-clk(0ns) 
  361. #define TWRPH0 6 // 3-clk(25ns)
  362. #define TWRPH1 0 // 1-clk(10ns)  //TACLS+TWRPH0+TWRPH1>=50ns
  363. #else
  364. // HCLK=50Mhz
  365. #define TACLS 0  //1clk(0ns)
  366. #define TWRPH0 1  //2clk(25ns)
  367. #define TWRPH1 0  //1clk(10ns)
  368. #endif
  369. static U32 se16Buf[32/2]={
  370. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  371. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  372. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  373. 0xffffffff,0xffffffff,0xffffffff,0xffffffff
  374. };
  375. void InputTargetBlock16(void)
  376. {
  377. U32 no_block, no_page, no_byte;
  378. Uart_Printf("nSource size:0h~%xhn",downloadProgramSize);
  379. Uart_Printf("nAvailable target block number: 0~2048n");
  380. Uart_Printf("Input target block number:");
  381.     targetBlock=Uart_GetIntNum(); // Block number(0~4095)
  382.     if(targetSize==0)
  383.     {
  384.      #if 0
  385.      Uart_Printf("Input target size(0x4000*n):");
  386.      targetSize=Uart_GetIntNum(); // Total byte size
  387. #else
  388.     Uart_Printf("Input program file size(bytes): ");
  389.      targetSize=Uart_GetIntNum(); // Total byte size
  390.      #endif
  391.     }
  392. no_block = (U32)((targetSize/2048)/64);
  393. no_page = (U32)((targetSize/2048)%64);
  394. no_byte = (U32)(targetSize%2048);
  395. Uart_Printf("File:%d[%d-block,%d-page,%d-bytes].n", targetSize, no_block, no_page, no_byte);
  396. }
  397. static int NF16_EraseBlock(U32 block)
  398. {
  399.     U32 blockPage=(block<<6);
  400.     int i;
  401.     NFConDone16=0;
  402.     rNFCONT|=(1<<9); //Enable RnB Interrupt
  403.     rNFCONT|=(1<<10); //Enable Illegal Access Interrupt
  404.     pISR_NFCON= (unsigned)NFCon_Int16;
  405.     rSRCPND=BIT_NFCON;
  406.     rINTMSK=~(BIT_NFCON);
  407. #if BAD_CHECK
  408.     if(NF16_IsBadBlock(block))
  409. return FAIL;
  410. #endif
  411. NF_nFCE_L();
  412.     
  413. NF_CMD(0x60);   // Erase one block 1st command, Block Addr:A11-A27
  414. // Address 3-cycle
  415. NF_ADDR(blockPage&0xff);     // A[18:11]
  416. NF_ADDR((blockPage>>8)&0xff);   // A[26:19]
  417. NF_ADDR((blockPage>>16)&0xff); // A27
  418. NF_CLEAR_RB();
  419. NF_CMD(0xd0); // Erase one blcok 2nd command
  420.  while(NFConDone16==0);
  421.  rNFCONT&=~(1<<9);   // Disable RnB Interrupt
  422.  rNFCONT&=~(1<<10); // Disable Illegal Access Interrupt
  423.  if(rNFSTAT&0x8) return FAIL;
  424.  
  425. NF_CMD(0x70);   // Read status command
  426.     if (NF_RDDATA()&0x1) // Erase error
  427.     {
  428.      NF_nFCE_H();
  429. Uart_Printf("[ERASE_ERROR:block#=%d]n",block);
  430. // NF16_MarkBadBlock(block);
  431. return FAIL;
  432.     }
  433.     else 
  434.     {
  435.      NF_nFCE_H();
  436.         return OK;
  437.     }
  438. }
  439. void __irq NFCon_Int16(void)
  440. {
  441.        NFConDone16=1;
  442. rINTMSK|=BIT_NFCON;
  443. ClearPending(BIT_NFCON);
  444. if(rNFSTAT&0x8) Uart_Printf("Illegal Access is detected!!!n");
  445.   }
  446. static int NF16_IsBadBlock(U32 block)
  447. {
  448.     int i;
  449.     unsigned int blockPage;
  450.     U32 bad_block_data;
  451.     
  452.     
  453.     blockPage=(block<<6); // For 2'nd cycle I/O[7:5] 
  454.     
  455. NF_nFCE_L();
  456. NF_CLEAR_RB();
  457. NF_CMD(0x00);  // read command
  458. NF_ADDR((1024+0)&0xff); // 2060 = 0x080c
  459. NF_ADDR(((1024+0)>>8)&0xff); // A[10:8]
  460. NF_ADDR((blockPage)&0xff); // A[11;18]
  461. NF_ADDR((blockPage>>8)&0xff); // A[26:19]
  462. NF_ADDR((blockPage>>16)&0xff); // A27
  463. NF_CMD(0x30); // 2'nd command
  464. NF_DETECT_RB();  // Wait tR(max 12us)
  465.     bad_block_data=NF_RDDATA();  // mark bad block at first word of spare area
  466. NF_nFCE_H();    
  467.        if(bad_block_data!=0xffffffff)
  468.     {
  469.      Uart_Printf("[ block %d has been marked as a bad block(%x)]n",block,bad_block_data);
  470.      return FAIL;
  471.     }
  472.     else
  473.     {
  474.       return OK;
  475.     }
  476. }
  477. static int NF16_MarkBadBlock(U32 block)
  478. {
  479.      int i;
  480.      U32 blockPage=(block<<6);
  481. se16Buf[0]=BAD_MARK;   // Bad blcok mark=0x4444
  482.    
  483.     
  484. NF_nFCE_L(); 
  485. NF_CMD(0x80);   // Write 1st command
  486. NF_ADDR((1024+0)&0xff); // 2060 = 0x080c
  487. NF_ADDR(((1024+0)>>8)&0xff); // A[10:8]
  488. NF_ADDR((blockPage)&0xff); // A[11;18]
  489. NF_ADDR((blockPage>>8)&0xff); // A[26:19]
  490. NF_ADDR((blockPage>>16)&0xff); // A[27]
  491. NF_WRDATA(se16Buf[0]); // Write Bad block information
  492. NF_CLEAR_RB();
  493. NF_CMD(0x10);   // Write 2nd command
  494. NF_DETECT_RB();
  495. NF_CMD(0x70);
  496.     
  497. for(i=0;i<3;i++);  //twhr=60ns////??????
  498.     
  499.     if (NF_RDDATA()&0x1) // Spare arrray write error
  500.     {
  501.      NF_nFCE_H();
  502.      Uart_Printf("[Program error is occurred but ignored]n");
  503.     }
  504.     else 
  505.     {
  506.      NF_nFCE_H();
  507.     }
  508.     Uart_Printf("[block #%d is marked as a bad block]n",block);
  509.     return OK;
  510. }
  511. static int NF16_ReadPage(U32 block,U32 page,U32 *buffer)
  512. {
  513.     int i;
  514.     unsigned int blockPage;
  515.     U32 ecc_low,ecc_high;
  516.     U32 Mecc0, Mecc1, Secc;
  517.     U16 ecc0, ecc1, ecc2, ecc3;
  518.     U32 *bufPt=buffer;
  519.     U32 se[16];    
  520.     
  521.     blockPage=(block<<6)+page;
  522.     NF_RSTECC();    // Initialize ECC
  523.     NF_MECC_UnLock();
  524.     
  525.     NF_nFCE_L();    
  526.     NF_CLEAR_RB();
  527.     NF_CMD(0x00); // Read command
  528.     NF_ADDR(0);  // Column (A[7:0]) = 0
  529.     NF_ADDR(0); // A[10:8]
  530.     NF_ADDR((blockPage)&0xff); // A[18:11]
  531.     NF_ADDR((blockPage>>8)&0xff); // A[26:19]
  532.     NF_ADDR((blockPage>>16)&0xff);  // A27
  533.     NF_CMD(0x30); // 2'nd command
  534.     NF_DETECT_RB();
  535. #if TRANS_MODE16==C_LANG
  536.     for(i=0;i<512;i++) {
  537.      *bufPt++=NF_RDDATA(); // Read one page
  538.     }
  539. #elif TRANS_MODE16==DMA
  540. // Nand to memory dma setting
  541.     rSRCPND=BIT_DMA0; // Init DMA src pending.
  542.     rDISRC0=NFDATA;  // Nand flash data register
  543.     rDISRCC0=(0<<0) | (1<<0); //arc=AHB,src_addr=fix
  544.     rDIDST0=(unsigned)bufPt;
  545.     rDIDSTC0=(0<<1) | (0<<0); //dst=AHB,dst_addr=inc;
  546.     rDCON0=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(0<<23)|(1<<22)|(2<<20)|(2048/4/4);
  547. //Handshake,AHB,interrupt,(4-burst),whole,S/W,no_autoreload,word,count=128;
  548. // DMA on and start.
  549.     rDMASKTRIG0=(1<<1)|(1<<0);
  550. while(!(rSRCPND & BIT_DMA0)); // Wait until Dma transfer is done.
  551.     rSRCPND=BIT_DMA0;
  552. #endif
  553.     NF_MECC_Lock();
  554.  // ECC check by hardware
  555.    
  556.    NF16_Spare_Data[0]=NF_RDDATA();  // Bad block Information
  557.    NF_SECC_UnLock();
  558.    Mecc0=NF_RDDATA();
  559.    Mecc1=NF_RDDATA();
  560.    NF_SECC_Lock();
  561.    
  562.    rNFMECCD0=((Mecc1&0xff00)<<16)|((Mecc0&0xff00)<<8)|((Mecc1&0xff)<<8)|((Mecc0&0xff));
  563.    rNFMECCD1=(Mecc1&0xff000000)|((Mecc0&0xff000000)>>8)|((Mecc1&0xff0000)>>8)|((Mecc0&0xff0000)>>16);
  564.   
  565.    NF16_Spare_Data[1]=Mecc0;
  566.    NF16_Spare_Data[2]=Mecc1;
  567.    NF16_Spare_Data[3]=NF_RDDATA();
  568.    Secc=NF_RDDATA();
  569.    rNFSECCD=(Secc&0xff000000)|((Secc&0xff0000)>>8)|((Secc&0xff00)<<8)|(Secc&0xff);
  570.   
  571.    NF16_Spare_Data[4]=Secc;
  572.    for(i=5;i<16;i++) {
  573.      NF16_Spare_Data[i]=NF_RDDATA(); // Read spare array with 4byte width
  574.        }
  575.   
  576.     NF_nFCE_H();    
  577.    if (((rNFESTAT0&0xf) == 0x0) &&((rNFESTAT1&0xf) == 0x0)){
  578.        Uart_Printf("ECC OK !!!n");
  579.        return OK;
  580.        }
  581.     else {
  582. Uart_Printf("ECC FAIL !!!n");
  583. return FAIL;
  584.      }
  585.  
  586. }
  587. static int NF16_WritePage(U32 block,U32 page,U32 *buffer)
  588. {
  589.     int i;
  590.     U32 blockPage,Mecc0, Mecc1, Secc;
  591.     U32 *bufPt=buffer;
  592. blockPage=(block<<6)+page;
  593. NF_RSTECC(); // Initialize ECC
  594.        NF_MECC_UnLock();
  595.    
  596. NF_nFCE_L(); 
  597. NF_CMD(0x80);   // Write 1st command
  598. NF_ADDR(0);  // Column (A[7:0]) = 0
  599. NF_ADDR(0); // A[10:8]
  600. NF_ADDR((blockPage)&0xff); // A[18:11]
  601. NF_ADDR((blockPage>>8)&0xff); // A[26:19]
  602. NF_ADDR((blockPage>>16)&0xff);  // A7
  603. // Write page data.
  604. #if TRANS_MODE16==C_LANG
  605. for(i=0;i<512;i++) {
  606. NF_WRDATA(*bufPt++); // Write one page to NFM from buffer
  607. }
  608. #elif TRANS_MODE16==DMA
  609. // Memory to Nand dma setting
  610. rSRCPND=BIT_DMA0; // Init DMA src pending.
  611. rDISRC0=(unsigned)bufPt; // Nand flash data register
  612. rDISRCC0=(0<<1) | (0<<0); //arc=AHB,src_addr=inc
  613. rDIDST0=NFDATA;
  614. rDIDSTC0=(0<<1) | (1<<0); //dst=AHB,dst_addr=fix;
  615. rDCON0=(1<<31)|(1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(1<<22)|(2<<20)|(2048/4);
  616. //Handshake,AHB,interrupt,unit,whole,S/W,no_autoreload,word,count=128;
  617. // DMA on and start.
  618. rDMASKTRIG0=(1<<1)|(1<<0);
  619. while(!(rSRCPND & BIT_DMA0)); // Wait until Dma transfer is done.
  620. rSRCPND=BIT_DMA0;
  621. #endif
  622.    NF_MECC_Lock();
  623.    se16Buf[0]=0xffffffff; // Marking good block(lower 16-bit is valid)
  624.    NF_WRDATA(se16Buf[0]); // Write spare array(ECC and Mark)
  625.    NF16_Spare_Data[0]=se16Buf[0];
  626.    se16Buf[1]=rNFMECC0;
  627.    se16Buf[2]=rNFMECC1;
  628.   
  629.     
  630.   // check spare ecc
  631.     NF_SECC_UnLock();
  632.     for(i=1;i<3;i++) {
  633. NF_WRDATA(se16Buf[i]); // Write spare array(ECC and Mark)
  634. NF16_Spare_Data[i]=se16Buf[i];
  635.       }  
  636.     NF_SECC_Lock();
  637.  
  638.     Secc=rNFSECC;
  639.     se16Buf[4]=Secc;
  640.    
  641.     for(i=3;i<16;i++) {
  642. NF_WRDATA(se16Buf[i]); // Write spare array(ECC and Mark)
  643. NF16_Spare_Data[i]=se16Buf[i];
  644.       }    
  645.     NF_CLEAR_RB();
  646.     NF_CMD(0x10);  // Write 2nd command
  647. #if 1
  648.        NF_DETECT_RB();
  649. #else
  650.        while(!((rNFSTAT&0x4)||(rNFSTAT&0x8)));
  651. if(rNFSTAT&0x8){
  652. Uart_Printf("Illegal Access is detected!!!n");
  653.               return FAIL;
  654. }
  655. #endif
  656. NF_CMD(0x70);   // Read status command   
  657.     
  658. for(i=0;i<3;i++);  //twhr=60ns
  659.     
  660.     if (NF_RDDATA()&0x1) {// Page write error
  661.      NF_nFCE_H();
  662. Uart_Printf("[PROGRAM_ERROR:block#=%d]n",block);
  663. NF16_MarkBadBlock(block);
  664. return FAIL;
  665.     } else {
  666.      NF_nFCE_H();
  667. return OK;
  668. }
  669. }
  670. static U32 NF16_CheckId(void)
  671. {
  672.     int i;
  673.     U32 id;
  674.     U16 id1, id2, id3, id4;
  675.     
  676. NF_nFCE_L();
  677. NF_CLEAR_RB();
  678. NF_CMD(0x90);
  679. NF_ADDR(0x0);
  680. for (i=0; i<10; i++);
  681. //read by halfword !!!
  682. id1 = NF_RDDATA16(); // read 4byte.
  683. id2 = NF_RDDATA16();
  684. id3 = NF_RDDATA16();
  685. id4 = NF_RDDATA16();
  686. id=((id4<<24)|(id3<<16)|(id2<<8)|id1);
  687.   NF_nFCE_H();
  688.     return id;
  689. }
  690. static void NF16_Init(void)
  691. {
  692. // for S3C2440
  693. rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(1<<0);
  694. // TACLS [14:12] CLE&ALE duration = HCLK*TACLS.
  695. // TWRPH0 [10:8] TWRPH0 duration = HCLK*(TWRPH0+1)
  696. // TWRPH1 [6:4] TWRPH1 duration = HCLK*(TWRPH1+1)
  697. // AdvFlash(R) [3] Advanced NAND, 0:256/512, 1:1024/2048
  698. // PageSize(R) [2] NAND memory page size
  699. // when [3]==0, 0:256, 1:512 bytes/page.
  700. // when [3]==1, 0:1024, 1:2048 bytes/page.
  701. // AddrCycle(R) [1] NAND flash addr size
  702. // when [3]==0, 0:3-addr, 1:4-addr.
  703. // when [3]==1, 0:4-addr, 1:5-addr.
  704. // BusWidth(R/W) [0] NAND bus width. 0:8-bit, 1:16-bit.
  705. rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
  706. // Lock-tight [13] 0:Disable lock, 1:Enable lock.
  707. // Soft Lock [12] 0:Disable lock, 1:Enable lock.
  708. // EnablillegalAcINT[10] Illegal access interupt control. 0:Disable, 1:Enable
  709. // EnbRnBINT [9] RnB interrupt. 0:Disable, 1:Enable
  710. // RnB_TrandMode[8] RnB transition detection config. 0:Low to High, 1:High to Low
  711. // SpareECCLock [6] 0:Unlock, 1:Lock
  712. // MainECCLock [5] 0:Unlock, 1:Lock
  713. // InitECC(W) [4] 1:Init ECC decoder/encoder.
  714. // Reg_nCE [1] 0:nFCE=0, 1:nFCE=1.
  715. // NANDC Enable [0] operating mode. 0:Disable, 1:Enable.
  716. // rNFSTAT = 0;
  717.     
  718. //    Nand_Reset();
  719. }