[U-Boot] [PATCH v2 1/3] MX31: Add NAND SPL for i.MX31.

Jean-Christophe PLAGNIOL-VILLARD plagnioj at jcrosoft.com
Sat May 9 23:04:58 CEST 2009


On 21:56 Sun 03 May     , Magnus Lilja wrote:
> This patch adds the NAND SPL framework needed to boot i.MX31 boards
> from NAND.
> 
> The patch is based on the work by Maxim Artamonov
> <scn1874 at yandex.ru > (which was signed-off-by him).
so please add it too
and please fix the @
> 
> Signed-off-by: Magnus Lilja <lilja.magnus at gmail.com>
> ---
>  cpu/arm1136/start.S                   |   29 +++--
>  include/asm-arm/arch-mx31/mx31-regs.h |   90 +++++++++++++
>  nand_spl/nand_boot_mx31.c             |  223 +++++++++++++++++++++++++++++++++
>  3 files changed, 331 insertions(+), 11 deletions(-)
>  create mode 100644 nand_spl/nand_boot_mx31.c
> 
> diff --git a/cpu/arm1136/start.S b/cpu/arm1136/start.S
> index e622338..9bbbaf1 100644
> --- a/cpu/arm1136/start.S
> +++ b/cpu/arm1136/start.S
> @@ -1,6 +1,9 @@
>  /*
>   *  armboot - Startup Code for OMP2420/ARM1136 CPU-core
>   *
> + *
> + *  Copyright (c) 2008 Maxim Artamonov, <scn1874 at yandex.ru>
> + *
please remove
>   *  Copyright (c) 2004	Texas Instruments <r-woodruff2 at ti.com>
>   *
>   *  Copyright (c) 2001	Marius Gröger <mag at sysgo.de>
> @@ -32,7 +35,7 @@
>  #include <version.h>
>  .globl _start
>  _start: b	reset
> -#ifdef CONFIG_ONENAND_IPL
> +#if defined(CONFIG_ONENAND_IPL) || defined(CONFIG_NAND_SPL)
create a better CONFIG_
because we could need for other boot mode
>  	ldr	pc, _hang
>  	ldr	pc, _hang
>  	ldr	pc, _hang
> @@ -156,9 +159,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*/
>  
>  #endif	/* CONFIG_ONENAND_IPL */
> +
<snip>
> diff --git a/nand_spl/nand_boot_mx31.c b/nand_spl/nand_boot_mx31.c
> new file mode 100644
> index 0000000..d698d2a
> --- /dev/null
> +++ b/nand_spl/nand_boot_mx31.c
> @@ -0,0 +1,223 @@
<snip>
> +static void mx31_nand_page_address(unsigned int page_address)
> +{
> +	unsigned int page_count;
> +
> +	writew(0x00, NFC_FLASH_ADDR);
> +	writew(NFC_ADDR, NFC_CONFIG2);
> +	mx31_wait_ready();
> +
> +	/* code only for 2kb flash */
> +	if (CFG_NAND_PAGE_SIZE == 0x800) {
> +		writew(0x00, NFC_FLASH_ADDR);
> +		writew(NFC_ADDR, NFC_CONFIG2);
> +		mx31_wait_ready();
> +	}
> +
> +	page_count = CFG_NAND_CHIP_SIZE / CFG_NAND_PAGE_SIZE;
please use CONFIG_SYS_ or CONFIG_
and why not detect it?
> +
> +	if (page_address <= page_count) {
> +		page_count--; /* transform 0x01000000 to 0x00ffffff */
> +		do {
> +			writew(page_address & 0xff, NFC_FLASH_ADDR);
> +			writew(NFC_ADDR, NFC_CONFIG2);
> +			mx31_wait_ready();
> +			page_address = page_address >> 8;
> +			page_count = page_count >> 8;
> +		} while (page_count);
> +	}
> +}
> +
<snip>
> +
> +static int nand_load(unsigned int from, unsigned int size, unsigned char *buf)
> +{
> +	int i, bb;
> +
> +	mx31_nand_init();
> +
> +	/* convert from to page number */
> +	from = from / CFG_NAND_PAGE_SIZE;
> +
> +	i = 0;
> +
> +	while (i < (size/CFG_NAND_PAGE_SIZE)) {
> +		if ((from * CFG_NAND_PAGE_SIZE) >= CFG_NAND_CHIP_SIZE)
> +			return 2; /* memory segment violation */
> +
> +		bb = mx31_read_page(from, buf);
> +
> +		if (bb < 0)
> +			return -1;
> +
> +		/* checking first page of each block */
> +		/* if this page has bb marker, then skip whole block */
> +		if ((!(from % CFG_NAND_PAGES_PER_BLOCK)) && bb) {
please use CONFIG_SYS_ or CONFIG_
and why not detect it?
> +			from = from + CFG_NAND_PAGES_PER_BLOCK;
> +		} else {
> +			i++;
> +			from++;
> +			buf = buf + CFG_NAND_PAGE_SIZE;
please use CONFIG_SYS_ or CONFIG_
and why not detect it?
> +		}
> +	}
> +
> +	return 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);
> +
> +	/* CFG_NAND_U_BOOT_OFFS and CFG_NAND_U_BOOT_SIZE must */
please use CONFIG_SYS_ or CONFIG_
and so on
> +	/* be aligned to full pages */
please use this style of multiple ligne comment
/*
 *
 */

Best Regards,
J.


More information about the U-Boot mailing list