Compare commits

...

8 Commits

Author SHA1 Message Date
wdenk
13122b4f1d Adjust LWMON environment to current requirements 2002-12-28 15:55:42 +00:00
wdenk
288b3d7f5a * Switch LWMON board default config from FRAM to EEPROM;
in POST, EEPROM shows up on 8 addresses
2002-12-20 23:42:25 +00:00
wdenk
2f91a3d0f8 *** empty log message *** 2002-12-17 18:07:30 +00:00
wdenk
93f19cc0ed Prepare for release of version 0.2.0 2002-12-17 17:55:09 +00:00
wdenk
6aff3115b9 * Use 1-byte-read instead of -write for iprobe() function
Add i2c commands to PM826 config

* extend I2C POST code: check for list on known addresses
2002-12-17 01:51:00 +00:00
wdenk
228f29ac6e * Improve log buffer code; use "loglevel" to decide which messages
to log on the console, too (like in Linux); get rid of "logstart"
2002-12-08 09:53:23 +00:00
wdenk
7c7a23bd5a * Patch by Hans-Joerg Frieden, 06 Dec 2002
Fix misc problems with AmigaOne support

* Patch by Chris Hallinan, 3 Dec 2002:
  minor cleanup to the MPC8245 EPIC driver

* Patch by Pierre Aubert , 28 Nov 2002
  Add support for external (SIU) interrupts on MPC8xx

* Patch by Pierre Aubert , 28 Nov 2002
  Fix nested syscalls bug in standalone applications

* Patch by David Mller, 27 Nov 2002:
  fix output of "pciinfo" command for CardBus bridge devices.

* Fix bug in TQM8260 board detection - boards got stuck when board ID
  was not readable
2002-12-07 00:20:59 +00:00
wdenk
1f53a41603 Add LED indication for IDE activity on KUP4K board 2002-12-04 23:39:58 +00:00
59 changed files with 2113 additions and 629 deletions

View File

@@ -1,7 +1,45 @@
======================================================================
Changes since for U-Boot 0.1.0:
Changes since U-Boot 0.2.0:
======================================================================
* Switch LWMON board default config from FRAM to EEPROM;
in POST, EEPROM shows up on 8 addresses
======================================================================
Changes for U-Boot 0.2.0:
======================================================================
* Use 1-byte-read instead of -write for iprobe() function
Add i2c commands to PM826 config
* extend I2C POST code: check for list on known addresses
* Improve log buffer code; use "loglevel" to decide which messages
to log on the console, too (like in Linux); get rid of "logstart"
* Add command line tool to access the U-Boot's environment
(board-specific for TRAB now, to be fixed later)
* Patch by Hans-Joerg Frieden, 06 Dec 2002
Fix misc problems with AmigaOne support
* Patch by Chris Hallinan, 3 Dec 2002:
minor cleanup to the MPC8245 EPIC driver
* Patch by Pierre Aubert , 28 Nov 2002
Add support for external (SIU) interrupts on MPC8xx
* Patch by Pierre Aubert , 28 Nov 2002
Fix nested syscalls bug in standalone applications
* Patch by David Müller, 27 Nov 2002:
fix output of "pciinfo" command for CardBus bridge devices.
* Fix bug in TQM8260 board detection - boards got stuck when board ID
was not readable
* Add LED indication for IDE activity on KUP4K board
* Fix startup problems with VFD display on TRAB
* Patch by Pierre Aubert, 20 Nov 2002

View File

@@ -658,6 +658,7 @@ clean:
rm -f tools/img2srec tools/mkimage tools/envcrc tools/gen_eth_addr
rm -f tools/easylogo/easylogo tools/bmp_logo
rm -f tools/gdb/astest tools/gdb/gdbcont tools/gdb/gdbsend
rm -f tools/env/fw_printenv tools/env/fw_setenv
clobber: clean
find . -type f \
@@ -667,7 +668,7 @@ clobber: clean
rm -f $(OBJS) *.bak tags TAGS
rm -fr *.*~
rm -f u-boot u-boot.bin u-boot.elf u-boot.srec u-boot.map System.map
rm -f tools/crc32.c tools/environment.c
rm -f tools/crc32.c tools/environment.c tools/env/crc32.c
rm -f include/asm/arch include/asm
mrproper \

18
README
View File

@@ -104,6 +104,18 @@ the string "u_boot" or on "U_BOOT". Example:
IH_OS_U_BOOT u_boot_hush_start
Versioning:
===========
U-Boot uses a 3 level version number containing a version, a
sub-version, and a patchlevel: "U-Boot-2.34.5" means version "2",
sub-version "34", and patchlevel "4".
The patchlevel is used to indicate certain stages of development
between released versions, i. e. officially released versions of
U-Boot will always have a patchlevel of "0".
Directory Hierarchy:
====================
@@ -2633,7 +2645,7 @@ U-Boot Porting Guide:
----------------------
[Based on messages by Jerry Van Baren in the U-Boot-Users mailing
list, Octover 2002]
list, October 2002]
int main (int argc, char *argv[])
@@ -2650,6 +2662,8 @@ int main (int argc, char *argv[])
Download latest U-Boot source;
Subscribe to u-boot-users mailing list;
if (clueless) {
email ("Hi, I am new to U-Boot, how do I get started?");
}
@@ -2668,6 +2682,8 @@ int main (int argc, char *argv[])
Create your own board support subdirectory;
Create your own board config file;
while (!running) {
do {
Add / modify source code;

View File

@@ -76,9 +76,8 @@ __asm(" .globl send_kb \n
int checkboard (void)
{
printf ("AmigaOneG3SE\n");
return 1;
printf ("Board: AmigaOneG3SE\n");
return 0;
}
long initdram (int board_type)
@@ -88,9 +87,9 @@ long initdram (int board_type)
void after_reloc (ulong dest_addr)
void after_reloc (ulong dest_addr, gd_t *gd)
{
DECLARE_GLOBAL_DATA_PTR;
/* HJF: DECLARE_GLOBAL_DATA_PTR; */
board_init_r (gd, dest_addr);
}

View File

@@ -35,13 +35,16 @@ AOBJS = board_asm_init.o memio.o
OBJS = $(COBJS) $(AOBJS)
## FIXME !!!
# EMUOBJS = ../bios_emulator/scitech/src/x86emu/*.o
EMUDIR = ../bios_emulator/scitech/src/x86emu/
EMUOBJ = $(EMUDIR)decode.o $(EMUDIR)ops2.o $(EMUDIR)fpu.o $(EMUDIR)prim_ops.o \
$(EMUDIR)ops.o $(EMUDIR)sys.o
EMUSRC = $(EMUOBJ:.o=.c)
$(LIB): .depend $(OBJS) $(EMUOBJS)
$(LIB): .depend $(OBJS) $(EMUSRC)
make libx86emu.a -C ../bios_emulator/scitech/src/x86emu -f makefile.uboot CROSS_COMPILE=$(CROSS_COMPILE)
-rm $(LIB)
$(AR) crv $@ $(OBJS) $(EMUOBJS)
$(AR) crv $@ $(OBJS) $(EMUOBJ)
#########################################################################

View File

@@ -82,8 +82,9 @@ static inline unsigned short NSto10PS (unsigned char spd_byte)
long detect_sdram (uint8 * rom, int dimmNum, struct dimm_bank *banks)
{
DECLARE_GLOBAL_DATA_PTR;
int dimm_address = (dimmNum == 0) ? SM_DIMM0_ADDR : SM_DIMM1_ADDR;
uint32 busclock = get_bus_freq (0);
uint32 busclock = gd->bus_clk;
uint32 memclock = busclock;
uint32 tmemclock = 1000000000 / (memclock / 100);
uint32 datawidth;
@@ -404,7 +405,7 @@ long articiaS_ram_init (void)
uint32 total_ram = 0;
struct dimm_bank banks[4]; /* FIXME: Move to initram */
uint32 busclock = get_bus_freq (0);
uint32 busclock = gd->bus_clk;
uint32 memclock = busclock;
uint32 reg32;
uint32 refresh_clocks;

View File

@@ -26,7 +26,7 @@
#include "memio.h"
#include "articiaS.h"
//#define ARTICIA_PCI_DEBUG
#undef ARTICIA_PCI_DEBUG
#ifdef ARTICIA_PCI_DEBUG
#define PRINTF(fmt,args...) printf (fmt ,##args)
@@ -512,7 +512,11 @@ int articiaS_init_vga (void)
PRINTF("Searching for class 0x%x on bus %d\n", classes[classnr], busnr);
/* Find the first of this class on this bus */
dev = pci_hose_find_class(&articiaS_hose, busnr, classes[classnr], 0);
if (dev != ~0) break;
if (dev != ~0)
{
PRINTF("Found VGA Card at %02x:%02x:%02x\n", PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev));
break;
}
busnr++;
if (busnr > articiaS_hose.last_busno)
{
@@ -552,7 +556,7 @@ int articiaS_init_vga (void)
/*
* Now try to run the bios
*/
PRINTF("Trying to run bios now\n");
if (execute_bios(dev, gd->relocaddr))
{
printf("OK\n");

View File

@@ -29,5 +29,5 @@ X86EMU = -I../bios_emulator/scitech/include -I../bios_emulator/scitech/src/x86e
TEXT_BASE = 0xfff00000
PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -Wa,-mregnames -DEASTEREGG $(X86EMU) #-DDEBUG
PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -Wa,-mregnames -DEASTEREGG $(X86EMU) -Dprintk=printf #-DDEBUG

View File

@@ -474,13 +474,13 @@ void video_easteregg(void)
}
#endif
extern bd_t *bd_global;
extern block_dev_desc_t * ide_get_dev(int dev);
extern char version_string[];
void video_banner(void)
{
block_dev_desc_t *ide;
DECLARE_GLOBAL_DATA_PTR;
int i;
char *s;
int maxdev;
@@ -513,8 +513,8 @@ void video_banner(void)
video_clear();
printf("%s\n\nCPU: ", version_string);
checkcpu();
printf("DRAM: %ld MB\n", bd_global->bi_memsize/(1024*1024));
printf("FSB: %ld MHz\n", bd_global->bi_busfreq/1000000);
printf("DRAM: %ld MB\n", gd->bd->bi_memsize/(1024*1024));
printf("FSB: %ld MHz\n", gd->bd->bi_busfreq/1000000);
printf("\n---- Disk summary ----\n");
for (i = 0; i < maxdev; i++)

View File

@@ -271,9 +271,9 @@ int attempt_map_rom(pci_dev_t dev, void *copy_address)
pci_write_config_dword(dev, PCI_ROM_ADDRESS, 0);
pci_write_config_dword(dev, i, bar_backup);
/* FIXME: */
bat_map(2, 0x80000000, 256*1024*1024);
show_bat_mapping();
/* FIXME: Shouldn't be needed anymore*/
/* bat_map(2, 0x80000000, 256*1024*1024);
show_bat_mapping(); */
/*
* Since most cards can probably only do 16 bit IO addressing, we
@@ -436,7 +436,6 @@ int find_image(u32 rom_address, u32 rom_size, void **image, u32 *image_size)
void show_bat_mapping(void)
{
#ifdef DEBUG
u32 dbat0u, dbat0l, ibat0u, ibat0l;
u32 dbat1u, dbat1l, ibat1u, ibat1l;
u32 dbat2u, dbat2l, ibat2u, ibat2l;
@@ -477,7 +476,6 @@ void show_bat_mapping(void)
dbat3u, dbat3l, ibat3u, ibat3l);
printf("\nMSR: %08x HID0: %08x L2CR: %08x \n", msr,hid0, l2cr_reg);
#endif
}
@@ -485,44 +483,34 @@ void show_bat_mapping(void)
void remove_init_data(void)
{
char *s;
u32 batl = ((CFG_SDRAM_BASE+0x100000) | BATL_PP_RW);
u32 batu =((CFG_SDRAM_BASE+0x100000) | BATU_BL_256M | BATU_VS | BATU_VP);
#if 0 /* already done in board_init_r() */
void *data = (void *)(CFG_INIT_RAM_ADDR+CFG_INIT_DATA_OFFSET);
unsigned char data2[CFG_INIT_DATA_SIZE];
/* Make a copy of the data */
memcpy(data2, data, CFG_INIT_DATA_SIZE);
#endif /* 0 */
/* Invalidate and disable data cache */
invalidate_l1_data_cache();
dcache_disable();
#if 0
/* Copy to the real RAM address */
memcpy(data, data2, CFG_INIT_DATA_SIZE);
#endif
/*printf("Before ICache enable\n");
show_bat_mapping();*/
__asm volatile ("isync \n"
"mtdbatu 2,%2 \n"
"mtdbatl 2,%2 \n"
"mtdbatu 1,%0 \n"
"mtdbatl 1,%1 \n"
"sync \n"
"isync \n"
: : "r" (batu), "r" (batl), "r" (0));
/* show_bat_mapping(); */
s = getenv("x86_cache");
if (!s || (s && strcmp(s, "on")==0))
if (!s)
{
icache_enable();
dcache_enable();
}
else if (s)
{
if (strcmp(s, "dcache")==0)
{
dcache_enable();
}
else if (strcmp(s, "icache") == 0)
{
icache_enable();
}
else if (strcmp(s, "on")== 0 || strcmp(s, "both") == 0)
{
dcache_enable();
icache_enable();
}
}
/* show_bat_mapping();*/
}

View File

@@ -0,0 +1,80 @@
#############################################################################
#
# Realmode X86 Emulator Library
#
# Copyright (C) 1996-1999 SciTech Software, Inc.
#
# ========================================================================
#
# Permission to use, copy, modify, distribute, and sell this software and
# its documentation for any purpose is hereby granted without fee,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of the authors not be used
# in advertising or publicity pertaining to distribution of the software
# without specific, written prior permission. The authors makes no
# representations about the suitability of this software for any purpose.
# It is provided "as is" without express or implied warranty.
#
# THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
# EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# ========================================================================
#
# Descripton: Linux specific makefile for the x86emu library.
#
#############################################################################
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar
TARGETLIB = libx86emu.a
TARGETDEBUGLIB =libx86emud.a
OBJS=\
decode.o \
fpu.o \
ops.o \
ops2.o \
prim_ops.o \
sys.o
DEBUGOBJS=debug.d \
decode.d \
fpu.d \
ops.d \
ops2.d \
prim_ops.d \
sys.d
.SUFFIXES: .d
all: $(TARGETLIB) $(TARGETDEBUGLIB)
$(TARGETLIB): $(OBJS)
$(AR) rv $(TARGETLIB) $(OBJS)
$(TARGETDEBUGLIB): $(DEBUGOBJS)
$(AR) rv $(TARGETDEBUGLIB) $(DEBUGOBJS)
INCS = -I. -Ix86emu -I../../include
CFLAGS = -D__DRIVER__ -DFORCE_POST -D_CEXPORT= -DNO_LONG_LONG -Dprintk=printf -fsigned-char -fomit-frame-pointer -mrelocatable -ffixed-r14 -meabi -mrelocatable -ffixed-r14 -meabi
CDEBUGFLAGS = -DDEBUG
.c.o:
$(CC) -g -O2 -Wall -c $(CFLAGS) $(INCS) $*.c
.c.d:
$(CC) -g -O2 -Wall -c -o$*.d $(CFLAGS) $(CDEBUGFLAGS) $(INCS) $*.c
.cpp.o:
$(CC) -c $(CFLAGS) $(INCS) $*.cpp
clean:
rm -f *.a *.o *.d
validate: validate.o libx86emu.a
$(CC) -o validate validate.o -lx86emu -L.

View File

@@ -398,9 +398,7 @@ int execute_bios(pci_dev_t gr_dev, void *reloc_addr)
u8 cfg;
int i;
char c;
#ifdef DEBUG
char *s;
#endif
#ifdef EASTEREGG
int easteregg_active = 0;
#endif
@@ -409,6 +407,7 @@ int execute_bios(pci_dev_t gr_dev, void *reloc_addr)
unsigned char *msg;
unsigned char current_attr;
PRINTF("Trying to remove init data\n");
remove_init_data();
PRINTF("Removed init data from cache, now in RAM\n");
@@ -438,7 +437,7 @@ int execute_bios(pci_dev_t gr_dev, void *reloc_addr)
return 0;
}
#ifdef DEBUG
#if 1 /*def DEBUG*/
s = getenv("x86_ask_start");
if (s)
{
@@ -646,7 +645,7 @@ int execute_bios(pci_dev_t gr_dev, void *reloc_addr)
if (getenv("x86_do_inout")) do_inout();
#endif
dcache_disable();
//FIXME: dcache_disable();
return 1;
}

View File

@@ -2,7 +2,7 @@
#include <command.h>
#include <cmd_menu.h>
int do_menu( cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[] )
int do_menu( cmd_tbl_t *cmdtp, /*bd_t *bd,*/ int flag, int argc, char *argv[] )
{
// printf("<NOT YET IMPLEMENTED>\n");
return 0;

View File

@@ -56,11 +56,13 @@ SECTIONS
/* WARNING - the following is hand-optimized to fit within */
/* the sector layout of our flash chips! XXX FIXME XXX */
cpu/mpc8xx/start.o (.text)
common/dlmalloc.o (.text)
lib_ppc/ppcstring.o (.text)
cpu/mpc8xx/interrupts.o (.text)
cpu/mpc8xx/start.o (.text)
common/dlmalloc.o (.text)
cpu/mpc8xx/interrupts.o (.text)
lib_ppc/time.o (.text)
lib_ppc/ticks.o (.text)
lib_ppc/cache.o (.text)
lib_generic/crc32.o (.text)
. = env_offset;
common/environment.o(.text)

View File

@@ -288,12 +288,22 @@ int misc_init_r (void)
{
DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_STATUS_LED
volatile immap_t *immap = (immap_t *)CFG_IMMR;
#endif
#ifdef CONFIG_KUP4K_LOGO
bd_t *bd = gd->bd;
lcd_logo(bd);
#endif /* CONFIG_KUP4K_LOGO */
#ifdef CONFIG_IDE_LED
/* Configure PA8 as output port */
immap->im_ioport.iop_padir |= 0x80;
immap->im_ioport.iop_paodr |= 0x80;
immap->im_ioport.iop_papar &= ~0x80;
immap->im_ioport.iop_padat |= 0x80; /* turn it off */
#endif
return(0);
}
@@ -422,3 +432,15 @@ void lcd_logo(bd_t *bd){
}
#endif /* CONFIG_KUP4K_LOGO */
#ifdef CONFIG_IDE_LED
void ide_led (uchar led, uchar status)
{
volatile immap_t *immap = (immap_t *)CFG_IMMR;
/* We have one led for both pcmcia slots */
if (status) { /* led on */
immap->im_ioport.iop_padat &= ~0x80;
} else {
immap->im_ioport.iop_padat |= 0x80;
}
}
#endif

View File

@@ -202,7 +202,7 @@ int checkboard (void)
if (!i || strncmp (str, "TQM8260", 7)) {
puts ("### No HW ID - assuming TQM8260\n");
return (1);
return (0);
}
puts (str);

View File

@@ -344,7 +344,7 @@ int drv_vfd_init(void)
DECLARE_GLOBAL_DATA_PTR;
if (vfd_init_done != 0)
return;
return (0);
vfd_init_done = 1;
vfdbase = gd->fb_base;

View File

@@ -51,6 +51,10 @@
#include <asm/cache.h>
#endif
#ifdef CONFIG_LOGBUFFER
#include <logbuff.h>
#endif
/*
* Some systems (for example LWMON) have very short watchdog periods;
* we must make sure to split long operations like memmove() or
@@ -357,19 +361,16 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
* turning the "load high" feature off. This is intentional.
*/
initrd_high = simple_strtoul(s, NULL, 16);
} else { /* not set, no restrictions to load high */
} else { /* not set, no restrictions to load high */
initrd_high = ~0;
}
#ifdef CONFIG_LOGBUFFER
kbd=gd->bd;
if ((s = getenv ("logstart")) != NULL) {
kbd->bi_sramstart = simple_strtoul(s, NULL, 16);
/* Prevent initrd from overwriting logbuffer */
if (initrd_high < kbd->bi_sramstart)
initrd_high = kbd->bi_sramstart-1024;
}
debug ("## Logbuffer at 0x%08lX ", kbd->bi_sramstart);
/* Prevent initrd from overwriting logbuffer */
if (initrd_high < (kbd->bi_memsize-LOGBUFF_LEN-LOGBUFF_OVERHEAD))
initrd_high = kbd->bi_memsize-LOGBUFF_LEN-LOGBUFF_OVERHEAD;
debug ("## Logbuffer at 0x%08lX ", kbd->bi_memsize-LOGBUFF_LEN);
#endif
/*

View File

@@ -132,8 +132,12 @@ static block_dev_desc_t ide_dev_desc[CFG_IDE_MAXDEVICE];
/* ------------------------------------------------------------------------- */
#ifdef CONFIG_IDE_LED
#ifndef CONFIG_KUP4K
static void ide_led (uchar led, uchar status);
#else
extern void ide_led (uchar led, uchar status);
#endif
#else
#ifndef CONFIG_AMIGAONEG3SE
#define ide_led(a,b) /* dummy */
#else
@@ -1347,7 +1351,7 @@ static void ide_reset (void)
/* ------------------------------------------------------------------------- */
#if defined(CONFIG_IDE_LED) && !defined(CONFIG_AMIGAONEG3SE)
#if defined(CONFIG_IDE_LED) && !defined(CONFIG_AMIGAONEG3SE) && !defined(CONFIG_KUP4K)
static uchar led_buffer = 0; /* Buffer for current LED status */

View File

@@ -2,6 +2,9 @@
* (C) Copyright 2002
* Detlev Zundel, DENX Software Engineering, dzu@denx.de.
*
* Code used from linux/kernel/printk.c
* Copyright (C) 1991, 1992 Linus Torvalds
*
* See file CREDITS for list of people who contributed to this
* project.
*
@@ -19,6 +22,18 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* Comments:
*
* After relocating the code, the environment variable "loglevel" is
* copied to console_loglevel. The functionality is similar to the
* handling in the Linux kernel, i.e. messages logged with a priority
* less than console_loglevel are also output to stdout.
*
* If you want messages with the default level (e.g. POST messages) to
* appear on stdout also, make sure the environment variable
* "loglevel" is set at boot time to a number higher than
* default_message_loglevel below.
*/
/*
@@ -28,13 +43,11 @@
#include <common.h>
#include <command.h>
#include <devices.h>
#include <post.h>
#include <logbuff.h>
#if defined(CONFIG_LOGBUFFER)
#define LOG_BUF_LEN (16384)
#define LOG_BUF_MASK (LOG_BUF_LEN-1)
/* Local prototypes */
static void logbuff_putc (const char c);
static void logbuff_puts (const char *s);
@@ -42,17 +55,44 @@ static int logbuff_printk(const char *line);
static char buf[1024];
/* This combination will not print messages with the default loglevel */
static unsigned console_loglevel = 3;
static unsigned default_message_loglevel = 4;
static unsigned long log_size;
static unsigned char *log_buf=NULL;
static unsigned long *ext_log_start, *ext_logged_chars;
static unsigned char *log_buf = NULL;
static unsigned long *ext_log_size;
static unsigned long *ext_log_start;
static unsigned long *ext_logged_chars;
#define log_size (*ext_log_size)
#define log_start (*ext_log_start)
#define logged_chars (*ext_logged_chars)
/* Forced by code, eh! */
#define LOGBUFF_MAGIC 0xc0de4ced
/* The mapping used here has to be the same as in setup_ext_logbuff ()
in linux/kernel/printk */
void logbuff_init_ptrs (void)
{
DECLARE_GLOBAL_DATA_PTR;
unsigned long *ext_tag;
char *s;
log_buf = (unsigned char *)(gd->bd->bi_memsize-LOGBUFF_LEN);
ext_tag = (unsigned long *)(log_buf)-4;
ext_log_start = (unsigned long *)(log_buf)-3;
ext_log_size = (unsigned long *)(log_buf)-2;
ext_logged_chars = (unsigned long *)(log_buf)-1;
if (*ext_tag!=LOGBUFF_MAGIC) {
logged_chars = log_size = log_start = 0;
*ext_tag = LOGBUFF_MAGIC;
}
/* Initialize default loglevel if present */
if ((s = getenv ("loglevel")) != NULL)
console_loglevel = (int)simple_strtoul (s, NULL, 10);
gd->post_log_word |= LOGBUFF_INITIALIZED;
}
int drv_logbuff_init (void)
{
device_t logdev;
@@ -75,45 +115,26 @@ int drv_logbuff_init (void)
static void logbuff_putc (const char c)
{
char buf[2];
buf[0]=c;
buf[1]='\0';
logbuff_printk(buf);
buf[0] = c;
buf[1] = '\0';
logbuff_printk (buf);
}
static void logbuff_puts (const char *s)
{
char buf[512];
sprintf(buf, "%s\n", s);
logbuff_printk(buf);
logbuff_printk (s);
}
void logbuff_log(char *msg)
{
DECLARE_GLOBAL_DATA_PTR;
if ((gd->flags & GD_FLG_RELOC)&&(getenv ("logstart") != NULL)) {
logbuff_printk(msg);
if ((gd->post_log_word & LOGBUFF_INITIALIZED)) {
logbuff_printk (msg);
} else {
puts(msg);
}
}
void logbuff_reset (void)
{
char *s;
unsigned long *ext_tag;
if ((s = getenv ("logstart")) != NULL) {
log_buf = (unsigned char *)simple_strtoul(s, NULL, 16);
ext_tag=(unsigned long *)(log_buf)-3;
ext_log_start=(unsigned long *)(log_buf)-2;
ext_logged_chars=(unsigned long *)(log_buf)-1;
/* if (*ext_tag!=LOGBUFF_MAGIC) { */
logged_chars=log_start=0;
*ext_tag=LOGBUFF_MAGIC;
/* } */
log_size=logged_chars;
/* Can happen only for pre-relocated errors as logging */
/* at that stage should be disabled */
puts (msg);
}
}
@@ -132,34 +153,39 @@ int do_log (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
char *s;
unsigned long i;
if (log_buf==NULL) {
printf ("No logbuffer defined! Set 'logstart' to use this feature.\n");
return 1;
if (strcmp(argv[1],"append") == 0) {
/* Log concatenation of all arguments separated by spaces */
for (i=2; i<argc; i++) {
if (i<argc-1) {
logbuff_printk (argv[i]);
logbuff_putc (' ');
} else {
logbuff_puts (argv[i]);
}
}
return 0;
}
switch (argc) {
case 2:
if (strcmp(argv[1],"show") == 0) {
for (i=0; i<logged_chars; i++) {
s=log_buf+((log_start+i)&LOG_BUF_MASK);
putc(*s);
for (i=0; i < (log_size&LOGBUFF_MASK); i++) {
s = log_buf+((log_start+i)&LOGBUFF_MASK);
putc (*s);
}
return 0;
} else if (strcmp(argv[1],"reset") == 0) {
log_start=0;
logged_chars=0;
log_size=0;
log_start = 0;
log_size = 0;
logged_chars = 0;
return 0;
}
printf ("Usage:\n%s\n", cmdtp->usage);
return 1;
case 3:
if (strcmp(argv[1],"append") == 0) {
logbuff_puts(argv[2]);
} else if (strcmp(argv[1],"info") == 0) {
printf ("Logbuffer at %08lx\n", (unsigned long)log_buf);
printf ("log_start = %08lx\n", log_start);
printf ("log_size = %08lx\n", log_size);
printf ("logged_chars = %08lx\n", logged_chars);
return 0;
}
printf ("Usage:\n%s\n", cmdtp->usage);
return 1;
@@ -177,8 +203,8 @@ static int logbuff_printk(const char *line)
int line_feed;
static signed char msg_level = -1;
strcpy(buf + 3, line);
i = strlen(line);
strcpy (buf + 3, line);
i = strlen (line);
buf_end = buf + 3 + i;
for (p = buf + 3; p < buf_end; p++) {
msg = p;
@@ -199,8 +225,8 @@ static int logbuff_printk(const char *line)
}
line_feed = 0;
for (; p < buf_end; p++) {
log_buf[(log_start+log_size) & LOG_BUF_MASK] = *p;
if (log_size < LOG_BUF_LEN)
log_buf[(log_start+log_size) & LOGBUFF_MASK] = *p;
if (log_size < LOGBUFF_LEN)
log_size++;
else
log_start++;

View File

@@ -205,9 +205,27 @@ void pci_header_show(pci_dev_t dev)
PRINT (" header type = 0x%.2x\n", byte, PCI_HEADER_TYPE);
PRINT (" BIST = 0x%.2x\n", byte, PCI_BIST);
PRINT (" base address 0 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_0);
PRINT (" base address 1 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_1);
if (header_type & 0x01) { /* PCI-to-PCI bridge */
switch (header_type & 0x03) {
case PCI_HEADER_TYPE_NORMAL: /* "normal" PCI device */
PRINT (" base address 1 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_1);
PRINT (" base address 2 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_2);
PRINT (" base address 3 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_3);
PRINT (" base address 4 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_4);
PRINT (" base address 5 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_5);
PRINT (" cardBus CIS pointer = 0x%.8x\n", dword, PCI_CARDBUS_CIS);
PRINT (" sub system vendor ID = 0x%.4x\n", word, PCI_SUBSYSTEM_VENDOR_ID);
PRINT (" sub system ID = 0x%.4x\n", word, PCI_SUBSYSTEM_ID);
PRINT (" expansion ROM base address = 0x%.8x\n", dword, PCI_ROM_ADDRESS);
PRINT (" interrupt line = 0x%.2x\n", byte, PCI_INTERRUPT_LINE);
PRINT (" interrupt pin = 0x%.2x\n", byte, PCI_INTERRUPT_PIN);
PRINT (" min Grant = 0x%.2x\n", byte, PCI_MIN_GNT);
PRINT (" max Latency = 0x%.2x\n", byte, PCI_MAX_LAT);
break;
case PCI_HEADER_TYPE_BRIDGE: /* PCI-to-PCI bridge */
PRINT (" base address 1 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_1);
PRINT (" primary bus number = 0x%.2x\n", byte, PCI_PRIMARY_BUS);
PRINT (" secondary bus number = 0x%.2x\n", byte, PCI_SECONDARY_BUS);
PRINT (" subordinate bus number = 0x%.2x\n", byte, PCI_SUBORDINATE_BUS);
@@ -227,19 +245,39 @@ void pci_header_show(pci_dev_t dev)
PRINT (" interrupt line = 0x%.2x\n", byte, PCI_INTERRUPT_LINE);
PRINT (" interrupt pin = 0x%.2x\n", byte, PCI_INTERRUPT_PIN);
PRINT (" bridge control = 0x%.4x\n", word, PCI_BRIDGE_CONTROL);
} else { /* PCI device */
PRINT(" base address 2 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_2);
PRINT(" base address 3 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_3);
PRINT(" base address 4 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_4);
PRINT(" base address 5 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_5);
PRINT(" cardBus CIS pointer = 0x%.8x\n", dword, PCI_CARDBUS_CIS);
PRINT(" sub system vendor ID = 0x%.4x\n", word, PCI_SUBSYSTEM_VENDOR_ID);
PRINT(" sub system ID = 0x%.4x\n", word, PCI_SUBSYSTEM_ID);
PRINT(" expansion ROM base address = 0x%.8x\n", dword, PCI_ROM_ADDRESS);
PRINT(" interrupt line = 0x%.2x\n", byte, PCI_INTERRUPT_LINE);
PRINT(" interrupt pin = 0x%.2x\n", byte, PCI_INTERRUPT_PIN);
PRINT(" min Grant = 0x%.2x\n", byte, PCI_MIN_GNT);
PRINT(" max Latency = 0x%.2x\n", byte, PCI_MAX_LAT);
break;
case PCI_HEADER_TYPE_CARDBUS: /* PCI-to-CardBus bridge */
PRINT (" capabilities = 0x%.2x\n", byte, PCI_CB_CAPABILITY_LIST);
PRINT (" secondary status = 0x%.4x\n", word, PCI_CB_SEC_STATUS);
PRINT (" primary bus number = 0x%.2x\n", byte, PCI_CB_PRIMARY_BUS);
PRINT (" CardBus number = 0x%.2x\n", byte, PCI_CB_CARD_BUS);
PRINT (" subordinate bus number = 0x%.2x\n", byte, PCI_CB_SUBORDINATE_BUS);
PRINT (" CardBus latency timer = 0x%.2x\n", byte, PCI_CB_LATENCY_TIMER);
PRINT (" CardBus memory base 0 = 0x%.8x\n", dword, PCI_CB_MEMORY_BASE_0);
PRINT (" CardBus memory limit 0 = 0x%.8x\n", dword, PCI_CB_MEMORY_LIMIT_0);
PRINT (" CardBus memory base 1 = 0x%.8x\n", dword, PCI_CB_MEMORY_BASE_1);
PRINT (" CardBus memory limit 1 = 0x%.8x\n", dword, PCI_CB_MEMORY_LIMIT_1);
PRINT (" CardBus IO base 0 = 0x%.4x\n", word, PCI_CB_IO_BASE_0);
PRINT (" CardBus IO base high 0 = 0x%.4x\n", word, PCI_CB_IO_BASE_0_HI);
PRINT (" CardBus IO limit 0 = 0x%.4x\n", word, PCI_CB_IO_LIMIT_0);
PRINT (" CardBus IO limit high 0 = 0x%.4x\n", word, PCI_CB_IO_LIMIT_0_HI);
PRINT (" CardBus IO base 1 = 0x%.4x\n", word, PCI_CB_IO_BASE_1);
PRINT (" CardBus IO base high 1 = 0x%.4x\n", word, PCI_CB_IO_BASE_1_HI);
PRINT (" CardBus IO limit 1 = 0x%.4x\n", word, PCI_CB_IO_LIMIT_1);
PRINT (" CardBus IO limit high 1 = 0x%.4x\n", word, PCI_CB_IO_LIMIT_1_HI);
PRINT (" interrupt line = 0x%.2x\n", byte, PCI_INTERRUPT_LINE);
PRINT (" interrupt pin = 0x%.2x\n", byte, PCI_INTERRUPT_PIN);
PRINT (" bridge control = 0x%.4x\n", word, PCI_CB_BRIDGE_CONTROL);
PRINT (" subvendor ID = 0x%.4x\n", word, PCI_CB_SUBSYSTEM_VENDOR_ID);
PRINT (" subdevice ID = 0x%.4x\n", word, PCI_CB_SUBSYSTEM_ID);
PRINT (" PC Card 16bit base address = 0x%.8x\n", dword, PCI_CB_LEGACY_MODE_BASE);
break;
default:
printf("unknown header\n");
break;
}
#undef PRINT

View File

@@ -88,7 +88,7 @@ static u_int m8xx_get_graycode(u_int size);
static u_int m8xx_get_speed(u_int ns, u_int is_io);
#endif
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* look up table for pgcrx registers */
@@ -101,7 +101,7 @@ static u_int *pcmcia_pgcrx[2] = {
const char *indent = "\t ";
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
@@ -126,7 +126,7 @@ int do_pinit (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
}
#endif /* CFG_CMD_PCMCIA */
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_LWMON)
# define CFG_PCMCIA_TIMING (PCMCIA_SHT(9) | PCMCIA_SST(3) | PCMCIA_SL(12))
@@ -185,7 +185,7 @@ int pcmcia_on (void)
break;
}
case 6:
case 2: { /* map I/O window for command/ctrl reg block */
case 2: { /* map I/O window for cmd/ctrl reg block */
win->or = ( PCMCIA_BSIZE_1K
| PCMCIA_PPS_8
| PCMCIA_PRS_IO
@@ -206,15 +206,15 @@ int pcmcia_on (void)
++win;
}
for (i = 0, rc = 0, slot = _slot_; i < PCMCIA_SOCKETS_NO; i++, slot = !slot) {
for (i=0, rc=0, slot=_slot_; i<PCMCIA_SOCKETS_NO; i++, slot = !slot) {
/* turn off voltage */
if ((rc = voltage_set(slot, 0, 0)))
continue;
/* Enable external hardware */
if ((rc = hardware_enable(slot)))
continue;
#ifdef CONFIG_IDE_8xx_PCCARD
if ((rc = check_ide_device(i)))
continue;
@@ -223,7 +223,7 @@ int pcmcia_on (void)
return (rc);
}
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
@@ -261,7 +261,7 @@ static int pcmcia_off (void)
#endif /* CFG_CMD_PCMCIA */
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#ifdef CONFIG_IDE_8xx_PCCARD
@@ -280,8 +280,8 @@ static int check_ide_device (int slot)
int found = 0;
int i;
addr = (volatile uchar *)(CFG_PCMCIA_MEM_ADDR +
CFG_PCMCIA_MEM_SIZE * (slot * 4));
addr = (volatile uchar *)(CFG_PCMCIA_MEM_ADDR +
CFG_PCMCIA_MEM_SIZE * (slot * 4));
debug ("PCMCIA MEM: %08X\n", addr);
start = p = (volatile uchar *) addr;
@@ -354,17 +354,17 @@ static int check_ide_device (int slot)
}
#endif /* CONFIG_IDE_8xx_PCCARD */
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------- */
/* board specific stuff: */
/* voltage_set(), hardware_enable() and hardware_disable() */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* board specific stuff: */
/* voltage_set(), hardware_enable() and hardware_disable() */
/* -------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------- */
/* RPX Boards from Embedded Planet */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* RPX Boards from Embedded Planet */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_RPXCLASSIC) || defined(CONFIG_RPXLITE)
@@ -431,9 +431,9 @@ static int hardware_disable(int slot)
#endif /* CFG_CMD_PCMCIA */
#endif /* CONFIG_RPXCLASSIC */
/* ---------------------------------------------------------------------------- */
/* (F)ADS Boards from Motorola */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* (F)ADS Boards from Motorola */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_ADS) || defined(CONFIG_FADS)
@@ -509,9 +509,9 @@ static int hardware_disable(int slot)
#endif /* (F)ADS */
/* ---------------------------------------------------------------------------- */
/* TQM8xxL Boards by TQ Components */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* TQM8xxL Boards by TQ Components */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_TQM8xxL)
@@ -545,17 +545,14 @@ static int hardware_enable(int slot)
pcmp->pcmc_pscr = PCMCIA_MASK(_slot_);
pcmp->pcmc_per &= ~PCMCIA_MASK(_slot_);
/* disable interrupts & DMA */
PCMCIA_PGCRX(_slot_) = 0;
/*
* Disable PCMCIA buffers (isolate the interface)
* and assert RESET signal
* Disable interrupts, DMA, and PCMCIA buffers
* (isolate the interface) and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -597,7 +594,7 @@ static int hardware_enable(int slot)
immap->im_ioport.iop_pcdat |= 0x0002;
puts (" 3.3V card found: ");
}
immap->im_ioport.iop_pcdir |= (0x0002 | 0x0004);
immap->im_ioport.iop_pcdir |= (0x0002 | 0x0004);
#if 0
/* VCC switch error flag, PCMCIA slot INPACK_ pin */
cp->cp_pbdir &= ~(0x0020 | 0x0010);
@@ -635,11 +632,8 @@ static int hardware_disable(int slot)
/* remove all power */
immap->im_ioport.iop_pcdat &= ~(0x0002 | 0x0004);
/* Configure PCMCIA General Control Register */
PCMCIA_PGCRX(_slot_) = 0;
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
@@ -670,9 +664,9 @@ static int voltage_set(int slot, int vcc, int vpp)
* and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -701,7 +695,7 @@ static int voltage_set(int slot, int vcc, int vpp)
(pcmp->pcmc_pipr & 0x00008000) ? "only 5 V" : "can do 3.3V");
immap->im_ioport.iop_pcdat |= reg;
immap->im_ioport.iop_pcdir |= (0x0002 | 0x0004);
immap->im_ioport.iop_pcdir |= (0x0002 | 0x0004);
if (reg) {
debug ("PCMCIA powered at %sV\n",
(reg&0x0004) ? "5.0" : "3.3");
@@ -725,9 +719,9 @@ done:
#endif /* TQM8xxL */
/* ---------------------------------------------------------------------------- */
/* LWMON Board */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* LWMON Board */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_LWMON)
@@ -759,7 +753,7 @@ static int hardware_enable(int slot)
reg = pic_read (0x60);
debug ("[%d] PIC read: reg_60 = 0x%02x\n", __LINE__, reg);
reg &= ~0x10;
/* reg |= 0x08; Vpp not needed */
/* reg |= 0x08; Vpp not needed */
pic_write (0x60, reg);
#ifdef DEBUG
reg = pic_read (0x60);
@@ -782,17 +776,14 @@ static int hardware_enable(int slot)
pcmp->pcmc_pscr = PCMCIA_MASK(_slot_);
pcmp->pcmc_per &= ~PCMCIA_MASK(_slot_);
/* disable interrupts & DMA */
PCMCIA_PGCRX(_slot_) = 0;
/*
* Disable PCMCIA buffers (isolate the interface)
* and assert RESET signal
* Disable interrupts, DMA, and PCMCIA buffers
* (isolate the interface) and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -826,7 +817,7 @@ static int hardware_enable(int slot)
}
/* switch VCC on */
val |= MAX1604_OP_SUS | MAX1604_VCCBON;
val |= MAX1604_OP_SUS | MAX1604_VCCBON;
i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
i2c_write (CFG_I2C_POWER_A_ADDR, 0, 0, &val, 1);
@@ -866,10 +857,8 @@ static int hardware_disable(int slot)
i2c_write (CFG_I2C_POWER_A_ADDR, 0, 0, &val, 1);
/* Configure PCMCIA General Control Register */
PCMCIA_PGCRX(_slot_) = 0;
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
@@ -911,9 +900,9 @@ static int voltage_set(int slot, int vcc, int vpp)
* and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -962,81 +951,79 @@ done:
#endif /* LWMON */
/* ---------------------------------------------------------------------------- */
/* GTH board by Corelatus AB */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* GTH board by Corelatus AB */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_GTH)
#define PCMCIA_BOARD_MSG "GTH COMPACT FLASH"
static int voltage_set(int slot, int vcc, int vpp)
{ /* Do nothing */
return 0;
static int voltage_set (int slot, int vcc, int vpp)
{ /* Do nothing */
return 0;
}
static int hardware_enable (int slot)
{
volatile immap_t *immap;
volatile cpm8xx_t *cp;
volatile pcmconf8xx_t *pcmp;
volatile sysconf8xx_t *sysp;
uint reg, mask;
volatile immap_t *immap;
volatile cpm8xx_t *cp;
volatile pcmconf8xx_t *pcmp;
volatile sysconf8xx_t *sysp;
uint reg, mask;
debug ("hardware_enable: GTH Slot %c\n", 'A'+slot);
debug ("hardware_enable: GTH Slot %c\n", 'A' + slot);
immap = (immap_t *)CFG_IMMR;
sysp = (sysconf8xx_t *)(&(((immap_t *)CFG_IMMR)->im_siu_conf));
pcmp = (pcmconf8xx_t *)(&(((immap_t *)CFG_IMMR)->im_pcmcia));
cp = (cpm8xx_t *)(&(((immap_t *)CFG_IMMR)->im_cpm));
immap = (immap_t *) CFG_IMMR;
sysp = (sysconf8xx_t *) (&(((immap_t *) CFG_IMMR)->im_siu_conf));
pcmp = (pcmconf8xx_t *) (&(((immap_t *) CFG_IMMR)->im_pcmcia));
cp = (cpm8xx_t *) (&(((immap_t *) CFG_IMMR)->im_cpm));
/* clear interrupt state, and disable interrupts */
pcmp->pcmc_pscr = PCMCIA_MASK(_slot_);
pcmp->pcmc_per &= ~PCMCIA_MASK(_slot_);
/* clear interrupt state, and disable interrupts */
pcmp->pcmc_pscr = PCMCIA_MASK (_slot_);
pcmp->pcmc_per &= ~PCMCIA_MASK (_slot_);
/* disable interrupts & DMA */
PCMCIA_PGCRX(_slot_) = 0;
/*
* Disable interrupts, DMA, and PCMCIA buffers
* (isolate the interface) and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX (_slot_) = reg;
udelay (500);
/*
* Disable PCMCIA buffers (isolate the interface)
* and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
/*
* Make sure there is a card in the slot,
* then configure the interface.
*/
udelay (10000);
debug ("[%d] %s: PIPR(%p)=0x%x\n",
__LINE__, __FUNCTION__,
&(pcmp->pcmc_pipr), pcmp->pcmc_pipr);
if (pcmp->pcmc_pipr & 0x98000000) {
printf (" No Card found\n");
return (1);
}
/*
* Make sure there is a card in the slot, then configure the interface.
*/
udelay(10000);
debug ("[%d] %s: PIPR(%p)=0x%x\n",
__LINE__,__FUNCTION__,
&(pcmp->pcmc_pipr),pcmp->pcmc_pipr);
if (pcmp->pcmc_pipr & 0x98000000) {
printf (" No Card found\n");
return (1);
}
mask = PCMCIA_VS1 (slot) | PCMCIA_VS2 (slot);
reg = pcmp->pcmc_pipr;
debug ("PIPR: 0x%x ==> VS1=o%s, VS2=o%s\n",
reg,
(reg & PCMCIA_VS1 (slot)) ? "n" : "ff",
(reg & PCMCIA_VS2 (slot)) ? "n" : "ff");
mask = PCMCIA_VS1(slot) | PCMCIA_VS2(slot);
reg = pcmp->pcmc_pipr;
debug ("PIPR: 0x%x ==> VS1=o%s, VS2=o%s\n",
reg,
(reg&PCMCIA_VS1(slot))?"n":"ff",
(reg&PCMCIA_VS2(slot))?"n":"ff");
debug ("Enable PCMCIA buffers and stop RESET\n");
reg = PCMCIA_PGCRX (_slot_);
reg &= ~__MY_PCMCIA_GCRX_CXRESET; /* active high */
reg &= ~__MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX (_slot_) = reg;
debug ("Enable PCMCIA buffers and stop RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg &= ~__MY_PCMCIA_GCRX_CXRESET; /* active high */
reg &= ~__MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay (250000); /* some cards need >150 ms to come up :-( */
udelay(250000); /* some cards need >150 ms to come up :-( */
debug ("# hardware_enable done\n");
debug ("# hardware_enable done\n");
return 0;
return 0;
}
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
static int hardware_disable(int slot)
@@ -1046,9 +1033,9 @@ static int hardware_disable(int slot)
#endif /* CFG_CMD_PCMCIA */
#endif /* CONFIG_GTH */
/* ---------------------------------------------------------------------------- */
/* ICU862 Boards by Cambridge Broadband Ltd. */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* ICU862 Boards by Cambridge Broadband Ltd. */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_ICU862)
@@ -1087,17 +1074,14 @@ static int hardware_enable(int slot)
pcmp->pcmc_pscr = PCMCIA_MASK(_slot_);
pcmp->pcmc_per &= ~PCMCIA_MASK(_slot_);
/* disable interrupts & DMA */
PCMCIA_PGCRX(_slot_) = 0;
/*
* Disable PCMCIA buffers (isolate the interface)
* and assert RESET signal
* Disable interrupts, DMA, and PCMCIA buffers
* (isolate the interface) and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -1125,13 +1109,13 @@ static int hardware_enable(int slot)
reg = cp->cp_pbdat;
if ((pipr & mask) == mask) {
reg |= (TPS2205_VPP_PGM | TPS2205_VPP_VCC | /* VAVPP => Hi-Z */
TPS2205_VCC3); /* 3V off */
reg |= (TPS2205_VPP_PGM | TPS2205_VPP_VCC | /* VAVPP => Hi-Z */
TPS2205_VCC3); /* 3V off */
reg &= ~(TPS2205_VCC5); /* 5V on */
puts (" 5.0V card found: ");
} else {
reg |= (TPS2205_VPP_PGM | TPS2205_VPP_VCC | /* VAVPP => Hi-Z */
TPS2205_VCC5); /* 5V off */
reg |= (TPS2205_VPP_PGM | TPS2205_VPP_VCC | /* VAVPP => Hi-Z */
TPS2205_VCC5); /* 5V off */
reg &= ~(TPS2205_VCC3); /* 3V on */
puts (" 3.3V card found: ");
}
@@ -1188,10 +1172,8 @@ static int hardware_disable(int slot)
cp->cp_pbdat &= ~(TPS2205_SHDN);
/* Configure PCMCIA General Control Register */
PCMCIA_PGCRX(_slot_) = 0;
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
@@ -1224,9 +1206,9 @@ static int voltage_set(int slot, int vcc, int vpp)
* and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -1298,9 +1280,9 @@ static void cfg_port_B (void)
* Switch off all voltages, assert shutdown
*/
reg = cp->cp_pbdat;
reg |= (TPS2205_VPP_PGM | TPS2205_VPP_VCC | /* VAVPP => Hi-Z */
TPS2205_VCC3 | TPS2205_VCC5 | /* VAVCC => Hi-Z */
TPS2205_SHDN); /* enable switch */
reg |= (TPS2205_VPP_PGM | TPS2205_VPP_VCC | /* VAVPP => Hi-Z */
TPS2205_VCC3 | TPS2205_VCC5 | /* VAVCC => Hi-Z */
TPS2205_SHDN); /* enable switch */
cp->cp_pbdat = reg;
cp->cp_pbpar &= ~(TPS2205_INPUTS | TPS2205_OUTPUTS);
@@ -1315,9 +1297,9 @@ static void cfg_port_B (void)
#endif /* ICU862 */
/* ---------------------------------------------------------------------------- */
/* C2MON Boards by TTTech Computertechnik AG */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* C2MON Boards by TTTech Computertechnik AG */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_C2MON)
@@ -1357,17 +1339,14 @@ static int hardware_enable(int slot)
pcmp->pcmc_pscr = PCMCIA_MASK(_slot_);
pcmp->pcmc_per &= ~PCMCIA_MASK(_slot_);
/* disable interrupts & DMA */
PCMCIA_PGCRX(_slot_) = 0;
/*
* Disable PCMCIA buffers (isolate the interface)
* and assert RESET signal
* Disable interrupts, DMA, and PCMCIA buffers
* (isolate the interface) and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -1453,10 +1432,8 @@ static int hardware_disable(int slot)
pcmp = (pcmconf8xx_t *)(&(((immap_t *)CFG_IMMR)->im_pcmcia));
/* Configure PCMCIA General Control Register */
PCMCIA_PGCRX(_slot_) = 0;
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
@@ -1494,9 +1471,9 @@ static int voltage_set(int slot, int vcc, int vpp)
* and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -1599,9 +1576,9 @@ static void cfg_ports (void)
#endif /* C2MON */
/* ----------------------------------------------------------------------------
MBX board from Morotola
---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* MBX board from Morotola */
/* -------------------------------------------------------------------- */
#if defined( CONFIG_MBX )
#include <../board/mbx8xx/csr.h>
@@ -1687,15 +1664,12 @@ static int hardware_enable (int slot)
pcmp->pcmc_pscr = PCMCIA_MASK (_slot_);
pcmp->pcmc_per &= ~PCMCIA_MASK (_slot_);
/* disable interrupts & DMA */
PCMCIA_PGCRX (_slot_) = 0;
/*
* Disable PCMCIA buffers (isolate the interface)
* and assert RESET signal
* Disable interrupts, DMA, and PCMCIA buffers
* (isolate the interface) and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX (_slot_);
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX (_slot_) = reg;
@@ -1752,9 +1726,9 @@ static int hardware_disable (int slot)
}
#endif /* CFG_CMD_PCMCIA */
#endif /* CONFIG_MBX */
/* ---------------------------------------------------------------------------- */
/* R360MPI Board */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* R360MPI Board */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_R360MPI)
@@ -1788,17 +1762,14 @@ static int hardware_enable(int slot)
pcmp->pcmc_pscr = PCMCIA_MASK(_slot_);
pcmp->pcmc_per &= ~PCMCIA_MASK(_slot_);
/* disable interrupts & DMA */
PCMCIA_PGCRX(_slot_) = 0;
/*
* Disable PCMCIA buffers (isolate the interface)
* and assert RESET signal
* Disable interrupts, DMA, and PCMCIA buffers
* (isolate the interface) and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -1889,10 +1860,8 @@ static int hardware_disable(int slot)
immap->im_ioport.iop_padat |= 0x0200;
/* Configure PCMCIA General Control Register */
PCMCIA_PGCRX(_slot_) = 0;
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
@@ -1923,9 +1892,9 @@ static int voltage_set(int slot, int vcc, int vpp)
* and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = PCMCIA_PGCRX(_slot_);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(_slot_) = reg;
udelay(500);
@@ -1963,8 +1932,8 @@ static int voltage_set(int slot, int vcc, int vpp)
immap->im_ioport.iop_pcdat &= !reg;
if (reg & 0x0400)
immap->im_ioport.iop_padat &= !reg;
immap->im_ioport.iop_pcdir |= 0x0200;
immap->im_ioport.iop_padir |= 0x0400;
immap->im_ioport.iop_pcdir |= 0x0200;
immap->im_ioport.iop_padir |= 0x0400;
if (reg) {
debug ("PCMCIA powered at %sV\n",
(reg&0x0400) ? "5.0" : "3.3");
@@ -1987,9 +1956,9 @@ done:
#endif /* R360MPI */
/* ---------------------------------------------------------------------------- */
/* KUP4K Board */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* KUP4K Board */
/* -------------------------------------------------------------------- */
#if defined(CONFIG_KUP4K)
#define PCMCIA_BOARD_MSG "KUP4K"
@@ -2023,17 +1992,14 @@ static int hardware_enable(int slot)
pcmp->pcmc_pscr = PCMCIA_MASK(slot);
pcmp->pcmc_per &= ~PCMCIA_MASK(slot);
/* disable interrupts & DMA */
PCMCIA_PGCRX(slot) = 0;
/*
* Disable PCMCIA buffers (isolate the interface)
* and assert RESET signal
* Disable interrupts, DMA, and PCMCIA buffers
* (isolate the interface) and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(slot);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(slot) = reg;
udelay(2500);
@@ -2110,16 +2076,14 @@ static int hardware_disable(int slot)
immap = (immap_t *)CFG_IMMR;
pcmp = (pcmconf8xx_t *)(&(((immap_t *)CFG_IMMR)->im_pcmcia));
cp = (cpm8xx_t *)(&(((immap_t *)CFG_IMMR)->im_cpm));
/* remove all power */
if (slot)
cp->cp_pbdat |= KUP4K_PCMCIA_B_3V3;
/* Configure PCMCIA General Control Register */
PCMCIA_PGCRX(slot) = 0;
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(slot);
reg = 0;
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(slot) = reg;
@@ -2156,9 +2120,9 @@ static int voltage_set(int slot, int vcc, int vpp)
* and assert RESET signal
*/
debug ("Disable PCMCIA buffers and assert RESET\n");
reg = PCMCIA_PGCRX(slot);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
reg = PCMCIA_PGCRX(slot);
reg |= __MY_PCMCIA_GCRX_CXRESET; /* active high */
reg |= __MY_PCMCIA_GCRX_CXOE; /* active low */
PCMCIA_PGCRX(slot) = reg;
udelay(500);
@@ -2213,14 +2177,14 @@ static int voltage_set(int slot, int vcc, int vpp)
/* ---------------------------------------------------------------------------- */
/* End of Board Specific Stuff */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* End of Board Specific Stuff */
/* -------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------- */
/* MPC8xx Specific Stuff - should go to MPC8xx directory */
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/* MPC8xx Specific Stuff - should go to MPC8xx directory */
/* -------------------------------------------------------------------- */
/*
* Search this table to see if the windowsize is
@@ -2241,7 +2205,7 @@ static const u_int m8xx_size_to_gray[M8XX_SIZES_NO] =
0x00800000, 0x00400000, 0x00100000, 0x00200000 };
/* ---------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
static u_int m8xx_get_graycode(u_int size)
{
@@ -2258,7 +2222,7 @@ static u_int m8xx_get_graycode(u_int size)
return k;
}
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#if 0
static u_int m8xx_get_speed(u_int ns, u_int is_io)
@@ -2311,7 +2275,7 @@ static u_int m8xx_get_speed(u_int ns, u_int is_io)
}
#endif
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#ifdef CONFIG_IDE_8xx_PCCARD
static void print_funcid (int func)
@@ -2353,7 +2317,7 @@ static void print_funcid (int func)
}
#endif /* CONFIG_IDE_8xx_PCCARD */
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#ifdef CONFIG_IDE_8xx_PCCARD
static void print_fixed (volatile uchar *p)
@@ -2411,7 +2375,7 @@ static void print_fixed (volatile uchar *p)
}
#endif /* CONFIG_IDE_8xx_PCCARD */
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#ifdef CONFIG_IDE_8xx_PCCARD
@@ -2475,6 +2439,6 @@ static int identify (volatile uchar *p)
}
#endif /* CONFIG_IDE_8xx_PCCARD */
/* ------------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
#endif /* CFG_CMD_PCMCIA || (CFG_CMD_IDE && CONFIG_IDE_8xx_PCCARD) */

View File

@@ -156,6 +156,21 @@ static uchar env_get_char_init (int index)
return (c);
}
#ifdef CONFIG_AMIGAONEG3SE
uchar env_get_char_memory (int index)
{
DECLARE_GLOBAL_DATA_PTR;
uchar retval;
enable_nvram();
if (gd->env_valid) {
retval = ( *((uchar *)(gd->env_addr + index)) );
} else {
retval = ( default_environment[index] );
}
disable_nvram();
return retval;
}
#else
uchar env_get_char_memory (int index)
{
DECLARE_GLOBAL_DATA_PTR;
@@ -166,6 +181,7 @@ uchar env_get_char_memory (int index)
return ( default_environment[index] );
}
}
#endif
uchar *env_get_addr (int index)
{

View File

@@ -66,7 +66,25 @@ extern int default_environment_size;
extern uchar (*env_get_char)(int);
extern uchar env_get_char_memory (int index);
#ifdef CONFIG_AMIGAONEG3SE
uchar env_get_char_spec (int index)
{
#ifdef CFG_NVRAM_ACCESS_ROUTINE
uchar c;
nvram_read(&c, CFG_ENV_ADDR+index, 1);
return c;
#else
DECLARE_GLOBAL_DATA_PTR;
uchar retval;
enable_nvram();
retval = *((uchar *)(gd->env_addr + index));
disable_nvram();
return retval;
#endif
}
#else
uchar env_get_char_spec (int index)
{
#ifdef CFG_NVRAM_ACCESS_ROUTINE
@@ -81,6 +99,7 @@ uchar env_get_char_spec (int index)
return *((uchar *)(gd->env_addr + index));
#endif
}
#endif
void env_relocate_spec (void)
{
@@ -94,12 +113,18 @@ void env_relocate_spec (void)
int saveenv (void)
{
int rcode = 0;
#ifdef CONFIG_AMIGAONEG3SE
enable_nvram();
#endif
#ifdef CFG_NVRAM_ACCESS_ROUTINE
nvram_write(CFG_ENV_ADDR, env_ptr, CFG_ENV_SIZE);
#else
if (memcpy ((char *)CFG_ENV_ADDR, env_ptr, CFG_ENV_SIZE) == NULL)
rcode = 1 ;
#endif
#ifdef CONFIG_AMIGAONEG3SE
udelay(10000);
disable_nvram();
#endif
return rcode;
}
@@ -113,7 +138,9 @@ int saveenv (void)
int env_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_AMIGAONEG3SE
enable_nvram();
#endif
#if defined(CFG_NVRAM_ACCESS_ROUTINE)
ulong crc;
uchar data[ENV_SIZE];
@@ -131,7 +158,9 @@ int env_init (void)
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 0;
}
#ifdef CONFIG_AMIGAONEG3SE
disable_nvram();
#endif
return (0);
}

View File

@@ -287,8 +287,9 @@ int i2c_probe(uchar addr)
{
int rc;
/* perform 1 byte read transaction */
send_start();
rc = write_byte ((addr << 1) | 1);
rc = write_byte ((addr << 1) | 0);
send_stop();
return (rc ? 1 : 0);

View File

@@ -177,7 +177,14 @@ SystemCall:
add r11,r11,r0
lwz r11,0(r11)
li r12,0xd00-4*3 /* save LR & SRRx */
li r20,0xd00-4 /* Get stack pointer */
lwz r12,0(r20)
subi r12,r12,12 /* Adjust stack pointer */
li r0,0xc00+_end_back-SystemCall
cmplw 0, r0, r12 /* Check stack overflow */
bgt 1f
stw r12,0(r20)
mflr r0
stw r0,0(r12)
mfspr r0,SRR0
@@ -202,7 +209,9 @@ _back:
mtmsr r11
SYNC
li r12,0xd00-4*3 /* restore regs */
li r12,0xd00-4 /* restore regs */
lwz r12,0(r12)
lwz r11,0(r12)
mtlr r11
lwz r11,4(r12)
@@ -210,8 +219,13 @@ _back:
lwz r11,8(r12)
mtspr SRR1,r11
addi r12,r12,12 /* Adjust stack pointer */
li r20,0xd00-4
stw r12,0(r20)
SYNC
rfi
_end_back:
STD_EXCEPTION(0xd00, SingleStep, UnknownException)
@@ -716,6 +730,9 @@ in_ram:
bne 5b
6:
mr r3, r10 /* Destination Address */
#ifdef CONFIG_AMIGAONEG3SE
mr r4, r9 /* Use RAM copy of the global data */
#endif
bl after_reloc
/* not reached - end relocate_code */

View File

@@ -108,6 +108,9 @@
#define EPIC_PROC_INT_ACK_REG (EPIC_EUMBBAR + 0x200a0)/* Int. acknowledge */
#define EPIC_PROC_EOI_REG (EPIC_EUMBBAR + 0x200b0)/* End of interrupt */
#define EPIC_VEC_PRI_MASK 0x80000000 /* Mask Interrupt bit in IVPR */
#define EPIC_VEC_PRI_DFLT_PRI 8 /* Interrupt Priority in IVPR */
/* Error code */
#define OK 0

View File

@@ -70,6 +70,10 @@ void epicInit
tmp = sysEUMBBARRead(EPIC_GLOBAL_REG);
tmp |= 0xa0000000; /* Set the Global Conf. register */
sysEUMBBARWrite(EPIC_GLOBAL_REG, tmp);
/*
* Wait for EPIC to reset - CLH
*/
while( (sysEUMBBARRead(EPIC_GLOBAL_REG) & 0x80000000) == 1);
sysEUMBBARWrite(EPIC_GLOBAL_REG, 0x20000000);
tmp = sysEUMBBARRead(EPIC_INT_CONF_REG); /* Read interrupt conf. reg */
@@ -81,7 +85,8 @@ void epicInit
sysEUMBBARWrite(EPIC_INT_CONF_REG, tmp);
}
while (epicIntAck() != 0xff); /* Clear all pending interrupts */
while (epicIntAck() != 0xff) /* Clear all pending interrupts */
epicEOI();
}
/****************************************************************************
@@ -92,18 +97,18 @@ void epicInit
*
* RETURNS: None
*/
void epicIntEnable
(
int intVec /* Interrupt Vector Number */
)
{
void epicIntEnable(int intVec)
{
ULONG tmp;
ULONG srAddr;
srAddr = SrcVecTable[intVec].srcAddr; /* Retrieve src Vec/Prio register */
tmp = sysEUMBBARRead(srAddr);
tmp &= 0x7fffffff; /* Clear the mask bit */
tmp &= ~EPIC_VEC_PRI_MASK; /* Clear the mask bit */
tmp |= (EPIC_VEC_PRI_DFLT_PRI << 16); /* Set priority to Default - CLH */
tmp |= intVec; /* Set Vector number */
sysEUMBBARWrite(srAddr, tmp);
return;
}

View File

@@ -92,6 +92,8 @@ int interrupt_init (void)
*/
epicInit (EPIC_DIRECT_IRQ, 0);
/* EPIC won't generate INT unless Current Task Pri < 15 */
epicCurTaskPrioSet(0);
set_dec (decrementer_count);

View File

@@ -278,7 +278,14 @@ SystemCall:
add r11,r11,r0
lwz r11,0(r11)
li r12,0xd00-4*3 /* save LR & SRRx */
li r20,0xd00-4 /* Get stack pointer */
lwz r12,0(r20)
subi r12,r12,12 /* Adjust stack pointer */
li r0,0xc00+_end_back-SystemCall
cmplw 0, r0, r12 /* Check stack overflow */
bgt 1f
stw r12,0(r20)
mflr r0
stw r0,0(r12)
mfspr r0,SRR0
@@ -303,7 +310,9 @@ _back:
mtmsr r11
SYNC
li r12,0xd00-4*3 /* restore regs */
li r12,0xd00-4 /* restore regs */
lwz r12,0(r12)
lwz r11,0(r12)
mtlr r11
lwz r11,4(r12)
@@ -311,8 +320,13 @@ _back:
lwz r11,8(r12)
mtspr SRR1,r11
addi r12,r12,12 /* Adjust stack pointer */
li r20,0xd00-4
stw r12,0(r20)
SYNC
rfi
_end_back:
STD_EXCEPTION(EXC_OFF_TRACE, SingleStep, UnknownException)

View File

@@ -324,7 +324,14 @@ SystemCall:
add r11,r11,r0
lwz r11,0(r11)
li r12,0xd00-4*3 /* save LR & SRRx */
li r20,0xd00-4 /* Get stack pointer */
lwz r12,0(r20)
subi r12,r12,12 /* Adjust stack pointer */
li r0,0xc00+_end_back-SystemCall
cmplw 0, r0, r12 /* Check stack overflow */
bgt 1f
stw r12,0(r20)
mflr r0
stw r0,0(r12)
mfspr r0,SRR0
@@ -349,7 +356,9 @@ _back:
mtmsr r11
SYNC
li r12,0xd00-4*3 /* restore regs */
li r12,0xd00-4 /* restore regs */
lwz r12,0(r12)
lwz r11,0(r12)
mtlr r11
lwz r11,4(r12)
@@ -357,8 +366,13 @@ _back:
lwz r11,8(r12)
mtspr SRR1,r11
addi r12,r12,12 /* Adjust stack pointer */
li r20,0xd00-4
stw r12,0(r20)
SYNC
rfi
_end_back:
STD_EXCEPTION(0xd00, SingleStep, UnknownException)

View File

@@ -28,99 +28,104 @@
#include <asm/processor.h>
#include <commproc.h>
/****************************************************************************/
/************************************************************************/
unsigned decrementer_count; /* count value for 1e6/HZ microseconds */
unsigned decrementer_count; /* count value for 1e6/HZ microseconds */
/****************************************************************************/
/************************************************************************/
/*
* CPM interrupt vector functions.
*/
struct cpm_action {
interrupt_handler_t *handler;
void *arg;
struct interrupt_action {
interrupt_handler_t *handler;
void *arg;
};
static struct cpm_action cpm_vecs[CPMVEC_NR];
static struct interrupt_action cpm_vecs[CPMVEC_NR];
static struct interrupt_action irq_vecs[NR_IRQS];
static void cpm_interrupt_init (void);
static void cpm_interrupt(int irq, struct pt_regs * regs);
static void cpm_interrupt (void *regs);
/****************************************************************************/
/************************************************************************/
static __inline__ unsigned long get_msr(void)
static __inline__ unsigned long get_msr (void)
{
unsigned long msr;
unsigned long msr;
asm volatile("mfmsr %0" : "=r" (msr) :);
return msr;
asm volatile ("mfmsr %0":"=r" (msr):);
return msr;
}
static __inline__ void set_msr(unsigned long msr)
static __inline__ void set_msr (unsigned long msr)
{
asm volatile("mtmsr %0" : : "r" (msr));
asm volatile ("mtmsr %0"::"r" (msr));
}
static __inline__ unsigned long get_dec(void)
static __inline__ unsigned long get_dec (void)
{
unsigned long val;
unsigned long val;
asm volatile("mfdec %0" : "=r" (val) :);
return val;
asm volatile ("mfdec %0":"=r" (val):);
return val;
}
static __inline__ void set_dec(unsigned long val)
static __inline__ void set_dec (unsigned long val)
{
asm volatile("mtdec %0" : : "r" (val));
asm volatile ("mtdec %0"::"r" (val));
}
void enable_interrupts (void)
{
set_msr (get_msr() | MSR_EE);
set_msr (get_msr () | MSR_EE);
}
/* returns flag if MSR_EE was set before */
int disable_interrupts (void)
{
ulong msr = get_msr();
ulong msr = get_msr ();
set_msr (msr & ~MSR_EE);
return ((msr & MSR_EE) != 0);
}
/****************************************************************************/
/************************************************************************/
int interrupt_init(void)
int interrupt_init (void)
{
volatile immap_t *immr = (immap_t *)CFG_IMMR;
volatile immap_t *immr = (immap_t *) CFG_IMMR;
decrementer_count = get_tbclk() / CFG_HZ;
decrementer_count = get_tbclk () / CFG_HZ;
cpm_interrupt_init();
/* disable all interrupts */
immr->im_siu_conf.sc_simask = 0;
/* disable all interrupts except for the CPM interrupt */
immr->im_siu_conf.sc_simask = 1 << (31-CPM_INTERRUPT);
/* Configure CPM interrupts */
cpm_interrupt_init ();
set_dec (decrementer_count);
set_msr (get_msr() | MSR_EE);
set_msr (get_msr () | MSR_EE);
return (0);
}
/****************************************************************************/
/************************************************************************/
/*
* Handle external interrupts
*/
void external_interrupt(struct pt_regs *regs)
void external_interrupt (struct pt_regs *regs)
{
volatile immap_t *immr = (immap_t *)CFG_IMMR;
int irq;
ulong simask, newmask;
ulong vec, v_bit;
volatile immap_t *immr = (immap_t *) CFG_IMMR;
int irq;
ulong simask, newmask;
ulong vec, v_bit;
/*
* read the SIVEC register and shift the bits down
@@ -137,14 +142,15 @@ void external_interrupt(struct pt_regs *regs)
newmask = simask & (~(0xFFFF0000 >> irq));
immr->im_siu_conf.sc_simask = newmask;
if (!(irq & 0x1)) { /* External Interrupt ? */
if (!(irq & 0x1)) { /* External Interrupt ? */
ulong siel;
/*
* Read Interrupt Edge/Level Register
*/
siel = immr->im_siu_conf.sc_siel;
if (siel & v_bit) { /* edge triggered interrupt ? */
if (siel & v_bit) { /* edge triggered interrupt ? */
/*
* Rewrite SIPEND Register to clear interrupt
*/
@@ -152,34 +158,29 @@ void external_interrupt(struct pt_regs *regs)
}
}
switch (irq) {
case CPM_INTERRUPT:
cpm_interrupt (irq, regs);
break;
default:
if (irq_vecs[irq].handler != NULL) {
irq_vecs[irq].handler (irq_vecs[irq].arg);
} else {
printf ("\nBogus External Interrupt IRQ %d Vector %ld\n",
irq, vec);
irq, vec);
/* turn off the bogus interrupt to avoid it from now */
simask &= ~v_bit;
break;
}
/*
* Re-Enable old Interrupt Mask
*/
immr->im_siu_conf.sc_simask = simask;
}
/****************************************************************************/
/************************************************************************/
/*
* CPM interrupt handler
*/
static void
cpm_interrupt(int irq, struct pt_regs * regs)
static void cpm_interrupt (void *regs)
{
volatile immap_t *immr = (immap_t *)CFG_IMMR;
uint vec;
volatile immap_t *immr = (immap_t *) CFG_IMMR;
uint vec;
/*
* Get the vector by setting the ACK bit
@@ -190,13 +191,14 @@ cpm_interrupt(int irq, struct pt_regs * regs)
vec >>= 11;
if (cpm_vecs[vec].handler != NULL) {
(*cpm_vecs[vec].handler)(cpm_vecs[vec].arg);
(*cpm_vecs[vec].handler) (cpm_vecs[vec].arg);
} else {
immr->im_cpic.cpic_cimr &= ~(1 << vec);
printf ("Masking bogus CPM interrupt vector 0x%x\n", vec);
}
/*
* After servicing the interrupt, we have to remove the status indicator.
* After servicing the interrupt,
* we have to remove the status indicator.
*/
immr->im_cpic.cpic_cisr |= (1 << vec);
}
@@ -207,75 +209,110 @@ cpm_interrupt(int irq, struct pt_regs * regs)
* to do is ACK it and return. This is a no-op function so we don't
* need any special tests in the interrupt handler.
*/
static void
cpm_error_interrupt (void *dummy)
static void cpm_error_interrupt (void *dummy)
{
}
/****************************************************************************/
/************************************************************************/
/*
* Install and free a CPM interrupt handler.
* Install and free an interrupt handler
*/
void
irq_install_handler(int vec, interrupt_handler_t *handler, void *arg)
void irq_install_handler (int vec, interrupt_handler_t * handler,
void *arg)
{
volatile immap_t *immr = (immap_t *)CFG_IMMR;
volatile immap_t *immr = (immap_t *) CFG_IMMR;
if (cpm_vecs[vec].handler != NULL) {
printf ("CPM interrupt 0x%x replacing 0x%x\n",
(uint)handler, (uint)cpm_vecs[vec].handler);
if ((vec & CPMVEC_OFFSET) != 0) {
/* CPM interrupt */
vec &= 0xffff;
if (cpm_vecs[vec].handler != NULL) {
printf ("CPM interrupt 0x%x replacing 0x%x\n",
(uint) handler,
(uint) cpm_vecs[vec].handler);
}
cpm_vecs[vec].handler = handler;
cpm_vecs[vec].arg = arg;
immr->im_cpic.cpic_cimr |= (1 << vec);
#if 0
printf ("Install CPM interrupt for vector %d ==> %p\n",
vec, handler);
#endif
} else {
/* SIU interrupt */
if (irq_vecs[vec].handler != NULL) {
printf ("SIU interrupt %d 0x%x replacing 0x%x\n",
vec,
(uint) handler,
(uint) cpm_vecs[vec].handler);
}
irq_vecs[vec].handler = handler;
irq_vecs[vec].arg = arg;
immr->im_siu_conf.sc_simask |= 1 << (31 - vec);
#if 0
printf ("Install SIU interrupt for vector %d ==> %p\n",
vec, handler);
#endif
}
cpm_vecs[vec].handler = handler;
cpm_vecs[vec].arg = arg;
immr->im_cpic.cpic_cimr |= (1 << vec);
#if 0
printf ("Install CPM interrupt for vector %d ==> %p\n", vec, handler);
#endif
}
void
irq_free_handler(int vec)
void irq_free_handler (int vec)
{
volatile immap_t *immr = (immap_t *)CFG_IMMR;
volatile immap_t *immr = (immap_t *) CFG_IMMR;
if ((vec & CPMVEC_OFFSET) != 0) {
/* CPM interrupt */
vec &= 0xffff;
#if 0
printf ("Free CPM interrupt for vector %d ==> %p\n",
vec, cpm_vecs[vec].handler);
printf ("Free CPM interrupt for vector %d ==> %p\n",
vec, cpm_vecs[vec].handler);
#endif
immr->im_cpic.cpic_cimr &= ~(1 << vec);
cpm_vecs[vec].handler = NULL;
cpm_vecs[vec].arg = NULL;
immr->im_cpic.cpic_cimr &= ~(1 << vec);
cpm_vecs[vec].handler = NULL;
cpm_vecs[vec].arg = NULL;
} else {
/* SIU interrupt */
#if 0
printf ("Free CPM interrupt for vector %d ==> %p\n",
vec, cpm_vecs[vec].handler);
#endif
immr->im_siu_conf.sc_simask &= ~(1 << (31 - vec));
irq_vecs[vec].handler = NULL;
irq_vecs[vec].arg = NULL;
}
}
/****************************************************************************/
/************************************************************************/
static void
cpm_interrupt_init (void)
static void cpm_interrupt_init (void)
{
volatile immap_t *immr = (immap_t *)CFG_IMMR;
volatile immap_t *immr = (immap_t *) CFG_IMMR;
/*
* Initialize the CPM interrupt controller.
*/
immr->im_cpic.cpic_cicr =
( CICR_SCD_SCC4 |
CICR_SCC_SCC3 |
CICR_SCB_SCC2 |
CICR_SCA_SCC1 ) | ((CPM_INTERRUPT/2) << 13) | CICR_HP_MASK;
(CICR_SCD_SCC4 |
CICR_SCC_SCC3 |
CICR_SCB_SCC2 |
CICR_SCA_SCC1) | ((CPM_INTERRUPT / 2) << 13) | CICR_HP_MASK;
immr->im_cpic.cpic_cimr = 0;
/*
* Install the error handler.
*/
irq_install_handler(CPMVEC_ERROR, cpm_error_interrupt, NULL);
irq_install_handler (CPMVEC_ERROR, cpm_error_interrupt, NULL);
immr->im_cpic.cpic_cicr |= CICR_IEN;
/*
* Install the cpm interrupt handler
*/
irq_install_handler (CPM_INTERRUPT, cpm_interrupt, NULL);
}
/****************************************************************************/
/************************************************************************/
volatile ulong timestamp = 0;
@@ -284,18 +321,19 @@ volatile ulong timestamp = 0;
* with interrupts disabled.
* Trivial implementation - no need to be really accurate.
*/
void timer_interrupt(struct pt_regs *regs)
void timer_interrupt (struct pt_regs *regs)
{
volatile immap_t *immr = (immap_t *)CFG_IMMR;
volatile immap_t *immr = (immap_t *) CFG_IMMR;
#ifdef CONFIG_STATUS_LED
extern void status_led_tick (ulong);
extern void status_led_tick (ulong);
#endif
#if 0
printf ("*** Timer Interrupt *** ");
#endif
/* Reset Timer Expired and Timers Interrupt Status */
immr->im_clkrstk.cark_plprcrk = KAPWR_KEY;
__asm__("nop");
__asm__ ("nop");
immr->im_clkrst.car_plprcr |= PLPRCR_TEXPS | PLPRCR_TMIST;
/* Restore Decrementer Count */
set_dec (decrementer_count);
@@ -304,11 +342,10 @@ void timer_interrupt(struct pt_regs *regs)
#ifdef CONFIG_STATUS_LED
status_led_tick (timestamp);
#endif /* CONFIG_STATUS_LED */
#endif /* CONFIG_STATUS_LED */
#if defined(CONFIG_WATCHDOG) || defined(CFG_CMA_LCD_HEARTBEAT)
/*
* The shortest watchdog period of all boards (except LWMON)
* is approx. 1 sec, thus re-trigger watchdog at least
@@ -321,20 +358,20 @@ void timer_interrupt(struct pt_regs *regs)
#endif
#if defined(CFG_CMA_LCD_HEARTBEAT)
extern void lcd_heartbeat(void);
lcd_heartbeat();
extern void lcd_heartbeat (void);
lcd_heartbeat ();
#endif /* CFG_CMA_LCD_HEARTBEAT */
#if defined(CONFIG_WATCHDOG)
reset_8xx_watchdog(immr);
reset_8xx_watchdog (immr);
#endif /* CONFIG_WATCHDOG */
}
#endif /* CONFIG_WATCHDOG || CFG_CMA_LCD_HEARTBEAT */
}
/****************************************************************************/
/************************************************************************/
void reset_timer (void)
{
@@ -351,4 +388,4 @@ void set_timer (ulong t)
timestamp = t;
}
/****************************************************************************/
/************************************************************************/

View File

@@ -285,7 +285,14 @@ SystemCall:
add r11,r11,r0
lwz r11,0(r11)
li r12,0xd00-4*3 /* save LR & SRRx */
li r20,0xd00-4 /* Get stack pointer */
lwz r12,0(r20)
subi r12,r12,12 /* Adjust stack pointer */
li r0,0xc00+_end_back-SystemCall
cmplw 0, r0, r12 /* Check stack overflow */
bgt 1f
stw r12,0(r20)
mflr r0
stw r0,0(r12)
mfspr r0,SRR0
@@ -310,7 +317,9 @@ _back:
mtmsr r11
SYNC
li r12,0xd00-4*3 /* restore regs */
li r12,0xd00-4 /* restore regs */
lwz r12,0(r12)
lwz r11,0(r12)
mtlr r11
lwz r11,4(r12)
@@ -318,8 +327,13 @@ _back:
lwz r11,8(r12)
mtspr SRR1,r11
addi r12,r12,12 /* Adjust stack pointer */
li r20,0xd00-4
stw r12,0(r20)
SYNC
rfi
_end_back:
STD_EXCEPTION(0xd00, SingleStep, UnknownException)

View File

@@ -775,7 +775,14 @@ SystemCall:
add r11,r11,r0
lwz r11,0(r11)
li r12,0xd00-4*3 /* save LR & SRRx */
li r20,0xd00-4 /* Get stack pointer */
lwz r12,0(r20)
subi r12,r12,12 /* Adjust stack pointer */
li r0,0xc00+_end_back-SystemCall
cmplw 0, r0, r12 /* Check stack overflow */
bgt 1f
stw r12,0(r20)
mflr r0
stw r0,0(r12)
mfspr r0,SRR0
@@ -800,7 +807,9 @@ _back:
mtmsr r11
SYNC
li r12,0xd00-4*3 /* restore regs */
li r12,0xd00-4 /* restore regs */
lwz r12,0(r12)
lwz r11,0(r12)
mtlr r11
lwz r11,4(r12)
@@ -808,8 +817,13 @@ _back:
lwz r11,8(r12)
mtspr SRR1,r11
addi r12,r12,12 /* Adjust stack pointer */
li r20,0xd00-4
stw r12,0(r20)
SYNC
rfi
_end_back:
STD_EXCEPTION(0xd00, SingleStep, UnknownException)

View File

@@ -122,6 +122,7 @@ int timer (int argc, char *argv[])
tid_8xx_cpmtimer_t hw;
tid_8xx_cpmtimer_t *hwp = &hw;
int c;
int running;
/* Pointer to CPM Timer structure */
cpmtimerp = &((immap_t *) gd->bd->bi_immr_base)->im_cpmtimer;
@@ -185,6 +186,7 @@ int timer (int argc, char *argv[])
*hwp->terp = (CPMT_EVENT_CAP | CPMT_EVENT_REF);
mon_printf (usage);
running = 0;
while ((c = mon_getc()) != 'q') {
if (c == 'b') {
@@ -197,6 +199,7 @@ int timer (int argc, char *argv[])
/* enable timer */
*hwp->tgcrp |= (CPMT_GCR_RST << TID_TIMER_ID);
running = 1;
#ifdef DEBUG
mon_printf ("tgcr=0x%x, tmr=0x%x, trr=0x%x,"
@@ -210,6 +213,7 @@ int timer (int argc, char *argv[])
mon_printf ("Stopping timer\n");
*hwp->tgcrp &= ~(CPMT_GCR_MASK << TID_TIMER_ID);
running = 0;
#ifdef DEBUG
mon_printf ("tgcr=0x%x, tmr=0x%x, trr=0x%x,"
@@ -252,6 +256,12 @@ int timer (int argc, char *argv[])
}
mon_printf (usage);
}
if (running) {
mon_printf ("Stopping timer\n");
*hwp->tgcrp &= ~(CPMT_GCR_MASK << TID_TIMER_ID);
mon_free_hdlr (hwp->cpm_vec);
}
return (0);
}

View File

@@ -68,6 +68,9 @@ typedef struct global_data {
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base address of framebuffer memory */
#endif
#ifdef CONFIG_POST
unsigned long post_log_word; /* Record POST activities */
#endif
#ifdef CONFIG_BOARD_TYPES
unsigned long board_type;
#endif

View File

@@ -33,8 +33,9 @@
#define LOG_BU_MASK ~(LOG_BUF_LEN-1)
#define CMD_TBL_LOG MK_CMD_TBL_ENTRY( \
"log", 3, 3, 1, do_log, \
"log", 3, 255, 1, do_log, \
"log - manipulate logbuffer\n", \
"log info - show pointer details\n" \
"log reset - clear contents\n" \
"log show - show contents\n" \
"log append <msg> - append <msg> to the logbuffer\n" \

View File

@@ -22,10 +22,10 @@
/* CPM Command register.
*/
#define CPM_CR_RST ((ushort)0x8000)
#define CPM_CR_OPCODE ((ushort)0x0f00)
#define CPM_CR_CHAN ((ushort)0x00f0)
#define CPM_CR_FLG ((ushort)0x0001)
#define CPM_CR_RST ((ushort)0x8000)
#define CPM_CR_OPCODE ((ushort)0x0f00)
#define CPM_CR_CHAN ((ushort)0x00f0)
#define CPM_CR_FLG ((ushort)0x0001)
/* Some commands (there are more...later)
*/
@@ -39,14 +39,14 @@
/* Channel numbers.
*/
#define CPM_CR_CH_SCC1 ((ushort)0x0000)
#define CPM_CR_CH_I2C ((ushort)0x0001) /* I2C and IDMA1 */
#define CPM_CR_CH_SCC2 ((ushort)0x0004)
#define CPM_CR_CH_SPI ((ushort)0x0005) /* SPI / IDMA2 / Timers */
#define CPM_CR_CH_SCC3 ((ushort)0x0008)
#define CPM_CR_CH_SMC1 ((ushort)0x0009) /* SMC1 / DSP1 */
#define CPM_CR_CH_SCC4 ((ushort)0x000c)
#define CPM_CR_CH_SMC2 ((ushort)0x000d) /* SMC2 / DSP2 */
#define CPM_CR_CH_SCC1 ((ushort)0x0000)
#define CPM_CR_CH_I2C ((ushort)0x0001) /* I2C and IDMA1 */
#define CPM_CR_CH_SCC2 ((ushort)0x0004)
#define CPM_CR_CH_SPI ((ushort)0x0005) /* SPI/IDMA2/Timers */
#define CPM_CR_CH_SCC3 ((ushort)0x0008)
#define CPM_CR_CH_SMC1 ((ushort)0x0009) /* SMC1 / DSP1 */
#define CPM_CR_CH_SCC4 ((ushort)0x000c)
#define CPM_CR_CH_SMC2 ((ushort)0x000d) /* SMC2 / DSP2 */
#define mk_cr_cmd(CH, CMD) ((CMD << 8) | (CH << 4))
@@ -523,8 +523,8 @@ typedef struct scc_enet {
#define PROFF_ENET PROFF_SCC2
#define CPM_CR_ENET CPM_CR_CH_SCC2
#define SCC_ENET 1
#define PA_ENET_RXD ((ushort)0x0004)
#define PA_ENET_TXD ((ushort)0x0008)
#define PA_ENET_RXD ((ushort)0x0004)
#define PA_ENET_TXD ((ushort)0x0008)
#define PA_ENET_TCLK ((ushort)0x0100)
#define PA_ENET_RCLK ((ushort)0x0400)
#define PB_ENET_TENA ((uint)0x00002000)
@@ -1034,21 +1034,21 @@ typedef struct scc_enet {
#define PROFF_ENET PROFF_SCC2
#define CPM_CR_ENET CPM_CR_CH_SCC2
#define SCC_ENET 1
#define PA_ENET_RXD ((ushort)0x0004) /* PA 13 */
#define PA_ENET_TXD ((ushort)0x0008) /* PA 12 */
#define PA_ENET_RCLK ((ushort)0x0200) /* PA 6 */
#define PA_ENET_TCLK ((ushort)0x0800) /* PA 4 */
#define PA_ENET_RXD ((ushort)0x0004) /* PA 13 */
#define PA_ENET_TXD ((ushort)0x0008) /* PA 12 */
#define PA_ENET_RCLK ((ushort)0x0200) /* PA 6 */
#define PA_ENET_TCLK ((ushort)0x0800) /* PA 4 */
#define PB_ENET_TENA ((uint)0x00002000) /* PB 18 */
#define PB_ENET_TENA ((uint)0x00002000) /* PB 18 */
#define PC_ENET_CLSN ((ushort)0x0040) /* PC 9 */
#define PC_ENET_RENA ((ushort)0x0080) /* PC 8 */
#define PC_ENET_CLSN ((ushort)0x0040) /* PC 9 */
#define PC_ENET_RENA ((ushort)0x0080) /* PC 8 */
/* Control bits in the SICR to route TCLK (CLK3) and RCLK (CLK1) to
* SCC2. Also, make sure GR2 (bit 16) and SC2 (bit 17) are zero.
*/
#define SICR_ENET_MASK ((uint)0x0000ff00)
#define SICR_ENET_CLKRT ((uint)0x00002f00)
#define SICR_ENET_MASK ((uint)0x0000ff00)
#define SICR_ENET_CLKRT ((uint)0x00002f00)
#endif /* CONFIG_NX823 */
@@ -1583,35 +1583,36 @@ typedef struct hdlc_pram_s {
* priority and SCC1 == SCCa, etc...).
*/
#define CPMVEC_NR 32
#define CPMVEC_PIO_PC15 ((ushort)0x1f)
#define CPMVEC_SCC1 ((ushort)0x1e)
#define CPMVEC_SCC2 ((ushort)0x1d)
#define CPMVEC_SCC3 ((ushort)0x1c)
#define CPMVEC_SCC4 ((ushort)0x1b)
#define CPMVEC_PIO_PC14 ((ushort)0x1a)
#define CPMVEC_TIMER1 ((ushort)0x19)
#define CPMVEC_PIO_PC13 ((ushort)0x18)
#define CPMVEC_PIO_PC12 ((ushort)0x17)
#define CPMVEC_SDMA_CB_ERR ((ushort)0x16)
#define CPMVEC_IDMA1 ((ushort)0x15)
#define CPMVEC_IDMA2 ((ushort)0x14)
#define CPMVEC_TIMER2 ((ushort)0x12)
#define CPMVEC_RISCTIMER ((ushort)0x11)
#define CPMVEC_I2C ((ushort)0x10)
#define CPMVEC_PIO_PC11 ((ushort)0x0f)
#define CPMVEC_PIO_PC10 ((ushort)0x0e)
#define CPMVEC_TIMER3 ((ushort)0x0c)
#define CPMVEC_PIO_PC9 ((ushort)0x0b)
#define CPMVEC_PIO_PC8 ((ushort)0x0a)
#define CPMVEC_PIO_PC7 ((ushort)0x09)
#define CPMVEC_TIMER4 ((ushort)0x07)
#define CPMVEC_PIO_PC6 ((ushort)0x06)
#define CPMVEC_SPI ((ushort)0x05)
#define CPMVEC_SMC1 ((ushort)0x04)
#define CPMVEC_SMC2 ((ushort)0x03)
#define CPMVEC_PIO_PC5 ((ushort)0x02)
#define CPMVEC_PIO_PC4 ((ushort)0x01)
#define CPMVEC_ERROR ((ushort)0x00)
#define CPMVEC_OFFSET 0x00010000
#define CPMVEC_PIO_PC15 ((ushort)0x1f | CPMVEC_OFFSET)
#define CPMVEC_SCC1 ((ushort)0x1e | CPMVEC_OFFSET)
#define CPMVEC_SCC2 ((ushort)0x1d | CPMVEC_OFFSET)
#define CPMVEC_SCC3 ((ushort)0x1c | CPMVEC_OFFSET)
#define CPMVEC_SCC4 ((ushort)0x1b | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC14 ((ushort)0x1a | CPMVEC_OFFSET)
#define CPMVEC_TIMER1 ((ushort)0x19 | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC13 ((ushort)0x18 | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC12 ((ushort)0x17 | CPMVEC_OFFSET)
#define CPMVEC_SDMA_CB_ERR ((ushort)0x16 | CPMVEC_OFFSET)
#define CPMVEC_IDMA1 ((ushort)0x15 | CPMVEC_OFFSET)
#define CPMVEC_IDMA2 ((ushort)0x14 | CPMVEC_OFFSET)
#define CPMVEC_TIMER2 ((ushort)0x12 | CPMVEC_OFFSET)
#define CPMVEC_RISCTIMER ((ushort)0x11 | CPMVEC_OFFSET)
#define CPMVEC_I2C ((ushort)0x10 | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC11 ((ushort)0x0f | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC10 ((ushort)0x0e | CPMVEC_OFFSET)
#define CPMVEC_TIMER3 ((ushort)0x0c | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC9 ((ushort)0x0b | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC8 ((ushort)0x0a | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC7 ((ushort)0x09 | CPMVEC_OFFSET)
#define CPMVEC_TIMER4 ((ushort)0x07 | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC6 ((ushort)0x06 | CPMVEC_OFFSET)
#define CPMVEC_SPI ((ushort)0x05 | CPMVEC_OFFSET)
#define CPMVEC_SMC1 ((ushort)0x04 | CPMVEC_OFFSET)
#define CPMVEC_SMC2 ((ushort)0x03 | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC5 ((ushort)0x02 | CPMVEC_OFFSET)
#define CPMVEC_PIO_PC4 ((ushort)0x01 | CPMVEC_OFFSET)
#define CPMVEC_ERROR ((ushort)0x00 | CPMVEC_OFFSET)
extern void irq_install_handler(int vec, void (*handler)(void *), void *dev_id);

View File

@@ -93,7 +93,7 @@
* Miscellaneous configurable options
*/
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
#define CFG_PROMPT "] " /* Monitor Command Prompt */
#define CFG_HUSH_PARSER 1 /* use "hush" command parser */
/* #undef CFG_HUSH_PARSER */
@@ -145,7 +145,8 @@
/* Size in bytes reserved for initial data
*/
#define CFG_INIT_RAM_ADDR 0x400000
/* HJF: used to be 0x400000 */
#define CFG_INIT_RAM_ADDR 0x40000000
#define CFG_INIT_RAM_END 0x8000
#define CFG_GBL_DATA_SIZE 128
#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
@@ -163,24 +164,37 @@
/* SDRAM 0 - 256MB
*/
#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_RW | BATL_CACHEINHIBIT)
/*HJF: #define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_RW | BATL_CACHEINHIBIT)
#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_4M | BATU_VS | BATU_VP)
#define CFG_DBAT0L (CFG_SDRAM_BASE | BATL_PP_RW | BATL_CACHEINHIBIT)
#define CFG_DBAT0U CFG_IBAT0U
#define CFG_DBAT0U CFG_IBAT0U*/
/* SDRAM 1 - 256MB
#define CFG_DBAT0L (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
#define CFG_DBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
/* PCI Range
*/
#define CFG_IBAT1L ((CFG_SDRAM_BASE+CFG_INIT_RAM_ADDR) | BATL_PP_RW) /* | BATL_CACHEINHIBIT) */
#define CFG_DBAT1L (0x80000000 | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
#define CFG_DBAT1U (0x80000000 | BATU_BL_256M | BATU_VS | BATU_VP)
#define CFG_IBAT1L (0x80000000 | BATL_PP_RW | BATL_CACHEINHIBIT)
#define CFG_IBAT1U (0x80000000 | BATU_BL_256M | BATU_VS | BATU_VP)
/* HJF:
#define CFG_IBAT1L ((CFG_SDRAM_BASE+CFG_INIT_RAM_ADDR) | BATL_PP_RW)
#define CFG_IBAT1U ((CFG_SDRAM_BASE+CFG_INIT_RAM_ADDR) | BATU_BL_256M | BATU_VS | BATU_VP)
#define CFG_DBAT1L ((CFG_SDRAM_BASE+CFG_INIT_RAM_ADDR + 0x20000) | BATL_PP_RW ) /* | BATL_CACHEINHIBIT) */
#define CFG_DBAT1L ((CFG_SDRAM_BASE+CFG_INIT_RAM_ADDR + 0x20000) | BATL_PP_RW )
#define CFG_DBAT1U ((CFG_SDRAM_BASE+CFG_INIT_RAM_ADDR + 0x20000) | BATU_BL_256M | BATU_VS | BATU_VP)
*/
/* Init RAM in the CPU DCache (no backing memory)
*/
#define CFG_DBAT2L (CFG_INIT_RAM_ADDR | BATL_PP_RW | BATL_MEMCOHERENCE)
#define CFG_DBAT2U (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP)
#define CFG_IBAT2L 0 /* CFG_DBAT2L */
#define CFG_IBAT2U 0 /* CFG_DBAT2U */
/* This used to be commented out */
#define CFG_IBAT2L CFG_DBAT2L
/* This here too */
#define CFG_IBAT2U CFG_DBAT2U
/* I/O and PCI memory at 0xf0000000
*/
@@ -372,7 +386,7 @@
"pci_irqb_select=edge\0" \
"pci_irqc=11\0" \
"pci_irqc_select=edge\0" \
"pci_irqd=12\0" \
"pci_irqd=7\0" \
"pci_irqd_select=edge\0"

View File

@@ -212,6 +212,10 @@
#define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_OFFSET 0x8000 /* Offset of Environment Sector */
#define CFG_ENV_SIZE 0x4000 /* Total Size of Environment Sector */
/* Address and size of Redundant Environment Sector */
#define CFG_ENV_OFFSET_REDUND (CFG_ENV_OFFSET+CFG_ENV_SIZE)
#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE)
#else
/* Final version: environment in EEPROM */
#define CFG_ENV_IS_IN_EEPROM 1
@@ -242,7 +246,8 @@
#define CFG_SYPCR (SYPCR_SWTC | SYPCR_BMT | SYPCR_BME | SYPCR_SWF | \
SYPCR_SWE | SYPCR_SWRI| SYPCR_SWP)
#else
#define CFG_SYPCR (SYPCR_SWTC | SYPCR_BMT | SYPCR_BME | SYPCR_SWF | SYPCR_SWP)
#define CFG_SYPCR (SYPCR_SWTC | SYPCR_BMT | SYPCR_BME | SYPCR_SWF | \
SYPCR_SWP)
#endif
/*-----------------------------------------------------------------------

View File

@@ -292,7 +292,7 @@
#define CONFIG_IDE_8xx_PCCARD 1 /* Use IDE with PC Card Adapter */
#undef CONFIG_IDE_8xx_DIRECT /* Direct IDE not supported */
#undef CONFIG_IDE_LED /* LED for ide not supported */
#define CONFIG_IDE_LED 1 /* LED for ide supported */
#undef CONFIG_IDE_RESET /* reset for ide not supported */
#define CFG_IDE_MAXBUS 2

View File

@@ -140,6 +140,7 @@
CFG_CMD_BEDBUG | \
CFG_CMD_DATE | \
CFG_CMD_EEPROM | \
CFG_CMD_I2C | \
CFG_CMD_DOC)
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */

View File

@@ -57,11 +57,25 @@
#define CONFIG_PREBOOT "echo;echo Type \"run flash_nfs\" to mount root filesystem over NFS;echo"
#undef CONFIG_BOOTARGS
#define CONFIG_BOOTCOMMAND \
"bootp; " \
"setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off; " \
"bootm"
#define CONFIG_EXTRA_ENV_SETTINGS \
"nfsargs=setenv bootargs root=/dev/nfs rw " \
"nfsroot=$(serverip):$(rootpath)\0" \
"ramargs=setenv bootargs root=/dev/ram rw\0" \
"addip=setenv bootargs $(bootargs) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask)" \
":$(hostname):$(netdev):off panic=1\0" \
"flash_nfs=run nfsargs addip;" \
"bootm $(kernel_addr)\0" \
"flash_self=run ramargs addip;" \
"bootm $(kernel_addr) $(ramdisk_addr)\0" \
"net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0" \
"rootpath=/opt/eldk/ppc_8xx\0" \
"bootfile=/tftpboot/TQM860L/pImage\0" \
"kernel_addr=40040000\0" \
"ramdisk_addr=40100000\0" \
""
#define CONFIG_BOOTCOMMAND "run flash_self"
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
#undef CFG_LOADS_BAUD_CHANGE /* don't allow baudrate change */
@@ -84,6 +98,7 @@
#define CONFIG_RTC_MPC8xx /* use internal RTC of MPC8xx */
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
CFG_CMD_ASKENV | \
CFG_CMD_DHCP | \
CFG_CMD_IDE | \
CFG_CMD_DATE )
@@ -95,14 +110,22 @@
* Miscellaneous configurable options
*/
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
#if 0
#define CFG_HUSH_PARSER 1 /* use "hush" command parser */
#endif
#ifdef CFG_HUSH_PARSER
#define CFG_PROMPT_HUSH_PS2 "> "
#endif
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
#else
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#endif
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#define CFG_MAXARGS 16 /* max number of command args */
#define CFG_MAXARGS 16 /* max number of command args */
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
#define CFG_MEMTEST_START 0x0400000 /* memtest works on */
@@ -110,7 +133,7 @@
#define CFG_LOAD_ADDR 0x100000 /* default load address */
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }

View File

@@ -53,11 +53,25 @@
#define CONFIG_PREBOOT "echo;echo Type \"run flash_nfs\" to mount root filesystem over NFS;echo"
#undef CONFIG_BOOTARGS
#define CONFIG_BOOTCOMMAND \
"bootp; " \
"setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off; " \
"bootm"
#define CONFIG_EXTRA_ENV_SETTINGS \
"nfsargs=setenv bootargs root=/dev/nfs rw " \
"nfsroot=$(serverip):$(rootpath)\0" \
"ramargs=setenv bootargs root=/dev/ram rw\0" \
"addip=setenv bootargs $(bootargs) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask)" \
":$(hostname):$(netdev):off panic=1\0" \
"flash_nfs=run nfsargs addip;" \
"bootm $(kernel_addr)\0" \
"flash_self=run ramargs addip;" \
"bootm $(kernel_addr) $(ramdisk_addr)\0" \
"net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0" \
"rootpath=/opt/eldk/ppc_8xx\0" \
"bootfile=/tftpboot/TQM860L/pImage\0" \
"kernel_addr=40040000\0" \
"ramdisk_addr=40100000\0" \
""
#define CONFIG_BOOTCOMMAND "run flash_self"
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
#undef CFG_LOADS_BAUD_CHANGE /* don't allow baudrate change */
@@ -76,6 +90,7 @@
#define CONFIG_RTC_MPC8xx /* use internal RTC of MPC8xx */
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
CFG_CMD_ASKENV | \
CFG_CMD_DHCP | \
CFG_CMD_IDE | \
CFG_CMD_DATE )
@@ -87,14 +102,22 @@
* Miscellaneous configurable options
*/
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
#if 0
#define CFG_HUSH_PARSER 1 /* use "hush" command parser */
#endif
#ifdef CFG_HUSH_PARSER
#define CFG_PROMPT_HUSH_PS2 "> "
#endif
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
#else
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#endif
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#define CFG_MAXARGS 16 /* max number of command args */
#define CFG_MAXARGS 16 /* max number of command args */
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
#define CFG_MEMTEST_START 0x0400000 /* memtest works on */
@@ -102,7 +125,7 @@
#define CFG_LOAD_ADDR 0x100000 /* default load address */
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
@@ -294,7 +317,6 @@
/* Offset for alternate registers */
#define CFG_ATA_ALT_OFFSET 0x0100
/*-----------------------------------------------------------------------
*
*-----------------------------------------------------------------------

View File

@@ -39,25 +39,39 @@
#define CONFIG_8xx_CONS_SMC1 1 /* Console is on SMC1 */
#undef CONFIG_8xx_CONS_SMC2
#undef CONFIG_8xx_CONS_NONE
#define CONFIG_BAUDRATE 115200 /* console baudrate = 115kbps */
#if 0
#define CONFIG_BOOTDELAY -1 /* autoboot disabled */
#else
#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */
#endif
#define CONFIG_CLOCKS_IN_MHZ 1 /* clocks passsed to Linux in MHz */
#define CONFIG_BOARD_TYPES 1 /* support board types */
#define CONFIG_PREBOOT "echo;echo Type \"run flash_nfs\" to mount root filesystem over NFS;echo"
#define CONFIG_PREBOOT "echo;" \
"echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \
"echo"
#undef CONFIG_BOOTARGS
#define CONFIG_BOOTCOMMAND \
"bootp; " \
"setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off; " \
"bootm"
#define CONFIG_EXTRA_ENV_SETTINGS \
"nfsargs=setenv bootargs root=/dev/nfs rw " \
"nfsroot=$(serverip):$(rootpath)\0" \
"ramargs=setenv bootargs root=/dev/ram rw\0" \
"addip=setenv bootargs $(bootargs) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask)" \
":$(hostname):$(netdev):off panic=1\0" \
"flash_nfs=run nfsargs addip;" \
"bootm $(kernel_addr)\0" \
"flash_self=run ramargs addip;" \
"bootm $(kernel_addr) $(ramdisk_addr)\0" \
"net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0" \
"rootpath=/opt/eldk/ppc_8xx\0" \
"bootfile=/tftpboot/TQM860L/pImage\0" \
"kernel_addr=40040000\0" \
"ramdisk_addr=40100000\0" \
""
#define CONFIG_BOOTCOMMAND "run flash_self"
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
#undef CFG_LOADS_BAUD_CHANGE /* don't allow baudrate change */
@@ -76,6 +90,7 @@
#define CONFIG_RTC_MPC8xx /* use internal RTC of MPC8xx */
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
CFG_CMD_ASKENV | \
CFG_CMD_DHCP | \
CFG_CMD_IDE | \
CFG_CMD_DATE )
@@ -87,14 +102,22 @@
* Miscellaneous configurable options
*/
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
#if 0
#define CFG_HUSH_PARSER 1 /* use "hush" command parser */
#endif
#ifdef CFG_HUSH_PARSER
#define CFG_PROMPT_HUSH_PS2 "> "
#endif
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
#else
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#endif
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#define CFG_MAXARGS 16 /* max number of command args */
#define CFG_MAXARGS 16 /* max number of command args */
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
#define CFG_MEMTEST_START 0x0400000 /* memtest works on */
@@ -102,7 +125,7 @@
#define CFG_LOAD_ADDR 0x100000 /* default load address */
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
@@ -294,7 +317,6 @@
/* Offset for alternate registers */
#define CFG_ATA_ALT_OFFSET 0x0100
/*-----------------------------------------------------------------------
*
*-----------------------------------------------------------------------
@@ -441,5 +463,7 @@
#define BOOTFLAG_WARM 0x02 /* Software reboot */
#define CONFIG_SCC1_ENET
#define CONFIG_FEC_ENET
#define CONFIG_ETHPRIME "SCC ETHERNET"
#endif /* __CONFIG_H */

View File

@@ -49,15 +49,29 @@
#define CONFIG_BOARD_TYPES 1 /* support board types */
#define CONFIG_PREBOOT "echo;" \
"echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \
"echo"
"echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \
"echo"
#undef CONFIG_BOOTARGS
#define CONFIG_BOOTCOMMAND \
"bootp; " \
"setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off; " \
"bootm"
#define CONFIG_EXTRA_ENV_SETTINGS \
"nfsargs=setenv bootargs root=/dev/nfs rw " \
"nfsroot=$(serverip):$(rootpath)\0" \
"ramargs=setenv bootargs root=/dev/ram rw\0" \
"addip=setenv bootargs $(bootargs) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask)" \
":$(hostname):$(netdev):off panic=1\0" \
"flash_nfs=run nfsargs addip;" \
"bootm $(kernel_addr)\0" \
"flash_self=run ramargs addip;" \
"bootm $(kernel_addr) $(ramdisk_addr)\0" \
"net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0" \
"rootpath=/opt/eldk/ppc_8xx\0" \
"bootfile=/tftpboot/TQM860L/pImage\0" \
"kernel_addr=40040000\0" \
"ramdisk_addr=40100000\0" \
""
#define CONFIG_BOOTCOMMAND "run flash_self"
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
#undef CFG_LOADS_BAUD_CHANGE /* don't allow baudrate change */

View File

@@ -31,11 +31,6 @@
/* External logbuffer support */
#define CONFIG_LOGBUFFER
/* Reserve space for the logbuffer */
#ifdef CONFIG_LOGBUFFER
#define CONFIG_PRAM 20
#endif
/*
* High Level Configuration Options
* (easy to change)
@@ -82,12 +77,12 @@
#define CONFIG_BOOTCOMMAND "run flash_self"
#define CONFIG_EXTRA_ENV_SETTINGS \
"kernel_addr=40040000\0" \
"ramdisk_addr=40100000\0" \
"kernel_addr=40080000\0" \
"ramdisk_addr=40280000\0" \
"magic_keys=#3\0" \
"key_magic#=28\0" \
"key_cmd#=setenv addfb setenv bootargs \\$(bootargs) console=tty0\0" \
"key_magic3=24\0" \
"key_magic3=3C+3F\0" \
"key_cmd3=echo *** Entering Test Mode ***;" \
"setenv add_misc setenv bootargs \\$(bootargs) testmode\0" \
"nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath)\0" \
@@ -97,9 +92,10 @@
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off " \
"panic=1\0" \
"add_wdt=setenv bootargs $(bootargs) $(wdt_args)\0" \
"flash_nfs=run nfsargs addip add_wdt addfb;" \
"add_misc=setenv bootargs $(bootargs) runmode\0" \
"flash_nfs=run nfsargs addip add_wdt addfb add_misc;" \
"bootm $(kernel_addr)\0" \
"flash_self=run ramargs addip add_wdt addfb;" \
"flash_self=run ramargs addip add_wdt addfb add_misc;" \
"bootm $(kernel_addr) $(ramdisk_addr)\0" \
"net_nfs=tftp 100000 /tftpboot/pImage.lwmon;" \
"run nfsargs addip add_wdt addfb;bootm\0" \
@@ -282,7 +278,8 @@
#define CFG_I2C_KEYBD_ADDR 0x56 /* PIC LWE keyboard */
#define CFG_I2C_PICIO_ADDR 0x57 /* PIC IO Expander */
#define CONFIG_USE_FRAM /* Use FRAM instead of EEPROM */
#undef CONFIG_USE_FRAM /* Use FRAM instead of EEPROM */
#ifdef CONFIG_USE_FRAM /* use FRAM */
#define CFG_I2C_EEPROM_ADDR 0x55 /* FRAM FM24CL64 */
#define CFG_I2C_EEPROM_ADDR_LEN 2
@@ -293,6 +290,36 @@
#endif /* CONFIG_USE_FRAM */
#define CFG_EEPROM_PAGE_WRITE_BITS 4
/* List of I2C addresses to be verified by POST */
#ifdef CONFIG_USE_FRAM
#define I2C_ADDR_LIST { /* CFG_I2C_AUDIO_ADDR, */ \
CFG_I2C_SYSMON_ADDR, \
CFG_I2C_RTC_ADDR, \
CFG_I2C_POWER_A_ADDR, \
CFG_I2C_POWER_B_ADDR, \
CFG_I2C_KEYBD_ADDR, \
CFG_I2C_PICIO_ADDR, \
CFG_I2C_EEPROM_ADDR, \
}
#else /* Use EEPROM - which show up on 8 consequtive addresses */
#define I2C_ADDR_LIST { /* CFG_I2C_AUDIO_ADDR, */ \
CFG_I2C_SYSMON_ADDR, \
CFG_I2C_RTC_ADDR, \
CFG_I2C_POWER_A_ADDR, \
CFG_I2C_POWER_B_ADDR, \
CFG_I2C_KEYBD_ADDR, \
CFG_I2C_PICIO_ADDR, \
CFG_I2C_EEPROM_ADDR+0, \
CFG_I2C_EEPROM_ADDR+1, \
CFG_I2C_EEPROM_ADDR+2, \
CFG_I2C_EEPROM_ADDR+3, \
CFG_I2C_EEPROM_ADDR+4, \
CFG_I2C_EEPROM_ADDR+5, \
CFG_I2C_EEPROM_ADDR+6, \
CFG_I2C_EEPROM_ADDR+7, \
}
#endif /* CONFIG_USE_FRAM */
/*-----------------------------------------------------------------------
* Cache Configuration
*/

View File

@@ -25,9 +25,15 @@
#ifdef CONFIG_LOGBUFFER
#define LOGBUFF_TEST0 0x01
#define LOGBUFF_LEN (16384) /* Must be 16k right now */
#define LOGBUFF_MASK (LOGBUFF_LEN-1)
#define LOGBUFF_OVERHEAD (4096) /* Logbuffer overhead for extra info */
#define LOGBUFF_RESERVE (LOGBUFF_LEN+LOGBUFF_OVERHEAD)
#define LOGBUFF_INITIALIZED (1<<31)
int drv_logbuff_init (void);
void logbuff_init_ptrs (void);
void logbuff_log(char *msg);
void logbuff_reset (void);

View File

@@ -38,6 +38,7 @@
#define POST_RAM 0x0200 /* test runs in RAM */
#define POST_MANUAL 0x0400 /* test runs on diag command */
#define POST_REBOOT 0x0800 /* test may cause rebooting */
#define POST_PREREL 0x1000 /* test runs before relocation */
#define POST_MEM (POST_RAM | POST_ROM)
#define POST_ALWAYS (POST_POWERNORMAL | \
@@ -53,10 +54,12 @@ struct post_test {
char *desc;
int flags;
int (*test) (int flags);
unsigned long testid;
};
void post_bootmode_init (void);
int post_bootmode_get (unsigned int * last_test);
void post_bootmode_clear (void);
void post_output_backlog ( void );
int post_run (char *name, int flags);
int post_info (char *name);
int post_log (char *format, ...);

View File

@@ -24,6 +24,6 @@
#ifndef __VERSION_H__
#define __VERSION_H__
#define U_BOOT_VERSION "U-Boot 0.1.1"
#define U_BOOT_VERSION "U-Boot 0.2.1"
#endif /* __VERSION_H__ */

View File

@@ -161,6 +161,11 @@ static void syscalls_init (void)
*addr++ |= NR_SYSCALLS & 0xFFFF;
flush_cache (0x0C00, 0x10);
/* Initialize syscalls stack pointer */
addr = (ulong *) 0xCFC;
*addr = (ulong)addr;
flush_cache ((ulong)addr, 0x10);
}
/*
@@ -357,6 +362,7 @@ void board_init_f (ulong bootflag)
* relocate the code and continue running from DRAM.
*
* Reserve memory at end of RAM for (top down in that order):
* - kernel log buffer
* - protected RAM
* - LCD framebuffer
* - monitor code
@@ -381,6 +387,14 @@ void board_init_f (ulong bootflag)
(gd->ram_size > 256 << 20) ? 256 << 20 : gd->ram_size;
#endif
#ifdef CONFIG_LOGBUFFER
/* reserve kernel log buffer */
addr -= (LOGBUFF_RESERVE);
# ifdef DEBUG
printf ("Reserving %ldk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr);
# endif
#endif
#ifdef CONFIG_PRAM
/*
* reserve protected RAM
@@ -608,9 +622,10 @@ void board_init_r (gd_t *id, ulong dest_addr)
WATCHDOG_RESET ();
#ifdef CONFIG_LOGBUFFER
logbuff_reset ();
logbuff_init_ptrs ();
#endif
#ifdef CONFIG_POST
post_output_backlog ();
post_reloc ();
#endif
@@ -924,21 +939,29 @@ void board_init_r (gd_t *id, ulong dest_addr)
bedbug_init ();
#endif
#ifdef CONFIG_PRAM
#if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
/*
* Export available size of memory for Linux,
* taking into account the protected RAM at top of memory
*/
{
ulong pram;
char *s;
uchar memsz[32];
#ifdef CONFIG_PRAM
char *s;
if ((s = getenv ("pram")) != NULL) {
pram = simple_strtoul (s, NULL, 10);
} else {
pram = CONFIG_PRAM;
}
#else
pram=0;
#endif
#ifdef CONFIG_LOGBUFFER
/* Also take the logbuffer into account (pram is in kB) */
pram += (LOGBUFF_LEN+LOGBUFF_OVERHEAD)/1024;
#endif
sprintf (memsz, "%ldk", (bd->bi_memsize / 1024) - pram);
setenv ("mem", memsz);
}

View File

@@ -29,8 +29,13 @@
* I2C test
*
* For verifying the I2C bus, a full I2C bus scanning is performed.
* If any I2C device is found, the test is considered as passed,
* otherwise failed.
*
* #ifdef I2C_ADDR_LIST
* The test is considered as passed if all the devices and
* only the devices in the list are found.
* #else [ ! I2C_ADDR_LIST ]
* The test is considered as passed if any I2C device is found.
* #endif
*/
#include <post.h>
@@ -41,14 +46,48 @@
int i2c_post_test (int flags)
{
unsigned int i;
unsigned int chips = 0;
unsigned int good = 0;
#ifdef I2C_ADDR_LIST
unsigned int bad = 0;
int j;
unsigned char i2c_addr_list[] = I2C_ADDR_LIST;
unsigned char i2c_miss_list[] = I2C_ADDR_LIST;
#endif
for (i = 0; i < 128; i++) {
if (i2c_probe (i) == 0)
chips++;
if (i2c_probe (i) == 0) {
#ifndef I2C_ADDR_LIST
good++;
#else /* I2C_ADDR_LIST */
for (j=0; j<sizeof(i2c_addr_list); ++j) {
if (i == i2c_addr_list[j]) {
good++;
i2c_miss_list[j] = 0xFF;
break;
}
}
if (j == sizeof(i2c_addr_list)) {
bad++;
post_log ("I2C: addr %02X not expected\n",
i);
}
#endif /* I2C_ADDR_LIST */
}
}
return chips > 0 ? 0 : -1;
#ifndef I2C_ADDR_LIST
return good > 0 ? 0 : -1;
#else /* I2C_ADDR_LIST */
if (good != sizeof(i2c_addr_list)) {
for (j=0; j<sizeof(i2c_miss_list); ++j) {
if (i2c_miss_list[j] != 0xFF) {
post_log ("I2C: addr %02X did not respond\n",
i2c_miss_list[j]);
}
}
}
return ((good == sizeof(i2c_addr_list)) && (bad == 0)) ? 0 : -1;
#endif
}
#endif /* CONFIG_POST & CFG_POST_I2C */

View File

@@ -38,6 +38,7 @@
void post_bootmode_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
int bootmode = post_bootmode_get (0);
if (bootmode == 0) {
@@ -49,6 +50,8 @@ void post_bootmode_init (void)
}
post_word_store (BOOTMODE_MAGIC | bootmode);
/* Reset activity record */
gd->post_log_word = 0;
}
int post_bootmode_get (unsigned int *last_test)
@@ -74,6 +77,36 @@ void post_bootmode_clear (void)
post_word_store (0);
}
/* POST tests run before relocation only mark status bits .... */
static void post_log_mark_start ( unsigned long testid )
{
DECLARE_GLOBAL_DATA_PTR;
gd->post_log_word |= (testid)<<16;
}
static void post_log_mark_succ ( unsigned long testid )
{
DECLARE_GLOBAL_DATA_PTR;
gd->post_log_word |= testid;
}
/* ... and the messages are output once we are relocated */
void post_output_backlog ( void )
{
DECLARE_GLOBAL_DATA_PTR;
int j;
for (j = 0; j < post_list_size; j++) {
if (gd->post_log_word & (post_list[j].testid<<16)) {
post_log ("POST %s ", post_list[j].cmd);
if (gd->post_log_word & post_list[j].testid)
post_log ("PASSED\n");
else
post_log ("FAILED\n");
}
}
}
static void post_bootmode_test_on (unsigned int last_test)
{
unsigned long word = post_word_load ();
@@ -160,13 +193,21 @@ static int post_run_single (struct post_test *test,
post_bootmode_test_on (i);
}
if (test_flags & POST_PREREL)
post_log_mark_start ( test->testid );
else
post_log ("POST %s ", test->cmd);
}
if (test_flags & POST_PREREL) {
if ((*test->test) (flags) == 0)
post_log_mark_succ ( test->testid );
} else {
if ((*test->test) (flags) != 0)
post_log ("FAILED\n");
else
post_log ("PASSED\n");
}
if ((test_flags & POST_REBOOT) && !(flags & POST_MANUAL)) {
post_bootmode_test_off ();
@@ -282,6 +323,7 @@ int post_log (char *format, ...)
va_end (args);
#ifdef CONFIG_LOGBUFFER
/* Send to the logbuffer */
logbuff_log (printbuffer);
#else
/* Send to the stdout file */

View File

@@ -19,6 +19,10 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* Be sure to mark tests to be run before relocation as such with the
* CFG_POST_PREREL flag so that logging is done correctly if the
* logbuffer support is enabled.
*/
#include <common.h>
@@ -47,7 +51,8 @@ struct post_test post_list[] =
"cache",
"This test verifies the CPU cache operation.",
POST_RAM | POST_ALWAYS,
&cache_post_test
&cache_post_test,
CFG_POST_CACHE
},
#endif
#if CONFIG_POST & CFG_POST_WATCHDOG
@@ -56,7 +61,8 @@ struct post_test post_list[] =
"watchdog",
"This test checks the watchdog timer.",
POST_RAM | POST_POWERON | POST_POWERFAIL | POST_MANUAL | POST_REBOOT,
&watchdog_post_test
&watchdog_post_test,
CFG_POST_WATCHDOG
},
#endif
#if CONFIG_POST & CFG_POST_I2C
@@ -65,7 +71,8 @@ struct post_test post_list[] =
"i2c",
"This test verifies the I2C operation.",
POST_RAM | POST_ALWAYS,
&i2c_post_test
&i2c_post_test,
CFG_POST_I2C
},
#endif
#if CONFIG_POST & CFG_POST_RTC
@@ -74,7 +81,8 @@ struct post_test post_list[] =
"rtc",
"This test verifies the RTC operation.",
POST_RAM | POST_POWERFAIL | POST_MANUAL,
&rtc_post_test
&rtc_post_test,
CFG_POST_RTC
},
#endif
#if CONFIG_POST & CFG_POST_MEMORY
@@ -82,8 +90,9 @@ struct post_test post_list[] =
"Memory test",
"memory",
"This test checks RAM.",
POST_ROM | POST_POWERON | POST_POWERFAIL,
&memory_post_test
POST_ROM | POST_POWERON | POST_POWERFAIL | POST_PREREL,
&memory_post_test,
CFG_POST_MEMORY
},
#endif
#if CONFIG_POST & CFG_POST_CPU
@@ -93,7 +102,8 @@ struct post_test post_list[] =
"This test verifies the arithmetic logic unit of"
" CPU.",
POST_RAM | POST_ALWAYS,
&cpu_post_test
&cpu_post_test,
CFG_POST_CPU
},
#endif
#if CONFIG_POST & CFG_POST_UART
@@ -102,7 +112,8 @@ struct post_test post_list[] =
"uart",
"This test verifies the UART operation.",
POST_RAM | POST_POWERFAIL | POST_MANUAL,
&uart_post_test
&uart_post_test,
CFG_POST_UART
},
#endif
#if CONFIG_POST & CFG_POST_ETHER
@@ -111,7 +122,8 @@ struct post_test post_list[] =
"ethernet",
"This test verifies the ETHERNET operation.",
POST_RAM | POST_ALWAYS | POST_MANUAL,
&ether_post_test
&ether_post_test,
CFG_POST_ETHER
},
#endif
#if CONFIG_POST & CFG_POST_SPI
@@ -120,7 +132,8 @@ struct post_test post_list[] =
"spi",
"This test verifies the SPI operation.",
POST_RAM | POST_ALWAYS | POST_MANUAL,
&spi_post_test
&spi_post_test,
CFG_POST_SPI
},
#endif
#if CONFIG_POST & CFG_POST_USB
@@ -129,7 +142,8 @@ struct post_test post_list[] =
"usb",
"This test verifies the USB operation.",
POST_RAM | POST_ALWAYS | POST_MANUAL,
&usb_post_test
&usb_post_test,
CFG_POST_USB
},
#endif
#if CONFIG_POST & CFG_POST_SPR
@@ -137,8 +151,9 @@ struct post_test post_list[] =
"SPR test",
"spr",
"This test checks SPR contents.",
POST_ROM | POST_ALWAYS,
&spr_post_test
POST_ROM | POST_ALWAYS | POST_PREREL,
&spr_post_test,
CFG_POST_SPR
},
#endif
};

