nios2: add generic board support
This patch implements the generic board init as described in doc/README.generic-board. Signed-off-by: Thomas Chou <thomas@wytron.com.tw> Signed-off-by: Scott McNutt <smcnutt@psyent.com> Reviewed-by: Stefan Roese <sr@denx.de>
This commit is contained in:
parent
70fbc46192
commit
5ff10aa7e7
|
@ -17,3 +17,5 @@ PLATFORM_CPPFLAGS += -G0
|
||||||
|
|
||||||
LDFLAGS_FINAL += --gc-sections
|
LDFLAGS_FINAL += --gc-sections
|
||||||
PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections
|
PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections
|
||||||
|
|
||||||
|
__HAVE_ARCH_GENERIC_BOARD := y
|
||||||
|
|
|
@ -10,11 +10,14 @@
|
||||||
#include <nios2-io.h>
|
#include <nios2-io.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
#if defined (CONFIG_SYS_NIOS_SYSID_BASE)
|
#if defined (CONFIG_SYS_NIOS_SYSID_BASE)
|
||||||
extern void display_sysid (void);
|
extern void display_sysid (void);
|
||||||
#endif /* CONFIG_SYS_NIOS_SYSID_BASE */
|
#endif /* CONFIG_SYS_NIOS_SYSID_BASE */
|
||||||
|
|
||||||
int checkcpu (void)
|
#ifdef CONFIG_DISPLAY_CPUINFO
|
||||||
|
int print_cpuinfo(void)
|
||||||
{
|
{
|
||||||
printf ("CPU : Nios-II\n");
|
printf ("CPU : Nios-II\n");
|
||||||
#if !defined(CONFIG_SYS_NIOS_SYSID_BASE)
|
#if !defined(CONFIG_SYS_NIOS_SYSID_BASE)
|
||||||
|
@ -24,6 +27,7 @@ int checkcpu (void)
|
||||||
#endif
|
#endif
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_DISPLAY_CPUINFO */
|
||||||
|
|
||||||
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
|
@ -47,3 +51,11 @@ void dcache_disable(void)
|
||||||
{
|
{
|
||||||
flush_dcache(CONFIG_SYS_DCACHE_SIZE, CONFIG_SYS_DCACHELINE_SIZE);
|
flush_dcache(CONFIG_SYS_DCACHE_SIZE, CONFIG_SYS_DCACHELINE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int arch_cpu_init(void)
|
||||||
|
{
|
||||||
|
gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
|
||||||
|
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -134,11 +134,12 @@ _reloc:
|
||||||
mov fp, sp
|
mov fp, sp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call board_init -- never returns
|
* Call board_init_f -- never returns
|
||||||
*/
|
*/
|
||||||
movhi r4, %hi(board_init@h)
|
mov r4, r0
|
||||||
ori r4, r4, %lo(board_init@h)
|
movhi r2, %hi(board_init_f@h)
|
||||||
callr r4
|
ori r2, r2, %lo(board_init_f@h)
|
||||||
|
callr r2
|
||||||
|
|
||||||
/* NEVER RETURNS -- but branch to the _start just
|
/* NEVER RETURNS -- but branch to the _start just
|
||||||
* in case ;-)
|
* in case ;-)
|
||||||
|
@ -146,6 +147,31 @@ _reloc:
|
||||||
br _start
|
br _start
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* relocate_code -- Nios2 handles the relocation above. But
|
||||||
|
* the generic board code monkeys with the heap, stack, etc.
|
||||||
|
* (it makes some assumptions that may not be appropriate
|
||||||
|
* for Nios). Nevertheless, we capitulate here.
|
||||||
|
*
|
||||||
|
* We'll call the board_init_r from here since this isn't
|
||||||
|
* supposed to return.
|
||||||
|
*
|
||||||
|
* void relocate_code (ulong sp, gd_t *global_data,
|
||||||
|
* ulong reloc_addr)
|
||||||
|
* __attribute__ ((noreturn));
|
||||||
|
*/
|
||||||
|
.text
|
||||||
|
.global relocate_code
|
||||||
|
|
||||||
|
relocate_code:
|
||||||
|
mov sp, r4 /* Set the new sp */
|
||||||
|
mov r4, r5
|
||||||
|
movhi r8, %hi(board_init_r@h)
|
||||||
|
ori r8, r8, %lo(board_init_r@h)
|
||||||
|
callr r8
|
||||||
|
ret
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dly_clks -- Nios2 (like Nios1) doesn't have a timebase in
|
* dly_clks -- Nios2 (like Nios1) doesn't have a timebase in
|
||||||
* the core. For simple delay loops, we do our best by counting
|
* the core. For simple delay loops, we do our best by counting
|
||||||
|
|
|
@ -7,4 +7,7 @@
|
||||||
#ifndef _ASM_CONFIG_H_
|
#ifndef _ASM_CONFIG_H_
|
||||||
#define _ASM_CONFIG_H_
|
#define _ASM_CONFIG_H_
|
||||||
|
|
||||||
|
#define CONFIG_SYS_GENERIC_BOARD
|
||||||
|
#define CONFIG_SYS_GENERIC_GLOBAL_DATA
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,15 +15,7 @@
|
||||||
#ifndef __ASM_NIOS2_U_BOOT_H_
|
#ifndef __ASM_NIOS2_U_BOOT_H_
|
||||||
#define __ASM_NIOS2_U_BOOT_H_
|
#define __ASM_NIOS2_U_BOOT_H_
|
||||||
|
|
||||||
typedef struct bd_info {
|
#include <asm-generic/u-boot.h>
|
||||||
unsigned long bi_memstart; /* start of DRAM memory */
|
|
||||||
phys_size_t bi_memsize; /* size of DRAM memory in bytes */
|
|
||||||
unsigned long bi_flashstart; /* start of FLASH memory */
|
|
||||||
unsigned long bi_flashsize; /* size of FLASH memory */
|
|
||||||
unsigned long bi_flashoffset; /* reserved area for startup monitor */
|
|
||||||
unsigned long bi_sramstart; /* start of SRAM memory */
|
|
||||||
unsigned long bi_sramsize; /* size of SRAM memory */
|
|
||||||
} bd_t;
|
|
||||||
|
|
||||||
/* For image.h:image_check_target_arch() */
|
/* For image.h:image_check_target_arch() */
|
||||||
#define IH_ARCH_DEFAULT IH_ARCH_NIOS2
|
#define IH_ARCH_DEFAULT IH_ARCH_NIOS2
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y += cache.o
|
obj-y += cache.o
|
||||||
obj-y += board.o
|
|
||||||
obj-$(CONFIG_CMD_BOOTM) += bootm.o
|
obj-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||||
obj-y += libgcc.o
|
obj-y += libgcc.o
|
||||||
obj-y += time.o
|
obj-y += time.o
|
||||||
|
|
|
@ -1,147 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
|
||||||
* Scott McNutt <smcnutt@psyent.com>
|
|
||||||
*
|
|
||||||
* (C) Copyright 2000-2002
|
|
||||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <stdio_dev.h>
|
|
||||||
#include <watchdog.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <mmc.h>
|
|
||||||
#include <net.h>
|
|
||||||
#ifdef CONFIG_STATUS_LED
|
|
||||||
#include <status_led.h>
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_SYS_NIOS_EPCSBASE)
|
|
||||||
#include <nios2-epcs.h>
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_CMD_NAND
|
|
||||||
#include <nand.h> /* cannot even include nand.h if it isnt configured */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* All attempts to come up with a "common" initialization sequence
|
|
||||||
* that works for all boards and architectures failed: some of the
|
|
||||||
* requirements are just _too_ different. To get rid of the resulting
|
|
||||||
* mess of board dependend #ifdef'ed code we now make the whole
|
|
||||||
* initialization sequence configurable to the user.
|
|
||||||
*
|
|
||||||
* The requirements for any new initalization function is simple: it
|
|
||||||
* receives a pointer to the "global data" structure as it's only
|
|
||||||
* argument, and returns an integer return code, where 0 means
|
|
||||||
* "continue" and != 0 means "fatal error, hang the system".
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
typedef int (init_fnc_t) (void);
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Initialization sequence *
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
init_fnc_t *init_sequence[] = {
|
|
||||||
#if defined(CONFIG_BOARD_EARLY_INIT_F)
|
|
||||||
board_early_init_f, /* Call board-specific init code early.*/
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_SYS_NIOS_EPCSBASE)
|
|
||||||
epcs_reset,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
env_init,
|
|
||||||
serial_init,
|
|
||||||
console_init_f,
|
|
||||||
display_options,
|
|
||||||
checkcpu,
|
|
||||||
checkboard,
|
|
||||||
NULL, /* Terminate this list */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************/
|
|
||||||
void board_init(void)
|
|
||||||
{
|
|
||||||
bd_t *bd;
|
|
||||||
init_fnc_t **init_fnc_ptr;
|
|
||||||
static gd_t gd_data;
|
|
||||||
static bd_t bd_data;
|
|
||||||
|
|
||||||
/* Pointer is writable since we allocated a register for it. */
|
|
||||||
gd = &gd_data;
|
|
||||||
/* compiler optimization barrier needed for GCC >= 3.4 */
|
|
||||||
__asm__ __volatile__("" : : : "memory");
|
|
||||||
|
|
||||||
gd->bd = &bd_data;
|
|
||||||
gd->baudrate = CONFIG_BAUDRATE;
|
|
||||||
gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
|
|
||||||
|
|
||||||
bd = gd->bd;
|
|
||||||
bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
|
|
||||||
bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
|
|
||||||
#ifndef CONFIG_SYS_NO_FLASH
|
|
||||||
bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE)
|
|
||||||
bd->bi_sramstart = CONFIG_SYS_SRAM_BASE;
|
|
||||||
bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
|
|
||||||
WATCHDOG_RESET();
|
|
||||||
if ((*init_fnc_ptr) () != 0)
|
|
||||||
hang();
|
|
||||||
}
|
|
||||||
|
|
||||||
WATCHDOG_RESET();
|
|
||||||
|
|
||||||
/* The Malloc area is immediately below the monitor copy in RAM */
|
|
||||||
mem_malloc_init(CONFIG_SYS_MALLOC_BASE, CONFIG_SYS_MALLOC_LEN);
|
|
||||||
|
|
||||||
#ifndef CONFIG_SYS_NO_FLASH
|
|
||||||
WATCHDOG_RESET();
|
|
||||||
bd->bi_flashsize = flash_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_CMD_NAND
|
|
||||||
puts("NAND: ");
|
|
||||||
nand_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_GENERIC_MMC
|
|
||||||
puts("MMC: ");
|
|
||||||
mmc_initialize(bd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WATCHDOG_RESET();
|
|
||||||
env_relocate();
|
|
||||||
|
|
||||||
WATCHDOG_RESET();
|
|
||||||
stdio_init();
|
|
||||||
jumptable_init();
|
|
||||||
console_init_r();
|
|
||||||
|
|
||||||
WATCHDOG_RESET();
|
|
||||||
interrupt_init();
|
|
||||||
|
|
||||||
#if defined(CONFIG_BOARD_LATE_INIT)
|
|
||||||
board_late_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_CMD_NET)
|
|
||||||
puts("Net: ");
|
|
||||||
eth_initialize(bd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* main_loop */
|
|
||||||
for (;;) {
|
|
||||||
WATCHDOG_RESET();
|
|
||||||
main_loop();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -270,7 +270,7 @@ static int setup_mon_len(void)
|
||||||
gd->mon_len = (ulong)&__bss_end - (ulong)_start;
|
gd->mon_len = (ulong)&__bss_end - (ulong)_start;
|
||||||
#elif defined(CONFIG_SANDBOX)
|
#elif defined(CONFIG_SANDBOX)
|
||||||
gd->mon_len = (ulong)&_end - (ulong)_init;
|
gd->mon_len = (ulong)&_end - (ulong)_init;
|
||||||
#elif defined(CONFIG_BLACKFIN)
|
#elif defined(CONFIG_BLACKFIN) || defined(CONFIG_NIOS2)
|
||||||
gd->mon_len = CONFIG_SYS_MONITOR_LEN;
|
gd->mon_len = CONFIG_SYS_MONITOR_LEN;
|
||||||
#else
|
#else
|
||||||
/* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */
|
/* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */
|
||||||
|
@ -945,7 +945,7 @@ static init_fnc_t init_sequence_f[] = {
|
||||||
* - board info struct
|
* - board info struct
|
||||||
*/
|
*/
|
||||||
setup_dest_addr,
|
setup_dest_addr,
|
||||||
#if defined(CONFIG_BLACKFIN)
|
#if defined(CONFIG_BLACKFIN) || defined(CONFIG_NIOS2)
|
||||||
/* Blackfin u-boot monitor should be on top of the ram */
|
/* Blackfin u-boot monitor should be on top of the ram */
|
||||||
reserve_uboot,
|
reserve_uboot,
|
||||||
#endif
|
#endif
|
||||||
|
@ -970,7 +970,7 @@ static init_fnc_t init_sequence_f[] = {
|
||||||
!defined(CONFIG_BLACKFIN)
|
!defined(CONFIG_BLACKFIN)
|
||||||
reserve_video,
|
reserve_video,
|
||||||
#endif
|
#endif
|
||||||
#if !defined(CONFIG_BLACKFIN)
|
#if !defined(CONFIG_BLACKFIN) && !defined(CONFIG_NIOS2)
|
||||||
reserve_uboot,
|
reserve_uboot,
|
||||||
#endif
|
#endif
|
||||||
#ifndef CONFIG_SPL_BUILD
|
#ifndef CONFIG_SPL_BUILD
|
||||||
|
|
|
@ -133,7 +133,7 @@ static int initr_reloc_global_data(void)
|
||||||
{
|
{
|
||||||
#ifdef __ARM__
|
#ifdef __ARM__
|
||||||
monitor_flash_len = _end - __image_copy_start;
|
monitor_flash_len = _end - __image_copy_start;
|
||||||
#elif !defined(CONFIG_SANDBOX)
|
#elif !defined(CONFIG_SANDBOX) && !defined(CONFIG_NIOS2)
|
||||||
monitor_flash_len = (ulong)&__init_end - gd->relocaddr;
|
monitor_flash_len = (ulong)&__init_end - gd->relocaddr;
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
|
#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include "../board/altera/nios2-generic/custom_fpga.h" /* fpga parameters */
|
#include "../board/altera/nios2-generic/custom_fpga.h" /* fpga parameters */
|
||||||
#define CONFIG_BOARD_NAME "nios2-generic" /* custom board name */
|
#define CONFIG_BOARD_NAME "nios2-generic" /* custom board name */
|
||||||
#define CONFIG_BOARD_EARLY_INIT_F /* enable early board-spec. init */
|
#define CONFIG_BOARD_EARLY_INIT_F /* enable early board-spec. init */
|
||||||
|
#define CONFIG_DISPLAY_CPUINFO
|
||||||
|
#define CONFIG_DISPLAY_BOARDINFO
|
||||||
#define CONFIG_SYS_NIOS_SYSID_BASE CONFIG_SYS_SYSID_BASE
|
#define CONFIG_SYS_NIOS_SYSID_BASE CONFIG_SYS_SYSID_BASE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue