Hello, i'm trying to boot nuttx from external FMC sdra on the stm32f746
(disco), i will use sdram for .data and .bss later, and nuttx stucks.

I've modified the linker script as follow :
add memory
  sdram (rx) : ORIGIN = 0xc0000000, LENGTH = 8M

Replace all "flash" occurrences by sdram (see provided file).

I've compiled and installed u-boot to flash (0x08000000), and i try to boot
nuttx as follow :
PS : i've added a "gobin" command to u-boot that get reset vector and stack
pointer initialization (see cmd/boot.c modified command)

U-Boot SPL 2020.10-00002-g451cd0c64d (Jan 21 2021 - 14:47:45 +0100)
Trying to boot from XIP


U-Boot 2020.10-00002-g451cd0c64d (Jan 21 2021 - 14:47:45 +0100)

Model: STMicroelectronics STM32F746-DISCO board
DRAM:  8 MiB
set_rate not implemented for clock index 4
set_rate not implemented for clock index 4
set_rate not implemented for clock index 4
Flash: 1 MiB
MMC:   sdio1@40012c00: 0
Loading Environment from SPIFlash... SF: Detected s25fl128s with page size
256 Bytes, erase size 64 KiB, total 16 MiB
OK
In:    serial
Out:   serial
Err:   serial
usr button is at LOW LEVEL
Net:
Warning: ethernet@40028000 (eth0) using random MAC address -
da:6c:8c:f1:bb:ad
eth0: ethernet@40028000
Hit SPACE in 1 seconds to stop autoboot.
U-Boot > setenv ipaddr 192.168.1.210
U-Boot > setenv serverip 192.168.1.51
U-Boot > tftpboot 0xC0000000 nuttx.bin
Speed: 100, full duplex
Using ethernet@40028000 device
TFTP from server 192.168.1.51; our IP address is 192.168.1.210
Filename 'nuttx.bin'.
Load address: 0xc0000000
Loading: ############
3.9 MiB/s
done
Bytes transferred = 164324 (281e4 hex)
U-Boot > gobin 0xC0000000
## Starting application at 0xC0000000 ...
 Stack 0x20011048 ...
 Entry point 0xC0000211 ...
nx_start: Entry
mm_initialize: Heap: start=0x2001104c size=241588
mm_addregion: Region 1: base=0x2001104c size=241584
mm_malloc: Allocated 0x20011060, size 32
mm_malloc: Allocated 0x20011080, size 112
mm_malloc: Allocated 0x200110f0, size 208
mm_malloc: Allocated 0x200111c0, size 80
mm_malloc: Allocated 0x20011210, size 144
mm_malloc: Allocated 0x200112a0, size 1072
mm_malloc: Allocated 0x200116d0, size 2128
mm_malloc: Allocated 0x20011f20, size 64
mm_addregion: Region 2: base=0x2004c000 size=16384
mm_addregion: Region 3: base=0x20000000 size=65536
mm_malloc: Allocated 0x2004c010, size 48
mm_malloc: Allocated 0x2004c040, size 48
uart_register: Registering /dev/console
mm_malloc: Allocated 0x2004c070, size 48
uart_register: Registering /dev/ttyS0
mm_malloc: Allocated 0x2004c0a0, size 48
mm_malloc: Allocated 0x2004c0d0, size 656
work_start_highpri: Starting high-priority kernel worker thread(s)
mm_malloc: Allocated 0x2004c360, size 256
mm_malloc: Allocated 0x2004c460, size 656
mm_malloc: Allocated 0x2004c6f0, size 2080
up_release_pending: From TCB=0x200103e0

Have you any idea ?
I've tried to boot another binary file without problems (that uses
interruptions, etc...)


For info, first lines of disassembly

nuttx:     file format elf32-littlearm


Disassembly of section .text:

c0000000 <_vectors>:
c0000000: 20011048 andcs r1, r1, r8, asr #32
c0000004: c0000211 andgt r0, r0, r1, lsl r2
c0000008: c000060d andgt r0, r0, sp, lsl #12
c000000c: c000060d andgt r0, r0, sp, lsl #12
c0000010: c000060d andgt r0, r0, sp, lsl #12
c0000014: c000060d andgt r0, r0, sp, lsl #12
c0000018: c000060d andgt r0, r0, sp, lsl #12
c000001c: c000060d andgt r0, r0, sp, lsl #12
c0000020: c000060d andgt r0, r0, sp, lsl #12
...

c0000210 <__start>:
 *   This is the reset entry point.
 *
 ****************************************************************************/

