(一)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