2007-06-20 Joel Sherrill <joel.sherrill@oarcorp.com>

Add Embedded Planets EP5200 which is the same as the Freescale
	5200Lite (a.k.a. IceCube) evaluation board.
	* Makefile.am: Add linkcmds.ep5200.
	Add -DMPC5200_BAPI_LIBC_HEADERS to remove some warnings in bestcomm.
	* preinstall.am: Add linkcmds.ep5200.
	* clock/clock.c: Correct math for prescaler/counter when bus speed
	is high enough to require multiple passes of loop.
	* console/console.c: Use same math for initial baud rate as when it
	is changed via ioctl.  When HAS_UBOOT is defined, initialize console
	to the same baud as it was with U-Boot.
	* include/bsp.h: Add EP5200 and console boot baud support.
	* include/mpc5200.h: Spacing.
	* startup/bspstart.c: If HAS_UBOOT and SHOW_MORE_INIT_SETTINGS are
	both defined, dump the U-Boot BD info structure.
	* vectors/vectors.S: ep5200 cannot use vectors segment.  When loading
	it, U-Boot freezes.  Besides, U-Boot can automatically start the BSP
	so we do not have to run from board reset.
	* startup/linkcmds.ep5200: New file.
This commit is contained in:
Joel Sherrill
2007-06-20 21:42:00 +00:00
parent 18481be37d
commit 7da34053e7
10 changed files with 424 additions and 16 deletions

View File

@@ -1,3 +1,24 @@
2007-06-20 Joel Sherrill <joel.sherrill@oarcorp.com>
Add Embedded Planets EP5200 which is the same as the Freescale
5200Lite (a.k.a. IceCube) evaluation board.
* Makefile.am: Add linkcmds.ep5200.
Add -DMPC5200_BAPI_LIBC_HEADERS to remove some warnings in bestcomm.
* preinstall.am: Add linkcmds.ep5200.
* clock/clock.c: Correct math for prescaler/counter when bus speed
is high enough to require multiple passes of loop.
* console/console.c: Use same math for initial baud rate as when it
is changed via ioctl. When HAS_UBOOT is defined, initialize console
to the same baud as it was with U-Boot.
* include/bsp.h: Add EP5200 and console boot baud support.
* include/mpc5200.h: Spacing.
* startup/bspstart.c: If HAS_UBOOT and SHOW_MORE_INIT_SETTINGS are
both defined, dump the U-Boot BD info structure.
* vectors/vectors.S: ep5200 cannot use vectors segment. When loading
it, U-Boot freezes. Besides, U-Boot can automatically start the BSP
so we do not have to run from board reset.
* startup/linkcmds.ep5200: New file.
2007-04-17 Ralf Corsépius <ralf.corsepius@rtems.org>
* mscan/mscan.c: Use size_t for message sizes. Remove absurd type

View File

@@ -31,6 +31,7 @@ project_lib_DATA = start.$(OBJEXT)
dist_project_lib_DATA += startup/linkcmds
dist_project_lib_DATA += startup/linkcmds.brs5l
dist_project_lib_DATA += startup/linkcmds.ep5200
dist_project_lib_DATA += startup/linkcmds.pm520
noinst_PROGRAMS += bestcomm.rel
@@ -51,7 +52,7 @@ bestcomm_rel_SOURCES = bestcomm/include/ppctypes.h \
bestcomm/task_api/bestcomm_api_mem.h bestcomm/task_api/bestcomm_cntrl.h \
bestcomm/task_api/tasksetup_bdtable.h \
bestcomm/task_api/tasksetup_general.h
bestcomm_rel_CPPFLAGS = $(AM_CPPFLAGS)
bestcomm_rel_CPPFLAGS = $(AM_CPPFLAGS) -DMPC5200_BAPI_LIBC_HEADERS
bestcomm_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
noinst_PROGRAMS += clock.rel
@@ -111,7 +112,7 @@ include_bsp_HEADERS += vectors/vectors.h
noinst_PROGRAMS += startup.rel
startup_rel_SOURCES = ../../shared/bspclean.c ../../shared/bsplibc.c \
../../shared/bsppost.c startup/bspstart.c ../../shared/bootcard.c \
../../shared/sbrk.c \
../../shared/sbrk.c ../shared/uboot_dump_bdinfo.c \
../../shared/gnatinstallhandler.c startup/cpuinit.c start/start.S
startup_rel_CPPFLAGS = $(AM_CPPFLAGS)
startup_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)

View File

