On 01/12/2012 11:44, Philippe Reynes wrote:
> Signed-off-by: Philippe Reynes <trem...@yahoo.fr>
> Signed-off-by: Eric Jarrige <eric.jarr...@armadeus.org>
> Signed-off-by: Nicolas Colombain <nicolas.colomb...@armadeus.com>
> ---
>  MAINTAINERS                         |    5 +
>  board/armadeus/apf27/Makefile       |   48 +++
>  board/armadeus/apf27/apf27.c        |  347 ++++++++++++++++++++++
>  board/armadeus/apf27/apf27.h        |  477 +++++++++++++++++++++++++++++++
>  board/armadeus/apf27/start.S        |  538 
> +++++++++++++++++++++++++++++++++++
>  board/armadeus/apf27/u-boot-spl.lds |   86 ++++++
>  boards.cfg                          |    1 +
>  include/configs/apf27.h             |  445 +++++++++++++++++++++++++++++
>  8 files changed, 1947 insertions(+), 0 deletions(-)
>  create mode 100644 board/armadeus/apf27/Makefile
>  create mode 100644 board/armadeus/apf27/apf27.c
>  create mode 100644 board/armadeus/apf27/apf27.h
>  create mode 100644 board/armadeus/apf27/start.S
>  create mode 100644 board/armadeus/apf27/u-boot-spl.lds
>  create mode 100644 include/configs/apf27.h
> 

Hi Philippe,

I tried your patches, but build fails:

./MAKEALL apf27
Configuring for apf27 board...
make: *** [nand_spl] Error 2
arm-linux-gnueabi-size: './u-boot': No such file
make: *** nand_spl/board/armadeus/apf27: No such file or directory.  Stop.
make: *** [nand_spl] Error 2
make: *** Waiting for unfinished jobs....

Using the generic SPL, I am expecting that nand_spl is not used at all.
Objects and result should go into the SPL directory.

> +/*
> + * Fuse bank 1 row 8 is "reserved for future use" and therefore available for
> + * customer use. The APF27 board uses this fuse to store the board revision:
> + * 0: initial board revision
> + * 1: first revision - Presence of the second RAM chip on the board is blown 
> in
> + *     fuse bank 1 row 9  bit 0 - No hardware change
> + * N: to be defined
> + */
> +u32 get_board_rev(void)
> +{
> +     struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
> +
> +     return readl(&iim->bank[1].fuse_regs[8]);
> +}
> +
> +/*
> + * Fuse bank 1 row 9 is "reserved for future use" and therefore available for
> + * customer use. The APF27 board revision 1 uses the bit 0 to permanently 
> store
> + * the presence of the second RAM chip
> + * 0: AFP27 with 1 RAM of 64 MiB
> + * 1: AFP27 with 2 RAM chips of 64 MiB each (128MB)
> + */
> +int get_num_ram_bank(void)

This should be declared static, I think.

