mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
omap-common: add nand spl support
Add NAND support for the new SPL structure. Signed-off-by: Simon Schwarz <simonschwarzcor@gmail.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
This commit is contained in:
parent
b88e42560b
commit
bb085b87e5
4 changed files with 127 additions and 3 deletions
|
@ -26,6 +26,7 @@
|
||||||
#include <asm/u-boot.h>
|
#include <asm/u-boot.h>
|
||||||
#include <asm/utils.h>
|
#include <asm/utils.h>
|
||||||
#include <asm/arch/sys_proto.h>
|
#include <asm/arch/sys_proto.h>
|
||||||
|
#include <nand.h>
|
||||||
#include <mmc.h>
|
#include <mmc.h>
|
||||||
#include <fat.h>
|
#include <fat.h>
|
||||||
#include <timestamp_autogenerated.h>
|
#include <timestamp_autogenerated.h>
|
||||||
|
@ -173,7 +174,7 @@ end:
|
||||||
hang();
|
hang();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static void mmc_load_image(void) __attribute__((unused));
|
||||||
static void mmc_load_image(void)
|
static void mmc_load_image(void)
|
||||||
{
|
{
|
||||||
struct mmc *mmc;
|
struct mmc *mmc;
|
||||||
|
@ -207,12 +208,48 @@ static void mmc_load_image(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPL_NAND_SUPPORT
|
||||||
|
static void nand_load_image(void) __attribute__ ((unused));
|
||||||
|
static void nand_load_image(void)
|
||||||
|
{
|
||||||
|
struct image_header *header;
|
||||||
|
|
||||||
|
gpmc_init();
|
||||||
|
nand_init();
|
||||||
|
|
||||||
|
/*use CONFIG_SYS_TEXT_BASE as temporary storage area */
|
||||||
|
header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
|
||||||
|
|
||||||
|
#ifdef CONFIG_NAND_ENV_DST
|
||||||
|
nand_spl_load_image(CONFIG_ENV_OFFSET,
|
||||||
|
CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
|
||||||
|
parse_image_header(header);
|
||||||
|
nand_spl_load_image(CONFIG_ENV_OFFSET, image_size,
|
||||||
|
(void *)image_load_addr);
|
||||||
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
|
nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND,
|
||||||
|
CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
|
||||||
|
parse_image_header(header);
|
||||||
|
nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, image_size,
|
||||||
|
(void *)image_load_addr);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
/* Load u-boot */
|
||||||
|
nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
|
||||||
|
CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
|
||||||
|
parse_image_header(header);
|
||||||
|
nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
|
||||||
|
image_size, (void *)image_load_addr);
|
||||||
|
nand_deselect();
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_SPL_NAND_SUPPORT */
|
||||||
void jump_to_image_no_args(void)
|
void jump_to_image_no_args(void)
|
||||||
{
|
{
|
||||||
typedef void (*image_entry_noargs_t)(void)__attribute__ ((noreturn));
|
typedef void (*image_entry_noargs_t)(void)__attribute__ ((noreturn));
|
||||||
image_entry_noargs_t image_entry =
|
image_entry_noargs_t image_entry =
|
||||||
(image_entry_noargs_t) image_entry_point;
|
(image_entry_noargs_t) image_entry_point;
|
||||||
|
|
||||||
|
debug("image entry point: 0x%X\n", image_entry_point);
|
||||||
image_entry();
|
image_entry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,10 +265,17 @@ void board_init_r(gd_t *id, ulong dummy)
|
||||||
boot_device = omap_boot_device();
|
boot_device = omap_boot_device();
|
||||||
debug("boot device - %d\n", boot_device);
|
debug("boot device - %d\n", boot_device);
|
||||||
switch (boot_device) {
|
switch (boot_device) {
|
||||||
|
#ifdef CONFIG_SPL_MMC_SUPPORT
|
||||||
case BOOT_DEVICE_MMC1:
|
case BOOT_DEVICE_MMC1:
|
||||||
case BOOT_DEVICE_MMC2:
|
case BOOT_DEVICE_MMC2:
|
||||||
mmc_load_image();
|
mmc_load_image();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SPL_NAND_SUPPORT
|
||||||
|
case BOOT_DEVICE_NAND:
|
||||||
|
nand_load_image();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
printf("SPL: Un-supported Boot Device - %d!!!\n", boot_device);
|
printf("SPL: Un-supported Boot Device - %d!!!\n", boot_device);
|
||||||
hang();
|
hang();
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/armv7.h>
|
#include <asm/armv7.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/omap_common.h>
|
||||||
|
|
||||||
/* Declarations */
|
/* Declarations */
|
||||||
extern omap3_sysinfo sysinfo;
|
extern omap3_sysinfo sysinfo;
|
||||||
|
@ -56,6 +57,41 @@ static const struct gpio_bank gpio_bank_34xx[6] = {
|
||||||
|
|
||||||
const struct gpio_bank *const omap_gpio_bank = gpio_bank_34xx;
|
const struct gpio_bank *const omap_gpio_bank = gpio_bank_34xx;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPL_BUILD
|
||||||
|
/*
|
||||||
|
* We use static variables because global data is not ready yet.
|
||||||
|
* Initialized data is available in SPL right from the beginning.
|
||||||
|
* We would not typically need to save these parameters in regular
|
||||||
|
* U-Boot. This is needed only in SPL at the moment.
|
||||||
|
*/
|
||||||
|
u32 omap3_boot_device = BOOT_DEVICE_NAND;
|
||||||
|
|
||||||
|
/* auto boot mode detection is not possible for OMAP3 - hard code */
|
||||||
|
u32 omap_boot_mode(void)
|
||||||
|
{
|
||||||
|
switch (omap_boot_device()) {
|
||||||
|
case BOOT_DEVICE_MMC2:
|
||||||
|
return MMCSD_MODE_RAW;
|
||||||
|
case BOOT_DEVICE_MMC1:
|
||||||
|
return MMCSD_MODE_FAT;
|
||||||
|
break;
|
||||||
|
case BOOT_DEVICE_NAND:
|
||||||
|
return NAND_MODE_HW_ECC;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
puts("spl: ERROR: unknown device - can't select boot mode\n");
|
||||||
|
hang();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 omap_boot_device(void)
|
||||||
|
{
|
||||||
|
return omap3_boot_device;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_SPL_BUILD */
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Routine: delay
|
* Routine: delay
|
||||||
* Description: spinning delay to use before udelay works
|
* Description: spinning delay to use before udelay works
|
||||||
|
@ -197,6 +233,10 @@ void s_init(void)
|
||||||
|
|
||||||
per_clocks_enable();
|
per_clocks_enable();
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPL_BUILD
|
||||||
|
preloader_console_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!in_sdram)
|
if (!in_sdram)
|
||||||
mem_init();
|
mem_init();
|
||||||
}
|
}
|
||||||
|
@ -245,7 +285,7 @@ void abort(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NAND_OMAP_GPMC
|
#if defined(CONFIG_NAND_OMAP_GPMC) & !defined(CONFIG_SPL_BUILD)
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* OMAP3 specific command to switch between NAND HW and SW ecc
|
* OMAP3 specific command to switch between NAND HW and SW ecc
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
@ -273,7 +313,7 @@ U_BOOT_CMD(
|
||||||
"[hw/sw] - Switch between NAND hardware (hw) or software (sw) ecc algorithm"
|
"[hw/sw] - Switch between NAND hardware (hw) or software (sw) ecc algorithm"
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif /* CONFIG_NAND_OMAP_GPMC */
|
#endif /* CONFIG_NAND_OMAP_GPMC & !CONFIG_SPL_BUILD */
|
||||||
|
|
||||||
#ifdef CONFIG_DISPLAY_BOARDINFO
|
#ifdef CONFIG_DISPLAY_BOARDINFO
|
||||||
/**
|
/**
|
||||||
|
@ -410,3 +450,9 @@ void enable_caches(void)
|
||||||
dcache_enable();
|
dcache_enable();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void omap_rev_string(char *omap_rev_string)
|
||||||
|
{
|
||||||
|
sprintf(omap_rev_string, "OMAP3, sorry revision detection" \
|
||||||
|
" unimplemented");
|
||||||
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
void preloader_console_init(void);
|
void preloader_console_init(void);
|
||||||
|
|
||||||
/* Boot device */
|
/* Boot device */
|
||||||
|
#ifdef CONFIG_OMAP44XX /* OMAP4 */
|
||||||
#define BOOT_DEVICE_NONE 0
|
#define BOOT_DEVICE_NONE 0
|
||||||
#define BOOT_DEVICE_XIP 1
|
#define BOOT_DEVICE_XIP 1
|
||||||
#define BOOT_DEVICE_XIPWAIT 2
|
#define BOOT_DEVICE_XIPWAIT 2
|
||||||
|
@ -44,13 +45,43 @@ void preloader_console_init(void);
|
||||||
#define BOOT_DEVICE_ONE_NAND 4
|
#define BOOT_DEVICE_ONE_NAND 4
|
||||||
#define BOOT_DEVICE_MMC1 5
|
#define BOOT_DEVICE_MMC1 5
|
||||||
#define BOOT_DEVICE_MMC2 6
|
#define BOOT_DEVICE_MMC2 6
|
||||||
|
#elif CONFIG_OMAP34XX /* OMAP3 */
|
||||||
|
#define BOOT_DEVICE_NONE 0
|
||||||
|
#define BOOT_DEVICE_XIP 1
|
||||||
|
#define BOOT_DEVICE_NAND 2
|
||||||
|
#define BOOT_DEVICE_ONE_NAND 3
|
||||||
|
#define BOOT_DEVICE_MMC2 5 /*emmc*/
|
||||||
|
#define BOOT_DEVICE_MMC1 6
|
||||||
|
#define BOOT_DEVICE_XIPWAIT 7
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Boot type */
|
/* Boot type */
|
||||||
#define MMCSD_MODE_UNDEFINED 0
|
#define MMCSD_MODE_UNDEFINED 0
|
||||||
#define MMCSD_MODE_RAW 1
|
#define MMCSD_MODE_RAW 1
|
||||||
#define MMCSD_MODE_FAT 2
|
#define MMCSD_MODE_FAT 2
|
||||||
|
#define NAND_MODE_HW_ECC 3
|
||||||
|
|
||||||
|
struct spl_image_info {
|
||||||
|
const char *name;
|
||||||
|
u8 os;
|
||||||
|
u32 load_addr;
|
||||||
|
u32 entry_point;
|
||||||
|
u32 size;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct spl_image_info spl_image;
|
||||||
|
|
||||||
u32 omap_boot_device(void);
|
u32 omap_boot_device(void);
|
||||||
u32 omap_boot_mode(void);
|
u32 omap_boot_mode(void);
|
||||||
|
|
||||||
|
|
||||||
|
/* SPL common function s*/
|
||||||
|
void spl_parse_image_header(const struct image_header *header);
|
||||||
|
|
||||||
|
/* NAND SPL functions */
|
||||||
|
void spl_nand_load_image(void);
|
||||||
|
|
||||||
|
/* MMC SPL functions */
|
||||||
|
void spl_mmc_load_image(void);
|
||||||
|
|
||||||
#endif /* _OMAP_COMMON_H_ */
|
#endif /* _OMAP_COMMON_H_ */
|
||||||
|
|
|
@ -132,6 +132,9 @@ int nand_lock( nand_info_t *meminfo, int tight );
|
||||||
int nand_unlock( nand_info_t *meminfo, ulong start, ulong length );
|
int nand_unlock( nand_info_t *meminfo, ulong start, ulong length );
|
||||||
int nand_get_lock_status(nand_info_t *meminfo, loff_t offset);
|
int nand_get_lock_status(nand_info_t *meminfo, loff_t offset);
|
||||||
|
|
||||||
|
void nand_spl_load_image(loff_t offs, unsigned int size, uchar *dst);
|
||||||
|
void nand_deselect(void);
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_NAND_SELECT_DEVICE
|
#ifdef CONFIG_SYS_NAND_SELECT_DEVICE
|
||||||
void board_nand_select_device(struct nand_chip *nand, int chip);
|
void board_nand_select_device(struct nand_chip *nand, int chip);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue