s3c6410 nand初始化

ok6410 nand初始化和读数据(用于copy代码至ram)

[plain]  view plain copy
  1. #define MEM_SYS_CFG (*((volatile unsigned long *)0x7e00f120))  
  2. #define NFCONF      (*((volatile unsigned long *)0x70200000))  
  3.   
  4. #define TACLS       0  
  5. #define TWRPH0      2 //1  
  6. #define TWRPH1      1  
  7.   
  8. #define NFCONT      (*((volatile unsigned long *)0x70200004))  
  9. #define NFCMMD      (*((volatile unsigned long *)0x70200008))  
  10. #define NFADDR      (*((volatile unsigned long *)0x7020000c))  
  11. #define NFDATA      (*((volatile unsigned char *)0x70200010))  
  12.   
  13. #define NFSTAT      (*((volatile unsigned long *)0x70200028))  
  14.   
  15. void nand_reset(void)  
  16. {  
  17.     /*enable chip select*/  
  18.     NFCONT &= ~(1 << 1);  
  19.   
  20.     /*reset*/  
  21.     NFCMMD = 0xff;  
  22.   
  23.     /*wait nand ready to operw*/  
  24.     while ((NFSTAT & 0x1) == 0);  
  25.       
  26.     /*disenable chip select*/  
  27.     NFCONT |= (1 << 1);  
  28. }  
  29.   
  30. void nand_init(void)  
  31. {  
  32.     MEM_SYS_CFG &= ~(1 << 1);  
  33.     NFCONF &= ~((1 << 30) | (0x7 << 12) | (0x7 << 8) | (0x7 << 4));  
  34.     NFCONF |= ((TWRPH1 << 4) | (TWRPH0 << 8) | (TACLS << 12));  
  35.   
  36.     /*enable nand controller*/  
  37.     NFCONT |= 0x1;  
  38.   
  39.     /*no lock*/  
  40.     NFCONT &= ~(1 << 16);  
  41.   
  42.     nand_reset();  
  43. }  
  44.   
  45. void nand_send_addr(unsigned int addr)  
  46. {  
  47.     /*1st cycle a0~a7*/  
  48.     NFADDR = (addr & 0xff);  
  49.     /*2nd cycle a8~a12*/  
  50.     NFADDR = ((addr >> 7) & 0x1f);  
  51.     /*3rd cycle a13~a20*/  
  52.     NFADDR = ((addr >> 12) & 0xff);  
  53.     /*4th cycle a21~a28*/  
  54.     NFADDR = ((addr >> 20) & 0xff);  
  55.     /*5th cycle a29~a31*/  
  56.     NFADDR = ((addr >> 28) & 0x7);  
  57. }  
  58.   
  59. int   
  60. nand_read(unsigned int nand_start, unsigned int ddr_start, unsigned int len)  
  61. {  
  62.     unsigned int addr = nand_start;  
  63.     int count = 0, i = 0;  
  64.     unsigned char *dest = (unsigned char *)ddr_start;  
  65.     unsigned char data = 0;  
  66.   
  67.     NFCONT &= ~(1 << 1);  
  68.   
  69.     while (count < len) {  
  70.         NFCMMD = 0x00;  
  71.         nand_send_addr(addr);  
  72.         NFCMMD = 0x30;  
  73.         while ((NFSTAT & 0x1) == 0);  
  74.   
  75.         for (i = 0; i < 4096 && count < len; i++) {  
  76.             data = NFDATA;  
  77.             /*for the 1st 4*4K, just used 2K each*/  
  78.             if(addr < 16384) {  
  79.                 if(i < 2048)  
  80.                     dest[count++] = data;  
  81.             } else  
  82.                 dest[count++] = data;  
  83.         }  
  84.         addr += 4096;  
  85.     }  
  86.   
  87.     NFCONT |= (1 << 1);  
  88.   
  89.     return 0;  
  90. }  
  91.   
  92. int   
  93. nand2ddr(unsigned int nand, unsigned int ddr, unsigned int len)  
  94. {  
  95.     int ret;  
  96.   
  97.     nand_init();  
  98.   
  99.     ret = nand_read(nand, ddr, len);  
  100.   
  101.     return ret;  
  102. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值