Skip to contentSkip to conversation

nand booting support (SPL) for phyCORE-i.MX31

PATCH New user 2 participants 2 messages Nov 29, 2008

Subsystems (3)
lore
Share & tools
lore

user

author
#0 lore raw

PATCH 1/1 nand booting support (SPL) for phyCORE-i.MX31

nand booting support (SPL) for phyCORE-i.MX31

This patch allows Phytec phyCORE-i.MX31 based system to boot from embed NAND-flash memory.It not add support for NAND cmd and/or driver for U-BOOT, it is only SPL for U-BOOT. For NAND support in U-BOOT I give refer to Magnus Lilja's aug/2008 patch series for PDK/Litekit boards. ("[U-Boot] [PATCH v3 4/6] i.MX31: Add i.MX31 NAND Flash Controller driver."; MID 1219998982-21289-5-git-send-email-lilja.magnus at gmail.com)

Some note: by default, Phytec phyCORE-i.MX31 board (pcm-037 on pcm-970) is not suitable for nand-bootloading, because of SW5 switchers block haven't appropriate modes(8-bit, 2k page or 16-bit, 512B page) for BOOTPINS[4:0] and nand-flash(8-bit mode, 512B page) contemporary. There is require to make RESOLDER for really nand-booting either BOOTPIN state or JN1/2 and RN41/42. This nand-spl work with 8-bit, 512B page size nand-flash.

Patch is applicable on v2008.10 release tag master branch.

Maxim Artamonov, scn1874 a t yandex d o t ru. Nov, 29, 2008

---
 MAKEALL                                 |    1 +
 Makefile                                |    9 ++-
 board/imx31_phycore/config.mk           |   10 ++
 board/imx31_phycore/lowlevel_init.S     |   29 ++++++-
 board/imx31_phycore/u-boot-nand.lds     |   62 ++++++++++++
 cpu/arm1136/start.S                     |   36 +++++--
 include/asm-arm/arch-mx31/mx31-regs.h   |   98 +++++++++++++++++++-
 include/configs/imx31_phycore.h         |   58 +++++++++--
 nand_spl/board/imx31_phycore/Makefile   |   95 ++++++++++++++++++
 nand_spl/board/imx31_phycore/config.mk  |   33 +++++++
 nand_spl/board/imx31_phycore/u-boot.lds |   65 +++++++++++++
 nand_spl/nand_boot_mx31.c               |  160 +++++++++++++++++++++++++++++++
 12 files changed, 633 insertions(+), 23 deletions(-)
 create mode 100644 board/imx31_phycore/u-boot-nand.lds
 create mode 100644 nand_spl/board/imx31_phycore/Makefile
 create mode 100644 nand_spl/board/imx31_phycore/config.mk
 create mode 100644 nand_spl/board/imx31_phycore/u-boot.lds
 create mode 100644 nand_spl/nand_boot_mx31.c
MAKEALL +1 -0
index 9ccb9ac..1f639a8 100755
@@ -522,6 +522,7 @@ LIST_ARM11="		\
 	apollon		\
 	imx31_litekit	\
 	imx31_phycore	\
+	imx31_phycore_nand	\
 	mx31ads		\
 	smdk6400	\
 "
Makefile +8 -1
index 58b8331..7519dfe 100644
@@ -353,7 +353,7 @@ $(NAND_SPL):	$(VERSION_FILE)	$(obj)include/autoconf.mk
 		$(MAKE) -C nand_spl/board/$(BOARDDIR) all
 
 $(U_BOOT_NAND):	$(NAND_SPL) $(obj)u-boot.bin $(obj)include/autoconf.mk
-		cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin
+		cat $(obj)nand_spl/u-boot-spl-aligned.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin
 
 $(ONENAND_IPL):	$(VERSION_FILE)	$(obj)include/autoconf.mk
 		$(MAKE) -C onenand_ipl/board/$(BOARDDIR) all
@@ -2805,6 +2805,13 @@ imx31_litekit_config	: unconfig
 imx31_phycore_config	: unconfig
 	@$(MKCONFIG) $(@:_config=) arm arm1136 imx31_phycore NULL mx31
 
