mirror of https://github.com/hak5/openwrt.git
parent
e1e65079b4
commit
8294879df7
|
@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||||
|
|
||||||
PKG_NAME:=u-boot
|
PKG_NAME:=u-boot
|
||||||
PKG_VERSION:=1.1.5
|
PKG_VERSION:=1.1.5
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=2
|
||||||
|
|
||||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||||
|
@ -31,12 +31,33 @@ endef
|
||||||
|
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
$(call Build/Prepare/Default)
|
$(call Build/Prepare/Default)
|
||||||
cp -r ./files/* $(PKG_BUILD_DIR)
|
cp -r $(CP_OPTS) ./files/* $(PKG_BUILD_DIR)
|
||||||
find $(PKG_BUILD_DIR) -name .svn | $(XARGS) rm -rf
|
find $(PKG_BUILD_DIR) -name .svn | $(XARGS) rm -rf
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
UBOOT_CONFIG:=danube
|
||||||
|
|
||||||
|
UBOOT_MAKE_OPTS:=\
|
||||||
|
CROSS_COMPILE=$(TARGET_CROSS) \
|
||||||
|
CROSS_COMPILE_UCLIBC=1 \
|
||||||
|
COMPRESS=lzma \
|
||||||
|
PLATFORM_CPU=mips32r2 \
|
||||||
|
UBOOT_RAM_TEXT_BASE=0xA0400000
|
||||||
|
|
||||||
|
define Build/Configure
|
||||||
|
$(MAKE) -s -C $(PKG_BUILD_DIR) \
|
||||||
|
$(UBOOT_MAKE_OPTS) \
|
||||||
|
$(UBOOT_CONFIG)_config
|
||||||
|
endef
|
||||||
|
|
||||||
define Build/Compile
|
define Build/Compile
|
||||||
cd $(PKG_BUILD_DIR);chmod a+x build_danube.sh;./build_danube.sh
|
$(MAKE) -s -C $(PKG_BUILD_DIR) \
|
||||||
|
$(UBOOT_MAKE_OPTS) \
|
||||||
|
ifx_all
|
||||||
|
if [ `stat -c%s $(PKG_BUILD_DIR)/u-boot.ifx` -gt 65536 ] ;\
|
||||||
|
then \
|
||||||
|
echo "u-boot.ifx file has exceeded 64MB in size."; exit 1; \
|
||||||
|
fi
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/uboot-ifxmips/install
|
define Package/uboot-ifxmips/install
|
||||||
|
|
|
@ -23,19 +23,22 @@
|
||||||
|
|
||||||
include $(TOPDIR)/config.mk
|
include $(TOPDIR)/config.mk
|
||||||
|
|
||||||
LIB = lib$(BOARD).a
|
LIB = $(obj)lib$(BOARD).a
|
||||||
|
|
||||||
OBJS = $(BOARD).o flash.o
|
COBJS = $(BOARD).o flash.o
|
||||||
SOBJS = lowlevel_init.o pmuenable.o
|
SOBJS = lowlevel_init.o pmuenable.o
|
||||||
|
|
||||||
$(LIB): .depend $(OBJS) $(SOBJS)
|
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||||
$(AR) crv $@ $^
|
OBJS := $(addprefix $(obj),$(COBJS))
|
||||||
|
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||||
|
|
||||||
|
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
|
||||||
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
|
include $(SRCTREE)/rules.mk
|
||||||
$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
|
|
||||||
|
|
||||||
sinclude .depend
|
sinclude $(obj).depend
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
|
@ -38,10 +38,10 @@ SECTIONS
|
||||||
}
|
}
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
.rodata : { *(.rodata) }
|
.rodata : { *(.rodata*) }
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
.data : { *(.data) }
|
.data : { *(.data*) }
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
.sdata : { *(.sdata) }
|
.sdata : { *(.sdata) }
|
|
@ -38,10 +38,10 @@ SECTIONS
|
||||||
}
|
}
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
.rodata : { *(.rodata) }
|
.rodata : { *(.rodata*) }
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
.data : { *(.data) }
|
.data : { *(.data*) }
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
.sdata : { *(.sdata) }
|
.sdata : { *(.sdata) }
|
|
@ -1,228 +0,0 @@
|
||||||
/*
|
|
||||||
* (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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* #define DEBUG */
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <flash.h>
|
|
||||||
|
|
||||||
#if !defined(CFG_NO_FLASH)
|
|
||||||
|
|
||||||
extern flash_info_t flash_info[]; /* info for FLASH chips */
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
|
||||||
* Functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
|
||||||
* Set protection status for monitor sectors
|
|
||||||
*
|
|
||||||
* The monitor is always located in the _first_ Flash bank.
|
|
||||||
* If necessary you have to map the second bank at lower addresses.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
flash_protect (int flag, ulong from, ulong to, flash_info_t *info)
|
|
||||||
{
|
|
||||||
ulong b_end = info->start[0] + info->size - 1; /* bank end address */
|
|
||||||
short s_end = info->sector_count - 1; /* index of last sector */
|
|
||||||
int i;
|
|
||||||
|
|
||||||
debug ("flash_protect %s: from 0x%08lX to 0x%08lX\n",
|
|
||||||
(flag & FLAG_PROTECT_SET) ? "ON" :
|
|
||||||
(flag & FLAG_PROTECT_CLEAR) ? "OFF" : "???",
|
|
||||||
from, to);
|
|
||||||
|
|
||||||
/* Do nothing if input data is bad. */
|
|
||||||
if (info->sector_count == 0 || info->size == 0 || to < from) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* There is nothing to do if we have no data about the flash
|
|
||||||
* or the protect range and flash range don't overlap.
|
|
||||||
*/
|
|
||||||
if (info->flash_id == FLASH_UNKNOWN ||
|
|
||||||
to < info->start[0] || from > b_end) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0; i<info->sector_count; ++i) {
|
|
||||||
ulong end; /* last address in current sect */
|
|
||||||
|
|
||||||
end = (i == s_end) ? b_end : info->start[i + 1] - 1;
|
|
||||||
|
|
||||||
/* Update protection if any part of the sector
|
|
||||||
* is in the specified range.
|
|
||||||
*/
|
|
||||||
if (from <= end && to >= info->start[i]) {
|
|
||||||
if (flag & FLAG_PROTECT_CLEAR) {
|
|
||||||
#if defined(CFG_FLASH_PROTECTION)
|
|
||||||
flash_real_protect(info, i, 0);
|
|
||||||
#else
|
|
||||||
info->protect[i] = 0;
|
|
||||||
#endif /* CFG_FLASH_PROTECTION */
|
|
||||||
debug ("protect off %d\n", i);
|
|
||||||
}
|
|
||||||
else if (flag & FLAG_PROTECT_SET) {
|
|
||||||
#if defined(CFG_FLASH_PROTECTION)
|
|
||||||
flash_real_protect(info, i, 1);
|
|
||||||
#else
|
|
||||||
info->protect[i] = 1;
|
|
||||||
#endif /* CFG_FLASH_PROTECTION */
|
|
||||||
debug ("protect on %d\n", i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
flash_info_t *
|
|
||||||
addr2info (ulong addr)
|
|
||||||
{
|
|
||||||
#ifndef CONFIG_SPD823TS
|
|
||||||
flash_info_t *info;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i=0, info=&flash_info[0]; i<CFG_MAX_FLASH_BANKS; ++i, ++info) {
|
|
||||||
if (info->flash_id != FLASH_UNKNOWN &&
|
|
||||||
addr >= info->start[0] &&
|
|
||||||
/* WARNING - The '- 1' is needed if the flash
|
|
||||||
* is at the end of the address space, since
|
|
||||||
* info->start[0] + info->size wraps back to 0.
|
|
||||||
* Please don't change this unless you understand this.
|
|
||||||
*/
|
|
||||||
addr <= info->start[0] + info->size - 1) {
|
|
||||||
return (info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_SPD823TS */
|
|
||||||
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
|
||||||
* Copy memory to flash.
|
|
||||||
* Make sure all target addresses are within Flash bounds,
|
|
||||||
* and no protected sectors are hit.
|
|
||||||
* Returns:
|
|
||||||
* ERR_OK 0 - OK
|
|
||||||
* ERR_TIMOUT 1 - write timeout
|
|
||||||
* ERR_NOT_ERASED 2 - Flash not erased
|
|
||||||
* ERR_PROTECTED 4 - target range includes protected sectors
|
|
||||||
* ERR_INVAL 8 - target address not in Flash memory
|
|
||||||
* ERR_ALIGN 16 - target address not aligned on boundary
|
|
||||||
* (only some targets require alignment)
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
flash_write (char *src, ulong addr, ulong cnt)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_SPD823TS
|
|
||||||
return (ERR_TIMOUT); /* any other error codes are possible as well */
|
|
||||||
#else
|
|
||||||
int i;
|
|
||||||
ulong end = addr + cnt - 1;
|
|
||||||
flash_info_t *info_first = addr2info (addr);
|
|
||||||
flash_info_t *info_last = addr2info (end );
|
|
||||||
flash_info_t *info;
|
|
||||||
|
|
||||||
if (cnt == 0) {
|
|
||||||
return (ERR_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!info_first || !info_last) {
|
|
||||||
return (ERR_INVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (info = info_first; info <= info_last; ++info) {
|
|
||||||
ulong b_end = info->start[0] + info->size; /* bank end addr */
|
|
||||||
short s_end = info->sector_count - 1;
|
|
||||||
for (i=0; i<info->sector_count; ++i) {
|
|
||||||
ulong e_addr = (i == s_end) ? b_end : info->start[i + 1];
|
|
||||||
|
|
||||||
if ((end >= info->start[i]) && (addr < e_addr) &&
|
|
||||||
(info->protect[i] != 0) ) {
|
|
||||||
return (ERR_PROTECTED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* finally write data to flash */
|
|
||||||
for (info = info_first; info <= info_last && cnt>0; ++info) {
|
|
||||||
ulong len;
|
|
||||||
|
|
||||||
len = info->start[0] + info->size - addr;
|
|
||||||
if (len > cnt)
|
|
||||||
len = cnt;
|
|
||||||
if ((i = write_buff(info, (uchar *)src, addr, len)) != 0) {
|
|
||||||
return (i);
|
|
||||||
}
|
|
||||||
cnt -= len;
|
|
||||||
addr += len;
|
|
||||||
src += len;
|
|
||||||
}
|
|
||||||
return (ERR_OK);
|
|
||||||
#endif /* CONFIG_SPD823TS */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
void flash_perror (int err)
|
|
||||||
{
|
|
||||||
switch (err) {
|
|
||||||
case ERR_OK:
|
|
||||||
break;
|
|
||||||
case ERR_TIMOUT:
|
|
||||||
puts ("Timeout writing to Flash\n");
|
|
||||||
break;
|
|
||||||
case ERR_NOT_ERASED:
|
|
||||||
puts ("Flash not Erased\n");
|
|
||||||
break;
|
|
||||||
case ERR_PROTECTED:
|
|
||||||
puts ("Can't write to protected Flash sectors\n");
|
|
||||||
break;
|
|
||||||
case ERR_INVAL:
|
|
||||||
puts ("Outside available Flash\n");
|
|
||||||
break;
|
|
||||||
case ERR_ALIGN:
|
|
||||||
puts ("Start and/or end address not on sector boundary\n");
|
|
||||||
break;
|
|
||||||
case ERR_UNKNOWN_FLASH_VENDOR:
|
|
||||||
puts ("Unknown Vendor of Flash\n");
|
|
||||||
break;
|
|
||||||
case ERR_UNKNOWN_FLASH_TYPE:
|
|
||||||
puts ("Unknown Type of Flash\n");
|
|
||||||
break;
|
|
||||||
case ERR_PROG_ERROR:
|
|
||||||
puts ("General Flash Programming Error\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf ("%s[%d] FIXME: rc=%d\n", __FILE__, __LINE__, err);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
#endif /* !CFG_NO_FLASH */
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
#########################################################################
|
||||||
#
|
#
|
||||||
# (C) Copyright 2003-2006
|
# (C) Copyright 2000-2006
|
||||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
#
|
#
|
||||||
# See file CREDITS for list of people who contributed to this
|
# See file CREDITS for list of people who contributed to this
|
||||||
|
@ -23,18 +24,14 @@
|
||||||
|
|
||||||
include $(TOPDIR)/config.mk
|
include $(TOPDIR)/config.mk
|
||||||
|
|
||||||
LIB = $(obj)lib$(CPU).a
|
LIB = $(obj)lib$(SOC).a
|
||||||
|
|
||||||
START = start.o
|
COBJS = ifx_asc.o ifx_clock.o
|
||||||
COBJS = asc_serial.o au1x00_serial.o au1x00_eth.o au1x00_usb_ohci.o \
|
|
||||||
cpu.o interrupts.o incaip_clock.o ifx_asc.o ifx_clock.o
|
|
||||||
SOBJS = incaip_wdt.o cache.o
|
|
||||||
|
|
||||||
SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||||
START := $(addprefix $(obj),$(START))
|
|
||||||
|
|
||||||
all: $(obj).depend $(START) $(LIB)
|
all: $(obj).depend $(LIB)
|
||||||
|
|
||||||
$(LIB): $(OBJS)
|
$(LIB): $(OBJS)
|
||||||
$(AR) $(ARFLAGS) $@ $(OBJS)
|
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||||
|
|
|
@ -1,371 +0,0 @@
|
||||||
/*
|
|
||||||
* (INCA) ASC UART support
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#if defined(CONFIG_PURPLE) || defined(CONFIG_INCA_IP)
|
|
||||||
|
|
||||||
#ifdef CONFIG_PURPLE
|
|
||||||
#define serial_init asc_serial_init
|
|
||||||
#define serial_putc asc_serial_putc
|
|
||||||
#define serial_puts asc_serial_puts
|
|
||||||
#define serial_getc asc_serial_getc
|
|
||||||
#define serial_tstc asc_serial_tstc
|
|
||||||
#define serial_setbrg asc_serial_setbrg
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <asm/inca-ip.h>
|
|
||||||
#include "asc_serial.h"
|
|
||||||
|
|
||||||
#ifdef CONFIG_PURPLE
|
|
||||||
|
|
||||||
#undef ASC_FIFO_PRESENT
|
|
||||||
#define TOUT_LOOP 100000
|
|
||||||
|
|
||||||
/* Set base address for second FPI interrupt control register bank */
|
|
||||||
#define SFPI_INTCON_BASEADDR 0xBF0F0000
|
|
||||||
|
|
||||||
/* Register offset from base address */
|
|
||||||
#define FBS_ISR 0x00000000 /* Interrupt status register */
|
|
||||||
#define FBS_IMR 0x00000008 /* Interrupt mask register */
|
|
||||||
#define FBS_IDIS 0x00000010 /* Interrupt disable register */
|
|
||||||
|
|
||||||
/* Interrupt status register bits */
|
|
||||||
#define FBS_ISR_AT 0x00000040 /* ASC transmit interrupt */
|
|
||||||
#define FBS_ISR_AR 0x00000020 /* ASC receive interrupt */
|
|
||||||
#define FBS_ISR_AE 0x00000010 /* ASC error interrupt */
|
|
||||||
#define FBS_ISR_AB 0x00000008 /* ASC transmit buffer interrupt */
|
|
||||||
#define FBS_ISR_AS 0x00000004 /* ASC start of autobaud detection interrupt */
|
|
||||||
#define FBS_ISR_AF 0x00000002 /* ASC end of autobaud detection interrupt */
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define ASC_FIFO_PRESENT
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define SET_BIT(reg, mask) reg |= (mask)
|
|
||||||
#define CLEAR_BIT(reg, mask) reg &= (~mask)
|
|
||||||
#define CLEAR_BITS(reg, mask) CLEAR_BIT(reg, mask)
|
|
||||||
#define SET_BITS(reg, mask) SET_BIT(reg, mask)
|
|
||||||
#define SET_BITFIELD(reg, mask, off, val) {reg &= (~mask); reg |= (val << off);}
|
|
||||||
|
|
||||||
extern uint incaip_get_fpiclk(void);
|
|
||||||
|
|
||||||
static int serial_setopt (void);
|
|
||||||
|
|
||||||
/* pointer to ASC register base address */
|
|
||||||
static volatile incaAsc_t *pAsc = (incaAsc_t *)INCA_IP_ASC;
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* serial_init - initialize a INCAASC channel
|
|
||||||
*
|
|
||||||
* This routine initializes the number of data bits, parity
|
|
||||||
* and set the selected baud rate. Interrupts are disabled.
|
|
||||||
* Set the modem control signals if the option is selected.
|
|
||||||
*
|
|
||||||
* RETURNS: N/A
|
|
||||||
*/
|
|
||||||
|
|
||||||
int serial_init (void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_INCA_IP
|
|
||||||
/* we have to set PMU.EN13 bit to enable an ASC device*/
|
|
||||||
INCAASC_PMU_ENABLE(13);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* and we have to set CLC register*/
|
|
||||||
CLEAR_BIT(pAsc->asc_clc, ASCCLC_DISS);
|
|
||||||
SET_BITFIELD(pAsc->asc_clc, ASCCLC_RMCMASK, ASCCLC_RMCOFFSET, 0x0001);
|
|
||||||
|
|
||||||
/* initialy we are in async mode */
|
|
||||||
pAsc->asc_con = ASCCON_M_8ASYNC;
|
|
||||||
|
|
||||||
/* select input port */
|
|
||||||
pAsc->asc_pisel = (CONSOLE_TTY & 0x1);
|
|
||||||
|
|
||||||
#ifdef ASC_FIFO_PRESENT
|
|
||||||
/* TXFIFO's filling level */
|
|
||||||
SET_BITFIELD(pAsc->asc_txfcon, ASCTXFCON_TXFITLMASK,
|
|
||||||
ASCTXFCON_TXFITLOFF, INCAASC_TXFIFO_FL);
|
|
||||||
/* enable TXFIFO */
|
|
||||||
SET_BIT(pAsc->asc_txfcon, ASCTXFCON_TXFEN);
|
|
||||||
|
|
||||||
/* RXFIFO's filling level */
|
|
||||||
SET_BITFIELD(pAsc->asc_txfcon, ASCRXFCON_RXFITLMASK,
|
|
||||||
ASCRXFCON_RXFITLOFF, INCAASC_RXFIFO_FL);
|
|
||||||
/* enable RXFIFO */
|
|
||||||
SET_BIT(pAsc->asc_rxfcon, ASCRXFCON_RXFEN);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* enable error signals */
|
|
||||||
SET_BIT(pAsc->asc_con, ASCCON_FEN);
|
|
||||||
SET_BIT(pAsc->asc_con, ASCCON_OEN);
|
|
||||||
|
|
||||||
#ifdef CONFIG_INCA_IP
|
|
||||||
/* acknowledge ASC interrupts */
|
|
||||||
ASC_INTERRUPTS_CLEAR(INCAASC_IRQ_LINE_ALL);
|
|
||||||
|
|
||||||
/* disable ASC interrupts */
|
|
||||||
ASC_INTERRUPTS_DISABLE(INCAASC_IRQ_LINE_ALL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ASC_FIFO_PRESENT
|
|
||||||
/* set FIFOs into the transparent mode */
|
|
||||||
SET_BIT(pAsc->asc_txfcon, ASCTXFCON_TXTMEN);
|
|
||||||
SET_BIT(pAsc->asc_rxfcon, ASCRXFCON_RXTMEN);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* set baud rate */
|
|
||||||
serial_setbrg();
|
|
||||||
|
|
||||||
/* set the options */
|
|
||||||
serial_setopt();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void serial_setbrg (void)
|
|
||||||
{
|
|
||||||
ulong uiReloadValue, fdv;
|
|
||||||
ulong f_ASC;
|
|
||||||
|
|
||||||
#ifdef CONFIG_INCA_IP
|
|
||||||
f_ASC = incaip_get_fpiclk();
|
|
||||||
#else
|
|
||||||
f_ASC = ASC_CLOCK_RATE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCAASC_USE_FDV
|
|
||||||
fdv = 2;
|
|
||||||
uiReloadValue = (f_ASC / (fdv * 16 * CONFIG_BAUDRATE)) - 1;
|
|
||||||
#else
|
|
||||||
fdv = INCAASC_FDV_HIGH_BAUDRATE;
|
|
||||||
uiReloadValue = (f_ASC / (8192 * CONFIG_BAUDRATE / fdv)) - 1;
|
|
||||||
#endif /* INCAASC_USE_FDV */
|
|
||||||
|
|
||||||
if ( (uiReloadValue < 0) || (uiReloadValue > 8191) )
|
|
||||||
{
|
|
||||||
#ifndef INCAASC_USE_FDV
|
|
||||||
fdv = 3;
|
|
||||||
uiReloadValue = (f_ASC / (fdv * 16 * CONFIG_BAUDRATE)) - 1;
|
|
||||||
#else
|
|
||||||
fdv = INCAASC_FDV_LOW_BAUDRATE;
|
|
||||||
uiReloadValue = (f_ASC / (8192 * CONFIG_BAUDRATE / fdv)) - 1;
|
|
||||||
#endif /* INCAASC_USE_FDV */
|
|
||||||
|
|
||||||
if ( (uiReloadValue < 0) || (uiReloadValue > 8191) )
|
|
||||||
{
|
|
||||||
return; /* can't impossibly generate that baud rate */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable Baud Rate Generator; BG should only be written when R=0 */
|
|
||||||
CLEAR_BIT(pAsc->asc_con, ASCCON_R);
|
|
||||||
|
|
||||||
#ifndef INCAASC_USE_FDV
|
|
||||||
/*
|
|
||||||
* Disable Fractional Divider (FDE)
|
|
||||||
* Divide clock by reload-value + constant (BRS)
|
|
||||||
*/
|
|
||||||
/* FDE = 0 */
|
|
||||||
CLEAR_BIT(pAsc->asc_con, ASCCON_FDE);
|
|
||||||
|
|
||||||
if ( fdv == 2 )
|
|
||||||
CLEAR_BIT(pAsc->asc_con, ASCCON_BRS); /* BRS = 0 */
|
|
||||||
else
|
|
||||||
SET_BIT(pAsc->asc_con, ASCCON_BRS); /* BRS = 1 */
|
|
||||||
|
|
||||||
#else /* INCAASC_USE_FDV */
|
|
||||||
|
|
||||||
/* Enable Fractional Divider */
|
|
||||||
SET_BIT(pAsc->asc_con, ASCCON_FDE); /* FDE = 1 */
|
|
||||||
|
|
||||||
/* Set fractional divider value */
|
|
||||||
pAsc->asc_fdv = fdv & ASCFDV_VALUE_MASK;
|
|
||||||
|
|
||||||
#endif /* INCAASC_USE_FDV */
|
|
||||||
|
|
||||||
/* Set reload value in BG */
|
|
||||||
pAsc->asc_bg = uiReloadValue;
|
|
||||||
|
|
||||||
/* Enable Baud Rate Generator */
|
|
||||||
SET_BIT(pAsc->asc_con, ASCCON_R); /* R = 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* serial_setopt - set the serial options
|
|
||||||
*
|
|
||||||
* Set the channel operating mode to that specified. Following options
|
|
||||||
* are supported: CREAD, CSIZE, PARENB, and PARODD.
|
|
||||||
*
|
|
||||||
* Note, this routine disables the transmitter. The calling routine
|
|
||||||
* may have to re-enable it.
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* Returns 0 to indicate success, otherwise -1 is returned
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int serial_setopt (void)
|
|
||||||
{
|
|
||||||
ulong con;
|
|
||||||
|
|
||||||
switch ( ASC_OPTIONS & ASCOPT_CSIZE )
|
|
||||||
{
|
|
||||||
/* 7-bit-data */
|
|
||||||
case ASCOPT_CS7:
|
|
||||||
con = ASCCON_M_7ASYNCPAR; /* 7-bit-data and parity bit */
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* 8-bit-data */
|
|
||||||
case ASCOPT_CS8:
|
|
||||||
if ( ASC_OPTIONS & ASCOPT_PARENB )
|
|
||||||
con = ASCCON_M_8ASYNCPAR; /* 8-bit-data and parity bit */
|
|
||||||
else
|
|
||||||
con = ASCCON_M_8ASYNC; /* 8-bit-data no parity */
|
|
||||||
break;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* only 7 and 8-bit frames are supported
|
|
||||||
* if we don't use IOCTL extensions
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ASC_OPTIONS & ASCOPT_STOPB )
|
|
||||||
SET_BIT(con, ASCCON_STP); /* 2 stop bits */
|
|
||||||
else
|
|
||||||
CLEAR_BIT(con, ASCCON_STP); /* 1 stop bit */
|
|
||||||
|
|
||||||
if ( ASC_OPTIONS & ASCOPT_PARENB )
|
|
||||||
SET_BIT(con, ASCCON_PEN); /* enable parity checking */
|
|
||||||
else
|
|
||||||
CLEAR_BIT(con, ASCCON_PEN); /* disable parity checking */
|
|
||||||
|
|
||||||
if ( ASC_OPTIONS & ASCOPT_PARODD )
|
|
||||||
SET_BIT(con, ASCCON_ODD); /* odd parity */
|
|
||||||
else
|
|
||||||
CLEAR_BIT(con, ASCCON_ODD); /* even parity */
|
|
||||||
|
|
||||||
if ( ASC_OPTIONS & ASCOPT_CREAD )
|
|
||||||
SET_BIT(pAsc->asc_whbcon, ASCWHBCON_SETREN); /* Receiver enable */
|
|
||||||
|
|
||||||
pAsc->asc_con |= con;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void serial_putc (const char c)
|
|
||||||
{
|
|
||||||
#ifdef ASC_FIFO_PRESENT
|
|
||||||
uint txFl = 0;
|
|
||||||
#else
|
|
||||||
uint timeout = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (c == '\n') serial_putc ('\r');
|
|
||||||
|
|
||||||
#ifdef ASC_FIFO_PRESENT
|
|
||||||
/* check do we have a free space in the TX FIFO */
|
|
||||||
/* get current filling level */
|
|
||||||
do
|
|
||||||
{
|
|
||||||
txFl = ( pAsc->asc_fstat & ASCFSTAT_TXFFLMASK ) >> ASCFSTAT_TXFFLOFF;
|
|
||||||
}
|
|
||||||
while ( txFl == INCAASC_TXFIFO_FULL );
|
|
||||||
#else
|
|
||||||
|
|
||||||
while(!(*(volatile unsigned long*)(SFPI_INTCON_BASEADDR + FBS_ISR) &
|
|
||||||
FBS_ISR_AB))
|
|
||||||
{
|
|
||||||
if (timeout++ > TOUT_LOOP)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pAsc->asc_tbuf = c; /* write char to Transmit Buffer Register */
|
|
||||||
|
|
||||||
#ifndef ASC_FIFO_PRESENT
|
|
||||||
*(volatile unsigned long*)(SFPI_INTCON_BASEADDR + FBS_ISR) = FBS_ISR_AB |
|
|
||||||
FBS_ISR_AT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check for errors */
|
|
||||||
if ( pAsc->asc_con & ASCCON_OE )
|
|
||||||
{
|
|
||||||
SET_BIT(pAsc->asc_whbcon, ASCWHBCON_CLROE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void serial_puts (const char *s)
|
|
||||||
{
|
|
||||||
while (*s)
|
|
||||||
{
|
|
||||||
serial_putc (*s++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int serial_getc (void)
|
|
||||||
{
|
|
||||||
ulong symbol_mask;
|
|
||||||
char c;
|
|
||||||
|
|
||||||
while (!serial_tstc());
|
|
||||||
|
|
||||||
symbol_mask =
|
|
||||||
((ASC_OPTIONS & ASCOPT_CSIZE) == ASCOPT_CS7) ? (0x7f) : (0xff);
|
|
||||||
|
|
||||||
c = (char)(pAsc->asc_rbuf & symbol_mask);
|
|
||||||
|
|
||||||
#ifndef ASC_FIFO_PRESENT
|
|
||||||
*(volatile unsigned long*)(SFPI_INTCON_BASEADDR + FBS_ISR) = FBS_ISR_AR;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
int serial_tstc (void)
|
|
||||||
{
|
|
||||||
int res = 1;
|
|
||||||
|
|
||||||
#ifdef ASC_FIFO_PRESENT
|
|
||||||
if ( (pAsc->asc_fstat & ASCFSTAT_RXFFLMASK) == 0 )
|
|
||||||
{
|
|
||||||
res = 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (!(*(volatile unsigned long*)(SFPI_INTCON_BASEADDR + FBS_ISR) &
|
|
||||||
FBS_ISR_AR))
|
|
||||||
|
|
||||||
{
|
|
||||||
res = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else if ( pAsc->asc_con & ASCCON_FE )
|
|
||||||
{
|
|
||||||
SET_BIT(pAsc->asc_whbcon, ASCWHBCON_CLRFE);
|
|
||||||
res = 0;
|
|
||||||
}
|
|
||||||
else if ( pAsc->asc_con & ASCCON_PE )
|
|
||||||
{
|
|
||||||
SET_BIT(pAsc->asc_whbcon, ASCWHBCON_CLRPE);
|
|
||||||
res = 0;
|
|
||||||
}
|
|
||||||
else if ( pAsc->asc_con & ASCCON_OE )
|
|
||||||
{
|
|
||||||
SET_BIT(pAsc->asc_whbcon, ASCWHBCON_CLROE);
|
|
||||||
res = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_PURPLE || CONFIG_INCA_IP */
|
|
|
@ -1,177 +0,0 @@
|
||||||
/* incaAscSio.h - (INCA) ASC UART tty driver header */
|
|
||||||
|
|
||||||
#ifndef __INCincaAscSioh
|
|
||||||
#define __INCincaAscSioh
|
|
||||||
|
|
||||||
#include <asm/inca-ip.h>
|
|
||||||
|
|
||||||
/* channel operating modes */
|
|
||||||
#define ASCOPT_CSIZE 0x00000003
|
|
||||||
#define ASCOPT_CS7 0x00000001
|
|
||||||
#define ASCOPT_CS8 0x00000002
|
|
||||||
#define ASCOPT_PARENB 0x00000004
|
|
||||||
#define ASCOPT_STOPB 0x00000008
|
|
||||||
#define ASCOPT_PARODD 0x00000010
|
|
||||||
#define ASCOPT_CREAD 0x00000020
|
|
||||||
|
|
||||||
#define ASC_OPTIONS (ASCOPT_CREAD | ASCOPT_CS8)
|
|
||||||
|
|
||||||
/* ASC input select (0 or 1) */
|
|
||||||
#define CONSOLE_TTY 0
|
|
||||||
|
|
||||||
/* use fractional divider for baudrate settings */
|
|
||||||
#define INCAASC_USE_FDV
|
|
||||||
|
|
||||||
#ifdef INCAASC_USE_FDV
|
|
||||||
#define INCAASC_FDV_LOW_BAUDRATE 71
|
|
||||||
#define INCAASC_FDV_HIGH_BAUDRATE 453
|
|
||||||
#endif /*INCAASC_USE_FDV*/
|
|
||||||
|
|
||||||
|
|
||||||
#define INCAASC_TXFIFO_FL 1
|
|
||||||
#define INCAASC_RXFIFO_FL 1
|
|
||||||
#define INCAASC_TXFIFO_FULL 16
|
|
||||||
|
|
||||||
/* interrupt lines masks for the ASC device interrupts*/
|
|
||||||
/* change these macroses if it's necessary */
|
|
||||||
#define INCAASC_IRQ_LINE_ALL 0x000F0000 /* all IRQs */
|
|
||||||
|
|
||||||
#define INCAASC_IRQ_LINE_TIR 0x00010000 /* TIR - Tx */
|
|
||||||
#define INCAASC_IRQ_LINE_RIR 0x00020000 /* RIR - Rx */
|
|
||||||
#define INCAASC_IRQ_LINE_EIR 0x00040000 /* EIR - Err */
|
|
||||||
#define INCAASC_IRQ_LINE_TBIR 0x00080000 /* TBIR - Tx Buf*/
|
|
||||||
|
|
||||||
/* interrupt controller access macros */
|
|
||||||
#define ASC_INTERRUPTS_ENABLE(X) \
|
|
||||||
*((volatile unsigned int*) INCA_IP_ICU_IM2_IER) |= X;
|
|
||||||
#define ASC_INTERRUPTS_DISABLE(X) \
|
|
||||||
*((volatile unsigned int*) INCA_IP_ICU_IM2_IER) &= ~X;
|
|
||||||
#define ASC_INTERRUPTS_CLEAR(X) \
|
|
||||||
*((volatile unsigned int*) INCA_IP_ICU_IM2_ISR) = X;
|
|
||||||
|
|
||||||
/* CLC register's bits and bitfields */
|
|
||||||
#define ASCCLC_DISR 0x00000001
|
|
||||||
#define ASCCLC_DISS 0x00000002
|
|
||||||
#define ASCCLC_RMCMASK 0x0000FF00
|
|
||||||
#define ASCCLC_RMCOFFSET 8
|
|
||||||
|
|
||||||
/* CON register's bits and bitfields */
|
|
||||||
#define ASCCON_MODEMASK 0x0007
|
|
||||||
#define ASCCON_M_8SYNC 0x0
|
|
||||||
#define ASCCON_M_8ASYNC 0x1
|
|
||||||
#define ASCCON_M_8IRDAASYNC 0x2
|
|
||||||
#define ASCCON_M_7ASYNCPAR 0x3
|
|
||||||
#define ASCCON_M_9ASYNC 0x4
|
|
||||||
#define ASCCON_M_8WAKEUPASYNC 0x5
|
|
||||||
#define ASCCON_M_8ASYNCPAR 0x7
|
|
||||||
#define ASCCON_STP 0x0008
|
|
||||||
#define ASCCON_REN 0x0010
|
|
||||||
#define ASCCON_PEN 0x0020
|
|
||||||
#define ASCCON_FEN 0x0040
|
|
||||||
#define ASCCON_OEN 0x0080
|
|
||||||
#define ASCCON_PE 0x0100
|
|
||||||
#define ASCCON_FE 0x0200
|
|
||||||
#define ASCCON_OE 0x0400
|
|
||||||
#define ASCCON_FDE 0x0800
|
|
||||||
#define ASCCON_ODD 0x1000
|
|
||||||
#define ASCCON_BRS 0x2000
|
|
||||||
#define ASCCON_LB 0x4000
|
|
||||||
#define ASCCON_R 0x8000
|
|
||||||
|
|
||||||
/* WHBCON register's bits and bitfields */
|
|
||||||
#define ASCWHBCON_CLRREN 0x0010
|
|
||||||
#define ASCWHBCON_SETREN 0x0020
|
|
||||||
#define ASCWHBCON_CLRPE 0x0100
|
|
||||||
#define ASCWHBCON_CLRFE 0x0200
|
|
||||||
#define ASCWHBCON_CLROE 0x0400
|
|
||||||
#define ASCWHBCON_SETPE 0x0800
|
|
||||||
#define ASCWHBCON_SETFE 0x1000
|
|
||||||
#define ASCWHBCON_SETOE 0x2000
|
|
||||||
|
|
||||||
/* ABCON register's bits and bitfields */
|
|
||||||
#define ASCABCON_ABEN 0x0001
|
|
||||||
#define ASCABCON_AUREN 0x0002
|
|
||||||
#define ASCABCON_ABSTEN 0x0004
|
|
||||||
#define ASCABCON_ABDETEN 0x0008
|
|
||||||
#define ASCABCON_FCDETEN 0x0010
|
|
||||||
#define ASCABCON_EMMASK 0x0300
|
|
||||||
#define ASCABCON_EMOFF 8
|
|
||||||
#define ASCABCON_EM_DISAB 0x0
|
|
||||||
#define ASCABCON_EM_DURAB 0x1
|
|
||||||
#define ASCABCON_EM_ALWAYS 0x2
|
|
||||||
#define ASCABCON_TXINV 0x0400
|
|
||||||
#define ASCABCON_RXINV 0x0800
|
|
||||||
|
|
||||||
/* FDV register mask, offset and bitfields*/
|
|
||||||
#define ASCFDV_VALUE_MASK 0x000001FF
|
|
||||||
|
|
||||||
/* WHBABCON register's bits and bitfields */
|
|
||||||
#define ASCWHBABCON_SETABEN 0x0001
|
|
||||||
#define ASCWHBABCON_CLRABEN 0x0002
|
|
||||||
|
|
||||||
/* ABSTAT register's bits and bitfields */
|
|
||||||
#define ASCABSTAT_FCSDET 0x0001
|
|
||||||
#define ASCABSTAT_FCCDET 0x0002
|
|
||||||
#define ASCABSTAT_SCSDET 0x0004
|
|
||||||
#define ASCABSTAT_SCCDET 0x0008
|
|
||||||
#define ASCABSTAT_DETWAIT 0x0010
|
|
||||||
|
|
||||||
/* WHBABSTAT register's bits and bitfields */
|
|
||||||
#define ASCWHBABSTAT_CLRFCSDET 0x0001
|
|
||||||
#define ASCWHBABSTAT_SETFCSDET 0x0002
|
|
||||||
#define ASCWHBABSTAT_CLRFCCDET 0x0004
|
|
||||||
#define ASCWHBABSTAT_SETFCCDET 0x0008
|
|
||||||
#define ASCWHBABSTAT_CLRSCSDET 0x0010
|
|
||||||
#define ASCWHBABSTAT_SETSCSDET 0x0020
|
|
||||||
#define ASCWHBABSTAT_SETSCCDET 0x0040
|
|
||||||
#define ASCWHBABSTAT_CLRSCCDET 0x0080
|
|
||||||
#define ASCWHBABSTAT_CLRDETWAIT 0x0100
|
|
||||||
#define ASCWHBABSTAT_SETDETWAIT 0x0200
|
|
||||||
|
|
||||||
/* TXFCON register's bits and bitfields */
|
|
||||||
#define ASCTXFCON_TXFEN 0x0001
|
|
||||||
#define ASCTXFCON_TXFFLU 0x0002
|
|
||||||
#define ASCTXFCON_TXTMEN 0x0004
|
|
||||||
#define ASCTXFCON_TXFITLMASK 0x3F00
|
|
||||||
#define ASCTXFCON_TXFITLOFF 8
|
|
||||||
|
|
||||||
/* RXFCON register's bits and bitfields */
|
|
||||||
#define ASCRXFCON_RXFEN 0x0001
|
|
||||||
#define ASCRXFCON_RXFFLU 0x0002
|
|
||||||
#define ASCRXFCON_RXTMEN 0x0004
|
|
||||||
#define ASCRXFCON_RXFITLMASK 0x3F00
|
|
||||||
#define ASCRXFCON_RXFITLOFF 8
|
|
||||||
|
|
||||||
/* FSTAT register's bits and bitfields */
|
|
||||||
#define ASCFSTAT_RXFFLMASK 0x003F
|
|
||||||
#define ASCFSTAT_TXFFLMASK 0x3F00
|
|
||||||
#define ASCFSTAT_TXFFLOFF 8
|
|
||||||
|
|
||||||
#define INCAASC_PMU_ENABLE(BIT) *((volatile ulong*)0xBF102000) |= (0x1 << BIT);
|
|
||||||
|
|
||||||
typedef struct /* incaAsc_t */
|
|
||||||
{
|
|
||||||
volatile unsigned long asc_clc; /*0x0000*/
|
|
||||||
volatile unsigned long asc_pisel; /*0x0004*/
|
|
||||||
volatile unsigned long asc_rsvd1[2]; /* for mapping */ /*0x0008*/
|
|
||||||
volatile unsigned long asc_con; /*0x0010*/
|
|
||||||
volatile unsigned long asc_bg; /*0x0014*/
|
|
||||||
volatile unsigned long asc_fdv; /*0x0018*/
|
|
||||||
volatile unsigned long asc_pmw; /* not used */ /*0x001C*/
|
|
||||||
volatile unsigned long asc_tbuf; /*0x0020*/
|
|
||||||
volatile unsigned long asc_rbuf; /*0x0024*/
|
|
||||||
volatile unsigned long asc_rsvd2[2]; /* for mapping */ /*0x0028*/
|
|
||||||
volatile unsigned long asc_abcon; /*0x0030*/
|
|
||||||
volatile unsigned long asc_abstat; /* not used */ /*0x0034*/
|
|
||||||
volatile unsigned long asc_rsvd3[2]; /* for mapping */ /*0x0038*/
|
|
||||||
volatile unsigned long asc_rxfcon; /*0x0040*/
|
|
||||||
volatile unsigned long asc_txfcon; /*0x0044*/
|
|
||||||
volatile unsigned long asc_fstat; /*0x0048*/
|
|
||||||
volatile unsigned long asc_rsvd4; /* for mapping */ /*0x004C*/
|
|
||||||
volatile unsigned long asc_whbcon; /*0x0050*/
|
|
||||||
volatile unsigned long asc_whbabcon; /*0x0054*/
|
|
||||||
volatile unsigned long asc_whbabstat; /* not used */ /*0x0058*/
|
|
||||||
|
|
||||||
} incaAsc_t;
|
|
||||||
|
|
||||||
#endif /* __INCincaAscSioh */
|
|
|
@ -1,311 +0,0 @@
|
||||||
/* Only eth0 supported for now
|
|
||||||
*
|
|
||||||
* (C) Copyright 2003
|
|
||||||
* Thomas.Lange@corelatus.se
|
|
||||||
*
|
|
||||||
* 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 <config.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_AU1X00
|
|
||||||
|
|
||||||
#if defined(CFG_DISCOVER_PHY)
|
|
||||||
#error "PHY not supported yet"
|
|
||||||
/* We just assume that we are running 100FD for now */
|
|
||||||
/* We all use switches, right? ;-) */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* I assume ethernet behaves like au1000 */
|
|
||||||
|
|
||||||
#ifdef CONFIG_AU1000
|
|
||||||
/* Base address differ between cpu:s */
|
|
||||||
#define ETH0_BASE AU1000_ETH0_BASE
|
|
||||||
#define MAC0_ENABLE AU1000_MAC0_ENABLE
|
|
||||||
#else
|
|
||||||
#ifdef CONFIG_AU1100
|
|
||||||
#define ETH0_BASE AU1100_ETH0_BASE
|
|
||||||
#define MAC0_ENABLE AU1100_MAC0_ENABLE
|
|
||||||
#else
|
|
||||||
#ifdef CONFIG_AU1500
|
|
||||||
#define ETH0_BASE AU1500_ETH0_BASE
|
|
||||||
#define MAC0_ENABLE AU1500_MAC0_ENABLE
|
|
||||||
#else
|
|
||||||
#ifdef CONFIG_AU1550
|
|
||||||
#define ETH0_BASE AU1550_ETH0_BASE
|
|
||||||
#define MAC0_ENABLE AU1550_MAC0_ENABLE
|
|
||||||
#else
|
|
||||||
#error "No valid cpu set"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <net.h>
|
|
||||||
#include <command.h>
|
|
||||||
#include <asm/io.h>
|
|
||||||
#include <asm/au1x00.h>
|
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & CFG_CMD_MII)
|
|
||||||
#include <miiphy.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Ethernet Transmit and Receive Buffers */
|
|
||||||
#define DBUF_LENGTH 1520
|
|
||||||
#define PKT_MAXBUF_SIZE 1518
|
|
||||||
|
|
||||||
static char txbuf[DBUF_LENGTH];
|
|
||||||
|
|
||||||
static int next_tx;
|
|
||||||
static int next_rx;
|
|
||||||
|
|
||||||
/* 4 rx and 4 tx fifos */
|
|
||||||
#define NO_OF_FIFOS 4
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
u32 status;
|
|
||||||
u32 addr;
|
|
||||||
u32 len; /* Only used for tx */
|
|
||||||
u32 not_used;
|
|
||||||
} mac_fifo_t;
|
|
||||||
|
|
||||||
mac_fifo_t mac_fifo[NO_OF_FIFOS];
|
|
||||||
|
|
||||||
#define MAX_WAIT 1000
|
|
||||||
|
|
||||||
static int au1x00_send(struct eth_device* dev, volatile void *packet, int length){
|
|
||||||
volatile mac_fifo_t *fifo_tx =
|
|
||||||
(volatile mac_fifo_t*)(MAC0_TX_DMA_ADDR+MAC_TX_BUFF0_STATUS);
|
|
||||||
int i;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
/* tx fifo should always be idle */
|
|
||||||
fifo_tx[next_tx].len = length;
|
|
||||||
fifo_tx[next_tx].addr = (virt_to_phys(packet))|TX_DMA_ENABLE;
|
|
||||||
au_sync();
|
|
||||||
|
|
||||||
udelay(1);
|
|
||||||
i=0;
|
|
||||||
while(!(fifo_tx[next_tx].addr&TX_T_DONE)){
|
|
||||||
if(i>MAX_WAIT){
|
|
||||||
printf("TX timeout\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
udelay(1);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear done bit */
|
|
||||||
fifo_tx[next_tx].addr = 0;
|
|
||||||
fifo_tx[next_tx].len = 0;
|
|
||||||
au_sync();
|
|
||||||
|
|
||||||
res = fifo_tx[next_tx].status;
|
|
||||||
|
|
||||||
next_tx++;
|
|
||||||
if(next_tx>=NO_OF_FIFOS){
|
|
||||||
next_tx=0;
|
|
||||||
}
|
|
||||||
return(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int au1x00_recv(struct eth_device* dev){
|
|
||||||
volatile mac_fifo_t *fifo_rx =
|
|
||||||
(volatile mac_fifo_t*)(MAC0_RX_DMA_ADDR+MAC_RX_BUFF0_STATUS);
|
|
||||||
|
|
||||||
int length;
|
|
||||||
u32 status;
|
|
||||||
|
|
||||||
for(;;){
|
|
||||||
if(!(fifo_rx[next_rx].addr&RX_T_DONE)){
|
|
||||||
/* Nothing has been received */
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
status = fifo_rx[next_rx].status;
|
|
||||||
|
|
||||||
length = status&0x3FFF;
|
|
||||||
|
|
||||||
if(status&RX_ERROR){
|
|
||||||
printf("Rx error 0x%x\n", status);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
/* Pass the packet up to the protocol layers. */
|
|
||||||
NetReceive(NetRxPackets[next_rx], length - 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
fifo_rx[next_rx].addr = (virt_to_phys(NetRxPackets[next_rx]))|RX_DMA_ENABLE;
|
|
||||||
|
|
||||||
next_rx++;
|
|
||||||
if(next_rx>=NO_OF_FIFOS){
|
|
||||||
next_rx=0;
|
|
||||||
}
|
|
||||||
} /* for */
|
|
||||||
|
|
||||||
return(0); /* Does anyone use this? */
|
|
||||||
}
|
|
||||||
|
|
||||||
static int au1x00_init(struct eth_device* dev, bd_t * bd){
|
|
||||||
|
|
||||||
volatile u32 *macen = (volatile u32*)MAC0_ENABLE;
|
|
||||||
volatile u32 *mac_ctrl = (volatile u32*)(ETH0_BASE+MAC_CONTROL);
|
|
||||||
volatile u32 *mac_addr_high = (volatile u32*)(ETH0_BASE+MAC_ADDRESS_HIGH);
|
|
||||||
volatile u32 *mac_addr_low = (volatile u32*)(ETH0_BASE+MAC_ADDRESS_LOW);
|
|
||||||
volatile u32 *mac_mcast_high = (volatile u32*)(ETH0_BASE+MAC_MCAST_HIGH);
|
|
||||||
volatile u32 *mac_mcast_low = (volatile u32*)(ETH0_BASE+MAC_MCAST_LOW);
|
|
||||||
volatile mac_fifo_t *fifo_tx =
|
|
||||||
(volatile mac_fifo_t*)(MAC0_TX_DMA_ADDR+MAC_TX_BUFF0_STATUS);
|
|
||||||
volatile mac_fifo_t *fifo_rx =
|
|
||||||
(volatile mac_fifo_t*)(MAC0_RX_DMA_ADDR+MAC_RX_BUFF0_STATUS);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
next_tx = TX_GET_DMA_BUFFER(fifo_tx[0].addr);
|
|
||||||
next_rx = RX_GET_DMA_BUFFER(fifo_rx[0].addr);
|
|
||||||
|
|
||||||
/* We have to enable clocks before releasing reset */
|
|
||||||
*macen = MAC_EN_CLOCK_ENABLE;
|
|
||||||
udelay(10);
|
|
||||||
|
|
||||||
/* Enable MAC0 */
|
|
||||||
/* We have to release reset before accessing registers */
|
|
||||||
*macen = MAC_EN_CLOCK_ENABLE|MAC_EN_RESET0|
|
|
||||||
MAC_EN_RESET1|MAC_EN_RESET2;
|
|
||||||
udelay(10);
|
|
||||||
|
|
||||||
for(i=0;i<NO_OF_FIFOS;i++){
|
|
||||||
fifo_tx[i].len = 0;
|
|
||||||
fifo_tx[i].addr = virt_to_phys(&txbuf[0]);
|
|
||||||
fifo_rx[i].addr = (virt_to_phys(NetRxPackets[i]))|RX_DMA_ENABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Put mac addr in little endian */
|
|
||||||
#define ea eth_get_dev()->enetaddr
|
|
||||||
*mac_addr_high = (ea[5] << 8) | (ea[4] ) ;
|
|
||||||
*mac_addr_low = (ea[3] << 24) | (ea[2] << 16) |
|
|
||||||
(ea[1] << 8) | (ea[0] ) ;
|
|
||||||
#undef ea
|
|
||||||
*mac_mcast_low = 0;
|
|
||||||
*mac_mcast_high = 0;
|
|
||||||
|
|
||||||
/* Make sure the MAC buffer is in the correct endian mode */
|
|
||||||
#ifdef __LITTLE_ENDIAN
|
|
||||||
*mac_ctrl = MAC_FULL_DUPLEX;
|
|
||||||
udelay(1);
|
|
||||||
*mac_ctrl = MAC_FULL_DUPLEX|MAC_RX_ENABLE|MAC_TX_ENABLE;
|
|
||||||
#else
|
|
||||||
*mac_ctrl = MAC_BIG_ENDIAN|MAC_FULL_DUPLEX;
|
|
||||||
udelay(1);
|
|
||||||
*mac_ctrl = MAC_BIG_ENDIAN|MAC_FULL_DUPLEX|MAC_RX_ENABLE|MAC_TX_ENABLE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void au1x00_halt(struct eth_device* dev){
|
|
||||||
}
|
|
||||||
|
|
||||||
int au1x00_enet_initialize(bd_t *bis){
|
|
||||||
struct eth_device* dev;
|
|
||||||
|
|
||||||
if ((dev = (struct eth_device*)malloc(sizeof *dev)) == NULL) {
|
|
||||||
puts ("malloc failed\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(dev, 0, sizeof *dev);
|
|
||||||
|
|
||||||
sprintf(dev->name, "Au1X00 ethernet");
|
|
||||||
dev->iobase = 0;
|
|
||||||
dev->priv = 0;
|
|
||||||
dev->init = au1x00_init;
|
|
||||||
dev->halt = au1x00_halt;
|
|
||||||
dev->send = au1x00_send;
|
|
||||||
dev->recv = au1x00_recv;
|
|
||||||
|
|
||||||
eth_register(dev);
|
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & CFG_CMD_MII)
|
|
||||||
miiphy_register(dev->name,
|
|
||||||
au1x00_miiphy_read, au1x00_miiphy_write);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & CFG_CMD_MII)
|
|
||||||
int au1x00_miiphy_read(char *devname, unsigned char addr,
|
|
||||||
unsigned char reg, unsigned short * value)
|
|
||||||
{
|
|
||||||
volatile u32 *mii_control_reg = (volatile u32*)(ETH0_BASE+MAC_MII_CNTRL);
|
|
||||||
volatile u32 *mii_data_reg = (volatile u32*)(ETH0_BASE+MAC_MII_DATA);
|
|
||||||
u32 mii_control;
|
|
||||||
unsigned int timedout = 20;
|
|
||||||
|
|
||||||
while (*mii_control_reg & MAC_MII_BUSY) {
|
|
||||||
udelay(1000);
|
|
||||||
if (--timedout == 0) {
|
|
||||||
printf("au1x00_eth: miiphy_read busy timeout!!\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mii_control = MAC_SET_MII_SELECT_REG(reg) |
|
|
||||||
MAC_SET_MII_SELECT_PHY(addr) | MAC_MII_READ;
|
|
||||||
|
|
||||||
*mii_control_reg = mii_control;
|
|
||||||
|
|
||||||
timedout = 20;
|
|
||||||
while (*mii_control_reg & MAC_MII_BUSY) {
|
|
||||||
udelay(1000);
|
|
||||||
if (--timedout == 0) {
|
|
||||||
printf("au1x00_eth: miiphy_read busy timeout!!\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*value = *mii_data_reg;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int au1x00_miiphy_write(char *devname, unsigned char addr,
|
|
||||||
unsigned char reg, unsigned short value)
|
|
||||||
{
|
|
||||||
volatile u32 *mii_control_reg = (volatile u32*)(ETH0_BASE+MAC_MII_CNTRL);
|
|
||||||
volatile u32 *mii_data_reg = (volatile u32*)(ETH0_BASE+MAC_MII_DATA);
|
|
||||||
u32 mii_control;
|
|
||||||
unsigned int timedout = 20;
|
|
||||||
|
|
||||||
while (*mii_control_reg & MAC_MII_BUSY) {
|
|
||||||
udelay(1000);
|
|
||||||
if (--timedout == 0) {
|
|
||||||
printf("au1x00_eth: miiphy_write busy timeout!!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mii_control = MAC_SET_MII_SELECT_REG(reg) |
|
|
||||||
MAC_SET_MII_SELECT_PHY(addr) | MAC_MII_WRITE;
|
|
||||||
|
|
||||||
*mii_data_reg = value;
|
|
||||||
*mii_control_reg = mii_control;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_COMMANDS & CFG_CMD_MII */
|
|
||||||
|
|
||||||
#endif /* CONFIG_AU1X00 */
|
|
|
@ -1,135 +0,0 @@
|
||||||
/*
|
|
||||||
* AU1X00 UART support
|
|
||||||
*
|
|
||||||
* Hardcoded to UART 0 for now
|
|
||||||
* Speed and options also hardcoded to 115200 8N1
|
|
||||||
*
|
|
||||||
* Copyright (c) 2003 Thomas.Lange@corelatus.se
|
|
||||||
*
|
|
||||||
* 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 <config.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_AU1X00
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <asm/au1x00.h>
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* serial_init - initialize a channel
|
|
||||||
*
|
|
||||||
* This routine initializes the number of data bits, parity
|
|
||||||
* and set the selected baud rate. Interrupts are disabled.
|
|
||||||
* Set the modem control signals if the option is selected.
|
|
||||||
*
|
|
||||||
* RETURNS: N/A
|
|
||||||
*/
|
|
||||||
|
|
||||||
int serial_init (void)
|
|
||||||
{
|
|
||||||
volatile u32 *uart_fifoctl = (volatile u32*)(UART0_ADDR+UART_FCR);
|
|
||||||
volatile u32 *uart_enable = (volatile u32*)(UART0_ADDR+UART_ENABLE);
|
|
||||||
|
|
||||||
/* Enable clocks first */
|
|
||||||
*uart_enable = UART_EN_CE;
|
|
||||||
|
|
||||||
/* Then release reset */
|
|
||||||
/* Must release reset before setting other regs */
|
|
||||||
*uart_enable = UART_EN_CE|UART_EN_E;
|
|
||||||
|
|
||||||
/* Activate fifos, reset tx and rx */
|
|
||||||
/* Set tx trigger level to 12 */
|
|
||||||
*uart_fifoctl = UART_FCR_ENABLE_FIFO|UART_FCR_CLEAR_RCVR|
|
|
||||||
UART_FCR_CLEAR_XMIT|UART_FCR_T_TRIGGER_12;
|
|
||||||
|
|
||||||
serial_setbrg();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void serial_setbrg (void)
|
|
||||||
{
|
|
||||||
volatile u32 *uart_clk = (volatile u32*)(UART0_ADDR+UART_CLK);
|
|
||||||
volatile u32 *uart_lcr = (volatile u32*)(UART0_ADDR+UART_LCR);
|
|
||||||
volatile u32 *sys_powerctrl = (u32 *)SYS_POWERCTRL;
|
|
||||||
int sd;
|
|
||||||
int divisorx2;
|
|
||||||
|
|
||||||
/* sd is system clock divisor */
|
|
||||||
/* see section 10.4.5 in au1550 datasheet */
|
|
||||||
sd = (*sys_powerctrl & 0x03) + 2;
|
|
||||||
|
|
||||||
/* calulate 2x baudrate and round */
|
|
||||||
divisorx2 = ((CFG_HZ/(sd * 16 * CONFIG_BAUDRATE)));
|
|
||||||
|
|
||||||
if (divisorx2 & 0x01)
|
|
||||||
divisorx2 = divisorx2 + 1;
|
|
||||||
|
|
||||||
*uart_clk = divisorx2 / 2;
|
|
||||||
|
|
||||||
/* Set parity, stop bits and word length to 8N1 */
|
|
||||||
*uart_lcr = UART_LCR_WLEN8;
|
|
||||||
}
|
|
||||||
|
|
||||||
void serial_putc (const char c)
|
|
||||||
{
|
|
||||||
volatile u32 *uart_lsr = (volatile u32*)(UART0_ADDR+UART_LSR);
|
|
||||||
volatile u32 *uart_tx = (volatile u32*)(UART0_ADDR+UART_TX);
|
|
||||||
|
|
||||||
if (c == '\n') serial_putc ('\r');
|
|
||||||
|
|
||||||
/* Wait for fifo to shift out some bytes */
|
|
||||||
while((*uart_lsr&UART_LSR_THRE)==0);
|
|
||||||
|
|
||||||
*uart_tx = (u32)c;
|
|
||||||
}
|
|
||||||
|
|
||||||
void serial_puts (const char *s)
|
|
||||||
{
|
|
||||||
while (*s)
|
|
||||||
{
|
|
||||||
serial_putc (*s++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int serial_getc (void)
|
|
||||||
{
|
|
||||||
volatile u32 *uart_rx = (volatile u32*)(UART0_ADDR+UART_RX);
|
|
||||||
char c;
|
|
||||||
|
|
||||||
while (!serial_tstc());
|
|
||||||
|
|
||||||
c = (*uart_rx&0xFF);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
int serial_tstc (void)
|
|
||||||
{
|
|
||||||
volatile u32 *uart_lsr = (volatile u32*)(UART0_ADDR+UART_LSR);
|
|
||||||
|
|
||||||
if(*uart_lsr&UART_LSR_DR){
|
|
||||||
/* Data in rfifo */
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_SERIAL_AU1X00 */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,416 +0,0 @@
|
||||||
/*
|
|
||||||
* URB OHCI HCD (Host Controller Driver) for USB.
|
|
||||||
*
|
|
||||||
* (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
|
|
||||||
* (C) Copyright 2000-2001 David Brownell <dbrownell@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* usb-ohci.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
static int cc_to_error[16] = {
|
|
||||||
|
|
||||||
/* mapping of the OHCI CC status to error codes */
|
|
||||||
/* No Error */ 0,
|
|
||||||
/* CRC Error */ USB_ST_CRC_ERR,
|
|
||||||
/* Bit Stuff */ USB_ST_BIT_ERR,
|
|
||||||
/* Data Togg */ USB_ST_CRC_ERR,
|
|
||||||
/* Stall */ USB_ST_STALLED,
|
|
||||||
/* DevNotResp */ -1,
|
|
||||||
/* PIDCheck */ USB_ST_BIT_ERR,
|
|
||||||
/* UnExpPID */ USB_ST_BIT_ERR,
|
|
||||||
/* DataOver */ USB_ST_BUF_ERR,
|
|
||||||
/* DataUnder */ USB_ST_BUF_ERR,
|
|
||||||
/* reservd */ -1,
|
|
||||||
/* reservd */ -1,
|
|
||||||
/* BufferOver */ USB_ST_BUF_ERR,
|
|
||||||
/* BuffUnder */ USB_ST_BUF_ERR,
|
|
||||||
/* Not Access */ -1,
|
|
||||||
/* Not Access */ -1
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ED States */
|
|
||||||
|
|
||||||
#define ED_NEW 0x00
|
|
||||||
#define ED_UNLINK 0x01
|
|
||||||
#define ED_OPER 0x02
|
|
||||||
#define ED_DEL 0x04
|
|
||||||
#define ED_URB_DEL 0x08
|
|
||||||
|
|
||||||
/* usb_ohci_ed */
|
|
||||||
struct ed {
|
|
||||||
__u32 hwINFO;
|
|
||||||
__u32 hwTailP;
|
|
||||||
__u32 hwHeadP;
|
|
||||||
__u32 hwNextED;
|
|
||||||
|
|
||||||
struct ed *ed_prev;
|
|
||||||
__u8 int_period;
|
|
||||||
__u8 int_branch;
|
|
||||||
__u8 int_load;
|
|
||||||
__u8 int_interval;
|
|
||||||
__u8 state;
|
|
||||||
__u8 type;
|
|
||||||
__u16 last_iso;
|
|
||||||
struct ed *ed_rm_list;
|
|
||||||
|
|
||||||
struct usb_device *usb_dev;
|
|
||||||
__u32 unused[3];
|
|
||||||
} __attribute((aligned(16)));
|
|
||||||
typedef struct ed ed_t;
|
|
||||||
|
|
||||||
|
|
||||||
/* TD info field */
|
|
||||||
#define TD_CC 0xf0000000
|
|
||||||
#define TD_CC_GET(td_p) ((td_p >>28) & 0x0f)
|
|
||||||
#define TD_CC_SET(td_p, cc) (td_p) = ((td_p) & 0x0fffffff) | (((cc) & 0x0f) << 28)
|
|
||||||
#define TD_EC 0x0C000000
|
|
||||||
#define TD_T 0x03000000
|
|
||||||
#define TD_T_DATA0 0x02000000
|
|
||||||
#define TD_T_DATA1 0x03000000
|
|
||||||
#define TD_T_TOGGLE 0x00000000
|
|
||||||
#define TD_R 0x00040000
|
|
||||||
#define TD_DI 0x00E00000
|
|
||||||
#define TD_DI_SET(X) (((X) & 0x07)<< 21)
|
|
||||||
#define TD_DP 0x00180000
|
|
||||||
#define TD_DP_SETUP 0x00000000
|
|
||||||
#define TD_DP_IN 0x00100000
|
|
||||||
#define TD_DP_OUT 0x00080000
|
|
||||||
|
|
||||||
#define TD_ISO 0x00010000
|
|
||||||
#define TD_DEL 0x00020000
|
|
||||||
|
|
||||||
/* CC Codes */
|
|
||||||
#define TD_CC_NOERROR 0x00
|
|
||||||
#define TD_CC_CRC 0x01
|
|
||||||
#define TD_CC_BITSTUFFING 0x02
|
|
||||||
#define TD_CC_DATATOGGLEM 0x03
|
|
||||||
#define TD_CC_STALL 0x04
|
|
||||||
#define TD_DEVNOTRESP 0x05
|
|
||||||
#define TD_PIDCHECKFAIL 0x06
|
|
||||||
#define TD_UNEXPECTEDPID 0x07
|
|
||||||
#define TD_DATAOVERRUN 0x08
|
|
||||||
#define TD_DATAUNDERRUN 0x09
|
|
||||||
#define TD_BUFFEROVERRUN 0x0C
|
|
||||||
#define TD_BUFFERUNDERRUN 0x0D
|
|
||||||
#define TD_NOTACCESSED 0x0F
|
|
||||||
|
|
||||||
|
|
||||||
#define MAXPSW 1
|
|
||||||
|
|
||||||
struct td {
|
|
||||||
__u32 hwINFO;
|
|
||||||
__u32 hwCBP; /* Current Buffer Pointer */
|
|
||||||
__u32 hwNextTD; /* Next TD Pointer */
|
|
||||||
__u32 hwBE; /* Memory Buffer End Pointer */
|
|
||||||
|
|
||||||
__u16 hwPSW[MAXPSW];
|
|
||||||
__u8 unused;
|
|
||||||
__u8 index;
|
|
||||||
struct ed *ed;
|
|
||||||
struct td *next_dl_td;
|
|
||||||
struct usb_device *usb_dev;
|
|
||||||
int transfer_len;
|
|
||||||
__u32 data;
|
|
||||||
|
|
||||||
__u32 unused2[2];
|
|
||||||
} __attribute((aligned(32)));
|
|
||||||
typedef struct td td_t;
|
|
||||||
|
|
||||||
#define OHCI_ED_SKIP (1 << 14)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The HCCA (Host Controller Communications Area) is a 256 byte
|
|
||||||
* structure defined in the OHCI spec. that the host controller is
|
|
||||||
* told the base address of. It must be 256-byte aligned.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define NUM_INTS 32 /* part of the OHCI standard */
|
|
||||||
struct ohci_hcca {
|
|
||||||
__u32 int_table[NUM_INTS]; /* Interrupt ED table */
|
|
||||||
__u16 frame_no; /* current frame number */
|
|
||||||
__u16 pad1; /* set to 0 on each frame_no change */
|
|
||||||
__u32 done_head; /* info returned for an interrupt */
|
|
||||||
u8 reserved_for_hc[116];
|
|
||||||
} __attribute((aligned(256)));
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Maximum number of root hub ports.
|
|
||||||
*/
|
|
||||||
#define MAX_ROOT_PORTS 15 /* maximum OHCI root hub ports */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the structure of the OHCI controller's memory mapped I/O
|
|
||||||
* region. This is Memory Mapped I/O. You must use the readl() and
|
|
||||||
* writel() macros defined in asm/io.h to access these!!
|
|
||||||
*/
|
|
||||||
struct ohci_regs {
|
|
||||||
/* control and status registers */
|
|
||||||
__u32 revision;
|
|
||||||
__u32 control;
|
|
||||||
__u32 cmdstatus;
|
|
||||||
__u32 intrstatus;
|
|
||||||
__u32 intrenable;
|
|
||||||
__u32 intrdisable;
|
|
||||||
/* memory pointers */
|
|
||||||
__u32 hcca;
|
|
||||||
__u32 ed_periodcurrent;
|
|
||||||
__u32 ed_controlhead;
|
|
||||||
__u32 ed_controlcurrent;
|
|
||||||
__u32 ed_bulkhead;
|
|
||||||
__u32 ed_bulkcurrent;
|
|
||||||
__u32 donehead;
|
|
||||||
/* frame counters */
|
|
||||||
__u32 fminterval;
|
|
||||||
__u32 fmremaining;
|
|
||||||
__u32 fmnumber;
|
|
||||||
__u32 periodicstart;
|
|
||||||
__u32 lsthresh;
|
|
||||||
/* Root hub ports */
|
|
||||||
struct ohci_roothub_regs {
|
|
||||||
__u32 a;
|
|
||||||
__u32 b;
|
|
||||||
__u32 status;
|
|
||||||
__u32 portstatus[MAX_ROOT_PORTS];
|
|
||||||
} roothub;
|
|
||||||
} __attribute((aligned(32)));
|
|
||||||
|
|
||||||
|
|
||||||
/* OHCI CONTROL AND STATUS REGISTER MASKS */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* HcControl (control) register masks
|
|
||||||
*/
|
|
||||||
#define OHCI_CTRL_CBSR (3 << 0) /* control/bulk service ratio */
|
|
||||||
#define OHCI_CTRL_PLE (1 << 2) /* periodic list enable */
|
|
||||||
#define OHCI_CTRL_IE (1 << 3) /* isochronous enable */
|
|
||||||
#define OHCI_CTRL_CLE (1 << 4) /* control list enable */
|
|
||||||
#define OHCI_CTRL_BLE (1 << 5) /* bulk list enable */
|
|
||||||
#define OHCI_CTRL_HCFS (3 << 6) /* host controller functional state */
|
|
||||||
#define OHCI_CTRL_IR (1 << 8) /* interrupt routing */
|
|
||||||
#define OHCI_CTRL_RWC (1 << 9) /* remote wakeup connected */
|
|
||||||
#define OHCI_CTRL_RWE (1 << 10) /* remote wakeup enable */
|
|
||||||
|
|
||||||
/* pre-shifted values for HCFS */
|
|
||||||
# define OHCI_USB_RESET (0 << 6)
|
|
||||||
# define OHCI_USB_RESUME (1 << 6)
|
|
||||||
# define OHCI_USB_OPER (2 << 6)
|
|
||||||
# define OHCI_USB_SUSPEND (3 << 6)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* HcCommandStatus (cmdstatus) register masks
|
|
||||||
*/
|
|
||||||
#define OHCI_HCR (1 << 0) /* host controller reset */
|
|
||||||
#define OHCI_CLF (1 << 1) /* control list filled */
|
|
||||||
#define OHCI_BLF (1 << 2) /* bulk list filled */
|
|
||||||
#define OHCI_OCR (1 << 3) /* ownership change request */
|
|
||||||
#define OHCI_SOC (3 << 16) /* scheduling overrun count */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* masks used with interrupt registers:
|
|
||||||
* HcInterruptStatus (intrstatus)
|
|
||||||
* HcInterruptEnable (intrenable)
|
|
||||||
* HcInterruptDisable (intrdisable)
|
|
||||||
*/
|
|
||||||
#define OHCI_INTR_SO (1 << 0) /* scheduling overrun */
|
|
||||||
#define OHCI_INTR_WDH (1 << 1) /* writeback of done_head */
|
|
||||||
#define OHCI_INTR_SF (1 << 2) /* start frame */
|
|
||||||
#define OHCI_INTR_RD (1 << 3) /* resume detect */
|
|
||||||
#define OHCI_INTR_UE (1 << 4) /* unrecoverable error */
|
|
||||||
#define OHCI_INTR_FNO (1 << 5) /* frame number overflow */
|
|
||||||
#define OHCI_INTR_RHSC (1 << 6) /* root hub status change */
|
|
||||||
#define OHCI_INTR_OC (1 << 30) /* ownership change */
|
|
||||||
#define OHCI_INTR_MIE (1 << 31) /* master interrupt enable */
|
|
||||||
|
|
||||||
|
|
||||||
/* Virtual Root HUB */
|
|
||||||
struct virt_root_hub {
|
|
||||||
int devnum; /* Address of Root Hub endpoint */
|
|
||||||
void *dev; /* was urb */
|
|
||||||
void *int_addr;
|
|
||||||
int send;
|
|
||||||
int interval;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB HUB CONSTANTS (not OHCI-specific; see hub.h) */
|
|
||||||
|
|
||||||
/* destination of request */
|
|
||||||
#define RH_INTERFACE 0x01
|
|
||||||
#define RH_ENDPOINT 0x02
|
|
||||||
#define RH_OTHER 0x03
|
|
||||||
|
|
||||||
#define RH_CLASS 0x20
|
|
||||||
#define RH_VENDOR 0x40
|
|
||||||
|
|
||||||
/* Requests: bRequest << 8 | bmRequestType */
|
|
||||||
#define RH_GET_STATUS 0x0080
|
|
||||||
#define RH_CLEAR_FEATURE 0x0100
|
|
||||||
#define RH_SET_FEATURE 0x0300
|
|
||||||
#define RH_SET_ADDRESS 0x0500
|
|
||||||
#define RH_GET_DESCRIPTOR 0x0680
|
|
||||||
#define RH_SET_DESCRIPTOR 0x0700
|
|
||||||
#define RH_GET_CONFIGURATION 0x0880
|
|
||||||
#define RH_SET_CONFIGURATION 0x0900
|
|
||||||
#define RH_GET_STATE 0x0280
|
|
||||||
#define RH_GET_INTERFACE 0x0A80
|
|
||||||
#define RH_SET_INTERFACE 0x0B00
|
|
||||||
#define RH_SYNC_FRAME 0x0C80
|
|
||||||
/* Our Vendor Specific Request */
|
|
||||||
#define RH_SET_EP 0x2000
|
|
||||||
|
|
||||||
|
|
||||||
/* Hub port features */
|
|
||||||
#define RH_PORT_CONNECTION 0x00
|
|
||||||
#define RH_PORT_ENABLE 0x01
|
|
||||||
#define RH_PORT_SUSPEND 0x02
|
|
||||||
#define RH_PORT_OVER_CURRENT 0x03
|
|
||||||
#define RH_PORT_RESET 0x04
|
|
||||||
#define RH_PORT_POWER 0x08
|
|
||||||
#define RH_PORT_LOW_SPEED 0x09
|
|
||||||
|
|
||||||
#define RH_C_PORT_CONNECTION 0x10
|
|
||||||
#define RH_C_PORT_ENABLE 0x11
|
|
||||||
#define RH_C_PORT_SUSPEND 0x12
|
|
||||||
#define RH_C_PORT_OVER_CURRENT 0x13
|
|
||||||
#define RH_C_PORT_RESET 0x14
|
|
||||||
|
|
||||||
/* Hub features */
|
|
||||||
#define RH_C_HUB_LOCAL_POWER 0x00
|
|
||||||
#define RH_C_HUB_OVER_CURRENT 0x01
|
|
||||||
|
|
||||||
#define RH_DEVICE_REMOTE_WAKEUP 0x00
|
|
||||||
#define RH_ENDPOINT_STALL 0x01
|
|
||||||
|
|
||||||
#define RH_ACK 0x01
|
|
||||||
#define RH_REQ_ERR -1
|
|
||||||
#define RH_NACK 0x00
|
|
||||||
|
|
||||||
|
|
||||||
/* OHCI ROOT HUB REGISTER MASKS */
|
|
||||||
|
|
||||||
/* roothub.portstatus [i] bits */
|
|
||||||
#define RH_PS_CCS 0x00000001 /* current connect status */
|
|
||||||
#define RH_PS_PES 0x00000002 /* port enable status*/
|
|
||||||
#define RH_PS_PSS 0x00000004 /* port suspend status */
|
|
||||||
#define RH_PS_POCI 0x00000008 /* port over current indicator */
|
|
||||||
#define RH_PS_PRS 0x00000010 /* port reset status */
|
|
||||||
#define RH_PS_PPS 0x00000100 /* port power status */
|
|
||||||
#define RH_PS_LSDA 0x00000200 /* low speed device attached */
|
|
||||||
#define RH_PS_CSC 0x00010000 /* connect status change */
|
|
||||||
#define RH_PS_PESC 0x00020000 /* port enable status change */
|
|
||||||
#define RH_PS_PSSC 0x00040000 /* port suspend status change */
|
|
||||||
#define RH_PS_OCIC 0x00080000 /* over current indicator change */
|
|
||||||
#define RH_PS_PRSC 0x00100000 /* port reset status change */
|
|
||||||
|
|
||||||
/* roothub.status bits */
|
|
||||||
#define RH_HS_LPS 0x00000001 /* local power status */
|
|
||||||
#define RH_HS_OCI 0x00000002 /* over current indicator */
|
|
||||||
#define RH_HS_DRWE 0x00008000 /* device remote wakeup enable */
|
|
||||||
#define RH_HS_LPSC 0x00010000 /* local power status change */
|
|
||||||
#define RH_HS_OCIC 0x00020000 /* over current indicator change */
|
|
||||||
#define RH_HS_CRWE 0x80000000 /* clear remote wakeup enable */
|
|
||||||
|
|
||||||
/* roothub.b masks */
|
|
||||||
#define RH_B_DR 0x0000ffff /* device removable flags */
|
|
||||||
#define RH_B_PPCM 0xffff0000 /* port power control mask */
|
|
||||||
|
|
||||||
/* roothub.a masks */
|
|
||||||
#define RH_A_NDP (0xff << 0) /* number of downstream ports */
|
|
||||||
#define RH_A_PSM (1 << 8) /* power switching mode */
|
|
||||||
#define RH_A_NPS (1 << 9) /* no power switching */
|
|
||||||
#define RH_A_DT (1 << 10) /* device type (mbz) */
|
|
||||||
#define RH_A_OCPM (1 << 11) /* over current protection mode */
|
|
||||||
#define RH_A_NOCP (1 << 12) /* no over current protection */
|
|
||||||
#define RH_A_POTPGT (0xff << 24) /* power on to power good time */
|
|
||||||
|
|
||||||
/* urb */
|
|
||||||
#define N_URB_TD 48
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
ed_t *ed;
|
|
||||||
__u16 length; /* number of tds associated with this request */
|
|
||||||
__u16 td_cnt; /* number of tds already serviced */
|
|
||||||
int state;
|
|
||||||
unsigned long pipe;
|
|
||||||
int actual_length;
|
|
||||||
td_t *td[N_URB_TD]; /* list pointer to all corresponding TDs associated with this request */
|
|
||||||
} urb_priv_t;
|
|
||||||
#define URB_DEL 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the full ohci controller description
|
|
||||||
*
|
|
||||||
* Note how the "proper" USB information is just
|
|
||||||
* a subset of what the full implementation needs. (Linus)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct ohci {
|
|
||||||
struct ohci_hcca *hcca; /* hcca */
|
|
||||||
/*dma_addr_t hcca_dma;*/
|
|
||||||
|
|
||||||
int irq;
|
|
||||||
int disabled; /* e.g. got a UE, we're hung */
|
|
||||||
int sleeping;
|
|
||||||
unsigned long flags; /* for HC bugs */
|
|
||||||
|
|
||||||
struct ohci_regs *regs; /* OHCI controller's memory */
|
|
||||||
|
|
||||||
ed_t *ed_rm_list[2]; /* lists of all endpoints to be removed */
|
|
||||||
ed_t *ed_bulktail; /* last endpoint of bulk list */
|
|
||||||
ed_t *ed_controltail; /* last endpoint of control list */
|
|
||||||
int intrstatus;
|
|
||||||
__u32 hc_control; /* copy of the hc control reg */
|
|
||||||
struct usb_device *dev[32];
|
|
||||||
struct virt_root_hub rh;
|
|
||||||
|
|
||||||
const char *slot_name;
|
|
||||||
} ohci_t;
|
|
||||||
|
|
||||||
#define NUM_EDS 8 /* num of preallocated endpoint descriptors */
|
|
||||||
|
|
||||||
struct ohci_device {
|
|
||||||
ed_t ed[NUM_EDS];
|
|
||||||
int ed_cnt;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* hcd */
|
|
||||||
/* endpoint */
|
|
||||||
static int ep_link(ohci_t * ohci, ed_t * ed);
|
|
||||||
static int ep_unlink(ohci_t * ohci, ed_t * ed);
|
|
||||||
static ed_t * ep_add_ed(struct usb_device * usb_dev, unsigned long pipe);
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* we need more TDs than EDs */
|
|
||||||
#define NUM_TD 64
|
|
||||||
|
|
||||||
/* +1 so we can align the storage */
|
|
||||||
td_t gtd[NUM_TD+1];
|
|
||||||
/* pointers to aligned storage */
|
|
||||||
td_t *ptd;
|
|
||||||
|
|
||||||
/* TDs ... */
|
|
||||||
static inline struct td *
|
|
||||||
td_alloc (struct usb_device *usb_dev)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct td *td;
|
|
||||||
|
|
||||||
td = NULL;
|
|
||||||
for (i = 0; i < NUM_TD; i++) {
|
|
||||||
if (ptd[i].usb_dev == NULL) {
|
|
||||||
td = &ptd[i];
|
|
||||||
td->usb_dev = usb_dev;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return td;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
ed_free (struct ed *ed)
|
|
||||||
{
|
|
||||||
ed->usb_dev = NULL;
|
|
||||||
}
|
|
|
@ -1,278 +0,0 @@
|
||||||
/*
|
|
||||||
* Cache-handling routined for MIPS 4K CPUs
|
|
||||||
*
|
|
||||||
* Copyright (c) 2003 Wolfgang Denk <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 <config.h>
|
|
||||||
#include <version.h>
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
#include <asm/cacheops.h>
|
|
||||||
#if defined(CONFIG_IFX_MIPS)
|
|
||||||
# include "ifx_cache.S"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* 16KB is the maximum size of instruction and data caches on
|
|
||||||
* MIPS 4K.
|
|
||||||
*/
|
|
||||||
#define MIPS_MAX_CACHE_SIZE 0x4000
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* cacheop macro to automate cache operations
|
|
||||||
* first some helpers...
|
|
||||||
*/
|
|
||||||
#define _mincache(size, maxsize) \
|
|
||||||
bltu size,maxsize,9f ; \
|
|
||||||
move size,maxsize ; \
|
|
||||||
9:
|
|
||||||
|
|
||||||
#define _align(minaddr, maxaddr, linesize) \
|
|
||||||
.set noat ; \
|
|
||||||
subu AT,linesize,1 ; \
|
|
||||||
not AT ; \
|
|
||||||
and minaddr,AT ; \
|
|
||||||
addu maxaddr,-1 ; \
|
|
||||||
and maxaddr,AT ; \
|
|
||||||
.set at
|
|
||||||
|
|
||||||
/* general operations */
|
|
||||||
#define doop1(op1) \
|
|
||||||
cache op1,0(a0)
|
|
||||||
#define doop2(op1, op2) \
|
|
||||||
cache op1,0(a0) ; \
|
|
||||||
nop ; \
|
|
||||||
cache op2,0(a0)
|
|
||||||
|
|
||||||
/* specials for cache initialisation */
|
|
||||||
#define doop1lw(op1) \
|
|
||||||
lw zero,0(a0)
|
|
||||||
#define doop1lw1(op1) \
|
|
||||||
cache op1,0(a0) ; \
|
|
||||||
lw zero,0(a0) ; \
|
|
||||||
cache op1,0(a0)
|
|
||||||
#define doop121(op1,op2) \
|
|
||||||
cache op1,0(a0) ; \
|
|
||||||
nop; \
|
|
||||||
cache op2,0(a0) ; \
|
|
||||||
nop; \
|
|
||||||
cache op1,0(a0)
|
|
||||||
|
|
||||||
#define _oploopn(minaddr, maxaddr, linesize, tag, ops) \
|
|
||||||
.set noreorder ; \
|
|
||||||
10: doop##tag##ops ; \
|
|
||||||
bne minaddr,maxaddr,10b ; \
|
|
||||||
add minaddr,linesize ; \
|
|
||||||
.set reorder
|
|
||||||
|
|
||||||
/* finally the cache operation macros */
|
|
||||||
#define vcacheopn(kva, n, cacheSize, cacheLineSize, tag, ops) \
|
|
||||||
blez n,11f ; \
|
|
||||||
addu n,kva ; \
|
|
||||||
_align(kva, n, cacheLineSize) ; \
|
|
||||||
_oploopn(kva, n, cacheLineSize, tag, ops) ; \
|
|
||||||
11:
|
|
||||||
|
|
||||||
#define icacheopn(kva, n, cacheSize, cacheLineSize, tag, ops) \
|
|
||||||
_mincache(n, cacheSize); \
|
|
||||||
blez n,11f ; \
|
|
||||||
addu n,kva ; \
|
|
||||||
_align(kva, n, cacheLineSize) ; \
|
|
||||||
_oploopn(kva, n, cacheLineSize, tag, ops) ; \
|
|
||||||
11:
|
|
||||||
|
|
||||||
#define vcacheop(kva, n, cacheSize, cacheLineSize, op) \
|
|
||||||
vcacheopn(kva, n, cacheSize, cacheLineSize, 1, (op))
|
|
||||||
|
|
||||||
#define icacheop(kva, n, cacheSize, cacheLineSize, op) \
|
|
||||||
icacheopn(kva, n, cacheSize, cacheLineSize, 1, (op))
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* mips_cache_reset - low level initialisation of the primary caches
|
|
||||||
*
|
|
||||||
* This routine initialises the primary caches to ensure that they
|
|
||||||
* have good parity. It must be called by the ROM before any cached locations
|
|
||||||
* are used to prevent the possibility of data with bad parity being written to
|
|
||||||
* memory.
|
|
||||||
* To initialise the instruction cache it is essential that a source of data
|
|
||||||
* with good parity is available. This routine
|
|
||||||
* will initialise an area of memory starting at location zero to be used as
|
|
||||||
* a source of parity.
|
|
||||||
*
|
|
||||||
* RETURNS: N/A
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
.globl mips_cache_reset
|
|
||||||
.ent mips_cache_reset
|
|
||||||
mips_cache_reset:
|
|
||||||
|
|
||||||
li t2, CFG_ICACHE_SIZE
|
|
||||||
li t3, CFG_DCACHE_SIZE
|
|
||||||
li t4, CFG_CACHELINE_SIZE
|
|
||||||
move t5, t4
|
|
||||||
|
|
||||||
|
|
||||||
li v0, MIPS_MAX_CACHE_SIZE
|
|
||||||
|
|
||||||
/* Now clear that much memory starting from zero.
|
|
||||||
*/
|
|
||||||
|
|
||||||
li a0, KSEG1
|
|
||||||
addu a1, a0, v0
|
|
||||||
|
|
||||||
2: sw zero, 0(a0)
|
|
||||||
sw zero, 4(a0)
|
|
||||||
sw zero, 8(a0)
|
|
||||||
sw zero, 12(a0)
|
|
||||||
sw zero, 16(a0)
|
|
||||||
sw zero, 20(a0)
|
|
||||||
sw zero, 24(a0)
|
|
||||||
sw zero, 28(a0)
|
|
||||||
addu a0, 32
|
|
||||||
bltu a0, a1, 2b
|
|
||||||
|
|
||||||
/* Set invalid tag.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mtc0 zero, CP0_TAGLO
|
|
||||||
#if defined(CONFIG_IFX_MIPS) && defined(IFX_CACHE_EXTRA_INVALID_TAG)
|
|
||||||
IFX_CACHE_EXTRA_INVALID_TAG
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The caches are probably in an indeterminate state,
|
|
||||||
* so we force good parity into them by doing an
|
|
||||||
* invalidate, load/fill, invalidate for each line.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Assume bottom of RAM will generate good parity for the cache.
|
|
||||||
*/
|
|
||||||
|
|
||||||
li a0, K0BASE
|
|
||||||
move a2, t2 # icacheSize
|
|
||||||
move a3, t4 # icacheLineSize
|
|
||||||
move a1, a2
|
|
||||||
icacheopn(a0,a1,a2,a3,121,(Index_Store_Tag_I,Fill))
|
|
||||||
|
|
||||||
#if defined(CONFIG_IFX_MIPS) && defined(IFX_CACHE_EXTRA_OPERATION)
|
|
||||||
IFX_CACHE_EXTRA_OPERATION
|
|
||||||
#else
|
|
||||||
/* To support Orion/R4600, we initialise the data cache in 3 passes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* 1: initialise dcache tags.
|
|
||||||
*/
|
|
||||||
|
|
||||||
li a0, K0BASE
|
|
||||||
move a2, t3 # dcacheSize
|
|
||||||
move a3, t5 # dcacheLineSize
|
|
||||||
move a1, a2
|
|
||||||
icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
|
|
||||||
|
|
||||||
/* 2: fill dcache.
|
|
||||||
*/
|
|
||||||
|
|
||||||
li a0, K0BASE
|
|
||||||
move a2, t3 # dcacheSize
|
|
||||||
move a3, t5 # dcacheLineSize
|
|
||||||
move a1, a2
|
|
||||||
icacheopn(a0,a1,a2,a3,1lw,(dummy))
|
|
||||||
|
|
||||||
/* 3: clear dcache tags.
|
|
||||||
*/
|
|
||||||
|
|
||||||
li a0, K0BASE
|
|
||||||
move a2, t3 # dcacheSize
|
|
||||||
move a3, t5 # dcacheLineSize
|
|
||||||
move a1, a2
|
|
||||||
icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
j ra
|
|
||||||
.end mips_cache_reset
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* dcache_status - get cache status
|
|
||||||
*
|
|
||||||
* RETURNS: 0 - cache disabled; 1 - cache enabled
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
.globl dcache_status
|
|
||||||
.ent dcache_status
|
|
||||||
dcache_status:
|
|
||||||
|
|
||||||
mfc0 v0, CP0_CONFIG
|
|
||||||
andi v0, v0, 1
|
|
||||||
j ra
|
|
||||||
|
|
||||||
.end dcache_status
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* dcache_disable - disable cache
|
|
||||||
*
|
|
||||||
* RETURNS: N/A
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
.globl dcache_disable
|
|
||||||
.ent dcache_disable
|
|
||||||
dcache_disable:
|
|
||||||
|
|
||||||
mfc0 t0, CP0_CONFIG
|
|
||||||
li t1, -8
|
|
||||||
and t0, t0, t1
|
|
||||||
ori t0, t0, CONF_CM_UNCACHED
|
|
||||||
mtc0 t0, CP0_CONFIG
|
|
||||||
j ra
|
|
||||||
|
|
||||||
.end dcache_disable
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* mips_cache_lock - lock RAM area pointed to by a0 in cache.
|
|
||||||
*
|
|
||||||
* RETURNS: N/A
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#if defined(CONFIG_PURPLE)
|
|
||||||
# define CACHE_LOCK_SIZE (CFG_DCACHE_SIZE/2)
|
|
||||||
#else
|
|
||||||
# define CACHE_LOCK_SIZE (CFG_DCACHE_SIZE)
|
|
||||||
#endif
|
|
||||||
.globl mips_cache_lock
|
|
||||||
.ent mips_cache_lock
|
|
||||||
mips_cache_lock:
|
|
||||||
li a1, K0BASE - CACHE_LOCK_SIZE
|
|
||||||
addu a0, a1
|
|
||||||
li a2, CACHE_LOCK_SIZE
|
|
||||||
li a3, CFG_CACHELINE_SIZE
|
|
||||||
move a1, a2
|
|
||||||
icacheop(a0,a1,a2,a3,0x1d)
|
|
||||||
|
|
||||||
j ra
|
|
||||||
.end mips_cache_lock
|
|
|
@ -1,53 +0,0 @@
|
||||||
#
|
|
||||||
# (C) Copyright 2003
|
|
||||||
# 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
|
|
||||||
#
|
|
||||||
v=$(shell \
|
|
||||||
$(CROSS_COMPILE)as --version|grep "GNU assembler"|awk '{print $$3}'|awk -F . '{print $$2}')
|
|
||||||
|
|
||||||
ifndef PLATFORM_CPU
|
|
||||||
PLATFORM_CPU = mips32r2
|
|
||||||
endif
|
|
||||||
|
|
||||||
MIPSFLAGS=$(shell \
|
|
||||||
if [ "$v" -lt "14" ]; then \
|
|
||||||
echo "-mcpu=$(PLATFORM_CPU)"; \
|
|
||||||
else \
|
|
||||||
echo "-march=$(PLATFORM_CPU) -mtune=$(PLATFORM_CPU)"; \
|
|
||||||
fi)
|
|
||||||
|
|
||||||
ifeq ($(CROSS_COMPILE_UCLIBC),1)
|
|
||||||
ifneq (,$(findstring mipsel,$(CROSS_COMIPLE)))
|
|
||||||
ENDIANNESS = -el
|
|
||||||
else
|
|
||||||
ENDIANNESS = -eb
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
ifneq (,$(findstring 4KCle,$(CROSS_COMPILE)))
|
|
||||||
ENDIANNESS = -EL
|
|
||||||
else
|
|
||||||
ENDIANNESS = -EB
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
MIPSFLAGS += $(ENDIANNESS) -mabicalls
|
|
||||||
|
|
||||||
PLATFORM_CPPFLAGS += $(MIPSFLAGS)
|
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2003
|
|
||||||
* 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 <common.h>
|
|
||||||
#include <command.h>
|
|
||||||
#if defined(CONFIG_INCA_IP)
|
|
||||||
# include <asm/inca-ip.h>
|
|
||||||
#elif defined(CONFIG_IFX_MIPS)
|
|
||||||
# include <asm/danube.h>
|
|
||||||
# include "ifx_cpu.c"
|
|
||||||
#endif
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
|
|
||||||
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|
||||||
{
|
|
||||||
#if defined(CONFIG_INCA_IP)
|
|
||||||
*INCA_IP_WDT_RST_REQ = 0x3f;
|
|
||||||
#elif defined(CONFIG_PURPLE) || defined(CONFIG_TB0229)
|
|
||||||
void (*f)(void) = (void *) 0xbfc00000;
|
|
||||||
|
|
||||||
f();
|
|
||||||
#elif defined(CONFIG_IFX_MIPS)
|
|
||||||
IFX_CPU_RESET;
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, "*** reset failed ***\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void flush_cache (ulong start_addr, ulong size)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void write_one_tlb( int index, u32 pagemask, u32 hi, u32 low0, u32 low1 ){
|
|
||||||
write_32bit_cp0_register(CP0_ENTRYLO0, low0);
|
|
||||||
write_32bit_cp0_register(CP0_PAGEMASK, pagemask);
|
|
||||||
write_32bit_cp0_register(CP0_ENTRYLO1, low1);
|
|
||||||
write_32bit_cp0_register(CP0_ENTRYHI, hi);
|
|
||||||
write_32bit_cp0_register(CP0_INDEX, index);
|
|
||||||
tlb_write_indexed();
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,91 +0,0 @@
|
||||||
#ifndef __DANUBE_CGU_DEV_H__2005_07_20__14_26__
|
|
||||||
#define __DANUBE_CGU_DEV_H__2005_07_20__14_26__
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
Copyright (c) 2002, Infineon Technologies. All rights reserved.
|
|
||||||
|
|
||||||
No Warranty
|
|
||||||
Because the program is licensed free of charge, there is no warranty for
|
|
||||||
the program, to the extent permitted by applicable law. Except when
|
|
||||||
otherwise stated in writing the copyright holders and/or other parties
|
|
||||||
provide the program "as is" without warranty of any kind, either
|
|
||||||
expressed or implied, including, but not limited to, the implied
|
|
||||||
warranties of merchantability and fitness for a particular purpose. The
|
|
||||||
entire risk as to the quality and performance of the program is with
|
|
||||||
you. should the program prove defective, you assume the cost of all
|
|
||||||
necessary servicing, repair or correction.
|
|
||||||
|
|
||||||
In no event unless required by applicable law or agreed to in writing
|
|
||||||
will any copyright holder, or any other party who may modify and/or
|
|
||||||
redistribute the program as permitted above, be liable to you for
|
|
||||||
damages, including any general, special, incidental or consequential
|
|
||||||
damages arising out of the use or inability to use the program
|
|
||||||
(including but not limited to loss of data or data being rendered
|
|
||||||
inaccurate or losses sustained by you or third parties or a failure of
|
|
||||||
the program to operate with any other programs), even if such holder or
|
|
||||||
other party has been advised of the possibility of such damages.
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ####################################
|
|
||||||
* Definition
|
|
||||||
* ####################################
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ioctl Command
|
|
||||||
*/
|
|
||||||
#define CGU_IOC_MAGIC 'u'
|
|
||||||
#define CGU_GET_CLOCK_RATES _IOW(CGU_IOC_MAGIC, 0, struct cgu_clock_rates)
|
|
||||||
#define CGU_IOC_MAXNR 1
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ####################################
|
|
||||||
* Data Type
|
|
||||||
* ####################################
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Data Type Used to Call ioctl(GET_CLOCK_RATES)
|
|
||||||
*/
|
|
||||||
struct cgu_clock_rates {
|
|
||||||
u32 mips0;
|
|
||||||
u32 mips1;
|
|
||||||
u32 cpu;
|
|
||||||
u32 io_region;
|
|
||||||
u32 fpi_bus1;
|
|
||||||
u32 fpi_bus2;
|
|
||||||
u32 pp32;
|
|
||||||
u32 pci;
|
|
||||||
u32 ethernet;
|
|
||||||
u32 usb;
|
|
||||||
u32 clockout0;
|
|
||||||
u32 clockout1;
|
|
||||||
u32 clockout2;
|
|
||||||
u32 clockout3;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ####################################
|
|
||||||
* Declaration
|
|
||||||
* ####################################
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(__KERNEL__)
|
|
||||||
extern u32 cgu_get_mips_clock(int);
|
|
||||||
extern u32 cgu_get_cpu_clock(void);
|
|
||||||
extern u32 cgu_get_io_region_clock(void);
|
|
||||||
extern u32 cgu_get_fpi_bus_clock(int);
|
|
||||||
extern u32 cgu_get_pp32_clock(void);
|
|
||||||
extern u32 cgu_get_pci_clock(void);
|
|
||||||
extern u32 cgu_get_ethernet_clock(void);
|
|
||||||
extern u32 cgu_get_usb_clock(void);
|
|
||||||
extern u32 cgu_get_clockout(int);
|
|
||||||
#endif // defined(__KERNEL__)
|
|
||||||
|
|
||||||
|
|
||||||
#endif // __DANUBE_CGU_DEV_H__2005_07_20__14_26__
|
|
|
@ -37,55 +37,52 @@
|
||||||
|
|
||||||
unsigned int danube_get_ddr_hz(void)
|
unsigned int danube_get_ddr_hz(void)
|
||||||
{
|
{
|
||||||
switch((*DANUBE_CGU_SYS) & 0x3){
|
switch((*DANUBE_CGU_SYS) & 0x3){
|
||||||
case 0:
|
case 0:
|
||||||
return 166666667;
|
default:
|
||||||
case 1:
|
return 166666667;
|
||||||
return 133333333;
|
case 1:
|
||||||
case 2:
|
return 133333333;
|
||||||
return 111111111;
|
case 2:
|
||||||
case 3:
|
return 111111111;
|
||||||
return 83333333;
|
case 3:
|
||||||
}
|
return 83333333;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint danube_get_cpuclk(void)
|
uint danube_get_cpuclk(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_USE_EMULATOR
|
#ifdef CONFIG_USE_EMULATOR
|
||||||
return EMULATOR_CPU_SPEED;
|
return EMULATOR_CPU_SPEED;
|
||||||
#else //NOT CONFIG_USE_EMULATOR
|
#else //NOT CONFIG_USE_EMULATOR
|
||||||
unsigned int ddr_clock=danube_get_ddr_hz();
|
unsigned int ddr_clock=danube_get_ddr_hz();
|
||||||
switch((*DANUBE_CGU_SYS) & 0xc){
|
switch((*DANUBE_CGU_SYS) & 0xc){
|
||||||
case 0:
|
case 0:
|
||||||
return 333333333;
|
default:
|
||||||
case 4:
|
return 333333333;
|
||||||
return ddr_clock;
|
case 4:
|
||||||
case 8:
|
return ddr_clock;
|
||||||
return ddr_clock << 1;
|
case 8:
|
||||||
default:
|
return ddr_clock << 1;
|
||||||
break;
|
}
|
||||||
/*reserved*/
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint danube_get_fpiclk(void)
|
uint danube_get_fpiclk(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_USE_EMULATOR
|
#ifdef CONFIG_USE_EMULATOR
|
||||||
unsigned int clkCPU;
|
unsigned int clkCPU;
|
||||||
clkCPU = danube_get_cpu_hz();
|
clkCPU = danube_get_cpu_hz();
|
||||||
return clkCPU >> 2;
|
return clkCPU >> 2;
|
||||||
#else //NOT CONFIG_USE_EMULATOR
|
#else //NOT CONFIG_USE_EMULATOR
|
||||||
unsigned int ddr_clock=danube_get_ddr_hz();
|
unsigned int ddr_clock=danube_get_ddr_hz();
|
||||||
if ((*DANUBE_CGU_SYS) & 0x40){
|
if ((*DANUBE_CGU_SYS) & 0x40){
|
||||||
return ddr_clock >> 1;
|
return ddr_clock >> 1;
|
||||||
}
|
}
|
||||||
return ddr_clock;
|
return ddr_clock;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,120 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2003
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef CONFIG_INCA_IP
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <asm/inca-ip.h>
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* get_cpuclk - returns the frequency of the CPU.
|
|
||||||
*
|
|
||||||
* Gets the value directly from the INCA-IP hardware.
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* 150.000.000 for 150 MHz
|
|
||||||
* 133.333.333 for 133 Mhz (= 400MHz/3)
|
|
||||||
* 100.000.000 for 100 Mhz (= 400MHz/4)
|
|
||||||
* NOTE:
|
|
||||||
* This functions should be used by the hardware driver to get the correct
|
|
||||||
* frequency of the CPU. Don't use the macros, which are set to init the CPU
|
|
||||||
* frequency in the ROM code.
|
|
||||||
*/
|
|
||||||
uint incaip_get_cpuclk (void)
|
|
||||||
{
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
/* CPU Clock Input Multiplexer (MUX I) */
|
|
||||||
/* Multiplexer MUX I selects the maximum input clock to the CPU. */
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
if (*((volatile ulong *) INCA_IP_CGU_CGU_MUXCR) &
|
|
||||||
INCA_IP_CGU_CGU_MUXCR_MUXI) {
|
|
||||||
/* MUX I set to 150 MHz clock */
|
|
||||||
return 150000000;
|
|
||||||
} else {
|
|
||||||
/* MUX I set to 100/133 MHz clock */
|
|
||||||
if (*((volatile ulong *) INCA_IP_CGU_CGU_DIVCR) & 0x40) {
|
|
||||||
/* Division value is 1/3, maximum CPU operating */
|
|
||||||
/* frequency is 133.3 MHz */
|
|
||||||
return 133333333;
|
|
||||||
} else {
|
|
||||||
/* Division value is 1/4, maximum CPU operating */
|
|
||||||
/* frequency is 100 MHz */
|
|
||||||
return 100000000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* get_fpiclk - returns the frequency of the FPI bus.
|
|
||||||
*
|
|
||||||
* Gets the value directly from the INCA-IP hardware.
|
|
||||||
*
|
|
||||||
* RETURNS: Frquency in Hz
|
|
||||||
*
|
|
||||||
* NOTE:
|
|
||||||
* This functions should be used by the hardware driver to get the correct
|
|
||||||
* frequency of the CPU. Don't use the macros, which are set to init the CPU
|
|
||||||
* frequency in the ROM code.
|
|
||||||
* The calculation for the
|
|
||||||
*/
|
|
||||||
uint incaip_get_fpiclk (void)
|
|
||||||
{
|
|
||||||
uint clkCPU;
|
|
||||||
|
|
||||||
clkCPU = incaip_get_cpuclk ();
|
|
||||||
|
|
||||||
switch (*((volatile ulong *) INCA_IP_CGU_CGU_DIVCR) & 0xC) {
|
|
||||||
case 0x4:
|
|
||||||
return clkCPU >> 1; /* devided by 2 */
|
|
||||||
break;
|
|
||||||
case 0x8:
|
|
||||||
return clkCPU >> 2; /* devided by 4 */
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return clkCPU;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int incaip_set_cpuclk (void)
|
|
||||||
{
|
|
||||||
extern void ebu_init(long);
|
|
||||||
extern void cgu_init(long);
|
|
||||||
extern void sdram_init(long);
|
|
||||||
char tmp[64];
|
|
||||||
ulong cpuclk;
|
|
||||||
|
|
||||||
if (getenv_r ("cpuclk", tmp, sizeof (tmp)) > 0) {
|
|
||||||
cpuclk = simple_strtoul (tmp, NULL, 10) * 1000000;
|
|
||||||
cgu_init (cpuclk);
|
|
||||||
ebu_init (cpuclk);
|
|
||||||
sdram_init (cpuclk);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_INCA_IP */
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*
|
|
||||||
* INCA-IP Watchdog timer management code.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2003 Wolfgang Denk <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 <config.h>
|
|
||||||
#include <version.h>
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_INCA_IP
|
|
||||||
|
|
||||||
#define WD_BASE 0xb8000000
|
|
||||||
#define WD_CON0(value) 0x0020(value)
|
|
||||||
#define WD_CON1(value) 0x0024(value)
|
|
||||||
#define WD_DISABLE 0x00000008
|
|
||||||
#define WD_ENABLE 0x00000000
|
|
||||||
#define WD_WRITE_PW 0xFFFC00F8
|
|
||||||
#define WD_WRITE_ENDINIT 0xFFFC00F3
|
|
||||||
#define WD_WRITE_INIT 0xFFFC00F2
|
|
||||||
|
|
||||||
|
|
||||||
.globl disable_incaip_wdt
|
|
||||||
disable_incaip_wdt:
|
|
||||||
li t0, WD_BASE
|
|
||||||
|
|
||||||
/* Calculate password.
|
|
||||||
*/
|
|
||||||
lw t2, WD_CON1(t0)
|
|
||||||
and t2, 0xC
|
|
||||||
|
|
||||||
lw t3, WD_CON0(t0)
|
|
||||||
and t3, 0xFFFFFF01
|
|
||||||
|
|
||||||
or t3, t2
|
|
||||||
or t3, 0xF0
|
|
||||||
|
|
||||||
sw t3, WD_CON0(t0) /* write password */
|
|
||||||
|
|
||||||
/* Clear ENDINIT.
|
|
||||||
*/
|
|
||||||
li t1, WD_WRITE_INIT
|
|
||||||
sw t1, WD_CON0(t0)
|
|
||||||
|
|
||||||
|
|
||||||
li t1, WD_DISABLE
|
|
||||||
sw t1, WD_CON1(t0) /* disable watchdog */
|
|
||||||
li t1, WD_WRITE_PW
|
|
||||||
sw t1, WD_CON0(t0) /* write password */
|
|
||||||
li t1, WD_WRITE_ENDINIT
|
|
||||||
sw t1, WD_CON0(t0) /* end command */
|
|
||||||
|
|
||||||
j ra
|
|
||||||
nop
|
|
||||||
|
|
||||||
#endif /* CONFIG_INCA_IP */
|
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2003
|
|
||||||
* 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 <common.h>
|
|
||||||
|
|
||||||
void enable_interrupts(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int disable_interrupts(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,442 +0,0 @@
|
||||||
/*
|
|
||||||
* Startup Code for MIPS32 CPU-core
|
|
||||||
*
|
|
||||||
* Copyright (c) 2003 Wolfgang Denk <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 <config.h>
|
|
||||||
#include <version.h>
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
#if defined(CONFIG_IFX_MIPS)
|
|
||||||
#include "ifx_start.S"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RVECENT(f,n) \
|
|
||||||
b f; nop
|
|
||||||
#define XVECENT(f,bev) \
|
|
||||||
b f ; \
|
|
||||||
li k0,bev
|
|
||||||
|
|
||||||
.set noreorder
|
|
||||||
|
|
||||||
.globl _start
|
|
||||||
.text
|
|
||||||
_start:
|
|
||||||
RVECENT(reset,0) /* U-boot entry point */
|
|
||||||
RVECENT(reset,1) /* software reboot */
|
|
||||||
#if defined(CONFIG_INCA_IP)
|
|
||||||
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
|
|
||||||
.word 0x00000000 /* phase of the flash */
|
|
||||||
#elif defined(CONFIG_IFX_MIPS) && defined(IFX_EBU_BOOTCFG_DWORD)
|
|
||||||
IFX_EBU_BOOTCFG_DWORD
|
|
||||||
#elif defined(CONFIG_PURPLE)
|
|
||||||
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
|
|
||||||
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
|
|
||||||
#else
|
|
||||||
RVECENT(romReserved,2)
|
|
||||||
#endif
|
|
||||||
RVECENT(romReserved,3)
|
|
||||||
RVECENT(romReserved,4)
|
|
||||||
RVECENT(romReserved,5)
|
|
||||||
RVECENT(romReserved,6)
|
|
||||||
RVECENT(romReserved,7)
|
|
||||||
RVECENT(romReserved,8)
|
|
||||||
RVECENT(romReserved,9)
|
|
||||||
RVECENT(romReserved,10)
|
|
||||||
RVECENT(romReserved,11)
|
|
||||||
RVECENT(romReserved,12)
|
|
||||||
RVECENT(romReserved,13)
|
|
||||||
RVECENT(romReserved,14)
|
|
||||||
RVECENT(romReserved,15)
|
|
||||||
RVECENT(romReserved,16)
|
|
||||||
RVECENT(romReserved,17)
|
|
||||||
RVECENT(romReserved,18)
|
|
||||||
RVECENT(romReserved,19)
|
|
||||||
RVECENT(romReserved,20)
|
|
||||||
RVECENT(romReserved,21)
|
|
||||||
RVECENT(romReserved,22)
|
|
||||||
RVECENT(romReserved,23)
|
|
||||||
RVECENT(romReserved,24)
|
|
||||||
RVECENT(romReserved,25)
|
|
||||||
RVECENT(romReserved,26)
|
|
||||||
RVECENT(romReserved,27)
|
|
||||||
RVECENT(romReserved,28)
|
|
||||||
RVECENT(romReserved,29)
|
|
||||||
RVECENT(romReserved,30)
|
|
||||||
RVECENT(romReserved,31)
|
|
||||||
RVECENT(romReserved,32)
|
|
||||||
RVECENT(romReserved,33)
|
|
||||||
RVECENT(romReserved,34)
|
|
||||||
RVECENT(romReserved,35)
|
|
||||||
RVECENT(romReserved,36)
|
|
||||||
RVECENT(romReserved,37)
|
|
||||||
RVECENT(romReserved,38)
|
|
||||||
RVECENT(romReserved,39)
|
|
||||||
RVECENT(romReserved,40)
|
|
||||||
RVECENT(romReserved,41)
|
|
||||||
RVECENT(romReserved,42)
|
|
||||||
RVECENT(romReserved,43)
|
|
||||||
RVECENT(romReserved,44)
|
|
||||||
RVECENT(romReserved,45)
|
|
||||||
RVECENT(romReserved,46)
|
|
||||||
RVECENT(romReserved,47)
|
|
||||||
RVECENT(romReserved,48)
|
|
||||||
RVECENT(romReserved,49)
|
|
||||||
RVECENT(romReserved,50)
|
|
||||||
RVECENT(romReserved,51)
|
|
||||||
RVECENT(romReserved,52)
|
|
||||||
RVECENT(romReserved,53)
|
|
||||||
RVECENT(romReserved,54)
|
|
||||||
RVECENT(romReserved,55)
|
|
||||||
RVECENT(romReserved,56)
|
|
||||||
RVECENT(romReserved,57)
|
|
||||||
RVECENT(romReserved,58)
|
|
||||||
RVECENT(romReserved,59)
|
|
||||||
RVECENT(romReserved,60)
|
|
||||||
RVECENT(romReserved,61)
|
|
||||||
RVECENT(romReserved,62)
|
|
||||||
RVECENT(romReserved,63)
|
|
||||||
XVECENT(romExcHandle,0x200) /* bfc00200: R4000 tlbmiss vector */
|
|
||||||
RVECENT(romReserved,65)
|
|
||||||
RVECENT(romReserved,66)
|
|
||||||
RVECENT(romReserved,67)
|
|
||||||
RVECENT(romReserved,68)
|
|
||||||
RVECENT(romReserved,69)
|
|
||||||
RVECENT(romReserved,70)
|
|
||||||
RVECENT(romReserved,71)
|
|
||||||
RVECENT(romReserved,72)
|
|
||||||
RVECENT(romReserved,73)
|
|
||||||
RVECENT(romReserved,74)
|
|
||||||
RVECENT(romReserved,75)
|
|
||||||
RVECENT(romReserved,76)
|
|
||||||
RVECENT(romReserved,77)
|
|
||||||
RVECENT(romReserved,78)
|
|
||||||
RVECENT(romReserved,79)
|
|
||||||
XVECENT(romExcHandle,0x280) /* bfc00280: R4000 xtlbmiss vector */
|
|
||||||
RVECENT(romReserved,81)
|
|
||||||
RVECENT(romReserved,82)
|
|
||||||
RVECENT(romReserved,83)
|
|
||||||
RVECENT(romReserved,84)
|
|
||||||
RVECENT(romReserved,85)
|
|
||||||
RVECENT(romReserved,86)
|
|
||||||
RVECENT(romReserved,87)
|
|
||||||
RVECENT(romReserved,88)
|
|
||||||
RVECENT(romReserved,89)
|
|
||||||
RVECENT(romReserved,90)
|
|
||||||
RVECENT(romReserved,91)
|
|
||||||
RVECENT(romReserved,92)
|
|
||||||
RVECENT(romReserved,93)
|
|
||||||
RVECENT(romReserved,94)
|
|
||||||
RVECENT(romReserved,95)
|
|
||||||
XVECENT(romExcHandle,0x300) /* bfc00300: R4000 cache vector */
|
|
||||||
RVECENT(romReserved,97)
|
|
||||||
RVECENT(romReserved,98)
|
|
||||||
RVECENT(romReserved,99)
|
|
||||||
RVECENT(romReserved,100)
|
|
||||||
RVECENT(romReserved,101)
|
|
||||||
RVECENT(romReserved,102)
|
|
||||||
RVECENT(romReserved,103)
|
|
||||||
RVECENT(romReserved,104)
|
|
||||||
RVECENT(romReserved,105)
|
|
||||||
RVECENT(romReserved,106)
|
|
||||||
RVECENT(romReserved,107)
|
|
||||||
RVECENT(romReserved,108)
|
|
||||||
RVECENT(romReserved,109)
|
|
||||||
RVECENT(romReserved,110)
|
|
||||||
RVECENT(romReserved,111)
|
|
||||||
XVECENT(romExcHandle,0x380) /* bfc00380: R4000 general vector */
|
|
||||||
RVECENT(romReserved,113)
|
|
||||||
RVECENT(romReserved,114)
|
|
||||||
RVECENT(romReserved,115)
|
|
||||||
RVECENT(romReserved,116)
|
|
||||||
RVECENT(romReserved,116)
|
|
||||||
RVECENT(romReserved,118)
|
|
||||||
RVECENT(romReserved,119)
|
|
||||||
RVECENT(romReserved,120)
|
|
||||||
RVECENT(romReserved,121)
|
|
||||||
RVECENT(romReserved,122)
|
|
||||||
RVECENT(romReserved,123)
|
|
||||||
RVECENT(romReserved,124)
|
|
||||||
RVECENT(romReserved,125)
|
|
||||||
RVECENT(romReserved,126)
|
|
||||||
RVECENT(romReserved,127)
|
|
||||||
|
|
||||||
/* We hope there are no more reserved vectors!
|
|
||||||
* 128 * 8 == 1024 == 0x400
|
|
||||||
* so this is address R_VEC+0x400 == 0xbfc00400
|
|
||||||
*/
|
|
||||||
#if defined(CONFIG_IFX_MIPS) && defined(IFX_MORE_RESERVED_VECTORS)
|
|
||||||
IFX_MORE_RESERVED_VECTORS
|
|
||||||
#else
|
|
||||||
#ifdef CONFIG_PURPLE
|
|
||||||
/* 0xbfc00400 */
|
|
||||||
.word 0xdc870000
|
|
||||||
.word 0xfca70000
|
|
||||||
.word 0x20840008
|
|
||||||
.word 0x20a50008
|
|
||||||
.word 0x20c6ffff
|
|
||||||
.word 0x14c0fffa
|
|
||||||
.word 0x00000000
|
|
||||||
.word 0x03e00008
|
|
||||||
.word 0x00000000
|
|
||||||
.word 0x00000000
|
|
||||||
/* 0xbfc00428 */
|
|
||||||
.word 0xdc870000
|
|
||||||
.word 0xfca70000
|
|
||||||
.word 0x20840008
|
|
||||||
.word 0x20a50008
|
|
||||||
.word 0x20c6ffff
|
|
||||||
.word 0x14c0fffa
|
|
||||||
.word 0x00000000
|
|
||||||
.word 0x03e00008
|
|
||||||
.word 0x00000000
|
|
||||||
.word 0x00000000
|
|
||||||
#endif /* CONFIG_PURPLE */
|
|
||||||
#endif /* CONFIG_IFX_MIPS */
|
|
||||||
.align 4
|
|
||||||
reset:
|
|
||||||
#if defined(CONFIG_IFX_MIPS) && defined(IFX_RESET_PRECHECK)
|
|
||||||
IFX_RESET_PRECHECK
|
|
||||||
#endif
|
|
||||||
/* Clear watch registers.
|
|
||||||
*/
|
|
||||||
mtc0 zero, CP0_WATCHLO
|
|
||||||
mtc0 zero, CP0_WATCHHI
|
|
||||||
|
|
||||||
/* STATUS register */
|
|
||||||
#ifdef CONFIG_TB0229
|
|
||||||
li k0, ST0_CU0
|
|
||||||
#else
|
|
||||||
mfc0 k0, CP0_STATUS
|
|
||||||
#endif
|
|
||||||
li k1, ~ST0_IE
|
|
||||||
and k0, k1
|
|
||||||
mtc0 k0, CP0_STATUS
|
|
||||||
|
|
||||||
/* CAUSE register */
|
|
||||||
mtc0 zero, CP0_CAUSE
|
|
||||||
|
|
||||||
#if defined(CONFIG_IFX_MIPS) && defined(IFX_CPU_EXTRA_INIT)
|
|
||||||
IFX_CPU_EXTRA_INIT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Init Timer */
|
|
||||||
mtc0 zero, CP0_COUNT
|
|
||||||
mtc0 zero, CP0_COMPARE
|
|
||||||
|
|
||||||
/* CONFIG0 register */
|
|
||||||
li t0, CONF_CM_UNCACHED
|
|
||||||
mtc0 t0, CP0_CONFIG
|
|
||||||
|
|
||||||
/* Initialize GOT pointer.
|
|
||||||
*/
|
|
||||||
bal 1f
|
|
||||||
nop
|
|
||||||
.word _GLOBAL_OFFSET_TABLE_
|
|
||||||
1:
|
|
||||||
move gp, ra
|
|
||||||
lw t1, 0(ra)
|
|
||||||
move gp, t1
|
|
||||||
|
|
||||||
#ifdef CONFIG_INCA_IP
|
|
||||||
/* Disable INCA-IP Watchdog.
|
|
||||||
*/
|
|
||||||
la t9, disable_incaip_wdt
|
|
||||||
jalr t9
|
|
||||||
nop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize any external memory.
|
|
||||||
*/
|
|
||||||
la t9, lowlevel_init
|
|
||||||
jalr t9
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* Initialize caches...
|
|
||||||
*/
|
|
||||||
la t9, mips_cache_reset
|
|
||||||
jalr t9
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* ... and enable them.
|
|
||||||
*/
|
|
||||||
#if defined(CONFIG_IFX_MIPS) && defined(IFX_CACHE_OPER_MODE)
|
|
||||||
IFX_CACHE_OPER_MODE
|
|
||||||
#else
|
|
||||||
li t0, CONF_CM_CACHABLE_NONCOHERENT
|
|
||||||
#endif
|
|
||||||
mtc0 t0, CP0_CONFIG
|
|
||||||
|
|
||||||
|
|
||||||
/* Set up temporary stack.
|
|
||||||
*/
|
|
||||||
li a0, CFG_INIT_SP_OFFSET
|
|
||||||
la t9, mips_cache_lock
|
|
||||||
jalr t9
|
|
||||||
nop
|
|
||||||
|
|
||||||
li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET
|
|
||||||
la sp, 0(t0)
|
|
||||||
|
|
||||||
la t9, board_init_f
|
|
||||||
j t9
|
|
||||||
nop
|
|
||||||
|
|
||||||
#ifdef CFG_HEAD_CODE
|
|
||||||
/*
|
|
||||||
* void jump_unconditional (addr)
|
|
||||||
* This function simply jumps to the location pointed by a0.
|
|
||||||
* a0 = target_location
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
.globl jump_unconditional
|
|
||||||
.ent jump_unconditional
|
|
||||||
jump_unconditional:
|
|
||||||
move t9, a0
|
|
||||||
j t9
|
|
||||||
nop
|
|
||||||
.end jump_unconditional
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* void relocate_code (addr_sp, gd, addr_moni)
|
|
||||||
*
|
|
||||||
* This "function" does not return, instead it continues in RAM
|
|
||||||
* after relocating the monitor code.
|
|
||||||
*
|
|
||||||
* a0 = addr_sp
|
|
||||||
* a1 = gd
|
|
||||||
* a2 = destination address
|
|
||||||
*/
|
|
||||||
.globl relocate_code
|
|
||||||
.ent relocate_code
|
|
||||||
relocate_code:
|
|
||||||
move sp, a0 /* Set new stack pointer */
|
|
||||||
|
|
||||||
#ifdef CFG_HEAD_CODE
|
|
||||||
li t0, CFG_HEAD_BASE
|
|
||||||
#else
|
|
||||||
li t0, CFG_MONITOR_BASE
|
|
||||||
#endif
|
|
||||||
la t3, in_ram
|
|
||||||
lw t2, -12(t3) /* t2 <-- uboot_end_data */
|
|
||||||
move t1, a2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Fix GOT pointer:
|
|
||||||
*
|
|
||||||
* New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address
|
|
||||||
*/
|
|
||||||
move t6, gp
|
|
||||||
#ifdef CFG_HEAD_CODE
|
|
||||||
sub gp, CFG_HEAD_BASE
|
|
||||||
#else
|
|
||||||
sub gp, CFG_MONITOR_BASE
|
|
||||||
#endif
|
|
||||||
add gp, a2 /* gp now adjusted */
|
|
||||||
sub t6, gp, t6 /* t6 <-- relocation offset */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* t0 = source address
|
|
||||||
* t1 = target address
|
|
||||||
* t2 = source end address
|
|
||||||
*/
|
|
||||||
/* On the purple board we copy the code earlier in a special way
|
|
||||||
* in order to solve flash problems
|
|
||||||
*/
|
|
||||||
#ifndef CONFIG_PURPLE
|
|
||||||
1:
|
|
||||||
lw t3, 0(t0)
|
|
||||||
sw t3, 0(t1)
|
|
||||||
addu t0, 4
|
|
||||||
ble t0, t2, 1b
|
|
||||||
addu t1, 4 /* delay slot */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If caches were enabled, we would have to flush them here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Jump to where we've relocated ourselves.
|
|
||||||
*/
|
|
||||||
addi t0, a2, in_ram - _start
|
|
||||||
j t0
|
|
||||||
nop
|
|
||||||
|
|
||||||
.word uboot_end_data
|
|
||||||
.word uboot_end
|
|
||||||
.word num_got_entries
|
|
||||||
|
|
||||||
in_ram:
|
|
||||||
/* Now we want to update GOT.
|
|
||||||
*/
|
|
||||||
lw t3, -4(t0) /* t3 <-- num_got_entries */
|
|
||||||
addi t4, gp, 8 /* Skipping first two entries. */
|
|
||||||
li t2, 2
|
|
||||||
1:
|
|
||||||
lw t1, 0(t4)
|
|
||||||
beqz t1, 2f
|
|
||||||
add t1, t6
|
|
||||||
sw t1, 0(t4)
|
|
||||||
2:
|
|
||||||
addi t2, 1
|
|
||||||
blt t2, t3, 1b
|
|
||||||
addi t4, 4 /* delay slot */
|
|
||||||
|
|
||||||
/* Clear BSS.
|
|
||||||
*/
|
|
||||||
lw t1, -12(t0) /* t1 <-- uboot_end_data */
|
|
||||||
lw t2, -8(t0) /* t2 <-- uboot_end */
|
|
||||||
add t1, t6 /* adjust pointers */
|
|
||||||
add t2, t6
|
|
||||||
|
|
||||||
sub t1, 4
|
|
||||||
1: addi t1, 4
|
|
||||||
bltl t1, t2, 1b
|
|
||||||
sw zero, 0(t1) /* delay slot */
|
|
||||||
|
|
||||||
move a0, a1
|
|
||||||
la t9, board_init_r
|
|
||||||
j t9
|
|
||||||
move a1, a2 /* delay slot */
|
|
||||||
|
|
||||||
.end relocate_code
|
|
||||||
|
|
||||||
|
|
||||||
/* Exception handlers.
|
|
||||||
*/
|
|
||||||
romReserved:
|
|
||||||
b romReserved
|
|
||||||
|
|
||||||
romExcHandle:
|
|
||||||
b romExcHandle
|
|
||||||
|
|
||||||
/* Additional handlers.
|
|
||||||
*/
|
|
||||||
#if defined(CONFIG_IFX_MIPS)
|
|
||||||
#if defined(IFX_MIPS_HANDLER_1)
|
|
||||||
ifx_mips_handler_1:
|
|
||||||
IFX_MIPS_HANDLER_1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,428 +0,0 @@
|
||||||
/*
|
|
||||||
* Startup Code for MIPS32 CPU-core
|
|
||||||
*
|
|
||||||
* Copyright (c) 2003 Wolfgang Denk <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 <config.h>
|
|
||||||
#include <version.h>
|
|
||||||
#include <asm/regdef.h>
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define RVECENT(f,n) \
|
|
||||||
b f; nop
|
|
||||||
#define XVECENT(f,bev) \
|
|
||||||
b f ; \
|
|
||||||
li k0,bev
|
|
||||||
|
|
||||||
.set noreorder
|
|
||||||
|
|
||||||
.globl _start_bootstrap
|
|
||||||
.text
|
|
||||||
_start_bootstrap:
|
|
||||||
RVECENT(reset,0) /* U-boot entry point */
|
|
||||||
RVECENT(reset,1) /* software reboot */
|
|
||||||
#if defined(CONFIG_INCA_IP) || defined(CONFIG_INCA_IP2)
|
|
||||||
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
|
|
||||||
.word 0x00000000 /* phase of the flash */
|
|
||||||
#elif defined(CONFIG_PURPLE)
|
|
||||||
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
|
|
||||||
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
|
|
||||||
#elif defined(CONFIG_DANUBE)
|
|
||||||
|
|
||||||
.org 0x10
|
|
||||||
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
|
|
||||||
.word 0x00000000 /* phase of the flash */
|
|
||||||
|
|
||||||
.org 0x18
|
|
||||||
.word 0x312E3000 /* version x.x */
|
|
||||||
.word 0x00000000 /* phase of the flash */
|
|
||||||
#else
|
|
||||||
RVECENT(romReserved,2)
|
|
||||||
#endif
|
|
||||||
RVECENT(romReserved,3)
|
|
||||||
RVECENT(romReserved,4)
|
|
||||||
RVECENT(romReserved,5)
|
|
||||||
RVECENT(romReserved,6)
|
|
||||||
RVECENT(romReserved,7)
|
|
||||||
RVECENT(romReserved,8)
|
|
||||||
RVECENT(romReserved,9)
|
|
||||||
RVECENT(romReserved,10)
|
|
||||||
RVECENT(romReserved,11)
|
|
||||||
RVECENT(romReserved,12)
|
|
||||||
RVECENT(romReserved,13)
|
|
||||||
RVECENT(romReserved,14)
|
|
||||||
RVECENT(romReserved,15)
|
|
||||||
RVECENT(romReserved,16)
|
|
||||||
RVECENT(romReserved,17)
|
|
||||||
RVECENT(romReserved,18)
|
|
||||||
RVECENT(romReserved,19)
|
|
||||||
RVECENT(romReserved,20)
|
|
||||||
RVECENT(romReserved,21)
|
|
||||||
RVECENT(romReserved,22)
|
|
||||||
RVECENT(romReserved,23)
|
|
||||||
RVECENT(romReserved,24)
|
|
||||||
RVECENT(romReserved,25)
|
|
||||||
RVECENT(romReserved,26)
|
|
||||||
RVECENT(romReserved,27)
|
|
||||||
RVECENT(romReserved,28)
|
|
||||||
RVECENT(romReserved,29)
|
|
||||||
RVECENT(romReserved,30)
|
|
||||||
RVECENT(romReserved,31)
|
|
||||||
RVECENT(romReserved,32)
|
|
||||||
RVECENT(romReserved,33)
|
|
||||||
RVECENT(romReserved,34)
|
|
||||||
RVECENT(romReserved,35)
|
|
||||||
RVECENT(romReserved,36)
|
|
||||||
RVECENT(romReserved,37)
|
|
||||||
RVECENT(romReserved,38)
|
|
||||||
RVECENT(romReserved,39)
|
|
||||||
RVECENT(romReserved,40)
|
|
||||||
RVECENT(romReserved,41)
|
|
||||||
RVECENT(romReserved,42)
|
|
||||||
RVECENT(romReserved,43)
|
|
||||||
RVECENT(romReserved,44)
|
|
||||||
RVECENT(romReserved,45)
|
|
||||||
RVECENT(romReserved,46)
|
|
||||||
RVECENT(romReserved,47)
|
|
||||||
RVECENT(romReserved,48)
|
|
||||||
RVECENT(romReserved,49)
|
|
||||||
RVECENT(romReserved,50)
|
|
||||||
RVECENT(romReserved,51)
|
|
||||||
RVECENT(romReserved,52)
|
|
||||||
RVECENT(romReserved,53)
|
|
||||||
RVECENT(romReserved,54)
|
|
||||||
RVECENT(romReserved,55)
|
|
||||||
RVECENT(romReserved,56)
|
|
||||||
RVECENT(romReserved,57)
|
|
||||||
RVECENT(romReserved,58)
|
|
||||||
RVECENT(romReserved,59)
|
|
||||||
RVECENT(romReserved,60)
|
|
||||||
RVECENT(romReserved,61)
|
|
||||||
RVECENT(romReserved,62)
|
|
||||||
RVECENT(romReserved,63)
|
|
||||||
XVECENT(romExcHandle,0x200) /* bfc00200: R4000 tlbmiss vector */
|
|
||||||
RVECENT(romReserved,65)
|
|
||||||
RVECENT(romReserved,66)
|
|
||||||
RVECENT(romReserved,67)
|
|
||||||
RVECENT(romReserved,68)
|
|
||||||
RVECENT(romReserved,69)
|
|
||||||
RVECENT(romReserved,70)
|
|
||||||
RVECENT(romReserved,71)
|
|
||||||
RVECENT(romReserved,72)
|
|
||||||
RVECENT(romReserved,73)
|
|
||||||
RVECENT(romReserved,74)
|
|
||||||
RVECENT(romReserved,75)
|
|
||||||
RVECENT(romReserved,76)
|
|
||||||
RVECENT(romReserved,77)
|
|
||||||
RVECENT(romReserved,78)
|
|
||||||
RVECENT(romReserved,79)
|
|
||||||
XVECENT(romExcHandle,0x280) /* bfc00280: R4000 xtlbmiss vector */
|
|
||||||
RVECENT(romReserved,81)
|
|
||||||
RVECENT(romReserved,82)
|
|
||||||
RVECENT(romReserved,83)
|
|
||||||
RVECENT(romReserved,84)
|
|
||||||
RVECENT(romReserved,85)
|
|
||||||
RVECENT(romReserved,86)
|
|
||||||
RVECENT(romReserved,87)
|
|
||||||
RVECENT(romReserved,88)
|
|
||||||
RVECENT(romReserved,89)
|
|
||||||
RVECENT(romReserved,90)
|
|
||||||
RVECENT(romReserved,91)
|
|
||||||
RVECENT(romReserved,92)
|
|
||||||
RVECENT(romReserved,93)
|
|
||||||
RVECENT(romReserved,94)
|
|
||||||
RVECENT(romReserved,95)
|
|
||||||
XVECENT(romExcHandle,0x300) /* bfc00300: R4000 cache vector */
|
|
||||||
RVECENT(romReserved,97)
|
|
||||||
RVECENT(romReserved,98)
|
|
||||||
RVECENT(romReserved,99)
|
|
||||||
RVECENT(romReserved,100)
|
|
||||||
RVECENT(romReserved,101)
|
|
||||||
RVECENT(romReserved,102)
|
|
||||||
RVECENT(romReserved,103)
|
|
||||||
RVECENT(romReserved,104)
|
|
||||||
RVECENT(romReserved,105)
|
|
||||||
RVECENT(romReserved,106)
|
|
||||||
RVECENT(romReserved,107)
|
|
||||||
RVECENT(romReserved,108)
|
|
||||||
RVECENT(romReserved,109)
|
|
||||||
RVECENT(romReserved,110)
|
|
||||||
RVECENT(romReserved,111)
|
|
||||||
XVECENT(romExcHandle,0x380) /* bfc00380: R4000 general vector */
|
|
||||||
RVECENT(romReserved,113)
|
|
||||||
RVECENT(romReserved,114)
|
|
||||||
RVECENT(romReserved,115)
|
|
||||||
RVECENT(romReserved,116)
|
|
||||||
RVECENT(romReserved,116)
|
|
||||||
RVECENT(romReserved,118)
|
|
||||||
RVECENT(romReserved,119)
|
|
||||||
RVECENT(romReserved,120)
|
|
||||||
RVECENT(romReserved,121)
|
|
||||||
RVECENT(romReserved,122)
|
|
||||||
RVECENT(romReserved,123)
|
|
||||||
RVECENT(romReserved,124)
|
|
||||||
RVECENT(romReserved,125)
|
|
||||||
RVECENT(romReserved,126)
|
|
||||||
RVECENT(romReserved,127)
|
|
||||||
|
|
||||||
/* We hope there are no more reserved vectors!
|
|
||||||
* 128 * 8 == 1024 == 0x400
|
|
||||||
* so this is address R_VEC+0x400 == 0xbfc00400
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_PURPLE
|
|
||||||
/* 0xbfc00400 */
|
|
||||||
.word 0xdc870000
|
|
||||||
.word 0xfca70000
|
|
||||||
.word 0x20840008
|
|
||||||
.word 0x20a50008
|
|
||||||
.word 0x20c6ffff
|
|
||||||
.word 0x14c0fffa
|
|
||||||
.word 0x00000000
|
|
||||||
.word 0x03e00008
|
|
||||||
.word 0x00000000
|
|
||||||
.word 0x00000000
|
|
||||||
/* 0xbfc00428 */
|
|
||||||
.word 0xdc870000
|
|
||||||
.word 0xfca70000
|
|
||||||
.word 0x20840008
|
|
||||||
.word 0x20a50008
|
|
||||||
.word 0x20c6ffff
|
|
||||||
.word 0x14c0fffa
|
|
||||||
.word 0x00000000
|
|
||||||
.word 0x03e00008
|
|
||||||
.word 0x00000000
|
|
||||||
.word 0x00000000
|
|
||||||
#endif /* CONFIG_PURPLE */
|
|
||||||
.align 4
|
|
||||||
reset:
|
|
||||||
#ifdef CONFIG_INCA_IP2
|
|
||||||
/* Check for Host or Voice CPU */
|
|
||||||
|
|
||||||
mfc0 k0, CP0_EBASE
|
|
||||||
and k0, EBASEF_CPUNUM
|
|
||||||
srl k0, EBASEB_CPUNUM
|
|
||||||
subu k0, EBASE_CPU_HOST
|
|
||||||
bne k0, zero, voice_reset_handler
|
|
||||||
nop
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Clear watch registers.
|
|
||||||
*/
|
|
||||||
mtc0 zero, CP0_WATCHLO
|
|
||||||
mtc0 zero, CP0_WATCHHI
|
|
||||||
|
|
||||||
/* STATUS register */
|
|
||||||
#ifdef CONFIG_TB0229
|
|
||||||
li k0, ST0_CU0
|
|
||||||
#else
|
|
||||||
mfc0 k0, CP0_STATUS
|
|
||||||
#endif
|
|
||||||
li k1, ~ST0_IE
|
|
||||||
and k0, k1
|
|
||||||
mtc0 k0, CP0_STATUS
|
|
||||||
|
|
||||||
/* CAUSE register */
|
|
||||||
mtc0 zero, CP0_CAUSE
|
|
||||||
|
|
||||||
#ifdef CONFIG_INCA_IP2
|
|
||||||
/* CONFIG7 register */
|
|
||||||
mfc0 k0, CP0_CONFIG, 7
|
|
||||||
li k1, 4 /* Disable RPS due to E83 bug of 24KEC */
|
|
||||||
or k0, k1
|
|
||||||
mtc0 k0, CP0_CONFIG, 7
|
|
||||||
#endif
|
|
||||||
/* Init Timer */
|
|
||||||
mtc0 zero, CP0_COUNT
|
|
||||||
mtc0 zero, CP0_COMPARE
|
|
||||||
|
|
||||||
/* CONFIG0 register */
|
|
||||||
li t0, CONF_CM_UNCACHED
|
|
||||||
mtc0 t0, CP0_CONFIG
|
|
||||||
|
|
||||||
/* Initialize GOT pointer.
|
|
||||||
*/
|
|
||||||
bal 1f
|
|
||||||
nop
|
|
||||||
.word _GLOBAL_OFFSET_TABLE_
|
|
||||||
1:
|
|
||||||
move gp, ra
|
|
||||||
lw t1, 0(ra)
|
|
||||||
move gp, t1
|
|
||||||
|
|
||||||
#ifdef CONFIG_INCA_IP
|
|
||||||
/* Disable INCA-IP Watchdog.
|
|
||||||
*/
|
|
||||||
la t9, disable_incaip_wdt
|
|
||||||
jalr t9
|
|
||||||
nop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize any external memory.
|
|
||||||
*/
|
|
||||||
la t9, lowlevel_init
|
|
||||||
jalr t9
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* Initialize caches...
|
|
||||||
*/
|
|
||||||
la t9, mips_cache_reset
|
|
||||||
jalr t9
|
|
||||||
nop
|
|
||||||
|
|
||||||
/* ... and enable them.
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_MIPS_FORCE_CACHE_WRITE_THROUGH
|
|
||||||
li t0, CONF_CM_CACHABLE_NO_WA
|
|
||||||
#else
|
|
||||||
li t0, CONF_CM_CACHABLE_NONCOHERENT
|
|
||||||
#endif
|
|
||||||
mtc0 t0, CP0_CONFIG
|
|
||||||
|
|
||||||
|
|
||||||
/* Set up temporary stack.
|
|
||||||
*/
|
|
||||||
li a0, CFG_INIT_SP_OFFSET
|
|
||||||
la t9, mips_cache_lock
|
|
||||||
jalr t9
|
|
||||||
nop
|
|
||||||
|
|
||||||
li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET
|
|
||||||
la sp, 0(t0)
|
|
||||||
|
|
||||||
la t9, bootstrap_board_init_f
|
|
||||||
j t9
|
|
||||||
nop
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* void bootstrap_relocate_code (addr_sp, gd, addr_moni)
|
|
||||||
*
|
|
||||||
* This "function" does not return, instead it continues in RAM
|
|
||||||
* after relocating the monitor code.
|
|
||||||
*
|
|
||||||
* a0 = addr_sp
|
|
||||||
* a1 = gd
|
|
||||||
* a2 = destination address
|
|
||||||
*/
|
|
||||||
.globl bootstrap_relocate_code
|
|
||||||
.ent bootstrap_relocate_code
|
|
||||||
bootstrap_relocate_code:
|
|
||||||
move sp, a0 /* Set new stack pointer */
|
|
||||||
|
|
||||||
li t0, BOOTSTRAP_CFG_MONITOR_BASE
|
|
||||||
la t3, in_ram
|
|
||||||
lw t2, -12(t3) /* t2 <-- uboot_end_data_bootsrap */
|
|
||||||
move t1, a2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Fix GOT pointer:
|
|
||||||
*
|
|
||||||
* New GOT-PTR = (old GOT-PTR - BOOTSTRAP_CFG_MONITOR_BASE) + Destination Address
|
|
||||||
*/
|
|
||||||
move t6, gp
|
|
||||||
sub gp, BOOTSTRAP_CFG_MONITOR_BASE
|
|
||||||
add gp, a2 /* gp now adjusted */
|
|
||||||
sub t6, gp, t6 /* t6 <-- relocation offset */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* t0 = source address
|
|
||||||
* t1 = target address
|
|
||||||
* t2 = source end address
|
|
||||||
*/
|
|
||||||
/* On the purple board we copy the code earlier in a special way
|
|
||||||
* in order to solve flash problems
|
|
||||||
*/
|
|
||||||
#ifndef CONFIG_PURPLE
|
|
||||||
1:
|
|
||||||
lw t3, 0(t0)
|
|
||||||
sw t3, 0(t1)
|
|
||||||
addu t0, 4
|
|
||||||
ble t0, t2, 1b
|
|
||||||
addu t1, 4 /* delay slot */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If caches were enabled, we would have to flush them here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Jump to where we've relocated ourselves.
|
|
||||||
*/
|
|
||||||
addi t0, a2, in_ram - _start_bootstrap
|
|
||||||
j t0
|
|
||||||
nop
|
|
||||||
|
|
||||||
.word uboot_end_data_bootstrap
|
|
||||||
.word uboot_end_bootstrap
|
|
||||||
.word num_got_entries
|
|
||||||
|
|
||||||
in_ram:
|
|
||||||
/* Now we want to update GOT.
|
|
||||||
*/
|
|
||||||
lw t3, -4(t0) /* t3 <-- num_got_entries */
|
|
||||||
addi t4, gp, 8 /* Skipping first two entries. */
|
|
||||||
li t2, 2
|
|
||||||
1:
|
|
||||||
lw t1, 0(t4)
|
|
||||||
beqz t1, 2f
|
|
||||||
add t1, t6
|
|
||||||
sw t1, 0(t4)
|
|
||||||
2:
|
|
||||||
addi t2, 1
|
|
||||||
blt t2, t3, 1b
|
|
||||||
addi t4, 4 /* delay slot */
|
|
||||||
|
|
||||||
/* Clear BSS.
|
|
||||||
*/
|
|
||||||
lw t1, -12(t0) /* t1 <-- uboot_end_data_bootstrap */
|
|
||||||
lw t2, -8(t0) /* t2 <-- uboot_end_bootstrap */
|
|
||||||
add t1, t6 /* adjust pointers */
|
|
||||||
add t2, t6
|
|
||||||
|
|
||||||
sub t1, 4
|
|
||||||
1: addi t1, 4
|
|
||||||
bltl t1, t2, 1b
|
|
||||||
sw zero, 0(t1) /* delay slot */
|
|
||||||
|
|
||||||
move a0, a1
|
|
||||||
la t9, bootstrap_board_init_r
|
|
||||||
j t9
|
|
||||||
move a1, a2 /* delay slot */
|
|
||||||
|
|
||||||
.end bootstrap_relocate_code
|
|
||||||
|
|
||||||
|
|
||||||
/* Exception handlers.
|
|
||||||
*/
|
|
||||||
romReserved:
|
|
||||||
b romReserved
|
|
||||||
|
|
||||||
romExcHandle:
|
|
||||||
b romExcHandle
|
|
||||||
|
|
||||||
#ifdef CONFIG_INCA_IP2
|
|
||||||
voice_reset_handler:
|
|
||||||
wait
|
|
||||||
b voice_reset_handler
|
|
||||||
nop
|
|
||||||
#endif
|
|
|
@ -1,138 +0,0 @@
|
||||||
#ifndef _ARM_ERRNO_H
|
|
||||||
#define _ARM_ERRNO_H
|
|
||||||
|
|
||||||
#define EPERM 1 /* Operation not permitted */
|
|
||||||
#define ENOENT 2 /* No such file or directory */
|
|
||||||
#define ESRCH 3 /* No such process */
|
|
||||||
#define EINTR 4 /* Interrupted system call */
|
|
||||||
#define EIO 5 /* I/O error */
|
|
||||||
#define ENXIO 6 /* No such device or address */
|
|
||||||
#define E2BIG 7 /* Arg list too long */
|
|
||||||
#define ENOEXEC 8 /* Exec format error */
|
|
||||||
#define EBADF 9 /* Bad file number */
|
|
||||||
#define ECHILD 10 /* No child processes */
|
|
||||||
#define EAGAIN 11 /* Try again */
|
|
||||||
#define ENOMEM 12 /* Out of memory */
|
|
||||||
#define EACCES 13 /* Permission denied */
|
|
||||||
#define EFAULT 14 /* Bad address */
|
|
||||||
#define ENOTBLK 15 /* Block device required */
|
|
||||||
#define EBUSY 16 /* Device or resource busy */
|
|
||||||
#define EEXIST 17 /* File exists */
|
|
||||||
#define EXDEV 18 /* Cross-device link */
|
|
||||||
#define ENODEV 19 /* No such device */
|
|
||||||
#define ENOTDIR 20 /* Not a directory */
|
|
||||||
#define EISDIR 21 /* Is a directory */
|
|
||||||
#define EINVAL 22 /* Invalid argument */
|
|
||||||
#define ENFILE 23 /* File table overflow */
|
|
||||||
#define EMFILE 24 /* Too many open files */
|
|
||||||
#define ENOTTY 25 /* Not a typewriter */
|
|
||||||
#define ETXTBSY 26 /* Text file busy */
|
|
||||||
#define EFBIG 27 /* File too large */
|
|
||||||
#define ENOSPC 28 /* No space left on device */
|
|
||||||
#define ESPIPE 29 /* Illegal seek */
|
|
||||||
#define EROFS 30 /* Read-only file system */
|
|
||||||
#define EMLINK 31 /* Too many links */
|
|
||||||
#define EPIPE 32 /* Broken pipe */
|
|
||||||
#define EDOM 33 /* Math argument out of domain of func */
|
|
||||||
#define ERANGE 34 /* Math result not representable */
|
|
||||||
#define EDEADLK 35 /* Resource deadlock would occur */
|
|
||||||
#define ENAMETOOLONG 36 /* File name too long */
|
|
||||||
#define ENOLCK 37 /* No record locks available */
|
|
||||||
#define ENOSYS 38 /* Function not implemented */
|
|
||||||
#define ENOTEMPTY 39 /* Directory not empty */
|
|
||||||
#define ELOOP 40 /* Too many symbolic links encountered */
|
|
||||||
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
|
||||||
#define ENOMSG 42 /* No message of desired type */
|
|
||||||
#define EIDRM 43 /* Identifier removed */
|
|
||||||
#define ECHRNG 44 /* Channel number out of range */
|
|
||||||
#define EL2NSYNC 45 /* Level 2 not synchronized */
|
|
||||||
#define EL3HLT 46 /* Level 3 halted */
|
|
||||||
#define EL3RST 47 /* Level 3 reset */
|
|
||||||
#define ELNRNG 48 /* Link number out of range */
|
|
||||||
#define EUNATCH 49 /* Protocol driver not attached */
|
|
||||||
#define ENOCSI 50 /* No CSI structure available */
|
|
||||||
#define EL2HLT 51 /* Level 2 halted */
|
|
||||||
#define EBADE 52 /* Invalid exchange */
|
|
||||||
#define EBADR 53 /* Invalid request descriptor */
|
|
||||||
#define EXFULL 54 /* Exchange full */
|
|
||||||
#define ENOANO 55 /* No anode */
|
|
||||||
#define EBADRQC 56 /* Invalid request code */
|
|
||||||
#define EBADSLT 57 /* Invalid slot */
|
|
||||||
#define EDEADLOCK 58 /* File locking deadlock error */
|
|
||||||
#define EBFONT 59 /* Bad font file format */
|
|
||||||
#define ENOSTR 60 /* Device not a stream */
|
|
||||||
#define ENODATA 61 /* No data available */
|
|
||||||
#define ETIME 62 /* Timer expired */
|
|
||||||
#define ENOSR 63 /* Out of streams resources */
|
|
||||||
#define ENONET 64 /* Machine is not on the network */
|
|
||||||
#define ENOPKG 65 /* Package not installed */
|
|
||||||
#define EREMOTE 66 /* Object is remote */
|
|
||||||
#define ENOLINK 67 /* Link has been severed */
|
|
||||||
#define EADV 68 /* Advertise error */
|
|
||||||
#define ESRMNT 69 /* Srmount error */
|
|
||||||
#define ECOMM 70 /* Communication error on send */
|
|
||||||
#define EPROTO 71 /* Protocol error */
|
|
||||||
#define EMULTIHOP 72 /* Multihop attempted */
|
|
||||||
#define EDOTDOT 73 /* RFS specific error */
|
|
||||||
#define EBADMSG 74 /* Not a data message */
|
|
||||||
#define EOVERFLOW 75 /* Value too large for defined data type */
|
|
||||||
#define ENOTUNIQ 76 /* Name not unique on network */
|
|
||||||
#define EBADFD 77 /* File descriptor in bad state */
|
|
||||||
#define EREMCHG 78 /* Remote address changed */
|
|
||||||
#define ELIBACC 79 /* Can not access a needed shared library */
|
|
||||||
#define ELIBBAD 80 /* Accessing a corrupted shared library */
|
|
||||||
#define ELIBSCN 81 /* .lib section in a.out corrupted */
|
|
||||||
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
|
|
||||||
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
|
|
||||||
#define EILSEQ 84 /* Illegal byte sequence */
|
|
||||||
#define ERESTART 85 /* Interrupted system call should be restarted */
|
|
||||||
#define ESTRPIPE 86 /* Streams pipe error */
|
|
||||||
#define EUSERS 87 /* Too many users */
|
|
||||||
#define ENOTSOCK 88 /* Socket operation on non-socket */
|
|
||||||
#define EDESTADDRREQ 89 /* Destination address required */
|
|
||||||
#define EMSGSIZE 90 /* Message too long */
|
|
||||||
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
|
|
||||||
#define ENOPROTOOPT 92 /* Protocol not available */
|
|
||||||
#define EPROTONOSUPPORT 93 /* Protocol not supported */
|
|
||||||
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
|
|
||||||
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
|
|
||||||
#define EPFNOSUPPORT 96 /* Protocol family not supported */
|
|
||||||
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
|
|
||||||
#define EADDRINUSE 98 /* Address already in use */
|
|
||||||
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
|
|
||||||
#define ENETDOWN 100 /* Network is down */
|
|
||||||
#define ENETUNREACH 101 /* Network is unreachable */
|
|
||||||
#define ENETRESET 102 /* Network dropped connection because of reset */
|
|
||||||
#define ECONNABORTED 103 /* Software caused connection abort */
|
|
||||||
#define ECONNRESET 104 /* Connection reset by peer */
|
|
||||||
#define ENOBUFS 105 /* No buffer space available */
|
|
||||||
#define EISCONN 106 /* Transport endpoint is already connected */
|
|
||||||
#define ENOTCONN 107 /* Transport endpoint is not connected */
|
|
||||||
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
|
|
||||||
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
|
|
||||||
#define ETIMEDOUT 110 /* Connection timed out */
|
|
||||||
#define ECONNREFUSED 111 /* Connection refused */
|
|
||||||
#define EHOSTDOWN 112 /* Host is down */
|
|
||||||
#define EHOSTUNREACH 113 /* No route to host */
|
|
||||||
#define EALREADY 114 /* Operation already in progress */
|
|
||||||
#define EINPROGRESS 115 /* Operation now in progress */
|
|
||||||
#define ESTALE 116 /* Stale NFS file handle */
|
|
||||||
#define EUCLEAN 117 /* Structure needs cleaning */
|
|
||||||
#define ENOTNAM 118 /* Not a XENIX named type file */
|
|
||||||
#define ENAVAIL 119 /* No XENIX semaphores available */
|
|
||||||
#define EISNAM 120 /* Is a named type file */
|
|
||||||
#define EREMOTEIO 121 /* Remote I/O error */
|
|
||||||
#define EDQUOT 122 /* Quota exceeded */
|
|
||||||
|
|
||||||
#define ENOMEDIUM 123 /* No medium found */
|
|
||||||
#define EMEDIUMTYPE 124 /* Wrong medium type */
|
|
||||||
|
|
||||||
/* Should never be seen by user programs */
|
|
||||||
#define ERESTARTSYS 512
|
|
||||||
#define ERESTARTNOINTR 513
|
|
||||||
#define ERESTARTNOHAND 514 /* restart if no handler.. */
|
|
||||||
#define ENOIOCTLCMD 515 /* No ioctl command */
|
|
||||||
|
|
||||||
#define _LAST_ERRNO 515
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,66 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2003
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file contains the configuration parameters for the DANUBE board.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __CONFIG_H
|
|
||||||
#define __CONFIG_H
|
|
||||||
|
|
||||||
|
|
||||||
#define EXCEPTION_BASE 0x200
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* DANUBE
|
|
||||||
*****************************************************************************/
|
|
||||||
/* lock cache for C program stack */
|
|
||||||
/* points to ROM */
|
|
||||||
/* stack size is 16K */
|
|
||||||
#define LOCK_DCACHE_ADDR 0x9FC00000
|
|
||||||
#define LOCK_DCACHE_SIZE 0x1000
|
|
||||||
#define CFG_EBU_BOOTWORD 0x688c688c
|
|
||||||
|
|
||||||
#define CFG_HZ (danube_get_cpuclk() / 2)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Memory layout
|
|
||||||
*/
|
|
||||||
//#define CFG_SDRAM_BASE 0x80080000
|
|
||||||
#define CFG_CACHE_LOCK_SIZE LOCK_DCACHE_SIZE
|
|
||||||
#define CFG_INIT_SP_OFFSET CFG_CACHE_LOCK_SIZE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Cache settings
|
|
||||||
*/
|
|
||||||
#define CFG_CACHE_SIZE 16384
|
|
||||||
#define CFG_CACHE_LINES 32
|
|
||||||
#define CFG_CACHE_WAYS 4
|
|
||||||
#define CFG_CACHE_SETS 128
|
|
||||||
|
|
||||||
#define CFG_ICACHE_SIZE CFG_CACHE_SIZE
|
|
||||||
#define CFG_DCACHE_SIZE CFG_CACHE_SIZE
|
|
||||||
#define CFG_CACHELINE_SIZE CFG_CACHE_LINES
|
|
||||||
|
|
||||||
#endif /* __CONFIG_H */
|
|
|
@ -28,8 +28,6 @@
|
||||||
#ifndef __CONFIG_H
|
#ifndef __CONFIG_H
|
||||||
#define __CONFIG_H
|
#define __CONFIG_H
|
||||||
|
|
||||||
#include <configs/ifx_cfg.h>
|
|
||||||
|
|
||||||
#define USE_REFERENCE_BOARD
|
#define USE_REFERENCE_BOARD
|
||||||
//#define USE_EVALUATION_BOARD
|
//#define USE_EVALUATION_BOARD
|
||||||
|
|
||||||
|
@ -45,8 +43,12 @@
|
||||||
//#define DANUBE_DDR_RAM_133M
|
//#define DANUBE_DDR_RAM_133M
|
||||||
#define DANUBE_DDR_RAM_SIZE 32 /* 32M DDR-DRAM for reference board */
|
#define DANUBE_DDR_RAM_SIZE 32 /* 32M DDR-DRAM for reference board */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define CONFIG_LZMA 1 /* use LZMA for compression */
|
||||||
|
|
||||||
#define CLK_OUT2_25MHZ
|
#define CLK_OUT2_25MHZ
|
||||||
#define CONFIG_MIPS32 1 /* MIPS 4Kc CPU core */
|
#define CONFIG_MIPS32 1 /* MIPS 4Kc CPU core */
|
||||||
|
#define CONFIG_IFX_MIPS 1 /* in an Infineon chip */
|
||||||
#define CONFIG_DANUBE 1 /* on a danube Board */
|
#define CONFIG_DANUBE 1 /* on a danube Board */
|
||||||
#define RAM_SIZE 0x2000000 /*32M ram*/
|
#define RAM_SIZE 0x2000000 /*32M ram*/
|
||||||
|
|
||||||
|
@ -63,7 +65,7 @@
|
||||||
/* valid baudrates */
|
/* valid baudrates */
|
||||||
#define CFG_BAUDRATE_TABLE { 300, 9600, 19200, 38400, 57600, 115200 }
|
#define CFG_BAUDRATE_TABLE { 300, 9600, 19200, 38400, 57600, 115200 }
|
||||||
|
|
||||||
#ifndef CFG_HEAD_CODE
|
#ifndef CFG_BOOTSTRAP_CODE
|
||||||
#define CONFIG_TIMESTAMP /* Print image info with timestamp */
|
#define CONFIG_TIMESTAMP /* Print image info with timestamp */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -78,15 +80,24 @@
|
||||||
"ethaddr=11:22:33:44:55:66\0" \
|
"ethaddr=11:22:33:44:55:66\0" \
|
||||||
"serverip=192.168.45.100\0" \
|
"serverip=192.168.45.100\0" \
|
||||||
"ipaddr=192.168.45.108\0" \
|
"ipaddr=192.168.45.108\0" \
|
||||||
|
"ram_addr=0x80500000\0" \
|
||||||
|
"kernel_addr=0xb0030000\0" \
|
||||||
|
"flashargs=setenv bootargs rootfstype=squashfs,jffs2 init=/etc/preinit\0" \
|
||||||
|
"nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath} init=/etc/preinit\0" \
|
||||||
|
"addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${netdev}:off\0" \
|
||||||
|
"addmisc=setenv bootargs ${bootargs} console=ttyS1,115200 ethaddr=${ethaddr} ${mtdparts}\0" \
|
||||||
|
"flash_flash=run flashargs addip addmisc;bootm ${kernel_addr}\0" \
|
||||||
|
"flash_nfs=run nfsargs addip addmisc;bootm ${kernel_addr}\0" \
|
||||||
|
"net_flash=run load_kernel flashargs addip addmisc;bootm ${ram_addr}\0" \
|
||||||
|
"net_nfs=run load_kernel nfsargs addip addmisc;bootm ${ram_addr}\0" \
|
||||||
|
"load_kernel=tftp ${ram_addr} ${tftppath}openwrt-ifxmips-uImage\0" \
|
||||||
"update_uboot=tftp 0x80500000 u-boot.ifx;era 1:0-10; cp.b 0x80500000 0xb0000000 0x10000\0" \
|
"update_uboot=tftp 0x80500000 u-boot.ifx;era 1:0-10; cp.b 0x80500000 0xb0000000 0x10000\0" \
|
||||||
"update_openwrt=tftp 0x80500000 openwrt-ifxmips-squashfs.image; era 1:10-120; cp.b 0x80500000 0xb0030000 0x300000\0" \
|
"update_openwrt=tftp ${ram_addr} ${tftppath}openwrt-ifxmips-squashfs.image; era ${kernel_addr} +${filesize} 0; cp.b ${ram_addr} ${kernel_addr} ${filesize}\0"
|
||||||
"bootargs=console=ttyS1,115200 rootfstype=squashfs,jffs2 init=/etc/preinit\0"
|
|
||||||
|
|
||||||
#define CONFIG_BOOTCOMMAND "bootm 0xb0030000"
|
#define CONFIG_BOOTCOMMAND "run flash_flash"
|
||||||
|
|
||||||
#define CONFIG_COMMANDS_YES (CONFIG_CMD_DFL | \
|
#define CONFIG_COMMANDS_YES (CONFIG_CMD_DFL | \
|
||||||
CFG_CMD_ASKENV | \
|
CFG_CMD_ASKENV | \
|
||||||
CFG_CMD_DHRYSTONE | \
|
|
||||||
CFG_CMD_NET )
|
CFG_CMD_NET )
|
||||||
|
|
||||||
#define CONFIG_COMMANDS_NO (CFG_CMD_NFS | \
|
#define CONFIG_COMMANDS_NO (CFG_CMD_NFS | \
|
||||||
|
@ -159,8 +170,8 @@
|
||||||
//#define CFG_ENV_IS_NOWHERE 1
|
//#define CFG_ENV_IS_NOWHERE 1
|
||||||
//#define CFG_ENV_IS_IN_NVRAM 1
|
//#define CFG_ENV_IS_IN_NVRAM 1
|
||||||
/* Address and size of Primary Environment Sector */
|
/* Address and size of Primary Environment Sector */
|
||||||
#define CFG_ENV_ADDR IFX_CFG_FLASH_UBOOT_CFG_START_ADDR
|
#define CFG_ENV_ADDR 0xB0020000
|
||||||
#define CFG_ENV_SIZE IFX_CFG_FLASH_UBOOT_CFG_SIZE
|
#define CFG_ENV_SIZE 0x10000
|
||||||
|
|
||||||
#define CONFIG_FLASH_16BIT
|
#define CONFIG_FLASH_16BIT
|
||||||
|
|
||||||
|
|
|
@ -1,249 +0,0 @@
|
||||||
/* ============================================================================
|
|
||||||
* Copyright (C) 2003[- 2004] ? Infineon Technologies AG.
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
* ============================================================================
|
|
||||||
*
|
|
||||||
* ============================================================================
|
|
||||||
*
|
|
||||||
* This document contains proprietary information belonging to Infineon
|
|
||||||
* Technologies AG. Passing on and copying of this document, and communication
|
|
||||||
* of its contents is not permitted without prior written authorisation.
|
|
||||||
*
|
|
||||||
* ============================================================================
|
|
||||||
*
|
|
||||||
* File Name: ifx_cfg.h
|
|
||||||
* Author : Mars Lin (mars.lin@infineon.com)
|
|
||||||
* Date:
|
|
||||||
*
|
|
||||||
* ===========================================================================
|
|
||||||
*
|
|
||||||
* Project:
|
|
||||||
* Block:
|
|
||||||
*
|
|
||||||
* ===========================================================================
|
|
||||||
* Contents: This file contains the data structures and definitions used
|
|
||||||
* by the core iptables and the sip alg modules.
|
|
||||||
* ===========================================================================
|
|
||||||
* References:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file contains the configuration parameters for the IFX board.
|
|
||||||
*/
|
|
||||||
#ifndef _DANUBE_CFG_H_
|
|
||||||
#define _DANUBE_CFG_H_
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
|
||||||
* U-Boot/Kernel configurations
|
|
||||||
*/
|
|
||||||
#define IFX_CFG_UBOOT_DEFAULT_CFG_IPADDR "172.20.80.100"
|
|
||||||
#define IFX_CFG_UBOOT_DEFAULT_CFG_SERVERIP "172.20.80.2"
|
|
||||||
#define IFX_CFG_UBOOT_DEFAULT_CFG_ETHADDR "00:E0:92:00:01:40"
|
|
||||||
#define IFX_CFG_UBOOT_DEFAULT_CFG_NETDEV "eth1"
|
|
||||||
#define IFX_CFG_UBOOT_DEFAULT_CFG_BAUDRATE "115200"
|
|
||||||
#define IFX_CFG_UBOOT_LOAD_ADDRESS "0x80800000"
|
|
||||||
|
|
||||||
/* End of U-Boot/Kernel configurations
|
|
||||||
*-----------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
|
||||||
* Board specific configurations
|
|
||||||
*/
|
|
||||||
#ifdef IFX_CONFIG_MEMORY_SIZE
|
|
||||||
#define IFX_CFG_MEM_SIZE 31
|
|
||||||
#else
|
|
||||||
#error "ERROR!! Define memory size first!"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//2MB flash partition
|
|
||||||
#if (IFX_CONFIG_FLASH_SIZE == 2)
|
|
||||||
#define IFX_CFG_FLASH_PARTITIONS_INFO \
|
|
||||||
"part0_begin=0xB0000000\0" \
|
|
||||||
"part1_begin=0xB0010000\0" \
|
|
||||||
"part2_begin=0xB0050000\0" \
|
|
||||||
"total_part=3\0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_DATA_BLOCKS_INFO \
|
|
||||||
"data_block0=" IFX_CFG_FLASH_UBOOT_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block1=" IFX_CFG_FLASH_FIRMWARE_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block2=" IFX_CFG_FLASH_ROOTFS_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block3=" IFX_CFG_FLASH_KERNEL_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block4=" IFX_CFG_FLASH_SYSTEM_CFG_BLOCK_NAME "\0" \
|
|
||||||
"data_block5=" IFX_CFG_FLASH_UBOOT_CFG_BLOCK_NAME "\0" \
|
|
||||||
"data_block6=" IFX_CFG_FLASH_FIRMWARE_DIAG_BLOCK_NAME "\0" \
|
|
||||||
"data_block7=" IFX_CFG_FLASH_CALIBRATION_CFG_BLOCK_NAME "\0" \
|
|
||||||
"total_db=8\0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_BLOCK_NAME "uboot"
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_START_ADDR 0xB0000000
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_SIZE 0
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_MTDBLOCK_NAME "/dev/mtdblock0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_BLOCK_NAME "firmware"
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_START_ADDR 0xB0010000
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_SIZE 0
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_MTDBLOCK_NAME "/dev/mtdblock1"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_BLOCK_NAME "rootfs"
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_START_ADDR 0xB0050000
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_SIZE 0
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_MTDBLOCK_NAME "/dev/mtdblock2"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_BLOCK_NAME "kernel"
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_START_ADDR 0xB01FCFFF
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_SIZE 0
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_BLOCK_NAME "sysconfig"
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_START_ADDR 0xB01FD000
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_SIZE 0
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_END_ADDR 0xB01FEFFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_BLOCK_NAME "ubootconfig"
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_START_ADDR 0xB01FF000
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_SIZE 0x0C00
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_END_ADDR 0xB01FFBFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_DIAG_BLOCK_NAME "fwdiag"
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_DIAG_START_ADDR 0xB31FFC00
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_DIAG_SIZE 0x0200
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_DIAG_END_ADDR 0xB01FFDFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_CALIBRATION_CFG_BLOCK_NAME "calibration"
|
|
||||||
#define IFX_CFG_FLASH_CALIBRATION_CFG_START_ADDR 0xB01FFE00
|
|
||||||
#define IFX_CFG_FLASH_CALIBRATION_CFG_SIZE 0x0200
|
|
||||||
#define IFX_CFG_FLASH_CALIBRATION_CFG_END_ADDR 0xB01FFFFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_END_ADDR 0xB01FFFFF
|
|
||||||
|
|
||||||
//4MB flash partition
|
|
||||||
#elif (IFX_CONFIG_FLASH_SIZE == 4)
|
|
||||||
#define IFX_CFG_FLASH_PARTITIONS_INFO \
|
|
||||||
"part0_begin=0xB0000000\0" \
|
|
||||||
"part1_begin=0xB0020000\0" \
|
|
||||||
"part2_begin=0xB0060000\0" \
|
|
||||||
"total_part=3\0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_DATA_BLOCKS_INFO \
|
|
||||||
"data_block0=" IFX_CFG_FLASH_UBOOT_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block1=" IFX_CFG_FLASH_FIRMWARE_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block2=" IFX_CFG_FLASH_ROOTFS_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block3=" IFX_CFG_FLASH_KERNEL_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block4=" IFX_CFG_FLASH_SYSTEM_CFG_BLOCK_NAME "\0" \
|
|
||||||
"data_block5=" IFX_CFG_FLASH_UBOOT_CFG_BLOCK_NAME "\0" \
|
|
||||||
"data_block6=" IFX_CFG_FLASH_VOIP_CFG_BLOCK_NAME "\0" \
|
|
||||||
"data_block7=" IFX_CFG_FLASH_FIRMWARE_DIAG_BLOCK_NAME "\0" \
|
|
||||||
"data_block8=" IFX_CFG_FLASH_CALIBRATION_CFG_BLOCK_NAME "\0" \
|
|
||||||
"total_db=9\0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_BLOCK_NAME "uboot"
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_START_ADDR 0xB0000000
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_SIZE 0
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_MTDBLOCK_NAME "/dev/mtdblock0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_BLOCK_NAME "firmware"
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_START_ADDR 0xB0020000
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_SIZE 0
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_MTDBLOCK_NAME "/dev/mtdblock1"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_BLOCK_NAME "rootfs"
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_START_ADDR 0xB0060000
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_SIZE 0
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_MTDBLOCK_NAME "/dev/mtdblock2"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_BLOCK_NAME "kernel"
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_START_ADDR 0xB03F4FFF
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_SIZE 0
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_BLOCK_NAME "sysconfig"
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_START_ADDR 0xB03F5000
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_SIZE 0x2000
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_END_ADDR 0xB03F6FFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_BLOCK_NAME "ubootconfig"
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_START_ADDR 0xB03F7000
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_SIZE 0x0C00
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_END_ADDR 0xB03F7BFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_VOIP_CFG_BLOCK_NAME "voip"
|
|
||||||
#define IFX_CFG_FLASH_VOIP_CFG_START_ADDR 0xB03F7C00
|
|
||||||
#define IFX_CFG_FLASH_VOIP_CFG_SIZE 0x8000
|
|
||||||
#define IFX_CFG_FLASH_VOIP_CFG_END_ADDR 0xB03FFBFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_DIAG_BLOCK_NAME "fwdiag"
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_DIAG_START_ADDR 0xB03FFC00
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_DIAG_SIZE 0x0200
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_DIAG_END_ADDR 0xB03FFDFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_CALIBRATION_CFG_BLOCK_NAME "calibration"
|
|
||||||
#define IFX_CFG_FLASH_CALIBRATION_CFG_START_ADDR 0xB03FFE00
|
|
||||||
#define IFX_CFG_FLASH_CALIBRATION_CFG_SIZE 0x0200
|
|
||||||
#define IFX_CFG_FLASH_CALIBRATION_CFG_END_ADDR 0xB03FFFFF
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_END_ADDR 0xB03FFFFF
|
|
||||||
//8MB flash definition
|
|
||||||
#elif (IFX_CONFIG_FLASH_SIZE == 8)
|
|
||||||
#define IFX_CFG_FLASH_PARTITIONS_INFO \
|
|
||||||
"part0_begin=0xB0000000\0" \
|
|
||||||
"part1_begin=0xB0080000\0" \
|
|
||||||
"part2_begin=0xB0280000\0" \
|
|
||||||
"part3_begin=0xB0790000\0" \
|
|
||||||
"part4_begin=0xB07A0000\0" \
|
|
||||||
"part5_begin=0xB07E0000\0" \
|
|
||||||
"total_part=6\0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_DATA_BLOCKS_INFO \
|
|
||||||
"data_block0=" IFX_CFG_FLASH_UBOOT_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block1=" IFX_CFG_FLASH_KERNEL_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block2=" IFX_CFG_FLASH_ROOTFS_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block3=" IFX_CFG_FLASH_SYSTEM_CFG_BLOCK_NAME "\0" \
|
|
||||||
"data_block4=" IFX_CFG_FLASH_FIRMWARE_IMAGE_BLOCK_NAME "\0" \
|
|
||||||
"data_block5=" IFX_CFG_FLASH_UBOOT_CFG_BLOCK_NAME "\0" \
|
|
||||||
"total_db=6\0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_BLOCK_NAME "uboot"
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_START_ADDR 0xB0000000
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_END_ADDR 0xB007FFFF
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_SIZE 0x00080000
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_IMAGE_MTDBLOCK_NAME "/dev/mtdblock0"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_BLOCK_NAME "kernel"
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_START_ADDR 0xB0080000
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_SIZE 0x200000
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_END_ADDR 0xB017FFFF
|
|
||||||
#define IFX_CFG_FLASH_KERNEL_IMAGE_MTDBLOCK_NAME "/dev/mtdblock1"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_BLOCK_NAME "rootfs"
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_START_ADDR 0xB0280000
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_SIZE 0x00510000
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_END_ADDR 0xB078FFFF
|
|
||||||
#define IFX_CFG_FLASH_ROOTFS_IMAGE_MTDBLOCK_NAME "/dev/mtdblock2"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_BLOCK_NAME "sysconfig"
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_START_ADDR 0xB0790000
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_SIZE 0x10000
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_END_ADDR 0xB079FFFF
|
|
||||||
#define IFX_CFG_FLASH_SYSTEM_CFG_MTDBLOCK_NAME "/dev/mtdblock3"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_BLOCK_NAME "firmware"
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_START_ADDR 0xB07A0000
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_SIZE 0x40000
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_END_ADDR 0xB07DFFFF
|
|
||||||
#define IFX_CFG_FLASH_FIRMWARE_IMAGE_MTDBLOCK_NAME "/dev/mtdblock4"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_BLOCK_NAME "ubootconfig"
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_START_ADDR 0xB0020000
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_END_ADDR 0xB002FFFF
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_SIZE 0x10000
|
|
||||||
#define IFX_CFG_FLASH_UBOOT_CFG_MTDBLOCK_NAME "/dev/mtdblock5"
|
|
||||||
|
|
||||||
#define IFX_CFG_FLASH_END_ADDR 0xB07FFFFF
|
|
||||||
#else
|
|
||||||
#error "ERROR!! Define flash size first!"
|
|
||||||
#endif
|
|
||||||
/* End of Board specific configurations
|
|
||||||
*-----------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,94 +0,0 @@
|
||||||
/* ============================================================================
|
|
||||||
* Copyright (C) 2003[- 2004] ? Infineon Technologies AG.
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
* ============================================================================
|
|
||||||
*
|
|
||||||
* ============================================================================
|
|
||||||
*
|
|
||||||
* This document contains proprietary information belonging to Infineon
|
|
||||||
* Technologies AG. Passing on and copying of this document, and communication
|
|
||||||
* of its contents is not permitted without prior written authorisation.
|
|
||||||
*
|
|
||||||
* ============================================================================
|
|
||||||
*
|
|
||||||
* File Name: ifx_extra_env.h
|
|
||||||
* Author : Mars Lin (mars.lin@infineon.com)
|
|
||||||
* Date:
|
|
||||||
*
|
|
||||||
* ===========================================================================
|
|
||||||
*
|
|
||||||
* Project:
|
|
||||||
* Block:
|
|
||||||
*
|
|
||||||
* ===========================================================================
|
|
||||||
* Contents: This file contains the data structures and definitions used
|
|
||||||
* by the core iptables and the sip alg modules.
|
|
||||||
* ===========================================================================
|
|
||||||
* References:
|
|
||||||
*/
|
|
||||||
"mem=" MK_STR(IFX_CONFIG_MEMORY_SIZE) "M\0"
|
|
||||||
"ipaddr=" IFX_CFG_UBOOT_DEFAULT_CFG_IPADDR "\0"
|
|
||||||
"serverip=" IFX_CFG_UBOOT_DEFAULT_CFG_SERVERIP "\0"
|
|
||||||
"ethaddr=" IFX_CFG_UBOOT_DEFAULT_CFG_ETHADDR "\0"
|
|
||||||
"netdev=eth0\0"
|
|
||||||
"baudrate=" IFX_CFG_UBOOT_DEFAULT_CFG_BAUDRATE "\0"
|
|
||||||
"loadaddr=" IFX_CFG_UBOOT_LOAD_ADDRESS "\0"
|
|
||||||
"rootpath=/tftpboot/nfsrootfs\0"
|
|
||||||
"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):on\0"
|
|
||||||
"addmisc=setenv bootargs $(bootargs) console=ttyS1,$(baudrate) ethaddr=$(ethaddr) mem=$(mem) panic=1\0"
|
|
||||||
"flash_nfs=run nfsargs addip addmisc;bootm $(kernel_addr)\0"
|
|
||||||
"ramdisk_addr=B0100000\0"
|
|
||||||
"flash_self=run ramargs addip addmisc;bootm $(kernel_addr) $(ramdisk_addr)\0"
|
|
||||||
"bootfile=uImage\0"
|
|
||||||
"net_nfs=tftp $(loadaddr) $(bootfile);run nfsargs addip addmisc;bootm\0"
|
|
||||||
"net_flash=tftp $(loadaddr) $(bootfile); run flashargs addip addmisc; bootm\0"
|
|
||||||
"u-boot=u-boot.ifx\0"
|
|
||||||
"jffs2fs=jffs2.img\0"
|
|
||||||
"rootfs=rootfs.img\0"
|
|
||||||
"firmware=firmware.img\0"
|
|
||||||
"load=tftp $(loadaddr) $(u-boot)\0"
|
|
||||||
"update=protect off 1:0-2;era 1:0-2;cp.b $(loadaddr) B0000000 $(filesize)\0"
|
|
||||||
"flashargs=setenv bootargs root=/dev/mtdblock2 ro rootfstype=squashfs\0"
|
|
||||||
"mtdargs=setenv bootargs root=/dev/mtdblock2 rw rootfstype=jffs2\0"
|
|
||||||
"flash_flash=run flashargs addip addmisc; bootm $(f_kernel_addr)\0"
|
|
||||||
"net_mtd=tftp $(loadaddr) $(bootfile); run mtdargs addip addmisc; bootm\0"
|
|
||||||
"flash_mtd=run mtdargs addip addmisc; bootm $(f_kernel_addr)\0"
|
|
||||||
"update_uboot=tftpboot $(loadaddr) $(u-boot);upgrade uboot $(loadaddr) $(filesize) 0\0"
|
|
||||||
"update_kernel=tftpboot $(loadaddr) $(bootfile);upgrade kernel $(loadaddr) $(filesize) 0\0"
|
|
||||||
"update_rootfs=tftpboot $(loadaddr) $(rootfs); upgrade rootfs $(loadaddr) $(filesize) 0\0"
|
|
||||||
"update_rootfs_1=tftpboot $(loadaddr) $(rootfs); erase 1:47-132; cp.b $(loadaddr) $(f_rootfs_addr) $(filesize)\0"
|
|
||||||
"update_jffs2=tftpboot $(loadaddr) $(rootfs); upgrade rootfs $(loadaddr) $(filesize) 0\0"
|
|
||||||
"update_jffs2_1=tftpboot $(loadaddr) $(jffs2fs); erase 1:47-132; cp.b $(loadaddr) $(f_rootfs_addr) $(filesize)\0"
|
|
||||||
"update_firmware=tftpboot $(loadaddr) $(firmware);upgrade firmware $(loadaddr) $(filesize) 0\0"
|
|
||||||
"reset_uboot_config=erase " MK_STR(IFX_CFG_FLASH_UBOOT_CFG_START_ADDR) " " MK_STR(IFX_CFG_FLASH_UBOOT_CFG_END_ADDR) "\0"
|
|
||||||
IFX_CFG_FLASH_PARTITIONS_INFO
|
|
||||||
"flash_end=" MK_STR(IFX_CFG_FLASH_END_ADDR) "\0"
|
|
||||||
IFX_CFG_FLASH_DATA_BLOCKS_INFO
|
|
||||||
"f_uboot_addr=" MK_STR(IFX_CFG_FLASH_UBOOT_IMAGE_START_ADDR) "\0"
|
|
||||||
"f_uboot_size=" MK_STR(IFX_CFG_FLASH_UBOOT_IMAGE_SIZE) "\0"
|
|
||||||
"f_ubootconfig_addr=" MK_STR(IFX_CFG_FLASH_UBOOT_CFG_START_ADDR) "\0"
|
|
||||||
"f_ubootconfig_size=" MK_STR(IFX_CFG_FLASH_UBOOT_CFG_SIZE) "\0"
|
|
||||||
"f_ubootconfig_end=" MK_STR(IFX_CFG_FLASH_UBOOT_CFG_END_ADDR) "\0"
|
|
||||||
"f_kernel_addr=" MK_STR(IFX_CFG_FLASH_KERNEL_IMAGE_START_ADDR) "\0"
|
|
||||||
"f_kernel_size=" MK_STR(IFX_CFG_FLASH_KERNEL_IMAGE_SIZE) "\0"
|
|
||||||
"f_kernel_end=" MK_STR(IFX_CFG_FLASH_KERNEL_IMAGE_END_ADDR) "\0"
|
|
||||||
"f_rootfs_addr=" MK_STR(IFX_CFG_FLASH_ROOTFS_IMAGE_START_ADDR) "\0"
|
|
||||||
"f_rootfs_size=" MK_STR(IFX_CFG_FLASH_ROOTFS_IMAGE_SIZE) "\0"
|
|
||||||
"f_rootfs_end=" MK_STR(IFX_CFG_FLASH_ROOTFS_IMAGE_END_ADDR) "\0"
|
|
||||||
"f_firmware_addr=" MK_STR(IFX_CFG_FLASH_FIRMWARE_IMAGE_START_ADDR) "\0"
|
|
||||||
"f_firmware_size=" MK_STR(IFX_CFG_FLASH_FIRMWARE_IMAGE_SIZE) "\0"
|
|
||||||
"f_sysconfig_addr=" MK_STR(IFX_CFG_FLASH_SYSTEM_CFG_START_ADDR) "\0"
|
|
||||||
"f_sysconfig_size=" MK_STR(IFX_CFG_FLASH_SYSTEM_CFG_SIZE) "\0"
|
|
||||||
/*
|
|
||||||
"f_fwdiag_addr=" MK_STR(IFX_CFG_FLASH_FIRMWARE_DIAG_START_ADDR) "\0"
|
|
||||||
"f_fwdiag_size=" MK_STR(IFX_CFG_FLASH_FIRMWARE_DIAG_SIZE) "\0"
|
|
||||||
"f_calibration_addr=" MK_STR(IFX_CFG_FLASH_CALIBRATION_CFG_START_ADDR) "\0"
|
|
||||||
"f_calibration_size=" MK_STR(IFX_CFG_FLASH_CALIBRATION_CFG_SIZE) "\0"
|
|
||||||
#if (IFX_CONFIG_FLASH_SIZE == 4) || (IFX_CONFIG_FLASH_SIZE == 8)
|
|
||||||
"f_voip_addr=" MK_STR(IFX_CFG_FLASH_VOIP_CFG_START_ADDR) "\0"
|
|
||||||
"f_voip_size=" MK_STR(IFX_CFG_FLASH_VOIP_CFG_SIZE) "\0"
|
|
||||||
#endif
|
|
||||||
*/
|
|
|
@ -1,622 +0,0 @@
|
||||||
/*
|
|
||||||
LzmaDecode.c
|
|
||||||
LZMA Decoder (optimized for Speed version)
|
|
||||||
|
|
||||||
LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01)
|
|
||||||
http://www.7-zip.org/
|
|
||||||
|
|
||||||
LZMA SDK is licensed under two licenses:
|
|
||||||
1) GNU Lesser General Public License (GNU LGPL)
|
|
||||||
2) Common Public License (CPL)
|
|
||||||
It means that you can select one of these two licenses and
|
|
||||||
follow rules of that license.
|
|
||||||
|
|
||||||
SPECIAL EXCEPTION:
|
|
||||||
Igor Pavlov, as the author of this Code, expressly permits you to
|
|
||||||
statically or dynamically link your Code (or bind by name) to the
|
|
||||||
interfaces of this file without subjecting your linked Code to the
|
|
||||||
terms of the CPL or GNU LGPL. Any modifications or additions
|
|
||||||
to this file, however, are subject to the LGPL or CPL terms.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef CONFIG_LZMA
|
|
||||||
|
|
||||||
#include "LzmaDecode.h"
|
|
||||||
|
|
||||||
#define kNumTopBits 24
|
|
||||||
#define kTopValue ((UInt32)1 << kNumTopBits)
|
|
||||||
|
|
||||||
#define kNumBitModelTotalBits 11
|
|
||||||
#define kBitModelTotal (1 << kNumBitModelTotalBits)
|
|
||||||
#define kNumMoveBits 5
|
|
||||||
|
|
||||||
#define RC_READ_BYTE (*Buffer++)
|
|
||||||
|
|
||||||
#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \
|
|
||||||
{ int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }}
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define RC_TEST { if (Buffer == BufferLim) \
|
|
||||||
{ SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return result; } \
|
|
||||||
BufferLim = Buffer + size; if (size == 0) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return LZMA_RESULT_DATA_ERROR; } }}
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define RC_TEST { if (Buffer == BufferLim) \
|
|
||||||
{ SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) { return result; } \
|
|
||||||
BufferLim = Buffer + size; if (size == 0) { return LZMA_RESULT_DATA_ERROR; } }}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RC_INIT Buffer = BufferLim = 0; RC_INIT2
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define RC_TEST { if (Buffer == BufferLim) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return LZMA_RESULT_DATA_ERROR; } }
|
|
||||||
#else
|
|
||||||
#define RC_TEST { if (Buffer == BufferLim) { return LZMA_RESULT_DATA_ERROR; } }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
|
|
||||||
|
|
||||||
#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
|
|
||||||
#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
|
|
||||||
#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
|
|
||||||
|
|
||||||
#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \
|
|
||||||
{ UpdateBit0(p); mi <<= 1; A0; } else \
|
|
||||||
{ UpdateBit1(p); mi = (mi + mi) + 1; A1; }
|
|
||||||
|
|
||||||
#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;)
|
|
||||||
|
|
||||||
#define RangeDecoderBitTreeDecode(probs, numLevels, res) \
|
|
||||||
{ int i = numLevels; res = 1; \
|
|
||||||
do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \
|
|
||||||
res -= (1 << numLevels); }
|
|
||||||
|
|
||||||
|
|
||||||
#define kNumPosBitsMax 4
|
|
||||||
#define kNumPosStatesMax (1 << kNumPosBitsMax)
|
|
||||||
|
|
||||||
#define kLenNumLowBits 3
|
|
||||||
#define kLenNumLowSymbols (1 << kLenNumLowBits)
|
|
||||||
#define kLenNumMidBits 3
|
|
||||||
#define kLenNumMidSymbols (1 << kLenNumMidBits)
|
|
||||||
#define kLenNumHighBits 8
|
|
||||||
#define kLenNumHighSymbols (1 << kLenNumHighBits)
|
|
||||||
|
|
||||||
#define LenChoice 0
|
|
||||||
#define LenChoice2 (LenChoice + 1)
|
|
||||||
#define LenLow (LenChoice2 + 1)
|
|
||||||
#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
|
|
||||||
#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
|
|
||||||
#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
|
|
||||||
|
|
||||||
|
|
||||||
#define kNumStates 12
|
|
||||||
#define kNumLitStates 7
|
|
||||||
|
|
||||||
#define kStartPosModelIndex 4
|
|
||||||
#define kEndPosModelIndex 14
|
|
||||||
#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
|
|
||||||
|
|
||||||
#define kNumPosSlotBits 6
|
|
||||||
#define kNumLenToPosStates 4
|
|
||||||
|
|
||||||
#define kNumAlignBits 4
|
|
||||||
#define kAlignTableSize (1 << kNumAlignBits)
|
|
||||||
|
|
||||||
#define kMatchMinLen 2
|
|
||||||
|
|
||||||
#define IsMatch 0
|
|
||||||
#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
|
|
||||||
#define IsRepG0 (IsRep + kNumStates)
|
|
||||||
#define IsRepG1 (IsRepG0 + kNumStates)
|
|
||||||
#define IsRepG2 (IsRepG1 + kNumStates)
|
|
||||||
#define IsRep0Long (IsRepG2 + kNumStates)
|
|
||||||
#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
|
|
||||||
#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
|
|
||||||
#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
|
|
||||||
#define LenCoder (Align + kAlignTableSize)
|
|
||||||
#define RepLenCoder (LenCoder + kNumLenProbs)
|
|
||||||
#define Literal (RepLenCoder + kNumLenProbs)
|
|
||||||
|
|
||||||
#if Literal != LZMA_BASE_SIZE
|
|
||||||
StopCompilingDueBUG
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size)
|
|
||||||
{
|
|
||||||
unsigned char prop0;
|
|
||||||
if (size < LZMA_PROPERTIES_SIZE)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
prop0 = propsData[0];
|
|
||||||
if (prop0 >= (9 * 5 * 5))
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5));
|
|
||||||
for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9);
|
|
||||||
propsRes->lc = prop0;
|
|
||||||
/*
|
|
||||||
unsigned char remainder = (unsigned char)(prop0 / 9);
|
|
||||||
propsRes->lc = prop0 % 9;
|
|
||||||
propsRes->pb = remainder / 5;
|
|
||||||
propsRes->lp = remainder % 5;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
propsRes->DictionarySize = 0;
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8);
|
|
||||||
if (propsRes->DictionarySize == 0)
|
|
||||||
propsRes->DictionarySize = 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define kLzmaStreamWasFinishedId (-1)
|
|
||||||
|
|
||||||
int LzmaDecode(CLzmaDecoderState *vs,
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
ILzmaInCallback *InCallback,
|
|
||||||
#else
|
|
||||||
const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
|
|
||||||
#endif
|
|
||||||
unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed)
|
|
||||||
{
|
|
||||||
CProb *p = vs->Probs;
|
|
||||||
SizeT nowPos = 0;
|
|
||||||
Byte previousByte = 0;
|
|
||||||
UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1;
|
|
||||||
UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1;
|
|
||||||
int lc = vs->Properties.lc;
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
|
|
||||||
UInt32 Range = vs->Range;
|
|
||||||
UInt32 Code = vs->Code;
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
const Byte *Buffer = vs->Buffer;
|
|
||||||
const Byte *BufferLim = vs->BufferLim;
|
|
||||||
#else
|
|
||||||
const Byte *Buffer = inStream;
|
|
||||||
const Byte *BufferLim = inStream + inSize;
|
|
||||||
#endif
|
|
||||||
int state = vs->State;
|
|
||||||
UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
|
|
||||||
int len = vs->RemainLen;
|
|
||||||
UInt32 globalPos = vs->GlobalPos;
|
|
||||||
UInt32 distanceLimit = vs->DistanceLimit;
|
|
||||||
|
|
||||||
Byte *dictionary = vs->Dictionary;
|
|
||||||
UInt32 dictionarySize = vs->Properties.DictionarySize;
|
|
||||||
UInt32 dictionaryPos = vs->DictionaryPos;
|
|
||||||
|
|
||||||
Byte tempDictionary[4];
|
|
||||||
|
|
||||||
#ifndef _LZMA_IN_CB
|
|
||||||
*inSizeProcessed = 0;
|
|
||||||
#endif
|
|
||||||
*outSizeProcessed = 0;
|
|
||||||
if (len == kLzmaStreamWasFinishedId)
|
|
||||||
return LZMA_RESULT_OK;
|
|
||||||
|
|
||||||
if (dictionarySize == 0)
|
|
||||||
{
|
|
||||||
dictionary = tempDictionary;
|
|
||||||
dictionarySize = 1;
|
|
||||||
tempDictionary[0] = vs->TempDictionary[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len == kLzmaNeedInitId)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp));
|
|
||||||
UInt32 i;
|
|
||||||
for (i = 0; i < numProbs; i++)
|
|
||||||
p[i] = kBitModelTotal >> 1;
|
|
||||||
rep0 = rep1 = rep2 = rep3 = 1;
|
|
||||||
state = 0;
|
|
||||||
globalPos = 0;
|
|
||||||
distanceLimit = 0;
|
|
||||||
dictionaryPos = 0;
|
|
||||||
dictionary[dictionarySize - 1] = 0;
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
RC_INIT;
|
|
||||||
#else
|
|
||||||
RC_INIT(inStream, inSize);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
while(len != 0 && nowPos < outSize)
|
|
||||||
{
|
|
||||||
UInt32 pos = dictionaryPos - rep0;
|
|
||||||
if (pos >= dictionarySize)
|
|
||||||
pos += dictionarySize;
|
|
||||||
outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
|
|
||||||
if (++dictionaryPos == dictionarySize)
|
|
||||||
dictionaryPos = 0;
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
if (dictionaryPos == 0)
|
|
||||||
previousByte = dictionary[dictionarySize - 1];
|
|
||||||
else
|
|
||||||
previousByte = dictionary[dictionaryPos - 1];
|
|
||||||
|
|
||||||
#else /* if !_LZMA_OUT_READ */
|
|
||||||
|
|
||||||
int state = 0;
|
|
||||||
UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
|
|
||||||
int len = 0;
|
|
||||||
const Byte *Buffer;
|
|
||||||
const Byte *BufferLim;
|
|
||||||
UInt32 Range;
|
|
||||||
UInt32 Code;
|
|
||||||
|
|
||||||
#ifndef _LZMA_IN_CB
|
|
||||||
*inSizeProcessed = 0;
|
|
||||||
#endif
|
|
||||||
*outSizeProcessed = 0;
|
|
||||||
|
|
||||||
{
|
|
||||||
UInt32 i;
|
|
||||||
UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp));
|
|
||||||
for (i = 0; i < numProbs; i++)
|
|
||||||
p[i] = kBitModelTotal >> 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
RC_INIT;
|
|
||||||
#else
|
|
||||||
RC_INIT(inStream, inSize);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _LZMA_OUT_READ */
|
|
||||||
|
|
||||||
while(nowPos < outSize)
|
|
||||||
{
|
|
||||||
CProb *prob;
|
|
||||||
UInt32 bound;
|
|
||||||
int posState = (int)(
|
|
||||||
(nowPos
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
+ globalPos
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
& posStateMask);
|
|
||||||
|
|
||||||
prob = p + IsMatch + (state << kNumPosBitsMax) + posState;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
int symbol = 1;
|
|
||||||
UpdateBit0(prob)
|
|
||||||
prob = p + Literal + (LZMA_LIT_SIZE *
|
|
||||||
(((
|
|
||||||
(nowPos
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
+ globalPos
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
& literalPosMask) << lc) + (previousByte >> (8 - lc))));
|
|
||||||
|
|
||||||
if (state >= kNumLitStates)
|
|
||||||
{
|
|
||||||
int matchByte;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
UInt32 pos = dictionaryPos - rep0;
|
|
||||||
if (pos >= dictionarySize)
|
|
||||||
pos += dictionarySize;
|
|
||||||
matchByte = dictionary[pos];
|
|
||||||
#else
|
|
||||||
matchByte = outStream[nowPos - rep0];
|
|
||||||
#endif
|
|
||||||
do
|
|
||||||
{
|
|
||||||
int bit;
|
|
||||||
CProb *probLit;
|
|
||||||
matchByte <<= 1;
|
|
||||||
bit = (matchByte & 0x100);
|
|
||||||
probLit = prob + 0x100 + bit + symbol;
|
|
||||||
RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break)
|
|
||||||
}
|
|
||||||
while (symbol < 0x100);
|
|
||||||
}
|
|
||||||
while (symbol < 0x100)
|
|
||||||
{
|
|
||||||
CProb *probLit = prob + symbol;
|
|
||||||
RC_GET_BIT(probLit, symbol)
|
|
||||||
}
|
|
||||||
previousByte = (Byte)symbol;
|
|
||||||
|
|
||||||
outStream[nowPos++] = previousByte;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (distanceLimit < dictionarySize)
|
|
||||||
distanceLimit++;
|
|
||||||
|
|
||||||
dictionary[dictionaryPos] = previousByte;
|
|
||||||
if (++dictionaryPos == dictionarySize)
|
|
||||||
dictionaryPos = 0;
|
|
||||||
#endif
|
|
||||||
if (state < 4) state = 0;
|
|
||||||
else if (state < 10) state -= 3;
|
|
||||||
else state -= 6;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
prob = p + IsRep + state;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
UpdateBit0(prob);
|
|
||||||
rep3 = rep2;
|
|
||||||
rep2 = rep1;
|
|
||||||
rep1 = rep0;
|
|
||||||
state = state < kNumLitStates ? 0 : 3;
|
|
||||||
prob = p + LenCoder;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
prob = p + IsRepG0 + state;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
UpdateBit0(prob);
|
|
||||||
prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
UInt32 pos;
|
|
||||||
#endif
|
|
||||||
UpdateBit0(prob);
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (distanceLimit == 0)
|
|
||||||
#else
|
|
||||||
if (nowPos == 0)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
state = state < kNumLitStates ? 9 : 11;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
pos = dictionaryPos - rep0;
|
|
||||||
if (pos >= dictionarySize)
|
|
||||||
pos += dictionarySize;
|
|
||||||
previousByte = dictionary[pos];
|
|
||||||
dictionary[dictionaryPos] = previousByte;
|
|
||||||
if (++dictionaryPos == dictionarySize)
|
|
||||||
dictionaryPos = 0;
|
|
||||||
#else
|
|
||||||
previousByte = outStream[nowPos - rep0];
|
|
||||||
#endif
|
|
||||||
outStream[nowPos++] = previousByte;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (distanceLimit < dictionarySize)
|
|
||||||
distanceLimit++;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UInt32 distance;
|
|
||||||
UpdateBit1(prob);
|
|
||||||
prob = p + IsRepG1 + state;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
UpdateBit0(prob);
|
|
||||||
distance = rep1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
prob = p + IsRepG2 + state;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
UpdateBit0(prob);
|
|
||||||
distance = rep2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
distance = rep3;
|
|
||||||
rep3 = rep2;
|
|
||||||
}
|
|
||||||
rep2 = rep1;
|
|
||||||
}
|
|
||||||
rep1 = rep0;
|
|
||||||
rep0 = distance;
|
|
||||||
}
|
|
||||||
state = state < kNumLitStates ? 8 : 11;
|
|
||||||
prob = p + RepLenCoder;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
int numBits, offset;
|
|
||||||
CProb *probLen = prob + LenChoice;
|
|
||||||
IfBit0(probLen)
|
|
||||||
{
|
|
||||||
UpdateBit0(probLen);
|
|
||||||
probLen = prob + LenLow + (posState << kLenNumLowBits);
|
|
||||||
offset = 0;
|
|
||||||
numBits = kLenNumLowBits;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(probLen);
|
|
||||||
probLen = prob + LenChoice2;
|
|
||||||
IfBit0(probLen)
|
|
||||||
{
|
|
||||||
UpdateBit0(probLen);
|
|
||||||
probLen = prob + LenMid + (posState << kLenNumMidBits);
|
|
||||||
offset = kLenNumLowSymbols;
|
|
||||||
numBits = kLenNumMidBits;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(probLen);
|
|
||||||
probLen = prob + LenHigh;
|
|
||||||
offset = kLenNumLowSymbols + kLenNumMidSymbols;
|
|
||||||
numBits = kLenNumHighBits;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RangeDecoderBitTreeDecode(probLen, numBits, len);
|
|
||||||
len += offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state < 4)
|
|
||||||
{
|
|
||||||
int posSlot;
|
|
||||||
state += kNumLitStates;
|
|
||||||
prob = p + PosSlot +
|
|
||||||
((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
|
|
||||||
kNumPosSlotBits);
|
|
||||||
RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot);
|
|
||||||
if (posSlot >= kStartPosModelIndex)
|
|
||||||
{
|
|
||||||
int numDirectBits = ((posSlot >> 1) - 1);
|
|
||||||
rep0 = (2 | ((UInt32)posSlot & 1));
|
|
||||||
if (posSlot < kEndPosModelIndex)
|
|
||||||
{
|
|
||||||
rep0 <<= numDirectBits;
|
|
||||||
prob = p + SpecPos + rep0 - posSlot - 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
numDirectBits -= kNumAlignBits;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
RC_NORMALIZE
|
|
||||||
Range >>= 1;
|
|
||||||
rep0 <<= 1;
|
|
||||||
if (Code >= Range)
|
|
||||||
{
|
|
||||||
Code -= Range;
|
|
||||||
rep0 |= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (--numDirectBits != 0);
|
|
||||||
prob = p + Align;
|
|
||||||
rep0 <<= kNumAlignBits;
|
|
||||||
numDirectBits = kNumAlignBits;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
int i = 1;
|
|
||||||
int mi = 1;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
CProb *prob3 = prob + mi;
|
|
||||||
RC_GET_BIT2(prob3, mi, ; , rep0 |= i);
|
|
||||||
i <<= 1;
|
|
||||||
}
|
|
||||||
while(--numDirectBits != 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
rep0 = posSlot;
|
|
||||||
if (++rep0 == (UInt32)(0))
|
|
||||||
{
|
|
||||||
/* it's for stream version */
|
|
||||||
len = kLzmaStreamWasFinishedId;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
len += kMatchMinLen;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (rep0 > distanceLimit)
|
|
||||||
#else
|
|
||||||
if (rep0 > nowPos)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (dictionarySize - distanceLimit > (UInt32)len)
|
|
||||||
distanceLimit += len;
|
|
||||||
else
|
|
||||||
distanceLimit = dictionarySize;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
UInt32 pos = dictionaryPos - rep0;
|
|
||||||
if (pos >= dictionarySize)
|
|
||||||
pos += dictionarySize;
|
|
||||||
previousByte = dictionary[pos];
|
|
||||||
dictionary[dictionaryPos] = previousByte;
|
|
||||||
if (++dictionaryPos == dictionarySize)
|
|
||||||
dictionaryPos = 0;
|
|
||||||
#else
|
|
||||||
previousByte = outStream[nowPos - rep0];
|
|
||||||
#endif
|
|
||||||
len--;
|
|
||||||
outStream[nowPos++] = previousByte;
|
|
||||||
}
|
|
||||||
while(len != 0 && nowPos < outSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RC_NORMALIZE;
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
vs->Range = Range;
|
|
||||||
vs->Code = Code;
|
|
||||||
vs->DictionaryPos = dictionaryPos;
|
|
||||||
vs->GlobalPos = globalPos + (UInt32)nowPos;
|
|
||||||
vs->DistanceLimit = distanceLimit;
|
|
||||||
vs->Reps[0] = rep0;
|
|
||||||
vs->Reps[1] = rep1;
|
|
||||||
vs->Reps[2] = rep2;
|
|
||||||
vs->Reps[3] = rep3;
|
|
||||||
vs->State = state;
|
|
||||||
vs->RemainLen = len;
|
|
||||||
vs->TempDictionary[0] = tempDictionary[0];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
vs->Buffer = Buffer;
|
|
||||||
vs->BufferLim = BufferLim;
|
|
||||||
#else
|
|
||||||
*inSizeProcessed = (SizeT)(Buffer - inStream);
|
|
||||||
#endif
|
|
||||||
*outSizeProcessed = nowPos;
|
|
||||||
return LZMA_RESULT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_LZMA */
|
|
|
@ -1,223 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
**
|
|
||||||
** FILE NAME : LzmaWrapper.c
|
|
||||||
** PROJECT : bootloader
|
|
||||||
** MODULES : U-boot
|
|
||||||
**
|
|
||||||
** DATE : 2 Nov 2006
|
|
||||||
** AUTHOR : Lin Mars
|
|
||||||
** DESCRIPTION : LZMA decoder support for U-boot 1.1.5
|
|
||||||
** COPYRIGHT : Copyright (c) 2006
|
|
||||||
** Infineon Technologies AG
|
|
||||||
** Am Campeon 1-12, 85579 Neubiberg, Germany
|
|
||||||
**
|
|
||||||
** 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.
|
|
||||||
**
|
|
||||||
** HISTORY
|
|
||||||
** $Date $Author $Comment
|
|
||||||
** 2 Nov 2006 Lin Mars init version which derived from LzmaTest.c from
|
|
||||||
** LZMA v4.43 SDK
|
|
||||||
*******************************************************************************/
|
|
||||||
#define LZMA_NO_STDIO
|
|
||||||
#ifndef LZMA_NO_STDIO
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <common.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
#include <linux/ctype.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_LZMA
|
|
||||||
|
|
||||||
#include "LzmaDecode.h"
|
|
||||||
#include "LzmaWrapper.h"
|
|
||||||
|
|
||||||
static const char *kCantReadMessage = "Can not read from source buffer";
|
|
||||||
static const char *kCantAllocateMessage = "Not enough buffer for decompression";
|
|
||||||
|
|
||||||
static size_t rpos=0, dpos=0;
|
|
||||||
|
|
||||||
static int MyReadFileAndCheck(unsigned char *src, void *dest, size_t size)
|
|
||||||
{
|
|
||||||
if (size == 0)
|
|
||||||
return 0;
|
|
||||||
memcpy(dest, src + rpos, size);
|
|
||||||
rpos += size;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_len)
|
|
||||||
{
|
|
||||||
/* We use two 32-bit integers to construct 64-bit integer for file size.
|
|
||||||
You can remove outSizeHigh, if you don't need >= 4GB supporting,
|
|
||||||
or you can use UInt64 outSize, if your compiler supports 64-bit integers*/
|
|
||||||
UInt32 outSize = 0;
|
|
||||||
UInt32 outSizeHigh = 0;
|
|
||||||
SizeT outSizeFull;
|
|
||||||
unsigned char *outStream;
|
|
||||||
|
|
||||||
int waitEOS = 1;
|
|
||||||
/* waitEOS = 1, if there is no uncompressed size in headers,
|
|
||||||
so decoder will wait EOS (End of Stream Marker) in compressed stream */
|
|
||||||
|
|
||||||
SizeT compressedSize;
|
|
||||||
unsigned char *inStream;
|
|
||||||
|
|
||||||
CLzmaDecoderState state; /* it's about 24-80 bytes structure, if int is 32-bit */
|
|
||||||
unsigned char properties[LZMA_PROPERTIES_SIZE];
|
|
||||||
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (sizeof(UInt32) < 4)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("LZMA decoder needs correct UInt32\n");
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
long length=s_len;
|
|
||||||
if ((long)(SizeT)length != length)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("Too big compressed stream\n");
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
compressedSize = (SizeT)(length - (LZMA_PROPERTIES_SIZE + 8));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read LZMA properties for compressed stream */
|
|
||||||
|
|
||||||
if (!MyReadFileAndCheck(source, properties, sizeof(properties)))
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("%s\n", kCantReadMessage);
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read uncompressed size */
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
unsigned char b;
|
|
||||||
if (!MyReadFileAndCheck(source, &b, 1))
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("%s\n", kCantReadMessage);
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
if (b != 0xFF)
|
|
||||||
waitEOS = 0;
|
|
||||||
if (i < 4)
|
|
||||||
outSize += (UInt32)(b) << (i * 8);
|
|
||||||
else
|
|
||||||
outSizeHigh += (UInt32)(b) << ((i - 4) * 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (waitEOS)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("Stream with EOS marker is not supported");
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
outSizeFull = (SizeT)outSize;
|
|
||||||
if (sizeof(SizeT) >= 8)
|
|
||||||
outSizeFull |= (((SizeT)outSizeHigh << 16) << 16);
|
|
||||||
else if (outSizeHigh != 0 || (UInt32)(SizeT)outSize != outSize)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("Too big uncompressed stream");
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decode LZMA properties and allocate memory */
|
|
||||||
if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("Incorrect stream properties");
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
|
|
||||||
|
|
||||||
if (outSizeFull == 0)
|
|
||||||
outStream = 0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (outSizeFull > d_len)
|
|
||||||
outStream = 0;
|
|
||||||
else
|
|
||||||
outStream = dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (compressedSize == 0)
|
|
||||||
inStream = 0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((compressedSize+rpos) > s_len )
|
|
||||||
inStream = 0;
|
|
||||||
else
|
|
||||||
inStream = source + rpos;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state.Probs == 0
|
|
||||||
|| (outStream == 0 && outSizeFull != 0)
|
|
||||||
|| (inStream == 0 && compressedSize != 0)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
free(state.Probs);
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("%s\n", kCantAllocateMessage);
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decompress */
|
|
||||||
{
|
|
||||||
SizeT inProcessed;
|
|
||||||
SizeT outProcessed;
|
|
||||||
res = LzmaDecode(&state,
|
|
||||||
inStream, compressedSize, &inProcessed,
|
|
||||||
outStream, outSizeFull, &outProcessed);
|
|
||||||
if (res != 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("\nDecoding error = %d\n", res);
|
|
||||||
#endif
|
|
||||||
res = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*d_len = outProcessed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(state.Probs);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_LZMA */
|
|
|
@ -23,30 +23,38 @@
|
||||||
|
|
||||||
include $(TOPDIR)/config.mk
|
include $(TOPDIR)/config.mk
|
||||||
|
|
||||||
LIB = libbootstrap.a
|
LIB := $(obj)libbootstrap.a
|
||||||
|
|
||||||
#OBJS_PRINTF_ENABLED = bootstrap_board.o time.o console.o LzmaWrapper.o LzmaDecode.o crc32.o ctype.o display_options.o string.o vsprintf.o lists.o devices.o
|
OBJS := board.o LzmaDecode.o string.o crc32.o LzmaWrapper.o
|
||||||
#OBJS_PRINTF_DISBALED = bootstrap_board.o LzmaDecode.o string.o crc32.o LzmaWrapper.o
|
CFLAGS += -DCFG_BOOTSTRAP_CODE
|
||||||
|
|
||||||
OBJS = bootstrap_board_$(BOARDDIR).o LzmaDecode.o string.o crc32.o LzmaWrapper.o
|
|
||||||
|
|
||||||
ifeq ($(BOOTSTRAP_PRINTF_STATUS), BOOTSTRAP_PRINTF_ENABLED)
|
ifeq ($(BOOTSTRAP_PRINTF_STATUS), BOOTSTRAP_PRINTF_ENABLED)
|
||||||
#overwrite objs
|
OBJS += time.o console.o ctype.o display_options.o vsprintf.o lists.o devices.o
|
||||||
OBJS = bootstrap_board_$(BOARDDIR).o time.o console.o LzmaWrapper.o LzmaDecode.o crc32.o ctype.o display_options.o string.o vsprintf.o lists.o devices.o
|
|
||||||
CFLAGS += -DDEBUG_ENABLE_BOOTSTRAP_PRINTF
|
CFLAGS += -DDEBUG_ENABLE_BOOTSTRAP_PRINTF
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: .depend $(LIB)
|
SRCS := $(OBJS:.o=.c)
|
||||||
|
OBJS := $(addprefix $(obj),$(OBJS))
|
||||||
|
|
||||||
$(LIB): $(OBJS)
|
all: $(SRCS) $(obj).depend $(LIB)
|
||||||
$(AR) crv $@ $(OBJS)
|
|
||||||
|
$(LIB): $(obj).depend $(OBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||||
|
|
||||||
|
vpath %.c ../common ../lib_generic ../lib_$(CPU)
|
||||||
|
|
||||||
|
board_bootstrap.c:
|
||||||
|
ln -s ../lib_$(CPU)/board.c $@
|
||||||
|
|
||||||
|
#LzmaDecode.c LzmaWrapper.c string.c crc32.c:
|
||||||
|
# ln -s ../lib_generic/$@ $@
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
|
||||||
.depend: Makefile $(OBJS:.o=.c)
|
#include $(SRCTREE)/rules.mk
|
||||||
echo "make libbootstrap.a with HEAD_SIZE $(HEAD_SIZE)"
|
$(obj).depend: $(SRCS)
|
||||||
$(CC) -M $(CFLAGS) $(OBJS:.o=.c) > $@
|
$(CC) -M $(CFLAGS) $^ > $@
|
||||||
|
|
||||||
sinclude .depend
|
sinclude $(obj).depend
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
|
|
@ -1,501 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2003
|
|
||||||
* 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 <common.h>
|
|
||||||
#include <command.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <devices.h>
|
|
||||||
#include <version.h>
|
|
||||||
#include <net.h>
|
|
||||||
#include <environment.h>
|
|
||||||
#ifdef CONFIG_DANUBE
|
|
||||||
#include <asm-mips/danube.h>
|
|
||||||
#include <configs/danube.h>
|
|
||||||
#endif
|
|
||||||
#include "LzmaWrapper.h"
|
|
||||||
|
|
||||||
//#define DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
|
||||||
|
|
||||||
#if ( ((CFG_ENV_ADDR+CFG_ENV_SIZE) < BOOTSTRAP_CFG_MONITOR_BASE) || \
|
|
||||||
(CFG_ENV_ADDR >= (BOOTSTRAP_CFG_MONITOR_BASE + CFG_MONITOR_LEN)) ) || \
|
|
||||||
defined(CFG_ENV_IS_IN_NVRAM)
|
|
||||||
#define TOTAL_MALLOC_LEN (CFG_MALLOC_LEN + CFG_ENV_SIZE)
|
|
||||||
#else
|
|
||||||
#define TOTAL_MALLOC_LEN CFG_MALLOC_LEN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef DEBUG
|
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
|
|
||||||
extern unsigned long nand_init(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_SERIAL_FLASH
|
|
||||||
extern int serial_flash_init (void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int timer_init(void);
|
|
||||||
|
|
||||||
extern int incaip_set_cpuclk(void);
|
|
||||||
|
|
||||||
extern ulong uboot_end_data_bootstrap;
|
|
||||||
extern ulong uboot_end_bootstrap;
|
|
||||||
|
|
||||||
ulong monitor_flash_len;
|
|
||||||
|
|
||||||
const char version_string[] =
|
|
||||||
U_BOOT_VERSION" (" __DATE__ " - " __TIME__ ")";
|
|
||||||
|
|
||||||
static char *failed = "*** failed ***\n";
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Begin and End of memory area for malloc(), and current "brk"
|
|
||||||
*/
|
|
||||||
static ulong mem_malloc_start;
|
|
||||||
static ulong mem_malloc_end;
|
|
||||||
static ulong mem_malloc_brk;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The Malloc area is immediately below the monitor copy in DRAM
|
|
||||||
*/
|
|
||||||
static void mem_malloc_init (ulong dest_addr)
|
|
||||||
{
|
|
||||||
// ulong dest_addr = BOOTSTRAP_CFG_MONITOR_BASE + gd->reloc_off;
|
|
||||||
|
|
||||||
mem_malloc_end = dest_addr;
|
|
||||||
mem_malloc_start = dest_addr - TOTAL_MALLOC_LEN;
|
|
||||||
mem_malloc_brk = mem_malloc_start;
|
|
||||||
|
|
||||||
memset ((void *) mem_malloc_start,
|
|
||||||
0,
|
|
||||||
mem_malloc_end - mem_malloc_start);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *malloc(unsigned int size)
|
|
||||||
{
|
|
||||||
if(size < (mem_malloc_end - mem_malloc_start))
|
|
||||||
{
|
|
||||||
mem_malloc_start += size;
|
|
||||||
return (void *)(mem_malloc_start - size);
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *realloc(void *src,unsigned int size)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free(void *src)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void *sbrk (ptrdiff_t increment)
|
|
||||||
{
|
|
||||||
ulong old = mem_malloc_brk;
|
|
||||||
ulong new = old + increment;
|
|
||||||
|
|
||||||
if ((new < mem_malloc_start) || (new > mem_malloc_end)) {
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
mem_malloc_brk = new;
|
|
||||||
return ((void *) old);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int init_func_ram (void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_BOARD_TYPES
|
|
||||||
int board_type = gd->board_type;
|
|
||||||
#else
|
|
||||||
int board_type = 0; /* use dummy arg */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
puts ("DRAM: ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((gd->ram_size = initdram (board_type)) > 0) {
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
print_size (gd->ram_size, "\n");
|
|
||||||
#endif
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
puts (failed);
|
|
||||||
#endif
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int display_banner(void)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf ("\n\n%s\n\n", version_string);
|
|
||||||
#endif
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int init_baudrate (void)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
char tmp[64]; /* long enough for environment variables */
|
|
||||||
int i = getenv_r ("baudrate", tmp, sizeof (tmp));
|
|
||||||
|
|
||||||
gd->baudrate = (i > 0)
|
|
||||||
? (int) simple_strtoul (tmp, NULL, 10)
|
|
||||||
: CONFIG_BAUDRATE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gd->baudrate = CONFIG_BAUDRATE;
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
#ifdef CONFIG_DANUBE
|
|
||||||
static void init_led(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
*(unsigned long *)0xBE100B18 |= 0x70;
|
|
||||||
*(unsigned long *)0xBE100B1C |= 0x70;
|
|
||||||
*(unsigned long *)0xBE100B20 &= ~0x70;
|
|
||||||
*(unsigned long *)0xBE100B24 |= 0x70;
|
|
||||||
#ifdef USE_REFERENCE_BOARD
|
|
||||||
|
|
||||||
*DANUBE_LED_CON1 = 0x00000003;
|
|
||||||
*DANUBE_LED_CPU0 = 0x0000010;
|
|
||||||
*DANUBE_LED_CPU1 = 0x00000000;
|
|
||||||
*DANUBE_LED_AR = 0x00000000;
|
|
||||||
*DANUBE_LED_CON0 = 0x84000000;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
*DANUBE_LED_CON1 = 0x00000007;
|
|
||||||
*DANUBE_LED_CPU0 = 0x00001000;
|
|
||||||
*DANUBE_LED_CPU1 = 0x00000000;
|
|
||||||
*DANUBE_LED_AR = 0x00000000;
|
|
||||||
*DANUBE_LED_CON0 = 0x84000000;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Breath some life into the board...
|
|
||||||
*
|
|
||||||
* The first part of initialization is running from Flash memory;
|
|
||||||
* its main purpose is to initialize the RAM so that we
|
|
||||||
* can relocate the monitor code to RAM.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* All attempts to come up with a "common" initialization sequence
|
|
||||||
* that works for all boards and architectures failed: some of the
|
|
||||||
* requirements are just _too_ different. To get rid of the resulting
|
|
||||||
* mess of board dependend #ifdef'ed code we now make the whole
|
|
||||||
* initialization sequence configurable to the user.
|
|
||||||
*
|
|
||||||
* The requirements for any new initalization function is simple: it
|
|
||||||
* receives a pointer to the "global data" structure as it's only
|
|
||||||
* argument, and returns an integer return code, where 0 means
|
|
||||||
* "continue" and != 0 means "fatal error, hang the system".
|
|
||||||
*/
|
|
||||||
typedef int (init_fnc_t) (void);
|
|
||||||
|
|
||||||
init_fnc_t *init_sequence[] = {
|
|
||||||
//timer_init,
|
|
||||||
//env_init, /* initialize environment */
|
|
||||||
#ifdef CONFIG_INCA_IP
|
|
||||||
incaip_set_cpuclk, /* set cpu clock according to environment variable */
|
|
||||||
#endif
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
init_baudrate, /* initialze baudrate settings */
|
|
||||||
serial_init, /* serial communications setup */
|
|
||||||
console_init_f,
|
|
||||||
display_banner, /* say that we are here */
|
|
||||||
#endif
|
|
||||||
init_func_ram,
|
|
||||||
//checkboard,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void bootstrap_board_init_f(ulong bootflag)
|
|
||||||
{
|
|
||||||
gd_t gd_data, *id;
|
|
||||||
bd_t *bd;
|
|
||||||
init_fnc_t **init_fnc_ptr;
|
|
||||||
ulong addr, addr_sp, len = (ulong)&uboot_end_bootstrap - BOOTSTRAP_CFG_MONITOR_BASE;
|
|
||||||
ulong *s;
|
|
||||||
ulong lzmaImageaddr = 0;
|
|
||||||
#ifdef CONFIG_PURPLE
|
|
||||||
void copy_code (ulong);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Pointer is writable since we allocated a register for it.
|
|
||||||
*/
|
|
||||||
gd = &gd_data;
|
|
||||||
/* compiler optimization barrier needed for GCC >= 3.4 */
|
|
||||||
__asm__ __volatile__("": : :"memory");
|
|
||||||
|
|
||||||
memset ((void *)gd, 0, sizeof (gd_t));
|
|
||||||
|
|
||||||
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
|
|
||||||
if ((*init_fnc_ptr)() != 0) {
|
|
||||||
hang ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now that we have DRAM mapped and working, we can
|
|
||||||
* relocate the code and continue running from DRAM.
|
|
||||||
*/
|
|
||||||
addr = CFG_SDRAM_BASE + gd->ram_size;
|
|
||||||
|
|
||||||
/* We can reserve some RAM "on top" here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* round down to next 4 kB limit.
|
|
||||||
*/
|
|
||||||
addr &= ~(4096 - 1);
|
|
||||||
debug ("Top of RAM usable for U-Boot at: %08lx\n", addr);
|
|
||||||
|
|
||||||
/* Reserve memory for U-Boot code, data & bss
|
|
||||||
* round down to next 16 kB limit
|
|
||||||
*/
|
|
||||||
addr -= len;
|
|
||||||
addr &= ~(16 * 1024 - 1);
|
|
||||||
|
|
||||||
debug ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
|
|
||||||
|
|
||||||
/* Reserve memory for malloc() arena.
|
|
||||||
*/
|
|
||||||
addr_sp = addr - TOTAL_MALLOC_LEN;
|
|
||||||
debug ("Reserving %dk for malloc() at: %08lx\n",
|
|
||||||
TOTAL_MALLOC_LEN >> 10, addr_sp);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (permanently) allocate a Board Info struct
|
|
||||||
* and a permanent copy of the "global" data
|
|
||||||
*/
|
|
||||||
addr_sp -= sizeof(bd_t);
|
|
||||||
bd = (bd_t *)addr_sp;
|
|
||||||
gd->bd = bd;
|
|
||||||
debug ("Reserving %d Bytes for Board Info at: %08lx\n",
|
|
||||||
sizeof(bd_t), addr_sp);
|
|
||||||
|
|
||||||
addr_sp -= sizeof(gd_t);
|
|
||||||
id = (gd_t *)addr_sp;
|
|
||||||
debug ("Reserving %d Bytes for Global Data at: %08lx\n",
|
|
||||||
sizeof (gd_t), addr_sp);
|
|
||||||
|
|
||||||
/* Reserve memory for boot params.
|
|
||||||
*/
|
|
||||||
addr_sp -= CFG_BOOTPARAMS_LEN;
|
|
||||||
bd->bi_boot_params = addr_sp;
|
|
||||||
debug ("Reserving %dk for boot params() at: %08lx\n",
|
|
||||||
CFG_BOOTPARAMS_LEN >> 10, addr_sp);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finally, we set up a new (bigger) stack.
|
|
||||||
*
|
|
||||||
* Leave some safety gap for SP, force alignment on 16 byte boundary
|
|
||||||
* Clear initial stack frame
|
|
||||||
*/
|
|
||||||
addr_sp -= 16;
|
|
||||||
addr_sp &= ~0xF;
|
|
||||||
s = (ulong *)addr_sp;
|
|
||||||
*s-- = 0;
|
|
||||||
*s-- = 0;
|
|
||||||
addr_sp = (ulong)s;
|
|
||||||
debug ("Stack Pointer at: %08lx\n", addr_sp);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Save local variables to board info struct
|
|
||||||
*/
|
|
||||||
bd->bi_memstart = CFG_SDRAM_BASE; /* start of DRAM memory */
|
|
||||||
bd->bi_memsize = gd->ram_size; /* size of DRAM memory in bytes */
|
|
||||||
bd->bi_baudrate = gd->baudrate; /* Console Baudrate */
|
|
||||||
|
|
||||||
memcpy (id, (void *)gd, sizeof (gd_t));
|
|
||||||
|
|
||||||
/* On the purple board we copy the code in a special way
|
|
||||||
* in order to solve flash problems
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_PURPLE
|
|
||||||
copy_code(addr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
lzmaImageaddr = (ulong)&uboot_end_data_bootstrap;
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf ("\n relocating to address %08x ", addr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bootstrap_relocate_code (addr_sp, id, addr);
|
|
||||||
|
|
||||||
/* NOTREACHED - relocate_code() does not return */
|
|
||||||
}
|
|
||||||
/************************************************************************
|
|
||||||
*
|
|
||||||
* This is the next part if the initialization sequence: we are now
|
|
||||||
* running from RAM and have a "normal" C environment, i. e. global
|
|
||||||
* data can be written, BSS has been cleared, the stack size in not
|
|
||||||
* that critical any more, etc.
|
|
||||||
*
|
|
||||||
************************************************************************
|
|
||||||
*/
|
|
||||||
#define CONFIG_LZMA
|
|
||||||
|
|
||||||
void bootstrap_board_init_r (gd_t *id, ulong dest_addr)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
ulong addr;
|
|
||||||
ulong data, len, checksum;
|
|
||||||
ulong *len_ptr;
|
|
||||||
image_header_t header;
|
|
||||||
image_header_t *hdr = &header;
|
|
||||||
unsigned int destLen;
|
|
||||||
int (*fn)();
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* initialize malloc() area */
|
|
||||||
mem_malloc_init(dest_addr);
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf("\n Compressed Image at %08x \n ", (BOOTSTRAP_CFG_MONITOR_BASE + ((ulong)&uboot_end_data_bootstrap - dest_addr)));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
addr = (char *)(BOOTSTRAP_CFG_MONITOR_BASE + ((ulong)&uboot_end_data_bootstrap - dest_addr));
|
|
||||||
memmove (&header, (char *)addr, sizeof(image_header_t));
|
|
||||||
|
|
||||||
if (ntohl(hdr->ih_magic) != IH_MAGIC) {
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf ("Bad Magic Number at address 0x%08lx\n",addr);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = (ulong)&header;
|
|
||||||
len = sizeof(image_header_t);
|
|
||||||
|
|
||||||
checksum = ntohl(hdr->ih_hcrc);
|
|
||||||
hdr->ih_hcrc = 0;
|
|
||||||
if (crc32 (0, (char *)data, len) != checksum) {
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf ("Bad Header Checksum\n");
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = addr + sizeof(image_header_t);
|
|
||||||
len = ntohl(hdr->ih_size);
|
|
||||||
|
|
||||||
len_ptr = (ulong *)data;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf ("Disabling all the interrupts\n");
|
|
||||||
#endif
|
|
||||||
disable_interrupts();
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf (" Uncompressing UBoot Image ... \n" );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we've got less than 4 MB of malloc() space,
|
|
||||||
* use slower decompression algorithm which requires
|
|
||||||
* at most 2300 KB of memory.
|
|
||||||
*/
|
|
||||||
destLen = 0x0;
|
|
||||||
|
|
||||||
#ifdef CONFIG_BZIP2
|
|
||||||
i = BZ2_bzBuffToBuffDecompress ((char*)ntohl(hdr->ih_load),
|
|
||||||
0x400000, (char *)data, len,
|
|
||||||
CFG_MALLOC_LEN < (4096 * 1024), 0);
|
|
||||||
if (i != BZ_OK) {
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_BZIP2 */
|
|
||||||
|
|
||||||
#ifdef CONFIG_MICROBZIP2
|
|
||||||
i = micro_bzBuffToBuffDecompress ((char*)ntohl(hdr->ih_load),
|
|
||||||
&destLen, (char *)data, len,
|
|
||||||
CFG_MALLOC_LEN < (4096 * 1024), 0);
|
|
||||||
if (i != RETVAL_OK) {
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf ("MICRO_BUNZIP2 ERROR %d - must RESET board to recover\n", i);
|
|
||||||
#endif
|
|
||||||
//do_reset (cmdtp, flag, argc, argv);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_LZMA
|
|
||||||
#if 0
|
|
||||||
i = lzmaBuffToBuffDecompress ((char*)ntohl(hdr->ih_load),
|
|
||||||
&destLen, (char *)data, len);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
i = lzma_inflate ((unsigned char *)data, len, (unsigned char*)ntohl(hdr->ih_load), &destLen);
|
|
||||||
if (i != LZMA_RESULT_OK) {
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf ("LZMA ERROR %d - must RESET board to recover\n", i);
|
|
||||||
#endif
|
|
||||||
//do_reset (cmdtp, flag, argc, argv);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
printf (" Uncompression completed successfully with destLen %d\n ",destLen );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fn = ntohl(hdr->ih_load);
|
|
||||||
|
|
||||||
(*fn)();
|
|
||||||
|
|
||||||
hang ();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void hang (void)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLE_BOOTSTRAP_PRINTF
|
|
||||||
puts ("### ERROR ### Please RESET the board ###\n");
|
|
||||||
#endif
|
|
||||||
for (;;);
|
|
||||||
}
|
|
|
@ -1,573 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2000
|
|
||||||
* Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
|
|
||||||
*
|
|
||||||
* 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 <common.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <console.h>
|
|
||||||
#include <exports.h>
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
|
||||||
|
|
||||||
#ifdef CONFIG_AMIGAONEG3SE
|
|
||||||
int console_changed = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CFG_CONSOLE_IS_IN_ENV
|
|
||||||
/*
|
|
||||||
* if overwrite_console returns 1, the stdin, stderr and stdout
|
|
||||||
* are switched to the serial port, else the settings in the
|
|
||||||
* environment are used
|
|
||||||
*/
|
|
||||||
#ifdef CFG_CONSOLE_OVERWRITE_ROUTINE
|
|
||||||
extern int overwrite_console (void);
|
|
||||||
#define OVERWRITE_CONSOLE overwrite_console ()
|
|
||||||
#else
|
|
||||||
#define OVERWRITE_CONSOLE 0
|
|
||||||
#endif /* CFG_CONSOLE_OVERWRITE_ROUTINE */
|
|
||||||
|
|
||||||
#endif /* CFG_CONSOLE_IS_IN_ENV */
|
|
||||||
|
|
||||||
static int console_setfile (int file, device_t * dev)
|
|
||||||
{
|
|
||||||
int error = 0;
|
|
||||||
|
|
||||||
if (dev == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
switch (file) {
|
|
||||||
case stdin:
|
|
||||||
case stdout:
|
|
||||||
case stderr:
|
|
||||||
/* Start new device */
|
|
||||||
if (dev->start) {
|
|
||||||
error = dev->start ();
|
|
||||||
/* If it's not started dont use it */
|
|
||||||
if (error < 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assign the new device (leaving the existing one started) */
|
|
||||||
stdio_devices[file] = dev;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Update monitor functions
|
|
||||||
* (to use the console stuff by other applications)
|
|
||||||
*/
|
|
||||||
switch (file) {
|
|
||||||
case stdin:
|
|
||||||
gd->jt[XF_getc] = dev->getc;
|
|
||||||
gd->jt[XF_tstc] = dev->tstc;
|
|
||||||
break;
|
|
||||||
case stdout:
|
|
||||||
gd->jt[XF_putc] = dev->putc;
|
|
||||||
gd->jt[XF_puts] = dev->puts;
|
|
||||||
gd->jt[XF_printf] = printf;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: /* Invalid file ID */
|
|
||||||
error = -1;
|
|
||||||
}
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** U-Boot INITIAL CONSOLE-NOT COMPATIBLE FUNCTIONS *************************/
|
|
||||||
|
|
||||||
void serial_printf (const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
uint i;
|
|
||||||
char printbuffer[CFG_PBSIZE];
|
|
||||||
|
|
||||||
va_start (args, fmt);
|
|
||||||
|
|
||||||
/* For this to work, printbuffer must be larger than
|
|
||||||
* anything we ever want to print.
|
|
||||||
*/
|
|
||||||
i = vsprintf (printbuffer, fmt, args);
|
|
||||||
va_end (args);
|
|
||||||
|
|
||||||
serial_puts (printbuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
int fgetc (int file)
|
|
||||||
{
|
|
||||||
if (file < MAX_FILES)
|
|
||||||
return stdio_devices[file]->getc ();
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ftstc (int file)
|
|
||||||
{
|
|
||||||
if (file < MAX_FILES)
|
|
||||||
return stdio_devices[file]->tstc ();
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fputc (int file, const char c)
|
|
||||||
{
|
|
||||||
if (file < MAX_FILES)
|
|
||||||
stdio_devices[file]->putc (c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fputs (int file, const char *s)
|
|
||||||
{
|
|
||||||
if (file < MAX_FILES)
|
|
||||||
stdio_devices[file]->puts (s);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fprintf (int file, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
uint i;
|
|
||||||
char printbuffer[CFG_PBSIZE];
|
|
||||||
|
|
||||||
va_start (args, fmt);
|
|
||||||
|
|
||||||
/* For this to work, printbuffer must be larger than
|
|
||||||
* anything we ever want to print.
|
|
||||||
*/
|
|
||||||
i = vsprintf (printbuffer, fmt, args);
|
|
||||||
va_end (args);
|
|
||||||
|
|
||||||
/* Send to desired file */
|
|
||||||
fputs (file, printbuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** U-Boot INITIAL CONSOLE-COMPATIBLE FUNCTION *****************************/
|
|
||||||
|
|
||||||
int getc (void)
|
|
||||||
{
|
|
||||||
if (gd->flags & GD_FLG_DEVINIT) {
|
|
||||||
/* Get from the standard input */
|
|
||||||
return fgetc (stdin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send directly to the handler */
|
|
||||||
return serial_getc ();
|
|
||||||
}
|
|
||||||
|
|
||||||
int tstc (void)
|
|
||||||
{
|
|
||||||
if (gd->flags & GD_FLG_DEVINIT) {
|
|
||||||
/* Test the standard input */
|
|
||||||
return ftstc (stdin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send directly to the handler */
|
|
||||||
return serial_tstc ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void putc (const char c)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_SILENT_CONSOLE
|
|
||||||
if (gd->flags & GD_FLG_SILENT)
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (gd->flags & GD_FLG_DEVINIT) {
|
|
||||||
/* Send to the standard output */
|
|
||||||
fputc (stdout, c);
|
|
||||||
} else {
|
|
||||||
/* Send directly to the handler */
|
|
||||||
serial_putc (c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void puts (const char *s)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_SILENT_CONSOLE
|
|
||||||
if (gd->flags & GD_FLG_SILENT)
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (gd->flags & GD_FLG_DEVINIT) {
|
|
||||||
/* Send to the standard output */
|
|
||||||
fputs (stdout, s);
|
|
||||||
} else {
|
|
||||||
/* Send directly to the handler */
|
|
||||||
serial_puts (s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void printf (const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
uint i;
|
|
||||||
char printbuffer[CFG_PBSIZE];
|
|
||||||
|
|
||||||
va_start (args, fmt);
|
|
||||||
|
|
||||||
/* For this to work, printbuffer must be larger than
|
|
||||||
* anything we ever want to print.
|
|
||||||
*/
|
|
||||||
i = vsprintf (printbuffer, fmt, args);
|
|
||||||
va_end (args);
|
|
||||||
|
|
||||||
/* Print the string */
|
|
||||||
puts (printbuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void vprintf (const char *fmt, va_list args)
|
|
||||||
{
|
|
||||||
uint i;
|
|
||||||
char printbuffer[CFG_PBSIZE];
|
|
||||||
|
|
||||||
/* For this to work, printbuffer must be larger than
|
|
||||||
* anything we ever want to print.
|
|
||||||
*/
|
|
||||||
i = vsprintf (printbuffer, fmt, args);
|
|
||||||
|
|
||||||
/* Print the string */
|
|
||||||
puts (printbuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* test if ctrl-c was pressed */
|
|
||||||
static int ctrlc_disabled = 0; /* see disable_ctrl() */
|
|
||||||
static int ctrlc_was_pressed = 0;
|
|
||||||
int ctrlc (void)
|
|
||||||
{
|
|
||||||
if (!ctrlc_disabled && gd->have_console) {
|
|
||||||
if (tstc ()) {
|
|
||||||
switch (getc ()) {
|
|
||||||
case 0x03: /* ^C - Control C */
|
|
||||||
ctrlc_was_pressed = 1;
|
|
||||||
return 1;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* pass 1 to disable ctrlc() checking, 0 to enable.
|
|
||||||
* returns previous state
|
|
||||||
*/
|
|
||||||
int disable_ctrlc (int disable)
|
|
||||||
{
|
|
||||||
int prev = ctrlc_disabled; /* save previous state */
|
|
||||||
|
|
||||||
ctrlc_disabled = disable;
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
int had_ctrlc (void)
|
|
||||||
{
|
|
||||||
return ctrlc_was_pressed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear_ctrlc (void)
|
|
||||||
{
|
|
||||||
ctrlc_was_pressed = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_MODEM_SUPPORT_DEBUG
|
|
||||||
char screen[1024];
|
|
||||||
char *cursor = screen;
|
|
||||||
int once = 0;
|
|
||||||
inline void dbg(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
uint i;
|
|
||||||
char printbuffer[CFG_PBSIZE];
|
|
||||||
|
|
||||||
if (!once) {
|
|
||||||
memset(screen, 0, sizeof(screen));
|
|
||||||
once++;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_start(args, fmt);
|
|
||||||
|
|
||||||
/* For this to work, printbuffer must be larger than
|
|
||||||
* anything we ever want to print.
|
|
||||||
*/
|
|
||||||
i = vsprintf(printbuffer, fmt, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
if ((screen + sizeof(screen) - 1 - cursor) < strlen(printbuffer)+1) {
|
|
||||||
memset(screen, 0, sizeof(screen));
|
|
||||||
cursor = screen;
|
|
||||||
}
|
|
||||||
sprintf(cursor, printbuffer);
|
|
||||||
cursor += strlen(printbuffer);
|
|
||||||
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
inline void dbg(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** U-Boot INIT FUNCTIONS *************************************************/
|
|
||||||
|
|
||||||
int console_assign (int file, char *devname)
|
|
||||||
{
|
|
||||||
int flag, i;
|
|
||||||
|
|
||||||
/* Check for valid file */
|
|
||||||
switch (file) {
|
|
||||||
case stdin:
|
|
||||||
flag = DEV_FLAGS_INPUT;
|
|
||||||
break;
|
|
||||||
case stdout:
|
|
||||||
case stderr:
|
|
||||||
flag = DEV_FLAGS_OUTPUT;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check for valid device name */
|
|
||||||
|
|
||||||
for (i = 1; i <= ListNumItems (devlist); i++) {
|
|
||||||
device_t *dev = ListGetPtrToItem (devlist, i);
|
|
||||||
|
|
||||||
if (strcmp (devname, dev->name) == 0) {
|
|
||||||
if (dev->flags & flag)
|
|
||||||
return console_setfile (file, dev);
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called before relocation - use serial functions */
|
|
||||||
int console_init_f (void)
|
|
||||||
{
|
|
||||||
gd->have_console = 1;
|
|
||||||
|
|
||||||
#ifdef CONFIG_SILENT_CONSOLE
|
|
||||||
if (getenv("silent") != NULL)
|
|
||||||
gd->flags |= GD_FLG_SILENT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(CFG_CONSOLE_IS_IN_ENV) || defined(CONFIG_SPLASH_SCREEN) || defined(CONFIG_SILENT_CONSOLE)
|
|
||||||
/* search a device */
|
|
||||||
device_t *search_device (int flags, char *name)
|
|
||||||
{
|
|
||||||
int i, items;
|
|
||||||
device_t *dev = NULL;
|
|
||||||
|
|
||||||
items = ListNumItems (devlist);
|
|
||||||
if (name == NULL)
|
|
||||||
return dev;
|
|
||||||
|
|
||||||
for (i = 1; i <= items; i++) {
|
|
||||||
dev = ListGetPtrToItem (devlist, i);
|
|
||||||
if ((dev->flags & flags) && (strcmp (name, dev->name) == 0)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dev;
|
|
||||||
}
|
|
||||||
#endif /* CFG_CONSOLE_IS_IN_ENV || CONFIG_SPLASH_SCREEN */
|
|
||||||
|
|
||||||
#ifdef CFG_CONSOLE_IS_IN_ENV
|
|
||||||
/* Called after the relocation - use desired console functions */
|
|
||||||
int console_init_r (void)
|
|
||||||
{
|
|
||||||
char *stdinname, *stdoutname, *stderrname;
|
|
||||||
device_t *inputdev = NULL, *outputdev = NULL, *errdev = NULL;
|
|
||||||
#ifdef CFG_CONSOLE_ENV_OVERWRITE
|
|
||||||
int i;
|
|
||||||
#endif /* CFG_CONSOLE_ENV_OVERWRITE */
|
|
||||||
|
|
||||||
/* set default handlers at first */
|
|
||||||
gd->jt[XF_getc] = serial_getc;
|
|
||||||
gd->jt[XF_tstc] = serial_tstc;
|
|
||||||
gd->jt[XF_putc] = serial_putc;
|
|
||||||
gd->jt[XF_puts] = serial_puts;
|
|
||||||
gd->jt[XF_printf] = serial_printf;
|
|
||||||
|
|
||||||
/* stdin stdout and stderr are in environment */
|
|
||||||
/* scan for it */
|
|
||||||
stdinname = getenv ("stdin");
|
|
||||||
stdoutname = getenv ("stdout");
|
|
||||||
stderrname = getenv ("stderr");
|
|
||||||
|
|
||||||
if (OVERWRITE_CONSOLE == 0) { /* if not overwritten by config switch */
|
|
||||||
inputdev = search_device (DEV_FLAGS_INPUT, stdinname);
|
|
||||||
outputdev = search_device (DEV_FLAGS_OUTPUT, stdoutname);
|
|
||||||
errdev = search_device (DEV_FLAGS_OUTPUT, stderrname);
|
|
||||||
}
|
|
||||||
/* if the devices are overwritten or not found, use default device */
|
|
||||||
if (inputdev == NULL) {
|
|
||||||
inputdev = search_device (DEV_FLAGS_INPUT, "serial");
|
|
||||||
}
|
|
||||||
if (outputdev == NULL) {
|
|
||||||
outputdev = search_device (DEV_FLAGS_OUTPUT, "serial");
|
|
||||||
}
|
|
||||||
if (errdev == NULL) {
|
|
||||||
errdev = search_device (DEV_FLAGS_OUTPUT, "serial");
|
|
||||||
}
|
|
||||||
/* Initializes output console first */
|
|
||||||
if (outputdev != NULL) {
|
|
||||||
console_setfile (stdout, outputdev);
|
|
||||||
}
|
|
||||||
if (errdev != NULL) {
|
|
||||||
console_setfile (stderr, errdev);
|
|
||||||
}
|
|
||||||
if (inputdev != NULL) {
|
|
||||||
console_setfile (stdin, inputdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */
|
|
||||||
|
|
||||||
#ifndef CFG_CONSOLE_INFO_QUIET
|
|
||||||
/* Print information */
|
|
||||||
puts ("In: ");
|
|
||||||
if (stdio_devices[stdin] == NULL) {
|
|
||||||
puts ("No input devices available!\n");
|
|
||||||
} else {
|
|
||||||
printf ("%s\n", stdio_devices[stdin]->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
puts ("Out: ");
|
|
||||||
if (stdio_devices[stdout] == NULL) {
|
|
||||||
puts ("No output devices available!\n");
|
|
||||||
} else {
|
|
||||||
printf ("%s\n", stdio_devices[stdout]->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
puts ("Err: ");
|
|
||||||
if (stdio_devices[stderr] == NULL) {
|
|
||||||
puts ("No error devices available!\n");
|
|
||||||
} else {
|
|
||||||
printf ("%s\n", stdio_devices[stderr]->name);
|
|
||||||
}
|
|
||||||
#endif /* CFG_CONSOLE_INFO_QUIET */
|
|
||||||
|
|
||||||
#ifdef CFG_CONSOLE_ENV_OVERWRITE
|
|
||||||
/* set the environment variables (will overwrite previous env settings) */
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
setenv (stdio_names[i], stdio_devices[i]->name);
|
|
||||||
}
|
|
||||||
#endif /* CFG_CONSOLE_ENV_OVERWRITE */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* If nothing usable installed, use only the initial console */
|
|
||||||
if ((stdio_devices[stdin] == NULL) && (stdio_devices[stdout] == NULL))
|
|
||||||
return (0);
|
|
||||||
#endif
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* CFG_CONSOLE_IS_IN_ENV */
|
|
||||||
#if 0
|
|
||||||
/* Called after the relocation - use desired console functions */
|
|
||||||
int console_init_r (void)
|
|
||||||
{
|
|
||||||
device_t *inputdev = NULL, *outputdev = NULL;
|
|
||||||
int i, items = ListNumItems (devlist);
|
|
||||||
|
|
||||||
#ifdef CONFIG_SPLASH_SCREEN
|
|
||||||
/* suppress all output if splash screen is enabled and we have
|
|
||||||
a bmp to display */
|
|
||||||
if (getenv("splashimage") != NULL)
|
|
||||||
outputdev = search_device (DEV_FLAGS_OUTPUT, "nulldev");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_SILENT_CONSOLE
|
|
||||||
/* Suppress all output if "silent" mode requested */
|
|
||||||
if (gd->flags & GD_FLG_SILENT)
|
|
||||||
outputdev = search_device (DEV_FLAGS_OUTPUT, "nulldev");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Scan devices looking for input and output devices */
|
|
||||||
for (i = 1;
|
|
||||||
(i <= items) && ((inputdev == NULL) || (outputdev == NULL));
|
|
||||||
i++
|
|
||||||
) {
|
|
||||||
device_t *dev = ListGetPtrToItem (devlist, i);
|
|
||||||
|
|
||||||
if ((dev->flags & DEV_FLAGS_INPUT) && (inputdev == NULL)) {
|
|
||||||
inputdev = dev;
|
|
||||||
}
|
|
||||||
if ((dev->flags & DEV_FLAGS_OUTPUT) && (outputdev == NULL)) {
|
|
||||||
outputdev = dev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initializes output console first */
|
|
||||||
if (outputdev != NULL) {
|
|
||||||
console_setfile (stdout, outputdev);
|
|
||||||
console_setfile (stderr, outputdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initializes input console */
|
|
||||||
if (inputdev != NULL) {
|
|
||||||
console_setfile (stdin, inputdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */
|
|
||||||
|
|
||||||
#ifndef CFG_CONSOLE_INFO_QUIET
|
|
||||||
/* Print information */
|
|
||||||
puts ("In: ");
|
|
||||||
if (stdio_devices[stdin] == NULL) {
|
|
||||||
puts ("No input devices available!\n");
|
|
||||||
} else {
|
|
||||||
printf ("%s\n", stdio_devices[stdin]->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
puts ("Out: ");
|
|
||||||
if (stdio_devices[stdout] == NULL) {
|
|
||||||
puts ("No output devices available!\n");
|
|
||||||
} else {
|
|
||||||
printf ("%s\n", stdio_devices[stdout]->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
puts ("Err: ");
|
|
||||||
if (stdio_devices[stderr] == NULL) {
|
|
||||||
puts ("No error devices available!\n");
|
|
||||||
} else {
|
|
||||||
printf ("%s\n", stdio_devices[stderr]->name);
|
|
||||||
}
|
|
||||||
#endif /* CFG_CONSOLE_INFO_QUIET */
|
|
||||||
|
|
||||||
/* Setting environment variables */
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
setenv (stdio_names[i], stdio_devices[i]->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* If nothing usable installed, use only the initial console */
|
|
||||||
if ((stdio_devices[stdin] == NULL) && (stdio_devices[stdout] == NULL))
|
|
||||||
return (0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* CFG_CONSOLE_IS_IN_ENV */
|
|
|
@ -1,197 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is derived from crc32.c from the zlib-1.1.3 distribution
|
|
||||||
* by Jean-loup Gailly and Mark Adler.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* crc32.c -- compute the CRC-32 of a data stream
|
|
||||||
* Copyright (C) 1995-1998 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef USE_HOSTCC /* Shut down "ANSI does not permit..." warnings */
|
|
||||||
#include <common.h> /* to get command definitions like CFG_CMD_JFFS2 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
#define local static
|
|
||||||
#define ZEXPORT /* empty */
|
|
||||||
unsigned long crc32 (unsigned long, const unsigned char *, unsigned int);
|
|
||||||
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
|
|
||||||
local int crc_table_empty = 1;
|
|
||||||
local uLongf crc_table[256];
|
|
||||||
local void make_crc_table OF((void));
|
|
||||||
|
|
||||||
/*
|
|
||||||
Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
|
|
||||||
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
|
|
||||||
|
|
||||||
Polynomials over GF(2) are represented in binary, one bit per coefficient,
|
|
||||||
with the lowest powers in the most significant bit. Then adding polynomials
|
|
||||||
is just exclusive-or, and multiplying a polynomial by x is a right shift by
|
|
||||||
one. If we call the above polynomial p, and represent a byte as the
|
|
||||||
polynomial q, also with the lowest power in the most significant bit (so the
|
|
||||||
byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
|
|
||||||
where a mod b means the remainder after dividing a by b.
|
|
||||||
|
|
||||||
This calculation is done using the shift-register method of multiplying and
|
|
||||||
taking the remainder. The register is initialized to zero, and for each
|
|
||||||
incoming bit, x^32 is added mod p to the register if the bit is a one (where
|
|
||||||
x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
|
|
||||||
x (which is shifting right by one and adding x^32 mod p if the bit shifted
|
|
||||||
out is a one). We start with the highest power (least significant bit) of
|
|
||||||
q and repeat for all eight bits of q.
|
|
||||||
|
|
||||||
The table is simply the CRC of all possible eight bit values. This is all
|
|
||||||
the information needed to generate CRC's on data a byte at a time for all
|
|
||||||
combinations of CRC register values and incoming bytes.
|
|
||||||
*/
|
|
||||||
local void make_crc_table()
|
|
||||||
{
|
|
||||||
uLong c;
|
|
||||||
int n, k;
|
|
||||||
uLong poly; /* polynomial exclusive-or pattern */
|
|
||||||
/* terms of polynomial defining this crc (except x^32): */
|
|
||||||
static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
|
||||||
|
|
||||||
/* make exclusive-or pattern from polynomial (0xedb88320L) */
|
|
||||||
poly = 0L;
|
|
||||||
for (n = 0; n < sizeof(p)/sizeof(Byte); n++)
|
|
||||||
poly |= 1L << (31 - p[n]);
|
|
||||||
|
|
||||||
for (n = 0; n < 256; n++)
|
|
||||||
{
|
|
||||||
c = (uLong)n;
|
|
||||||
for (k = 0; k < 8; k++)
|
|
||||||
c = c & 1 ? poly ^ (c >> 1) : c >> 1;
|
|
||||||
crc_table[n] = c;
|
|
||||||
}
|
|
||||||
crc_table_empty = 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* ========================================================================
|
|
||||||
* Table of CRC-32's of all single-byte values (made by make_crc_table)
|
|
||||||
*/
|
|
||||||
local const uLongf crc_table[256] = {
|
|
||||||
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
|
|
||||||
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
|
|
||||||
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
|
|
||||||
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
|
|
||||||
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
|
|
||||||
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
|
|
||||||
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
|
|
||||||
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
|
|
||||||
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
|
|
||||||
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
|
|
||||||
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
|
|
||||||
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
|
|
||||||
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
|
|
||||||
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
|
|
||||||
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
|
|
||||||
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
|
|
||||||
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
|
|
||||||
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
|
|
||||||
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
|
|
||||||
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
|
|
||||||
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
|
|
||||||
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
|
|
||||||
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
|
|
||||||
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
|
|
||||||
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
|
|
||||||
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
|
|
||||||
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
|
|
||||||
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
|
|
||||||
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
|
|
||||||
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
|
|
||||||
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
|
|
||||||
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
|
|
||||||
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
|
|
||||||
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
|
|
||||||
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
|
|
||||||
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
|
|
||||||
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
|
|
||||||
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
|
|
||||||
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
|
|
||||||
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
|
|
||||||
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
|
|
||||||
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
|
|
||||||
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
|
|
||||||
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
|
|
||||||
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
|
|
||||||
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
|
|
||||||
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
|
|
||||||
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
|
|
||||||
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
|
|
||||||
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
|
|
||||||
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
|
|
||||||
0x2d02ef8dL
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* =========================================================================
|
|
||||||
* This function can be used by asm versions of crc32()
|
|
||||||
*/
|
|
||||||
const uLongf * ZEXPORT get_crc_table()
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
if (crc_table_empty) make_crc_table();
|
|
||||||
#endif
|
|
||||||
return (const uLongf *)crc_table;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
|
|
||||||
#define DO2(buf) DO1(buf); DO1(buf);
|
|
||||||
#define DO4(buf) DO2(buf); DO2(buf);
|
|
||||||
#define DO8(buf) DO4(buf); DO4(buf);
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT crc32(crc, buf, len)
|
|
||||||
uLong crc;
|
|
||||||
const Bytef *buf;
|
|
||||||
uInt len;
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
if (crc_table_empty)
|
|
||||||
make_crc_table();
|
|
||||||
#endif
|
|
||||||
crc = crc ^ 0xffffffffL;
|
|
||||||
while (len >= 8)
|
|
||||||
{
|
|
||||||
DO8(buf);
|
|
||||||
len -= 8;
|
|
||||||
}
|
|
||||||
if (len) do {
|
|
||||||
DO1(buf);
|
|
||||||
} while (--len);
|
|
||||||
return crc ^ 0xffffffffL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & CFG_CMD_JFFS2)
|
|
||||||
|
|
||||||
/* No ones complement version. JFFS2 (and other things ?)
|
|
||||||
* don't use ones compliment in their CRC calculations.
|
|
||||||
*/
|
|
||||||
uLong ZEXPORT crc32_no_comp(uLong crc, const Bytef *buf, uInt len)
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
if (crc_table_empty)
|
|
||||||
make_crc_table();
|
|
||||||
#endif
|
|
||||||
while (len >= 8)
|
|
||||||
{
|
|
||||||
DO8(buf);
|
|
||||||
len -= 8;
|
|
||||||
}
|
|
||||||
if (len) do {
|
|
||||||
DO1(buf);
|
|
||||||
} while (--len);
|
|
||||||
|
|
||||||
return crc;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_CMD_JFFS2 */
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* (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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* linux/lib/ctype.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/ctype.h>
|
|
||||||
|
|
||||||
unsigned char _ctype[] = {
|
|
||||||
_C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */
|
|
||||||
_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */
|
|
||||||
_C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */
|
|
||||||
_C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */
|
|
||||||
_S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */
|
|
||||||
_P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */
|
|
||||||
_D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */
|
|
||||||
_D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */
|
|
||||||
_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */
|
|
||||||
_U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */
|
|
||||||
_U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */
|
|
||||||
_U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */
|
|
||||||
_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */
|
|
||||||
_L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */
|
|
||||||
_L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */
|
|
||||||
_L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */
|
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */
|
|
||||||
_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 160-175 */
|
|
||||||
_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 176-191 */
|
|
||||||
_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U, /* 192-207 */
|
|
||||||
_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */
|
|
||||||
_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */
|
|
||||||
_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */
|
|
|
@ -1,216 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2000
|
|
||||||
* Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
|
|
||||||
*
|
|
||||||
* 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 <config.h>
|
|
||||||
#include <common.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <devices.h>
|
|
||||||
#include <serial.h>
|
|
||||||
#ifdef CONFIG_LOGBUFFER
|
|
||||||
#include <logbuff.h>
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
|
||||||
#include <i2c.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
|
||||||
|
|
||||||
list_t devlist = 0;
|
|
||||||
device_t *stdio_devices[] = { NULL, NULL, NULL };
|
|
||||||
char *stdio_names[MAX_FILES] = { "stdin", "stdout", "stderr" };
|
|
||||||
|
|
||||||
#if defined(CONFIG_SPLASH_SCREEN) && !defined(CFG_DEVICE_NULLDEV)
|
|
||||||
#define CFG_DEVICE_NULLDEV 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CFG_DEVICE_NULLDEV
|
|
||||||
void nulldev_putc(const char c)
|
|
||||||
{
|
|
||||||
/* nulldev is empty! */
|
|
||||||
}
|
|
||||||
|
|
||||||
void nulldev_puts(const char *s)
|
|
||||||
{
|
|
||||||
/* nulldev is empty! */
|
|
||||||
}
|
|
||||||
|
|
||||||
int nulldev_input(void)
|
|
||||||
{
|
|
||||||
/* nulldev is empty! */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
* SYSTEM DRIVERS
|
|
||||||
**************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void drv_system_init (void)
|
|
||||||
{
|
|
||||||
device_t dev;
|
|
||||||
|
|
||||||
memset (&dev, 0, sizeof (dev));
|
|
||||||
|
|
||||||
strcpy (dev.name, "serial");
|
|
||||||
dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
|
|
||||||
#ifdef CONFIG_SERIAL_SOFTWARE_FIFO
|
|
||||||
dev.putc = serial_buffered_putc;
|
|
||||||
dev.puts = serial_buffered_puts;
|
|
||||||
dev.getc = serial_buffered_getc;
|
|
||||||
dev.tstc = serial_buffered_tstc;
|
|
||||||
#else
|
|
||||||
dev.putc = serial_putc;
|
|
||||||
dev.puts = serial_puts;
|
|
||||||
dev.getc = serial_getc;
|
|
||||||
dev.tstc = serial_tstc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
device_register (&dev);
|
|
||||||
|
|
||||||
#ifdef CFG_DEVICE_NULLDEV
|
|
||||||
memset (&dev, 0, sizeof (dev));
|
|
||||||
|
|
||||||
strcpy (dev.name, "nulldev");
|
|
||||||
dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
|
|
||||||
dev.putc = nulldev_putc;
|
|
||||||
dev.puts = nulldev_puts;
|
|
||||||
dev.getc = nulldev_input;
|
|
||||||
dev.tstc = nulldev_input;
|
|
||||||
|
|
||||||
device_register (&dev);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
* DEVICES
|
|
||||||
**************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
int device_register (device_t * dev)
|
|
||||||
{
|
|
||||||
ListInsertItem (devlist, dev, LIST_END);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* deregister the device "devname".
|
|
||||||
* returns 0 if success, -1 if device is assigned and 1 if devname not found
|
|
||||||
*/
|
|
||||||
#ifdef CFG_DEVICE_DEREGISTER
|
|
||||||
int device_deregister(char *devname)
|
|
||||||
{
|
|
||||||
int i,l,dev_index;
|
|
||||||
device_t *dev = NULL;
|
|
||||||
char temp_names[3][8];
|
|
||||||
|
|
||||||
dev_index=-1;
|
|
||||||
for (i=1; i<=ListNumItems(devlist); i++) {
|
|
||||||
dev = ListGetPtrToItem (devlist, i);
|
|
||||||
if(strcmp(dev->name,devname)==0) {
|
|
||||||
dev_index=i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(dev_index<0) /* device not found */
|
|
||||||
return 0;
|
|
||||||
/* get stdio devices (ListRemoveItem changes the dev list) */
|
|
||||||
for (l=0 ; l< MAX_FILES; l++) {
|
|
||||||
if (stdio_devices[l] == dev) {
|
|
||||||
/* Device is assigned -> report error */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
memcpy (&temp_names[l][0],
|
|
||||||
stdio_devices[l]->name,
|
|
||||||
sizeof(stdio_devices[l]->name));
|
|
||||||
}
|
|
||||||
ListRemoveItem(devlist,NULL,dev_index);
|
|
||||||
/* reassign Device list */
|
|
||||||
for (i=1; i<=ListNumItems(devlist); i++) {
|
|
||||||
dev = ListGetPtrToItem (devlist, i);
|
|
||||||
for (l=0 ; l< MAX_FILES; l++) {
|
|
||||||
if(strcmp(dev->name,temp_names[l])==0) {
|
|
||||||
stdio_devices[l] = dev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CFG_DEVICE_DEREGISTER */
|
|
||||||
|
|
||||||
int devices_init (void)
|
|
||||||
{
|
|
||||||
#ifndef CONFIG_ARM /* already relocated for current ARM implementation */
|
|
||||||
ulong relocation_offset = gd->reloc_off;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* relocate device name pointers */
|
|
||||||
for (i = 0; i < (sizeof (stdio_names) / sizeof (char *)); ++i) {
|
|
||||||
stdio_names[i] = (char *) (((ulong) stdio_names[i]) +
|
|
||||||
relocation_offset);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize the list */
|
|
||||||
devlist = ListCreate (sizeof (device_t));
|
|
||||||
|
|
||||||
if (devlist == NULL) {
|
|
||||||
eputs ("Cannot initialize the list of devices!\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
|
||||||
i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_LCD
|
|
||||||
drv_lcd_init ();
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE)
|
|
||||||
drv_video_init ();
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_KEYBOARD
|
|
||||||
drv_keyboard_init ();
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_LOGBUFFER
|
|
||||||
drv_logbuff_init ();
|
|
||||||
#endif
|
|
||||||
drv_system_init ();
|
|
||||||
#ifdef CONFIG_SERIAL_MULTI
|
|
||||||
serial_devices_init ();
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_USB_TTY
|
|
||||||
drv_usbtty_init ();
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_NETCONSOLE
|
|
||||||
drv_nc_init ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int devices_done (void)
|
|
||||||
{
|
|
||||||
ListDispose (devlist);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,67 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2000-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
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
|
|
||||||
int display_options (void)
|
|
||||||
{
|
|
||||||
extern char version_string[];
|
|
||||||
|
|
||||||
#if defined(BUILD_TAG)
|
|
||||||
printf ("\n\n%s, Build: %s\n\n", version_string, BUILD_TAG);
|
|
||||||
#else
|
|
||||||
printf ("\n\n%s\n\n", version_string);
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* print sizes as "xxx kB", "xxx.y kB", "xxx MB" or "xxx.y MB" as needed;
|
|
||||||
* allow for optional trailing string (like "\n")
|
|
||||||
*/
|
|
||||||
void print_size (ulong size, const char *s)
|
|
||||||
{
|
|
||||||
ulong m, n;
|
|
||||||
ulong d = 1 << 20; /* 1 MB */
|
|
||||||
char c = 'M';
|
|
||||||
|
|
||||||
if (size < d) { /* print in kB */
|
|
||||||
c = 'k';
|
|
||||||
d = 1 << 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
n = size / d;
|
|
||||||
|
|
||||||
m = (10 * (size - (n * d)) + (d / 2) ) / d;
|
|
||||||
|
|
||||||
if (m >= 10) {
|
|
||||||
m -= 10;
|
|
||||||
n += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("%2ld", n);
|
|
||||||
if (m) {
|
|
||||||
printf (".%ld", m);
|
|
||||||
}
|
|
||||||
printf (" %cB%s", c, s);
|
|
||||||
}
|
|
|
@ -1,734 +0,0 @@
|
||||||
#include <common.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <lists.h>
|
|
||||||
|
|
||||||
#define MAX(a,b) (((a)>(b)) ? (a) : (b))
|
|
||||||
#define MIN(a,b) (((a)<(b)) ? (a) : (b))
|
|
||||||
#define CAT4CHARS(a,b,c,d) ((a<<24) | (b<<16) | (c<<8) | d)
|
|
||||||
|
|
||||||
/* increase list size by 10% every time it is full */
|
|
||||||
#define kDefaultAllocationPercentIncrease 10
|
|
||||||
|
|
||||||
/* always increase list size by 4 items when it is full */
|
|
||||||
#define kDefaultAllocationminNumItemsIncrease 4
|
|
||||||
|
|
||||||
/*
|
|
||||||
* how many items to expand the list by when it becomes full
|
|
||||||
* = current listSize (in items) + (hiword percent of list size) + loword
|
|
||||||
*/
|
|
||||||
#define NUMITEMSPERALLOC(list) MAX(((*list)->listSize * \
|
|
||||||
((*list)->percentIncrease + 100)) / 100, \
|
|
||||||
(*list)->minNumItemsIncrease )
|
|
||||||
|
|
||||||
#define ITEMPTR(list,item) &(((char *)&(*list)->itemList)[(*(list))->itemSize * (item)])
|
|
||||||
|
|
||||||
#define LIST_SIGNATURE CAT4CHARS('L', 'I', 'S', 'T');
|
|
||||||
|
|
||||||
#define calloc(size,num) malloc(size*num)
|
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
Handle NewHandle (unsigned int numBytes)
|
|
||||||
{
|
|
||||||
void *memPtr;
|
|
||||||
HandleRecord *hanPtr;
|
|
||||||
|
|
||||||
memPtr = calloc (numBytes, 1);
|
|
||||||
hanPtr = (HandleRecord *) calloc (sizeof (HandleRecord), 1);
|
|
||||||
if (hanPtr && (memPtr || numBytes == 0)) {
|
|
||||||
hanPtr->ptr = memPtr;
|
|
||||||
hanPtr->size = numBytes;
|
|
||||||
return (Handle) hanPtr;
|
|
||||||
} else {
|
|
||||||
free (memPtr);
|
|
||||||
free (hanPtr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void DisposeHandle (Handle handle)
|
|
||||||
{
|
|
||||||
if (handle) {
|
|
||||||
free (*handle);
|
|
||||||
free ((void *) handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
unsigned int GetHandleSize (Handle handle)
|
|
||||||
{
|
|
||||||
return ((HandleRecord *) handle)->size;
|
|
||||||
}
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
int SetHandleSize (Handle handle, unsigned int newSize)
|
|
||||||
{
|
|
||||||
HandleRecord *hanRecPtr = (HandleRecord *) handle;
|
|
||||||
void *newPtr, *oldPtr;
|
|
||||||
unsigned int oldSize;
|
|
||||||
|
|
||||||
|
|
||||||
oldPtr = hanRecPtr->ptr;
|
|
||||||
oldSize = hanRecPtr->size;
|
|
||||||
|
|
||||||
if (oldSize == newSize)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (oldPtr == NULL) {
|
|
||||||
newPtr = malloc (newSize);
|
|
||||||
} else {
|
|
||||||
newPtr = realloc (oldPtr, newSize);
|
|
||||||
}
|
|
||||||
if (newPtr || (newSize == 0)) {
|
|
||||||
hanRecPtr->ptr = newPtr;
|
|
||||||
hanRecPtr->size = newSize;
|
|
||||||
if (newSize > oldSize)
|
|
||||||
memset ((char *) newPtr + oldSize, 0, newSize - oldSize);
|
|
||||||
return 1;
|
|
||||||
} else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CFG_ALL_LIST_FUNCTIONS
|
|
||||||
|
|
||||||
/* Used to compare list elements by their raw data contents */
|
|
||||||
static int ListMemBlockCmp (void *a, void *b, int size)
|
|
||||||
{
|
|
||||||
return memcmp (a, b, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Binary search numElements of size elementSize in array for a match
|
|
||||||
* to the. item. Return the index of the element that matches
|
|
||||||
* (0 - numElements - 1). If no match is found return the -i-1 where
|
|
||||||
* i is the index (0 - numElements) where the item should be placed.
|
|
||||||
* (*theCmp)(a,b) should return <0 if a<b, 0 if a==b, >0 if a>b.
|
|
||||||
*
|
|
||||||
* This function is like the C-Library function bsearch() except that
|
|
||||||
* this function returns the index where the item should be placed if
|
|
||||||
* it is not found.
|
|
||||||
*/
|
|
||||||
int BinSearch ( void *array, int numElements, int elementSize,
|
|
||||||
void *itemPtr, CompareFunction compareFunction)
|
|
||||||
{
|
|
||||||
int low, high, mid, cmp;
|
|
||||||
void *arrayItemPtr;
|
|
||||||
|
|
||||||
for (low = 0, high = numElements - 1, mid = 0, cmp = -1; low <= high;) {
|
|
||||||
mid = (low + high) >> 1;
|
|
||||||
|
|
||||||
arrayItemPtr = (void *) (((char *) array) + (mid * elementSize));
|
|
||||||
cmp = compareFunction
|
|
||||||
? compareFunction (itemPtr, arrayItemPtr)
|
|
||||||
: ListMemBlockCmp (itemPtr, arrayItemPtr, elementSize);
|
|
||||||
if (cmp == 0) {
|
|
||||||
return mid;
|
|
||||||
} else if (cmp < 0) {
|
|
||||||
high = mid - 1;
|
|
||||||
} else {
|
|
||||||
low = mid + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cmp > 0)
|
|
||||||
mid++;
|
|
||||||
|
|
||||||
return -mid - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_ALL_LIST_FUNCTIONS */
|
|
||||||
|
|
||||||
/*******************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If numNewItems == 0 then expand the list by the number of items
|
|
||||||
* indicated by its allocation policy.
|
|
||||||
* If numNewItems > 0 then expand the list by exactly the number of
|
|
||||||
* items indicated.
|
|
||||||
* If numNewItems < 0 then expand the list by the absolute value of
|
|
||||||
* numNewItems plus the number of items indicated by its allocation
|
|
||||||
* policy.
|
|
||||||
* Returns 1 for success, 0 if out of memory
|
|
||||||
*/
|
|
||||||
static int ExpandListSpace (list_t list, int numNewItems)
|
|
||||||
{
|
|
||||||
if (numNewItems == 0) {
|
|
||||||
numNewItems = NUMITEMSPERALLOC (list);
|
|
||||||
} else if (numNewItems < 0) {
|
|
||||||
numNewItems = (-numNewItems) + NUMITEMSPERALLOC (list);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SetHandleSize ((Handle) list,
|
|
||||||
sizeof (ListStruct) +
|
|
||||||
((*list)->listSize +
|
|
||||||
numNewItems) * (*list)->itemSize)) {
|
|
||||||
(*list)->listSize += numNewItems;
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
#ifdef CFG_ALL_LIST_FUNCTIONS
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function reallocate the list, minus any currently unused
|
|
||||||
* portion of its allotted memory.
|
|
||||||
*/
|
|
||||||
void ListCompact (list_t list)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (!SetHandleSize ((Handle) list,
|
|
||||||
sizeof (ListStruct) +
|
|
||||||
(*list)->numItems * (*list)->itemSize)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*list)->listSize = (*list)->numItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_ALL_LIST_FUNCTIONS */
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
list_t ListCreate (int elementSize)
|
|
||||||
{
|
|
||||||
list_t list;
|
|
||||||
|
|
||||||
list = (list_t) (NewHandle (sizeof (ListStruct))); /* create empty list */
|
|
||||||
if (list) {
|
|
||||||
(*list)->signature = LIST_SIGNATURE;
|
|
||||||
(*list)->numItems = 0;
|
|
||||||
(*list)->listSize = 0;
|
|
||||||
(*list)->itemSize = elementSize;
|
|
||||||
(*list)->percentIncrease = kDefaultAllocationPercentIncrease;
|
|
||||||
(*list)->minNumItemsIncrease =
|
|
||||||
kDefaultAllocationminNumItemsIncrease;
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
void ListSetAllocationPolicy (list_t list, int minItemsPerAlloc,
|
|
||||||
int percentIncreasePerAlloc)
|
|
||||||
{
|
|
||||||
(*list)->percentIncrease = percentIncreasePerAlloc;
|
|
||||||
(*list)->minNumItemsIncrease = minItemsPerAlloc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
void ListDispose (list_t list)
|
|
||||||
{
|
|
||||||
DisposeHandle ((Handle) list);
|
|
||||||
}
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
#ifdef CFG_ALL_LIST_FUNCTIONS
|
|
||||||
|
|
||||||
void ListDisposePtrList (list_t list)
|
|
||||||
{
|
|
||||||
int index;
|
|
||||||
int numItems;
|
|
||||||
|
|
||||||
if (list) {
|
|
||||||
numItems = ListNumItems (list);
|
|
||||||
|
|
||||||
for (index = 1; index <= numItems; index++)
|
|
||||||
free (*(void **) ListGetPtrToItem (list, index));
|
|
||||||
|
|
||||||
ListDispose (list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* keeps memory, resets the number of items to 0
|
|
||||||
*/
|
|
||||||
void ListClear (list_t list)
|
|
||||||
{
|
|
||||||
if (!list)
|
|
||||||
return;
|
|
||||||
(*list)->numItems = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* copy is only as large as necessary
|
|
||||||
*/
|
|
||||||
list_t ListCopy (list_t originalList)
|
|
||||||
{
|
|
||||||
list_t tempList = NULL;
|
|
||||||
int numItems;
|
|
||||||
|
|
||||||
if (!originalList)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
tempList = ListCreate ((*originalList)->itemSize);
|
|
||||||
if (tempList) {
|
|
||||||
numItems = ListNumItems (originalList);
|
|
||||||
|
|
||||||
if (!SetHandleSize ((Handle) tempList,
|
|
||||||
sizeof (ListStruct) +
|
|
||||||
numItems * (*tempList)->itemSize)) {
|
|
||||||
ListDispose (tempList);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*tempList)->numItems = (*originalList)->numItems;
|
|
||||||
(*tempList)->listSize = (*originalList)->numItems;
|
|
||||||
(*tempList)->itemSize = (*originalList)->itemSize;
|
|
||||||
(*tempList)->percentIncrease = (*originalList)->percentIncrease;
|
|
||||||
(*tempList)->minNumItemsIncrease =
|
|
||||||
(*originalList)->minNumItemsIncrease;
|
|
||||||
|
|
||||||
memcpy (ITEMPTR (tempList, 0), ITEMPTR (originalList, 0),
|
|
||||||
numItems * (*tempList)->itemSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
return tempList;
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* list1 = list1 + list2
|
|
||||||
*/
|
|
||||||
int ListAppend (list_t list1, list_t list2)
|
|
||||||
{
|
|
||||||
int numItemsL1, numItemsL2;
|
|
||||||
|
|
||||||
if (!list2)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (!list1)
|
|
||||||
return 0;
|
|
||||||
if ((*list1)->itemSize != (*list2)->itemSize)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
numItemsL1 = ListNumItems (list1);
|
|
||||||
numItemsL2 = ListNumItems (list2);
|
|
||||||
|
|
||||||
if (numItemsL2 == 0)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (!SetHandleSize ((Handle) list1,
|
|
||||||
sizeof (ListStruct) + (numItemsL1 + numItemsL2) *
|
|
||||||
(*list1)->itemSize)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*list1)->numItems = numItemsL1 + numItemsL2;
|
|
||||||
(*list1)->listSize = numItemsL1 + numItemsL2;
|
|
||||||
|
|
||||||
memmove (ITEMPTR (list1, numItemsL1),
|
|
||||||
ITEMPTR (list2, 0),
|
|
||||||
numItemsL2 * (*list2)->itemSize);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_ALL_LIST_FUNCTIONS */
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* returns 1 if the item is inserted, returns 0 if out of memory or
|
|
||||||
* bad arguments were passed.
|
|
||||||
*/
|
|
||||||
int ListInsertItem (list_t list, void *ptrToItem, int itemPosition)
|
|
||||||
{
|
|
||||||
return ListInsertItems (list, ptrToItem, itemPosition, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
int ListInsertItems (list_t list, void *ptrToItems, int firstItemPosition,
|
|
||||||
int numItemsToInsert)
|
|
||||||
{
|
|
||||||
int numItems = (*list)->numItems;
|
|
||||||
|
|
||||||
if (firstItemPosition == numItems + 1)
|
|
||||||
firstItemPosition = LIST_END;
|
|
||||||
else if (firstItemPosition > numItems)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ((*list)->numItems >= (*list)->listSize) {
|
|
||||||
if (!ExpandListSpace (list, -numItemsToInsert))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (firstItemPosition == LIST_START) {
|
|
||||||
if (numItems == 0) {
|
|
||||||
/* special case for empty list */
|
|
||||||
firstItemPosition = LIST_END;
|
|
||||||
} else {
|
|
||||||
firstItemPosition = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (firstItemPosition == LIST_END) { /* add at the end of the list */
|
|
||||||
if (ptrToItems)
|
|
||||||
memcpy (ITEMPTR (list, numItems), ptrToItems,
|
|
||||||
(*list)->itemSize * numItemsToInsert);
|
|
||||||
else
|
|
||||||
memset (ITEMPTR (list, numItems), 0,
|
|
||||||
(*list)->itemSize * numItemsToInsert);
|
|
||||||
|
|
||||||
(*list)->numItems += numItemsToInsert;
|
|
||||||
} else { /* move part of list up to make room for new item */
|
|
||||||
memmove (ITEMPTR (list, firstItemPosition - 1 + numItemsToInsert),
|
|
||||||
ITEMPTR (list, firstItemPosition - 1),
|
|
||||||
(numItems + 1 - firstItemPosition) * (*list)->itemSize);
|
|
||||||
|
|
||||||
if (ptrToItems)
|
|
||||||
memmove (ITEMPTR (list, firstItemPosition - 1), ptrToItems,
|
|
||||||
(*list)->itemSize * numItemsToInsert);
|
|
||||||
else
|
|
||||||
memset (ITEMPTR (list, firstItemPosition - 1), 0,
|
|
||||||
(*list)->itemSize * numItemsToInsert);
|
|
||||||
|
|
||||||
(*list)->numItems += numItemsToInsert;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CFG_ALL_LIST_FUNCTIONS
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
int ListEqual (list_t list1, list_t list2)
|
|
||||||
{
|
|
||||||
if (list1 == list2)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (list1 == NULL || list2 == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ((*list1)->itemSize == (*list1)->itemSize) {
|
|
||||||
if ((*list1)->numItems == (*list2)->numItems) {
|
|
||||||
return (memcmp (ITEMPTR (list1, 0), ITEMPTR (list2, 0),
|
|
||||||
(*list1)->itemSize * (*list1)->numItems) == 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The item pointed to by ptrToItem is copied over the current item
|
|
||||||
* at itemPosition
|
|
||||||
*/
|
|
||||||
void ListReplaceItem (list_t list, void *ptrToItem, int itemPosition)
|
|
||||||
{
|
|
||||||
ListReplaceItems (list, ptrToItem, itemPosition, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The item pointed to by ptrToItems is copied over the current item
|
|
||||||
* at itemPosition
|
|
||||||
*/
|
|
||||||
void ListReplaceItems ( list_t list, void *ptrToItems,
|
|
||||||
int firstItemPosition, int numItemsToReplace)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (firstItemPosition == LIST_END)
|
|
||||||
firstItemPosition = (*list)->numItems;
|
|
||||||
else if (firstItemPosition == LIST_START)
|
|
||||||
firstItemPosition = 1;
|
|
||||||
|
|
||||||
memmove (ITEMPTR (list, firstItemPosition - 1), ptrToItems,
|
|
||||||
(*list)->itemSize * numItemsToReplace);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
void ListGetItem (list_t list, void *itemDestination, int itemPosition)
|
|
||||||
{
|
|
||||||
ListGetItems (list, itemDestination, itemPosition, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_ALL_LIST_FUNCTIONS */
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
#if defined(CFG_ALL_LIST_FUNCTIONS) || defined(CFG_DEVICE_DEREGISTER)
|
|
||||||
|
|
||||||
void ListRemoveItem (list_t list, void *itemDestination, int itemPosition)
|
|
||||||
{
|
|
||||||
ListRemoveItems (list, itemDestination, itemPosition, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
void ListRemoveItems (list_t list, void *itemsDestination,
|
|
||||||
int firstItemPosition, int numItemsToRemove)
|
|
||||||
{
|
|
||||||
int firstItemAfterChunk, numToMove;
|
|
||||||
|
|
||||||
if (firstItemPosition == LIST_START)
|
|
||||||
firstItemPosition = 1;
|
|
||||||
else if (firstItemPosition == LIST_END)
|
|
||||||
firstItemPosition = (*list)->numItems;
|
|
||||||
|
|
||||||
if (itemsDestination != NULL)
|
|
||||||
memcpy (itemsDestination, ITEMPTR (list, firstItemPosition - 1),
|
|
||||||
(*list)->itemSize * numItemsToRemove);
|
|
||||||
|
|
||||||
firstItemAfterChunk = firstItemPosition + numItemsToRemove;
|
|
||||||
numToMove = (*list)->numItems - (firstItemAfterChunk - 1);
|
|
||||||
|
|
||||||
if (numToMove > 0) {
|
|
||||||
/*
|
|
||||||
* move part of list down to cover hole left by removed item
|
|
||||||
*/
|
|
||||||
memmove (ITEMPTR (list, firstItemPosition - 1),
|
|
||||||
ITEMPTR (list, firstItemAfterChunk - 1),
|
|
||||||
(*list)->itemSize * numToMove);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*list)->numItems -= numItemsToRemove;
|
|
||||||
}
|
|
||||||
#endif /* CFG_ALL_LIST_FUNCTIONS || CFG_DEVICE_DEREGISTER */
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
void ListGetItems (list_t list, void *itemsDestination,
|
|
||||||
int firstItemPosition, int numItemsToGet)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (firstItemPosition == LIST_START)
|
|
||||||
firstItemPosition = 1;
|
|
||||||
else if (firstItemPosition == LIST_END)
|
|
||||||
firstItemPosition = (*list)->numItems;
|
|
||||||
|
|
||||||
memcpy (itemsDestination,
|
|
||||||
ITEMPTR (list, firstItemPosition - 1),
|
|
||||||
(*list)->itemSize * numItemsToGet);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns a pointer to the item at itemPosition. returns null if an
|
|
||||||
* errors occurred.
|
|
||||||
*/
|
|
||||||
void *ListGetPtrToItem (list_t list, int itemPosition)
|
|
||||||
{
|
|
||||||
if (itemPosition == LIST_START)
|
|
||||||
itemPosition = 1;
|
|
||||||
else if (itemPosition == LIST_END)
|
|
||||||
itemPosition = (*list)->numItems;
|
|
||||||
|
|
||||||
return ITEMPTR (list, itemPosition - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* returns a pointer the lists data (abstraction violation for
|
|
||||||
* optimization)
|
|
||||||
*/
|
|
||||||
void *ListGetDataPtr (list_t list)
|
|
||||||
{
|
|
||||||
return &((*list)->itemList[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************/
|
|
||||||
|
|
||||||
#ifdef CFG_ALL_LIST_FUNCTIONS
|
|
||||||
|
|
||||||
int ListApplyToEach (list_t list, int ascending,
|
|
||||||
ListApplicationFunc funcToApply,
|
|
||||||
void *callbackData)
|
|
||||||
{
|
|
||||||
int result = 0, index;
|
|
||||||
|
|
||||||
if (!list || !funcToApply)
|
|
||||||
goto Error;
|
|
||||||
|
|
||||||
if (ascending) {
|
|
||||||
for (index = 1; index <= ListNumItems (list); index++) {
|
|
||||||
result = funcToApply (index,
|
|
||||||
ListGetPtrToItem (list, index),
|
|
||||||
callbackData);
|
|
||||||
if (result < 0)
|
|
||||||
goto Error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (index = ListNumItems (list);
|
|
||||||
index > 0 && index <= ListNumItems (list);
|
|
||||||
index--) {
|
|
||||||
result = funcToApply (index,
|
|
||||||
ListGetPtrToItem (list, index),
|
|
||||||
callbackData);
|
|
||||||
if (result < 0)
|
|
||||||
goto Error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Error:
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_ALL_LIST_FUNCTIONS */
|
|
||||||
|
|
||||||
/********************************/
|
|
||||||
|
|
||||||
int ListGetItemSize (list_t list)
|
|
||||||
{
|
|
||||||
return (*list)->itemSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************/
|
|
||||||
|
|
||||||
int ListNumItems (list_t list)
|
|
||||||
{
|
|
||||||
return (*list)->numItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
#ifdef CFG_ALL_LIST_FUNCTIONS
|
|
||||||
|
|
||||||
void ListRemoveDuplicates (list_t list, CompareFunction compareFunction)
|
|
||||||
{
|
|
||||||
int numItems, index, startIndexForFind, duplicatesIndex;
|
|
||||||
|
|
||||||
numItems = ListNumItems (list);
|
|
||||||
|
|
||||||
for (index = 1; index < numItems; index++) {
|
|
||||||
startIndexForFind = index + 1;
|
|
||||||
while (startIndexForFind <= numItems) {
|
|
||||||
duplicatesIndex =
|
|
||||||
ListFindItem (list,
|
|
||||||
ListGetPtrToItem (list, index),
|
|
||||||
startIndexForFind,
|
|
||||||
compareFunction);
|
|
||||||
if (duplicatesIndex > 0) {
|
|
||||||
ListRemoveItem (list, NULL, duplicatesIndex);
|
|
||||||
numItems--;
|
|
||||||
startIndexForFind = duplicatesIndex;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
int ListFindItem (list_t list, void *ptrToItem, int startingPosition,
|
|
||||||
CompareFunction compareFunction)
|
|
||||||
{
|
|
||||||
int numItems, size, index, cmp;
|
|
||||||
void *listItemPtr;
|
|
||||||
|
|
||||||
if ((numItems = (*list)->numItems) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
size = (*list)->itemSize;
|
|
||||||
|
|
||||||
if (startingPosition == LIST_START)
|
|
||||||
startingPosition = 1;
|
|
||||||
else if (startingPosition == LIST_END)
|
|
||||||
startingPosition = numItems;
|
|
||||||
|
|
||||||
for (index = startingPosition; index <= numItems; index++) {
|
|
||||||
listItemPtr = ITEMPTR (list, index - 1);
|
|
||||||
cmp = compareFunction
|
|
||||||
? compareFunction (ptrToItem, listItemPtr)
|
|
||||||
: ListMemBlockCmp (ptrToItem, listItemPtr, size);
|
|
||||||
if (cmp == 0)
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
int ShortCompare (void *a, void *b)
|
|
||||||
{
|
|
||||||
if (*(short *) a < *(short *) b)
|
|
||||||
return -1;
|
|
||||||
if (*(short *) a > *(short *) b)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
int IntCompare (void *a, void *b)
|
|
||||||
{
|
|
||||||
if (*(int *) a < *(int *) b)
|
|
||||||
return -1;
|
|
||||||
if (*(int *) a > *(int *) b)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
int CStringCompare (void *a, void *b)
|
|
||||||
{
|
|
||||||
return strcmp (*(char **) a, *(char **) b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
|
|
||||||
int ListBinSearch (list_t list, void *ptrToItem,
|
|
||||||
CompareFunction compareFunction)
|
|
||||||
{
|
|
||||||
int index;
|
|
||||||
|
|
||||||
index = BinSearch (ITEMPTR (list, 0),
|
|
||||||
(int) (*list)->numItems,
|
|
||||||
(int) (*list)->itemSize, ptrToItem,
|
|
||||||
compareFunction);
|
|
||||||
|
|
||||||
if (index >= 0)
|
|
||||||
index++; /* lists start from 1 */
|
|
||||||
else
|
|
||||||
index = 0; /* item not found */
|
|
||||||
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reserves memory for numItems in the list. If it succeeds then
|
|
||||||
* numItems items can be inserted without possibility of an out of
|
|
||||||
* memory error (useful to simplify error recovery in complex
|
|
||||||
* functions). Returns 1 if success, 0 if out of memory.
|
|
||||||
*/
|
|
||||||
int ListPreAllocate (list_t list, int numItems)
|
|
||||||
{
|
|
||||||
if ((*list)->listSize - (*list)->numItems < numItems) {
|
|
||||||
return ExpandListSpace (list,
|
|
||||||
numItems - ((*list)->listSize -
|
|
||||||
(*list)->numItems));
|
|
||||||
} else {
|
|
||||||
return 1; /* enough items are already pre-allocated */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_ALL_LIST_FUNCTIONS */
|
|
|
@ -1,578 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/lib/string.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* stupid library routines.. The optimized versions should generally be found
|
|
||||||
* as inline code in <asm-xx/string.h>
|
|
||||||
*
|
|
||||||
* These are buggy as well..
|
|
||||||
*
|
|
||||||
* * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
|
|
||||||
* - Added strsep() which will replace strtok() soon (because strsep() is
|
|
||||||
* reentrant and should be faster). Use only strsep() in new code, please.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
#include <linux/ctype.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
|
|
||||||
|
|
||||||
#if 0 /* not used - was: #ifndef __HAVE_ARCH_STRNICMP */
|
|
||||||
/**
|
|
||||||
* strnicmp - Case insensitive, length-limited string comparison
|
|
||||||
* @s1: One string
|
|
||||||
* @s2: The other string
|
|
||||||
* @len: the maximum number of characters to compare
|
|
||||||
*/
|
|
||||||
int strnicmp(const char *s1, const char *s2, size_t len)
|
|
||||||
{
|
|
||||||
/* Yes, Virginia, it had better be unsigned */
|
|
||||||
unsigned char c1, c2;
|
|
||||||
|
|
||||||
c1 = 0; c2 = 0;
|
|
||||||
if (len) {
|
|
||||||
do {
|
|
||||||
c1 = *s1; c2 = *s2;
|
|
||||||
s1++; s2++;
|
|
||||||
if (!c1)
|
|
||||||
break;
|
|
||||||
if (!c2)
|
|
||||||
break;
|
|
||||||
if (c1 == c2)
|
|
||||||
continue;
|
|
||||||
c1 = tolower(c1);
|
|
||||||
c2 = tolower(c2);
|
|
||||||
if (c1 != c2)
|
|
||||||
break;
|
|
||||||
} while (--len);
|
|
||||||
}
|
|
||||||
return (int)c1 - (int)c2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char * ___strtok;
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRCPY
|
|
||||||
/**
|
|
||||||
* strcpy - Copy a %NUL terminated string
|
|
||||||
* @dest: Where to copy the string to
|
|
||||||
* @src: Where to copy the string from
|
|
||||||
*/
|
|
||||||
char * strcpy(char * dest,const char *src)
|
|
||||||
{
|
|
||||||
char *tmp = dest;
|
|
||||||
|
|
||||||
while ((*dest++ = *src++) != '\0')
|
|
||||||
/* nothing */;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRNCPY
|
|
||||||
/**
|
|
||||||
* strncpy - Copy a length-limited, %NUL-terminated string
|
|
||||||
* @dest: Where to copy the string to
|
|
||||||
* @src: Where to copy the string from
|
|
||||||
* @count: The maximum number of bytes to copy
|
|
||||||
*
|
|
||||||
* Note that unlike userspace strncpy, this does not %NUL-pad the buffer.
|
|
||||||
* However, the result is not %NUL-terminated if the source exceeds
|
|
||||||
* @count bytes.
|
|
||||||
*/
|
|
||||||
char * strncpy(char * dest,const char *src,size_t count)
|
|
||||||
{
|
|
||||||
char *tmp = dest;
|
|
||||||
|
|
||||||
while (count-- && (*dest++ = *src++) != '\0')
|
|
||||||
/* nothing */;
|
|
||||||
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRCAT
|
|
||||||
/**
|
|
||||||
* strcat - Append one %NUL-terminated string to another
|
|
||||||
* @dest: The string to be appended to
|
|
||||||
* @src: The string to append to it
|
|
||||||
*/
|
|
||||||
char * strcat(char * dest, const char * src)
|
|
||||||
{
|
|
||||||
char *tmp = dest;
|
|
||||||
|
|
||||||
while (*dest)
|
|
||||||
dest++;
|
|
||||||
while ((*dest++ = *src++) != '\0')
|
|
||||||
;
|
|
||||||
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRNCAT
|
|
||||||
/**
|
|
||||||
* strncat - Append a length-limited, %NUL-terminated string to another
|
|
||||||
* @dest: The string to be appended to
|
|
||||||
* @src: The string to append to it
|
|
||||||
* @count: The maximum numbers of bytes to copy
|
|
||||||
*
|
|
||||||
* Note that in contrast to strncpy, strncat ensures the result is
|
|
||||||
* terminated.
|
|
||||||
*/
|
|
||||||
char * strncat(char *dest, const char *src, size_t count)
|
|
||||||
{
|
|
||||||
char *tmp = dest;
|
|
||||||
|
|
||||||
if (count) {
|
|
||||||
while (*dest)
|
|
||||||
dest++;
|
|
||||||
while ((*dest++ = *src++)) {
|
|
||||||
if (--count == 0) {
|
|
||||||
*dest = '\0';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRCMP
|
|
||||||
/**
|
|
||||||
* strcmp - Compare two strings
|
|
||||||
* @cs: One string
|
|
||||||
* @ct: Another string
|
|
||||||
*/
|
|
||||||
int strcmp(const char * cs,const char * ct)
|
|
||||||
{
|
|
||||||
register signed char __res;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if ((__res = *cs - *ct++) != 0 || !*cs++)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRNCMP
|
|
||||||
/**
|
|
||||||
* strncmp - Compare two length-limited strings
|
|
||||||
* @cs: One string
|
|
||||||
* @ct: Another string
|
|
||||||
* @count: The maximum number of bytes to compare
|
|
||||||
*/
|
|
||||||
int strncmp(const char * cs,const char * ct,size_t count)
|
|
||||||
{
|
|
||||||
register signed char __res = 0;
|
|
||||||
|
|
||||||
while (count) {
|
|
||||||
if ((__res = *cs - *ct++) != 0 || !*cs++)
|
|
||||||
break;
|
|
||||||
count--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRCHR
|
|
||||||
/**
|
|
||||||
* strchr - Find the first occurrence of a character in a string
|
|
||||||
* @s: The string to be searched
|
|
||||||
* @c: The character to search for
|
|
||||||
*/
|
|
||||||
char * strchr(const char * s, int c)
|
|
||||||
{
|
|
||||||
for(; *s != (char) c; ++s)
|
|
||||||
if (*s == '\0')
|
|
||||||
return NULL;
|
|
||||||
return (char *) s;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRRCHR
|
|
||||||
/**
|
|
||||||
* strrchr - Find the last occurrence of a character in a string
|
|
||||||
* @s: The string to be searched
|
|
||||||
* @c: The character to search for
|
|
||||||
*/
|
|
||||||
char * strrchr(const char * s, int c)
|
|
||||||
{
|
|
||||||
const char *p = s + strlen(s);
|
|
||||||
do {
|
|
||||||
if (*p == (char)c)
|
|
||||||
return (char *)p;
|
|
||||||
} while (--p >= s);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRLEN
|
|
||||||
/**
|
|
||||||
* strlen - Find the length of a string
|
|
||||||
* @s: The string to be sized
|
|
||||||
*/
|
|
||||||
size_t strlen(const char * s)
|
|
||||||
{
|
|
||||||
const char *sc;
|
|
||||||
|
|
||||||
for (sc = s; *sc != '\0'; ++sc)
|
|
||||||
/* nothing */;
|
|
||||||
return sc - s;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRNLEN
|
|
||||||
/**
|
|
||||||
* strnlen - Find the length of a length-limited string
|
|
||||||
* @s: The string to be sized
|
|
||||||
* @count: The maximum number of bytes to search
|
|
||||||
*/
|
|
||||||
size_t strnlen(const char * s, size_t count)
|
|
||||||
{
|
|
||||||
const char *sc;
|
|
||||||
|
|
||||||
for (sc = s; count-- && *sc != '\0'; ++sc)
|
|
||||||
/* nothing */;
|
|
||||||
return sc - s;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRDUP
|
|
||||||
char * strdup(const char *s)
|
|
||||||
{
|
|
||||||
char *new;
|
|
||||||
|
|
||||||
if ((s == NULL) ||
|
|
||||||
((new = malloc (strlen(s) + 1)) == NULL) ) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy (new, s);
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRSPN
|
|
||||||
/**
|
|
||||||
* strspn - Calculate the length of the initial substring of @s which only
|
|
||||||
* contain letters in @accept
|
|
||||||
* @s: The string to be searched
|
|
||||||
* @accept: The string to search for
|
|
||||||
*/
|
|
||||||
size_t strspn(const char *s, const char *accept)
|
|
||||||
{
|
|
||||||
const char *p;
|
|
||||||
const char *a;
|
|
||||||
size_t count = 0;
|
|
||||||
|
|
||||||
for (p = s; *p != '\0'; ++p) {
|
|
||||||
for (a = accept; *a != '\0'; ++a) {
|
|
||||||
if (*p == *a)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (*a == '\0')
|
|
||||||
return count;
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRPBRK
|
|
||||||
/**
|
|
||||||
* strpbrk - Find the first occurrence of a set of characters
|
|
||||||
* @cs: The string to be searched
|
|
||||||
* @ct: The characters to search for
|
|
||||||
*/
|
|
||||||
char * strpbrk(const char * cs,const char * ct)
|
|
||||||
{
|
|
||||||
const char *sc1,*sc2;
|
|
||||||
|
|
||||||
for( sc1 = cs; *sc1 != '\0'; ++sc1) {
|
|
||||||
for( sc2 = ct; *sc2 != '\0'; ++sc2) {
|
|
||||||
if (*sc1 == *sc2)
|
|
||||||
return (char *) sc1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRTOK
|
|
||||||
/**
|
|
||||||
* strtok - Split a string into tokens
|
|
||||||
* @s: The string to be searched
|
|
||||||
* @ct: The characters to search for
|
|
||||||
*
|
|
||||||
* WARNING: strtok is deprecated, use strsep instead.
|
|
||||||
*/
|
|
||||||
char * strtok(char * s,const char * ct)
|
|
||||||
{
|
|
||||||
char *sbegin, *send;
|
|
||||||
|
|
||||||
sbegin = s ? s : ___strtok;
|
|
||||||
if (!sbegin) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
sbegin += strspn(sbegin,ct);
|
|
||||||
if (*sbegin == '\0') {
|
|
||||||
___strtok = NULL;
|
|
||||||
return( NULL );
|
|
||||||
}
|
|
||||||
send = strpbrk( sbegin, ct);
|
|
||||||
if (send && *send != '\0')
|
|
||||||
*send++ = '\0';
|
|
||||||
___strtok = send;
|
|
||||||
return (sbegin);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRSEP
|
|
||||||
/**
|
|
||||||
* strsep - Split a string into tokens
|
|
||||||
* @s: The string to be searched
|
|
||||||
* @ct: The characters to search for
|
|
||||||
*
|
|
||||||
* strsep() updates @s to point after the token, ready for the next call.
|
|
||||||
*
|
|
||||||
* It returns empty tokens, too, behaving exactly like the libc function
|
|
||||||
* of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
|
|
||||||
* Same semantics, slimmer shape. ;)
|
|
||||||
*/
|
|
||||||
char * strsep(char **s, const char *ct)
|
|
||||||
{
|
|
||||||
char *sbegin = *s, *end;
|
|
||||||
|
|
||||||
if (sbegin == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
end = strpbrk(sbegin, ct);
|
|
||||||
if (end)
|
|
||||||
*end++ = '\0';
|
|
||||||
*s = end;
|
|
||||||
|
|
||||||
return sbegin;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRSWAB
|
|
||||||
/**
|
|
||||||
* strswab - swap adjacent even and odd bytes in %NUL-terminated string
|
|
||||||
* s: address of the string
|
|
||||||
*
|
|
||||||
* returns the address of the swapped string or NULL on error. If
|
|
||||||
* string length is odd, last byte is untouched.
|
|
||||||
*/
|
|
||||||
char *strswab(const char *s)
|
|
||||||
{
|
|
||||||
char *p, *q;
|
|
||||||
|
|
||||||
if ((NULL == s) || ('\0' == *s)) {
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (p=(char *)s, q=p+1; (*p != '\0') && (*q != '\0'); p+=2, q+=2) {
|
|
||||||
char tmp;
|
|
||||||
|
|
||||||
tmp = *p;
|
|
||||||
*p = *q;
|
|
||||||
*q = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (char *) s;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_MEMSET
|
|
||||||
/**
|
|
||||||
* memset - Fill a region of memory with the given value
|
|
||||||
* @s: Pointer to the start of the area.
|
|
||||||
* @c: The byte to fill the area with
|
|
||||||
* @count: The size of the area.
|
|
||||||
*
|
|
||||||
* Do not use memset() to access IO space, use memset_io() instead.
|
|
||||||
*/
|
|
||||||
void * memset(void * s,int c,size_t count)
|
|
||||||
{
|
|
||||||
char *xs = (char *) s;
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
*xs++ = c;
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_BCOPY
|
|
||||||
/**
|
|
||||||
* bcopy - Copy one area of memory to another
|
|
||||||
* @src: Where to copy from
|
|
||||||
* @dest: Where to copy to
|
|
||||||
* @count: The size of the area.
|
|
||||||
*
|
|
||||||
* Note that this is the same as memcpy(), with the arguments reversed.
|
|
||||||
* memcpy() is the standard, bcopy() is a legacy BSD function.
|
|
||||||
*
|
|
||||||
* You should not use this function to access IO space, use memcpy_toio()
|
|
||||||
* or memcpy_fromio() instead.
|
|
||||||
*/
|
|
||||||
char * bcopy(const char * src, char * dest, int count)
|
|
||||||
{
|
|
||||||
char *tmp = dest;
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
*tmp++ = *src++;
|
|
||||||
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_MEMCPY
|
|
||||||
/**
|
|
||||||
* memcpy - Copy one area of memory to another
|
|
||||||
* @dest: Where to copy to
|
|
||||||
* @src: Where to copy from
|
|
||||||
* @count: The size of the area.
|
|
||||||
*
|
|
||||||
* You should not use this function to access IO space, use memcpy_toio()
|
|
||||||
* or memcpy_fromio() instead.
|
|
||||||
*/
|
|
||||||
void * memcpy(void * dest,const void *src,size_t count)
|
|
||||||
{
|
|
||||||
char *tmp = (char *) dest, *s = (char *) src;
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
*tmp++ = *s++;
|
|
||||||
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_MEMMOVE
|
|
||||||
/**
|
|
||||||
* memmove - Copy one area of memory to another
|
|
||||||
* @dest: Where to copy to
|
|
||||||
* @src: Where to copy from
|
|
||||||
* @count: The size of the area.
|
|
||||||
*
|
|
||||||
* Unlike memcpy(), memmove() copes with overlapping areas.
|
|
||||||
*/
|
|
||||||
void * memmove(void * dest,const void *src,size_t count)
|
|
||||||
{
|
|
||||||
char *tmp, *s;
|
|
||||||
|
|
||||||
if (dest <= src) {
|
|
||||||
tmp = (char *) dest;
|
|
||||||
s = (char *) src;
|
|
||||||
while (count--)
|
|
||||||
*tmp++ = *s++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
tmp = (char *) dest + count;
|
|
||||||
s = (char *) src + count;
|
|
||||||
while (count--)
|
|
||||||
*--tmp = *--s;
|
|
||||||
}
|
|
||||||
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_MEMCMP
|
|
||||||
/**
|
|
||||||
* memcmp - Compare two areas of memory
|
|
||||||
* @cs: One area of memory
|
|
||||||
* @ct: Another area of memory
|
|
||||||
* @count: The size of the area.
|
|
||||||
*/
|
|
||||||
int memcmp(const void * cs,const void * ct,size_t count)
|
|
||||||
{
|
|
||||||
const unsigned char *su1, *su2;
|
|
||||||
int res = 0;
|
|
||||||
|
|
||||||
for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
|
|
||||||
if ((res = *su1 - *su2) != 0)
|
|
||||||
break;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_MEMSCAN
|
|
||||||
/**
|
|
||||||
* memscan - Find a character in an area of memory.
|
|
||||||
* @addr: The memory area
|
|
||||||
* @c: The byte to search for
|
|
||||||
* @size: The size of the area.
|
|
||||||
*
|
|
||||||
* returns the address of the first occurrence of @c, or 1 byte past
|
|
||||||
* the area if @c is not found
|
|
||||||
*/
|
|
||||||
void * memscan(void * addr, int c, size_t size)
|
|
||||||
{
|
|
||||||
unsigned char * p = (unsigned char *) addr;
|
|
||||||
|
|
||||||
while (size) {
|
|
||||||
if (*p == c)
|
|
||||||
return (void *) p;
|
|
||||||
p++;
|
|
||||||
size--;
|
|
||||||
}
|
|
||||||
return (void *) p;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_STRSTR
|
|
||||||
/**
|
|
||||||
* strstr - Find the first substring in a %NUL terminated string
|
|
||||||
* @s1: The string to be searched
|
|
||||||
* @s2: The string to search for
|
|
||||||
*/
|
|
||||||
char * strstr(const char * s1,const char * s2)
|
|
||||||
{
|
|
||||||
int l1, l2;
|
|
||||||
|
|
||||||
l2 = strlen(s2);
|
|
||||||
if (!l2)
|
|
||||||
return (char *) s1;
|
|
||||||
l1 = strlen(s1);
|
|
||||||
while (l1 >= l2) {
|
|
||||||
l1--;
|
|
||||||
if (!memcmp(s1,s2,l2))
|
|
||||||
return (char *) s1;
|
|
||||||
s1++;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_MEMCHR
|
|
||||||
/**
|
|
||||||
* memchr - Find a character in an area of memory.
|
|
||||||
* @s: The memory area
|
|
||||||
* @c: The byte to search for
|
|
||||||
* @n: The size of the area.
|
|
||||||
*
|
|
||||||
* returns the address of the first occurrence of @c, or %NULL
|
|
||||||
* if @c is not found
|
|
||||||
*/
|
|
||||||
void *memchr(const void *s, int c, size_t n)
|
|
||||||
{
|
|
||||||
const unsigned char *p = s;
|
|
||||||
while (n-- != 0) {
|
|
||||||
if ((unsigned char)c == *p++) {
|
|
||||||
return (void *)(p-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2003
|
|
||||||
* 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 <common.h>
|
|
||||||
|
|
||||||
|
|
||||||
static inline void mips_compare_set(u32 v)
|
|
||||||
{
|
|
||||||
asm volatile ("mtc0 %0, $11" : : "r" (v));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void mips_count_set(u32 v)
|
|
||||||
{
|
|
||||||
asm volatile ("mtc0 %0, $9" : : "r" (v));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static inline u32 mips_count_get(void)
|
|
||||||
{
|
|
||||||
u32 count;
|
|
||||||
|
|
||||||
asm volatile ("mfc0 %0, $9" : "=r" (count) :);
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* timer without interrupts
|
|
||||||
*/
|
|
||||||
|
|
||||||
int timer_init(void)
|
|
||||||
{
|
|
||||||
mips_compare_set(0);
|
|
||||||
mips_count_set(0);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset_timer(void)
|
|
||||||
{
|
|
||||||
mips_count_set(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong get_timer(ulong base)
|
|
||||||
{
|
|
||||||
return mips_count_get() - base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_timer(ulong t)
|
|
||||||
{
|
|
||||||
mips_count_set(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
void udelay (unsigned long usec)
|
|
||||||
{
|
|
||||||
ulong tmo;
|
|
||||||
ulong start = get_timer(0);
|
|
||||||
|
|
||||||
tmo = usec * (CFG_HZ / 1000000);
|
|
||||||
while ((ulong)((mips_count_get() - start)) < tmo)
|
|
||||||
/*NOP*/;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function is derived from PowerPC code (read timebase as long long).
|
|
||||||
* On MIPS it just returns the timer value.
|
|
||||||
*/
|
|
||||||
unsigned long long get_ticks(void)
|
|
||||||
{
|
|
||||||
return mips_count_get();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function is derived from PowerPC code (timebase clock frequency).
|
|
||||||
* On MIPS it returns the number of timer ticks per second.
|
|
||||||
*/
|
|
||||||
ulong get_tbclk(void)
|
|
||||||
{
|
|
||||||
return CFG_HZ;
|
|
||||||
}
|
|
|
@ -1,385 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/lib/vsprintf.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
|
|
||||||
/*
|
|
||||||
* Wirzenius wrote this portably, Torvalds fucked it up :-)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
#include <linux/ctype.h>
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#if !defined (CONFIG_PANIC_HANG)
|
|
||||||
#include <command.h>
|
|
||||||
/*cmd_boot.c*/
|
|
||||||
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
|
|
||||||
{
|
|
||||||
unsigned long result = 0,value;
|
|
||||||
|
|
||||||
if (*cp == '0') {
|
|
||||||
cp++;
|
|
||||||
if ((*cp == 'x') && isxdigit(cp[1])) {
|
|
||||||
base = 16;
|
|
||||||
cp++;
|
|
||||||
}
|
|
||||||
if (!base) {
|
|
||||||
base = 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!base) {
|
|
||||||
base = 10;
|
|
||||||
}
|
|
||||||
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
|
|
||||||
? toupper(*cp) : *cp)-'A'+10) < base) {
|
|
||||||
result = result*base + value;
|
|
||||||
cp++;
|
|
||||||
}
|
|
||||||
if (endp)
|
|
||||||
*endp = (char *)cp;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
long simple_strtol(const char *cp,char **endp,unsigned int base)
|
|
||||||
{
|
|
||||||
if(*cp=='-')
|
|
||||||
return -simple_strtoul(cp+1,endp,base);
|
|
||||||
return simple_strtoul(cp,endp,base);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CFG_64BIT_STRTOUL
|
|
||||||
unsigned long long simple_strtoull (const char *cp, char **endp, unsigned int base)
|
|
||||||
{
|
|
||||||
unsigned long long result = 0, value;
|
|
||||||
|
|
||||||
if (*cp == '0') {
|
|
||||||
cp++;
|
|
||||||
if ((*cp == 'x') && isxdigit (cp[1])) {
|
|
||||||
base = 16;
|
|
||||||
cp++;
|
|
||||||
}
|
|
||||||
if (!base) {
|
|
||||||
base = 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!base) {
|
|
||||||
base = 10;
|
|
||||||
}
|
|
||||||
while (isxdigit (*cp) && (value = isdigit (*cp)
|
|
||||||
? *cp - '0'
|
|
||||||
: (islower (*cp) ? toupper (*cp) : *cp) - 'A' + 10) < base) {
|
|
||||||
result = result * base + value;
|
|
||||||
cp++;
|
|
||||||
}
|
|
||||||
if (endp)
|
|
||||||
*endp = (char *) cp;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif /* CFG_64BIT_STRTOUL */
|
|
||||||
|
|
||||||
/* we use this so that we can do without the ctype library */
|
|
||||||
#define is_digit(c) ((c) >= '0' && (c) <= '9')
|
|
||||||
|
|
||||||
static int skip_atoi(const char **s)
|
|
||||||
{
|
|
||||||
int i=0;
|
|
||||||
|
|
||||||
while (is_digit(**s))
|
|
||||||
i = i*10 + *((*s)++) - '0';
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ZEROPAD 1 /* pad with zero */
|
|
||||||
#define SIGN 2 /* unsigned/signed long */
|
|
||||||
#define PLUS 4 /* show plus */
|
|
||||||
#define SPACE 8 /* space if plus */
|
|
||||||
#define LEFT 16 /* left justified */
|
|
||||||
#define SPECIAL 32 /* 0x */
|
|
||||||
#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
|
|
||||||
|
|
||||||
#define do_div(n,base) ({ \
|
|
||||||
int __res; \
|
|
||||||
__res = ((unsigned long) n) % (unsigned) base; \
|
|
||||||
n = ((unsigned long) n) / (unsigned) base; \
|
|
||||||
__res; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#ifdef CFG_64BIT_VSPRINTF
|
|
||||||
static char * number(char * str, long long num, int base, int size, int precision ,int type)
|
|
||||||
#else
|
|
||||||
static char * number(char * str, long num, int base, int size, int precision ,int type)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
char c,sign,tmp[66];
|
|
||||||
const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (type & LARGE)
|
|
||||||
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
||||||
if (type & LEFT)
|
|
||||||
type &= ~ZEROPAD;
|
|
||||||
if (base < 2 || base > 36)
|
|
||||||
return 0;
|
|
||||||
c = (type & ZEROPAD) ? '0' : ' ';
|
|
||||||
sign = 0;
|
|
||||||
if (type & SIGN) {
|
|
||||||
if (num < 0) {
|
|
||||||
sign = '-';
|
|
||||||
num = -num;
|
|
||||||
size--;
|
|
||||||
} else if (type & PLUS) {
|
|
||||||
sign = '+';
|
|
||||||
size--;
|
|
||||||
} else if (type & SPACE) {
|
|
||||||
sign = ' ';
|
|
||||||
size--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (type & SPECIAL) {
|
|
||||||
if (base == 16)
|
|
||||||
size -= 2;
|
|
||||||
else if (base == 8)
|
|
||||||
size--;
|
|
||||||
}
|
|
||||||
i = 0;
|
|
||||||
if (num == 0)
|
|
||||||
tmp[i++]='0';
|
|
||||||
else while (num != 0)
|
|
||||||
tmp[i++] = digits[do_div(num,base)];
|
|
||||||
if (i > precision)
|
|
||||||
precision = i;
|
|
||||||
size -= precision;
|
|
||||||
if (!(type&(ZEROPAD+LEFT)))
|
|
||||||
while(size-->0)
|
|
||||||
*str++ = ' ';
|
|
||||||
if (sign)
|
|
||||||
*str++ = sign;
|
|
||||||
if (type & SPECIAL) {
|
|
||||||
if (base==8)
|
|
||||||
*str++ = '0';
|
|
||||||
else if (base==16) {
|
|
||||||
*str++ = '0';
|
|
||||||
*str++ = digits[33];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(type & LEFT))
|
|
||||||
while (size-- > 0)
|
|
||||||
*str++ = c;
|
|
||||||
while (i < precision--)
|
|
||||||
*str++ = '0';
|
|
||||||
while (i-- > 0)
|
|
||||||
*str++ = tmp[i];
|
|
||||||
while (size-- > 0)
|
|
||||||
*str++ = ' ';
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Forward decl. needed for IP address printing stuff... */
|
|
||||||
int sprintf(char * buf, const char *fmt, ...);
|
|
||||||
|
|
||||||
int vsprintf(char *buf, const char *fmt, va_list args)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
#ifdef CFG_64BIT_VSPRINTF
|
|
||||||
unsigned long long num;
|
|
||||||
#else
|
|
||||||
unsigned long num;
|
|
||||||
#endif
|
|
||||||
int i, base;
|
|
||||||
char * str;
|
|
||||||
const char *s;
|
|
||||||
|
|
||||||
int flags; /* flags to number() */
|
|
||||||
|
|
||||||
int field_width; /* width of output field */
|
|
||||||
int precision; /* min. # of digits for integers; max
|
|
||||||
number of chars for from string */
|
|
||||||
int qualifier; /* 'h', 'l', or 'q' for integer fields */
|
|
||||||
|
|
||||||
for (str=buf ; *fmt ; ++fmt) {
|
|
||||||
if (*fmt != '%') {
|
|
||||||
*str++ = *fmt;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process flags */
|
|
||||||
flags = 0;
|
|
||||||
repeat:
|
|
||||||
++fmt; /* this also skips first '%' */
|
|
||||||
switch (*fmt) {
|
|
||||||
case '-': flags |= LEFT; goto repeat;
|
|
||||||
case '+': flags |= PLUS; goto repeat;
|
|
||||||
case ' ': flags |= SPACE; goto repeat;
|
|
||||||
case '#': flags |= SPECIAL; goto repeat;
|
|
||||||
case '0': flags |= ZEROPAD; goto repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get field width */
|
|
||||||
field_width = -1;
|
|
||||||
if (is_digit(*fmt))
|
|
||||||
field_width = skip_atoi(&fmt);
|
|
||||||
else if (*fmt == '*') {
|
|
||||||
++fmt;
|
|
||||||
/* it's the next argument */
|
|
||||||
field_width = va_arg(args, int);
|
|
||||||
if (field_width < 0) {
|
|
||||||
field_width = -field_width;
|
|
||||||
flags |= LEFT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the precision */
|
|
||||||
precision = -1;
|
|
||||||
if (*fmt == '.') {
|
|
||||||
++fmt;
|
|
||||||
if (is_digit(*fmt))
|
|
||||||
precision = skip_atoi(&fmt);
|
|
||||||
else if (*fmt == '*') {
|
|
||||||
++fmt;
|
|
||||||
/* it's the next argument */
|
|
||||||
precision = va_arg(args, int);
|
|
||||||
}
|
|
||||||
if (precision < 0)
|
|
||||||
precision = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the conversion qualifier */
|
|
||||||
qualifier = -1;
|
|
||||||
if (*fmt == 'h' || *fmt == 'l' || *fmt == 'q') {
|
|
||||||
qualifier = *fmt;
|
|
||||||
++fmt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* default base */
|
|
||||||
base = 10;
|
|
||||||
|
|
||||||
switch (*fmt) {
|
|
||||||
case 'c':
|
|
||||||
if (!(flags & LEFT))
|
|
||||||
while (--field_width > 0)
|
|
||||||
*str++ = ' ';
|
|
||||||
*str++ = (unsigned char) va_arg(args, int);
|
|
||||||
while (--field_width > 0)
|
|
||||||
*str++ = ' ';
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 's':
|
|
||||||
s = va_arg(args, char *);
|
|
||||||
if (!s)
|
|
||||||
s = "<NULL>";
|
|
||||||
|
|
||||||
len = strnlen(s, precision);
|
|
||||||
|
|
||||||
if (!(flags & LEFT))
|
|
||||||
while (len < field_width--)
|
|
||||||
*str++ = ' ';
|
|
||||||
for (i = 0; i < len; ++i)
|
|
||||||
*str++ = *s++;
|
|
||||||
while (len < field_width--)
|
|
||||||
*str++ = ' ';
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 'p':
|
|
||||||
if (field_width == -1) {
|
|
||||||
field_width = 2*sizeof(void *);
|
|
||||||
flags |= ZEROPAD;
|
|
||||||
}
|
|
||||||
str = number(str,
|
|
||||||
(unsigned long) va_arg(args, void *), 16,
|
|
||||||
field_width, precision, flags);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
|
||||||
case 'n':
|
|
||||||
if (qualifier == 'l') {
|
|
||||||
long * ip = va_arg(args, long *);
|
|
||||||
*ip = (str - buf);
|
|
||||||
} else {
|
|
||||||
int * ip = va_arg(args, int *);
|
|
||||||
*ip = (str - buf);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case '%':
|
|
||||||
*str++ = '%';
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* integer number formats - set up the flags and "break" */
|
|
||||||
case 'o':
|
|
||||||
base = 8;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'X':
|
|
||||||
flags |= LARGE;
|
|
||||||
case 'x':
|
|
||||||
base = 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'd':
|
|
||||||
case 'i':
|
|
||||||
flags |= SIGN;
|
|
||||||
case 'u':
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
*str++ = '%';
|
|
||||||
if (*fmt)
|
|
||||||
*str++ = *fmt;
|
|
||||||
else
|
|
||||||
--fmt;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#ifdef CFG_64BIT_VSPRINTF
|
|
||||||
if (qualifier == 'q') /* "quad" for 64 bit variables */
|
|
||||||
num = va_arg(args, unsigned long long);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
if (qualifier == 'l')
|
|
||||||
num = va_arg(args, unsigned long);
|
|
||||||
else if (qualifier == 'h') {
|
|
||||||
num = (unsigned short) va_arg(args, int);
|
|
||||||
if (flags & SIGN)
|
|
||||||
num = (short) num;
|
|
||||||
} else if (flags & SIGN)
|
|
||||||
num = va_arg(args, int);
|
|
||||||
else
|
|
||||||
num = va_arg(args, unsigned int);
|
|
||||||
str = number(str, num, base, field_width, precision, flags);
|
|
||||||
}
|
|
||||||
*str = '\0';
|
|
||||||
return str-buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sprintf(char * buf, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
va_start(args, fmt);
|
|
||||||
i=vsprintf(buf,fmt,args);
|
|
||||||
va_end(args);
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
void panic(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
va_start(args, fmt);
|
|
||||||
vprintf(fmt, args);
|
|
||||||
putc('\n');
|
|
||||||
va_end(args);
|
|
||||||
#if defined (CONFIG_PANIC_HANG)
|
|
||||||
hang();
|
|
||||||
#else
|
|
||||||
udelay (100000); /* allow messages to go out */
|
|
||||||
do_reset (NULL, 0, 0, NULL);
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -19,6 +19,9 @@
|
||||||
to this file, however, are subject to the LGPL or CPL terms.
|
to this file, however, are subject to the LGPL or CPL terms.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
#ifdef CONFIG_LZMA
|
#ifdef CONFIG_LZMA
|
||||||
|
|
||||||
#include "LzmaDecode.h"
|
#include "LzmaDecode.h"
|
||||||
|
@ -37,22 +40,31 @@
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
#ifdef _LZMA_IN_CB
|
||||||
|
|
||||||
|
#ifndef CFG_BOOTSTRAP_CODE
|
||||||
#define RC_TEST { if (Buffer == BufferLim) \
|
#define RC_TEST { if (Buffer == BufferLim) \
|
||||||
{ SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return result; } \
|
{ SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return result; } \
|
||||||
BufferLim = Buffer + size; if (size == 0) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return LZMA_RESULT_DATA_ERROR; } }}
|
BufferLim = Buffer + size; if (size == 0) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return LZMA_RESULT_DATA_ERROR; } }}
|
||||||
|
#else //CFG_BOOTSTRAP_CODE
|
||||||
|
#define RC_TEST { if (Buffer == BufferLim) \
|
||||||
|
{ SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) { return result; } \
|
||||||
|
BufferLim = Buffer + size; if (size == 0) { return LZMA_RESULT_DATA_ERROR; } }}
|
||||||
|
#endif //CFG_BOOTSTRAP_CODE
|
||||||
|
|
||||||
#define RC_INIT Buffer = BufferLim = 0; RC_INIT2
|
#define RC_INIT Buffer = BufferLim = 0; RC_INIT2
|
||||||
|
|
||||||
#else
|
#else //_LZMA_IN_CB
|
||||||
|
|
||||||
|
#ifndef CFG_BOOTSTRAP_CODE
|
||||||
#define RC_TEST { if (Buffer == BufferLim) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return LZMA_RESULT_DATA_ERROR; } }
|
#define RC_TEST { if (Buffer == BufferLim) { printf("ERROR, %s, %d\n", __FILE__, __LINE__); return LZMA_RESULT_DATA_ERROR; } }
|
||||||
|
#else //CFG_BOOTSTRAP_CODE
|
||||||
|
#define RC_TEST { if (Buffer == BufferLim) { return LZMA_RESULT_DATA_ERROR; } }
|
||||||
|
#endif //CFG_BOOTSTRAP_CODE
|
||||||
|
|
||||||
#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
|
#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
|
||||||
|
|
||||||
#endif
|
#endif //_LZMA_IN_CB
|
||||||
|
|
||||||
#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
|
#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
|
||||||
|
|
||||||
#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
|
#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
|
||||||
#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
|
#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
|
||||||
#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
|
#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
|
||||||
|
@ -124,13 +136,17 @@ int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsDa
|
||||||
unsigned char prop0;
|
unsigned char prop0;
|
||||||
if (size < LZMA_PROPERTIES_SIZE)
|
if (size < LZMA_PROPERTIES_SIZE)
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
prop0 = propsData[0];
|
prop0 = propsData[0];
|
||||||
if (prop0 >= (9 * 5 * 5))
|
if (prop0 >= (9 * 5 * 5))
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -380,7 +396,9 @@ int LzmaDecode(CLzmaDecoderState *vs,
|
||||||
if (nowPos == 0)
|
if (nowPos == 0)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,7 +558,9 @@ int LzmaDecode(CLzmaDecoderState *vs,
|
||||||
if (rep0 > nowPos)
|
if (rep0 > nowPos)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
printf("ERROR: %s, %d\n", __FILE__, __LINE__);
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,113 +0,0 @@
|
||||||
/*
|
|
||||||
LzmaDecode.h
|
|
||||||
LZMA Decoder interface
|
|
||||||
|
|
||||||
LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01)
|
|
||||||
http://www.7-zip.org/
|
|
||||||
|
|
||||||
LZMA SDK is licensed under two licenses:
|
|
||||||
1) GNU Lesser General Public License (GNU LGPL)
|
|
||||||
2) Common Public License (CPL)
|
|
||||||
It means that you can select one of these two licenses and
|
|
||||||
follow rules of that license.
|
|
||||||
|
|
||||||
SPECIAL EXCEPTION:
|
|
||||||
Igor Pavlov, as the author of this code, expressly permits you to
|
|
||||||
statically or dynamically link your code (or bind by name) to the
|
|
||||||
interfaces of this file without subjecting your linked code to the
|
|
||||||
terms of the CPL or GNU LGPL. Any modifications or additions
|
|
||||||
to this file, however, are subject to the LGPL or CPL terms.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LZMADECODE_H
|
|
||||||
#define __LZMADECODE_H
|
|
||||||
|
|
||||||
#include "LzmaTypes.h"
|
|
||||||
|
|
||||||
/* #define _LZMA_IN_CB */
|
|
||||||
/* Use callback for input data */
|
|
||||||
|
|
||||||
/* #define _LZMA_OUT_READ */
|
|
||||||
/* Use read function for output data */
|
|
||||||
|
|
||||||
/* #define _LZMA_PROB32 */
|
|
||||||
/* It can increase speed on some 32-bit CPUs,
|
|
||||||
but memory usage will be doubled in that case */
|
|
||||||
|
|
||||||
/* #define _LZMA_LOC_OPT */
|
|
||||||
/* Enable local speed optimizations inside code */
|
|
||||||
|
|
||||||
#ifdef _LZMA_PROB32
|
|
||||||
#define CProb UInt32
|
|
||||||
#else
|
|
||||||
#define CProb UInt16
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define LZMA_RESULT_OK 0
|
|
||||||
#define LZMA_RESULT_DATA_ERROR 1
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
typedef struct _ILzmaInCallback
|
|
||||||
{
|
|
||||||
int (*Read)(void *object, const unsigned char **buffer, SizeT *bufferSize);
|
|
||||||
} ILzmaInCallback;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define LZMA_BASE_SIZE 1846
|
|
||||||
#define LZMA_LIT_SIZE 768
|
|
||||||
|
|
||||||
#define LZMA_PROPERTIES_SIZE 5
|
|
||||||
|
|
||||||
typedef struct _CLzmaProperties
|
|
||||||
{
|
|
||||||
int lc;
|
|
||||||
int lp;
|
|
||||||
int pb;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
UInt32 DictionarySize;
|
|
||||||
#endif
|
|
||||||
}CLzmaProperties;
|
|
||||||
|
|
||||||
int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size);
|
|
||||||
|
|
||||||
#define LzmaGetNumProbs(Properties) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp)))
|
|
||||||
|
|
||||||
#define kLzmaNeedInitId (-2)
|
|
||||||
|
|
||||||
typedef struct _CLzmaDecoderState
|
|
||||||
{
|
|
||||||
CLzmaProperties Properties;
|
|
||||||
CProb *Probs;
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
const unsigned char *Buffer;
|
|
||||||
const unsigned char *BufferLim;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
unsigned char *Dictionary;
|
|
||||||
UInt32 Range;
|
|
||||||
UInt32 Code;
|
|
||||||
UInt32 DictionaryPos;
|
|
||||||
UInt32 GlobalPos;
|
|
||||||
UInt32 DistanceLimit;
|
|
||||||
UInt32 Reps[4];
|
|
||||||
int State;
|
|
||||||
int RemainLen;
|
|
||||||
unsigned char TempDictionary[4];
|
|
||||||
#endif
|
|
||||||
} CLzmaDecoderState;
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
#define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int LzmaDecode(CLzmaDecoderState *vs,
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
ILzmaInCallback *inCallback,
|
|
||||||
#else
|
|
||||||
const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
|
|
||||||
#endif
|
|
||||||
unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
LzmaTypes.h
|
|
||||||
|
|
||||||
Types for LZMA Decoder
|
|
||||||
|
|
||||||
This file written and distributed to public domain by Igor Pavlov.
|
|
||||||
This file is part of LZMA SDK 4.40 (2006-05-01)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LZMATYPES_H
|
|
||||||
#define __LZMATYPES_H
|
|
||||||
|
|
||||||
#ifndef _7ZIP_BYTE_DEFINED
|
|
||||||
#define _7ZIP_BYTE_DEFINED
|
|
||||||
typedef unsigned char Byte;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _7ZIP_UINT16_DEFINED
|
|
||||||
#define _7ZIP_UINT16_DEFINED
|
|
||||||
typedef unsigned short UInt16;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _7ZIP_UINT32_DEFINED
|
|
||||||
#define _7ZIP_UINT32_DEFINED
|
|
||||||
#ifdef _LZMA_UINT32_IS_ULONG
|
|
||||||
typedef unsigned long UInt32;
|
|
||||||
#else
|
|
||||||
typedef unsigned int UInt32;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* #define _LZMA_SYSTEM_SIZE_T */
|
|
||||||
/* Use system's size_t. You can use it to enable 64-bit sizes supporting */
|
|
||||||
|
|
||||||
#ifndef _7ZIP_SIZET_DEFINED
|
|
||||||
#define _7ZIP_SIZET_DEFINED
|
|
||||||
#ifdef _LZMA_SYSTEM_SIZE_T
|
|
||||||
#include <stddef.h>
|
|
||||||
typedef size_t SizeT;
|
|
||||||
#else
|
|
||||||
typedef UInt32 SizeT;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -20,6 +20,7 @@
|
||||||
** $Date $Author $Comment
|
** $Date $Author $Comment
|
||||||
** 2 Nov 2006 Lin Mars init version which derived from LzmaTest.c from
|
** 2 Nov 2006 Lin Mars init version which derived from LzmaTest.c from
|
||||||
** LZMA v4.43 SDK
|
** LZMA v4.43 SDK
|
||||||
|
** 24 May 2007 Lin Mars Fix issue for multiple lzma_inflate involved
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
#define LZMA_NO_STDIO
|
#define LZMA_NO_STDIO
|
||||||
#ifndef LZMA_NO_STDIO
|
#ifndef LZMA_NO_STDIO
|
||||||
|
@ -40,8 +41,10 @@
|
||||||
#include "LzmaDecode.h"
|
#include "LzmaDecode.h"
|
||||||
#include "LzmaWrapper.h"
|
#include "LzmaWrapper.h"
|
||||||
|
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
static const char *kCantReadMessage = "Can not read from source buffer";
|
static const char *kCantReadMessage = "Can not read from source buffer";
|
||||||
static const char *kCantAllocateMessage = "Not enough buffer for decompression";
|
static const char *kCantAllocateMessage = "Not enough buffer for decompression";
|
||||||
|
#endif
|
||||||
|
|
||||||
static size_t rpos=0, dpos=0;
|
static size_t rpos=0, dpos=0;
|
||||||
|
|
||||||
|
@ -76,9 +79,13 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
|
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
rpos=0; dpos=0;
|
||||||
|
|
||||||
if (sizeof(UInt32) < 4)
|
if (sizeof(UInt32) < 4)
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("LZMA decoder needs correct UInt32\n");
|
printf("LZMA decoder needs correct UInt32\n");
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +93,9 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
long length=s_len;
|
long length=s_len;
|
||||||
if ((long)(SizeT)length != length)
|
if ((long)(SizeT)length != length)
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("Too big compressed stream\n");
|
printf("Too big compressed stream\n");
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
compressedSize = (SizeT)(length - (LZMA_PROPERTIES_SIZE + 8));
|
compressedSize = (SizeT)(length - (LZMA_PROPERTIES_SIZE + 8));
|
||||||
|
@ -96,7 +105,9 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
|
|
||||||
if (!MyReadFileAndCheck(source, properties, sizeof(properties)))
|
if (!MyReadFileAndCheck(source, properties, sizeof(properties)))
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("%s\n", kCantReadMessage);
|
printf("%s\n", kCantReadMessage);
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +119,9 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
unsigned char b;
|
unsigned char b;
|
||||||
if (!MyReadFileAndCheck(source, &b, 1))
|
if (!MyReadFileAndCheck(source, &b, 1))
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("%s\n", kCantReadMessage);
|
printf("%s\n", kCantReadMessage);
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
if (b != 0xFF)
|
if (b != 0xFF)
|
||||||
|
@ -121,7 +134,9 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
|
|
||||||
if (waitEOS)
|
if (waitEOS)
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("Stream with EOS marker is not supported");
|
printf("Stream with EOS marker is not supported");
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
outSizeFull = (SizeT)outSize;
|
outSizeFull = (SizeT)outSize;
|
||||||
|
@ -129,7 +144,9 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
outSizeFull |= (((SizeT)outSizeHigh << 16) << 16);
|
outSizeFull |= (((SizeT)outSizeHigh << 16) << 16);
|
||||||
else if (outSizeHigh != 0 || (UInt32)(SizeT)outSize != outSize)
|
else if (outSizeHigh != 0 || (UInt32)(SizeT)outSize != outSize)
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("Too big uncompressed stream");
|
printf("Too big uncompressed stream");
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,7 +154,9 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
/* Decode LZMA properties and allocate memory */
|
/* Decode LZMA properties and allocate memory */
|
||||||
if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK)
|
if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK)
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("Incorrect stream properties");
|
printf("Incorrect stream properties");
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
|
state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
|
||||||
|
@ -168,7 +187,9 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
free(state.Probs);
|
free(state.Probs);
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("%s\n", kCantAllocateMessage);
|
printf("%s\n", kCantAllocateMessage);
|
||||||
|
#endif
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return LZMA_RESULT_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +202,9 @@ int lzma_inflate(unsigned char *source, int s_len, unsigned char *dest, int *d_l
|
||||||
outStream, outSizeFull, &outProcessed);
|
outStream, outSizeFull, &outProcessed);
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
|
||||||
printf("\nDecoding error = %d\n", res);
|
printf("\nDecoding error = %d\n", res);
|
||||||
|
#endif
|
||||||
res = 1;
|
res = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,778 +0,0 @@
|
||||||
/*
|
|
||||||
* NFS support driver - based on etherboot and U-BOOT's tftp.c
|
|
||||||
*
|
|
||||||
* Masami Komiya <mkomiya@sonare.it> 2004
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* NOTE: the NFS code is heavily inspired by the NetBSD netboot code (read:
|
|
||||||
* large portions are copied verbatim) as distributed in OSKit 0.97. A few
|
|
||||||
* changes were necessary to adapt the code to Etherboot and to fix several
|
|
||||||
* inconsistencies. Also the RPC message preparation is done "by hand" to
|
|
||||||
* avoid adding netsprintf() which I find hard to understand and use. */
|
|
||||||
|
|
||||||
/* NOTE 2: Etherboot does not care about things beyond the kernel image, so
|
|
||||||
* it loads the kernel image off the boot server (ARP_SERVER) and does not
|
|
||||||
* access the client root disk (root-path in dhcpd.conf), which would use
|
|
||||||
* ARP_ROOTSERVER. The root disk is something the operating system we are
|
|
||||||
* about to load needs to use. This is different from the OSKit 0.97 logic. */
|
|
||||||
|
|
||||||
/* NOTE 3: Symlink handling introduced by Anselm M Hoffmeister, 2003-July-14
|
|
||||||
* If a symlink is encountered, it is followed as far as possible (recursion
|
|
||||||
* possible, maximum 16 steps). There is no clearing of ".."'s inside the
|
|
||||||
* path, so please DON'T DO THAT. thx. */
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <command.h>
|
|
||||||
#include <net.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include "nfs.h"
|
|
||||||
#include "bootp.h"
|
|
||||||
|
|
||||||
/*#define NFS_DEBUG*/
|
|
||||||
|
|
||||||
#if ((CONFIG_COMMANDS & CFG_CMD_NET) && (CONFIG_COMMANDS & CFG_CMD_NFS))
|
|
||||||
|
|
||||||
#define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */
|
|
||||||
#define NFS_TIMEOUT 60
|
|
||||||
|
|
||||||
static int fs_mounted = 0;
|
|
||||||
static unsigned long rpc_id = 0;
|
|
||||||
static int nfs_offset = -1;
|
|
||||||
static int nfs_len;
|
|
||||||
|
|
||||||
static char dirfh[NFS_FHSIZE]; /* file handle of directory */
|
|
||||||
static char filefh[NFS_FHSIZE]; /* file handle of kernel image */
|
|
||||||
|
|
||||||
static int NfsDownloadState;
|
|
||||||
static IPaddr_t NfsServerIP;
|
|
||||||
static int NfsSrvMountPort;
|
|
||||||
static int NfsSrvNfsPort;
|
|
||||||
static int NfsOurPort;
|
|
||||||
static int NfsTimeoutCount;
|
|
||||||
static int NfsState;
|
|
||||||
#define STATE_PRCLOOKUP_PROG_MOUNT_REQ 1
|
|
||||||
#define STATE_PRCLOOKUP_PROG_NFS_REQ 2
|
|
||||||
#define STATE_MOUNT_REQ 3
|
|
||||||
#define STATE_UMOUNT_REQ 4
|
|
||||||
#define STATE_LOOKUP_REQ 5
|
|
||||||
#define STATE_READ_REQ 6
|
|
||||||
#define STATE_READLINK_REQ 7
|
|
||||||
|
|
||||||
static char default_filename[64];
|
|
||||||
static char *nfs_filename;
|
|
||||||
static char *nfs_path;
|
|
||||||
static char nfs_path_buff[2048];
|
|
||||||
|
|
||||||
static __inline__ int
|
|
||||||
store_block (uchar * src, unsigned offset, unsigned len)
|
|
||||||
{
|
|
||||||
ulong newsize = offset + len;
|
|
||||||
#ifdef CFG_DIRECT_FLASH_NFS
|
|
||||||
int i, rc = 0;
|
|
||||||
|
|
||||||
for (i=0; i<CFG_MAX_FLASH_BANKS; i++) {
|
|
||||||
/* start address in flash? */
|
|
||||||
if (load_addr + offset >= flash_info[i].start[0]) {
|
|
||||||
rc = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc) { /* Flash is destination for this packet */
|
|
||||||
rc = flash_write ((uchar *)src, (ulong)(load_addr+offset), len);
|
|
||||||
if (rc) {
|
|
||||||
flash_perror (rc);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
#endif /* CFG_DIRECT_FLASH_NFS */
|
|
||||||
{
|
|
||||||
(void)memcpy ((void *)(load_addr + offset), src, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NetBootFileXferSize < (offset+len))
|
|
||||||
NetBootFileXferSize = newsize;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char*
|
|
||||||
basename (char *path)
|
|
||||||
{
|
|
||||||
char *fname;
|
|
||||||
|
|
||||||
fname = path + strlen(path) - 1;
|
|
||||||
while (fname >= path) {
|
|
||||||
if (*fname == '/') {
|
|
||||||
fname++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fname--;
|
|
||||||
}
|
|
||||||
return fname;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char*
|
|
||||||
dirname (char *path)
|
|
||||||
{
|
|
||||||
char *fname;
|
|
||||||
|
|
||||||
fname = basename (path);
|
|
||||||
--fname;
|
|
||||||
*fname = '\0';
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
RPC_ADD_CREDENTIALS - Add RPC authentication/verifier entries
|
|
||||||
**************************************************************************/
|
|
||||||
static long *rpc_add_credentials (long *p)
|
|
||||||
{
|
|
||||||
int hl;
|
|
||||||
int hostnamelen;
|
|
||||||
char hostname[256];
|
|
||||||
|
|
||||||
strcpy (hostname, "");
|
|
||||||
hostnamelen=strlen (hostname);
|
|
||||||
|
|
||||||
/* Here's the executive summary on authentication requirements of the
|
|
||||||
* various NFS server implementations: Linux accepts both AUTH_NONE
|
|
||||||
* and AUTH_UNIX authentication (also accepts an empty hostname field
|
|
||||||
* in the AUTH_UNIX scheme). *BSD refuses AUTH_NONE, but accepts
|
|
||||||
* AUTH_UNIX (also accepts an empty hostname field in the AUTH_UNIX
|
|
||||||
* scheme). To be safe, use AUTH_UNIX and pass the hostname if we have
|
|
||||||
* it (if the BOOTP/DHCP reply didn't give one, just use an empty
|
|
||||||
* hostname). */
|
|
||||||
|
|
||||||
hl = (hostnamelen + 3) & ~3;
|
|
||||||
|
|
||||||
/* Provide an AUTH_UNIX credential. */
|
|
||||||
*p++ = htonl(1); /* AUTH_UNIX */
|
|
||||||
*p++ = htonl(hl+20); /* auth length */
|
|
||||||
*p++ = htonl(0); /* stamp */
|
|
||||||
*p++ = htonl(hostnamelen); /* hostname string */
|
|
||||||
if (hostnamelen & 3) {
|
|
||||||
*(p + hostnamelen / 4) = 0; /* add zero padding */
|
|
||||||
}
|
|
||||||
memcpy (p, hostname, hostnamelen);
|
|
||||||
p += hl / 4;
|
|
||||||
*p++ = 0; /* uid */
|
|
||||||
*p++ = 0; /* gid */
|
|
||||||
*p++ = 0; /* auxiliary gid list */
|
|
||||||
|
|
||||||
/* Provide an AUTH_NONE verifier. */
|
|
||||||
*p++ = 0; /* AUTH_NONE */
|
|
||||||
*p++ = 0; /* auth length */
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
RPC_LOOKUP - Lookup RPC Port numbers
|
|
||||||
**************************************************************************/
|
|
||||||
static void
|
|
||||||
rpc_req (int rpc_prog, int rpc_proc, uint32_t *data, int datalen)
|
|
||||||
{
|
|
||||||
struct rpc_t pkt;
|
|
||||||
unsigned long id;
|
|
||||||
uint32_t *p;
|
|
||||||
int pktlen;
|
|
||||||
int sport;
|
|
||||||
|
|
||||||
id = ++rpc_id;
|
|
||||||
pkt.u.call.id = htonl(id);
|
|
||||||
pkt.u.call.type = htonl(MSG_CALL);
|
|
||||||
pkt.u.call.rpcvers = htonl(2); /* use RPC version 2 */
|
|
||||||
pkt.u.call.prog = htonl(rpc_prog);
|
|
||||||
pkt.u.call.vers = htonl(2); /* portmapper is version 2 */
|
|
||||||
pkt.u.call.proc = htonl(rpc_proc);
|
|
||||||
p = (uint32_t *)&(pkt.u.call.data);
|
|
||||||
|
|
||||||
if (datalen)
|
|
||||||
memcpy ((char *)p, (char *)data, datalen*sizeof(uint32_t));
|
|
||||||
|
|
||||||
pktlen = (char *)p + datalen*sizeof(uint32_t) - (char *)&pkt;
|
|
||||||
|
|
||||||
memcpy ((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE, (char *)&pkt, pktlen);
|
|
||||||
|
|
||||||
if (rpc_prog == PROG_PORTMAP)
|
|
||||||
sport = SUNRPC_PORT;
|
|
||||||
else if (rpc_prog == PROG_MOUNT)
|
|
||||||
sport = NfsSrvMountPort;
|
|
||||||
else
|
|
||||||
sport = NfsSrvNfsPort;
|
|
||||||
|
|
||||||
NetSendUDPPacket (NetServerEther, NfsServerIP, sport, NfsOurPort, pktlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
RPC_LOOKUP - Lookup RPC Port numbers
|
|
||||||
**************************************************************************/
|
|
||||||
static void
|
|
||||||
rpc_lookup_req (int prog, int ver)
|
|
||||||
{
|
|
||||||
uint32_t data[16];
|
|
||||||
|
|
||||||
data[0] = 0; data[1] = 0; /* auth credential */
|
|
||||||
data[2] = 0; data[3] = 0; /* auth verifier */
|
|
||||||
data[4] = htonl(prog);
|
|
||||||
data[5] = htonl(ver);
|
|
||||||
data[6] = htonl(17); /* IP_UDP */
|
|
||||||
data[7] = 0;
|
|
||||||
|
|
||||||
rpc_req (PROG_PORTMAP, PORTMAP_GETPORT, data, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
NFS_MOUNT - Mount an NFS Filesystem
|
|
||||||
**************************************************************************/
|
|
||||||
static void
|
|
||||||
nfs_mount_req (char *path)
|
|
||||||
{
|
|
||||||
uint32_t data[1024];
|
|
||||||
uint32_t *p;
|
|
||||||
int len;
|
|
||||||
int pathlen;
|
|
||||||
|
|
||||||
pathlen = strlen (path);
|
|
||||||
|
|
||||||
p = &(data[0]);
|
|
||||||
p = (uint32_t *)rpc_add_credentials((long *)p);
|
|
||||||
|
|
||||||
*p++ = htonl(pathlen);
|
|
||||||
if (pathlen & 3) *(p + pathlen / 4) = 0;
|
|
||||||
memcpy (p, path, pathlen);
|
|
||||||
p += (pathlen + 3) / 4;
|
|
||||||
|
|
||||||
len = (uint32_t *)p - (uint32_t *)&(data[0]);
|
|
||||||
|
|
||||||
rpc_req (PROG_MOUNT, MOUNT_ADDENTRY, data, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
NFS_UMOUNTALL - Unmount all our NFS Filesystems on the Server
|
|
||||||
**************************************************************************/
|
|
||||||
static void
|
|
||||||
nfs_umountall_req (void)
|
|
||||||
{
|
|
||||||
uint32_t data[1024];
|
|
||||||
uint32_t *p;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
if ((NfsSrvMountPort == -1) || (!fs_mounted)) {
|
|
||||||
/* Nothing mounted, nothing to umount */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = &(data[0]);
|
|
||||||
p = (uint32_t *)rpc_add_credentials ((long *)p);
|
|
||||||
|
|
||||||
len = (uint32_t *)p - (uint32_t *)&(data[0]);
|
|
||||||
|
|
||||||
rpc_req (PROG_MOUNT, MOUNT_UMOUNTALL, data, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
* NFS_READLINK (AH 2003-07-14)
|
|
||||||
* This procedure is called when read of the first block fails -
|
|
||||||
* this probably happens when it's a directory or a symlink
|
|
||||||
* In case of successful readlink(), the dirname is manipulated,
|
|
||||||
* so that inside the nfs() function a recursion can be done.
|
|
||||||
**************************************************************************/
|
|
||||||
static void
|
|
||||||
nfs_readlink_req (void)
|
|
||||||
{
|
|
||||||
uint32_t data[1024];
|
|
||||||
uint32_t *p;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
p = &(data[0]);
|
|
||||||
p = (uint32_t *)rpc_add_credentials ((long *)p);
|
|
||||||
|
|
||||||
memcpy (p, filefh, NFS_FHSIZE);
|
|
||||||
p += (NFS_FHSIZE / 4);
|
|
||||||
|
|
||||||
len = (uint32_t *)p - (uint32_t *)&(data[0]);
|
|
||||||
|
|
||||||
rpc_req (PROG_NFS, NFS_READLINK, data, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
NFS_LOOKUP - Lookup Pathname
|
|
||||||
**************************************************************************/
|
|
||||||
static void
|
|
||||||
nfs_lookup_req (char *fname)
|
|
||||||
{
|
|
||||||
uint32_t data[1024];
|
|
||||||
uint32_t *p;
|
|
||||||
int len;
|
|
||||||
int fnamelen;
|
|
||||||
|
|
||||||
fnamelen = strlen (fname);
|
|
||||||
|
|
||||||
p = &(data[0]);
|
|
||||||
p = (uint32_t *)rpc_add_credentials ((long *)p);
|
|
||||||
|
|
||||||
memcpy (p, dirfh, NFS_FHSIZE);
|
|
||||||
p += (NFS_FHSIZE / 4);
|
|
||||||
*p++ = htonl(fnamelen);
|
|
||||||
if (fnamelen & 3) *(p + fnamelen / 4) = 0;
|
|
||||||
memcpy (p, fname, fnamelen);
|
|
||||||
p += (fnamelen + 3) / 4;
|
|
||||||
|
|
||||||
len = (uint32_t *)p - (uint32_t *)&(data[0]);
|
|
||||||
|
|
||||||
rpc_req (PROG_NFS, NFS_LOOKUP, data, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
NFS_READ - Read File on NFS Server
|
|
||||||
**************************************************************************/
|
|
||||||
static void
|
|
||||||
nfs_read_req (int offset, int readlen)
|
|
||||||
{
|
|
||||||
uint32_t data[1024];
|
|
||||||
uint32_t *p;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
p = &(data[0]);
|
|
||||||
p = (uint32_t *)rpc_add_credentials ((long *)p);
|
|
||||||
|
|
||||||
memcpy (p, filefh, NFS_FHSIZE);
|
|
||||||
p += (NFS_FHSIZE / 4);
|
|
||||||
*p++ = htonl(offset);
|
|
||||||
*p++ = htonl(readlen);
|
|
||||||
*p++ = 0;
|
|
||||||
|
|
||||||
len = (uint32_t *)p - (uint32_t *)&(data[0]);
|
|
||||||
|
|
||||||
rpc_req (PROG_NFS, NFS_READ, data, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
RPC request dispatcher
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
NfsSend (void)
|
|
||||||
{
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
switch (NfsState) {
|
|
||||||
case STATE_PRCLOOKUP_PROG_MOUNT_REQ:
|
|
||||||
rpc_lookup_req (PROG_MOUNT, 1);
|
|
||||||
break;
|
|
||||||
case STATE_PRCLOOKUP_PROG_NFS_REQ:
|
|
||||||
rpc_lookup_req (PROG_NFS, 2);
|
|
||||||
break;
|
|
||||||
case STATE_MOUNT_REQ:
|
|
||||||
nfs_mount_req (nfs_path);
|
|
||||||
break;
|
|
||||||
case STATE_UMOUNT_REQ:
|
|
||||||
nfs_umountall_req ();
|
|
||||||
break;
|
|
||||||
case STATE_LOOKUP_REQ:
|
|
||||||
nfs_lookup_req (nfs_filename);
|
|
||||||
break;
|
|
||||||
case STATE_READ_REQ:
|
|
||||||
nfs_read_req (nfs_offset, nfs_len);
|
|
||||||
break;
|
|
||||||
case STATE_READLINK_REQ:
|
|
||||||
nfs_readlink_req ();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
Handlers for the reply from server
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
static int
|
|
||||||
rpc_lookup_reply (int prog, uchar *pkt, unsigned len)
|
|
||||||
{
|
|
||||||
struct rpc_t rpc_pkt;
|
|
||||||
|
|
||||||
memcpy ((unsigned char *)&rpc_pkt, pkt, len);
|
|
||||||
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (rpc_pkt.u.reply.rstatus ||
|
|
||||||
rpc_pkt.u.reply.verifier ||
|
|
||||||
rpc_pkt.u.reply.astatus ||
|
|
||||||
rpc_pkt.u.reply.astatus) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (prog) {
|
|
||||||
case PROG_MOUNT:
|
|
||||||
NfsSrvMountPort = ntohl(rpc_pkt.u.reply.data[0]);
|
|
||||||
break;
|
|
||||||
case PROG_NFS:
|
|
||||||
NfsSrvNfsPort = ntohl(rpc_pkt.u.reply.data[0]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
nfs_mount_reply (uchar *pkt, unsigned len)
|
|
||||||
{
|
|
||||||
struct rpc_t rpc_pkt;
|
|
||||||
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
memcpy ((unsigned char *)&rpc_pkt, pkt, len);
|
|
||||||
|
|
||||||
if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (rpc_pkt.u.reply.rstatus ||
|
|
||||||
rpc_pkt.u.reply.verifier ||
|
|
||||||
rpc_pkt.u.reply.astatus ||
|
|
||||||
rpc_pkt.u.reply.data[0]) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fs_mounted = 1;
|
|
||||||
memcpy (dirfh, rpc_pkt.u.reply.data + 1, NFS_FHSIZE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
nfs_umountall_reply (uchar *pkt, unsigned len)
|
|
||||||
{
|
|
||||||
struct rpc_t rpc_pkt;
|
|
||||||
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
memcpy ((unsigned char *)&rpc_pkt, pkt, len);
|
|
||||||
|
|
||||||
if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (rpc_pkt.u.reply.rstatus ||
|
|
||||||
rpc_pkt.u.reply.verifier ||
|
|
||||||
rpc_pkt.u.reply.astatus) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fs_mounted = 0;
|
|
||||||
memset (dirfh, 0, sizeof(dirfh));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
nfs_lookup_reply (uchar *pkt, unsigned len)
|
|
||||||
{
|
|
||||||
struct rpc_t rpc_pkt;
|
|
||||||
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
memcpy ((unsigned char *)&rpc_pkt, pkt, len);
|
|
||||||
|
|
||||||
if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (rpc_pkt.u.reply.rstatus ||
|
|
||||||
rpc_pkt.u.reply.verifier ||
|
|
||||||
rpc_pkt.u.reply.astatus ||
|
|
||||||
rpc_pkt.u.reply.data[0]) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy (filefh, rpc_pkt.u.reply.data + 1, NFS_FHSIZE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
nfs_readlink_reply (uchar *pkt, unsigned len)
|
|
||||||
{
|
|
||||||
struct rpc_t rpc_pkt;
|
|
||||||
int rlen;
|
|
||||||
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
memcpy ((unsigned char *)&rpc_pkt, pkt, len);
|
|
||||||
|
|
||||||
if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (rpc_pkt.u.reply.rstatus ||
|
|
||||||
rpc_pkt.u.reply.verifier ||
|
|
||||||
rpc_pkt.u.reply.astatus ||
|
|
||||||
rpc_pkt.u.reply.data[0]) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
rlen = ntohl (rpc_pkt.u.reply.data[1]); /* new path length */
|
|
||||||
|
|
||||||
if (*((char *)&(rpc_pkt.u.reply.data[2])) != '/') {
|
|
||||||
int pathlen;
|
|
||||||
strcat (nfs_path, "/");
|
|
||||||
pathlen = strlen(nfs_path);
|
|
||||||
memcpy (nfs_path+pathlen, (uchar *)&(rpc_pkt.u.reply.data[2]), rlen);
|
|
||||||
nfs_path[pathlen+rlen+1] = 0;
|
|
||||||
} else {
|
|
||||||
memcpy (nfs_path, (uchar *)&(rpc_pkt.u.reply.data[2]), rlen);
|
|
||||||
nfs_path[rlen] = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
nfs_read_reply (uchar *pkt, unsigned len)
|
|
||||||
{
|
|
||||||
struct rpc_t rpc_pkt;
|
|
||||||
int rlen;
|
|
||||||
|
|
||||||
#ifdef NFS_DEBUG_nop
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
memcpy ((uchar *)&rpc_pkt, pkt, sizeof(rpc_pkt.u.reply));
|
|
||||||
|
|
||||||
if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (rpc_pkt.u.reply.rstatus ||
|
|
||||||
rpc_pkt.u.reply.verifier ||
|
|
||||||
rpc_pkt.u.reply.astatus ||
|
|
||||||
rpc_pkt.u.reply.data[0]) {
|
|
||||||
if (rpc_pkt.u.reply.rstatus) {
|
|
||||||
return -9999;
|
|
||||||
}
|
|
||||||
if (rpc_pkt.u.reply.astatus) {
|
|
||||||
return -9999;
|
|
||||||
}
|
|
||||||
return -ntohl(rpc_pkt.u.reply.data[0]);;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((nfs_offset!=0) && !((nfs_offset) % (NFS_READ_SIZE/2*10*HASHES_PER_LINE))) {
|
|
||||||
puts ("\n\t ");
|
|
||||||
}
|
|
||||||
if (!(nfs_offset % ((NFS_READ_SIZE/2)*10))) {
|
|
||||||
putc ('#');
|
|
||||||
}
|
|
||||||
|
|
||||||
rlen = ntohl(rpc_pkt.u.reply.data[18]);
|
|
||||||
if ( store_block ((uchar *)pkt+sizeof(rpc_pkt.u.reply), nfs_offset, rlen) )
|
|
||||||
return -9999;
|
|
||||||
|
|
||||||
return rlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
Interfaces of U-BOOT
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
NfsTimeout (void)
|
|
||||||
{
|
|
||||||
puts ("Timeout\n");
|
|
||||||
NetState = NETLOOP_FAIL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len)
|
|
||||||
{
|
|
||||||
int rlen;
|
|
||||||
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (dest != NfsOurPort) return;
|
|
||||||
|
|
||||||
switch (NfsState) {
|
|
||||||
case STATE_PRCLOOKUP_PROG_MOUNT_REQ:
|
|
||||||
rpc_lookup_reply (PROG_MOUNT, pkt, len);
|
|
||||||
NfsState = STATE_PRCLOOKUP_PROG_NFS_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_PRCLOOKUP_PROG_NFS_REQ:
|
|
||||||
rpc_lookup_reply (PROG_NFS, pkt, len);
|
|
||||||
NfsState = STATE_MOUNT_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_MOUNT_REQ:
|
|
||||||
if (nfs_mount_reply(pkt, len)) {
|
|
||||||
puts ("*** ERROR: Cannot mount\n");
|
|
||||||
/* just to be sure... */
|
|
||||||
NfsState = STATE_UMOUNT_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
} else {
|
|
||||||
NfsState = STATE_LOOKUP_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_UMOUNT_REQ:
|
|
||||||
if (nfs_umountall_reply(pkt, len)) {
|
|
||||||
puts ("*** ERROR: Cannot umount\n");
|
|
||||||
NetState = NETLOOP_FAIL;
|
|
||||||
} else {
|
|
||||||
puts ("\ndone\n");
|
|
||||||
NetState = NfsDownloadState;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_LOOKUP_REQ:
|
|
||||||
if (nfs_lookup_reply(pkt, len)) {
|
|
||||||
puts ("*** ERROR: File lookup fail\n");
|
|
||||||
NfsState = STATE_UMOUNT_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
} else {
|
|
||||||
NfsState = STATE_READ_REQ;
|
|
||||||
nfs_offset = 0;
|
|
||||||
nfs_len = NFS_READ_SIZE;
|
|
||||||
NfsSend ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_READLINK_REQ:
|
|
||||||
if (nfs_readlink_reply(pkt, len)) {
|
|
||||||
puts ("*** ERROR: Symlink fail\n");
|
|
||||||
NfsState = STATE_UMOUNT_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
} else {
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("Symlink --> %s\n", nfs_path);
|
|
||||||
#endif
|
|
||||||
nfs_filename = basename (nfs_path);
|
|
||||||
nfs_path = dirname (nfs_path);
|
|
||||||
|
|
||||||
NfsState = STATE_MOUNT_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_READ_REQ:
|
|
||||||
rlen = nfs_read_reply (pkt, len);
|
|
||||||
NetSetTimeout (NFS_TIMEOUT * CFG_HZ, NfsTimeout);
|
|
||||||
if (rlen > 0) {
|
|
||||||
nfs_offset += rlen;
|
|
||||||
NfsSend ();
|
|
||||||
}
|
|
||||||
else if ((rlen == -NFSERR_ISDIR)||(rlen == -NFSERR_INVAL)) {
|
|
||||||
/* symbolic link */
|
|
||||||
NfsState = STATE_READLINK_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
} else {
|
|
||||||
if ( ! rlen ) NfsDownloadState = NETLOOP_SUCCESS;
|
|
||||||
NfsState = STATE_UMOUNT_REQ;
|
|
||||||
NfsSend ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
NfsStart (void)
|
|
||||||
{
|
|
||||||
#ifdef NFS_DEBUG
|
|
||||||
printf ("%s\n", __FUNCTION__);
|
|
||||||
#endif
|
|
||||||
NfsDownloadState = NETLOOP_FAIL;
|
|
||||||
|
|
||||||
NfsServerIP = NetServerIP;
|
|
||||||
nfs_path = (char *)nfs_path_buff;
|
|
||||||
|
|
||||||
if (nfs_path == NULL) {
|
|
||||||
NetState = NETLOOP_FAIL;
|
|
||||||
puts ("*** ERROR: Fail allocate memory\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BootFile[0] == '\0') {
|
|
||||||
sprintf (default_filename, "/nfsroot/%02lX%02lX%02lX%02lX.img",
|
|
||||||
NetOurIP & 0xFF,
|
|
||||||
(NetOurIP >> 8) & 0xFF,
|
|
||||||
(NetOurIP >> 16) & 0xFF,
|
|
||||||
(NetOurIP >> 24) & 0xFF );
|
|
||||||
strcpy (nfs_path, default_filename);
|
|
||||||
|
|
||||||
printf ("*** Warning: no boot file name; using '%s'\n",
|
|
||||||
nfs_path);
|
|
||||||
} else {
|
|
||||||
char *p=BootFile;
|
|
||||||
|
|
||||||
p = strchr (p, ':');
|
|
||||||
|
|
||||||
if (p != NULL) {
|
|
||||||
NfsServerIP = string_to_ip (BootFile);
|
|
||||||
++p;
|
|
||||||
strcpy (nfs_path, p);
|
|
||||||
} else {
|
|
||||||
strcpy (nfs_path, BootFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nfs_filename = basename (nfs_path);
|
|
||||||
nfs_path = dirname (nfs_path);
|
|
||||||
|
|
||||||
#if defined(CONFIG_NET_MULTI)
|
|
||||||
printf ("Using %s device\n", eth_get_name());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
puts ("File transfer via NFS from server "); print_IPaddr (NfsServerIP);
|
|
||||||
puts ("; our IP address is "); print_IPaddr (NetOurIP);
|
|
||||||
|
|
||||||
/* Check if we need to send across this subnet */
|
|
||||||
if (NetOurGatewayIP && NetOurSubnetMask) {
|
|
||||||
IPaddr_t OurNet = NetOurIP & NetOurSubnetMask;
|
|
||||||
IPaddr_t ServerNet = NetServerIP & NetOurSubnetMask;
|
|
||||||
|
|
||||||
if (OurNet != ServerNet) {
|
|
||||||
puts ("; sending through gateway ");
|
|
||||||
print_IPaddr (NetOurGatewayIP) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf ("\nFilename '%s/%s'.", nfs_path, nfs_filename);
|
|
||||||
|
|
||||||
if (NetBootFileSize) {
|
|
||||||
printf (" Size is 0x%x Bytes = ", NetBootFileSize<<9);
|
|
||||||
print_size (NetBootFileSize<<9, "");
|
|
||||||
}
|
|
||||||
printf ("\nLoad address: 0x%lx\n"
|
|
||||||
"Loading: *\b", load_addr);
|
|
||||||
|
|
||||||
NetSetTimeout (NFS_TIMEOUT * CFG_HZ, NfsTimeout);
|
|
||||||
NetSetHandler (NfsHandler);
|
|
||||||
|
|
||||||
NfsTimeoutCount = 0;
|
|
||||||
NfsState = STATE_PRCLOOKUP_PROG_MOUNT_REQ;
|
|
||||||
|
|
||||||
/*NfsOurPort = 4096 + (get_ticks() % 3072);*/
|
|
||||||
/*FIX ME !!!*/
|
|
||||||
NfsOurPort = 1000;
|
|
||||||
|
|
||||||
/* zero out server ether in case the server ip has changed */
|
|
||||||
memset (NetServerEther, 0, 6);
|
|
||||||
|
|
||||||
NfsSend ();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_COMMANDS & CFG_CMD_NFS */
|
|
|
@ -1,389 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 1994, 1995, 2000 Neil Russell.
|
|
||||||
* (See License)
|
|
||||||
* Copyright 2000, 2001 DENX Software Engineering, Wolfgang Denk, wd@denx.de
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <command.h>
|
|
||||||
#include <net.h>
|
|
||||||
#include "tftp.h"
|
|
||||||
#include "bootp.h"
|
|
||||||
|
|
||||||
#undef ET_DEBUG
|
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & CFG_CMD_NET)
|
|
||||||
|
|
||||||
#define WELL_KNOWN_PORT 69 /* Well known TFTP port # */
|
|
||||||
#define TIMEOUT 5 /* Seconds to timeout for a lost pkt */
|
|
||||||
#ifndef CONFIG_NET_RETRY_COUNT
|
|
||||||
# define TIMEOUT_COUNT 10 /* # of timeouts before giving up */
|
|
||||||
#else
|
|
||||||
# define TIMEOUT_COUNT (CONFIG_NET_RETRY_COUNT * 2)
|
|
||||||
#endif
|
|
||||||
/* (for checking the image size) */
|
|
||||||
#define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TFTP operations.
|
|
||||||
*/
|
|
||||||
#define TFTP_RRQ 1
|
|
||||||
#define TFTP_WRQ 2
|
|
||||||
#define TFTP_DATA 3
|
|
||||||
#define TFTP_ACK 4
|
|
||||||
#define TFTP_ERROR 5
|
|
||||||
#define TFTP_OACK 6
|
|
||||||
|
|
||||||
|
|
||||||
static int TftpServerPort; /* The UDP port at their end */
|
|
||||||
static int TftpOurPort; /* The UDP port at our end */
|
|
||||||
static int TftpTimeoutCount;
|
|
||||||
static ulong TftpBlock; /* packet sequence number */
|
|
||||||
static ulong TftpLastBlock; /* last packet sequence number received */
|
|
||||||
static ulong TftpBlockWrap; /* count of sequence number wraparounds */
|
|
||||||
static ulong TftpBlockWrapOffset; /* memory offset due to wrapping */
|
|
||||||
static int TftpState;
|
|
||||||
|
|
||||||
#define STATE_RRQ 1
|
|
||||||
#define STATE_DATA 2
|
|
||||||
#define STATE_TOO_LARGE 3
|
|
||||||
#define STATE_BAD_MAGIC 4
|
|
||||||
#define STATE_OACK 5
|
|
||||||
|
|
||||||
#define TFTP_BLOCK_SIZE 512 /* default TFTP block size */
|
|
||||||
#define TFTP_SEQUENCE_SIZE ((ulong)(1<<16)) /* sequence number is 16 bit */
|
|
||||||
|
|
||||||
#define DEFAULT_NAME_LEN (8 + 4 + 1)
|
|
||||||
static char default_filename[DEFAULT_NAME_LEN];
|
|
||||||
static char *tftp_filename;
|
|
||||||
|
|
||||||
#ifdef CFG_DIRECT_FLASH_TFTP
|
|
||||||
extern flash_info_t flash_info[];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static __inline__ void
|
|
||||||
store_block (unsigned block, uchar * src, unsigned len)
|
|
||||||
{
|
|
||||||
ulong offset = block * TFTP_BLOCK_SIZE + TftpBlockWrapOffset;
|
|
||||||
ulong newsize = offset + len;
|
|
||||||
#ifdef CFG_DIRECT_FLASH_TFTP
|
|
||||||
int i, rc = 0;
|
|
||||||
|
|
||||||
for (i=0; i<CFG_MAX_FLASH_BANKS; i++) {
|
|
||||||
/* start address in flash? */
|
|
||||||
if (load_addr + offset >= flash_info[i].start[0]) {
|
|
||||||
rc = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc) { /* Flash is destination for this packet */
|
|
||||||
rc = flash_write ((char *)src, (ulong)(load_addr+offset), len);
|
|
||||||
if (rc) {
|
|
||||||
flash_perror (rc);
|
|
||||||
NetState = NETLOOP_FAIL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif /* CFG_DIRECT_FLASH_TFTP */
|
|
||||||
{
|
|
||||||
(void)memcpy((void *)(load_addr + offset), src, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NetBootFileXferSize < newsize)
|
|
||||||
NetBootFileXferSize = newsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TftpSend (void);
|
|
||||||
static void TftpTimeout (void);
|
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
TftpSend (void)
|
|
||||||
{
|
|
||||||
volatile uchar * pkt;
|
|
||||||
volatile uchar * xp;
|
|
||||||
int len = 0;
|
|
||||||
volatile ushort *s;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We will always be sending some sort of packet, so
|
|
||||||
* cobble together the packet headers now.
|
|
||||||
*/
|
|
||||||
pkt = NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE;
|
|
||||||
|
|
||||||
switch (TftpState) {
|
|
||||||
|
|
||||||
case STATE_RRQ:
|
|
||||||
xp = pkt;
|
|
||||||
s = (ushort *)pkt;
|
|
||||||
*s++ = htons(TFTP_RRQ);
|
|
||||||
pkt = (uchar *)s;
|
|
||||||
strcpy ((char *)pkt, tftp_filename);
|
|
||||||
pkt += strlen(tftp_filename) + 1;
|
|
||||||
strcpy ((char *)pkt, "octet");
|
|
||||||
pkt += 5 /*strlen("octet")*/ + 1;
|
|
||||||
strcpy ((char *)pkt, "timeout");
|
|
||||||
pkt += 7 /*strlen("timeout")*/ + 1;
|
|
||||||
sprintf((char *)pkt, "%d", TIMEOUT);
|
|
||||||
#ifdef ET_DEBUG
|
|
||||||
printf("send option \"timeout %s\"\n", (char *)pkt);
|
|
||||||
#endif
|
|
||||||
pkt += strlen((char *)pkt) + 1;
|
|
||||||
len = pkt - xp;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_DATA:
|
|
||||||
case STATE_OACK:
|
|
||||||
xp = pkt;
|
|
||||||
s = (ushort *)pkt;
|
|
||||||
*s++ = htons(TFTP_ACK);
|
|
||||||
*s++ = htons(TftpBlock);
|
|
||||||
pkt = (uchar *)s;
|
|
||||||
len = pkt - xp;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_TOO_LARGE:
|
|
||||||
xp = pkt;
|
|
||||||
s = (ushort *)pkt;
|
|
||||||
*s++ = htons(TFTP_ERROR);
|
|
||||||
*s++ = htons(3);
|
|
||||||
pkt = (uchar *)s;
|
|
||||||
strcpy ((char *)pkt, "File too large");
|
|
||||||
pkt += 14 /*strlen("File too large")*/ + 1;
|
|
||||||
len = pkt - xp;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_BAD_MAGIC:
|
|
||||||
xp = pkt;
|
|
||||||
s = (ushort *)pkt;
|
|
||||||
*s++ = htons(TFTP_ERROR);
|
|
||||||
*s++ = htons(2);
|
|
||||||
pkt = (uchar *)s;
|
|
||||||
strcpy ((char *)pkt, "File has bad magic");
|
|
||||||
pkt += 18 /*strlen("File has bad magic")*/ + 1;
|
|
||||||
len = pkt - xp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
NetSendUDPPacket(NetServerEther, NetServerIP, TftpServerPort, TftpOurPort, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
|
||||||
{
|
|
||||||
ushort proto;
|
|
||||||
ushort *s;
|
|
||||||
|
|
||||||
if (dest != TftpOurPort) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (TftpState != STATE_RRQ && src != TftpServerPort) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len < 2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
len -= 2;
|
|
||||||
/* warning: don't use increment (++) in ntohs() macros!! */
|
|
||||||
s = (ushort *)pkt;
|
|
||||||
proto = *s++;
|
|
||||||
pkt = (uchar *)s;
|
|
||||||
switch (ntohs(proto)) {
|
|
||||||
|
|
||||||
case TFTP_RRQ:
|
|
||||||
case TFTP_WRQ:
|
|
||||||
case TFTP_ACK:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TFTP_OACK:
|
|
||||||
#ifdef ET_DEBUG
|
|
||||||
printf("Got OACK: %s %s\n", pkt, pkt+strlen(pkt)+1);
|
|
||||||
#endif
|
|
||||||
TftpState = STATE_OACK;
|
|
||||||
TftpServerPort = src;
|
|
||||||
TftpSend (); /* Send ACK */
|
|
||||||
break;
|
|
||||||
case TFTP_DATA:
|
|
||||||
if (len < 2)
|
|
||||||
return;
|
|
||||||
len -= 2;
|
|
||||||
TftpBlock = ntohs(*(ushort *)pkt);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RFC1350 specifies that the first data packet will
|
|
||||||
* have sequence number 1. If we receive a sequence
|
|
||||||
* number of 0 this means that there was a wrap
|
|
||||||
* around of the (16 bit) counter.
|
|
||||||
*/
|
|
||||||
if (TftpBlock == 0) {
|
|
||||||
TftpBlockWrap++;
|
|
||||||
TftpBlockWrapOffset += TFTP_BLOCK_SIZE * TFTP_SEQUENCE_SIZE;
|
|
||||||
printf ("\n\t %lu MB received\n\t ", TftpBlockWrapOffset>>20);
|
|
||||||
} else {
|
|
||||||
if (((TftpBlock - 1) % 10) == 0) {
|
|
||||||
putc ('#');
|
|
||||||
} else if ((TftpBlock % (10 * HASHES_PER_LINE)) == 0) {
|
|
||||||
puts ("\n\t ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ET_DEBUG
|
|
||||||
if (TftpState == STATE_RRQ) {
|
|
||||||
puts ("Server did not acknowledge timeout option!\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (TftpState == STATE_RRQ || TftpState == STATE_OACK) {
|
|
||||||
/* first block received */
|
|
||||||
TftpState = STATE_DATA;
|
|
||||||
TftpServerPort = src;
|
|
||||||
TftpLastBlock = 0;
|
|
||||||
TftpBlockWrap = 0;
|
|
||||||
TftpBlockWrapOffset = 0;
|
|
||||||
|
|
||||||
if (TftpBlock != 1) { /* Assertion */
|
|
||||||
printf ("\nTFTP error: "
|
|
||||||
"First block is not block 1 (%ld)\n"
|
|
||||||
"Starting again\n\n",
|
|
||||||
TftpBlock);
|
|
||||||
NetStartAgain ();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TftpBlock == TftpLastBlock) {
|
|
||||||
/*
|
|
||||||
* Same block again; ignore it.
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
TftpLastBlock = TftpBlock;
|
|
||||||
NetSetTimeout (TIMEOUT * CFG_HZ, TftpTimeout);
|
|
||||||
|
|
||||||
store_block (TftpBlock - 1, pkt + 2, len);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Acknoledge the block just received, which will prompt
|
|
||||||
* the server for the next one.
|
|
||||||
*/
|
|
||||||
TftpSend ();
|
|
||||||
|
|
||||||
if (len < TFTP_BLOCK_SIZE) {
|
|
||||||
/*
|
|
||||||
* We received the whole thing. Try to
|
|
||||||
* run it.
|
|
||||||
*/
|
|
||||||
puts ("\ndone\n");
|
|
||||||
NetState = NETLOOP_SUCCESS;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TFTP_ERROR:
|
|
||||||
printf ("\nTFTP error: '%s' (%d)\n",
|
|
||||||
pkt + 2, ntohs(*(ushort *)pkt));
|
|
||||||
puts ("Starting again\n\n");
|
|
||||||
NetStartAgain ();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
TftpTimeout (void)
|
|
||||||
{
|
|
||||||
if (++TftpTimeoutCount > TIMEOUT_COUNT) {
|
|
||||||
puts ("\nRetry count exceeded; starting again\n");
|
|
||||||
NetStartAgain ();
|
|
||||||
} else {
|
|
||||||
puts ("T ");
|
|
||||||
NetSetTimeout (TIMEOUT * CFG_HZ, TftpTimeout);
|
|
||||||
TftpSend ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
TftpStart (void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_TFTP_PORT
|
|
||||||
char *ep; /* Environment pointer */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (BootFile[0] == '\0') {
|
|
||||||
sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",
|
|
||||||
NetOurIP & 0xFF,
|
|
||||||
(NetOurIP >> 8) & 0xFF,
|
|
||||||
(NetOurIP >> 16) & 0xFF,
|
|
||||||
(NetOurIP >> 24) & 0xFF );
|
|
||||||
tftp_filename = default_filename;
|
|
||||||
|
|
||||||
printf ("*** Warning: no boot file name; using '%s'\n",
|
|
||||||
tftp_filename);
|
|
||||||
} else {
|
|
||||||
tftp_filename = BootFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(CONFIG_NET_MULTI)
|
|
||||||
printf ("Using %s device\n", eth_get_name());
|
|
||||||
#endif
|
|
||||||
puts ("TFTP from server "); print_IPaddr (NetServerIP);
|
|
||||||
puts ("; our IP address is "); print_IPaddr (NetOurIP);
|
|
||||||
|
|
||||||
/* Check if we need to send across this subnet */
|
|
||||||
if (NetOurGatewayIP && NetOurSubnetMask) {
|
|
||||||
IPaddr_t OurNet = NetOurIP & NetOurSubnetMask;
|
|
||||||
IPaddr_t ServerNet = NetServerIP & NetOurSubnetMask;
|
|
||||||
|
|
||||||
if (OurNet != ServerNet) {
|
|
||||||
puts ("; sending through gateway ");
|
|
||||||
print_IPaddr (NetOurGatewayIP) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
putc ('\n');
|
|
||||||
|
|
||||||
printf ("Filename '%s'.", tftp_filename);
|
|
||||||
|
|
||||||
if (NetBootFileSize) {
|
|
||||||
printf (" Size is 0x%x Bytes = ", NetBootFileSize<<9);
|
|
||||||
print_size (NetBootFileSize<<9, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
putc ('\n');
|
|
||||||
|
|
||||||
printf ("Load address: 0x%lx\n", load_addr);
|
|
||||||
|
|
||||||
puts ("Loading: *\b");
|
|
||||||
|
|
||||||
NetSetTimeout (TIMEOUT * CFG_HZ, TftpTimeout);
|
|
||||||
NetSetHandler (TftpHandler);
|
|
||||||
|
|
||||||
TftpServerPort = WELL_KNOWN_PORT;
|
|
||||||
TftpTimeoutCount = 0;
|
|
||||||
TftpState = STATE_RRQ;
|
|
||||||
/* Use a pseudo-random port unless a specific port is set */
|
|
||||||
TftpOurPort = 1024 + (get_timer(0) % 3072);
|
|
||||||
#ifdef CONFIG_TFTP_PORT
|
|
||||||
if ((ep = getenv("tftpdstp")) != NULL) {
|
|
||||||
TftpServerPort = simple_strtol(ep, NULL, 10);
|
|
||||||
}
|
|
||||||
if ((ep = getenv("tftpsrcp")) != NULL) {
|
|
||||||
TftpOurPort= simple_strtol(ep, NULL, 10);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
TftpBlock = 0;
|
|
||||||
|
|
||||||
/* zero out server ether in case the server ip has changed */
|
|
||||||
memset(NetServerEther, 0, 6);
|
|
||||||
|
|
||||||
TftpSend ();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_CMD_NET */
|
|
|
@ -1,198 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is derived from crc32.c from the zlib-1.1.3 distribution
|
|
||||||
* by Jean-loup Gailly and Mark Adler.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* crc32.c -- compute the CRC-32 of a data stream
|
|
||||||
* Copyright (C) 1995-1998 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef USE_HOSTCC /* Shut down "ANSI does not permit..." warnings */
|
|
||||||
#include <common.h> /* to get command definitions like CFG_CMD_JFFS2 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
#define local static
|
|
||||||
#define ZEXPORT /* empty */
|
|
||||||
unsigned long crc32 (unsigned long, const unsigned char *, unsigned int);
|
|
||||||
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
|
|
||||||
local int crc_table_empty = 1;
|
|
||||||
local uLongf crc_table[256];
|
|
||||||
local void make_crc_table OF((void));
|
|
||||||
|
|
||||||
/*
|
|
||||||
Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
|
|
||||||
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
|
|
||||||
|
|
||||||
Polynomials over GF(2) are represented in binary, one bit per coefficient,
|
|
||||||
with the lowest powers in the most significant bit. Then adding polynomials
|
|
||||||
is just exclusive-or, and multiplying a polynomial by x is a right shift by
|
|
||||||
one. If we call the above polynomial p, and represent a byte as the
|
|
||||||
polynomial q, also with the lowest power in the most significant bit (so the
|
|
||||||
byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
|
|
||||||
where a mod b means the remainder after dividing a by b.
|
|
||||||
|
|
||||||
This calculation is done using the shift-register method of multiplying and
|
|
||||||
taking the remainder. The register is initialized to zero, and for each
|
|
||||||
incoming bit, x^32 is added mod p to the register if the bit is a one (where
|
|
||||||
x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
|
|
||||||
x (which is shifting right by one and adding x^32 mod p if the bit shifted
|
|
||||||
out is a one). We start with the highest power (least significant bit) of
|
|
||||||
q and repeat for all eight bits of q.
|
|
||||||
|
|
||||||
The table is simply the CRC of all possible eight bit values. This is all
|
|
||||||
the information needed to generate CRC's on data a byte at a time for all
|
|
||||||
combinations of CRC register values and incoming bytes.
|
|
||||||
*/
|
|
||||||
local void make_crc_table()
|
|
||||||
{
|
|
||||||
uLong c;
|
|
||||||
int n, k;
|
|
||||||
uLong poly; /* polynomial exclusive-or pattern */
|
|
||||||
/* terms of polynomial defining this crc (except x^32): */
|
|
||||||
static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
|
||||||
|
|
||||||
/* make exclusive-or pattern from polynomial (0xedb88320L) */
|
|
||||||
poly = 0L;
|
|
||||||
for (n = 0; n < sizeof(p)/sizeof(Byte); n++)
|
|
||||||
poly |= 1L << (31 - p[n]);
|
|
||||||
|
|
||||||
for (n = 0; n < 256; n++)
|
|
||||||
{
|
|
||||||
c = (uLong)n;
|
|
||||||
for (k = 0; k < 8; k++)
|
|
||||||
c = c & 1 ? poly ^ (c >> 1) : c >> 1;
|
|
||||||
crc_table[n] = c;
|
|
||||||
}
|
|
||||||
crc_table_empty = 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* ========================================================================
|
|
||||||
* Table of CRC-32's of all single-byte values (made by make_crc_table)
|
|
||||||
*/
|
|
||||||
local const uLongf crc_table[256] = {
|
|
||||||
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
|
|
||||||
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
|
|
||||||
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
|
|
||||||
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
|
|
||||||
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
|
|
||||||
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
|
|
||||||
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
|
|
||||||
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
|
|
||||||
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
|
|
||||||
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
|
|
||||||
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
|
|
||||||
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
|
|
||||||
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
|
|
||||||
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
|
|
||||||
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
|
|
||||||
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
|
|
||||||
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
|
|
||||||
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
|
|
||||||
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
|
|
||||||
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
|
|
||||||
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
|
|
||||||
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
|
|
||||||
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
|
|
||||||
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
|
|
||||||
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
|
|
||||||
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
|
|
||||||
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
|
|
||||||
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
|
|
||||||
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
|
|
||||||
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
|
|
||||||
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
|
|
||||||
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
|
|
||||||
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
|
|
||||||
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
|
|
||||||
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
|
|
||||||
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
|
|
||||||
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
|
|
||||||
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
|
|
||||||
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
|
|
||||||
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
|
|
||||||
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
|
|
||||||
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
|
|
||||||
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
|
|
||||||
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
|
|
||||||
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
|
|
||||||
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
|
|
||||||
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
|
|
||||||
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
|
|
||||||
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
|
|
||||||
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
|
|
||||||
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
|
|
||||||
0x2d02ef8dL
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* =========================================================================
|
|
||||||
* This function can be used by asm versions of crc32()
|
|
||||||
*/
|
|
||||||
const uLongf * ZEXPORT get_crc_table()
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
if (crc_table_empty) make_crc_table();
|
|
||||||
#endif
|
|
||||||
return (const uLongf *)crc_table;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
|
|
||||||
#define DO2(buf) DO1(buf); DO1(buf);
|
|
||||||
#define DO4(buf) DO2(buf); DO2(buf);
|
|
||||||
#define DO8(buf) DO4(buf); DO4(buf);
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT crc32(crc, buf, len)
|
|
||||||
uLong crc;
|
|
||||||
const Bytef *buf;
|
|
||||||
uInt len;
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
if (crc_table_empty)
|
|
||||||
make_crc_table();
|
|
||||||
#endif
|
|
||||||
crc = crc ^ 0xffffffffL;
|
|
||||||
while (len >= 8)
|
|
||||||
{
|
|
||||||
DO8(buf);
|
|
||||||
len -= 8;
|
|
||||||
}
|
|
||||||
if (len) do {
|
|
||||||
DO1(buf);
|
|
||||||
} while (--len);
|
|
||||||
return crc ^ 0xffffffffL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) || \
|
|
||||||
((CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY))
|
|
||||||
|
|
||||||
/* No ones complement version. JFFS2 (and other things ?)
|
|
||||||
* don't use ones compliment in their CRC calculations.
|
|
||||||
*/
|
|
||||||
uLong ZEXPORT crc32_no_comp(uLong crc, const Bytef *buf, uInt len)
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
if (crc_table_empty)
|
|
||||||
make_crc_table();
|
|
||||||
#endif
|
|
||||||
while (len >= 8)
|
|
||||||
{
|
|
||||||
DO8(buf);
|
|
||||||
len -= 8;
|
|
||||||
}
|
|
||||||
if (len) do {
|
|
||||||
DO1(buf);
|
|
||||||
} while (--len);
|
|
||||||
|
|
||||||
return crc;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CFG_CMD_JFFS2 */
|
|
|
@ -1,213 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2001
|
|
||||||
* Erik Theisen, Wave 7 Optics, etheisen@mindspring.com.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
#define __ASSEMBLY__ /* Dirty trick to get only #defines */
|
|
||||||
#endif
|
|
||||||
#define __ASM_STUB_PROCESSOR_H__ /* don't include asm/processor. */
|
|
||||||
#include <config.h>
|
|
||||||
#undef __ASSEMBLY__
|
|
||||||
#include <environment.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Handle HOSTS that have prepended
|
|
||||||
* crap on symbol names, not TARGETS.
|
|
||||||
*/
|
|
||||||
#if defined(__APPLE__)
|
|
||||||
/* Leading underscore on symbols */
|
|
||||||
# define SYM_CHAR "_"
|
|
||||||
#else /* No leading character on symbols */
|
|
||||||
# define SYM_CHAR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Generate embedded environment table
|
|
||||||
* inside U-Boot image, if needed.
|
|
||||||
*/
|
|
||||||
#if defined(ENV_IS_EMBEDDED)
|
|
||||||
/*
|
|
||||||
* Only put the environment in it's own section when we are building
|
|
||||||
* U-Boot proper. The host based program "tools/envcrc" does not need
|
|
||||||
* a seperate section. Note that ENV_CRC is only defined when building
|
|
||||||
* U-Boot itself.
|
|
||||||
*/
|
|
||||||
#if (defined(CONFIG_CMI) || \
|
|
||||||
defined(CONFIG_FADS) || \
|
|
||||||
defined(CONFIG_HYMOD) || \
|
|
||||||
defined(CONFIG_ICU862) || \
|
|
||||||
defined(CONFIG_R360MPI) || \
|
|
||||||
defined(CONFIG_TQM8xxL) || \
|
|
||||||
defined(CONFIG_RRVISION) || \
|
|
||||||
defined(CONFIG_TRAB) || \
|
|
||||||
defined(CONFIG_PPCHAMELEONEVB) || \
|
|
||||||
defined(CONFIG_M5271EVB) || \
|
|
||||||
defined(CONFIG_NAND_U_BOOT)) && \
|
|
||||||
defined(ENV_CRC) /* Environment embedded in U-Boot .ppcenv section */
|
|
||||||
/* XXX - This only works with GNU C */
|
|
||||||
# define __PPCENV__ __attribute__ ((section(".ppcenv")))
|
|
||||||
# define __PPCTEXT__ __attribute__ ((section(".text")))
|
|
||||||
|
|
||||||
#elif defined(USE_HOSTCC) /* Native for 'tools/envcrc' */
|
|
||||||
# define __PPCENV__ /*XXX DO_NOT_DEL_THIS_COMMENT*/
|
|
||||||
# define __PPCTEXT__ /*XXX DO_NOT_DEL_THIS_COMMENT*/
|
|
||||||
|
|
||||||
#else /* Environment is embedded in U-Boot's .text section */
|
|
||||||
/* XXX - This only works with GNU C */
|
|
||||||
# define __PPCENV__ __attribute__ ((section(".text")))
|
|
||||||
# define __PPCTEXT__ __attribute__ ((section(".text")))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros to generate global absolutes.
|
|
||||||
*/
|
|
||||||
#define GEN_SYMNAME(str) SYM_CHAR #str
|
|
||||||
#define GEN_VALUE(str) #str
|
|
||||||
#define GEN_ABS(name, value) \
|
|
||||||
asm (".globl " GEN_SYMNAME(name)); \
|
|
||||||
asm (GEN_SYMNAME(name) " = " GEN_VALUE(value))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros to transform values
|
|
||||||
* into environment strings.
|
|
||||||
*/
|
|
||||||
#define XMK_STR(x) #x
|
|
||||||
#define MK_STR(x) XMK_STR(x)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check to see if we are building with a
|
|
||||||
* computed CRC. Otherwise define it as ~0.
|
|
||||||
*/
|
|
||||||
#if !defined(ENV_CRC)
|
|
||||||
# define ENV_CRC ~0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
env_t environment __PPCENV__ = {
|
|
||||||
ENV_CRC, /* CRC Sum */
|
|
||||||
#ifdef CFG_REDUNDAND_ENVIRONMENT
|
|
||||||
1, /* Flags: valid */
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
#if defined(CONFIG_BOOTARGS)
|
|
||||||
"bootargs=" CONFIG_BOOTARGS "\0"
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_BOOTCOMMAND)
|
|
||||||
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_RAMBOOTCOMMAND)
|
|
||||||
"ramboot=" CONFIG_RAMBOOTCOMMAND "\0"
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_NFSBOOTCOMMAND)
|
|
||||||
"nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
|
|
||||||
"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
|
|
||||||
"baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_LOADS_ECHO
|
|
||||||
"loads_echo=" MK_STR(CONFIG_LOADS_ECHO) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ETHADDR
|
|
||||||
"ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ETH1ADDR
|
|
||||||
"eth1addr=" MK_STR(CONFIG_ETH1ADDR) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ETH2ADDR
|
|
||||||
"eth2addr=" MK_STR(CONFIG_ETH2ADDR) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ETH3ADDR
|
|
||||||
"eth3addr=" MK_STR(CONFIG_ETH3ADDR) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ETHPRIME
|
|
||||||
"ethprime=" CONFIG_ETHPRIME "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_IPADDR
|
|
||||||
"ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_SERVERIP
|
|
||||||
"serverip=" MK_STR(CONFIG_SERVERIP) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CFG_AUTOLOAD
|
|
||||||
"autoload=" CFG_AUTOLOAD "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ROOTPATH
|
|
||||||
"rootpath=" MK_STR(CONFIG_ROOTPATH) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_GATEWAYIP
|
|
||||||
"gatewayip=" MK_STR(CONFIG_GATEWAYIP) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_NETMASK
|
|
||||||
"netmask=" MK_STR(CONFIG_NETMASK) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_HOSTNAME
|
|
||||||
"hostname=" MK_STR(CONFIG_HOSTNAME) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_BOOTFILE
|
|
||||||
"bootfile=" MK_STR(CONFIG_BOOTFILE) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_LOADADDR
|
|
||||||
"loadaddr=" MK_STR(CONFIG_LOADADDR) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_PREBOOT
|
|
||||||
"preboot=" CONFIG_PREBOOT "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_CLOCKS_IN_MHZ
|
|
||||||
"clocks_in_mhz=" "1" "\0"
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
|
|
||||||
"pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY) "\0"
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_EXTRA_ENV_SETTINGS
|
|
||||||
CONFIG_EXTRA_ENV_SETTINGS
|
|
||||||
#endif
|
|
||||||
"\0" /* Term. env_t.data with 2 NULs */
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#ifdef CFG_ENV_ADDR_REDUND
|
|
||||||
env_t redundand_environment __PPCENV__ = {
|
|
||||||
0, /* CRC Sum: invalid */
|
|
||||||
0, /* Flags: invalid */
|
|
||||||
{
|
|
||||||
"\0"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#endif /* CFG_ENV_ADDR_REDUND */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These will end up in the .text section
|
|
||||||
* if the environment strings are embedded
|
|
||||||
* in the image. When this is used for
|
|
||||||
* tools/envcrc, they are placed in the
|
|
||||||
* .data/.sdata section.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
unsigned long env_size __PPCTEXT__ = sizeof(env_t);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add in absolutes.
|
|
||||||
*/
|
|
||||||
GEN_ABS(env_offset, CFG_ENV_OFFSET);
|
|
||||||
|
|
||||||
#endif /* ENV_IS_EMBEDDED */
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue