mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
Compare commits
8 Commits
LABEL_2002
...
LABEL_2002
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13122b4f1d | ||
|
|
288b3d7f5a | ||
|
|
2f91a3d0f8 | ||
|
|
93f19cc0ed | ||
|
|
6aff3115b9 | ||
|
|
228f29ac6e | ||
|
|
7c7a23bd5a | ||
|
|
1f53a41603 |
40
CHANGELOG
40
CHANGELOG
@@ -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
|
||||
|
||||
3
Makefile
3
Makefile
@@ -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
18
README
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
#########################################################################
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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++)
|
||||
|
||||
@@ -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();*/
|
||||
}
|
||||
|
||||
80
board/MAI/bios_emulator/scitech/src/x86emu/makefile.uboot
Normal file
80
board/MAI/bios_emulator/scitech/src/x86emu/makefile.uboot
Normal 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.
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
/*
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
136
common/cmd_log.c
136
common/cmd_log.c
@@ -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++;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) */
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/************************************************************************/
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" \
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) */
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*
|
||||
*-----------------------------------------------------------------------
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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, ...);
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
51
post/i2c.c
51
post/i2c.c
@@ -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 */
|
||||
|
||||
42
post/post.c
42
post/post.c
@@ -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 */
|
||||
|
||||
41
post/tests.c
41
post/tests.c
@@ -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,
|
||||
ðer_post_test
|
||||
ðer_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
46
tools/env/Makefile
vendored
Normal 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
29
tools/env/README
vendored
Normal 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
662
tools/env/fw_env.c
vendored
Normal 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
44
tools/env/fw_env.h
vendored
Normal 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
78
tools/env/fw_env_main.c
vendored
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user