Compare commits

...

70 Commits

Author SHA1 Message Date
wdenk
400ab719c6 Fix problems with CMC_PU2 flash driver. 2004-12-20 11:18:07 +00:00
wdenk
08f272787a * Fix problems with CMC_PU2 flash driver.
* Adjust INKA 4x0 default settings
2004-12-19 21:39:27 +00:00
wdenk
bff96b0e6b Renamed UC100 => uc100 2004-12-19 10:09:07 +00:00
wdenk
ec0aee7b68 Cleanup: avoid trigraph warning in fs/ext2/ext2fs.c; rename UC100 -> uc100 2004-12-19 09:58:11 +00:00
wdenk
f7d1572bf5 Add support for UC100 board 2004-12-18 22:35:43 +00:00
stroese
8e6b47a89b One more code cleanup. 2004-12-17 09:13:49 +00:00
wdenk
efe2a4d5cf Code cleanup. 2004-12-16 21:44:03 +00:00
stroese
bea8e84b52 PCI405 board update 2004-12-16 19:10:22 +00:00
stroese
917b8cc41c AR405 board update 2004-12-16 19:00:32 +00:00
stroese
8cba1907b8 Patch by Stefan Roese, 16 Dez 2004 2004-12-16 18:47:58 +00:00
stroese
7b46664147 CONFIG_MX_CYCLIC description added 2004-12-16 18:46:55 +00:00
stroese
c419d1d6d0 some new esd boards added 2004-12-16 18:44:40 +00:00
stroese
0621f6f9d3 esd common update 2004-12-16 18:43:13 +00:00
stroese
cd5396fa12 VOH405 board update 2004-12-16 18:41:27 +00:00
stroese
4510a7b736 PMC405 board update 2004-12-16 18:40:02 +00:00
stroese
12537cc5a9 PLU405 board update 2004-12-16 18:39:03 +00:00
stroese
c2642d14c9 PCI405 board update 2004-12-16 18:38:22 +00:00
stroese
25215ee2b0 OCRTC board update 2004-12-16 18:37:41 +00:00
stroese
31193c2cca HUB405 board update 2004-12-16 18:37:08 +00:00
stroese
ab379df353 DU405 board update 2004-12-16 18:36:28 +00:00
stroese
f2dfe44fd6 DP405 board update 2004-12-16 18:35:58 +00:00
stroese
20aacbf018 CPCIISER4 board update 2004-12-16 18:35:14 +00:00
stroese
7acd6c2168 CPCI440 board update 2004-12-16 18:34:28 +00:00
stroese
c491b442cc CANBT board update 2004-12-16 18:33:45 +00:00
stroese
86cf82e07f ASH405 board update 2004-12-16 18:33:12 +00:00
stroese
8d3efe4e9a AR405 board update 2004-12-16 18:30:36 +00:00
stroese
e399e4c670 ADCIOP board update 2004-12-16 18:27:51 +00:00
stroese
87663b1cbc CPCI405 board update 2004-12-16 18:27:05 +00:00
stroese
6cfb1f0da6 WUH405 board support added 2004-12-16 18:25:40 +00:00
stroese
809ac5e7b0 VOM405 board support added 2004-12-16 18:24:54 +00:00
stroese
8d8f894b51 TASREG board support added 2004-12-16 18:24:06 +00:00
stroese
1f54ce6df8 HH405 board support added 2004-12-16 18:23:14 +00:00
stroese
771e05be07 CPCI750 board support added 2004-12-16 18:21:17 +00:00
stroese
1bc0f14143 APC405 board support added 2004-12-16 18:20:14 +00:00
stroese
aee2fa27d9 G2000 board support added 2004-12-16 18:17:50 +00:00
stroese
5e746fce05 PMC405 board support added 2004-12-16 18:15:52 +00:00
stroese
b39392a98b CPU speed calculation updated (fixed a rounding problem) 2004-12-16 18:13:53 +00:00
stroese
0912e483eb CPCI750 board support added 2004-12-16 18:10:54 +00:00
stroese
8c725b9364 Coldfire MCF5249 support added 2004-12-16 18:09:49 +00:00
stroese
a20b27a36b esd config files updated 2004-12-16 18:05:42 +00:00
stroese
44acc8d334 new 405ep defines added 2004-12-16 18:03:44 +00:00
stroese
4d535b51e1 new SST and EXCEL devices add 2004-12-16 18:01:48 +00:00
stroese
3d936fd992 - ext2fs support added
- Tundra universe support added
2004-12-16 17:59:53 +00:00
stroese
20cc00ddac "static" from "do_fat_read" removed 2004-12-16 17:57:26 +00:00
stroese
cd42deebd2 Coldfire MCF5249 support added 2004-12-16 17:56:09 +00:00
stroese
e2c22d780e I2C added 2004-12-16 17:55:22 +00:00
stroese
b7eaad8134 use same spacing for "NAND:" puts 2004-12-16 17:53:17 +00:00
stroese
946c2185dd CPCI750 board support added 2004-12-16 17:49:38 +00:00
stroese
6bb992ba9d added CONFIG_PCI_CONFIG_HOST_BRIDGE to enable host bridge configuration 2004-12-16 17:48:41 +00:00
stroese
a842a6d23c added ".i" same as ".jffs2s" for compatibility with older units (CFG_NAND_SKIP_BAD_DOT_I) 2004-12-16 17:45:46 +00:00
stroese
4aaf29b2f5 memory commands "mdc" and "mwc" added for cyclic read/write 2004-12-16 17:42:39 +00:00
stroese
fa838874cf remove "static" from "ide_dev_desc" to use it from external code 2004-12-16 17:40:30 +00:00
stroese
1cdf5d92cf code cleanup: use CFG_VXWORKS_MAC_PTR instead of multiple board defines 2004-12-16 17:37:54 +00:00
stroese
1740618202 - ext2fs support added
- Tundra universe support added
2004-12-16 17:35:57 +00:00
stroese
256e4be814 Tundra universe support added 2004-12-16 17:33:38 +00:00
stroese
bcd0be5cf1 ext2fs support added 2004-12-16 17:33:10 +00:00
stroese
2b9187127f ext2fs support added 2004-12-16 17:26:24 +00:00
wdenk
138ff60c1e Add support for INKA4X0 board 2004-12-16 15:52:40 +00:00
wdenk
45ea3fca4a Cleanup for CMC_PU2 board 2004-12-14 23:28:24 +00:00
wdenk
96085e347d Fix problem introduced by previous patch. 2004-12-13 09:49:01 +00:00
wdenk
689aec1b05 Patch by Steven Scholz, 12 Dec 2004:
Fix typo in AT91 memory setup.
2004-12-13 00:18:44 +00:00
wdenk
7e6bf358d8 Patch by Martin Krause, 27 Oct 2004:
- add support for "STK52xx" board (including PS/2 multiplexer)
- add hardware detection for TQM5200
2004-12-12 22:06:17 +00:00
wdenk
25d6712a81 * Clean up CMC PU2 flash driver
* Update MAINTAINERS file

* Fix bug in MPC823 LCD driver
2004-12-10 11:40:40 +00:00
wdenk
ed54e62125 * Fix udelay() on AT91RM9200 for delays < 1 ms.
* Enable long help on CMC PU2 board;
  fix reset issue;
  increase CPU speed from 179 to 207 MHz.
2004-11-24 23:35:19 +00:00
wdenk
bb310d462b Fix smc91111 ethernet driver for Xaeniax board (need to handle
unaligned tail part specially).
2004-11-22 22:20:07 +00:00
wdenk
9d5028c2f7 * Update for AT91RM9200DK and CMC_PU2 boards:
- Enable booting directly from flash
  - fix CMC_PU2 flash driver

* Fix mkimage usage message
2004-11-21 00:06:33 +00:00
wdenk
cacfab588a Map SRAM on NC650 board 2004-11-17 20:44:20 +00:00
wdenk
1f6d4258c2 Work around for Ethernet problems on Xaeniax board 2004-11-02 13:00:33 +00:00
wdenk
983fda8391 Patch by TsiChung Liew, 23 Sep 2004:
- add support for MPC8220 CPU
- Add support for Alaska and Yukon boards
2004-10-28 00:09:35 +00:00
wdenk
e3c9b9f928 * Fix configuration for ERIC board (needs more room)
* Adjust MIPS compiler options at run-time depending on tools version
  ("-march=4kc -mtune=4kc -Wa,-mips_allow_branch_to_undefined" for new,
  "-mcpu=4kc" for old tools)
2004-10-24 23:54:40 +00:00
270 changed files with 69451 additions and 9012 deletions

View File

@@ -2,6 +2,69 @@
Changes since U-Boot 1.1.1:
======================================================================
* Fix problems with CMC_PU2 flash driver.
* Cleanup:
- avoid trigraph warning in fs/ext2/ext2fs.c
- rename UC100 -> uc100
* Add support for UC100 board
* Patch by Stefan Roese, 16 Dez 2004:
- ext2fs support added
- Tundra universe support added
- Coldfire MCF5249 support added (no preloader needed!)
- MCF5249 board TASREG added
- PPC boards added: APC405, CPCI405DT, CPCI750, G2000, HH405,
VOM405, WUH405
- some esd boards updated
- memory commands "mdc" and "mwc" added for cyclic read/write
(CONFIG_MX_CYCLIC, see README for further description)
* Add support for INKA4X0 board
* Patch by Steven Scholz, 12 Dec 2004:
Fix typo in AT91 memory setup.
* Patch by Martin Krause, 27 Oct 2004:
- add support for "STK52xx" board (including PS/2 multiplexer)
- add hardware detection for TQM5200
* Clean up CMC PU2 flash driver
* Update MAINTAINERS file
* Fix bug in MPC823 LCD driver
* Fix udelay() on AT91RM9200 for delays < 1 ms.
* Enable long help on CMC PU2 board;
fix reset issue;
increase CPU speed from 179 to 207 MHz.
* Fix smc91111 ethernet driver for Xaeniax board (need to handle
unaligned tail part specially).
* Update for AT91RM9200DK and CMC_PU2 boards:
- Enable booting directly from flash
- fix CMC_PU2 flash driver
* Fix mkimage usage message
* Map SRAM on NC650 board
* Work around for Ethernet problems on Xaeniax board
* Patch by TsiChung Liew, 23 Sep 2004:
- add support for MPC8220 CPU
- Add support for Alaska and Yukon boards
* Fix configuration for ERIC board (needs more room)
* Adjust MIPS compiler options at run-time depending on tools version
("-march=4kc -mtune=4kc -Wa,-mips_allow_branch_to_undefined" for new,
"-mcpu=4kc" for old tools)
* Add passing of the command line and memory size information to the
kernel on xaeniax board.

View File

@@ -25,6 +25,10 @@ Pantelis Antoniou <panto@intracom.gr>
NETVIA MPC8xx
Reinhard Arlt <reinhard.arlt@esd-electronics.com>
CPCI750 PPC750FX/GX
Yuli Barcohen <yuli@arabellasw.com>
Adder MPC87x/MPC852T
@@ -209,6 +213,13 @@ Frank Panno <fpanno@delphintech.com>
ep8260 MPC8260
Peter Pearse <peter.pearse@arm.com>
Integrator/AP CM 926EJ-S, CM7x0T, CM9x0T
Integrator/CP CM 926EJ-S CM920T, CM940T, CM922T-XA10
Versatile/AB ARM926EJ-S
Versatile/PB ARM926EJ-S
Denis Peter <d.peter@mpl.ch>
MIP405 PPC4xx
@@ -217,17 +228,21 @@ Denis Peter <d.peter@mpl.ch>
Stefan Roese <stefan.roese@esd-electronics.com>
ADCIOP IOP480 (PPC401)
APC405 PPC405GP
AR405 PPC405GP
ASH405 PPC405EP
CANBT PPC405CR
CPCI405 PPC405GP
CPCI4052 PPC405GP
CPCI405AB PPC405GP
CPCI405DT PPC405GP
CPCI440 PPC440GP
CPCIISER4 PPC405GP
DASA_SIM IOP480 (PPC401)
DP405 PPC405EP
DU405 PPC405GP
G2000 PPC405EP
HH405 PPC405EP
HUB405 PPC405EP
OCRTC PPC405GP
ORSG PPC405GP
@@ -235,6 +250,8 @@ Stefan Roese <stefan.roese@esd-electronics.com>
PLU405 PPC405EP
PMC405 PPC405GP
VOH405 PPC405EP
VOM405 PPC405EP
WUH405 PPC405EP
Travis Sawyer (travis.sawyer@sandburst.com>
@@ -453,6 +470,17 @@ Yasushi Shoji <yashi@atmark-techno.com>
SUZAKU MicroBlaze
#########################################################################
# Coldfire Systems: #
# #
# Maintainer Name, Email Address #
# Board CPU #
#########################################################################
Stefan Roese <stefan.roese@esd-electronics.com>
TASREG MCF5249
#########################################################################
# End of MAINTAINERS list #
#########################################################################

15
MAKEALL
View File

@@ -51,6 +51,7 @@ LIST_8xx=" \
FPS850L LANTEC QS850 TQM850L \
GEN860T lwmon QS860T TQM855L \
GEN860T_SC MBX quantum TQM860L \
uc100 \
v37 \
"
@@ -68,7 +69,15 @@ LIST_4xx=" \
ml300 OCOTEA OCRTC ORSG \
PCI405 PIP405 PLU405 PMC405 \
PPChameleonEVB VOH405 W7OLMC W7OLMG \
WALNUT405 XPEDITE1K \
WALNUT405 WUH405 XPEDITE1K \
"
#########################################################################
## MPC8220 Systems
#########################################################################
LIST_8220=" \
Alaska8220 Yukon8220 \
"
#########################################################################
@@ -114,7 +123,7 @@ LIST_74xx=" \
"
LIST_7xx=" \
BAB7xx ELPPC \
BAB7xx CPCI750 ELPPC \
"
LIST_ppc="${LIST_5xx} ${LIST_5xxx} \
@@ -228,7 +237,7 @@ build_target() {
for arg in $@
do
case "$arg" in
ppc|5xx|5xxx|8xx|824x|8260|85xx|4xx|7xx|74xx| \
ppc|5xx|5xxx|8xx|8220|824x|8260|85xx|4xx|7xx|74xx| \
arm|SA|ARM7|ARM9|pxa|ixp| \
microblaze| \
mips| \

View File

@@ -109,7 +109,7 @@ LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \
fs/reiserfs/libreiserfs.a
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
@@ -258,6 +258,9 @@ icecube_5100_config: unconfig
}
@./mkconfig -a IceCube ppc mpc5xxx icecube
inka4x0_config: unconfig
@./mkconfig inka4x0 ppc mpc5xxx inka4x0
PM520_config \
PM520_DDR_config \
PM520_ROMBOOT_config \
@@ -307,6 +310,7 @@ Total5200_Rev2_lowboot_config: unconfig
}
@./mkconfig -a Total5200 ppc mpc5xxx total5200
TQM5200_auto_config \
TQM5200_AA_config \
TQM5200_AB_config \
TQM5200_AC_config \
@@ -331,6 +335,10 @@ MiniFAP_config: unconfig
echo "... with 4 MB Flash, 128 MB SDRAM" ; \
echo "... with Graphics Controller"; \
}
@[ -z "$(findstring auto,$@)" ] || \
{ echo "#define CONFIG_CS_AUTOCONF" >>include/config.h ; \
echo "... with automatic CS configuration" ; \
}
@./mkconfig -a TQM5200 ppc mpc5xxx tqm5200
#########################################################################
@@ -659,6 +667,9 @@ TTTech_config: unconfig
@echo "#define CONFIG_SHARP_LQ104V7DS01" >>include/config.h
@./mkconfig -a TQM823L ppc mpc8xx tqm8xx
uc100_config : unconfig
@./mkconfig $(@:_config=) ppc mpc8xx uc100
v37_config: unconfig
@echo "#define CONFIG_LCD" >include/config.h
@echo "#define CONFIG_SHARP_LQ084V1DG21" >>include/config.h
@@ -677,6 +688,9 @@ xtract_4xx = $(subst _25,,$(subst _33,,$(subst _BA,,$(subst _ME,,$(subst _HI,,$(
ADCIOP_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx adciop esd
APC405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx apc405 esd
AR405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx ar405 esd
@@ -706,6 +720,7 @@ CATcenter_33_config: unconfig
CPCI405_config \
CPCI4052_config \
CPCI405DT_config \
CPCI405AB_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx cpci405 esd
@echo "BOARD_REVISION = $(@:_config=)" >>include/config.mk
@@ -743,6 +758,12 @@ ERIC_config: unconfig
EXBITGEN_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx exbitgen
G2000_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx g2000
HH405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx hh405 esd
HUB405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx hub405 esd
@@ -815,6 +836,9 @@ PPChameleonEVB_HI_33_config: unconfig
VOH405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx voh405 esd
VOM405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx vom405 esd
W7OLMC_config \
W7OLMG_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx w7o
@@ -822,9 +846,21 @@ W7OLMG_config: unconfig
WALNUT405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx walnut405
WUH405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx wuh405 esd
XPEDITE1K_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx xpedite1k
#########################################################################
## MPC8220 Systems
#########################################################################
Alaska8220_config: unconfig
@./mkconfig $(@:_config=) ppc mpc8220 alaska
Yukon8220_config: unconfig
@./mkconfig $(@:_config=) ppc mpc8220 yukon
#########################################################################
## MPC824x Systems
#########################################################################
@@ -1080,6 +1116,9 @@ M5272C3_config : unconfig
M5282EVB_config : unconfig
@./mkconfig $(@:_config=) m68k mcf52x2 m5282evb
TASREG_config : unconfig
@./mkconfig $(@:_config=) m68k mcf52x2 tasreg esd
#########################################################################
## MPC85xx Systems
#########################################################################
@@ -1133,6 +1172,9 @@ AmigaOneG3SE_config: unconfig
BAB7xx_config: unconfig
@./mkconfig $(@:_config=) ppc 74xx_7xx bab7xx eltec
CPCI750_config: unconfig
@./mkconfig CPCI750 ppc 74xx_7xx cpci750 esd
DB64360_config: unconfig
@./mkconfig DB64360 ppc 74xx_7xx db64360 Marvell
@@ -1188,12 +1230,12 @@ xtract_omap1610xxx = $(subst _cs0boot,,$(subst _cs3boot,,$(subst _cs_autoboot,,$
xtract_omap730p2 = $(subst _cs0boot,,$(subst _cs3boot,, $(subst _config,,$1)))
integratorcp_config : unconfig
@./mkconfig $(@:_config=) arm arm926ejs integratorcp
integratorap_config : unconfig
@./mkconfig $(@:_config=) arm arm926ejs integratorap
integratorcp_config : unconfig
@./mkconfig $(@:_config=) arm arm926ejs integratorcp
lpd7a400_config \
lpd7a404_config: unconfig
@./mkconfig $(@:_config=) arm lh7a40x lpd7a40x

44
README
View File

@@ -123,24 +123,25 @@ Directory Hierarchy:
- board Board dependent files
- common Misc architecture independent functions
- cpu CPU specific files
- 74xx_7xx Files specific to Motorola MPC74xx and 7xx CPUs
- 74xx_7xx Files specific to Freescale MPC74xx and 7xx CPUs
- arm720t Files specific to ARM 720 CPUs
- arm920t Files specific to ARM 920 CPUs
- imx Files specific to Motorola MC9328 i.MX CPUs
- imx Files specific to Freescale MC9328 i.MX CPUs
- s3c24x0 Files specific to Samsung S3C24X0 CPUs
- arm925t Files specific to ARM 925 CPUs
- arm926ejs Files specific to ARM 926 CPUs
- at91rm9200 Files specific to Atmel AT91RM9200 CPUs
- i386 Files specific to i386 CPUs
- ixp Files specific to Intel XScale IXP CPUs
- mcf52x2 Files specific to Motorola ColdFire MCF52x2 CPUs
- mcf52x2 Files specific to Freescale ColdFire MCF52x2 CPUs
- mips Files specific to MIPS CPUs
- mpc5xx Files specific to Motorola MPC5xx CPUs
- mpc5xxx Files specific to Motorola MPC5xxx CPUs
- mpc8xx Files specific to Motorola MPC8xx CPUs
- mpc824x Files specific to Motorola MPC824x CPUs
- mpc8260 Files specific to Motorola MPC8260 CPUs
- mpc85xx Files specific to Motorola MPC85xx CPUs
- mpc5xx Files specific to Freescale MPC5xx CPUs
- mpc5xxx Files specific to Freescale MPC5xxx CPUs
- mpc8xx Files specific to Freescale MPC8xx CPUs
- mpc8220 Files specific to Freescale MPC8220 CPUs
- mpc824x Files specific to Freescale MPC824x CPUs
- mpc8260 Files specific to Freescale MPC8260 CPUs
- mpc85xx Files specific to Freescale MPC85xx CPUs
- nios Files specific to Altera NIOS CPUs
- nios2 Files specific to Altera Nios-II CPUs
- ppc4xx Files specific to IBM PowerPC 4xx CPUs
@@ -229,6 +230,7 @@ The following options need to be configured:
-------------------
CONFIG_MPC823, CONFIG_MPC850, CONFIG_MPC855, CONFIG_MPC860
or CONFIG_MPC5xx
or CONFIG_MPC8220
or CONFIG_MPC824X, CONFIG_MPC8260
or CONFIG_MPC85xx
or CONFIG_IOP480
@@ -833,7 +835,7 @@ The following options need to be configured:
function struct part_info* jffs2_part_info(int part_num)
If you define only one JFFS2 partition you may also want to
#define CFG_JFFS_SINGLE_PART 1
#define CFG_JFFS_SINGLE_PART 1
to disable the command chpart. This is the default when you
have not defined a custom partition
@@ -1975,9 +1977,9 @@ Low Level (hardware related) configuration options:
source code. It is used to make hardware dependant
initializations.
- CFG_IMMR: Physical address of the Internal Memory Mapped
Register; DO NOT CHANGE! (11-4)
[MPC8xx systems only]
- CFG_IMMR: Physical address of the Internal Memory.
DO NOT CHANGE unless you know exactly what you're
doing! (11-4) [MPC8xx/82xx systems only]
- CFG_INIT_RAM_ADDR:
@@ -2111,6 +2113,20 @@ Low Level (hardware related) configuration options:
Add the "loopw" memory command. This only takes effect if
the memory commands are activated globally (CFG_CMD_MEM).
- CONFIG_MX_CYCLIC
Add the "mdc" and "mwc" memory commands. These are cyclic
"md/mw" commands.
Examples:
=> mdc.b 10 4 500
This command will print 4 bytes (10,11,12,13) each 500 ms.
=> mwc.l 100 12345678 10
This command will write 12345678 to address 100 all 10 ms.
This only takes effect if the memory commands are activated
globally (CFG_CMD_MEM).
Building the Software:
======================
@@ -2140,6 +2156,7 @@ configurations; the following names are supported:
ADCIOP_config FPS860L_config omap730p2_config
ADS860_config GEN860T_config pcu_e_config
Alaska8220_config
AR405_config GENIETV_config PIP405_config
at91rm9200dk_config GTH_config QS823_config
CANBT_config hermes_config QS850_config
@@ -2161,6 +2178,7 @@ configurations; the following names are supported:
FADS860T_config omap1610inn_config TQM855L_config
FPS850L_config omap5912osk_config TQM860L_config
WALNUT405_config
Yukon8220_config
ZPC1900_config
Note: for some board special configuration names may exist; check if

45
board/alaska/Makefile Normal file
View File

@@ -0,0 +1,45 @@
# (C) Copyright 2003-2004
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# See file CREDITS for list of people who contributed to this
# project.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS := $(BOARD).o flash.o extserial.o serial.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)
clean:
rm -f $(SOBJS) $(OBJS)
distclean: clean
rm -f $(LIB) core *.bak .depend
#########################################################################
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
$(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
-include .depend
#########################################################################

153
board/alaska/alaska.c Normal file
View File

@@ -0,0 +1,153 @@
/*
* (C) Copyright 2004, Freescale Inc.
* TsiChung Liew, Tsi-Chung.Liew@freescale.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <mpc8220.h>
#include <asm/processor.h>
#include <asm/mmu.h>
void setupBat (ulong size)
{
ulong batu, batl;
int blocksize = 0;
/* Flash 0 */
#if defined (CFG_AMD_BOOT)
batu = CFG_FLASH0_BASE | (BL_512K << 2) | BPP_RW | BPP_RX;
#else
batu = CFG_FLASH0_BASE | (BL_16M << 2) | BPP_RW | BPP_RX;
#endif
batl = CFG_FLASH0_BASE | 0x22;
write_bat (IBAT0, batu, batl);
write_bat (DBAT0, batu, batl);
/* Flash 1 */
#if defined (CFG_AMD_BOOT)
batu = CFG_FLASH1_BASE | (BL_16M << 2) | BPP_RW | BPP_RX;
#else
batu = CFG_FLASH1_BASE | (BL_512K << 2) | BPP_RW | BPP_RX;
#endif
batl = CFG_FLASH1_BASE | 0x22;
write_bat (IBAT1, batu, batl);
write_bat (DBAT1, batu, batl);
/* CPLD */
batu = CFG_CPLD_BASE | (BL_512K << 2) | BPP_RW | BPP_RX;
batl = CFG_CPLD_BASE | 0x22;
write_bat (IBAT2, 0, 0);
write_bat (DBAT2, batu, batl);
/* FPGA */
batu = CFG_FPGA_BASE | (BL_512K << 2) | BPP_RW | BPP_RX;
batl = CFG_FPGA_BASE | 0x22;
write_bat (IBAT3, 0, 0);
write_bat (DBAT3, batu, batl);
/* MBAR - Data only */
batu = CFG_MBAR | BPP_RW | BPP_RX;
batl = CFG_MBAR | 0x22;
mtspr (IBAT4L, 0);
mtspr (IBAT4U, 0);
mtspr (DBAT4L, batl);
mtspr (DBAT4U, batu);
/* MBAR - SRAM */
batu = CFG_SRAM_BASE | BPP_RW | BPP_RX;
batl = CFG_SRAM_BASE | 0x42;
mtspr (IBAT5L, batl);
mtspr (IBAT5U, batu);
mtspr (DBAT5L, batl);
mtspr (DBAT5U, batu);
if (size <= 0x800000) /* 8MB */
blocksize = BL_8M << 2;
else if (size <= 0x1000000) /* 16MB */
blocksize = BL_16M << 2;
else if (size <= 0x2000000) /* 32MB */
blocksize = BL_32M << 2;
else if (size <= 0x4000000) /* 64MB */
blocksize = BL_64M << 2;
else if (size <= 0x8000000) /* 128MB */
blocksize = BL_128M << 2;
else if (size <= 0x10000000) /* 256MB */
blocksize = BL_256M << 2;
/* Memory */
batu = CFG_SDRAM_BASE | blocksize | BPP_RW | BPP_RX;
batl = CFG_SDRAM_BASE | 0x42;
mtspr (IBAT6L, batl);
mtspr (IBAT6U, batu);
mtspr (DBAT6L, batl);
mtspr (DBAT6U, batu);
/* memory size is less than 256MB */
if (size <= 0x10000000) {
/* Nothing */
batu = 0;
batl = 0;
} else {
size -= 0x10000000;
if (size <= 0x800000) /* 8MB */
blocksize = BL_8M << 2;
else if (size <= 0x1000000) /* 16MB */
blocksize = BL_16M << 2;
else if (size <= 0x2000000) /* 32MB */
blocksize = BL_32M << 2;
else if (size <= 0x4000000) /* 64MB */
blocksize = BL_64M << 2;
else if (size <= 0x8000000) /* 128MB */
blocksize = BL_128M << 2;
else if (size <= 0x10000000) /* 256MB */
blocksize = BL_256M << 2;
batu = (CFG_SDRAM_BASE +
0x10000000) | blocksize | BPP_RW | BPP_RX;
batl = (CFG_SDRAM_BASE + 0x10000000) | 0x42;
}
mtspr (IBAT7L, batl);
mtspr (IBAT7U, batu);
mtspr (DBAT7L, batl);
mtspr (DBAT7U, batu);
}
long int initdram (int board_type)
{
ulong size;
size = dramSetup ();
/* if iCache ad dCache is defined */
#if (CONFIG_COMMANDS & CFG_CMD_CACHE)
/* setupBat(size);*/
#endif
return size;
}
int checkboard (void)
{
puts ("Board: Alaska MPC8220 Evaluation Board\n");
return 0;
}

31
board/alaska/config.mk Normal file
View File

@@ -0,0 +1,31 @@
#
# (C) Copyright 2003-2004
# 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
#
#
# alaska board
#
TEXT_BASE = 0xfff00000
# TEXT_BASE = 0x00100000
PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -I$(TOPDIR)/board

110
board/alaska/extserial.c Normal file
View File

@@ -0,0 +1,110 @@
/*
* (C) Copyright 2004, Freescale, Inc
* TsiChung Liew, Tsi-Chung.Liew@freescale.com.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
/*
* Minimal serial functions needed to use one of the PSC ports
* as serial console interface.
*/
#include <common.h>
#include <mpc8220.h>
#if defined (CONFIG_EXTUART_CONSOLE)
# include <ns16550.h>
# define PADSERIAL_BAUD_115200 0x40
# define PADSERIAL_BAUD_57600 0x20
# define PADSERIAL_BAUD_9600 0
# define PADCARD_FREQ 18432000
const NS16550_t com_port = (NS16550_t) CFG_NS16550_COM1;
int ext_serial_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
volatile u8 *dipswitch = (volatile u8 *) (CFG_CPLD_BASE + 0x1002);
int baud_divisor;
/* Find out the baud rate speed on debug card dip switches */
if (*dipswitch & PADSERIAL_BAUD_115200)
gd->baudrate = 115200;
else if (*dipswitch & PADSERIAL_BAUD_57600)
gd->baudrate = 57600;
else
gd->baudrate = 9600;
/* Debug card frequency */
baud_divisor = PADCARD_FREQ / (16 * gd->baudrate);
NS16550_init (com_port, baud_divisor);
return (0);
}
void ext_serial_putc (const char c)
{
if (c == '\n')
NS16550_putc (com_port, '\r');
NS16550_putc (com_port, c);
}
void ext_serial_puts (const char *s)
{
while (*s) {
serial_putc (*s++);
}
}
int ext_serial_getc (void)
{
return NS16550_getc (com_port);
}
int ext_serial_tstc (void)
{
return NS16550_tstc (com_port);
}
void ext_serial_setbrg (void)
{
DECLARE_GLOBAL_DATA_PTR;
volatile u8 *dipswitch = (volatile u8 *) (CFG_CPLD_BASE + 0x1002);
int baud_divisor;
/* Find out the baud rate speed on debug card dip switches */
if (*dipswitch & PADSERIAL_BAUD_115200)
gd->baudrate = 115200;
else if (*dipswitch & PADSERIAL_BAUD_57600)
gd->baudrate = 57600;
else
gd->baudrate = 9600;
/* Debug card frequency */
baud_divisor = PADCARD_FREQ / (16 * gd->baudrate);
NS16550_reinit (com_port, baud_divisor);
}
#endif /* CONFIG_EXTUART_CONSOLE */

807
board/alaska/flash.c Normal file
View File

@@ -0,0 +1,807 @@
/*
* (C) Copyright 2001
* Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
*
* (C) Copyright 2001-2004
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <linux/byteorder/swab.h>
flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
/* Board support for 1 or 2 flash devices */
#define FLASH_PORT_WIDTH8
typedef unsigned char FLASH_PORT_WIDTH;
typedef volatile unsigned char FLASH_PORT_WIDTHV;
#define SWAP(x) (x)
/* Intel-compatible flash ID */
#define INTEL_COMPAT 0x89
#define INTEL_ALT 0xB0
/* Intel-compatible flash commands */
#define INTEL_PROGRAM 0x10
#define INTEL_ERASE 0x20
#define INTEL_CLEAR 0x50
#define INTEL_LOCKBIT 0x60
#define INTEL_PROTECT 0x01
#define INTEL_STATUS 0x70
#define INTEL_READID 0x90
#define INTEL_CONFIRM 0xD0
#define INTEL_RESET 0xFF
/* Intel-compatible flash status bits */
#define INTEL_FINISHED 0x80
#define INTEL_OK 0x80
#define FPW FLASH_PORT_WIDTH
#define FPWV FLASH_PORT_WIDTHV
#define FLASH_CYCLE1 0x0555
#define FLASH_CYCLE2 0x02aa
#define WR_BLOCK 0x20
/*-----------------------------------------------------------------------
* Functions
*/
static ulong flash_get_size (FPW * addr, flash_info_t * info);
static int write_data (flash_info_t * info, ulong dest, FPW data);
static int write_data_block (flash_info_t * info, ulong src, ulong dest);
static int write_word_amd (flash_info_t * info, FPWV * dest, FPW data);
static void flash_get_offsets (ulong base, flash_info_t * info);
void inline spin_wheel (void);
/*-----------------------------------------------------------------------
*/
unsigned long flash_init (void)
{
int i;
ulong size = 0;
ulong fsize = 0;
for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
memset (&flash_info[i], 0, sizeof (flash_info_t));
switch (i) {
case 0:
flash_get_size ((FPW *) CFG_FLASH1_BASE,
&flash_info[i]);
flash_get_offsets (CFG_FLASH1_BASE, &flash_info[i]);
break;
case 1:
flash_get_size ((FPW *) CFG_FLASH1_BASE,
&flash_info[i]);
fsize = CFG_FLASH1_BASE + flash_info[i - 1].size;
flash_get_offsets (fsize, &flash_info[i]);
break;
case 2:
flash_get_size ((FPW *) CFG_FLASH0_BASE,
&flash_info[i]);
flash_get_offsets (CFG_FLASH0_BASE, &flash_info[i]);
break;
case 3:
flash_get_size ((FPW *) CFG_FLASH0_BASE,
&flash_info[i]);
fsize = CFG_FLASH0_BASE + flash_info[i - 1].size;
flash_get_offsets (fsize, &flash_info[i]);
break;
default:
panic ("configured to many flash banks!\n");
break;
}
size += flash_info[i].size;
}
/* Protect monitor and environment sectors
*/
#if defined (CFG_AMD_BOOT)
flash_protect (FLAG_PROTECT_SET,
CFG_MONITOR_BASE,
CFG_MONITOR_BASE + monitor_flash_len - 1,
&flash_info[2]);
flash_protect (FLAG_PROTECT_SET,
CFG_INTEL_BASE,
CFG_INTEL_BASE + monitor_flash_len - 1,
&flash_info[1]);
#else
flash_protect (FLAG_PROTECT_SET,
CFG_MONITOR_BASE,
CFG_MONITOR_BASE + monitor_flash_len - 1,
&flash_info[3]);
flash_protect (FLAG_PROTECT_SET,
CFG_AMD_BASE,
CFG_AMD_BASE + monitor_flash_len - 1, &flash_info[0]);
#endif
flash_protect (FLAG_PROTECT_SET,
CFG_ENV1_ADDR,
CFG_ENV1_ADDR + CFG_ENV1_SIZE - 1, &flash_info[1]);
flash_protect (FLAG_PROTECT_SET,
CFG_ENV_ADDR,
CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[3]);
return size;
}
/*-----------------------------------------------------------------------
*/
static void flash_get_offsets (ulong base, flash_info_t * info)
{
int i;
if (info->flash_id == FLASH_UNKNOWN)
return;
if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_AMD) {
for (i = 0; i < info->sector_count; i++) {
info->start[i] = base + (i * PHYS_AMD_SECT_SIZE);
info->protect[i] = 0;
}
}
if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
for (i = 0; i < info->sector_count; i++) {
info->start[i] = base + (i * PHYS_INTEL_SECT_SIZE);
info->protect[i] = 0;
}
}
}
/*-----------------------------------------------------------------------
*/
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_INTEL:
printf ("INTEL ");
break;
case FLASH_MAN_AMD:
printf ("AMD ");
break;
default:
printf ("Unknown Vendor ");
break;
}
switch (info->flash_id & FLASH_TYPEMASK) {
case FLASH_28F128J3A:
printf ("28F128J3A\n");
break;
case FLASH_AM040:
printf ("AMD29F040B\n");
break;
default:
printf ("Unknown Chip Type\n");
break;
}
printf (" Size: %ld MB in %d Sectors\n",
info->size >> 20, 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 ulong flash_get_size (FPW * addr, flash_info_t * info)
{
FPWV value;
static int amd = 0;
/* Write auto select command: read Manufacturer ID */
/* Write auto select command sequence and test FLASH answer */
addr[FLASH_CYCLE1] = (FPW) 0x00AA00AA; /* for AMD, Intel ignores this */
__asm__ ("sync");
addr[FLASH_CYCLE2] = (FPW) 0x00550055; /* for AMD, Intel ignores this */
__asm__ ("sync");
addr[FLASH_CYCLE1] = (FPW) 0x00900090; /* selects Intel or AMD */
__asm__ ("sync");
udelay (100);
switch (addr[0] & 0xff) {
case (uchar) AMD_MANUFACT:
info->flash_id = FLASH_MAN_AMD;
value = addr[1];
break;
case (uchar) INTEL_MANUFACT:
info->flash_id = FLASH_MAN_INTEL;
value = addr[2];
break;
default:
printf ("unknown\n");
info->flash_id = FLASH_UNKNOWN;
info->sector_count = 0;
info->size = 0;
addr[0] = (FPW) 0x00FF00FF; /* restore read mode */
return (0); /* no or unknown flash */
}
switch (value) {
case (FPW) INTEL_ID_28F128J3A:
info->flash_id += FLASH_28F128J3A;
info->sector_count = 64;
info->size = 0x00800000; /* => 16 MB */
break;
case (FPW) AMD_ID_LV040B:
info->flash_id += FLASH_AM040;
if (amd == 0) {
info->sector_count = 7;
info->size = 0x00070000; /* => 448 KB */
amd = 1;
} else {
/* for Environment settings */
info->sector_count = 1;
info->size = PHYS_AMD_SECT_SIZE; /* => 64 KB */
amd = 0;
}
break;
default:
info->flash_id = FLASH_UNKNOWN;
break;
}
if (info->sector_count > CFG_MAX_FLASH_SECT) {
printf ("** ERROR: sector count %d > max (%d) **\n",
info->sector_count, CFG_MAX_FLASH_SECT);
info->sector_count = CFG_MAX_FLASH_SECT;
}
if (value == (FPW) INTEL_ID_28F128J3A)
addr[0] = (FPW) 0x00FF00FF; /* restore read mode */
else
addr[0] = (FPW) 0x00F000F0; /* restore read mode */
return (info->size);
}
/*-----------------------------------------------------------------------
*/
int flash_erase (flash_info_t * info, int s_first, int s_last)
{
int flag, prot, sect;
ulong type, start, last;
int rcode = 0, intel = 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;
}
type = (info->flash_id & FLASH_VENDMASK);
if ((type != FLASH_MAN_INTEL)) {
type = (info->flash_id & FLASH_VENDMASK);
if ((type != FLASH_MAN_AMD)) {
printf ("Can't erase unknown flash type %08lx - aborted\n",
info->flash_id);
return 1;
}
}
if (type == FLASH_MAN_INTEL)
intel = 1;
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");
}
start = get_timer (0);
last = start;
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts ();
/* Start erase on unprotected sectors */
for (sect = s_first; sect <= s_last; sect++) {
if (info->protect[sect] == 0) { /* not protected */
FPWV *addr = (FPWV *) (info->start[sect]);
FPW status;
printf ("Erasing sector %2d ... ", sect);
/* arm simple, non interrupt dependent timer */
start = get_timer (0);
if (intel) {
*addr = (FPW) 0x00500050; /* clear status register */
*addr = (FPW) 0x00200020; /* erase setup */
*addr = (FPW) 0x00D000D0; /* erase confirm */
} else {
FPWV *base; /* first address in bank */
base = (FPWV *) (CFG_AMD_BASE);
base[FLASH_CYCLE1] = (FPW) 0x00AA00AA; /* unlock */
base[FLASH_CYCLE2] = (FPW) 0x00550055; /* unlock */
base[FLASH_CYCLE1] = (FPW) 0x00800080; /* erase mode */
base[FLASH_CYCLE1] = (FPW) 0x00AA00AA; /* unlock */
base[FLASH_CYCLE2] = (FPW) 0x00550055; /* unlock */
*addr = (FPW) 0x00300030; /* erase sector */
}
while (((status =
*addr) & (FPW) 0x00800080) !=
(FPW) 0x00800080) {
if (get_timer (start) > CFG_FLASH_ERASE_TOUT) {
printf ("Timeout\n");
if (intel) {
*addr = (FPW) 0x00B000B0; /* suspend erase */
*addr = (FPW) 0x00FF00FF; /* reset to read mode */
} else
*addr = (FPW) 0x00F000F0; /* reset to read mode */
rcode = 1;
break;
}
}
if (intel) {
*addr = (FPW) 0x00500050; /* clear status register cmd. */
*addr = (FPW) 0x00FF00FF; /* resest to read mode */
} else
*addr = (FPW) 0x00F000F0; /* reset to read mode */
printf (" done\n");
}
}
return rcode;
}
/*-----------------------------------------------------------------------
* Copy memory to flash, returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
* 4 - Flash not identified
*/
int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
{
if (info->flash_id == FLASH_UNKNOWN) {
return 4;
}
switch (info->flash_id & FLASH_VENDMASK) {
case FLASH_MAN_AMD:
{
FPW data = 0; /* 16 or 32 bit word, matches flash bus width */
int bytes; /* number of bytes to program in current word */
int left; /* number of bytes left to program */
int i, res;
for (left = cnt, res = 0;
left > 0 && res == 0;
addr += sizeof (data), left -=
sizeof (data) - bytes) {
bytes = addr & (sizeof (data) - 1);
addr &= ~(sizeof (data) - 1);
/* combine source and destination data so can program
* an entire word of 16 or 32 bits
*/
for (i = 0; i < sizeof (data); i++) {
data <<= 8;
if (i < bytes || i - bytes >= left)
data += *((uchar *) addr + i);
else
data += *src++;
}
res = write_word_amd (info, (FPWV *) addr,
data);
}
return res;
} /* case FLASH_MAN_AMD */
case FLASH_MAN_INTEL:
{
ulong cp, wp;
FPW data;
int count, i, l, rc, port_width;
/* get lower word aligned address */
wp = addr;
port_width = 1;
/*
* 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 < port_width && cnt > 0; ++i) {
data = (data << 8) | *src++;
--cnt;
++cp;
}
for (; cnt == 0 && i < port_width; ++i, ++cp)
data = (data << 8) | (*(uchar *) cp);
if ((rc =
write_data (info, wp, SWAP (data))) != 0)
return (rc);
wp += port_width;
}
if (cnt > WR_BLOCK) {
/*
* handle word aligned part
*/
count = 0;
while (cnt >= WR_BLOCK) {
if ((rc =
write_data_block (info,
(ulong) src,
wp)) != 0)
return (rc);
wp += WR_BLOCK;
src += WR_BLOCK;
cnt -= WR_BLOCK;
if (count++ > 0x800) {
spin_wheel ();
count = 0;
}
}
}
if (cnt < WR_BLOCK) {
/*
* handle word aligned part
*/
count = 0;
while (cnt >= port_width) {
data = 0;
for (i = 0; i < port_width; ++i)
data = (data << 8) | *src++;
if ((rc =
write_data (info, wp,
SWAP (data))) != 0)
return (rc);
wp += port_width;
cnt -= port_width;
if (count++ > 0x800) {
spin_wheel ();
count = 0;
}
}
}
if (cnt == 0)
return (0);
/*
* handle unaligned tail bytes
*/
data = 0;
for (i = 0, cp = wp; i < port_width && cnt > 0;
++i, ++cp) {
data = (data << 8) | *src++;
--cnt;
}
for (; i < port_width; ++i, ++cp)
data = (data << 8) | (*(uchar *) cp);
return (write_data (info, wp, SWAP (data)));
} /* case FLASH_MAN_INTEL */
} /* switch */
return (0);
}
/*-----------------------------------------------------------------------
* Write a word or halfword to Flash, returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
*/
static int write_data (flash_info_t * info, ulong dest, FPW data)
{
FPWV *addr = (FPWV *) dest;
ulong start;
int flag;
/* Check if Flash is (sufficiently) erased */
if ((*addr & data) != data) {
printf ("not erased at %08lx (%lx)\n", (ulong) addr, *addr);
return (2);
}
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts ();
*addr = (FPW) 0x00400040; /* write setup */
*addr = data;
/* arm simple, non interrupt dependent timer */
start = get_timer (0);
/* wait while polling the status register */
while ((*addr & (FPW) 0x00800080) != (FPW) 0x00800080) {
if (get_timer (start) > CFG_FLASH_WRITE_TOUT) {
*addr = (FPW) 0x00FF00FF; /* restore read mode */
return (1);
}
}
*addr = (FPW) 0x00FF00FF; /* restore read mode */
return (0);
}
/*-----------------------------------------------------------------------
* Write a word or halfword to Flash, returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
*/
static int write_data_block (flash_info_t * info, ulong src, ulong dest)
{
FPWV *srcaddr = (FPWV *) src;
FPWV *dstaddr = (FPWV *) dest;
ulong start;
int flag, i;
/* Check if Flash is (sufficiently) erased */
for (i = 0; i < WR_BLOCK; i++)
if ((*dstaddr++ & 0xff) != 0xff) {
printf ("not erased at %08lx (%lx)\n",
(ulong) dstaddr, *dstaddr);
return (2);
}
dstaddr = (FPWV *) dest;
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts ();
*dstaddr = (FPW) 0x00e800e8; /* write block setup */
/* arm simple, non interrupt dependent timer */
start = get_timer (0);
/* wait while polling the status register */
while ((*dstaddr & (FPW) 0x00800080) != (FPW) 0x00800080) {
if (get_timer (start) > CFG_FLASH_WRITE_TOUT) {
*dstaddr = (FPW) 0x00FF00FF; /* restore read mode */
return (1);
}
}
*dstaddr = (FPW) 0x001f001f; /* write 32 to buffer */
for (i = 0; i < WR_BLOCK; i++)
*dstaddr++ = *srcaddr++;
dstaddr -= 1;
*dstaddr = (FPW) 0x00d000d0; /* write 32 to buffer */
/* arm simple, non interrupt dependent timer */
start = get_timer (0);
/* wait while polling the status register */
while ((*dstaddr & (FPW) 0x00800080) != (FPW) 0x00800080) {
if (get_timer (start) > CFG_FLASH_WRITE_TOUT) {
*dstaddr = (FPW) 0x00FF00FF; /* restore read mode */
return (1);
}
}
*dstaddr = (FPW) 0x00FF00FF; /* restore read mode */
return (0);
}
/*-----------------------------------------------------------------------
* Write a word to Flash for AMD FLASH
* A word is 16 or 32 bits, whichever the bus width of the flash bank
* (not an individual chip) is.
*
* returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
*/
static int write_word_amd (flash_info_t * info, FPWV * dest, FPW data)
{
ulong start;
int flag;
int res = 0; /* result, assume success */
FPWV *base; /* first address in flash bank */
/* Check if Flash is (sufficiently) erased */
if ((*dest & data) != data) {
return (2);
}
base = (FPWV *) (CFG_AMD_BASE);
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts ();
base[FLASH_CYCLE1] = (FPW) 0x00AA00AA; /* unlock */
base[FLASH_CYCLE2] = (FPW) 0x00550055; /* unlock */
base[FLASH_CYCLE1] = (FPW) 0x00A000A0; /* selects program mode */
*dest = data; /* start programming the data */
/* re-enable interrupts if necessary */
if (flag)
enable_interrupts ();
start = get_timer (0);
/* data polling for D7 */
while (res == 0
&& (*dest & (FPW) 0x00800080) != (data & (FPW) 0x00800080)) {
if (get_timer (start) > CFG_FLASH_WRITE_TOUT) {
*dest = (FPW) 0x00F000F0; /* reset bank */
res = 1;
}
}
return (res);
}
void inline spin_wheel (void)
{
static int p = 0;
static char w[] = "\\/-";
printf ("\010%c", w[p]);
(++p == 3) ? (p = 0) : 0;
}
/*-----------------------------------------------------------------------
* Set/Clear sector's lock bit, returns:
* 0 - OK
* 1 - Error (timeout, voltage problems, etc.)
*/
int flash_real_protect (flash_info_t * info, long sector, int prot)
{
ulong start;
int i;
int rc = 0;
FPWV *addr = (FPWV *) (info->start[sector]);
int flag = disable_interrupts ();
/*
* 29F040B AMD flash does not support software protection/unprotection,
* the only way to protect the AMD flash is marked it as prot bit.
* This flash only support hardware protection, by supply or not supply
* 12vpp to the flash
*/
if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_AMD) {
info->protect[sector] = prot;
return 0;
}
*addr = INTEL_CLEAR; /* Clear status register */
if (prot) { /* Set sector lock bit */
*addr = INTEL_LOCKBIT; /* Sector lock bit */
*addr = INTEL_PROTECT; /* set */
} else { /* Clear sector lock bit */
*addr = INTEL_LOCKBIT; /* All sectors lock bits */
*addr = INTEL_CONFIRM; /* clear */
}
start = get_timer (0);
while ((*addr & INTEL_FINISHED) != INTEL_FINISHED) {
if (get_timer (start) > CFG_FLASH_UNLOCK_TOUT) {
printf ("Flash lock bit operation timed out\n");
rc = 1;
break;
}
}
if (*addr != INTEL_OK) {
printf ("Flash lock bit operation failed at %08X, CSR=%08X\n",
(uint) addr, (uint) * addr);
rc = 1;
}
if (!rc)
info->protect[sector] = prot;
/*
* Clear lock bit command clears all sectors lock bits, so
* we have to restore lock bits of protected sectors.
*/
if (!prot) {
for (i = 0; i < info->sector_count; i++) {
if (info->protect[i]) {
start = get_timer (0);
addr = (FPWV *) (info->start[i]);
*addr = INTEL_LOCKBIT; /* Sector lock bit */
*addr = INTEL_PROTECT; /* set */
while ((*addr & INTEL_FINISHED) !=
INTEL_FINISHED) {
if (get_timer (start) >
CFG_FLASH_UNLOCK_TOUT) {
printf ("Flash lock bit operation timed out\n");
rc = 1;
break;
}
}
}
}
}
if (flag)
enable_interrupts ();
*addr = INTEL_RESET; /* Reset to read array mode */
return rc;
}

131
board/alaska/serial.c Normal file
View File

@@ -0,0 +1,131 @@
/*
* (C) Copyright 2004, Freescale, Inc
* TsiChung Liew, Tsi-Chung.Liew@freescale.com.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
/*
* Minimal serial functions needed to use one of the PSC ports
* as serial console interface.
*/
#include <common.h>
#include <mpc8220.h>
int serial_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
#if defined (CONFIG_EXTUART_CONSOLE)
volatile uchar *cpld = (volatile uchar *) CFG_CPLD_BASE;
#endif
/* Check CPLD Switch 2 whether is external or internal */
#if defined (CONFIG_EXTUART_CONSOLE)
if ((*cpld & 0x02) == 0x02) {
gd->bExtUart = 1;
return ext_serial_init ();
} else
#endif
{
#if defined(CONFIG_PSC_CONSOLE)
gd->bExtUart = 0;
return psc_serial_init ();
#endif
}
return (0);
}
void serial_putc (const char c)
{
DECLARE_GLOBAL_DATA_PTR;
if (gd->bExtUart) {
#if defined (CONFIG_EXTUART_CONSOLE)
ext_serial_putc (c);
#endif
} else {
#if defined(CONFIG_PSC_CONSOLE)
psc_serial_putc (c);
#endif
}
}
void serial_puts (const char *s)
{
DECLARE_GLOBAL_DATA_PTR;
if (gd->bExtUart) {
#if defined (CONFIG_EXTUART_CONSOLE)
ext_serial_puts (s);
#endif
} else {
#if defined(CONFIG_PSC_CONSOLE)
psc_serial_puts (s);
#endif
}
}
int serial_getc (void)
{
DECLARE_GLOBAL_DATA_PTR;
if (gd->bExtUart) {
#if defined (CONFIG_EXTUART_CONSOLE)
return ext_serial_getc ();
#endif
} else {
#if defined(CONFIG_PSC_CONSOLE)
return psc_serial_getc ();
#endif
}
}
int serial_tstc (void)
{
DECLARE_GLOBAL_DATA_PTR;
if (gd->bExtUart) {
#if defined (CONFIG_EXTUART_CONSOLE)
return ext_serial_tstc ();
#endif
} else {
#if defined(CONFIG_PSC_CONSOLE)
return psc_serial_tstc ();
#endif
}
}
void serial_setbrg (void)
{
DECLARE_GLOBAL_DATA_PTR;
if (gd->bExtUart) {
#if defined (CONFIG_EXTUART_CONSOLE)
ext_serial_setbrg ();
#endif
} else {
#if defined(CONFIG_PSC_CONSOLE)
psc_serial_setbrg ();
#endif
}
}

122
board/alaska/u-boot.lds Normal file
View File

@@ -0,0 +1,122 @@
/*
* (C) Copyright 2003-2004
* 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
*/
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/mpc8220/start.o (.text)
*(.text)
*(.fixup)
*(.got1)
. = ALIGN(16);
*(.rodata)
*(.rodata1)
*(.rodata.str1.4)
}
.fini : { *(.fini) } =0
.ctors : { *(.ctors) }
.dtors : { *(.dtors) }
/* Read-write section, merged into data segment: */
. = (. + 0x0FFF) & 0xFFFFF000;
_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 = .);
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;
. = ALIGN(4096);
__init_begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(4096);
__init_end = .;
__bss_start = .;
.bss :
{
*(.sbss) *(.scommon)
*(.dynbss)
*(.bss)
*(COMMON)
}
_end = . ;
PROVIDE (end = .);
}

View File

@@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS := at91rm9200dk.o at45.o dm9161.o flash.o
SOBJS :=
SOBJS := memsetup.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS) $(SOBJS)

View File

@@ -1 +1 @@
TEXT_BASE = 0x21f80000
TEXT_BASE = 0x21f00000

View File

@@ -0,0 +1,200 @@
/*
* Memory Setup stuff - taken from blob memsetup.S
*
* Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and
* Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
*
* Modified for the at91rm9200dk board by
* (C) Copyright 2004
* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <config.h>
#include <version.h>
#ifdef CONFIG_BOOTBINFUNC
/*
* some parameters for the board
*
* This is based on rm9200dk.cfg for the BDI2000 from ABATRON which in
* turn is based on the boot.bin code from ATMEL
*
*/
/* flash */
#define MC_PUIA 0xFFFFFF10
#define MC_PUIA_VAL 0x00000000
#define MC_PUP 0xFFFFFF50
#define MC_PUP_VAL 0x00000000
#define MC_PUER 0xFFFFFF54
#define MC_PUER_VAL 0x00000000
#define MC_ASR 0xFFFFFF04
#define MC_ASR_VAL 0x00000000
#define MC_AASR 0xFFFFFF08
#define MC_AASR_VAL 0x00000000
#define EBI_CFGR 0xFFFFFF64
#define EBI_CFGR_VAL 0x00000000
#define SMC2_CSR 0xFFFFFF70
#define SMC2_CSR_VAL 0x00003284 /* 16bit, 2 TDF, 4 WS */
/* clocks */
#define PLLAR 0xFFFFFC28
#define PLLAR_VAL 0x20263E04 /* 179.712000 MHz for PCK */
#define PLLBR 0xFFFFFC2C
#define PLLBR_VAL 0x10483E0E /* 48.054857 MHz (divider by 2 for USB) */
#define MCKR 0xFFFFFC30
#define MCKR_VAL 0x00000202 /* PCK/3 = MCK Master Clock = 59.904000MHz from PLLA */
/* sdram */
#define PIOC_ASR 0xFFFFF870
#define PIOC_ASR_VAL 0xFFFF0000 /* Configure PIOC as peripheral (D16/D31) */
#define PIOC_BSR 0xFFFFF874
#define PIOC_BSR_VAL 0x00000000
#define PIOC_PDR 0xFFFFF804
#define PIOC_PDR_VAL 0xFFFF0000
#define EBI_CSA 0xFFFFFF60
#define EBI_CSA_VAL 0x00000002 /* CS1=SDRAM */
#define SDRC_CR 0xFFFFFF98
#define SDRC_CR_VAL 0x2188c155 /* set up the SDRAM */
#define SDRAM 0x20000000 /* address of the SDRAM */
#define SDRAM1 0x20000080 /* address of the SDRAM */
#define SDRAM_VAL 0x00000000 /* value written to SDRAM */
#define SDRC_MR 0xFFFFFF90
#define SDRC_MR_VAL 0x00000002 /* Precharge All */
#define SDRC_MR_VAL1 0x00000004 /* refresh */
#define SDRC_MR_VAL2 0x00000003 /* Load Mode Register */
#define SDRC_MR_VAL3 0x00000000 /* Normal Mode */
#define SDRC_TR 0xFFFFFF94
#define SDRC_TR_VAL 0x000002E0 /* Write refresh rate */
_TEXT_BASE:
.word TEXT_BASE
.globl lowlevelinit
lowlevelinit:
/* memory control configuration */
/* this isn't very elegant, but what the heck */
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
add r2, r0, #80
0:
/* the address */
ldr r1, [r0], #4
/* the value */
ldr r3, [r0], #4
str r3, [r1]
cmp r2, r0
bne 0b
/* delay - this is all done by guess */
ldr r0, =0x00010000
1:
subs r0, r0, #1
bhi 1b
ldr r0, =SMRDATA1
ldr r1, _TEXT_BASE
sub r0, r0, r1
add r2, r0, #176
2:
/* the address */
ldr r1, [r0], #4
/* the value */
ldr r3, [r0], #4
str r3, [r1]
cmp r2, r0
bne 2b
/* everything is fine now */
mov pc, lr
.ltorg
SMRDATA:
.word MC_PUIA
.word MC_PUIA_VAL
.word MC_PUP
.word MC_PUP_VAL
.word MC_PUER
.word MC_PUER_VAL
.word MC_ASR
.word MC_ASR_VAL
.word MC_AASR
.word MC_AASR_VAL
.word EBI_CFGR
.word EBI_CFGR_VAL
.word SMC2_CSR
.word SMC2_CSR_VAL
.word PLLAR
.word PLLAR_VAL
.word PLLBR
.word PLLBR_VAL
.word MCKR
.word MCKR_VAL
/* SMRDATA is 80 bytes long */
/* here there's a delay of 100 */
SMRDATA1:
.word PIOC_ASR
.word PIOC_ASR_VAL
.word PIOC_BSR
.word PIOC_BSR_VAL
.word PIOC_PDR
.word PIOC_PDR_VAL
.word EBI_CSA
.word EBI_CSA_VAL
.word SDRC_CR
.word SDRC_CR_VAL
.word SDRC_MR
.word SDRC_MR_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRC_MR
.word SDRC_MR_VAL1
.word SDRAM
.word SDRAM_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRC_MR
.word SDRC_MR_VAL2
.word SDRAM1
.word SDRAM_VAL
.word SDRC_TR
.word SDRC_TR_VAL
.word SDRAM
.word SDRAM_VAL
.word SDRC_MR
.word SDRC_MR_VAL3
.word SDRAM
.word SDRAM_VAL
/* SMRDATA1 is 176 bytes long */
#endif /* CONFIG_BOOTBINFUNC */

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS := at91rm9200dk.o at45.o dm9161.o flash.o
OBJS := cmc_pu2.o at45.o dm9161.o flash.o
SOBJS := memsetup.o
$(LIB): $(OBJS) $(SOBJS)

View File

@@ -1,118 +0,0 @@
/*
* (C) Copyright 2002
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
* Marius Groeger <mgroeger@sysgo.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 <asm/arch/AT91RM9200.h>
/* ------------------------------------------------------------------------- */
/*
* Miscelaneous platform dependent initialisations
*/
int board_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
/* Enable Ctrlc */
console_init_f ();
/* Correct IRDA resistor problem */
/* Set PA23_TXD in Output */
(AT91PS_PIO) AT91C_BASE_PIOA->PIO_OER = AT91C_PA23_TXD2;
/* memory and cpu-speed are setup before relocation */
/* so we do _nothing_ here */
/* arch number of AT91RM9200DK-Board */
gd->bd->bi_arch_number = 251;
/* adress of boot parameters */
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
return 0;
}
int dram_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
gd->bd->bi_dram[0].start = PHYS_SDRAM;
gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
return 0;
}
/*
* Disk On Chip (NAND) Millenium initialization.
* The NAND lives in the CS2* space
*/
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
extern ulong nand_probe (ulong physadr);
#define AT91_SMARTMEDIA_BASE 0x40000000 /* physical address to access memory on NCS3 */
void nand_init (void)
{
/* Setup Smart Media, fitst enable the address range of CS3 */
*AT91C_EBI_CSA |= AT91C_EBI_CS3A_SMC_SmartMedia;
/* set the bus interface characteristics based on
tDS Data Set up Time 30 - ns
tDH Data Hold Time 20 - ns
tALS ALE Set up Time 20 - ns
16ns at 60 MHz ~= 3 */
/*memory mapping structures */
#define SM_ID_RWH (5 << 28)
#define SM_RWH (1 << 28)
#define SM_RWS (0 << 24)
#define SM_TDF (1 << 8)
#define SM_NWS (3)
AT91C_BASE_SMC2->SMC2_CSR[3] = (SM_RWH | SM_RWS |
AT91C_SMC2_ACSS_STANDARD | AT91C_SMC2_DBW_8 |
SM_TDF | AT91C_SMC2_WSEN | SM_NWS);
/* enable the SMOE line PC0=SMCE, A21=CLE, A22=ALE */
*AT91C_PIOC_ASR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |
AT91C_PC3_BFBAA_SMWE;
*AT91C_PIOC_PDR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |
AT91C_PC3_BFBAA_SMWE;
/* Configure PC2 as input (signal READY of the SmartMedia) */
*AT91C_PIOC_PER = AT91C_PC2_BFAVD; /* enable direct output enable */
*AT91C_PIOC_ODR = AT91C_PC2_BFAVD; /* disable output */
/* Configure PB1 as input (signal Card Detect of the SmartMedia) */
*AT91C_PIOB_PER = AT91C_PIO_PB1; /* enable direct output enable */
*AT91C_PIOB_ODR = AT91C_PIO_PB1; /* disable output */
/* PIOB and PIOC clock enabling */
*AT91C_PMC_PCER = 1 << AT91C_ID_PIOB;
*AT91C_PMC_PCER = 1 << AT91C_ID_PIOC;
if (*AT91C_PIOB_PDSR & AT91C_PIO_PB1)
printf (" No SmartMedia card inserted\n");
#ifdef DEBUG
printf (" SmartMedia card inserted\n");
printf ("Probing at 0x%.8x\n", AT91_SMARTMEDIA_BASE);
#endif
printf ("%4lu MB\n", nand_probe(AT91_SMARTMEDIA_BASE) >> 20);
}
#endif

67
board/cmc_pu2/cmc_pu2.c Normal file
View File

@@ -0,0 +1,67 @@
/*
* (C) Copyright 2002
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
* Marius Groeger <mgroeger@sysgo.de>
*
* Modified for CMC_PU2 (removed Smart Media support) by Gary Jennejohn
* (2004) garyj@denx.de
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <asm/mach-types.h>
#include <asm/arch/AT91RM9200.h>
/* ------------------------------------------------------------------------- */
/*
* Miscelaneous platform dependent initialisations
*/
int board_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
/* Enable Ctrlc */
console_init_f ();
/* Correct IRDA resistor problem */
/* Set PA23_TXD in Output */
(AT91PS_PIO) AT91C_BASE_PIOA->PIO_OER = AT91C_PA23_TXD2;
/* memory and cpu-speed are setup before relocation */
/* so we do _nothing_ here */
/* arch number of CMC_PU2-Board */
/* gd->bd->bi_arch_number = MACH_TYPE_CMC_PU2; */
gd->bd->bi_arch_number = 251;
/* adress of boot parameters */
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
return 0;
}
int dram_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
gd->bd->bi_dram[0].start = PHYS_SDRAM;
gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
return 0;
}

View File

@@ -1 +1,3 @@
TEXT_BASE = 0x21f00000
TEXT_BASE = 0x20F00000
## For testing: load at 0x20100000 and "go" at 0x201000A4
#TEXT_BASE = 0x20100000

View File

@@ -1,11 +1,12 @@
/*
* (C) Copyright 2002
* Lineo, Inc. <www.lineo.com>
* Bernhard Kuhn <bkuhn@lineo.com>
* (C) Copyright 2003-2004
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* (C) Copyright 2002
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
* Alex Zuepke <azu@sysgo.de>
* (C) Copyright 2004
* Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de
*
* Modified for the CMC PU2 by (C) Copyright 2004 Gary Jennejohn
* garyj@denx.de
*
* See file CREDITS for list of people who contributed to this
* project.
@@ -28,444 +29,352 @@
#include <common.h>
ulong myflush(void);
#ifndef CFG_ENV_ADDR
#define CFG_ENV_ADDR (CFG_FLASH_BASE + CFG_ENV_OFFSET)
#endif
flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
/* Flash Organization Structure */
typedef struct OrgDef
{
unsigned int sector_number;
unsigned int sector_size;
} OrgDef;
/* Flash Organizations */
OrgDef OrgAT49BV16x4[] =
{
{ 8, 8*1024 }, /* 8 * 8 kBytes sectors */
{ 2, 32*1024 }, /* 2 * 32 kBytes sectors */
{ 30, 64*1024 }, /* 30 * 64 kBytes sectors */
};
OrgDef OrgAT49BV16x4A[] =
{
{ 8, 8*1024 }, /* 8 * 8 kBytes sectors */
{ 31, 64*1024 }, /* 31 * 64 kBytes sectors */
};
OrgDef OrgAT49BV6416[] =
{
{ 8, 8*1024 }, /* 8 * 8 kBytes sectors */
{ 127, 64*1024 }, /* 127 * 64 kBytes sectors */
};
flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
/* AT49BV1614A Codes */
#define FLASH_CODE1 0xAA
#define FLASH_CODE2 0x55
#define ID_IN_CODE 0x90
#define ID_OUT_CODE 0xF0
#define CMD_READ_ARRAY 0x00F0
#define CMD_UNLOCK1 0x00AA
#define CMD_UNLOCK2 0x0055
#define CMD_ERASE_SETUP 0x0080
#define CMD_ERASE_CONFIRM 0x0030
#define CMD_PROGRAM 0x00A0
#define CMD_UNLOCK_BYPASS 0x0020
#define CMD_SECTOR_UNLOCK 0x0070
#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x00005555<<1)))
#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AAA<<1)))
#define BIT_ERASE_DONE 0x0080
#define BIT_RDY_MASK 0x0080
#define BIT_PROGRAM_ERROR 0x0020
#define BIT_TIMEOUT 0x80000000 /* our flag */
#define READY 1
#define ERR 2
#define TMO 4
#define FLASH_CYCLE1 0x0555
#define FLASH_CYCLE2 0x02AA
/*-----------------------------------------------------------------------
* Functions
*/
void flash_identification (flash_info_t * info)
static ulong flash_get_size(vu_short *addr, flash_info_t *info);
static void flash_reset(flash_info_t *info);
static int write_word_amd(flash_info_t *info, vu_short *dest, ushort data);
static flash_info_t *flash_get_info(ulong base);
/*-----------------------------------------------------------------------
* flash_init()
*
* sets up flash_info and returns size of FLASH (bytes)
*/
unsigned long flash_init (void)
{
volatile u16 manuf_code, device_code, add_device_code;
unsigned long size = 0;
ulong flashbase = CFG_FLASH_BASE;
MEM_FLASH_ADDR1 = FLASH_CODE1;
MEM_FLASH_ADDR2 = FLASH_CODE2;
MEM_FLASH_ADDR1 = ID_IN_CODE;
/* Init: no FLASHes known */
memset(&flash_info[0], 0, sizeof(flash_info_t));
manuf_code = *(volatile u16 *) CFG_FLASH_BASE;
device_code = *(volatile u16 *) (CFG_FLASH_BASE + 2);
add_device_code = *(volatile u16 *) (CFG_FLASH_BASE + (3 << 1));
flash_info[0].size = flash_get_size((vu_short *)flashbase, &flash_info[0]);
MEM_FLASH_ADDR1 = FLASH_CODE1;
MEM_FLASH_ADDR2 = FLASH_CODE2;
MEM_FLASH_ADDR1 = ID_OUT_CODE;
size = flash_info[0].size;
/* Vendor type */
info->flash_id = ATM_MANUFACT & FLASH_VENDMASK;
printf ("Atmel: ");
#if CFG_MONITOR_BASE >= CFG_FLASH_BASE
/* monitor protection ON by default */
flash_protect(FLAG_PROTECT_SET,
CFG_MONITOR_BASE,
CFG_MONITOR_BASE+monitor_flash_len-1,
flash_get_info(CFG_MONITOR_BASE));
#endif
if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV1614 & FLASH_TYPEMASK)) {
#ifdef CFG_ENV_IS_IN_FLASH
/* ENV protection ON by default */
flash_protect(FLAG_PROTECT_SET,
CFG_ENV_ADDR,
CFG_ENV_ADDR+CFG_ENV_SIZE-1,
flash_get_info(CFG_ENV_ADDR));
#endif
if ((add_device_code & FLASH_TYPEMASK) ==
(ATM_ID_BV1614A & FLASH_TYPEMASK)) {
info->flash_id |= ATM_ID_BV1614A & FLASH_TYPEMASK;
printf ("AT49BV1614A (16Mbit)\n");
} else { /* AT49BV1614 Flash */
info->flash_id |= ATM_ID_BV1614 & FLASH_TYPEMASK;
printf ("AT49BV1614 (16Mbit)\n");
}
} else if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV6416 & FLASH_TYPEMASK)) {
info->flash_id |= ATM_ID_BV6416 & FLASH_TYPEMASK;
printf ("AT49BV6416 (64Mbit)\n");
}
}
ushort flash_number_sector(OrgDef *pOrgDef, unsigned int nb_blocks)
{
int i, nb_sectors = 0;
for (i=0; i<nb_blocks; i++){
nb_sectors += pOrgDef[i].sector_number;
}
return nb_sectors;
}
void flash_unlock_sector(flash_info_t * info, unsigned int sector)
{
volatile u16 *addr = (volatile u16 *) (info->start[sector]);
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
*addr = CMD_SECTOR_UNLOCK;
}
ulong flash_init (void)
{
int i, j, k;
unsigned int flash_nb_blocks, sector;
unsigned int start_address;
OrgDef *pOrgDef;
ulong size = 0;
for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
ulong flashbase = 0;
flash_identification (&flash_info[i]);
if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
(ATM_ID_BV1614 & FLASH_TYPEMASK)) {
pOrgDef = OrgAT49BV16x4;
flash_nb_blocks = sizeof (OrgAT49BV16x4) / sizeof (OrgDef);
} else if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
(ATM_ID_BV1614A & FLASH_TYPEMASK)){ /* AT49BV1614A Flash */
pOrgDef = OrgAT49BV16x4A;
flash_nb_blocks = sizeof (OrgAT49BV16x4A) / sizeof (OrgDef);
} else if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
(ATM_ID_BV6416 & FLASH_TYPEMASK)){ /* AT49BV6416 Flash */
pOrgDef = OrgAT49BV6416;
flash_nb_blocks = sizeof (OrgAT49BV6416) / sizeof (OrgDef);
} else {
flash_nb_blocks = 0;
pOrgDef = OrgAT49BV16x4;
}
flash_info[i].sector_count = flash_number_sector(pOrgDef, flash_nb_blocks);
memset (flash_info[i].protect, 0, flash_info[i].sector_count);
if (i == 0)
flashbase = PHYS_FLASH_1;
else
panic ("configured too many flash banks!\n");
sector = 0;
start_address = flashbase;
flash_info[i].size = 0;
for (j = 0; j < flash_nb_blocks; j++) {
for (k = 0; k < pOrgDef[j].sector_number; k++) {
flash_info[i].start[sector++] = start_address;
start_address += pOrgDef[j].sector_size;
flash_info[i].size += pOrgDef[j].sector_size;
}
}
size += flash_info[i].size;
if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
(ATM_ID_BV6416 & FLASH_TYPEMASK)){ /* AT49BV6416 Flash */
/* Unlock all sectors at reset */
for (j=0; j<flash_info[i].sector_count; j++){
flash_unlock_sector(&flash_info[i], j);
}
}
}
/* Protect binary boot image */
flash_protect (FLAG_PROTECT_SET,
CFG_FLASH_BASE,
CFG_FLASH_BASE + CFG_BOOT_SIZE - 1, &flash_info[0]);
/* Protect environment variables */
flash_protect (FLAG_PROTECT_SET,
CFG_ENV_ADDR,
CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);
/* Protect U-Boot gzipped image */
flash_protect (FLAG_PROTECT_SET,
CFG_U_BOOT_BASE,
CFG_U_BOOT_BASE + CFG_U_BOOT_SIZE - 1, &flash_info[0]);
return size;
return size ? size : 1;
}
/*-----------------------------------------------------------------------
*/
void flash_print_info (flash_info_t * info)
static void flash_reset(flash_info_t *info)
{
vu_short *base = (vu_short *)(info->start[0]);
/* Put FLASH back in read mode */
if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL)
*base = 0x00FF; /* Intel Read Mode */
else if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_AMD)
*base = 0x00F0; /* AMD Read Mode */
}
/*-----------------------------------------------------------------------
*/
static flash_info_t *flash_get_info(ulong base)
{
int i;
flash_info_t * info;
info = NULL;
for (i = 0; i < CFG_MAX_FLASH_BANKS; i ++) {
info = & flash_info[i];
if (info->size && info->start[0] <= base &&
base <= info->start[0] + info->size - 1)
break;
}
return i == CFG_MAX_FLASH_BANKS ? 0 : info;
}
/*-----------------------------------------------------------------------
*/
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 (ATM_MANUFACT & FLASH_VENDMASK):
printf ("Atmel: ");
break;
default:
printf ("Unknown Vendor ");
break;
case FLASH_MAN_AMD: printf ("AMD "); break;
case FLASH_MAN_BM: printf ("BRIGHT MICRO "); break;
case FLASH_MAN_FUJ: printf ("FUJITSU "); break;
case FLASH_MAN_SST: printf ("SST "); break;
case FLASH_MAN_STM: printf ("STM "); break;
case FLASH_MAN_INTEL: printf ("INTEL "); break;
default: printf ("Unknown Vendor "); break;
}
switch (info->flash_id & FLASH_TYPEMASK) {
case (ATM_ID_BV1614 & FLASH_TYPEMASK):
printf ("AT49BV1614 (16Mbit)\n");
break;
case (ATM_ID_BV1614A & FLASH_TYPEMASK):
printf ("AT49BV1614A (16Mbit)\n");
break;
case (ATM_ID_BV6416 & FLASH_TYPEMASK):
printf ("AT49BV6416 (64Mbit)\n");
case FLASH_S29GL064M:
printf ("S29GL064M-R6 (64Mbit, uniform sector size)\n");
break;
default:
printf ("Unknown Chip Type\n");
goto Done;
break;
}
printf (" Size: %ld MB in %d Sectors\n",
info->size >> 20, info->sector_count);
info->size >> 20,
info->sector_count);
printf (" Sector Start Addresses:");
for (i = 0; i < info->sector_count; i++) {
for (i=0; i<info->sector_count; ++i) {
if ((i % 5) == 0) {
printf ("\n ");
}
printf (" %08lX%s", info->start[i],
printf (" %08lX%s",
info->start[i],
info->protect[i] ? " (RO)" : " ");
}
printf ("\n");
Done: ;
return;
}
/*-----------------------------------------------------------------------
*/
int flash_erase (flash_info_t * info, int s_first, int s_last)
/*
* The following code cannot be run from FLASH!
*/
ulong flash_get_size (vu_short *addr, flash_info_t *info)
{
ulong result;
int iflag, cflag, prot, sect;
int rc = ERR_OK;
int chip1;
int i;
ushort value;
ulong base = (ulong)addr;
/* first look for protection bits */
/* Write auto select command sequence */
addr[FLASH_CYCLE1] = 0x00AA; /* for AMD, Intel ignores this */
addr[FLASH_CYCLE2] = 0x0055; /* for AMD, Intel ignores this */
addr[FLASH_CYCLE1] = 0x0090; /* selects Intel or AMD */
if (info->flash_id == FLASH_UNKNOWN)
return ERR_UNKNOWN_FLASH_TYPE;
/* read Manufacturer ID */
udelay(100);
value = addr[0];
debug ("Manufacturer ID: %04X\n", value);
if ((s_first < 0) || (s_first > s_last)) {
return ERR_INVAL;
switch (value) {
case (AMD_MANUFACT & 0xFFFF):
debug ("Manufacturer: AMD (Spansion)\n");
info->flash_id = FLASH_MAN_AMD;
break;
case (INTEL_MANUFACT & 0xFFFF):
debug ("Manufacturer: Intel (not supported yet)\n");
info->flash_id = FLASH_MAN_INTEL;
break;
default:
printf ("Unknown Manufacturer ID: %04X\n", value);
info->flash_id = FLASH_UNKNOWN;
info->sector_count = 0;
info->size = 0;
goto out;
}
if ((info->flash_id & FLASH_VENDMASK) !=
(ATM_MANUFACT & FLASH_VENDMASK)) {
return ERR_UNKNOWN_FLASH_VENDOR;
value = addr[1];
debug ("Device ID: %04X\n", value);
switch (addr[1]) {
case (AMD_ID_MIRROR & 0xFFFF):
debug ("Mirror Bit flash: addr[14] = %08X addr[15] = %08X\n",
addr[14], addr[15]);
switch(addr[14]) {
case (AMD_ID_GL064M_2 & 0xFFFF):
if (addr[15] != (AMD_ID_GL064M_3 & 0xffff)) {
printf ("Chip: S29GLxxxM -> unknown\n");
info->flash_id = FLASH_UNKNOWN;
info->sector_count = 0;
info->size = 0;
} else {
debug ("Chip: S29GL064M-R6\n");
info->flash_id += FLASH_S29GL064M;
info->sector_count = 128;
info->size = 0x00800000;
for (i = 0; i < info->sector_count; i++) {
info->start[i] = base;
base += 0x10000;
}
}
break; /* => 16 MB */
default:
printf ("Chip: *** unknown ***\n");
info->flash_id = FLASH_UNKNOWN;
info->sector_count = 0;
info->size = 0;
break;
}
break;
default:
printf ("Unknown Device ID: %04X\n", value);
info->flash_id = FLASH_UNKNOWN;
info->sector_count = 0;
info->size = 0;
break;
}
out:
/* Put FLASH back in read mode */
flash_reset(info);
return (info->size);
}
/*-----------------------------------------------------------------------
*/
int flash_erase (flash_info_t *info, int s_first, int s_last)
{
vu_short *addr = (vu_short *)(info->start[0]);
int flag, prot, sect, ssect, l_sect;
ulong start, now, last;
debug ("flash_erase: first: %d last: %d\n", s_first, s_last);
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_UNKNOWN) ||
(info->flash_id > FLASH_AMD_COMP)) {
printf ("Can't erase unknown flash type %08lx - aborted\n",
info->flash_id);
return 1;
}
prot = 0;
for (sect = s_first; sect <= s_last; ++sect) {
for (sect=s_first; sect<=s_last; ++sect) {
if (info->protect[sect]) {
prot++;
}
}
if (prot)
return ERR_PROTECTED;
/*
* Disable interrupts which might cause a timeout
* here. Remember that our exception vectors are
* at address 0 in the flash, and we don't want a
* (ticker) exception to happen while the flash
* chip is in programming mode.
*/
cflag = icache_status ();
icache_disable ();
iflag = disable_interrupts ();
/* Start erase on unprotected sectors */
for (sect = s_first; sect <= s_last && !ctrlc (); sect++) {
printf ("Erasing sector %2d ... ", sect);
/* arm simple, non interrupt dependent timer */
reset_timer_masked ();
if (info->protect[sect] == 0) { /* not protected */
volatile u16 *addr = (volatile u16 *) (info->start[sect]);
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
MEM_FLASH_ADDR2 = CMD_UNLOCK2;
MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
MEM_FLASH_ADDR2 = CMD_UNLOCK2;
*addr = CMD_ERASE_CONFIRM;
/* wait until flash is ready */
chip1 = 0;
do {
result = *addr;
/* check timeout */
if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) {
MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
chip1 = TMO;
break;
}
if (!chip1 && (result & 0xFFFF) & BIT_ERASE_DONE)
chip1 = READY;
} while (!chip1);
MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
if (chip1 == ERR) {
rc = ERR_PROG_ERROR;
goto outahere;
}
if (chip1 == TMO) {
rc = ERR_TIMOUT;
goto outahere;
}
printf ("ok.\n");
} else { /* it was protected */
printf ("protected!\n");
}
if (prot) {
printf ("- Warning: %d protected sectors will not be erased!\n",
prot);
} else {
printf ("\n");
}
if (ctrlc ())
printf ("User Interrupt!\n");
outahere:
/* allow flash to settle - wait 10 ms */
udelay_masked (10000);
if (iflag)
enable_interrupts ();
if (cflag)
icache_enable ();
return rc;
}
/*-----------------------------------------------------------------------
* Copy memory to flash
*/
volatile static int write_word (flash_info_t * info, ulong dest,
ulong data)
{
volatile u16 *addr = (volatile u16 *) dest;
ulong result;
int rc = ERR_OK;
int cflag, iflag;
int chip1;
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts();
/*
* Check if Flash is (sufficiently) erased
* Start erase on unprotected sectors.
* Since the flash can erase multiple sectors with one command
* we take advantage of that by doing the erase in chunks of
* 3 sectors.
*/
result = *addr;
if ((result & data) != data)
return ERR_NOT_ERASED;
for (sect = s_first; sect <= s_last; ) {
l_sect = -1;
addr[FLASH_CYCLE1] = 0x00AA;
addr[FLASH_CYCLE2] = 0x0055;
addr[FLASH_CYCLE1] = 0x0080;
addr[FLASH_CYCLE1] = 0x00AA;
addr[FLASH_CYCLE2] = 0x0055;
/*
* Disable interrupts which might cause a timeout
* here. Remember that our exception vectors are
* at address 0 in the flash, and we don't want a
* (ticker) exception to happen while the flash
* chip is in programming mode.
*/
cflag = icache_status ();
icache_disable ();
iflag = disable_interrupts ();
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
MEM_FLASH_ADDR2 = CMD_UNLOCK2;
MEM_FLASH_ADDR1 = CMD_PROGRAM;
*addr = data;
/* arm simple, non interrupt dependent timer */
reset_timer_masked ();
/* wait until flash is ready */
chip1 = 0;
do {
result = *addr;
/* check timeout */
if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) {
chip1 = ERR | TMO;
break;
/* do the erase in chunks of at most 3 sectors */
for (ssect = 0; ssect < 3; ssect++) {
if ((sect + ssect) > s_last)
break;
if (info->protect[sect + ssect] == 0) { /* not protected */
addr = (vu_short *)(info->start[sect + ssect]);
addr[0] = 0x0030;
l_sect = sect + ssect;
}
}
if (!chip1 && ((result & 0x80) == (data & 0x80)))
chip1 = READY;
/* wait at least 80us - let's wait 1 ms */
udelay (1000);
} while (!chip1);
/*
* We wait for the last triggered sector
*/
if (l_sect < 0)
goto DONE;
*addr = CMD_READ_ARRAY;
reset_timer_masked ();
last = start;
addr = (vu_short *)(info->start[l_sect]);
while ((addr[0] & 0x0080) != 0x0080) {
if ((now = get_timer_masked ()) > CFG_FLASH_ERASE_TOUT) {
printf ("Timeout\n");
return 1;
}
/* show that we're waiting */
if ((now - last) > 1000) { /* every second */
putc ('.');
last = now;
}
}
addr = (vu_short *)info->start[0];
addr[0] = 0x00F0; /* reset bank */
sect += ssect;
}
if (chip1 == ERR || *addr != data)
rc = ERR_PROG_ERROR;
/* re-enable interrupts if necessary */
if (flag)
enable_interrupts();
if (iflag)
enable_interrupts ();
DONE:
/* reset to read mode */
addr = (vu_short *)info->start[0];
addr[0] = 0x00F0; /* reset bank */
if (cflag)
icache_enable ();
return rc;
printf (" done\n");
return 0;
}
/*-----------------------------------------------------------------------
* Copy memory to flash.
* Copy memory to flash, returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
*/
int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
{
ulong wp, data;
int rc;
@@ -483,8 +392,9 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
wp = addr;
while (cnt >= 2) {
data = *((volatile u16 *) src);
if ((rc = write_word (info, wp, data)) != 0) {
data = *((vu_short *)src);
if ((rc = write_word_amd(info, (vu_short *)wp, data)) != 0) {
printf ("write_buff 1: write_word_amd() rc=%d\n", rc);
return (rc);
}
src += 2;
@@ -492,16 +402,68 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
cnt -= 2;
}
if (cnt == 0) {
return (ERR_OK);
}
if (cnt == 1) {
data = (*((volatile u8 *) src)) | (*((volatile u8 *) (wp + 1)) <<
8);
if ((rc = write_word (info, wp, data)) != 0) {
data = (*((volatile u8 *) src)) | (*((volatile u8 *) (wp + 1)) << 8);
if ((rc = write_word_amd(info, (vu_short *)wp, data)) != 0) {
printf ("write_buff 1: write_word_amd() rc=%d\n", rc);
return (rc);
}
src += 1;
wp += 1;
cnt -= 1;
};
}
return ERR_OK;
}
/*-----------------------------------------------------------------------
* Write a word to Flash for AMD FLASH
* A word is 16 or 32 bits, whichever the bus width of the flash bank
* (not an individual chip) is.
*
* returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
*/
static int write_word_amd (flash_info_t *info, vu_short *dest, ushort data)
{
ulong start;
int flag;
vu_short *base; /* first address in flash bank */
/* Check if Flash is (sufficiently) erased */
if ((*dest & data) != data) {
return (2);
}
base = (vu_short *)(info->start[0]);
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts();
base[FLASH_CYCLE1] = 0x00AA; /* unlock */
base[FLASH_CYCLE2] = 0x0055; /* unlock */
base[FLASH_CYCLE1] = 0x00A0; /* selects program mode */
*dest = data; /* start programming the data */
/* re-enable interrupts if necessary */
if (flag)
enable_interrupts();
reset_timer_masked ();
/* data polling for D7 */
while ((*dest & 0x0080) != (data & 0x0080)) {
if (get_timer_masked () > CFG_FLASH_WRITE_TOUT) {
*dest = 0x00F0; /* reset bank */
return (1);
}
}
return (0);
}

View File

@@ -6,7 +6,7 @@
*
* Modified for the at91rm9200dk board by
* (C) Copyright 2004
* Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
*
* See file CREDITS for list of people who contributed to this
* project.
@@ -35,7 +35,7 @@
* some parameters for the board
*
* This is based on rm9200dk.cfg for the BDI2000 from ABATRON which in
* turn is based on the boot.bin code from ATMMEL
* turn is based on the boot.bin code from ATMEL
*
*/
@@ -53,27 +53,27 @@
#define EBI_CFGR 0xFFFFFF64
#define EBI_CFGR_VAL 0x00000000
#define SMC2_CSR 0xFFFFFF70
#define SMC2_CSR_VAL 0x00003284 /* 16bit, 2 TDF, 4 WS */
#define SMC2_CSR_VAL 0x100032ad /* 16bit, 2 TDF, 4 WS */
/* clocks */
#define PLLAR 0xFFFFFC28
#define PLLAR_VAL 0x20263E04 /* 179.712000 MHz for PCK */
#define PLLAR_VAL 0x202CBE04 /* 207.360 MHz for PCK */
#define PLLBR 0xFFFFFC2C
#define PLLBR_VAL 0x10483E0E /* 48.054857 MHz (divider by 2 for USB) */
#define MCKR 0xFFFFFC30
#define MCKR_VAL 0x00000202 /* PCK/3 = MCK Master Clock = 59.904000MHz from PLLA */
#define MCKR_VAL 0x00000202 /* PCK/3 = MCK Master Clock = 69.120MHz from PLLA */
/* sdram */
#define PIOC_ASR 0xFFFFF870
#define PIOC_ASR_VAL 0xFFFF0000 /* Configure PIOC as peripheral (D16/D31) */
#define PIOC_BSR 0xFFFFF804
#define PIOC_BSR 0xFFFFF874
#define PIOC_BSR_VAL 0x00000000
#define PIOC_PDR 0xFFFFF804
#define PIOC_PDR_VAL 0xFFFF0000
#define EBI_CSA 0xFFFFFF60
#define EBI_CSA_VAL 0x00000002 /* CS1=SDRAM */
#define SDRC_CR 0xFFFFFF98
#define SDRC_CR_VAL 0x2188c155
#define SDRC_CR_VAL 0x3399c1d4 /* set up the SDRAM */
#define SDRAM 0x20000000 /* address of the SDRAM */
#define SDRAM1 0x20000080 /* address of the SDRAM */
#define SDRAM_VAL 0x00000000 /* value written to SDRAM */
@@ -86,15 +86,20 @@
#define SDRC_TR_VAL 0x000002E0 /* Write refresh rate */
_TEXT_BASE:
_MTEXT_BASE:
#undef START_FROM_MEM
#ifdef START_FROM_MEM
.word TEXT_BASE-PHYS_FLASH_1
#else
.word TEXT_BASE
#endif
.globl memsetup
memsetup:
.globl lowlevelinit
lowlevelinit:
/* memory control configuration */
/* this isn't very elegant, but what the heck */
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
ldr r1, _MTEXT_BASE
sub r0, r0, r1
add r2, r0, #80
0:
@@ -106,12 +111,12 @@ memsetup:
cmp r2, r0
bne 0b
/* delay - this is all done by guess */
ldr r0, =0x00001000
ldr r0, =0x00010000
1:
subs r0, r0, #1
bhi 1b
ldr r0, =SMRDATA1
ldr r1, _TEXT_BASE
ldr r1, _MTEXT_BASE
sub r0, r0, r1
add r2, r0, #176
2:

View File

@@ -26,5 +26,4 @@
#
#TEXT_BASE = 0xFFF80000
#TEXT_BASE = 0xFFFC0000
TEXT_BASE = 0xFFFE0000
TEXT_BASE = 0xFFFC0000

View File

@@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o ../common/pci.o
OBJS = $(BOARD).o flash.o ../common/misc.o ../common/pci.o
$(LIB): $(OBJS)
$(AR) crv $@ $(OBJS)

46
board/esd/apc405/Makefile Normal file
View File

@@ -0,0 +1,46 @@
#
# (C) Copyright 2000, 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
#
include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o strataflash.o ../common/misc.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $^
clean:
rm -f $(SOBJS) $(OBJS)
distclean: clean
rm -f $(LIB) core *.bak .depend
#########################################################################
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
sinclude .depend
#########################################################################

315
board/esd/apc405/apc405.c Normal file
View File

@@ -0,0 +1,315 @@
/*
* (C) Copyright 2001-2003
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <asm/processor.h>
#include <command.h>
#include <malloc.h>
/* ------------------------------------------------------------------------- */
#if 0
#define FPGA_DEBUG
#endif
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
extern void lxt971_no_sleep(void);
/* fpga configuration data - gzip compressed and generated by bin2c */
const unsigned char fpgadata[] =
{
#include "fpgadata.c"
};
/*
* include common fpga code (for esd boards)
*/
#include "../common/fpga.c"
/* Prototypes */
int gunzip(void *, int, unsigned char *, unsigned long *);
#ifdef CONFIG_LCD_USED
/* logo bitmap data - gzip compressed and generated by bin2c */
unsigned char logo_bmp[] =
{
#include CFG_LCD_LOGO_NAME
};
/*
* include common lcd code (for esd boards)
*/
#include "../common/lcd.c"
#include "../common/"CFG_LCD_HEADER_NAME
#endif /* CONFIG_LCD_USED */
int board_early_init_f (void)
{
/*
* First pull fpga-prg pin low, to disable fpga logic (on version 2 board)
*/
out32(GPIO0_ODR, 0x00000000); /* no open drain pins */
out32(GPIO0_TCR, CFG_FPGA_PRG); /* setup for output */
out32(GPIO0_OR, CFG_FPGA_PRG); /* set output pins to high */
out32(GPIO0_OR, 0); /* pull prg low */
/*
* IRQ 0-15 405GP internally generated; active high; level sensitive
* IRQ 16 405GP internally generated; active low; level sensitive
* IRQ 17-24 RESERVED
* IRQ 25 (EXT IRQ 0) CAN0; active low; level sensitive
* IRQ 26 (EXT IRQ 1) SER0 ; active low; level sensitive
* IRQ 27 (EXT IRQ 2) SER1; active low; level sensitive
* IRQ 28 (EXT IRQ 3) FPGA 0; active low; level sensitive
* IRQ 29 (EXT IRQ 4) FPGA 1; active low; level sensitive
* IRQ 30 (EXT IRQ 5) PCI INTA; active low; level sensitive
* IRQ 31 (EXT IRQ 6) COMPACT FLASH; active high; level sensitive
*/
mtdcr(uicsr, 0xFFFFFFFF); /* clear all ints */
mtdcr(uicer, 0x00000000); /* disable all ints */
mtdcr(uiccr, 0x00000000); /* set all to be non-critical*/
mtdcr(uicpr, 0xFFFFFF81); /* set int polarities */
mtdcr(uictr, 0x10000000); /* set int trigger levels */
mtdcr(uicvcr, 0x00000001); /* set vect base=0,INT0 highest priority*/
mtdcr(uicsr, 0xFFFFFFFF); /* clear all ints */
/*
* EBC Configuration Register: set ready timeout to 512 ebc-clks -> ca. 15 us
*/
#if 1 /* test-only */
mtebc (epcr, 0xa8400000); /* ebc always driven */
#else
mtebc (epcr, 0x28400000); /* ebc in high-z */
#endif
return 0;
}
/* ------------------------------------------------------------------------- */
int misc_init_f (void)
{
return 0; /* dummy implementation */
}
int misc_init_r (void)
{
volatile unsigned short *fpga_mode =
(unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL);
volatile unsigned char *duart0_mcr =
(unsigned char *)((ulong)DUART0_BA + 4);
volatile unsigned char *duart1_mcr =
(unsigned char *)((ulong)DUART1_BA + 4);
volatile unsigned short *fuji_lcdbl_pwm =
(unsigned short *)((ulong)0xf0100200 + 0xa0);
unsigned char *dst;
ulong len = sizeof(fpgadata);
int status;
int index;
int i;
unsigned long cntrl0Reg;
/*
* Setup GPIO pins (CS6+CS7 as GPIO)
*/
cntrl0Reg = mfdcr(cntrl0);
mtdcr(cntrl0, cntrl0Reg | 0x00300000);
dst = malloc(CFG_FPGA_MAX_SIZE);
if (gunzip (dst, CFG_FPGA_MAX_SIZE, (uchar *)fpgadata, &len) != 0) {
printf ("GUNZIP ERROR - must RESET board to recover\n");
do_reset (NULL, 0, 0, NULL);
}
status = fpga_boot(dst, len);
if (status != 0) {
printf("\nFPGA: Booting failed ");
switch (status) {
case ERROR_FPGA_PRG_INIT_LOW:
printf("(Timeout: INIT not low after asserting PROGRAM*)\n ");
break;
case ERROR_FPGA_PRG_INIT_HIGH:
printf("(Timeout: INIT not high after deasserting PROGRAM*)\n ");
break;
case ERROR_FPGA_PRG_DONE:
printf("(Timeout: DONE not high after programming FPGA)\n ");
break;
}
/* display infos on fpgaimage */
index = 15;
for (i=0; i<4; i++) {
len = dst[index];
printf("FPGA: %s\n", &(dst[index+1]));
index += len+3;
}
putc ('\n');
/* delayed reboot */
for (i=20; i>0; i--) {
printf("Rebooting in %2d seconds \r",i);
for (index=0;index<1000;index++)
udelay(1000);
}
putc ('\n');
do_reset(NULL, 0, 0, NULL);
}
/* restore gpio/cs settings */
mtdcr(cntrl0, cntrl0Reg);
puts("FPGA: ");
/* display infos on fpgaimage */
index = 15;
for (i=0; i<4; i++) {
len = dst[index];
printf("%s ", &(dst[index+1]));
index += len+3;
}
putc ('\n');
free(dst);
/*
* Reset FPGA via FPGA_DATA pin
*/
SET_FPGA(FPGA_PRG | FPGA_CLK);
udelay(1000); /* wait 1ms */
SET_FPGA(FPGA_PRG | FPGA_CLK | FPGA_DATA);
udelay(1000); /* wait 1ms */
/*
* Enable power on PS/2 interface (with reset)
*/
*fpga_mode |= CFG_FPGA_CTRL_PS2_RESET;
for (i=0;i<100;i++)
udelay(1000);
udelay(1000);
*fpga_mode &= ~CFG_FPGA_CTRL_PS2_RESET;
/*
* Enable interrupts in exar duart mcr[3]
*/
*duart0_mcr = 0x08;
*duart1_mcr = 0x08;
/*
* Init lcd interface and display logo
*/
lcd_init((uchar *)CFG_LCD_BIG_REG, (uchar *)CFG_LCD_BIG_MEM,
regs_13806_640_480_16bpp,
sizeof(regs_13806_640_480_16bpp)/sizeof(regs_13806_640_480_16bpp[0]),
logo_bmp, sizeof(logo_bmp));
/*
* Enable microcontroller and setup backlight PWM controller
*/
*fpga_mode |= 0x001c;
*fuji_lcdbl_pwm = 0x00ff;
return (0);
}
/*
* Check Board Identity:
*/
int checkboard (void)
{
unsigned char str[64];
int i = getenv_r ("serial#", str, sizeof(str));
puts ("Board: ");
if (i == -1) {
puts ("### No HW ID - assuming APC405");
} else {
puts(str);
}
putc ('\n');
/*
* Disable sleep mode in LXT971
*/
lxt971_no_sleep();
return 0;
}
/* ------------------------------------------------------------------------- */
long int initdram (int board_type)
{
unsigned long val;
mtdcr(memcfga, mem_mb0cf);
val = mfdcr(memcfgd);
#if 0
printf("\nmb0cf=%x\n", val); /* test-only */
printf("strap=%x\n", mfdcr(strap)); /* test-only */
#endif
return (4*1024*1024 << ((val & 0x000e0000) >> 17));
}
/* ------------------------------------------------------------------------- */
int testdram (void)
{
/* TODO: XXX XXX XXX */
printf ("test: 16 MB - ok\n");
return (0);
}
/* ------------------------------------------------------------------------- */
#ifdef CONFIG_IDE_RESET
void ide_set_reset(int on)
{
volatile unsigned short *fpga_mode =
(unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL);
/*
* Assert or deassert CompactFlash Reset Pin
*/
if (on) { /* assert RESET */
*fpga_mode &= ~(CFG_FPGA_CTRL_CF_RESET);
} else { /* release RESET */
*fpga_mode |= CFG_FPGA_CTRL_CF_RESET;
}
}
#endif /* CONFIG_IDE_RESET */
/* ------------------------------------------------------------------------- */

View File

@@ -0,0 +1,28 @@
#
# (C) Copyright 2000, 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
#
#
# esd ABG405 boards
#
TEXT_BASE = 0xFFF80000

2295
board/esd/apc405/fpgadata.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,235 @@
0x1f,0x8b,0x08,0x08,0x85,0xd1,0x0f,0x40,0x00,0x03,0x61,0x62,0x67,0x5f,0x6c,0x6f,
0x67,0x6f,0x5f,0x36,0x34,0x30,0x5f,0x34,0x38,0x30,0x2e,0x62,0x6d,0x70,0x00,0xed,
0xd9,0xcb,0x91,0x25,0x3b,0x15,0x05,0xd0,0x02,0x03,0x08,0x86,0x98,0x80,0x05,0x18,
0xc0,0x1c,0x9f,0x30,0x05,0x53,0x18,0x60,0x08,0x9e,0x14,0x8f,0xe6,0x17,0x74,0xd5,
0xad,0xca,0x94,0xce,0x2f,0x33,0xd7,0x8a,0x7c,0x13,0x78,0x71,0xb4,0x25,0xdd,0xd6,
0x8e,0x86,0x3f,0xfe,0xe9,0x0f,0xbf,0xfd,0xcd,0xdb,0x3f,0xfd,0xe1,0x97,0x7f,0x7e,
0xff,0xcb,0x3f,0x7f,0xfe,0xf5,0xdb,0xdb,0xdf,0x7f,0xf5,0xf6,0xf6,0xab,0xb7,0xdf,
0xfd,0xf8,0xcf,0xdf,0x7e,0xf9,0xef,0xff,0xf6,0xcb,0xbf,0xf2,0xb7,0x7f,0xfd,0x6b,
0x3f,0xfc,0xf9,0x2f,0x7f,0xf9,0x2b,0x00,0x50,0xeb,0x0d,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x62,0xbc,0xbf,0xf8,0x00,0x80,0x35,0xaf,0xba,0x35,0xf0,
0x03,0x80,0x67,0x2a,0x28,0x59,0xed,0x0c,0x00,0x6f,0xdd,0xad,0xaa,0x94,0x01,0x78,
0x82,0xf6,0xc6,0xd4,0xc8,0x00,0x3c,0xca,0x25,0x4a,0x70,0x48,0x0c,0x00,0xd8,0x34,
0xad,0x61,0x5b,0x76,0x04,0x00,0x35,0xee,0x57,0xbb,0x9f,0xba,0x7a,0x7e,0x00,0x6e,
0xe3,0xf6,0x9d,0xfb,0xb5,0x5b,0x6e,0x0a,0x80,0xc9,0x1e,0xde,0xbc,0x1f,0x3d,0x64,
0x9b,0x00,0xb4,0x50,0xb8,0x07,0x3d,0x7c,0xfb,0x00,0x84,0xf0,0x57,0xdd,0x05,0x4e,
0x03,0x80,0x1d,0x9a,0x77,0x93,0x93,0x01,0xe0,0x2c,0xe5,0x1b,0xcb,0x11,0x01,0xf0,
0x35,0xb5,0x9b,0xca,0xa1,0x01,0xf0,0x13,0x7f,0xe7,0x2d,0xe6,0x00,0x01,0xd0,0xbc,
0x5d,0x1c,0x26,0xc0,0x63,0x29,0xdf,0x5e,0x4e,0x15,0xe0,0x81,0x34,0xef,0x10,0x4e,
0x18,0xe0,0x39,0x34,0xef,0x34,0x4e,0x1b,0xe0,0xde,0xfc,0x6f,0xce,0xf3,0x39,0x76,
0x80,0xfb,0x51,0xbe,0x57,0xe1,0xfc,0x01,0x6e,0x43,0xf9,0x5e,0x8b,0x5b,0x00,0xb8,
0x01,0xcd,0x0b,0x00,0xc5,0xfc,0xcd,0x17,0x00,0x8a,0x29,0x5f,0x00,0x28,0xa6,0x7c,
0x81,0x73,0xde,0x3f,0xe8,0x4e,0x04,0x97,0xa3,0x79,0x81,0xa3,0x3e,0xd6,0xee,0xa7,
0xba,0x63,0xc2,0x25,0x3c,0xa7,0x7f,0x43,0xfe,0x9a,0x7f,0xbf,0x63,0xb9,0xb3,0x83,
0x65,0xa1,0x3b,0x0e,0xda,0x39,0x4c,0xb7,0x00,0x1f,0xa4,0x16,0xcd,0xb4,0xca,0x1b,
0x15,0xe6,0xa2,0x09,0xaf,0x64,0xa1,0x2f,0x8e,0xbf,0xfc,0x6b,0xc3,0xdf,0x37,0x2a,
0x69,0x73,0xb9,0x96,0xc3,0xfc,0x6f,0x80,0xae,0xd8,0x30,0x55,0xf6,0x1b,0x5e,0xd9,
0x26,0x47,0xfe,0xc0,0x8e,0x0a,0x73,0xd1,0x84,0x57,0xb2,0xd3,0x17,0x49,0xc3,0xdf,
0xcb,0xfb,0xf7,0xe3,0xba,0x35,0xc7,0xf8,0xd3,0xd2,0x65,0x69,0xe1,0x0a,0x6e,0xd6,
0x77,0xd3,0xf2,0x74,0x5d,0x4a,0x76,0xc2,0x2b,0x59,0x2e,0x8b,0xbc,0xe1,0xef,0x7d,
0xfd,0xfb,0xbe,0x54,0x6a,0xf5,0x21,0x97,0xa3,0xc2,0x75,0xdc,0xac,0xef,0x0e,0xfe,
0x81,0x1d,0x15,0xa6,0xfd,0xd0,0x7e,0x5a,0xf7,0x6e,0x52,0x5f,0xfe,0xfd,0x66,0x59,
0x9e,0xb0,0x29,0xfb,0x00,0x8b,0x43,0xc2,0x05,0x15,0x54,0x4c,0x65,0x95,0x0c,0x8c,
0xd4,0x75,0x2f,0x6b,0x09,0x77,0x32,0xcf,0x95,0xf7,0xf2,0xef,0x37,0xcb,0xf2,0x84,
0x4d,0xd9,0x1b,0xac,0x0c,0x09,0x17,0x54,0x56,0x2e,0x95,0x6d,0x72,0x24,0xd5,0xa8,
0x30,0xa3,0x12,0x86,0x84,0x1f,0x27,0xef,0xf1,0xdf,0x9f,0xbc,0x36,0x21,0x4a,0xd2,
0x06,0xcb,0xe2,0xc1,0x65,0x95,0x35,0x4b,0x65,0x9b,0x1c,0x09,0x36,0x2a,0x4c,0x7b,
0xc8,0x6f,0x17,0xbd,0xbc,0xbc,0xc7,0x7f,0x7f,0xf2,0xda,0x84,0x40,0xe1,0xbb,0xab,
0xc9,0x06,0x57,0x56,0xd9,0x2c,0x95,0x7d,0x77,0x24,0xd8,0xa8,0x30,0xd3,0x42,0xc6,
0xee,0x62,0x84,0xbc,0xc7,0x7f,0x7f,0xf2,0xda,0x84,0x40,0xe1,0xbb,0xab,0xc9,0x06,
0x57,0x56,0x59,0x2b,0x95,0x55,0x72,0x30,0xde,0x9c,0x24,0xed,0x09,0xdf,0x8f,0xad,
0x7b,0x61,0x79,0x8f,0xff,0xfe,0xe4,0xb5,0x09,0xb1,0x62,0x77,0x57,0x10,0x0c,0x2e,
0xae,0xb2,0x56,0x2a,0xab,0xe4,0x60,0xbc,0x39,0x49,0xda,0x13,0xbe,0x1f,0x5e,0xf7,
0xc2,0x92,0x1e,0xff,0xfd,0x5a,0x59,0x9b,0x10,0x2b,0x70,0x6b,0xb1,0x02,0x2e,0x1e,
0x26,0x2a,0xee,0x94,0xca,0x36,0x39,0x92,0x70,0x54,0x98,0x69,0x09,0xc3,0xf7,0xd2,
0x2f,0xe9,0xf1,0xdf,0x1f,0xbb,0x30,0x21,0x5c,0xc8,0xbe,0x32,0x04,0x5c,0x3c,0x8c,
0x53,0x5f,0x28,0x95,0x6d,0x72,0x24,0xe1,0xa8,0x30,0xed,0x21,0x4f,0xad,0x7b,0x49,
0x19,0x8f,0x7f,0x48,0xa7,0xac,0x0d,0xc9,0x30,0x30,0x55,0xe4,0x2f,0x00,0xa6,0xa8,
0x2f,0x94,0xca,0xbe,0x3b,0x92,0x70,0x54,0x98,0x69,0x21,0xb3,0xf7,0xd5,0xa0,0xbb,
0x49,0xfe,0xe7,0x12,0xc1,0xba,0xb3,0xfc,0x5b,0xe1,0x0f,0x04,0xca,0xd4,0x17,0x4a,
0x65,0x95,0x1c,0x0c,0x39,0x27,0x49,0x7b,0xc2,0x8f,0x21,0xb3,0xb7,0x56,0xad,0xbb,
0x49,0xfe,0x27,0x24,0x58,0xc6,0x06,0xa3,0xa6,0x05,0x66,0x0b,0xfc,0x01,0xc0,0x18,
0xf5,0x85,0x52,0x59,0x25,0x07,0x43,0xce,0x49,0xd2,0x9e,0xf0,0x55,0xc8,0xd4,0xdd,
0x95,0xda,0x29,0x94,0x58,0x21,0xc1,0x32,0xf6,0x18,0x32,0x2a,0xf6,0xfc,0xf7,0xef,
0x1d,0xe6,0xb9,0x7d,0x9b,0x1c,0xc9,0x39,0x27,0x49,0x7b,0xc2,0x2f,0x42,0xa6,0x6e,
0xb0,0xd4,0x72,0xa7,0x04,0x8a,0x4a,0x95,0xb1,0xc7,0x90,0x39,0xb1,0xc1,0x76,0xae,
0x1b,0xa6,0xba,0x7d,0x9b,0x1c,0xc9,0x39,0x2a,0xcc,0xd8,0x84,0xd9,0xbf,0x8a,0x3a,
0xcb,0x9d,0x12,0x28,0x2a,0x55,0xc6,0x1e,0x43,0xe6,0xc4,0x06,0xdb,0xb9,0x6e,0x98,
0xaa,0xbe,0x4a,0x36,0x17,0xcd,0x88,0x3a,0x27,0xc9,0x84,0x84,0x5f,0x87,0x4c,0xfd,
0x61,0x14,0x59,0xee,0x94,0x40,0x51,0xa9,0x32,0xb6,0x19,0x3e,0x24,0x75,0x9b,0x70,
0x59,0xc5,0x3d,0xb2,0xb9,0x68,0x5e,0xda,0x39,0x49,0x26,0x9c,0xd8,0x7e,0x98,0xd1,
0x96,0x3b,0x25,0x50,0x54,0xaa,0x8c,0x6d,0x86,0x0f,0x49,0xdd,0x26,0x5c,0x56,0x71,
0x8f,0x6c,0x2e,0x9a,0x97,0x76,0x4e,0x92,0xf6,0x84,0x51,0xc7,0x35,0xd7,0x72,0xa7,
0x04,0x8a,0x4a,0x95,0xb1,0xcd,0xf0,0x21,0xa9,0xdb,0x84,0xcb,0xaa,0xef,0x91,0xcd,
0x75,0x1b,0x0b,0xa5,0x2c,0xcc,0xfc,0x84,0x35,0x3f,0x92,0x44,0xcb,0xb5,0x12,0x25,
0x2a,0x52,0xc6,0x36,0x43,0x0e,0x2a,0x2f,0x12,0xdc,0x45,0x71,0x89,0xec,0xaf,0xdb,
0x5b,0x28,0x35,0x61,0xae,0x12,0xb2,0xe0,0x77,0x92,0x65,0xb9,0x56,0x42,0x04,0x46,
0xca,0xd8,0x66,0xc8,0x41,0xe5,0x45,0x82,0xbb,0xa8,0x2f,0x91,0xcd,0x75,0x93,0x02,
0xcf,0x49,0x72,0xad,0x90,0x05,0x3f,0x95,0x14,0xcb,0xb5,0x12,0x22,0x30,0x52,0xc6,
0x36,0x43,0x0e,0x2a,0x2f,0x12,0xdc,0x45,0x7d,0x89,0x6c,0xae,0x9b,0x17,0x78,0x4e,
0x92,0xf6,0x84,0xa7,0x42,0x16,0xfc,0x5a,0xe2,0x2d,0xd7,0x4a,0x88,0xc0,0x48,0x19,
0xdb,0x0c,0x39,0xa8,0xbc,0x48,0x70,0x17,0xf5,0x25,0xb2,0xb9,0x6e,0x5e,0xe0,0x51,
0x61,0x2e,0x94,0xb0,0xe6,0x07,0x13,0x6c,0xb9,0x56,0x42,0x04,0x46,0xca,0xd8,0x66,
0xc8,0x41,0xe5,0x45,0x82,0x1b,0xa9,0x6c,0x90,0xfd,0x75,0xf3,0x0a,0x65,0x54,0x98,
0x6b,0x25,0x2c,0xfb,0xcd,0x84,0x59,0xae,0x95,0x10,0x81,0x91,0x32,0xf6,0x18,0x3e,
0x24,0x75,0x9b,0x70,0x65,0x95,0x0d,0xb2,0xbf,0x6e,0x5e,0xa1,0x8c,0x0a,0x73,0xb9,
0x84,0x65,0x3f,0x9b,0x30,0xcb,0xcd,0xb2,0x29,0x36,0x4f,0xc6,0x06,0xc3,0x87,0xa4,
0x6e,0x13,0xae,0xac,0xb2,0x41,0xf6,0xd7,0xcd,0xeb,0x94,0x39,0x49,0xae,0x98,0xb0,
0xf2,0x97,0x13,0x23,0xa4,0x02,0x02,0xab,0x64,0x61,0xd4,0x17,0xd3,0x96,0x07,0xbe,
0x27,0xf4,0xef,0xf2,0x90,0x4f,0xa7,0xc1,0x8d,0x54,0x36,0xc8,0xfe,0xba,0xa9,0x9d,
0x32,0x2a,0xcc,0x8d,0xe3,0x8d,0x10,0x52,0x01,0x81,0x55,0xb2,0x30,0x2a,0x7c,0xda,
0xc7,0x99,0xbd,0x43,0x3e,0x9d,0x06,0x37,0x52,0xf6,0x3e,0x87,0xac,0x9b,0xda,0x29,
0xa3,0xc2,0x5c,0x2e,0xde,0xa9,0x84,0xfd,0x42,0x2a,0x20,0xb0,0x4a,0x16,0x46,0x85,
0x4f,0xfb,0x38,0xb3,0x77,0xc8,0xa7,0xd3,0xe0,0x46,0x2a,0xdf,0xe7,0xfd,0x75,0x53,
0x3b,0x65,0x54,0x98,0xcb,0xc5,0x3b,0x9b,0xb0,0x59,0x48,0x05,0x04,0x56,0xc9,0xc2,
0xa8,0xc0,0x54,0xaf,0x06,0x86,0xcc,0xd9,0xc9,0xf3,0x69,0x2a,0xb8,0x8b,0xca,0xf7,
0x39,0x64,0xe9,0xbc,0x4e,0x19,0x15,0xa6,0xf1,0xa0,0x76,0xee,0xb7,0xfe,0x57,0xb4,
0x91,0x75,0xbb,0x02,0x02,0x7b,0xe4,0xec,0xa8,0x57,0x03,0xd7,0xe6,0x84,0x4f,0x8b,
0x8a,0xf4,0x2a,0x18,0xdc,0x45,0xe5,0xfb,0xbc,0xb9,0x6e,0x6a,0xad,0xcc,0x49,0x32,
0xfc,0xa0,0xa2,0xd2,0x36,0xdb,0xaf,0x80,0xc0,0x1e,0x39,0x3b,0x2a,0x43,0x60,0xaa,
0xd8,0xad,0xed,0xdc,0x32,0xcc,0x56,0xff,0x44,0xef,0xac,0x9b,0x5a,0x2b,0xf5,0x91,
0x66,0x7e,0x65,0xd7,0xda,0x69,0xbf,0x02,0x02,0x7b,0xe4,0xec,0xa8,0x0c,0x81,0xa9,
0x62,0xb7,0xb6,0x73,0xcb,0x30,0x5b,0xfd,0x13,0xbd,0xb3,0x6e,0x6a,0xad,0xb4,0x17,
0xdf,0x90,0xaf,0xf2,0x66,0xdb,0xec,0x57,0x40,0x60,0x8f,0x9c,0x1d,0x15,0x2e,0x36,
0x55,0xec,0xd6,0x96,0xaf,0x18,0xae,0xa0,0xfe,0x89,0x5e,0x5e,0x37,0xb5,0x56,0xda,
0x8b,0x6f,0xc8,0x57,0x7c,0xb3,0x3d,0x36,0x5b,0x20,0xb6,0x47,0x16,0xa6,0x05,0x0a,
0x4f,0x15,0xbb,0xb5,0x9d,0x5b,0x86,0xf1,0x5a,0x9e,0xe8,0xb5,0x75,0x53,0x6b,0xa5,
0xbd,0xf8,0x26,0x7c,0xf5,0x37,0xdb,0x63,0xb3,0x05,0x62,0x4b,0xe4,0xec,0xb4,0x40,
0x19,0xa9,0x62,0xb7,0xb6,0x76,0xbf,0x70,0x11,0x5d,0x0f,0xf5,0xb4,0x72,0x69,0xef,
0xbe,0x09,0x5f,0x94,0x96,0x45,0x4f,0x46,0xdc,0x68,0x81,0xd8,0x12,0x39,0x3b,0x2d,
0x4a,0x52,0xaa,0xd8,0xad,0x2d,0xdc,0x2c,0x5c,0x4a,0xcb,0x43,0x3d,0xb0,0x5c,0xda,
0xeb,0xaf,0xf7,0x0b,0xd4,0xb8,0xf4,0xe1,0x88,0x1b,0x2d,0x10,0x5b,0x22,0x67,0xa7,
0xed,0x0b,0x3f,0x9f,0x57,0xc3,0x6b,0xa2,0xc2,0xc5,0xd5,0x3f,0x98,0x03,0xfb,0xa5,
0xbd,0x01,0x1b,0xbf,0x58,0xed,0x01,0x0e,0x44,0xdc,0x68,0x81,0xd8,0x12,0x39,0x3b,
0x6d,0x53,0xc6,0xf9,0xbc,0x9a,0x5f,0x96,0x16,0xae,0xac,0xe5,0xb5,0x9c,0x56,0x31,
0xed,0x25,0xd8,0xf8,0x85,0x6b,0x0f,0xf0,0x5d,0xbe,0x8d,0x16,0x88,0x2d,0x91,0xb3,
0xd3,0xf6,0x85,0x9f,0xcf,0xab,0xe1,0x35,0x51,0xe1,0xe2,0x5a,0x5e,0xcb,0x69,0x15,
0xd3,0x5e,0x82,0x2d,0x5f,0x92,0x21,0x31,0x5e,0xe7,0xdb,0x68,0x81,0xd8,0x12,0x39,
0x3b,0x2d,0x4a,0x52,0xaa,0xd8,0xad,0x2d,0xdc,0x2c,0x5c,0x4d,0xcb,0xbb,0x3d,0xad,
0x6b,0xda,0xab,0x70,0xda,0x81,0x14,0xdf,0x6f,0xa9,0x9d,0x16,0x88,0x6d,0x90,0x53,
0xd3,0x62,0x65,0xa4,0xda,0xba,0x15,0x78,0xa8,0xfa,0xd7,0x7b,0x60,0xdd,0xb4,0x17,
0xe2,0x9c,0xa3,0xd8,0x37,0x30,0xd2,0xff,0xe7,0x5b,0xea,0x94,0xf0,0x3e,0x3a,0x3b,
0x30,0x56,0x78,0xaa,0x80,0x8b,0x81,0x27,0x2a,0x7e,0x30,0x07,0x96,0x4e,0x7b,0x2d,
0x4e,0x38,0x84,0x28,0x93,0xb3,0xfd,0xc8,0xb7,0x54,0x2b,0xe1,0x7d,0x74,0x76,0x60,
0xac,0xf0,0x54,0x31,0x77,0x03,0x4f,0x54,0xfc,0x5a,0x4e,0xab,0x9e,0xf6,0x72,0x6c,
0x3f,0x81,0x58,0xa3,0x13,0xae,0xd5,0x4a,0x78,0x1f,0x9d,0x1d,0xf8,0xe9,0xd8,0xb5,
0x21,0x5f,0x24,0x8c,0x9d,0x06,0x1c,0x50,0xfc,0x54,0x4e,0x2b,0xa0,0xf6,0x7e,0x1c,
0x72,0x0e,0x51,0xc6,0x06,0xfb,0x11,0x6e,0xa9,0x56,0xc2,0xfb,0xe8,0xec,0xc0,0x57,
0x63,0xd7,0xe6,0xbc,0x4a,0x18,0x3b,0x0d,0x38,0xa6,0xf2,0xb5,0x9c,0xd6,0x3b,0xed,
0xb5,0x38,0xed,0x40,0xea,0xef,0xb7,0xce,0x5a,0xad,0x84,0x97,0xd1,0xa9,0x81,0xdf,
0x4e,0x8e,0x9a,0xb6,0x36,0xe7,0x8b,0x60,0xc0,0x01,0x95,0x0f,0xe6,0xc0,0xba,0x69,
0x2f,0xc4,0x81,0x67,0x52,0x7c,0xbf,0x45,0xd6,0x6a,0x25,0xbc,0x8c,0x4e,0x0d,0xfc,
0x76,0x72,0xd4,0xb4,0xb5,0x39,0x05,0xc1,0xe0,0xee,0xca,0x5e,0xcb,0x81,0x5d,0xd3,
0xde,0x86,0x5d,0x5f,0x92,0x51,0x61,0x3e,0x84,0x3b,0x5f,0x04,0xe1,0xf5,0x71,0xb2,
0x91,0xbe,0x99,0x1c,0x35,0x6d,0x6d,0x4e,0x41,0x30,0x78,0x80,0xb2,0xd7,0x72,0x5a,
0xcb,0xb4,0xf7,0x60,0xe3,0x97,0x61,0x4e,0x92,0xcf,0xc2,0x9d,0x2f,0x82,0xf0,0xfa,
0x38,0xd9,0x48,0xdf,0x4c,0x8e,0x9a,0xb6,0x36,0xa7,0x20,0x18,0x3c,0x43,0xcd,0x83,
0x39,0xad,0x65,0xda,0x4b,0xb0,0xfd,0x8b,0x35,0x21,0xc3,0xeb,0x70,0xe7,0x8b,0x20,
0xbc,0x3e,0x4e,0x36,0xd2,0x37,0x93,0xa3,0xa6,0xad,0xcd,0x29,0x08,0x06,0x8f,0x51,
0xf0,0x60,0x4e,0xeb,0x97,0x51,0x61,0x66,0x1e,0xd1,0x29,0x13,0x32,0xbc,0x0e,0x77,
0xb2,0x0b,0x32,0xba,0xe3,0xd4,0xcc,0x6f,0x87,0x47,0x4d,0x5b,0x9b,0x53,0x10,0x0c,
0x1e,0xa3,0xe0,0xb5,0x1c,0x58,0x2e,0xa3,0xc2,0x74,0x1d,0x54,0x94,0xf6,0x00,0x5f,
0x86,0x3b,0xd9,0x05,0x19,0xdd,0x71,0x6a,0xe6,0xb7,0xc3,0xa3,0xa6,0xad,0xcd,0x29,
0x08,0x06,0x4f,0x92,0xfd,0x60,0x16,0xd7,0xca,0x91,0x9c,0xa3,0xc2,0x5c,0x28,0x5b,
0x6c,0xe6,0x0a,0x67,0xbb,0x20,0xa3,0x3b,0x4e,0xcd,0xfc,0x76,0x78,0xd4,0xb4,0xb5,
0x39,0x05,0xc1,0xe0,0x49,0x0a,0xde,0xcc,0xca,0x4e,0x39,0x12,0x72,0x54,0x98,0xc6,
0x78,0x51,0xda,0x03,0x7c,0x19,0xee,0x4c,0x17,0x64,0x74,0xc7,0xc9,0x46,0xfa,0x66,
0x78,0xd4,0xb4,0xb5,0x39,0x05,0xc1,0xe0,0x61,0x6e,0x53,0x28,0x07,0x43,0xce,0x49,
0xd2,0x9e,0x30,0x44,0xef,0xea,0xdf,0x85,0x3b,0xd3,0x05,0x19,0xdd,0x71,0xb2,0x91,
0xbe,0x19,0x1e,0x35,0x6d,0x6d,0x4e,0x41,0x30,0x78,0x9e,0xd4,0x37,0xb3,0xb2,0xef,
0x8e,0x84,0x1c,0x15,0xa6,0x3d,0xe1,0xbe,0xc6,0xa5,0x0f,0x84,0x3b,0xd3,0x05,0x19,
0xdd,0x71,0xb2,0x91,0xbe,0x19,0x1e,0x35,0x6d,0x6d,0x4e,0x41,0x30,0x78,0xa4,0xbc,
0x67,0xb3,0xb8,0xef,0x8e,0x24,0x1c,0x15,0xe6,0x72,0xf1,0xa2,0xd2,0x56,0x38,0xd5,
0x05,0x19,0xc5,0x71,0xbe,0x94,0xbe,0x9a,0x1f,0x35,0x6d,0x6d,0x4e,0x41,0x30,0x78,
0xa4,0xbc,0x97,0xb3,0xb2,0x4d,0x0e,0xc6,0x1b,0x15,0xa6,0x37,0xe1,0xbe,0xc6,0xa5,
0x0f,0x84,0x3b,0xd3,0x05,0x19,0xc5,0x71,0xbe,0x94,0x5e,0xce,0x5f,0x1b,0xf5,0xe9,
0xb4,0xc0,0x51,0xe1,0xd3,0xe0,0x91,0xf2,0x1e,0xcf,0xca,0xbe,0x3b,0x12,0x6f,0x4e,
0x92,0x09,0x21,0x37,0x75,0xad,0x7b,0x2c,0x5c,0x8e,0xec,0x00,0xb1,0x5b,0x08,0x3f,
0x99,0x8c,0x39,0xf0,0x78,0x49,0x8f,0x67,0x65,0xdf,0x1d,0x89,0x37,0x27,0xc9,0x84,
0x90,0x9b,0xba,0xd6,0x3d,0x9c,0x2f,0x41,0xef,0xea,0x67,0x5d,0x2b,0x18,0x3c,0x5b,
0xf8,0xfb,0x59,0xd9,0x77,0x47,0xb2,0x8d,0x0a,0x33,0x21,0xe4,0x8e,0xae,0x75,0x0f,
0xe7,0x6b,0x2d,0x8e,0x8c,0xd5,0xcf,0x1a,0x9b,0x2d,0xe2,0x7a,0xe1,0x7e,0x62,0xdf,
0xcf,0xe2,0xbe,0x3b,0x12,0x6c,0x54,0x98,0x8b,0x26,0xdc,0xcf,0x59,0xa1,0xb7,0x35,
0xc2,0x57,0x5f,0x30,0x36,0xdb,0xf6,0xdd,0xc2,0x5d,0xc5,0x3e,0xa1,0x95,0x6d,0x72,
0x24,0xd5,0xa8,0x30,0x17,0x4d,0xb8,0x9f,0xb3,0x42,0x6f,0x6b,0x84,0xaf,0x1e,0x9b,
0x76,0x6c,0x30,0x78,0xbc,0xc0,0x57,0xb4,0xb2,0x4d,0x8e,0xa4,0x9a,0x93,0xe4,0xba,
0x09,0xf7,0x73,0x56,0xe8,0x2d,0x8e,0xf0,0xd5,0x63,0xa3,0x4e,0xce,0x06,0x8f,0x17,
0xf5,0x90,0x56,0xb6,0xc9,0x91,0x48,0x73,0x92,0xb4,0xc7,0xdb,0x7c,0x09,0xbb,0xd6,
0x3d,0x9c,0xaf,0xb5,0x38,0xc2,0x57,0x0f,0x8f,0x3a,0x36,0x18,0x70,0xc1,0xbe,0x9b,
0x96,0x27,0xef,0xcc,0x1b,0x13,0x86,0x44,0x2d,0xd2,0xd8,0x1d,0xb1,0x4b,0x27,0x45,
0x1d,0x1b,0x0c,0x88,0x78,0x4e,0x8b,0x0b,0xe5,0xc8,0x1f,0xf0,0x39,0x49,0xe6,0x9f,
0x55,0x52,0xda,0x22,0x8d,0xc5,0x11,0xb8,0xf4,0x6d,0x72,0x9e,0xcd,0x06,0x6c,0x3f,
0xa7,0xd3,0x6a,0x65,0x4e,0x92,0xe1,0x07,0x95,0x17,0xb5,0x48,0x63,0x77,0x04,0x2e,
0x9d,0x9a,0xb3,0x2c,0xea,0x42,0x30,0xe0,0x87,0x9d,0x17,0x75,0x5a,0xad,0xcc,0x49,
0xd2,0x78,0x44,0x9b,0x3d,0xd8,0xb5,0xee,0xc9,0x94,0x7d,0xf5,0x11,0xb8,0x74,0x52,
0xc2,0xca,0xb4,0x3b,0xd9,0x80,0x8d,0x77,0x75,0x5a,0xad,0x74,0x95,0xdd,0xc0,0x2f,
0xf5,0xc7,0x90,0xb1,0xee,0xc9,0x94,0x7d,0x0d,0x12,0xb8,0x74,0x52,0xc2,0x9a,0xc0,
0x9b,0xa9,0x80,0xff,0x58,0x7b,0x5a,0xa7,0xd5,0x4a,0x7b,0xeb,0xcd,0xf9,0x52,0x7f,
0x09,0x19,0xeb,0x9e,0x4c,0xd9,0xd7,0x23,0x81,0x4b,0x87,0x67,0x2b,0x8b,0x1d,0x18,
0x0c,0x58,0x7a,0x5d,0xa7,0xd5,0x4a,0x7b,0xeb,0xcd,0xf9,0x52,0x7f,0x06,0x19,0xeb,
0x9e,0x4c,0xd9,0xd7,0x23,0x51,0x4b,0x87,0x07,0xab,0x49,0x9e,0x11,0x0c,0x58,0x7a,
0x5d,0xa7,0x35,0x4b,0x7b,0xf1,0x4d,0xf8,0x52,0x7f,0x03,0x49,0xeb,0x52,0x4a,0xe7,
0xc2,0x3c,0x67,0x1f,0xd8,0x69,0xe5,0xd2,0xde,0x7d,0x13,0xbe,0xa4,0xdb,0xcf,0x5b,
0x97,0x1e,0x9a,0x17,0xe6,0x39,0xfe,0xc0,0x4e,0x2b,0x97,0xf6,0xee,0x6b,0xff,0x32,
0xee,0xbd,0x60,0x69,0x00,0xfe,0xeb,0xc8,0x03,0x3b,0xad,0x5f,0xda,0xeb,0xaf,0xfd,
0x0b,0xbc,0xee,0xb2,0xa5,0x01,0xf8,0xc9,0x91,0x37,0x76,0x5a,0xc5,0xb4,0x37,0x60,
0xe3,0x17,0x7b,0xd7,0x95,0xab,0x03,0xf0,0xd1,0xd7,0x6f,0xec,0xb4,0x96,0x69,0x2f,
0xc1,0xae,0x2f,0xf0,0x96,0x5b,0x02,0x00,0xf0,0xd1,0x17,0x6f,0xec,0xb4,0xa2,0x69,
0xef,0xc1,0x96,0x2f,0xea,0x7e,0xbb,0x02,0x00,0xf0,0xca,0xab,0x67,0x76,0x5a,0xd7,
0xb4,0x57,0xe1,0xb4,0x03,0x39,0x78,0xb3,0x8d,0x01,0x00,0x58,0x30,0xb0,0x6e,0xda,
0x0b,0x71,0xd4,0x69,0x14,0x1c,0x17,0x00,0x2d,0xa6,0x95,0x4e,0x7b,0x27,0x4e,0x38,
0x84,0xca,0xbb,0x03,0xa0,0xc5,0xb4,0xea,0x69,0x6f,0xc6,0xc6,0xbd,0xb7,0xdc,0x1d,
0x00,0x2d,0xa6,0x75,0x50,0x7b,0x45,0xb6,0xec,0xba,0xeb,0xe2,0x00,0xe8,0x32,0xad,
0x89,0xda,0x8b,0xf2,0x12,0x8d,0x76,0xad,0xb4,0x00,0x7c,0x74,0xd7,0x86,0xba,0x31,
0x17,0x01,0x00,0xc5,0x94,0x2f,0x00,0x14,0x53,0xbe,0x00,0x50,0xcc,0xff,0x05,0x00,
0x00,0xc5,0x94,0x2f,0xc0,0xa3,0x78,0xcc,0x27,0x08,0x2c,0x5f,0x57,0x06,0x70,0x15,
0xde,0xf3,0x5e,0xca,0x17,0xe0,0xc9,0x3c,0xec,0x2d,0x94,0x2f,0x00,0xff,0xe2,0x79,
0xaf,0x11,0xdb,0xbc,0x6e,0x07,0xe0,0x1e,0xbc,0xf3,0xa9,0x94,0x2f,0x00,0x5f,0xf3,
0xe0,0x87,0x53,0xbe,0x00,0x1c,0xe4,0xf1,0x0f,0xa1,0x79,0x01,0x58,0xa0,0x0b,0x96,
0x85,0x37,0xaf,0x33,0x07,0x78,0x1a,0x8d,0x70,0x8a,0xda,0x05,0x20,0x8a,0x82,0x38,
0xc2,0xdf,0x79,0x01,0x48,0xa5,0x32,0x7e,0xa2,0x79,0x01,0x28,0xa3,0x3b,0xde,0xd2,
0x9a,0xf7,0x39,0x07,0x08,0xc0,0xb2,0xa7,0xb5,0x49,0x5e,0xe7,0xde,0xef,0xac,0x00,
0x28,0x70,0xfb,0x5a,0xd1,0xbc,0x00,0x8c,0x75,0xcb,0xc6,0x51,0xbb,0x00,0x5c,0xc5,
0x0d,0x3a,0xc8,0x5f,0x78,0x01,0xb8,0x81,0xc9,0xdd,0x94,0x5d,0xb5,0x3a,0x17,0x80,
0x76,0xed,0xcd,0x55,0xd6,0xb6,0x6a,0x17,0x80,0xb1,0xea,0xdb,0x50,0xf3,0x02,0xc0,
0x47,0xed,0xa5,0xa9,0x73,0x01,0x78,0xb2,0xf6,0x26,0x55,0xb5,0x00,0xd0,0xde,0xb6,
0x3a,0x17,0x00,0x3e,0xa5,0x5e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0xfc,0x03,0x26,
0x84,0x0a,0xd6,0x36,0x10,0x0e,0x00,

View File

@@ -0,0 +1,789 @@
/*
* (C) Copyright 2002
* Brad Kemp, Seranoa Networks, Brad.Kemp@seranoa.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <asm/processor.h>
#undef DEBUG_FLASH
/*
* This file implements a Common Flash Interface (CFI) driver for ppcboot.
* The width of the port and the width of the chips are determined at initialization.
* These widths are used to calculate the address for access CFI data structures.
* It has been tested on an Intel Strataflash implementation.
*
* References
* JEDEC Standard JESD68 - Common Flash Interface (CFI)
* JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes
* Intel Application Note 646 Common Flash Interface (CFI) and Command Sets
* Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet
*
* TODO
* Use Primary Extended Query table (PRI) and Alternate Algorithm Query Table (ALT) to determine if protection is available
* Add support for other command sets Use the PRI and ALT to determine command set
* Verify erase and program timeouts.
*/
#define FLASH_CMD_CFI 0x98
#define FLASH_CMD_READ_ID 0x90
#define FLASH_CMD_RESET 0xff
#define FLASH_CMD_BLOCK_ERASE 0x20
#define FLASH_CMD_ERASE_CONFIRM 0xD0
#define FLASH_CMD_WRITE 0x40
#define FLASH_CMD_PROTECT 0x60
#define FLASH_CMD_PROTECT_SET 0x01
#define FLASH_CMD_PROTECT_CLEAR 0xD0
#define FLASH_CMD_CLEAR_STATUS 0x50
#define FLASH_CMD_WRITE_TO_BUFFER 0xE8
#define FLASH_CMD_WRITE_BUFFER_CONFIRM 0xD0
#define FLASH_STATUS_DONE 0x80
#define FLASH_STATUS_ESS 0x40
#define FLASH_STATUS_ECLBS 0x20
#define FLASH_STATUS_PSLBS 0x10
#define FLASH_STATUS_VPENS 0x08
#define FLASH_STATUS_PSS 0x04
#define FLASH_STATUS_DPS 0x02
#define FLASH_STATUS_R 0x01
#define FLASH_STATUS_PROTECT 0x01
#define FLASH_OFFSET_CFI 0x55
#define FLASH_OFFSET_CFI_RESP 0x10
#define FLASH_OFFSET_WTOUT 0x1F
#define FLASH_OFFSET_WBTOUT 0x20
#define FLASH_OFFSET_ETOUT 0x21
#define FLASH_OFFSET_CETOUT 0x22
#define FLASH_OFFSET_WMAX_TOUT 0x23
#define FLASH_OFFSET_WBMAX_TOUT 0x24
#define FLASH_OFFSET_EMAX_TOUT 0x25
#define FLASH_OFFSET_CEMAX_TOUT 0x26
#define FLASH_OFFSET_SIZE 0x27
#define FLASH_OFFSET_INTERFACE 0x28
#define FLASH_OFFSET_BUFFER_SIZE 0x2A
#define FLASH_OFFSET_NUM_ERASE_REGIONS 0x2C
#define FLASH_OFFSET_ERASE_REGIONS 0x2D
#define FLASH_OFFSET_PROTECT 0x02
#define FLASH_OFFSET_USER_PROTECTION 0x85
#define FLASH_OFFSET_INTEL_PROTECTION 0x81
#define FLASH_MAN_CFI 0x01000000
typedef union {
unsigned char c;
unsigned short w;
unsigned long l;
} cfiword_t;
typedef union {
unsigned char * cp;
unsigned short *wp;
unsigned long *lp;
} cfiptr_t;
#define NUM_ERASE_REGIONS 4
flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
/*-----------------------------------------------------------------------
* Functions
*/
static void flash_add_byte(flash_info_t *info, cfiword_t * cword, uchar c);
static void flash_make_cmd(flash_info_t * info, uchar cmd, void * cmdbuf);
static void flash_write_cmd(flash_info_t * info, int sect, uchar offset, uchar cmd);
static int flash_isequal(flash_info_t * info, int sect, uchar offset, uchar cmd);
static int flash_isset(flash_info_t * info, int sect, uchar offset, uchar cmd);
static int flash_detect_cfi(flash_info_t * info);
static ulong flash_get_size (ulong base, int banknum);
static int flash_write_cfiword (flash_info_t *info, ulong dest, cfiword_t cword);
static int flash_full_status_check(flash_info_t * info, ulong sector, ulong tout, char * prompt);
#ifdef CFG_FLASH_USE_BUFFER_WRITE
static int flash_write_cfibuffer(flash_info_t * info, ulong dest, uchar * cp, int len);
#endif
/*-----------------------------------------------------------------------
* create an address based on the offset and the port width
*/
inline uchar * flash_make_addr(flash_info_t * info, int sect, int offset)
{
return ((uchar *)(info->start[sect] + (offset * info->portwidth)));
}
/*-----------------------------------------------------------------------
* read a character at a port width address
*/
inline uchar flash_read_uchar(flash_info_t * info, uchar offset)
{
uchar *cp;
cp = flash_make_addr(info, 0, offset);
return (cp[info->portwidth - 1]);
}
/*-----------------------------------------------------------------------
* read a short word by swapping for ppc format.
*/
ushort flash_read_ushort(flash_info_t * info, int sect, uchar offset)
{
uchar * addr;
addr = flash_make_addr(info, sect, offset);
return ((addr[(2*info->portwidth) - 1] << 8) | addr[info->portwidth - 1]);
}
/*-----------------------------------------------------------------------
* read a long word by picking the least significant byte of each maiximum
* port size word. Swap for ppc format.
*/
ulong flash_read_long(flash_info_t * info, int sect, uchar offset)
{
uchar * addr;
addr = flash_make_addr(info, sect, offset);
return ( (addr[(2*info->portwidth) - 1] << 24 ) | (addr[(info->portwidth) -1] << 16) |
(addr[(4*info->portwidth) - 1] << 8) | addr[(3*info->portwidth) - 1]);
}
/*-----------------------------------------------------------------------
*/
unsigned long flash_init (void)
{
unsigned long size;
int i;
unsigned long address;
/* The flash is positioned back to back, with the demultiplexing of the chip
* based on the A24 address line.
*
*/
address = CFG_FLASH_BASE;
size = 0;
/* Init: no FLASHes known */
for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {
flash_info[i].flash_id = FLASH_UNKNOWN;
size += flash_info[i].size = flash_get_size(address, i);
address += CFG_FLASH_INCREMENT;
if (flash_info[0].flash_id == FLASH_UNKNOWN) {
printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",i,
flash_info[0].size, flash_info[i].size<<20);
}
}
#if 0 /* test-only */
/* Monitor protection ON by default */
#if (CFG_MONITOR_BASE >= CFG_FLASH_BASE)
for(i=0; flash_info[0].start[i] < CFG_MONITOR_BASE+CFG_MONITOR_LEN-1; i++)
(void)flash_real_protect(&flash_info[0], i, 1);
#endif
#else
/* monitor protection ON by default */
flash_protect (FLAG_PROTECT_SET,
- CFG_MONITOR_LEN,
- 1, &flash_info[1]);
#endif
return (size);
}
/*-----------------------------------------------------------------------
*/
int flash_erase (flash_info_t *info, int s_first, int s_last)
{
int rcode = 0;
int prot;
int sect;
if( info->flash_id != FLASH_MAN_CFI) {
printf ("Can't erase unknown flash type - aborted\n");
return 1;
}
if ((s_first < 0) || (s_first > s_last)) {
printf ("- no sectors to erase\n");
return 1;
}
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");
}
for (sect = s_first; sect<=s_last; sect++) {
if (info->protect[sect] == 0) { /* not protected */
flash_write_cmd(info, sect, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd(info, sect, 0, FLASH_CMD_BLOCK_ERASE);
flash_write_cmd(info, sect, 0, FLASH_CMD_ERASE_CONFIRM);
if(flash_full_status_check(info, sect, info->erase_blk_tout, "erase")) {
rcode = 1;
} else
printf(".");
}
}
printf (" done\n");
return rcode;
}
/*-----------------------------------------------------------------------
*/
void flash_print_info (flash_info_t *info)
{
int i;
if (info->flash_id != FLASH_MAN_CFI) {
printf ("missing or unknown FLASH type\n");
return;
}
printf("CFI conformant FLASH (%d x %d)",
(info->portwidth << 3 ), (info->chipwidth << 3 ));
printf (" Size: %ld MB in %d Sectors\n",
info->size >> 20, info->sector_count);
printf(" Erase timeout %ld ms, write timeout %ld ms, buffer write timeout %ld ms, buffer size %d\n",
info->erase_blk_tout, info->write_tout, info->buffer_write_tout, info->buffer_size);
printf (" Sector Start Addresses:");
for (i=0; i<info->sector_count; ++i) {
#ifdef CFG_FLASH_EMPTY_INFO
int k;
int size;
int erased;
volatile unsigned long *flash;
/*
* Check if whole sector is erased
*/
if (i != (info->sector_count-1))
size = info->start[i+1] - info->start[i];
else
size = info->start[0] + info->size - info->start[i];
erased = 1;
flash = (volatile unsigned long *)info->start[i];
size = size >> 2; /* divide by 4 for longword access */
for (k=0; k<size; k++)
{
if (*flash++ != 0xffffffff)
{
erased = 0;
break;
}
}
if ((i % 5) == 0)
printf ("\n ");
/* print empty and read-only info */
printf (" %08lX%s%s",
info->start[i],
erased ? " E" : " ",
info->protect[i] ? "RO " : " ");
#else
if ((i % 5) == 0)
printf ("\n ");
printf (" %08lX%s",
info->start[i],
info->protect[i] ? " (RO)" : " ");
#endif
}
printf ("\n");
return;
}
/*-----------------------------------------------------------------------
* Copy memory to flash, returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
*/
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
{
ulong wp;
ulong cp;
int aln;
cfiword_t cword;
int i, rc;
/* get lower aligned address */
wp = (addr & ~(info->portwidth - 1));
/* handle unaligned start */
if((aln = addr - wp) != 0) {
cword.l = 0;
cp = wp;
for(i=0;i<aln; ++i, ++cp)
flash_add_byte(info, &cword, (*(uchar *)cp));
for(; (i< info->portwidth) && (cnt > 0) ; i++) {
flash_add_byte(info, &cword, *src++);
cnt--;
cp++;
}
for(; (cnt == 0) && (i < info->portwidth); ++i, ++cp)
flash_add_byte(info, &cword, (*(uchar *)cp));
if((rc = flash_write_cfiword(info, wp, cword)) != 0)
return rc;
wp = cp;
}
#ifdef CFG_FLASH_USE_BUFFER_WRITE
while(cnt >= info->portwidth) {
i = info->buffer_size > cnt? cnt: info->buffer_size;
if((rc = flash_write_cfibuffer(info, wp, src,i)) != ERR_OK)
return rc;
wp += i;
src += i;
cnt -=i;
}
#else
/* handle the aligned part */
while(cnt >= info->portwidth) {
cword.l = 0;
for(i = 0; i < info->portwidth; i++) {
flash_add_byte(info, &cword, *src++);
}
if((rc = flash_write_cfiword(info, wp, cword)) != 0)
return rc;
wp += info->portwidth;
cnt -= info->portwidth;
}
#endif /* CFG_FLASH_USE_BUFFER_WRITE */
if (cnt == 0) {
return (0);
}
/*
* handle unaligned tail bytes
*/
cword.l = 0;
for (i=0, cp=wp; (i<info->portwidth) && (cnt>0); ++i, ++cp) {
flash_add_byte(info, &cword, *src++);
--cnt;
}
for (; i<info->portwidth; ++i, ++cp) {
flash_add_byte(info, & cword, (*(uchar *)cp));
}
return flash_write_cfiword(info, wp, cword);
}
/*-----------------------------------------------------------------------
*/
int flash_real_protect(flash_info_t *info, long sector, int prot)
{
int retcode = 0;
flash_write_cmd(info, sector, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd(info, sector, 0, FLASH_CMD_PROTECT);
if(prot)
flash_write_cmd(info, sector, 0, FLASH_CMD_PROTECT_SET);
else
flash_write_cmd(info, sector, 0, FLASH_CMD_PROTECT_CLEAR);
if((retcode = flash_full_status_check(info, sector, info->erase_blk_tout,
prot?"protect":"unprotect")) == 0) {
info->protect[sector] = prot;
/* Intel's unprotect unprotects all locking */
if(prot == 0) {
int i;
for(i = 0 ; i<info->sector_count; i++) {
if(info->protect[i])
flash_real_protect(info, i, 1);
}
}
}
return retcode;
}
/*-----------------------------------------------------------------------
* wait for XSR.7 to be set. Time out with an error if it does not.
* This routine does not set the flash to read-array mode.
*/
static int flash_status_check(flash_info_t * info, ulong sector, ulong tout, char * prompt)
{
ulong start;
/* Wait for command completion */
start = get_timer (0);
while(!flash_isset(info, sector, 0, FLASH_STATUS_DONE)) {
if (get_timer(start) > info->erase_blk_tout) {
printf("Flash %s timeout at address %lx\n", prompt, info->start[sector]);
flash_write_cmd(info, sector, 0, FLASH_CMD_RESET);
return ERR_TIMOUT;
}
}
return ERR_OK;
}
/*-----------------------------------------------------------------------
* Wait for XSR.7 to be set, if it times out print an error, otherwise do a full status check.
* This routine sets the flash to read-array mode.
*/
static int flash_full_status_check(flash_info_t * info, ulong sector, ulong tout, char * prompt)
{
int retcode;
retcode = flash_status_check(info, sector, tout, prompt);
if((retcode == ERR_OK) && !flash_isequal(info,sector, 0, FLASH_STATUS_DONE)) {
retcode = ERR_INVAL;
printf("Flash %s error at address %lx\n", prompt,info->start[sector]);
if(flash_isset(info, sector, 0, FLASH_STATUS_ECLBS | FLASH_STATUS_PSLBS)){
printf("Command Sequence Error.\n");
} else if(flash_isset(info, sector, 0, FLASH_STATUS_ECLBS)){
printf("Block Erase Error.\n");
retcode = ERR_NOT_ERASED;
} else if (flash_isset(info, sector, 0, FLASH_STATUS_PSLBS)) {
printf("Locking Error\n");
}
if(flash_isset(info, sector, 0, FLASH_STATUS_DPS)){
printf("Block locked.\n");
retcode = ERR_PROTECTED;
}
if(flash_isset(info, sector, 0, FLASH_STATUS_VPENS))
printf("Vpp Low Error.\n");
}
flash_write_cmd(info, sector, 0, FLASH_CMD_RESET);
return retcode;
}
/*-----------------------------------------------------------------------
*/
static void flash_add_byte(flash_info_t *info, cfiword_t * cword, uchar c)
{
switch(info->portwidth) {
case FLASH_CFI_8BIT:
cword->c = c;
break;
case FLASH_CFI_16BIT:
cword->w = (cword->w << 8) | c;
break;
case FLASH_CFI_32BIT:
cword->l = (cword->l << 8) | c;
}
}
/*-----------------------------------------------------------------------
* make a proper sized command based on the port and chip widths
*/
static void flash_make_cmd(flash_info_t * info, uchar cmd, void * cmdbuf)
{
int i;
uchar *cp = (uchar *)cmdbuf;
for(i=0; i< info->portwidth; i++)
*cp++ = ((i+1) % info->chipwidth) ? '\0':cmd;
}
/*
* Write a proper sized command to the correct address
*/
static void flash_write_cmd(flash_info_t * info, int sect, uchar offset, uchar cmd)
{
volatile cfiptr_t addr;
cfiword_t cword;
addr.cp = flash_make_addr(info, sect, offset);
flash_make_cmd(info, cmd, &cword);
switch(info->portwidth) {
case FLASH_CFI_8BIT:
*addr.cp = cword.c;
break;
case FLASH_CFI_16BIT:
*addr.wp = cword.w;
break;
case FLASH_CFI_32BIT:
*addr.lp = cword.l;
break;
}
}
/*-----------------------------------------------------------------------
*/
static int flash_isequal(flash_info_t * info, int sect, uchar offset, uchar cmd)
{
cfiptr_t cptr;
cfiword_t cword;
int retval;
cptr.cp = flash_make_addr(info, sect, offset);
flash_make_cmd(info, cmd, &cword);
switch(info->portwidth) {
case FLASH_CFI_8BIT:
retval = (cptr.cp[0] == cword.c);
break;
case FLASH_CFI_16BIT:
retval = (cptr.wp[0] == cword.w);
break;
case FLASH_CFI_32BIT:
retval = (cptr.lp[0] == cword.l);
break;
default:
retval = 0;
break;
}
return retval;
}
/*-----------------------------------------------------------------------
*/
static int flash_isset(flash_info_t * info, int sect, uchar offset, uchar cmd)
{
cfiptr_t cptr;
cfiword_t cword;
int retval;
cptr.cp = flash_make_addr(info, sect, offset);
flash_make_cmd(info, cmd, &cword);
switch(info->portwidth) {
case FLASH_CFI_8BIT:
retval = ((cptr.cp[0] & cword.c) == cword.c);
break;
case FLASH_CFI_16BIT:
retval = ((cptr.wp[0] & cword.w) == cword.w);
break;
case FLASH_CFI_32BIT:
retval = ((cptr.lp[0] & cword.l) == cword.l);
break;
default:
retval = 0;
break;
}
return retval;
}
/*-----------------------------------------------------------------------
* detect if flash is compatible with the Common Flash Interface (CFI)
* http://www.jedec.org/download/search/jesd68.pdf
*
*/
static int flash_detect_cfi(flash_info_t * info)
{
for(info->portwidth=FLASH_CFI_8BIT; info->portwidth <= FLASH_CFI_32BIT;
info->portwidth <<= 1) {
for(info->chipwidth =FLASH_CFI_BY8;
info->chipwidth <= info->portwidth;
info->chipwidth <<= 1) {
flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
flash_write_cmd(info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI);
if(flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP,'Q') &&
flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R') &&
flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y'))
return 1;
}
}
return 0;
}
/*
* The following code cannot be run from FLASH!
*
*/
static ulong flash_get_size (ulong base, int banknum)
{
flash_info_t * info = &flash_info[banknum];
int i, j;
int sect_cnt;
unsigned long sector;
unsigned long tmp;
int size_ratio;
uchar num_erase_regions;
int erase_region_size;
int erase_region_count;
info->start[0] = base;
if(flash_detect_cfi(info)){
#ifdef DEBUG_FLASH
printf("portwidth=%d chipwidth=%d\n", info->portwidth, info->chipwidth); /* test-only */
#endif
size_ratio = info->portwidth / info->chipwidth;
num_erase_regions = flash_read_uchar(info, FLASH_OFFSET_NUM_ERASE_REGIONS);
#ifdef DEBUG_FLASH
printf("found %d erase regions\n", num_erase_regions);
#endif
sect_cnt = 0;
sector = base;
for(i = 0 ; i < num_erase_regions; i++) {
if(i > NUM_ERASE_REGIONS) {
printf("%d erase regions found, only %d used\n",
num_erase_regions, NUM_ERASE_REGIONS);
break;
}
tmp = flash_read_long(info, 0, FLASH_OFFSET_ERASE_REGIONS);
erase_region_size = (tmp & 0xffff)? ((tmp & 0xffff) * 256): 128;
tmp >>= 16;
erase_region_count = (tmp & 0xffff) +1;
for(j = 0; j< erase_region_count; j++) {
info->start[sect_cnt] = sector;
sector += (erase_region_size * size_ratio);
info->protect[sect_cnt] = flash_isset(info, sect_cnt, FLASH_OFFSET_PROTECT, FLASH_STATUS_PROTECT);
sect_cnt++;
}
}
info->sector_count = sect_cnt;
/* multiply the size by the number of chips */
info->size = (1 << flash_read_uchar(info, FLASH_OFFSET_SIZE)) * size_ratio;
info->buffer_size = (1 << flash_read_ushort(info, 0, FLASH_OFFSET_BUFFER_SIZE));
tmp = 1 << flash_read_uchar(info, FLASH_OFFSET_ETOUT);
info->erase_blk_tout = (tmp * (1 << flash_read_uchar(info, FLASH_OFFSET_EMAX_TOUT)));
tmp = 1 << flash_read_uchar(info, FLASH_OFFSET_WBTOUT);
info->buffer_write_tout = (tmp * (1 << flash_read_uchar(info, FLASH_OFFSET_WBMAX_TOUT)));
tmp = 1 << flash_read_uchar(info, FLASH_OFFSET_WTOUT);
info->write_tout = (tmp * (1 << flash_read_uchar(info, FLASH_OFFSET_WMAX_TOUT)))/ 1000;
info->flash_id = FLASH_MAN_CFI;
}
flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
return(info->size);
}
/*-----------------------------------------------------------------------
*/
static int flash_write_cfiword (flash_info_t *info, ulong dest, cfiword_t cword)
{
cfiptr_t ctladdr;
cfiptr_t cptr;
int flag;
ctladdr.cp = flash_make_addr(info, 0, 0);
cptr.cp = (uchar *)dest;
/* Check if Flash is (sufficiently) erased */
switch(info->portwidth) {
case FLASH_CFI_8BIT:
flag = ((cptr.cp[0] & cword.c) == cword.c);
break;
case FLASH_CFI_16BIT:
flag = ((cptr.wp[0] & cword.w) == cword.w);
break;
case FLASH_CFI_32BIT:
flag = ((cptr.lp[0] & cword.l) == cword.l);
break;
default:
return 2;
}
if(!flag)
return 2;
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts();
flash_write_cmd(info, 0, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd(info, 0, 0, FLASH_CMD_WRITE);
switch(info->portwidth) {
case FLASH_CFI_8BIT:
cptr.cp[0] = cword.c;
break;
case FLASH_CFI_16BIT:
cptr.wp[0] = cword.w;
break;
case FLASH_CFI_32BIT:
cptr.lp[0] = cword.l;
break;
}
/* re-enable interrupts if necessary */
if(flag)
enable_interrupts();
return flash_full_status_check(info, 0, info->write_tout, "write");
}
#ifdef CFG_FLASH_USE_BUFFER_WRITE
/* loop through the sectors from the highest address
* when the passed address is greater or equal to the sector address
* we have a match
*/
static int find_sector(flash_info_t *info, ulong addr)
{
int sector;
for(sector = info->sector_count - 1; sector >= 0; sector--) {
if(addr >= info->start[sector])
break;
}
return sector;
}
static int flash_write_cfibuffer(flash_info_t * info, ulong dest, uchar * cp, int len)
{
int sector;
int cnt;
int retcode;
volatile cfiptr_t src;
volatile cfiptr_t dst;
src.cp = cp;
dst.cp = (uchar *)dest;
sector = find_sector(info, dest);
flash_write_cmd(info, sector, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd(info, sector, 0, FLASH_CMD_WRITE_TO_BUFFER);
if((retcode = flash_status_check(info, sector, info->buffer_write_tout,
"write to buffer")) == ERR_OK) {
switch(info->portwidth) {
case FLASH_CFI_8BIT:
cnt = len;
break;
case FLASH_CFI_16BIT:
cnt = len >> 1;
break;
case FLASH_CFI_32BIT:
cnt = len >> 2;
break;
default:
return ERR_INVAL;
break;
}
flash_write_cmd(info, sector, 0, (uchar)cnt-1);
while(cnt-- > 0) {
switch(info->portwidth) {
case FLASH_CFI_8BIT:
*dst.cp++ = *src.cp++;
break;
case FLASH_CFI_16BIT:
*dst.wp++ = *src.wp++;
break;
case FLASH_CFI_32BIT:
*dst.lp++ = *src.lp++;
break;
default:
return ERR_INVAL;
break;
}
}
flash_write_cmd(info, sector, 0, FLASH_CMD_WRITE_BUFFER_CONFIRM);
retcode = flash_full_status_check(info, sector, info->buffer_write_tout,
"buffer write");
}
flash_write_cmd(info, sector, 0, FLASH_CMD_CLEAR_STATUS);
return retcode;
}
#endif /* CFG_USE_FLASH_BUFFER_WRITE */

148
board/esd/apc405/u-boot.lds Normal file
View File

@@ -0,0 +1,148 @@
/*
* (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
*/
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
{
.resetvec 0xFFFFFFFC :
{
*(.resetvec)
} = 0xffff
/* 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 :
{
/* WARNING - the following is hand-optimized to fit within */
/* the sector layout of our flash chips! XXX FIXME XXX */
cpu/ppc4xx/start.o (.text)
cpu/ppc4xx/traps.o (.text)
cpu/ppc4xx/interrupts.o (.text)
cpu/ppc4xx/serial.o (.text)
cpu/ppc4xx/cpu_init.o (.text)
cpu/ppc4xx/speed.o (.text)
cpu/ppc4xx/405gp_enet.o (.text)
common/dlmalloc.o (.text)
lib_generic/crc32.o (.text)
lib_ppc/extable.o (.text)
lib_generic/zlib.o (.text)
/* . = env_offset;*/
/* common/environment.o(.text)*/
*(.text)
*(.fixup)
*(.got1)
}
_etext = .;
PROVIDE (etext = .);
.rodata :
{
*(.rodata)
*(.rodata1)
*(.rodata.str1.4)
}
.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 = .);
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
__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 = .);
}

View File

@@ -196,7 +196,12 @@ int checkboard (void)
long int initdram (int board_type)
{
return (16 * 1024 * 1024);
unsigned long val;
mtdcr(memcfga, mem_mb0cf);
val = mfdcr(memcfgd);
return (4*1024*1024 << ((val & 0x000e0000) >> 17));
}
/* ------------------------------------------------------------------------- */
@@ -209,4 +214,225 @@ int testdram (void)
return (0);
}
/* ------------------------------------------------------------------------- */
#if 1 /* test-only: some internal test routines... */
/*
* Some test routines
*/
int do_digtest(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
volatile uchar *digen = (volatile uchar *)0xf03000b4;
volatile ushort *digout = (volatile ushort *)0xf03000b0;
volatile ushort *digin = (volatile ushort *)0xf03000a0;
int i;
int k;
int start;
int end;
if (argc != 3) {
puts("Usage: digtest n_start n_end (digtest 0 7)\n");
return 0;
}
start = simple_strtol (argv[1], NULL, 10);
end = simple_strtol (argv[2], NULL, 10);
/*
* Enable digital outputs
*/
*digen = 0x08;
printf("\nStarting digital In-/Out Test from I/O %d to %d (Cntrl-C to abort)...\n",
start, end);
/*
* Set outputs one by one
*/
for (;;) {
for (i=start; i<=end; i++) {
*digout = 0x0001 << i;
for (k=0; k<200; k++)
udelay(1000);
if (*digin != (0x0001 << i)) {
printf("ERROR: OUT=0x%04X, IN=0x%04X\n", 0x0001 << i, *digin);
return 0;
}
/* Abort if ctrl-c was pressed */
if (ctrlc()) {
puts("\nAbort\n");
return 0;
}
}
}
return 0;
}
U_BOOT_CMD(
digtest, 3, 1, do_digtest,
"digtest - Test digital in-/output\n",
NULL
);
#define ERROR_DELTA 256
struct io {
volatile short val;
short dummy;
};
int do_anatest(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
volatile short val;
int i;
int volt;
struct io *out;
struct io *in;
out = (struct io *)0xf0300090;
in = (struct io *)0xf0300000;
i = simple_strtol (argv[1], NULL, 10);
volt = 0;
printf("Setting Channel %d to %dV...\n", i, volt);
out[i].val = (volt * 0x7fff) / 10;
udelay(10000);
val = in[i*2].val;
printf("-> InChannel %d: 0x%04x=%dV\n", i*2, val, (val * 4000) / 0x7fff);
if ((val < ((volt * 0x7fff) / 40) - ERROR_DELTA) ||
(val > ((volt * 0x7fff) / 40) + ERROR_DELTA)) {
printf("ERROR! (min=0x%04x max=0x%04x)\n", ((volt * 0x7fff) / 40) - ERROR_DELTA,
((volt * 0x7fff) / 40) + ERROR_DELTA);
return -1;
}
val = in[i*2+1].val;
printf("-> InChannel %d: 0x%04x=%dV\n", i*2+1, val, (val * 4000) / 0x7fff);
if ((val < ((volt * 0x7fff) / 40) - ERROR_DELTA) ||
(val > ((volt * 0x7fff) / 40) + ERROR_DELTA)) {
printf("ERROR! (min=0x%04x max=0x%04x)\n", ((volt * 0x7fff) / 40) - ERROR_DELTA,
((volt * 0x7fff) / 40) + ERROR_DELTA);
return -1;
}
volt = 5;
printf("Setting Channel %d to %dV...\n", i, volt);
out[i].val = (volt * 0x7fff) / 10;
udelay(10000);
val = in[i*2].val;
printf("-> InChannel %d: 0x%04x=%dV\n", i*2, val, (val * 4000) / 0x7fff);
if ((val < ((volt * 0x7fff) / 40) - ERROR_DELTA) ||
(val > ((volt * 0x7fff) / 40) + ERROR_DELTA)) {
printf("ERROR! (min=0x%04x max=0x%04x)\n", ((volt * 0x7fff) / 40) - ERROR_DELTA,
((volt * 0x7fff) / 40) + ERROR_DELTA);
return -1;
}
val = in[i*2+1].val;
printf("-> InChannel %d: 0x%04x=%dV\n", i*2+1, val, (val * 4000) / 0x7fff);
if ((val < ((volt * 0x7fff) / 40) - ERROR_DELTA) ||
(val > ((volt * 0x7fff) / 40) + ERROR_DELTA)) {
printf("ERROR! (min=0x%04x max=0x%04x)\n", ((volt * 0x7fff) / 40) - ERROR_DELTA,
((volt * 0x7fff) / 40) + ERROR_DELTA);
return -1;
}
volt = 10;
printf("Setting Channel %d to %dV...\n", i, volt);
out[i].val = (volt * 0x7fff) / 10;
udelay(10000);
val = in[i*2].val;
printf("-> InChannel %d: 0x%04x=%dV\n", i*2, val, (val * 4000) / 0x7fff);
if ((val < ((volt * 0x7fff) / 40) - ERROR_DELTA) ||
(val > ((volt * 0x7fff) / 40) + ERROR_DELTA)) {
printf("ERROR! (min=0x%04x max=0x%04x)\n", ((volt * 0x7fff) / 40) - ERROR_DELTA,
((volt * 0x7fff) / 40) + ERROR_DELTA);
return -1;
}
val = in[i*2+1].val;
printf("-> InChannel %d: 0x%04x=%dV\n", i*2+1, val, (val * 4000) / 0x7fff);
if ((val < ((volt * 0x7fff) / 40) - ERROR_DELTA) ||
(val > ((volt * 0x7fff) / 40) + ERROR_DELTA)) {
printf("ERROR! (min=0x%04x max=0x%04x)\n", ((volt * 0x7fff) / 40) - ERROR_DELTA,
((volt * 0x7fff) / 40) + ERROR_DELTA);
return -1;
}
printf("Channel %d OK!\n", i);
return 0;
}
U_BOOT_CMD(
anatest, 2, 1, do_anatest,
"anatest - Test analog in-/output\n",
NULL
);
int counter = 0;
void cyclicInt(void *ptr)
{
*(ushort *)0xf03000e8 = 0x0800; /* ack int */
counter++;
}
int do_inctest(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
volatile uchar *digout = (volatile uchar *)0xf03000b4;
volatile ulong *incin;
int i;
incin = (volatile ulong *)0xf0300040;
/*
* Clear inc counter
*/
incin[0] = 0;
incin[1] = 0;
incin[2] = 0;
incin[3] = 0;
incin = (volatile ulong *)0xf0300050;
/*
* Inc a little
*/
for (i=0; i<10000; i++) {
switch (i & 0x03) {
case 0:
*digout = 0x02;
break;
case 1:
*digout = 0x03;
break;
case 2:
*digout = 0x01;
break;
case 3:
*digout = 0x00;
break;
}
udelay(10);
}
printf("Inc 0 = %ld\n", incin[0]);
printf("Inc 1 = %ld\n", incin[1]);
printf("Inc 2 = %ld\n", incin[2]);
printf("Inc 3 = %ld\n", incin[3]);
*(ushort *)0xf03000e0 = 0x0c80-1; /* set counter */
*(ushort *)0xf03000ec |= 0x0800; /* enable int */
irq_install_handler (30, (interrupt_handler_t *) cyclicInt, NULL);
printf("counter=%d\n", counter);
return 0;
}
U_BOOT_CMD(
inctest, 3, 1, do_inctest,
"inctest - Test incremental encoder inputs\n",
NULL
);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -83,7 +83,10 @@ SECTIONS
common/lists.o (.text)
common/main.o (.text)
. = env_offset;
/*
. = DEFINED(env_offset) ? env_offset : .;
common/environment.o (.ppcenv)
*/
common/environment.o (.text)
*(.text)

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o
OBJS = $(BOARD).o flash.o ../common/misc.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o
OBJS = $(BOARD).o flash.o ../common/misc.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)

View File

@@ -0,0 +1,537 @@
/*
* (C) Copyright 2003-2004
* Gary Jennejohn, DENX Software Engineering, gj@denx.de.
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <command.h>
#include <image.h>
#include <asm/byteorder.h>
#include <linux/mtd/nand.h>
#include <fat.h>
#include "auto_update.h"
#ifdef CONFIG_AUTO_UPDATE
#if !(CONFIG_COMMANDS & CFG_CMD_FAT)
#error "must define CFG_CMD_FAT"
#endif
extern au_image_t au_image[];
extern int N_AU_IMAGES;
#define AU_DEBUG
#undef AU_DEBUG
#undef debug
#ifdef AU_DEBUG
#define debug(fmt,args...) printf (fmt ,##args)
#else
#define debug(fmt,args...)
#endif /* AU_DEBUG */
#define LOAD_ADDR ((unsigned char *)0x100000) /* where to load files into memory */
#define MAX_LOADSZ 0x1e00000
/* externals */
extern int fat_register_device(block_dev_desc_t *, int);
extern int file_fat_detectfs(void);
extern long file_fat_read(const char *, void *, unsigned long);
long do_fat_read (const char *filename, void *buffer, unsigned long maxsize, int dols);
#ifdef CONFIG_VFD
extern int trab_vfd (ulong);
extern int transfer_pic(unsigned char, unsigned char *, int, int);
#endif
extern int flash_sect_erase(ulong, ulong);
extern int flash_sect_protect (int, ulong, ulong);
extern int flash_write (uchar *, ulong, ulong);
/* change char* to void* to shutup the compiler */
extern block_dev_desc_t *get_dev (char*, int);
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
/* references to names in cmd_nand.c */
#define NANDRW_READ 0x01
#define NANDRW_WRITE 0x00
#define NANDRW_JFFS2 0x02
#define NANDRW_JFFS2_SKIP 0x04
extern struct nand_chip nand_dev_desc[];
extern int nand_rw(struct nand_chip* nand, int cmd, size_t start, size_t len,
size_t * retlen, u_char * buf);
extern int nand_erase(struct nand_chip* nand, size_t ofs, size_t len, int clean);
#endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */
extern block_dev_desc_t ide_dev_desc[CFG_IDE_MAXDEVICE];
int au_check_cksum_valid(int i, long nbytes)
{
image_header_t *hdr;
unsigned long checksum;
hdr = (image_header_t *)LOAD_ADDR;
if ((au_image[i].type == AU_FIRMWARE) && (au_image[i].size != ntohl(hdr->ih_size))) {
printf ("Image %s has wrong size\n", au_image[i].name);
return -1;
}
if (nbytes != (sizeof(*hdr) + ntohl(hdr->ih_size))) {
printf ("Image %s bad total SIZE\n", au_image[i].name);
return -1;
}
/* check the data CRC */
checksum = ntohl(hdr->ih_dcrc);
if (crc32 (0, (char *)(LOAD_ADDR + sizeof(*hdr)), ntohl(hdr->ih_size))
!= checksum) {
printf ("Image %s bad data checksum\n", au_image[i].name);
return -1;
}
return 0;
}
int au_check_header_valid(int i, long nbytes)
{
image_header_t *hdr;
unsigned long checksum;
hdr = (image_header_t *)LOAD_ADDR;
/* check the easy ones first */
#undef CHECK_VALID_DEBUG
#ifdef CHECK_VALID_DEBUG
printf("magic %#x %#x ", ntohl(hdr->ih_magic), IH_MAGIC);
printf("arch %#x %#x ", hdr->ih_arch, IH_CPU_PPC);
printf("size %#x %#lx ", ntohl(hdr->ih_size), nbytes);
printf("type %#x %#x ", hdr->ih_type, IH_TYPE_KERNEL);
#endif
if (nbytes < sizeof(*hdr))
{
printf ("Image %s bad header SIZE\n", au_image[i].name);
return -1;
}
if (ntohl(hdr->ih_magic) != IH_MAGIC || hdr->ih_arch != IH_CPU_PPC)
{
printf ("Image %s bad MAGIC or ARCH\n", au_image[i].name);
return -1;
}
/* check the hdr CRC */
checksum = ntohl(hdr->ih_hcrc);
hdr->ih_hcrc = 0;
if (crc32 (0, (char *)hdr, sizeof(*hdr)) != checksum) {
printf ("Image %s bad header checksum\n", au_image[i].name);
return -1;
}
hdr->ih_hcrc = htonl(checksum);
/* check the type - could do this all in one gigantic if() */
if ((au_image[i].type == AU_FIRMWARE) && (hdr->ih_type != IH_TYPE_FIRMWARE)) {
printf ("Image %s wrong type\n", au_image[i].name);
return -1;
}
if ((au_image[i].type == AU_SCRIPT) && (hdr->ih_type != IH_TYPE_SCRIPT)) {
printf ("Image %s wrong type\n", au_image[i].name);
return -1;
}
/* recycle checksum */
checksum = ntohl(hdr->ih_size);
#if 0 /* test-only */
/* for kernel and app the image header must also fit into flash */
if (idx != IDX_DISK)
checksum += sizeof(*hdr);
/* check the size does not exceed space in flash. HUSH scripts */
/* all have ausize[] set to 0 */
if ((ausize[idx] != 0) && (ausize[idx] < checksum)) {
printf ("Image %s is bigger than FLASH\n", au_image[i].name);
return -1;
}
#endif
return 0;
}
int au_do_update(int i, long sz)
{
image_header_t *hdr;
char *addr;
long start, end;
int off, rc;
uint nbytes;
int k;
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
int total;
#endif
hdr = (image_header_t *)LOAD_ADDR;
switch (au_image[i].type) {
case AU_SCRIPT:
printf("Executing script %s\n", au_image[i].name);
/* execute a script */
if (hdr->ih_type == IH_TYPE_SCRIPT) {
addr = (char *)((char *)hdr + sizeof(*hdr));
/* stick a NULL at the end of the script, otherwise */
/* parse_string_outer() runs off the end. */
addr[ntohl(hdr->ih_size)] = 0;
addr += 8;
/*
* Replace cr/lf with ;
*/
k = 0;
while (addr[k] != 0) {
if ((addr[k] == 10) || (addr[k] == 13)) {
addr[k] = ';';
}
k++;
}
run_command(addr, 0);
return 0;
}
break;
case AU_FIRMWARE:
case AU_NOR:
case AU_NAND:
start = au_image[i].start;
end = au_image[i].start + au_image[i].size - 1;
/* unprotect the address range */
/* this assumes that ONLY the firmware is protected! */
if (au_image[i].type == AU_FIRMWARE) {
flash_sect_protect(0, start, end);
}
/*
* erase the address range.
*/
if (au_image[i].type != AU_NAND) {
printf("Updating NOR FLASH with image %s\n", au_image[i].name);
debug ("flash_sect_erase(%lx, %lx);\n", start, end);
flash_sect_erase(start, end);
} else {
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
printf("Updating NAND FLASH with image %s\n", au_image[i].name);
debug ("nand_erase(%lx, %lx);\n", start, end);
rc = nand_erase (nand_dev_desc, start, end - start + 1, 0);
debug ("nand_erase returned %x\n", rc);
#endif
}
udelay(10000);
/* strip the header - except for the kernel and ramdisk */
if (au_image[i].type != AU_FIRMWARE) {
addr = (char *)hdr;
off = sizeof(*hdr);
nbytes = sizeof(*hdr) + ntohl(hdr->ih_size);
} else {
addr = (char *)((char *)hdr + sizeof(*hdr));
off = 0;
nbytes = ntohl(hdr->ih_size);
}
/*
* copy the data from RAM to FLASH
*/
if (au_image[i].type != AU_NAND) {
debug ("flash_write(%p, %lx %x)\n", addr, start, nbytes);
rc = flash_write(addr, start, nbytes);
} else {
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
debug ("nand_rw(%p, %lx %x)\n", addr, start, nbytes);
rc = nand_rw(nand_dev_desc, NANDRW_WRITE | NANDRW_JFFS2,
start, nbytes, &total, addr);
debug ("nand_rw: ret=%x total=%d nbytes=%d\n", rc, total, nbytes);
#endif
}
if (rc != 0) {
printf("Flashing failed due to error %d\n", rc);
return -1;
}
/*
* check the dcrc of the copy
*/
if (au_image[i].type != AU_NAND) {
rc = crc32 (0, (char *)(start + off), ntohl(hdr->ih_size));
} else {
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
rc = nand_rw(nand_dev_desc, NANDRW_READ | NANDRW_JFFS2 | NANDRW_JFFS2_SKIP,
start, nbytes, &total, addr);
rc = crc32 (0, (char *)(addr + off), ntohl(hdr->ih_size));
#endif
}
if (rc != ntohl(hdr->ih_dcrc)) {
printf ("Image %s Bad Data Checksum After COPY\n", au_image[i].name);
return -1;
}
/* protect the address range */
/* this assumes that ONLY the firmware is protected! */
if (au_image[i].type == AU_FIRMWARE) {
flash_sect_protect(1, start, end);
}
break;
default:
printf("Wrong image type selected!\n");
}
return 0;
}
static void process_macros (const char *input, char *output)
{
char c, prev;
const char *varname_start = NULL;
int inputcnt = strlen (input);
int outputcnt = CFG_CBSIZE;
int state = 0; /* 0 = waiting for '$' */
/* 1 = waiting for '(' or '{' */
/* 2 = waiting for ')' or '}' */
/* 3 = waiting for ''' */
#ifdef DEBUG_PARSER
char *output_start = output;
printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n", strlen(input), input);
#endif
prev = '\0'; /* previous character */
while (inputcnt && outputcnt) {
c = *input++;
inputcnt--;
if (state!=3) {
/* remove one level of escape characters */
if ((c == '\\') && (prev != '\\')) {
if (inputcnt-- == 0)
break;
prev = c;
c = *input++;
}
}
switch (state) {
case 0: /* Waiting for (unescaped) $ */
if ((c == '\'') && (prev != '\\')) {
state = 3;
break;
}
if ((c == '$') && (prev != '\\')) {
state++;
} else {
*(output++) = c;
outputcnt--;
}
break;
case 1: /* Waiting for ( */
if (c == '(' || c == '{') {
state++;
varname_start = input;
} else {
state = 0;
*(output++) = '$';
outputcnt--;
if (outputcnt) {
*(output++) = c;
outputcnt--;
}
}
break;
case 2: /* Waiting for ) */
if (c == ')' || c == '}') {
int i;
char envname[CFG_CBSIZE], *envval;
int envcnt = input-varname_start-1; /* Varname # of chars */
/* Get the varname */
for (i = 0; i < envcnt; i++) {
envname[i] = varname_start[i];
}
envname[i] = 0;
/* Get its value */
envval = getenv (envname);
/* Copy into the line if it exists */
if (envval != NULL)
while ((*envval) && outputcnt) {
*(output++) = *(envval++);
outputcnt--;
}
/* Look for another '$' */
state = 0;
}
break;
case 3: /* Waiting for ' */
if ((c == '\'') && (prev != '\\')) {
state = 0;
} else {
*(output++) = c;
outputcnt--;
}
break;
}
prev = c;
}
if (outputcnt)
*output = 0;
#ifdef DEBUG_PARSER
printf ("[PROCESS_MACROS] OUTPUT len %d: \"%s\"\n",
strlen(output_start), output_start);
#endif
}
/*
* this is called from board_init() after the hardware has been set up
* and is usable. That seems like a good time to do this.
* Right now the return value is ignored.
*/
int do_auto_update(void)
{
block_dev_desc_t *stor_dev;
long sz;
int i, res, cnt, old_ctrlc, got_ctrlc;
char buffer[32];
char str[80];
/*
* Check whether a CompactFlash is inserted
*/
if (ide_dev_desc[0].type == DEV_TYPE_UNKNOWN) {
return -1; /* no disk detected! */
}
/* check whether it has a partition table */
stor_dev = get_dev("ide", 0);
if (stor_dev == NULL) {
debug ("Uknown device type\n");
return -1;
}
if (fat_register_device(stor_dev, 1) != 0) {
debug ("Unable to register ide disk 0:1 for fatls\n");
return -1;
}
/*
* Check if magic file is present
*/
if (do_fat_read(AU_MAGIC_FILE, buffer, sizeof(buffer), LS_NO) <= 0) {
return -1;
}
#ifdef CONFIG_AUTO_UPDATE_SHOW
board_auto_update_show(1);
#endif
puts("\nAutoUpdate Disk detected! Trying to update system...\n");
/* make sure that we see CTRL-C and save the old state */
old_ctrlc = disable_ctrlc(0);
/* just loop thru all the possible files */
for (i = 0; i < N_AU_IMAGES; i++) {
/*
* Try to expand the environment var in the fname
*/
process_macros(au_image[i].name, str);
strcpy(au_image[i].name, str);
printf("Reading %s ...", au_image[i].name);
/* just read the header */
sz = do_fat_read(au_image[i].name, LOAD_ADDR, sizeof(image_header_t), LS_NO);
debug ("read %s sz %ld hdr %d\n",
au_image[i].name, sz, sizeof(image_header_t));
if (sz <= 0 || sz < sizeof(image_header_t)) {
puts(" not found\n");
continue;
}
if (au_check_header_valid(i, sz) < 0) {
puts(" header not valid\n");
continue;
}
sz = do_fat_read(au_image[i].name, LOAD_ADDR, MAX_LOADSZ, LS_NO);
debug ("read %s sz %ld hdr %d\n",
au_image[i].name, sz, sizeof(image_header_t));
if (sz <= 0 || sz <= sizeof(image_header_t)) {
puts(" not found\n");
continue;
}
if (au_check_cksum_valid(i, sz) < 0) {
puts(" checksum not valid\n");
continue;
}
puts(" done\n");
do {
res = au_do_update(i, sz);
/* let the user break out of the loop */
if (ctrlc() || had_ctrlc()) {
clear_ctrlc();
if (res < 0)
got_ctrlc = 1;
break;
}
cnt++;
} while (res < 0);
}
/* restore the old state */
disable_ctrlc(old_ctrlc);
puts("AutoUpdate finished\n\n");
#ifdef CONFIG_AUTO_UPDATE_SHOW
board_auto_update_show(0);
#endif
return 0;
}
int auto_update(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
do_auto_update();
return 0;
}
U_BOOT_CMD(
autoupd, 1, 1, auto_update,
"autoupd - Automatically update images\n",
NULL
);
#endif /* CONFIG_AUTO_UPDATE */

View File

@@ -0,0 +1,51 @@
/*
* (C) Copyright 2004
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#ifndef _AUTO_UPDATE_H_
#define _AUTO_UPDATE_H_
#define MBR_MAGIC 0x07081967
#define MBR_MAGIC_ADDR 0x100 /* offset 0x100 should be free space */
#define AU_MAGIC_FILE "__auto_update"
#define AU_SCRIPT 1
#define AU_FIRMWARE 2
#define AU_NOR 3
#define AU_NAND 4
struct au_image_s {
char name[80];
ulong start;
ulong size;
int type;
};
typedef struct au_image_s au_image_t;
int do_auto_update(void);
#ifdef CONFIG_AUTO_UPDATE_SHOW
void board_auto_update_show(int au_active);
#endif
#endif /* #ifndef _AUTO_UPDATE_H_ */

View File

@@ -117,6 +117,7 @@ void flash_print_info (flash_info_t *info)
case FLASH_MAN_AMD: printf ("AMD "); break;
case FLASH_MAN_FUJ: printf ("FUJITSU "); break;
case FLASH_MAN_SST: printf ("SST "); break;
case FLASH_MAN_EXCEL: printf ("Excel Semiconductor "); break;
default: printf ("Unknown Vendor "); break;
}
@@ -151,6 +152,10 @@ void flash_print_info (flash_info_t *info)
break;
case FLASH_SST160A: printf ("SST39LF/VF160 (16 Mbit, uniform sector size)\n");
break;
case FLASH_SST320: printf ("SST39LF/VF320 (32 Mbit, uniform sector size)\n");
break;
case FLASH_SST640: printf ("SST39LF/VF640 (64 Mbit, uniform sector size)\n");
break;
default: printf ("Unknown Chip Type\n");
break;
}
@@ -235,6 +240,9 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
case (CFG_FLASH_WORD_SIZE)SST_MANUFACT:
info->flash_id = FLASH_MAN_SST;
break;
case (CFG_FLASH_WORD_SIZE)EXCEL_MANUFACT:
info->flash_id = FLASH_MAN_EXCEL;
break;
default:
info->flash_id = FLASH_UNKNOWN;
info->sector_count = 0;
@@ -316,6 +324,7 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
info->sector_count = 128;
info->size = 0x00800000; break; /* => 8 MB */
#if !(defined(CONFIG_ADCIOP) || defined(CONFIG_DASA_SIM))
case (CFG_FLASH_WORD_SIZE)SST_ID_xF800A:
info->flash_id += FLASH_SST800A;
info->sector_count = 16;
@@ -323,11 +332,28 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
break; /* => 1 MB */
case (CFG_FLASH_WORD_SIZE)SST_ID_xF160A:
case (CFG_FLASH_WORD_SIZE)SST_ID_xF1601:
case (CFG_FLASH_WORD_SIZE)SST_ID_xF1602:
info->flash_id += FLASH_SST160A;
info->sector_count = 32;
info->size = 0x00200000;
break; /* => 2 MB */
case (CFG_FLASH_WORD_SIZE)SST_ID_xF3201:
case (CFG_FLASH_WORD_SIZE)SST_ID_xF3202:
info->flash_id += FLASH_SST320;
info->sector_count = 64;
info->size = 0x00400000;
break; /* => 4 MB */
case (CFG_FLASH_WORD_SIZE)SST_ID_xF6401:
case (CFG_FLASH_WORD_SIZE)SST_ID_xF6402:
info->flash_id += FLASH_SST640;
info->sector_count = 128;
info->size = 0x00800000;
break; /* => 8 MB */
#endif
default:
info->flash_id = FLASH_UNKNOWN;
return (0); /* => no or unknown flash */
@@ -397,7 +423,7 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
/* read sector protection at sector address, (A7 .. A0) = 0x02 */
/* D0 = 1 if protected */
addr2 = (volatile CFG_FLASH_WORD_SIZE *)(info->start[i]);
if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST)
if ((info->flash_id & FLASH_VENDMASK) != FLASH_MAN_AMD)
info->protect[i] = 0;
else
info->protect[i] = addr2[CFG_FLASH_READ2] & 1;
@@ -610,10 +636,10 @@ static int write_word (flash_info_t *info, ulong dest, ulong data)
int i;
/* Check if Flash is (sufficiently) erased */
if ((*((volatile CFG_FLASH_WORD_SIZE *)dest) &
(CFG_FLASH_WORD_SIZE)data) != (CFG_FLASH_WORD_SIZE)data) {
if ((*((vu_long *)dest) & data) != data) {
return (2);
}
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts();

View File

@@ -1,5 +1,5 @@
/*
* (C) Copyright 2001-2003
* (C) Copyright 2001-2004
* Matthias Fuchs, esd gmbh germany, matthias.fuchs@esd-electronics.com
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
@@ -54,19 +54,42 @@
#define ERROR_FPGA_PRG_INIT_HIGH -2 /* Timeout after PRG* deasserted */
#define ERROR_FPGA_PRG_DONE -3 /* Timeout after programming */
#define SET_FPGA(data) out32(GPIO0_OR, data)
#ifndef SET_FPGA
# define SET_FPGA(data) out32(GPIO0_OR, data)
#endif
#define FPGA_WRITE_1 { \
SET_FPGA(FPGA_PRG | FPGA_DATA); /* set clock to 0 */ \
SET_FPGA(FPGA_PRG | FPGA_DATA); /* set data to 1 */ \
SET_FPGA(FPGA_PRG | FPGA_CLK | FPGA_DATA); /* set clock to 1 */ \
SET_FPGA(FPGA_PRG | FPGA_CLK | FPGA_DATA);} /* set data to 1 */
#ifdef FPGA_PROG_ACTIVE_HIGH
# define FPGA_PRG_LOW FPGA_PRG
# define FPGA_PRG_HIGH 0
#else
# define FPGA_PRG_LOW 0
# define FPGA_PRG_HIGH FPGA_PRG
#endif
#define FPGA_CLK_LOW 0
#define FPGA_CLK_HIGH FPGA_CLK
#define FPGA_DATA_LOW 0
#define FPGA_DATA_HIGH FPGA_DATA
#define FPGA_WRITE_1 { \
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_LOW | FPGA_DATA_HIGH); /* set clock to 0 */ \
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_LOW | FPGA_DATA_HIGH); /* set data to 1 */ \
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_HIGH | FPGA_DATA_HIGH); /* set clock to 1 */ \
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_HIGH | FPGA_DATA_HIGH);} /* set data to 1 */
#define FPGA_WRITE_0 { \
SET_FPGA(FPGA_PRG | FPGA_DATA); /* set clock to 0 */ \
SET_FPGA(FPGA_PRG); /* set data to 0 */ \
SET_FPGA(FPGA_PRG | FPGA_CLK); /* set clock to 1 */ \
SET_FPGA(FPGA_PRG | FPGA_CLK | FPGA_DATA);} /* set data to 1 */
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_LOW | FPGA_DATA_HIGH); /* set clock to 0 */ \
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_LOW | FPGA_DATA_LOW); /* set data to 0 */ \
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_HIGH | FPGA_DATA_LOW); /* set clock to 1 */ \
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_HIGH | FPGA_DATA_HIGH);} /* set data to 1 */
#ifndef FPGA_DONE_STATE
# define FPGA_DONE_STATE (in32(GPIO0_IR) & FPGA_DONE)
#endif
#ifndef FPGA_INIT_STATE
# define FPGA_INIT_STATE (in32(GPIO0_IR) & FPGA_INIT)
#endif
static int fpga_boot(unsigned char *fpgadata, int size)
@@ -115,21 +138,23 @@ static int fpga_boot(unsigned char *fpgadata, int size)
/*
* Setup port pins for fpga programming
*/
#ifndef CONFIG_M5249
out32(GPIO0_ODR, 0x00000000); /* no open drain pins */
out32(GPIO0_TCR, in32(GPIO0_TCR) | FPGA_PRG | FPGA_CLK | FPGA_DATA); /* setup for output */
out32(GPIO0_OR, in32(GPIO0_OR) | FPGA_PRG | FPGA_CLK | FPGA_DATA); /* set pins to high */
#endif
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_HIGH | FPGA_DATA_HIGH); /* set pins to high */
DBG("%s, ",((in32(GPIO0_IR) & FPGA_DONE) == 0) ? "NOT DONE" : "DONE" );
DBG("%s\n",((in32(GPIO0_IR) & FPGA_INIT) == 0) ? "NOT INIT" : "INIT" );
DBG("%s, ",(FPGA_DONE_STATE == 0) ? "NOT DONE" : "DONE" );
DBG("%s\n",(FPGA_INIT_STATE == 0) ? "NOT INIT" : "INIT" );
/*
* Init fpga by asserting and deasserting PROGRAM*
*/
SET_FPGA(FPGA_CLK | FPGA_DATA);
SET_FPGA(FPGA_PRG_LOW | FPGA_CLK_HIGH | FPGA_DATA_HIGH); /* set prog active */
/* Wait for FPGA init line low */
count = 0;
while (in32(GPIO0_IR) & FPGA_INIT)
while (FPGA_INIT_STATE)
{
udelay(1000); /* wait 1ms */
/* Check for timeout - 100us max, so use 3ms */
@@ -140,15 +165,15 @@ static int fpga_boot(unsigned char *fpgadata, int size)
}
}
DBG("%s, ",((in32(GPIO0_IR) & FPGA_DONE) == 0) ? "NOT DONE" : "DONE" );
DBG("%s\n",((in32(GPIO0_IR) & FPGA_INIT) == 0) ? "NOT INIT" : "INIT" );
DBG("%s, ",(FPGA_DONE_STATE == 0) ? "NOT DONE" : "DONE" );
DBG("%s\n",(FPGA_INIT_STATE == 0) ? "NOT INIT" : "INIT" );
/* deassert PROGRAM* */
SET_FPGA(FPGA_PRG | FPGA_CLK | FPGA_DATA);
SET_FPGA(FPGA_PRG_HIGH | FPGA_CLK_HIGH | FPGA_DATA_HIGH); /* set prog inactive */
/* Wait for FPGA end of init period . */
count = 0;
while (!(in32(GPIO0_IR) & FPGA_INIT))
while (!(FPGA_INIT_STATE))
{
udelay(1000); /* wait 1ms */
/* Check for timeout */
@@ -159,8 +184,8 @@ static int fpga_boot(unsigned char *fpgadata, int size)
}
}
DBG("%s, ",((in32(GPIO0_IR) & FPGA_DONE) == 0) ? "NOT DONE" : "DONE" );
DBG("%s\n",((in32(GPIO0_IR) & FPGA_INIT) == 0) ? "NOT INIT" : "INIT" );
DBG("%s, ",(FPGA_DONE_STATE == 0) ? "NOT DONE" : "DONE" );
DBG("%s\n",(FPGA_INIT_STATE == 0) ? "NOT INIT" : "INIT" );
DBG("write configuration data into fpga\n");
/* write configuration-data into fpga... */
@@ -232,8 +257,8 @@ static int fpga_boot(unsigned char *fpgadata, int size)
}
#endif
DBG("%s, ",((in32(GPIO0_IR) & FPGA_DONE) == 0) ? "NOT DONE" : "DONE" );
DBG("%s\n",((in32(GPIO0_IR) & FPGA_INIT) == 0) ? "NOT INIT" : "INIT" );
DBG("%s, ",(FPGA_DONE_STATE == 0) ? "NOT DONE" : "DONE" );
DBG("%s\n",(FPGA_INIT_STATE == 0) ? "NOT INIT" : "INIT" );
/*
* Check if fpga's DONE signal - correctly booted ?
@@ -241,7 +266,7 @@ static int fpga_boot(unsigned char *fpgadata, int size)
/* Wait for FPGA end of programming period . */
count = 0;
while (!(in32(GPIO0_IR) & FPGA_DONE))
while (!(FPGA_DONE_STATE))
{
udelay(1000); /* wait 1ms */
/* Check for timeout */

230
board/esd/common/lcd.c Normal file
View File

@@ -0,0 +1,230 @@
/*
* (C) Copyright 2003-2004
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include "lcd.h"
int palette_index;
int palette_value;
#ifdef CFG_LCD_ENDIAN
void lcd_setup(int lcd, int config)
{
if (lcd == 0) {
/*
* Set endianess and reset lcd controller 0 (small)
*/
out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_LCD0_RST); /* set reset to low */
udelay(10); /* wait 10us */
if (config == 1) {
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_LCD_ENDIAN); /* big-endian */
} else {
out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_LCD_ENDIAN); /* little-endian */
}
udelay(10); /* wait 10us */
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_LCD0_RST); /* set reset to high */
} else {
/*
* Set endianess and reset lcd controller 1 (big)
*/
out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_LCD1_RST); /* set reset to low */
udelay(10); /* wait 10us */
if (config == 1) {
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_LCD_ENDIAN); /* big-endian */
} else {
out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_LCD_ENDIAN); /* little-endian */
}
udelay(10); /* wait 10us */
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_LCD1_RST); /* set reset to high */
}
/*
* CFG_LCD_ENDIAN may also be FPGA_RESET, so set inactive
*/
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_LCD_ENDIAN); /* set reset high again */
}
#endif /* #ifdef CFG_LCD_ENDIAN */
void lcd_init(uchar *lcd_reg, uchar *lcd_mem, S1D_REGS *regs, int reg_count,
uchar *logo_bmp, ulong len)
{
int i;
ushort s1dReg;
uchar s1dValue;
uchar *ptr;
ushort *ptr2;
ushort val;
unsigned char *dst;
int x, y;
int width, height, bpp, colors, line_size;
int header_size;
unsigned char *bmp;
unsigned char r, g, b;
BITMAPINFOHEADER *bm_info;
int reg_byte_swap;
/*
* Detect epson
*/
if (lcd_reg[0] == 0x1c) {
/*
* Big epson detected
*/
reg_byte_swap = FALSE;
palette_index = 0x1e2;
palette_value = 0x1e4;
puts("LCD: S1D13806");
} else if (lcd_reg[1] == 0x1c) {
/*
* Big epson detected (with register swap bug)
*/
reg_byte_swap = TRUE;
palette_index = 0x1e3;
palette_value = 0x1e5;
puts("LCD: S1D13806S");
} else if (lcd_reg[0] == 0x18) {
/*
* Small epson detected (704)
*/
reg_byte_swap = FALSE;
palette_index = 0x15;
palette_value = 0x17;
puts("LCD: S1D13704");
} else if (lcd_reg[0x10000] == 0x24) {
/*
* Small epson detected (705)
*/
reg_byte_swap = FALSE;
palette_index = 0x15;
palette_value = 0x17;
lcd_reg += 0x10000; /* add offset for 705 regs */
puts("LCD: S1D13705");
} else {
puts("LCD: No controller detected!\n");
return;
}
for (i = 0; i<reg_count; i++) {
s1dReg = regs[i].Index;
if (reg_byte_swap) {
if ((s1dReg & 0x0001) == 0)
s1dReg |= 0x0001;
else
s1dReg &= ~0x0001;
}
s1dValue = regs[i].Value;
lcd_reg[s1dReg] = s1dValue;
}
/*
* Decompress bmp image
*/
dst = malloc(CFG_LCD_LOGO_MAX_SIZE);
if (gunzip(dst, CFG_LCD_LOGO_MAX_SIZE, (uchar *)logo_bmp, &len) != 0) {
return;
}
/*
* Check for bmp mark 'BM'
*/
if (*(ushort *)dst != 0x424d) {
printf("LCD: Unknown image format!\n");
free(dst);
return;
}
/*
* Get image info from bmp-header
*/
bm_info = (BITMAPINFOHEADER *)(dst + 14);
bpp = LOAD_SHORT(bm_info->biBitCount);
width = LOAD_LONG(bm_info->biWidth);
height = LOAD_LONG(bm_info->biHeight);
switch (bpp) {
case 1:
colors = 1;
line_size = width >> 3;
break;
case 4:
colors = 16;
line_size = width >> 1;
break;
case 8:
colors = 256;
line_size = width;
break;
case 24:
colors = 0;
line_size = width * 3;
break;
default:
printf("LCD: Unknown bpp (%d) im image!\n", bpp);
free(dst);
return;
}
printf(" (%d*%d, %dbpp)\n", width, height, bpp);
/*
* Write color palette
*/
if (colors <= 256) {
ptr = (unsigned char *)(dst + 14 + 40);
for (i=0; i<colors; i++) {
b = *ptr++;
g = *ptr++;
r = *ptr++;
ptr++;
S1D_WRITE_PALETTE(lcd_reg, i, r, g, b);
}
}
/*
* Write bitmap data into framebuffer
*/
ptr = lcd_mem;
ptr2 = (ushort *)lcd_mem;
header_size = 14 + 40 + 4*colors; /* skip bmp header */
for (y=0; y<height; y++) {
bmp = &dst[(height-1-y)*line_size + header_size];
if (bpp == 24) {
for (x=0; x<width; x++) {
/*
* Generate epson 16bpp fb-format from 24bpp image
*/
b = *bmp++ >> 3;
g = *bmp++ >> 2;
r = *bmp++ >> 3;
val = ((r & 0x1f) << 11) | ((g & 0x3f) << 5) | (b & 0x1f);
*ptr2++ = val;
}
} else {
for (x=0; x<line_size; x++) {
*ptr++ = *bmp++;
}
}
}
free(dst);
}

70
board/esd/common/lcd.h Normal file
View File

@@ -0,0 +1,70 @@
/*
* (C) Copyright 2003-2004
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* Neutralize little endians.
*/
#define SWAP_LONG(data) ((unsigned long) \
(((unsigned long)(data) >> 24) | \
((unsigned long)(data) << 24) | \
(((unsigned long)(data) >> 8) & 0x0000ff00 ) | \
(((unsigned long)(data) << 8) & 0x00ff0000 )))
#define SWAP_SHORT(data) ((unsigned short) \
(((unsigned short)(data) >> 8 ) | \
((unsigned short)(data) << 8 )))
#define LOAD_LONG(data) SWAP_LONG(data)
#define LOAD_SHORT(data) SWAP_SHORT(data)
#ifndef FALSE
#define FALSE 0
#define TRUE (!FALSE)
#endif
#define S1D_WRITE_PALETTE(p,i,r,g,b) \
{ \
((volatile uchar*)(p))[palette_index] = (uchar)(i); \
((volatile uchar*)(p))[palette_value] = (uchar)(r); \
((volatile uchar*)(p))[palette_value] = (uchar)(g); \
((volatile uchar*)(p))[palette_value] = (uchar)(b); \
}
typedef struct
{
ushort Index;
uchar Value;
} S1D_REGS;
typedef struct /**** BMP file info structure ****/
{
unsigned int biSize; /* Size of info header */
int biWidth; /* Width of image */
int biHeight; /* Height of image */
unsigned short biPlanes; /* Number of color planes */
unsigned short biBitCount; /* Number of bits per pixel */
unsigned int biCompression; /* Type of compression to use */
unsigned int biSizeImage; /* Size of image data */
int biXPelsPerMeter; /* X pixels per meter */
int biYPelsPerMeter; /* Y pixels per meter */
unsigned int biClrUsed; /* Number of colors used */
unsigned int biClrImportant; /* Number of important colors */
} BITMAPINFOHEADER;

View File

@@ -0,0 +1,53 @@
/*
*
* Generic Header information generated by 13704CFG.EXE (Build 10)
*
* Copyright (c) 2000,2001 Epson Research and Development, Inc.
* All rights reserved.
*
* Panel: 320x240x4bpp 78Hz Mono 4-Bit STN, Disabled (PCLK=6.666MHz)
*
* This file defines the configuration environment and registers,
* which can be used by any software, such as display drivers.
*
* PLEASE NOTE: If you FTP this file to a non-Windows platform, make
* sure you transfer this file using ASCII, not BINARY
* mode.
*
*/
static S1D_REGS regs_13704_320_240_4bpp[] =
{
{ 0x00, 0x00 }, /* Revision Code Register */
{ 0x01, 0x04 }, /*00*/ /* Mode Register 0 Register */
{ 0x02, 0xA4 }, /*a0*/ /* Mode Register 1 Register */
{ 0x03, 0x83 }, /*03*/ /* Mode Register 2 Register - bit7 is LUT bypass */
{ 0x04, 0x27 }, /* Horizontal Panel Size Register */
{ 0x05, 0xEF }, /* Vertical Panel Size Register (LSB) */
{ 0x06, 0x00 }, /* Vertical Panel Size Register (MSB) */
{ 0x07, 0x00 }, /* FPLINE Start Position Register */
{ 0x08, 0x00 }, /* Horizontal Non-Display Period Register */
{ 0x09, 0x00 }, /* FPFRAME Start Position Register */
{ 0x0A, 0x02 }, /* Vertical Non-Display Period Register */
{ 0x0B, 0x00 }, /* MOD Rate Register */
{ 0x0C, 0x00 }, /* Screen 1 Start Address Register (LSB) */
{ 0x0D, 0x00 }, /* Screen 1 Start Address Register (MSB) */
{ 0x0E, 0x00 }, /* Not Used */
{ 0x0F, 0x00 }, /* Screen 2 Start Address Register (LSB) */
{ 0x10, 0x00 }, /* Screen 2 Start Address Register (MSB) */
{ 0x11, 0x00 }, /* Not Used */
{ 0x12, 0x00 }, /* Memory Address Offset Register */
{ 0x13, 0xFF }, /* Screen 1 Vertical Size Register (LSB) */
{ 0x14, 0x03 }, /* Screen 1 Vertical Size Register (MSB) */
{ 0x15, 0x00 }, /* Look-Up Table Address Register */
{ 0x16, 0x00 }, /* Look-Up Table Bank Select Register */
{ 0x17, 0x00 }, /* Look-Up Table Data Register */
{ 0x18, 0x01 }, /* GPIO Configuration Control Register */
{ 0x19, 0x01 }, /* GPIO Status/Control Register */
{ 0x1A, 0x00 }, /* Scratch Pad Register */
{ 0x1B, 0x00 }, /* SwivelView Mode Register */
{ 0x1C, 0xA0 }, /* Line Byte Count Register */
{ 0x1D, 0x00 }, /* Not Used */
{ 0x1E, 0x00 }, /* Not Used */
{ 0x1F, 0x00 }, /* Not Used */
};

View File

@@ -0,0 +1,53 @@
/*
*
* Generic Header information generated by 13704CFG.EXE (Build 10)
*
* Copyright (c) 2000,2001 Epson Research and Development, Inc.
* All rights reserved.
*
* Panel: 320x240x8bpp 78Hz Mono 8-Bit STN, Disabled (PCLK=6.666MHz)
*
* This file defines the configuration environment and registers,
* which can be used by any software, such as display drivers.
*
* PLEASE NOTE: If you FTP this file to a non-Windows platform, make
* sure you transfer this file using ASCII, not BINARY
* mode.
*
*/
static S1D_REGS regs_13705_320_240_8bpp[] =
{
{ 0x00, 0x00 }, /* Revision Code Register */
{ 0x01, 0x23 }, /* Mode Register 0 Register */
{ 0x02, 0xE0 }, /* Mode Register 1 Register */
{ 0x03, 0x03 }, /* Mode Register 2 Register - bit7 is LUT bypass */
{ 0x04, 0x27 }, /* Horizontal Panel Size Register */
{ 0x05, 0xEF }, /* Vertical Panel Size Register (LSB) */
{ 0x06, 0x00 }, /* Vertical Panel Size Register (MSB) */
{ 0x07, 0x00 }, /* FPLINE Start Position Register */
{ 0x08, 0x00 }, /* Horizontal Non-Display Period Register */
{ 0x09, 0x01 }, /* FPFRAME Start Position Register */
{ 0x0A, 0x02 }, /* Vertical Non-Display Period Register */
{ 0x0B, 0x00 }, /* MOD Rate Register */
{ 0x0C, 0x00 }, /* Screen 1 Start Address Register (LSB) */
{ 0x0D, 0x00 }, /* Screen 1 Start Address Register (MSB) */
{ 0x0E, 0x00 }, /* Not Used */
{ 0x0F, 0x00 }, /* Screen 2 Start Address Register (LSB) */
{ 0x10, 0x00 }, /* Screen 2 Start Address Register (MSB) */
{ 0x11, 0x00 }, /* Not Used */
{ 0x12, 0x00 }, /* Memory Address Offset Register */
{ 0x13, 0xFF }, /* Screen 1 Vertical Size Register (LSB) */
{ 0x14, 0x03 }, /* Screen 1 Vertical Size Register (MSB) */
{ 0x15, 0x00 }, /* Look-Up Table Address Register */
{ 0x16, 0x00 }, /* Look-Up Table Bank Select Register */
{ 0x17, 0x00 }, /* Look-Up Table Data Register */
{ 0x18, 0x01 }, /* GPIO Configuration Control Register */
{ 0x19, 0x01 }, /* GPIO Status/Control Register */
{ 0x1A, 0x00 }, /* Scratch Pad Register */
{ 0x1B, 0x00 }, /* SwivelView Mode Register */
{ 0x1C, 0xFF }, /* Line Byte Count Register */
{ 0x1D, 0x00 }, /* Not Used */
{ 0x1E, 0x00 }, /* Not Used */
{ 0x1F, 0x00 }, /* Not Used */
};

View File

@@ -0,0 +1,125 @@
/*
*
* File generated by S1D13806CFG.EXE
*
* Copyright (c) 2000,2001 Epson Research and Development, Inc.
* All rights reserved.
*
* PLEASE NOTE: If you FTP this file to a non-Windows platform, make
* sure you transfer this file using ASCII, not BINARY mode.
*
* Panel: (active) 1024x768 34Hz TFT Single 12-bit (PCLK=BUSCLK=33.333MHz)
* Memory: Embedded SDRAM (MCLK=CLKI=49.100MHz) (BUSCLK=33.333MHz)
*
*/
static S1D_REGS regs_13806_1024_768_8bpp[] =
{
{0x0001,0x00}, /* Miscellaneous Register */
{0x01FC,0x00}, /* Display Mode Register */
{0x0004,0x00}, /* General IO Pins Configuration Register 0 */
{0x0005,0x00}, /* General IO Pins Configuration Register 1 */
{0x0008,0x00}, /* General IO Pins Control Register 0 */
{0x0009,0x00}, /* General IO Pins Control Register 1 */
{0x0010,0x00}, /* Memory Clock Configuration Register */
{0x0014,0x01}, /* LCD Pixel Clock Configuration Register */
{0x0018,0x00}, /* CRT/TV Pixel Clock Configuration Register */
{0x001C,0x02}, /* MediaPlug Clock Configuration Register */
{0x001E,0x01}, /* CPU To Memory Wait State Select Register */
{0x0021,0x03}, /* DRAM Refresh Rate Register */
{0x002A,0x00}, /* DRAM Timings Control Register 0 */
{0x002B,0x01}, /* DRAM Timings Control Register 1 */
{0x0020,0x80}, /* Memory Configuration Register */
{0x0030,0x55}, /* Panel Type Register */
{0x0031,0x00}, /* MOD Rate Register */
{0x0032,0x7F}, /* LCD Horizontal Display Width Register */
{0x0034,0x12}, /* LCD Horizontal Non-Display Period Register */
{0x0035,0x01}, /* TFT FPLINE Start Position Register */
{0x0036,0x0B}, /* TFT FPLINE Pulse Width Register */
{0x0038,0xFF}, /* LCD Vertical Display Height Register 0 */
{0x0039,0x02}, /* LCD Vertical Display Height Register 1 */
{0x003A,0x2C}, /* LCD Vertical Non-Display Period Register */
{0x003B,0x0A}, /* TFT FPFRAME Start Position Register */
{0x003C,0x01}, /* TFT FPFRAME Pulse Width Register */
{0x0040,0x03}, /* LCD Display Mode Register */
{0x0041,0x00}, /* LCD Miscellaneous Register */
{0x0042,0x00}, /* LCD Display Start Address Register 0 */
{0x0043,0x00}, /* LCD Display Start Address Register 1 */
{0x0044,0x00}, /* LCD Display Start Address Register 2 */
{0x0046,0x00}, /* LCD Memory Address Offset Register 0 */
{0x0047,0x02}, /* LCD Memory Address Offset Register 1 */
{0x0048,0x00}, /* LCD Pixel Panning Register */
{0x004A,0x00}, /* LCD Display FIFO High Threshold Control Register */
{0x004B,0x00}, /* LCD Display FIFO Low Threshold Control Register */
{0x0050,0x4F}, /* CRT/TV Horizontal Display Width Register */
{0x0052,0x13}, /* CRT/TV Horizontal Non-Display Period Register */
{0x0053,0x01}, /* CRT/TV HRTC Start Position Register */
{0x0054,0x0B}, /* CRT/TV HRTC Pulse Width Register */
{0x0056,0xDF}, /* CRT/TV Vertical Display Height Register 0 */
{0x0057,0x01}, /* CRT/TV Vertical Display Height Register 1 */
{0x0058,0x2B}, /* CRT/TV Vertical Non-Display Period Register */
{0x0059,0x09}, /* CRT/TV VRTC Start Position Register */
{0x005A,0x01}, /* CRT/TV VRTC Pulse Width Register */
{0x005B,0x10}, /* TV Output Control Register */
{0x0060,0x03}, /* CRT/TV Display Mode Register */
{0x0062,0x00}, /* CRT/TV Display Start Address Register 0 */
{0x0063,0x00}, /* CRT/TV Display Start Address Register 1 */
{0x0064,0x00}, /* CRT/TV Display Start Address Register 2 */
{0x0066,0x40}, /* CRT/TV Memory Address Offset Register 0 */
{0x0067,0x01}, /* CRT/TV Memory Address Offset Register 1 */
{0x0068,0x00}, /* CRT/TV Pixel Panning Register */
{0x006A,0x00}, /* CRT/TV Display FIFO High Threshold Control Register */
{0x006B,0x00}, /* CRT/TV Display FIFO Low Threshold Control Register */
{0x0070,0x00}, /* LCD Ink/Cursor Control Register */
{0x0071,0x01}, /* LCD Ink/Cursor Start Address Register */
{0x0072,0x00}, /* LCD Cursor X Position Register 0 */
{0x0073,0x00}, /* LCD Cursor X Position Register 1 */
{0x0074,0x00}, /* LCD Cursor Y Position Register 0 */
{0x0075,0x00}, /* LCD Cursor Y Position Register 1 */
{0x0076,0x00}, /* LCD Ink/Cursor Blue Color 0 Register */
{0x0077,0x00}, /* LCD Ink/Cursor Green Color 0 Register */
{0x0078,0x00}, /* LCD Ink/Cursor Red Color 0 Register */
{0x007A,0x1F}, /* LCD Ink/Cursor Blue Color 1 Register */
{0x007B,0x3F}, /* LCD Ink/Cursor Green Color 1 Register */
{0x007C,0x1F}, /* LCD Ink/Cursor Red Color 1 Register */
{0x007E,0x00}, /* LCD Ink/Cursor FIFO Threshold Register */
{0x0080,0x00}, /* CRT/TV Ink/Cursor Control Register */
{0x0081,0x01}, /* CRT/TV Ink/Cursor Start Address Register */
{0x0082,0x00}, /* CRT/TV Cursor X Position Register 0 */
{0x0083,0x00}, /* CRT/TV Cursor X Position Register 1 */
{0x0084,0x00}, /* CRT/TV Cursor Y Position Register 0 */
{0x0085,0x00}, /* CRT/TV Cursor Y Position Register 1 */
{0x0086,0x00}, /* CRT/TV Ink/Cursor Blue Color 0 Register */
{0x0087,0x00}, /* CRT/TV Ink/Cursor Green Color 0 Register */
{0x0088,0x00}, /* CRT/TV Ink/Cursor Red Color 0 Register */
{0x008A,0x1F}, /* CRT/TV Ink/Cursor Blue Color 1 Register */
{0x008B,0x3F}, /* CRT/TV Ink/Cursor Green Color 1 Register */
{0x008C,0x1F}, /* CRT/TV Ink/Cursor Red Color 1 Register */
{0x008E,0x00}, /* CRT/TV Ink/Cursor FIFO Threshold Register */
{0x0100,0x00}, /* BitBlt Control Register 0 */
{0x0101,0x00}, /* BitBlt Control Register 1 */
{0x0102,0x00}, /* BitBlt ROP Code/Color Expansion Register */
{0x0103,0x00}, /* BitBlt Operation Register */
{0x0104,0x00}, /* BitBlt Source Start Address Register 0 */
{0x0105,0x00}, /* BitBlt Source Start Address Register 1 */
{0x0106,0x00}, /* BitBlt Source Start Address Register 2 */
{0x0108,0x00}, /* BitBlt Destination Start Address Register 0 */
{0x0109,0x00}, /* BitBlt Destination Start Address Register 1 */
{0x010A,0x00}, /* BitBlt Destination Start Address Register 2 */
{0x010C,0x00}, /* BitBlt Memory Address Offset Register 0 */
{0x010D,0x00}, /* BitBlt Memory Address Offset Register 1 */
{0x0110,0x00}, /* BitBlt Width Register 0 */
{0x0111,0x00}, /* BitBlt Width Register 1 */
{0x0112,0x00}, /* BitBlt Height Register 0 */
{0x0113,0x00}, /* BitBlt Height Register 1 */
{0x0114,0x00}, /* BitBlt Background Color Register 0 */
{0x0115,0x00}, /* BitBlt Background Color Register 1 */
{0x0118,0x00}, /* BitBlt Foreground Color Register 0 */
{0x0119,0x00}, /* BitBlt Foreground Color Register 1 */
{0x01E0,0x00}, /* Look-Up Table Mode Register */
{0x01E2,0x00}, /* Look-Up Table Address Register */
{0x01F0,0x10}, /* Power Save Configuration Register */
{0x01F1,0x00}, /* Power Save Status Register */
{0x01F4,0x00}, /* CPU-to-Memory Access Watchdog Timer Register */
{0x01FC,0x01}, /* Display Mode Register */
};

View File

@@ -0,0 +1,125 @@
/*
*
* File generated by S1D13806CFG.EXE
*
* Copyright (c) 2000,2001 Epson Research and Development, Inc.
* All rights reserved.
*
* PLEASE NOTE: If you FTP this file to a non-Windows platform, make
* sure you transfer this file using ASCII, not BINARY mode.
*
* Panel: (active) 320x240 62Hz STN Single 4-bit (PCLK=CLKI2/4=6.250MHz)
* Memory: Embedded SDRAM (MCLK=CLKI=49.500MHz) (BUSCLK=33.333MHz)
*
*/
static S1D_REGS regs_13806_320_240_4bpp[] =
{
{0x0001,0x00}, /* Miscellaneous Register */
{0x01FC,0x00}, /* Display Mode Register */
{0x0004,0x08}, /* General IO Pins Configuration Register 0 */
{0x0005,0x08}, /* General IO Pins Configuration Register 1 */
{0x0008,0x08}, /* General IO Pins Control Register 0 */
{0x0009,0x00}, /* General IO Pins Control Register 1 */
{0x0010,0x00}, /* Memory Clock Configuration Register */
{0x0014,0x32}, /* LCD Pixel Clock Configuration Register */
{0x0018,0x00}, /* CRT/TV Pixel Clock Configuration Register */
{0x001C,0x02}, /* MediaPlug Clock Configuration Register */
{0x001E,0x01}, /* CPU To Memory Wait State Select Register */
{0x0021,0x03}, /* DRAM Refresh Rate Register */
{0x002A,0x00}, /* DRAM Timings Control Register 0 */
{0x002B,0x01}, /* DRAM Timings Control Register 1 */
{0x0020,0x80}, /* Memory Configuration Register */
{0x0030,0x00}, /* Panel Type Register */
{0x0031,0x00}, /* MOD Rate Register */
{0x0032,0x27}, /* LCD Horizontal Display Width Register */
{0x0034,0x03}, /* LCD Horizontal Non-Display Period Register */
{0x0035,0x01}, /* TFT FPLINE Start Position Register */
{0x0036,0x0B}, /* TFT FPLINE Pulse Width Register */
{0x0038,0xEF}, /* LCD Vertical Display Height Register 0 */
{0x0039,0x00}, /* LCD Vertical Display Height Register 1 */
{0x003A,0x2C}, /* LCD Vertical Non-Display Period Register */
{0x003B,0x0A}, /* TFT FPFRAME Start Position Register */
{0x003C,0x01}, /* TFT FPFRAME Pulse Width Register */
{0x0040,0x02}, /* LCD Display Mode Register */
{0x0041,0x00}, /* LCD Miscellaneous Register */
{0x0042,0x00}, /* LCD Display Start Address Register 0 */
{0x0043,0x00}, /* LCD Display Start Address Register 1 */
{0x0044,0x00}, /* LCD Display Start Address Register 2 */
{0x0046,0x50}, /* LCD Memory Address Offset Register 0 */
{0x0047,0x00}, /* LCD Memory Address Offset Register 1 */
{0x0048,0x00}, /* LCD Pixel Panning Register */
{0x004A,0x00}, /* LCD Display FIFO High Threshold Control Register */
{0x004B,0x00}, /* LCD Display FIFO Low Threshold Control Register */
{0x0050,0x4F}, /* CRT/TV Horizontal Display Width Register */
{0x0052,0x13}, /* CRT/TV Horizontal Non-Display Period Register */
{0x0053,0x01}, /* CRT/TV HRTC Start Position Register */
{0x0054,0x0B}, /* CRT/TV HRTC Pulse Width Register */
{0x0056,0xDF}, /* CRT/TV Vertical Display Height Register 0 */
{0x0057,0x01}, /* CRT/TV Vertical Display Height Register 1 */
{0x0058,0x2B}, /* CRT/TV Vertical Non-Display Period Register */
{0x0059,0x09}, /* CRT/TV VRTC Start Position Register */
{0x005A,0x01}, /* CRT/TV VRTC Pulse Width Register */
{0x005B,0x10}, /* TV Output Control Register */
{0x0060,0x03}, /* CRT/TV Display Mode Register */
{0x0062,0x00}, /* CRT/TV Display Start Address Register 0 */
{0x0063,0x00}, /* CRT/TV Display Start Address Register 1 */
{0x0064,0x00}, /* CRT/TV Display Start Address Register 2 */
{0x0066,0x40}, /* CRT/TV Memory Address Offset Register 0 */
{0x0067,0x01}, /* CRT/TV Memory Address Offset Register 1 */
{0x0068,0x00}, /* CRT/TV Pixel Panning Register */
{0x006A,0x00}, /* CRT/TV Display FIFO High Threshold Control Register */
{0x006B,0x00}, /* CRT/TV Display FIFO Low Threshold Control Register */
{0x0070,0x00}, /* LCD Ink/Cursor Control Register */
{0x0071,0x01}, /* LCD Ink/Cursor Start Address Register */
{0x0072,0x00}, /* LCD Cursor X Position Register 0 */
{0x0073,0x00}, /* LCD Cursor X Position Register 1 */
{0x0074,0x00}, /* LCD Cursor Y Position Register 0 */
{0x0075,0x00}, /* LCD Cursor Y Position Register 1 */
{0x0076,0x00}, /* LCD Ink/Cursor Blue Color 0 Register */
{0x0077,0x00}, /* LCD Ink/Cursor Green Color 0 Register */
{0x0078,0x00}, /* LCD Ink/Cursor Red Color 0 Register */
{0x007A,0x1F}, /* LCD Ink/Cursor Blue Color 1 Register */
{0x007B,0x3F}, /* LCD Ink/Cursor Green Color 1 Register */
{0x007C,0x1F}, /* LCD Ink/Cursor Red Color 1 Register */
{0x007E,0x00}, /* LCD Ink/Cursor FIFO Threshold Register */
{0x0080,0x00}, /* CRT/TV Ink/Cursor Control Register */
{0x0081,0x01}, /* CRT/TV Ink/Cursor Start Address Register */
{0x0082,0x00}, /* CRT/TV Cursor X Position Register 0 */
{0x0083,0x00}, /* CRT/TV Cursor X Position Register 1 */
{0x0084,0x00}, /* CRT/TV Cursor Y Position Register 0 */
{0x0085,0x00}, /* CRT/TV Cursor Y Position Register 1 */
{0x0086,0x00}, /* CRT/TV Ink/Cursor Blue Color 0 Register */
{0x0087,0x00}, /* CRT/TV Ink/Cursor Green Color 0 Register */
{0x0088,0x00}, /* CRT/TV Ink/Cursor Red Color 0 Register */
{0x008A,0x1F}, /* CRT/TV Ink/Cursor Blue Color 1 Register */
{0x008B,0x3F}, /* CRT/TV Ink/Cursor Green Color 1 Register */
{0x008C,0x1F}, /* CRT/TV Ink/Cursor Red Color 1 Register */
{0x008E,0x00}, /* CRT/TV Ink/Cursor FIFO Threshold Register */
{0x0100,0x00}, /* BitBlt Control Register 0 */
{0x0101,0x00}, /* BitBlt Control Register 1 */
{0x0102,0x00}, /* BitBlt ROP Code/Color Expansion Register */
{0x0103,0x00}, /* BitBlt Operation Register */
{0x0104,0x00}, /* BitBlt Source Start Address Register 0 */
{0x0105,0x00}, /* BitBlt Source Start Address Register 1 */
{0x0106,0x00}, /* BitBlt Source Start Address Register 2 */
{0x0108,0x00}, /* BitBlt Destination Start Address Register 0 */
{0x0109,0x00}, /* BitBlt Destination Start Address Register 1 */
{0x010A,0x00}, /* BitBlt Destination Start Address Register 2 */
{0x010C,0x00}, /* BitBlt Memory Address Offset Register 0 */
{0x010D,0x00}, /* BitBlt Memory Address Offset Register 1 */
{0x0110,0x00}, /* BitBlt Width Register 0 */
{0x0111,0x00}, /* BitBlt Width Register 1 */
{0x0112,0x00}, /* BitBlt Height Register 0 */
{0x0113,0x00}, /* BitBlt Height Register 1 */
{0x0114,0x00}, /* BitBlt Background Color Register 0 */
{0x0115,0x00}, /* BitBlt Background Color Register 1 */
{0x0118,0x00}, /* BitBlt Foreground Color Register 0 */
{0x0119,0x00}, /* BitBlt Foreground Color Register 1 */
{0x01E0,0x00}, /* Look-Up Table Mode Register */
{0x01E2,0x00}, /* Look-Up Table Address Register */
{0x01F0,0x10}, /* Power Save Configuration Register */
{0x01F1,0x00}, /* Power Save Status Register */
{0x01F4,0x00}, /* CPU-to-Memory Access Watchdog Timer Register */
{0x01FC,0x01}, /* Display Mode Register */
};

View File

@@ -0,0 +1,125 @@
/*
*
* File generated by S1D13806CFG.EXE
*
* Copyright (c) 2000,2001 Epson Research and Development, Inc.
* All rights reserved.
*
* PLEASE NOTE: If you FTP this file to a non-Windows platform, make
* sure you transfer this file using ASCII, not BINARY mode.
*
* Panel: (active) 640x480 59Hz TFT Single 18-bit (PCLK=CLKI2=25.000MHz)
* Memory: Embedded SDRAM (MCLK=CLKI=49.152MHz) (BUSCLK=33.333MHz)
*
*/
static S1D_REGS regs_13806_640_480_16bpp[] =
{
{0x0001,0x00}, /* Miscellaneous Register */
{0x01FC,0x00}, /* Display Mode Register */
{0x0004,0x18}, /* General IO Pins Configuration Register 0 */
{0x0005,0x00}, /* General IO Pins Configuration Register 1 */
{0x0008,0x18}, /* General IO Pins Control Register 0 */
{0x0009,0x00}, /* General IO Pins Control Register 1 */
{0x0010,0x00}, /* Memory Clock Configuration Register */
{0x0014,0x02}, /* LCD Pixel Clock Configuration Register */
{0x0018,0x02}, /* CRT/TV Pixel Clock Configuration Register */
{0x001C,0x02}, /* MediaPlug Clock Configuration Register */
{0x001E,0x01}, /* CPU To Memory Wait State Select Register */
{0x0021,0x03}, /* DRAM Refresh Rate Register */
{0x002A,0x00}, /* DRAM Timings Control Register 0 */
{0x002B,0x01}, /* DRAM Timings Control Register 1 */
{0x0020,0x80}, /* Memory Configuration Register */
{0x0030,0x25}, /* Panel Type Register */
{0x0031,0x00}, /* MOD Rate Register */
{0x0032,0x4F}, /* LCD Horizontal Display Width Register */
{0x0034,0x13}, /* LCD Horizontal Non-Display Period Register */
{0x0035,0x00}, /* TFT FPLINE Start Position Register */
{0x0036,0x0B}, /* TFT FPLINE Pulse Width Register */
{0x0038,0xDF}, /* LCD Vertical Display Height Register 0 */
{0x0039,0x01}, /* LCD Vertical Display Height Register 1 */
{0x003A,0x24}, /* LCD Vertical Non-Display Period Register */
{0x003B,0x00}, /* TFT FPFRAME Start Position Register */
{0x003C,0x01}, /* TFT FPFRAME Pulse Width Register */
{0x0040,0x05}, /* LCD Display Mode Register */
{0x0041,0x00}, /* LCD Miscellaneous Register */
{0x0042,0x00}, /* LCD Display Start Address Register 0 */
{0x0043,0x00}, /* LCD Display Start Address Register 1 */
{0x0044,0x00}, /* LCD Display Start Address Register 2 */
{0x0046,0x80}, /* LCD Memory Address Offset Register 0 */
{0x0047,0x02}, /* LCD Memory Address Offset Register 1 */
{0x0048,0x00}, /* LCD Pixel Panning Register */
{0x004A,0x00}, /* LCD Display FIFO High Threshold Control Register */
{0x004B,0x00}, /* LCD Display FIFO Low Threshold Control Register */
{0x0050,0x4F}, /* CRT/TV Horizontal Display Width Register */
{0x0052,0x13}, /* CRT/TV Horizontal Non-Display Period Register */
{0x0053,0x01}, /* CRT/TV HRTC Start Position Register */
{0x0054,0x0B}, /* CRT/TV HRTC Pulse Width Register */
{0x0056,0xDF}, /* CRT/TV Vertical Display Height Register 0 */
{0x0057,0x01}, /* CRT/TV Vertical Display Height Register 1 */
{0x0058,0x2B}, /* CRT/TV Vertical Non-Display Period Register */
{0x0059,0x09}, /* CRT/TV VRTC Start Position Register */
{0x005A,0x01}, /* CRT/TV VRTC Pulse Width Register */
{0x005B,0x10}, /* TV Output Control Register */
{0x0060,0x05}, /* CRT/TV Display Mode Register */
{0x0062,0x00}, /* CRT/TV Display Start Address Register 0 */
{0x0063,0x00}, /* CRT/TV Display Start Address Register 1 */
{0x0064,0x00}, /* CRT/TV Display Start Address Register 2 */
{0x0066,0x80}, /* CRT/TV Memory Address Offset Register 0 */
{0x0067,0x02}, /* CRT/TV Memory Address Offset Register 1 */
{0x0068,0x00}, /* CRT/TV Pixel Panning Register */
{0x006A,0x00}, /* CRT/TV Display FIFO High Threshold Control Register */
{0x006B,0x00}, /* CRT/TV Display FIFO Low Threshold Control Register */
{0x0070,0x00}, /* LCD Ink/Cursor Control Register */
{0x0071,0x01}, /* LCD Ink/Cursor Start Address Register */
{0x0072,0x00}, /* LCD Cursor X Position Register 0 */
{0x0073,0x00}, /* LCD Cursor X Position Register 1 */
{0x0074,0x00}, /* LCD Cursor Y Position Register 0 */
{0x0075,0x00}, /* LCD Cursor Y Position Register 1 */
{0x0076,0x00}, /* LCD Ink/Cursor Blue Color 0 Register */
{0x0077,0x00}, /* LCD Ink/Cursor Green Color 0 Register */
{0x0078,0x00}, /* LCD Ink/Cursor Red Color 0 Register */
{0x007A,0x1F}, /* LCD Ink/Cursor Blue Color 1 Register */
{0x007B,0x3F}, /* LCD Ink/Cursor Green Color 1 Register */
{0x007C,0x1F}, /* LCD Ink/Cursor Red Color 1 Register */
{0x007E,0x00}, /* LCD Ink/Cursor FIFO Threshold Register */
{0x0080,0x00}, /* CRT/TV Ink/Cursor Control Register */
{0x0081,0x01}, /* CRT/TV Ink/Cursor Start Address Register */
{0x0082,0x00}, /* CRT/TV Cursor X Position Register 0 */
{0x0083,0x00}, /* CRT/TV Cursor X Position Register 1 */
{0x0084,0x00}, /* CRT/TV Cursor Y Position Register 0 */
{0x0085,0x00}, /* CRT/TV Cursor Y Position Register 1 */
{0x0086,0x00}, /* CRT/TV Ink/Cursor Blue Color 0 Register */
{0x0087,0x00}, /* CRT/TV Ink/Cursor Green Color 0 Register */
{0x0088,0x00}, /* CRT/TV Ink/Cursor Red Color 0 Register */
{0x008A,0x1F}, /* CRT/TV Ink/Cursor Blue Color 1 Register */
{0x008B,0x3F}, /* CRT/TV Ink/Cursor Green Color 1 Register */
{0x008C,0x1F}, /* CRT/TV Ink/Cursor Red Color 1 Register */
{0x008E,0x00}, /* CRT/TV Ink/Cursor FIFO Threshold Register */
{0x0100,0x00}, /* BitBlt Control Register 0 */
{0x0101,0x00}, /* BitBlt Control Register 1 */
{0x0102,0x00}, /* BitBlt ROP Code/Color Expansion Register */
{0x0103,0x00}, /* BitBlt Operation Register */
{0x0104,0x00}, /* BitBlt Source Start Address Register 0 */
{0x0105,0x00}, /* BitBlt Source Start Address Register 1 */
{0x0106,0x00}, /* BitBlt Source Start Address Register 2 */
{0x0108,0x00}, /* BitBlt Destination Start Address Register 0 */
{0x0109,0x00}, /* BitBlt Destination Start Address Register 1 */
{0x010A,0x00}, /* BitBlt Destination Start Address Register 2 */
{0x010C,0x00}, /* BitBlt Memory Address Offset Register 0 */
{0x010D,0x00}, /* BitBlt Memory Address Offset Register 1 */
{0x0110,0x00}, /* BitBlt Width Register 0 */
{0x0111,0x00}, /* BitBlt Width Register 1 */
{0x0112,0x00}, /* BitBlt Height Register 0 */
{0x0113,0x00}, /* BitBlt Height Register 1 */
{0x0114,0x00}, /* BitBlt Background Color Register 0 */
{0x0115,0x00}, /* BitBlt Background Color Register 1 */
{0x0118,0x00}, /* BitBlt Foreground Color Register 0 */
{0x0119,0x00}, /* BitBlt Foreground Color Register 1 */
{0x01E0,0x00}, /* Look-Up Table Mode Register */
{0x01E2,0x00}, /* Look-Up Table Address Register */
{0x01F0,0x10}, /* Power Save Configuration Register */
{0x01F1,0x00}, /* Power Save Status Register */
{0x01F4,0x00}, /* CPU-to-Memory Access Watchdog Timer Register */
{0x01FC,0x01}, /* Display Mode Register */
};

View File

@@ -0,0 +1,125 @@
/*
*
* File generated by S1D13806CFG.EXE
*
* Copyright (c) 2000,2001 Epson Research and Development, Inc.
* All rights reserved.
*
* PLEASE NOTE: If you FTP this file to a non-Windows platform, make
* sure you transfer this file using ASCII, not BINARY mode.
*
* Panel: (active) 640x480 59Hz TFT Single 18-bit (PCLK=CLKI2=25.000MHz)
* Memory: Embedded SDRAM (MCLK=CLKI=49.152MHz) (BUSCLK=33.333MHz)
*
*/
static S1D_REGS regs_13806_640_320_16bpp[] =
{
{0x0001,0x00}, /* Miscellaneous Register */
{0x01FC,0x00}, /* Display Mode Register */
{0x0004,0x18}, /* General IO Pins Configuration Register 0 */
{0x0005,0x00}, /* General IO Pins Configuration Register 1 */
{0x0008,0x18}, /* General IO Pins Control Register 0 */
{0x0009,0x00}, /* General IO Pins Control Register 1 */
{0x0010,0x00}, /* Memory Clock Configuration Register */
{0x0014,0x02}, /* LCD Pixel Clock Configuration Register */
{0x0018,0x02}, /* CRT/TV Pixel Clock Configuration Register */
{0x001C,0x02}, /* MediaPlug Clock Configuration Register */
{0x001E,0x01}, /* CPU To Memory Wait State Select Register */
{0x0021,0x03}, /* DRAM Refresh Rate Register */
{0x002A,0x00}, /* DRAM Timings Control Register 0 */
{0x002B,0x01}, /* DRAM Timings Control Register 1 */
{0x0020,0x80}, /* Memory Configuration Register */
{0x0030,0x25}, /* Panel Type Register */
{0x0031,0x00}, /* MOD Rate Register */
{0x0032,0x4F}, /* LCD Horizontal Display Width Register */
{0x0034,0x13}, /* LCD Horizontal Non-Display Period Register */
{0x0035,0x00}, /* TFT FPLINE Start Position Register */
{0x0036,0x0B}, /* TFT FPLINE Pulse Width Register */
{0x0038,0xDF}, /* LCD Vertical Display Height Register 0 */
{0x0039,0x01}, /* LCD Vertical Display Height Register 1 */
{0x003A,0x24}, /* LCD Vertical Non-Display Period Register */
{0x003B,0x00}, /* TFT FPFRAME Start Position Register */
{0x003C,0x01}, /* TFT FPFRAME Pulse Width Register */
{0x0040,0x03}, /* LCD Display Mode Register (8bpp) */
{0x0041,0x00}, /* LCD Miscellaneous Register */
{0x0042,0x00}, /* LCD Display Start Address Register 0 */
{0x0043,0x00}, /* LCD Display Start Address Register 1 */
{0x0044,0x00}, /* LCD Display Start Address Register 2 */
{0x0046,0x80}, /* LCD Memory Address Offset Register 0 */
{0x0047,0x02}, /* LCD Memory Address Offset Register 1 */
{0x0048,0x00}, /* LCD Pixel Panning Register */
{0x004A,0x00}, /* LCD Display FIFO High Threshold Control Register */
{0x004B,0x00}, /* LCD Display FIFO Low Threshold Control Register */
{0x0050,0x4F}, /* CRT/TV Horizontal Display Width Register */
{0x0052,0x13}, /* CRT/TV Horizontal Non-Display Period Register */
{0x0053,0x01}, /* CRT/TV HRTC Start Position Register */
{0x0054,0x0B}, /* CRT/TV HRTC Pulse Width Register */
{0x0056,0xDF}, /* CRT/TV Vertical Display Height Register 0 */
{0x0057,0x01}, /* CRT/TV Vertical Display Height Register 1 */
{0x0058,0x2B}, /* CRT/TV Vertical Non-Display Period Register */
{0x0059,0x09}, /* CRT/TV VRTC Start Position Register */
{0x005A,0x01}, /* CRT/TV VRTC Pulse Width Register */
{0x005B,0x10}, /* TV Output Control Register */
{0x0060,0x05}, /* CRT/TV Display Mode Register */
{0x0062,0x00}, /* CRT/TV Display Start Address Register 0 */
{0x0063,0x00}, /* CRT/TV Display Start Address Register 1 */
{0x0064,0x00}, /* CRT/TV Display Start Address Register 2 */
{0x0066,0x80}, /* CRT/TV Memory Address Offset Register 0 */
{0x0067,0x02}, /* CRT/TV Memory Address Offset Register 1 */
{0x0068,0x00}, /* CRT/TV Pixel Panning Register */
{0x006A,0x00}, /* CRT/TV Display FIFO High Threshold Control Register */
{0x006B,0x00}, /* CRT/TV Display FIFO Low Threshold Control Register */
{0x0070,0x00}, /* LCD Ink/Cursor Control Register */
{0x0071,0x01}, /* LCD Ink/Cursor Start Address Register */
{0x0072,0x00}, /* LCD Cursor X Position Register 0 */
{0x0073,0x00}, /* LCD Cursor X Position Register 1 */
{0x0074,0x00}, /* LCD Cursor Y Position Register 0 */
{0x0075,0x00}, /* LCD Cursor Y Position Register 1 */
{0x0076,0x00}, /* LCD Ink/Cursor Blue Color 0 Register */
{0x0077,0x00}, /* LCD Ink/Cursor Green Color 0 Register */
{0x0078,0x00}, /* LCD Ink/Cursor Red Color 0 Register */
{0x007A,0x1F}, /* LCD Ink/Cursor Blue Color 1 Register */
{0x007B,0x3F}, /* LCD Ink/Cursor Green Color 1 Register */
{0x007C,0x1F}, /* LCD Ink/Cursor Red Color 1 Register */
{0x007E,0x00}, /* LCD Ink/Cursor FIFO Threshold Register */
{0x0080,0x00}, /* CRT/TV Ink/Cursor Control Register */
{0x0081,0x01}, /* CRT/TV Ink/Cursor Start Address Register */
{0x0082,0x00}, /* CRT/TV Cursor X Position Register 0 */
{0x0083,0x00}, /* CRT/TV Cursor X Position Register 1 */
{0x0084,0x00}, /* CRT/TV Cursor Y Position Register 0 */
{0x0085,0x00}, /* CRT/TV Cursor Y Position Register 1 */
{0x0086,0x00}, /* CRT/TV Ink/Cursor Blue Color 0 Register */
{0x0087,0x00}, /* CRT/TV Ink/Cursor Green Color 0 Register */
{0x0088,0x00}, /* CRT/TV Ink/Cursor Red Color 0 Register */
{0x008A,0x1F}, /* CRT/TV Ink/Cursor Blue Color 1 Register */
{0x008B,0x3F}, /* CRT/TV Ink/Cursor Green Color 1 Register */
{0x008C,0x1F}, /* CRT/TV Ink/Cursor Red Color 1 Register */
{0x008E,0x00}, /* CRT/TV Ink/Cursor FIFO Threshold Register */
{0x0100,0x00}, /* BitBlt Control Register 0 */
{0x0101,0x00}, /* BitBlt Control Register 1 */
{0x0102,0x00}, /* BitBlt ROP Code/Color Expansion Register */
{0x0103,0x00}, /* BitBlt Operation Register */
{0x0104,0x00}, /* BitBlt Source Start Address Register 0 */
{0x0105,0x00}, /* BitBlt Source Start Address Register 1 */
{0x0106,0x00}, /* BitBlt Source Start Address Register 2 */
{0x0108,0x00}, /* BitBlt Destination Start Address Register 0 */
{0x0109,0x00}, /* BitBlt Destination Start Address Register 1 */
{0x010A,0x00}, /* BitBlt Destination Start Address Register 2 */
{0x010C,0x00}, /* BitBlt Memory Address Offset Register 0 */
{0x010D,0x00}, /* BitBlt Memory Address Offset Register 1 */
{0x0110,0x00}, /* BitBlt Width Register 0 */
{0x0111,0x00}, /* BitBlt Width Register 1 */
{0x0112,0x00}, /* BitBlt Height Register 0 */
{0x0113,0x00}, /* BitBlt Height Register 1 */
{0x0114,0x00}, /* BitBlt Background Color Register 0 */
{0x0115,0x00}, /* BitBlt Background Color Register 1 */
{0x0118,0x00}, /* BitBlt Foreground Color Register 0 */
{0x0119,0x00}, /* BitBlt Foreground Color Register 1 */
{0x01E0,0x00}, /* Look-Up Table Mode Register */
{0x01E2,0x00}, /* Look-Up Table Address Register */
{0x01F0,0x10}, /* Power Save Configuration Register */
{0x01F1,0x00}, /* Power Save Status Register */
{0x01F4,0x00}, /* CPU-to-Memory Access Watchdog Timer Register */
{0x01FC,0x01}, /* Display Mode Register */
};

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o
OBJS = $(BOARD).o flash.o ../common/misc.o ../common/auto_update.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)

View File

@@ -28,9 +28,13 @@
ifeq ($(BOARD_REVISION),CPCI4052)
TEXT_BASE = 0xFFFC0000
else
ifeq ($(BOARD_REVISION),CPCI405DT)
TEXT_BASE = 0xFFFC0000
else
ifeq ($(BOARD_REVISION),CPCI405AB)
TEXT_BASE = 0xFFFC0000
else
TEXT_BASE = 0xFFFD0000
endif
endif
endif

View File

@@ -25,6 +25,7 @@
#include <asm/processor.h>
#include <command.h>
#include <malloc.h>
#include <net.h>
/* ------------------------------------------------------------------------- */
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); /*cmd_boot.c*/
@@ -52,9 +53,43 @@ const unsigned char fpgadata[] =
#include "../common/fpga.c"
#include "../common/auto_update.h"
#ifdef CONFIG_CPCI405AB
au_image_t au_image[] = {
{"cpci405ab/preinst.img", 0, -1, AU_SCRIPT},
{"cpci405ab/pImage", 0xffc00000, 0x000c0000, AU_NOR},
{"cpci405ab/pImage.initrd", 0xffcc0000, 0x00300000, AU_NOR},
{"cpci405ab/u-boot.img", 0xfffc0000, 0x00040000, AU_FIRMWARE},
{"cpci405ab/postinst.img", 0, 0, AU_SCRIPT},
};
#else
#ifdef CONFIG_CPCI405_VER2
au_image_t au_image[] = {
{"cpci4052/preinst.img", 0, -1, AU_SCRIPT},
{"cpci4052/pImage", 0xffc00000, 0x000c0000, AU_NOR},
{"cpci4052/pImage.initrd", 0xffcc0000, 0x00300000, AU_NOR},
{"cpci4052/u-boot.img", 0xfffc0000, 0x00040000, AU_FIRMWARE},
{"cpci4052/postinst.img", 0, 0, AU_SCRIPT},
};
#else
au_image_t au_image[] = {
{"cpci405/preinst.img", 0, -1, AU_SCRIPT},
{"cpci405/pImage", 0xffc00000, 0x000c0000, AU_NOR},
{"cpci405/pImage.initrd", 0xffcc0000, 0x00310000, AU_NOR},
{"cpci405/u-boot.img", 0xfffd0000, 0x00030000, AU_FIRMWARE},
{"cpci405/postinst.img", 0, 0, AU_SCRIPT},
};
#endif
#endif
int N_AU_IMAGES = (sizeof(au_image) / sizeof(au_image[0]));
/* Prototypes */
int cpci405_version(void);
int gunzip(void *, int, unsigned char *, unsigned long *);
void lxt971_no_sleep(void);
int board_early_init_f (void)
@@ -234,12 +269,14 @@ int misc_init_f (void)
int misc_init_r (void)
{
DECLARE_GLOBAL_DATA_PTR;
bd_t *bd = gd->bd;
char * tmp; /* Temporary char pointer */
unsigned long cntrl0Reg;
/* adjust flash start and offset */
gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
gd->bd->bi_flashoffset = 0;
#ifdef CONFIG_CPCI405_VER2
{
unsigned char *dst;
ulong len = sizeof(fpgadata);
int status;
@@ -348,9 +385,11 @@ int misc_init_r (void)
puts("*** CPCI-405 Version 1.x detected!\n");
puts("*** Please use correct U-Boot version (CPCI405 instead of CPCI4052)!\n\n");
}
}
#else /* CONFIG_CPCI405_VER2 */
#if 0 /* test-only: code-plug now not relavant for ip-address any more */
/*
* Generate last byte of ip-addr from code-plug @ 0xf0000400
*/
@@ -371,6 +410,7 @@ int misc_init_r (void)
setenv("ipaddr", str);
}
}
#endif
if (cpci405_version() >= 2) {
puts("\n*** U-Boot Version does not match Board Version!\n");
@@ -386,11 +426,6 @@ int misc_init_r (void)
cntrl0Reg = mfdcr(cntrl0);
mtdcr(cntrl0, cntrl0Reg | 0x00001000);
/*
* Write ethernet addr in NVRAM for VxWorks
*/
tmp = (char *)CFG_NVRAM_BASE_ADDR + CFG_NVRAM_VXWORKS_OFFS;
memcpy( (char *)tmp, (char *)&bd->bi_enetaddr[0], 6 );
return (0);
}
@@ -463,6 +498,11 @@ int checkboard (void)
putc ('\n');
/*
* Disable sleep mode in LXT971
*/
lxt971_no_sleep();
return 0;
}
@@ -518,9 +558,12 @@ void ide_set_reset(int on)
#ifdef CONFIG_CPCI405AB
#define ONE_WIRE_CLEAR (*(volatile unsigned short *)0xf0400000 |= 0x0100)
#define ONE_WIRE_SET (*(volatile unsigned short *)0xf0400000 &= ~0x0100)
#define ONE_WIRE_GET (*(volatile unsigned short *)0xf0400002 & 0x1000)
#define ONE_WIRE_CLEAR (*(volatile unsigned short *)(CFG_FPGA_BASE_ADDR + CFG_FPGA_MODE) \
|= CFG_FPGA_MODE_1WIRE_DIR)
#define ONE_WIRE_SET (*(volatile unsigned short *)(CFG_FPGA_BASE_ADDR + CFG_FPGA_MODE) \
&= ~CFG_FPGA_MODE_1WIRE_DIR)
#define ONE_WIRE_GET (*(volatile unsigned short *)(CFG_FPGA_BASE_ADDR + CFG_FPGA_STATUS) \
& CFG_FPGA_MODE_1WIRE)
/*
* Generate a 1-wire reset, return 1 if no presence detect was found,
@@ -655,4 +698,102 @@ U_BOOT_CMD(
NULL
);
#define CFG_I2C_EEPROM_ADDR_2 0x51 /* EEPROM CAT28WC32 */
#define CFG_ENV_SIZE_2 0x800 /* 2048 bytes may be used for env vars*/
/*
* Write backplane ip-address...
*/
int do_get_bpip(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
DECLARE_GLOBAL_DATA_PTR;
bd_t *bd = gd->bd;
char *buf;
ulong crc;
char str[32];
char *ptr;
IPaddr_t ipaddr;
buf = malloc(CFG_ENV_SIZE_2);
if (eeprom_read(CFG_I2C_EEPROM_ADDR_2, 0, buf, CFG_ENV_SIZE_2)) {
puts("\nError reading backplane EEPROM!\n");
} else {
crc = crc32(0, buf+4, CFG_ENV_SIZE_2-4);
if (crc != *(ulong *)buf) {
printf("ERROR: crc mismatch %08lx %08lx\n", crc, *(ulong *)buf);
return -1;
}
/*
* Find bp_ip
*/
ptr = strstr(buf+4, "bp_ip=");
if (ptr == NULL) {
printf("ERROR: bp_ip not found!\n");
return -1;
}
ptr += 6;
ipaddr = string_to_ip(ptr);
/*
* Update whole ip-addr
*/
bd->bi_ip_addr = ipaddr;
sprintf(str, "%ld.%ld.%ld.%ld",
(bd->bi_ip_addr & 0xff000000) >> 24,
(bd->bi_ip_addr & 0x00ff0000) >> 16,
(bd->bi_ip_addr & 0x0000ff00) >> 8,
(bd->bi_ip_addr & 0x000000ff));
setenv("ipaddr", str);
printf("Updated ip_addr from bp_eeprom to %s!\n", str);
}
free(buf);
return 0;
}
U_BOOT_CMD(
getbpip, 1, 1, do_get_bpip,
"getbpip - Update IP-Address with Backplane IP-Address\n",
NULL
);
/*
* Set and print backplane ip...
*/
int do_set_bpip(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
char *buf;
unsigned char str[32];
ulong crc;
if (argc < 2) {
puts("ERROR!\n");
return -1;
}
printf("Setting bp_ip to %s\n", argv[1]);
buf = malloc(CFG_ENV_SIZE_2);
memset(buf, 0, CFG_ENV_SIZE_2);
sprintf(str, "bp_ip=%s", argv[1]);
strcpy(buf+4, str);
crc = crc32(0, buf+4, CFG_ENV_SIZE_2-4);
*(ulong *)buf = crc;
if (eeprom_write(CFG_I2C_EEPROM_ADDR_2, 0, buf, CFG_ENV_SIZE_2)) {
puts("\nError writing backplane EEPROM!\n");
}
free(buf);
return 0;
}
U_BOOT_CMD(
setbpip, 2, 1, do_set_bpip,
"setbpip - Write Backplane IP-Address\n",
NULL
);
#endif /* CONFIG_CPCI405AB */

File diff suppressed because it is too large Load Diff

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o strataflash.o
OBJS = $(BOARD).o strataflash.o ../common/misc.o
SOBJS = init.o
$(LIB): $(OBJS) $(SOBJS)

View File

@@ -31,6 +31,7 @@ ifeq ($(ramsym),1)
TEXT_BASE = 0x07FD0000
else
TEXT_BASE = 0xFFFC0000
#TEXT_BASE = 0x01fc0000
endif
PLATFORM_CPPFLAGS += -DCONFIG_440=1

View File

@@ -26,6 +26,9 @@
#include <asm/processor.h>
extern void lxt971_no_sleep(void);
long int fixed_sdram( void );
int board_early_init_f (void)
@@ -77,6 +80,12 @@ int checkboard (void)
printf("\tPLB: %lu MHz\n", sysinfo.freqPLB/1000000);
printf("\tOPB: %lu MHz\n", sysinfo.freqOPB/1000000);
printf("\tEPB: %lu MHz\n", sysinfo.freqEPB/1000000);
/*
* Disable sleep mode in LXT971
*/
lxt971_no_sleep();
return (0);
}
@@ -101,6 +110,7 @@ long int fixed_sdram( void )
{
uint reg;
#if 1 /* test-only */
/*--------------------------------------------------------------------
* Setup some default
*------------------------------------------------------------------*/
@@ -136,4 +146,7 @@ long int fixed_sdram( void )
}
return( 64 * 1024 * 1024 ); /* 64 MB */
#else
return( 32 * 1024 * 1024 ); /* 64 MB */
#endif
}

View File

@@ -28,11 +28,13 @@ SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/
SECTIONS
{
.resetvec 0xFFFFFFFC :
/* .resetvec 0x01FFFFFC :*/
{
*(.resetvec)
} = 0xffff
.bootpg 0xFFFFF000 :
/* .bootpg 0x01FFF000 :*/
{
cpu/ppc4xx/start.o (.bootpg)
} = 0xffff

53
board/esd/cpci750/64360.h Normal file
View File

@@ -0,0 +1,53 @@
/*
* (C) Copyright 2003
* Ingo Assmus <ingo.assmus@keymile.com>
* for cpci750 Reinhard Arlt
*
* 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
*/
/*
* main board support/init for the cpci750.
*/
#ifndef __64360_H__
#define __64360_H__
/* CPU Configuration bits */
#define CPU_CONF_ADDR_MISS_EN (1 << 8)
#define CPU_CONF_SINGLE_CPU (1 << 11)
#define CPU_CONF_ENDIANESS (1 << 12)
#define CPU_CONF_PIPELINE (1 << 13)
#define CPU_CONF_STOP_RETRY (1 << 17)
#define CPU_CONF_MULTI_DECODE (1 << 18)
#define CPU_CONF_DP_VALID (1 << 19)
#define CPU_CONF_PERR_PROP (1 << 22)
#define CPU_CONF_AACK_DELAY_2 (1 << 25)
#define CPU_CONF_AP_VALID (1 << 26)
#define CPU_CONF_REMAP_WR_DIS (1 << 27)
/* CPU Master Control bits */
#define CPU_MAST_CTL_ARB_EN (1 << 8)
#define CPU_MAST_CTL_MASK_BR_1 (1 << 9)
#define CPU_MAST_CTL_M_WR_TRIG (1 << 10)
#define CPU_MAST_CTL_M_RD_TRIG (1 << 11)
#define CPU_MAST_CTL_CLEAN_BLK (1 << 12)
#define CPU_MAST_CTL_FLUSH_BLK (1 << 13)
#endif /* __64360_H__ */

View File

@@ -0,0 +1,44 @@
#
# (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
#
include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
SOBJS = misc.o
OBJS = $(BOARD).o serial.o ../../Marvell/common/memory.o pci.o \
mv_eth.o mpsc.o i2c.o \
sdram_init.o strataflash.o ide.o
$(LIB): .depend $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS) $(SOBJS)
#########################################################################
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
sinclude .depend
#########################################################################

View File

@@ -0,0 +1,28 @@
#
# (C) Copyright 2004
# Reinhard Arlt <reinhard.arlt@esd-electronics.com>
#
# See file CREDITS for list of people who contributed to this
# project.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
#
# cpci750 board
#
TEXT_BASE = 0xfff00000

885
board/esd/cpci750/cpci750.c Normal file
View File

@@ -0,0 +1,885 @@
/*
* (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
*
* modifications for the DB64360 eval board based by Ingo.Assmus@keymile.com
* modifications for the cpci750 by reinhard.arlt@esd-electronics.com
*/
/*
* cpci750.c - main board support/init for the esd cpci750.
*/
#include <common.h>
#include <74xx_7xx.h>
#include "../../Marvell/include/memory.h"
#include "../../Marvell/include/pci.h"
#include "../../Marvell/include/mv_gen_reg.h"
#include <net.h>
#include "eth.h"
#include "mpsc.h"
#include "i2c.h"
#include "64360.h"
#include "mv_regs.h"
#undef DEBUG
/*#define DEBUG */
#ifdef CONFIG_PCI
#define MAP_PCI
#endif /* of CONFIG_PCI */
#ifdef DEBUG
#define DP(x) x
#else
#define DP(x)
#endif
extern void flush_data_cache (void);
extern void invalidate_l1_instruction_cache (void);
/* ------------------------------------------------------------------------- */
/* 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_early_init_f wont work right (like in cpu_init_f).
* See also my_remap_gt_regs below. (NTL)
*/
void board_prebootm_init (void);
unsigned int INTERNAL_REG_BASE_ADDR = CFG_GT_REGS;
int display_mem_map (void);
/* ------------------------------------------------------------------------- */
/*
* 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 */
/* original ppcboot 1.1.6 source
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);
original ppcboot 1.1.6 source end */
temp = in_le32 ((u32 *) (new_loc + INTERNAL_SPACE_DECODE));
if ((temp & 0xffff) == new_loc >> 16)
return;
temp = (in_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE)) &
0xffff0000) | (new_loc >> 16);
out_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE), temp);
while (GTREGREAD (INTERNAL_SPACE_DECODE) != temp);
}
#ifdef CONFIG_PCI
static void gt_pci_config (void)
{
unsigned int stat;
unsigned int val = 0x00fff864; /* DINK32: BusNum 23:16, DevNum 15:11, FuncNum 10:8, RegNum 7:2 */
/* In PCIX mode devices provide their own bus and device numbers. We query the Discovery II's
* config registers by writing ones to the bus and device.
* We then update the Virtual register with the correct value for the bus and device.
*/
if ((GTREGREAD (PCI_0_MODE) & (BIT4 | BIT5)) != 0) { /*if PCI-X */
GT_REG_WRITE (PCI_0_CONFIG_ADDR, BIT31 | val);
GT_REG_READ (PCI_0_CONFIG_DATA_VIRTUAL_REG, &stat);
GT_REG_WRITE (PCI_0_CONFIG_ADDR, BIT31 | val);
GT_REG_WRITE (PCI_0_CONFIG_DATA_VIRTUAL_REG,
(stat & 0xffff0000) | CFG_PCI_IDSEL);
}
if ((GTREGREAD (PCI_1_MODE) & (BIT4 | BIT5)) != 0) { /*if PCI-X */
GT_REG_WRITE (PCI_1_CONFIG_ADDR, BIT31 | val);
GT_REG_READ (PCI_1_CONFIG_DATA_VIRTUAL_REG, &stat);
GT_REG_WRITE (PCI_1_CONFIG_ADDR, BIT31 | val);
GT_REG_WRITE (PCI_1_CONFIG_DATA_VIRTUAL_REG,
(stat & 0xffff0000) | CFG_PCI_IDSEL);
}
/* Enable master */
PCI_MASTER_ENABLE (0, SELF);
PCI_MASTER_ENABLE (1, SELF);
/* Enable PCI0/1 Mem0 and IO 0 disable all others */
GT_REG_READ (BASE_ADDR_ENABLE, &stat);
stat |= (1 << 11) | (1 << 12) | (1 << 13) | (1 << 16) | (1 << 17) | (1
<<
18);
stat &= ~((1 << 9) | (1 << 10) | (1 << 14) | (1 << 15));
GT_REG_WRITE (BASE_ADDR_ENABLE, stat);
/* ronen- add write to pci remap registers for 64460.
in 64360 when writing to pci base go and overide remap automaticaly,
in 64460 it doesn't */
GT_REG_WRITE (PCI_0_IO_BASE_ADDR, CFG_PCI0_IO_SPACE >> 16);
GT_REG_WRITE (PCI_0I_O_ADDRESS_REMAP, CFG_PCI0_IO_SPACE_PCI >> 16);
GT_REG_WRITE (PCI_0_IO_SIZE, (CFG_PCI0_IO_SIZE - 1) >> 16);
GT_REG_WRITE (PCI_0_MEMORY0_BASE_ADDR, CFG_PCI0_MEM_BASE >> 16);
GT_REG_WRITE (PCI_0MEMORY0_ADDRESS_REMAP, CFG_PCI0_MEM_BASE >> 16);
GT_REG_WRITE (PCI_0_MEMORY0_SIZE, (CFG_PCI0_MEM_SIZE - 1) >> 16);
GT_REG_WRITE (PCI_1_IO_BASE_ADDR, CFG_PCI1_IO_SPACE >> 16);
GT_REG_WRITE (PCI_1I_O_ADDRESS_REMAP, CFG_PCI1_IO_SPACE_PCI >> 16);
GT_REG_WRITE (PCI_1_IO_SIZE, (CFG_PCI1_IO_SIZE - 1) >> 16);
GT_REG_WRITE (PCI_1_MEMORY0_BASE_ADDR, CFG_PCI1_MEM_BASE >> 16);
GT_REG_WRITE (PCI_1MEMORY0_ADDRESS_REMAP, CFG_PCI1_MEM_BASE >> 16);
GT_REG_WRITE (PCI_1_MEMORY0_SIZE, (CFG_PCI1_MEM_SIZE - 1) >> 16);
/* PCI interface settings */
/* Timeout set to retry forever */
GT_REG_WRITE (PCI_0TIMEOUT_RETRY, 0x0);
GT_REG_WRITE (PCI_1TIMEOUT_RETRY, 0x0);
/* ronen - enable only CS0 and Internal reg!! */
GT_REG_WRITE (PCI_0BASE_ADDRESS_REGISTERS_ENABLE, 0xfffffdfe);
GT_REG_WRITE (PCI_1BASE_ADDRESS_REGISTERS_ENABLE, 0xfffffdfe);
/*ronen update the pci internal registers base address.*/
#ifdef MAP_PCI
for (stat = 0; stat <= PCI_HOST1; stat++)
pciWriteConfigReg (stat,
PCI_INTERNAL_REGISTERS_MEMORY_MAPPED_BASE_ADDRESS,
SELF, CFG_GT_REGS);
#endif
}
#endif
/* 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 SINGLE_CPU bit see MV64360 P.399 */
#ifndef CFG_GT_DUAL_CPU /* SINGLE_CPU seems to cause JTAG problems */
tmp |= CPU_CONF_SINGLE_CPU;
#endif
tmp &= ~CPU_CONF_AACK_DELAY_2;
tmp |= CPU_CONF_DP_VALID;
tmp |= CPU_CONF_AP_VALID;
tmp |= CPU_CONF_PIPELINE;
GT_REG_WRITE (CPU_CONFIGURATION, tmp); /* Marvell (VXWorks) writes 0x20220FF */
/* CPU master control register */
tmp = GTREGREAD (CPU_MASTER_CONTROL);
tmp |= CPU_MAST_CTL_ARB_EN;
if ((cpu == CPU_7400) ||
(cpu == CPU_7410) || (cpu == CPU_7455) || (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 (603e, 750)
* see Res#1 */
tmp &= ~CPU_MAST_CTL_CLEAN_BLK;
tmp &= ~CPU_MAST_CTL_FLUSH_BLK;
}
GT_REG_WRITE (CPU_MASTER_CONTROL, tmp);
}
/*
* board_early_init_f.
*
* set up gal. device mappings, etc.
*/
int board_early_init_f (void)
{
/*
* 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);
/* No PCI in first release of Port To_do: enable it. */
#ifdef CONFIG_PCI
gt_pci_config ();
#endif
/* mask all external interrupt sources */
GT_REG_WRITE (CPU_INTERRUPT_MASK_REGISTER_LOW, 0);
GT_REG_WRITE (CPU_INTERRUPT_MASK_REGISTER_HIGH, 0);
/* new in MV6436x */
GT_REG_WRITE (CPU_INTERRUPT_1_MASK_REGISTER_LOW, 0);
GT_REG_WRITE (CPU_INTERRUPT_1_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);
/* does not exist in MV6436x
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);
--------------------- */
/* ----- DEVICE BUS SETTINGS ------ */
/*
* EVB
* 0 - SRAM ????
* 1 - RTC ????
* 2 - UART ????
* 3 - Flash checked 32Bit Intel Strata
* boot - BootCS checked 8Bit 29LV040B
*
*/
/*
* 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)
*/
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 */
GT_REG_WRITE (DEVICE_BANK0PARAMETERS, CFG_DEV0_PAR);
GT_REG_WRITE (DEVICE_BANK1PARAMETERS, CFG_DEV1_PAR);
GT_REG_WRITE (DEVICE_BANK2PARAMETERS, CFG_DEV2_PAR);
GT_REG_WRITE (DEVICE_BANK3PARAMETERS, CFG_DEV3_PAR);
#ifdef CFG_32BIT_BOOT_PAR /* set port parameters for Flash device module access */
/* 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);
DEBUG_LED0_ON ();
DEBUG_LED1_ON ();
DEBUG_LED2_ON ();
return 0;
}
/* various things to do after relocation */
int misc_init_r ()
{
icache_enable ();
#ifdef CFG_L2
l2cache_enable ();
#endif
#ifdef CONFIG_MPSC
mpsc_sdma_init ();
mpsc_init2 ();
#endif
#if 0
/* disable the dcache and MMU */
dcache_lock ();
#endif
return 0;
}
void after_reloc (ulong dest_addr, gd_t * gd)
{
memoryMapDeviceSpace (BOOT_DEVICE, CFG_BOOT_SPACE, CFG_BOOT_SIZE);
display_mem_map ();
/* now, jump to the main ppcboot board init code */
board_init_r (gd, dest_addr);
/* NOTREACHED */
}
/* ------------------------------------------------------------------------- */
/*
* Check Board Identity:
*
* right now, assume borad type. (there is just one...after all)
*/
int checkboard (void)
{
int l_type = 0;
printf ("BOARD: %s\n", CFG_BOARD_NAME);
return (l_type);
}
/* utility functions */
void debug_led (int led, int mode)
{
}
int display_mem_map (void)
{
int i, j;
unsigned int base, size, width;
/* SDRAM */
printf ("SD (DDR) RAM\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);
}
}
#ifdef CONFIG_PCI
/* 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_REGION0
/*ronen currently only first PCI MEM is used 3 */ ;
j++) {
base = pciGetSpaceBase (i, j);
size = pciGetSpaceSize (i, j);
printf ("MEMORY %d: base - 0x%08x\tsize - %dM bytes\n", j, base, size >> 20);
}
}
#endif /* of CONFIG_PCI */
/* 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 size - %dM bytes\twidth - %d bits", i, base, size >> 20, width);
if (i == 0)
printf ("\t- FLASH\n");
else if (i == 1)
printf ("\t- FLASH\n");
else if (i == 2)
printf ("\t- FLASH\n");
else
printf ("\t- RTC/REGS/CAN\n");
}
/* Bootrom */
base = memoryGetDeviceBaseAddress (BOOT_DEVICE); /* Boot */
size = memoryGetDeviceSize (BOOT_DEVICE);
width = memoryGetDeviceWidth (BOOT_DEVICE) * 8;
printf (" BOOT: base - 0x%08x size - %dM bytes\twidth - %d bits\t- FLASH\n",
base, size >> 20, width);
return (0);
}
/* DRAM check routines copied from gw8260 */
#if defined (CFG_DRAM_TEST)
/*********************************************************************/
/* NAME: move64() - moves a double word (64-bit) */
/* */
/* DESCRIPTION: */
/* this function performs a double word move from the data at */
/* the source pointer to the location at the destination pointer. */
/* */
/* INPUTS: */
/* unsigned long long *src - pointer to data to move */
/* */
/* OUTPUTS: */
/* unsigned long long *dest - pointer to locate to move data */
/* */
/* RETURNS: */
/* None */
/* */
/* RESTRICTIONS/LIMITATIONS: */
/* May cloober fr0. */
/* */
/*********************************************************************/
static void move64 (unsigned long long *src, unsigned long long *dest)
{
asm ("lfd 0, 0(3)\n\t" /* fpr0 = *scr */
"stfd 0, 0(4)" /* *dest = fpr0 */
: : : "fr0"); /* Clobbers fr0 */
return;
}
#if defined (CFG_DRAM_TEST_DATA)
unsigned long long pattern[] = {
0xaaaaaaaaaaaaaaaa,
0xcccccccccccccccc,
0xf0f0f0f0f0f0f0f0,
0xff00ff00ff00ff00,
0xffff0000ffff0000,
0xffffffff00000000,
0x00000000ffffffff,
0x0000ffff0000ffff,
0x00ff00ff00ff00ff,
0x0f0f0f0f0f0f0f0f,
0x3333333333333333,
0x5555555555555555
};
/*********************************************************************/
/* NAME: mem_test_data() - test data lines for shorts and opens */
/* */
/* DESCRIPTION: */
/* Tests data lines for shorts and opens by forcing adjacent data */
/* to opposite states. Because the data lines could be routed in */
/* an arbitrary manner the must ensure test patterns ensure that */
/* every case is tested. By using the following series of binary */
/* patterns every combination of adjacent bits is test regardless */
/* of routing. */
/* */
/* ...101010101010101010101010 */
/* ...110011001100110011001100 */
/* ...111100001111000011110000 */
/* ...111111110000000011111111 */
/* */
/* Carrying this out, gives us six hex patterns as follows: */
/* */
/* 0xaaaaaaaaaaaaaaaa */
/* 0xcccccccccccccccc */
/* 0xf0f0f0f0f0f0f0f0 */
/* 0xff00ff00ff00ff00 */
/* 0xffff0000ffff0000 */
/* 0xffffffff00000000 */
/* */
/* The number test patterns will always be given by: */
/* */
/* log(base 2)(number data bits) = log2 (64) = 6 */
/* */
/* To test for short and opens to other signals on our boards. we */
/* simply */
/* test with the 1's complemnt of the paterns as well. */
/* */
/* OUTPUTS: */
/* Displays failing test pattern */
/* */
/* RETURNS: */
/* 0 - Passed test */
/* 1 - Failed test */
/* */
/* RESTRICTIONS/LIMITATIONS: */
/* Assumes only one one SDRAM bank */
/* */
/*********************************************************************/
int mem_test_data (void)
{
unsigned long long *pmem = (unsigned long long *) CFG_MEMTEST_START;
unsigned long long temp64;
int num_patterns = sizeof (pattern) / sizeof (pattern[0]);
int i;
unsigned int hi, lo;
for (i = 0; i < num_patterns; i++) {
move64 (&(pattern[i]), pmem);
move64 (pmem, &temp64);
/* hi = (temp64>>32) & 0xffffffff; */
/* lo = temp64 & 0xffffffff; */
/* printf("\ntemp64 = 0x%08x%08x", hi, lo); */
hi = (pattern[i] >> 32) & 0xffffffff;
lo = pattern[i] & 0xffffffff;
/* printf("\npattern[%d] = 0x%08x%08x", i, hi, lo); */
if (temp64 != pattern[i]) {
printf ("\n Data Test Failed, pattern 0x%08x%08x",
hi, lo);
return 1;
}
}
return 0;
}
#endif /* CFG_DRAM_TEST_DATA */
#if defined (CFG_DRAM_TEST_ADDRESS)
/*********************************************************************/
/* NAME: mem_test_address() - test address lines */
/* */
/* DESCRIPTION: */
/* This function performs a test to verify that each word im */
/* memory is uniquly addressable. The test sequence is as follows: */
/* */
/* 1) write the address of each word to each word. */
/* 2) verify that each location equals its address */
/* */
/* OUTPUTS: */
/* Displays failing test pattern and address */
/* */
/* RETURNS: */
/* 0 - Passed test */
/* 1 - Failed test */
/* */
/* RESTRICTIONS/LIMITATIONS: */
/* */
/* */
/*********************************************************************/
int mem_test_address (void)
{
volatile unsigned int *pmem =
(volatile unsigned int *) CFG_MEMTEST_START;
const unsigned int size = (CFG_MEMTEST_END - CFG_MEMTEST_START) / 4;
unsigned int i;
/* write address to each location */
for (i = 0; i < size; i++) {
pmem[i] = i;
}
/* verify each loaction */
for (i = 0; i < size; i++) {
if (pmem[i] != i) {
printf ("\n Address Test Failed at 0x%x", i);
return 1;
}
}
return 0;
}
#endif /* CFG_DRAM_TEST_ADDRESS */
#if defined (CFG_DRAM_TEST_WALK)
/*********************************************************************/
/* NAME: mem_march() - memory march */
/* */
/* DESCRIPTION: */
/* Marches up through memory. At each location verifies rmask if */
/* read = 1. At each location write wmask if write = 1. Displays */
/* failing address and pattern. */
/* */
/* INPUTS: */
/* volatile unsigned long long * base - start address of test */
/* unsigned int size - number of dwords(64-bit) to test */
/* unsigned long long rmask - read verify mask */
/* unsigned long long wmask - wrtie verify mask */
/* short read - verifies rmask if read = 1 */
/* short write - writes wmask if write = 1 */
/* */
/* OUTPUTS: */
/* Displays failing test pattern and address */
/* */
/* RETURNS: */
/* 0 - Passed test */
/* 1 - Failed test */
/* */
/* RESTRICTIONS/LIMITATIONS: */
/* */
/* */
/*********************************************************************/
int mem_march (volatile unsigned long long *base,
unsigned int size,
unsigned long long rmask,
unsigned long long wmask, short read, short write)
{
unsigned int i;
unsigned long long temp;
unsigned int hitemp, lotemp, himask, lomask;
for (i = 0; i < size; i++) {
if (read != 0) {
/* temp = base[i]; */
move64 ((unsigned long long *) &(base[i]), &temp);
if (rmask != temp) {
hitemp = (temp >> 32) & 0xffffffff;
lotemp = temp & 0xffffffff;
himask = (rmask >> 32) & 0xffffffff;
lomask = rmask & 0xffffffff;
printf ("\n Walking one's test failed: address = 0x%08x," "\n\texpected 0x%08x%08x, found 0x%08x%08x", i << 3, himask, lomask, hitemp, lotemp);
return 1;
}
}
if (write != 0) {
/* base[i] = wmask; */
move64 (&wmask, (unsigned long long *) &(base[i]));
}
}
return 0;
}
#endif /* CFG_DRAM_TEST_WALK */
/*********************************************************************/
/* NAME: mem_test_walk() - a simple walking ones test */
/* */
/* DESCRIPTION: */
/* Performs a walking ones through entire physical memory. The */
/* test uses as series of memory marches, mem_march(), to verify */
/* and write the test patterns to memory. The test sequence is as */
/* follows: */
/* 1) march writing 0000...0001 */
/* 2) march verifying 0000...0001 , writing 0000...0010 */
/* 3) repeat step 2 shifting masks left 1 bit each time unitl */
/* the write mask equals 1000...0000 */
/* 4) march verifying 1000...0000 */
/* The test fails if any of the memory marches return a failure. */
/* */
/* OUTPUTS: */
/* Displays which pass on the memory test is executing */
/* */
/* RETURNS: */
/* 0 - Passed test */
/* 1 - Failed test */
/* */
/* RESTRICTIONS/LIMITATIONS: */
/* */
/* */
/*********************************************************************/
int mem_test_walk (void)
{
unsigned long long mask;
volatile unsigned long long *pmem =
(volatile unsigned long long *) CFG_MEMTEST_START;
const unsigned long size = (CFG_MEMTEST_END - CFG_MEMTEST_START) / 8;
unsigned int i;
mask = 0x01;
printf ("Initial Pass");
mem_march (pmem, size, 0x0, 0x1, 0, 1);
printf ("\b\b\b\b\b\b\b\b\b\b\b\b");
printf (" ");
printf (" ");
printf ("\b\b\b\b\b\b\b\b\b\b\b\b");
for (i = 0; i < 63; i++) {
printf ("Pass %2d", i + 2);
if (mem_march (pmem, size, mask, mask << 1, 1, 1) != 0) {
/*printf("mask: 0x%x, pass: %d, ", mask, i); */
return 1;
}
mask = mask << 1;
printf ("\b\b\b\b\b\b\b");
}
printf ("Last Pass");
if (mem_march (pmem, size, 0, mask, 0, 1) != 0) {
/* printf("mask: 0x%x", mask); */
return 1;
}
printf ("\b\b\b\b\b\b\b\b\b");
printf (" ");
printf ("\b\b\b\b\b\b\b\b\b");
return 0;
}
/*********************************************************************/
/* NAME: testdram() - calls any enabled memory tests */
/* */
/* DESCRIPTION: */
/* Runs memory tests if the environment test variables are set to */
/* 'y'. */
/* */
/* INPUTS: */
/* testdramdata - If set to 'y', data test is run. */
/* testdramaddress - If set to 'y', address test is run. */
/* testdramwalk - If set to 'y', walking ones test is run */
/* */
/* OUTPUTS: */
/* None */
/* */
/* RETURNS: */
/* 0 - Passed test */
/* 1 - Failed test */
/* */
/* RESTRICTIONS/LIMITATIONS: */
/* */
/* */
/*********************************************************************/
int testdram (void)
{
char *s;
int rundata = 0;
int runaddress = 0;
int runwalk = 0;
#ifdef CFG_DRAM_TEST_DATA
s = getenv ("testdramdata");
rundata = (s && (*s == 'y')) ? 1 : 0;
#endif
#ifdef CFG_DRAM_TEST_ADDRESS
s = getenv ("testdramaddress");
runaddress = (s && (*s == 'y')) ? 1 : 0;
#endif
#ifdef CFG_DRAM_TEST_WALK
s = getenv ("testdramwalk");
runwalk = (s && (*s == 'y')) ? 1 : 0;
#endif
if ((rundata == 1) || (runaddress == 1) || (runwalk == 1)) {
printf ("Testing RAM from 0x%08x to 0x%08x ... (don't panic... that will take a moment !!!!)\n", CFG_MEMTEST_START, CFG_MEMTEST_END);
}
#ifdef CFG_DRAM_TEST_DATA
if (rundata == 1) {
printf ("Test DATA ... ");
if (mem_test_data () == 1) {
printf ("failed \n");
return 1;
} else
printf ("ok \n");
}
#endif
#ifdef CFG_DRAM_TEST_ADDRESS
if (runaddress == 1) {
printf ("Test ADDRESS ... ");
if (mem_test_address () == 1) {
printf ("failed \n");
return 1;
} else
printf ("ok \n");
}
#endif
#ifdef CFG_DRAM_TEST_WALK
if (runwalk == 1) {
printf ("Test WALKING ONEs ... ");
if (mem_test_walk () == 1) {
printf ("failed \n");
return 1;
} else
printf ("ok \n");
}
#endif
if ((rundata == 1) || (runaddress == 1) || (runwalk == 1)) {
printf ("passed\n");
}
return 0;
}
#endif /* CFG_DRAM_TEST */
/* ronen - the below functions are used by the bootm function */
/* - we map the base register to fbe00000 (same mapping as in the LSP) */
/* - we turn off the RX gig dmas - to prevent the dma from overunning */
/* the kernel data areas. */
/* - we diable and invalidate the icache and dcache. */
void my_remap_gt_regs_bootm (u32 cur_loc, u32 new_loc)
{
u32 temp;
temp = in_le32 ((u32 *) (new_loc + INTERNAL_SPACE_DECODE));
if ((temp & 0xffff) == new_loc >> 16)
return;
temp = (in_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE)) &
0xffff0000) | (new_loc >> 16);
out_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE), temp);
while ((WORD_SWAP (*((volatile unsigned int *) (NONE_CACHEABLE |
new_loc |
(INTERNAL_SPACE_DECODE)))))
!= temp);
}
void board_prebootm_init ()
{
/* change window size of PCI1 IO in order tp prevent overlaping with REG BASE. */
GT_REG_WRITE (PCI_1_IO_SIZE, (_64K - 1) >> 16);
/* Stop GigE Rx DMA engines */
GT_REG_WRITE (MV64360_ETH_RECEIVE_QUEUE_COMMAND_REG (0), 0x0000ff00);
/* GT_REG_WRITE (MV64360_ETH_RECEIVE_QUEUE_COMMAND_REG (1), 0x0000ff00); */
/* GV_REG_WRITE (MV64360_ETH_RECEIVE_QUEUE_COMMAND_REG (2), 0x0000ff00); */
/* Relocate MV64360 internal regs */
my_remap_gt_regs_bootm (CFG_GT_REGS, CFG_DFL_GT_REGS);
icache_disable ();
invalidate_l1_instruction_cache ();
flush_data_cache ();
dcache_disable ();
}

43
board/esd/cpci750/eth.h Normal file
View File

@@ -0,0 +1,43 @@
/*
* (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
*/
/*
* eth.h - header file for the polled mode GT ethernet driver
*/
#ifndef __EVB64360_ETH_H__
#define __EVB64360_ETH_H__
#include <asm/types.h>
#include <asm/io.h>
#include <asm/byteorder.h>
#include <common.h>
int db64360_eth0_poll(void);
int db64360_eth0_transmit(unsigned int s, volatile char *p);
void db64360_eth0_disable(void);
bool network_start(bd_t *bis);
#endif /* __EVB64360_ETH_H__ */

487
board/esd/cpci750/i2c.c Normal file
View File

@@ -0,0 +1,487 @@
/*
* (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
*
* Hacked for the DB64360 board by Ingo.Assmus@keymile.com
* extra improvments by Brain Waite
* for cpci750 by reinhard.arlt@esd-electronics.com
*/
#include <common.h>
#include <mpc8xx.h>
#include <malloc.h>
#include "../../Marvell/include/mv_gen_reg.h"
#include "../../Marvell/include/core.h"
#define I2C_DELAY 100
#undef DEBUG_I2C
#ifdef DEBUG_I2C
#define DP(x) x
#else
#define DP(x)
#endif
/* Assuming that there is only one master on the bus (us) */
static void i2c_init (int speed, int slaveaddr)
{
unsigned int n, m, freq, margin, power;
unsigned int actualN = 0, actualM = 0;
unsigned int minMargin = 0xffffffff;
unsigned int tclk = CFG_TCLK;
unsigned int i2cFreq = speed; /* 100000 max. Fast mode not supported */
DP (puts ("i2c_init\n"));
/* gtI2cMasterInit */
for (n = 0; n < 8; n++) {
for (m = 0; m < 16; m++) {
power = 2 << n; /* power = 2^(n+1) */
freq = tclk / (10 * (m + 1) * power);
if (i2cFreq > freq)
margin = i2cFreq - freq;
else
margin = freq - i2cFreq;
if (margin < minMargin) {
minMargin = margin;
actualN = n;
actualM = m;
}
}
}
DP (puts ("setup i2c bus\n"));
/* Setup bus */
/* gtI2cReset */
GT_REG_WRITE (I2C_SOFT_RESET, 0);
asm(" sync");
GT_REG_WRITE (I2C_CONTROL, 0);
asm(" sync");
DP (puts ("set baudrate\n"));
GT_REG_WRITE (I2C_STATUS_BAUDE_RATE, (actualM << 3) | actualN);
asm(" sync");
DP (puts ("udelay...\n"));
udelay (I2C_DELAY);
GT_REG_WRITE (I2C_CONTROL, (0x1 << 2) | (0x1 << 6));
asm(" sync");
}
static uchar i2c_select_device (uchar dev_addr, uchar read, int ten_bit)
{
unsigned int status, data, bits = 7;
unsigned int control;
int count = 0;
DP (puts ("i2c_select_device\n"));
/* Output slave address */
if (ten_bit) {
bits = 10;
}
GT_REG_READ (I2C_CONTROL, &control);
control |= (0x1 << 2);
GT_REG_WRITE (I2C_CONTROL, control);
asm(" sync");
GT_REG_READ (I2C_CONTROL, &control);
control |= (0x1 << 5); /* generate the I2C_START_BIT */
GT_REG_WRITE (I2C_CONTROL, control);
asm(" sync");
RESET_REG_BITS (I2C_CONTROL, (0x01 << 3));
asm(" sync");
GT_REG_READ (I2C_CONTROL, &status);
while ((status & 0x08) != 0x08) {
GT_REG_READ (I2C_CONTROL, &status);
}
count = 0;
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
while (((status & 0xff) != 0x08) && ((status & 0xff) != 0x10)){
if (count > 200) {
#ifdef DEBUG_I2C
printf ("Failed to set startbit: 0x%02x\n", status);
#endif
GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */
asm(" sync");
return (status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count++;
}
DP (puts ("i2c_select_device:write addr byte\n"));
/* assert the address */
data = (dev_addr << 1);
/* set the read bit */
data |= read;
GT_REG_WRITE (I2C_DATA, data);
asm(" sync");
RESET_REG_BITS (I2C_CONTROL, BIT3);
asm(" sync");
GT_REG_READ (I2C_CONTROL, &status);
while ((status & 0x08) != 0x08) {
GT_REG_READ (I2C_CONTROL, &status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count = 0;
while (((status & 0xff) != 0x40) && ((status & 0xff) != 0x18)) {
if (count > 200) {
#ifdef DEBUG_I2C
printf ("Failed to write address: 0x%02x\n", status);
#endif
GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */
return (status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
asm(" sync");
count++;
}
if (bits == 10) {
printf ("10 bit I2C addressing not yet implemented\n");
return (0xff);
}
return (0);
}
static uchar i2c_get_data (uchar * return_data, int len)
{
unsigned int data, status;
int count = 0;
DP (puts ("i2c_get_data\n"));
while (len) {
RESET_REG_BITS (I2C_CONTROL, BIT3);
asm(" sync");
/* Get and return the data */
GT_REG_READ (I2C_CONTROL, &status);
while ((status & 0x08) != 0x08) {
GT_REG_READ (I2C_CONTROL, &status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count++;
while ((status & 0xff) != 0x50) {
if (count > 20) {
#ifdef DEBUG_I2C
printf ("Failed to get data len status: 0x%02x\n", status);
#endif
GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */
asm(" sync");
return 0;
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count++;
}
GT_REG_READ (I2C_DATA, &data);
len--;
*return_data = (uchar) data;
return_data++;
}
RESET_REG_BITS (I2C_CONTROL, BIT2 | BIT3);
asm(" sync");
count = 0;
GT_REG_READ (I2C_CONTROL, &status);
while ((status & 0x08) != 0x08) {
GT_REG_READ (I2C_CONTROL, &status);
}
while ((status & 0xff) != 0x58) {
if (count > 2000) {
GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */
return (status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count++;
}
GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /* stop */
asm(" sync");
RESET_REG_BITS (I2C_CONTROL, (0x1 << 3));
asm(" sync");
return (0);
}
static uchar i2c_write_data (unsigned int *data, int len)
{
unsigned int status;
int count;
unsigned int temp;
unsigned int *temp_ptr = data;
DP (puts ("i2c_write_data\n"));
while (len) {
count = 0;
temp = (unsigned int) (*temp_ptr);
GT_REG_WRITE (I2C_DATA, temp);
asm(" sync");
RESET_REG_BITS (I2C_CONTROL, (0x1 << 3));
asm(" sync");
GT_REG_READ (I2C_CONTROL, &status);
while ((status & 0x08) != 0x08) {
GT_REG_READ (I2C_CONTROL, &status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count++;
while ((status & 0xff) != 0x28) {
if (count > 200) {
GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */
asm(" sync");
return (status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count++;
}
len--;
temp_ptr++;
}
return (0);
}
static uchar i2c_write_byte (unsigned char *data, int len)
{
unsigned int status;
int count;
unsigned int temp;
unsigned char *temp_ptr = data;
DP (puts ("i2c_write_byte\n"));
while (len) {
count = 0;
/* Set and assert the data */
temp = *temp_ptr;
GT_REG_WRITE (I2C_DATA, temp);
asm(" sync");
RESET_REG_BITS (I2C_CONTROL, (0x1 << 3));
asm(" sync");
GT_REG_READ (I2C_CONTROL, &status);
while ((status & 0x08) != 0x08) {
GT_REG_READ (I2C_CONTROL, &status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count++;
while ((status & 0xff) != 0x28) {
if (count > 200) {
GT_REG_WRITE (I2C_CONTROL, (0x1 << 4)); /*stop */
asm(" sync");
return (status);
}
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &status);
count++;
}
len--;
temp_ptr++;
}
return (0);
}
static uchar
i2c_set_dev_offset (uchar dev_addr, unsigned int offset, int ten_bit,
int alen)
{
uchar status;
unsigned int table[2];
table[1] = (offset ) & 0x0ff; /* low byte */
table[0] = (offset >> 8) & 0x0ff; /* high byte */
DP (puts ("i2c_set_dev_offset\n"));
status = i2c_select_device (dev_addr, 0, ten_bit);
if (status) {
#ifdef DEBUG_I2C
22 printf ("Failed to select device setting offset: 0x%02x\n",
status);
#endif
return status;
}
/* check the address offset length */
if (alen == 0)
/* no address offset */
return (0);
else if (alen == 1) {
/* 1 byte address offset */
status = i2c_write_data (&offset, 1);
if (status) {
#ifdef DEBUG_I2C
printf ("Failed to write data: 0x%02x\n", status);
#endif
return status;
}
} else if (alen == 2) {
/* 2 bytes address offset */
status = i2c_write_data (table, 2);
if (status) {
#ifdef DEBUG_I2C
printf ("Failed to write data: 0x%02x\n", status);
#endif
return status;
}
} else {
/* address offset unknown or not supported */
printf ("Address length offset %d is not supported\n", alen);
return 1;
}
return 0; /* sucessful completion */
}
uchar
i2c_read (uchar dev_addr, unsigned int offset, int alen, uchar * data,
int len)
{
uchar status = 0;
unsigned int i2cFreq = CFG_I2C_SPEED;
DP (puts ("i2c_read\n"));
i2c_init (i2cFreq, 0); /* set the i2c frequency */
status = i2c_set_dev_offset (dev_addr, offset, 0, alen); /* send the slave address + offset */
if (status) {
#ifdef DEBUG_I2C
printf ("Failed to set slave address & offset: 0x%02x\n",
status);
#endif
return status;
}
status = i2c_select_device (dev_addr, 1, 0);
if (status) {
#ifdef DEBUG_I2C
printf ("Failed to select device for data read: 0x%02x\n",
status);
#endif
return status;
}
status = i2c_get_data (data, len);
if (status) {
#ifdef DEBUG_I2C
printf ("Data not read: 0x%02x\n", status);
#endif
return status;
}
return 0;
}
void i2c_stop (void)
{
GT_REG_WRITE (I2C_CONTROL, (0x1 << 4));
asm(" sync");
}
uchar
i2c_write (uchar dev_addr, unsigned int offset, int alen, uchar * data,
int len)
{
uchar status = 0;
unsigned int i2cFreq = CFG_I2C_SPEED;
DP (puts ("i2c_write\n"));
i2c_init (i2cFreq, 0); /* set the i2c frequency */
status = i2c_set_dev_offset (dev_addr, offset, 0, alen); /* send the slave address + offset */
if (status) {
#ifdef DEBUG_I2C
printf ("Failed to set slave address & offset: 0x%02x\n",
status);
#endif
return status;
}
status = i2c_write_byte (data, len); /* write the data */
if (status) {
#ifdef DEBUG_I2C
printf ("Data not written: 0x%02x\n", status);
#endif
return status;
}
/* issue a stop bit */
i2c_stop ();
return 0;
}
int i2c_probe (uchar chip)
{
#ifdef DEBUG_I2C
unsigned int i2c_status;
#endif
uchar status = 0;
unsigned int i2cFreq = CFG_I2C_SPEED;
DP (puts ("i2c_probe\n"));
i2c_init (i2cFreq, 0); /* set the i2c frequency */
status = i2c_set_dev_offset (chip, 0, 0, 0); /* send the slave address + no offset */
if (status) {
#ifdef DEBUG_I2C
printf ("Failed to set slave address: 0x%02x\n", status);
#endif
return (int) status;
}
#ifdef DEBUG_I2C
GT_REG_READ (I2C_STATUS_BAUDE_RATE, &i2c_status);
printf ("address %#x returned %#x\n", chip, i2c_status);
#endif
/* issue a stop bit */
i2c_stop ();
return 0; /* successful completion */
}

32
board/esd/cpci750/i2c.h Normal file
View File

@@ -0,0 +1,32 @@
/*
* (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
*
* Hacked for the DB64360 board by Ingo.Assmus@keymile.com
*/
#ifndef __I2C_H__
#define __I2C_H__
/* function declarations */
uchar i2c_read(uchar, unsigned int, int, uchar*, int);
#endif

65
board/esd/cpci750/ide.c Normal file
View File

@@ -0,0 +1,65 @@
/*
* (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
*
*/
/* ide.c - ide support functions */
#include <common.h>
#ifdef CFG_CMD_IDE
#include <ata.h>
#include <ide.h>
#include <pci.h>
extern ulong ide_bus_offset[CFG_IDE_MAXBUS];
int ide_preinit (void)
{
int status;
pci_dev_t devbusfn;
int l;
status = 1;
for (l = 0; l < CFG_IDE_MAXBUS; l++) {
ide_bus_offset[l] = -ATA_STATUS;
}
devbusfn = pci_find_device (0x1103, 0x0004, 0);
if (devbusfn != -1) {
status = 0;
pci_read_config_dword (devbusfn, PCI_BASE_ADDRESS_0,
(u32 *) & ide_bus_offset[0]);
ide_bus_offset[0] &= 0xfffffffe;
ide_bus_offset[0] += CFG_PCI0_IO_SPACE;
pci_read_config_dword (devbusfn, PCI_BASE_ADDRESS_2,
(u32 *) & ide_bus_offset[1]);
ide_bus_offset[1] &= 0xfffffffe;
ide_bus_offset[1] += CFG_PCI0_IO_SPACE;
}
return (status);
}
void ide_set_reset (int flag) {
return;
}
#endif /* of CONFIG_CMDS_IDE */

83
board/esd/cpci750/local.h Normal file
View File

@@ -0,0 +1,83 @@
/*
* (C) Copyright 2003
* Ingo Assmus <ingo.assmus@keymile.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* include/local.h - local configuration options, board specific
*/
#ifndef __LOCAL_H
#define __LOCAL_H
/*
* High Level Configuration Options
* (easy to change)
*/
/* This tells PPCBoot that the config options are compiled in */
/* #undef ENV_IS_EMBEDDED */
/* Don't touch this! PPCBOOT figures this out based on other
* magic. */
/* Uncomment and define any of the below options */
/* #define CONFIG_750CX */ /* The 750CX doesn't support as many things in L2CR */
#define CONFIG_750FX /* The 750FX doesn't support as many things in L2CR like 750CX*/
/* These want string arguments */
/* #define CONFIG_BOOTARGS */
/* #define CONFIG_BOOTCOMMAND */
/* #define CONFIG_RAMBOOTCOMMAND */
/* #define CONFIG_NFSBOOTCOMMAND */
/* #define CFG_AUTOLOAD */
/* #define CONFIG_PREBOOT */
/* These don't */
/* #define CONFIG_BOOTDELAY */
/* #define CONFIG_BAUDRATE */
/* #define CONFIG_LOADS_ECHO */
/* #define CONFIG_ETHADDR */
/* #define CONFIG_ETH2ADDR */
/* #define CONFIG_ETH3ADDR */
/* #define CONFIG_IPADDR */
/* #define CONFIG_SERVERIP */
/* #define CONFIG_ROOTPATH */
/* #define CONFIG_GATEWAYIP */
/* #define CONFIG_NETMASK */
/* #define CONFIG_HOSTNAME */
/* #define CONFIG_BOOTFILE */
/* #define CONFIG_LOADADDR */
/* these hardware addresses are pretty bogus, please change them to
suit your needs */
/* first ethernet */
/* #define CONFIG_ETHADDR 86:06:2d:7e:c6:53 */
#define CONFIG_ETHADDR 64:36:00:00:00:01
/* next two ethernet hwaddrs */
#define CONFIG_ETH1ADDR 86:06:2d:7e:c6:54
#define CONFIG_ETH2ADDR 86:06:2d:7e:c6:55
#define CONFIG_ENV_OVERWRITE
#endif /* __CONFIG_H */

245
board/esd/cpci750/misc.S Normal file
View File

@@ -0,0 +1,245 @@
#include <config.h>
#include <74xx_7xx.h>
#include "version.h"
#include <ppc_asm.tmpl>
#include <ppc_defs.h>
#include <asm/cache.h>
#include <asm/mmu.h>
#include "../../Marvell/include/mv_gen_reg.h"
#ifdef CONFIG_ECC
/* Galileo specific asm code for initializing ECC */
.globl board_relocate_rom
board_relocate_rom:
mflr r7
/* update the location of the GT registers */
lis r11, CFG_GT_REGS@h
/* if we're using ECC, we must use the DMA engine to copy ourselves */
bl start_idma_transfer_0
bl wait_for_idma_0
bl stop_idma_engine_0
mtlr r7
blr
.globl board_init_ecc
board_init_ecc:
mflr r7
/* NOTE: r10 still contains the location we've been relocated to
* which happens to be TOP_OF_RAM - CFG_MONITOR_LEN */
/* now that we're running from ram, init the rest of main memory
* for ECC use */
lis r8, CFG_MONITOR_LEN@h
ori r8, r8, CFG_MONITOR_LEN@l
divw r3, r10, r8
/* set up the counter, and init the starting address */
mtctr r3
li r12, 0
/* bytes per transfer */
mr r5, r8
about_to_init_ecc:
1: mr r3, r12
mr r4, r12
bl start_idma_transfer_0
bl wait_for_idma_0
bl stop_idma_engine_0
add r12, r12, r8
bdnz 1b
mtlr r7
blr
/* r3: dest addr
* r4: source addr
* r5: byte count
* r11: gt regbase
* trashes: r6, r5
*/
start_idma_transfer_0:
/* set the byte count, including the OWN bit */
mr r6, r11
ori r6, r6, CHANNEL0_DMA_BYTE_COUNT
stwbrx r5, 0, (r6)
/* set the source address */
mr r6, r11
ori r6, r6, CHANNEL0_DMA_SOURCE_ADDRESS
stwbrx r4, 0, (r6)
/* set the dest address */
mr r6, r11
ori r6, r6, CHANNEL0_DMA_DESTINATION_ADDRESS
stwbrx r3, 0, (r6)
/* set the next record pointer */
li r5, 0
mr r6, r11
ori r6, r6, CHANNEL0NEXT_RECORD_POINTER
stwbrx r5, 0, (r6)
/* set the low control register */
/* bit 9 is NON chained mode, bit 31 is new style descriptors.
bit 12 is channel enable */
ori r5, r5, (1 << 12) | (1 << 12) | (1 << 11)
/* 15 shifted by 16 (oris) == bit 31 */
oris r5, r5, (1 << 15)
mr r6, r11
ori r6, r6, CHANNEL0CONTROL
stwbrx r5, 0, (r6)
blr
/* this waits for the bytecount to return to zero, indicating
* that the trasfer is complete */
wait_for_idma_0:
mr r5, r11
lis r6, 0xff
ori r6, r6, 0xffff
ori r5, r5, CHANNEL0_DMA_BYTE_COUNT
1: lwbrx r4, 0, (r5)
and. r4, r4, r6
bne 1b
blr
/* this turns off channel 0 of the idma engine */
stop_idma_engine_0:
/* shut off the DMA engine */
li r5, 0
mr r6, r11
ori r6, r6, CHANNEL0CONTROL
stwbrx r5, 0, (r6)
blr
#endif
#ifdef CFG_BOARD_ASM_INIT
/* NOTE: trashes r3-r7 */
.globl board_asm_init
board_asm_init:
/* just move the GT registers to where they belong */
lis r3, CFG_DFL_GT_REGS@h
ori r3, r3, CFG_DFL_GT_REGS@l
lis r4, CFG_GT_REGS@h
ori r4, r4, CFG_GT_REGS@l
li r5, INTERNAL_SPACE_DECODE
/* test to see if we've already moved */
lwbrx r6, r5, r4
andi. r6, r6, 0xffff
/* check loading of R7 is: 0x0F80 should: 0xf800: DONE */
/* rlwinm r7, r4, 8, 16, 31
rlwinm r7, r4, 12, 16, 31 */ /* original */
rlwinm r7, r4, 16, 16, 31
/* -----------------------------------------------------*/
cmp cr0, r7, r6
beqlr
/* nope, have to move the registers */
lwbrx r6, r5, r3
andis. r6, r6, 0xffff
or r6, r6, r7
stwbrx r6, r5, r3
/* now, poll for the change */
1: lwbrx r7, r5, r4
cmp cr0, r7, r6
bne 1b
lis r3, CFG_INT_SRAM_BASE@h
ori r3, r3, CFG_INT_SRAM_BASE@l
rlwinm r3, r3, 16, 16, 31
lis r4, CFG_GT_REGS@h
ori r4, r4, CFG_GT_REGS@l
li r5, INTEGRATED_SRAM_BASE_ADDR
stwbrx r3, r5, r4
2: lwbrx r6, r5, r4
cmp cr0, r3, r6
bne 2b
/* done! */
blr
#endif
/* For use of the debug LEDs */
.global led_on0_relocated
led_on0_relocated:
xor r21, r21, r21
xor r18, r18, r18
lis r18, 0xFC80
ori r18, r18, 0x8000
/* stw r21, 0x0(r18) */
sync
blr
.global led_off0_relocated
led_off0_relocated:
xor r21, r21, r21
xor r18, r18, r18
lis r18, 0xFC81
ori r18, r18, 0x4000
/* stw r21, 0x0(r18) */
sync
blr
.global led_on0
led_on0:
xor r18, r18, r18
lis r18, 0x1c80
ori r18, r18, 0x8000
/* stw r18, 0x0(r18) */
sync
blr
.global led_off0
led_off0:
xor r18, r18, r18
lis r18, 0x1c81
ori r18, r18, 0x4000
/* stw r18, 0x0(r18) */
sync
blr
.global led_on1
led_on1:
xor r18, r18, r18
lis r18, 0x1c80
ori r18, r18, 0xc000
/* stw r18, 0x0(r18) */
sync
blr
.global led_off1
led_off1:
xor r18, r18, r18
lis r18, 0x1c81
ori r18, r18, 0x8000
/* stw r18, 0x0(r18) */
sync
blr
.global led_on2
led_on2:
xor r18, r18, r18
lis r18, 0x1c81
ori r18, r18, 0x0000
/* stw r18, 0x0(r18) */
sync
blr
.global led_off2
led_off2:
xor r18, r18, r18
lis r18, 0x1c81
ori r18, r18, 0xc000
/* stw r18, 0x0(r18) */
sync
blr

1018
board/esd/cpci750/mpsc.c Normal file

File diff suppressed because it is too large Load Diff

156
board/esd/cpci750/mpsc.h Normal file
View File

@@ -0,0 +1,156 @@
/*
* (C) Copyright 2001
* John Clemens <clemens@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
*/
/*************************************************************************
* changes for Marvell DB64360 eval board 2003 by Ingo Assmus <ingo.assmus@keymile.com>
*
************************************************************************/
/*
* mpsc.h - header file for MPSC in uart mode (console driver)
*/
#ifndef __MPSC_H__
#define __MPSC_H__
/* include actual Galileo defines */
#include "../../Marvell/include/mv_gen_reg.h"
/* driver related defines */
int mpsc_init(int baud);
void mpsc_sdma_init(void);
void mpsc_init2(void);
int galbrg_set_baudrate(int channel, int rate);
int mpsc_putchar_early(char ch);
char mpsc_getchar_debug(void);
int mpsc_test_char_debug(void);
int mpsc_test_char_sdma(void);
extern int (*mpsc_putchar)(char ch);
extern char (*mpsc_getchar)(void);
extern int (*mpsc_test_char)(void);
#define CHANNEL CONFIG_MPSC_PORT
#define TX_DESC 5
#define RX_DESC 20
#define DESC_FIRST 0x00010000
#define DESC_LAST 0x00020000
#define DESC_OWNER_BIT 0x80000000
#define TX_DEMAND 0x00800000
#define TX_STOP 0x00010000
#define RX_ENABLE 0x00000080
#define SDMA_RX_ABORT (1 << 15)
#define SDMA_TX_ABORT (1 << 31)
#define MPSC_TX_ABORT (1 << 7)
#define MPSC_RX_ABORT (1 << 23)
#define MPSC_ENTER_HUNT (1 << 31)
/* MPSC defines */
#define GALMPSC_CONNECT 0x1
#define GALMPSC_DISCONNECT 0x0
#define GALMPSC_UART 0x1
#define GALMPSC_STOP_BITS_1 0x0
#define GALMPSC_STOP_BITS_2 0x1
#define GALMPSC_CHAR_LENGTH_8 0x3
#define GALMPSC_CHAR_LENGTH_7 0x2
#define GALMPSC_PARITY_ODD 0x0
#define GALMPSC_PARITY_EVEN 0x2
#define GALMPSC_PARITY_MARK 0x3
#define GALMPSC_PARITY_SPACE 0x1
#define GALMPSC_PARITY_NONE -1
#define GALMPSC_SERIAL_MULTIPLEX SERIAL_PORT_MULTIPLEX /* 0xf010 */
#define GALMPSC_ROUTING_REGISTER MAIN_ROUTING_REGISTER /* 0xb400 */
#define GALMPSC_RxC_ROUTE RECEIVE_CLOCK_ROUTING_REGISTER /* 0xb404 */
#define GALMPSC_TxC_ROUTE TRANSMIT_CLOCK_ROUTING_REGISTER /* 0xb408 */
#define GALMPSC_MCONF_LOW MPSC0_MAIN_CONFIGURATION_LOW /* 0x8000 */
#define GALMPSC_MCONF_HIGH MPSC0_MAIN_CONFIGURATION_HIGH /* 0x8004 */
#define GALMPSC_PROTOCONF_REG MPSC0_PROTOCOL_CONFIGURATION /* 0x8008 */
#define GALMPSC_REG_GAP 0x1000
#define GALMPSC_MCONF_CHREG_BASE CHANNEL0_REGISTER1 /* 0x800c */
#define GALMPSC_CHANNELREG_1 CHANNEL0_REGISTER1 /* 0x800c */
#define GALMPSC_CHANNELREG_2 CHANNEL0_REGISTER2 /* 0x8010 */
#define GALMPSC_CHANNELREG_3 CHANNEL0_REGISTER3 /* 0x8014 */
#define GALMPSC_CHANNELREG_4 CHANNEL0_REGISTER4 /* 0x8018 */
#define GALMPSC_CHANNELREG_5 CHANNEL0_REGISTER5 /* 0x801c */
#define GALMPSC_CHANNELREG_6 CHANNEL0_REGISTER6 /* 0x8020 */
#define GALMPSC_CHANNELREG_7 CHANNEL0_REGISTER7 /* 0x8024 */
#define GALMPSC_CHANNELREG_8 CHANNEL0_REGISTER8 /* 0x8028 */
#define GALMPSC_CHANNELREG_9 CHANNEL0_REGISTER9 /* 0x802c */
#define GALMPSC_CHANNELREG_10 CHANNEL0_REGISTER10 /* 0x8030 */
#define GALMPSC_CHANNELREG_11 CHANNEL0_REGISTER11 /* 0x8034 */
#define GALSDMA_COMMAND_FIRST (1 << 16)
#define GALSDMA_COMMAND_LAST (1 << 17)
#define GALSDMA_COMMAND_ENABLEINT (1 << 23)
#define GALSDMA_COMMAND_AUTO (1 << 30)
#define GALSDMA_COMMAND_OWNER (1 << 31)
#define GALSDMA_RX 0
#define GALSDMA_TX 1
/* CHANNEL2 should be CHANNEL1, according to documentation,
* but to work with the current GTREGS file...
*/
#define GALSDMA_0_CONF_REG CHANNEL0_CONFIGURATION_REGISTER /* 0x4000 */
#define GALSDMA_1_CONF_REG CHANNEL2_CONFIGURATION_REGISTER /* 0x6000 */
#define GALSDMA_0_COM_REG CHANNEL0_COMMAND_REGISTER /* 0x4008 */
#define GALSDMA_1_COM_REG CHANNEL2_COMMAND_REGISTER /* 0x6008 */
#define GALSDMA_0_CUR_RX_PTR CHANNEL0_CURRENT_RX_DESCRIPTOR_POINTER /* 0x4810 */
#define GALSDMA_0_CUR_TX_PTR CHANNEL0_CURRENT_TX_DESCRIPTOR_POINTER /* 0x4c10 */
#define GALSDMA_0_FIR_TX_PTR CHANNEL0_FIRST_TX_DESCRIPTOR_POINTER /* 0x4c14 */
#define GALSDMA_1_CUR_RX_PTR CHANNEL2_CURRENT_RX_DESCRIPTOR_POINTER /* 0x6810 */
#define GALSDMA_1_CUR_TX_PTR CHANNEL2_CURRENT_TX_DESCRIPTOR_POINTER /* 0x6c10 */
#define GALSDMA_1_FIR_TX_PTR CHANNEL2_FIRST_TX_DESCRIPTOR_POINTER /* 0x6c14 */
#define GALSDMA_REG_DIFF 0x2000
/* WRONG in gt64260R.h */
#define GALSDMA_INT_CAUSE 0xb800 /* SDMA_CAUSE */
#define GALSDMA_INT_MASK 0xb880 /* SDMA_MASK */
#define GALMPSC_0_INT_CAUSE 0xb804
#define GALMPSC_0_INT_MASK 0xb884
#define GALSDMA_MODE_UART 0
#define GALSDMA_MODE_BISYNC 1
#define GALSDMA_MODE_HDLC 2
#define GALSDMA_MODE_TRANSPARENT 3
#define GALBRG_0_CONFREG BRG0_CONFIGURATION_REGISTER /* 0xb200 */
#define GALBRG_REG_GAP 0x0008
#define GALBRG_0_BTREG BRG0_BAUDE_TUNING_REGISTER /* 0xb204 */
#endif /* __MPSC_H__ */

3182
board/esd/cpci750/mv_eth.c Normal file

File diff suppressed because it is too large Load Diff

844
board/esd/cpci750/mv_eth.h Normal file
View File

@@ -0,0 +1,844 @@
/*
* (C) Copyright 2003
* Ingo Assmus <ingo.assmus@keymile.com>
*
* based on - Driver for MV64360X ethernet ports
* Copyright (C) 2002 rabeeh@galileo.co.il
*
* 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
*/
/*
* mv_eth.h - header file for the polled mode GT ethernet driver
*/
#ifndef __DB64360_ETH_H__
#define __DB64360_ETH_H__
#include <asm/types.h>
#include <asm/io.h>
#include <asm/byteorder.h>
#include <common.h>
#include <net.h>
#include "mv_regs.h"
#include "../../Marvell/common/ppc_error_no.h"
/*************************************************************************
**************************************************************************
**************************************************************************
* The first part is the high level driver of the gigE ethernet ports. *
**************************************************************************
**************************************************************************
*************************************************************************/
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
/* In case not using SG on Tx, define MAX_SKB_FRAGS as 0 */
#ifndef MAX_SKB_FRAGS
#define MAX_SKB_FRAGS 0
#endif
/* Port attributes */
/*#define MAX_RX_QUEUE_NUM 8*/
/*#define MAX_TX_QUEUE_NUM 8*/
#define MAX_RX_QUEUE_NUM 1
#define MAX_TX_QUEUE_NUM 1
/* Use one TX queue and one RX queue */
#define MV64360_TX_QUEUE_NUM 1
#define MV64360_RX_QUEUE_NUM 1
/*
* Number of RX / TX descriptors on RX / TX rings.
* Note that allocating RX descriptors is done by allocating the RX
* ring AND a preallocated RX buffers (skb's) for each descriptor.
* The TX descriptors only allocates the TX descriptors ring,
* with no pre allocated TX buffers (skb's are allocated by higher layers.
*/
/* Default TX ring size is 10 descriptors */
#ifdef CONFIG_MV64360_ETH_TXQUEUE_SIZE
#define MV64360_TX_QUEUE_SIZE CONFIG_MV64360_ETH_TXQUEUE_SIZE
#else
#define MV64360_TX_QUEUE_SIZE 4
#endif
/* Default RX ring size is 4 descriptors */
#ifdef CONFIG_MV64360_ETH_RXQUEUE_SIZE
#define MV64360_RX_QUEUE_SIZE CONFIG_MV64360_ETH_RXQUEUE_SIZE
#else
#define MV64360_RX_QUEUE_SIZE 4
#endif
#ifdef CONFIG_RX_BUFFER_SIZE
#define MV64360_RX_BUFFER_SIZE CONFIG_RX_BUFFER_SIZE
#else
#define MV64360_RX_BUFFER_SIZE 1600
#endif
#ifdef CONFIG_TX_BUFFER_SIZE
#define MV64360_TX_BUFFER_SIZE CONFIG_TX_BUFFER_SIZE
#else
#define MV64360_TX_BUFFER_SIZE 1600
#endif
/*
* Network device statistics. Akin to the 2.0 ether stats but
* with byte counters.
*/
struct net_device_stats
{
unsigned long rx_packets; /* total packets received */
unsigned long tx_packets; /* total packets transmitted */
unsigned long rx_bytes; /* total bytes received */
unsigned long tx_bytes; /* total bytes transmitted */
unsigned long rx_errors; /* bad packets received */
unsigned long tx_errors; /* packet transmit problems */
unsigned long rx_dropped; /* no space in linux buffers */
unsigned long tx_dropped; /* no space available in linux */
unsigned long multicast; /* multicast packets received */
unsigned long collisions;
/* detailed rx_errors: */
unsigned long rx_length_errors;
unsigned long rx_over_errors; /* receiver ring buff overflow */
unsigned long rx_crc_errors; /* recved pkt with crc error */
unsigned long rx_frame_errors; /* recv'd frame alignment error */
unsigned long rx_fifo_errors; /* recv'r fifo overrun */
unsigned long rx_missed_errors; /* receiver missed packet */
/* detailed tx_errors */
unsigned long tx_aborted_errors;
unsigned long tx_carrier_errors;
unsigned long tx_fifo_errors;
unsigned long tx_heartbeat_errors;
unsigned long tx_window_errors;
/* for cslip etc */
unsigned long rx_compressed;
unsigned long tx_compressed;
};
/* Private data structure used for ethernet device */
struct mv64360_eth_priv {
unsigned int port_num;
struct net_device_stats *stats;
/* to buffer area aligned */
char * p_eth_tx_buffer[MV64360_TX_QUEUE_SIZE+1]; /*pointers to alligned tx buffs in memory space */
char * p_eth_rx_buffer[MV64360_RX_QUEUE_SIZE+1]; /*pointers to allinged rx buffs in memory space */
/* Size of Tx Ring per queue */
unsigned int tx_ring_size [MAX_TX_QUEUE_NUM];
/* Size of Rx Ring per queue */
unsigned int rx_ring_size [MAX_RX_QUEUE_NUM];
/* Magic Number for Ethernet running */
unsigned int eth_running;
};
int mv64360_eth_init (struct eth_device *dev);
int mv64360_eth_stop (struct eth_device *dev);
int mv64360_eth_start_xmit (struct eth_device*, volatile void* packet, int length);
/* return db64360_eth0_poll(); */
int mv64360_eth_open (struct eth_device *dev);
/*************************************************************************
**************************************************************************
**************************************************************************
* The second part is the low level driver of the gigE ethernet ports. *
**************************************************************************
**************************************************************************
*************************************************************************/
/********************************************************************************
* Header File for : MV-643xx network interface header
*
* DESCRIPTION:
* This header file contains macros typedefs and function declaration for
* the Marvell Gig Bit Ethernet Controller.
*
* DEPENDENCIES:
* None.
*
*******************************************************************************/
#ifdef CONFIG_SPECIAL_CONSISTENT_MEMORY
#ifdef CONFIG_MV64360_SRAM_CACHEABLE
/* In case SRAM is cacheable but not cache coherent */
#define D_CACHE_FLUSH_LINE(addr, offset) \
{ \
__asm__ __volatile__ ("dcbf %0,%1" : : "r" (addr), "r" (offset)); \
}
#else
/* In case SRAM is cache coherent or non-cacheable */
#define D_CACHE_FLUSH_LINE(addr, offset) ;
#endif
#else
#ifdef CONFIG_NOT_COHERENT_CACHE
/* In case of descriptors on DDR but not cache coherent */
#define D_CACHE_FLUSH_LINE(addr, offset) \
{ \
__asm__ __volatile__ ("dcbf %0,%1" : : "r" (addr), "r" (offset)); \
}
#else
/* In case of descriptors on DDR and cache coherent */
#define D_CACHE_FLUSH_LINE(addr, offset) ;
#endif /* CONFIG_NOT_COHERENT_CACHE */
#endif /* CONFIG_SPECIAL_CONSISTENT_MEMORY */
#define CPU_PIPE_FLUSH \
{ \
__asm__ __volatile__ ("eieio"); \
}
/* defines */
/* Default port configuration value */
#define PORT_CONFIG_VALUE \
ETH_UNICAST_NORMAL_MODE | \
ETH_DEFAULT_RX_QUEUE_0 | \
ETH_DEFAULT_RX_ARP_QUEUE_0 | \
ETH_RECEIVE_BC_IF_NOT_IP_OR_ARP | \
ETH_RECEIVE_BC_IF_IP | \
ETH_RECEIVE_BC_IF_ARP | \
ETH_CAPTURE_TCP_FRAMES_DIS | \
ETH_CAPTURE_UDP_FRAMES_DIS | \
ETH_DEFAULT_RX_TCP_QUEUE_0 | \
ETH_DEFAULT_RX_UDP_QUEUE_0 | \
ETH_DEFAULT_RX_BPDU_QUEUE_0
/* Default port extend configuration value */
#define PORT_CONFIG_EXTEND_VALUE \
ETH_SPAN_BPDU_PACKETS_AS_NORMAL | \
ETH_PARTITION_DISABLE
/* Default sdma control value */
#ifdef CONFIG_NOT_COHERENT_CACHE
#define PORT_SDMA_CONFIG_VALUE \
ETH_RX_BURST_SIZE_16_64BIT | \
GT_ETH_IPG_INT_RX(0) | \
ETH_TX_BURST_SIZE_16_64BIT;
#else
#define PORT_SDMA_CONFIG_VALUE \
ETH_RX_BURST_SIZE_4_64BIT | \
GT_ETH_IPG_INT_RX(0) | \
ETH_TX_BURST_SIZE_4_64BIT;
#endif
#define GT_ETH_IPG_INT_RX(value) \
((value & 0x3fff) << 8)
/* Default port serial control value */
#define PORT_SERIAL_CONTROL_VALUE \
ETH_FORCE_LINK_PASS | \
ETH_ENABLE_AUTO_NEG_FOR_DUPLX | \
ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL | \
ETH_ADV_SYMMETRIC_FLOW_CTRL | \
ETH_FORCE_FC_MODE_NO_PAUSE_DIS_TX | \
ETH_FORCE_BP_MODE_NO_JAM | \
BIT9 | \
ETH_DO_NOT_FORCE_LINK_FAIL | \
ETH_RETRANSMIT_16_ETTEMPTS | \
ETH_ENABLE_AUTO_NEG_SPEED_GMII | \
ETH_DTE_ADV_0 | \
ETH_DISABLE_AUTO_NEG_BYPASS | \
ETH_AUTO_NEG_NO_CHANGE | \
ETH_MAX_RX_PACKET_1552BYTE | \
ETH_CLR_EXT_LOOPBACK | \
ETH_SET_FULL_DUPLEX_MODE | \
ETH_ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX;
#define RX_BUFFER_MAX_SIZE 0xFFFF
#define TX_BUFFER_MAX_SIZE 0xFFFF /* Buffer are limited to 64k */
#define RX_BUFFER_MIN_SIZE 0x8
#define TX_BUFFER_MIN_SIZE 0x8
/* Tx WRR confoguration macros */
#define PORT_MAX_TRAN_UNIT 0x24 /* MTU register (default) 9KByte */
#define PORT_MAX_TOKEN_BUCKET_SIZE 0x_fFFF /* PMTBS register (default) */
#define PORT_TOKEN_RATE 1023 /* PTTBRC register (default) */
/* MAC accepet/reject macros */
#define ACCEPT_MAC_ADDR 0
#define REJECT_MAC_ADDR 1
/* Size of a Tx/Rx descriptor used in chain list data structure */
#define RX_DESC_ALIGNED_SIZE 0x20
#define TX_DESC_ALIGNED_SIZE 0x20
/* An offest in Tx descriptors to store data for buffers less than 8 Bytes */
#define TX_BUF_OFFSET_IN_DESC 0x18
/* Buffer offset from buffer pointer */
#define RX_BUF_OFFSET 0x2
/* Gap define */
#define ETH_BAR_GAP 0x8
#define ETH_SIZE_REG_GAP 0x8
#define ETH_HIGH_ADDR_REMAP_REG_GAP 0x4
#define ETH_PORT_ACCESS_CTRL_GAP 0x4
/* Gigabit Ethernet Unit Global Registers */
/* MIB Counters register definitions */
#define ETH_MIB_GOOD_OCTETS_RECEIVED_LOW 0x0
#define ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH 0x4
#define ETH_MIB_BAD_OCTETS_RECEIVED 0x8
#define ETH_MIB_INTERNAL_MAC_TRANSMIT_ERR 0xc
#define ETH_MIB_GOOD_FRAMES_RECEIVED 0x10
#define ETH_MIB_BAD_FRAMES_RECEIVED 0x14
#define ETH_MIB_BROADCAST_FRAMES_RECEIVED 0x18
#define ETH_MIB_MULTICAST_FRAMES_RECEIVED 0x1c
#define ETH_MIB_FRAMES_64_OCTETS 0x20
#define ETH_MIB_FRAMES_65_TO_127_OCTETS 0x24
#define ETH_MIB_FRAMES_128_TO_255_OCTETS 0x28
#define ETH_MIB_FRAMES_256_TO_511_OCTETS 0x2c
#define ETH_MIB_FRAMES_512_TO_1023_OCTETS 0x30
#define ETH_MIB_FRAMES_1024_TO_MAX_OCTETS 0x34
#define ETH_MIB_GOOD_OCTETS_SENT_LOW 0x38
#define ETH_MIB_GOOD_OCTETS_SENT_HIGH 0x3c
#define ETH_MIB_GOOD_FRAMES_SENT 0x40
#define ETH_MIB_EXCESSIVE_COLLISION 0x44
#define ETH_MIB_MULTICAST_FRAMES_SENT 0x48
#define ETH_MIB_BROADCAST_FRAMES_SENT 0x4c
#define ETH_MIB_UNREC_MAC_CONTROL_RECEIVED 0x50
#define ETH_MIB_FC_SENT 0x54
#define ETH_MIB_GOOD_FC_RECEIVED 0x58
#define ETH_MIB_BAD_FC_RECEIVED 0x5c
#define ETH_MIB_UNDERSIZE_RECEIVED 0x60
#define ETH_MIB_FRAGMENTS_RECEIVED 0x64
#define ETH_MIB_OVERSIZE_RECEIVED 0x68
#define ETH_MIB_JABBER_RECEIVED 0x6c
#define ETH_MIB_MAC_RECEIVE_ERROR 0x70
#define ETH_MIB_BAD_CRC_EVENT 0x74
#define ETH_MIB_COLLISION 0x78
#define ETH_MIB_LATE_COLLISION 0x7c
/* Port serial status reg (PSR) */
#define ETH_INTERFACE_GMII_MII 0
#define ETH_INTERFACE_PCM BIT0
#define ETH_LINK_IS_DOWN 0
#define ETH_LINK_IS_UP BIT1
#define ETH_PORT_AT_HALF_DUPLEX 0
#define ETH_PORT_AT_FULL_DUPLEX BIT2
#define ETH_RX_FLOW_CTRL_DISABLED 0
#define ETH_RX_FLOW_CTRL_ENBALED BIT3
#define ETH_GMII_SPEED_100_10 0
#define ETH_GMII_SPEED_1000 BIT4
#define ETH_MII_SPEED_10 0
#define ETH_MII_SPEED_100 BIT5
#define ETH_NO_TX 0
#define ETH_TX_IN_PROGRESS BIT7
#define ETH_BYPASS_NO_ACTIVE 0
#define ETH_BYPASS_ACTIVE BIT8
#define ETH_PORT_NOT_AT_PARTITION_STATE 0
#define ETH_PORT_AT_PARTITION_STATE BIT9
#define ETH_PORT_TX_FIFO_NOT_EMPTY 0
#define ETH_PORT_TX_FIFO_EMPTY BIT10
/* These macros describes the Port configuration reg (Px_cR) bits */
#define ETH_UNICAST_NORMAL_MODE 0
#define ETH_UNICAST_PROMISCUOUS_MODE BIT0
#define ETH_DEFAULT_RX_QUEUE_0 0
#define ETH_DEFAULT_RX_QUEUE_1 BIT1
#define ETH_DEFAULT_RX_QUEUE_2 BIT2
#define ETH_DEFAULT_RX_QUEUE_3 (BIT2 | BIT1)
#define ETH_DEFAULT_RX_QUEUE_4 BIT3
#define ETH_DEFAULT_RX_QUEUE_5 (BIT3 | BIT1)
#define ETH_DEFAULT_RX_QUEUE_6 (BIT3 | BIT2)
#define ETH_DEFAULT_RX_QUEUE_7 (BIT3 | BIT2 | BIT1)
#define ETH_DEFAULT_RX_ARP_QUEUE_0 0
#define ETH_DEFAULT_RX_ARP_QUEUE_1 BIT4
#define ETH_DEFAULT_RX_ARP_QUEUE_2 BIT5
#define ETH_DEFAULT_RX_ARP_QUEUE_3 (BIT5 | BIT4)
#define ETH_DEFAULT_RX_ARP_QUEUE_4 BIT6
#define ETH_DEFAULT_RX_ARP_QUEUE_5 (BIT6 | BIT4)
#define ETH_DEFAULT_RX_ARP_QUEUE_6 (BIT6 | BIT5)
#define ETH_DEFAULT_RX_ARP_QUEUE_7 (BIT6 | BIT5 | BIT4)
#define ETH_RECEIVE_BC_IF_NOT_IP_OR_ARP 0
#define ETH_REJECT_BC_IF_NOT_IP_OR_ARP BIT7
#define ETH_RECEIVE_BC_IF_IP 0
#define ETH_REJECT_BC_IF_IP BIT8
#define ETH_RECEIVE_BC_IF_ARP 0
#define ETH_REJECT_BC_IF_ARP BIT9
#define ETH_TX_AM_NO_UPDATE_ERROR_SUMMARY BIT12
#define ETH_CAPTURE_TCP_FRAMES_DIS 0
#define ETH_CAPTURE_TCP_FRAMES_EN BIT14
#define ETH_CAPTURE_UDP_FRAMES_DIS 0
#define ETH_CAPTURE_UDP_FRAMES_EN BIT15
#define ETH_DEFAULT_RX_TCP_QUEUE_0 0
#define ETH_DEFAULT_RX_TCP_QUEUE_1 BIT16
#define ETH_DEFAULT_RX_TCP_QUEUE_2 BIT17
#define ETH_DEFAULT_RX_TCP_QUEUE_3 (BIT17 | BIT16)
#define ETH_DEFAULT_RX_TCP_QUEUE_4 BIT18
#define ETH_DEFAULT_RX_TCP_QUEUE_5 (BIT18 | BIT16)
#define ETH_DEFAULT_RX_TCP_QUEUE_6 (BIT18 | BIT17)
#define ETH_DEFAULT_RX_TCP_QUEUE_7 (BIT18 | BIT17 | BIT16)
#define ETH_DEFAULT_RX_UDP_QUEUE_0 0
#define ETH_DEFAULT_RX_UDP_QUEUE_1 BIT19
#define ETH_DEFAULT_RX_UDP_QUEUE_2 BIT20
#define ETH_DEFAULT_RX_UDP_QUEUE_3 (BIT20 | BIT19)
#define ETH_DEFAULT_RX_UDP_QUEUE_4 (BIT21
#define ETH_DEFAULT_RX_UDP_QUEUE_5 (BIT21 | BIT19)
#define ETH_DEFAULT_RX_UDP_QUEUE_6 (BIT21 | BIT20)
#define ETH_DEFAULT_RX_UDP_QUEUE_7 (BIT21 | BIT20 | BIT19)
#define ETH_DEFAULT_RX_BPDU_QUEUE_0 0
#define ETH_DEFAULT_RX_BPDU_QUEUE_1 BIT22
#define ETH_DEFAULT_RX_BPDU_QUEUE_2 BIT23
#define ETH_DEFAULT_RX_BPDU_QUEUE_3 (BIT23 | BIT22)
#define ETH_DEFAULT_RX_BPDU_QUEUE_4 BIT24
#define ETH_DEFAULT_RX_BPDU_QUEUE_5 (BIT24 | BIT22)
#define ETH_DEFAULT_RX_BPDU_QUEUE_6 (BIT24 | BIT23)
#define ETH_DEFAULT_RX_BPDU_QUEUE_7 (BIT24 | BIT23 | BIT22)
/* These macros describes the Port configuration extend reg (Px_cXR) bits*/
#define ETH_CLASSIFY_EN BIT0
#define ETH_SPAN_BPDU_PACKETS_AS_NORMAL 0
#define ETH_SPAN_BPDU_PACKETS_TO_RX_QUEUE_7 BIT1
#define ETH_PARTITION_DISABLE 0
#define ETH_PARTITION_ENABLE BIT2
/* Tx/Rx queue command reg (RQCR/TQCR)*/
#define ETH_QUEUE_0_ENABLE BIT0
#define ETH_QUEUE_1_ENABLE BIT1
#define ETH_QUEUE_2_ENABLE BIT2
#define ETH_QUEUE_3_ENABLE BIT3
#define ETH_QUEUE_4_ENABLE BIT4
#define ETH_QUEUE_5_ENABLE BIT5
#define ETH_QUEUE_6_ENABLE BIT6
#define ETH_QUEUE_7_ENABLE BIT7
#define ETH_QUEUE_0_DISABLE BIT8
#define ETH_QUEUE_1_DISABLE BIT9
#define ETH_QUEUE_2_DISABLE BIT10
#define ETH_QUEUE_3_DISABLE BIT11
#define ETH_QUEUE_4_DISABLE BIT12
#define ETH_QUEUE_5_DISABLE BIT13
#define ETH_QUEUE_6_DISABLE BIT14
#define ETH_QUEUE_7_DISABLE BIT15
/* These macros describes the Port Sdma configuration reg (SDCR) bits */
#define ETH_RIFB BIT0
#define ETH_RX_BURST_SIZE_1_64BIT 0
#define ETH_RX_BURST_SIZE_2_64BIT BIT1
#define ETH_RX_BURST_SIZE_4_64BIT BIT2
#define ETH_RX_BURST_SIZE_8_64BIT (BIT2 | BIT1)
#define ETH_RX_BURST_SIZE_16_64BIT BIT3
#define ETH_BLM_RX_NO_SWAP BIT4
#define ETH_BLM_RX_BYTE_SWAP 0
#define ETH_BLM_TX_NO_SWAP BIT5
#define ETH_BLM_TX_BYTE_SWAP 0
#define ETH_DESCRIPTORS_BYTE_SWAP BIT6
#define ETH_DESCRIPTORS_NO_SWAP 0
#define ETH_TX_BURST_SIZE_1_64BIT 0
#define ETH_TX_BURST_SIZE_2_64BIT BIT22
#define ETH_TX_BURST_SIZE_4_64BIT BIT23
#define ETH_TX_BURST_SIZE_8_64BIT (BIT23 | BIT22)
#define ETH_TX_BURST_SIZE_16_64BIT BIT24
/* These macros describes the Port serial control reg (PSCR) bits */
#define ETH_SERIAL_PORT_DISABLE 0
#define ETH_SERIAL_PORT_ENABLE BIT0
#define ETH_FORCE_LINK_PASS BIT1
#define ETH_DO_NOT_FORCE_LINK_PASS 0
#define ETH_ENABLE_AUTO_NEG_FOR_DUPLX 0
#define ETH_DISABLE_AUTO_NEG_FOR_DUPLX BIT2
#define ETH_ENABLE_AUTO_NEG_FOR_FLOW_CTRL 0
#define ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL BIT3
#define ETH_ADV_NO_FLOW_CTRL 0
#define ETH_ADV_SYMMETRIC_FLOW_CTRL BIT4
#define ETH_FORCE_FC_MODE_NO_PAUSE_DIS_TX 0
#define ETH_FORCE_FC_MODE_TX_PAUSE_DIS BIT5
#define ETH_FORCE_BP_MODE_NO_JAM 0
#define ETH_FORCE_BP_MODE_JAM_TX BIT7
#define ETH_FORCE_BP_MODE_JAM_TX_ON_RX_ERR BIT8
#define ETH_FORCE_LINK_FAIL 0
#define ETH_DO_NOT_FORCE_LINK_FAIL BIT10
#define ETH_RETRANSMIT_16_ETTEMPTS 0
#define ETH_RETRANSMIT_FOREVER BIT11
#define ETH_DISABLE_AUTO_NEG_SPEED_GMII BIT13
#define ETH_ENABLE_AUTO_NEG_SPEED_GMII 0
#define ETH_DTE_ADV_0 0
#define ETH_DTE_ADV_1 BIT14
#define ETH_DISABLE_AUTO_NEG_BYPASS 0
#define ETH_ENABLE_AUTO_NEG_BYPASS BIT15
#define ETH_AUTO_NEG_NO_CHANGE 0
#define ETH_RESTART_AUTO_NEG BIT16
#define ETH_MAX_RX_PACKET_1518BYTE 0
#define ETH_MAX_RX_PACKET_1522BYTE BIT17
#define ETH_MAX_RX_PACKET_1552BYTE BIT18
#define ETH_MAX_RX_PACKET_9022BYTE (BIT18 | BIT17)
#define ETH_MAX_RX_PACKET_9192BYTE BIT19
#define ETH_MAX_RX_PACKET_9700BYTE (BIT19 | BIT17)
#define ETH_SET_EXT_LOOPBACK BIT20
#define ETH_CLR_EXT_LOOPBACK 0
#define ETH_SET_FULL_DUPLEX_MODE BIT21
#define ETH_SET_HALF_DUPLEX_MODE 0
#define ETH_ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX BIT22
#define ETH_DISABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX 0
#define ETH_SET_GMII_SPEED_TO_10_100 0
#define ETH_SET_GMII_SPEED_TO_1000 BIT23
#define ETH_SET_MII_SPEED_TO_10 0
#define ETH_SET_MII_SPEED_TO_100 BIT24
/* SMI reg */
#define ETH_SMI_BUSY BIT28 /* 0 - Write, 1 - Read */
#define ETH_SMI_READ_VALID BIT27 /* 0 - Write, 1 - Read */
#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read operation */
#define ETH_SMI_OPCODE_READ BIT26 /* Operation is in progress */
/* SDMA command status fields macros */
/* Tx & Rx descriptors status */
#define ETH_ERROR_SUMMARY (BIT0)
/* Tx & Rx descriptors command */
#define ETH_BUFFER_OWNED_BY_DMA (BIT31)
/* Tx descriptors status */
#define ETH_LC_ERROR (0 )
#define ETH_UR_ERROR (BIT1 )
#define ETH_RL_ERROR (BIT2 )
#define ETH_LLC_SNAP_FORMAT (BIT9 )
/* Rx descriptors status */
#define ETH_CRC_ERROR (0 )
#define ETH_OVERRUN_ERROR (BIT1 )
#define ETH_MAX_FRAME_LENGTH_ERROR (BIT2 )
#define ETH_RESOURCE_ERROR ((BIT2 | BIT1))
#define ETH_VLAN_TAGGED (BIT19)
#define ETH_BPDU_FRAME (BIT20)
#define ETH_TCP_FRAME_OVER_IP_V_4 (0 )
#define ETH_UDP_FRAME_OVER_IP_V_4 (BIT21)
#define ETH_OTHER_FRAME_TYPE (BIT22)
#define ETH_LAYER_2_IS_ETH_V_2 (BIT23)
#define ETH_FRAME_TYPE_IP_V_4 (BIT24)
#define ETH_FRAME_HEADER_OK (BIT25)
#define ETH_RX_LAST_DESC (BIT26)
#define ETH_RX_FIRST_DESC (BIT27)
#define ETH_UNKNOWN_DESTINATION_ADDR (BIT28)
#define ETH_RX_ENABLE_INTERRUPT (BIT29)
#define ETH_LAYER_4_CHECKSUM_OK (BIT30)
/* Rx descriptors byte count */
#define ETH_FRAME_FRAGMENTED (BIT2)
/* Tx descriptors command */
#define ETH_LAYER_4_CHECKSUM_FIRST_DESC (BIT10)
#define ETH_FRAME_SET_TO_VLAN (BIT15)
#define ETH_TCP_FRAME (0 )
#define ETH_UDP_FRAME (BIT16)
#define ETH_GEN_TCP_UDP_CHECKSUM (BIT17)
#define ETH_GEN_IP_V_4_CHECKSUM (BIT18)
#define ETH_ZERO_PADDING (BIT19)
#define ETH_TX_LAST_DESC (BIT20)
#define ETH_TX_FIRST_DESC (BIT21)
#define ETH_GEN_CRC (BIT22)
#define ETH_TX_ENABLE_INTERRUPT (BIT23)
#define ETH_AUTO_MODE (BIT30)
/* Address decode parameters */
/* Ethernet Base Address Register bits */
#define EBAR_TARGET_DRAM 0x00000000
#define EBAR_TARGET_DEVICE 0x00000001
#define EBAR_TARGET_CBS 0x00000002
#define EBAR_TARGET_PCI0 0x00000003
#define EBAR_TARGET_PCI1 0x00000004
#define EBAR_TARGET_CUNIT 0x00000005
#define EBAR_TARGET_AUNIT 0x00000006
#define EBAR_TARGET_GUNIT 0x00000007
/* Window attributes */
#define EBAR_ATTR_DRAM_CS0 0x00000E00
#define EBAR_ATTR_DRAM_CS1 0x00000D00
#define EBAR_ATTR_DRAM_CS2 0x00000B00
#define EBAR_ATTR_DRAM_CS3 0x00000700
/* DRAM Target interface */
#define EBAR_ATTR_DRAM_NO_CACHE_COHERENCY 0x00000000
#define EBAR_ATTR_DRAM_CACHE_COHERENCY_WT 0x00001000
#define EBAR_ATTR_DRAM_CACHE_COHERENCY_WB 0x00002000
/* Device Bus Target interface */
#define EBAR_ATTR_DEVICE_DEVCS0 0x00001E00
#define EBAR_ATTR_DEVICE_DEVCS1 0x00001D00
#define EBAR_ATTR_DEVICE_DEVCS2 0x00001B00
#define EBAR_ATTR_DEVICE_DEVCS3 0x00001700
#define EBAR_ATTR_DEVICE_BOOTCS3 0x00000F00
/* PCI Target interface */
#define EBAR_ATTR_PCI_BYTE_SWAP 0x00000000
#define EBAR_ATTR_PCI_NO_SWAP 0x00000100
#define EBAR_ATTR_PCI_BYTE_WORD_SWAP 0x00000200
#define EBAR_ATTR_PCI_WORD_SWAP 0x00000300
#define EBAR_ATTR_PCI_NO_SNOOP_NOT_ASSERT 0x00000000
#define EBAR_ATTR_PCI_NO_SNOOP_ASSERT 0x00000400
#define EBAR_ATTR_PCI_IO_SPACE 0x00000000
#define EBAR_ATTR_PCI_MEMORY_SPACE 0x00000800
#define EBAR_ATTR_PCI_REQ64_FORCE 0x00000000
#define EBAR_ATTR_PCI_REQ64_SIZE 0x00001000
/* CPU 60x bus or internal SRAM interface */
#define EBAR_ATTR_CBS_SRAM_BLOCK0 0x00000000
#define EBAR_ATTR_CBS_SRAM_BLOCK1 0x00000100
#define EBAR_ATTR_CBS_SRAM 0x00000000
#define EBAR_ATTR_CBS_CPU_BUS 0x00000800
/* Window access control */
#define EWIN_ACCESS_NOT_ALLOWED 0
#define EWIN_ACCESS_READ_ONLY BIT0
#define EWIN_ACCESS_FULL (BIT1 | BIT0)
#define EWIN0_ACCESS_MASK 0x0003
#define EWIN1_ACCESS_MASK 0x000C
#define EWIN2_ACCESS_MASK 0x0030
#define EWIN3_ACCESS_MASK 0x00C0
/* typedefs */
typedef enum _eth_port
{
ETH_0 = 0,
ETH_1 = 1,
ETH_2 = 2
}ETH_PORT;
typedef enum _eth_func_ret_status
{
ETH_OK, /* Returned as expected. */
ETH_ERROR, /* Fundamental error. */
ETH_RETRY, /* Could not process request. Try later. */
ETH_END_OF_JOB, /* Ring has nothing to process. */
ETH_QUEUE_FULL, /* Ring resource error. */
ETH_QUEUE_LAST_RESOURCE /* Ring resources about to exhaust. */
}ETH_FUNC_RET_STATUS;
typedef enum _eth_queue
{
ETH_Q0 = 0,
ETH_Q1 = 1,
ETH_Q2 = 2,
ETH_Q3 = 3,
ETH_Q4 = 4,
ETH_Q5 = 5,
ETH_Q6 = 6,
ETH_Q7 = 7
} ETH_QUEUE;
typedef enum _addr_win
{
ETH_WIN0,
ETH_WIN1,
ETH_WIN2,
ETH_WIN3,
ETH_WIN4,
ETH_WIN5
} ETH_ADDR_WIN;
typedef enum _eth_target
{
ETH_TARGET_DRAM ,
ETH_TARGET_DEVICE,
ETH_TARGET_CBS ,
ETH_TARGET_PCI0 ,
ETH_TARGET_PCI1
}ETH_TARGET;
typedef struct _eth_rx_desc
{
unsigned short byte_cnt ; /* Descriptor buffer byte count */
unsigned short buf_size ; /* Buffer size */
unsigned int cmd_sts ; /* Descriptor command status */
unsigned int next_desc_ptr; /* Next descriptor pointer */
unsigned int buf_ptr ; /* Descriptor buffer pointer */
unsigned int return_info ; /* User resource return information */
} ETH_RX_DESC;
typedef struct _eth_tx_desc
{
unsigned short byte_cnt ; /* Descriptor buffer byte count */
unsigned short l4i_chk ; /* CPU provided TCP Checksum */
unsigned int cmd_sts ; /* Descriptor command status */
unsigned int next_desc_ptr; /* Next descriptor pointer */
unsigned int buf_ptr ; /* Descriptor buffer pointer */
unsigned int return_info ; /* User resource return information */
} ETH_TX_DESC;
/* Unified struct for Rx and Tx operations. The user is not required to */
/* be familier with neither Tx nor Rx descriptors. */
typedef struct _pkt_info
{
unsigned short byte_cnt ; /* Descriptor buffer byte count */
unsigned short l4i_chk ; /* Tx CPU provided TCP Checksum */
unsigned int cmd_sts ; /* Descriptor command status */
unsigned int buf_ptr ; /* Descriptor buffer pointer */
unsigned int return_info ; /* User resource return information */
} PKT_INFO;
typedef struct _eth_win_param
{
ETH_ADDR_WIN win; /* Window number. See ETH_ADDR_WIN enum */
ETH_TARGET target; /* System targets. See ETH_TARGET enum */
unsigned short attributes; /* BAR attributes. See above macros. */
unsigned int base_addr; /* Window base address in unsigned int form */
unsigned int high_addr; /* Window high address in unsigned int form */
unsigned int size; /* Size in MBytes. Must be % 64Kbyte. */
bool enable; /* Enable/disable access to the window. */
unsigned short access_ctrl; /* Access ctrl register. see above macros */
} ETH_WIN_PARAM;
/* Ethernet port specific infomation */
typedef struct _eth_port_ctrl
{
ETH_PORT port_num; /* User Ethernet port number */
int port_phy_addr; /* User phy address of Ethrnet port */
unsigned char port_mac_addr[6]; /* User defined port MAC address. */
unsigned int port_config; /* User port configuration value */
unsigned int port_config_extend; /* User port config extend value */
unsigned int port_sdma_config; /* User port SDMA config value */
unsigned int port_serial_control; /* User port serial control value */
unsigned int port_tx_queue_command; /* Port active Tx queues summary */
unsigned int port_rx_queue_command; /* Port active Rx queues summary */
/* User function to cast virtual address to CPU bus address */
unsigned int (*port_virt_to_phys)(unsigned int addr);
/* User scratch pad for user specific data structures */
void *port_private;
bool rx_resource_err[MAX_RX_QUEUE_NUM]; /* Rx ring resource error flag */
bool tx_resource_err[MAX_TX_QUEUE_NUM]; /* Tx ring resource error flag */
/* Tx/Rx rings managment indexes fields. For driver use */
/* Next available Rx resource */
volatile ETH_RX_DESC *p_rx_curr_desc_q[MAX_RX_QUEUE_NUM];
/* Returning Rx resource */
volatile ETH_RX_DESC *p_rx_used_desc_q[MAX_RX_QUEUE_NUM];
/* Next available Tx resource */
volatile ETH_TX_DESC *p_tx_curr_desc_q[MAX_TX_QUEUE_NUM];
/* Returning Tx resource */
volatile ETH_TX_DESC *p_tx_used_desc_q[MAX_TX_QUEUE_NUM];
/* An extra Tx index to support transmit of multiple buffers per packet */
volatile ETH_TX_DESC *p_tx_first_desc_q[MAX_TX_QUEUE_NUM];
/* Tx/Rx rings size and base variables fields. For driver use */
volatile ETH_RX_DESC *p_rx_desc_area_base[MAX_RX_QUEUE_NUM];
unsigned int rx_desc_area_size[MAX_RX_QUEUE_NUM];
char *p_rx_buffer_base[MAX_RX_QUEUE_NUM];
volatile ETH_TX_DESC *p_tx_desc_area_base[MAX_TX_QUEUE_NUM];
unsigned int tx_desc_area_size[MAX_TX_QUEUE_NUM];
char *p_tx_buffer_base[MAX_TX_QUEUE_NUM];
} ETH_PORT_INFO;
/* ethernet.h API list */
/* Port operation control routines */
static void eth_port_init (ETH_PORT_INFO *p_eth_port_ctrl);
static void eth_port_reset(ETH_PORT eth_port_num);
static bool eth_port_start(ETH_PORT_INFO *p_eth_port_ctrl);
/* Port MAC address routines */
static void eth_port_uc_addr_set (ETH_PORT eth_port_num,
unsigned char *p_addr,
ETH_QUEUE queue);
#if 0 /* FIXME */
static void eth_port_mc_addr (ETH_PORT eth_port_num,
unsigned char *p_addr,
ETH_QUEUE queue,
int option);
#endif
/* PHY and MIB routines */
static bool ethernet_phy_reset(ETH_PORT eth_port_num);
static bool eth_port_write_smi_reg(ETH_PORT eth_port_num,
unsigned int phy_reg,
unsigned int value);
static bool eth_port_read_smi_reg(ETH_PORT eth_port_num,
unsigned int phy_reg,
unsigned int* value);
static void eth_clear_mib_counters(ETH_PORT eth_port_num);
/* Port data flow control routines */
static ETH_FUNC_RET_STATUS eth_port_send (ETH_PORT_INFO *p_eth_port_ctrl,
ETH_QUEUE tx_queue,
PKT_INFO *p_pkt_info);
static ETH_FUNC_RET_STATUS eth_tx_return_desc(ETH_PORT_INFO *p_eth_port_ctrl,
ETH_QUEUE tx_queue,
PKT_INFO *p_pkt_info);
static ETH_FUNC_RET_STATUS eth_port_receive (ETH_PORT_INFO *p_eth_port_ctrl,
ETH_QUEUE rx_queue,
PKT_INFO *p_pkt_info);
static ETH_FUNC_RET_STATUS eth_rx_return_buff(ETH_PORT_INFO *p_eth_port_ctrl,
ETH_QUEUE rx_queue,
PKT_INFO *p_pkt_info);
static bool ether_init_tx_desc_ring(ETH_PORT_INFO *p_eth_port_ctrl,
ETH_QUEUE tx_queue,
int tx_desc_num,
int tx_buff_size,
unsigned int tx_desc_base_addr,
unsigned int tx_buff_base_addr);
static bool ether_init_rx_desc_ring(ETH_PORT_INFO *p_eth_port_ctrl,
ETH_QUEUE rx_queue,
int rx_desc_num,
int rx_buff_size,
unsigned int rx_desc_base_addr,
unsigned int rx_buff_base_addr);
#endif /* MV64360_ETH_ */

1124
board/esd/cpci750/mv_regs.h Normal file

File diff suppressed because it is too large Load Diff

961
board/esd/cpci750/pci.c Normal file
View File

@@ -0,0 +1,961 @@
/*
* (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
*
*/
/* PCI.c - PCI functions */
#include <common.h>
#ifdef CONFIG_PCI
#include <pci.h>
#ifdef CONFIG_PCI_PNP
void pciauto_config_init(struct pci_controller *hose);
int pciauto_region_allocate(struct pci_region* res, unsigned int size, unsigned int *bar);
#endif
#include "../../Marvell/include/pci.h"
#undef DEBUG
#undef IDE_SET_NATIVE_MODE
static unsigned int local_buses[] = { 0, 0 };
static const unsigned char pci_irq_swizzle[2][PCI_MAX_DEVICES] = {
{0, 0, 0, 0, 0, 0, 0, 27, 27, [9 ... PCI_MAX_DEVICES - 1] = 0 },
{0, 0, 0, 0, 0, 0, 0, 29, 29, [9 ... PCI_MAX_DEVICES - 1] = 0 },
};
#ifdef DEBUG
static const unsigned int pci_bus_list[] = { PCI_0_MODE, PCI_1_MODE };
static void gt_pci_bus_mode_display (PCI_HOST host)
{
unsigned int mode;
mode = (GTREGREAD (pci_bus_list[host]) & (BIT4 | BIT5)) >> 4;
switch (mode) {
case 0:
printf ("PCI %d bus mode: Conventional PCI\n", host);
break;
case 1:
printf ("PCI %d bus mode: 66 Mhz PCIX\n", host);
break;
case 2:
printf ("PCI %d bus mode: 100 Mhz PCIX\n", host);
break;
case 3:
printf ("PCI %d bus mode: 133 Mhz PCIX\n", host);
break;
default:
printf ("Unknown BUS %d\n", mode);
}
}
#endif
static const unsigned int pci_p2p_configuration_reg[] = {
PCI_0P2P_CONFIGURATION, PCI_1P2P_CONFIGURATION
};
static const unsigned int pci_configuration_address[] = {
PCI_0CONFIGURATION_ADDRESS, PCI_1CONFIGURATION_ADDRESS
};
static const unsigned int pci_configuration_data[] = {
PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER,
PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER
};
static const unsigned int pci_error_cause_reg[] = {
PCI_0ERROR_CAUSE, PCI_1ERROR_CAUSE
};
static const unsigned int pci_arbiter_control[] = {
PCI_0ARBITER_CONTROL, PCI_1ARBITER_CONTROL
};
static const unsigned int pci_address_space_en[] = {
PCI_0_BASE_ADDR_REG_ENABLE, PCI_1_BASE_ADDR_REG_ENABLE
};
static const unsigned int pci_snoop_control_base_0_low[] = {
PCI_0SNOOP_CONTROL_BASE_0_LOW, PCI_1SNOOP_CONTROL_BASE_0_LOW
};
static const unsigned int pci_snoop_control_top_0[] = {
PCI_0SNOOP_CONTROL_TOP_0, PCI_1SNOOP_CONTROL_TOP_0
};
static const unsigned int pci_access_control_base_0_low[] = {
PCI_0ACCESS_CONTROL_BASE_0_LOW, PCI_1ACCESS_CONTROL_BASE_0_LOW
};
static const unsigned int pci_access_control_top_0[] = {
PCI_0ACCESS_CONTROL_TOP_0, PCI_1ACCESS_CONTROL_TOP_0
};
static const unsigned int pci_scs_bank_size[2][4] = {
{PCI_0SCS_0_BANK_SIZE, PCI_0SCS_1_BANK_SIZE,
PCI_0SCS_2_BANK_SIZE, PCI_0SCS_3_BANK_SIZE},
{PCI_1SCS_0_BANK_SIZE, PCI_1SCS_1_BANK_SIZE,
PCI_1SCS_2_BANK_SIZE, PCI_1SCS_3_BANK_SIZE}
};
static const unsigned int pci_p2p_configuration[] = {
PCI_0P2P_CONFIGURATION, PCI_1P2P_CONFIGURATION
};
/********************************************************************
* pciWriteConfigReg - Write to a PCI configuration register
* - Make sure the GT is configured as a master before writing
* to another device on the PCI.
* - The function takes care of Big/Little endian conversion.
*
*
* Inputs: unsigned int regOffset: The register offset as it apears in the GT spec
* (or any other PCI device spec)
* pciDevNum: The device number needs to be addressed.
*
* Configuration Address 0xCF8:
*
* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number
* |congif|Reserved| Bus |Device|Function|Register|00|
* |Enable| |Number|Number| Number | Number | | <=field Name
*
*********************************************************************/
void pciWriteConfigReg (PCI_HOST host, unsigned int regOffset,
unsigned int pciDevNum, unsigned int data)
{
volatile unsigned int DataForAddrReg;
unsigned int functionNum;
unsigned int busNum = 0;
unsigned int addr;
if (pciDevNum > 32) /* illegal device Number */
return;
if (pciDevNum == SELF) { /* configure our configuration space. */
pciDevNum =
(GTREGREAD (pci_p2p_configuration_reg[host]) >> 24) &
0x1f;
busNum = GTREGREAD (pci_p2p_configuration_reg[host]) &
0xff0000;
}
functionNum = regOffset & 0x00000700;
pciDevNum = pciDevNum << 11;
regOffset = regOffset & 0xfc;
DataForAddrReg =
(regOffset | pciDevNum | functionNum | busNum) | BIT31;
GT_REG_WRITE (pci_configuration_address[host], DataForAddrReg);
GT_REG_READ (pci_configuration_address[host], &addr);
if (addr != DataForAddrReg)
return;
GT_REG_WRITE (pci_configuration_data[host], data);
}
/********************************************************************
* pciReadConfigReg - Read from a PCI0 configuration register
* - Make sure the GT is configured as a master before reading
* from another device on the PCI.
* - The function takes care of Big/Little endian conversion.
* INPUTS: regOffset: The register offset as it apears in the GT spec (or PCI
* spec)
* pciDevNum: The device number needs to be addressed.
* RETURNS: data , if the data == 0xffffffff check the master abort bit in the
* cause register to make sure the data is valid
*
* Configuration Address 0xCF8:
*
* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number
* |congif|Reserved| Bus |Device|Function|Register|00|
* |Enable| |Number|Number| Number | Number | | <=field Name
*
*********************************************************************/
unsigned int pciReadConfigReg (PCI_HOST host, unsigned int regOffset,
unsigned int pciDevNum)
{
volatile unsigned int DataForAddrReg;
unsigned int data;
unsigned int functionNum;
unsigned int busNum = 0;
if (pciDevNum > 32) /* illegal device Number */
return 0xffffffff;
if (pciDevNum == SELF) { /* configure our configuration space. */
pciDevNum =
(GTREGREAD (pci_p2p_configuration_reg[host]) >> 24) &
0x1f;
busNum = GTREGREAD (pci_p2p_configuration_reg[host]) &
0xff0000;
}
functionNum = regOffset & 0x00000700;
pciDevNum = pciDevNum << 11;
regOffset = regOffset & 0xfc;
DataForAddrReg =
(regOffset | pciDevNum | functionNum | busNum) | BIT31;
GT_REG_WRITE (pci_configuration_address[host], DataForAddrReg);
GT_REG_READ (pci_configuration_address[host], &data);
if (data != DataForAddrReg)
return 0xffffffff;
GT_REG_READ (pci_configuration_data[host], &data);
return data;
}
/********************************************************************
* pciOverBridgeWriteConfigReg - Write to a PCI configuration register where
* the agent is placed on another Bus. For more
* information read P2P in the PCI spec.
*
* Inputs: unsigned int regOffset - The register offset as it apears in the
* GT spec (or any other PCI device spec).
* unsigned int pciDevNum - The device number needs to be addressed.
* unsigned int busNum - On which bus does the Target agent connect
* to.
* unsigned int data - data to be written.
*
* Configuration Address 0xCF8:
*
* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number
* |congif|Reserved| Bus |Device|Function|Register|01|
* |Enable| |Number|Number| Number | Number | | <=field Name
*
* The configuration Address is configure as type-I (bits[1:0] = '01') due to
* PCI spec referring to P2P.
*
*********************************************************************/
void pciOverBridgeWriteConfigReg (PCI_HOST host,
unsigned int regOffset,
unsigned int pciDevNum,
unsigned int busNum, unsigned int data)
{
unsigned int DataForReg;
unsigned int functionNum;
functionNum = regOffset & 0x00000700;
pciDevNum = pciDevNum << 11;
regOffset = regOffset & 0xff;
busNum = busNum << 16;
if (pciDevNum == SELF) { /* This board */
DataForReg = (regOffset | pciDevNum | functionNum) | BIT0;
} else {
DataForReg = (regOffset | pciDevNum | functionNum | busNum) |
BIT31 | BIT0;
}
GT_REG_WRITE (pci_configuration_address[host], DataForReg);
GT_REG_WRITE (pci_configuration_data[host], data);
}
/********************************************************************
* pciOverBridgeReadConfigReg - Read from a PCIn configuration register where
* the agent target locate on another PCI bus.
* - Make sure the GT is configured as a master
* before reading from another device on the PCI.
* - The function takes care of Big/Little endian
* conversion.
* INPUTS: regOffset: The register offset as it apears in the GT spec (or PCI
* spec). (configuration register offset.)
* pciDevNum: The device number needs to be addressed.
* busNum: the Bus number where the agent is place.
* RETURNS: data , if the data == 0xffffffff check the master abort bit in the
* cause register to make sure the data is valid
*
* Configuration Address 0xCF8:
*
* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number
* |congif|Reserved| Bus |Device|Function|Register|01|
* |Enable| |Number|Number| Number | Number | | <=field Name
*
*********************************************************************/
unsigned int pciOverBridgeReadConfigReg (PCI_HOST host,
unsigned int regOffset,
unsigned int pciDevNum,
unsigned int busNum)
{
unsigned int DataForReg;
unsigned int data;
unsigned int functionNum;
functionNum = regOffset & 0x00000700;
pciDevNum = pciDevNum << 11;
regOffset = regOffset & 0xff;
busNum = busNum << 16;
if (pciDevNum == SELF) { /* This board */
DataForReg = (regOffset | pciDevNum | functionNum) | BIT31;
} else { /* agent on another bus */
DataForReg = (regOffset | pciDevNum | functionNum | busNum) |
BIT0 | BIT31;
}
GT_REG_WRITE (pci_configuration_address[host], DataForReg);
GT_REG_READ (pci_configuration_data[host], &data);
return data;
}
/********************************************************************
* pciGetRegOffset - Gets the register offset for this region config.
*
* INPUT: Bus, Region - The bus and region we ask for its base address.
* OUTPUT: N/A
* RETURNS: PCI register base address
*********************************************************************/
static unsigned int pciGetRegOffset (PCI_HOST host, PCI_REGION region)
{
switch (host) {
case PCI_HOST0:
switch (region) {
case PCI_IO:
return PCI_0I_O_LOW_DECODE_ADDRESS;
case PCI_REGION0:
return PCI_0MEMORY0_LOW_DECODE_ADDRESS;
case PCI_REGION1:
return PCI_0MEMORY1_LOW_DECODE_ADDRESS;
case PCI_REGION2:
return PCI_0MEMORY2_LOW_DECODE_ADDRESS;
case PCI_REGION3:
return PCI_0MEMORY3_LOW_DECODE_ADDRESS;
}
case PCI_HOST1:
switch (region) {
case PCI_IO:
return PCI_1I_O_LOW_DECODE_ADDRESS;
case PCI_REGION0:
return PCI_1MEMORY0_LOW_DECODE_ADDRESS;
case PCI_REGION1:
return PCI_1MEMORY1_LOW_DECODE_ADDRESS;
case PCI_REGION2:
return PCI_1MEMORY2_LOW_DECODE_ADDRESS;
case PCI_REGION3:
return PCI_1MEMORY3_LOW_DECODE_ADDRESS;
}
}
return PCI_0MEMORY0_LOW_DECODE_ADDRESS;
}
static unsigned int pciGetRemapOffset (PCI_HOST host, PCI_REGION region)
{
switch (host) {
case PCI_HOST0:
switch (region) {
case PCI_IO:
return PCI_0I_O_ADDRESS_REMAP;
case PCI_REGION0:
return PCI_0MEMORY0_ADDRESS_REMAP;
case PCI_REGION1:
return PCI_0MEMORY1_ADDRESS_REMAP;
case PCI_REGION2:
return PCI_0MEMORY2_ADDRESS_REMAP;
case PCI_REGION3:
return PCI_0MEMORY3_ADDRESS_REMAP;
}
case PCI_HOST1:
switch (region) {
case PCI_IO:
return PCI_1I_O_ADDRESS_REMAP;
case PCI_REGION0:
return PCI_1MEMORY0_ADDRESS_REMAP;
case PCI_REGION1:
return PCI_1MEMORY1_ADDRESS_REMAP;
case PCI_REGION2:
return PCI_1MEMORY2_ADDRESS_REMAP;
case PCI_REGION3:
return PCI_1MEMORY3_ADDRESS_REMAP;
}
}
return PCI_0MEMORY0_ADDRESS_REMAP;
}
/********************************************************************
* pciGetBaseAddress - Gets the base address of a PCI.
* - If the PCI size is 0 then this base address has no meaning!!!
*
*
* INPUT: Bus, Region - The bus and region we ask for its base address.
* OUTPUT: N/A
* RETURNS: PCI base address.
*********************************************************************/
unsigned int pciGetBaseAddress (PCI_HOST host, PCI_REGION region)
{
unsigned int regBase;
unsigned int regEnd;
unsigned int regOffset = pciGetRegOffset (host, region);
GT_REG_READ (regOffset, &regBase);
GT_REG_READ (regOffset + 8, &regEnd);
if (regEnd <= regBase)
return 0xffffffff; /* ERROR !!! */
regBase = regBase << 16;
return regBase;
}
bool pciMapSpace (PCI_HOST host, PCI_REGION region, unsigned int remapBase,
unsigned int bankBase, unsigned int bankLength)
{
unsigned int low = 0xfff;
unsigned int high = 0x0;
unsigned int regOffset = pciGetRegOffset (host, region);
unsigned int remapOffset = pciGetRemapOffset (host, region);
if (bankLength != 0) {
low = (bankBase >> 16) & 0xffff;
high = ((bankBase + bankLength) >> 16) - 1;
}
GT_REG_WRITE (regOffset, low | (1 << 24)); /* no swapping */
GT_REG_WRITE (regOffset + 8, high);
if (bankLength != 0) { /* must do AFTER writing maps */
GT_REG_WRITE (remapOffset, remapBase >> 16); /* sorry, 32 bits only.
dont support upper 32
in this driver */
}
return true;
}
unsigned int pciGetSpaceBase (PCI_HOST host, PCI_REGION region)
{
unsigned int low;
unsigned int regOffset = pciGetRegOffset (host, region);
GT_REG_READ (regOffset, &low);
return (low & 0xffff) << 16;
}
unsigned int pciGetSpaceSize (PCI_HOST host, PCI_REGION region)
{
unsigned int low, high;
unsigned int regOffset = pciGetRegOffset (host, region);
GT_REG_READ (regOffset, &low);
GT_REG_READ (regOffset + 8, &high);
return ((high & 0xffff) + 1) << 16;
}
/* ronen - 7/Dec/03*/
/********************************************************************
* gtPciDisable/EnableInternalBAR - This function enable/disable PCI BARS.
* Inputs: one of the PCI BAR
*********************************************************************/
void gtPciEnableInternalBAR (PCI_HOST host, PCI_INTERNAL_BAR pciBAR)
{
RESET_REG_BITS (pci_address_space_en[host], BIT0 << pciBAR);
}
void gtPciDisableInternalBAR (PCI_HOST host, PCI_INTERNAL_BAR pciBAR)
{
SET_REG_BITS (pci_address_space_en[host], BIT0 << pciBAR);
}
/********************************************************************
* pciMapMemoryBank - Maps PCI_host memory bank "bank" for the slave.
*
* Inputs: base and size of PCI SCS
*********************************************************************/
void pciMapMemoryBank (PCI_HOST host, MEMORY_BANK bank,
unsigned int pciDramBase, unsigned int pciDramSize)
{
/*ronen different function for 3rd bank. */
unsigned int offset = (bank < 2) ? bank * 8 : 0x100 + (bank - 2) * 8;
pciDramBase = pciDramBase & 0xfffff000;
pciDramBase = pciDramBase | (pciReadConfigReg (host,
PCI_SCS_0_BASE_ADDRESS
+ offset,
SELF) & 0x00000fff);
pciWriteConfigReg (host, PCI_SCS_0_BASE_ADDRESS + offset, SELF,
pciDramBase);
if (pciDramSize == 0)
pciDramSize++;
GT_REG_WRITE (pci_scs_bank_size[host][bank], pciDramSize - 1);
gtPciEnableInternalBAR (host, bank);
}
/********************************************************************
* pciSetRegionFeatures - This function modifys one of the 8 regions with
* feature bits given as an input.
* - Be advised to check the spec before modifying them.
* Inputs: PCI_PROTECT_REGION region - one of the eight regions.
* unsigned int features - See file: pci.h there are defintion for those
* region features.
* unsigned int baseAddress - The region base Address.
* unsigned int topAddress - The region top Address.
* Returns: false if one of the parameters is erroneous true otherwise.
*********************************************************************/
bool pciSetRegionFeatures (PCI_HOST host, PCI_ACCESS_REGIONS region,
unsigned int features, unsigned int baseAddress,
unsigned int regionLength)
{
unsigned int accessLow;
unsigned int accessHigh;
unsigned int accessTop = baseAddress + regionLength;
if (regionLength == 0) { /* close the region. */
pciDisableAccessRegion (host, region);
return true;
}
/* base Address is store is bits [11:0] */
accessLow = (baseAddress & 0xfff00000) >> 20;
/* All the features are update according to the defines in pci.h (to be on
the safe side we disable bits: [11:0] */
accessLow = accessLow | (features & 0xfffff000);
/* write to the Low Access Region register */
GT_REG_WRITE (pci_access_control_base_0_low[host] + 0x10 * region,
accessLow);
accessHigh = (accessTop & 0xfff00000) >> 20;
/* write to the High Access Region register */
GT_REG_WRITE (pci_access_control_top_0[host] + 0x10 * region,
accessHigh - 1);
return true;
}
/********************************************************************
* pciDisableAccessRegion - Disable The given Region by writing MAX size
* to its low Address and MIN size to its high Address.
*
* Inputs: PCI_ACCESS_REGIONS region - The region we to be Disabled.
* Returns: N/A.
*********************************************************************/
void pciDisableAccessRegion (PCI_HOST host, PCI_ACCESS_REGIONS region)
{
/* writing back the registers default values. */
GT_REG_WRITE (pci_access_control_base_0_low[host] + 0x10 * region,
0x01001fff);
GT_REG_WRITE (pci_access_control_top_0[host] + 0x10 * region, 0);
}
/********************************************************************
* pciArbiterEnable - Enables PCI-0`s Arbitration mechanism.
*
* Inputs: N/A
* Returns: true.
*********************************************************************/
bool pciArbiterEnable (PCI_HOST host)
{
unsigned int regData;
GT_REG_READ (pci_arbiter_control[host], &regData);
GT_REG_WRITE (pci_arbiter_control[host], regData | BIT31);
return true;
}
/********************************************************************
* pciArbiterDisable - Disable PCI-0`s Arbitration mechanism.
*
* Inputs: N/A
* Returns: true
*********************************************************************/
bool pciArbiterDisable (PCI_HOST host)
{
unsigned int regData;
GT_REG_READ (pci_arbiter_control[host], &regData);
GT_REG_WRITE (pci_arbiter_control[host], regData & 0x7fffffff);
return true;
}
/********************************************************************
* pciSetArbiterAgentsPriority - Priority setup for the PCI agents (Hi or Low)
*
* Inputs: PCI_AGENT_PRIO internalAgent - priotity for internal agent.
* PCI_AGENT_PRIO externalAgent0 - priotity for external#0 agent.
* PCI_AGENT_PRIO externalAgent1 - priotity for external#1 agent.
* PCI_AGENT_PRIO externalAgent2 - priotity for external#2 agent.
* PCI_AGENT_PRIO externalAgent3 - priotity for external#3 agent.
* PCI_AGENT_PRIO externalAgent4 - priotity for external#4 agent.
* PCI_AGENT_PRIO externalAgent5 - priotity for external#5 agent.
* Returns: true
*********************************************************************/
bool pciSetArbiterAgentsPriority (PCI_HOST host, PCI_AGENT_PRIO internalAgent,
PCI_AGENT_PRIO externalAgent0,
PCI_AGENT_PRIO externalAgent1,
PCI_AGENT_PRIO externalAgent2,
PCI_AGENT_PRIO externalAgent3,
PCI_AGENT_PRIO externalAgent4,
PCI_AGENT_PRIO externalAgent5)
{
unsigned int regData;
unsigned int writeData;
GT_REG_READ (pci_arbiter_control[host], &regData);
writeData = (internalAgent << 7) + (externalAgent0 << 8) +
(externalAgent1 << 9) + (externalAgent2 << 10) +
(externalAgent3 << 11) + (externalAgent4 << 12) +
(externalAgent5 << 13);
regData = (regData & 0xffffc07f) | writeData;
GT_REG_WRITE (pci_arbiter_control[host], regData & regData);
return true;
}
/********************************************************************
* pciParkingDisable - Park on last option disable, with this function you can
* disable the park on last mechanism for each agent.
* disabling this option for all agents results parking
* on the internal master.
*
* Inputs: PCI_AGENT_PARK internalAgent - parking Disable for internal agent.
* PCI_AGENT_PARK externalAgent0 - parking Disable for external#0 agent.
* PCI_AGENT_PARK externalAgent1 - parking Disable for external#1 agent.
* PCI_AGENT_PARK externalAgent2 - parking Disable for external#2 agent.
* PCI_AGENT_PARK externalAgent3 - parking Disable for external#3 agent.
* PCI_AGENT_PARK externalAgent4 - parking Disable for external#4 agent.
* PCI_AGENT_PARK externalAgent5 - parking Disable for external#5 agent.
* Returns: true
*********************************************************************/
bool pciParkingDisable (PCI_HOST host, PCI_AGENT_PARK internalAgent,
PCI_AGENT_PARK externalAgent0,
PCI_AGENT_PARK externalAgent1,
PCI_AGENT_PARK externalAgent2,
PCI_AGENT_PARK externalAgent3,
PCI_AGENT_PARK externalAgent4,
PCI_AGENT_PARK externalAgent5)
{
unsigned int regData;
unsigned int writeData;
GT_REG_READ (pci_arbiter_control[host], &regData);
writeData = (internalAgent << 14) + (externalAgent0 << 15) +
(externalAgent1 << 16) + (externalAgent2 << 17) +
(externalAgent3 << 18) + (externalAgent4 << 19) +
(externalAgent5 << 20);
regData = (regData & ~(0x7f << 14)) | writeData;
GT_REG_WRITE (pci_arbiter_control[host], regData);
return true;
}
/********************************************************************
* pciEnableBrokenAgentDetection - A master is said to be broken if it fails to
* respond to grant assertion within a window specified in
* the input value: 'brokenValue'.
*
* Inputs: unsigned char brokenValue - A value which limits the Master to hold the
* grant without asserting frame.
* Returns: Error for illegal broken value otherwise true.
*********************************************************************/
bool pciEnableBrokenAgentDetection (PCI_HOST host, unsigned char brokenValue)
{
unsigned int data;
unsigned int regData;
if (brokenValue > 0xf)
return false; /* brokenValue must be 4 bit */
data = brokenValue << 3;
GT_REG_READ (pci_arbiter_control[host], &regData);
regData = (regData & 0xffffff87) | data;
GT_REG_WRITE (pci_arbiter_control[host], regData | BIT1);
return true;
}
/********************************************************************
* pciDisableBrokenAgentDetection - This function disable the Broken agent
* Detection mechanism.
* NOTE: This operation may cause a dead lock on the
* pci0 arbitration.
*
* Inputs: N/A
* Returns: true.
*********************************************************************/
bool pciDisableBrokenAgentDetection (PCI_HOST host)
{
unsigned int regData;
GT_REG_READ (pci_arbiter_control[host], &regData);
regData = regData & 0xfffffffd;
GT_REG_WRITE (pci_arbiter_control[host], regData);
return true;
}
/********************************************************************
* pciP2PConfig - This function set the PCI_n P2P configurate.
* For more information on the P2P read PCI spec.
*
* Inputs: unsigned int SecondBusLow - Secondery PCI interface Bus Range Lower
* Boundry.
* unsigned int SecondBusHigh - Secondry PCI interface Bus Range upper
* Boundry.
* unsigned int busNum - The CPI bus number to which the PCI interface
* is connected.
* unsigned int devNum - The PCI interface's device number.
*
* Returns: true.
*********************************************************************/
bool pciP2PConfig (PCI_HOST host, unsigned int SecondBusLow,
unsigned int SecondBusHigh,
unsigned int busNum, unsigned int devNum)
{
unsigned int regData;
regData = (SecondBusLow & 0xff) | ((SecondBusHigh & 0xff) << 8) |
((busNum & 0xff) << 16) | ((devNum & 0x1f) << 24);
GT_REG_WRITE (pci_p2p_configuration[host], regData);
return true;
}
/********************************************************************
* pciSetRegionSnoopMode - This function modifys one of the 4 regions which
* supports Cache Coherency in the PCI_n interface.
* Inputs: region - One of the four regions.
* 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.
* baseAddress - Base Address of this region.
* regionLength - Region length.
* Returns: false if one of the parameters is wrong otherwise return true.
*********************************************************************/
bool pciSetRegionSnoopMode (PCI_HOST host, PCI_SNOOP_REGION region,
PCI_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 > PCI_SNOOP_REGION3) || (snoopType > PCI_SNOOP_WB))
return false;
snoopXbaseAddress =
pci_snoop_control_base_0_low[host] + 0x10 * region;
snoopXtopAddress = pci_snoop_control_top_0[host] + 0x10 * region;
if (regionLength == 0) { /* closing the region */
GT_REG_WRITE (snoopXbaseAddress, 0x0000ffff);
GT_REG_WRITE (snoopXtopAddress, 0);
return true;
}
baseAddress = baseAddress & 0xfff00000; /* Granularity of 1MByte */
data = (baseAddress >> 20) | snoopType << 12;
GT_REG_WRITE (snoopXbaseAddress, data);
snoopHigh = (snoopHigh & 0xfff00000) >> 20;
GT_REG_WRITE (snoopXtopAddress, snoopHigh - 1);
return true;
}
static int gt_read_config_dword (struct pci_controller *hose,
pci_dev_t dev, int offset, u32 * value)
{
int bus = PCI_BUS (dev);
if ((bus == local_buses[0]) || (bus == local_buses[1])) {
*value = pciReadConfigReg ((PCI_HOST) hose->cfg_addr, offset,
PCI_DEV (dev));
} else {
*value = pciOverBridgeReadConfigReg ((PCI_HOST) hose->
cfg_addr, offset,
PCI_DEV (dev), bus);
}
return 0;
}
static int gt_write_config_dword (struct pci_controller *hose,
pci_dev_t dev, int offset, u32 value)
{
int bus = PCI_BUS (dev);
if ((bus == local_buses[0]) || (bus == local_buses[1])) {
pciWriteConfigReg ((PCI_HOST) hose->cfg_addr, offset,
PCI_DEV (dev), value);
} else {
pciOverBridgeWriteConfigReg ((PCI_HOST) hose->cfg_addr,
offset, PCI_DEV (dev), bus,
value);
}
return 0;
}
static void gt_setup_ide (struct pci_controller *hose,
pci_dev_t dev, struct pci_config_table *entry)
{
static const int ide_bar[] = { 8, 4, 8, 4, 0, 0 };
u32 bar_response, bar_value;
int bar;
for (bar = 0; bar < 6; bar++) {
/*ronen different function for 3rd bank. */
unsigned int offset =
(bar < 2) ? bar * 8 : 0x100 + (bar - 2) * 8;
pci_write_config_dword (dev, PCI_BASE_ADDRESS_0 + offset,
0x0);
pci_read_config_dword (dev, PCI_BASE_ADDRESS_0 + offset,
&bar_response);
pciauto_region_allocate (bar_response &
PCI_BASE_ADDRESS_SPACE_IO ? hose->
pci_io : hose->pci_mem, ide_bar[bar],
&bar_value);
pci_write_config_dword (dev, PCI_BASE_ADDRESS_0 + bar * 4,
bar_value);
}
}
/* TODO BJW: Change this for DB64360. This was pulled from the EV64260 */
/* and is curently not called *. */
#if 0
static void gt_fixup_irq (struct pci_controller *hose, pci_dev_t dev)
{
unsigned char pin, irq;
pci_read_config_byte (dev, PCI_INTERRUPT_PIN, &pin);
if (pin == 1) { /* only allow INT A */
irq = pci_irq_swizzle[(PCI_HOST) hose->
cfg_addr][PCI_DEV (dev)];
if (irq)
pci_write_config_byte (dev, PCI_INTERRUPT_LINE, irq);
}
}
#endif
struct pci_config_table gt_config_table[] = {
{PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE,
PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, gt_setup_ide},
{}
};
struct pci_controller pci0_hose = {
/* fixup_irq: gt_fixup_irq, */
config_table:gt_config_table,
};
struct pci_controller pci1_hose = {
/* fixup_irq: gt_fixup_irq, */
config_table:gt_config_table,
};
void pci_init_board (void)
{
unsigned int command;
#ifdef CONFIG_PCI_PNP
unsigned int bar;
#endif
#ifdef DEBUG
gt_pci_bus_mode_display (PCI_HOST0);
#endif
pci0_hose.first_busno = 0;
pci0_hose.last_busno = 0xff;
local_buses[0] = pci0_hose.first_busno;
/* PCI memory space */
pci_set_region (pci0_hose.regions + 0,
CFG_PCI0_0_MEM_SPACE,
CFG_PCI0_0_MEM_SPACE,
CFG_PCI0_MEM_SIZE, PCI_REGION_MEM);
/* PCI I/O space */
pci_set_region (pci0_hose.regions + 1,
CFG_PCI0_IO_SPACE_PCI,
CFG_PCI0_IO_SPACE, CFG_PCI0_IO_SIZE, PCI_REGION_IO);
pci_set_ops (&pci0_hose,
pci_hose_read_config_byte_via_dword,
pci_hose_read_config_word_via_dword,
gt_read_config_dword,
pci_hose_write_config_byte_via_dword,
pci_hose_write_config_word_via_dword,
gt_write_config_dword);
pci0_hose.region_count = 2;
pci0_hose.cfg_addr = (unsigned int *) PCI_HOST0;
pci_register_hose (&pci0_hose);
pciArbiterEnable (PCI_HOST0);
pciParkingDisable (PCI_HOST0, 1, 1, 1, 1, 1, 1, 1);
command = pciReadConfigReg (PCI_HOST0, PCI_COMMAND, SELF);
command |= PCI_COMMAND_MASTER;
pciWriteConfigReg (PCI_HOST0, PCI_COMMAND, SELF, command);
command = pciReadConfigReg (PCI_HOST0, PCI_COMMAND, SELF);
command |= PCI_COMMAND_MEMORY;
pciWriteConfigReg (PCI_HOST0, PCI_COMMAND, SELF, command);
#ifdef CONFIG_PCI_PNP
pciauto_config_init(&pci0_hose);
pciauto_region_allocate(pci0_hose.pci_io, 0x400, &bar);
#endif
#ifdef CONFIG_PCI_SCAN_SHOW
printf("PCI: Bus Dev VenId DevId Class Int\n");
#endif
pci0_hose.last_busno = pci_hose_scan_bus (&pci0_hose, pci0_hose.first_busno);
#ifdef DEBUG
gt_pci_bus_mode_display (PCI_HOST1);
#endif
pci1_hose.first_busno = pci0_hose.last_busno + 1;
pci1_hose.last_busno = 0xff;
pci1_hose.current_busno = pci1_hose.first_busno;
local_buses[1] = pci1_hose.first_busno;
/* PCI memory space */
pci_set_region (pci1_hose.regions + 0,
CFG_PCI1_0_MEM_SPACE,
CFG_PCI1_0_MEM_SPACE,
CFG_PCI1_MEM_SIZE, PCI_REGION_MEM);
/* PCI I/O space */
pci_set_region (pci1_hose.regions + 1,
CFG_PCI1_IO_SPACE_PCI,
CFG_PCI1_IO_SPACE, CFG_PCI1_IO_SIZE, PCI_REGION_IO);
pci_set_ops (&pci1_hose,
pci_hose_read_config_byte_via_dword,
pci_hose_read_config_word_via_dword,
gt_read_config_dword,
pci_hose_write_config_byte_via_dword,
pci_hose_write_config_word_via_dword,
gt_write_config_dword);
pci1_hose.region_count = 2;
pci1_hose.cfg_addr = (unsigned int *) PCI_HOST1;
pci_register_hose (&pci1_hose);
pciArbiterEnable (PCI_HOST1);
pciParkingDisable (PCI_HOST1, 1, 1, 1, 1, 1, 1, 1);
command = pciReadConfigReg (PCI_HOST1, PCI_COMMAND, SELF);
command |= PCI_COMMAND_MASTER;
pciWriteConfigReg (PCI_HOST1, PCI_COMMAND, SELF, command);
#ifdef CONFIG_PCI_PNP
pciauto_config_init(&pci1_hose);
pciauto_region_allocate(pci1_hose.pci_io, 0x400, &bar);
#endif
pci1_hose.last_busno = pci_hose_scan_bus (&pci1_hose, pci1_hose.first_busno);
command = pciReadConfigReg (PCI_HOST1, PCI_COMMAND, SELF);
command |= PCI_COMMAND_MEMORY;
pciWriteConfigReg (PCI_HOST1, PCI_COMMAND, SELF, command);
}
#endif /* of CONFIG_PCI */

File diff suppressed because it is too large Load Diff

110
board/esd/cpci750/serial.c Normal file
View File

@@ -0,0 +1,110 @@
/*
* (C) Copyright 2001
* Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
*
* modified for marvell db64360 eval board by
* Ingo Assmus <ingo.assmus@keymile.com>
*
* modified for cpci750 board by
* Reinhard Arlt <reinhard.arlt@esd-electronics.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* serial.c - serial support for esd cpci750 board
*/
/* supports the MPSC */
#include <common.h>
#include <command.h>
#include "../../Marvell/include/memory.h"
#include "serial.h"
#include "mpsc.h"
int serial_init (void)
{
DECLARE_GLOBAL_DATA_PTR;
mpsc_init (gd->baudrate);
return (0);
}
void serial_putc (const char c)
{
if (c == '\n')
mpsc_putchar ('\r');
mpsc_putchar (c);
}
int serial_getc (void)
{
return mpsc_getchar ();
}
int serial_tstc (void)
{
return mpsc_test_char ();
}
void serial_setbrg (void)
{
DECLARE_GLOBAL_DATA_PTR;
galbrg_set_baudrate (CONFIG_MPSC_PORT, gd->baudrate);
}
void serial_puts (const char *s)
{
while (*s) {
serial_putc (*s++);
}
}
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
void kgdb_serial_init (void)
{
}
void putDebugChar (int c)
{
serial_putc (c);
}
void putDebugStr (const char *str)
{
serial_puts (str);
}
int getDebugChar (void)
{
return serial_getc ();
}
void kgdb_interruptible (int yes)
{
return;
}
#endif /* CFG_CMD_KGDB */

View File

@@ -0,0 +1,89 @@
/*
* (C) Copyright 2001
* Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
*
* modified for marvell db64360 eval board by
* Ingo Assmus <ingo.assmus@keymile.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/* serial.h - mostly useful for DUART serial_init in serial.c */
#ifndef __SERIAL_H__
#define __SERIAL_H__
#if 0
#define B230400 1
#define B115200 2
#define B57600 4
#define B38400 82
#define B19200 163
#define B9600 24
#define B4800 651
#define B2400 1302
#define B1200 2604
#define B600 5208
#define B300 10417
#define B150 20833
#define B110 28409
#define BDEFAULT B115200
/* this stuff is important to initialize
the DUART channels */
#define Scale 0x01L /* distance between port addresses */
#define COM1 0x000003f8 /* Keyboard */
#define COM2 0x000002f8 /* Host */
/* Port Definitions relative to base COM port addresses */
#define DataIn (0x00*Scale) /* data input port */
#define DataOut (0x00*Scale) /* data output port */
#define BaudLsb (0x00*Scale) /* baud rate divisor least significant byte */
#define BaudMsb (0x01*Scale) /* baud rate divisor most significant byte */
#define Ier (0x01*Scale) /* interrupt enable register */
#define Iir (0x02*Scale) /* interrupt identification register */
#define Lcr (0x03*Scale) /* line control register */
#define Mcr (0x04*Scale) /* modem control register */
#define Lsr (0x05*Scale) /* line status register */
#define Msr (0x06*Scale) /* modem status register */
/* Bit Definitions for above ports */
#define LcrDlab 0x80 /* b7: enable baud rate divisor registers */
#define LcrDflt 0x03 /* b6-0: no parity, 1 stop, 8 data */
#define McrRts 0x02 /* b1: request to send (I am ready to xmit) */
#define McrDtr 0x01 /* b0: data terminal ready (I am alive ready to rcv) */
#define McrDflt (McrRts|McrDtr)
#define LsrTxD 0x6000 /* b5: transmit holding register empty (i.e. xmit OK!)*/
/* b6: transmitter empty */
#define LsrRxD 0x0100 /* b0: received data ready (i.e. got a byte!) */
#define MsrRi 0x0040 /* b6: ring indicator (other guy is ready to rcv) */
#define MsrDsr 0x0020 /* b5: data set ready (other guy is alive ready to rcv */
#define MsrCts 0x0010 /* b4: clear to send (other guy is ready to rcv) */
#define IerRda 0xf /* b0: Enable received data available interrupt */
#endif
#endif /* __SERIAL_H__ */

View File

@@ -0,0 +1,763 @@
/*
* (C) Copyright 2002
* Brad Kemp, Seranoa Networks, Brad.Kemp@seranoa.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <asm/processor.h>
#include <asm/cache.h>
#undef DEBUG_FLASH
/*
* This file implements a Common Flash Interface (CFI) driver for U-Boot.
* The width of the port and the width of the chips are determined at initialization.
* These widths are used to calculate the address for access CFI data structures.
* It has been tested on an Intel Strataflash implementation.
*
* References
* JEDEC Standard JESD68 - Common Flash Interface (CFI)
* JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes
* Intel Application Note 646 Common Flash Interface (CFI) and Command Sets
* Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet
*
* TODO
* Use Primary Extended Query table (PRI) and Alternate Algorithm Query Table (ALT) to determine if protection is available
* Add support for other command sets Use the PRI and ALT to determine command set
* Verify erase and program timeouts.
*/
#define FLASH_CMD_CFI 0x98
#define FLASH_CMD_READ_ID 0x90
#define FLASH_CMD_RESET 0xff
#define FLASH_CMD_BLOCK_ERASE 0x20
#define FLASH_CMD_ERASE_CONFIRM 0xD0
#define FLASH_CMD_WRITE 0x40
#define FLASH_CMD_PROTECT 0x60
#define FLASH_CMD_PROTECT_SET 0x01
#define FLASH_CMD_PROTECT_CLEAR 0xD0
#define FLASH_CMD_CLEAR_STATUS 0x50
#define FLASH_CMD_WRITE_TO_BUFFER 0xE8
#define FLASH_CMD_WRITE_BUFFER_CONFIRM 0xD0
#define FLASH_STATUS_DONE 0x80
#define FLASH_STATUS_ESS 0x40
#define FLASH_STATUS_ECLBS 0x20
#define FLASH_STATUS_PSLBS 0x10
#define FLASH_STATUS_VPENS 0x08
#define FLASH_STATUS_PSS 0x04
#define FLASH_STATUS_DPS 0x02
#define FLASH_STATUS_R 0x01
#define FLASH_STATUS_PROTECT 0x01
#define FLASH_OFFSET_CFI 0x55
#define FLASH_OFFSET_CFI_RESP 0x10
#define FLASH_OFFSET_WTOUT 0x1F
#define FLASH_OFFSET_WBTOUT 0x20
#define FLASH_OFFSET_ETOUT 0x21
#define FLASH_OFFSET_CETOUT 0x22
#define FLASH_OFFSET_WMAX_TOUT 0x23
#define FLASH_OFFSET_WBMAX_TOUT 0x24
#define FLASH_OFFSET_EMAX_TOUT 0x25
#define FLASH_OFFSET_CEMAX_TOUT 0x26
#define FLASH_OFFSET_SIZE 0x27
#define FLASH_OFFSET_INTERFACE 0x28
#define FLASH_OFFSET_BUFFER_SIZE 0x2A
#define FLASH_OFFSET_NUM_ERASE_REGIONS 0x2C
#define FLASH_OFFSET_ERASE_REGIONS 0x2D
#define FLASH_OFFSET_PROTECT 0x02
#define FLASH_OFFSET_USER_PROTECTION 0x85
#define FLASH_OFFSET_INTEL_PROTECTION 0x81
#define FLASH_MAN_CFI 0x01000000
typedef union {
unsigned char c;
unsigned short w;
unsigned long l;
} cfiword_t;
typedef union {
unsigned char * cp;
unsigned short *wp;
unsigned long *lp;
} cfiptr_t;
#define NUM_ERASE_REGIONS 4
flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
/*-----------------------------------------------------------------------
* Functions
*/
static void flash_add_byte(flash_info_t *info, cfiword_t * cword, uchar c);
static void flash_make_cmd(flash_info_t * info, uchar cmd, void * cmdbuf);
static void flash_write_cmd(flash_info_t * info, int sect, uchar offset, uchar cmd);
static int flash_isequal(flash_info_t * info, int sect, uchar offset, uchar cmd);
static int flash_isset(flash_info_t * info, int sect, uchar offset, uchar cmd);
static int flash_detect_cfi(flash_info_t * info);
static ulong flash_get_size (ulong base, int banknum);
static int flash_write_cfiword (flash_info_t *info, ulong dest, cfiword_t cword);
static int flash_full_status_check(flash_info_t * info, ulong sector, ulong tout, char * prompt);
#ifdef CFG_FLASH_USE_BUFFER_WRITE
static int flash_write_cfibuffer(flash_info_t * info, ulong dest, uchar * cp, int len);
#endif
/*-----------------------------------------------------------------------
* create an address based on the offset and the port width
*/
inline uchar * flash_make_addr(flash_info_t * info, int sect, int offset)
{
return ((uchar *)(info->start[sect] + (offset * info->portwidth)));
}
/*-----------------------------------------------------------------------
* read a character at a port width address
*/
inline uchar flash_read_uchar(flash_info_t * info, uchar offset)
{
uchar *cp;
cp = flash_make_addr(info, 0, offset);
return (cp[info->portwidth - 1]);
}
/*-----------------------------------------------------------------------
* read a short word by swapping for ppc format.
*/
ushort flash_read_ushort(flash_info_t * info, int sect, uchar offset)
{
uchar * addr;
addr = flash_make_addr(info, sect, offset);
return ((addr[(2*info->portwidth) - 1] << 8) | addr[info->portwidth - 1]);
}
/*-----------------------------------------------------------------------
* read a long word by picking the least significant byte of each maiximum
* port size word. Swap for ppc format.
*/
ulong flash_read_long(flash_info_t * info, int sect, uchar offset)
{
uchar * addr;
addr = flash_make_addr(info, sect, offset);
return ( (addr[(2*info->portwidth) - 1] << 24 ) | (addr[(info->portwidth) -1] << 16) |
(addr[(4*info->portwidth) - 1] << 8) | addr[(3*info->portwidth) - 1]);
}
/*-----------------------------------------------------------------------
*/
unsigned long flash_init (void)
{
unsigned long size;
int i;
unsigned long address;
/* The flash is positioned back to back, with the demultiplexing of the chip
* based on the A24 address line.
*
*/
address = CFG_FLASH_BASE;
size = 0;
/* Init: no FLASHes known */
for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {
flash_info[i].flash_id = FLASH_UNKNOWN;
size += flash_info[i].size = flash_get_size(address, i);
address += CFG_FLASH_INCREMENT;
if (flash_info[i].flash_id == FLASH_UNKNOWN) {
printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",i,
flash_info[0].size, flash_info[i].size<<20);
}
}
#if 0 /* test-only */
/* Monitor protection ON by default */
#if (CFG_MONITOR_BASE >= CFG_FLASH_BASE)
for(i=0; flash_info[0].start[i] < CFG_MONITOR_BASE+monitor_flash_len-1; i++)
(void)flash_real_protect(&flash_info[0], i, 1);
#endif
#endif
return (size);
}
/*-----------------------------------------------------------------------
*/
int flash_erase (flash_info_t *info, int s_first, int s_last)
{
int rcode = 0;
int prot;
int sect;
if( info->flash_id != FLASH_MAN_CFI) {
printf ("Can't erase unknown flash type - aborted\n");
return 1;
}
if ((s_first < 0) || (s_first > s_last)) {
printf ("- no sectors to erase\n");
return 1;
}
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");
}
for (sect = s_first; sect<=s_last; sect++) {
if (info->protect[sect] == 0) { /* not protected */
flash_write_cmd(info, sect, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd(info, sect, 0, FLASH_CMD_BLOCK_ERASE);
flash_write_cmd(info, sect, 0, FLASH_CMD_ERASE_CONFIRM);
if(flash_full_status_check(info, sect, info->erase_blk_tout, "erase")) {
rcode = 1;
} else
printf(".");
}
}
printf (" done\n");
return rcode;
}
/*-----------------------------------------------------------------------
*/
void flash_print_info (flash_info_t *info)
{
int i;
if (info->flash_id != FLASH_MAN_CFI) {
printf ("missing or unknown FLASH type\n");
return;
}
printf("CFI conformant FLASH (%d x %d)",
(info->portwidth << 3 ), (info->chipwidth << 3 ));
printf (" Size: %ld MB in %d Sectors\n",
info->size >> 20, info->sector_count);
printf(" Erase timeout %ld ms, write timeout %ld ms, buffer write timeout %ld ms, buffer size %d\n",
info->erase_blk_tout, info->write_tout, info->buffer_write_tout, info->buffer_size);
printf (" Sector Start Addresses:");
for (i=0; i<info->sector_count; ++i) {
if ((i % 5) == 0)
printf ("\n");
printf (" %08lX%5s",
info->start[i],
info->protect[i] ? " (RO)" : " "
);
}
printf ("\n");
return;
}
/*-----------------------------------------------------------------------
* Copy memory to flash, returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
*/
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
{
ulong wp;
ulong cp;
int aln;
cfiword_t cword;
int i, rc;
/* get lower aligned address */
wp = (addr & ~(info->portwidth - 1));
/* handle unaligned start */
if((aln = addr - wp) != 0) {
cword.l = 0;
cp = wp;
for(i=0;i<aln; ++i, ++cp)
flash_add_byte(info, &cword, (*(uchar *)cp));
for(; (i< info->portwidth) && (cnt > 0) ; i++) {
flash_add_byte(info, &cword, *src++);
cnt--;
cp++;
}
for(; (cnt == 0) && (i < info->portwidth); ++i, ++cp)
flash_add_byte(info, &cword, (*(uchar *)cp));
if((rc = flash_write_cfiword(info, wp, cword)) != 0)
return rc;
wp = cp;
}
#ifdef CFG_FLASH_USE_BUFFER_WRITE
while(cnt >= info->portwidth) {
i = info->buffer_size > cnt? cnt: info->buffer_size;
if((rc = flash_write_cfibuffer(info, wp, src,i)) != ERR_OK)
return rc;
wp += i;
src += i;
cnt -=i;
}
#else
/* handle the aligned part */
while(cnt >= info->portwidth) {
cword.l = 0;
for(i = 0; i < info->portwidth; i++) {
flash_add_byte(info, &cword, *src++);
}
if((rc = flash_write_cfiword(info, wp, cword)) != 0)
return rc;
wp += info->portwidth;
cnt -= info->portwidth;
}
#endif /* CFG_FLASH_USE_BUFFER_WRITE */
if (cnt == 0) {
return (0);
}
/*
* handle unaligned tail bytes
*/
cword.l = 0;
for (i=0, cp=wp; (i<info->portwidth) && (cnt>0); ++i, ++cp) {
flash_add_byte(info, &cword, *src++);
--cnt;
}
for (; i<info->portwidth; ++i, ++cp) {
flash_add_byte(info, & cword, (*(uchar *)cp));
}
return flash_write_cfiword(info, wp, cword);
}
/*-----------------------------------------------------------------------
*/
int flash_real_protect(flash_info_t *info, long sector, int prot)
{
int retcode = 0;
flash_write_cmd(info, sector, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd(info, sector, 0, FLASH_CMD_PROTECT);
if(prot)
flash_write_cmd(info, sector, 0, FLASH_CMD_PROTECT_SET);
else
flash_write_cmd(info, sector, 0, FLASH_CMD_PROTECT_CLEAR);
if((retcode = flash_full_status_check(info, sector, info->erase_blk_tout,
prot?"protect":"unprotect")) == 0) {
info->protect[sector] = prot;
/* Intel's unprotect unprotects all locking */
if(prot == 0) {
int i;
for(i = 0 ; i<info->sector_count; i++) {
if(info->protect[i])
flash_real_protect(info, i, 1);
}
}
}
return retcode;
}
/*-----------------------------------------------------------------------
* wait for XSR.7 to be set. Time out with an error if it does not.
* This routine does not set the flash to read-array mode.
*/
static int flash_status_check(flash_info_t * info, ulong sector, ulong tout, char * prompt)
{
ulong start;
/* Wait for command completion */
start = get_timer (0);
while(!flash_isset(info, sector, 0, FLASH_STATUS_DONE)) {
if (get_timer(start) > info->erase_blk_tout) {
printf("Flash %s timeout at address %lx\n", prompt, info->start[sector]);
flash_write_cmd(info, sector, 0, FLASH_CMD_RESET);
return ERR_TIMOUT;
}
}
return ERR_OK;
}
/*-----------------------------------------------------------------------
* Wait for XSR.7 to be set, if it times out print an error, otherwise do a full status check.
* This routine sets the flash to read-array mode.
*/
static int flash_full_status_check(flash_info_t * info, ulong sector, ulong tout, char * prompt)
{
int retcode;
retcode = flash_status_check(info, sector, tout, prompt);
if((retcode == ERR_OK) && !flash_isequal(info,sector, 0, FLASH_STATUS_DONE)) {
retcode = ERR_INVAL;
printf("Flash %s error at address %lx\n", prompt,info->start[sector]);
if(flash_isset(info, sector, 0, FLASH_STATUS_ECLBS | FLASH_STATUS_PSLBS)){
printf("Command Sequence Error.\n");
} else if(flash_isset(info, sector, 0, FLASH_STATUS_ECLBS)){
printf("Block Erase Error.\n");
retcode = ERR_NOT_ERASED;
} else if (flash_isset(info, sector, 0, FLASH_STATUS_PSLBS)) {
printf("Locking Error\n");
}
if(flash_isset(info, sector, 0, FLASH_STATUS_DPS)){
printf("Block locked.\n");
retcode = ERR_PROTECTED;
}
if(flash_isset(info, sector, 0, FLASH_STATUS_VPENS))
printf("Vpp Low Error.\n");
}
flash_write_cmd(info, sector, 0, FLASH_CMD_RESET);
return retcode;
}
/*-----------------------------------------------------------------------
*/
static void flash_add_byte(flash_info_t *info, cfiword_t * cword, uchar c)
{
switch(info->portwidth) {
case FLASH_CFI_8BIT:
cword->c = c;
break;
case FLASH_CFI_16BIT:
cword->w = (cword->w << 8) | c;
break;
case FLASH_CFI_32BIT:
cword->l = (cword->l << 8) | c;
}
}
/*-----------------------------------------------------------------------
* make a proper sized command based on the port and chip widths
*/
static void flash_make_cmd(flash_info_t * info, uchar cmd, void * cmdbuf)
{
int i;
uchar *cp = (uchar *)cmdbuf;
for(i=0; i< info->portwidth; i++)
*cp++ = ((i+1) % info->chipwidth) ? '\0':cmd;
}
/*
* Write a proper sized command to the correct address
*/
static void flash_write_cmd(flash_info_t * info, int sect, uchar offset, uchar cmd)
{
volatile cfiptr_t addr;
cfiword_t cword;
addr.cp = flash_make_addr(info, sect, offset);
flash_make_cmd(info, cmd, &cword);
switch(info->portwidth) {
case FLASH_CFI_8BIT:
*addr.cp = cword.c;
break;
case FLASH_CFI_16BIT:
*addr.wp = cword.w;
break;
case FLASH_CFI_32BIT:
*addr.lp = cword.l;
break;
}
}
/*-----------------------------------------------------------------------
*/
static int flash_isequal(flash_info_t * info, int sect, uchar offset, uchar cmd)
{
cfiptr_t cptr;
cfiword_t cword;
int retval;
cptr.cp = flash_make_addr(info, sect, offset);
flash_make_cmd(info, cmd, &cword);
switch(info->portwidth) {
case FLASH_CFI_8BIT:
retval = (cptr.cp[0] == cword.c);
break;
case FLASH_CFI_16BIT:
retval = (cptr.wp[0] == cword.w);
break;
case FLASH_CFI_32BIT:
retval = (cptr.lp[0] == cword.l);
break;
default:
retval = 0;
break;
}
return retval;
}
/*-----------------------------------------------------------------------
*/
static int flash_isset(flash_info_t * info, int sect, uchar offset, uchar cmd)
{
cfiptr_t cptr;
cfiword_t cword;
int retval;
cptr.cp = flash_make_addr(info, sect, offset);
flash_make_cmd(info, cmd, &cword);
switch(info->portwidth) {
case FLASH_CFI_8BIT:
retval = ((cptr.cp[0] & cword.c) == cword.c);
break;
case FLASH_CFI_16BIT:
retval = ((cptr.wp[0] & cword.w) == cword.w);
break;
case FLASH_CFI_32BIT:
retval = ((cptr.lp[0] & cword.l) == cword.l);
break;
default:
retval = 0;
break;
}
return retval;
}
/*-----------------------------------------------------------------------
* detect if flash is compatible with the Common Flash Interface (CFI)
* http://www.jedec.org/download/search/jesd68.pdf
*
*/
static int flash_detect_cfi(flash_info_t * info)
{
for(info->portwidth=FLASH_CFI_8BIT; info->portwidth <= FLASH_CFI_32BIT;
info->portwidth <<= 1) {
for(info->chipwidth =FLASH_CFI_BY8;
info->chipwidth <= info->portwidth;
info->chipwidth <<= 1) {
flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
flash_write_cmd(info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI);
if(flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP,'Q') &&
flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R') &&
flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y'))
return 1;
}
}
return 0;
}
/*
* The following code cannot be run from FLASH!
*
*/
static ulong flash_get_size (ulong base, int banknum)
{
flash_info_t * info = &flash_info[banknum];
int i, j;
int sect_cnt;
unsigned long sector;
unsigned long tmp;
int size_ratio = 0;
uchar num_erase_regions;
int erase_region_size;
int erase_region_count;
info->start[0] = base;
invalidate_dcache_range(base, base+0x400);
if(flash_detect_cfi(info)){
size_ratio = info->portwidth / info->chipwidth;
num_erase_regions = flash_read_uchar(info, FLASH_OFFSET_NUM_ERASE_REGIONS);
sect_cnt = 0;
sector = base;
for(i = 0 ; i < num_erase_regions; i++) {
if(i > NUM_ERASE_REGIONS) {
printf("%d erase regions found, only %d used\n",
num_erase_regions, NUM_ERASE_REGIONS);
break;
}
tmp = flash_read_long(info, 0, FLASH_OFFSET_ERASE_REGIONS);
erase_region_size = (tmp & 0xffff)? ((tmp & 0xffff) * 256): 128;
tmp >>= 16;
erase_region_count = (tmp & 0xffff) +1;
for(j = 0; j< erase_region_count; j++) {
info->start[sect_cnt] = sector;
sector += (erase_region_size * size_ratio);
info->protect[sect_cnt] = flash_isset(info, sect_cnt, FLASH_OFFSET_PROTECT, FLASH_STATUS_PROTECT);
sect_cnt++;
}
}
info->sector_count = sect_cnt;
/* multiply the size by the number of chips */
info->size = (1 << flash_read_uchar(info, FLASH_OFFSET_SIZE)) * size_ratio;
info->buffer_size = (1 << flash_read_ushort(info, 0, FLASH_OFFSET_BUFFER_SIZE));
tmp = 1 << flash_read_uchar(info, FLASH_OFFSET_ETOUT);
info->erase_blk_tout = (tmp * (1 << flash_read_uchar(info, FLASH_OFFSET_EMAX_TOUT)));
tmp = 1 << flash_read_uchar(info, FLASH_OFFSET_WBTOUT);
info->buffer_write_tout = (tmp * (1 << flash_read_uchar(info, FLASH_OFFSET_WBMAX_TOUT)));
tmp = 1 << flash_read_uchar(info, FLASH_OFFSET_WTOUT);
info->write_tout = (tmp * (1 << flash_read_uchar(info, FLASH_OFFSET_WMAX_TOUT)))/ 1000;
info->flash_id = FLASH_MAN_CFI;
}
flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
#ifdef DEBUG_FLASH
printf("portwidth=%d chipwidth=%d\n", info->portwidth, info->chipwidth); /* test-only */
#endif
#ifdef DEBUG_FLASH
printf("found %d erase regions\n", num_erase_regions);
#endif
#ifdef DEBUG_FLASH
printf("size=%08x sectors=%08x \n", info->size, info->sector_count);
#endif
return(info->size);
}
/*-----------------------------------------------------------------------
*/
static int flash_write_cfiword (flash_info_t *info, ulong dest, cfiword_t cword)
{
cfiptr_t ctladdr;
cfiptr_t cptr;
int flag;
ctladdr.cp = flash_make_addr(info, 0, 0);
cptr.cp = (uchar *)dest;
/* Check if Flash is (sufficiently) erased */
switch(info->portwidth) {
case FLASH_CFI_8BIT:
flag = ((cptr.cp[0] & cword.c) == cword.c);
break;
case FLASH_CFI_16BIT:
flag = ((cptr.wp[0] & cword.w) == cword.w);
break;
case FLASH_CFI_32BIT:
flag = ((cptr.lp[0] & cword.l) == cword.l);
break;
default:
return 2;
}
if(!flag)
return 2;
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts();
flash_write_cmd(info, 0, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd(info, 0, 0, FLASH_CMD_WRITE);
switch(info->portwidth) {
case FLASH_CFI_8BIT:
cptr.cp[0] = cword.c;
break;
case FLASH_CFI_16BIT:
cptr.wp[0] = cword.w;
break;
case FLASH_CFI_32BIT:
cptr.lp[0] = cword.l;
break;
}
/* re-enable interrupts if necessary */
if(flag)
enable_interrupts();
return flash_full_status_check(info, 0, info->write_tout, "write");
}
#ifdef CFG_FLASH_USE_BUFFER_WRITE
/* loop through the sectors from the highest address
* when the passed address is greater or equal to the sector address
* we have a match
*/
static int find_sector(flash_info_t *info, ulong addr)
{
int sector;
for(sector = info->sector_count - 1; sector >= 0; sector--) {
if(addr >= info->start[sector])
break;
}
return sector;
}
static int flash_write_cfibuffer(flash_info_t * info, ulong dest, uchar * cp, int len)
{
int sector;
int cnt;
int retcode;
volatile cfiptr_t src;
volatile cfiptr_t dst;
src.cp = cp;
dst.cp = (uchar *)dest;
sector = find_sector(info, dest);
flash_write_cmd(info, sector, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd(info, sector, 0, FLASH_CMD_WRITE_TO_BUFFER);
if((retcode = flash_status_check(info, sector, info->buffer_write_tout,
"write to buffer")) == ERR_OK) {
switch(info->portwidth) {
case FLASH_CFI_8BIT:
cnt = len;
break;
case FLASH_CFI_16BIT:
cnt = len >> 1;
break;
case FLASH_CFI_32BIT:
cnt = len >> 2;
break;
default:
return ERR_INVAL;
break;
}
flash_write_cmd(info, sector, 0, (uchar)cnt-1);
while(cnt-- > 0) {
switch(info->portwidth) {
case FLASH_CFI_8BIT:
*dst.cp++ = *src.cp++;
break;
case FLASH_CFI_16BIT:
*dst.wp++ = *src.wp++;
break;
case FLASH_CFI_32BIT:
*dst.lp++ = *src.lp++;
break;
default:
return ERR_INVAL;
break;
}
}
flash_write_cmd(info, sector, 0, FLASH_CMD_WRITE_BUFFER_CONFIRM);
retcode = flash_full_status_check(info, sector, info->buffer_write_tout,
"buffer write");
}
flash_write_cmd(info, sector, 0, FLASH_CMD_CLEAR_STATUS);
return retcode;
}
#endif /* CFG_USE_FLASH_BUFFER_WRITE */

View File

@@ -0,0 +1,135 @@
/*
* (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)
*(.rodata.str1.4)
}
.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 = .);
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
__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 = .);
}

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o
OBJS = $(BOARD).o flash.o ../common/misc.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)

View File

@@ -29,6 +29,7 @@
/*cmd_boot.c*/
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
extern void lxt971_no_sleep(void);
/* ------------------------------------------------------------------------- */
@@ -157,13 +158,12 @@ int checkboard (void)
puts ("Board: ");
if (!i || strncmp (str, "CPCIISER4", 9)) {
puts ("### No HW ID - assuming CPCIISER4\n");
return (0);
if (i == -1) {
puts ("### No HW ID - assuming AR405");
} else {
puts(str);
}
puts (str);
puts ("\nFPGA: ");
/* display infos on fpgaimage */
@@ -176,6 +176,11 @@ int checkboard (void)
putc ('\n');
/*
* Disable sleep mode in LXT971
*/
lxt971_no_sleep();
return 0;
}

View File

@@ -30,7 +30,7 @@ CPLD = ../common/xilinx_jtag/lenval.o \
../common/xilinx_jtag/micro.o \
../common/xilinx_jtag/ports.o
OBJS = $(BOARD).o flash.o $(CPLD)
OBJS = $(BOARD).o flash.o ../common/misc.o $(CPLD)
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)

View File

@@ -62,6 +62,14 @@ int board_early_init_f (void)
*/
mtebc (epcr, 0xa8400000); /* ebc always driven */
/*
* Reset CPLD via GPIO13 (CS4) pin
*/
out32(GPIO0_OR, in32(GPIO0_OR) & ~(0x80000000 >> 13));
udelay(1000); /* wait 1ms */
out32(GPIO0_OR, in32(GPIO0_OR) | (0x80000000 >> 13));
udelay(1000); /* wait 1ms */
return 0;
}
@@ -76,13 +84,11 @@ int misc_init_f (void)
int misc_init_r (void)
{
/*
* Reset CPLD via GPIO13 (CS4) pin
*/
out32(GPIO0_OR, in32(GPIO0_OR) & ~(0x80000000 >> 13));
udelay(1000); /* wait 1ms */
out32(GPIO0_OR, in32(GPIO0_OR) | (0x80000000 >> 13));
udelay(1000); /* wait 1ms */
DECLARE_GLOBAL_DATA_PTR;
/* adjust flash start and offset */
gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
gd->bd->bi_flashoffset = 0;
return (0);
}
@@ -110,7 +116,7 @@ int checkboard (void)
id1 = trans[(~(in32(GPIO0_IR) >> 5)) & 0x0000000f];
id2 = trans[(~(in32(GPIO0_IR) >> 9)) & 0x0000000f];
printf(" (ID=0x%1X%1X)\n", id1, id2);
printf(" (ID=0x%1X%1X, PLD=0x%02X)\n", id2, id1, in8(0xf0001000));
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o
OBJS = $(BOARD).o flash.o ../common/misc.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)

View File

@@ -31,8 +31,8 @@
/*cmd_boot.c*/
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
extern void lxt971_no_sleep(void);
/* ------------------------------------------------------------------------- */
#if 0
#define FPGA_DEBUG
@@ -141,12 +141,9 @@ int board_early_init_f (void)
}
/* ------------------------------------------------------------------------- */
/*
* Check Board Identity:
*/
int checkboard (void)
{
int index;
@@ -180,17 +177,20 @@ int checkboard (void)
*(volatile unsigned char *) FPGA_MODE_REG = 0xff; /* reset high active */
*(volatile unsigned char *) FPGA_MODE_REG = 0x00; /* low again */
/*
* Disable sleep mode in LXT971
*/
lxt971_no_sleep();
return 0;
}
/* ------------------------------------------------------------------------- */
long int initdram (int board_type)
{
return (16 * 1024 * 1024);
}
/* ------------------------------------------------------------------------- */
int testdram (void)
{
@@ -199,5 +199,3 @@ int testdram (void)
return (0);
}
/* ------------------------------------------------------------------------- */

46
board/esd/hh405/Makefile Normal file
View File

@@ -0,0 +1,46 @@
#
# (C) Copyright 2000
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# See file CREDITS for list of people who contributed to this
# project.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o ../common/misc.o ../common/auto_update.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)
clean:
rm -f $(SOBJS) $(OBJS)
distclean: clean
rm -f $(LIB) core *.bak .depend
#########################################################################
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
sinclude .depend
#########################################################################

31
board/esd/hh405/config.mk Normal file
View File

@@ -0,0 +1,31 @@
#
# (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
#
#
# esd VOH405 boards
#
#TEXT_BASE = 0xFFF00000
TEXT_BASE = 0xFFF80000
#TEXT_BASE = 0xFFFC0000
#TEXT_BASE = 0x00FC0000

101
board/esd/hh405/flash.c Normal file
View File

@@ -0,0 +1,101 @@
/*
* (C) Copyright 2001
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <ppc4xx.h>
#include <asm/processor.h>
/*
* include common flash code (for esd boards)
*/
#include "../common/flash.c"
/*-----------------------------------------------------------------------
* Functions
*/
static ulong flash_get_size (vu_long * addr, flash_info_t * info);
static void flash_get_offsets (ulong base, flash_info_t * info);
/*-----------------------------------------------------------------------
*/
unsigned long flash_init (void)
{
unsigned long size_b0;
int i;
uint pbcr;
unsigned long base_b0;
int size_val = 0;
/* Init: no FLASHes known */
for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {
flash_info[i].flash_id = FLASH_UNKNOWN;
}
/* Static FLASH Bank configuration here - FIXME XXX */
size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]);
if (flash_info[0].flash_id == FLASH_UNKNOWN) {
printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
size_b0, size_b0<<20);
}
/* Setup offsets */
flash_get_offsets (-size_b0, &flash_info[0]);
/* Re-do sizing to get full correct info */
mtdcr(ebccfga, pb0cr);
pbcr = mfdcr(ebccfgd);
mtdcr(ebccfga, pb0cr);
base_b0 = -size_b0;
switch (size_b0) {
case 1 << 20:
size_val = 0;
break;
case 2 << 20:
size_val = 1;
break;
case 4 << 20:
size_val = 2;
break;
case 8 << 20:
size_val = 3;
break;
case 16 << 20:
size_val = 4;
break;
}
pbcr = (pbcr & 0x0001ffff) | base_b0 | (size_val << 17);
mtdcr(ebccfgd, pbcr);
/* Monitor protection ON by default */
(void)flash_protect(FLAG_PROTECT_SET,
-CFG_MONITOR_LEN,
0xffffffff,
&flash_info[0]);
flash_info[0].size = size_b0;
return (size_b0);
}

2473
board/esd/hh405/fpgadata.c Normal file

File diff suppressed because it is too large Load Diff

481
board/esd/hh405/hh405.c Normal file
View File

@@ -0,0 +1,481 @@
/*
* (C) Copyright 2001-2004
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <asm/processor.h>
#include <command.h>
#include <malloc.h>
/* ------------------------------------------------------------------------- */
#if 0
#define FPGA_DEBUG
#endif
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
extern void lxt971_no_sleep(void);
/* fpga configuration data - gzip compressed and generated by bin2c */
const unsigned char fpgadata[] =
{
#include "fpgadata.c"
};
/*
* include common fpga code (for esd boards)
*/
#include "../common/fpga.c"
/* Prototypes */
int gunzip(void *, int, unsigned char *, unsigned long *);
/* logo bitmap data - gzip compressed and generated by bin2c */
unsigned char logo_bmp_320[] =
{
#include "logo_320_240_4bpp.c"
};
unsigned char logo_bmp_320_8bpp[] =
{
#include "logo_320_240_8bpp.c"
};
unsigned char logo_bmp_640[] =
{
#include "logo_640_480_24bpp.c"
};
unsigned char logo_bmp_1024[] =
{
#include "logo_1024_768_8bpp.c"
};
/*
* include common lcd code (for esd boards)
*/
#include "../common/lcd.c"
#include "../common/s1d13704_320_240_4bpp.h"
#include "../common/s1d13705_320_240_8bpp.h"
#include "../common/s1d13806_640_480_16bpp.h"
#include "../common/s1d13806_1024_768_8bpp.h"
/*
* include common auto-update code (for esd boards)
*/
#include "../common/auto_update.h"
au_image_t au_image[] = {
{"hh405/preinst.img", 0, -1, AU_SCRIPT},
{"hh405/u-boot.img", 0xfff80000, 0x00080000, AU_FIRMWARE},
{"hh405/pImage_$(bd_type)", 0x00000000, 0x00100000, AU_NAND},
{"hh405/pImage.initrd", 0x00100000, 0x00200000, AU_NAND},
{"hh405/yaffsmt2.img", 0x00300000, 0x01c00000, AU_NAND},
{"hh405/postinst.img", 0, 0, AU_SCRIPT},
};
int N_AU_IMAGES = (sizeof(au_image) / sizeof(au_image[0]));
int board_revision(void)
{
unsigned long osrh_reg;
unsigned long isr1h_reg;
unsigned long tcr_reg;
unsigned long value;
/*
* Get version of HH405 board from GPIO's
*/
/*
* Setup GPIO pins (BLAST/GPIO0 and GPIO9 as GPIO)
*/
osrh_reg = in32(GPIO0_OSRH);
isr1h_reg = in32(GPIO0_ISR1H);
tcr_reg = in32(GPIO0_TCR);
out32(GPIO0_OSRH, osrh_reg & ~0xC0003000); /* output select */
out32(GPIO0_ISR1H, isr1h_reg | 0xC0003000); /* input select */
out32(GPIO0_TCR, tcr_reg & ~0x80400000); /* select input */
udelay(1000); /* wait some time before reading input */
value = in32(GPIO0_IR) & 0x80400000; /* get config bits */
/*
* Restore GPIO settings
*/
out32(GPIO0_OSRH, osrh_reg); /* output select */
out32(GPIO0_ISR1H, isr1h_reg); /* input select */
out32(GPIO0_TCR, tcr_reg); /* enable output driver for outputs */
if (value & 0x80000000) {
/* Revision 1.0 or 1.1 detected */
return 1;
} else {
if (value & 0x00400000) {
/* Revision 1.3 detected */
return 3;
} else {
/* Revision 1.2 detected */
return 2;
}
}
}
int board_early_init_f (void)
{
/*
* IRQ 0-15 405GP internally generated; active high; level sensitive
* IRQ 16 405GP internally generated; active low; level sensitive
* IRQ 17-24 RESERVED
* IRQ 25 (EXT IRQ 0) CAN0; active low; level sensitive
* IRQ 26 (EXT IRQ 1) SER0 ; active low; level sensitive
* IRQ 27 (EXT IRQ 2) SER1; active low; level sensitive
* IRQ 28 (EXT IRQ 3) FPGA 0; active low; level sensitive
* IRQ 29 (EXT IRQ 4) FPGA 1; active low; level sensitive
* IRQ 30 (EXT IRQ 5) PCI INTA; active low; level sensitive
* IRQ 31 (EXT IRQ 6) COMPACT FLASH; active high; level sensitive
*/
mtdcr(uicsr, 0xFFFFFFFF); /* clear all ints */
mtdcr(uicer, 0x00000000); /* disable all ints */
mtdcr(uiccr, 0x00000000); /* set all to be non-critical*/
mtdcr(uicpr, CFG_UIC0_POLARITY);/* set int polarities */
mtdcr(uictr, 0x10000000); /* set int trigger levels */
mtdcr(uicvcr, 0x00000001); /* set vect base=0,INT0 highest priority*/
mtdcr(uicsr, 0xFFFFFFFF); /* clear all ints */
/*
* EBC Configuration Register: set ready timeout to 512 ebc-clks -> ca. 15 us
*/
mtebc (epcr, 0xa8400000); /* ebc always driven */
return 0;
}
int misc_init_r (void)
{
DECLARE_GLOBAL_DATA_PTR;
volatile unsigned short *fpga_ctrl =
(unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL);
volatile unsigned short *lcd_contrast =
(unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL + 4);
volatile unsigned short *lcd_backlight =
(unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL + 6);
unsigned char *dst;
ulong len = sizeof(fpgadata);
int status;
int index;
int i;
char *str;
unsigned long contrast0 = 0xffffffff;
dst = malloc(CFG_FPGA_MAX_SIZE);
if (gunzip (dst, CFG_FPGA_MAX_SIZE, (uchar *)fpgadata, &len) != 0) {
printf ("GUNZIP ERROR - must RESET board to recover\n");
do_reset (NULL, 0, 0, NULL);
}
status = fpga_boot(dst, len);
if (status != 0) {
printf("\nFPGA: Booting failed ");
switch (status) {
case ERROR_FPGA_PRG_INIT_LOW:
printf("(Timeout: INIT not low after asserting PROGRAM*)\n ");
break;
case ERROR_FPGA_PRG_INIT_HIGH:
printf("(Timeout: INIT not high after deasserting PROGRAM*)\n ");
break;
case ERROR_FPGA_PRG_DONE:
printf("(Timeout: DONE not high after programming FPGA)\n ");
break;
}
/* display infos on fpgaimage */
index = 15;
for (i=0; i<4; i++) {
len = dst[index];
printf("FPGA: %s\n", &(dst[index+1]));
index += len+3;
}
putc ('\n');
/* delayed reboot */
for (i=20; i>0; i--) {
printf("Rebooting in %2d seconds \r",i);
for (index=0;index<1000;index++)
udelay(1000);
}
putc ('\n');
do_reset(NULL, 0, 0, NULL);
}
puts("FPGA: ");
/* display infos on fpgaimage */
index = 15;
for (i=0; i<4; i++) {
len = dst[index];
printf("%s ", &(dst[index+1]));
index += len+3;
}
putc ('\n');
free(dst);
/*
* Reset FPGA via FPGA_INIT pin
*/
out32(GPIO0_TCR, in32(GPIO0_TCR) | FPGA_INIT); /* setup FPGA_INIT as output */
out32(GPIO0_OR, in32(GPIO0_OR) & ~FPGA_INIT); /* reset low */
udelay(1000); /* wait 1ms */
out32(GPIO0_OR, in32(GPIO0_OR) | FPGA_INIT); /* reset high */
udelay(1000); /* wait 1ms */
/*
* Write Board revision into FPGA
*/
*fpga_ctrl |= gd->board_type & 0x0003;
if (gd->board_type >= 2) {
*fpga_ctrl |= CFG_FPGA_CTRL_CF_BUS_EN;
}
/*
* Set NAND-FLASH GPIO signals to default
*/
out32(GPIO0_OR, in32(GPIO0_OR) & ~(CFG_NAND_CLE | CFG_NAND_ALE));
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_NAND_CE);
/*
* Reset touch-screen controller
*/
out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_TOUCH_RST);
udelay(1000);
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_TOUCH_RST);
/*
* Enable power on PS/2 interface (with reset)
*/
*fpga_ctrl &= ~(CFG_FPGA_CTRL_PS2_PWR);
for (i=0;i<500;i++)
udelay(1000);
*fpga_ctrl |= (CFG_FPGA_CTRL_PS2_PWR);
/*
* Get contrast value from environment variable
*/
str = getenv("contrast0");
if (str) {
contrast0 = simple_strtol(str, NULL, 16);
if (contrast0 > 255) {
printf("ERROR: contrast0 value too high (0x%lx)!\n", contrast0);
contrast0 = 0;
}
}
/*
* Init lcd interface and display logo
*/
str = getenv("bd_type");
if (strcmp(str, "ppc230") == 0) {
/*
* Switch backlight on
*/
*fpga_ctrl |= CFG_FPGA_CTRL_VGA0_BL;
*lcd_backlight = 0x0000;
lcd_setup(1, 0);
lcd_init((uchar *)CFG_LCD_BIG_REG, (uchar *)CFG_LCD_BIG_MEM,
regs_13806_1024_768_8bpp,
sizeof(regs_13806_1024_768_8bpp)/sizeof(regs_13806_1024_768_8bpp[0]),
logo_bmp_1024, sizeof(logo_bmp_1024));
} else if (strcmp(str, "ppc220") == 0) {
/*
* Switch backlight on
*/
*fpga_ctrl &= ~CFG_FPGA_CTRL_VGA0_BL;
*lcd_backlight = 0x0000;
lcd_setup(1, 0);
lcd_init((uchar *)CFG_LCD_BIG_REG, (uchar *)CFG_LCD_BIG_MEM,
regs_13806_640_480_16bpp,
sizeof(regs_13806_640_480_16bpp)/sizeof(regs_13806_640_480_16bpp[0]),
logo_bmp_640, sizeof(logo_bmp_640));
} else if (strcmp(str, "ppc215") == 0) {
/*
* Set default display contrast voltage
*/
if (contrast0 == 0xffffffff) {
*lcd_contrast = 0x0082;
} else {
*lcd_contrast = contrast0;
}
*lcd_backlight = 0xffff;
/*
* Switch backlight on
*/
*fpga_ctrl |= CFG_FPGA_CTRL_VGA0_BL | CFG_FPGA_CTRL_VGA0_BL_MODE;
/*
* Set lcd clock (small epson)
*/
*fpga_ctrl |= LCD_CLK_06250;
udelay(100); /* wait for 100 us */
lcd_setup(0, 1);
lcd_init((uchar *)CFG_LCD_SMALL_REG, (uchar *)CFG_LCD_SMALL_MEM,
regs_13705_320_240_8bpp,
sizeof(regs_13705_320_240_8bpp)/sizeof(regs_13705_320_240_8bpp[0]),
logo_bmp_320_8bpp, sizeof(logo_bmp_320_8bpp));
} else if (strcmp(str, "ppc210") == 0) {
/*
* Set default display contrast voltage
*/
if (contrast0 == 0xffffffff) {
*lcd_contrast = 0x0060;
} else {
*lcd_contrast = contrast0;
}
*lcd_backlight = 0xffff;
/*
* Switch backlight on
*/
*fpga_ctrl |= CFG_FPGA_CTRL_VGA0_BL | CFG_FPGA_CTRL_VGA0_BL_MODE;
/*
* Set lcd clock (small epson)
*/
*fpga_ctrl |= LCD_CLK_08330;
lcd_setup(0, 1);
lcd_init((uchar *)CFG_LCD_SMALL_REG, (uchar *)CFG_LCD_SMALL_MEM,
regs_13704_320_240_4bpp,
sizeof(regs_13704_320_240_4bpp)/sizeof(regs_13704_320_240_4bpp[0]),
logo_bmp_320, sizeof(logo_bmp_320));
} else {
printf("Unsupported bd_type defined (%s) -> No display configured!\n", str);
return 0;
}
return (0);
}
/*
* Check Board Identity:
*/
int checkboard (void)
{
DECLARE_GLOBAL_DATA_PTR;
unsigned char str[64];
int i = getenv_r ("serial#", str, sizeof(str));
puts ("Board: ");
if (i == -1) {
puts ("### No HW ID - assuming HH405");
} else {
puts(str);
}
if (getenv_r("bd_type", str, sizeof(str)) != -1) {
printf(" (%s", str);
} else {
puts(" (Missing bd_type!");
}
gd->board_type = board_revision();
printf(", Rev 1.%ld)\n", gd->board_type);
/*
* Disable sleep mode in LXT971
*/
lxt971_no_sleep();
return 0;
}
/* ------------------------------------------------------------------------- */
long int initdram (int board_type)
{
unsigned long val;
mtdcr(memcfga, mem_mb0cf);
val = mfdcr(memcfgd);
#if 0
printf("\nmb0cf=%x\n", val); /* test-only */
printf("strap=%x\n", mfdcr(strap)); /* test-only */
#endif
return (4*1024*1024 << ((val & 0x000e0000) >> 17));
}
/* ------------------------------------------------------------------------- */
int testdram (void)
{
/* TODO: XXX XXX XXX */
printf ("test: 16 MB - ok\n");
return (0);
}
/* ------------------------------------------------------------------------- */
#ifdef CONFIG_IDE_RESET
void ide_set_reset(int on)
{
volatile unsigned short *fpga_mode =
(unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL);
/*
* Assert or deassert CompactFlash Reset Pin
*/
if (on) { /* assert RESET */
*fpga_mode &= ~(CFG_FPGA_CTRL_CF_RESET);
} else { /* release RESET */
*fpga_mode |= CFG_FPGA_CTRL_CF_RESET;
}
}
#endif /* CONFIG_IDE_RESET */
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
#include <linux/mtd/nand.h>
extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
void nand_init(void)
{
nand_probe(CFG_NAND_BASE);
if (nand_dev_desc[0].ChipID != NAND_ChipID_UNKNOWN) {
print_size(nand_dev_desc[0].totlen, "\n");
}
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,292 @@
0x1f,0x8b,0x08,0x08,0xaf,0xaf,0x9c,0x41,0x00,0x03,0x65,0x73,0x64,0x5f,0x77,0x65,
0x6c,0x6c,0x65,0x5f,0x6d,0x6f,0x6e,0x69,0x74,0x6f,0x72,0x2d,0x62,0x6c,0x61,0x75,
0x5f,0x33,0x32,0x30,0x5f,0x32,0x34,0x30,0x5f,0x34,0x62,0x70,0x70,0x2e,0x62,0x6d,
0x70,0x00,0xe5,0x9d,0x0f,0x6c,0xa3,0x65,0x1d,0xc7,0x5f,0xfe,0x48,0xf0,0x0f,0xcb,
0x4d,0x41,0x18,0x35,0x0e,0x0b,0x92,0xaa,0x0c,0xc1,0xe6,0x82,0xd4,0x9a,0xe2,0x59,
0x64,0x58,0x10,0x2e,0xa6,0x21,0x25,0xc3,0x21,0x92,0x9d,0x09,0x6e,0xca,0x8d,0xa3,
0xb1,0x0e,0x5f,0x9c,0x23,0xd6,0x68,0x90,0x02,0x13,0xcb,0x81,0xa7,0x16,0x18,0xa9,
0x78,0xb2,0xd0,0x44,0x49,0x0d,0x07,0x8e,0x72,0x9c,0x36,0x39,0x9c,0x30,0x13,0xb1,
0xb0,0xa0,0x4e,0x24,0x3a,0xbd,0xeb,0xcd,0xf7,0xd6,0xdb,0xf1,0xfa,0xfb,0xf3,0xbc,
0x6f,0xdf,0x6e,0xf7,0xde,0xed,0x69,0xdf,0xb7,0x6f,0x8d,0xdf,0x5b,0xef,0x2e,0x77,
0x79,0xde,0x7d,0xf6,0xfd,0xfd,0x79,0x9e,0xf7,0xe9,0xfb,0xbe,0xdd,0x74,0xe5,0xad,
0xdf,0x57,0x48,0xb7,0xc2,0x2b,0x00,0xaf,0x4b,0x8e,0x53,0x94,0x7f,0xc3,0x9f,0xc7,
0x29,0x27,0xf2,0x7f,0xc0,0xff,0x9f,0x7d,0x3e,0xbf,0x36,0xf0,0xbf,0x28,0x89,0x44,
0x42,0x79,0xe2,0x89,0x27,0x94,0x74,0x3a,0xad,0xbc,0xf2,0xca,0x2b,0xca,0x83,0x0f,
0x3e,0xa8,0xec,0xd9,0xb3,0x47,0xd9,0xba,0x75,0xab,0xb2,0x7f,0xff,0x7e,0xe5,0xee,
0xbb,0xef,0x56,0x9e,0x7a,0xea,0x29,0xe5,0x8d,0x37,0xde,0x50,0x1e,0x7d,0xf4,0x51,
0xe5,0xc5,0x17,0x5f,0x54,0x6e,0xbb,0xed,0x36,0x65,0xcb,0x96,0x2d,0xca,0xe1,0xc3,
0x87,0x15,0xdd,0x39,0x25,0x83,0xa5,0x4c,0x77,0x61,0x93,0x7f,0x68,0x68,0x68,0xe4,
0x9f,0xdf,0x18,0x08,0xfe,0xdc,0xc1,0x63,0xb7,0xa8,0xd1,0x92,0x2f,0xda,0x77,0x2e,
0x82,0x2d,0xa2,0x5e,0x3b,0xad,0x83,0xd8,0x52,0x1b,0xb7,0x6f,0xea,0xab,0xcc,0xcd,
0x01,0xdd,0x02,0x68,0x71,0x71,0xe1,0x0e,0xa6,0xd3,0x34,0x4d,0x57,0xbd,0x65,0xd3,
0x53,0xa5,0x53,0xc7,0xfb,0x2a,0x95,0xca,0x30,0x08,0xed,0x1b,0x19,0x59,0x7c,0xed,
0x7e,0x82,0xd3,0x55,0x55,0x57,0x01,0x31,0xe9,0x1d,0x9c,0xb6,0xf1,0x5e,0xbf,0xbf,
0xaf,0x6f,0x16,0xf8,0xc0,0x3f,0x30,0x70,0x64,0x68,0x61,0xf1,0x8b,0x7b,0x99,0x0e,
0x01,0x35,0x35,0xe9,0x1d,0x60,0x6d,0x73,0xff,0x38,0xe0,0xf9,0x67,0x89,0x8f,0xec,
0x03,0xc2,0x1b,0x23,0x26,0x9e,0xa6,0xa9,0xaa,0x9a,0x4c,0x7a,0x03,0x58,0xdd,0xbc,
0x29,0xed,0xf7,0x23,0x20,0x19,0x38,0xcc,0xfe,0x8d,0xdc,0x00,0xee,0x51,0x60,0xe1,
0x77,0x84,0x4b,0xe2,0x2b,0xa9,0xb6,0x9b,0x0e,0xbc,0x4b,0xa7,0xc7,0xc7,0x01,0xcf,
0x6f,0xf8,0x47,0x80,0xc3,0xf7,0x21,0x9a,0x26,0x94,0x14,0xfe,0x25,0xdb,0xed,0xe0,
0xc5,0xd1,0x34,0x2a,0x10,0xa0,0xf8,0x56,0xfa,0x8c,0xfc,0x1b,0xba,0x8c,0x0b,0x03,
0xe1,0x04,0x19,0x6b,0xaa,0x9d,0x74,0xa3,0xf7,0x4e,0x4c,0x4c,0xa4,0xd1,0xbf,0x00,
0x04,0x78,0xb6,0xcf,0x5f,0xe1,0x04,0x1c,0x1e,0x7a,0xc9,0x80,0x13,0x78,0xaa,0x81,
0x97,0x6c,0x5f,0x3f,0xd4,0x2e,0x8c,0x46,0xa3,0x13,0xe4,0x1f,0x02,0xfa,0xd1,0x3f,
0x68,0x7f,0x15,0xa8,0x8f,0x9b,0x54,0xdd,0x84,0x33,0xd9,0x92,0xc9,0x14,0x4a,0x6d,
0x13,0xde,0x98,0x0f,0xf1,0x26,0x26,0xfa,0x31,0xbc,0x88,0x87,0x05,0x82,0xf1,0x85,
0x5f,0xd7,0xe8,0x9a,0x51,0x17,0x6a,0x1d,0x2f,0x39,0x45,0x80,0xed,0xc1,0xdb,0x58,
0x04,0xbc,0x68,0x7f,0x7f,0x3f,0xfb,0x87,0x05,0x32,0xdb,0x27,0x1a,0xcc,0xd9,0xc8,
0x46,0x49,0x67,0xa5,0x23,0xb8,0x54,0x3e,0xdf,0x8e,0x1a,0xd1,0x9e,0x29,0x80,0xc0,
0xbf,0x68,0x1a,0xeb,0x37,0x8d,0xf9,0x87,0x80,0x88,0x57,0xb9,0x51,0x25,0x25,0x39,
0xbc,0x26,0xde,0x14,0x2a,0x0f,0x84,0xaa,0xfb,0x78,0x9b,0x8b,0x31,0xc4,0x43,0xff,
0xfa,0x4d,0xff,0xc4,0x04,0x32,0x7c,0x3a,0xa0,0x59,0xc9,0xc8,0xbb,0x3c,0x79,0x97,
0x9f,0xc2,0x97,0xdb,0x78,0xd5,0xed,0xc5,0x58,0x31,0x16,0x65,0x40,0xaa,0x90,0x80,
0x9f,0x0a,0x84,0x12,0xf0,0x25,0x61,0x9c,0xa6,0x59,0x43,0x9b,0x04,0xef,0xd0,0x3f,
0x94,0xea,0x32,0x5e,0xa6,0x58,0x2c,0xc6,0x62,0x31,0xae,0x0f,0xb6,0xcf,0xe2,0xdf,
0x6e,0x04,0x6b,0x28,0x8b,0x3c,0x27,0x1e,0xc3,0xb9,0x6e,0x60,0x75,0xbb,0x0f,0xf8,
0x8a,0x85,0x02,0x01,0x72,0x80,0x8d,0x0a,0x06,0xc0,0xf3,0x68,0xba,0xb0,0xc4,0x36,
0x4f,0xde,0xe5,0x53,0x26,0x5e,0x28,0xa4,0xba,0x89,0x97,0xf1,0xf9,0x00,0xb0,0x50,
0x8c,0x59,0x0a,0x98,0xf0,0xfa,0xb0,0xc1,0xcc,0xee,0xb6,0x4e,0x17,0x98,0x78,0xc9,
0xa9,0x7c,0xdd,0xbb,0x50,0x2e,0x97,0xcb,0xe7,0x5c,0x34,0xb0,0xc6,0x78,0xe8,0x1f,
0x54,0x48,0x3f,0x34,0x68,0x6c,0x80,0xdc,0xa0,0xa1,0x43,0x57,0xfe,0xb4,0x2a,0xef,
0xc0,0x3c,0x33,0xef,0x10,0x2f,0x1f,0x02,0xff,0x72,0xae,0xe1,0x69,0x9b,0xbb,0x7d,
0x04,0xc8,0xf9,0x67,0x14,0xb0,0xe9,0x5f,0xdf,0xee,0xb5,0x0d,0xcf,0x0c,0x6c,0x8e,
0x7e,0x81,0x85,0xa1,0x88,0x5b,0x7c,0xcf,0x74,0xfb,0xba,0xa7,0x7d,0x45,0x9f,0xf0,
0xcf,0x08,0xf0,0xb8,0xd1,0xa1,0x5f,0x5a,0x83,0x97,0x6a,0xc0,0x0b,0x61,0x80,0x41,
0x2e,0xe1,0x5d,0xdc,0x0d,0xf2,0x4d,0x63,0x7c,0x39,0xff,0xb8,0x80,0xd3,0xbc,0xc0,
0x02,0xfb,0xee,0x33,0x6a,0x96,0xa2,0x8a,0x65,0x51,0xaf,0x0a,0x84,0x83,0x57,0x28,
0x98,0x0b,0x86,0xdc,0x59,0x26,0x6c,0xcb,0x64,0x80,0x6f,0xda,0x08,0x70,0xcc,0x08,
0xf0,0xb8,0xf0,0xcf,0xff,0xb2,0x41,0xc7,0x0d,0xcf,0xa2,0x10,0x27,0x1f,0xe1,0xc1,
0xeb,0x22,0x37,0xf0,0xaa,0xd9,0x1e,0xc6,0x63,0xff,0x08,0x4f,0xac,0x60,0x28,0x01,
0x67,0x67,0x2f,0x33,0xe8,0x70,0x26,0x83,0xc4,0x13,0x88,0x58,0xb4,0x02,0x2d,0x08,
0xee,0xa1,0xdc,0xe0,0xdb,0x9c,0xc9,0x20,0xa0,0x20,0xe4,0x06,0xc8,0x05,0x32,0x9e,
0xa6,0x09,0x38,0x70,0x11,0xac,0xf0,0x78,0x96,0x4d,0x59,0x42,0x8b,0x45,0x9b,0x13,
0x0a,0x09,0xc2,0x88,0xf3,0x78,0x17,0x67,0x33,0x18,0x5f,0x88,0x2e,0x26,0x60,0xc1,
0x48,0x40,0xf2,0xcf,0x4f,0x0d,0xe6,0xec,0x64,0x2a,0x99,0x17,0x55,0x6b,0x49,0x3c,
0x08,0x6c,0x10,0x18,0x83,0xb9,0x1c,0xb1,0x91,0x81,0x21,0xc7,0xf1,0xaa,0xd9,0xac,
0xe9,0x9f,0xd9,0x00,0x31,0xc0,0x13,0xe6,0x0a,0xe1,0x9a,0xd4,0xda,0x9e,0x92,0x23,
0xff,0x30,0xb6,0x39,0x26,0x14,0x52,0x1d,0xc6,0xd3,0x12,0xd9,0x4c,0xd6,0x08,0x2f,
0x04,0x98,0xfd,0x13,0x78,0xd0,0xa0,0x21,0xc0,0xef,0x23,0x38,0x2c,0xda,0x54,0x3d,
0xef,0xc8,0x37,0x0c,0x6c,0x30,0x14,0xac,0x2b,0xec,0x78,0x80,0x1f,0xce,0xa2,0x7f,
0x5c,0xc0,0xd3,0x75,0xff,0xc4,0x0a,0x86,0x26,0xe0,0xcb,0x30,0xf5,0x2c,0x3d,0x25,
0xc7,0xf3,0x99,0x80,0x6b,0xc4,0x0b,0x3b,0x1c,0xe0,0x6a,0x22,0x8b,0xfe,0xf5,0x98,
0xfd,0xa5,0xd8,0x30,0x81,0x60,0x7c,0x03,0x21,0x6c,0xc7,0x79,0xeb,0x5c,0x66,0xe2,
0xe5,0x2c,0x78,0xe1,0x70,0x38,0x38,0x33,0x13,0x76,0x96,0xaf,0x94,0x05,0xc0,0x1e,
0x23,0x01,0xa7,0xcd,0x0e,0x33,0x21,0x2a,0x04,0x56,0xd0,0x77,0x08,0x3c,0x9c,0x3b,
0x18,0x0f,0x09,0x39,0xef,0x82,0xf5,0xc4,0x0b,0xce,0x10,0xe2,0x4c,0xc4,0x49,0xbc,
0x95,0xc9,0x2c,0x8a,0xfd,0x63,0x3c,0x31,0x03,0xd7,0x57,0x80,0x67,0x42,0x64,0xcd,
0x1d,0x02,0x4d,0x4b,0xe5,0xb0,0x6c,0x73,0xb9,0xc6,0xd0,0xce,0x80,0x73,0x61,0xf8,
0x6d,0xa6,0xec,0x64,0x8b,0xd6,0xe2,0x93,0x93,0x93,0x75,0xff,0x7c,0x6b,0x1a,0x20,
0x18,0x78,0x4e,0x7e,0xaa,0x71,0xff,0x02,0x08,0xc1,0xbe,0x50,0x43,0xde,0x85,0x89,
0x70,0xa6,0x3c,0x53,0x0e,0xcf,0x38,0xc8,0x37,0x96,0x48,0x24,0x4c,0xff,0x7c,0x46,
0xfe,0x59,0x0a,0x78,0x3c,0x10,0x38,0x6f,0xed,0x9c,0xaa,0x8d,0x5a,0x3b,0x0a,0x90,
0x05,0xc1,0x3c,0x8c,0x2d,0xe0,0x95,0xcb,0xce,0xcd,0xc1,0x5a,0x3c,0x1e,0xa7,0x00,
0xf7,0x70,0x01,0x8b,0x15,0xaa,0x68,0x80,0x69,0x2e,0x90,0x1d,0x47,0x1a,0x99,0x6a,
0xf0,0x0e,0x0b,0x03,0x8c,0x43,0x38,0xd0,0x5e,0xc7,0xf8,0xc6,0xe2,0xe0,0xdf,0x64,
0xd6,0x68,0xd0,0xd3,0x46,0x83,0xb1,0xcc,0x20,0x81,0x73,0xd4,0x23,0xff,0x68,0xf5,
0xbc,0xc3,0x57,0x39,0x4c,0x78,0xf0,0x5b,0xb9,0xfc,0x1b,0xa7,0xf0,0xd0,0x3e,0x0e,
0x70,0x4f,0x0f,0xda,0xc7,0x05,0x5c,0xe0,0x73,0xcc,0x09,0x6a,0x80,0x81,0xf4,0x37,
0xed,0x06,0xe7,0x44,0xde,0x85,0x59,0x86,0x7b,0x20,0xa7,0xf8,0x56,0xe2,0x54,0x1e,
0x93,0xd9,0x1e,0x00,0xec,0xb1,0xf8,0x17,0xb5,0xf8,0xd7,0x6b,0xfb,0xd3,0xe5,0x30,
0xf1,0xca,0x02,0x6e,0xa6,0x5c,0x57,0xc4,0x21,0xbe,0x52,0x9c,0x0c,0xe4,0x09,0xa4,
0xbb,0x5e,0xc0,0xb1,0xa2,0xe5,0x14,0x4e,0xb5,0x1d,0xae,0x71,0xe2,0x51,0xe6,0x59,
0xf1,0x06,0x76,0x3b,0x83,0xb7,0x12,0x07,0xc0,0xac,0x51,0xc0,0x3d,0x66,0x01,0x17,
0x0b,0xd1,0x82,0x89,0x77,0xc7,0x51,0x0e,0x50,0x03,0xe7,0xca,0xa2,0x68,0xad,0xfa,
0xac,0x33,0x7c,0x1b,0xc9,0xbf,0xc9,0x2c,0xcd,0x70,0xdd,0x19,0xd3,0xbf,0x58,0x4c,
0x2c,0xb1,0xb0,0x80,0xaf,0x3a,0xda,0x11,0x52,0x33,0xab,0xe1,0x4a,0xa8,0xb2,0xea,
0x04,0x5e,0xad,0x34,0x80,0x78,0x96,0x06,0x68,0xce,0x20,0x96,0x09,0xf8,0xe8,0xcd,
0x22,0x47,0x45,0x6b,0x09,0x6d,0x79,0x00,0x14,0x8f,0x38,0xc1,0xb7,0x0d,0x7e,0xd2,
0x78,0x5c,0x4c,0x20,0x02,0x90,0x97,0xa8,0xc5,0x98,0xb9,0x46,0xfd,0xf6,0x31,0x0e,
0xd2,0x18,0x59,0x84,0x43,0x03,0x9d,0x48,0x40,0xad,0x0c,0xf6,0x95,0xe2,0x93,0xa2,
0x41,0x37,0xcc,0xc0,0x05,0xe3,0x14,0x6e,0xe2,0x58,0xdf,0xa9,0xd6,0x40,0x87,0x6c,
0x03,0xf1,0xd2,0x80,0x13,0x09,0xb8,0x52,0x36,0xfc,0xcb,0x52,0x07,0xe4,0x04,0x34,
0x00,0x79,0x05,0x18,0xbd,0xef,0x98,0x87,0x19,0xad,0x67,0x1e,0xc7,0x96,0x00,0xd5,
0xd6,0xf9,0xc2,0x8c,0xc7,0x0d,0xda,0x5c,0xa0,0x4e,0x8b,0x05,0x6a,0x8c,0xfc,0x3b,
0xf3,0xd8,0x87,0xd1,0xc2,0x66,0x64,0x89,0x8e,0x1c,0x74,0x20,0x01,0x6b,0x5c,0x6b,
0x66,0x81,0x88,0x0e,0x68,0xac,0x60,0x28,0xc2,0x4f,0xac,0xf3,0x40,0x80,0x47,0xee,
0x81,0x71,0x58,0x72,0x90,0x36,0x83,0x2d,0xf3,0x8d,0xe1,0x31,0x85,0x7f,0x09,0xce,
0xbf,0x8c,0xd1,0x00,0xc5,0x29,0xc8,0x15,0xea,0xba,0x8e,0xf4,0x98,0x61,0x1d,0xfe,
0x16,0xa7,0xdf,0xe2,0xad,0x27,0x60,0x98,0x7e,0xe8,0x52,0x3c,0x11,0x5f,0xeb,0x5f,
0x81,0x4e,0x41,0x2e,0x5d,0x1f,0x1e,0x18,0x48,0x4d,0x8f,0xc0,0x4a,0xec,0x5f,0x7c,
0xa0,0x55,0xbc,0x1a,0xf7,0x52,0xf4,0x2f,0xce,0x0b,0x98,0x8c,0x65,0x02,0xc1,0x15,
0xe0,0x27,0xd6,0xbd,0x8c,0x1b,0x13,0x55,0x11,0x17,0x70,0xa8,0x48,0x8b,0x7c,0x63,
0x94,0x34,0x14,0x0b,0x5e,0x61,0xf5,0x64,0x32,0xd6,0x0e,0x1d,0x8b,0xad,0xbf,0x87,
0x69,0xd4,0x54,0x18,0xaf,0x24,0xf8,0x5a,0x5d,0x03,0x06,0x4d,0xff,0xa8,0x3f,0x9b,
0x15,0x6c,0x94,0x47,0xe1,0x7e,0x89,0x83,0x8d,0x71,0x6c,0xe3,0x03,0x26,0xde,0xe4,
0x35,0xad,0xe1,0xd5,0x20,0xfd,0xa8,0x5f,0x19,0xfe,0x65,0xb2,0x8c,0x67,0x9c,0xc2,
0xfd,0x4a,0xe6,0x68,0x5a,0xc9,0xe2,0x1c,0xe1,0x25,0x5a,0x4c,0xc0,0x2a,0x4d,0x9a,
0x03,0xe2,0x60,0x89,0xec,0xaa,0x0e,0x18,0xbb,0x5c,0x95,0x3a,0xdc,0x8a,0x91,0x79,
0x09,0xca,0xe7,0x49,0x78,0xc9,0x1d,0x60,0xb5,0x82,0xb8,0x5e,0x2b,0x89,0x16,0x23,
0x26,0x10,0x3e,0x45,0xef,0x46,0xbe,0xe9,0x88,0xdc,0xe1,0xb4,0x92,0x59,0x1a,0x80,
0x46,0x5f,0x92,0x47,0x58,0x75,0xbc,0x60,0xdd,0x3f,0xee,0x7f,0x86,0x7f,0xdd,0x45,
0x5c,0x21,0x1c,0x7b,0x5a,0x5b,0xa5,0x31,0x13,0x8e,0xf0,0x20,0xa5,0x07,0x5b,0xe1,
0xab,0x92,0x7f,0x03,0xe8,0xa0,0x59,0x21,0x3d,0x74,0x8a,0x44,0xfe,0xbd,0x47,0xfa,
0x80,0x9a,0x19,0x5d,0xa2,0x03,0x5d,0xdb,0x0a,0xdf,0x68,0x98,0x4e,0xb4,0x38,0xa7,
0x13,0x71,0xda,0x42,0xc8,0xd0,0x0a,0x1a,0xeb,0xe3,0x49,0x55,0xfe,0x88,0xdb,0xe2,
0x64,0x5c,0x16,0x93,0x85,0x0a,0xee,0x81,0x56,0xf8,0xf0,0x9c,0x4b,0x2c,0x26,0xcd,
0x0e,0xdd,0x63,0x4c,0x20,0xd3,0xcd,0xf4,0xae,0x1a,0x45,0x36,0x41,0xd9,0x92,0xc0,
0x53,0xae,0x44,0x0b,0x78,0x1a,0x9e,0xd4,0xf0,0x9a,0xa8,0xbe,0xc0,0xca,0x64,0xc4,
0x29,0x9c,0x4c,0xe7,0xab,0x6b,0x63,0x02,0x43,0x9b,0xa5,0x64,0xa6,0x09,0x33,0xd2,
0x3c,0x5f,0x35,0xc8,0x80,0x03,0x86,0x7f,0x59,0x73,0x8f,0xad,0xbb,0xfb,0x34,0xb5,
0xb9,0x63,0x42,0x78,0x39,0xb4,0x44,0xd8,0x52,0x81,0x8c,0xe2,0x76,0x09,0x01,0x72,
0x06,0x4e,0x4e,0x9a,0x0b,0x04,0x5f,0x77,0xa4,0xc9,0x83,0x96,0x26,0xa9,0xce,0xd0,
0x3b,0x6a,0x08,0xd2,0x3d,0xa0,0xae,0x1c,0xfb,0x47,0x4b,0xb6,0x7a,0x80,0xd9,0xc0,
0xe6,0xa2,0x0b,0x5a,0xa2,0xb2,0x48,0x08,0xba,0x56,0x0a,0x44,0xa3,0x2d,0x09,0xe3,
0x6c,0xd0,0xac,0x0f,0xc2,0x6b,0x32,0xba,0x78,0x54,0x2a,0x0b,0x83,0x0e,0xd4,0x34,
0x5f,0x8d,0xf7,0x75,0x78,0x05,0x63,0x6e,0x21,0x70,0x87,0x6e,0x61,0xdd,0xf1,0x70,
0x56,0x84,0x57,0x28,0xd2,0xec,0x81,0xaa,0xc1,0x60,0xdd,0xbf,0x01,0x6e,0x09,0x09,
0x3e,0x43,0x6a,0x21,0x69,0xf4,0x95,0x6c,0x76,0xd2,0x60,0x83,0x1f,0x35,0xdb,0xf4,
0x8f,0x3a,0x6a,0xf8,0x57,0x2a,0x8b,0x79,0x93,0x57,0x58,0xd9,0xee,0xd6,0x66,0xf5,
0x52,0xdd,0xbb,0x1e,0x20,0x6c,0xfa,0x67,0xa5,0xf2,0x98,0x31,0xfd,0x13,0x33,0x30,
0x36,0x98,0xd6,0x56,0x95,0xdb,0xea,0xe6,0xa1,0xee,0x69,0xf6,0x38,0x41,0xde,0xb9,
0x0b,0x9b,0x05,0x6c,0x6c,0xf2,0xbe,0xab,0x25,0x3c,0xbd,0x26,0xf0,0x60,0x2a,0xc2,
0x6a,0x3b,0xad,0xd9,0xc3,0x84,0x82,0x56,0x03,0x69,0x05,0x48,0x0d,0x30,0xdb,0xea,
0xc6,0xf1,0x1e,0x6e,0x03,0x8c,0xd7,0xd3,0xa3,0x36,0xc9,0x97,0xe3,0x5d,0x63,0x3e,
0xad,0x8e,0xd7,0x57,0x80,0x4d,0xb7,0x3e,0x43,0xcb,0x10,0x5a,0x42,0xeb,0xa6,0x5e,
0x10,0x69,0xee,0x28,0xa3,0xa1,0xa0,0xd8,0x57,0xe4,0x33,0x4c,0x63,0x05,0xdd,0xe2,
0x92,0x57,0xc7,0x00,0xf7,0x18,0x80,0xf8,0x6b,0x47,0x73,0x47,0xc9,0xe7,0x42,0x46,
0xff,0x33,0x4e,0xe1,0x68,0x66,0x72,0x60,0xdb,0xfd,0x99,0x2c,0x79,0x27,0x5e,0xa7,
0x37,0x77,0x10,0xc2,0x13,0x1d,0x50,0xec,0xc1,0x20,0xde,0x03,0x6a,0xeb,0x7c,0x4b,
0x22,0xb8,0xbc,0xd2,0x90,0x5f,0xe6,0x92,0x42,0x39,0x6a,0x30,0x61,0xd1,0x00,0x79,
0x93,0x32,0x9b,0x70,0xe2,0x5d,0x8b,0x1a,0xda,0xc6,0xc1,0xc5,0xc5,0x46,0x53,0xc7,
0xd0,0x42,0x66,0x7f,0x31,0xfd,0x83,0x06,0xd3,0x74,0xb7,0x6a,0xd0,0x85,0x99,0x8c,
0xe1,0x1e,0xa8,0xa9,0x7e,0x50,0xc3,0x77,0xf7,0x82,0xf4,0x86,0x0f,0xfa,0xc7,0x7b,
0x30,0x93,0xd9,0x88,0x23,0x7c,0xcb,0x26,0x1b,0xaa,0xa9,0x90,0x54,0xf3,0xc1,0x7a,
0x83,0x31,0xfd,0x73,0x68,0xcb,0x5d,0xcb,0x88,0x7d,0x4e,0x52,0x6f,0x33,0x87,0x48,
0xe1,0x7b,0xcb,0x41,0x63,0x89,0x65,0xac,0xb0,0x22,0xce,0xf0,0xe9,0xcf,0x58,0xec,
0x9b,0x5e,0xc7,0xf6,0xe6,0x5a,0xe5,0x73,0xfc,0xd6,0xa3,0x68,0x30,0xbc,0x40,0x70,
0x26,0xfb,0x40,0x5f,0x35,0xd8,0x40,0xdd,0x52,0x9b,0x24,0x26,0x1f,0x5e,0x8f,0x84,
0x6f,0x76,0x63,0x01,0x8b,0x53,0xb8,0xc9,0x88,0x53,0x7c,0x35,0x81,0x47,0x67,0x82,
0x4d,0x15,0x70,0x5e,0xe4,0x5f,0xd9,0x92,0x80,0x0e,0x65,0x1f,0x6a,0x33,0xd3,0xc1,
0x69,0x34,0xbc,0x9a,0x28,0x60,0x8d,0xae,0x5a,0x41,0xff,0x8c,0x00,0x0f,0xb4,0xbe,
0x5b,0x67,0xd1,0xcd,0x88,0x07,0xc1,0xc5,0xad,0x4e,0x5f,0x13,0xc7,0xd5,0xf2,0x21,
0x91,0x7f,0xe1,0xf2,0x8c,0x58,0xa1,0xb6,0xbc,0x1b,0x6b,0x51,0xd5,0x47,0x80,0x84,
0xe7,0xdb,0x21,0x3f,0xbe,0xc6,0x97,0xd7,0xd0,0x12,0x41,0xec,0xbc,0x0f,0x38,0x68,
0x9f,0xae,0x67,0x88,0x6c,0x9a,0x36,0xea,0x7e,0xd1,0x0c,0x5f,0x8e,0x27,0x60,0x6a,
0xd0,0x80,0x17,0x2f,0x39,0x69,0x9f,0xae,0xff,0x18,0x63,0x4b,0xdb,0x9c,0x3e,0x5f,
0x13,0x05,0x9c,0x32,0xfc,0x9b,0x09,0x8a,0xf7,0x6c,0x9d,0xcc,0x3e,0xd0,0x12,0xf5,
0x96,0x22,0x5e,0x8b,0x39,0xfd,0xa4,0xfc,0xf0,0x64,0x9e,0x2f,0xfc,0x11,0xfe,0x41,
0xf9,0x3a,0xf3,0x6e,0xa8,0x29,0x8d,0xe8,0x18,0xb0,0x28,0x3f,0x3c,0x45,0x57,0xc6,
0xd1,0xa5,0x52,0x62,0x89,0xef,0xd0,0xbb,0xdd,0xa6,0x7e,0x4b,0x64,0xac,0x48,0x53,
0x7c,0x3c,0x83,0x18,0xfd,0x4f,0x75,0x98,0xef,0x66,0x48,0x3d,0xfe,0x2a,0x16,0x77,
0x48,0x8f,0x9e,0xa2,0x0b,0x0b,0xb9,0xc1,0x50,0x01,0x3b,0x76,0x35,0x88,0xa1,0x95,
0x62,0xdd,0x3f,0xf9,0x25,0x34,0x5e,0x24,0x97,0x13,0x0d,0x06,0x57,0x58,0xa5,0x88,
0xd3,0x7c,0xfa,0x76,0x83,0xae,0x58,0x58,0xd7,0x3b,0x8c,0x56,0x69,0x49,0xba,0xec,
0x91,0x2f,0x37,0xc3,0xfc,0x73,0xf2,0x6a,0x29,0xa1,0x8f,0x99,0x7c,0x45,0xe9,0x02,
0xd6,0xf0,0x32,0x48,0xc3,0x3f,0x4c,0x40,0x67,0x9b,0x0b,0x69,0x59,0x98,0x07,0x92,
0x2e,0x60,0x6d,0x8a,0x2f,0xe6,0x0f,0x1a,0x4b,0x2c,0xd5,0x79,0xbe,0x1a,0x5f,0x44,
0x58,0xc0,0x77,0xf1,0x22,0xb2,0x7c,0x74,0x09,0x29,0x9d,0x82,0xd0,0x16,0x82,0xe3,
0xd5,0x81,0xda,0x4e,0x17,0x99,0x11,0xe1,0x60,0x33,0x7c,0xa2,0x80,0x71,0x09,0x1d,
0x71,0x01,0x4f,0xff,0x69,0x81,0xbc,0xc3,0x0b,0xf5,0x7a,0x25,0x87,0x6a,0x74,0x75,
0x3a,0x4d,0x20,0x78,0x8a,0xe4,0x42,0x75,0xe8,0x98,0x80,0x31,0x8a,0x6e,0xb4,0x50,
0xf8,0xb4,0x2c,0x1f,0xfa,0x27,0x0a,0x18,0xec,0x73,0xe5,0x72,0x79,0xbd,0x26,0xe0,
0x62,0xd1,0xd8,0x15,0xf2,0x7c,0x29,0xa3,0x40,0xe0,0x14,0xdd,0xa5,0xbb,0x12,0xb7,
0x53,0x6c,0x11,0xf0,0x72,0xc9,0x91,0x35,0xbc,0x2b,0x27,0xc7,0x05,0x02,0x2b,0x40,
0x57,0xe8,0x74,0xfd,0x21,0x20,0x43,0xf7,0xa2,0xd1,0x98,0x2a,0x37,0x32,0x99,0x12,
0x0d,0x90,0xfa,0x4b,0xc4,0x0d,0x38,0xd0,0x32,0xde,0xa4,0xc6,0x57,0x11,0x4a,0x7e,
0x0b,0xbc,0x59,0xd2,0xf0,0x6f,0x26,0xac,0xba,0x01,0x07,0xaa,0x16,0xe8,0x2e,0x3a,
0x24,0xdc,0x21,0x37,0x52,0x4b,0x72,0xfd,0xd2,0x0a,0xd0,0x95,0xe6,0x47,0x3a,0x95,
0xcd,0x03,0x1d,0xf5,0xfa,0xbc,0xb5,0x4a,0x8a,0xdb,0x5f,0xa8,0x80,0x23,0xae,0xb0,
0xa1,0x1e,0x8a,0x46,0x45,0x7c,0x3f,0x29,0x37,0x90,0xee,0x5c,0x13,0x13,0xb0,0xe3,
0xb7,0x42,0xd4,0x75,0xc8,0xf4,0xef,0x52,0xb9,0x81,0x74,0xfb,0x95,0x68,0xd0,0xce,
0xdf,0x4a,0x62,0x6a,0x45,0xd0,0xf5,0xf7,0xc7,0xe4,0x06,0x6a,0x14,0x5f,0x6e,0xd0,
0x11,0x57,0xd0,0x58,0xe2,0x0e,0x17,0x90,0x2a,0x35,0x8e,0x6e,0xeb,0x14,0x01,0x96,
0x1b,0x29,0xa7,0x67,0x01,0x0f,0x01,0xfb,0xa3,0x72,0x0b,0x38,0xc1,0x87,0x13,0x88,
0x8b,0xe1,0xd5,0xf5,0xaf,0x91,0x7b,0x78,0x0d,0x6b,0xaf,0xd4,0x38,0xbe,0xb5,0x93,
0x96,0x30,0x11,0x57,0xc0,0x84,0x96,0xc0,0x39,0xc2,0xeb,0xbf,0x4c,0x6a,0x9c,0x9a,
0x14,0x13,0x70,0xc8,0xd5,0xf0,0xea,0x5a,0x94,0xdd,0x9b,0x98,0xb0,0xbb,0x3e,0xfe,
0xc8,0x4a,0x8a,0x06,0x08,0x80,0x2e,0x91,0x09,0xfd,0x00,0x2f,0xdf,0xc7,0x2b,0xf8,
0x8f,0x76,0x81,0xf7,0x5a,0x69,0xa2,0x01,0xe6,0x43,0xee,0x2c,0xad,0x4c,0xdd,0x32,
0x41,0x78,0x13,0xe9,0xef,0x48,0x0d,0x4b,0x1a,0x05,0xe2,0xd2,0x9d,0x9c,0xa6,0xf6,
0x09,0xbc,0x74,0x5a,0xea,0x1b,0x69,0x9a,0xb1,0x82,0x71,0x0b,0x4c,0xa8,0x8a,0xb1,
0xa5,0x3b,0x20,0x06,0x65,0x86,0x69,0xec,0x5f,0x28,0xe4,0xfa,0xc3,0x00,0x0a,0x69,
0xba,0xff,0x26,0x9d,0xde,0x25,0x33,0xca,0x88,0x6f,0x3e,0xe2,0x0e,0x55,0x5d,0xcf,
0x0b,0xbc,0xf4,0xb7,0x64,0x46,0xe1,0x4d,0xe4,0xa9,0x24,0x18,0xa8,0xba,0x84,0x65,
0xea,0x50,0x5a,0xe8,0xbb,0x32,0xa3,0x54,0xc3,0x3f,0xd5,0x25,0x2c,0x53,0x4b,0x06,
0xdf,0xb1,0x6e,0x31,0x68,0x90,0xc6,0x37,0x90,0xbb,0xff,0x2c,0x0a,0xbd,0xc6,0x4f,
0x18,0x49,0x07,0xce,0x91,0x19,0xa5,0x89,0x06,0xd8,0x86,0xc7,0xc9,0x9c,0x91,0x0e,
0x8c,0xd3,0x1d,0xb0,0x32,0xdf,0x4b,0x15,0xfe,0xa9,0x6e,0x51,0xd5,0xf5,0x7c,0x00,
0xe1,0xd2,0x81,0xc0,0xa0,0xc4,0x20,0x7c,0xa8,0x11,0x26,0xa0,0x5b,0x50,0x16,0x1d,
0x40,0xbc,0xf1,0xf1,0x40,0x60,0x97,0xc4,0x20,0x8e,0xef,0x54,0x3b,0x1e,0x67,0xb4,
0x34,0x4e,0xcf,0x9f,0x08,0xf8,0x65,0x1a,0x8c,0xc6,0x05,0xd2,0x8e,0xa7,0x19,0x69,
0x78,0xf3,0x7a,0x00,0x5e,0x67,0xcb,0x8c,0x4a,0x92,0x81,0xaa,0x4b,0x4c,0x0d,0x3a,
0x23,0x40,0x78,0xfe,0x0f,0x48,0x8c,0x21,0xff,0xda,0x12,0x5e,0x5d,0xff,0xc8,0x38,
0x3d,0x7f,0xcc,0xff,0x21,0x99,0x41,0xf4,0x08,0x97,0xf6,0xf0,0x1d,0xf0,0xe3,0xdd,
0xf5,0x40,0xa8,0xae,0x7f,0x0c,0xe7,0x5f,0x7b,0x1e,0xa6,0xb5,0x2c,0xfc,0xf3,0xcb,
0x9c,0x22,0xa1,0x7f,0x53,0xaa,0x5b,0x48,0x0d,0xd2,0xc6,0x19,0xcf,0xdf,0x2b,0x33,
0x08,0x0d,0x54,0x5d,0x22,0x5a,0xa5,0x5f,0xfa,0x59,0x32,0x0d,0x86,0xf2,0xcf,0x35,
0xa2,0x46,0xfd,0x5a,0xf0,0x49,0x34,0x18,0x7e,0x76,0x9a,0x7b,0x48,0x0d,0x3a,0xe8,
0xe7,0xc7,0xf3,0xbd,0x5f,0x66,0x90,0xda,0xbe,0xa7,0x09,0x2e,0x13,0x9e,0xbf,0x4f,
0x66,0x05,0xa3,0xb6,0x2f,0xfd,0xf4,0x2a,0x3f,0xba,0xa8,0x4f,0xaa,0xc1,0x00,0xa1,
0x6b,0x40,0xab,0xb5,0x09,0x1f,0x5e,0x09,0x92,0x68,0x30,0x6a,0x3b,0x1f,0x67,0x79,
0x9d,0xbf,0x82,0x80,0x95,0x5e,0x99,0x41,0x6d,0x7c,0x58,0xe4,0xd6,0xd9,0x59,0x8c,
0xef,0xec,0x87,0xd7,0x3f,0x04,0x9f,0xf9,0xda,0x36,0x1d,0x02,0xb6,0xd9,0xca,0x6c,
0xe5,0xf7,0x12,0x63,0xd4,0x36,0x3e,0x0c,0xb4,0x4a,0x4f,0x46,0xab,0x54,0x24,0x56,
0x30,0xf4,0x58,0xda,0xb6,0xa9,0x8f,0x9e,0xfd,0xd9,0xf7,0xa2,0xc4,0x90,0x76,0xc6,
0x57,0x7f,0x67,0xa5,0x82,0x80,0xb3,0xea,0xba,0x47,0xb4,0xf7,0x89,0xc3,0x1f,0xa7,
0x27,0x07,0x56,0x2a,0x12,0x0d,0xa6,0xad,0xfe,0x1d,0x60,0x3c,0x99,0x06,0xa3,0xba,
0xc5,0x72,0x24,0x2d,0x0b,0x3e,0x89,0x06,0xd3,0x56,0xc0,0xaa,0xe0,0x93,0x68,0x30,
0xed,0x0c,0xaf,0xae,0x5f,0xc9,0x4f,0x4e,0x7d,0xa9,0xad,0xdf,0x54,0x42,0x0f,0xe2,
0x83,0x85,0x2b,0x73,0x12,0x0d,0xa6,0xbd,0xfe,0xfd,0x6c,0xae,0x32,0x0c,0xfe,0x49,
0x34,0x98,0xf6,0xea,0x20,0x3e,0xb7,0x77,0x6e,0x6e,0x38,0xe2,0x35,0x88,0x8d,0x96,
0xf0,0xb9,0xea,0xc3,0x73,0x73,0x3b,0xbc,0x06,0xb1,0x51,0x6d,0x0e,0x35,0x34,0xf7,
0x3d,0xaf,0x41,0xec,0xf4,0x29,0x08,0xee,0xf0,0xf0,0xd0,0x1f,0xbc,0xe6,0xb0,0xd3,
0x75,0xc3,0x43,0xf8,0x5c,0xf0,0x2f,0x79,0xcd,0x61,0xa7,0x47,0xe6,0x00,0x70,0x6e,
0xee,0x26,0xaf,0x39,0xec,0x74,0x90,0x1f,0x9b,0x7f,0x83,0xd7,0x1c,0x76,0x5a,0x1e,
0x22,0xc0,0x61,0xd5,0x6b,0x10,0x1b,0xd5,0x00,0x0e,0x13,0x70,0xd0,0x6b,0x10,0x3b,
0x9d,0x4b,0xf1,0x1d,0x92,0xbc,0x0e,0xa6,0x7d,0x7a,0xf7,0x10,0x7d,0xac,0xc4,0xab,
0x5e,0x73,0xd8,0xe9,0x11,0xa0,0x83,0xaf,0x8e,0x6d,0x30,0x5b,0x47,0xf0,0x63,0x4d,
0x46,0x3e,0xef,0x35,0x87,0x9d,0xf6,0xe1,0x67,0x9a,0x8c,0x8c,0x74,0x6c,0x83,0xa9,
0xe2,0x87,0xc2,0x8c,0x8c,0x0c,0xa9,0x5e,0x83,0xd8,0x69,0x6e,0x81,0x0c,0x74,0xe1,
0x42,0x6b,0x67,0xf4,0x14,0xd2,0x2d,0x2c,0xee,0xf2,0x9a,0xc3,0x4e,0xcf,0x2d,0x2c,
0x2c,0xc2,0xaf,0x57,0xbd,0xe6,0xb0,0xd3,0x6d,0x88,0xb7,0xb8,0xf8,0x05,0xaf,0x39,
0xec,0x74,0x60,0x91,0x00,0xff,0xee,0x35,0x87,0x9d,0x96,0xe8,0x23,0xa7,0x46,0x5e,
0xf7,0x9a,0xc3,0x4e,0x1a,0x14,0x07,0x20,0x2e,0xa8,0x5e,0x83,0xd8,0xe9,0x4e,0xfa,
0xc8,0xae,0xc5,0x8e,0x6d,0x30,0xef,0x65,0xbe,0x5d,0x5e,0x73,0xd8,0x69,0x27,0xd2,
0x75,0x75,0xc9,0xec,0x11,0xb5,0x55,0x87,0xd9,0xbf,0x37,0xbc,0xe6,0xb0,0xd3,0x3e,
0x74,0xaf,0x4b,0xf9,0xab,0xd7,0x1c,0x76,0xaa,0x76,0x75,0x2d,0xce,0x2f,0xce,0x77,
0x70,0x83,0x01,0xff,0xe6,0xe7,0x17,0xbc,0xe6,0xb0,0xd5,0x9d,0x5d,0xf3,0x18,0xe1,
0x88,0xd7,0x1c,0x76,0xfa,0xe1,0x3c,0xa9,0xd7,0x6b,0x0e,0x3b,0xed,0xec,0x42,0x29,
0x9d,0xdb,0x60,0x08,0x6f,0x7e,0x8b,0xd7,0x1c,0x76,0x3a,0x84,0xd1,0xed,0x52,0xfe,
0xe1,0x35,0x87,0x9d,0x56,0x00,0x0e,0xf4,0x76,0xaf,0x39,0xec,0xa4,0xcd,0x2b,0x18,
0xdf,0x53,0xbc,0xe6,0xb0,0xd5,0xf9,0xe0,0x1f,0x30,0x76,0xd0,0x67,0x8e,0x36,0x6a,
0x83,0x42,0x01,0xde,0xe1,0x35,0x87,0x9d,0x2e,0x98,0xa7,0x8f,0xba,0xed,0xd8,0x4d,
0xe8,0xff,0xf0,0x47,0xf1,0xfe,0xcb,0x6b,0x0e,0x3b,0xed,0x0b,0xd0,0x95,0xc6,0x1f,
0xf4,0x9a,0xe3,0x7f,0x46,0x53,0xa6,0xb8,0x66,0xdb,0xf9,0x01,0x94,0xc7,0xd6,0xb3,
0x23,0x0a,0x74,0x64,0xfe,0x5a,0xbc,0x71,0x10,0xfe,0xe5,0x33,0x90,0x7d,0x8b,0xbf,
0x53,0x3d,0xe6,0x12,0x7a,0x4e,0x69,0xd0,0x49,0x70,0xe2,0x76,0x35,0xfd,0xed,0x44,
0xd5,0x6b,0x34,0xd4,0x2d,0xca,0x2a,0x01,0xd6,0x4e,0xfe,0x5b,0x27,0x6c,0xa2,0xd6,
0xae,0x5f,0xcd,0xa7,0xfc,0x51,0x3f,0x2c,0xfe,0xb6,0xc3,0x6b,0x3a,0x5d,0xdf,0x0f,
0x18,0xaf,0x47,0xf9,0x06,0x65,0xf8,0xda,0x04,0xad,0xf9,0x78,0xfd,0x90,0xa2,0xbc,
0x7c,0x25,0xfc,0xc7,0x5b,0xbc,0xa6,0xd3,0xf5,0x4b,0x14,0xa5,0x61,0x2b,0x68,0x0c,
0xfc,0xbc,0x6a,0x09,0x27,0x8f,0x47,0x95,0x0e,0x98,0x82,0x6b,0xf3,0xca,0xc9,0x6a,
0xc3,0xbf,0x1c,0x54,0x94,0xb7,0xc1,0x0a,0x06,0x26,0x8f,0xcf,0x01,0xa9,0x37,0x54,
0x75,0x1d,0x50,0xd6,0xac,0xe3,0xcf,0x52,0x4e,0x84,0xd7,0x09,0x30,0x8d,0x00,0xa9,
0x27,0x50,0x16,0xc1,0x54,0x1b,0x59,0xf5,0x4f,0x3b,0x95,0x2e,0x75,0x83,0x72,0x9c,
0x8e,0xa4,0xc7,0x79,0x80,0xd4,0xa0,0x0b,0x94,0x93,0xf1,0x21,0x56,0x79,0x7c,0x10,
0x98,0xd0,0x4f,0x14,0x65,0xef,0xd3,0x50,0x24,0xd8,0x06,0x3d,0x5f,0xa3,0xde,0x85,
0x35,0x0a,0x81,0xec,0xd5,0xac,0x7d,0xa6,0xf7,0x4d,0xf0,0x50,0xd7,0xbf,0xae,0x74,
0x79,0xcd,0xb7,0x01,0x13,0xad,0xaa,0x28,0xaf,0xd6,0xe6,0x2d,0x7c,0xbb,0xa0,0xeb,
0xc0,0x34,0x72,0x98,0x28,0x3d,0xd5,0xe3,0x54,0x02,0xd7,0x2b,0x7f,0xab,0x5a,0x3b,
0xf4,0x55,0xcb,0xc0,0x48,0xbd,0xd1,0xeb,0x06,0x43,0xfe,0xe9,0xb7,0x2b,0xef,0xd0,
0x1a,0xfc,0x43,0x47,0xb1,0x78,0x3c,0xf7,0xef,0x6a,0x2a,0xd1,0xbb,0xa0,0xa5,0x40,
0x23,0xec,0x67,0xa5,0xfb,0xf7,0xea,0xfd,0xf8,0x49,0x45,0x3f,0xf2,0x3e,0xff,0x76,
0x2a,0x27,0xe9,0x08,0x72,0x0a,0x34,0x93,0x35,0xb3,0xd9,0x06,0x2c,0x6e,0x6f,0xb5,
0x9f,0x16,0x01,0xd0,0x05,0xd5,0xab,0x95,0x93,0xd4,0xc6,0xff,0x83,0x90,0x7b,0x3e,
0x01,0x43,0x21,0xfc,0x99,0x66,0x91,0xc1,0x5b,0xd7,0xcc,0x66,0xb0,0x8a,0xf9,0xb2,
0x37,0x54,0x16,0x5d,0xaf,0x74,0x0d,0xea,0xb8,0x1e,0x00,0xd2,0xc6,0x99,0xb8,0xfa,
0x02,0x50,0x7b,0x03,0x65,0xd1,0xd3,0x8a,0x72,0xca,0x3d,0xa3,0xe8,0xd4,0x59,0x8a,
0xf2,0x97,0x6b,0xeb,0x9f,0x1b,0xfc,0xd8,0xed,0x0a,0x4d,0x22,0x1e,0x6b,0x19,0xfb,
0x09,0xf4,0x96,0x13,0x74,0x08,0xb0,0xd2,0x55,0x17,0xfe,0x7b,0x27,0x6c,0xb1,0xdd,
0xc5,0x2d,0xef,0xad,0x7a,0xed,0x85,0xd5,0x0b,0xe9,0xe3,0x55,0xaf,0xe1,0x40,0x2b,
0x3c,0xf1,0x42,0x27,0xb9,0x65,0x7e,0x15,0x9f,0xdc,0xb3,0x1a,0xdc,0xd2,0x32,0xf9,
0x86,0xcd,0xe5,0xa3,0x0d,0x80,0x27,0x49,0x3e,0x0b,0xc6,0x35,0x55,0x33,0xf8,0x6c,
0x15,0x15,0xfe,0xb6,0xcd,0x17,0x35,0x35,0xed,0xf4,0x83,0x10,0xff,0xbf,0xb4,0xd2,
0xe2,0xa7,0x1e,0xb8,0xad,0x7d,0x9c,0x84,0x1d,0xbb,0x07,0x28,0xd6,0x83,0x9d,0xd0,
0x01,0x8f,0x2c,0x6e,0x3b,0x27,0x78,0x8d,0x61,0xab,0x4b,0x88,0xaf,0x63,0xdf,0x64,
0x10,0xf3,0x4a,0x07,0xcc,0xc0,0x36,0xfa,0x0a,0x27,0xa0,0xd7,0x27,0x20,0xb6,0x12,
0x9b,0xe4,0x83,0x5e,0x73,0xd8,0xe9,0x90,0x38,0x95,0xf3,0x9a,0xc3,0x4e,0x2b,0xcc,
0xe7,0xfd,0x0a,0xda,0x46,0xe2,0x84,0xb3,0x73,0x1b,0xcc,0x59,0x62,0x5d,0xd8,0xa9,
0xda,0xd0,0xe1,0x0d,0xe6,0x02,0xe2,0xf3,0xfc,0x0c,0xdd,0x56,0x6f,0x76,0x78,0x83,
0x39,0x28,0xf6,0x62,0xbc,0xe6,0xb0,0xd3,0x52,0x87,0x37,0x98,0x1a,0xf3,0x79,0xbe,
0x05,0x6d,0xab,0xeb,0x3b,0xbc,0xc1,0x3c,0x6e,0x9c,0x78,0x5a,0xf5,0x5f,0x2d,0xf1,
0x8b,0xcc,0x76,0x96,0x00,0x00,

View File

@@ -0,0 +1,477 @@
0x1f,0x8b,0x08,0x08,0xfd,0xae,0x9c,0x41,0x00,0x03,0x65,0x73,0x64,0x5f,0x77,0x65,
0x6c,0x6c,0x65,0x5f,0x6d,0x6f,0x6e,0x69,0x74,0x6f,0x72,0x2d,0x62,0x6c,0x61,0x75,
0x5f,0x33,0x32,0x30,0x5f,0x32,0x34,0x30,0x5f,0x38,0x62,0x70,0x70,0x2e,0x62,0x6d,
0x70,0x00,0xec,0x5d,0x6d,0x88,0x63,0xd7,0x79,0x3e,0x5a,0x8d,0x46,0x1f,0x33,0xf2,
0x1d,0x89,0x1d,0x49,0x33,0x77,0x46,0x8a,0x56,0xa3,0xd1,0x68,0x34,0x63,0xcd,0x68,
0x46,0x23,0x69,0x25,0x4d,0xa5,0x4a,0x03,0xf9,0xe1,0xd0,0xfe,0x68,0x21,0x3f,0x4a,
0x69,0x63,0x53,0x4a,0x08,0xfe,0x51,0x42,0xb6,0x84,0xa5,0xe9,0x6e,0x5d,0x13,0xda,
0x12,0xda,0x6d,0x08,0xad,0x5b,0xda,0x52,0x8a,0x29,0x69,0x09,0xc1,0x2d,0x36,0x94,
0x92,0x1f,0x26,0xa4,0x25,0x14,0xd3,0x35,0x69,0x0c,0x25,0xb8,0xa1,0x04,0x63,0xe2,
0x8d,0x1d,0x12,0x53,0x88,0xab,0xc4,0x7d,0x3f,0xce,0xb9,0xf7,0x5c,0x69,0x76,0xbd,
0x1f,0x73,0x75,0xaf,0xd4,0x3c,0x57,0xd2,0xac,0x56,0x57,0xba,0x47,0x8f,0x9e,0xf7,
0xe3,0xbc,0xe7,0xdc,0x73,0x7f,0xf6,0x23,0x27,0x07,0x01,0x81,0x38,0x59,0x10,0x62,
0x07,0xfe,0xf6,0xe0,0xe9,0xf7,0xe1,0x6f,0x40,0x44,0xe8,0xff,0xc5,0x5e,0x40,0x14,
0x1e,0x17,0x74,0x17,0xbc,0xab,0x18,0xfd,0xda,0x82,0x18,0xbd,0xf8,0x8c,0x18,0x7d,
0xae,0x23,0x46,0xaf,0x7f,0x55,0x8c,0xfe,0xfa,0x29,0x31,0xfa,0xfa,0xdf,0x88,0xd1,
0xa7,0x37,0xc4,0xe8,0x07,0xdf,0x11,0xa3,0xe7,0x7e,0x41,0x8c,0x5e,0xfe,0xbc,0x18,
0x7d,0xf7,0x5b,0x62,0xf4,0xa5,0x4f,0x8a,0xd1,0x37,0xff,0x51,0x8c,0x9e,0x3d,0x16,
0xa3,0xdf,0xb8,0x2c,0x46,0xef,0xbd,0x2b,0x46,0x5f,0x78,0x42,0x8c,0xde,0xf8,0x86,
0x18,0xdd,0xdc,0x13,0xa3,0xa7,0x97,0xc5,0xe8,0x2b,0x7f,0x20,0x46,0x5f,0xfc,0x84,
0x18,0xbd,0x0a,0xfb,0xdd,0x82,0xd7,0xfe,0x1b,0x5e,0x7b,0x05,0xfe,0xfd,0x5b,0xf0,
0xfa,0xff,0xc0,0xfe,0x7f,0x01,0x9f,0xff,0x35,0xf8,0xfc,0x17,0xe0,0x98,0xff,0x09,
0xc7,0xfb,0x38,0x1c,0xff,0x9f,0xe0,0x3d,0xb7,0x86,0xb0,0xef,0xbf,0x89,0xd1,0xf3,
0xf0,0xfa,0x2b,0x7f,0x0f,0xfb,0x6f,0xc1,0xfe,0x77,0x60,0xff,0x5f,0x82,0xfd,0xff,
0x5c,0x8c,0xde,0x86,0xe3,0xbf,0x70,0x1d,0xde,0xf3,0xcf,0x62,0xf4,0x7b,0xd0,0xd6,
0x4f,0xc1,0xf1,0x7f,0x32,0x82,0xb6,0xc3,0x7b,0x3f,0x07,0xef,0x7d,0x1d,0xde,0xfb,
0x75,0x78,0xdf,0xa7,0xe1,0x7d,0x3f,0x80,0xf7,0x3d,0x07,0xef,0x7b,0x19,0xde,0xf7,
0x25,0x78,0xcf,0x37,0xe1,0x3d,0xcf,0xc2,0x7b,0xde,0x83,0xfd,0xbf,0x00,0xdf,0xe7,
0x0d,0xf8,0xac,0x9b,0xf0,0x1d,0x9e,0x86,0xcf,0xf8,0x0a,0x7c,0xb7,0x2f,0xc2,0xf7,
0xfa,0x38,0xb4,0xfd,0x79,0x68,0xf7,0xdb,0xf0,0x9d,0x3f,0xb5,0x21,0xc4,0xab,0xab,
0x42,0x5c,0x13,0xe2,0xdf,0xc5,0x33,0xe2,0xce,0xf7,0xdf,0x14,0xc9,0x1f,0x27,0x85,
0xf8,0x8c,0x10,0x2f,0xdd,0x49,0x8b,0x97,0xde,0x7a,0x4e,0xdc,0x4a,0xde,0x16,0xd7,
0x61,0x87,0xff,0x78,0xf7,0xab,0xe2,0xa5,0x27,0xee,0x88,0x5b,0xaf,0x26,0xc5,0x75,
0xd8,0xbf,0xf7,0xb7,0x19,0x71,0xfb,0xad,0xb7,0xc5,0x5a,0xf2,0x8f,0x80,0xdd,0xeb,
0x22,0xf2,0xf2,0x1f,0x0a,0xf1,0xc4,0x8b,0xe2,0xf9,0x57,0x6f,0xc1,0xe7,0x5d,0x17,
0xdf,0xbe,0xf9,0xbe,0x38,0x10,0xef,0x8b,0xcf,0xc2,0xfd,0x3a,0xdc,0x7f,0xbd,0xf7,
0xac,0xf8,0xc5,0xe8,0x8b,0x62,0xf3,0xc9,0x5b,0xb4,0xbf,0xf8,0xe8,0x9f,0x08,0xb1,
0xf0,0x82,0x10,0x37,0xe4,0xf3,0xcb,0x42,0x62,0x95,0x1e,0x9b,0x81,0xa8,0xb8,0x2d,
0x82,0x62,0x4d,0xac,0xc8,0xff,0x7f,0x0b,0xee,0x8b,0xf0,0x2a,0xef,0x0f,0xad,0x14,
0x7f,0x69,0xff,0xbc,0xa2,0xb7,0x12,0x81,0xfd,0x05,0xec,0xff,0xbc,0xfc,0x9f,0x6f,
0xc3,0xfd,0x00,0xf6,0xff,0x2c,0xed,0xff,0x2d,0x78,0xbc,0x03,0xf7,0xa4,0x3a,0x0c,
0x7d,0xee,0xf7,0xb4,0xff,0xf9,0x08,0xdc,0xff,0x0c,0xf6,0xc7,0x4f,0xb9,0x26,0xde,
0x14,0x1f,0x86,0xfd,0x2f,0xc1,0xab,0xaf,0xd1,0xf3,0xbf,0x7b,0xf3,0x92,0x68,0xbc,
0xf5,0x19,0xe0,0x83,0x5a,0x2b,0xfe,0xe5,0x6b,0xdf,0x11,0x8d,0x67,0xbe,0x2b,0x6e,
0xbd,0xc3,0x7c,0x44,0xae,0xbf,0x26,0x16,0x9f,0x81,0xf6,0xbd,0x03,0x2d,0xba,0x16,
0x15,0x91,0x0f,0x2d,0x0a,0xf1,0x21,0x21,0x9e,0xff,0x21,0xbd,0x1d,0xf0,0x2b,0xf4,
0xf9,0x22,0xc6,0x9f,0xaf,0x9e,0x8a,0x5f,0xe5,0xa3,0x6f,0x3d,0x15,0x10,0xdf,0xfb,
0x04,0xb4,0xe6,0x1d,0x7e,0xf9,0xc7,0xbf,0x0b,0x7f,0xe1,0xf9,0x0d,0x78,0x8e,0x9f,
0x1f,0xfa,0x7d,0xf8,0xae,0x3f,0x07,0xcf,0x5f,0xe5,0xe7,0xcb,0xf8,0x26,0xd0,0xff,
0xf3,0xdc,0x3c,0x71,0xf3,0xa3,0x1f,0x86,0xe7,0x97,0xc4,0x8d,0x1b,0xaf,0xd1,0xef,
0x25,0x6e,0x5e,0x12,0xf4,0x43,0x4a,0x44,0x5a,0xf0,0xf0,0x3a,0xec,0x7f,0x1b,0x8e,
0x7f,0xed,0x9a,0x88,0xae,0xdc,0x12,0xc1,0x9f,0x8f,0xc1,0xef,0xbf,0x42,0xef,0x0f,
0xf4,0xfe,0x58,0x88,0x28,0x18,0xcc,0x93,0x3f,0x43,0x1f,0xf8,0xae,0x78,0x1a,0xbe,
0x7f,0x14,0xbe,0x7f,0x8c,0x7f,0x0f,0x38,0xf6,0x8f,0x34,0xb6,0x9a,0xef,0xc1,0xf3,
0x30,0x3c,0xff,0x65,0x7e,0xfe,0xc3,0x4f,0x46,0xc4,0x9f,0xde,0xf9,0xb2,0xf8,0x9d,
0xe4,0x1a,0xf1,0x13,0x11,0x4f,0xc0,0x6f,0xf3,0x96,0xb8,0x01,0xef,0xc0,0xe7,0xef,
0x8b,0x57,0xe0,0xde,0x85,0x7b,0x07,0xee,0xd7,0x44,0xa8,0xf9,0xb4,0x08,0xfc,0x28,
0x2a,0x6e,0x24,0x63,0xf4,0xfa,0x0b,0x9f,0x8f,0x88,0x7f,0x5d,0xf8,0xb2,0xe8,0x7f,
0x63,0x8d,0xda,0xd3,0xfc,0xcd,0xff,0x15,0xaf,0xfd,0xc3,0xc7,0xc4,0xea,0xed,0x0e,
0xb5,0xb7,0xda,0xeb,0x8b,0x9f,0x44,0xdb,0xe2,0xb7,0x9f,0xec,0xd0,0xf7,0xbb,0xf9,
0xd4,0x5f,0xc1,0x0f,0xfa,0x31,0x78,0xff,0x90,0xde,0x9f,0x6d,0xf5,0xc5,0x7f,0xbd,
0xd1,0x16,0xb7,0x61,0xff,0x6b,0xb0,0x7f,0x81,0xe9,0xb1,0x50,0xf5,0x23,0x0c,0x63,
0x98,0xa8,0xb5,0x8a,0x8d,0x68,0xaf,0x52,0xe9,0xef,0xa4,0xd3,0x57,0x92,0xc9,0xe4,
0xfa,0xfa,0xf6,0xfa,0x63,0x8f,0xc5,0x37,0x02,0xc5,0x60,0x2d,0x31,0x34,0xbc,0x6e,
0xa2,0x0f,0x61,0x98,0x89,0x56,0xb1,0xd7,0x1c,0x2c,0x74,0x0e,0xf7,0x93,0xeb,0xc7,
0xdb,0xc7,0xc7,0xc7,0x8b,0xc7,0x67,0x88,0xc7,0x10,0x67,0x87,0xd9,0xd4,0x10,0x76,
0x6b,0xc3,0xc6,0x8f,0x6d,0xaf,0x5b,0xec,0x13,0x98,0xc3,0xc2,0x5a,0x34,0x8b,0xb4,
0xc5,0xe3,0xf1,0x64,0x1c,0xc5,0x96,0xdc,0xde,0x46,0x02,0x17,0x99,0xbe,0xb3,0xc7,
0x8e,0x17,0x8a,0x31,0xfb,0x0d,0x6d,0x43,0x6e,0x70,0xf3,0xae,0xd9,0x3e,0x40,0x29,
0x96,0x0b,0xe5,0x07,0x91,0xc3,0xc3,0xfd,0xfd,0xfd,0x38,0xb2,0x77,0x1a,0x4f,0x9e,
0x22,0x7d,0xeb,0xeb,0x28,0xc0,0x45,0x90,0x20,0x12,0x98,0x8e,0x0e,0x79,0xff,0xb6,
0xa4,0xae,0x6a,0xd0,0x3f,0x08,0xe6,0xff,0x4f,0x0e,0xcd,0xc4,0x5a,0x6f,0xd0,0x49,
0x5f,0x39,0x44,0xec,0x23,0xae,0x22,0x81,0xf1,0x53,0x22,0x70,0x7d,0x7b,0x1b,0xed,
0x17,0x04,0xb8,0x78,0xb6,0xb3,0x27,0x8d,0xb5,0x5d,0x65,0xea,0x8c,0xaa,0xc5,0x9d,
0x69,0x1a,0x78,0x33,0xbc,0xfe,0x36,0x53,0x85,0xd1,0x6d,0xe5,0x17,0x3a,0x2b,0x80,
0xf4,0x95,0x74,0x1a,0xf9,0xbb,0x74,0x48,0xfa,0xbb,0x4a,0xf6,0x7b,0x0a,0xfa,0x4b,
0xa2,0xfe,0xd0,0x80,0x8f,0x07,0x35,0xf6,0x73,0x2c,0xbd,0x2a,0xda,0x2c,0xb3,0x67,
0xf2,0x66,0x96,0x68,0x33,0x3c,0xfe,0x4e,0xd3,0x82,0x11,0x4b,0x81,0xc1,0x46,0x3a,
0x91,0x4e,0x27,0x9d,0x5e,0x81,0xd0,0x7a,0x65,0x42,0x7f,0xc9,0xe4,0x29,0xf8,0xbf,
0x75,0xd2,0x5f,0x3a,0x67,0x54,0x95,0xbf,0x23,0xd9,0x21,0x75,0x6d,0x83,0x44,0x87,
0x60,0xf2,0x4a,0x25,0xb3,0x5e,0x32,0xbd,0xfe,0x6a,0xae,0xc3,0x88,0xad,0x05,0x06,
0x27,0x80,0x08,0x10,0xd8,0x59,0xe9,0x00,0x7d,0x20,0x3f,0xdb,0x82,0xe3,0xfb,0x57,
0xd9,0x05,0xa2,0xfc,0xd0,0x84,0xf7,0x43,0x48,0x8a,0x81,0x86,0xeb,0xf0,0x78,0xcc,
0x5e,0xc9,0xde,0xea,0xf5,0x12,0x6c,0x86,0xd7,0x5f,0xd0,0x4d,0x18,0x99,0x72,0x7f,
0x61,0x61,0x07,0x10,0x39,0x41,0xfd,0x21,0x7d,0x4c,0x20,0xda,0xef,0xfe,0xa1,0x0c,
0x20,0x2c,0x40,0xd2,0xdf,0x7a,0x7f,0xa8,0x24,0xa7,0xa8,0x6b,0x93,0xc5,0x1a,0x25,
0x5b,0x77,0x25,0x24,0xae,0x0e,0x8f,0x88,0xd2,0xbc,0x46,0x12,0x33,0xd8,0x00,0xf2,
0x80,0xbe,0x8d,0x9d,0x9d,0x93,0x9d,0x13,0x60,0x10,0xf5,0xd7,0x21,0x03,0x4e,0x5b,
0x06,0x0c,0xfa,0xbb,0x6a,0x47,0x90,0xfd,0x96,0x61,0xe5,0x29,0x36,0x75,0xba,0xee,
0x50,0x78,0xbc,0x31,0xc2,0xf5,0xb9,0x94,0xa0,0x19,0xec,0xad,0x0e,0x16,0x06,0x48,
0x9f,0xa5,0x3f,0x69,0xbf,0x18,0x40,0x6c,0xfb,0x95,0x0e,0x90,0x13,0xc0,0x7e,0xbd,
0xcd,0x71,0xb6,0x6d,0x58,0xd1,0x42,0x37,0x59,0x29,0x3c,0x49,0x5e,0x18,0x31,0xac,
0x0f,0x87,0x75,0xaf,0xbf,0xed,0x05,0xa3,0x94,0xeb,0x2d,0x0d,0x10,0x0b,0xa4,0xbf,
0x85,0x0d,0xa9,0xbf,0x08,0xf2,0x87,0xf6,0x2b,0x23,0xb0,0x74,0x80,0x2a,0x83,0xb9,
0x1a,0x32,0xd0,0xe1,0x31,0x7b,0xcc,0x9d,0x93,0x3d,0x5d,0x78,0x61,0x54,0x1e,0x90,
0x17,0x1e,0x02,0x87,0xe1,0x79,0xb2,0xe1,0x6e,0xa8,0xd2,0xef,0xaf,0x0e,0x56,0x07,
0x83,0x2d,0x12,0xe0,0x06,0x0a,0x10,0x09,0xc4,0x00,0xbc,0x92,0x66,0x03,0xa6,0x08,
0x22,0xf5,0xc7,0x19,0x4c,0xb2,0x53,0x60,0xd9,0x31,0x7b,0x64,0xb4,0x0e,0xea,0x9c,
0xdc,0x85,0x87,0xbc,0x81,0xfc,0x10,0x86,0xd7,0xdf,0xfa,0x82,0x50,0x6a,0xe5,0x97,
0x96,0x80,0xbe,0x7e,0x5f,0x13,0x20,0x38,0xc0,0x88,0x74,0x80,0xca,0xff,0xa5,0x31,
0xff,0xd3,0x02,0x70,0xfc,0x74,0x10,0xd6,0x6c,0xd6,0x64,0x57,0x87,0x16,0x3b,0xa6,
0x3b,0x66,0x8f,0x88,0xb3,0xc8,0x43,0xcc,0x45,0x26,0x53,0x2f,0x66,0x9b,0x4b,0x7d,
0xdc,0x50,0x7e,0x52,0x7f,0xec,0x00,0x4f,0xd8,0x03,0xca,0x08,0x2c,0x03,0xc8,0x21,
0xe9,0x6f,0x1f,0xfd,0x5f,0xbe,0x04,0x21,0x83,0xba,0x15,0x32,0x4a,0x68,0xa1,0xd6,
0x8e,0x15,0xe4,0xf1,0xc2,0x43,0x52,0x9e,0x85,0xdd,0xe1,0xee,0x6e,0x6c,0x58,0xf2,
0xfa,0xcb,0x3f,0x32,0x12,0x9b,0x95,0x66,0xa5,0xd9,0x6c,0x02,0x7d,0xab,0x68,0xc1,
0x4e,0x07,0xa8,0x0c,0x98,0x33,0x40,0x3b,0x02,0x93,0xff,0xbb,0x74,0x34,0x19,0x69,
0xcd,0xba,0x25,0xbc,0x92,0x65,0xb4,0x75,0xa7,0xee,0x76,0x69,0x8b,0xe1,0x16,0x9b,
0x71,0x02,0x33,0x8d,0x6c,0xa5,0x02,0x04,0x2e,0x21,0x7f,0xd2,0x01,0x32,0x7f,0xd2,
0x01,0x46,0x64,0x06,0xc3,0xfe,0xcf,0x12,0x20,0x2a,0xf0,0x70,0x8f,0x02,0xad,0xa1,
0x94,0x77,0x5e,0xb0,0x08,0x4b,0x9b,0x75,0x08,0x8f,0x88,0x83,0x1b,0x61,0x96,0xc3,
0x70,0xa6,0x11,0x08,0x54,0x90,0xc0,0xa5,0xa6,0xe4,0x0f,0x1c,0xe0,0x96,0x64,0x10,
0x1d,0x20,0x64,0x30,0xba,0x01,0xa7,0xf5,0x1e,0xc8,0x61,0x6e,0x4c,0x77,0xe3,0x29,
0xde,0xb0,0x3e,0x49,0x1e,0xea,0x6e,0xd7,0xe2,0x0e,0xd0,0x9d,0x5d,0x05,0x22,0x7b,
0x81,0x6c,0xa0,0x52,0xc9,0x82,0x01,0x2f,0x2d,0x91,0x01,0xdb,0xfa,0x23,0x0f,0x48,
0x01,0xf8,0x84,0x0c,0xd8,0x76,0x80,0x97,0x28,0x02,0x83,0xfa,0x4a,0x7a,0x82,0x37,
0xe6,0xf0,0x24,0x71,0x75,0xa7,0xc3,0xdb,0x65,0xa3,0x75,0xa0,0x3b,0x9b,0x41,0x24,
0xd6,0xc8,0xe7,0x03,0x48,0x60,0x16,0xfd,0x1f,0x08,0x10,0xf5,0x27,0x03,0xb0,0x16,
0x81,0xf5,0x2e,0xf0,0x15,0x4d,0x80,0x48,0x9f,0xaa,0x07,0x9c,0xe7,0xf0,0xc2,0x93,
0xba,0x9b,0xa0,0xae,0x1b,0xeb,0x76,0xbb,0x89,0x58,0xcc,0xf0,0x9a,0x8b,0x07,0x47,
0x3d,0x04,0xec,0x1d,0x48,0xfd,0xa1,0x07,0x64,0x07,0xb8,0x2a,0x03,0xc8,0x80,0xfc,
0x1f,0x09,0x50,0x66,0xd0,0x9c,0x01,0x5a,0xe6,0x7b,0x58,0x74,0x48,0x4f,0x77,0x78,
0x63,0xc2,0xdb,0x95,0x91,0x76,0x82,0xbc,0x6e,0x2c,0xc1,0x5b,0xa2,0x3b,0x6b,0x89,
0xb4,0x91,0xeb,0xe5,0x11,0x44,0x20,0x0b,0xb0,0xd9,0xb4,0x0c,0x78,0x4b,0xfa,0x3f,
0x2b,0x83,0xb6,0x1c,0xa0,0xea,0x81,0x1c,0xee,0x6f,0x3a,0xcc,0x76,0x5c,0x78,0x0e,
0xab,0x1d,0x6a,0xc1,0x82,0x45,0x87,0x1b,0xc8,0x2e,0x01,0x8f,0x8c,0xd8,0x07,0x37,
0xd9,0x4f,0xe8,0x96,0x89,0xbe,0x03,0xb2,0x5f,0x0a,0x20,0x10,0x80,0x95,0x00,0x07,
0x94,0x02,0xda,0x04,0x82,0xfe,0x4e,0x3a,0x2a,0x02,0xab,0x22,0x60,0x8f,0x8b,0x28,
0x5a,0xa4,0x25,0xd2,0x9c,0xdc,0x91,0xf2,0x62,0xb1,0x09,0x87,0x17,0x43,0xe5,0xc5,
0x98,0xb9,0xee,0xec,0x11,0x58,0x4f,0xf5,0x7a,0x97,0x59,0x7f,0x6c,0xc1,0x48,0xe0,
0x52,0x53,0x39,0xc0,0x55,0x87,0x03,0xd4,0x32,0x40,0xe2,0xef,0x90,0xba,0x20,0x15,
0xac,0x43,0x69,0x5d,0x8b,0xa1,0x1d,0x6b,0xcf,0x49,0xf1,0xc6,0x1c,0x5e,0x17,0x75,
0xd7,0xb5,0xb9,0x4b,0x64,0x60,0x9b,0x9d,0x2c,0xa6,0xd0,0xe8,0x01,0x98,0x3e,0x15,
0x40,0x58,0x80,0xa4,0x3f,0x99,0x01,0x0e,0x74,0xfd,0xe9,0x35,0x18,0x94,0xdf,0x20,
0x6c,0x09,0x8f,0x94,0xe7,0x0c,0x16,0xe7,0x53,0x47,0x0e,0x4f,0xba,0x3c,0x0d,0xc0,
0x5d,0x26,0x53,0xc8,0x64,0x12,0x86,0xd7,0xbc,0xdc,0x1f,0xcc,0xb5,0x46,0x34,0x8a,
0xfc,0xf5,0xc8,0x7e,0x0f,0x02,0x4a,0x80,0xcd,0xa6,0x4c,0x01,0xc9,0x80,0x17,0xb6,
0xac,0x0c,0x50,0xd6,0x60,0xb8,0x0b,0x4c,0x29,0xcc,0x4e,0x4c,0xb9,0x3b,0xee,0xd3,
0x8e,0xfb,0xbb,0xd8,0xdd,0x1d,0x9e,0xa5,0x39,0x26,0x0f,0xd9,0x2b,0xe0,0x56,0x28,
0x74,0xbd,0x66,0xe6,0xbe,0xd0,0x0d,0x45,0x49,0x7e,0x9a,0x00,0xb3,0xe8,0x00,0xd1,
0x7a,0x31,0x05,0x54,0x0e,0xd0,0xee,0x82,0x70,0x00,0xe9,0x44,0x56,0xac,0x2e,0x48,
0x27,0xa8,0xc5,0x8a,0xbb,0x75,0xcb,0xee,0xea,0xf0,0x74,0xe5,0x25,0x80,0x37,0x22,
0x0f,0x31,0xf4,0x9a,0x9b,0xfb,0x40,0xae,0xdc,0x68,0xf4,0x1a,0xa8,0x3f,0x76,0x80,
0x81,0xbc,0x14,0xa0,0xca,0x60,0xc8,0x82,0xb5,0x08,0xac,0xd5,0x60,0xac,0x1a,0x42,
0x4a,0xaf,0xa4,0x84,0x87,0x3a,0x7b,0xc3,0x89,0x60,0x21,0x53,0x3c,0xa9,0xbb,0xae,
0xad,0x3c,0x34,0x5b,0x29,0x3d,0xf8,0x5b,0x2b,0xd4,0x0a,0xbe,0xef,0x87,0x98,0xa9,
0x06,0xf0,0x07,0xf4,0x35,0x90,0xbe,0x9e,0x8a,0xc0,0x59,0xb6,0xdf,0x8a,0xd4,0xdf,
0xa0,0xaf,0x32,0x40,0x1c,0x03,0xd9,0x50,0x19,0x60,0x47,0xd1,0xd7,0x43,0xce,0xea,
0xe7,0x3a,0xbc,0x5d,0x27,0x71,0x7a,0x8a,0x67,0x71,0x27,0x1d,0x5e,0xc1,0x92,0x5e,
0xa6,0x80,0xe4,0xd5,0x6a,0xb5,0x82,0xd7,0xfc,0x7c,0x00,0x86,0x47,0xe5,0x32,0x12,
0xd8,0x8b,0x5a,0x06,0x6c,0xe9,0x2f,0x2b,0xbb,0xc0,0xc8,0xa0,0x9e,0x01,0x52,0x04,
0x51,0x45,0x68,0x32,0xe0,0xc1,0x18,0x79,0xa8,0xba,0xc9,0x3e,0x6d,0x57,0x1a,0xad,
0xd3,0xdf,0xb1,0xc3,0x63,0xfa,0x98,0xc3,0x9a,0x24,0x2f,0x58,0x2b,0x04,0x6b,0xfe,
0xb6,0xe0,0x4c,0xa8,0xbc,0x59,0x46,0xfd,0x35,0xa2,0xbd,0xb1,0x08,0xac,0xf4,0xd7,
0xec,0x8f,0x39,0x40,0xd6,0x1f,0x3b,0x40,0xce,0x60,0x4e,0x12,0xe1,0x31,0x9b,0x3d,
0x27,0x5a,0x20,0x75,0xdd,0x98,0x94,0x5c,0x57,0x27,0xcf,0xf2,0x76,0x1a,0x79,0xc1,
0x1a,0x92,0x07,0x5b,0xd0,0xc7,0x1d,0xe1,0x76,0x2e,0xb4,0xb9,0x59,0xde,0x6c,0x94,
0xc9,0x03,0x2a,0x07,0x28,0x33,0x68,0x95,0xc1,0xd8,0x11,0x64,0xcb,0x2a,0x22,0xe8,
0x0e,0x30,0xbd,0xd2,0x29,0x3a,0x0a,0x51,0xe0,0x01,0x39,0x08,0x0f,0x87,0x8a,0xbd,
0x98,0x95,0xa4,0xd8,0xd2,0x63,0xd5,0x25,0x48,0x75,0xf2,0x56,0x50,0x56,0x8b,0xca,
0x0b,0x22,0x79,0xc1,0x5c,0x30,0xe1,0x35,0x4b,0x77,0x85,0xd1,0x0a,0x11,0x7f,0xe4,
0xff,0xd8,0x82,0xc9,0x01,0xb2,0x01,0x5b,0x21,0x78,0xac,0x0b,0x8c,0x01,0x78,0x83,
0x0c,0x98,0x1d,0x60,0x27,0x9d,0x97,0xd4,0x41,0x02,0x68,0x8c,0x4d,0x06,0x6a,0x1b,
0xf5,0xfa,0x50,0xba,0x3c,0xdd,0x6c,0x33,0x44,0x5f,0x42,0xa9,0x8e,0x84,0x87,0xde,
0x0e,0xa9,0x0b,0xa2,0xf0,0xf0,0x96,0xe3,0xcd,0xaf,0x59,0xb4,0x99,0x3a,0x0a,0x01,
0x81,0x68,0xc0,0x52,0x7f,0x97,0x7b,0x13,0x01,0x58,0xd5,0x10,0x06,0x4c,0xe0,0x96,
0x5e,0xc3,0x42,0x06,0x21,0x00,0x2f,0x24,0x90,0xbb,0x7b,0xcd,0x60,0x31,0x4a,0xc3,
0x73,0xf2,0x63,0xdb,0x66,0x95,0xd5,0x22,0x77,0x35,0xb2,0xda,0x5c,0x4d,0x92,0x07,
0xf0,0x69,0x08,0x31,0x53,0xc5,0x50,0xe8,0x68,0x33,0x44,0x06,0xcc,0x01,0x18,0x18,
0x1c,0xcf,0x00,0xd9,0x7e,0x97,0xb8,0x08,0xbd,0x35,0xd0,0xba,0xc0,0x3b,0x4a,0x7f,
0xad,0xf0,0xfd,0xb8,0x28,0x33,0xdc,0xb5,0xb8,0x23,0xd2,0x32,0x72,0xb3,0xa8,0x23,
0x6f,0x17,0x0c,0x5a,0xba,0x23,0xf2,0x10,0xbe,0xec,0x07,0x97,0x52,0xc5,0xa2,0xa5,
0x3f,0x0c,0x20,0x7a,0x0a,0x7d,0x10,0x50,0x02,0x6c,0xaa,0x41,0x90,0x55,0x3d,0x83,
0xd9,0xd0,0x22,0x70,0xe3,0xbe,0x0f,0x69,0xc6,0x64,0x8a,0x97,0xb1,0x12,0xe4,0x9a,
0x8a,0xb4,0x16,0x83,0x35,0x27,0x77,0x7b,0xb9,0xd6,0x5e,0xce,0x45,0x1a,0x1e,0x16,
0x75,0xa0,0x2f,0x44,0xfc,0x91,0x03,0x2c,0x83,0xfe,0x28,0x02,0xcb,0x2e,0x5c,0x5e,
0x65,0x80,0x68,0xbf,0x52,0x7f,0xfa,0x30,0xba,0x55,0x03,0x8c,0x0c,0x8c,0x07,0x38,
0x6a,0x3b,0x9c,0xb0,0x8d,0x96,0xfc,0x1d,0xd1,0x86,0xc1,0x82,0xc5,0xa7,0x91,0xb7,
0x87,0x5b,0x0b,0xe8,0x6b,0xe5,0xfc,0x17,0x42,0x4a,0xad,0x62,0x11,0xf5,0x77,0xc4,
0x02,0xa4,0x14,0x9a,0x32,0xe8,0xf1,0x0c,0xb0,0xc9,0x04,0xca,0x1a,0x8c,0x8a,0xc0,
0x96,0xfe,0x3a,0x91,0x07,0xf5,0x4e,0xf5,0x84,0x95,0xa6,0xc8,0x68,0x81,0xc4,0xd5,
0x6a,0x4e,0xa3,0x25,0xf2,0x90,0x3b,0x64,0xb0,0x45,0x93,0xe0,0xfc,0x04,0xa3,0x55,
0x5c,0x2b,0xb2,0x00,0x37,0x99,0x40,0x08,0xc0,0x13,0x19,0x20,0xf7,0xe0,0x2a,0x2a,
0x02,0xf3,0x34,0x04,0x96,0xdf,0x82,0xd4,0x5f,0x24,0xff,0xe0,0x07,0x2f,0x25,0x28,
0x47,0xe1,0xf4,0x98,0x42,0x6d,0xae,0x36,0xc1,0x1d,0xd2,0xb6,0xd7,0x52,0xf0,0x59,
0x08,0x69,0xef,0xad,0xa1,0xf7,0x93,0x04,0x6e,0xa2,0xfe,0x9c,0x11,0x98,0x6a,0x30,
0x59,0x59,0x83,0x61,0xfd,0xe9,0x19,0x8c,0x0a,0x20,0x27,0x91,0x8d,0x87,0x4a,0x2e,
0xea,0x85,0x82,0x95,0xa4,0x04,0xef,0xa1,0x3b,0x1b,0xfe,0x4a,0xa2,0x73,0xa9,0x62,
0xca,0xb6,0x5f,0x67,0x06,0xd8,0x1b,0xaf,0x01,0x36,0xd5,0x28,0xc8,0x84,0x03,0x04,
0xfd,0x15,0x1f,0xb2,0x05,0x43,0x47,0x86,0xa7,0x1c,0xde,0xb9,0xd4,0x2d,0xe3,0xe6,
0x2b,0x01,0x16,0x52,0x29,0x20,0x10,0x0c,0x38,0x54,0xb4,0x22,0x08,0x59,0x70,0xcf,
0xae,0xc1,0x1c,0x1c,0xd8,0x0e,0x90,0x0d,0x98,0x19,0xdc,0xd2,0x8a,0xd0,0x91,0x93,
0xfe,0x43,0x8f,0xf1,0x98,0x89,0x49,0xe1,0x71,0xb0,0x20,0x87,0xa7,0xd3,0xd7,0x4a,
0xb5,0x52,0x29,0x1f,0xd5,0x61,0x62,0x40,0x5f,0x6a,0x4d,0x0a,0x30,0xa4,0x07,0x90,
0xa8,0xf2,0x7f,0xb2,0x0f,0x97,0x95,0x01,0xb8,0x39,0x3e,0x0c,0xac,0x46,0x91,0x1e,
0x45,0x16,0xc3,0xda,0xb8,0xc3,0xdb,0xd3,0x3c,0x1e,0x33,0xb7,0x8c,0xd4,0x2d,0x63,
0x7b,0x6b,0x17,0xf6,0xf5,0x1f,0x15,0xc3,0x16,0xb6,0x27,0x45,0x01,0xc4,0x8e,0xc0,
0x32,0x00,0x8f,0xd5,0x60,0x28,0x83,0xa9,0x38,0x8a,0xa8,0x5a,0x06,0x18,0xe9,0x3d,
0x52,0x43,0x8c,0xcc,0x18,0x7b,0x0e,0x93,0x85,0x5b,0x8a,0x94,0x27,0xe1,0x17,0x0f,
0x68,0xee,0x51,0x9b,0xc8,0x01,0x1e,0x85,0x8a,0x21,0x19,0x81,0x31,0x03,0x94,0x0e,
0xf0,0xb2,0x5d,0x03,0xcc,0xe2,0x34,0x04,0xcb,0x01,0x82,0x00,0x65,0x02,0x43,0x5d,
0xe0,0x41,0xeb,0x51,0x47,0x68,0x63,0xb9,0x3d,0xc9,0x5c,0xce,0xa9,0x3b,0x27,0x75,
0x04,0x9f,0x78,0x40,0x03,0x5b,0x4a,0x06,0x6c,0x65,0x30,0x96,0xfe,0xa2,0x8d,0x89,
0x0c,0x86,0x6b,0x58,0xac,0x3f,0xb6,0x5f,0xab,0x08,0xb8,0x69,0x3c,0x7a,0x6b,0xea,
0xe7,0xc6,0x0b,0x68,0xdf,0x18,0x79,0xe8,0x6f,0x2e,0xe0,0x70,0x17,0x80,0x0c,0xda,
0x85,0x25,0x40,0xb2,0x5f,0xab,0x0b,0xac,0xe9,0x4f,0xab,0x01,0xaa,0x79,0x58,0xab,
0xaa,0x82,0x40,0x04,0xe6,0x2f,0xa6,0xae,0x69,0x14,0x5a,0x0e,0xa0,0xc3,0x5b,0x9e,
0xa4,0x0f,0xbc,0xb5,0x3f,0x3c,0xe0,0x90,0xbc,0x4c,0x4a,0x05,0xe0,0x62,0x51,0xef,
0xc2,0x49,0x07,0x98,0x1f,0xcf,0x00,0x97,0x1c,0x11,0x18,0xe9,0xcb,0x5e,0x9c,0x35,
0x75,0x35,0xa7,0x37,0x69,0xb5,0x92,0x3b,0xdc,0x52,0x3e,0x98,0xcf,0x61,0xe6,0xf8,
0x47,0x26,0x02,0xd1,0x80,0x8f,0xd0,0x82,0x37,0x37,0x9d,0x0e,0x70,0x3c,0x00,0xcb,
0x1a,0xd6,0xaa,0x9a,0x89,0xda,0x6f,0x19,0x17,0xd8,0xa6,0x21,0xc7,0x0b,0x16,0xde,
0x38,0x77,0x45,0x62,0x8f,0x7d,0x8d,0x0f,0x7a,0xc1,0x05,0x70,0x36,0xcb,0x52,0x80,
0x29,0x32,0x60,0x72,0x80,0x56,0x11,0x1f,0xf9,0xbb,0x3c,0x1e,0x81,0x2d,0x07,0x28,
0x2d,0x38,0x74,0xc1,0xa1,0x70,0x78,0xae,0xc3,0x23,0xf6,0xd8,0xcd,0xa0,0xa5,0xc0,
0x2d,0x75,0xb1,0x87,0x7d,0x08,0xc4,0x28,0x39,0xb5,0xd8,0x5b,0x63,0xfb,0x3d,0x42,
0xfd,0x91,0xfd,0xea,0x01,0x84,0x23,0x30,0xd7,0xb0,0x96,0x2a,0x7d,0xd5,0x05,0x59,
0x0d,0x5c,0x7c,0x35,0xae,0x34,0x6e,0xb6,0x6b,0x94,0x5d,0x49,0x17,0x4d,0x6e,0x86,
0xe0,0x75,0x1d,0xd0,0x84,0x6c,0x4b,0x3a,0x1b,0xf9,0xfb,0x5a,0x29,0xf4,0xa6,0x72,
0x80,0x56,0x11,0x5f,0x9b,0x06,0x63,0xcf,0xc3,0xea,0x2f,0xb9,0xe2,0x85,0xcc,0xd6,
0x18,0x7b,0xe8,0xee,0x52,0xc4,0x9d,0xcd,0x5e,0xf1,0xa8,0xe5,0xc2,0xa1,0x1f,0x04,
0x85,0x1c,0xd7,0x35,0x94,0x00,0xb1,0x85,0x9c,0x01,0x5a,0x19,0x4c,0xaf,0xe7,0xec,
0x02,0x07,0x28,0x03,0xc4,0x79,0x58,0x64,0xc0,0x3d,0x97,0x46,0x13,0x15,0x81,0x6b,
0x68,0xb3,0x4a,0x78,0x16,0x77,0x47,0x74,0x0f,0x15,0x8b,0x61,0x77,0x8e,0x7e,0x9f,
0x18,0x62,0x77,0x09,0x93,0xd5,0xe5,0x96,0xd6,0x05,0x09,0x1d,0x59,0x19,0x8c,0xb2,
0x60,0x7b,0x1a,0x42,0xd6,0xce,0x00,0x41,0x7f,0x95,0xa0,0x6b,0x6d,0x33,0x55,0x52,
0x4f,0xdc,0xad,0xe9,0x66,0x7b,0xc4,0x79,0x3e,0xa6,0x5a,0x9e,0x16,0xa2,0xdb,0xb5,
0x20,0x15,0x38,0xc8,0x7c,0x97,0x65,0x63,0xb1,0x86,0x15,0xb2,0x6b,0x30,0x0d,0xbb,
0x08,0x2d,0x23,0xb0,0x65,0xbf,0xcd,0xa5,0x4d,0x37,0x07,0xc2,0xb0,0x22,0xc9,0xa1,
0x56,0x37,0xd9,0xe2,0x11,0xea,0x2e,0x74,0x24,0xc3,0x5c,0xd1,0xcb,0x4e,0x5c,0x8c,
0x6a,0x1d,0x68,0xbf,0xcb,0x2d,0xbb,0x0b,0x07,0x2d,0xb4,0xba,0xc0,0x32,0x85,0xd6,
0x6b,0x80,0x32,0x85,0x01,0x06,0x03,0x2e,0xa7,0x0f,0x66,0x6b,0x4c,0x77,0x16,0x79,
0xcc,0x5d,0x08,0xff,0x64,0xdc,0x6d,0xc3,0x3d,0xdb,0x87,0xe5,0x36,0xec,0xae,0xb7,
0xb8,0x7b,0x69,0x11,0x68,0x15,0xa1,0x1b,0x8d,0x72,0xb4,0x61,0x8f,0xc2,0x1d,0xc8,
0x14,0x9a,0x03,0xf0,0xa6,0xeb,0x3f,0x7d,0x29,0xa5,0x53,0xa7,0x91,0x87,0x29,0x02,
0x73,0xb8,0xe9,0x61,0x0a,0x93,0xc0,0x91,0xad,0xe0,0x5e,0x4e,0x76,0x36,0x55,0x17,
0x44,0x15,0xa1,0x65,0x0f,0x44,0x9f,0xc8,0x66,0x75,0xe1,0xb2,0x95,0x80,0x7b,0x9e,
0xcf,0x46,0x29,0xa5,0xb1,0xc7,0x0e,0x2f,0xa4,0xb4,0x47,0x3f,0x31,0x6c,0x9e,0xcd,
0x86,0x31,0x71,0x90,0x8b,0xf5,0xb7,0xa7,0x7a,0x20,0xdc,0x5e,0xad,0x08,0xad,0xe6,
0x11,0x5d,0x1e,0xab,0x01,0x36,0xa6,0x33,0x05,0xa0,0x4e,0x83,0x0a,0x47,0xe8,0xee,
0x24,0x6f,0x47,0x7c,0x67,0xee,0x30,0xc9,0xf2,0x2c,0x85,0x49,0xf0,0x50,0x4d,0x4e,
0xe9,0xaf,0x45,0xfa,0x4b,0xad,0xd9,0x19,0x20,0x47,0x90,0x9e,0x26,0xc0,0x03,0xf2,
0x80,0x95,0xec,0xd4,0xc2,0xde,0x2e,0xd9,0x6c,0xd1,0x69,0xb3,0x8a,0x3b,0x6c,0xe0,
0x66,0xc8,0xa3,0x4e,0xb0,0x89,0x53,0x9a,0x72,0x18,0x40,0x64,0x06,0xa8,0x15,0x01,
0xa9,0x0b,0x1c,0x9a,0x2c,0x42,0xcb,0x0c,0xb0,0x31,0x45,0x9b,0x89,0x1d,0x59,0xe1,
0xc2,0x26,0x8f,0xb8,0x2b,0x13,0x7d,0xe5,0xb2,0x47,0x11,0x84,0x87,0x0c,0xb9,0x60,
0xde,0xd2,0x32,0x40,0xab,0x0b,0xac,0x8d,0x22,0x39,0x8b,0xd0,0xd3,0xad,0xbb,0x15,
0x8e,0x98,0x3b,0x87,0xd1,0xda,0xec,0x6d,0x36,0xbc,0x89,0x20,0x66,0xa1,0xc0,0x63,
0xad,0xd2,0xff,0x29,0xfa,0xd8,0x7e,0xb9,0x06,0xa3,0x3b,0x40,0x2b,0x03,0xcc,0x4f,
0xfb,0xf7,0xde,0x9b,0xe0,0x4e,0x6d,0xd4,0xba,0x72,0xd9,0x93,0xd9,0x58,0x31,0x1a,
0xf1,0x0f,0xea,0x19,0x60,0xcb,0xea,0x81,0x8c,0x8f,0x22,0x69,0xa3,0xc0,0x8d,0xa9,
0xf7,0x98,0x8c,0x94,0xd3,0xe1,0xf1,0xd6,0x28,0xf3,0x06,0xed,0xf3,0xa2,0x0f,0x62,
0x64,0x0a,0x3c,0xa7,0xd3,0x22,0x50,0x73,0x80,0x47,0x5a,0x06,0x58,0x56,0xd3,0x10,
0x38,0x02,0x17,0x3d,0xf0,0xd6,0xf5,0x90,0xb2,0x59,0x56,0x1d,0xa3,0xc1,0xbf,0x2d,
0x3c,0x5c,0xc4,0xb0,0xc1,0x83,0x22,0xc6,0xd3,0xc4,0x98,0xbe,0x3d,0x3b,0x01,0x54,
0x45,0x68,0x7b,0x1a,0x82,0x3e,0x0a,0xd7,0xf3,0xa6,0x62,0x1e,0xd3,0x84,0x07,0x3f,
0x29,0x8d,0x2c,0xb0,0xed,0x92,0x7b,0x8e,0x7a,0x50,0xc5,0x4a,0xd0,0x8c,0x1d,0x9c,
0x32,0x41,0xfa,0xd3,0xbb,0x20,0x2a,0x01,0xb4,0x1d,0xa0,0x9a,0x88,0x3a,0xcd,0xb8,
0xeb,0x40,0xad,0xcc,0x11,0xa3,0xdc,0xb0,0x37,0x06,0x1a,0x87,0x07,0x11,0xa4,0x2e,
0x67,0x2c,0xd6,0x64,0x17,0xae,0xa5,0x75,0x81,0xd7,0x34,0x01,0x3a,0x22,0x70,0xd1,
0x98,0x7a,0x3b,0x15,0x96,0x35,0x8f,0x67,0x71,0x47,0x0d,0xa3,0x6d,0xea,0x0d,0x8b,
0x25,0x24,0x7b,0xba,0x01,0x6b,0x5d,0x90,0x23,0xd2,0x9f,0xca,0x00,0x79,0x22,0xea,
0x23,0x8f,0xed,0x3e,0x02,0xcc,0x90,0x93,0xb9,0x28,0x09,0x0f,0xac,0x82,0x1e,0x1a,
0xd3,0x1e,0x09,0x36,0x12,0x72,0xba,0x31,0x27,0x30,0xb9,0xf1,0x2e,0x30,0x9b,0xf0,
0x66,0x48,0xcf,0x60,0xbc,0x1d,0x2c,0x8c,0x8d,0x93,0x87,0x6d,0xb2,0xba,0x46,0x0f,
0x3b,0x67,0xe9,0x61,0x31,0x4c,0x24,0xd4,0xb9,0x01,0x38,0x5b,0x8c,0x27,0x39,0x39,
0xba,0x20,0x76,0x11,0x9a,0x1d,0x60,0xd9,0xeb,0x91,0x86,0x9c,0x2e,0xbc,0x46,0xaf,
0x17,0x55,0xdc,0x11,0xa6,0x3c,0x97,0x08,0xa7,0xbe,0xcb,0x89,0xda,0x32,0x80,0xe4,
0xac,0x00,0x62,0xeb,0x8f,0x23,0x30,0x39,0x40,0x57,0x0b,0xa5,0xf7,0x87,0x23,0x62,
0x8f,0x65,0xc7,0xe4,0x69,0x04,0x4e,0xd7,0x38,0x4c,0x9a,0xf4,0x5e,0x90,0x11,0x18,
0x3d,0xa0,0x9c,0x30,0x61,0x0f,0xc3,0x1d,0x15,0x75,0x07,0xe8,0x69,0x95,0x57,0x62,
0x58,0x8e,0x46,0x75,0x9b,0xb5,0x70,0x19,0xb6,0xf2,0x74,0x9b,0xd2,0xa5,0xd3,0xa4,
0xe8,0x74,0x46,0x2e,0xc1,0xa8,0x41,0x90,0x31,0x01,0xca,0x51,0xa4,0x3d,0x1f,0x8c,
0xf3,0x43,0x12,0xd3,0xeb,0xa9,0x73,0xf2,0x6c,0xea,0xf8,0x0c,0xc7,0xcb,0xf9,0xa9,
0xda,0x07,0x9d,0x63,0x2b,0x05,0x28,0x0d,0x58,0x3a,0xc0,0x65,0x67,0x17,0x24,0x44,
0xf6,0xeb,0xf5,0x20,0xa1,0x44,0xbb,0x38,0x21,0xbb,0x3c,0x93,0x07,0x98,0x66,0x1b,
0x4d,0x5e,0xcf,0x22,0xa3,0xba,0x20,0xc1,0xdc,0x78,0x17,0x84,0x8b,0x30,0x1c,0x40,
0x36,0x7d,0x73,0xae,0x45,0xb8,0xe1,0x94,0x9e,0xe2,0x0e,0xf1,0x68,0xf3,0x0e,0x1f,
0x0c,0x75,0x3c,0xf3,0x2c,0xc3,0x19,0x60,0x41,0x65,0x80,0x8e,0x08,0x22,0xcd,0x97,
0x0c,0xd8,0x17,0x93,0x9c,0x18,0x41,0x4b,0x79,0x97,0x75,0xee,0x08,0x53,0xcc,0x0f,
0x62,0xf2,0x74,0x5b,0x16,0xa0,0x24,0xd0,0x51,0x03,0xd4,0x6a,0x30,0x3e,0x99,0xa4,
0x48,0x68,0x87,0x34,0xb3,0x75,0xe2,0x60,0x7a,0x06,0xdc,0x8e,0xb1,0xff,0xcb,0xc8,
0x93,0x56,0x64,0x0d,0xd0,0xa1,0x3f,0x9e,0x87,0x05,0xf4,0xf9,0x60,0x86,0x93,0x86,
0x70,0x6f,0x52,0x78,0xf9,0x83,0xfc,0xc1,0x41,0x3e,0x10,0x9d,0x5a,0x8c,0x2b,0xa9,
0x15,0x7d,0x32,0x7a,0x0d,0x26,0xe7,0x28,0xa2,0xaa,0x61,0x24,0x7f,0xd1,0x57,0xad,
0xb6,0x26,0x74,0x47,0x5b,0x00,0xb6,0xa9,0x19,0xf0,0x30,0x26,0xd7,0xb8,0xb0,0x7a,
0x70,0xe3,0x5d,0x10,0x3e,0x95,0x06,0xe4,0xe7,0x27,0xe3,0x25,0x18,0x8d,0xf3,0xb8,
0xc3,0x41,0xad,0x83,0xa9,0x15,0x61,0x86,0x74,0xe6,0x3c,0x04,0x90,0x84,0x3c,0xe5,
0xd1,0xee,0x82,0x8c,0x39,0x40,0xdf,0xd1,0x07,0xbe,0xbb,0x37,0xae,0x3b,0xe0,0x8e,
0x86,0xf5,0xa7,0x15,0x81,0xdb,0xb8,0xfa,0x45,0x22,0x26,0xf5,0x57,0x93,0x27,0x27,
0xe7,0x70,0xde,0xfb,0xd8,0x34,0x84,0x69,0x8c,0x90,0x3f,0x30,0x52,0x92,0xbc,0x00,
0x6f,0x08,0x3e,0xb5,0x36,0x30,0xa5,0xe2,0xa4,0xc9,0xab,0x0f,0x68,0x16,0x8c,0x0e,
0xd0,0xee,0x03,0x5b,0xf3,0x00,0x7d,0x49,0x5f,0xb5,0xd4,0x3b,0x90,0xe4,0xd1,0x58,
0xb4,0xe4,0x0e,0x31,0xa5,0x08,0x5c,0x27,0xfd,0xa9,0xf8,0xa1,0x52,0x40,0x35,0x0d,
0x86,0x04,0x48,0xf3,0xb0,0x7c,0x93,0x36,0x8f,0xa1,0x70,0x20,0xa9,0xd3,0x81,0xb3,
0xea,0xee,0xff,0xac,0xed,0x47,0x82,0x5c,0x02,0xa3,0x8b,0x0c,0x5a,0x35,0xe8,0xe0,
0xc4,0x3c,0x2c,0xbf,0xd2,0x57,0xad,0x86,0x02,0x6c,0xb7,0x16,0x85,0x59,0x9c,0x53,
0x0c,0xb7,0xa9,0xf4,0x81,0xdb,0x43,0x5c,0x6b,0xaf,0x1b,0x4b,0x58,0x0e,0x90,0x6a,
0x58,0x58,0x83,0xd9,0xd3,0x66,0xe2,0xfb,0x97,0xbe,0xea,0xf0,0x40,0x23,0x2f,0x9b,
0xcd,0xf2,0x7c,0x26,0xc0,0xde,0x34,0x8e,0x5e,0xb2,0x96,0x60,0xb1,0x73,0x68,0x95,
0x01,0xda,0x7d,0xe0,0x0b,0x3d,0x1d,0xe1,0xa2,0x51,0xd4,0x85,0xa7,0xd8,0x83,0xc7,
0xa9,0x18,0xb0,0xc9,0x6b,0xd8,0xa8,0x55,0x43,0xb4,0x51,0x38,0x55,0x42,0xc0,0x53,
0x07,0x7c,0x50,0xef,0xbb,0x3b,0xea,0x7c,0x1e,0x0f,0x30,0x86,0x6b,0x02,0x57,0x98,
0x3c,0x7c,0x9c,0x46,0xab,0xc3,0xb8,0x94,0x92,0xd2,0x5f,0x42,0xad,0xda,0xc0,0xa3,
0xe8,0x7b,0x7b,0xec,0x00,0x97,0xbd,0xaf,0x36,0xdf,0x13,0xcb,0x7c,0x16,0x54,0xd6,
0x62,0x8f,0x27,0x64,0x57,0xa6,0x91,0xaf,0xaa,0x35,0x94,0xd0,0x03,0xf2,0xa2,0x84,
0x38,0x8b,0xa3,0xa6,0x46,0x31,0xc9,0x7e,0xfd,0xbd,0x40,0x17,0xf4,0x42,0xf2,0x36,
0x7d,0xf2,0x84,0x6e,0x3a,0x25,0x6a,0x1a,0x55,0xe8,0xf0,0x90,0x05,0x28,0xbb,0xc0,
0xaa,0x86,0x80,0x19,0xe0,0x5e,0x8e,0x23,0xb0,0xd7,0x43,0x45,0x1f,0x8c,0xa0,0x74,
0x79,0x72,0x35,0x0b,0x3e,0x1d,0xa0,0x39,0x0d,0x03,0x6e,0x87,0xd5,0x1a,0x5e,0xec,
0x01,0x0b,0xaa,0x0f,0x62,0xeb,0xcf,0x6f,0x35,0x83,0x73,0xd0,0xee,0x55,0xd4,0x59,
0x00,0x74,0x2e,0x28,0x92,0x87,0xa7,0x74,0xbb,0x5f,0xab,0x34,0x79,0x5d,0x34,0xe5,
0x01,0xd5,0xa2,0x53,0x5c,0x43,0xa0,0x10,0xe2,0xc3,0x4e,0xef,0x24,0x0a,0x7c,0x06,
0x40,0x85,0x74,0xc7,0x0b,0xd2,0xd0,0xf9,0x14,0xae,0x1f,0x98,0xf8,0xdb,0x55,0xf9,
0x73,0x22,0x21,0xc3,0x87,0x1d,0x80,0x83,0xbe,0x18,0x2b,0xfa,0x40,0xf4,0x78,0x21,
0xae,0xe6,0x12,0x2e,0x87,0xb9,0xa4,0x56,0x44,0x0a,0x18,0x6e,0x1f,0x97,0x56,0x22,
0x8d,0x0d,0xb5,0x0c,0x50,0x5a,0x70,0x50,0xae,0x3b,0xe0,0xa3,0x55,0x2d,0xee,0x85,
0x98,0x5c,0x8b,0x5f,0xde,0xfa,0x7c,0x5d,0x97,0x25,0xd7,0x57,0xe7,0x2d,0xf1,0x52,
0xae,0x31,0xab,0x06,0x93,0xd0,0x47,0x41,0x5a,0x2d,0xbf,0x87,0x5e,0x0b,0x0d,0x69,
0xb2,0xbc,0x10,0x03,0xd3,0xd7,0xef,0xbb,0x3e,0x91,0xa3,0x5e,0x0f,0xf3,0x45,0x0e,
0xba,0x32,0x82,0x14,0xd4,0x44,0x4a,0xea,0x82,0xcc,0x40,0xec,0x90,0x88,0x55,0x96,
0xe4,0x52,0xca,0x4b,0x8a,0x3d,0x34,0x60,0xb7,0x0f,0x5b,0xe7,0x75,0x98,0x95,0xfe,
0x32,0xdc,0x07,0x2e,0xc8,0x51,0x74,0x7f,0x96,0xac,0xce,0xc7,0xa6,0x24,0x4d,0xae,
0x23,0xc0,0x27,0x73,0xf7,0xdd,0xb6,0x1f,0xd2,0xdf,0xae,0x4c,0xa1,0xbb,0x09,0xab,
0x06,0x43,0xa7,0x22,0xf9,0x79,0x61,0xd6,0x09,0xc4,0x9a,0xca,0x68,0x35,0xfa,0x56,
0x5d,0x2e,0x02,0xb6,0xa5,0xfe,0x76,0x2d,0x01,0xd2,0xf2,0xd4,0xb2,0x06,0x33,0x33,
0xce,0x8f,0x50,0xd6,0x85,0xb7,0xba,0xda,0x1f,0xe0,0xe6,0x72,0x15,0xdf,0xa8,0xd7,
0x55,0x04,0xee,0xaa,0x2e,0xb0,0x9c,0x86,0x15,0x0c,0xfa,0xbf,0xdf,0xe1,0x40,0x77,
0xc9,0x96,0x1d,0xae,0x44,0x43,0x6b,0x59,0x2c,0xb9,0x6b,0x42,0x46,0xa9,0x2e,0xd7,
0x65,0x56,0x01,0x58,0x0e,0x22,0xe1,0x7a,0x99,0x86,0xab,0x87,0xbe,0x78,0xf4,0x14,
0x79,0x44,0x1d,0x2d,0x25,0xb5,0x3a,0x70,0xb7,0x0b,0x62,0x4a,0xfd,0x59,0x35,0xc0,
0x8c,0x5d,0x84,0xf6,0x79,0xd1,0x65,0x12,0x09,0xa6,0x4e,0x5e,0x8a,0x49,0xc2,0xdd,
0x1a,0x82,0x51,0x52,0x04,0x5a,0x45,0x68,0x35,0x13,0x7f,0xc6,0xac,0x17,0xd1,0xc3,
0x15,0x80,0x71,0x05,0x10,0x5e,0x46,0x6a,0x0b,0x6f,0x0f,0xbf,0x7e,0xde,0xfd,0xc0,
0xa4,0x75,0xc0,0x87,0xaa,0x06,0xa8,0x4d,0x43,0x98,0x89,0x6e,0xef,0x18,0x12,0xd2,
0x66,0x07,0x92,0x3d,0x5a,0x8c,0xd5,0xd5,0x14,0x16,0xaf,0xfc,0xa7,0x65,0x80,0xf6,
0x20,0x66,0x61,0x96,0x52,0x17,0x0b,0x01,0x49,0xde,0x16,0x53,0x47,0x0b,0x71,0xb9,
0xda,0x05,0x31,0xe9,0x7a,0x3a,0xce,0x12,0x0c,0x0a,0xd0,0xe7,0xd7,0x34,0xb8,0x1b,
0x72,0x9a,0xf2,0x16,0xe4,0x3a,0x84,0x59,0x37,0x0f,0x68,0xd4,0x65,0x00,0xa6,0xeb,
0x48,0xc8,0x51,0x38,0xb0,0xdf,0xd9,0xe9,0xb7,0x39,0xd0,0xae,0xf0,0x55,0x24,0xb7,
0x14,0x79,0x80,0x81,0x9b,0x27,0x38,0x9a,0xa5,0x92,0x1e,0x81,0xe5,0x95,0xd5,0x0a,
0x89,0x99,0xb4,0x5e,0x40,0x6b,0x4b,0x5a,0xad,0x06,0x37,0xbb,0x20,0x74,0x79,0xf6,
0xba,0x5d,0x43,0x4d,0x50,0x0d,0x75,0x16,0x63,0x2f,0xc3,0xe8,0x3b,0xb9,0xa3,0x75,
0x08,0x5d,0x3c,0x1e,0x5d,0x85,0x12,0x2f,0xc2,0x46,0x11,0xd8,0xea,0x82,0xb8,0x78,
0x44,0x97,0xb1,0xe6,0xa0,0x8e,0xae,0x25,0x39,0x70,0xd1,0x98,0x4c,0x12,0x60,0x38,
0x3c,0x74,0xd4,0x00,0x67,0x2e,0x73,0xb6,0x51,0x1f,0xd8,0xdc,0x6d,0xec,0xf0,0x3a,
0xe8,0x2e,0xa6,0x62,0x25,0xdb,0x01,0xda,0xc3,0xc0,0x33,0x6b,0xbd,0x88,0x90,0x2d,
0x3c,0xdc,0x36,0x60,0x0b,0xb9,0x77,0x34,0xa9,0x3f,0xca,0x60,0xf0,0x32,0x58,0x94,
0x00,0xce,0x6a,0xf0,0x20,0x0c,0xe9,0xda,0x05,0x8a,0x3a,0x42,0xd3,0xbd,0xa3,0xe1,
0xa5,0x64,0x55,0x00,0x56,0x5d,0x90,0xd9,0x4c,0xfd,0x2c,0xe4,0x49,0x78,0x1b,0x74,
0x0d,0xba,0x1d,0xa6,0xd0,0x3d,0x83,0x32,0xf8,0xd2,0xe3,0x75,0x6b,0x14,0x0e,0x3c,
0xa0,0xe1,0xda,0xd1,0xa6,0x82,0x04,0x5d,0x80,0x9d,0x41,0x57,0x01,0x3b,0xd9,0x59,
0x73,0xed,0x60,0xa6,0x2e,0x40,0x1e,0x46,0x9f,0xe1,0xe0,0xc1,0xa8,0x28,0xdd,0x9d,
0xe0,0x02,0xfc,0x78,0x77,0xaf,0x0b,0x22,0xf5,0x17,0xd6,0xba,0x70,0xb3,0x31,0xde,
0x7b,0x0f,0xe4,0x2c,0xf2,0x4e,0xe8,0x32,0xe2,0x20,0x40,0xd7,0x34,0x61,0x94,0x4c,
0xa9,0x3f,0x29,0xc0,0xd9,0x97,0x1f,0xe4,0xd0,0x27,0x4a,0x7a,0x11,0x79,0x09,0x30,
0xd7,0x66,0x52,0x9a,0x68,0xc0,0xd4,0x07,0x56,0xfa,0x73,0xeb,0x48,0x53,0x44,0x11,
0xa8,0x8b,0xc8,0x8b,0x57,0x21,0x4e,0x1e,0xf1,0x2a,0x06,0xf7,0x80,0x61,0xc8,0x0c,
0xb0,0x1e,0xe6,0x51,0xb8,0xd9,0x97,0x1f,0xa6,0x30,0x27,0x27,0x74,0xed,0xbe,0x08,
0x5d,0x44,0x1c,0xfe,0x0e,0xdc,0x3a,0x54,0xdb,0xd2,0x9f,0x1c,0x85,0x73,0xeb,0x40,
0x53,0x45,0x3e,0xa2,0xc8,0x8b,0xf0,0x15,0xe8,0x22,0x6e,0x7d,0x2f,0xc3,0x30,0x4d,
0x59,0x03,0xa4,0x51,0xb8,0x99,0x4e,0x9d,0x2d,0x04,0xf1,0xba,0x41,0xf2,0xea,0xa5,
0xb0,0x01,0x83,0x6e,0x65,0x30,0x6d,0x30,0x60,0x29,0x40,0x72,0x81,0x2e,0x1d,0x66,
0xca,0x68,0xaf,0x46,0xe8,0xc2,0x69,0x1d,0xd4,0x1e,0x5e,0xc0,0xb9,0xe3,0x56,0x17,
0x44,0xea,0xaf,0x24,0x33,0xc0,0x79,0xf0,0x7e,0x88,0x62,0x47,0x63,0x0f,0x09,0x3c,
0x71,0x69,0x1a,0x19,0xe8,0x0f,0xe2,0x07,0x76,0x40,0xea,0xf3,0x23,0xbf,0x6a,0xb5,
0xbe,0xc3,0xd7,0xdd,0x5c,0x59,0x21,0xf5,0xad,0xac,0xa4,0x5d,0x1a,0x06,0x6e,0xb3,
0x00,0x89,0xc1,0xf0,0x70,0x46,0xe6,0xfa,0xdd,0x07,0x0e,0x98,0x37,0x36,0xde,0x95,
0x74,0x27,0xed,0x56,0x0d,0xc6,0x30,0x0d,0xee,0xc1,0xa1,0xf9,0x1a,0x2e,0x1d,0x64,
0xfa,0x48,0x28,0xe1,0xd1,0xc5,0xd7,0xe1,0xa1,0xef,0xce,0x71,0x8c,0xb6,0xa5,0xbf,
0x61,0x78,0x7e,0xe4,0x57,0xad,0x2e,0xf0,0x65,0xc3,0xd3,0xf8,0x00,0x7f,0xd2,0x1d,
0x97,0x5c,0xbb,0x81,0x02,0x04,0xf6,0x90,0x40,0xc3,0x9d,0x43,0x78,0x82,0x10,0xf1,
0xc6,0xdc,0x21,0xae,0xb8,0x33,0x8a,0xd4,0x06,0x01,0x62,0x17,0x98,0x22,0x88,0x2b,
0x47,0xf0,0x08,0xf5,0x88,0x62,0x8f,0x18,0xbc,0x92,0x76,0x69,0x26,0x2a,0x05,0x10,
0xce,0x00,0xe7,0x23,0x77,0x56,0x08,0xa4,0x95,0xf2,0xd2,0x57,0xae,0xc0,0x7d,0xc7,
0x70,0xe5,0x30,0xca,0x01,0x42,0x04,0x71,0xe5,0xf3,0x3d,0x43,0x4e,0xb2,0x07,0xd4,
0x21,0x87,0x87,0x69,0x77,0x06,0x15,0xd1,0x80,0x59,0x7f,0xf3,0x14,0x3d,0x00,0xc6,
0x0e,0xeb,0x2e,0x7d,0x78,0xe5,0x90,0x70,0xe4,0xce,0x61,0x28,0x83,0xc6,0x0c,0xc6,
0x95,0x8f,0xf7,0x10,0x0d,0xd0,0x1d,0x92,0x97,0xa6,0xed,0xf0,0x70,0xc9,0x95,0xa3,
0xb4,0xab,0xca,0x01,0xba,0xf2,0xf1,0x1e,0xa2,0xbb,0x42,0xe4,0x59,0x48,0xbb,0xf3,
0x0d,0x0d,0x8e,0x20,0xa5,0x99,0x2f,0xdb,0x4f,0x60,0x60,0x51,0x77,0x89,0x6e,0xae,
0x64,0x30,0x6d,0x19,0x80,0xe7,0x4e,0x7e,0xd5,0xea,0x9a,0xad,0x3d,0xa0,0x6f,0xff,
0xd0,0x9d,0x0c,0xc6,0x40,0x06,0x21,0x05,0x74,0xe5,0xc3,0x3d,0x45,0x38,0x2d,0xa5,
0x87,0xe4,0xed,0x5f,0xda,0xef,0xb8,0x72,0x14,0xe9,0x00,0xe7,0xcf,0x7c,0xab,0xd5,
0x0a,0x29,0x0f,0xb8,0xc3,0x1b,0xc0,0x9d,0x0c,0xc6,0x68,0x9b,0xc6,0x3c,0xca,0xaf,
0x5a,0xad,0x11,0x79,0xcc,0x1d,0xc2,0x95,0xa9,0xf8,0x6d,0x03,0x6b,0x30,0x86,0x1b,
0x1f,0xed,0x39,0x3a,0x97,0xf6,0x75,0xb8,0x33,0x8a,0x84,0x01,0xd8,0x98,0x47,0xf3,
0xad,0x56,0xf3,0x1a,0x79,0x57,0xf7,0xaf,0x1e,0xba,0x63,0x65,0x18,0x81,0x5d,0xf9,
0x60,0xcf,0xd1,0x3d,0xb4,0xc9,0xdb,0x8f,0xef,0xef,0xbb,0x95,0xc1,0x80,0x0d,0xcf,
0x27,0x76,0x88,0xb9,0xab,0x48,0x1e,0x6e,0x07,0xae,0x1c,0x04,0xe8,0x9b,0x4f,0xf3,
0xad,0x56,0xa3,0x52,0x78,0x44,0x5f,0x3c,0x1e,0x31,0x5c,0x39,0xca,0xdc,0xca,0xaf,
0xda,0x55,0xd4,0x5d,0x8d,0x23,0xf6,0x5d,0x19,0x46,0x87,0x00,0xec,0xc6,0xc7,0xfa,
0x02,0x3b,0xcc,0x1c,0xd3,0x17,0x3f,0x75,0xe7,0x64,0xc2,0x79,0xb5,0x5e,0xc0,0xa6,
0xa5,0x3d,0x60,0x2f,0x1e,0x77,0x65,0x14,0x69,0x7e,0xcd,0xb7,0x5a,0x8d,0xed,0xc7,
0x6d,0xf6,0x4e,0xe3,0x87,0x86,0xd7,0x0d,0x9a,0x35,0x2c,0x48,0xf6,0x4e,0xe3,0xc9,
0xd3,0x64,0x32,0xee,0x4a,0x17,0x6e,0x8e,0xed,0xb7,0x1a,0x42,0xee,0x92,0xf1,0x64,
0x92,0x1e,0x92,0x51,0xaf,0xdb,0x33,0x6b,0x88,0xc5,0x81,0xb8,0xd3,0xe4,0x29,0x92,
0x07,0x1c,0x6e,0x78,0xdd,0x9e,0x99,0xc3,0xc2,0x69,0x32,0xc9,0xdc,0xe1,0x3f,0xe2,
0x73,0x37,0x4c,0xe1,0x36,0x8a,0x16,0x77,0xc9,0x75,0xd8,0x7c,0x72,0xed,0x97,0xd9,
0xc1,0x90,0x02,0x47,0x72,0x7d,0x1d,0xd9,0x5b,0x5f,0xaf,0x78,0xdd,0x9e,0x99,0x43,
0x44,0x2a,0x8f,0x29,0x5c,0xf1,0xba,0x39,0x33,0x87,0x06,0xf1,0x06,0xd8,0x4e,0x6e,
0x6f,0xaf,0x27,0x7f,0xea,0x00,0x1f,0x10,0x5d,0x54,0x5e,0x12,0xc8,0x5b,0xdf,0x06,
0x0e,0x8f,0xa7,0x7d,0x69,0xc2,0xd9,0x47,0x1a,0x98,0x43,0xf2,0xb6,0xb7,0x8f,0x8f,
0xb7,0x8f,0x5d,0x9a,0x08,0x38,0xc7,0xe8,0x11,0x79,0x20,0xbd,0x75,0xa0,0x6f,0x7b,
0x7f,0x9e,0x7b,0x0b,0xae,0x20,0x01,0xd4,0x81,0xf4,0x8e,0xe5,0xa3,0x8f,0xae,0x1f,
0x36,0x1b,0x68,0x5f,0x21,0xe1,0x21,0x79,0x08,0x37,0x97,0x93,0x98,0x4f,0xe4,0x8f,
0x15,0x77,0x8b,0xb0,0xb9,0x33,0x8c,0x3e,0xcf,0x28,0xb0,0xe5,0x02,0x77,0x48,0x60,
0xd2,0xcd,0xf5,0x74,0xe6,0x12,0xed,0x43,0xe4,0x6d,0x91,0xd4,0xb7,0x78,0x76,0xf6,
0xd3,0x2e,0xdc,0x83,0x62,0x69,0x51,0x6a,0xef,0xec,0xec,0xec,0xf8,0xcc,0xc5,0xe5,
0x24,0xe6,0x14,0x39,0x62,0x4e,0x61,0xdf,0xeb,0xe6,0xcc,0x1c,0x8c,0xf8,0xd9,0xe2,
0x31,0x28,0x8f,0x71,0x3c,0xa3,0x8b,0xa3,0x79,0x88,0x81,0xad,0xbe,0xc7,0xcf,0x1e,
0x9f,0xe6,0xb5,0x6d,0xe7,0x03,0x6b,0x36,0x7b,0x67,0x8f,0x9d,0x9d,0xfc,0x5f,0x7b,
0x67,0xc3,0x94,0x38,0x0c,0x84,0xe1,0x2a,0xe8,0x20,0x9c,0x89,0x58,0xc1,0x1b,0x3a,
0xde,0xe5,0x14,0x11,0xfc,0xaa,0x28,0x3d,0x8f,0xb9,0xf3,0x80,0x02,0xff,0xff,0x2f,
0x5d,0x76,0x13,0x24,0x55,0x28,0x13,0x4f,0x28,0x6d,0xf7,0xa9,0xda,0x4e,0x28,0x4e,
0xe6,0x9d,0xcd,0x26,0xd9,0x7c,0x25,0x9d,0x9d,0xd4,0x71,0xd5,0x43,0xc3,0x03,0xf1,
0xe4,0xd5,0xa2,0x18,0x8c,0x2d,0x3f,0x95,0x76,0xf7,0xf2,0x57,0x42,0x2d,0x18,0x5b,
0x4e,0x18,0x5a,0x1e,0x20,0xff,0xae,0xfd,0x54,0x81,0xcc,0xf1,0x32,0x9d,0xb2,0xb9,
0x84,0xdd,0xa4,0xb3,0x93,0x3e,0xba,0x4c,0x16,0x5e,0xcd,0x80,0x51,0x17,0xce,0x96,
0x87,0x57,0xed,0x06,0xcc,0x65,0xeb,0x59,0xcb,0x95,0x65,0x0a,0x28,0x1d,0x68,0x27,
0xaf,0x41,0x31,0xe9,0xec,0xa4,0x0e,0xaf,0xa1,0xb5,0x93,0xea,0xb9,0x6e,0x83,0x82,
0xd0,0xb6,0x14,0x95,0x78,0x0a,0x46,0x41,0x68,0x5b,0x3a,0x6c,0xa0,0xb4,0xc3,0x1b,
0x05,0xa1,0x6d,0x29,0xdf,0xa3,0x74,0xa8,0x5e,0xe8,0x9e,0x27,0x9d,0x9d,0xd4,0xf1,
0xfb,0x4e,0x97,0x5d,0xa9,0x5e,0x28,0x7a,0x19,0x5d,0xb1,0xb1,0x46,0x6e,0xb4,0x78,
0x22,0x84,0x6b,0x23,0x67,0x53,0x67,0x8a,0xbe,0x1b,0x86,0xa1,0x12,0x4f,0x88,0x90,
0x82,0xd0,0xb6,0x04,0xcc,0xd5,0xda,0xc1,0xcf,0x61,0xd2,0xd9,0x49,0x1f,0xa7,0x73,
0xf5,0x84,0x70,0xb3,0xb1,0x53,0xe4,0x26,0x39,0x41,0xe1,0x10,0x47,0x38,0x9b,0x38,
0x9b,0x3a,0x5b,0x3c,0x82,0x72,0xa1,0x23,0xf0,0x72,0x4a,0x49,0x67,0x27,0x7d,0xf4,
0xc4,0x4c,0x3c,0xc7,0x11,0x8c,0x27,0x9d,0x9d,0xd4,0x31,0xd4,0xfb,0xa1,0xfe,0xc1,
0x9d,0x51,0xc9,0x01,0x12,0x9f,0x8b,0x07,0x9b,0xb8,0xbe,0xbd,0x02,0x3e,0x7f,0xe1,
0x4a,0xa7,0x65,0x72,0xb7,0x8c,0xff,0xa4,0x5f,0x6c,0x31,0x68,0x21,0xbf,0xc5,0x65,
0x8d,0x66,0x5d,0xbf,0x33,0xd2,0x69,0x6c,0xda,0x1d,0x66,0x66,0xaf,0xd7,0x4f,0xa1,
0x7f,0xec,0xc4,0xd1,0x50,0x23,0x6e,0x97,0x46,0x92,0x18,0x65,0x70,0xcb,0xa0,0x0f,
0xe2,0x15,0x63,0xd5,0x03,0xb5,0x8a,0x10,0x30,0x98,0x30,0x33,0xad,0x47,0xc3,0x98,
0x8a,0x49,0xbc,0xf1,0x29,0x0e,0x27,0x10,0x83,0x89,0x24,0xb9,0xb4,0x9a,0x10,0xe0,
0x5d,0x25,0x47,0xab,0x3d,0xaa,0xbc,0xa7,0x56,0x9a,0xaa,0x8f,0xcf,0xb9,0xef,0x57,
0xe0,0x61,0xb7,0x52,0xdc,0x15,0x98,0x14,0xd6,0x57,0xfe,0xf3,0x1c,0x30,0x52,0xa5,
0x71,0x8f,0x2f,0xf9,0x9c,0xf7,0x0f,0xf1,0x8d,0x5f,0xd2,0x4d,0x82,0x6e,0x30,0xfd,
0xa5,0xda,0xc6,0xa4,0x29,0xd5,0x22,0x7e,0xd9,0x05,0x25,0xda,0x71,0xb5,0x01,0x47,
0xff,0x28,0xca,0xfe,0x15,0x38,0xc0,0x7d,0x8c,0x9d,0xee,0xe1,0xd7,0x68,0x20,0x4e,
0x99,0xdf,0x11,0x8f,0x7f,0xe9,0x48,0x8b,0x75,0x0e,0x3a,0xaa,0xf3,0xf4,0x3a,0xa8,
0x29,0x19,0x60,0x0b,0x6a,0x82,0x55,0x53,0x22,0xb1,0xe6,0x65,0x9e,0xff,0x00,0xa2,
0xe9,0xc1,0x23,0x74,0x9b,0xb9,0x9f,0x0a,0xf3,0x38,0x73,0x69,0xb2,0x7b,0x01,0xe7,
0x0f,0x71,0xf9,0xa0,0x4f,0xb2,0x33,0x41,0x03,0xec,0xfb,0x05,0x78,0x5b,0x0f,0x1e,
0x61,0x6b,0x30,0xf7,0x53,0x61,0xf6,0x40,0x05,0x55,0x8f,0x0e,0x43,0x11,0x86,0xd2,
0xa0,0xbc,0x7d,0x78,0x88,0xfe,0x08,0x65,0x78,0x5c,0xdb,0x21,0xc0,0xa1,0x62,0x66,
0x3c,0xb9,0xac,0x6f,0x05,0x3f,0xc0,0x8b,0xa9,0xe2,0x7b,0x21,0x94,0x41,0x4d,0xdc,
0x25,0x6d,0x40,0x59,0x03,0x97,0xe0,0xfe,0x5d,0x7d,0x15,0x5a,0x83,0x83,0xbc,0xf7,
0x42,0xbe,0x81,0xfb,0xd3,0xb1,0x28,0x34,0xa8,0xc0,0x2f,0x8b,0x25,0xfa,0x35,0x7d,
0xff,0x19,0xee,0x7a,0x11,0x3a,0x38,0x40,0x37,0xef,0x15,0xc8,0x10,0x04,0xd1,0x27,
0xd4,0xb6,0x95,0x93,0x0b,0x96,0xd9,0x9f,0x2c,0xdb,0x65,0xb8,0xeb,0xc1,0x23,0xe8,
0xb6,0xb0,0xbc,0xdb,0x5f,0xdd,0xa8,0x51,0xd1,0xb8,0x2a,0xca,0xb1,0x89,0xf6,0xbb,
0x83,0xa8,0x8b,0x30,0xe8,0x5b,0x83,0x23,0xd1,0xf1,0xed,0x49,0x08,0x8d,0xc1,0xe4,
0x72,0xbe,0x1d,0x5c,0x83,0xb1,0x1d,0xab,0x80,0x1e,0x16,0xdc,0xbf,0xca,0xc9,0x89,
0x95,0x7d,0xb3,0x1d,0x6c,0x77,0xaf,0x3d,0x83,0xdb,0xce,0x29,0xc8,0xa0,0x47,0xd3,
0x1a,0x20,0x5c,0xe0,0x3f,0x41,0xd2,0xf1,0x8a,0x29,0x1a,0x01,0x9b,0xd7,0xdc,0x79,
0x06,0x9b,0x71,0x7a,0x42,0x5a,0x13,0x9e,0x2f,0x7d,0x0e,0x6d,0x6a,0x27,0x7e,0xbb,
0x58,0x0f,0xba,0x22,0x4e,0x6b,0x13,0x39,0xdc,0x6e,0x38,0x46,0x07,0xd8,0x25,0x14,
0x61,0xd4,0x52,0x76,0xd3,0xce,0xb0,0x06,0x6e,0xc7,0x4c,0x73,0xfe,0xaa,0x42,0x59,
0xb4,0x9b,0x84,0xef,0xdf,0xaa,0xea,0xf6,0xae,0x53,0x0d,0xaa,0x42,0xd9,0x14,0xc7,
0xee,0x86,0x33,0x1d,0xd5,0x27,0xc1,0x02,0xca,0xfd,0x92,0xfa,0x4e,0x9b,0x06,0x42,
0x7c,0x5d,0xed,0x82,0xe7,0x73,0x51,0x15,0xf1,0x22,0xbb,0x72,0x0d,0x9d,0x24,0xdc,
0x05,0x08,0xdd,0x40,0xa4,0xdd,0xb0,0x14,0x07,0xd1,0x06,0xdf,0xb3,0x4c,0x9a,0x44,
0x43,0xcd,0x0b,0xe9,0xd2,0x32,0x06,0xcd,0xed,0xa1,0xa9,0x0b,0x4e,0xcd,0xf0,0x6a,
0xcb,0x5a,0xd1,0x1a,0xb7,0x46,0x73,0x28,0x5f,0xe1,0x67,0x3a,0x24,0x0f,0xf4,0x38,
0xa6,0x55,0x8b,0xf7,0xcb,0xd5,0xdb,0x1f,0xbf,0x24,0x9b,0xe3,0xad,0xa3,0x7c,0xb6,
0x53,0x1b,0x8f,0x6b,0x70,0xcd,0xdc,0x5a,0xf0,0x65,0x58,0x19,0x2f,0xe0,0xe6,0xa0,
0x40,0xb6,0x47,0x24,0x45,0xe1,0xb9,0x33,0xbf,0xd6,0x73,0x28,0x48,0xa6,0x19,0x9a,
0x8e,0x90,0x3a,0xc0,0xd6,0x54,0x85,0x59,0x91,0x90,0x27,0xb4,0xa6,0x67,0xe8,0x27,
0x68,0x29,0x97,0x35,0x91,0xe9,0x32,0xb9,0x1f,0x81,0xb3,0xc7,0x9c,0x87,0x45,0x23,
0x70,0xf6,0x04,0xa6,0x03,0xcc,0xfd,0x08,0xc8,0x07,0x88,0x74,0xf7,0x28,0x84,0x6a,
0xcd,0x8d,0xa9,0x5f,0x33,0xe9,0xdc,0xa4,0x8f,0x5b,0x53,0xbf,0x46,0xd2,0xb9,0x49,
0x1f,0x9e,0x19,0x59,0x10,0xb4,0x9f,0x98,0x35,0xa7,0xa6,0x01,0xd2,0x7e,0x62,0xd6,
0x44,0xba,0x70,0xb4,0xa7,0xbb,0x35,0x17,0x66,0x0b,0x86,0xd1,0x28,0x88,0x2d,0x6a,
0x84,0x73,0x06,0x4d,0xc4,0xb7,0x26,0xd2,0x85,0xa3,0xc5,0xe8,0xd6,0x3c,0x99,0xfa,
0xd1,0x62,0x74,0x6b,0xae,0xcd,0xd1,0x25,0x9a,0x05,0x6d,0x4f,0xa4,0x0b,0x47,0x8b,
0xd1,0xad,0xa9,0x98,0xfa,0xc5,0x1e,0xcb,0xf5,0x0f,0xfb,0x6c,0xb9,0xdb,0x36,0x30,
0x01,0x00,

File diff suppressed because it is too large Load Diff

148
board/esd/hh405/u-boot.lds Normal file
View File

@@ -0,0 +1,148 @@
/*
* (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
*/
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
{
.resetvec 0xFFFFFFFC :
{
*(.resetvec)
} = 0xffff
/* 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 :
{
/* WARNING - the following is hand-optimized to fit within */
/* the sector layout of our flash chips! XXX FIXME XXX */
cpu/ppc4xx/start.o (.text)
cpu/ppc4xx/traps.o (.text)
cpu/ppc4xx/interrupts.o (.text)
cpu/ppc4xx/serial.o (.text)
cpu/ppc4xx/cpu_init.o (.text)
cpu/ppc4xx/speed.o (.text)
cpu/ppc4xx/405gp_enet.o (.text)
common/dlmalloc.o (.text)
lib_generic/crc32.o (.text)
lib_ppc/extable.o (.text)
lib_generic/zlib.o (.text)
/* . = env_offset;*/
/* common/environment.o(.text)*/
*(.text)
*(.fixup)
*(.got1)
}
_etext = .;
PROVIDE (etext = .);
.rodata :
{
*(.rodata)
*(.rodata1)
*(.rodata.str1.4)
}
.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 = .);
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
__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 = .);
}

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o
OBJS = $(BOARD).o flash.o ../common/misc.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)

View File

@@ -26,7 +26,8 @@
#include <command.h>
#include <malloc.h>
/* ------------------------------------------------------------------------- */
extern void lxt971_no_sleep(void);
int board_early_init_f (void)
@@ -60,8 +61,6 @@ int board_early_init_f (void)
}
/* ------------------------------------------------------------------------- */
int misc_init_f (void)
{
return 0; /* dummy implementation */
@@ -74,14 +73,10 @@ int misc_init_r (void)
volatile unsigned char *duart1_mcr = (unsigned char *)((ulong)DUART1_BA + 4);
volatile unsigned char *duart2_mcr = (unsigned char *)((ulong)DUART2_BA + 4);
volatile unsigned char *duart3_mcr = (unsigned char *)((ulong)DUART3_BA + 4);
/*
* Reset external DUARTs
*/
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_DUART_RST); /* set reset to high */
udelay(10); /* wait 10us */
out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_DUART_RST); /* set reset to low */
udelay(1000); /* wait 1ms */
volatile unsigned char *led_reg = (unsigned char *)((ulong)DUART0_BA + 0x20);
unsigned long val;
int delay, flashcnt;
char *str;
/*
* Enable interrupts in exar duart mcr[3]
@@ -91,12 +86,70 @@ int misc_init_r (void)
*duart2_mcr = 0x08;
*duart3_mcr = 0x08;
/*
* Set RS232/RS422 control (RS232 = high on GPIO)
*/
val = in32(GPIO0_OR);
val &= ~(CFG_UART2_RS232 | CFG_UART3_RS232 | CFG_UART4_RS232 | CFG_UART5_RS232);
str = getenv("phys0");
if (!str || (str && (str[0] == '0')))
val |= CFG_UART2_RS232;
str = getenv("phys1");
if (!str || (str && (str[0] == '0')))
val |= CFG_UART3_RS232;
str = getenv("phys2");
if (!str || (str && (str[0] == '0')))
val |= CFG_UART4_RS232;
str = getenv("phys3");
if (!str || (str && (str[0] == '0')))
val |= CFG_UART5_RS232;
out32(GPIO0_OR, val);
/*
* Set NAND-FLASH GPIO signals to default
*/
out32(GPIO0_OR, in32(GPIO0_OR) & ~(CFG_NAND_CLE | CFG_NAND_ALE));
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_NAND_CE);
/*
* check board type and setup AP power
*/
str = getenv("bd_type"); /* this is only set on non prototype hardware */
if (str != NULL) {
if ((strcmp(str, "swch405") == 0) || (strcmp(str, "hub405") == 0)) {
unsigned char led_reg_default = 0;
str = getenv("ap_pwr");
if (!str || (str && (str[0] == '1')))
led_reg_default = 0x04 | 0x02 ; /* U2_LED | AP_PWR */
/*
* Flash LEDs on SWCH405
*/
for (flashcnt = 0; flashcnt < 3; flashcnt++) {
*led_reg = led_reg_default; /* LED_A..D off */
for (delay = 0; delay < 100; delay++)
udelay(1000);
*led_reg = led_reg_default | 0xf0; /* LED_A..D on */
for (delay = 0; delay < 50; delay++)
udelay(1000);
}
*led_reg = led_reg_default;
}
}
/*
* Reset external DUARTs
*/
out32(GPIO0_OR, in32(GPIO0_OR) | CFG_DUART_RST); /* set reset to high */
udelay(10); /* wait 10us */
out32(GPIO0_OR, in32(GPIO0_OR) & ~CFG_DUART_RST); /* set reset to low */
udelay(1000); /* wait 1ms */
return (0);
}
@@ -104,7 +157,6 @@ int misc_init_r (void)
/*
* Check Board Identity:
*/
int checkboard (void)
{
unsigned char str[64];
@@ -120,10 +172,14 @@ int checkboard (void)
putc ('\n');
/*
* Disable sleep mode in LXT971
*/
lxt971_no_sleep();
return 0;
}
/* ------------------------------------------------------------------------- */
long int initdram (int board_type)
{
@@ -140,7 +196,6 @@ long int initdram (int board_type)
return (4*1024*1024 << ((val & 0x000e0000) >> 17));
}
/* ------------------------------------------------------------------------- */
int testdram (void)
{
@@ -150,7 +205,6 @@ int testdram (void)
return (0);
}
/* ------------------------------------------------------------------------- */
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
#include <linux/mtd/nand.h>

View File

@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o cmd_ocrtc.o
OBJS = $(BOARD).o flash.o ../common/misc.o cmd_ocrtc.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)

View File

@@ -27,7 +27,9 @@
#include <i2c.h>
#include <command.h>
/* ------------------------------------------------------------------------- */
extern void lxt971_no_sleep(void);
int board_early_init_f (void)
{
@@ -61,8 +63,6 @@ int board_early_init_f (void)
}
/* ------------------------------------------------------------------------- */
int misc_init_f (void)
{
return 0; /* dummy implementation */
@@ -72,7 +72,6 @@ int misc_init_f (void)
/*
* Check Board Identity:
*/
int checkboard (void)
{
unsigned char str[64];
@@ -93,10 +92,14 @@ int checkboard (void)
putc ('\n');
/*
* Disable sleep mode in LXT971
*/
lxt971_no_sleep();
return (0);
}
/* ------------------------------------------------------------------------- */
long int initdram (int board_type)
{
@@ -113,7 +116,6 @@ long int initdram (int board_type)
return (4 * 1024 * 1024 << ((val & 0x000e0000) >> 17));
}
/* ------------------------------------------------------------------------- */
int testdram (void)
{
@@ -122,5 +124,3 @@ int testdram (void)
return (0);
}
/* ------------------------------------------------------------------------- */

View File

@@ -25,10 +25,12 @@ include $(TOPDIR)/config.mk
LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o cmd_pci405.o
OBJS = $(BOARD).o flash.o ../common/misc.o cmd_pci405.o
SOBJS = writeibm.o
$(LIB): $(OBJS) $(SOBJS)
$(AR) crv $@ $(OBJS)
# $(AR) crv $@ $(OBJS)
$(AR) crv $@ $(OBJS) $(SOBJS)
clean:
rm -f $(SOBJS) $(OBJS)

View File

@@ -1,5 +1,5 @@
/*
* (C) Copyright 2002
* (C) Copyright 2002-2004
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
@@ -28,6 +28,7 @@
#include <asm/io.h>
#include <pci.h>
#include <405gp_pci.h>
#include <asm/processor.h>
#include "pci405.h"
@@ -35,6 +36,8 @@
#if (CONFIG_COMMANDS & CFG_CMD_BSP)
extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
extern int do_bootvx (cmd_tbl_t *, int, int, char *[]);
unsigned long get_dcr(unsigned short);
/*
@@ -94,15 +97,43 @@ int do_loadpci(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
} else {
sprintf(addr, "%08x", *ptr);
#if 0
/*
* Boot image
*/
printf("\nBooting image at addr 0x%s ...\n", addr);
if (*ptr & 0x00000001) {
/*
* Boot VxWorks image via bootvx
*/
addr[strlen(addr)-1] = '0';
printf("\nBooting VxWorks-Image at addr 0x%s ...\n", addr);
setenv("loadaddr", addr);
local_args[0] = argv[0];
local_args[1] = NULL;
status = do_bootvx (cmdtp, 0, 1, local_args);
} else {
/*
* Boot image via bootm (normally Linux)
*/
printf("\nBooting Image at addr 0x%s ...\n", addr);
setenv("loadaddr", addr);
local_args[0] = argv[0];
local_args[1] = NULL;
status = do_bootm (cmdtp, 0, 1, local_args);
}
#else
/*
* Boot image via bootm
*/
printf("\nBooting Image at addr 0x%s ...\n", addr);
setenv("loadaddr", addr);
local_args[0] = argv[0];
local_args[1] = NULL;
status = do_bootm (cmdtp, 0, 1, local_args);
#endif
}
return 0;
@@ -114,3 +145,841 @@ U_BOOT_CMD(
);
#endif
#if 1 /* test-only */
int do_getpci(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int val;
int i;
printf("\nPCI Configuration Regs for PPC405GP:");
for (i=0; i<0x64; i+=4) {
pci_read_config_dword(PCIDEVID_405GP, i, &val);
if (!(i % 0x10)) {
printf("\n%02x: ", i);
}
printf("%08x ", val);
}
printf("\n");
return 0;
}
U_BOOT_CMD(
getpci, 1, 1, do_getpci,
"getpci - Print own pci configuration registers\n",
NULL
);
int do_setpci(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int addr;
unsigned int val;
addr = simple_strtol (argv[1], NULL, 16);
val = simple_strtol (argv[2], NULL, 16);
printf("\nWriting %08x to PCI reg %08x.\n", val, addr);
pci_write_config_dword(PCIDEVID_405GP, addr, val);
return 0;
}
U_BOOT_CMD(
setpci, 3, 1, do_setpci,
"setpci - Set one pci configuration lword\n",
"<addr> <val>\n"
" - Write pci configuration lword <val> to <addr>.\n"
);
int do_dumpdcr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int i;
printf("\nDevice Configuration Registers (DCR's) for PPC405GP:");
for (i=0; i<=0x1e0; i++) {
if (!(i % 0x8)) {
printf("\n%04x ", i);
}
printf("%08lx ", get_dcr(i));
}
printf("\n");
return 0;
}
U_BOOT_CMD(
dumpdcr, 1, 1, do_dumpdcr,
"dumpdcr - Dump all DCR registers\n",
NULL
);
int do_dumpspr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
printf("\nSpecial Purpose Registers (SPR's) for PPC405GP:");
printf("\n%04x %08x ", 947, mfspr(947));
printf("\n%04x %08x ", 9, mfspr(9));
printf("\n%04x %08x ", 1014, mfspr(1014));
printf("\n%04x %08x ", 1015, mfspr(1015));
printf("\n%04x %08x ", 1010, mfspr(1010));
printf("\n%04x %08x ", 957, mfspr(957));
printf("\n%04x %08x ", 1008, mfspr(1008));
printf("\n%04x %08x ", 1018, mfspr(1018));
printf("\n%04x %08x ", 954, mfspr(954));
printf("\n%04x %08x ", 950, mfspr(950));
printf("\n%04x %08x ", 951, mfspr(951));
printf("\n%04x %08x ", 981, mfspr(981));
printf("\n%04x %08x ", 980, mfspr(980));
printf("\n%04x %08x ", 982, mfspr(982));
printf("\n%04x %08x ", 1012, mfspr(1012));
printf("\n%04x %08x ", 1013, mfspr(1013));
printf("\n%04x %08x ", 948, mfspr(948));
printf("\n%04x %08x ", 949, mfspr(949));
printf("\n%04x %08x ", 1019, mfspr(1019));
printf("\n%04x %08x ", 979, mfspr(979));
printf("\n%04x %08x ", 8, mfspr(8));
printf("\n%04x %08x ", 945, mfspr(945));
printf("\n%04x %08x ", 987, mfspr(987));
printf("\n%04x %08x ", 287, mfspr(287));
printf("\n%04x %08x ", 953, mfspr(953));
printf("\n%04x %08x ", 955, mfspr(955));
printf("\n%04x %08x ", 272, mfspr(272));
printf("\n%04x %08x ", 273, mfspr(273));
printf("\n%04x %08x ", 274, mfspr(274));
printf("\n%04x %08x ", 275, mfspr(275));
printf("\n%04x %08x ", 260, mfspr(260));
printf("\n%04x %08x ", 276, mfspr(276));
printf("\n%04x %08x ", 261, mfspr(261));
printf("\n%04x %08x ", 277, mfspr(277));
printf("\n%04x %08x ", 262, mfspr(262));
printf("\n%04x %08x ", 278, mfspr(278));
printf("\n%04x %08x ", 263, mfspr(263));
printf("\n%04x %08x ", 279, mfspr(279));
printf("\n%04x %08x ", 26, mfspr(26));
printf("\n%04x %08x ", 27, mfspr(27));
printf("\n%04x %08x ", 990, mfspr(990));
printf("\n%04x %08x ", 991, mfspr(991));
printf("\n%04x %08x ", 956, mfspr(956));
printf("\n%04x %08x ", 284, mfspr(284));
printf("\n%04x %08x ", 285, mfspr(285));
printf("\n%04x %08x ", 986, mfspr(986));
printf("\n%04x %08x ", 984, mfspr(984));
printf("\n%04x %08x ", 256, mfspr(256));
printf("\n%04x %08x ", 1, mfspr(1));
printf("\n%04x %08x ", 944, mfspr(944));
printf("\n");
return 0;
}
U_BOOT_CMD(
dumpspr, 1, 1, do_dumpspr,
"dumpspr - Dump all SPR registers\n",
NULL
);
#define PCI0_BRDGOPT1 0x4a
#define plb0_acr 0x87
int do_getplb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned short val;
printf("PLB0_ACR=%08lx\n", get_dcr(0x87));
pci_read_config_word(PCIDEVID_405GP, PCI0_BRDGOPT1, &val);
printf("PCI0_BRDGOPT1=%04x\n", val);
printf("CCR0=%08x\n", mfspr(ccr0));
return 0;
}
U_BOOT_CMD(
getplb, 1, 1, do_getplb,
"getplb - Dump all plb arbiter registers\n",
NULL
);
int do_setplb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int my_acr;
unsigned int my_brdgopt1;
unsigned int my_ccr0;
my_acr = simple_strtol (argv[1], NULL, 16);
my_brdgopt1 = simple_strtol (argv[2], NULL, 16);
my_ccr0 = simple_strtol (argv[3], NULL, 16);
mtdcr(plb0_acr, my_acr);
pci_write_config_word(PCIDEVID_405GP, PCI0_BRDGOPT1, my_brdgopt1);
mtspr(ccr0, my_ccr0);
return 0;
}
U_BOOT_CMD(
setplb, 4, 1, do_setplb,
"setplb - Set all plb arbiter registers\n",
"PLB0_ACR PCI0_BRDGOPT1 CCR0\n"
" - Set all plb arbiter registers\n"
);
/***********************************************************************
*
* The following code is only for test purposes!!!!
* Please ignore this ugly stuff!!!!!!!!!!!!!!!!!!!
*
***********************************************************************/
#define PCI_ADDR 0xc0000000
int do_writepci(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int addr;
unsigned int size;
unsigned int countmax;
int i;
int max;
volatile unsigned long *ptr;
volatile unsigned long val;
int loopcount = 0;
int test_pci_read = 0;
int test_pci_cfg_write = 0;
int test_sync = 0;
int test_pci_pre_read = 0;
addr = simple_strtol (argv[1], NULL, 16);
size = simple_strtol (argv[2], NULL, 16);
countmax = simple_strtol (argv[3], NULL, 16);
if (countmax == 0)
countmax = 1000;
do_getplb(NULL, 0, 0, NULL);
#if 0
out32r(PMM0LA, 0);
out32r(PMM0PCILA, 0);
out32r(PMM0PCIHA, 0);
out32r(PMM0MA, 0);
out32r(PMM1LA, PCI_ADDR);
out32r(PMM1PCILA, addr & 0xff000000);
out32r(PMM1PCIHA, 0x00000000);
out32r(PMM1MA, 0xff000001);
#endif
printf("PMM1LA =%08lx\n", in32r(PMM1LA));
printf("PMM1MA =%08lx\n", in32r(PMM1MA));
printf("PMM1PCILA =%08lx\n", in32r(PMM1PCILA));
printf("PMM1PCIHA =%08lx\n", in32r(PMM1PCIHA));
addr = PCI_ADDR | (addr & 0x00ffffff);
printf("\nWriting at addr %08x, size %08x (countmax=%x)\n", addr, size, countmax);
max = size >> 2;
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
val = *(ulong *)0x00000000;
if (val & 0x00000008) {
test_pci_pre_read = 1;
printf("Running test with pre pci-memory-read access!\n");
}
if (val & 0x00000004) {
test_sync = 1;
printf("Running test with sync instruction!\n");
}
if (val & 0x00000001) {
test_pci_read = 1;
printf("Running test with pci-memory-read access!\n");
}
if (val & 0x00000002) {
test_pci_cfg_write = 1;
printf("Running test with pci-config-write access!\n");
}
while (1) {
if (test_pci_pre_read) {
/*
* Read one value back
*/
ptr = (volatile unsigned long *)addr;
val = *ptr;
}
/*
* Write some values to host via pci busmastering
*/
ptr = (volatile unsigned long *)addr;
for (i=0; i<max; i++) {
*ptr++ = i;
}
if (test_sync) {
/*
* Sync previous writes
*/
ppcSync();
}
if (test_pci_read) {
/*
* Read one value back
*/
ptr = (volatile unsigned long *)addr;
val = *ptr;
}
if (test_pci_cfg_write) {
/*
* Generate IRQ to host via config regs
*/
pci_write_config_byte(PCIDEVID_405GP, 0x44, 0x00);
}
if (loopcount++ > countmax) {
/* Abort if ctrl-c was pressed */
if (ctrlc()) {
puts("\nAbort\n");
return 0;
}
putc('.');
loopcount = 0;
}
}
return 0;
}
U_BOOT_CMD(
writepci, 4, 1, do_writepci,
"writepci - Write some data to pcibus\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
#define PCI_CFGADDR 0xeec00000
#define PCI_CFGDATA 0xeec00004
int ibmPciConfigWrite
(
int offset, /* offset into the configuration space */
int width, /* data width */
unsigned int data /* data to be written */
)
{
/*
* Write config register address to the PCI config address register
* bit 31 must be 1 and bits 1:0 must be 0 (note LE bit notation)
*/
out32r(PCI_CFGADDR, 0x80000000 | (offset & 0xFFFFFFFC));
#if 0 /* test-only */
ppcSync();
#endif
/*
* Write value to be written to the PCI config data register
*/
switch ( width ) {
case 1: out32r(PCI_CFGDATA | (offset & 0x3), (unsigned char)(data & 0xFF));
break;
case 2: out32r(PCI_CFGDATA | (offset & 0x3), (unsigned short)(data & 0xFFFF));
break;
case 4: out32r(PCI_CFGDATA | (offset & 0x3), data);
break;
}
return (0);
}
int do_writepci2(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int addr;
unsigned int size;
unsigned int countmax;
int max;
volatile unsigned long *ptr;
volatile unsigned long val;
int loopcount = 0;
addr = simple_strtol (argv[1], NULL, 16);
size = simple_strtol (argv[2], NULL, 16);
countmax = simple_strtol (argv[3], NULL, 16);
if (countmax == 0)
countmax = 1000;
do_getplb(NULL, 0, 0, NULL);
#if 0
out32r(PMM0LA, 0);
out32r(PMM0PCILA, 0);
out32r(PMM0PCIHA, 0);
out32r(PMM0MA, 0);
out32r(PMM1LA, PCI_ADDR);
out32r(PMM1PCILA, addr & 0xff000000);
out32r(PMM1PCIHA, 0x00000000);
out32r(PMM1MA, 0xff000001);
#endif
printf("PMM1LA =%08lx\n", in32r(PMM1LA));
printf("PMM1MA =%08lx\n", in32r(PMM1MA));
printf("PMM1PCILA =%08lx\n", in32r(PMM1PCILA));
printf("PMM1PCIHA =%08lx\n", in32r(PMM1PCIHA));
addr = PCI_ADDR | (addr & 0x00ffffff);
printf("\nWriting at addr %08x, size %08x (countmax=%x)\n", addr, size, countmax);
max = size >> 2;
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
while (1) {
/*
* Write one values to host via pci busmastering
*/
ptr = (volatile unsigned long *)addr;
*ptr = 0x01234567;
/*
* Read one value back
*/
ptr = (volatile unsigned long *)addr;
val = *ptr;
/*
* One pci config write
*/
/* pci_write_config_byte(PCIDEVID_405GP, 0x44, 0x00); */
/* ibmPciConfigWrite(0x44, 1, 0x00); */
ibmPciConfigWrite(0x2e, 2, 0x1234); /* subsystem id */
if (loopcount++ > countmax) {
/* Abort if ctrl-c was pressed */
if (ctrlc()) {
puts("\nAbort\n");
return 0;
}
putc('.');
loopcount = 0;
}
}
return 0;
}
U_BOOT_CMD(
writepci2, 4, 1, do_writepci2,
"writepci2- Write some data to pcibus\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
int do_writepci22(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int addr;
unsigned int size;
unsigned int countmax = 0;
volatile unsigned long *ptr;
volatile unsigned long val;
addr = simple_strtol (argv[1], NULL, 16);
size = simple_strtol (argv[2], NULL, 16);
addr = PCI_ADDR | (addr & 0x00ffffff);
printf("\nWriting at addr %08x, size %08x (countmax=%x)\n", addr, size, countmax);
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
while (1) {
/*
* Write one values to host via pci busmastering
*/
ptr = (volatile unsigned long *)addr;
*ptr = 0x01234567;
/*
* Read one value back
*/
ptr = (volatile unsigned long *)addr;
val = *ptr;
/*
* One pci config write
*/
ibmPciConfigWrite(0x2e, 2, 0x1234); /* subsystem id */
}
return 0;
}
U_BOOT_CMD(
writepci22, 4, 1, do_writepci22,
"writepci22- Write some data to pcibus\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
int ibmPciConfigWrite3
(
int offset, /* offset into the configuration space */
int width, /* data width */
unsigned int data /* data to be written */
)
{
/*
* Write config register address to the PCI config address register
* bit 31 must be 1 and bits 1:0 must be 0 (note LE bit notation)
*/
out32r(PCI_CFGADDR, 0x80000000 | (offset & 0xFFFFFFFC));
#if 1 /* test-only */
ppcSync();
#endif
/*
* Write value to be written to the PCI config data register
*/
switch ( width ) {
case 1: out32r(PCI_CFGDATA | (offset & 0x3), (unsigned char)(data & 0xFF));
break;
case 2: out32r(PCI_CFGDATA | (offset & 0x3), (unsigned short)(data & 0xFFFF));
break;
case 4: out32r(PCI_CFGDATA | (offset & 0x3), data);
break;
}
return (0);
}
int do_writepci3(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int addr;
unsigned int size;
unsigned int countmax;
int max;
volatile unsigned long *ptr;
volatile unsigned long val;
int loopcount = 0;
addr = simple_strtol (argv[1], NULL, 16);
size = simple_strtol (argv[2], NULL, 16);
countmax = simple_strtol (argv[3], NULL, 16);
if (countmax == 0)
countmax = 1000;
do_getplb(NULL, 0, 0, NULL);
#if 0
out32r(PMM0LA, 0);
out32r(PMM0PCILA, 0);
out32r(PMM0PCIHA, 0);
out32r(PMM0MA, 0);
out32r(PMM1LA, PCI_ADDR);
out32r(PMM1PCILA, addr & 0xff000000);
out32r(PMM1PCIHA, 0x00000000);
out32r(PMM1MA, 0xff000001);
#endif
printf("PMM1LA =%08lx\n", in32r(PMM1LA));
printf("PMM1MA =%08lx\n", in32r(PMM1MA));
printf("PMM1PCILA =%08lx\n", in32r(PMM1PCILA));
printf("PMM1PCIHA =%08lx\n", in32r(PMM1PCIHA));
addr = PCI_ADDR | (addr & 0x00ffffff);
printf("\nWriting at addr %08x, size %08x (countmax=%x)\n", addr, size, countmax);
max = size >> 2;
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
while (1) {
/*
* Write one values to host via pci busmastering
*/
ptr = (volatile unsigned long *)addr;
*ptr = 0x01234567;
/*
* Read one value back
*/
ptr = (volatile unsigned long *)addr;
val = *ptr;
/*
* One pci config write
*/
/* pci_write_config_byte(PCIDEVID_405GP, 0x44, 0x00); */
/* ibmPciConfigWrite(0x44, 1, 0x00); */
ibmPciConfigWrite3(0x2e, 2, 0x1234); /* subsystem id */
if (loopcount++ > countmax) {
/* Abort if ctrl-c was pressed */
if (ctrlc()) {
puts("\nAbort\n");
return 0;
}
putc('.');
loopcount = 0;
}
}
return 0;
}
U_BOOT_CMD(
writepci3, 4, 1, do_writepci3,
"writepci3- Write some data to pcibus\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
#define SECTOR_SIZE 32 /* 32 byte cache line */
#define SECTOR_MASK 0x1F
void my_flush_dcache(ulong lcl_addr, ulong count)
{
unsigned int lcl_target;
/* promote to nearest cache sector */
lcl_target = (lcl_addr + count + SECTOR_SIZE - 1) & ~SECTOR_MASK;
lcl_addr &= ~SECTOR_MASK;
while (lcl_addr != lcl_target)
{
/* ppcDcbf((void *)lcl_addr);*/
__asm__("dcbf 0,%0": :"r" (lcl_addr));
lcl_addr += SECTOR_SIZE;
}
__asm__("sync"); /* Always flush prefetch queue in any case */
}
int do_writepci_cache(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int addr;
unsigned int size;
unsigned int countmax;
int i;
volatile unsigned long *ptr;
volatile unsigned long val;
int loopcount = 0;
addr = simple_strtol (argv[1], NULL, 16);
size = simple_strtol (argv[2], NULL, 16);
countmax = simple_strtol (argv[3], NULL, 16);
if (countmax == 0)
countmax = 1000;
do_getplb(NULL, 0, 0, NULL);
#if 0
out32r(PMM0LA, 0);
out32r(PMM0PCILA, 0);
out32r(PMM0PCIHA, 0);
out32r(PMM0MA, 0);
out32r(PMM1LA, PCI_ADDR);
out32r(PMM1PCILA, addr & 0xff000000);
out32r(PMM1PCIHA, 0x00000000);
out32r(PMM1MA, 0xff000001);
#endif
printf("PMM1LA =%08lx\n", in32r(PMM1LA));
printf("PMM1MA =%08lx\n", in32r(PMM1MA));
printf("PMM1PCILA =%08lx\n", in32r(PMM1PCILA));
printf("PMM1PCIHA =%08lx\n", in32r(PMM1PCIHA));
addr = PCI_ADDR | (addr & 0x00ffffff);
printf("\nWriting at addr %08x, size %08x (countmax=%x)\n", addr, size, countmax);
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
i = 0;
/*
* Set pci region as cachable
*/
ppcSync();
__asm__ volatile (" addis 4,0,0x0000 ");
__asm__ volatile (" addi 4,4,0x0080 ");
__asm__ volatile (" mtdccr 4 ");
ppcSync();
while (1) {
/*
* Write one values to host via pci busmastering
*/
ptr = (volatile unsigned long *)addr;
printf("A\n"); /* test-only */
*ptr++ = i++;
*ptr++ = i++;
*ptr++ = i++;
*ptr++ = i++;
*ptr++ = i++;
*ptr++ = i++;
*ptr++ = i++;
*ptr++ = i++;
printf("B\n"); /* test-only */
my_flush_dcache(addr, 32);
printf("C\n"); /* test-only */
/*
* Read one value back
*/
ptr = (volatile unsigned long *)addr;
val = *ptr;
printf("D\n"); /* test-only */
/*
* One pci config write
*/
/* pci_write_config_byte(PCIDEVID_405GP, 0x44, 0x00); */
/* ibmPciConfigWrite(0x44, 1, 0x00); */
ibmPciConfigWrite3(0x2e, 2, 0x1234); /* subsystem id */
printf("E\n"); /* test-only */
if (loopcount++ > countmax) {
/* Abort if ctrl-c was pressed */
if (ctrlc()) {
puts("\nAbort\n");
return 0;
}
putc('.');
loopcount = 0;
}
}
return 0;
}
U_BOOT_CMD(
writepci_cache, 4, 1, do_writepci_cache,
"writepci_cache - Write some data to pcibus\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
int do_savepci(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int *ptr;
int i;
/*
* Save own pci configuration in PRAM
*/
memset((char *)PCI_REGS_ADDR, 0, PCI_REGS_LEN);
ptr = (unsigned int *)PCI_REGS_ADDR + 1;
for (i=0; i<0x40; i+=4) {
pci_read_config_dword(PCIDEVID_405GP, i, ptr++);
}
ptr = (unsigned int *)PCI_REGS_ADDR;
*ptr = crc32(0, (char *)PCI_REGS_ADDR+4, PCI_REGS_LEN-4);
printf("\nStoring PCI Configuration Regs...\n");
return 0;
}
U_BOOT_CMD(
savepci, 4, 1, do_savepci,
"savepci - Save all pci regs\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
int do_restorepci(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned int *ptr;
int i;
/*
* Rewrite pci config regs (only after soft-reset with magic set)
*/
ptr = (unsigned int *)PCI_REGS_ADDR;
if (crc32(0, (char *)PCI_REGS_ADDR+4, PCI_REGS_LEN-4) == *ptr) {
puts("Restoring PCI Configurations Regs!\n");
ptr = (unsigned int *)PCI_REGS_ADDR + 1;
for (i=0; i<0x40; i+=4) {
pci_write_config_dword(PCIDEVID_405GP, i, *ptr++);
}
}
mtdcr(uicsr, 0xFFFFFFFF); /* clear all ints */
return 0;
}
U_BOOT_CMD(
restorepci, 4, 1, do_restorepci,
"restorepci - Restore all pci regs\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
extern void write_without_sync(void);
extern void write_with_sync(void);
extern void write_with_less_sync(void);
extern void write_with_more_sync(void);
/*
* code from IBM-PPCSUPP
*/
int do_writeibm1(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
write_without_sync();
return 0;
}
U_BOOT_CMD(
writeibm1, 4, 1, do_writeibm1,
"writeibm1- Write some data to pcibus (without sync)\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
int do_writeibm2(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
write_with_sync();
return 0;
}
U_BOOT_CMD(
writeibm2, 4, 1, do_writeibm2,
"writeibm2- Write some data to pcibus (with sync)\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
int do_writeibm22(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
write_with_less_sync();
return 0;
}
U_BOOT_CMD(
writeibm22, 4, 1, do_writeibm22,
"writeibm22- Write some data to pcibus (with less sync)\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
int do_writeibm3(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
pci_write_config_word(PCIDEVID_405GP, 0x04, 0x0106); /* write command reg */
write_with_more_sync();
return 0;
}
U_BOOT_CMD(
writeibm3, 4, 1, do_writeibm3,
"writeibm3- Write some data to pcibus (with more sync)\n",
"<addr> <size>\n"
" - Write some data to pcibus.\n"
);
#endif

View File

@@ -1,5 +1,5 @@
/*
* (C) Copyright 2001
* (C) Copyright 2001-2004
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
*
* See file CREDITS for list of people who contributed to this
@@ -31,12 +31,20 @@
#include "pci405.h"
/* ------------------------------------------------------------------------- */
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);/*cmd_boot.c*/
/* Prototypes */
int gunzip(void *, int, unsigned char *, unsigned long *);
int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);/*cmd_boot.c*/
unsigned long fpga_done_state(void);
unsigned long fpga_init_state(void);
#if 0
#define FPGA_DEBUG
#endif
/* predefine these here */
#define FPGA_DONE_STATE (fpga_done_state())
#define FPGA_INIT_STATE (fpga_init_state())
/* fpga configuration data - generated by bin2cc */
const unsigned char fpgadata[] =
{
@@ -48,15 +56,95 @@ const unsigned char fpgadata[] =
*/
#include "../common/fpga.c"
#define FPGA_DONE_STATE_V11 (in32(GPIO0_IR) & CFG_FPGA_DONE)
#define FPGA_DONE_STATE_V12 (in32(GPIO0_IR) & CFG_FPGA_DONE_V12)
/* Prototypes */
int gunzip(void *, int, unsigned char *, unsigned long *);
#define FPGA_INIT_STATE_V11 (in32(GPIO0_IR) & CFG_FPGA_INIT)
#define FPGA_INIT_STATE_V12 (in32(GPIO0_IR) & CFG_FPGA_INIT_V12)
int board_revision(void)
{
unsigned long cntrl0Reg;
unsigned long value;
/*
* Get version of PCI405 board from GPIO's
*/
/*
* Setup GPIO pins (CS2/GPIO11 and CS3/GPIO12 as GPIO)
*/
cntrl0Reg = mfdcr(cntrl0);
mtdcr(cntrl0, cntrl0Reg | 0x03000000);
out32(GPIO0_ODR, in32(GPIO0_ODR) & ~0x00180000);
out32(GPIO0_TCR, in32(GPIO0_TCR) & ~0x00180000);
udelay(1000); /* wait some time before reading input */
value = in32(GPIO0_IR) & 0x00180000; /* get config bits */
/*
* Restore GPIO settings
*/
mtdcr(cntrl0, cntrl0Reg);
switch (value) {
case 0x00180000:
/* CS2==1 && CS3==1 -> version 1.0 and 1.1 */
return 1;
case 0x00080000:
/* CS2==0 && CS3==1 -> version 1.2 */
return 2;
#if 0 /* not yet manufactured ! */
case 0x00100000:
/* CS2==1 && CS3==0 -> version 1.3 */
return 3;
case 0x00000000:
/* CS2==0 && CS3==0 -> version 1.4 */
return 4;
#endif
default:
/* should not be reached! */
return 0;
}
}
unsigned long fpga_done_state(void)
{
DECLARE_GLOBAL_DATA_PTR;
if (gd->board_type < 2) {
return FPGA_DONE_STATE_V11;
} else {
return FPGA_DONE_STATE_V12;
}
}
unsigned long fpga_init_state(void)
{
DECLARE_GLOBAL_DATA_PTR;
if (gd->board_type < 2) {
return FPGA_INIT_STATE_V11;
} else {
return FPGA_INIT_STATE_V12;
}
}
int board_early_init_f (void)
{
unsigned long cntrl0Reg;
/*
* First pull fpga-prg pin low, to disable fpga logic (on version 1.2 board)
*/
out32(GPIO0_ODR, 0x00000000); /* no open drain pins */
out32(GPIO0_TCR, CFG_FPGA_PRG); /* setup for output */
out32(GPIO0_OR, CFG_FPGA_PRG); /* set output pins to high */
out32(GPIO0_OR, 0); /* pull prg low */
/*
* IRQ 0-15 405GP internally generated; active high; level sensitive
* IRQ 16 405GP internally generated; active low; level sensitive
@@ -83,6 +171,11 @@ int board_early_init_f (void)
cntrl0Reg = mfdcr(cntrl0);
mtdcr(cntrl0, cntrl0Reg | 0x00008000);
/*
* Setup GPIO pins (CS6+CS7 as GPIO)
*/
mtdcr(cntrl0, cntrl0Reg | 0x00300000);
/*
* EBC Configuration Register: set ready timeout to 512 ebc-clks -> ca. 25 us
*/
@@ -194,6 +287,28 @@ int misc_init_r (void)
*magic = 0; /* clear pci reconfig magic again */
}
#if 1 /* test-only */
/*
* Decrease PLB latency timeout and reduce priority of the PCI bridge master
*/
#define PCI0_BRDGOPT1 0x4a
pci_write_config_word(PCIDEVID_405GP, PCI0_BRDGOPT1, 0x3f20);
/* pci_write_config_word(PCIDEVID_405GP, PCI0_BRDGOPT1, 0x3f60); */
#define plb0_acr 0x87
/*
* Enable fairness and high bus utilization
*/
mtdcr(plb0_acr, 0x98000000);
#if 0 /* test-only */
printf("CCR0=%08x\n", mfspr(ccr0)); /* test-only */
/* mtspr(ccr0, (mfspr(ccr0) & 0xff8fffff) | 0x00100000); */
mtspr(ccr0, (mfspr(ccr0) & 0xff8fffff) | 0x00000000);
#endif
/* printf("CCR0=%08x\n", mfspr(ccr0));*/ /* test-only */
#endif
free(dst);
return (0);
}
@@ -205,6 +320,8 @@ int misc_init_r (void)
int checkboard (void)
{
DECLARE_GLOBAL_DATA_PTR;
unsigned char str[64];
int i = getenv_r ("serial#", str, sizeof(str));
@@ -215,7 +332,31 @@ int checkboard (void)
} else {
puts (str);
}
putc ('\n');
gd->board_type = board_revision();
printf(" (Rev 1.%ld", gd->board_type);
if (gd->board_type >= 2) {
unsigned long cntrl0Reg;
unsigned long value;
/*
* Setup GPIO pins (Trace/GPIO1 to GPIO)
*/
cntrl0Reg = mfdcr(cntrl0);
mtdcr(cntrl0, cntrl0Reg & ~0x08000000);
out32(GPIO0_ODR, in32(GPIO0_ODR) & ~0x40000000);
out32(GPIO0_TCR, in32(GPIO0_TCR) & ~0x40000000);
udelay(1000); /* wait some time before reading input */
value = in32(GPIO0_IR) & 0x40000000; /* get config bits */
if (value) {
puts(", 33 MHz PCI");
} else {
puts(", 66 Mhz PCI");
}
}
puts(")\n");
return 0;
}

Some files were not shown because too many files have changed in this diff Show More