二、【s3c2440移植u-boot-2016-11】 支持Nand Flash启动u-boot

(一)Nand Flash上启动u-boot

在第一个博客NOR Flash上启动u-boot的u-boot.bin是不支持用Nand Flash启动,至于为什么呢?
我这里就不啰嗦了,直接进入我们的正题,想知道有兴趣的朋友可以百度一下。

1、增加board/samsung/smdk2440/init.c文件
diff -urN u-boot-2016.11/board/samsung/smdk2440/init.c u-boot-2016.11_s3c2440/board/samsung/smdk2440/init.c  
--- u-boot-2016.11/board/samsung/smdk2440/init.c    1970-01-01 08:00:00.000000000 +0800  
+++ u-boot-2016.11_s3c2440/board/samsung/smdk2440/init.c    2018-06-15 15:29:34.456161999 +0800  
@@ -0,0 +1,142 @@  
+  
+/* NAND FLASH控制器 */  
+#define NFCONF (*((volatile unsigned long *)0x4E000000))  
+#define NFCONT (*((volatile unsigned long *)0x4E000004))  
+#define NFCMMD (*((volatile unsigned char *)0x4E000008))  
+#define NFADDR (*((volatile unsigned char *)0x4E00000C))  
+#define NFDATA (*((volatile unsigned char *)0x4E000010))  
+#define NFSTAT (*((volatile unsigned char *)0x4E000020))  
+/* GPIO */  
+#define GPHCON              (*(volatile unsigned long *)0x56000070)  
+#define GPHUP               (*(volatile unsigned long *)0x56000078)  
+/* UART registers*/  
+#define ULCON0              (*(volatile unsigned long *)0x50000000)  
+#define UCON0               (*(volatile unsigned long *)0x50000004)  
+#define UFCON0              (*(volatile unsigned long *)0x50000008)  
+#define UMCON0              (*(volatile unsigned long *)0x5000000c)  
+#define UTRSTAT0            (*(volatile unsigned long *)0x50000010)  
+#define UTXH0               (*(volatile unsigned char *)0x50000020)  
+#define URXH0               (*(volatile unsigned char *)0x50000024)  
+#define UBRDIV0             (*(volatile unsigned long *)0x50000028)  
+#define TXD0READY   (1<<2)  
+void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);  
+static int isBootFromNorFlash(void)  
+{  
+    volatile int *p = (volatile int *)0;  
+    int val;  
+    val = *p;  
+    *p = 0x12345678;  
+    if (*p == 0x12345678)  
+    {  
+        /* 写成功, 是nand启动 */  
+        *p = val;  
+        return 0;  
+    }  
+    else  
+    {  
+        /* NOR不能像内存一样写 */  
+        return 1;  
+    }  
+}  
+void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)  
+{     
+    int i = 0;  
+    /* 如果是NOR启动 */  
+    if (isBootFromNorFlash())  
+    {  
+        while (i < len)  
+        {  
+            dest[i] = src[i];  
+            i++;  
+        }  
+    }  
+    else  
+    {  
+        //nand_init();  
+        nand_read_ll((unsigned int)src, dest, len);  
+    }  
+}  
+void clear_bss(void)  
+{  
+    extern int __bss_start, __bss_end;  
+    int *p = &__bss_start;  
+    for (; p < &__bss_end; p++)  
+        *p = 0;  
+}  
+void nand_init_ll(void)  
+{  
+#define TACLS   0  
+#define TWRPH0  1  
+#define TWRPH1  0  
+    /* 设置时序 */  
+    NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);  
+    /* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */  
+    NFCONT = (1<<4)|(1<<1)|(1<<0);    
+}  
+static void nand_select(void)  
+{  
+    NFCONT &= ~(1<<1);   
+}  
+static void nand_deselect(void)  
+{  
+    NFCONT |= (1<<1);     
+}  
+static void nand_cmd(unsigned char cmd)  
+{  
+    volatile int i;  
+    NFCMMD = cmd;  
+    for (i = 0; i < 10; i++);  
+}  
+static void nand_addr(unsigned int addr)  
+{  
+    unsigned int col  = addr % 2048;  
+    unsigned int page = addr / 2048;  
+    volatile int i;  
+    NFADDR = col & 0xff;  
+    for (i = 0; i < 10; i++);  
+    NFADDR = (col >> 8) & 0xff;  
+    for (i = 0; i < 10; i++);  
+    NFADDR  = page & 0xff;  
+    for (i = 0; i < 10; i++);  
+    NFADDR  = (page >> 8) & 0xff;  
+    for (i = 0; i < 10; i++);  
+    NFADDR  = (page >> 16) & 0xff;  
+    for (i = 0; i < 10; i++);     
+}  
+static void nand_wait_ready(void)  
+{  
+    while (!(NFSTAT & 1));  
+}  
+static unsigned char nand_data(void)  
+{  
+    return NFDATA;  
+}  
+void nand_read_ll(unsigned int a
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值