46
tools/env/Makefile vendored Normal file
View File

@@ -0,0 +1,46 @@
#
# (C) Copyright 2002
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# See file CREDITS for list of people who contributed to this
# project.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
SOURCES := crc32.c fw_env.c fw_env_main.c
HEADERS := fw_env.h
all: fw_printenv
fw_printenv: $(SOURCES) $(HEADERS)
$(CROSS_COMPILE)gcc -Wall -DUSE_HOSTCC $(SOURCES) -o fw_printenv
clean:
rm -f fw_printenv crc32.c
crc32.c:
ln -s ../../lib_generic/crc32.c crc32.c
#########################################################################
.depend: Makefile $(SOURCES)
$(CC) -M $(HOST_CFLAGS) $(CPPFLAGS) -DUSE_HOSTCC $(SOURCES) > $@
sinclude .depend
#########################################################################

29
tools/env/README vendored Normal file
View File

@@ -0,0 +1,29 @@
This is a demo implementation of a Linux command line tool to access
the U-Boot's environment variables.
Configuration is done via #defines in the fw_env.h file. The
following lines are relevant:
#define HAVE_REDUND /* For systems with 2 env sectors */
#define DEVICE1_NAME "/dev/mtd1"
#define DEVICE2_NAME "/dev/mtd2"
#define ENV1_SIZE 0x4000
#define DEVICE1_ESIZE 0x4000
#define ENV2_SIZE 0x4000
#define DEVICE2_ESIZE 0x4000
Current configuration matches the environment layout of the TRAB
board.
Un-define HAVE_REDUND, if you want to use the utlities on a system
that does not have support for redundant environment enabled. The
DEVICEx_NAME constants define which MTD character device(s) is (are)
to be used to access the environment. If HAVE_REDUND is undefined,
DEVICE2_NAME is ignored, as is ENV2_SIZE and DEVICE2_ESIZE. ENVx_SIZE
defines the size in bytes taken by the environment, which may be less
then flash sector size, if the environment takes less then 1 sector.
DEVICEx_ESIZE defines the size of the first sector in the flash
partition where the environment resides. It is assumed that the
environment is located in the first ENVx_SIZE bytes of the device
DEVICEx_NAME.