> +int
> +dram_init(void)
> +{
> +     /* dram_init must store complete ramsize in gd->ram_size */
> +     if (get_num_ram_bank() > 1) {
> +             gd->ram_size = PHYS_SDRAM_2 - CONFIG_SYS_SDRAM_BASE
> +                     + get_ram_size((void *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE);
> +     } else {
> +             gd->ram_size = get_ram_size((void *)PHYS_SDRAM_1,
> +                     PHYS_SDRAM_1_SIZE);
> +     }

Doesn't the following code work ?

        gd->ram_size =  get_ram_size((void *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) +
        get_ram_size((void *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE);

> +void dram_init_banksize(void)
> +{
> +     phys_size_t ramsize = gd->ram_size;
> +
> +     if (get_num_ram_bank() > 1)
> +             ramsize -= PHYS_SDRAM_2 - CONFIG_SYS_SDRAM_BASE;
> +
> +     gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> +     gd->bd->bi_dram[0].size = ramsize;
> +     gd->ram_size = gd->bd->bi_dram[0].size;
> +
> +     if (CONFIG_NR_DRAM_BANKS > 1) {

Do you need this ? It seems from your code that you can find at run time
how many banks are mounted.

> +/*
> + * Miscellaneous initialisation
> + */
> +int
> +misc_init_r(void)
> +{
> +     char *s;
> +     u_char * firmware_buffer = (u_char *)(CONFIG_SYS_LOAD_ADDR + \
> +                                           CONFIG_SYS_MONITOR_LEN);
> +     size_t size     = 0;
> +     size_t offset   = -1;
> +     char *autoload = getenv("firmware_autoload");

you search for the environment, but autoload is not used in this
function, right ?

> +     u8 pnum;
> +     struct mtd_device *dev;
> +     struct part_info *part;
> +
> +     /* detect compatibility issue of environment version */
> +     s = getenv("env_version");
> +     if ((NULL == s) || (0 != strcmp(s, CONFIG_ENV_VERSION))) {

Not clear at all. You add a version to the environment, ok, but you
check it with a version number known at compile time. Do you use it really

> +             char * const vars[] = {"flash_reset_env"};
> +             printf("*** Warning - Environment version change suggests: "
> +                     "run flash_reset_env; reset\n");
> +             set_default_vars(1, vars);
> +     }
> +
> +     /* Unlock whole flash but U-Boot */
> +     s = getenv("env_offset");
> +     offset = CONFIG_ENV_OFFSET;

This seems dangerous. You can set a variable, but the offset for the
environment is defined at compile time. This does not make a lot of
sense for me.


> +void enable_caches(void)
> +{
> +     /* Enable D-cache. I-cache is already enabled in start.S */
> +     dcache_enable();
> +}
> +

I suggest you move this function in a separate patch to
arch/arm/cpu/arm926ejs/mx27/generic.c. This code can be used by other
boards, too.


> +++ b/board/armadeus/apf27/apf27.h
> @@ -0,0 +1,477 @@
> +#ifndef __APF27_H
> +#define __APF27_H
> +
> +/* FPGA program pin configuration */
> +#define ACFG_FPGA_PWR        (GPIO_PORTF | 19)       /* FPGA prog pin  */
> +#define ACFG_FPGA_PRG        (GPIO_PORTF | 11)       /* FPGA prog pin  */
> +#define ACFG_FPGA_CLK        (GPIO_PORTF | 15)       /* FPGA clk pin   */
> +#define ACFG_FPGA_RDATA      0xD6000000              /* FPGA data addr  */
> +#define ACFG_FPGA_WDATA      0xD6000000              /* FPGA data addr  */
> +#define ACFG_FPGA_INIT       (GPIO_PORTF | 12)       /* FPGA init pin  */
> +#define ACFG_FPGA_DONE       (GPIO_PORTF | 9)        /* FPGA done pin  */
> +#define ACFG_FPGA_RW (GPIO_PORTF | 21)       /* FPGA done pin  */
> +#define ACFG_FPGA_CS (GPIO_PORTF | 22)       /* FPGA done pin  */
> +#define ACFG_FPGA_SUSPEND (GPIO_PORTF | 10)  /* FPGA done pin  */
> +#define ACFG_FPGA_RESET      (GPIO_PORTF | 7)        /* FPGA done pin  */
> +
> +/* MPU CLOCK source before PLL  */
> +/* ACFG_CLK_FREQ (2/3 MPLL clock or ext 266 MHZ) */

Style, wrong multiline comment.

> +#ifndef CONFIG_MX27_CLK26
> +#if (CONFIG_MX27_CLK32 == 32000)
> +#define ACFG_MPCTL0_VAL              0x00211803      /* 398.998 MHz */
> +#define ACFG_MPCTL1_VAL              0
> +#define CONFIG_MPLL_FREQ     399
> +#else /* CONFIG_MX27_CLK32 == 32768*/
> +#define ACFG_MPCTL0_VAL              0x01EF15D5      /* 399.000 MHz */
> +#define ACFG_MPCTL1_VAL              0
> +#define CONFIG_MPLL_FREQ     399
> +#endif /* CONFIG_MX27_CLK32 */
> +#else /* CONFIG_MX27_CLK26 in use*/
> +#define ACFG_MPCTL0_VAL              0x00331C23      /* 399.000 MHz */
> +#define ACFG_MPCTL1_VAL              0
> +#define CONFIG_MPLL_FREQ     399
> +#endif /* CONFIG_MX27_CLK26 */

Is it old code ? CONFIG_MX27_CLK26 is not used at all in u-boot, and you
do not define it. If we can get rid of it, please then clean up also the
other parts using #ifndef CONFIG_MX27_CLK26

> +
> +/* ARM bus frequency (have to be a CONFIG_MPLL_FREQ ratio) */
> +#define CONFIG_ARM_FREQ              399     /* up to 400 MHz */
> +
> +/* external bus frequency (have to be a ACFG_CLK_FREQ ratio) */
> +#define CONFIG_HCLK_FREQ     133     /* (ACFG_CLK_FREQ/2) */
> +
> +#define CONFIG_PERIF1_FREQ   16      /* 16.625 MHz UART, GPT, PWM*/
> +#define CONFIG_PERIF2_FREQ   33      /* 33.25 MHz CSPI and SDHC */
> +#define CONFIG_PERIF3_FREQ   33      /* 33.25 MHz LCD*/
> +#define CONFIG_PERIF4_FREQ   33      /* 33.25 MHz CSI*/
> +#define CONFIG_SSI1_FREQ     66      /* 66.50 MHz SSI1*/
> +#define CONFIG_SSI2_FREQ     66      /* 66.50 MHz SSI2*/
> +#define CONFIG_MSHC_FREQ     66      /* 66.50 MHz MSHC*/
> +#define CONFIG_H264_FREQ     66      /* 66.50 MHz H264*/
> +#define CONFIG_CLK0_DIV      3  /* Divide CLK0 by 4 */
> +#define CONFIG_CLK0_EN       1  /* CLK0 enabled */
> +
> +/* external bus frequency (have to be a CONFIG_HCLK_FREQ ratio) */
> +#define CONFIG_NFC_FREQ              44      /* NFC Clock up to 44 MHz wh 
> 133MHz*/
> +
> +/* external serial bus frequency (have to be a CONFIG_SPLL_FREQ ratio) */
> +#define CONFIG_USB_FREQ              60      /* 60 MHz */
> +
> +/*
> + * SDRAM
> + */
> +#if (ACFG_SDRAM_MBYTE_SYZE == 64) /* micron MT46H16M32LF -6 */
> +/* micron 64MB */
> +#define ACFG_SDRAM_NUM_COL           9  /* 8, 9, 10 or 11
> +                                                   column address bits */
> +#define ACFG_SDRAM_NUM_ROW           13 /* 11, 12 or 13
> +                                                   row address bits */
> +#define ACFG_SDRAM_REFRESH           3  /* 0=OFF 1=2048
> +                                                   2=4096 3=8192 refresh */
> +#define ACFG_SDRAM_EXIT_PWD          25 /* ns exit power
> +                                                   down delay */
> +#define ACFG_SDRAM_W2R_DELAY         1  /* write to read
> +                                                   cycle delay > 0 */
> +#define ACFG_SDRAM_ROW_PRECHARGE_DELAY       18 /* ns */
> +#define ACFG_SDRAM_TMRD_DELAY                2  /* Load mode register
> +                                                   cycle delay 1..4 */
> +#define ACFG_SDRAM_TWR_DELAY         1  /* LPDDR: 0=2ck 1=3ck;
> +                                                   SDRAM: 0=1ck 1=2ck*/
> +#define ACFG_SDRAM_RAS_DELAY         42 /* ns ACTIVE-to-PRECHARGE
> +                                                   delay */
> +#define ACFG_SDRAM_RRD_DELAY         12 /* ns ACTIVE-to-ACTIVE
> +                                                   delay */
> +#define ACFG_SDRAM_RCD_DELAY         18 /* ns Row to Column delay */
> +#define ACFG_SDRAM_RC_DELAY          70 /* ns Row cycle delay (tRFC
> +                                                   refresh to command) */
> +#define ACFG_SDRAM_CLOCK_CYCLE_CL_1  0 /* ns clock cycle time
> +                                                  estimated fo CL=1
> +                                                  0=force 3 for lpddr */
> +#define ACFG_SDRAM_PARTIAL_ARRAY_SR  0  /* 0=full 1=half 2=quater
> +                                                   3=Eighth 4=Sixteenth */
> +#define ACFG_SDRAM_DRIVE_STRENGH             0  /* 0=Full-strength 1=half
> +                                                   2=quater 3=Eighth */
> +#define ACFG_SDRAM_BURST_LENGTH              3  /* 2^N BYTES (N=0..3) */
> +#define ACFG_SDRAM_SINGLE_ACCESS             0  /* 1= single access;
> +                                                   0 = Burst mode */
> +#endif
> +
> +#if (ACFG_SDRAM_MBYTE_SYZE == 128)
> +/* micron 128MB */
> +#define ACFG_SDRAM_NUM_COL           9  /* 8, 9, 10 or 11
> +                                                   column address bits */
> +#define ACFG_SDRAM_NUM_ROW           14 /* 11, 12 or 13
> +                                                   row address bits */
> +#define ACFG_SDRAM_REFRESH           3  /* 0=OFF 1=2048
> +                                                   2=4096 3=8192 refresh */
> +#define ACFG_SDRAM_EXIT_PWD          25 /* ns exit power
> +                                                   down delay */
> +#define ACFG_SDRAM_W2R_DELAY         1  /* write to read
> +                                                   cycle delay > 0 */
> +#define ACFG_SDRAM_ROW_PRECHARGE_DELAY       18 /* ns */
> +#define ACFG_SDRAM_TMRD_DELAY                2  /* Load mode register
> +                                                   cycle delay 1..4 */
> +#define ACFG_SDRAM_TWR_DELAY         1  /* LPDDR: 0=2ck 1=3ck;
> +                                                   SDRAM: 0=1ck 1=2ck*/
> +#define ACFG_SDRAM_RAS_DELAY         42 /* ns ACTIVE-to-PRECHARGE
> +                                                   delay */
> +#define ACFG_SDRAM_RRD_DELAY         12 /* ns ACTIVE-to-ACTIVE
> +                                                   delay */
> +#define ACFG_SDRAM_RCD_DELAY         18 /* ns Row to Column delay */
> +#define ACFG_SDRAM_RC_DELAY          70 /* ns Row cycle delay (tRFC
> +                                                   refresh to command)*/
> +#define ACFG_SDRAM_CLOCK_CYCLE_CL_1  0 /* ns clock cycle time
> +                                                  estimated fo CL=1
> +                                                  0=force 3 for lpddr*/
> +#define ACFG_SDRAM_PARTIAL_ARRAY_SR  0  /* 0=full 1=half 2=quater
> +                                                   3=Eighth 4=Sixteenth */
> +#define ACFG_SDRAM_DRIVE_STRENGH             0  /* 0=Full-strength 1=half
> +                                                   2=quater 3=Eighth */
> +#define ACFG_SDRAM_BURST_LENGTH              3  /* 2^N BYTES (N=0..3) */
> +#define ACFG_SDRAM_SINGLE_ACCESS             0  /* 1= single access;
> +                                                   0 = Burst mode */
> +#endif
> +
> +#if (ACFG_SDRAM_MBYTE_SYZE == 256)
> +/* micron 256MB */
> +#define ACFG_SDRAM_NUM_COL           10  /* 8, 9, 10 or 11
> +                                                    column address bits */
> +#define ACFG_SDRAM_NUM_ROW           14 /* 11, 12 or 13
> +                                                   row address bits */
> +#define ACFG_SDRAM_REFRESH           3  /* 0=OFF 1=2048
> +                                                   2=4096 3=8192 refresh */
> +#define ACFG_SDRAM_EXIT_PWD          25 /* ns exit power
> +                                                   down delay */
> +#define ACFG_SDRAM_W2R_DELAY         1  /* write to read cycle
> +                                                   delay > 0 */
> +#define ACFG_SDRAM_ROW_PRECHARGE_DELAY       18 /* ns */
> +#define ACFG_SDRAM_TMRD_DELAY                2  /* Load mode register
> +                                                   cycle delay 1..4 */
> +#define ACFG_SDRAM_TWR_DELAY         1  /* LPDDR: 0=2ck 1=3ck;
> +                                                   SDRAM: 0=1ck 1=2ck */
> +#define ACFG_SDRAM_RAS_DELAY         42 /* ns ACTIVE-to-PRECHARGE
> +                                                   delay */
> +#define ACFG_SDRAM_RRD_DELAY         12 /* ns ACTIVE-to-ACTIVE
> +                                                   delay */
> +#define ACFG_SDRAM_RCD_DELAY         18 /* ns Row to Column delay */
> +#define ACFG_SDRAM_RC_DELAY          70 /* ns Row cycle delay (tRFC
> +                                                   refresh to command) */
> +#define ACFG_SDRAM_CLOCK_CYCLE_CL_1  0 /* ns clock cycle time
> +                                                  estimated fo CL=1
> +                                                  0=force 3 for lpddr */
> +#define ACFG_SDRAM_PARTIAL_ARRAY_SR  0  /* 0=full 1=half 2=quater
> +                                                   3=Eighth 4=Sixteenth */
> +#define ACFG_SDRAM_DRIVE_STRENGH             0  /* 0=Full-strength
> +                                                   1=half
> +                                                   2=quater
> +                                                   3=Eighth */
> +#define ACFG_SDRAM_BURST_LENGTH              3  /* 2^N BYTES (N=0..3) */
> +#define ACFG_SDRAM_SINGLE_ACCESS             0  /* 1= single access;
> +                                                   0 = Burst mode */
> +#endif

I understand why, but maybe it is more readable if you define a table in
apf27.c and you access to it on depend of the selected RAM. Something like:
        struct ram_timing {
                .....
        }

        struct ram_timing apf27_ram[] = {
                {... }, /* 64 MB */
                {...},  /* 128 MB */
                {...}   /* 256 MB */
        }

What do you think about ?

> +/*
> + * Default configuration for GPIOs and peripherals
> + */
> +#ifndef ACFG_APF27_CUSTOM
> +#define ACFG_DDIR_A_VAL              0x00000000
> +#define ACFG_OCR1_A_VAL              0x00000000
> +#define ACFG_OCR2_A_VAL              0x00000000
> +#define ACFG_ICFA1_A_VAL             0xFFFFFFFF
> +#define ACFG_ICFA2_A_VAL             0xFFFFFFFF
> +#define ACFG_ICFB1_A_VAL             0xFFFFFFFF
> +#define ACFG_ICFB2_A_VAL             0xFFFFFFFF
> +#define ACFG_DR_A_VAL                0x00000000
> +#define ACFG_GIUS_A_VAL              0xFFFFFFFF
> +#define ACFG_ICR1_A_VAL              0x00000000
> +#define ACFG_ICR2_A_VAL              0x00000000
> +#define ACFG_IMR_A_VAL               0x00000000
> +#define ACFG_GPR_A_VAL               0x00000000
> +#define ACFG_PUEN_A_VAL              0xFFFFFFFF

I am unsure if I have understood. This seems the setup of the GPIOs
controller, and for that we have gpio_ function. Why do we need all this
stuff ?

> +/* Enforce DDR signal strengh & enable USB/PP/DMA burst override bits */
> +#define ACFG_GPCR_VAL                0x0003000F
> +
> +#define ACFG_ESDMISC_VAL             ESDMISC_LHD+ESDMISC_MDDREN
> +
> +/* FMCR select num LPDDR RAMs and nand 16bits, 2KB pages */
> +#if (CONFIG_NR_DRAM_BANKS == 1)
> +#define ACFG_FMCR_VAL 0xFFFFFFF9
> +#elif (CONFIG_NR_DRAM_BANKS == 2)
> +#define ACFG_FMCR_VAL 0xFFFFFFFB
> +#endif
> +
> +#ifndef ACFG_APF27_CUSTOM

..but ACFG_APF27_CUSTOM is not set at all - also old code and can we
clean up ?


> diff --git a/board/armadeus/apf27/start.S b/board/armadeus/apf27/start.S
> new file mode 100644
> index 0000000..05d5de0
> --- /dev/null
> +++ b/board/armadeus/apf27/start.S
> @@ -0,0 +1,538 @@
> +/*
> + *  IMX27 NAND Flash SPL (Secondary Program Loader)
> + *
> + *  Copyright (c) 2008  Armadeus Project / eja
> + *
> + *  Based on Freescale NAND SPL
> + *
> + *  Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
> + *  Copyright (c) 2008-2012 Eric Jarrige <eric.jarr...@armadeus.org>
> + *
> + * 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
> + */
> +
> +
> +#include <config.h>
> +#include <generated/asm-offsets.h>
> +#include <version.h>
> +#include <asm/macro.h>
> +#include <asm/arch/mxc_nand.h>
> +#include <asm/arch/imx-regs.h>
> +#include "apf27.h"
> +
> +/*
> + * Standard NAND flash commands
> + */
> +#define NAND_CMD_READ0               0
> +#define NAND_CMD_READ1               1
> +#define NAND_CMD_PAGEPROG    0x10
> +#define NAND_CMD_READOOB     0x50
> +#define NAND_CMD_ERASE1              0x60
> +#define NAND_CMD_STATUS              0x70
> +#define NAND_CMD_STATUS_MULTI        0x71
> +#define NAND_CMD_SEQIN               0x80
> +#define NAND_CMD_READID              0x90
> +#define NAND_CMD_ERASE2              0xd0
> +#define NAND_CMD_RESET               0xff
> +
> +/* Extended commands for large page devices */
> +#define NAND_CMD_READSTART   0x30
> +#define NAND_CMD_CACHEDPROG  0x15
> +
> +/* Status bits */
> +#define NAND_STATUS_FAIL     0x01
> +#define NAND_STATUS_FAIL_N1  0x02
> +#define NAND_STATUS_TRUE_READY       0x20
> +#define NAND_STATUS_READY    0x40
> +#define NAND_STATUS_WP               0x80
> +
> +     .macro nand_boot
> +
> +#ifdef CONFIG_BOOT_TRACE_REG
> +/*
> + * If CONFIG_BOOT_TRACE_REG is a SDRAM address then be sure to use the 
> following
> + * 2 command after SDRAM init
> + */
> +
> +/* Backup state of previous boot to CONFIG_BOOT_TRACE_REG+4*/
> +#define BACKUP_TRACE()                       \
> +     ldr r4, =CONFIG_BOOT_TRACE_REG; \
> +     ldr r3, [r4];                   \
> +     str r3, [r4, #0x04];
> +
> +/* Save a state of boot at CONFIG_BOOT_TRACE_REG */
> +#define BOOT_TRACE(val)              \
> +     ldr r4, =CONFIG_BOOT_TRACE_REG; \
> +     ldr r3, =val;                   \
> +     str r3, [r4];
> +#else
> +#define BACKUP_TRACE()
> +#define BOOT_TRACE(val)
> +#endif
> +
> +nand_boot_setup:
> +
> +     /* Copy SPL image from flash to SDRAM first */
> +     BOOT_TRACE(1)
> +     ldr r0, =IMX_NFC_MAIN_AREA0
> +     add r2, r0, #(IMX_NFC_SPARE_AREA0-IMX_NFC_MAIN_AREA0) //2KB NFC Buff
> +     ldr r1, =CONFIG_SYS_NAND_U_BOOT_DST
> +
> +     BOOT_TRACE(2)
> +1:   ldmia r0!, {r3-r10}
> +     stmia r1!, {r3-r10}
> +     cmp r0, r2
> +     blo 1b
> +

If SPL can link mxc_nand.c, you have all functions if you link also
nand_spl_simple.o and nand_spl_load.o. Why do we need to redefine them
in assembly ?

> +
> +
> +     /* Jump to SDRAM */
> +     BOOT_TRACE(3)
> +     ldr r1, =0x7FF
> +     and r0, pc, r1   /* offset of pc */
> +     ldr r1, =CONFIG_SYS_NAND_U_BOOT_DST
> +     add r1, r1, #0x10
> +     add pc, r0, r1

This is also done by generic SPL code.

> +.globl _start
> +_start:
> +
> +/*
> + *************************************************************************
> + *
> + * Startup Code (reset vector)
> + *
> + * do important init only if we don't start from memory!
> + * setup Memory and board specific bits prior to relocation.
> + * relocate armboot to ram
> + * setup stack
> + *
> + *************************************************************************
> + */
> +
> +
> +/*
> + * the actual reset code
> + */
> +
> +reset:
> +     /*
> +      * set the cpu to SVC32 mode
> +      */
> +     mrs     r0,cpsr
> +     bic     r0,r0,#0x1f
> +     orr     r0,r0,#0xd3
> +     msr     cpsr,r0
> +
> +     /*
> +      * invalidate I/D cache/TLB and drain write buffer
> +      */
> +     mov r0, #0
> +     mcr p15, 0, r0, c7, c7, 0       /* invalidate I cache and D cache */
> +     mcr p15, 0, r0, c8, c7, 0       /* invalidate TLBs */
> +     mcr p15, 0, r0, c7, c10, 4   /* Drain the write buffer */
> +
> +     /*
> +      * disable MMU stuff and caches
> +      */
> +     mrc p15, 0, r0, c1, c0, 0
> +     bic     r0, r0, #0x00002300     /* clear bits 13, 9:8 (--V- --RS) */
> +     bic     r0, r0, #0x00000087     /* clear bits 7, 2:0 (B--- -CAM) */
> +     orr     r0, r0, #0x00000002     /* set bit 2 (A) Align */
> +     orr     r0, r0, #0x00001000     /* set bit 12 (I) I-Cache */
> +     mcr p15, 0, r0, c1, c0, 0
> +

You also duplicate stuff that is in the generic
arch/arm/cpu/arm926ejs/start.S. Better, you substitute the generic one
with yours. But the generic has support to call SPL function, so why to
replace it ?


> +/*
> + * SPL
> + */
> +/* Copy SPL+U-Boot here           */
> +#define CONFIG_SYS_NAND_U_BOOT_DST   (CONFIG_SYS_TEXT_BASE - 0x800)
> +/* Size is the partion size  */
> +#define CONFIG_SYS_NAND_U_BOOT_SIZE  CONFIG_SYS_MONITOR_LEN
> +/* Build image with spl and u-boot */
> +#define CONFIG_NAND_U_BOOT
> +#define CONFIG_SPL_PAD_TO            0xa1000000
> +
> +/*
> + * SPL
> + */
> +#define      CONFIG_SPL
> +#define      CONFIG_SPL_NO_CPU_SUPPORT_CODE

I have not understood why using CONFIG_SPL_FRAMEWORK does not work for
you. You should have availbale a lot of function that you redefine in
your patches.

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sba...@denx.de
=====================================================================
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to