
On 08/25/2011 01:28 PM, Andreas Bießmann wrote:
Dear Simon,
Am 25.08.2011 10:33, schrieb Simon Schwarz:
This adds Linux booting to the SPL
Related CONFIGs: CONFIG_SPL_OS_BOOT Activates/Deactivates the OS booting feature CONFIG_SPL_OS_BOOT_KEY defines the IO-pin number u-boot switch - if pressed u-boot is booted CONFIG_SYS_SPL_MACHID Machine ID of the used board CONFIG_SYS_NAND_SPL_KERNEL_OFFS Offset in NAND of direct boot kernel image to use in SPL CONFIG_SYS_SPL_ARGS_ADDR Address where the kernel boot arguments are expected - this is normaly RAM-begin + 0x100
Signed-off-by: Simon Schwarzsimonschwarzcor@gmail.com
V2 changes: nothing
V3 changes: nothing
arch/arm/cpu/armv7/omap-common/spl.c | 48 ++++++++++++++++++++++++++++++++- include/configs/devkit8000.h | 7 +++- 2 files changed, 51 insertions(+), 4 deletions(-)
diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c index c76fea6..9c22c7a 100644 --- a/arch/arm/cpu/armv7/omap-common/spl.c +++ b/arch/arm/cpu/armv7/omap-common/spl.c @@ -35,6 +35,7 @@ #include<asm/arch/mmc_host_def.h> #include<i2c.h> #include<image.h> +#include<asm/omap_gpio.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -63,6 +64,25 @@ void board_init_f(ulong dummy) relocate_code(CONFIG_SPL_STACK,&gdata, CONFIG_SPL_TEXT_BASE); }
+#ifdef CONFIG_SPL_OS_BOOT
Is this required? -ffunction-sections and --gc-sections should do he job.
true. Will change
+/* Return the value of the U-boot key
- RETURN
- 0 if not pressed
- positiv if pressed
- */
+int spl_uboot_key(void) +{
- int val = 0;
- if (!omap_request_gpio(CONFIG_SPL_OS_BOOT_KEY)) {
omap_set_gpio_direction(CONFIG_SPL_OS_BOOT_KEY, 1);
val = omap_get_gpio_datain(CONFIG_SPL_OS_BOOT_KEY);
omap_free_gpio(CONFIG_SPL_OS_BOOT_KEY);
- }
- return !val;
+} +#endif /* CONFIG_SPL_OS_BOOT */
- void spl_parse_image_header(const struct image_header *header) { u32 header_size = sizeof(struct image_header);
@@ -90,7 +110,25 @@ void spl_parse_image_header(const struct image_header *header) } }
-static void jump_to_image_no_args(void) +#ifdef CONFIG_SPL_OS_BOOT
here too.
too.
+/* This function jumps to an image with argument. Normally an FDT or ATAGS
- image.
- arg: Pointer to paramter image in RAM
- */
+void jump_to_image_linux(void *arg) +{
- debug("Entering kernel arg pointer: 0x%X\n", arg);
- typedef void (*image_entry_arg_t)(int, int, void *)
__attribute__ ((noreturn));
- image_entry_arg_t image_entry =
(image_entry_arg_t) spl_image.entry_point;
- /* cleanup_before_linux(); */ /*write SPL function for that*/
- image_entry(0, CONFIG_SYS_SPL_MACHID, arg);
the MACHID is saved in gd->bd, couldn't this be used here? BTW: You missed setting CONFIG_SYS_SPL_MACHID in your board configuration header in this patch. Where is it done?
In SPL gd is not fully initialized.
CONFIG_SYS_SPL_MACHID is set see below in include/configs/devkit8000.h
+} +void jump_to_image_linux(void *) __attribute__ ((noreturn)); +#endif
+void jump_to_image_no_args(void) { typedef void (*image_entry_noargs_t)(void)__attribute__ ((noreturn)); image_entry_noargs_t image_entry = @@ -99,8 +137,8 @@ static void jump_to_image_no_args(void) debug("image entry point: 0x%X\n", spl_image.entry_point); image_entry(); }
- void jump_to_image_no_args(void) __attribute__ ((noreturn));
- void board_init_r(gd_t *id, ulong dummy) { u32 boot_device;
@@ -134,6 +172,12 @@ void board_init_r(gd_t *id, ulong dummy) debug("Jumping to U-Boot\n"); jump_to_image_no_args(); break; +#ifdef CONFIG_SPL_OS_BOOT
- case IH_OS_LINUX:
debug("Jumping to Linux\n");
jump_to_image_linux((void *)CONFIG_SYS_SPL_ARGS_ADDR);
break;
+#endif default: puts("Unsupported OS image.. Jumping nevertheless..\n"); jump_to_image_no_args(); diff --git a/include/configs/devkit8000.h b/include/configs/devkit8000.h index 4d0573c..3897ab4 100644 --- a/include/configs/devkit8000.h +++ b/include/configs/devkit8000.h @@ -38,7 +38,7 @@ #define CONFIG_OMAP3430 1 /* which is in a 3430 */ #define CONFIG_OMAP3_DEVKIT8000 1 /* working with DevKit8000 */
-#define CONFIG_SYS_TEXT_BASE 0x80008000 +#define CONFIG_SYS_TEXT_BASE 0x80100000
#define CONFIG_SDRC /* The chip has SDRC controller */
@@ -328,7 +328,7 @@ #define CONFIG_SPL_MAX_SIZE 0xB400 /* 45 K */ #define CONFIG_SPL_STACK LOW_LEVEL_SRAM_STACK
-#define CONFIG_SPL_BSS_START_ADDR 0x80000000 /*CONFIG_SYS_SDRAM_BASE*/ +#define CONFIG_SPL_BSS_START_ADDR 0x80000500 /* leave space for bootargs*/ #define CONFIG_SPL_BSS_MAX_SIZE 0x80000
/* NAND boot config */ @@ -358,6 +358,9 @@ #define CONFIG_CMD_SAVEBP_WRITE_SIZE 0x400 /* 1024 byte */ #define CONFIG_CMD_SAVEBP_NAND_OFS (CONFIG_SYS_NAND_SPL_KERNEL_OFFS+\ 0x400000) +#define CONFIG_SPL_OS_BOOT +#define CONFIG_SPL_OS_BOOT_KEY 26 +#define CONFIG_SYS_SPL_MACHID MACH_TYPE_DEVKIT8000 #define CONFIG_SYS_NAND_SPL_KERNEL_OFFS 0x280000 #define CONFIG_SYS_SPL_ARGS_ADDR (PHYS_SDRAM_1 + 0x100) #endif /* __CONFIG_H */
Regards, thx for reviewing Simon