+imx31_phycore_nand_config	: unconfig
+	@mkdir -p $(obj)include $(obj)board/imx31_phycore
+	@mkdir -p $(obj)nand_spl/board/imx31_phycore
+	@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
+	@$(MKCONFIG) -n $@ -a imx31_phycore arm arm1136 imx31_phycore NULL mx31
+	@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
+
 mx31ads_config		: unconfig
 	@$(MKCONFIG) $(@:_config=) arm arm1136 mx31ads freescale mx31
 
board/imx31_phycore/config.mk +10 -0
index d34dc02..412defc 100644
@@ -1 +1,11 @@
+#
+# (C) Copyright 2008
+# was changed by Maxim Artamonov, <[email protected]>
+#
+
+ifndef CONFIG_NAND_SPL
 TEXT_BASE = 0x87f00000
+else
+TEXT_BASE = 0x87ec0000
+endif
+
board/imx31_phycore/lowlevel_init.S +28 -1
index c5d6eb0..bd838c7 100644
@@ -1,5 +1,7 @@
 /*
- *
+ * (C) Copyright 2008
+ * Maxim Artamonov, <[email protected]>
+ * 
  * (c) 2007 Pengutronix, Sascha Hauer <[email protected]>
  *
  * See file CREDITS for list of people who contributed to this
@@ -43,6 +45,20 @@
 	bcs 1b
 .endm
 
+#ifdef CONFIG_NAND_SPL
+/* somewhat macro to reduce bin size for CONFIG_NAND_SPL*/
+.macro FILLREGS begreg, val, count, step
+	ldr r2, =\begreg
+	ldr r3, =\val
+	ldr	r4, =\count
+2:
+	str	r3,	[r2]
+	add	r2,	r2, #\step
+	subs	r4,	r4,	#1
+	bcs 2b
+.endm
+#endif
+
 .globl lowlevel_init
 lowlevel_init:
 
@@ -60,10 +76,20 @@ lowlevel_init:
 
 	REG	CCM_SPCTL, PLL_PD(1) | PLL_MFD(0x43) | PLL_MFI(12) | PLL_MFN(1)
 
+	REG	CCM_UPCTL, 0x40c2403 /* USB Clock 60 MHZ *//*add 201108 for USB clocking init*/
+
+#ifdef CONFIG_NAND_SPL
+	FILLREGS 0x43FAC26C, 0, 0x3, 0x4
+#else
 	REG	0x43FAC26C, 0 /* SDCLK */
 	REG	0x43FAC270, 0 /* CAS */
 	REG	0x43FAC274, 0 /* RAS */
+#endif /* CONFIG_NAND_SPL */
 	REG	0x43FAC27C, 0x1000 /* CS2 (CSD0) */
+
+#ifdef CONFIG_NAND_SPL
+	FILLREGS 0x43FAC284, 0, 0x17, 0x4
+#else
 	REG	0x43FAC284, 0 /* DQM3 */
 	REG	0x43FAC288, 0 /* DQM2, DQM1, DQM0, SD31-SD0, A25-A0, MA10 (0x288..0x2DC) */
 	REG	0x43FAC28C, 0
@@ -87,6 +113,7 @@ lowlevel_init:
 	REG	0x43FAC2D4, 0
 	REG	0x43FAC2D8, 0
 	REG	0x43FAC2DC, 0
+#endif /* CONFIG_NAND_SPL */
 	REG	0xB8001010, 0x00000004
 	REG	0xB8001004, 0x006ac73a
 	REG	0xB8001000, 0x92100000
board/imx31_phycore/u-boot-nand.lds new file +62 -0

62 lines not on this page · raw message