void __start(void)
{
c0000210: b580       push {r7, lr}
c0000212: b082       sub sp, #8
c0000214: af00       add r7, sp, #0

  /* Clear .bss.  We'll do this inline (vs. calling memset) just to be
   * certain that there are no issues with the state of global variables.
   */

  for (dest = &_sbss; dest < &_ebss; )
c0000216: 4b16       ldr r3, [pc, #88] ; (c0000270 <__start+0x60>)
c0000218: 603b       str r3, [r7, #0]
c000021a: e004       b.n c0000226 <__start+0x16>
    {
      *dest++ = 0;
c000021c: 683b


You see, the stack pointer 20011048 and reset handler c0000211 (the lsb is
for thumb) are goods
// SPDX-License-Identifier: GPL-2.0+
/*
 * (C) Copyright 2000-2003
 * Wolfgang Denk, DENX Software Engineering, w...@denx.de.
 */

/*
 * Misc boot support
 */
#include <common.h>
#include <command.h>
#include <net.h>
#include <asm/armv7m.h>


#ifdef CONFIG_CMD_GO

/* Allow ports to override the default behavior */
__attribute__((weak))
unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc,
				 char *const argv[])
{
	return entry (argc, argv);
}

static int do_go(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{
	ulong	addr, rc;
	int     rcode = 0;

	if (argc < 2)
		return CMD_RET_USAGE;

	addr = simple_strtoul(argv[1], NULL, 16);

	printf ("## Starting application at 0x%08lX ...\n", addr);

	/*
	 * pass address parameter as argv[0] (aka command name),
	 * and all remaining args
	 */
	rc = do_go_exec ((void *)addr, argc - 1, argv + 1);
	if (rc != 0) rcode = 1;

	printf ("## Application terminated, rc = 0x%lX\n", rc);
	return rcode;
}

/* -------------------------------------------------------------------- */

U_BOOT_CMD(
	go, CONFIG_SYS_MAXARGS, 1,	do_go,
	"start application at address 'addr'",
	"addr [arg ...]\n    - start application at address 'addr'\n"
	"      passing 'arg' as arguments"
);

#endif



#ifdef CONFIG_CMD_GOBIN

/* Allow ports to override the default behavior */
__attribute__((weak))
unsigned long do_gobin_exec(ulong (*entry)(int, char * const []), int argc,
				 char *const argv[])
{
	return entry (argc, argv);
}

static int do_gobin(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{
	ulong	addr, rc;
	ulong *ptr;
	
	ulong stack, jump;

	int     rcode = 0;

	if (argc < 2)
		return CMD_RET_USAGE;

	addr = simple_strtoul(argv[1], NULL, 16);

	printf ("## Starting application at 0x%08lX ...\n", addr);

	ptr = (ulong *)addr;

	stack = ptr[0];
		jump = ptr[1];

	printf (" Stack 0x%08lX ...\n", stack);
	printf (" Entry point 0x%08lX ...\n", jump);

	cleanup_before_linux();

	asm volatile(
		"mov sp,%0\r\n"
		"dsb\r\n"
		"isb\r\n"
		"mov r3,%1\r\n"
		"bx  r3"
		:
		: "r" (stack), "r" (jump)
		: "r3", "sp"
	);

	//asm("ldr sp, =0xC0084028");
	//asm("bl 0xC0000211");
	//asm("cpsid i");
	//V7M_SCB->vtor = 0xc0000000;
	//disable_interrupts();

	//reset_misc();
	//reset_cpu(0);




	//asm("ldr sp, =0x20050000");
	//asm("dsb");
	//asm("isb");
	//asm("ldr pc, =0x080003fc");

	//asm("ldr sp, =0x20050000");
	//asm("ldr r0, =0xC0000211");
	//asm("dsb");
	//asm("isb");
	//asm("bx r0");


	/*
	 * pass address parameter as argv[0] (aka command name),
	 * and all remaining args
	 */
	rc = do_go_exec ((void *)ptr[1], argc - 1, argv + 1);
	if (rc != 0) rcode = 1;

	printf ("## Application terminated, rc = 0x%lX\n", rc);
	return rcode;
}

/* -------------------------------------------------------------------- */

U_BOOT_CMD(
	gobin, CONFIG_SYS_MAXARGS, 1,	do_gobin,
	"start arm application at address 'addr'",
	"addr [arg ...]\n    - start arm application at address 'addr'\n"
	"      passing 'arg' as arguments"
);

#endif


U_BOOT_CMD(
	reset, 1, 0,	do_reset,
	"Perform RESET of the CPU",
	""
);

#ifdef CONFIG_CMD_POWEROFF
U_BOOT_CMD(
	poweroff, 1, 0,	do_poweroff,
	"Perform POWEROFF of the device",
	""
);
#endif

Reply via email to