Initial revision
This commit is contained in:
parent
cc1c8a136f
commit
7ebf7443ad
138
MAKEALL
Normal file
138
MAKEALL
Normal file
@ -0,0 +1,138 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ "${CROSS_COMPILE}" ] ; then
|
||||
MAKE="make CROSS_COMPILE=${CROSS_COMPILE}"
|
||||
else
|
||||
MAKE=make
|
||||
fi
|
||||
|
||||
[ -d LOG ] || mkdir LOG || exit 1
|
||||
|
||||
LIST=""
|
||||
|
||||
#########################################################################
|
||||
## MPC8xx Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_8xx=" \
|
||||
ADS860 AMX860 c2mon CCM \
|
||||
cogent_mpc8xx ESTEEM192E ETX094 FADS823 \
|
||||
FADS850SAR FADS860T FLAGADM FPS850L \
|
||||
GEN860T GENIETV GTH hermes \
|
||||
IAD210 ICU862_100MHz IP860 IVML24 \
|
||||
IVML24_128 IVML24_256 IVMS8 IVMS8_128 \
|
||||
IVMS8_256 LANTEC lwmon MBX \
|
||||
MBX860T MHPC MVS1 NETVIA \
|
||||
NX823 pcu_e R360MPI RPXClassic \
|
||||
RPXlite RRvision SM850 SPD823TS \
|
||||
SXNI855T TQM823L TQM823L_LCD TQM850L \
|
||||
TQM855L TQM860L TQM860L_FEC TTTech \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
## PPC4xx Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_4xx=" \
|
||||
ADCIOP AR405 CANBT CPCI405 \
|
||||
CPCI4052 CPCI440 CPCIISER4 CRAYL1 \
|
||||
DASA_SIM DU405 EBONY ERIC \
|
||||
MIP405 ML2 OCRTC ORSG \
|
||||
PCI405 PIP405 W7OLMC W7OLMG \
|
||||
WALNUT405 \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
## MPC824x Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_824x=" \
|
||||
BMW CU824 MOUSSE MUSENKI \
|
||||
OXC PN62 Sandpoint8240 Sandpoint8245 \
|
||||
utx8245 \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
## MPC8260 Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_8260=" \
|
||||
cogent_mpc8260 CPU86 ep8260 gw8260 \
|
||||
hymod IPHASE4539 MPC8260ADS PM826 \
|
||||
ppmc8260 RPXsuper rsdproto sacsng \
|
||||
sbc8260 SCM TQM8260 \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
## 74xx/7xx Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_74xx=" \
|
||||
EVB64260 PCIPPC2 PCIPPC6 ZUMA \
|
||||
"
|
||||
|
||||
LIST_7xx=" \
|
||||
BAB7xx ELPPC \
|
||||
"
|
||||
|
||||
LIST_ppc="${LIST_8xx} ${LIST_824x} ${LIST_8260} \
|
||||
${LIST_4xx} ${LIST_74xx} ${LIST_7xx}"
|
||||
|
||||
#########################################################################
|
||||
## StrongARM Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_SA="lart shannon dnp1110"
|
||||
|
||||
#########################################################################
|
||||
## ARM7 Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_ARM7="impa7 ep7312"
|
||||
|
||||
#########################################################################
|
||||
## ARM9 Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_ARM9="smdk2400 smdk2410 trab"
|
||||
|
||||
#########################################################################
|
||||
## Xscale Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_xscale="lubbock cradle csb226"
|
||||
|
||||
|
||||
LIST_arm="${LIST_SA} ${LIST_ARM7} ${LIST_ARM9} ${LIST_xscale}"
|
||||
|
||||
|
||||
#----- for now, just run PPC by default -----
|
||||
[ $# = 0 ] && set $LIST_ppc
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
build_target() {
|
||||
target=$1
|
||||
|
||||
${MAKE} distclean >/dev/null
|
||||
${MAKE} ${target}_config
|
||||
${MAKE} all 2>&1 >LOG/$target.MAKELOG | tee LOG/$target.ERR
|
||||
${CROSS_COMPILE:-ppc_8xx-}size u-boot | tee -a LOG/$target.MAKELOG
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
|
||||
for arg in $@
|
||||
do
|
||||
case "$arg" in
|
||||
8xx|824x|8260|4xx|7xx|74xx|SA|ARM7|ARM9|ppc|arm|xscale)
|
||||
for target in `eval echo '$LIST_'${arg}`
|
||||
do
|
||||
build_target ${target}
|
||||
done
|
||||
;;
|
||||
*) build_target ${arg}
|
||||
;;
|
||||
esac
|
||||
done
|
656
Makefile
Normal file
656
Makefile
Normal file
@ -0,0 +1,656 @@
|
||||
#
|
||||
# (C) Copyright 2000, 2001, 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
|
||||
#
|
||||
|
||||
HOSTARCH := $(shell uname -m | \
|
||||
sed -e s/i.86/i386/ \
|
||||
-e s/sun4u/sparc64/ \
|
||||
-e s/arm.*/arm/ \
|
||||
-e s/sa110/arm/ \
|
||||
-e s/powerpc/ppc/ \
|
||||
-e s/macppc/ppc/)
|
||||
|
||||
HOSTOS := $(shell uname -s | tr A-Z a-z | \
|
||||
sed -e 's/\(cygwin\).*/cygwin/')
|
||||
|
||||
export HOSTARCH
|
||||
|
||||
# Deal with colliding definitions from tcsh etc.
|
||||
VENDOR=
|
||||
|
||||
#########################################################################
|
||||
|
||||
TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
|
||||
export TOPDIR
|
||||
|
||||
ifeq (include/config.mk,$(wildcard include/config.mk))
|
||||
# load ARCH, BOARD, and CPU configuration
|
||||
include include/config.mk
|
||||
export ARCH CPU BOARD VENDOR
|
||||
# load other configuration
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
ifndef CROSS_COMPILE
|
||||
ifeq ($(HOSTARCH),ppc)
|
||||
CROSS_COMPILE =
|
||||
else
|
||||
## #ifeq ($(CPU),mpc8xx)
|
||||
## CROSS_COMPILE = ppc_8xx-
|
||||
## #endif
|
||||
## #ifeq ($(CPU),ppc4xx)
|
||||
## #CROSS_COMPILE = ppc_4xx-
|
||||
## #endif
|
||||
## #ifeq ($(CPU),mpc824x)
|
||||
## #CROSS_COMPILE = ppc_82xx-
|
||||
## #endif
|
||||
## #ifeq ($(CPU),mpc8260)
|
||||
## #CROSS_COMPILE = ppc_82xx-
|
||||
## #endif
|
||||
## #ifeq ($(CPU),74xx_7xx)
|
||||
## #CROSS_COMPILE = ppc_74xx-)
|
||||
## #endif
|
||||
ifeq ($(ARCH),ppc)
|
||||
CROSS_COMPILE = ppc_8xx-
|
||||
endif
|
||||
ifeq ($(ARCH),arm)
|
||||
CROSS_COMPILE = arm_920TDI-
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
export CROSS_COMPILE
|
||||
|
||||
# The "tools" are needed early, so put this first
|
||||
SUBDIRS = tools \
|
||||
lib_generic \
|
||||
lib_$(ARCH) \
|
||||
cpu/$(CPU) \
|
||||
board/$(BOARDDIR) \
|
||||
common \
|
||||
disk \
|
||||
fs \
|
||||
net \
|
||||
rtc \
|
||||
dtt \
|
||||
drivers \
|
||||
post \
|
||||
post/cpu \
|
||||
examples
|
||||
|
||||
#########################################################################
|
||||
# U-Boot objects....order is important (i.e. start must be first)
|
||||
|
||||
OBJS = cpu/$(CPU)/start.o
|
||||
|
||||
ifeq ($(CPU),ppc4xx)
|
||||
OBJS += cpu/$(CPU)/resetvec.o
|
||||
endif
|
||||
|
||||
LIBS = board/$(BOARDDIR)/lib$(BOARD).a
|
||||
LIBS += cpu/$(CPU)/lib$(CPU).a
|
||||
LIBS += lib_$(ARCH)/lib$(ARCH).a
|
||||
LIBS += fs/jffs2/libjffs2.a
|
||||
LIBS += net/libnet.a
|
||||
LIBS += disk/libdisk.a
|
||||
LIBS += rtc/librtc.a
|
||||
LIBS += dtt/libdtt.a
|
||||
LIBS += drivers/libdrivers.a
|
||||
LIBS += post/libpost.a post/cpu/libcpu.a
|
||||
LIBS += common/libcommon.a
|
||||
LIBS += lib_generic/libgeneric.a
|
||||
|
||||
#########################################################################
|
||||
|
||||
all: u-boot.srec u-boot.bin System.map
|
||||
|
||||
install: all
|
||||
cp u-boot.bin /tftpboot/u-boot.bin
|
||||
cp u-boot.bin /net/sam/tftpboot/u-boot.bin
|
||||
|
||||
u-boot.srec: u-boot
|
||||
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
|
||||
|
||||
u-boot.bin: u-boot
|
||||
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
|
||||
|
||||
u-boot.dis: u-boot
|
||||
$(OBJDUMP) -d $< > $@
|
||||
|
||||
u-boot: depend subdirs $(OBJS) $(LIBS) $(LDSCRIPT)
|
||||
$(LD) $(LDFLAGS) $(OBJS) $(LIBS) $(LIBS) -Map u-boot.map -o u-boot
|
||||
|
||||
subdirs:
|
||||
@for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir || exit 1 ; done
|
||||
|
||||
depend dep:
|
||||
@for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir .depend ; done
|
||||
|
||||
tags:
|
||||
ctags -w `find $(SUBDIRS) include \
|
||||
\( -name CVS -prune \) -o \( -name '*.[ch]' -print \)`
|
||||
|
||||
etags:
|
||||
etags -a `find $(SUBDIRS) include \
|
||||
\( -name CVS -prune \) -o \( -name '*.[ch]' -print \)`
|
||||
|
||||
System.map: u-boot
|
||||
@$(NM) $< | \
|
||||
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
|
||||
sort > System.map
|
||||
|
||||
#########################################################################
|
||||
else
|
||||
all install u-boot u-boot.srec depend dep:
|
||||
@echo "System not configured - see README" >&2
|
||||
@ exit 1
|
||||
endif
|
||||
|
||||
#########################################################################
|
||||
|
||||
unconfig:
|
||||
rm -f include/config.h include/config.mk
|
||||
|
||||
#========================================================================
|
||||
# PowerPC
|
||||
#========================================================================
|
||||
#########################################################################
|
||||
## MPC8xx Systems
|
||||
#########################################################################
|
||||
|
||||
ADS860_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx fads
|
||||
|
||||
AMX860_config : unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx amx860 westel
|
||||
|
||||
c2mon_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx c2mon
|
||||
|
||||
CCM_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx CCM siemens
|
||||
|
||||
cogent_mpc8xx_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx cogent
|
||||
|
||||
ESTEEM192E_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx esteem192e
|
||||
|
||||
ETX094_config : unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx etx094
|
||||
|
||||
FADS823_config \
|
||||
FADS850SAR_config \
|
||||
FADS860T_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx fads
|
||||
|
||||
FLAGADM_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx flagadm
|
||||
|
||||
GEN860T_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx gen860t
|
||||
|
||||
GENIETV_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx genietv
|
||||
|
||||
GTH_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx gth
|
||||
|
||||
hermes_config : unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx hermes
|
||||
|
||||
IAD210_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx IAD210 siemens
|
||||
|
||||
xtract_ICU862 = $(subst _100MHz,,$(subst _config,,$1))
|
||||
|
||||
ICU862_100MHz_config \
|
||||
ICU862_config: unconfig
|
||||
@ >include/config.h
|
||||
@[ -z "$(findstring _100MHz,$@)" ] || \
|
||||
{ echo "#define CONFIG_100MHz" >>include/config.h ; \
|
||||
echo "... with 100MHz system clock" ; \
|
||||
}
|
||||
@./mkconfig -a $(call xtract_ICU862,$@) ppc mpc8xx icu862
|
||||
|
||||
IP860_config : unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx ip860
|
||||
|
||||
IVML24_256_config \
|
||||
IVML24_128_config \
|
||||
IVML24_config: unconfig
|
||||
@ >include/config.h
|
||||
@[ -z "$(findstring IVML24_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_IVML24_16M" >>include/config.h ; \
|
||||
}
|
||||
@[ -z "$(findstring IVML24_128_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_IVML24_32M" >>include/config.h ; \
|
||||
}
|
||||
@[ -z "$(findstring IVML24_256_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_IVML24_64M" >>include/config.h ; \
|
||||
}
|
||||
@./mkconfig -a IVML24 ppc mpc8xx ivm
|
||||
|
||||
IVMS8_256_config \
|
||||
IVMS8_128_config \
|
||||
IVMS8_config: unconfig
|
||||
@ >include/config.h
|
||||
@[ -z "$(findstring IVMS8_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_IVMS8_16M" >>include/config.h ; \
|
||||
}
|
||||
@[ -z "$(findstring IVMS8_128_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_IVMS8_32M" >>include/config.h ; \
|
||||
}
|
||||
@[ -z "$(findstring IVMS8_256_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_IVMS8_64M" >>include/config.h ; \
|
||||
}
|
||||
@./mkconfig -a IVMS8 ppc mpc8xx ivm
|
||||
|
||||
LANTEC_config : unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx lantec
|
||||
|
||||
lwmon_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx lwmon
|
||||
|
||||
MBX_config \
|
||||
MBX860T_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx mbx8xx
|
||||
|
||||
MHPC_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx mhpc eltec
|
||||
|
||||
MVS1_config : unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx mvs1
|
||||
|
||||
NETVIA_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx netvia
|
||||
|
||||
NX823_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx nx823
|
||||
|
||||
pcu_e_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx pcu_e siemens
|
||||
|
||||
R360MPI_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx r360mpi
|
||||
|
||||
RPXClassic_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx RPXClassic
|
||||
|
||||
RPXlite_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx RPXlite
|
||||
|
||||
RRvision_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx RRvision
|
||||
|
||||
RRvision_LCD_config: unconfig
|
||||
@echo "#define CONFIG_LCD" >include/config.h
|
||||
@echo "#define CONFIG_SHARP_LQ104V7DS01" >>include/config.h
|
||||
@./mkconfig -a RRvision ppc mpc8xx RRvision
|
||||
|
||||
SM850_config : unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx tqm8xx
|
||||
|
||||
SPD823TS_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx spd8xx
|
||||
|
||||
SXNI855T_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx sixnet
|
||||
|
||||
# Play some tricks for configuration selection
|
||||
# All boards can come with 50 MHz (default), 66MHz or 80MHz clock,
|
||||
# but only 855 and 860 boards may come with FEC
|
||||
# and 823 boards may have LCD support
|
||||
xtract_8xx = $(subst _66MHz,,$(subst _80MHz,,$(subst _LCD,,$(subst _FEC,,$(subst _config,,$1)))))
|
||||
|
||||
FPS850L_config \
|
||||
TQM823L_config \
|
||||
TQM823L_66MHz_config \
|
||||
TQM823L_80MHz_config \
|
||||
TQM823L_LCD_config \
|
||||
TQM823L_LCD_66MHz_config \
|
||||
TQM823L_LCD_80MHz_config \
|
||||
TQM850L_config \
|
||||
TQM850L_66MHz_config \
|
||||
TQM850L_80MHz_config \
|
||||
TQM855L_config \
|
||||
TQM855L_66MHz_config \
|
||||
TQM855L_80MHz_config \
|
||||
TQM855L_FEC_config \
|
||||
TQM855L_FEC_66MHz_config \
|
||||
TQM855L_FEC_80MHz_config \
|
||||
TQM860L_config \
|
||||
TQM860L_66MHz_config \
|
||||
TQM860L_80MHz_config \
|
||||
TQM860L_FEC_config \
|
||||
TQM860L_FEC_66MHz_config \
|
||||
TQM860L_FEC_80MHz_config: unconfig
|
||||
@ >include/config.h
|
||||
@[ -z "$(findstring _FEC,$@)" ] || \
|
||||
{ echo "#define CONFIG_FEC_ENET" >>include/config.h ; \
|
||||
echo "... with FEC support" ; \
|
||||
}
|
||||
@[ -z "$(findstring _66MHz,$@)" ] || \
|
||||
{ echo "#define CONFIG_66MHz" >>include/config.h ; \
|
||||
echo "... with 66MHz system clock" ; \
|
||||
}
|
||||
@[ -z "$(findstring _80MHz,$@)" ] || \
|
||||
{ echo "#define CONFIG_80MHz" >>include/config.h ; \
|
||||
echo "... with 80MHz system clock" ; \
|
||||
}
|
||||
@[ -z "$(findstring _LCD,$@)" ] || \
|
||||
{ echo "#define CONFIG_LCD" >>include/config.h ; \
|
||||
echo "#define CONFIG_NEC_NL6648BC20" >>include/config.h ; \
|
||||
echo "... with LCD display" ; \
|
||||
}
|
||||
@./mkconfig -a $(call xtract_8xx,$@) ppc mpc8xx tqm8xx
|
||||
|
||||
TTTech_config: unconfig
|
||||
@echo "#define CONFIG_LCD" >include/config.h
|
||||
@echo "#define CONFIG_SHARP_LQ104V7DS01" >>include/config.h
|
||||
@./mkconfig -a TQM823L ppc mpc8xx tqm8xx
|
||||
|
||||
#########################################################################
|
||||
## PPC4xx Systems
|
||||
#########################################################################
|
||||
|
||||
ADCIOP_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx adciop esd
|
||||
|
||||
AR405_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx ar405 esd
|
||||
|
||||
CANBT_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx canbt esd
|
||||
|
||||
CPCI405_config \
|
||||
CPCI4052_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx cpci405 esd
|
||||
@echo "BOARD_REVISION = $(@:_config=)" >>include/config.mk
|
||||
|
||||
CPCI440_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx cpci440 esd
|
||||
|
||||
CPCIISER4_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx cpciiser4 esd
|
||||
|
||||
CRAYL1_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx L1 cray
|
||||
|
||||
DASA_SIM_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx dasa_sim esd
|
||||
|
||||
DU405_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx du405 esd
|
||||
|
||||
EBONY_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx ebony
|
||||
|
||||
ERIC_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx eric
|
||||
|
||||
MIP405_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx mip405 mpl
|
||||
|
||||
ML2_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx ml2
|
||||
|
||||
OCRTC_config \
|
||||
ORSG_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx ocrtc esd
|
||||
|
||||
PCI405_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx pci405 esd
|
||||
|
||||
PIP405_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx pip405 mpl
|
||||
|
||||
W7OLMC_config \
|
||||
W7OLMG_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx w7o
|
||||
|
||||
WALNUT405_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx walnut405
|
||||
|
||||
#########################################################################
|
||||
## MPC824x Systems
|
||||
#########################################################################
|
||||
BMW_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x bmw
|
||||
|
||||
CU824_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x cu824
|
||||
|
||||
MOUSSE_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x mousse
|
||||
|
||||
MUSENKI_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x musenki
|
||||
|
||||
OXC_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x oxc
|
||||
|
||||
PN62_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x pn62
|
||||
|
||||
Sandpoint8240_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x sandpoint
|
||||
|
||||
Sandpoint8245_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x sandpoint
|
||||
|
||||
utx8245_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc824x utx8245
|
||||
|
||||
#########################################################################
|
||||
## MPC8260 Systems
|
||||
#########################################################################
|
||||
xtract_82xx = $(subst _ROMBOOT,,$(subst _L2,,$(subst _266MHz,,$(subst _300MHz,,$(subst _config,,$1)))))
|
||||
|
||||
cogent_mpc8260_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 cogent
|
||||
|
||||
CPU86_config \
|
||||
CPU86_ROMBOOT_config: unconfig
|
||||
@./mkconfig $(call xtract_82xx,$@) ppc mpc8260 cpu86
|
||||
@cd ./include ; \
|
||||
if [ "$(findstring _ROMBOOT_,$@)" ] ; then \
|
||||
echo "CONFIG_BOOT_ROM = y" >> config.mk ; \
|
||||
echo "... booting from 8-bit flash" ; \
|
||||
else \
|
||||
echo "CONFIG_BOOT_ROM = n" >> config.mk ; \
|
||||
echo "... booting from 64-bit flash" ; \
|
||||
fi; \
|
||||
echo "export CONFIG_BOOT_ROM" >> config.mk;
|
||||
|
||||
ep8260_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 ep8260
|
||||
|
||||
gw8260_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 gw8260
|
||||
|
||||
hymod_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 hymod
|
||||
|
||||
IPHASE4539_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 iphase4539
|
||||
|
||||
MPC8260ADS_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 mpc8260ads
|
||||
|
||||
PM826_config \
|
||||
PM826_ROMBOOT_config: unconfig
|
||||
@./mkconfig $(call xtract_82xx,$@) ppc mpc8260 pm826
|
||||
@cd ./include ; \
|
||||
if [ "$(findstring _ROMBOOT_,$@)" ] ; then \
|
||||
echo "CONFIG_BOOT_ROM = y" >> config.mk ; \
|
||||
echo "... booting from 8-bit flash" ; \
|
||||
else \
|
||||
echo "CONFIG_BOOT_ROM = n" >> config.mk ; \
|
||||
echo "... booting from 64-bit flash" ; \
|
||||
fi; \
|
||||
echo "export CONFIG_BOOT_ROM" >> config.mk; \
|
||||
|
||||
ppmc8260_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 ppmc8260
|
||||
|
||||
RPXsuper_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 rpxsuper
|
||||
|
||||
rsdproto_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 rsdproto
|
||||
|
||||
sacsng_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 sacsng
|
||||
|
||||
sbc8260_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 sbc8260
|
||||
|
||||
SCM_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8260 SCM siemens
|
||||
|
||||
TQM8260_config \
|
||||
TQM8260_L2_config \
|
||||
TQM8260_266MHz_config \
|
||||
TQM8260_L2_266MHz_config \
|
||||
TQM8260_300MHz_config: unconfig
|
||||
@ >include/config.h
|
||||
@if [ "$(findstring _L2_,$@)" ] ; then \
|
||||
echo "#define CONFIG_L2_CACHE" >>include/config.h ; \
|
||||
echo "... with L2 Cache support (60x Bus Mode)" ; \
|
||||
else \
|
||||
echo "#undef CONFIG_L2_CACHE" >>include/config.h ; \
|
||||
echo "... without L2 Cache support" ; \
|
||||
fi
|
||||
@[ -z "$(findstring _266MHz,$@)" ] || \
|
||||
{ echo "#define CONFIG_266MHz" >>include/config.h ; \
|
||||
echo "... with 266MHz system clock" ; \
|
||||
}
|
||||
@[ -z "$(findstring _300MHz,$@)" ] || \
|
||||
{ echo "#define CONFIG_300MHz" >>include/config.h ; \
|
||||
echo "... with 300MHz system clock" ; \
|
||||
}
|
||||
@./mkconfig -a $(call xtract_82xx,$@) ppc mpc8260 tqm8260
|
||||
|
||||
#########################################################################
|
||||
## 74xx/7xx Systems
|
||||
#########################################################################
|
||||
|
||||
EVB64260_config \
|
||||
EVB64260_750CX_config: unconfig
|
||||
@./mkconfig EVB64260 ppc 74xx_7xx evb64260
|
||||
|
||||
ZUMA_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc 74xx_7xx evb64260
|
||||
|
||||
PCIPPC2_config \
|
||||
PCIPPC6_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc 74xx_7xx pcippc2
|
||||
|
||||
BAB7xx_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc 74xx_7xx bab7xx eltec
|
||||
|
||||
ELPPC_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc 74xx_7xx elppc eltec
|
||||
|
||||
#========================================================================
|
||||
# ARM
|
||||
#========================================================================
|
||||
#########################################################################
|
||||
## StrongARM Systems
|
||||
#########################################################################
|
||||
|
||||
lart_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm sa1100 lart
|
||||
|
||||
dnp1110_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm sa1100 dnp1110
|
||||
|
||||
shannon_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm sa1100 shannon
|
||||
|
||||
#########################################################################
|
||||
## ARM920T Systems
|
||||
#########################################################################
|
||||
|
||||
smdk2400_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm arm920t smdk2400
|
||||
|
||||
smdk2410_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm arm920t smdk2410
|
||||
|
||||
trab_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm arm920t trab
|
||||
|
||||
#########################################################################
|
||||
## ARM720T Systems
|
||||
#########################################################################
|
||||
|
||||
impa7_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm arm720t impa7
|
||||
|
||||
ep7312_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm arm720t ep7312
|
||||
|
||||
#########################################################################
|
||||
## Xscale Systems
|
||||
#########################################################################
|
||||
|
||||
lubbock_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm xscale lubbock
|
||||
|
||||
cradle_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm xscale cradle
|
||||
|
||||
csb226_config : unconfig
|
||||
@./mkconfig $(@:_config=) arm xscale csb226
|
||||
|
||||
#########################################################################
|
||||
|
||||
clean:
|
||||
find . -type f \
|
||||
\( -name 'core' -o -name '*.bak' -o -name '*~' \
|
||||
-o -name '*.o' -o -name '*.a' \) -print \
|
||||
| xargs rm -f
|
||||
rm -f examples/hello_world examples/timer examples/eepro100_eeprom
|
||||
rm -f tools/img2srec tools/mkimage tools/envcrc tools/gen_eth_addr
|
||||
rm -f tools/easylogo/easylogo tools/bmp_logo
|
||||
rm -f tools/gdb/astest tools/gdb/gdbcont tools/gdb/gdbsend
|
||||
|
||||
clobber: clean
|
||||
find . -type f \
|
||||
\( -name .depend -o -name '*.srec' -o -name '*.bin' \) \
|
||||
-print \
|
||||
| xargs rm -f
|
||||
rm -f $(OBJS) *.bak tags TAGS
|
||||
rm -fr *.*~
|
||||
rm -f u-boot u-boot.bin u-boot.elf u-boot.srec u-boot.map System.map
|
||||
rm -f tools/crc32.c tools/environment.c
|
||||
rm -f include/asm/arch include/asm
|
||||
|
||||
mrproper \
|
||||
distclean: clobber unconfig
|
||||
|
||||
backup:
|
||||
F=`basename $(TOPDIR)` ; cd .. ; \
|
||||
gtar --force-local -zcvf `date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F
|
||||
|
||||
#########################################################################
|
118
board/cogent/README
Normal file
118
board/cogent/README
Normal file
@ -0,0 +1,118 @@
|
||||
Cogent Modular Architecture configuration
|
||||
-----------------------------------------
|
||||
|
||||
As the name suggests, the Cogent platform is a modular system where
|
||||
you have a motherboard into which plugs a cpu module and one or more
|
||||
i/o modules. This provides very nice flexibility, but makes the
|
||||
configuration task somewhat harder.
|
||||
|
||||
The possible Cogent motherboards are:
|
||||
|
||||
Code Config Variable Description
|
||||
---- --------------- -----------
|
||||
|
||||
CMA101 CONFIG_CMA101 32MB ram, 2 ser, 1 par, rtc, dipsw,
|
||||
2x16 lcd, eth(?)
|
||||
CMA102 CONFIG_CMA102 32MB ram, 2 ser, 1 par, rtc, dipsw,
|
||||
2x16 lcd
|
||||
CMA111 CONFIG_CMA111 32MB ram, 1MB flash, 4 ser, 1 par,
|
||||
rtc, ps/2 kbd/mse, 2x16 lcd, 2xPCI,
|
||||
10/100TP eth
|
||||
CMA120 CONFIG_CMA120 32MB ram, 1MB flash, 4 ser, 1 par,
|
||||
rtc, ps/2 kbd/mse, 2x16 lcd, 2xPCI,
|
||||
10/100TP eth, 2xPCMCIA, video/lcd-panel
|
||||
CMA150 CONFIG_CMA150 8MB ram, 1MB flash, 2 ser, 1 par, rtc,
|
||||
ps/2 kbd/mse, 2x16 lcd
|
||||
|
||||
The possible Cogent PowerPC CPU modules are:
|
||||
|
||||
Code Config Variable Description
|
||||
---- --------------- -----------
|
||||
|
||||
CMA278-603EV CONFIG_CMA278_603EV PPC603ev CPU, 66MHz clock, 512K EPROM,
|
||||
JTAG/COP
|
||||
CMA278-603ER CONFIG_CMA278_603ER PPC603er CPU, 66MHz clock, 512K EPROM,
|
||||
JTAG/COP
|
||||
CMA278-740 CONFIG_CMA278_740 PPC740 CPU, 66MHz clock, 512K EPROM,
|
||||
JTAG/COP
|
||||
CMA280-509 CONFIG_CMA280_509 MPC505/509 CPU, 50MHz clock,
|
||||
512K EPROM, BDM
|
||||
CMA282 CONFIG_CMA282 MPC8260 CPU, 66MHz clock, 512K EPROM,
|
||||
JTAG, 16M RAM, 1 x ser (SMC2),
|
||||
1 x 10baseT PHY (SCC4), 1 x 10/100 TP
|
||||
PHY (FCC1), 2 x 48pin DIN (FCC2 + TDM1)
|
||||
CMA285 CONFIG_CMA285 MPC801 CPU, 33MHz clock, 512K EPROM,
|
||||
BDM
|
||||
CMA286-21 CONFIG_CMA286_21 MPC821 CPU, 66MHz clock, 512K EPROM,
|
||||
BDM, 16M RAM, 2 x ser (SMC1 + SMC2),
|
||||
1 x 10baseT PHY (SCC2)
|
||||
CMA286-60-OLD CONFIG_CMA286_60_OLD MPC860 CPU, 33MHz clock, 128K EPROM,
|
||||
BDM
|
||||
CMA286-60 CONFIG_CMA286_60 MPC860 CPU, 66MHz clock, 512K EPROM,
|
||||
BDM, 16M RAM, 2 x ser (SMC1 + SMC2),
|
||||
1 x 10baseT PHY (SCC2)
|
||||
CMA286-60P CONFIG_CMA286_60P MPC860P CPU, 66MHz clock, 512K EPROM,
|
||||
BDM, 16M RAM, 2 x ser (SMC1 + SMC2),
|
||||
1 x 10baseT PHY (SCC2)
|
||||
CMA287-23 CONFIG_CMA287_23 MPC823 CPU, 33MHz clock, 512K EPROM,
|
||||
BDM
|
||||
CMA287-50 CONFIG_CMA287_50 MPC850 CPU, 33MHz clock, 512K EPROM,
|
||||
BDM
|
||||
|
||||
(there are a lot of other cpu modules with ARM, MIPS and M-CORE CPUs,
|
||||
but we'll worry about those later).
|
||||
|
||||
The possible Cogent CMA I/O Modules are:
|
||||
|
||||
Code Config Variable Description
|
||||
---- --------------- -----------
|
||||
|
||||
CMA302 CONFIG_CMA302 up to 16M flash, ps/2 keyboard/mouse
|
||||
CMA352 CONFIG_CMA352 CMAbus <=> PCI
|
||||
|
||||
Currently supported:
|
||||
|
||||
Motherboards: CMA102
|
||||
CPU Modules: CMA286-60-OLD
|
||||
I/O Modules: CMA302 I/O module
|
||||
|
||||
To configure, perform the usual U-Boot configuration task of editing
|
||||
"include/config_cogent_mpc8xx.h" and reviewing all the options and
|
||||
settings in there. In particular, check the chip select values
|
||||
installed into the memory controller's various option and base
|
||||
registers - these are set by the defines CFG_CMA_CSn_{BASE,SIZE} and
|
||||
CFG_{B,O}Rn_PRELIM. Also be careful of the clock settings installed
|
||||
into the SCCR - via the define CFG_SCCR. Finally, decide whether you
|
||||
want the serial console on motherboard serial port A or on one of the
|
||||
8xx SMC ports, and set CONFIG_8xx_CONS_{SMC1,SMC2,NONE} accordingly
|
||||
(NONE means use Cogent motherboard serial port A).
|
||||
|
||||
Then edit the file "cogent/config.mk". Firstly, set TEXT_BASE to be
|
||||
the base address of the EPROM for the CPU module. This should be the
|
||||
same as the value selected for CFG_MONITOR_BASE in
|
||||
"include/config_cogent_*.h" (in fact, I have made this automatic via
|
||||
the -DTEXT_BASE=... option in CPPFLAGS).
|
||||
|
||||
Finally, set the values of the make variables $(CMA_MB) and $(CMA_IOMS).
|
||||
|
||||
$(CMA_MB) is the name of the directory that contains support for your
|
||||
motherboard. At this stage, only "cma10x" exists, which supports the
|
||||
CMA101 and CMA102 motherboards - but only selected devices, namely
|
||||
serial, lcd and dipsw.
|
||||
|
||||
$(CMA_IOMS) is a list of zero or more directories that contain
|
||||
support for the i/o modules you have installed. At this stage, only
|
||||
"cma302" exists, which supports the CMA302 flash i/o module - but
|
||||
only the flash part, not the ps/2 keyboard and mouse interfaces.
|
||||
|
||||
There should be a make variable for each of the above directories,
|
||||
which is the directory name with "_O" appended. This make variable is
|
||||
a list of object files to compile from that directory and include in
|
||||
the library.
|
||||
|
||||
e.g. cma10x_O = serial.o ...
|
||||
|
||||
That's it. Good Luck.
|
||||
|
||||
Murray.Jensen@cmst.csiro.au
|
||||
August 31, 2000.
|
40
board/cpu86/config.mk
Normal file
40
board/cpu86/config.mk
Normal file
@ -0,0 +1,40 @@
|
||||
#
|
||||
# (C) Copyright 2001
|
||||
# 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
|
||||
#
|
||||
|
||||
#
|
||||
# CPU86 boards
|
||||
#
|
||||
|
||||
# This should be equal to the CFG_FLASH_BASE define in config_CPU86.h
|
||||
# for the "final" configuration, with U-Boot in flash, or the address
|
||||
# in RAM where U-Boot is loaded at for debugging.
|
||||
#
|
||||
|
||||
ifeq ($(CONFIG_BOOT_ROM),y)
|
||||
TEXT_BASE := 0xFF800000
|
||||
PLATFORM_CPPFLAGS += -DCONFIG_BOOT_ROM
|
||||
else
|
||||
TEXT_BASE := 0xFF000000
|
||||
endif
|
||||
|
||||
PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -I$(TOPDIR)
|
26
board/cray/L1/config.mk
Normal file
26
board/cray/L1/config.mk
Normal file
@ -0,0 +1,26 @@
|
||||
#
|
||||
# (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
|
||||
#
|
||||
|
||||
# Note: I make an "image" from U-Boot itself, which prefixes 0x40 bytes of
|
||||
# header info, hence start address is thus shifted.
|
||||
TEXT_BASE = 0xFFFD0040
|
453
board/cu824/README
Normal file
453
board/cu824/README
Normal file
@ -0,0 +1,453 @@
|
||||
ppcboot for a CU824 board
|
||||
---------------------------
|
||||
|
||||
CU824 has two banks of flash 8MB each. In board's notation, bank 0 is
|
||||
the one at the address of 0xFF800000 and bank 1 is the one at the
|
||||
address of 0xFF000000. On power-up the processor jumps to the address
|
||||
of 0xFFF00100, the last megabyte of the bank 0 of flash. Thus,
|
||||
U-Boot is configured to reside in flash starting at the address of
|
||||
0xFFF00000. The environment space is not embedded in the U-Boot code
|
||||
and is located in flash separately from U-Boot, at the address of
|
||||
0xFF008000.
|
||||
|
||||
|
||||
U-Boot test results
|
||||
--------------------
|
||||
|
||||
x.x Operation on all available serial consoles
|
||||
|
||||
x.x.x CONFIG_CONS_INDEX 1
|
||||
|
||||
|
||||
ppcboot 0.9.2 (May 13 2001 - 17:56:46)
|
||||
|
||||
Initializing...
|
||||
CPU: MPC8240 Revsion 1.1 at 247 MHz: 16 kB I-Cache 16 kB D-Cache
|
||||
Board: CU824 Revision 1 Local Bus at 99 MHz
|
||||
DRAM: 64 MB
|
||||
FLASH: 16 MB
|
||||
In: serial
|
||||
Out: serial
|
||||
Err: serial
|
||||
|
||||
Hit any key to stop autoboot: 0
|
||||
=>
|
||||
=>he
|
||||
go - start application at address 'addr'
|
||||
run - run commands in an environment variable
|
||||
bootm - boot application image from memory
|
||||
bootp - boot image via network using BootP/TFTP protocol
|
||||
tftpboot- boot image via network using TFTP protocol
|
||||
and env variables ipaddr and serverip
|
||||
rarpboot- boot image via network using RARP/TFTP protocol
|
||||
bootd - boot default, i.e., run 'bootcmd'
|
||||
loads - load S-Record file over serial line
|
||||
loadb - load binary file over serial line (kermit mode)
|
||||
md - memory display
|
||||
mm - memory modify (auto-incrementing)
|
||||
nm - memory modify (constant address)
|
||||
mw - memory write (fill)
|
||||
cp - memory copy
|
||||
cmp - memory compare
|
||||
crc32 - checksum calculation
|
||||
base - print or set address offset
|
||||
printenv- print environment variables
|
||||
setenv - set environment variables
|
||||
saveenv - save environment variables to persistent storage
|
||||
protect - enable or disable FLASH write protection
|
||||
erase - erase FLASH memory
|
||||
flinfo - print FLASH memory information
|
||||
bdinfo - print Board Info structure
|
||||
iminfo - print header information for application image
|
||||
coninfo - print console devices and informations
|
||||
loop - infinite loop on address range
|
||||
mtest - simple RAM test
|
||||
icache - enable or disable instruction cache
|
||||
dcache - enable or disable data cache
|
||||
reset - Perform RESET of the CPU
|
||||
echo - echo args to console
|
||||
version - print monitor version
|
||||
help - print online help
|
||||
? - alias for 'help'
|
||||
=>
|
||||
|
||||
|
||||
x.x.x CONFIG_CONS_INDEX 2
|
||||
|
||||
**** NOT TESTED ****
|
||||
|
||||
x.x Flash Driver Operation
|
||||
|
||||
x.x.x Erase Operation
|
||||
|
||||
|
||||
ppcboot 0.9.2 (May 13 2001 - 17:56:46)
|
||||
|
||||
Initializing...
|
||||
CPU: MPC8240 Revsion 1.1 at 247 MHz: 16 kB I-Cache 16 kB D-Cache
|
||||
Board: CU824 Revision 1 Local Bus at 99 MHz
|
||||
DRAM: 64 MB
|
||||
FLASH: 16 MB
|
||||
In: serial
|
||||
Out: serial
|
||||
Err: serial
|
||||
|
||||
Hit any key to stop autoboot: 0
|
||||
=>
|
||||
=>
|
||||
=>
|
||||
=>md ff000000
|
||||
ff000000: 27051956 70706362 6f6f7420 302e382e '..Vppcboot 0.8.
|
||||
ff000010: 3320284d 61792031 31203230 3031202d 3 (May 11 2001 -
|
||||
ff000020: 2031343a 35373a30 33290000 00000000 14:57:03)......
|
||||
ff000030: 00000000 00000000 00000000 00000000 ................
|
||||
ff000040: 00000000 00000000 00000000 00000000 ................
|
||||
ff000050: 00000000 00000000 00000000 00000000 ................
|
||||
ff000060: 00000000 00000000 00000000 00000000 ................
|
||||
ff000070: 00000000 00000000 00000000 00000000 ................
|
||||
ff000080: 00000000 00000000 00000000 00000000 ................
|
||||
ff000090: 00000000 00000000 00000000 00000000 ................
|
||||
ff0000a0: 00000000 00000000 00000000 00000000 ................
|
||||
ff0000b0: 00000000 00000000 00000000 00000000 ................
|
||||
ff0000c0: 00000000 00000000 00000000 00000000 ................
|
||||
ff0000d0: 00000000 00000000 00000000 00000000 ................
|
||||
ff0000e0: 00000000 00000000 00000000 00000000 ................
|
||||
ff0000f0: 00000000 00000000 00000000 00000000 ................
|
||||
=>erase ff000000 ff007fff
|
||||
Erase Flash from 0xff000000 to 0xff007fff
|
||||
done
|
||||
Erased 1 sectors
|
||||
=>md ff000000
|
||||
ff000000: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000010: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000020: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000030: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000040: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000050: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000060: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000070: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000080: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000090: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000a0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000b0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000c0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000d0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000e0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000f0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
=>
|
||||
|
||||
x.x.x Information
|
||||
|
||||
|
||||
ppcboot 0.9.2 (May 13 2001 - 17:56:46)
|
||||
|
||||
Initializing...
|
||||
CPU: MPC8240 Revsion 1.1 at 247 MHz: 16 kB I-Cache 16 kB D-Cache
|
||||
Board: CU824 Revision 1 Local Bus at 99 MHz
|
||||
DRAM: 64 MB
|
||||
FLASH: 16 MB
|
||||
In: serial
|
||||
Out: serial
|
||||
Err: serial
|
||||
|
||||
Hit any key to stop autoboot: 0
|
||||
=>
|
||||
=>
|
||||
=>
|
||||
=>
|
||||
=>flinfo
|
||||
|
||||
Bank # 1: Intel: 28F160F3B (16Mbit)
|
||||
Size: 8 MB in 39 Sectors
|
||||
Sector Start Addresses:
|
||||
FF000000 FF008000 (RO) FF010000 FF018000 FF020000
|
||||
FF028000 FF030000 FF038000 FF040000 FF080000
|
||||
FF0C0000 FF100000 FF140000 FF180000 FF1C0000
|
||||
FF200000 FF240000 FF280000 FF2C0000 FF300000
|
||||
FF340000 FF380000 FF3C0000 FF400000 FF440000
|
||||
FF480000 FF4C0000 FF500000 FF540000 FF580000
|
||||
FF5C0000 FF600000 FF640000 FF680000 FF6C0000
|
||||
FF700000 FF740000 FF780000 FF7C0000
|
||||
|
||||
Bank # 2: Intel: 28F160F3B (16Mbit)
|
||||
Size: 8 MB in 39 Sectors
|
||||
Sector Start Addresses:
|
||||
FF800000 FF808000 FF810000 FF818000 FF820000
|
||||
FF828000 FF830000 FF838000 FF840000 FF880000
|
||||
FF8C0000 FF900000 FF940000 FF980000 FF9C0000
|
||||
FFA00000 FFA40000 FFA80000 FFAC0000 FFB00000
|
||||
FFB40000 FFB80000 FFBC0000 FFC00000 FFC40000
|
||||
FFC80000 FFCC0000 FFD00000 FFD40000 FFD80000
|
||||
FFDC0000 FFE00000 FFE40000 FFE80000 FFEC0000
|
||||
FFF00000 (RO) FFF40000 FFF80000 FFFC0000
|
||||
=>
|
||||
|
||||
x.x.x Flash Programming
|
||||
|
||||
|
||||
ppcboot 0.9.2 (May 13 2001 - 17:56:46)
|
||||
|
||||
Initializing...
|
||||
CPU: MPC8240 Revsion 1.1 at 247 MHz: 16 kB I-Cache 16 kB D-Cache
|
||||
Board: CU824 Revision 1 Local Bus at 99 MHz
|
||||
DRAM: 64 MB
|
||||
FLASH: 16 MB
|
||||
In: serial
|
||||
Out: serial
|
||||
Err: serial
|
||||
|
||||
Hit any key to stop autoboot: 0
|
||||
=>
|
||||
=>
|
||||
=>
|
||||
=>
|
||||
=>cp 0 ff000000 20
|
||||
Copy to Flash... done
|
||||
=>md 0
|
||||
00000000: 0ec08ce0 03f9800c 00000001 040c0000 ................
|
||||
00000010: 00000001 03fd1aa0 03fd1ae4 03fd1a00 ................
|
||||
00000020: 03fd1a58 03fceb04 03fd34cc 03fd34d0 ...X......4...4.
|
||||
00000030: 03fcd5bc 03fcdabc 00000000 00000000 ................
|
||||
00000040: 00000000 00000000 00000000 00000000 ................
|
||||
00000050: 00000000 00000000 00000000 00000000 ................
|
||||
00000060: 00000000 00000000 00000000 00000000 ................
|
||||
00000070: 00000000 00000000 00000000 00000000 ................
|
||||
00000080: 00000000 00000000 00000000 00000000 ................
|
||||
00000090: 00000000 00000000 00000000 00000000 ................
|
||||
000000a0: 00000000 00000000 00000000 00000000 ................
|
||||
000000b0: 00000000 00000000 00000000 00000000 ................
|
||||
000000c0: 00000000 00000000 00000000 00000000 ................
|
||||
000000d0: 00000000 00000000 00000000 00000000 ................
|
||||
000000e0: 00000000 00000000 00000000 00000000 ................
|
||||
000000f0: 00000000 00000000 00000000 00000000 ................
|
||||
=>md ff000000
|
||||
ff000000: 0ec08ce0 03f9800c 00000001 040c0000 ................
|
||||
ff000010: 00000001 03fd1aa0 03fd1ae4 03fd1a00 ................
|
||||
ff000020: 03fd1a58 03fceb04 03fd34cc 03fd34d0 ...X......4...4.
|
||||
ff000030: 03fcd5bc 03fcdabc 00000000 00000000 ................
|
||||
ff000040: 00000000 00000000 00000000 00000000 ................
|
||||
ff000050: 00000000 00000000 00000000 00000000 ................
|
||||
ff000060: 00000000 00000000 00000000 00000000 ................
|
||||
ff000070: 00000000 00000000 00000000 00000000 ................
|
||||
ff000080: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff000090: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000a0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000b0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000c0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000d0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000e0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
ff0000f0: ffffffff ffffffff ffffffff ffffffff ................
|
||||
=>
|
||||
|
||||
x.x.x Storage of environment variables in flash
|
||||
|
||||
|
||||
ppcboot 0.9.2 (May 13 2001 - 17:56:46)
|
||||
|
||||
Initializing...
|
||||
CPU: MPC8240 Revsion 1.1 at 247 MHz: 16 kB I-Cache 16 kB D-Cache
|
||||
Board: CU824 Revision 1 Local Bus at 99 MHz
|
||||
DRAM: 64 MB
|
||||
FLASH: 16 MB
|
||||
In: serial
|
||||
Out: serial
|
||||
Err: serial
|
||||
|
||||
Hit any key to stop autoboot: 0
|
||||
=>
|
||||
=>printenv
|
||||
bootargs=
|
||||
bootcmd=bootm FE020000
|
||||
bootdelay=5
|
||||
baudrate=9600
|
||||
ipaddr=192.168.4.2
|
||||
serverip=192.168.4.1
|
||||
ethaddr=00:40:42:01:00:a0
|
||||
stdin=serial
|
||||
stdout=serial
|
||||
stderr=serial
|
||||
|
||||
Environment size: 167/32764 bytes
|
||||
=>setenv myvar 1234
|
||||
=>save_env
|
||||
Un-Protected 1 sectors
|
||||
Erasing Flash...
|
||||
done
|
||||
Erased 1 sectors
|
||||
Saving Environment to Flash...
|
||||
Protected 1 sectors
|
||||
=>reset
|
||||
|
||||
|
||||
ppcboot 0.9.2 (May 13 2001 - 17:56:46)
|
||||
|
||||
Initializing...
|
||||
CPU: MPC8240 Revsion 1.1 at 247 MHz: 16 kB I-Cache 16 kB D-Cache
|
||||
Board: CU824 Revision 1 Local Bus at 99 MHz
|
||||
DRAM: 64 MB
|
||||
FLASH: 16 MB
|
||||
In: serial
|
||||
Out: serial
|
||||
Err: serial
|
||||
|
||||
Hit any key to stop autoboot: 0
|
||||
=>
|
||||
=>printenv
|
||||
bootargs=
|
||||
bootcmd=bootm FE020000
|
||||
bootdelay=5
|
||||
baudrate=9600
|
||||
ipaddr=192.168.4.2
|
||||
serverip=192.168.4.1
|
||||
ethaddr=00:40:42:01:00:a0
|
||||
myvar=1234
|
||||
stdin=serial
|
||||
stdout=serial
|
||||
stderr=serial
|
||||
|
||||
Environment size: 178/32764 bytes
|
||||
=>
|
||||
|
||||
x.x Image Download and run over serial port
|
||||
|
||||
|
||||
ppcboot 0.9.2 (May 13 2001 - 17:56:46)
|
||||
|
||||
Initializing...
|
||||
CPU: MPC8240 Revsion 1.1 at 247 MHz: 16 kB I-Cache 16 kB D-Cache
|
||||
Board: CU824 Revision 1 Local Bus at 99 MHz
|
||||
DRAM: 64 MB
|
||||
FLASH: 16 MB
|
||||
In: serial
|
||||
Out: serial
|
||||
Err: serial
|
||||
|
||||
Hit any key to stop autoboot: 0
|
||||
=>
|
||||
=>
|
||||
=>mw 40000 0 10000
|
||||
=>md 40000
|
||||
00040000: 00000000 00000000 00000000 00000000 ................
|
||||
00040010: 00000000 00000000 00000000 00000000 ................
|
||||
00040020: 00000000 00000000 00000000 00000000 ................
|
||||
00040030: 00000000 00000000 00000000 00000000 ................
|
||||
00040040: 00000000 00000000 00000000 00000000 ................
|
||||
00040050: 00000000 00000000 00000000 00000000 ................
|
||||
00040060: 00000000 00000000 00000000 00000000 ................
|
||||
00040070: 00000000 00000000 00000000 00000000 ................
|
||||
00040080: 00000000 00000000 00000000 00000000 ................
|
||||
00040090: 00000000 00000000 00000000 00000000 ................
|
||||
000400a0: 00000000 00000000 00000000 00000000 ................
|
||||
000400b0: 00000000 00000000 00000000 00000000 ................
|
||||
000400c0: 00000000 00000000 00000000 00000000 ................
|
||||
000400d0: 00000000 00000000 00000000 00000000 ................
|
||||
000400e0: 00000000 00000000 00000000 00000000 ................
|
||||
000400f0: 00000000 00000000 00000000 00000000 ................
|
||||
=>loads
|
||||
## Ready for S-Record download ...
|
||||
|
||||
(Back at xpert.denx.de)
|
||||
[vlad@xpert vlad]$ cat hello_world.srec >/dev/ttyS0
|
||||
[vlad@xpert vlad]$ kermit -l /dev/ttyS0 -b 9600 -c
|
||||
Connecting to /dev/ttyS0, speed 9600.
|
||||
The escape character is Ctrl-\ (ASCII 28, FS)
|
||||
Type the escape character followed by C to get back,
|
||||
or followed by ? to see other options.
|
||||
md 40000
|
||||
00040000: 00018148 9421ffe0 7c0802a6 bf61000c ...H.!..|....a..
|
||||
00040010: 90010024 48000005 7fc802a6 801effe8 ...$H...........
|
||||
00040020: 7fc0f214 7c7f1b78 813f0038 7c9c2378 ....|..x.?.8|.#x
|
||||
00040030: 807e8000 7cbd2b78 80090010 3b600000 .~..|.+x....;`..
|
||||
00040040: 7c0803a6 4e800021 813f0038 7f84e378 |...N..!.?.8...x
|
||||
00040050: 807e8004 80090010 7c0803a6 4e800021 .~......|...N..!
|
||||
00040060: 7c1be000 4181003c 80bd0000 813f0038 |...A..<.....?.8
|
||||
00040070: 3bbd0004 2c050000 40820008 80be8008 ;...,...@.......
|
||||
00040080: 80090010 7f64db78 807e800c 3b7b0001 .....d.x.~..;{..
|
||||
00040090: 7c0803a6 4e800021 7c1be000 4081ffcc |...N..!|...@...
|
||||
000400a0: 813f0038 807e8010 80090010 7c0803a6 .?.8.~......|...
|
||||
000400b0: 4e800021 813f0038 80090004 7c0803a6 N..!.?.8....|...
|
||||
000400c0: 4e800021 2c030000 4182ffec 813f0038 N..!,...A....?.8
|
||||
000400d0: 80090000 7c0803a6 4e800021 813f0038 ....|...N..!.?.8
|
||||
000400e0: 807e8014 80090010 7c0803a6 4e800021 .~......|...N..!
|
||||
000400f0: 38600000 80010024 7c0803a6 bb61000c 8`.....$|....a..
|
||||
=>go 40004
|
||||
## Starting application at 0x00040004 ...
|
||||
Hello World
|
||||
argc = 1
|
||||
argv[0] = "40004"
|
||||
argv[1] = "<NULL>"
|
||||
Hit any key to exit ...
|
||||
|
||||
## Application terminated, rc = 0x0
|
||||
=>
|
||||
|
||||
x.x Image download and run over ethernet interface
|
||||
|
||||
|
||||
ppcboot 0.9.2 (May 13 2001 - 17:56:46)
|
||||
|
||||
Initializing...
|
||||
CPU: MPC8240 Revsion 1.1 at 247 MHz: 16 kB I-Cache 16 kB D-Cache
|
||||
Board: CU824 Revision 1 Local Bus at 99 MHz
|
||||
DRAM: 64 MB
|
||||
FLASH: 16 MB
|
||||
In: serial
|
||||
Out: serial
|
||||
Err: serial
|
||||
|
||||
Hit any key to stop autoboot: 0
|
||||
=>
|
||||
=>
|
||||
=>mw 40000 0 10000
|
||||
=>md 40000
|
||||
00040000: 00000000 00000000 00000000 00000000 ................
|
||||
00040010: 00000000 00000000 00000000 00000000 ................
|
||||
00040020: 00000000 00000000 00000000 00000000 ................
|
||||
00040030: 00000000 00000000 00000000 00000000 ................
|
||||
00040040: 00000000 00000000 00000000 00000000 ................
|
||||
00040050: 00000000 00000000 00000000 00000000 ................
|
||||
00040060: 00000000 00000000 00000000 00000000 ................
|
||||
00040070: 00000000 00000000 00000000 00000000 ................
|
||||
00040080: 00000000 00000000 00000000 00000000 ................
|
||||
00040090: 00000000 00000000 00000000 00000000 ................
|
||||
000400a0: 00000000 00000000 00000000 00000000 ................
|
||||
000400b0: 00000000 00000000 00000000 00000000 ................
|
||||
000400c0: 00000000 00000000 00000000 00000000 ................
|
||||
000400d0: 00000000 00000000 00000000 00000000 ................
|
||||
000400e0: 00000000 00000000 00000000 00000000 ................
|
||||
000400f0: 00000000 00000000 00000000 00000000 ................
|
||||
=>tftpboot 40000 hello_world.bin
|
||||
ARP broadcast 1
|
||||
TFTP from server 192.168.4.1; our IP address is 192.168.4.2
|
||||
Filename 'hello_world.bin'.
|
||||
Load address: 0x40000
|
||||
Loading: #############
|
||||
done
|
||||
Bytes transferred = 65912 (10178 hex)
|
||||
=>md 40000
|
||||
00040000: 00018148 9421ffe0 7c0802a6 bf61000c ...H.!..|....a..
|
||||
00040010: 90010024 48000005 7fc802a6 801effe8 ...$H...........
|
||||
00040020: 7fc0f214 7c7f1b78 813f0038 7c9c2378 ....|..x.?.8|.#x
|
||||
00040030: 807e8000 7cbd2b78 80090010 3b600000 .~..|.+x....;`..
|
||||
00040040: 7c0803a6 4e800021 813f0038 7f84e378 |...N..!.?.8...x
|
||||
00040050: 807e8004 80090010 7c0803a6 4e800021 .~......|...N..!
|
||||
00040060: 7c1be000 4181003c 80bd0000 813f0038 |...A..<.....?.8
|
||||
00040070: 3bbd0004 2c050000 40820008 80be8008 ;...,...@.......
|
||||
00040080: 80090010 7f64db78 807e800c 3b7b0001 .....d.x.~..;{..
|
||||
00040090: 7c0803a6 4e800021 7c1be000 4081ffcc |...N..!|...@...
|
||||
000400a0: 813f0038 807e8010 80090010 7c0803a6 .?.8.~......|...
|
||||
000400b0: 4e800021 813f0038 80090004 7c0803a6 N..!.?.8....|...
|
||||
000400c0: 4e800021 2c030000 4182ffec 813f0038 N..!,...A....?.8
|
||||
000400d0: 80090000 7c0803a6 4e800021 813f0038 ....|...N..!.?.8
|
||||
000400e0: 807e8014 80090010 7c0803a6 4e800021 .~......|...N..!
|
||||
000400f0: 38600000 80010024 7c0803a6 bb61000c 8`.....$|....a..
|
||||
=>go 40004
|
||||
## Starting application at 0x00040004 ...
|
||||
Hello World
|
||||
argc = 1
|
||||
argv[0] = "40004"
|
||||
argv[1] = "<NULL>"
|
||||
Hit any key to exit ...
|
||||
|
||||
## Application terminated, rc = 0x0
|
||||
=>
|
247
board/eltec/bab7xx/bab7xx.c
Normal file
247
board/eltec/bab7xx/bab7xx.c
Normal file
@ -0,0 +1,247 @@
|
||||
/*
|
||||
* (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||
* Andreas Heppel <aheppel@sysgo.de>
|
||||
* (C) Copyright 2001 ELTEC Elektronik AG
|
||||
* Frank Gottschling <fgottschling@eltec.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 <mpc106.h>
|
||||
#include <mk48t59.h>
|
||||
#include <74xx_7xx.h>
|
||||
#include <ns87308.h>
|
||||
#include <video_fb.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*
|
||||
* Get Bus clock frequency
|
||||
*/
|
||||
ulong bab7xx_get_bus_freq (void)
|
||||
{
|
||||
/*
|
||||
* The GPIO Port 1 on BAB7xx reflects the bus speed.
|
||||
*/
|
||||
volatile struct GPIO *gpio = (struct GPIO *)(CFG_ISA_IO + CFG_NS87308_GPIO_BASE);
|
||||
|
||||
unsigned char data = gpio->dta1;
|
||||
|
||||
if (data & 0x02)
|
||||
return 66666666;
|
||||
|
||||
return 83333333;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Measure CPU clock speed (core clock GCLK1) (Approx. GCLK frequency in Hz)
|
||||
*/
|
||||
ulong bab7xx_get_gclk_freq (void)
|
||||
{
|
||||
static const int pllratio_to_factor[] = {
|
||||
00, 75, 70, 00, 20, 65, 100, 45, 30, 55, 40, 50, 80, 60, 35, 00,
|
||||
};
|
||||
|
||||
return pllratio_to_factor[get_hid1 () >> 28] * (bab7xx_get_bus_freq() / 10);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int checkcpu (void)
|
||||
{
|
||||
uint pvr = get_pvr();
|
||||
|
||||
printf ("MPC7xx V%d.%d",(pvr >> 8) & 0xFF, pvr & 0xFF);
|
||||
printf (" at %ld / %ld MHz\n", bab7xx_get_gclk_freq()/1000000,
|
||||
bab7xx_get_bus_freq()/1000000);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
int checkboard (void)
|
||||
{
|
||||
#ifdef CFG_ADDRESS_MAP_A
|
||||
puts ("Board: ELTEC BAB7xx PReP\n");
|
||||
#else
|
||||
puts ("Board: ELTEC BAB7xx CHRP\n");
|
||||
#endif
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
int checkflash (void)
|
||||
{
|
||||
/* TODO: XXX XXX XXX */
|
||||
printf ("2 MB ## Test not implemented yet ##\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
|
||||
static unsigned int mpc106_read_cfg_dword (unsigned int reg)
|
||||
{
|
||||
unsigned int reg_addr = MPC106_REG | (reg & 0xFFFFFFFC);
|
||||
|
||||
out32r(MPC106_REG_ADDR, reg_addr);
|
||||
|
||||
return (in32r(MPC106_REG_DATA | (reg & 0x3)));
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
long int dram_size (int board_type)
|
||||
{
|
||||
/* No actual initialisation to do - done when setting up
|
||||
* PICRs MCCRs ME/SARs etc in ram_init.S.
|
||||
*/
|
||||
|
||||
register unsigned long i, msar1, mear1, memSize;
|
||||
|
||||
#if defined(CFG_MEMTEST)
|
||||
register unsigned long reg;
|
||||
|
||||
printf("Testing DRAM\n");
|
||||
|
||||
/* write each mem addr with it's address */
|
||||
for (reg = CFG_MEMTEST_START; reg < CFG_MEMTEST_END; reg+=4)
|
||||
*reg = reg;
|
||||
|
||||
for (reg = CFG_MEMTEST_START; reg < CFG_MEMTEST_END; reg+=4)
|
||||
{
|
||||
if (*reg != reg)
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Since MPC106 memory controller chip has already been set to
|
||||
* control all memory, just read and interpret its memory boundery register.
|
||||
*/
|
||||
memSize = 0;
|
||||
msar1 = mpc106_read_cfg_dword(MPC106_MSAR1);
|
||||
mear1 = mpc106_read_cfg_dword(MPC106_MEAR1);
|
||||
i = mpc106_read_cfg_dword(MPC106_MBER) & 0xf;
|
||||
|
||||
do
|
||||
{
|
||||
if (i & 0x01) /* is bank enabled ? */
|
||||
memSize += (mear1 & 0xff) - (msar1 & 0xff) + 1;
|
||||
msar1 >>= 8;
|
||||
mear1 >>= 8;
|
||||
i >>= 1;
|
||||
} while (i);
|
||||
|
||||
return (memSize * 0x100000);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
long int initdram(int board_type)
|
||||
{
|
||||
return dram_size(board_type);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
void after_reloc (ulong dest_addr)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/*
|
||||
* Jump to the main U-Boot board init code
|
||||
*/
|
||||
board_init_r(gd, dest_addr);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* do_reset is done here because in this case it is board specific, since the
|
||||
* 7xx CPUs can only be reset by external HW (the RTC in this case).
|
||||
*/
|
||||
void
|
||||
do_reset (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
|
||||
{
|
||||
#if defined(CONFIG_RTC_MK48T59)
|
||||
/* trigger watchdog immediately */
|
||||
rtc_set_watchdog(1, RTC_WD_RB_16TH);
|
||||
#else
|
||||
#error "You must define the macro CONFIG_RTC_MK48T59."
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_WATCHDOG)
|
||||
/*
|
||||
* Since the 7xx CPUs don't have an internal watchdog, this function is
|
||||
* board specific. We use the RTC here.
|
||||
*/
|
||||
void watchdog_reset(void)
|
||||
{
|
||||
#if defined(CONFIG_RTC_MK48T59)
|
||||
/* we use a 32 sec watchdog timer */
|
||||
rtc_set_watchdog(8, RTC_WD_RB_4);
|
||||
#else
|
||||
#error "You must define the macro CONFIG_RTC_MK48T59."
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_WATCHDOG */
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_CONSOLE_EXTRA_INFO
|
||||
extern GraphicDevice smi;
|
||||
|
||||
void video_get_info_str (int line_number, char *info)
|
||||
{
|
||||
/* init video info strings for graphic console */
|
||||
switch (line_number)
|
||||
{
|
||||
case 1:
|
||||
sprintf (info," MPC7xx V%d.%d at %ld / %ld MHz",
|
||||
(get_pvr() >> 8) & 0xFF,
|
||||
get_pvr() & 0xFF,
|
||||
bab7xx_get_gclk_freq()/1000000,
|
||||
bab7xx_get_bus_freq()/1000000);
|
||||
return;
|
||||
case 2:
|
||||
sprintf (info, " ELTEC BAB7xx with %ld MB DRAM and %ld MB FLASH",
|
||||
dram_size(0)/0x100000,
|
||||
flash_init()/0x100000);
|
||||
return;
|
||||
case 3:
|
||||
sprintf (info, " %s", smi.modeIdent);
|
||||
return;
|
||||
}
|
||||
|
||||
/* no more info lines */
|
||||
*info = 0;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
189
board/eltec/elppc/elppc.c
Normal file
189
board/eltec/elppc/elppc.c
Normal file
@ -0,0 +1,189 @@
|
||||
/*
|
||||
* (C) Copyright 2002 ELTEC Elektronik AG
|
||||
* Frank Gottschling <fgottschling@eltec.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 <mpc106.h>
|
||||
#include <video_fb.h>
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
int checkboard (void)
|
||||
{
|
||||
puts ("Board: ELTEC PowerPC\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
int checkflash (void)
|
||||
{
|
||||
/* TODO */
|
||||
printf ("Test not implemented !\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
static unsigned int mpc106_read_cfg_dword (unsigned int reg)
|
||||
{
|
||||
unsigned int reg_addr = MPC106_REG | (reg & 0xFFFFFFFC);
|
||||
|
||||
out32r(MPC106_REG_ADDR, reg_addr);
|
||||
|
||||
return (in32r(MPC106_REG_DATA | (reg & 0x3)));
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
long int dram_size (int board_type)
|
||||
{
|
||||
/*
|
||||
* No actual initialisation to do - done when setting up
|
||||
* PICRs MCCRs ME/SARs etc in asm_init.S.
|
||||
*/
|
||||
|
||||
register unsigned long i, msar1, mear1, memSize;
|
||||
|
||||
#if defined(CFG_MEMTEST)
|
||||
register unsigned long reg;
|
||||
|
||||
printf("Testing DRAM\n");
|
||||
|
||||
/* write each mem addr with it's address */
|
||||
for (reg = CFG_MEMTEST_START; reg < CFG_MEMTEST_END; reg+=4)
|
||||
*reg = reg;
|
||||
|
||||
for (reg = CFG_MEMTEST_START; reg < CFG_MEMTEST_END; reg+=4)
|
||||
{
|
||||
if (*reg != reg)
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Since MPC107 memory controller chip has already been set to
|
||||
* control all memory, just read and interpret its memory boundery register.
|
||||
*/
|
||||
memSize = 0;
|
||||
msar1 = mpc106_read_cfg_dword(MPC106_MSAR1);
|
||||
mear1 = mpc106_read_cfg_dword(MPC106_MEAR1);
|
||||
i = mpc106_read_cfg_dword(MPC106_MBER) & 0xf;
|
||||
|
||||
do
|
||||
{
|
||||
if (i & 0x01) /* is bank enabled ? */
|
||||
memSize += (mear1 & 0xff) - (msar1 & 0xff) + 1;
|
||||
msar1 >>= 8;
|
||||
mear1 >>= 8;
|
||||
i >>= 1;
|
||||
} while (i);
|
||||
|
||||
return (memSize * 0x100000);
|
||||
}
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
long int initdram(int board_type)
|
||||
{
|
||||
return dram_size(board_type);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* The BAB 911 can be reset by writing bit 0 of the Processor Initialization
|
||||
* Register PI in the MPC 107 (at offset 0x41090 of the Embedded Utilities
|
||||
* Memory Block).
|
||||
*/
|
||||
void do_reset (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
|
||||
{
|
||||
out8(MPC107_EUMB_PI, 1);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_WATCHDOG)
|
||||
|
||||
/*
|
||||
* Since the 7xx CPUs don't have an internal watchdog, this function is
|
||||
* board specific.
|
||||
*/
|
||||
void watchdog_reset(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_WATCHDOG */
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
void after_reloc (ulong dest_addr)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/*
|
||||
* Jump to the main U-Boot board init code
|
||||
*/
|
||||
board_init_r(gd, dest_addr);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_CONSOLE_EXTRA_INFO
|
||||
extern GraphicDevice smi;
|
||||
|
||||
void video_get_info_str (int line_number, char *info)
|
||||
{
|
||||
/* init video info strings for graphic console */
|
||||
switch (line_number)
|
||||
{
|
||||
case 1:
|
||||
sprintf (info," MPC7xx V%d.%d at %d / %d MHz",
|
||||
(get_pvr() >> 8) & 0xFF,
|
||||
get_pvr() & 0xFF,
|
||||
400,
|
||||
100);
|
||||
return;
|
||||
case 2:
|
||||
sprintf (info, " ELTEC ELPPC with %ld MB DRAM and %ld MB FLASH",
|
||||
dram_size(0)/0x100000,
|
||||
flash_init()/0x100000);
|
||||
return;
|
||||
case 3:
|
||||
sprintf (info, " %s", smi.modeIdent);
|
||||
return;
|
||||
}
|
||||
|
||||
/* no more info lines */
|
||||
*info = 0;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
36
board/ep8260/config.mk
Normal file
36
board/ep8260/config.mk
Normal file
@ -0,0 +1,36 @@
|
||||
#
|
||||
# (C) Copyright 2002
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# See file CREDITS for list of people who contributed to this
|
||||
# project.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
# MA 02111-1307 USA
|
||||
#
|
||||
|
||||
#
|
||||
# EP8260 boards
|
||||
#
|
||||
|
||||
# This should be equal to the CFG_FLASH_BASE define in config_ep8260.h
|
||||
# for the "final" configuration, with U-Boot in flash, or the address
|
||||
# in RAM where U-Boot is loaded at for debugging.
|
||||
#
|
||||
#TEXT_BASE = 0x00100000
|
||||
#TEXT_BASE = 0xFF000000
|
||||
TEXT_BASE = 0xFFF00000
|
||||
|
||||
PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -I$(TOPDIR)
|
437
board/evb64260/evb64260.c
Normal file
437
board/evb64260/evb64260.c
Normal file
@ -0,0 +1,437 @@
|
||||
/*
|
||||
* (C) Copyright 2001
|
||||
* Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* evb64260.c - main board support/init for the Galileo Eval board.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <74xx_7xx.h>
|
||||
#include <galileo/memory.h>
|
||||
#include <galileo/pci.h>
|
||||
#include <galileo/gt64260R.h>
|
||||
#include <net.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include "eth.h"
|
||||
#include "mpsc.h"
|
||||
#include "i2c.h"
|
||||
#include "64260.h"
|
||||
#ifdef CONFIG_ZUMA_V2
|
||||
extern void zuma_mbox_init(void);
|
||||
#endif
|
||||
|
||||
#undef DEBUG
|
||||
#define MAP_PCI
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DP(x) x
|
||||
#else
|
||||
#define DP(x)
|
||||
#endif
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* this is the current GT register space location */
|
||||
/* it starts at CFG_DFL_GT_REGS but moves later to CFG_GT_REGS */
|
||||
|
||||
/* Unfortunately, we cant change it while we are in flash, so we initialize it
|
||||
* to the "final" value. This means that any debug_led calls before
|
||||
* board_pre_init wont work right (like in cpu_init_f).
|
||||
* See also my_remap_gt_regs below. (NTL)
|
||||
*/
|
||||
|
||||
unsigned int INTERNAL_REG_BASE_ADDR = CFG_GT_REGS;
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* This is a version of the GT register space remapping function that
|
||||
* doesn't touch globals (meaning, it's ok to run from flash.)
|
||||
*
|
||||
* Unfortunately, this has the side effect that a writable
|
||||
* INTERNAL_REG_BASE_ADDR is impossible. Oh well.
|
||||
*/
|
||||
|
||||
void
|
||||
my_remap_gt_regs(u32 cur_loc, u32 new_loc)
|
||||
{
|
||||
u32 temp;
|
||||
|
||||
/* check and see if it's already moved */
|
||||
temp = in_le32((u32 *)(new_loc + INTERNAL_SPACE_DECODE));
|
||||
if ((temp & 0xffff) == new_loc >> 20)
|
||||
return;
|
||||
|
||||
temp = (in_le32((u32 *)(cur_loc + INTERNAL_SPACE_DECODE)) &
|
||||
0xffff0000) | (new_loc >> 20);
|
||||
|
||||
out_le32((u32 *)(cur_loc + INTERNAL_SPACE_DECODE), temp);
|
||||
|
||||
while (GTREGREAD(INTERNAL_SPACE_DECODE) != temp);
|
||||
}
|
||||
|
||||
static void
|
||||
gt_pci_config(void)
|
||||
{
|
||||
/* move PCI stuff out of the way - NTL */
|
||||
/* map PCI Host 0 */
|
||||
pciMapSpace(PCI_HOST0, PCI_REGION0, CFG_PCI0_0_MEM_SPACE,
|
||||
CFG_PCI0_0_MEM_SPACE, CFG_PCI0_MEM_SIZE);
|
||||
|
||||
pciMapSpace(PCI_HOST0, PCI_REGION1, 0, 0, 0);
|
||||
pciMapSpace(PCI_HOST0, PCI_REGION2, 0, 0, 0);
|
||||
pciMapSpace(PCI_HOST0, PCI_REGION3, 0, 0, 0);
|
||||
|
||||
pciMapSpace(PCI_HOST0, PCI_IO, CFG_PCI0_IO_SPACE_PCI,
|
||||
CFG_PCI0_IO_SPACE, CFG_PCI0_IO_SIZE);
|
||||
|
||||
/* map PCI Host 1 */
|
||||
pciMapSpace(PCI_HOST1, PCI_REGION0, CFG_PCI1_0_MEM_SPACE,
|
||||
CFG_PCI1_0_MEM_SPACE, CFG_PCI1_MEM_SIZE);
|
||||
|
||||
pciMapSpace(PCI_HOST1, PCI_REGION1, 0, 0, 0);
|
||||
pciMapSpace(PCI_HOST1, PCI_REGION2, 0, 0, 0);
|
||||
pciMapSpace(PCI_HOST1, PCI_REGION3, 0, 0, 0);
|
||||
|
||||
pciMapSpace(PCI_HOST1, PCI_IO, CFG_PCI1_IO_SPACE_PCI,
|
||||
CFG_PCI1_IO_SPACE, CFG_PCI1_IO_SIZE);
|
||||
|
||||
/* PCI interface settings */
|
||||
GT_REG_WRITE(PCI_0TIMEOUT_RETRY, 0xffff);
|
||||
GT_REG_WRITE(PCI_1TIMEOUT_RETRY, 0xffff);
|
||||
GT_REG_WRITE(PCI_0BASE_ADDRESS_REGISTERS_ENABLE, 0xfffff80e);
|
||||
GT_REG_WRITE(PCI_1BASE_ADDRESS_REGISTERS_ENABLE, 0xfffff80e);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* Setup CPU interface paramaters */
|
||||
static void
|
||||
gt_cpu_config(void)
|
||||
{
|
||||
cpu_t cpu = get_cpu_type();
|
||||
ulong tmp;
|
||||
|
||||
/* cpu configuration register */
|
||||
tmp = GTREGREAD(CPU_CONFIGURATION);
|
||||
|
||||
/* set the AACK delay bit
|
||||
* see Res#14 */
|
||||
tmp |= CPU_CONF_AACK_DELAY;
|
||||
tmp &= ~CPU_CONF_AACK_DELAY_2; /* New RGF */
|
||||
|
||||
/* Galileo claims this is necessary for all busses >= 100 MHz */
|
||||
tmp |= CPU_CONF_FAST_CLK;
|
||||
|
||||
if (cpu == CPU_750CX) {
|
||||
tmp &= ~CPU_CONF_DP_VALID; /* Safer, needed for CXe. RGF */
|
||||
tmp &= ~CPU_CONF_AP_VALID;
|
||||
} else {
|
||||
tmp |= CPU_CONF_DP_VALID;
|
||||
tmp |= CPU_CONF_AP_VALID;
|
||||
}
|
||||
|
||||
/* this only works with the MPX bus */
|
||||
tmp &= ~CPU_CONF_RD_OOO; /* Safer RGF */
|
||||
tmp |= CPU_CONF_PIPELINE;
|
||||
tmp |= CPU_CONF_TA_DELAY;
|
||||
|
||||
GT_REG_WRITE(CPU_CONFIGURATION, tmp);
|
||||
|
||||
/* CPU master control register */
|
||||
tmp = GTREGREAD(CPU_MASTER_CONTROL);
|
||||
|
||||
tmp |= CPU_MAST_CTL_ARB_EN;
|
||||
|
||||
if ((cpu == CPU_7400) ||
|
||||
(cpu == CPU_7410) ||
|
||||
(cpu == CPU_7450)) {
|
||||
|
||||
tmp |= CPU_MAST_CTL_CLEAN_BLK;
|
||||
tmp |= CPU_MAST_CTL_FLUSH_BLK;
|
||||
|
||||
} else {
|
||||
/* cleanblock must be cleared for CPUs
|
||||
* that do not support this command
|
||||
* see Res#1 */
|
||||
tmp &= ~CPU_MAST_CTL_CLEAN_BLK;
|
||||
tmp &= ~CPU_MAST_CTL_FLUSH_BLK;
|
||||
}
|
||||
GT_REG_WRITE(CPU_MASTER_CONTROL, tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
* board_pre_init.
|
||||
*
|
||||
* set up gal. device mappings, etc.
|
||||
*/
|
||||
int board_pre_init (void)
|
||||
{
|
||||
uchar sram_boot = 0;
|
||||
|
||||
/*
|
||||
* set up the GT the way the kernel wants it
|
||||
* the call to move the GT register space will obviously
|
||||
* fail if it has already been done, but we're going to assume
|
||||
* that if it's not at the power-on location, it's where we put
|
||||
* it last time. (huber)
|
||||
*/
|
||||
my_remap_gt_regs(CFG_DFL_GT_REGS, CFG_GT_REGS);
|
||||
|
||||
gt_pci_config();
|
||||
|
||||
/* mask all external interrupt sources */
|
||||
GT_REG_WRITE(CPU_INTERRUPT_MASK_REGISTER_LOW, 0);
|
||||
GT_REG_WRITE(CPU_INTERRUPT_MASK_REGISTER_HIGH, 0);
|
||||
GT_REG_WRITE(PCI_0INTERRUPT_CAUSE_MASK_REGISTER_LOW, 0);
|
||||
GT_REG_WRITE(PCI_0INTERRUPT_CAUSE_MASK_REGISTER_HIGH, 0);
|
||||
GT_REG_WRITE(PCI_1INTERRUPT_CAUSE_MASK_REGISTER_LOW, 0);
|
||||
GT_REG_WRITE(PCI_1INTERRUPT_CAUSE_MASK_REGISTER_HIGH, 0);
|
||||
GT_REG_WRITE(CPU_INT_0_MASK, 0);
|
||||
GT_REG_WRITE(CPU_INT_1_MASK, 0);
|
||||
GT_REG_WRITE(CPU_INT_2_MASK, 0);
|
||||
GT_REG_WRITE(CPU_INT_3_MASK, 0);
|
||||
|
||||
/* now, onto the configuration */
|
||||
GT_REG_WRITE(SDRAM_CONFIGURATION, CFG_SDRAM_CONFIG);
|
||||
|
||||
/* ----- DEVICE BUS SETTINGS ------ */
|
||||
|
||||
/*
|
||||
* EVB
|
||||
* 0 - SRAM
|
||||
* 1 - RTC
|
||||
* 2 - UART
|
||||
* 3 - Flash
|
||||
* boot - BootCS
|
||||
*
|
||||
* Zuma
|
||||
* 0 - Flash
|
||||
* boot - BootCS
|
||||
*/
|
||||
|
||||
/*
|
||||
* the dual 7450 module requires burst access to the boot
|
||||
* device, so the serial rom copies the boot device to the
|
||||
* on-board sram on the eval board, and updates the correct
|
||||
* registers to boot from the sram. (device0)
|
||||
*/
|
||||
#ifdef CONFIG_ZUMA_V2
|
||||
/* Zuma has no SRAM */
|
||||
sram_boot = 0;
|
||||
#else
|
||||
if (memoryGetDeviceBaseAddress(DEVICE0) && 0xfff00000 == CFG_MONITOR_BASE)
|
||||
sram_boot = 1;
|
||||
#endif
|
||||
|
||||
if (!sram_boot)
|
||||
memoryMapDeviceSpace(DEVICE0, CFG_DEV0_SPACE, CFG_DEV0_SIZE);
|
||||
|
||||
memoryMapDeviceSpace(DEVICE1, CFG_DEV1_SPACE, CFG_DEV1_SIZE);
|
||||
memoryMapDeviceSpace(DEVICE2, CFG_DEV2_SPACE, CFG_DEV2_SIZE);
|
||||
memoryMapDeviceSpace(DEVICE3, CFG_DEV3_SPACE, CFG_DEV3_SIZE);
|
||||
|
||||
/* configure device timing */
|
||||
#ifdef CFG_DEV0_PAR
|
||||
if (!sram_boot)
|
||||
GT_REG_WRITE(DEVICE_BANK0PARAMETERS, CFG_DEV0_PAR);
|
||||
#endif
|
||||
|
||||
#ifdef CFG_DEV1_PAR
|
||||
GT_REG_WRITE(DEVICE_BANK1PARAMETERS, CFG_DEV1_PAR);
|
||||
#endif
|
||||
#ifdef CFG_DEV2_PAR
|
||||
GT_REG_WRITE(DEVICE_BANK2PARAMETERS, CFG_DEV2_PAR);
|
||||
#endif
|
||||
|
||||
#ifdef CFG_32BIT_BOOT_PAR
|
||||
/* detect if we are booting from the 32 bit flash */
|
||||
if (GTREGREAD(DEVICE_BOOT_BANK_PARAMETERS) & (0x3 << 20)) {
|
||||
/* 32 bit boot flash */
|
||||
GT_REG_WRITE(DEVICE_BANK3PARAMETERS, CFG_8BIT_BOOT_PAR);
|
||||
GT_REG_WRITE(DEVICE_BOOT_BANK_PARAMETERS, CFG_32BIT_BOOT_PAR);
|
||||
} else {
|
||||
/* 8 bit boot flash */
|
||||
GT_REG_WRITE(DEVICE_BANK3PARAMETERS, CFG_32BIT_BOOT_PAR);
|
||||
GT_REG_WRITE(DEVICE_BOOT_BANK_PARAMETERS, CFG_8BIT_BOOT_PAR);
|
||||
}
|
||||
#else
|
||||
/* 8 bit boot flash only */
|
||||
GT_REG_WRITE(DEVICE_BOOT_BANK_PARAMETERS, CFG_8BIT_BOOT_PAR);
|
||||
#endif
|
||||
|
||||
gt_cpu_config();
|
||||
|
||||
/* MPP setup */
|
||||
GT_REG_WRITE(MPP_CONTROL0, CFG_MPP_CONTROL_0);
|
||||
GT_REG_WRITE(MPP_CONTROL1, CFG_MPP_CONTROL_1);
|
||||
GT_REG_WRITE(MPP_CONTROL2, CFG_MPP_CONTROL_2);
|
||||
GT_REG_WRITE(MPP_CONTROL3, CFG_MPP_CONTROL_3);
|
||||
|
||||
GT_REG_WRITE(GPP_LEVEL_CONTROL, CFG_GPP_LEVEL_CONTROL);
|
||||
GT_REG_WRITE(SERIAL_PORT_MULTIPLEX, CFG_SERIAL_PORT_MUX);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* various things to do after relocation */
|
||||
|
||||
int misc_init_r (void)
|
||||
{
|
||||
icache_enable();
|
||||
#ifdef CFG_L2
|
||||
l2cache_enable();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MPSC
|
||||
mpsc_init2();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ZUMA_V2
|
||||
zuma_mbox_init();
|
||||
#endif
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
after_reloc(gd_t *gd, ulong dest_addr)
|
||||
{
|
||||
/* check to see if we booted from the sram. If so, move things
|
||||
* back to the way they should be. (we're running from main
|
||||
* memory at this point now */
|
||||
|
||||
if (memoryGetDeviceBaseAddress(DEVICE0) == CFG_MONITOR_BASE) {
|
||||
memoryMapDeviceSpace(DEVICE0, CFG_DEV0_SPACE, CFG_DEV0_SIZE);
|
||||
memoryMapDeviceSpace(BOOT_DEVICE, CFG_FLASH_BASE, _1M);
|
||||
}
|
||||
|
||||
/* now, jump to the main U-Boot board init code */
|
||||
board_init_r (gd, dest_addr);
|
||||
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Check Board Identity:
|
||||
*/
|
||||
|
||||
int
|
||||
checkboard (void)
|
||||
{
|
||||
puts ("Board: " CFG_BOARD_NAME "\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* utility functions */
|
||||
void
|
||||
debug_led(int led, int mode)
|
||||
{
|
||||
#ifndef CONFIG_ZUMA_V2
|
||||
volatile int *addr = NULL;
|
||||
int dummy;
|
||||
|
||||
if (mode == 1) {
|
||||
switch (led) {
|
||||
case 0:
|
||||
addr = (int *)((unsigned int)CFG_DEV1_SPACE | 0x08000);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
addr = (int *)((unsigned int)CFG_DEV1_SPACE | 0x0c000);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
addr = (int *)((unsigned int)CFG_DEV1_SPACE | 0x10000);
|
||||
break;
|
||||
}
|
||||
} else if (mode == 0) {
|
||||
switch (led) {
|
||||
case 0:
|
||||
addr = (int *)((unsigned int)CFG_DEV1_SPACE | 0x14000);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
addr = (int *)((unsigned int)CFG_DEV1_SPACE | 0x18000);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
addr = (int *)((unsigned int)CFG_DEV1_SPACE | 0x1c000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
WRITE_CHAR(addr, 0);
|
||||
dummy = *addr;
|
||||
#endif /* CONFIG_ZUMA_V2 */
|
||||
}
|
||||
|
||||
void
|
||||
display_mem_map(void)
|
||||
{
|
||||
int i,j;
|
||||
unsigned int base,size,width;
|
||||
/* SDRAM */
|
||||
printf("SDRAM\n");
|
||||
for(i=0;i<=BANK3;i++) {
|
||||
base = memoryGetBankBaseAddress(i);
|
||||
size = memoryGetBankSize(i);
|
||||
if(size !=0)
|
||||
{
|
||||
printf("BANK%d: base - 0x%08x\tsize - %dM bytes\n",i,base,size>>20);
|
||||
}
|
||||
}
|
||||
|
||||
/* CPU's PCI windows */
|
||||
for(i=0;i<=PCI_HOST1;i++) {
|
||||
printf("\nCPU's PCI %d windows\n", i);
|
||||
base=pciGetSpaceBase(i,PCI_IO);
|
||||
size=pciGetSpaceSize(i,PCI_IO);
|
||||
printf(" IO: base - 0x%08x\tsize - %dM bytes\n",base,size>>20);
|
||||
for(j=0;j<=PCI_REGION3;j++) {
|
||||
base = pciGetSpaceBase(i,j);
|
||||
size = pciGetSpaceSize(i,j);
|
||||
printf("MEMORY %d: base - 0x%08x\tsize - %dM bytes\n",j,base,
|
||||
size>>20);
|
||||
}
|
||||
}
|
||||
|
||||
/* Devices */
|
||||
printf("\nDEVICES\n");
|
||||
for(i=0;i<=DEVICE3;i++) {
|
||||
base = memoryGetDeviceBaseAddress(i);
|
||||
size = memoryGetDeviceSize(i);
|
||||
width= memoryGetDeviceWidth(i) * 8;
|
||||
printf("DEV %d: base - 0x%08x\tsize - %dM bytes\twidth - %d bits\n",
|
||||
i, base, size>>20, width);
|
||||
}
|
||||
|
||||
/* Bootrom */
|
||||
base = memoryGetDeviceBaseAddress(BOOT_DEVICE); /* Boot */
|
||||
size = memoryGetDeviceSize(BOOT_DEVICE);
|
||||
width= memoryGetDeviceWidth(BOOT_DEVICE) * 8;
|
||||
printf(" BOOT: base - 0x%08x\tsize - %dM bytes\twidth - %d bits\n",
|
||||
base, size>>20, width);
|
||||
}
|
||||
|
805
board/evb64260/flash.c
Normal file
805
board/evb64260/flash.c
Normal file
@ -0,0 +1,805 @@
|
||||
/*
|
||||
* (C) Copyright 2001
|
||||
* Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* flash.c - flash support for the 512k, 8bit boot flash on the GEVB
|
||||
* most of this file was based on the existing U-Boot
|
||||
* flash drivers.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <mpc8xx.h>
|
||||
#include <galileo/gt64260R.h>
|
||||
#include <galileo/memory.h>
|
||||
#include "intel_flash.h"
|
||||
|
||||
#define FLASH_ROM 0xFFFD /* unknown flash type */
|
||||
#define FLASH_RAM 0xFFFE /* unknown flash type */
|
||||
#define FLASH_MAN_UNKNOWN 0xFFFF0000
|
||||
|
||||
/* #define DEBUG */
|
||||
/* #define FLASH_ID_OVERRIDE */ /* Hack to set type to 040B if ROM emulator is installed.
|
||||
* Can be used to program a ROM in circuit if a programmer
|
||||
* is not available by swapping the rom out. */
|
||||
|
||||
/* Intel flash commands */
|
||||
int flash_erase_intel(flash_info_t *info, int s_first, int s_last);
|
||||
int write_word_intel(bank_addr_t addr, bank_word_t value);
|
||||
|
||||
flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Functions
|
||||
*/
|
||||
static ulong flash_get_size (int portwidth, vu_long *addr, flash_info_t *info);
|
||||
static int write_word (flash_info_t *info, ulong dest, ulong data);
|
||||
static void flash_get_offsets (ulong base, flash_info_t *info);
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
unsigned long
|
||||
flash_init (void)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned long size_b0 = 0, size_b1 = 0;
|
||||
unsigned long base, flash_size;
|
||||
|
||||
/* Init: no FLASHes known */
|
||||
for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {
|
||||
flash_info[i].flash_id = FLASH_UNKNOWN;
|
||||
}
|
||||
|
||||
/* the boot flash */
|
||||
base = CFG_FLASH_BASE;
|
||||
size_b0 = flash_get_size(1, (vu_long *)base, &flash_info[0]);
|
||||
|
||||
printf("[%ldkB@%lx] ", size_b0/1024, base);
|
||||
|
||||
if (flash_info[0].flash_id == FLASH_UNKNOWN) {
|
||||
printf ("## Unknown FLASH at %08lx: Size = 0x%08lx = %ld MB\n",
|
||||
base, size_b0, size_b0<<20);
|
||||
}
|
||||
|
||||
base = memoryGetDeviceBaseAddress(CFG_EXTRA_FLASH_DEVICE);
|
||||
for(i=1;i<CFG_MAX_FLASH_BANKS;i++) {
|
||||
unsigned long size = flash_get_size(CFG_EXTRA_FLASH_WIDTH, (vu_long *)base, &flash_info[i]);
|
||||
|
||||
printf("[%ldMB@%lx] ", size>>20, base);
|
||||
|
||||
if (flash_info[i].flash_id == FLASH_UNKNOWN) {
|
||||
if(i==1) {
|
||||
printf ("## Unknown FLASH at %08lx: Size = 0x%08lx = %ld MB\n",
|
||||
base, size_b1, size_b1<<20);
|
||||
}
|
||||
break;
|
||||
}
|
||||
size_b1+=size;
|
||||
base+=size;
|
||||
}
|
||||
|
||||
flash_size = size_b0 + size_b1;
|
||||
return flash_size;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
static void
|
||||
flash_get_offsets (ulong base, flash_info_t *info)
|
||||
{
|
||||
int i;
|
||||
int sector_size;
|
||||
|
||||
if(!info->sector_count) return;
|
||||
|
||||
/* set up sector start address table */
|
||||
switch(info->flash_id & FLASH_TYPEMASK) {
|
||||
case FLASH_AM040:
|
||||
case FLASH_28F128J3A:
|
||||
case FLASH_28F640J3A:
|
||||
case FLASH_RAM:
|
||||
/* this chip has uniformly spaced sectors */
|
||||
sector_size=info->size/info->sector_count;
|
||||
for (i = 0; i < info->sector_count; i++)
|
||||
info->start[i] = base + (i * sector_size);
|
||||
break;
|
||||
default:
|
||||
if (info->flash_id & FLASH_BTYPE) {
|
||||
/* set sector offsets for bottom boot block type */
|
||||
info->start[0] = base + 0x00000000;
|
||||
info->start[1] = base + 0x00008000;
|
||||
info->start[2] = base + 0x0000C000;
|
||||
info->start[3] = base + 0x00010000;
|
||||
for (i = 4; i < info->sector_count; i++) {
|
||||
info->start[i] = base + (i * 0x00020000) - 0x00060000;
|
||||
}
|
||||
} else {
|
||||
/* set sector offsets for top boot block type */
|
||||
i = info->sector_count - 1;
|
||||
info->start[i--] = base + info->size - 0x00008000;
|
||||
info->start[i--] = base + info->size - 0x0000C000;
|
||||
info->start[i--] = base + info->size - 0x00010000;
|
||||
for (; i >= 0; i--) {
|
||||
info->start[i] = base + i * 0x00020000;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
flash_print_info (flash_info_t *info)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (info->flash_id == FLASH_UNKNOWN) {
|
||||
printf ("missing or unknown FLASH type\n");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (info->flash_id & FLASH_VENDMASK) {
|
||||
case FLASH_MAN_AMD: printf ("AMD "); break;
|
||||
case FLASH_MAN_FUJ: printf ("FUJITSU "); break;
|
||||
case FLASH_MAN_INTEL: printf ("INTEL "); break;
|
||||
default: printf ("Unknown Vendor "); break;
|
||||
}
|
||||
|
||||
switch (info->flash_id & FLASH_TYPEMASK) {
|
||||
case FLASH_AM040:
|
||||
printf ("AM29LV040B (4 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM400B:
|
||||
printf ("AM29LV400B (4 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM400T:
|
||||
printf ("AM29LV400T (4 Mbit, top boot sector)\n");
|
||||
break;
|
||||
case FLASH_AM800B:
|
||||
printf ("AM29LV800B (8 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM800T:
|
||||
printf ("AM29LV800T (8 Mbit, top boot sector)\n");
|
||||
break;
|
||||
case FLASH_AM160B:
|
||||
printf ("AM29LV160B (16 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM160T:
|
||||
printf ("AM29LV160T (16 Mbit, top boot sector)\n");
|
||||
break;
|
||||
case FLASH_AM320B:
|
||||
printf ("AM29LV320B (32 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM320T:
|
||||
printf ("AM29LV320T (32 Mbit, top boot sector)\n");
|
||||
break;
|
||||
case FLASH_28F640J3A:
|
||||
printf ("28F640J3A (64 Mbit)\n");
|
||||
break;
|
||||
case FLASH_28F128J3A:
|
||||
printf ("28F128J3A (128 Mbit)\n");
|
||||
break;
|
||||
case FLASH_ROM:
|
||||
printf ("ROM\n");
|
||||
break;
|
||||
case FLASH_RAM:
|
||||
printf ("RAM\n");
|
||||
break;
|
||||
default:
|
||||
printf ("Unknown Chip Type\n");
|
||||
break;
|
||||
}
|
||||
|
||||
puts (" Size: ");
|
||||
print_size (info->size, "");
|
||||
printf (" in %d Sectors\n", info->sector_count);
|
||||
|
||||
printf (" Sector Start Addresses:");
|
||||
for (i=0; i<info->sector_count; ++i) {
|
||||
if ((i % 5) == 0)
|
||||
printf ("\n ");
|
||||
printf (" %08lX%s",
|
||||
info->start[i],
|
||||
info->protect[i] ? " (RO)" : " "
|
||||
);
|
||||
}
|
||||
printf ("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* The following code cannot be run from FLASH!
|
||||
*/
|
||||
|
||||
static inline void flash_cmd(int width, volatile unsigned char *addr, int offset, unsigned char cmd)
|
||||
{
|
||||
/* supports 1x8, 1x16, and 2x16 */
|
||||
/* 2x8 and 4x8 are not supported */
|
||||
if(width==4) {
|
||||
/* assuming chips are in 16 bit mode */
|
||||
/* 2x16 */
|
||||
unsigned long cmd32=(cmd<<16)|cmd;
|
||||
*(volatile unsigned long *)(addr+offset*2)=cmd32;
|
||||
} else {
|
||||
/* 1x16 or 1x8 */
|
||||
*(volatile unsigned char *)(addr+offset)=cmd;
|
||||
}
|
||||
}
|
||||
|
||||
static ulong
|
||||
flash_get_size (int portwidth, vu_long *addr, flash_info_t *info)
|
||||
{
|
||||
short i;
|
||||
volatile unsigned char *caddr = (unsigned char *)addr;
|
||||
volatile unsigned short *saddr = (unsigned short *)addr;
|
||||
volatile unsigned long *laddr = (unsigned long *)addr;
|
||||
char old[2], save;
|
||||
ulong id, manu, base = (ulong)addr;
|
||||
|
||||
info->portwidth=portwidth;
|
||||
|
||||
save = *caddr;
|
||||
|
||||
flash_cmd(portwidth,caddr,0,0xf0);
|
||||
flash_cmd(portwidth,caddr,0,0xf0);
|
||||
|
||||
udelay(10);
|
||||
|
||||
old[0] = caddr[0];
|
||||
old[1] = caddr[1];
|
||||
|
||||
|
||||
if(old[0]!=0xf0) {
|
||||
flash_cmd(portwidth,caddr,0,0xf0);
|
||||
flash_cmd(portwidth,caddr,0,0xf0);
|
||||
|
||||
udelay(10);
|
||||
|
||||
if(*caddr==0xf0) {
|
||||
/* this area is ROM */
|
||||
*caddr=save;
|
||||
#ifndef FLASH_ID_OVERRIDE
|
||||
info->flash_id = FLASH_ROM + FLASH_MAN_UNKNOWN;
|
||||
info->sector_count = 8;
|
||||
info->size = 0x80000;
|
||||
#else
|
||||
info->flash_id = FLASH_MAN_AMD + FLASH_AM040;
|
||||
info->sector_count = 8;
|
||||
info->size = 0x80000;
|
||||
info->chipwidth=1;
|
||||
#endif
|
||||
flash_get_offsets(base, info);
|
||||
return info->size;
|
||||
}
|
||||
} else {
|
||||
*caddr=0;
|
||||
|
||||
udelay(10);
|
||||
|
||||
if(*caddr==0) {
|
||||
/* this area is RAM */
|
||||
*caddr=save;
|
||||
info->flash_id = FLASH_RAM + FLASH_MAN_UNKNOWN;
|
||||
info->sector_count = 8;
|
||||
info->size = 0x80000;
|
||||
flash_get_offsets(base, info);
|
||||
return info->size;
|
||||
}
|
||||
flash_cmd(portwidth,caddr,0,0xf0);
|
||||
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
/* Write auto select command: read Manufacturer ID */
|
||||
flash_cmd(portwidth,caddr,0x555,0xAA);
|
||||
flash_cmd(portwidth,caddr,0x2AA,0x55);
|
||||
flash_cmd(portwidth,caddr,0x555,0x90);
|
||||
|
||||
udelay(10);
|
||||
|
||||
if ((caddr[0] == old[0]) &&
|
||||
(caddr[1] == old[1])) {
|
||||
|
||||
/* this area is ROM */
|
||||
#ifndef FLASH_ID_OVERRIDE
|
||||
info->flash_id = FLASH_ROM + FLASH_MAN_UNKNOWN;
|
||||
info->sector_count = 8;
|
||||
info->size = 0x80000;
|
||||
#else
|
||||
info->flash_id = FLASH_MAN_AMD + FLASH_AM040;
|
||||
info->sector_count = 8;
|
||||
info->size = 0x80000;
|
||||
info->chipwidth=1;
|
||||
#endif
|
||||
flash_get_offsets(base, info);
|
||||
return info->size;
|
||||
#ifdef DEBUG
|
||||
} else {
|
||||
printf("%px%d: %02x:%02x -> %02x:%02x\n",
|
||||
caddr, portwidth, old[0], old[1],
|
||||
caddr[0], caddr[1]);
|
||||
#endif
|
||||
}
|
||||
|
||||
switch(portwidth) {
|
||||
case 1:
|
||||
manu = caddr[0];
|
||||
manu |= manu<<16;
|
||||
id = caddr[1];
|
||||
break;
|
||||
case 2:
|
||||
manu = saddr[0];
|
||||
manu |= manu<<16;
|
||||
id = saddr[1];
|
||||
id |= id<<16;
|
||||
break;
|
||||
case 4:
|
||||
manu = laddr[0];
|
||||
id = laddr[1];
|
||||
break;
|
||||
default:
|
||||
id = manu = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("\n%08lx:%08lx:%08lx\n", base, manu, id);
|
||||
printf("%08lx %08lx %08lx %08lx\n",
|
||||
laddr[0],laddr[1],laddr[2],laddr[3]);
|
||||
#endif
|
||||
|
||||
switch (manu) {
|
||||
case AMD_MANUFACT:
|
||||
info->flash_id = FLASH_MAN_AMD;
|
||||
break;
|
||||
case FUJ_MANUFACT:
|
||||
info->flash_id = FLASH_MAN_FUJ;
|
||||
break;
|
||||
case INTEL_MANUFACT:
|
||||
info->flash_id = FLASH_MAN_INTEL;
|
||||
break;
|
||||
default:
|
||||
printf("Unknown Mfr [%08lx]:%08lx\n", manu, id);
|
||||
info->flash_id = FLASH_UNKNOWN;
|
||||
info->sector_count = 0;
|
||||
info->size = 0;
|
||||
return (0); /* no or unknown flash */
|
||||
}
|
||||
|
||||
switch (id) {
|
||||
case AMD_ID_LV400T:
|
||||
info->flash_id += FLASH_AM400T;
|
||||
info->sector_count = 11;
|
||||
info->size = 0x00100000;
|
||||
info->chipwidth=1;
|
||||
break; /* => 1 MB */
|
||||
|
||||
case AMD_ID_LV400B:
|
||||
info->flash_id += FLASH_AM400B;
|
||||
info->sector_count = 11;
|
||||
info->size = 0x00100000;
|
||||
info->chipwidth=1;
|
||||
break; /* => 1 MB */
|
||||
|
||||
case AMD_ID_LV800T:
|
||||
info->flash_id += FLASH_AM800T;
|
||||
info->sector_count = 19;
|
||||
info->size = 0x00200000;
|
||||
info->chipwidth=1;
|
||||
break; /* => 2 MB */
|
||||
|
||||
case AMD_ID_LV800B:
|
||||
info->flash_id += FLASH_AM800B;
|
||||
info->sector_count = 19;
|
||||
info->size = 0x00200000;
|
||||
info->chipwidth=1;
|
||||
break; /* => 2 MB */
|
||||
|
||||
case AMD_ID_LV160T:
|
||||
info->flash_id += FLASH_AM160T;
|
||||
info->sector_count = 35;
|
||||
info->size = 0x00400000;
|
||||
info->chipwidth=1;
|
||||
break; /* => 4 MB */
|
||||
|
||||
case AMD_ID_LV160B:
|
||||
info->flash_id += FLASH_AM160B;
|
||||
info->sector_count = 35;
|
||||
info->size = 0x00400000;
|
||||
info->chipwidth=1;
|
||||
break; /* => 4 MB */
|
||||
#if 0 /* enable when device IDs are available */
|
||||
case AMD_ID_LV320T:
|
||||
info->flash_id += FLASH_AM320T;
|
||||
info->sector_count = 67;
|
||||
info->size = 0x00800000;
|
||||
break; /* => 8 MB */
|
||||
|
||||
case AMD_ID_LV320B:
|
||||
info->flash_id += FLASH_AM320B;
|
||||
info->sector_count = 67;
|
||||
info->size = 0x00800000;
|
||||
break; /* => 8 MB */
|
||||
#endif
|
||||
case AMD_ID_LV040B:
|
||||
info->flash_id += FLASH_AM040;
|
||||
info->sector_count = 8;
|
||||
info->size = 0x80000;
|
||||
info->chipwidth=1;
|
||||
break;
|
||||
|
||||
case INTEL_ID_28F640J3A:
|
||||
info->flash_id += FLASH_28F640J3A;
|
||||
info->sector_count = 64;
|
||||
info->size = 128*1024 * 64; /* 128kbytes x 64 blocks */
|
||||
info->chipwidth=2;
|
||||
if(portwidth==4) info->size*=2; /* 2x16 */
|
||||
break;
|
||||
|
||||
case INTEL_ID_28F128J3A:
|
||||
info->flash_id += FLASH_28F128J3A;
|
||||
info->sector_count = 128;
|
||||
info->size = 128*1024 * 128; /* 128kbytes x 128 blocks */
|
||||
info->chipwidth=2;
|
||||
if(portwidth==4) info->size*=2; /* 2x16 */
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Unknown id %lx:[%lx]\n", manu, id);
|
||||
info->flash_id = FLASH_UNKNOWN;
|
||||
info->chipwidth=1;
|
||||
return (0); /* => no or unknown flash */
|
||||
|
||||
}
|
||||
|
||||
flash_get_offsets(base, info);
|
||||
|
||||
#if 0
|
||||
/* set up sector start address table */
|
||||
if (info->flash_id & FLASH_AM040) {
|
||||
/* this chip has uniformly spaced sectors */
|
||||
for (i = 0; i < info->sector_count; i++)
|
||||
info->start[i] = base + (i * 0x00010000);
|
||||
|
||||
} else if (info->flash_id & FLASH_BTYPE) {
|
||||
/* set sector offsets for bottom boot block type */
|
||||
info->start[0] = base + 0x00000000;
|
||||
info->start[1] = base + 0x00008000;
|
||||
info->start[2] = base + 0x0000C000;
|
||||
info->start[3] = base + 0x00010000;
|
||||
for (i = 4; i < info->sector_count; i++) {
|
||||
info->start[i] = base + (i * 0x00020000) - 0x00060000;
|
||||
}
|
||||
} else {
|
||||
/* set sector offsets for top boot block type */
|
||||
i = info->sector_count - 1;
|
||||
info->start[i--] = base + info->size - 0x00008000;
|
||||
info->start[i--] = base + info->size - 0x0000C000;
|
||||
info->start[i--] = base + info->size - 0x00010000;
|
||||
for (; i >= 0; i--) {
|
||||
info->start[i] = base + i * 0x00020000;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* check for protected sectors */
|
||||
for (i = 0; i < info->sector_count; i++) {
|
||||
/* read sector protection at sector address, (A7 .. A0)=0x02 */
|
||||
/* D0 = 1 if protected */
|
||||
caddr = (volatile unsigned char *)(info->start[i]);
|
||||
saddr = (volatile unsigned short *)(info->start[i]);
|
||||
laddr = (volatile unsigned long *)(info->start[i]);
|
||||
if(portwidth==1)
|
||||
info->protect[i] = caddr[2] & 1;
|
||||
else if(portwidth==2)
|
||||
info->protect[i] = saddr[2] & 1;
|
||||
else
|
||||
info->protect[i] = laddr[2] & 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prevent writes to uninitialized FLASH.
|
||||
*/
|
||||
if (info->flash_id != FLASH_UNKNOWN) {
|
||||
caddr = (volatile unsigned char *)info->start[0];
|
||||
|
||||
flash_cmd(portwidth,caddr,0,0xF0); /* reset bank */
|
||||
}
|
||||
|
||||
return (info->size);
|
||||
}
|
||||
|
||||
/* TODO: 2x16 unsupported */
|
||||
int
|
||||
flash_erase (flash_info_t *info, int s_first, int s_last)
|
||||
{
|
||||
volatile unsigned char *addr = (char *)(info->start[0]);
|
||||
int flag, prot, sect, l_sect;
|
||||
ulong start, now, last;
|
||||
|
||||
/* TODO: 2x16 unsupported */
|
||||
if(info->portwidth==4) return 1;
|
||||
|
||||
if((info->flash_id & FLASH_TYPEMASK) == FLASH_ROM) return 1;
|
||||
if((info->flash_id & FLASH_TYPEMASK) == FLASH_RAM) {
|
||||
for (sect = s_first; sect<=s_last; sect++) {
|
||||
int sector_size=info->size/info->sector_count;
|
||||
addr = (char *)(info->start[sect]);
|
||||
memset((void *)addr, 0, sector_size);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((s_first < 0) || (s_first > s_last)) {
|
||||
if (info->flash_id == FLASH_UNKNOWN) {
|
||||
printf ("- missing\n");
|
||||
} else {
|
||||
printf ("- no sectors to erase\n");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((info->flash_id&FLASH_VENDMASK) == FLASH_MAN_INTEL) {
|
||||
return flash_erase_intel(info,
|
||||
(unsigned short)s_first,
|
||||
(unsigned short)s_last);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ((info->flash_id == FLASH_UNKNOWN) ||
|
||||
(info->flash_id > FLASH_AMD_COMP)) {
|
||||
printf ("Can't erase unknown flash type %08lx - aborted\n",
|
||||
info->flash_id);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
prot = 0;
|
||||
for (sect=s_first; sect<=s_last; ++sect) {
|
||||
if (info->protect[sect]) {
|
||||
prot++;
|
||||
}
|
||||
}
|
||||
|
||||
if (prot) {
|
||||
printf ("- Warning: %d protected sectors will not be erased!\n",
|
||||
prot);
|
||||
} else {
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
l_sect = -1;
|
||||
|
||||
/* Disable interrupts which might cause a timeout here */
|
||||
flag = disable_interrupts();
|
||||
|
||||
flash_cmd(info->portwidth,addr,0x555,0xAA);
|
||||
flash_cmd(info->portwidth,addr,0x2AA,0x55);
|
||||
flash_cmd(info->portwidth,addr,0x555,0x80);
|
||||
flash_cmd(info->portwidth,addr,0x555,0xAA);
|
||||
flash_cmd(info->portwidth,addr,0x2AA,0x55);
|
||||
|
||||
/* Start erase on unprotected sectors */
|
||||
for (sect = s_first; sect<=s_last; sect++) {
|
||||
if (info->protect[sect] == 0) { /* not protected */
|
||||
addr = (char *)(info->start[sect]);
|
||||
flash_cmd(info->portwidth,addr,0,0x30);
|
||||
l_sect = sect;
|
||||
}
|
||||
}
|
||||
|
||||
/* re-enable interrupts if necessary */
|
||||
if (flag)
|
||||
enable_interrupts();
|
||||
|
||||
/* wait at least 80us - let's wait 1 ms */
|
||||
udelay (1000);
|
||||
|
||||
/*
|
||||
* We wait for the last triggered sector
|
||||
*/
|
||||
if (l_sect < 0)
|
||||
goto DONE;
|
||||
|
||||
start = get_timer (0);
|
||||
last = start;
|
||||
addr = (volatile unsigned char *)(info->start[l_sect]);
|
||||
/* broken for 2x16: TODO */
|
||||
while ((addr[0] & 0x80) != 0x80) {
|
||||
if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
|
||||
printf ("Timeout\n");
|
||||
return 1;
|
||||
}
|
||||
/* show that we're waiting */
|
||||
if ((now - last) > 1000) { /* every second */
|
||||
putc ('.');
|
||||
last = now;
|
||||
}
|
||||
}
|
||||
|
||||
DONE:
|
||||
/* reset to read mode */
|
||||
addr = (volatile unsigned char *)info->start[0];
|
||||
flash_cmd(info->portwidth,addr,0,0xf0);
|
||||
flash_cmd(info->portwidth,addr,0,0xf0);
|
||||
|
||||
printf (" done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Copy memory to flash, returns:
|
||||
* 0 - OK
|
||||
* 1 - write timeout
|
||||
* 2 - Flash not erased
|
||||
*/
|
||||
|
||||
/* broken for 2x16: TODO */
|
||||
int
|
||||
write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
|
||||
{
|
||||
ulong cp, wp, data;
|
||||
int i, l, rc;
|
||||
|
||||
if(info->portwidth==4) return 1;
|
||||
|
||||
if((info->flash_id & FLASH_TYPEMASK) == FLASH_ROM) return 0;
|
||||
if((info->flash_id & FLASH_TYPEMASK) == FLASH_RAM) {
|
||||
memcpy((void *)addr, src, cnt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
wp = (addr & ~3); /* get lower word aligned address */
|
||||
|
||||
/*
|
||||
* handle unaligned start bytes
|
||||
*/
|
||||
if ((l = addr - wp) != 0) {
|
||||
data = 0;
|
||||
for (i=0, cp=wp; i<l; ++i, ++cp) {
|
||||
data = (data << 8) | (*(uchar *)cp);
|
||||
}
|
||||
for (; i<4 && cnt>0; ++i) {
|
||||
data = (data << 8) | *src++;
|
||||
--cnt;
|
||||
++cp;
|
||||
}
|
||||
for (; cnt==0 && i<4; ++i, ++cp) {
|
||||
data = (data << 8) | (*(uchar *)cp);
|
||||
}
|
||||
|
||||
if ((rc = write_word(info, wp, data)) != 0) {
|
||||
return (rc);
|
||||
}
|
||||
wp += 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* handle word aligned part
|
||||
*/
|
||||
while (cnt >= 4) {
|
||||
data = 0;
|
||||
for (i=0; i<4; ++i) {
|
||||
data = (data << 8) | *src++;
|
||||
}
|
||||
if ((rc = write_word(info, wp, data)) != 0) {
|
||||
return (rc);
|
||||
}
|
||||
wp += 4;
|
||||
cnt -= 4;
|
||||
}
|
||||
|
||||
if (cnt == 0) {
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* handle unaligned tail bytes
|
||||
*/
|
||||
data = 0;
|
||||
for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp) {
|
||||
data = (data << 8) | *src++;
|
||||
--cnt;
|
||||
}
|
||||
for (; i<4; ++i, ++cp) {
|
||||
data = (data << 8) | (*(uchar *)cp);
|
||||
}
|
||||
|
||||
return (write_word(info, wp, data));
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Write a word to Flash, returns:
|
||||
* 0 - OK
|
||||
* 1 - write timeout
|
||||
* 2 - Flash not erased
|
||||
*/
|
||||
/* broken for 2x16: TODO */
|
||||
static int
|
||||
write_word (flash_info_t *info, ulong dest, ulong data)
|
||||
{
|
||||
volatile unsigned char *addr = (char *)(info->start[0]);
|
||||
ulong start;
|
||||
int flag, i;
|
||||
|
||||
if(info->portwidth==4) return 1;
|
||||
|
||||
if((info->flash_id & FLASH_TYPEMASK) == FLASH_ROM) return 1;
|
||||
if((info->flash_id & FLASH_TYPEMASK) == FLASH_RAM) {
|
||||
*(unsigned long *)dest=data;
|
||||
return 0;
|
||||
}
|
||||
if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
|
||||
unsigned short low = data & 0xffff;
|
||||
unsigned short hi = (data >> 16) & 0xffff;
|
||||
int ret = write_word_intel((bank_addr_t)dest, hi);
|
||||
|
||||
if (!ret) ret = write_word_intel((bank_addr_t)(dest+2), low);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Check if Flash is (sufficiently) erased */
|
||||
if ((*((vu_long *)dest) & data) != data) {
|
||||
return (2);
|
||||
}
|
||||
/* Disable interrupts which might cause a timeout here */
|
||||
flag = disable_interrupts();
|
||||
|
||||
/* first, perform an unlock bypass command to speed up flash writes */
|
||||
addr[0x555] = 0xAA;
|
||||
addr[0x2AA] = 0x55;
|
||||
addr[0x555] = 0x20;
|
||||
|
||||
/* write each byte out */
|
||||
for (i = 0; i < 4; i++) {
|
||||
char *data_ch = (char *)&data;
|
||||
addr[0] = 0xA0;
|
||||
*(((char *)dest)+i) = data_ch[i];
|
||||
udelay(10); /* XXX */
|
||||
}
|
||||
|
||||
/* we're done, now do an unlock bypass reset */
|
||||
addr[0] = 0x90;
|
||||
addr[0] = 0x00;
|
||||
|
||||
/* re-enable interrupts if necessary */
|
||||
if (flag)
|
||||
enable_interrupts();
|
||||
|
||||
/* data polling for D7 */
|
||||
start = get_timer (0);
|
||||
while ((*((vu_long *)dest) & 0x00800080) != (data & 0x00800080)) {
|
||||
if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
457
board/evb64260/memory.c
Normal file
457
board/evb64260/memory.c
Normal file
@ -0,0 +1,457 @@
|
||||
/* Memory.c - Memory mappings and remapping functions */
|
||||
|
||||
/* Copyright - Galileo technology. */
|
||||
|
||||
/* modified by Josh Huber to clean some things up, and
|
||||
* fit it into the U-Boot framework */
|
||||
|
||||
#include <galileo/core.h>
|
||||
#include <galileo/memory.h>
|
||||
|
||||
/********************************************************************
|
||||
* memoryGetBankBaseAddress - Gets the base address of a memory bank
|
||||
* - If the memory bank size is 0 then this base address has no meaning!!!
|
||||
*
|
||||
*
|
||||
* INPUTS: MEMORY_BANK bank - The bank we ask for its base Address.
|
||||
* OUTPUT: N/A
|
||||
* RETURNS: Memory bank base address.
|
||||
*********************************************************************/
|
||||
static unsigned long memoryGetBankRegOffset(MEMORY_BANK bank)
|
||||
{
|
||||
switch (bank)
|
||||
{
|
||||
case BANK0:
|
||||
return SCS_0_LOW_DECODE_ADDRESS;
|
||||
case BANK1:
|
||||
return SCS_1_LOW_DECODE_ADDRESS;
|
||||
case BANK2:
|
||||
return SCS_2_LOW_DECODE_ADDRESS;
|
||||
case BANK3:
|
||||
return SCS_3_LOW_DECODE_ADDRESS;
|
||||
}
|
||||
return SCS_0_LOW_DECODE_ADDRESS; /* default value */
|
||||
}
|
||||
|
||||
unsigned int memoryGetBankBaseAddress(MEMORY_BANK bank)
|
||||
{
|
||||
unsigned int base;
|
||||
unsigned int regOffset=memoryGetBankRegOffset(bank);
|
||||
|
||||
GT_REG_READ(regOffset,&base);
|
||||
base = base << 20;
|
||||
return base;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memoryGetDeviceBaseAddress - Gets the base address of a device.
|
||||
* - If the device size is 0 then this base address has no meaning!!!
|
||||
*
|
||||
*
|
||||
* INPUT: DEVICE device - The device we ask for its base address.
|
||||
* OUTPUT: N/A
|
||||
* RETURNS: Device base address.
|
||||
*********************************************************************/
|
||||
static unsigned int memoryGetDeviceRegOffset(DEVICE device)
|
||||
{
|
||||
switch (device)
|
||||
{
|
||||
case DEVICE0:
|
||||
return CS_0_LOW_DECODE_ADDRESS;
|
||||
case DEVICE1:
|
||||
return CS_1_LOW_DECODE_ADDRESS;
|
||||
case DEVICE2:
|
||||
return CS_2_LOW_DECODE_ADDRESS;
|
||||
case DEVICE3:
|
||||
return CS_3_LOW_DECODE_ADDRESS;
|
||||
case BOOT_DEVICE:
|
||||
return BOOTCS_LOW_DECODE_ADDRESS;
|
||||
}
|
||||
return CS_0_LOW_DECODE_ADDRESS; /* default value */
|
||||
}
|
||||
|
||||
unsigned int memoryGetDeviceBaseAddress(DEVICE device)
|
||||
{
|
||||
unsigned int regBase;
|
||||
unsigned int regEnd;
|
||||
unsigned int regOffset=memoryGetDeviceRegOffset(device);
|
||||
|
||||
GT_REG_READ(regOffset, ®Base);
|
||||
GT_REG_READ(regOffset+8, ®End);
|
||||
|
||||
if(regEnd<=regBase) return 0xffffffff; /* ERROR !!! */
|
||||
|
||||
regBase = regBase << 20;
|
||||
return regBase;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memoryGetBankSize - Returns the size of a memory bank.
|
||||
*
|
||||
*
|
||||
* INPUT: MEMORY_BANK bank - The bank we ask for its size.
|
||||
* OUTPUT: N/A
|
||||
* RETURNS: Memory bank size.
|
||||
*********************************************************************/
|
||||
unsigned int memoryGetBankSize(MEMORY_BANK bank)
|
||||
{
|
||||
unsigned int size,base;
|
||||
unsigned int highValue;
|
||||
unsigned int highAddress=memoryGetBankRegOffset(bank)+8;
|
||||
|
||||
base = memoryGetBankBaseAddress(bank);
|
||||
GT_REG_READ(highAddress,&highValue);
|
||||
highValue = (highValue + 1) << 20;
|
||||
if(base > highValue)
|
||||
size=0;
|
||||
else
|
||||
size = highValue - base;
|
||||
return size;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memoryGetDeviceSize - Returns the size of a device memory space
|
||||
*
|
||||
*
|
||||
* INPUT: DEVICE device - The device we ask for its base address.
|
||||
* OUTPUT: N/A
|
||||
* RETURNS: Size of a device memory space.
|
||||
*********************************************************************/
|
||||
unsigned int memoryGetDeviceSize(DEVICE device)
|
||||
{
|
||||
unsigned int size,base;
|
||||
unsigned int highValue;
|
||||
unsigned int highAddress=memoryGetDeviceRegOffset(device)+8;
|
||||
|
||||
base = memoryGetDeviceBaseAddress(device);
|
||||
GT_REG_READ(highAddress,&highValue);
|
||||
if (highValue == 0xfff)
|
||||
{
|
||||
size = (~base) + 1; /* what the heck is this? */
|
||||
return size;
|
||||
}
|
||||
else
|
||||
highValue = (highValue + 1) << 20;
|
||||
|
||||
if(base > highValue)
|
||||
size=0;
|
||||
else
|
||||
size = highValue - base;
|
||||
return size;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memoryGetDeviceWidth - A device can be with: 1,2,4 or 8 Bytes data width.
|
||||
* The width is determine in registers: 'Device Parameters'
|
||||
* registers (0x45c, 0x460, 0x464, 0x468, 0x46c - for each device.
|
||||
* at bits: [21:20].
|
||||
*
|
||||
* INPUT: DEVICE device - Device number
|
||||
* OUTPUT: N/A
|
||||
* RETURNS: Device width in Bytes (1,2,4 or 8), 0 if error had occurred.
|
||||
*********************************************************************/
|
||||
unsigned int memoryGetDeviceWidth(DEVICE device)
|
||||
{
|
||||
unsigned int width;
|
||||
unsigned int regValue;
|
||||
|
||||
GT_REG_READ(DEVICE_BANK0PARAMETERS + device*4,®Value);
|
||||
width = (regValue & 0x00300000) >> 20;
|
||||
switch (width)
|
||||
{
|
||||
case 0:
|
||||
return 1;
|
||||
case 1:
|
||||
return 2;
|
||||
case 2:
|
||||
return 4;
|
||||
case 3:
|
||||
return 8;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool memoryMapBank(MEMORY_BANK bank, unsigned int bankBase,unsigned int bankLength)
|
||||
{
|
||||
unsigned int low=0xfff;
|
||||
unsigned int high=0x0;
|
||||
unsigned int regOffset=memoryGetBankRegOffset(bank);
|
||||
|
||||
if(bankLength!=0) {
|
||||
low = (bankBase >> 20) & 0xffff;
|
||||
high=((bankBase+bankLength)>>20)-1;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
unsigned int oldLow, oldHigh;
|
||||
GT_REG_READ(regOffset,&oldLow);
|
||||
GT_REG_READ(regOffset+8,&oldHigh);
|
||||
|
||||
printf("b%d %x-%x->%x-%x\n", bank, oldLow, oldHigh, low, high);
|
||||
}
|
||||
#endif
|
||||
|
||||
GT_REG_WRITE(regOffset,low);
|
||||
GT_REG_WRITE(regOffset+8,high);
|
||||
|
||||
return true;
|
||||
}
|
||||
bool memoryMapDeviceSpace(DEVICE device, unsigned int deviceBase,unsigned int deviceLength)
|
||||
{
|
||||
/* TODO: what are appropriate "unmapped" values? */
|
||||
unsigned int low=0xfff;
|
||||
unsigned int high=0x0;
|
||||
unsigned int regOffset=memoryGetDeviceRegOffset(device);
|
||||
|
||||
if(deviceLength != 0) {
|
||||
low=deviceBase>>20;
|
||||
high=((deviceBase+deviceLength)>>20)-1;
|
||||
} else {
|
||||
/* big problems in here... */
|
||||
/* this will HANG */
|
||||
}
|
||||
|
||||
GT_REG_WRITE(regOffset,low);
|
||||
GT_REG_WRITE(regOffset+8,high);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* memoryMapInternalRegistersSpace - Sets new base address for the internals
|
||||
* registers.
|
||||
*
|
||||
* INPUTS: unsigned int internalRegBase - The new base address.
|
||||
* RETURNS: true on success, false on failure
|
||||
*********************************************************************/
|
||||
bool memoryMapInternalRegistersSpace(unsigned int internalRegBase)
|
||||
{
|
||||
unsigned int currentValue;
|
||||
unsigned int internalValue = internalRegBase;
|
||||
|
||||
internalRegBase = (internalRegBase >> 20);
|
||||
GT_REG_READ(INTERNAL_SPACE_DECODE,¤tValue);
|
||||
internalRegBase = (currentValue & 0xffff0000) | internalRegBase;
|
||||
GT_REG_WRITE(INTERNAL_SPACE_DECODE,internalRegBase);
|
||||
INTERNAL_REG_BASE_ADDR = internalValue;
|
||||
return true;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memoryGetInternalRegistersSpace - Gets internal registers Base Address.
|
||||
*
|
||||
* INPUTS: unsigned int internalRegBase - The new base address.
|
||||
* RETURNS: true on success, false on failure
|
||||
*********************************************************************/
|
||||
unsigned int memoryGetInternalRegistersSpace(void)
|
||||
{
|
||||
return INTERNAL_REG_BASE_ADDR;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memorySetProtectRegion - This function modifys one of the 8 regions with
|
||||
* one of the three protection mode.
|
||||
* - Be advised to check the spec before modifying them.
|
||||
*
|
||||
*
|
||||
* Inputs: CPU_PROTECT_REGION - one of the eight regions.
|
||||
* CPU_ACCESS - general access.
|
||||
* CPU_WRITE - read only access.
|
||||
* CPU_CACHE_PROTECT - chache access.
|
||||
* we defining CPU because there is another protect from the pci SIDE.
|
||||
* Returns: false if one of the parameters is wrong and true else
|
||||
*********************************************************************/
|
||||
bool memorySetProtectRegion(MEMORY_PROTECT_REGION region,
|
||||
MEMORY_ACCESS memAccess,
|
||||
MEMORY_ACCESS_WRITE memWrite,
|
||||
MEMORY_CACHE_PROTECT cacheProtection,
|
||||
unsigned int baseAddress,
|
||||
unsigned int regionLength)
|
||||
{
|
||||
unsigned int protectHigh = baseAddress + regionLength;
|
||||
|
||||
if(regionLength == 0) /* closing the region */
|
||||
{
|
||||
GT_REG_WRITE(CPU_LOW_PROTECT_ADDRESS_0 + 0x10*region,0x0000ffff);
|
||||
GT_REG_WRITE(CPU_HIGH_PROTECT_ADDRESS_0 + 0x10*region,0);
|
||||
return true;
|
||||
}
|
||||
baseAddress = (baseAddress & 0xfff00000) >> 20;
|
||||
baseAddress = baseAddress | memAccess << 16 | memWrite << 17
|
||||
| cacheProtection << 18;
|
||||
GT_REG_WRITE(CPU_LOW_PROTECT_ADDRESS_0 + 0x10*region,baseAddress);
|
||||
protectHigh = (protectHigh & 0xfff00000) >> 20;
|
||||
GT_REG_WRITE(CPU_HIGH_PROTECT_ADDRESS_0 + 0x10*region,protectHigh - 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memorySetRegionSnoopMode - This function modifys one of the 4 regions which
|
||||
* supports Cache Coherency.
|
||||
*
|
||||
*
|
||||
* Inputs: SNOOP_REGION region - One of the four regions.
|
||||
* SNOOP_TYPE snoopType - There is four optional Types:
|
||||
* 1. No Snoop.
|
||||
* 2. Snoop to WT region.
|
||||
* 3. Snoop to WB region.
|
||||
* 4. Snoop & Invalidate to WB region.
|
||||
* unsigned int baseAddress - Base Address of this region.
|
||||
* unsigned int topAddress - Top Address of this region.
|
||||
* Returns: false if one of the parameters is wrong and true else
|
||||
*********************************************************************/
|
||||
bool memorySetRegionSnoopMode(MEMORY_SNOOP_REGION region,
|
||||
MEMORY_SNOOP_TYPE snoopType,
|
||||
unsigned int baseAddress,
|
||||
unsigned int regionLength)
|
||||
{
|
||||
unsigned int snoopXbaseAddress;
|
||||
unsigned int snoopXtopAddress;
|
||||
unsigned int data;
|
||||
unsigned int snoopHigh = baseAddress + regionLength;
|
||||
|
||||
if( (region > MEM_SNOOP_REGION3) || (snoopType > MEM_SNOOP_WB) )
|
||||
return false;
|
||||
snoopXbaseAddress = SNOOP_BASE_ADDRESS_0 + 0x10 * region;
|
||||
snoopXtopAddress = SNOOP_TOP_ADDRESS_0 + 0x10 * region;
|
||||
if(regionLength == 0) /* closing the region */
|
||||
{
|
||||
GT_REG_WRITE(snoopXbaseAddress,0x0000ffff);
|
||||
GT_REG_WRITE(snoopXtopAddress,0);
|
||||
return true;
|
||||
}
|
||||
baseAddress = baseAddress & 0xffff0000;
|
||||
data = (baseAddress >> 16) | snoopType << 16;
|
||||
GT_REG_WRITE(snoopXbaseAddress,data);
|
||||
snoopHigh = (snoopHigh & 0xfff00000) >> 20;
|
||||
GT_REG_WRITE(snoopXtopAddress,snoopHigh - 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memoryRemapAddress - This fubction used for address remapping.
|
||||
*
|
||||
*
|
||||
* Inputs: regOffset: remap register
|
||||
* remapValue :
|
||||
* Returns: false if one of the parameters is erroneous,true otherwise.
|
||||
*********************************************************************/
|
||||
bool memoryRemapAddress(unsigned int remapReg, unsigned int remapValue)
|
||||
{
|
||||
unsigned int valueForReg;
|
||||
valueForReg = (remapValue & 0xfff00000) >> 20;
|
||||
GT_REG_WRITE(remapReg, valueForReg);
|
||||
return true;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memoryGetDeviceParam - This function used for getting device parameters from
|
||||
* DEVICE BANK PARAMETERS REGISTER
|
||||
*
|
||||
*
|
||||
* Inputs: - deviceParam: STRUCT with paramiters for DEVICE BANK
|
||||
* PARAMETERS REGISTER
|
||||
* - deviceNum : number of device
|
||||
* Returns: false if one of the parameters is erroneous,true otherwise.
|
||||
*********************************************************************/
|
||||
bool memoryGetDeviceParam(DEVICE_PARAM *deviceParam, DEVICE deviceNum)
|
||||
{
|
||||
unsigned int valueOfReg;
|
||||
unsigned int calcData;
|
||||
|
||||
GT_REG_READ(DEVICE_BANK0PARAMETERS + 4 * deviceNum, &valueOfReg);
|
||||
calcData = (0x7 & valueOfReg) + ((0x400000 & valueOfReg) >> 19);
|
||||
deviceParam -> turnOff = calcData; /* Turn Off */
|
||||
|
||||
calcData = ((0x78 & valueOfReg) >> 3) + ((0x800000 & valueOfReg) >> 19);
|
||||
deviceParam -> acc2First = calcData; /* Access To First */
|
||||
|
||||
calcData = ((0x780 & valueOfReg) >> 7) + ((0x1000000 & valueOfReg) >> 20);
|
||||
deviceParam -> acc2Next = calcData; /* Access To Next */
|
||||
|
||||
calcData = ((0x3800 & valueOfReg) >> 11) + ((0x2000000 & valueOfReg) >> 22);
|
||||
deviceParam -> ale2Wr = calcData; /* Ale To Write */
|
||||
|
||||
calcData = ((0x1c000 & valueOfReg) >> 14) + ((0x4000000 & valueOfReg) >> 23);
|
||||
deviceParam -> wrLow = calcData; /* Write Active */
|
||||
|
||||
calcData = ((0xe0000 & valueOfReg) >> 17) + ((0x8000000 & valueOfReg) >> 24);
|
||||
deviceParam -> wrHigh = calcData; /* Write High */
|
||||
|
||||
calcData = ((0x300000 & valueOfReg) >> 20);
|
||||
switch (calcData)
|
||||
{
|
||||
case 0:
|
||||
deviceParam -> deviceWidth = 1; /* one Byte - 8-bit */
|
||||
break;
|
||||
case 1:
|
||||
deviceParam -> deviceWidth = 2; /* two Bytes - 16-bit */
|
||||
break;
|
||||
case 2:
|
||||
deviceParam -> deviceWidth = 4; /* four Bytes - 32-bit */
|
||||
break;
|
||||
case 3:
|
||||
deviceParam -> deviceWidth = 8; /* eight Bytes - 64-bit */
|
||||
break;
|
||||
default:
|
||||
deviceParam -> deviceWidth = 1;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* memorySetDeviceParam - This function used for setting device parameters to
|
||||
* DEVICE BANK PARAMETERS REGISTER
|
||||
*
|
||||
*
|
||||
* Inputs: - deviceParam: STRUCT for store paramiters from DEVICE BANK
|
||||
* PARAMETERS REGISTER
|
||||
* - deviceNum : number of device
|
||||
* Returns: false if one of the parameters is erroneous,true otherwise.
|
||||
*********************************************************************/
|
||||
bool memorySetDeviceParam(DEVICE_PARAM *deviceParam, DEVICE deviceNum)
|
||||
{
|
||||
unsigned int valueForReg;
|
||||
|
||||
if((deviceParam -> turnOff >= 0xf) || (deviceParam -> acc2First >= 0x1f) ||
|
||||
(deviceParam -> acc2Next >= 0x1f) || (deviceParam -> ale2Wr >= 0xf) ||
|
||||
(deviceParam -> wrLow >= 0xf) || (deviceParam -> wrHigh >= 0xf))
|
||||
return false;
|
||||
valueForReg = (((deviceParam -> turnOff) & 0x7) |
|
||||
(((deviceParam -> turnOff) & 0x8) << 19) |
|
||||
(((deviceParam -> acc2First) & 0xf) << 3) |
|
||||
(((deviceParam -> acc2First) & 0x10) << 19) |
|
||||
(((deviceParam -> acc2Next) & 0xf) << 7) |
|
||||
(((deviceParam -> acc2Next) & 0x10) << 20) |
|
||||
(((deviceParam -> ale2Wr) & 0x7) << 11) |
|
||||
(((deviceParam -> ale2Wr) & 0xf) << 22) |
|
||||
(((deviceParam -> wrLow) & 0x7) << 14) |
|
||||
(((deviceParam -> wrLow) & 0xf) << 23) |
|
||||
(((deviceParam -> wrHigh) & 0x7) << 17) |
|
||||
(((deviceParam -> wrHigh) & 0xf) << 24));
|
||||
/* insert the device width: */
|
||||
switch(deviceParam->deviceWidth)
|
||||
{
|
||||
case 1:
|
||||
valueForReg = valueForReg | _8BIT;
|
||||
break;
|
||||
case 2:
|
||||
valueForReg = valueForReg | _16BIT;
|
||||
break;
|
||||
case 4:
|
||||
valueForReg = valueForReg | _32BIT;
|
||||
break;
|
||||
case 8:
|
||||
valueForReg = valueForReg | _64BIT;
|
||||
break;
|
||||
default:
|
||||
valueForReg = valueForReg | _8BIT;
|
||||
break;
|
||||
}
|
||||
GT_REG_WRITE(DEVICE_BANK0PARAMETERS + 4 * deviceNum, valueForReg);
|
||||
return true;
|
||||
}
|
129
board/evb64260/u-boot.lds
Normal file
129
board/evb64260/u-boot.lds
Normal file
@ -0,0 +1,129 @@
|
||||
/*
|
||||
* (C) Copyright 2001
|
||||
* Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* u-boot.lds - linker script for U-Boot on the Galileo Eval Board.
|
||||
*/
|
||||
|
||||
OUTPUT_ARCH(powerpc)
|
||||
SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
|
||||
/* Do we need any of these for elf?
|
||||
__DYNAMIC = 0; */
|
||||
SECTIONS
|
||||
{
|
||||
/* Read-only sections, merged into text segment: */
|
||||
. = + SIZEOF_HEADERS;
|
||||
.interp : { *(.interp) }
|
||||
.hash : { *(.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.rel.text : { *(.rel.text) }
|
||||
.rela.text : { *(.rela.text) }
|
||||
.rel.data : { *(.rel.data) }
|
||||
.rela.data : { *(.rela.data) }
|
||||
.rel.rodata : { *(.rel.rodata) }
|
||||
.rela.rodata : { *(.rela.rodata) }
|
||||
.rel.got : { *(.rel.got) }
|
||||
.rela.got : { *(.rela.got) }
|
||||
.rel.ctors : { *(.rel.ctors) }
|
||||
.rela.ctors : { *(.rela.ctors) }
|
||||
.rel.dtors : { *(.rel.dtors) }
|
||||
.rela.dtors : { *(.rela.dtors) }
|
||||
.rel.bss : { *(.rel.bss) }
|
||||
.rela.bss : { *(.rela.bss) }
|
||||
.rel.plt : { *(.rel.plt) }
|
||||
.rela.plt : { *(.rela.plt) }
|
||||
.init : { *(.init) }
|
||||
.plt : { *(.plt) }
|
||||
.text :
|
||||
{
|
||||
cpu/74xx_7xx/start.o (.text)
|
||||
|
||||
/* store the environment in a seperate sector in the boot flash */
|
||||
/* . = env_offset; */
|
||||
/* common/environment.o(.text) */
|
||||
|
||||
*(.text)
|
||||
*(.fixup)
|
||||
*(.got1)
|
||||
}
|
||||
_etext = .;
|
||||
PROVIDE (etext = .);
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata)
|
||||
*(.rodata1)
|
||||
}
|
||||
.fini : { *(.fini) } =0
|
||||
.ctors : { *(.ctors) }
|
||||
.dtors : { *(.dtors) }
|
||||
|
||||
/* Read-write section, merged into data segment: */
|
||||
. = (. + 0x00FF) & 0xFFFFFF00;
|
||||
_erotext = .;
|
||||
PROVIDE (erotext = .);
|
||||
.reloc :
|
||||
{
|
||||
*(.got)
|
||||
_GOT2_TABLE_ = .;
|
||||
*(.got2)
|
||||
_FIXUP_TABLE_ = .;
|
||||
*(.fixup)
|
||||
}
|
||||
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
|
||||
__fixup_entries = (. - _FIXUP_TABLE_)>>2;
|
||||
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
*(.data1)
|
||||
*(.sdata)
|
||||
*(.sdata2)
|
||||
*(.dynamic)
|
||||
CONSTRUCTORS
|
||||
}
|
||||
_edata = .;
|
||||
PROVIDE (edata = .);
|
||||
|
||||
__start___ex_table = .;
|
||||
__ex_table : { *(__ex_table) }
|
||||
__stop___ex_table = .;
|
||||
|
||||
. = ALIGN(256);
|
||||
__init_begin = .;
|
||||
.text.init : { *(.text.init) }
|
||||
.data.init : { *(.data.init) }
|
||||
. = ALIGN(256);
|
||||
__init_end = .;
|
||||
|
||||
__bss_start = .;
|
||||
.bss :
|
||||
{
|
||||
*(.sbss) *(.scommon)
|
||||
*(.dynbss)
|
||||
*(.bss)
|
||||
*(COMMON)
|
||||
}
|
||||
_end = . ;
|
||||
PROVIDE (end = .);
|
||||
}
|
20
board/gth/README
Normal file
20
board/gth/README
Normal file
@ -0,0 +1,20 @@
|
||||
Written by Thomas.Lange@corelatus.com 010805
|
||||
|
||||
To make a system for gth that actually works ;-)
|
||||
the variable TBASE needs to be set to 0,1 or 2
|
||||
depending on location where image is supposed to
|
||||
be started from.
|
||||
E.g. make TBASE=1
|
||||
|
||||
0: Start from RAM, base 0
|
||||
|
||||
1: Start from flash_base + 0x10070
|
||||
|
||||
2: Start from flash_base + 0x30070
|
||||
|
||||
When using 1 or 2, the image is supposed to be launched
|
||||
from miniboot that boots the first U-Boot image found in
|
||||
flash.
|
||||
For miniboot code, description, see www.opensource.se
|
||||
|
||||
|
57
mkconfig
Normal file
57
mkconfig
Normal file
@ -0,0 +1,57 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
# Script to create header files and links to configure
|
||||
# U-Boot for a specific board.
|
||||
#
|
||||
# Parameters: Target Architecture CPU Board
|
||||
#
|
||||
# (C) 2002 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
|
||||
#
|
||||
|
||||
APPEND=no # Default: Create new config file
|
||||
|
||||
while [ $# -gt 0 ] ; do
|
||||
case "$1" in
|
||||
--) shift ; break ;;
|
||||
-a) shift ; APPEND=yes ;;
|
||||
*) break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
[ $# -lt 4 ] && exit 1
|
||||
[ $# -gt 5 ] && exit 1
|
||||
|
||||
echo "Configuring for $1 board..."
|
||||
|
||||
cd ./include
|
||||
|
||||
#
|
||||
# Create link to architecture specific headers
|
||||
#
|
||||
rm -f asm
|
||||
ln -s asm-$2 asm
|
||||
rm -f asm-$2/arch
|
||||
ln -s arch-$3 asm-$2/arch
|
||||
|
||||
#
|
||||
# Create include file for Make
|
||||
#
|
||||
echo "ARCH = $2" > config.mk
|
||||
echo "CPU = $3" >> config.mk
|
||||
echo "BOARD = $4" >> config.mk
|
||||
|
||||
[ "$5" ] && echo "VENDOR = $5" >> config.mk
|
||||
|
||||
#
|
||||
# Create board specific header file
|
||||
#
|
||||
if [ "$APPEND" = "yes" ] # Append to existing config file
|
||||
then
|
||||
echo >> config.h
|
||||
else
|
||||
> config.h # Create new config file
|
||||
fi
|
||||
echo "/* Automatically generated - do not edit */" >>config.h
|
||||
echo "#include <configs/$1.h>" >>config.h
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user