parent
cc1c8a136f
commit
7ebf7443ad
@ -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 |
@ -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
|
||||
|
||||
#########################################################################
|
@ -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. |
@ -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)
|
@ -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
|
@ -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 |
||||
=> |
@ -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 |
||||
|
||||
/*---------------------------------------------------------------------------*/ |
@ -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 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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)
|
@ -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); |
||||
} |
||||
|
@ -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); |
||||
} |
@ -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; |
||||
} |
@ -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 = .); |
||||
} |
@ -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 |
||||
|
||||
|
@ -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