cpu/arm1136/start.S +27 -9
index 51b664d..596efe9 100644
@@ -1,6 +1,9 @@
 /*
  *  armboot - Startup Code for OMP2420/ARM1136 CPU-core
  *
+ *
+ *  Copyright (c) 2008 Maxim Artamonov, <[email protected]>
+ *
  *  Copyright (c) 2004	Texas Instruments <[email protected]>
  *
  *  Copyright (c) 2001	Marius Gr?ger <[email protected]>
@@ -32,6 +35,15 @@
 #include <version.h>
 .globl _start
 _start: b	reset
+#ifdef CONFIG_NAND_SPL
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+#else
 #ifdef CONFIG_ONENAND_IPL
 	ldr	pc, _hang
 	ldr	pc, _hang
@@ -68,6 +80,7 @@ _irq:			.word irq
 _fiq:			.word fiq
 _pad:			.word 0x12345678 /* now 16*4=64 */
 #endif	/* CONFIG_ONENAND_IPL */
+#endif	/* CONFIG_NAND_SPL */
 .global _end_vect
 _end_vect:
 
@@ -156,9 +169,9 @@ relocate:				/* relocate U-Boot to RAM	    */
 	adr	r0, _start		/* r0 <- current position of code   */
 	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */
 	cmp	r0, r1			/* don't reloc during debug	    */
-#ifndef CONFIG_ONENAND_IPL
+#if !defined(CONFIG_ONENAND_IPL) && !defined(CONFIG_NAND_SPL)
 	beq	stack_setup
-#endif	/* CONFIG_ONENAND_IPL */
+#endif	/* !CONFIG_ONENAND_IPL && !CONFIG_NAND_SPL*/
 
 	ldr	r2, _armboot_start
 	ldr	r3, _bss_start
@@ -175,7 +188,7 @@ copy_loop:
 	/* Set up the stack						    */
 stack_setup:
 	ldr	r0, _TEXT_BASE		/* upper 128 KiB: relocated uboot   */
-#ifdef CONFIG_ONENAND_IPL
+#if defined(CONFIG_ONENAND_IPL) || defined (CONFIG_NAND_SPL)
 	sub	sp, r0, #128		/* leave 32 words for abort-stack   */
 #else
 	sub	r0, r0, #CFG_MALLOC_LEN /* malloc area			    */
@@ -184,14 +197,14 @@ stack_setup:
 	sub	r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
 #endif
 	sub	sp, r0, #12		/* leave 3 words for abort-stack    */
-#endif	/* CONFIG_ONENAND_IPL */
+#endif	/* CONFIG_ONENAND_IPL || CONFIG_NAND_SPL*/
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment	    */
 	ldr	r1, _bss_end		/* stop here			    */
 	mov	r2, #0x00000000		/* clear			    */
 
-#ifndef CONFIG_ONENAND_IPL
+#if !defined(CONFIG_ONENAND_IPL) && !defined(CONFIG_NAND_SPL)
 clbss_l:str	r2, [r0]		/* clear loop...		    */
 	add	r0, r0, #4
 	cmp	r0, r1
@@ -200,12 +213,15 @@ clbss_l:str	r2, [r0]		/* clear loop...		    */
 
 	ldr	pc, _start_armboot
 
+#ifdef CONFIG_NAND_SPL
+_start_armboot: .word nand_boot
+#else
 #ifdef CONFIG_ONENAND_IPL
 _start_armboot: .word start_oneboot
 #else
 _start_armboot: .word start_armboot
-#endif
-
+#endif /* CONFIG_ONENAND_IPL */
+#endif /* CONFIG_NAND_SPL */
 
 /*
  *************************************************************************
@@ -244,7 +260,7 @@ cpu_init_crit:
 	mov	lr, ip		/* restore link */
 	mov	pc, lr		/* back to my caller */
 
-#ifndef CONFIG_ONENAND_IPL
+#if !defined(CONFIG_ONENAND_IPL) && !defined(CONFIG_NAND_SPL)
 /*
  *************************************************************************
  *
@@ -357,11 +373,12 @@ cpu_init_crit:
 	.macro get_fiq_stack			@ setup FIQ stack
 	ldr	sp, FIQ_STACK_START
 	.endm
-#endif	/* CONFIG_ONENAND_IPL */
+#endif	/* !CONFIG_ONENAND_IPL && !CONFIG_NAND_SPL*/
 
 /*
  * exception handlers
  */