662
tools/env/fw_env.c vendored Normal file
View File

@@ -0,0 +1,662 @@
/*
* (C) Copyright 2000
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/mtd/mtd.h>
#include "fw_env.h"
typedef unsigned char uchar;
#define CMD_GETENV "fw_printenv"
#define CMD_SETENV "fw_setenv"
typedef struct envdev_s {
uchar devname[16]; /* Device name */
ulong env_size; /* environment size */
ulong erase_size; /* device erase size */
} envdev_t;
static envdev_t envdevices[2];
static int curdev;
#define DEVNAME(i) envdevices[(i)].devname
#define ENVSIZE(i) envdevices[(i)].env_size
#define DEVESIZE(i) envdevices[(i)].erase_size
#define CFG_ENV_SIZE ENVSIZE(curdev)
#ifdef HAVE_REDUND
#define ENV_SIZE (CFG_ENV_SIZE - sizeof(long) - 1)
#else
#define ENV_SIZE (CFG_ENV_SIZE - sizeof(long))
#endif
typedef struct environment_s {
ulong crc; /* CRC32 over data bytes */
uchar flags; /* active or obsolete */
uchar *data;
} env_t;
static env_t environment;
static int valid = 0;
#ifdef HAVE_REDUND
static uchar active_flag = 1;
static uchar obsolete_flag = 0;
#endif
#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)
static uchar default_environment[] = {
#ifdef CONFIG_BOOTARGS
"bootargs=" CONFIG_BOOTARGS "\0"
#endif
#ifdef CONFIG_BOOTCOMMAND
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
#endif
#if (CONFIG_BOOTDELAY >= 0)
"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
#endif
#if (CONFIG_BAUDRATE >= 0)
"baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
#endif
#ifdef CONFIG_ETHADDR
"ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
#endif
#ifdef CONFIG_IPADDR
"ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
#endif
#ifdef CONFIG_SERVERIP
"serverip=" MK_STR(CONFIG_SERVERIP) "\0"
#endif
"\0"
};
static int flash_io (int mode);
static uchar *envmatch(uchar *s1, uchar *s2);
static int env_init(void);
static int parse_config(void);
/*
* Search the environment for a variable.
* Return the value, if found, or NULL, if not found.
*/
unsigned char *fw_getenv (unsigned char *name)
{
uchar *env, *nxt;
if (env_init())
return (NULL);
for (env=environment.data; *env; env=nxt+1) {
uchar *val;
for (nxt=env; *nxt; ++nxt) {
if (nxt >= &environment.data[ENV_SIZE]) {
fprintf (stderr, "## Error: "
"environment not terminated\n");
return (NULL);
}
}
val=envmatch(name, env);
if (!val)
continue;
return (val);
}
return (NULL);
}
/*
* Print the current definition of one, or more, or all
* environment variables
*/
void fw_printenv(int argc, char *argv[])
{
uchar *env, *nxt;
int i, n_flag;
if (env_init())
return;
if (argc == 1) { /* Print all env variables */
for (env=environment.data; *env; env=nxt+1) {
for (nxt=env; *nxt; ++nxt) {
if (nxt >= &environment.data[ENV_SIZE]) {
fprintf (stderr, "## Error: "
"environment not terminated\n");
return;
}
}
printf("%s\n", env);
}
return;
}
if (strcmp(argv[1], "-n") == 0) {
n_flag = 1;
++argv;
--argc;
if (argc != 2) {
fprintf (stderr, "## Error: "
"`-n' option requires exactly one argument\n");
return;
}
} else {
n_flag = 0;
}
for (i=1; i<argc; ++i) { /* print single env variables */
uchar *name = argv[i];
uchar *val = NULL;
for (env=environment.data; *env; env=nxt+1) {
for (nxt=env; *nxt; ++nxt) {
if (nxt >= &environment.data[ENV_SIZE]) {
fprintf (stderr, "## Error: "
"environment not terminated\n");
return;
}
}
val=envmatch(name, env);
if (val) {
if (!n_flag) {
fputs (name, stdout);
putc ('=', stdout);
}
puts (val);
break;
}
}
if (!val)
fprintf (stderr, "## Error: \"%s\" not defined\n",
name);
}
}
/*
* Deletes or sets environment variables. Returns errno style error codes:
* 0 - OK
* EINVAL - need at least 1 argument
* EROFS - certain variables ("ethaddr", "serial#") cannot be
* modified or deleted
*
*/
int fw_setenv (int argc, char *argv[])
{
int i, len;
uchar *env, *nxt;
uchar *oldval = NULL;
uchar *name;
if (argc < 2) {
return (EINVAL);
}
if (env_init())
return (errno);
name = argv[1];
/*
* search if variable with this name already exists
*/
for (env=environment.data; *env; env=nxt+1) {
for (nxt=env; *nxt; ++nxt) {
if (nxt >= &environment.data[ENV_SIZE]) {
fprintf (stderr, "## Error: "
"environment not terminated\n");
return (EINVAL);
}
}
if ((oldval=envmatch(name, env)) != NULL)
break;
}
/*
* Delete any existing definition
*/
if (oldval) {
/*
* Ethernet Address and serial# can be set only once
*/
if ((strcmp (name, "ethaddr") == 0) ||
(strcmp (name, "serial#") == 0) ) {
fprintf (stderr, "Can't overwrite \"%s\"\n", name);
return (EROFS);
}
if (*++nxt == '\0') {
*env = '\0';
} else {
for (;;) {
*env = *nxt++;
if ((*env == '\0') && (*nxt == '\0'))
break;
++env;
}
}
*++env = '\0';
}
/* Delete only ? */
if (argc < 3)
goto WRITE_FLASH;
/*
* Append new definition at the end
*/
for (env=environment.data; *env || *(env+1); ++env)
;
if (env > environment.data)
++env;
/*
* Overflow when:
* "name" + "=" + "val" +"\0\0" > CFG_ENV_SIZE - (env-environment)
*/
len = strlen(name) + 2;
/* add '=' for first arg, ' ' for all others */
for (i=2; i<argc; ++i) {
len += strlen(argv[i]) + 1;
}
if (len > (&environment.data[ENV_SIZE]-env)) {
fprintf (stderr,
"Error: environment overflow, \"%s\" deleted\n",
name);
return (-1);
}
while ((*env = *name++) != '\0')
env++;
for (i=2; i<argc; ++i) {
uchar *val = argv[i];
*env = (i==2) ? '=' : ' ';
while ((*++env = *val++) != '\0')
;
}
/* end is marked with double '\0' */
*++env = '\0';
WRITE_FLASH:
/* Update CRC */
environment.crc = crc32(0, environment.data, ENV_SIZE);
/* write environment back to flash */
if (flash_io (O_RDWR)) {
fprintf (stderr,
"Error: can't write fw_env to flash\n");
return (-1);
}
return (0);
}
static int flash_io (int mode)
{
int fd, fdr, rc, otherdev, len, resid;
erase_info_t erase;
char *data;
if ((fd = open(DEVNAME(curdev), mode)) < 0) {
fprintf (stderr,
"Can't open %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
len = sizeof(environment.crc) + sizeof(environment.flags);
if (mode == O_RDWR) {
#ifdef HAVE_REDUND
/* switch to next partition for writing */
otherdev = !curdev;
if ((fdr = open(DEVNAME(otherdev), mode)) < 0) {
fprintf (stderr,
"Can't open %s: %s\n",
DEVNAME(otherdev), strerror(errno));
return (-1);
}
#else
otherdev = curdev;
fdr = fd;
len = sizeof(environment.crc);
#endif
printf("Unlocking flash...\n");
erase.length = DEVESIZE(otherdev);
erase.start = 0;
ioctl (fdr, MEMUNLOCK, &erase);
#ifdef HAVE_REDUND
erase.length = DEVESIZE(curdev);
erase.start = 0;
ioctl (fd, MEMUNLOCK, &erase);
environment.flags = active_flag;
#endif
printf("Done\n");
resid = DEVESIZE(otherdev) - CFG_ENV_SIZE;
if (resid) {
if ((data = malloc(resid)) == NULL) {
fprintf(stderr,
"Cannot malloc %d bytes: %s\n",
resid, strerror(errno));
return (-1);
}
if (lseek (fdr, CFG_ENV_SIZE, SEEK_SET) == -1) {
fprintf (stderr,
"seek error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
if ((rc = read (fdr, data, resid)) != resid) {
fprintf (stderr,
"read error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
if (lseek (fdr, 0, SEEK_SET) == -1) {
fprintf (stderr,
"seek error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
}
printf("Erasing old environment...\n");
erase.length = DEVESIZE(otherdev);
if (ioctl (fdr, MEMERASE, &erase) != 0) {
fprintf (stderr, "MTD erase error on %s: %s\n",
DEVNAME(otherdev), strerror(errno));
return (-1);
}
printf("Done\n");
printf("Writing environment to %s...\n",DEVNAME(otherdev));
if (write(fdr, &environment, len) != len) {
fprintf (stderr,
"CRC write error on %s: %s\n",
DEVNAME(otherdev), strerror(errno));
return (-1);
}
if (write(fdr, environment.data, ENV_SIZE) != ENV_SIZE) {
fprintf (stderr,
"Write error on %s: %s\n",
DEVNAME(otherdev), strerror(errno));
return (-1);
}
if (resid) {
if (write (fdr, data, resid) != resid) {
fprintf (stderr,
"write error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
free(data);
}
#ifdef HAVE_REDUND
/* change flag on current active env partition */
if (lseek (fd, sizeof(ulong), SEEK_SET) == -1) {
fprintf (stderr,
"seek error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
if (write (fd, &obsolete_flag, sizeof(obsolete_flag)) !=
sizeof(obsolete_flag)) {
fprintf (stderr,
"Write error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
#endif
printf("Done\n");
printf("Locking ...\n");
erase.length = DEVESIZE(otherdev);
erase.start = 0;
ioctl (fdr, MEMLOCK, &erase);
#ifdef HAVE_REDUND
erase.length = DEVESIZE(curdev);
erase.start = 0;
ioctl (fd, MEMLOCK, &erase);
if (close(fdr)) {
fprintf (stderr,
"I/O error on %s: %s\n",
DEVNAME(otherdev), strerror(errno));
return (-1);
}
#endif
printf("Done\n");
} else {
#ifndef HAVE_REDUND
len = sizeof(environment.crc);
#endif
if (read (fd, &environment, len) != len) {
fprintf (stderr,
"CRC read error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
if ((rc = read (fd, environment.data, ENV_SIZE)) != ENV_SIZE) {
fprintf (stderr,
"Read error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
}
if (close(fd)) {
fprintf (stderr,
"I/O error on %s: %s\n",
DEVNAME(curdev), strerror(errno));
return (-1);
}
/* everything ok */
return (0);
}
/*
* s1 is either a simple 'name', or a 'name=value' pair.
* s2 is a 'name=value' pair.
* If the names match, return the value of s2, else NULL.
*/
static uchar *
envmatch (uchar *s1, uchar *s2)
{
while (*s1 == *s2++)
if (*s1++ == '=')
return(s2);
if (*s1 == '\0' && *(s2-1) == '=')
return(s2);
return(NULL);
}
/*
* Prevent confusion if running from erased flash memory
*/
static int env_init(void)
{
int crc1, crc1_ok;
uchar *addr1;
#ifdef HAVE_REDUND
int crc2, crc2_ok;
uchar flag1, flag2, *addr2;
#endif
if (!valid) {
if (parse_config()) /* should fill envdevices */
return 1;
if ((addr1 = calloc (1, ENV_SIZE)) == NULL) {
fprintf (stderr,
"Not enough memory for environment (%ld bytes)\n",
ENV_SIZE);
return (errno);
}
/* read environment from FLASH to local buffer */
environment.data = addr1;
curdev = 0;
if (flash_io (O_RDONLY)) {
return (errno);
}
crc1_ok = ((crc1 = crc32(0, environment.data, ENV_SIZE))
== environment.crc);
#ifndef HAVE_REDUND
if (!crc1_ok) {
fprintf (stderr,
"Warning: Bad CRC, using default environment\n");
environment.data = default_environment;
free(addr1);
}
#else
flag1 = environment.flags;
curdev = 1;
if ((addr2 = calloc (1, ENV_SIZE)) == NULL) {
fprintf (stderr,
"Not enough memory for environment (%ld bytes)\n",
ENV_SIZE);
return (errno);
}
environment.data = addr2;
if (flash_io (O_RDONLY)) {
return (errno);
}
crc2_ok = ((crc2 = crc32(0, environment.data, ENV_SIZE))
== environment.crc);
flag2 = environment.flags;
if (crc1_ok && ! crc2_ok) {
environment.data = addr1;
environment.flags = flag1;
environment.crc = crc1;
curdev = 0;
free(addr2);
}
else if (! crc1_ok && crc2_ok) {
environment.data = addr2;
environment.flags = flag2;
environment.crc = crc2;
curdev = 1;
free(addr1);
}
else if (! crc1_ok && ! crc2_ok) {
fprintf (stderr,
"Warning: Bad CRC, using default environment\n");
environment.data = default_environment;
curdev = 0;
free(addr2);
free(addr1);
}
else if (flag1 == active_flag && flag2 == obsolete_flag) {
environment.data = addr1;
environment.flags = flag1;
environment.crc = crc1;
curdev = 0;
free(addr2);
}
else if (flag1 == obsolete_flag && flag2 == active_flag) {
environment.data = addr2;
environment.flags = flag2;
environment.crc = crc2;
curdev = 1;
free(addr1);
}
else if (flag1 == flag2) {
environment.data = addr1;
environment.flags = flag1;
environment.crc = crc1;
curdev = 0;
free(addr2);
}
else if (flag1 == 0xFF) {
environment.data = addr1;
environment.flags = flag1;
environment.crc = crc1;
curdev = 0;
free(addr2);
}
else if (flag2 == 0xFF) {
environment.data = addr2;
environment.flags = flag2;
environment.crc = crc2;
curdev = 1;
free(addr1);
}
#endif
valid = 1;
}
return (0);
}
static int parse_config()
{
struct stat st;
if (stat (DEVICE1_NAME, &st)) {
fprintf (stderr,
"Cannot access MTD device %s: %s\n",
DEVICE1_NAME, strerror(errno));
return 1;
}
strcpy(DEVNAME(0), DEVICE1_NAME);
ENVSIZE(0) = ENV1_SIZE;
DEVESIZE(0) = DEVICE1_ESIZE;
#ifdef HAVE_REDUND
if (stat (DEVICE2_NAME, &st)) {
fprintf (stderr,
"Cannot access MTD device %s: %s\n",
DEVICE2_NAME, strerror(errno));
return 1;
}
strcpy(DEVNAME(1), DEVICE2_NAME);
ENVSIZE(1) = ENV2_SIZE;
DEVESIZE(1) = DEVICE2_ESIZE;
#endif
return 0;
}

44
tools/env/fw_env.h vendored Normal file
View File

@@ -0,0 +1,44 @@
/*
* (C) Copyright 2002
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#define HAVE_REDUND /* For systems with 2 env sectors */
#define DEVICE1_NAME "/dev/mtd1"
#define DEVICE2_NAME "/dev/mtd2"
#define ENV1_SIZE 0x4000
#define DEVICE1_ESIZE 0x4000
#define ENV2_SIZE 0x4000
#define DEVICE2_ESIZE 0x4000
#define CONFIG_BAUDRATE 115200
#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */
#define CONFIG_BOOTCOMMAND \
"bootp; " \
"setenv bootargs root=/dev/nfs nfsroot=$(serverip):$(rootpath) " \
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off; " \
"bootm"
extern void fw_printenv(int argc, char *argv[]);
extern unsigned char *fw_getenv (unsigned char *name);
extern int fw_setenv (int argc, char *argv[]);
extern unsigned long crc32 (unsigned long, const unsigned char *, unsigned);

78
tools/env/fw_env_main.c vendored Normal file
View File

@@ -0,0 +1,78 @@
/*
* (C) Copyright 2000
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* Command line user interface to firmware (=PPCBoot) environment.
*
* Implements:
* fw_printenv [ name ... ]
* - prints the values of the environment variables
* "name", or the whole environment if no names are
* specified
* fw_setenv name [ value ... ]
* - If a name without any values is given, the variable
* with this name is deleted from the environment;
* otherwise, all "value" arguments are concatenated,
* separated by sinlge blank characters, and the
* resulting string is assigned to the environment
* variable "name"
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "fw_env.h"
#define CMD_PRINTENV "fw_printenv"
#define CMD_SETENV "fw_setenv"
int
main(int argc, char *argv[])
{
char *p;
char *cmdname = *argv;
if ((p = strrchr (cmdname, '/')) != NULL) {
cmdname = p + 1;
}
if (strcmp(cmdname, CMD_PRINTENV) == 0) {
fw_printenv (argc, argv);
return (EXIT_SUCCESS);
} else if (strcmp(cmdname, CMD_SETENV) == 0) {
if (fw_setenv (argc, argv) != 0)
return (EXIT_FAILURE);
return (EXIT_SUCCESS);
}
fprintf (stderr,
"Identity crisis - may be called as `" CMD_PRINTENV
"' or as `" CMD_SETENV "' but not as `%s'\n",
cmdname);
return (EXIT_FAILURE);
}