@@ -170,20 +170,19 @@ void mpc5200_init_gpt(uint32_t gpt_no)
void mpc5200_set_gpt_count(uint32_t counter_value, uint32_t gpt_no)
{
uint32_t prescaler_value = 1;
uint32_t counter = counter_value;
struct mpc5200_gpt *gpt = (struct mpc5200_gpt *)(&mpc5200.gpt[gpt_no]);
/* Calculate counter/prescaler value, e.g. IPB_Clock=33MHz -> Int. every 0,3 nsecs. - 130 secs.*/
while((counter_value >= (1 << 16)) && (prescaler_value < (1 << 16)))
while((counter >= (1 << 16)) && (prescaler_value < (1 << 16)))
{
prescaler_value++;
counter_value /= prescaler_value;
prescaler_value++;
counter = counter_value / prescaler_value;
}
counter_value = (uint16_t)counter_value;
counter = (uint16_t)counter;
gpt->count_in = (prescaler_value << 16) + counter_value;
gpt->count_in = (prescaler_value << 16) + counter;
}

View File

@@ -497,13 +497,13 @@ void mpc5200_uart_psc_initialize(int minor) {
*/
psc->tfalarm = 1;
baud_divider = IPB_CLOCK / (9600 * 32);
baud_divider = (IPB_CLOCK + GEN5200_CONSOLE_BAUD *16) / (GEN5200_CONSOLE_BAUD * 32);
/*
* Set upper timer counter
*/
psc->ctur = baud_divider >> 16;
/*
* Set lower timer counter
*/

View File

@@ -90,6 +90,24 @@
#define MBAR 0xF0000000
#define HAS_UBOOT
#elif defined (ep5200)
/*
* Embedded Planet EP5200 -- should be the same as a Freescale 5200lite
* which is also known as the Ice Cube. In the RTEMS configuration,
* we load U-Boot on it instead of the default dBug.
*/
#define HAS_UBOOT
/* These are copied from PM520 but seem to work so OK */
#define GPIOPCR_INITMASK 0x330F0F77
#define GPIOPCR_INITVAL 0x01050444
/* we only have PSC1 */
#define GEN5200_UART_AVAIL_MASK 0x01
#define MBAR 0xF0000000
#else
#error "board type not defined"
#endif
@@ -110,8 +128,10 @@ extern "C" {
#include <bsp/vectors.h>
#if defined(HAS_UBOOT)
/* This is the define U-Boot uses to configure which entries in the structure are valid */
#define CONFIG_MPC5xxx
#include <u-boot.h>
extern bd_t *uboot_bdinfo_ptr;
extern bd_t uboot_bdinfo_copy;
#endif
@@ -189,6 +209,7 @@ void bsp_cleanup(void);
#define SINGLE_CHAR_MODE
#define UARTS_USE_TERMIOS_INT 1
/* #define SHOW_MORE_INIT_SETTINGS 1 */
/* ata modes */
/* #undef ATA_USE_INT */
@@ -205,6 +226,12 @@ void bsp_cleanup(void);
#define G2_CLOCK 231000000 /* 231 MHz */
#endif
#if defined(HAS_UBOOT)
#define GEN5200_CONSOLE_BAUD (uboot_bdinfo_ptr->bi_baudrate)
#else
#define GEN5200_CONSOLE_BAUD 9600
#endif
/*
* Convert decrement value to tenths of microsecnds (used by
* shared timer driver).

View File

@@ -699,7 +699,7 @@ typedef struct mpc5200_
#endif
/*
/*
* programmable serial controller 1 (MBAR + 0x2000)
*/

View File

@@ -85,6 +85,10 @@ $(PROJECT_LIB)/linkcmds.brs5l: startup/linkcmds.brs5l $(PROJECT_LIB)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.brs5l
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.brs5l
$(PROJECT_LIB)/linkcmds.ep5200: startup/linkcmds.ep5200 $(PROJECT_LIB)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.ep5200
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.ep5200
$(PROJECT_LIB)/linkcmds.pm520: startup/linkcmds.pm520 $(PROJECT_LIB)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.pm520
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.pm520

View File

@@ -244,8 +244,6 @@ void bsp_predriver_hook(void)
#endif
}
void bsp_start(void)
{
extern void *_WorkspaceBase;
@@ -257,13 +255,21 @@ void bsp_start(void)
* Get CPU identification dynamically. Note that the get_ppc_cpu_type() function
* store the result in global variables so that it can be used latter...
*/
myCpu = get_ppc_cpu_type();
myCpu = get_ppc_cpu_type();
myCpuRevision = get_ppc_cpu_revision();
#if defined(HAS_UBOOT)
uboot_bdinfo_copy = *uboot_bdinfo_ptr;
uboot_bdinfo_ptr = &uboot_bdinfo_copy;
#endif
#if defined(HAS_UBOOT) && defined(SHOW_MORE_INIT_SETTINGS)
{
void dumpUBootBDInfo( bd_t * );
dumpUBootBDInfo( uboot_bdinfo_ptr );
}
#endif
cpu_init();
/*

View File

@@ -0,0 +1,348 @@
/*
* This file contains directives for the GNU linker which are specific
* to a MicroSys PM520 Board
*
* linkcmds,v 1.3 2003/01/20 19:53:27 joel Exp
*/
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
"elf32-powerpc")
OUTPUT_ARCH(powerpc)
ENTRY(start)
/*
* Declare some sizes.
* XXX: The assignment of ". += XyzSize;" fails in older gld's if the
* number used there is not constant. If this happens to you, edit
* the lines marked XXX below to use a constant value.
*/
HeapSize = DEFINED(HeapSize) ? HeapSize : 0x100000; /* 1M Heap */
StackSize = DEFINED(StackSize) ? StackSize : 0x80000; /* 512 kB */
WorkSpaceSize = DEFINED(WorkSpaceSize) ? WorkSpaceSize : 0x80000; /* 512k */
RamDiskSize = DEFINED(RamDiskSize) ? RamDiskSize : 0x80000; /* 512 ram disk */
MEMORY
{
ram : org = 0x0, l = 128M
mpc5200_regs : org = 0xF0000000, l = 24K
flash : org = 0xFFE00000, l = 2M
}
SECTIONS
{
/*
.vectors 0x100 :
{
*(.vectors)
}
> ram
*/
/*
* The stack will live in this area - between the vectors and
* the text section.
*/
.text 0x40000:
{
_textbase = .;
text.start = .;
/* Entry point is the .entry section */
*(.entry)
*(.entry2)
/* Actual Code */
*(.text*)
*(.rodata*)
*(.rodata1)
/*
* Special FreeBSD sysctl sections.
*/
. = ALIGN (16);
__start_set_sysctl_set = .;
*(set_sysctl_*);
__stop_set_sysctl_set = ABSOLUTE(.);
*(set_domain_*);
*(set_pseudo_*);
/* C++ constructors/destructors */
*(.gnu.linkonce.t*)
/* Initialization and finalization code.
*
* Various files can provide initialization and finalization functions.
* The bodies of these functions are in .init and .fini sections. We
* accumulate the bodies here, and prepend function prologues from
* ecrti.o and function epilogues from ecrtn.o. ecrti.o must be linked
* first; ecrtn.o must be linked last. Because these are wildcards, it
* doesn't matter if the user does not actually link against ecrti.o and
* ecrtn.o; the linker won't look for a file to match a wildcard. The
* wildcard also means that it doesn't matter which directory ecrti.o
* and ecrtn.o are in.
*/
PROVIDE (_init = .);
*ecrti.o(.init)
*(.init)
*ecrtn.o(.init)
PROVIDE (_fini = .);
*ecrti.o(.fini)
*(.fini)
*ecrtn.o(.init)
/*
* C++ constructors and destructors for static objects.
* PowerPC EABI does not use crtstuff yet, so we build "old-style"
* constructor and destructor lists that begin with the list lenght
* end terminate with a NULL entry.
*/
PROVIDE (__CTOR_LIST__ = .);
/* LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) */
*crtbegin.o(.ctors)
*(.ctors)
*crtend.o(.ctors)
LONG(0)
PROVIDE (__CTOR_END__ = .);
PROVIDE (__DTOR_LIST__ = .);
/* LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) */
*crtbegin.o(.dtors)
*(.dtors)
*crtend.o(.dtors)
LONG(0)
PROVIDE (__DTOR_END__ = .);
/* Exception frame info */
*(.eh_frame)
/* Miscellaneous read-only data */
_rodata_start = . ;
*(.gnu.linkonce.r*)
*(.lit)
*(.shdata)
*(.rodata)
*(.rodata1)
*(.descriptors)
*(rom_ver)
_erodata = .;
/* Various possible names for the end of the .text section */
etext = ALIGN(0x10);
_etext = .;
_endtext = .;
text.end = .;
PROVIDE (etext = .);
PROVIDE (__etext = .);
} > ram
PROVIDE (__EXCEPT_START__ = .);
.gcc_except_table : { *(.gcc_except_table) } >ram
PROVIDE (__EXCEPT_END__ = .);
__GOT_START__ = .;
.got :
{
s.got = .;
*(.got.plt) *(.got)
} > ram
__GOT_END__ = .;
.got1 : { *(.got1) } >ram
PROVIDE (__GOT2_START__ = .);
PROVIDE (_GOT2_START_ = .);
.got2 : { *(.got2) } >ram
PROVIDE (__GOT2_END__ = .);
PROVIDE (_GOT2_END_ = .);
PROVIDE (__FIXUP_START__ = .);
PROVIDE (_FIXUP_START_ = .);
.fixup : { *(.fixup) } >ram
PROVIDE (_FIXUP_END_ = .);
PROVIDE (__FIXUP_END__ = .);
.rel.dyn : {
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
*(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
*(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
*(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
*(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
} >ram
.rela.dyn : {
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rela.ctors)
*(.rela.dtors)
*(.rela.got)
*(.rela.got1)
*(.rela.got2)
*(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
*(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
*(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
*(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
} >ram
PROVIDE (__SDATA2_START__ = .);
.sdata2 : { *(.sdata2) *(.gnu.linkonce.s2.*) } >ram
.sbss2 : { *(.sbss2) *(.gnu.linkonce.sb2.*) } >ram
PROVIDE (__SBSS2_END__ = .);
.sbss2 : { *(.sbss2) } >ram
PROVIDE (__SBSS2_END__ = .);
__SBSS_START__ = .;
.bss :
{
bss.start = .;
*(.bss .bss* .gnu.linkonce.b*)
*(.sbss*) *(COMMON)
. = ALIGN(4);
bss.end = .;
} > ram
__SBSS_END__ = .;
/* R/W Data */
.data ( . ) :
{
. = ALIGN (4);
data.start = .;
*(.data)
*(.data.rel.*)
*(.data1)
*(.data.* .gnu.linkonce.d.*)
PROVIDE (__SDATA_START__ = .);
*(.sdata*)
*(.gnu.linkonce.s.*)
data.end = .;
} > ram
data.size = data.end - data.start;
bss.size = bss.end - bss.start;
text.size = text.end - text.start;
PROVIDE(_bss_start = ADDR(.bss));
PROVIDE(_bss_size = SIZEOF(.bss));
PROVIDE(_data_start = ADDR(.data));
PROVIDE(_data_size = SIZEOF(.data));
PROVIDE(_text_start = ADDR(.text));
PROVIDE(_text_size = SIZEOF(.text));
PROVIDE(_end = data.end);
.gzipmalloc : {
. = ALIGN (16);
_startmalloc = .;
} >ram
/*
* Interrupt stack setup
*/
IntrStack_start = ALIGN(0x10);
. += 0x4000;
intrStack = .;
PROVIDE(intrStackPtr = intrStack);
_WorkspaceBase = .;
__WorkspaceBase = .;
. += WorkSpaceSize;
_RamDiskBase = .;
__RamDiskBase = .;
. += RamDiskSize;
_RamDiskEnd = .;
__RamDiskEnd = .;
PROVIDE( _RamDiskSize = _RamDiskEnd - _RamDiskBase );
_HeapStart = .;
__HeapStart = .;
. += HeapSize;
_HeapEnd = .;
__HeapEnd = .;
clear_end = .;
/* Sections for compressed .text and .data */
/* after the .datarom section is an int specifying */
/* the length of the following compressed image */
/* Executes once then could get overwritten */
.textrom 0x100000 :
{
*(.textrom)
_endloader = .;
} > ram
.datarom :
{
_dr_start = .;
*(.datarom)
_dr_end = .;
} > ram
dr_len = _dr_end - _dr_start;
mpc5200_regs :
{
MBAR = .;
mpc5200 = .;
_mpc5200 = .;
. += (0x6000);
} > mpc5200_regs
/* the reset vector is at 0xfff00000 which is */
/* located at offset 0x400000 from the base */
/* of flash */
.bootrom 0xFFE00000 :
{
*(.bootrom)
_endboot = .;
} > flash
.line 0 : { *(.line) }
.debug 0 : { *(.debug) }
.debug_sfnames 0 : { *(.debug_sfnames) }
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_aranges 0 : { *(.debug_aranges) }
.debug_aregion 0 : { *(.debug_aregion) }
.debug_macinfo 0 : { *(.debug_macinfo) }
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
}

View File

@@ -66,6 +66,7 @@
/***********************************************************************/
#include <rtems/asm.h>
#include <bspopts.h>
#include <rtems/score/cpu.h>
#include "vectors.h"
@@ -197,6 +198,7 @@ SYM (push_normalized_frame):
SYNC
rfi
#if !defined(ep5200)
.section .vectors,"awx",@progbits
PUBLIC_VAR (__vectors)
@@ -261,4 +263,4 @@ __vecf: b __vecf
.rep 63+1024
.long 0x04000400
.endr
#endif