+#ifndef CONFIG_NAND_SPL
 #ifdef CONFIG_ONENAND_IPL
 	.align	5
 do_hang:
@@ -436,3 +453,4 @@ arm1136_cache_flush:
 		mcr	p15, 0, r1, c7, c5, 0	@ invalidate I cache
 		mov	pc, lr			@ back to caller
 #endif	/* CONFIG_ONENAND_IPL */
+#endif	/* !CONFIG_NAND_SPL*/
include/asm-arm/arch-mx31/mx31-regs.h +97 -1

108 lines not on this page · raw message

include/configs/imx31_phycore.h +47 -11

89 lines not on this page · raw message

nand_spl/board/imx31_phycore/Makefile new file +95 -0

95 lines not on this page · raw message

nand_spl/board/imx31_phycore/config.mk new file +33 -0
new file mode 100644
index 0000000..4c271c5
@@ -0,0 +1,33 @@
+#
+# (C) Copyright 2008
+# Maxim Artamonov, <[email protected]>
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+# phyCORE-i.MX31 - PHYTEC???s phyCORE Single Board Computer module 
+
+# TEXT_BASE for SPL: = CFG_NAND_U_BOOT_DST-0x40000 is set in board/imx31_phycore/config.mk
+
+# PAD_TO used to generate a 2kByte binary needed for the combined image
+# -> PAD_TO = TEXT_BASE + 2048
+PAD_TO	:= $(shell expr $$[$(TEXT_BASE) + 2048])
+
+ifeq ($(debug),1)
+PLATFORM_CPPFLAGS += -DDEBUG
+endif
nand_spl/board/imx31_phycore/u-boot.lds new file +65 -0

65 lines not on this page · raw message

nand_spl/nand_boot_mx31.c new file +160 -0

160 lines not on this page · raw message

Signature · 1 line
1.5.2.4
#1 lore raw

PATCH 1/1 nand booting support (SPL) for phyCORE-i.MX31

Hi

2008/11/29 user <[email protected]>:

Quoted 9 lines

nand booting support (SPL) for phyCORE-i.MX31

This patch allows Phytec phyCORE-i.MX31 based system to boot from embed NAND-flash memory.It not add support for NAND cmd and/or driver for U-BOOT, it is only SPL for U-BOOT. For NAND support in U-BOOT I give refer to Magnus Lilja's aug/2008 patch series for PDK/Litekit boards. ("[U-Boot] [PATCH v3 4/6] i.MX31: Add i.MX31 NAND Flash Controller driver."; MID 1219998982-21289-5-git-send-email-lilja.magnus at gmail.com)

Quoted 8 lines

Some note: by default, Phytec phyCORE-i.MX31 board (pcm-037 on pcm-970) is not suitable for nand-bootloading, because of SW5 switchers block haven't appropriate modes(8-bit, 2k page or 16-bit, 512B page) for BOOTPINS[4:0] and nand-flash(8-bit mode, 512B page) contemporary. There is require to make RESOLDER for really nand-booting either BOOTPIN state or JN1/2 and RN41/42. This nand-spl work with 8-bit, 512B page size nand-flash.

Patch is applicable on v2008.10 release tag master branch.

stgit couldn't apply the patch, but the standard 'patch' command could (it said 'applied with fuzz' on start.S).

Your patch seems to have some trailing whitespaces here and there.

include/asm-arm/arch-mx31/mx31-regs.h line 37

Quoted 10 lines
include/asm-arm/arch-mx31/mx31-regs.h +1 -1
index b04a718..7d6bd45 100644
@@ -34,7 +34,7 @@
 #define CCM_PDR1       (CCM_BASE + 0x08)
 #define CCM_RCSR       (CCM_BASE + 0x0c)
 #define CCM_MPCTL      (CCM_BASE + 0x10)
-#define CCM_UPCTL      (CCM_BASE + 0x10)
+#define CCM_UPCTL      (CCM_BASE + 0x14)

The above fix should really go into the arm-tree immediately since it's a separate bug fix (IMHO).

