[U-Boot] [PATCH] V2 NAND_SPL support for phycore imx31

Magnus Lilja lilja.magnus at gmail.com
Fri Jan 2 20:49:53 CET 2009


Hi

I have used your patch to boot the i.MX31 PDK board from its large
page NAND now. I had to modify one function (see below).


2008/12/5 Maxim Artamonov <scn1874 at yandex.ru>:
> V2 NAND_SPL support for phycore imx31
>
> Changelog:
>
> * Added bad block verify and skip;
> * Correct code to codestyle;
> * Added few comments;
> diff --git a/nand_spl/nand_boot_mx31.c b/nand_spl/nand_boot_mx31.c
> +static void mx31_nand_data_output(void)
> +{
> +       NFC_CONFIG1 = NFC_ECC_EN;
> +       NFC_BUF_ADDR = 0; /* read in first 0 buffer*/
> +       NFC_CONFIG2 = NFC_OUTPUT;
> +       mx31_wait_ready();
> +}

I suggest using the following function instead in order to support for
small page and large page devices:

static void mx31_nand_data_output(void)
{
	int i;

	/*
	 * The NAND controller requires four output commands for
	 * large page devices.
	 */
	for (i = 0; i < (CFG_NAND_PAGE_SIZE / 512); i++) {
		NFC_CONFIG1 = NFC_ECC_EN;
		NFC_BUF_ADDR = i; /* read in i:th buffer */
		NFC_CONFIG2 = NFC_OUTPUT;
		mx31_wait_ready();
	}
}

> +
> +static int mx31_nand_check_ecc(void)
> +{
> +       unsigned short ecc_status_registr;
> +
> +       ecc_status_registr = NFC_ECC_STATUS_RESULT;
> +
> +       if (ecc_status_registr != 0)
> +               return 1;/*error*/
> +       return 0;
> +}
> +
> +static int mx31_read_page(unsigned int page_address, unsigned char *buf)
> +{
> +       int i;
> +       volatile u32 *p1, *p2, a;
> +
> +       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)
> +               mx31_nand_command (NAND_CMD_READSTART);
> +
> +       mx31_nand_data_output ();/*fill the main buffer 0*/
> +
> +       if (mx31_nand_check_ecc ())
> +               while (1){
> +                       break;};        /*!!!!!*/

How about returning an error code and letting the nand_boot() function
below just loop forever (or something) if this happens?

> +
> +       p1 = (u32 *)MAIN_AREA0;
> +       p2 = (u32 *)buf;
> +
> +       /*main copy loop from NAND-buffer to SDRAM memory*/
> +       for (i=0; i < (CFG_NAND_PAGE_SIZE / 4); i++){
> +               *p2 = *p1;
> +               p1++;
> +               p2++;
> +       }
> +
> +       p1 = (u32 *)SPARE_AREA0;
> +
> +       /*it is hardware specific code for 8-bit 512kB NAND-flash spare area*/

I guess "512kB" should be just "512"?

> +       p1++;
> +       a = *p1;
> +       a = (a & 0x0000ff00) >> 8;
> +

Is this code valid also for large page NAND devices? I don't know the
answer myself.


I hope you have the possibility to update the patch with the above as
well as Scott's comments.

Thanks, Magnus


More information about the U-Boot mailing list