Quoted 38 lines
include/asm-arm/arch-mx31/mx31-regs.h +31 -0
 #define CCM_SPCTL      (CCM_BASE + 0x18)
 #define CCM_COSR       (CCM_BASE + 0x1C)
 #define CCM_CGR0       (CCM_BASE + 0x20)
@@ -168,4 +168,100 @@
 #define CS5_BASE       0xB6000000
 #define PCMCIA_MEM_BASE        0xC0000000
 
+/*
+ * NAND controller
+ */
+#define NFC_BASE_ADDR  0xB8000000
+
+/*
+ * Addresses for NFC registers
+ */
+#define NFC_BUF_SIZE            (*((volatile u16 *)(NFC_BASE_ADDR + 0xE00)))
+#define NFC_BUF_ADDR            (*((volatile u16 *)(NFC_BASE_ADDR + 0xE04)))
+#define NFC_FLASH_ADDR          (*((volatile u16 *)(NFC_BASE_ADDR + 0xE06)))
+#define NFC_FLASH_CMD           (*((volatile u16 *)(NFC_BASE_ADDR + 0xE08)))
+#define NFC_CONFIG              (*((volatile u16 *)(NFC_BASE_ADDR + 0xE0A)))
+#define NFC_ECC_STATUS_RESULT   (*((volatile u16 *)(NFC_BASE_ADDR + 0xE0C)))
+#define NFC_RSLTMAIN_AREA       (*((volatile u16 *)(NFC_BASE_ADDR + 0xE0E)))
+#define NFC_RSLTSPARE_AREA      (*((volatile u16 *)(NFC_BASE_ADDR + 0xE10)))
+#define NFC_WRPROT              (*((volatile u16 *)(NFC_BASE_ADDR + 0xE12)))
+#define NFC_UNLOCKSTART_BLKADDR (*((volatile u16 *)(NFC_BASE_ADDR + 0xE14)))
+#define NFC_UNLOCKEND_BLKADDR   (*((volatile u16 *)(NFC_BASE_ADDR + 0xE16)))
+#define NFC_NF_WRPRST           (*((volatile u16 *)(NFC_BASE_ADDR + 0xE18)))
+#define NFC_CONFIG1             (*((volatile u16 *)(NFC_BASE_ADDR + 0xE1A)))
+#define NFC_CONFIG2             (*((volatile u16 *)(NFC_BASE_ADDR + 0xE1C)))
+
+/*
+ * Addresses for NFC RAM BUFFER Main area 0
+ */
+#define MAIN_AREA0        (volatile u16 *)(NFC_BASE_ADDR + 0x000)
+#define MAIN_AREA1        (volatile u16 *)(NFC_BASE_ADDR + 0x200)
+#define MAIN_AREA2        (volatile u16 *)(NFC_BASE_ADDR + 0x400)
+#define MAIN_AREA3        (volatile u16 *)(NFC_BASE_ADDR + 0x600)
+

include/asm-arm/arch-mx31/mx31-regs.h line 211

Quoted 10 lines
include/asm-arm/arch-mx31/mx31-regs.h +10 -0
+/*
+ * Addresses for NFC SPARE BUFFER Spare area 0
+ */
+#define SPARE_AREA0       (volatile u16 *)(NFC_BASE_ADDR + 0x800)
+#define SPARE_AREA1       (volatile u16 *)(NFC_BASE_ADDR + 0x810)
+#define SPARE_AREA2       (volatile u16 *)(NFC_BASE_ADDR + 0x820)
+#define SPARE_AREA3       (volatile u16 *)(NFC_BASE_ADDR + 0x830)
+
+/*
+ * Set INT to 0, FCMD to 1, rest to 0 in NFC_CONFIG2 Register for Command

Change "rest" to "reset" (for all #define's below as well).

Quoted 83 lines
include/asm-arm/arch-mx31/mx31-regs.h +55 -0
+ * operation
+ */
+#define NFC_CMD            0x1
+
+/*
+ * Set INT to 0, FADD to 1, rest to 0 in NFC_CONFIG2 Register for Address
+ * operation
+ */
+#define NFC_ADDR           0x2
+
+/*
+ * Set INT to 0, FDI to 1, rest to 0 in NFC_CONFIG2 Register for Input
+ * operation
+ */
+#define NFC_INPUT          0x4
+
+/*
+ * Set INT to 0, FDO to 001, rest to 0 in NFC_CONFIG2 Register for Data
+ * Output operation
+ */
+#define NFC_OUTPUT         0x8
+
+/*
+ * Set INT to 0, FD0 to 010, rest to 0 in NFC_CONFIG2 Register for Read ID
+ * operation
+ */
+#define NFC_ID             0x10
+
+/*
+ * Set INT to 0, FDO to 100, rest to 0 in NFC_CONFIG2 Register for Read
+ * Status operation
+ */
+#define NFC_STATUS         0x20
+
+/*
+ * Set INT to 1, rest to 0 in NFC_CONFIG2 Register for Read Status
+ * operation
+ */
+#define NFC_INT            0x8000
+
+#define NFC_SP_EN           (1 << 2)
+#define NFC_ECC_EN          (1 << 3)
+#define NFC_INT_MSK         (1 << 4)
+#define NFC_BIG             (1 << 5)
+#define NFC_RST             (1 << 6)
+#define NFC_CE              (1 << 7)
+#define NFC_ONE_CYCLE       (1 << 8)
+
+/*
+ * NFMS bit in RCSR register for pagesize of nandflash
+ */
+#define NFMS           (*((volatile u32 *)CCM_RCSR))
+#define NFMS_BIT       30
+
 #endif /* __ASM_ARCH_MX31_REGS_H */
+
nand_spl/nand_boot_mx31.c new file +19 -0
new file mode 100644
index 0000000..0003d7d
@@ -0,0 +1,160 @@
+/*
+ * (C) Copyright 2008
+ * Maxim Artamonov, <[email protected]>
+ *
+ * (C) Copyright 2006-2008
+ * Stefan Roese, DENX Software Engineering, sr at denx.de.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software

nand_spl/nand_boot_mx31.c line 29

Quoted 10 lines
nand_spl/nand_boot_mx31.c new file +10 -0
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <nand.h>
+#include <asm-arm/arch/mx31-regs.h>
+
+static void mx31_wait_ready(void)
+{
+       while(1)

Insert space before '('.

nand_spl/nand_boot_mx31.c line 31

Quoted 2 lines
nand_spl/nand_boot_mx31.c new file +2 -0
+               if (NFC_CONFIG2 & NFC_INT)
+               {

Move { to the same line as if.

Quoted 6 lines
nand_spl/nand_boot_mx31.c new file +6 -0
+                               NFC_CONFIG2 = NFC_CONFIG2 & (~NFC_INT);/*int flag reset*/
+                               break;
+               }
+}
+
+static void mx31_nand_init(void)

nand_spl/nand_boot_mx31.c line 47

Quoted 10 lines
nand_spl/nand_boot_mx31.c new file +10 -0
+{
+       /*unlocking RAM Buff*/
+       NFC_CONFIG = 0x2;
+
+       /* Block of NAND flash to be unlocked */
+       /*NFC_UNLOCKSTART_BLKADDR = 0x0;*/
+       /*NFC_UNLOCKEND_BLKADDR = 0x4000;*/
+
+       /* Unlock NAND Flash Block Command for given address range */
+       /*NFC_WRPROT = 0x4;*/

If the above is not needed, remove it.

Quoted 10 lines
nand_spl/nand_boot_mx31.c new file +10 -0
+
+       NFC_CONFIG1 = NFC_ECC_EN;
+}
+
+static void mx31_nand_command(unsigned short command)
+{
+       NFC_FLASH_CMD = command;
+       NFC_CONFIG2 = NFC_CMD;
+       mx31_wait_ready();
+}

nand_spl/nand_boot_mx31.c line 67

Quoted 10 lines
nand_spl/nand_boot_mx31.c new file +10 -0
+
+static void mx31_nand_page_address(unsigned int page_address)
+{
+       unsigned int page_count;
+
+       NFC_FLASH_ADDR = 0x00;
+       NFC_CONFIG2 = NFC_ADDR;
+       mx31_wait_ready();
+
+       if(CFG_NAND_PAGE_SIZE==0x800)

Add space before '('. Add space around '=='.

nand_spl/nand_boot_mx31.c line 68

Quoted 1 line
nand_spl/nand_boot_mx31.c new file +1 -0
+       {

Move { to the if-line.

nand_spl/nand_boot_mx31.c line 74

Quoted 6 lines
nand_spl/nand_boot_mx31.c new file +6 -0
+               NFC_FLASH_ADDR = 0x00;
+               NFC_CONFIG2 = NFC_ADDR;
+               mx31_wait_ready();
+       };
+
+       page_count = CFG_NAND_CHIP_SIZE/CFG_NAND_PAGE_SIZE;

Add space around /.

nand_spl/nand_boot_mx31.c line 76

Quoted 2 lines
nand_spl/nand_boot_mx31.c new file +2 -0
+
+       if (page_address <= (page_count))

No need to have parenthesis around page_count in the if statement.

nand_spl/nand_boot_mx31.c line 77

Quoted 1 line
nand_spl/nand_boot_mx31.c new file +1 -0
+       {

Move { to the if-line.

nand_spl/nand_boot_mx31.c line 78

Quoted 1 line
nand_spl/nand_boot_mx31.c new file +1 -0
+               page_count--;// transform 0x01000000 to 0x00ffffff

Use C style comments /* .. */ instead of C++.

nand_spl/nand_boot_mx31.c line 80

Quoted 2 lines
nand_spl/nand_boot_mx31.c new file +2 -0
+               do
+               {

Move { to the do-line.

nand_spl/nand_boot_mx31.c line 87

Quoted 7 lines
nand_spl/nand_boot_mx31.c new file +7 -0
+                       NFC_FLASH_ADDR = (unsigned short)(page_address & 0xff);
+                       NFC_CONFIG2 = NFC_ADDR;
+                       mx31_wait_ready();
+                       page_address = page_address >> 8;
+                       page_count = page_count >> 8;
+               }
+               while(page_count);

Add space before parenthesis. The while statement should probably be moved to the previous line (after }) but I'm not sure what the coding style says aout this.

Quoted 4 lines
nand_spl/nand_boot_mx31.c new file +4 -0
+       }
+}
+
+static void mx31_nand_data_output(void)

nand_spl/nand_boot_mx31.c line 101

Quoted 10 lines
nand_spl/nand_boot_mx31.c new file +10 -0
+{
+       NFC_CONFIG1 = NFC_ECC_EN;
+       NFC_BUF_ADDR = 0; /* read in first 0 buffer*/
+       NFC_CONFIG2 = NFC_OUTPUT;
+       mx31_wait_ready();
+}
+
+static int mx31_nand_check_ecc(void)
+{
+       unsigned short ecc_status_registr;

Add empty line after variable declarations.

nand_spl/nand_boot_mx31.c line 104

Quoted 3 lines
nand_spl/nand_boot_mx31.c new file +3 -0
+       ecc_status_registr = NFC_ECC_STATUS_RESULT;
+
+       if(ecc_status_registr!=0)

Add space before parenthesis.Add space around '!='.

nand_spl/nand_boot_mx31.c line 112

Quoted 8 lines
nand_spl/nand_boot_mx31.c new file +8 -0
+               return 1;/*error*/
+       return 0;
+}
+
+static int mx31_read_page(unsigned int page_address, unsigned char *buf)
+{
+       int i;
+       u32 *p1,*p2;

Insert empty line after variable declarations. Add space after comma.

nand_spl/nand_boot_mx31.c line 117

Quoted 5 lines
nand_spl/nand_boot_mx31.c new file +5 -0
+       mx31_nand_init();
+       NFC_BUF_ADDR = 0; /* read in first 0 buffer*/
+       mx31_nand_command(NAND_CMD_READ0);
+       mx31_nand_page_address(page_address);
+       if(CFG_NAND_CHIP_SIZE >= 0x08000000)

Add space before parenthesis.

nand_spl/nand_boot_mx31.c line 120

Quoted 3 lines
nand_spl/nand_boot_mx31.c new file +3 -0
+               mx31_nand_command(NAND_CMD_READSTART);
+       mx31_nand_data_output();/*fill the main buffer 0*/
+       if(mx31_nand_check_ecc())while(1){break;};/*!!!!!*/

Add space before parenthesis. And split this line into several lines.

nand_spl/nand_boot_mx31.c line 122

Quoted 2 lines
nand_spl/nand_boot_mx31.c new file +2 -0
+
+       p1=NFC_BASE_ADDR; p2=buf;

Add spaces around =. Consider placing p2=buf; on a separate line.

nand_spl/nand_boot_mx31.c line 123

Quoted 1 line
nand_spl/nand_boot_mx31.c new file +1 -0
+       for(i=0;i<(CFG_NAND_PAGE_SIZE/4);i++)

Space before parenthesis, space after ;

nand_spl/nand_boot_mx31.c line 124

Quoted 1 line
nand_spl/nand_boot_mx31.c new file +1 -0
+       {

Move { to the for-line.

nand_spl/nand_boot_mx31.c line 125

Quoted 1 line
nand_spl/nand_boot_mx31.c new file +1 -0
+               *p2= *p1;

Add space before =.

nand_spl/nand_boot_mx31.c line 126

Quoted 1 line
nand_spl/nand_boot_mx31.c new file +1 -0
+               p1++;p2++;

Split in two lines.

nand_spl/nand_boot_mx31.c line 133

Quoted 7 lines
nand_spl/nand_boot_mx31.c new file +7 -0
+       }
+       return 0;
+}
+
+static int nand_load(unsigned int from, unsigned int size, unsigned char *buf)
+{
+       int i;

Add empty line after variable declarations.

nand_spl/nand_boot_mx31.c line 134

Quoted 1 line
nand_spl/nand_boot_mx31.c new file +1 -0
+       if((from+size) > CFG_NAND_CHIP_SIZE)

Add space before (.

nand_spl/nand_boot_mx31.c line 139

Quoted 5 lines
nand_spl/nand_boot_mx31.c new file +5 -0
+               return 1;
+       mx31_nand_init();
+
+       from = from/CFG_NAND_PAGE_SIZE;/*from must be set in full pages*/
+       for(i=0;i<(size/CFG_NAND_PAGE_SIZE);i++)

Add space before (. Add sape after ;. Add space around < and /.

nand_spl/nand_boot_mx31.c line 142

Quoted 3 lines
nand_spl/nand_boot_mx31.c new file +3 -0
+       {
+               mx31_read_page(from, buf);
+               from ++;

Remove space before ++;

nand_spl/nand_boot_mx31.c line 146

Quoted 4 lines
nand_spl/nand_boot_mx31.c new file +4 -0
+               buf = buf + CFG_NAND_PAGE_SIZE;
+       }
+       return 0;
+}

Insert empty line.

Shouldn't the code check if the current block is marked as bad before copying all the pages from that block into SDRAM? The first block is typically guaranteed to be good (if I understand correctly) but any subsequent block may be marked bad already from the factory and should be skipped. The entire U-boot won't fit in the first block, atleast for small page NAND devices.

nand_spl/nand_boot_mx31.c line 156

Quoted 10 lines
nand_spl/nand_boot_mx31.c new file +10 -0
+/*
+ * The main entry for NAND booting. It's necessary that SDRAM is already
+ * configured and available since this code loads the main U-Boot image
+ * from NAND into SDRAM and starts it from there.
+ */
+void nand_boot(void)
+{
+       __attribute__((noreturn)) void (*uboot)(void);
+
+       nand_load(CFG_NAND_U_BOOT_OFFS, CFG_NAND_U_BOOT_SIZE, (uchar *)CFG_NAND_U_BOOT_DST);

Split this line into two in order to keep it less than 80 chars long.

Quoted 6 lines
nand_spl/nand_boot_mx31.c new file +4 -1
+
+       uboot = (void *)CFG_NAND_U_BOOT_START;
+       uboot();
+}
--

1.5.2.4

Regards, Magnus