mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-06 03:36:40 +03:00
Compare commits
11 Commits
LABEL_2003
...
LABEL_2003
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71f9511803 | ||
|
|
487778b781 | ||
|
|
8b601449e8 | ||
|
|
e58dc13283 | ||
|
|
a3ed3996cd | ||
|
|
73a8b27c57 | ||
|
|
08eaea9c9f | ||
|
|
53cf9435cc | ||
|
|
c602883592 | ||
|
|
3720878599 | ||
|
|
f3e0de60a6 |
39
CHANGELOG
39
CHANGELOG
@@ -2,6 +2,45 @@
|
||||
Changes since U-Boot 0.3.1:
|
||||
======================================================================
|
||||
|
||||
* Fix CONFIG_NET_MULTI support in include/net.h
|
||||
|
||||
* Patches by Kyle Harris, 13 Mar 2003:
|
||||
- Add FAT partition support
|
||||
- Add command support for FAT
|
||||
- Add command support for MMC
|
||||
----
|
||||
- Add Intel PXA support for video
|
||||
- Add Intel PXA support for MMC
|
||||
----
|
||||
- Enable MMC and FAT for lubbock board
|
||||
- Other misc changes for lubbock board
|
||||
|
||||
* Patch by Robert Schwebel, April 02, 2003:
|
||||
fix for SMSC91111 driver
|
||||
|
||||
* Patch by Vladimir Gurevich, 04 Jun 2003:
|
||||
make ppc405 ethernet driver compatible with CONFIG_NET_MULTI option
|
||||
|
||||
* Patch by Stefan Roese, 05 Jun 2003:
|
||||
- PPC4xx: Fix bug for initial stack in data cache as pointed out by
|
||||
Thomas Schaefer (tschaefer@giga-stream.de). Now inital stack in
|
||||
data cache can be used even if the chip select is in use.
|
||||
- CFG_RX_ETH_BUFFER added to set the ethernet receive buffer count
|
||||
(see README for further description).
|
||||
- Changed config files of CONFIG_EEPRO100 boards to use the
|
||||
CFG_RX_ETH_BUFFER define.
|
||||
|
||||
* Add support for RMU board
|
||||
|
||||
* Add support for TQM862L at 100/50 MHz
|
||||
|
||||
* Patch by Pantelis Antoniou, 02 Jun 2003:
|
||||
major reconstruction of networking code;
|
||||
add "ping" support (outgoing only!)
|
||||
|
||||
* Patch by Denis Peter, 04 June 2003:
|
||||
add support for the MIP405T board
|
||||
|
||||
* Patches by Udi Finkelstein, 2 June 2003:
|
||||
- Added support for custom keyboards, initialized by defining a
|
||||
board-specific drv_keyboard_init as well as defining CONFIG_KEYBOARD .
|
||||
|
||||
@@ -63,6 +63,9 @@ Wolfgang Denk <wd@denx.de>
|
||||
IVMS8_128 MPC860
|
||||
IVMS8_256 MPC860
|
||||
LANTEC MPC850
|
||||
LWMON MPC823
|
||||
R360MPI MPC823
|
||||
RMU MPC850
|
||||
RRvision MPC823
|
||||
SM850 MPC850
|
||||
SPD823TS MPC823
|
||||
@@ -72,6 +75,7 @@ Wolfgang Denk <wd@denx.de>
|
||||
TQM855L MPC855
|
||||
TQM860L MPC860
|
||||
TQM860L_FEC MPC860
|
||||
TTTech MPC823
|
||||
c2mon MPC855
|
||||
hermes MPC860
|
||||
lwmon MPC823
|
||||
|
||||
16
MAKEALL
16
MAKEALL
@@ -32,11 +32,11 @@ LIST_8xx=" \
|
||||
IVMS8 IVMS8_128 IVMS8_256 KUP4K \
|
||||
LANTEC lwmon MBX MBX860T \
|
||||
MHPC MVS1 NETVIA NX823 \
|
||||
pcu_e R360MPI RBC823 RPXClassic \
|
||||
RPXlite RRvision SM850 SPD823TS \
|
||||
svm_sc8xx SXNI855T TOP860 TQM823L \
|
||||
TQM823L_LCD TQM850L TQM855L TQM860L \
|
||||
TTTech v37 \
|
||||
pcu_e R360MPI RBC823 rmu \
|
||||
RPXClassic RPXlite RRvision SM850 \
|
||||
SPD823TS svm_sc8xx SXNI855T TOP860 \
|
||||
TQM823L TQM823L_LCD TQM850L TQM855L \
|
||||
TQM860L TTTech v37 \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
@@ -48,9 +48,9 @@ LIST_4xx=" \
|
||||
CANBT CPCI405 CPCI4052 CPCI405AB \
|
||||
CPCI440 CPCIISER4 CRAYL1 DASA_SIM \
|
||||
DU405 EBONY ERIC MIP405 \
|
||||
ML2 OCRTC ORSG PCI405 \
|
||||
PIP405 PMC405 W7OLMC W7OLMG \
|
||||
WALNUT405 \
|
||||
MIP405T ML2 OCRTC ORSG \
|
||||
PCI405 PIP405 PMC405 W7OLMC \
|
||||
W7OLMG WALNUT405 \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
|
||||
21
Makefile
21
Makefile
@@ -106,7 +106,7 @@ endif
|
||||
LIBS = board/$(BOARDDIR)/lib$(BOARD).a
|
||||
LIBS += cpu/$(CPU)/lib$(CPU).a
|
||||
LIBS += lib_$(ARCH)/lib$(ARCH).a
|
||||
LIBS += fs/jffs2/libjffs2.a fs/fdos/libfdos.a
|
||||
LIBS += fs/jffs2/libjffs2.a fs/fdos/libfdos.a fs/fat/libfat.a
|
||||
LIBS += net/libnet.a
|
||||
LIBS += disk/libdisk.a
|
||||
LIBS += rtc/librtc.a
|
||||
@@ -323,6 +323,9 @@ RPXClassic_config: unconfig
|
||||
RPXlite_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx RPXlite
|
||||
|
||||
rmu_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx rmu
|
||||
|
||||
RRvision_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx RRvision
|
||||
|
||||
@@ -349,10 +352,10 @@ TOP860_config: unconfig
|
||||
@./mkconfig $(@:_config=) ppc mpc8xx top860 emk
|
||||
|
||||
# Play some tricks for configuration selection
|
||||
# All boards can come with 50 MHz (default), 66MHz or 80MHz clock,
|
||||
# All boards can come with 50 MHz (default), 66MHz, 80MHz or 100 MHz clock,
|
||||
# but only 855 and 860 boards may come with FEC
|
||||
# and 823 boards may have LCD support
|
||||
xtract_8xx = $(subst _66MHz,,$(subst _80MHz,,$(subst _LCD,,$(subst _config,,$1))))
|
||||
xtract_8xx = $(subst _66MHz,,$(subst _80MHz,,$(subst _100MHz,,$(subst _LCD,,$(subst _config,,$1)))))
|
||||
|
||||
FPS850L_config \
|
||||
FPS860L_config \
|
||||
@@ -373,7 +376,8 @@ TQM860L_66MHz_config \
|
||||
TQM860L_80MHz_config \
|
||||
TQM862L_config \
|
||||
TQM862L_66MHz_config \
|
||||
TQM862L_80MHz_config: unconfig
|
||||
TQM862L_80MHz_config \
|
||||
TQM862M_100MHz_config: unconfig
|
||||
@ >include/config.h
|
||||
@[ -z "$(findstring _66MHz,$@)" ] || \
|
||||
{ echo "#define CONFIG_66MHz" >>include/config.h ; \
|
||||
@@ -383,6 +387,10 @@ TQM862L_80MHz_config: unconfig
|
||||
{ echo "#define CONFIG_80MHz" >>include/config.h ; \
|
||||
echo "... with 80MHz system clock" ; \
|
||||
}
|
||||
@[ -z "$(findstring _100MHz,$@)" ] || \
|
||||
{ echo "#define CONFIG_100MHz" >>include/config.h ; \
|
||||
echo "... with 100MHz system clock" ; \
|
||||
}
|
||||
@[ -z "$(findstring _LCD,$@)" ] || \
|
||||
{ echo "#define CONFIG_LCD" >>include/config.h ; \
|
||||
echo "#define CONFIG_NEC_NL6648BC20" >>include/config.h ; \
|
||||
@@ -449,6 +457,11 @@ ERIC_config:unconfig
|
||||
MIP405_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx mip405 mpl
|
||||
|
||||
MIP405T_config:unconfig
|
||||
@echo "#define CONFIG_MIP405T" >include/config.h
|
||||
@echo "Enable subset config for MIP405T"
|
||||
@./mkconfig -a MIP405 ppc ppc4xx mip405 mpl
|
||||
|
||||
ML2_config:unconfig
|
||||
@./mkconfig $(@:_config=) ppc ppc4xx ml2
|
||||
|
||||
|
||||
20
README
20
README
@@ -565,6 +565,7 @@ The following options need to be configured:
|
||||
CFG_CMD_ELF bootelf, bootvx
|
||||
CFG_CMD_ENV saveenv
|
||||
CFG_CMD_FDC * Floppy Disk Support
|
||||
CFG_CMD_FAT FAT partition support
|
||||
CFG_CMD_FDOS * Dos diskette Support
|
||||
CFG_CMD_FLASH flinfo, erase, protect
|
||||
CFG_CMD_FPGA FPGA device initialization support
|
||||
@@ -578,6 +579,7 @@ The following options need to be configured:
|
||||
CFG_CMD_LOADS loads
|
||||
CFG_CMD_MEMORY md, mm, nm, mw, cp, cmp, crc, base,
|
||||
loop, mtest
|
||||
CFG_CMD_MMC MMC memory mapped support
|
||||
CFG_CMD_MII MII utility commands
|
||||
CFG_CMD_NET bootp, tftpboot, rarpboot
|
||||
CFG_CMD_PCI * pciinfo
|
||||
@@ -690,7 +692,7 @@ The following options need to be configured:
|
||||
- NETWORK Support (PCI):
|
||||
CONFIG_E1000
|
||||
Support for Intel 8254x gigabit chips.
|
||||
|
||||
|
||||
CONFIG_EEPRO100
|
||||
Support for Intel 82557/82559/82559ER chips.
|
||||
Optional CONFIG_EEPRO100_SROM_WRITE enables eeprom
|
||||
@@ -730,6 +732,14 @@ The following options need to be configured:
|
||||
Supported are USB Keyboards and USB Floppy drives
|
||||
(TEAC FD-05PUB).
|
||||
|
||||
- MMC Support:
|
||||
The MMC controller on the Intel PXA is supported. To
|
||||
enable this define CONFIG_MMC. The MMC can be
|
||||
accessed from the boot prompt by mapping the device
|
||||
to physical memory similar to flash. Command line is
|
||||
enabled with CFG_CMD_MMC. The MMC driver also works with
|
||||
the FAT fs. This is enabled with CFG_CMD_FAT.
|
||||
|
||||
- Keyboard Support:
|
||||
CONFIG_ISA_KEYBOARD
|
||||
|
||||
@@ -1442,6 +1452,14 @@ Configuration Settings:
|
||||
Define if the flash driver uses extra elements in the
|
||||
common flash structure for storing flash geometry
|
||||
|
||||
- CFG_RX_ETH_BUFFER:
|
||||
Defines the number of ethernet receive buffers. On some
|
||||
ethernet controllers it is recommended to set this value
|
||||
to 8 or even higher (EEPRO100 or 405 EMAC), since all
|
||||
buffers can be full shortly after enabling the interface
|
||||
on high ethernet traffic.
|
||||
Defaults to 4 if not defined.
|
||||
|
||||
The following definitions that deal with the placement and management
|
||||
of environment data (variable area); in general, we support the
|
||||
following configurations:
|
||||
|
||||
@@ -50,6 +50,14 @@ int board_init (void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int board_post_init(void)
|
||||
{
|
||||
setenv("stdout", "serial");
|
||||
setenv("stderr", "serial");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int dram_init (void)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
@@ -59,6 +59,7 @@ int mpl_prg(unsigned long src,unsigned long size)
|
||||
flash_info_t *info;
|
||||
int i,rc;
|
||||
#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405)
|
||||
char *copystr = (char *)src;
|
||||
unsigned long *magic = (unsigned long *)src;
|
||||
#endif
|
||||
|
||||
@@ -69,8 +70,25 @@ int mpl_prg(unsigned long src,unsigned long size)
|
||||
printf("Bad Magic number\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
start = 0 - size;
|
||||
/* some more checks before we delete the Flash... */
|
||||
/* Checking the ISO_STRING prevents to program a
|
||||
* wrong Firmware Image into the flash.
|
||||
*/
|
||||
i=4; /* skip Magic number */
|
||||
while(1) {
|
||||
if(strncmp(©str[i],"MEV-",4)==0)
|
||||
break;
|
||||
if(i++>=0x100) {
|
||||
printf("Firmware Image for unknown Target\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/* we have the ISO STRING, check */
|
||||
if(strncmp(©str[i],CONFIG_ISO_STRING,sizeof(CONFIG_ISO_STRING)-1)!=0) {
|
||||
printf("Wrong Firmware Image: %s\n",©str[i]);
|
||||
return -1;
|
||||
}
|
||||
start = 0 - size;
|
||||
for(i=info->sector_count-1;i>0;i--)
|
||||
{
|
||||
info->protect[i] = 0; /* unprotect this sector */
|
||||
|
||||
@@ -108,17 +108,23 @@ static struct pci_pip405_config_entry piix4_isa_bridge_f0[] = {
|
||||
/* PIIX4 IDE Controller Function 1 */
|
||||
static struct pci_pip405_config_entry piix4_ide_cntrl_f1[] = {
|
||||
{PCI_COMMAND, 0x0001, 2}, /* enable IO access */
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
{PCI_CFG_PIIX4_IDETIM, 0x80008000, 4}, /* enable Both IDE channels */
|
||||
#else
|
||||
{PCI_CFG_PIIX4_IDETIM, 0x80000000, 4}, /* enable IDE channel0 */
|
||||
#endif
|
||||
{ } /* end of device table */
|
||||
};
|
||||
|
||||
/* PIIX4 USB Controller Function 2 */
|
||||
static struct pci_pip405_config_entry piix4_usb_cntrl_f2[] = {
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
{PCI_INTERRUPT_LINE, 31, 1}, /* Int vector = 31 */
|
||||
{PCI_BASE_ADDRESS_4, 0x0000E001, 4}, /* Set IO Address to 0xe000 to 0xe01F */
|
||||
{PCI_LATENCY_TIMER, 0x80, 1}, /* Latency Timer 0x80 */
|
||||
{0xC0, 0x2000, 2}, /* Legacy support */
|
||||
{PCI_COMMAND, 0x0005, 2}, /* enable IO access and Master */
|
||||
#endif
|
||||
{ } /* end of device table */
|
||||
};
|
||||
|
||||
|
||||
@@ -50,9 +50,13 @@
|
||||
#include "mip405.h"
|
||||
|
||||
|
||||
.globl ext_bus_cntlr_init
|
||||
.globl ext_bus_cntlr_init
|
||||
ext_bus_cntlr_init:
|
||||
mflr r4 /* save link register */
|
||||
mflr r4 /* save link register */
|
||||
mfdcr r3,strap /* get strapping reg */
|
||||
andi. r0, r3, PSR_ROM_LOC /* mask out irrelevant bits */
|
||||
bnelr /* jump back if PCI boot */
|
||||
|
||||
bl ..getAddr
|
||||
..getAddr:
|
||||
mflr r3 /* get address of ..getAddr */
|
||||
@@ -200,3 +204,45 @@ sdram_init:
|
||||
|
||||
blr
|
||||
|
||||
|
||||
#if defined(CONFIG_BOOT_PCI)
|
||||
.section .bootpg,"ax"
|
||||
.globl _start_pci
|
||||
/*******************************************
|
||||
*/
|
||||
|
||||
_start_pci:
|
||||
/* first handle errata #68 / PCI_18 */
|
||||
iccci r0, r0 /* invalidate I-cache */
|
||||
lis r31, 0
|
||||
mticcr r31 /* ICCR = 0 (all uncachable) */
|
||||
isync
|
||||
|
||||
mfccr0 r28 /* set CCR0[24] = 1 */
|
||||
ori r28, r28, 0x0080
|
||||
mtccr0 r28
|
||||
|
||||
/* setup PMM0MA (0xEF400004) and PMM0PCIHA (0xEF40000C) */
|
||||
lis r28, 0xEF40
|
||||
addi r28, r28, 0x0004
|
||||
stw r31, 0x0C(r28) /* clear PMM0PCIHA */
|
||||
lis r29, 0xFFF8 /* open 512 kByte */
|
||||
addi r29, r29, 0x0001/* and enable this region */
|
||||
stwbrx r29, r0, r28 /* write PMM0MA */
|
||||
|
||||
lis r28, 0xEEC0 /* address of PCIC0_CFGADDR */
|
||||
addi r29, r28, 4 /* add 4 to r29 -> PCIC0_CFGDATA */
|
||||
|
||||
lis r31, 0x8000 /* set en bit bus 0 */
|
||||
ori r31, r31, 0x304C/* device 6 func 0 reg 4C (XBCS register) */
|
||||
stwbrx r31, r0, r28 /* write it */
|
||||
|
||||
lwbrx r31, r0, r29 /* load XBCS register */
|
||||
oris r31, r31, 0x02C4/* clear BIOSCS WPE, set lower, extended and 1M extended BIOS enable */
|
||||
stwbrx r31, r0, r29 /* write back XBCS register */
|
||||
|
||||
nop
|
||||
nop
|
||||
b _start /* normal start */
|
||||
#endif
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ extern block_dev_desc_t * scsi_get_dev(int dev);
|
||||
extern block_dev_desc_t * ide_get_dev(int dev);
|
||||
|
||||
#undef SDRAM_DEBUG
|
||||
|
||||
#define ENABLE_ECC /* for ecc boards */
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
|
||||
@@ -108,7 +108,27 @@ typedef struct {
|
||||
unsigned char sz; /* log binary => Size = (4MByte<<sz) 5 = 128, 4 = 64, 3 = 32, 2 = 16, 1=8 */
|
||||
unsigned char ecc; /* if true, ecc is enabled */
|
||||
} sdram_t;
|
||||
|
||||
#if defined(CONFIG_MIP405T)
|
||||
const sdram_t sdram_table[] = {
|
||||
{ 0x01, /* MIP405T Rev A, 64MByte -1 Board */
|
||||
3, /* Case Latenty = 3 */
|
||||
3, /* trp 20ns / 7.5 ns datain[27] */
|
||||
3, /* trcd 20ns /7.5 ns (datain[29]) */
|
||||
6, /* tras 44ns /7.5 ns (datain[30]) */
|
||||
4, /* tcpt 44 - 20ns = 24ns */
|
||||
3, /* Address Mode = 3 (13x9x4) */
|
||||
4, /* size value (64MByte) */
|
||||
0}, /* ECC disabled */
|
||||
{ 0xff, /* terminator */
|
||||
0xff,
|
||||
0xff,
|
||||
0xff,
|
||||
0xff,
|
||||
0xff,
|
||||
0xff,
|
||||
0xff }
|
||||
};
|
||||
#else
|
||||
const sdram_t sdram_table[] = {
|
||||
{ 0x0f, /* Rev A, 128MByte -1 Board */
|
||||
3, /* Case Latenty = 3 */
|
||||
@@ -155,7 +175,7 @@ const sdram_t sdram_table[] = {
|
||||
0xff,
|
||||
0xff }
|
||||
};
|
||||
|
||||
#endif /*CONFIG_MIP405T */
|
||||
void SDRAM_err (const char *s)
|
||||
{
|
||||
#ifndef SDRAM_DEBUG
|
||||
@@ -222,17 +242,54 @@ int init_sdram (void)
|
||||
tctp_clocks;
|
||||
unsigned char cal_val;
|
||||
unsigned char bc;
|
||||
unsigned long pbcr, sdram_tim, sdram_bank;
|
||||
unsigned long *p;
|
||||
unsigned long sdram_tim, sdram_bank;
|
||||
|
||||
i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
|
||||
/*i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);*/
|
||||
(void) get_clocks ();
|
||||
gd->baudrate = 9600;
|
||||
serial_init ();
|
||||
/* set up the pld */
|
||||
mtdcr (ebccfga, pb7ap);
|
||||
mtdcr (ebccfgd, PLD_AP);
|
||||
mtdcr (ebccfga, pb7cr);
|
||||
mtdcr (ebccfgd, PLD_CR);
|
||||
/* THIS IS OBSOLETE */
|
||||
/* set up the board rev reg*/
|
||||
mtdcr (ebccfga, pb5ap);
|
||||
mtdcr (ebccfgd, BOARD_AP);
|
||||
mtdcr (ebccfga, pb5cr);
|
||||
mtdcr (ebccfgd, BOARD_CR);
|
||||
#ifdef SDRAM_DEBUG
|
||||
/* get all informations from PLD */
|
||||
serial_puts ("\nPLD Part 0x");
|
||||
bc = in8 (PLD_PART_REG);
|
||||
write_hex (bc);
|
||||
serial_puts ("\nPLD Vers 0x");
|
||||
bc = in8 (PLD_VERS_REG);
|
||||
write_hex (bc);
|
||||
serial_puts ("\nBoard Rev 0x");
|
||||
bc = in8 (PLD_BOARD_CFG_REG);
|
||||
write_hex (bc);
|
||||
serial_puts ("\n");
|
||||
#endif
|
||||
/* check board */
|
||||
bc = in8 (PLD_PART_REG);
|
||||
#if defined(CONFIG_MIP405T)
|
||||
if((bc & 0x80)==0)
|
||||
SDRAM_err ("U-Boot configured for a MIP405T not for a MIP405!!!\n");
|
||||
#else
|
||||
if((bc & 0x80)==0x80)
|
||||
SDRAM_err ("U-Boot configured for a MIP405 not for a MIP405T!!!\n");
|
||||
#endif
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
/* since the ECC initialisation needs some time,
|
||||
* we show that we're alive
|
||||
*/
|
||||
serial_puts ("\nInitializing SDRAM, Please stand by");
|
||||
/* set-up the chipselect machine */
|
||||
mtdcr (ebccfga, pb0cr); /* get cs0 config reg */
|
||||
pbcr = mfdcr (ebccfgd);
|
||||
if ((pbcr & 0x00002000) == 0) {
|
||||
tmp = mfdcr (ebccfgd);
|
||||
if ((tmp & 0x00002000) == 0) {
|
||||
/* MPS Boot, set up the flash */
|
||||
mtdcr (ebccfga, pb1ap);
|
||||
mtdcr (ebccfgd, FLASH_AP);
|
||||
@@ -254,30 +311,8 @@ int init_sdram (void)
|
||||
mtdcr (ebccfgd, UART1_AP);
|
||||
mtdcr (ebccfga, pb3cr);
|
||||
mtdcr (ebccfgd, UART1_CR);
|
||||
|
||||
/* set up the pld */
|
||||
mtdcr (ebccfga, pb7ap);
|
||||
mtdcr (ebccfgd, PLD_AP);
|
||||
mtdcr (ebccfga, pb7cr);
|
||||
mtdcr (ebccfgd, PLD_CR);
|
||||
/* set up the board rev reg */
|
||||
mtdcr (ebccfga, pb5ap);
|
||||
mtdcr (ebccfgd, BOARD_AP);
|
||||
mtdcr (ebccfga, pb5cr);
|
||||
mtdcr (ebccfgd, BOARD_CR);
|
||||
|
||||
|
||||
#ifdef SDRAM_DEBUG
|
||||
out8 (PER_BOARD_ADDR, 0);
|
||||
bc = in8 (PER_BOARD_ADDR);
|
||||
serial_puts ("\nBoard Rev: ");
|
||||
write_hex (bc);
|
||||
serial_puts (" (PLD=");
|
||||
bc = in8 (PLD_BOARD_CFG_REG);
|
||||
write_hex (bc);
|
||||
serial_puts (")\n");
|
||||
#endif
|
||||
bc = get_board_revcfg ();
|
||||
bc = in8 (PLD_BOARD_CFG_REG);
|
||||
#ifdef SDRAM_DEBUG
|
||||
serial_puts ("\nstart SDRAM Setup\n");
|
||||
serial_puts ("\nBoard Rev: ");
|
||||
@@ -367,9 +402,10 @@ int init_sdram (void)
|
||||
mtdcr (memcfga, mem_rtr);
|
||||
mtdcr (memcfgd, tmp);
|
||||
/* enable ECC if used */
|
||||
#if 1
|
||||
#if defined(ENABLE_ECC) && !defined(CONFIG_BOOT_PCI)
|
||||
if (sdram_table[i].ecc) {
|
||||
/* disable checking for all banks */
|
||||
unsigned long *p;
|
||||
#ifdef SDRAM_DEBUG
|
||||
serial_puts ("disable ECC.. ");
|
||||
#endif
|
||||
@@ -398,8 +434,6 @@ int init_sdram (void)
|
||||
*p++ = 0L;
|
||||
if (!((unsigned long) p % 0x00800000)) /* every 8MByte */
|
||||
serial_puts (".");
|
||||
|
||||
|
||||
}
|
||||
/* enable bank 0 */
|
||||
serial_puts (".");
|
||||
@@ -501,47 +535,69 @@ void ide_set_reset (int idereset)
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Check Board Identity:
|
||||
*/
|
||||
|
||||
int checkboard (void)
|
||||
void get_pcbrev_var(unsigned char *pcbrev, unsigned char *var)
|
||||
{
|
||||
unsigned char s[50];
|
||||
unsigned char bc, var, rc;
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
unsigned char bc,rc,tmp;
|
||||
int i;
|
||||
backup_t *b = (backup_t *) s;
|
||||
|
||||
puts ("Board: ");
|
||||
|
||||
bc = get_board_revcfg ();
|
||||
var = ~bc;
|
||||
var &= 0xf;
|
||||
bc = in8 (PLD_BOARD_CFG_REG);
|
||||
tmp = ~bc;
|
||||
tmp &= 0xf;
|
||||
rc = 0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
rc <<= 1;
|
||||
rc += (var & 0x1);
|
||||
var >>= 1;
|
||||
rc += (tmp & 0x1);
|
||||
tmp >>= 1;
|
||||
}
|
||||
rc++;
|
||||
if((((bc>>4) & 0xf)==0x1) /* Rev B PCB with */
|
||||
&& (rc==0x1)) /* Population Option 1 is a -3 */
|
||||
rc=3;
|
||||
*pcbrev=(bc >> 4) & 0xf;
|
||||
*var=rc;
|
||||
#else
|
||||
unsigned char bc;
|
||||
bc = in8 (PLD_BOARD_CFG_REG);
|
||||
*pcbrev=(bc >> 4) & 0xf;
|
||||
*var=bc & 0xf ;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Check Board Identity:
|
||||
*/
|
||||
/* serial String: "MIP405_1000" OR "MIP405T_1000" */
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
#define BOARD_NAME "MIP405"
|
||||
#else
|
||||
#define BOARD_NAME "MIP405T"
|
||||
#endif
|
||||
|
||||
int checkboard (void)
|
||||
{
|
||||
unsigned char s[50];
|
||||
unsigned char bc, var;
|
||||
int i;
|
||||
backup_t *b = (backup_t *) s;
|
||||
|
||||
puts ("Board: ");
|
||||
get_pcbrev_var(&bc,&var);
|
||||
i = getenv_r ("serial#", s, 32);
|
||||
if ((i == 0) || strncmp (s, "MIP405", 6)) {
|
||||
if ((i == 0) || strncmp (s, BOARD_NAME,sizeof(BOARD_NAME))) {
|
||||
get_backup_values (b);
|
||||
if (strncmp (b->signature, "MPL\0", 4) != 0) {
|
||||
puts ("### No HW ID - assuming MIP405");
|
||||
printf ("-%d Rev %c", rc, 'A' + ((bc >> 4) & 0xf));
|
||||
puts ("### No HW ID - assuming " BOARD_NAME);
|
||||
printf ("-%d Rev %c", var, 'A' + bc);
|
||||
} else {
|
||||
b->serial_name[6] = 0;
|
||||
printf ("%s-%d Rev %c SN: %s", b->serial_name, rc,
|
||||
'A' + ((bc >> 4) & 0xf), &b->serial_name[7]);
|
||||
b->serial_name[sizeof(BOARD_NAME)-1] = 0;
|
||||
printf ("%s-%d Rev %c SN: %s", b->serial_name, var,
|
||||
'A' + bc, &b->serial_name[sizeof(BOARD_NAME)]);
|
||||
}
|
||||
} else {
|
||||
s[6] = 0;
|
||||
printf ("%s-%d Rev %c SN: %s", s, rc, 'A' + ((bc >> 4) & 0xf),
|
||||
&s[7]);
|
||||
s[sizeof(BOARD_NAME)-1] = 0;
|
||||
printf ("%s-%d Rev %c SN: %s", s, var,'A' + bc,
|
||||
&s[sizeof(BOARD_NAME)]);
|
||||
}
|
||||
bc = in8 (PLD_EXT_CONF_REG);
|
||||
printf (" Boot Config: 0x%x\n", bc);
|
||||
@@ -613,30 +669,23 @@ static int test_dram (unsigned long ramsize)
|
||||
|
||||
int misc_init_r (void)
|
||||
{
|
||||
/* if MIP405 has booted from PCI, reset CCR0[24] as described in errata PCI_18 */
|
||||
if (mfdcr(strap) & PSR_ROM_LOC)
|
||||
mtspr(ccr0, (mfspr(ccr0) & ~0x80));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
void print_mip405_rev (void)
|
||||
{
|
||||
unsigned char part, vers, cfg, rev;
|
||||
unsigned char part, vers, pcbrev, var;
|
||||
|
||||
cfg = get_board_revcfg ();
|
||||
vers = cfg;
|
||||
vers &= 0xf;
|
||||
rev = (((vers & 0x1) ? 0x8 : 0) |
|
||||
((vers & 0x2) ? 0x4 : 0) |
|
||||
((vers & 0x4) ? 0x2 : 0) |
|
||||
((vers & 0x8) ? 0x1 : 0));
|
||||
|
||||
vers=16-rev;
|
||||
rev=vers;
|
||||
if((rev==1) && ((cfg >> 4)==1)) /* Rev B PCB and -1 is a -3 */
|
||||
rev=3;
|
||||
get_pcbrev_var(&pcbrev,&var);
|
||||
part = in8 (PLD_PART_REG);
|
||||
vers = in8 (PLD_VERS_REG);
|
||||
printf ("Rev: MIP405-%d Rev %c PLD%d Vers %d\n",
|
||||
rev, ((cfg >> 4) & 0xf) + 'A', part, vers);
|
||||
printf ("Rev: " BOARD_NAME "-%d Rev %c PLD %d Vers %d\n",
|
||||
var, pcbrev + 'A', part & 0x7F, vers);
|
||||
}
|
||||
|
||||
extern void mem_test_reloc(void);
|
||||
@@ -683,24 +732,32 @@ void print_mip405_info (void)
|
||||
com_mode = in8 (PLD_COM_MODE_REG);
|
||||
ext = in8 (PLD_EXT_CONF_REG);
|
||||
|
||||
printf ("PLD Part %d version %d\n", part, vers);
|
||||
printf ("PLD Part %d version %d\n", part & 0x7F, vers);
|
||||
printf ("Board Revision %c\n", ((cfg >> 4) & 0xf) + 'A');
|
||||
printf ("Population Options %d %d %d %d\n", (cfg) & 0x1,
|
||||
(cfg >> 1) & 0x1, (cfg >> 2) & 0x1, (cfg >> 3) & 0x1);
|
||||
printf ("User LED %s\n", (com_mode & 0x4) ? "on" : "off");
|
||||
printf ("UART Clocks %d\n", (com_mode >> 4) & 0x3);
|
||||
printf ("Test ist %x\n", com_mode);
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
printf ("User Config Switch %d %d %d %d %d %d %d %d\n",
|
||||
(ext) & 0x1, (ext >> 1) & 0x1, (ext >> 2) & 0x1,
|
||||
(ext >> 3) & 0x1, (ext >> 4) & 0x1, (ext >> 5) & 0x1,
|
||||
(ext >> 6) & 0x1, (ext >> 7) & 0x1);
|
||||
printf ("SER1 uses handshakes %s\n",
|
||||
(ext & 0x80) ? "DTR/DSR" : "RTS/CTS");
|
||||
#else
|
||||
printf ("User Config Switch %d %d %d %d %d %d %d %d %d\n",
|
||||
(ext) & 0x1, (ext >> 1) & 0x1, (ext >> 2) & 0x1,
|
||||
(ext >> 3) & 0x1, (ext >> 4) & 0x1, (ext >> 5) & 0x1,
|
||||
(ext >> 6) & 0x1,(ext >> 7) & 0x1,(ext >> 8) & 0x1);
|
||||
#endif
|
||||
printf ("IDE Reset %s\n", (ext & 0x01) ? "asserted" : "not asserted");
|
||||
printf ("IRQs:\n");
|
||||
printf (" PIIX INTR: %s\n", (irq_reg & 0x80) ? "inactive" : "active");
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
printf (" UART0 IRQ: %s\n", (irq_reg & 0x40) ? "inactive" : "active");
|
||||
printf (" UART1 IRQ: %s\n", (irq_reg & 0x20) ? "inactive" : "active");
|
||||
#endif
|
||||
printf (" PIIX SMI: %s\n", (irq_reg & 0x10) ? "inactive" : "active");
|
||||
printf (" PIIX INIT: %s\n", (irq_reg & 0x8) ? "inactive" : "active");
|
||||
printf (" PIIX NMI: %s\n", (irq_reg & 0x4) ? "inactive" : "active");
|
||||
|
||||
@@ -31,6 +31,10 @@ SECTIONS
|
||||
{
|
||||
*(.resetvec)
|
||||
} = 0xffff
|
||||
.bootpg 0xFFFFF000 :
|
||||
{
|
||||
board/mpl/mip405/init.o (.bootpg)
|
||||
} = 0xffff
|
||||
|
||||
/* Read-only sections, merged into text segment: */
|
||||
. = + SIZEOF_HEADERS;
|
||||
|
||||
40
board/rmu/Makefile
Normal file
40
board/rmu/Makefile
Normal file
@@ -0,0 +1,40 @@
|
||||
#
|
||||
# (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
|
||||
|
||||
$(LIB): .depend $(OBJS)
|
||||
$(AR) crv $@ $^
|
||||
|
||||
#########################################################################
|
||||
|
||||
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
|
||||
$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
|
||||
|
||||
sinclude .depend
|
||||
|
||||
#########################################################################
|
||||
28
board/rmu/config.mk
Normal file
28
board/rmu/config.mk
Normal file
@@ -0,0 +1,28 @@
|
||||
#
|
||||
# (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
|
||||
#
|
||||
|
||||
#
|
||||
# RMU boards
|
||||
#
|
||||
|
||||
TEXT_BASE = 0xfff00000
|
||||
515
board/rmu/flash.c
Normal file
515
board/rmu/flash.c
Normal file
@@ -0,0 +1,515 @@
|
||||
/*
|
||||
* (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 <common.h>
|
||||
#include <mpc8xx.h>
|
||||
|
||||
flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Functions
|
||||
*/
|
||||
static ulong flash_get_size (vu_long *addr, flash_info_t *info);
|
||||
static int write_word (flash_info_t *info, ulong dest, ulong data);
|
||||
static void flash_get_offsets (ulong base, flash_info_t *info);
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
unsigned long flash_init (void)
|
||||
{
|
||||
volatile immap_t *immap = (immap_t *)CFG_IMMR;
|
||||
volatile memctl8xx_t *memctl = &immap->im_memctl;
|
||||
unsigned long size_b0 ;
|
||||
int i;
|
||||
|
||||
/* 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_BASE_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);
|
||||
}
|
||||
|
||||
/* Remap FLASH according to real size */
|
||||
memctl->memc_or0 = CFG_OR_TIMING_FLASH | (-size_b0 & 0xFFFF8000);
|
||||
memctl->memc_br0 = (CFG_FLASH_BASE & BR_BA_MSK) | BR_MS_GPCM | BR_V;
|
||||
|
||||
/* Re-do sizing to get full correct info */
|
||||
|
||||
size_b0 = flash_get_size((vu_long *)CFG_FLASH_BASE, &flash_info[0]);
|
||||
flash_get_offsets (CFG_FLASH_BASE, &flash_info[0]);
|
||||
|
||||
#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_info[0]);
|
||||
#endif
|
||||
|
||||
#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_info[0]);
|
||||
#endif
|
||||
|
||||
flash_info[0].size = size_b0;
|
||||
|
||||
return (size_b0);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
static void flash_get_offsets (ulong base, flash_info_t *info)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* set up sector start address table */
|
||||
if (info->flash_id & FLASH_BTYPE) {
|
||||
/* set sector offsets for bottom boot block type */
|
||||
info->start[0] = base + 0x00000000;
|
||||
info->start[1] = base + 0x00010000;
|
||||
info->start[2] = base + 0x00018000;
|
||||
info->start[3] = base + 0x00020000;
|
||||
for (i = 4; i < info->sector_count; i++) {
|
||||
info->start[i] = base + ((i-3) * 0x00040000) ;
|
||||
}
|
||||
} else {
|
||||
/* set sector offsets for top boot block type */
|
||||
i = info->sector_count - 1;
|
||||
info->start[i--] = base + info->size - 0x00010000;
|
||||
info->start[i--] = base + info->size - 0x00018000;
|
||||
info->start[i--] = base + info->size - 0x00020000;
|
||||
for (; i >= 0; i--) {
|
||||
info->start[i] = base + i * 0x00040000;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
void flash_print_info (flash_info_t *info)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (info->flash_id == FLASH_UNKNOWN) {
|
||||
printf ("missing or unknown FLASH type\n");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (info->flash_id & FLASH_VENDMASK) {
|
||||
case FLASH_MAN_AMD: printf ("AMD "); break;
|
||||
case FLASH_MAN_FUJ: printf ("FUJITSU "); break;
|
||||
default: printf ("Unknown Vendor "); break;
|
||||
}
|
||||
|
||||
switch (info->flash_id & FLASH_TYPEMASK) {
|
||||
case FLASH_AM400B: printf ("AM29LV400B (4 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM400T: printf ("AM29LV400T (4 Mbit, top boot sector)\n");
|
||||
break;
|
||||
case FLASH_AM800B: printf ("AM29LV800B (8 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM800T: printf ("AM29LV800T (8 Mbit, top boot sector)\n");
|
||||
break;
|
||||
case FLASH_AM160B: printf ("AM29LV160B (16 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM160T: printf ("AM29LV160T (16 Mbit, top boot sector)\n");
|
||||
break;
|
||||
case FLASH_AM320B: printf ("AM29LV320B (32 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM320T: printf ("AM29LV320T (32 Mbit, top boot sector)\n");
|
||||
break;
|
||||
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 (vu_long *addr, flash_info_t *info)
|
||||
{
|
||||
short i;
|
||||
ulong value;
|
||||
ulong base = (ulong)addr;
|
||||
|
||||
/* Write auto select command: read Manufacturer ID */
|
||||
addr[0xAAA] = 0xAAAAAAAA ;
|
||||
addr[0x555] = 0x55555555 ;
|
||||
addr[0xAAA] = 0x90909090 ;
|
||||
|
||||
value = addr[0] ;
|
||||
|
||||
switch (value & 0x00FF00FF) {
|
||||
case AMD_MANUFACT:
|
||||
info->flash_id = FLASH_MAN_AMD;
|
||||
break;
|
||||
case FUJ_MANUFACT:
|
||||
info->flash_id = FLASH_MAN_FUJ;
|
||||
break;
|
||||
default:
|
||||
info->flash_id = FLASH_UNKNOWN;
|
||||
info->sector_count = 0;
|
||||
info->size = 0;
|
||||
return (0); /* no or unknown flash */
|
||||
}
|
||||
|
||||
value = addr[2] ; /* device ID */
|
||||
|
||||
switch (value & 0x00FF00FF) {
|
||||
case (AMD_ID_LV400T & 0x00FF00FF):
|
||||
info->flash_id += FLASH_AM400T;
|
||||
info->sector_count = 11;
|
||||
info->size = 0x00100000;
|
||||
break; /* => 1 MB */
|
||||
|
||||
case (AMD_ID_LV400B & 0x00FF00FF):
|
||||
info->flash_id += FLASH_AM400B;
|
||||
info->sector_count = 11;
|
||||
info->size = 0x00100000;
|
||||
break; /* => 1 MB */
|
||||
|
||||
case (AMD_ID_LV800T & 0x00FF00FF):
|
||||
info->flash_id += FLASH_AM800T;
|
||||
info->sector_count = 19;
|
||||
info->size = 0x00200000;
|
||||
break; /* => 2 MB */
|
||||
|
||||
case (AMD_ID_LV800B & 0x00FF00FF):
|
||||
info->flash_id += FLASH_AM800B;
|
||||
info->sector_count = 19;
|
||||
info->size = 0x00400000; /*%%% Size doubled by yooth */
|
||||
break; /* => 4 MB */
|
||||
|
||||
case (AMD_ID_LV160T & 0x00FF00FF):
|
||||
info->flash_id += FLASH_AM160T;
|
||||
info->sector_count = 35;
|
||||
info->size = 0x00400000;
|
||||
break; /* => 4 MB */
|
||||
|
||||
case (AMD_ID_LV160B & 0x00FF00FF):
|
||||
info->flash_id += FLASH_AM160B;
|
||||
info->sector_count = 35;
|
||||
info->size = 0x00800000;
|
||||
break; /* => 8 MB */
|
||||
#if 0 /* enable when device IDs are available */
|
||||
case AMD_ID_LV320T:
|
||||
info->flash_id += FLASH_AM320T;
|
||||
info->sector_count = 67;
|
||||
info->size = 0x00800000;
|
||||
break; /* => 8 MB */
|
||||
|
||||
case AMD_ID_LV320B:
|
||||
info->flash_id += FLASH_AM320B;
|
||||
info->sector_count = 67;
|
||||
info->size = 0x01000000;
|
||||
break; /* => 16 MB */
|
||||
#endif
|
||||
default:
|
||||
info->flash_id = FLASH_UNKNOWN;
|
||||
return (0); /* => no or unknown flash */
|
||||
|
||||
}
|
||||
/*%%% sector start address modified */
|
||||
/* set up sector start address table */
|
||||
if (info->flash_id & FLASH_BTYPE) {
|
||||
/* set sector offsets for bottom boot block type */
|
||||
info->start[0] = base + 0x00000000;
|
||||
info->start[1] = base + 0x00010000;
|
||||
info->start[2] = base + 0x00018000;
|
||||
info->start[3] = base + 0x00020000;
|
||||
for (i = 4; i < info->sector_count; i++) {
|
||||
info->start[i] = base + ((i-3) * 0x00040000) ;
|
||||
}
|
||||
} else {
|
||||
/* set sector offsets for top boot block type */
|
||||
i = info->sector_count - 1;
|
||||
info->start[i--] = base + info->size - 0x00010000;
|
||||
info->start[i--] = base + info->size - 0x00018000;
|
||||
info->start[i--] = base + info->size - 0x00020000;
|
||||
for (; i >= 0; i--) {
|
||||
info->start[i] = base + i * 0x00040000;
|
||||
}
|
||||
}
|
||||
|
||||
/* check for protected sectors */
|
||||
for (i = 0; i < info->sector_count; i++) {
|
||||
/* read sector protection at sector address, (A7 .. A0) = 0x02 */
|
||||
/* D0 = 1 if protected */
|
||||
addr = (volatile unsigned long *)(info->start[i]);
|
||||
info->protect[i] = addr[4] & 1 ;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prevent writes to uninitialized FLASH.
|
||||
*/
|
||||
if (info->flash_id != FLASH_UNKNOWN) {
|
||||
addr = (volatile unsigned long *)info->start[0];
|
||||
|
||||
*addr = 0xF0F0F0F0; /* reset bank */
|
||||
}
|
||||
|
||||
return (info->size);
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
int flash_erase (flash_info_t *info, int s_first, int s_last)
|
||||
{
|
||||
vu_long *addr = (vu_long*)(info->start[0]);
|
||||
int flag, prot, sect, l_sect;
|
||||
ulong start, now, 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) {
|
||||
if (info->protect[sect]) {
|
||||
prot++;
|
||||
}
|
||||
}
|
||||
|
||||
if (prot) {
|
||||
printf ("- Warning: %d protected sectors will not be erased!\n",
|
||||
prot);
|
||||
} else {
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
l_sect = -1;
|
||||
|
||||
/* Disable interrupts which might cause a timeout here */
|
||||
flag = disable_interrupts();
|
||||
|
||||
addr[0xAAA] = 0xAAAAAAAA;
|
||||
addr[0x555] = 0x55555555;
|
||||
addr[0xAAA] = 0x80808080;
|
||||
addr[0xAAA] = 0xAAAAAAAA;
|
||||
addr[0x555] = 0x55555555;
|
||||
|
||||
/* Start erase on unprotected sectors */
|
||||
for (sect = s_first; sect<=s_last; sect++) {
|
||||
if (info->protect[sect] == 0) { /* not protected */
|
||||
addr = (vu_long *)(info->start[sect]) ;
|
||||
addr[0] = 0x30303030 ;
|
||||
l_sect = sect;
|
||||
}
|
||||
}
|
||||
|
||||
/* re-enable interrupts if necessary */
|
||||
if (flag)
|
||||
enable_interrupts();
|
||||
|
||||
/* wait at least 80us - let's wait 1 ms */
|
||||
udelay (1000);
|
||||
|
||||
/*
|
||||
* We wait for the last triggered sector
|
||||
*/
|
||||
if (l_sect < 0)
|
||||
goto DONE;
|
||||
|
||||
start = get_timer (0);
|
||||
last = start;
|
||||
addr = (vu_long *)(info->start[l_sect]);
|
||||
while ((addr[0] & 0x80808080) != 0x80808080) {
|
||||
if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
|
||||
printf ("Timeout\n");
|
||||
return 1;
|
||||
}
|
||||
/* show that we're waiting */
|
||||
if ((now - last) > 1000) { /* every second */
|
||||
putc ('.');
|
||||
last = now;
|
||||
}
|
||||
}
|
||||
|
||||
DONE:
|
||||
/* reset to read mode */
|
||||
addr = (vu_long *)info->start[0];
|
||||
addr[0] = 0xF0F0F0F0; /* reset bank */
|
||||
|
||||
printf (" done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* 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 cp, wp, data;
|
||||
int i, l, rc;
|
||||
|
||||
wp = (addr & ~3); /* get lower word aligned address */
|
||||
|
||||
/*
|
||||
* handle unaligned start bytes
|
||||
*/
|
||||
if ((l = addr - wp) != 0) {
|
||||
data = 0;
|
||||
for (i=0, cp=wp; i<l; ++i, ++cp) {
|
||||
data = (data << 8) | (*(uchar *)cp);
|
||||
}
|
||||
for (; i<4 && cnt>0; ++i) {
|
||||
data = (data << 8) | *src++;
|
||||
--cnt;
|
||||
++cp;
|
||||
}
|
||||
for (; cnt==0 && i<4; ++i, ++cp) {
|
||||
data = (data << 8) | (*(uchar *)cp);
|
||||
}
|
||||
|
||||
if ((rc = write_word(info, wp, data)) != 0) {
|
||||
return (rc);
|
||||
}
|
||||
wp += 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* handle word aligned part
|
||||
*/
|
||||
while (cnt >= 4) {
|
||||
data = 0;
|
||||
for (i=0; i<4; ++i) {
|
||||
data = (data << 8) | *src++;
|
||||
}
|
||||
if ((rc = write_word(info, wp, data)) != 0) {
|
||||
return (rc);
|
||||
}
|
||||
wp += 4;
|
||||
cnt -= 4;
|
||||
}
|
||||
|
||||
if (cnt == 0) {
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* handle unaligned tail bytes
|
||||
*/
|
||||
data = 0;
|
||||
for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp) {
|
||||
data = (data << 8) | *src++;
|
||||
--cnt;
|
||||
}
|
||||
for (; i<4; ++i, ++cp) {
|
||||
data = (data << 8) | (*(uchar *)cp);
|
||||
}
|
||||
|
||||
return (write_word(info, wp, data));
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Write a word to Flash, returns:
|
||||
* 0 - OK
|
||||
* 1 - write timeout
|
||||
* 2 - Flash not erased
|
||||
*/
|
||||
static int write_word (flash_info_t *info, ulong dest, ulong data)
|
||||
{
|
||||
vu_long *addr = (vu_long *)(info->start[0]);
|
||||
ulong start;
|
||||
int flag;
|
||||
|
||||
/* Check if Flash is (sufficiently) erased */
|
||||
if ((*((vu_long *)dest) & data) != data) {
|
||||
return (2);
|
||||
}
|
||||
/* Disable interrupts which might cause a timeout here */
|
||||
flag = disable_interrupts();
|
||||
|
||||
addr[0xAAA] = 0xAAAAAAAA;
|
||||
addr[0x555] = 0x55555555;
|
||||
addr[0xAAA] = 0xA0A0A0A0;
|
||||
|
||||
*((vu_long *)dest) = data;
|
||||
|
||||
/* re-enable interrupts if necessary */
|
||||
if (flag)
|
||||
enable_interrupts();
|
||||
|
||||
/* data polling for D7 */
|
||||
start = get_timer (0);
|
||||
while ((*((vu_long *)dest) & 0x80808080) != (data & 0x80808080)) {
|
||||
if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*/
|
||||
184
board/rmu/rmu.c
Normal file
184
board/rmu/rmu.c
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* (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 <common.h>
|
||||
#include <mpc8xx.h>
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
static long int dram_size (long int, long int *, long int);
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#define _NOT_USED_ 0xFFFFCC25
|
||||
|
||||
const uint sdram_table[] =
|
||||
{
|
||||
/*
|
||||
* Single Read. (Offset 00h in UPMA RAM)
|
||||
*/
|
||||
0x0F03CC04, 0x00ACCC24, 0x1FF74C20, _NOT_USED_,
|
||||
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
|
||||
|
||||
/*
|
||||
* Burst Read. (Offset 08h in UPMA RAM)
|
||||
*/
|
||||
0x0F03CC04, 0x00ACCC24, 0x00FFCC20, 0x00FFCC20,
|
||||
0x01FFCC20, 0x1FF74C20, _NOT_USED_, _NOT_USED_,
|
||||
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
|
||||
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
|
||||
|
||||
/*
|
||||
* Single Write. (Offset 18h in UPMA RAM)
|
||||
*/
|
||||
0x0F03CC02, 0x00AC0C24, 0x1FF74C25, _NOT_USED_,
|
||||
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
|
||||
|
||||
/*
|
||||
* Burst Write. (Offset 20h in UPMA RAM)
|
||||
*/
|
||||
0x0F03CC00, 0x00AC0C20, 0x00FFFC20, 0x00FFFC22,
|
||||
0x01FFFC24, 0x1FF74C25, _NOT_USED_, _NOT_USED_,
|
||||
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
|
||||
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
|
||||
|
||||
/*
|
||||
* Refresh. (Offset 30h in UPMA RAM)
|
||||
* (Initialization code at 0x36)
|
||||
*/
|
||||
0x0FF0CC24, 0xFFFFCC24, _NOT_USED_, _NOT_USED_,
|
||||
_NOT_USED_, _NOT_USED_, 0xEFFB8C34, 0x0FF74C34,
|
||||
0x0FFACCB4, 0x0FF5CC34, 0x0FFCC34, 0x0FFFCCB4,
|
||||
|
||||
/*
|
||||
* Exception. (Offset 3Ch in UPMA RAM)
|
||||
*/
|
||||
0x0FEA8C34, 0x1FB54C34, 0xFFFFCC34, _NOT_USED_
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
|
||||
/*
|
||||
* Check Board Identity:
|
||||
*/
|
||||
|
||||
int checkboard (void)
|
||||
{
|
||||
puts ("Board: RMU\n") ;
|
||||
return (0) ;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
long int initdram (int board_type)
|
||||
{
|
||||
volatile immap_t *immap = (immap_t *)CFG_IMMR;
|
||||
volatile memctl8xx_t *memctl = &immap->im_memctl;
|
||||
long int size10 ;
|
||||
|
||||
upmconfig(UPMA, (uint *)sdram_table, sizeof(sdram_table)/sizeof(uint));
|
||||
|
||||
/* Refresh clock prescalar */
|
||||
memctl->memc_mptpr = CFG_MPTPR ;
|
||||
|
||||
memctl->memc_mar = 0x00000088;
|
||||
|
||||
/* Map controller banks 1 to the SDRAM bank */
|
||||
memctl->memc_or1 = CFG_OR1_PRELIM;
|
||||
memctl->memc_br1 = CFG_BR1_PRELIM;
|
||||
|
||||
memctl->memc_mamr = CFG_MAMR_10COL & (~(MAMR_PTAE)); /* no refresh yet */
|
||||
|
||||
udelay(200);
|
||||
|
||||
/* perform SDRAM initializsation sequence */
|
||||
|
||||
memctl->memc_mcr = 0x80002136 ; /* SDRAM bank 0 */
|
||||
udelay(1);
|
||||
|
||||
memctl->memc_mamr |= MAMR_PTAE; /* enable refresh */
|
||||
|
||||
udelay (1000);
|
||||
|
||||
/* Check Bank 0 Memory Size
|
||||
* try 10 column mode
|
||||
*/
|
||||
|
||||
size10 = dram_size (CFG_MAMR_10COL, (ulong *)SDRAM_BASE_PRELIM, SDRAM_MAX_SIZE) ;
|
||||
|
||||
return (size10);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Check memory range for valid RAM. A simple memory test determines
|
||||
* the actually available RAM size between addresses `base' and
|
||||
* `base + maxsize'. Some (not all) hardware errors are detected:
|
||||
* - short between address lines
|
||||
* - short between data lines
|
||||
*/
|
||||
|
||||
static long int dram_size (long int mamr_value, long int *base, long int maxsize)
|
||||
{
|
||||
volatile immap_t *immap = (immap_t *)CFG_IMMR;
|
||||
volatile memctl8xx_t *memctl = &immap->im_memctl;
|
||||
volatile long int *addr;
|
||||
ulong cnt, val;
|
||||
ulong save[32]; /* to make test non-destructive */
|
||||
unsigned char i = 0;
|
||||
|
||||
memctl->memc_mamr = mamr_value;
|
||||
|
||||
for (cnt = maxsize/sizeof(long); cnt > 0; cnt >>= 1) {
|
||||
addr = base + cnt; /* pointer arith! */
|
||||
|
||||
save[i++] = *addr;
|
||||
*addr = ~cnt;
|
||||
}
|
||||
|
||||
/* write 0 to base address */
|
||||
addr = base;
|
||||
save[i] = *addr;
|
||||
*addr = 0;
|
||||
|
||||
/* check at base address */
|
||||
if ((val = *addr) != 0) {
|
||||
*addr = save[i];
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (cnt = 1; cnt <= maxsize/sizeof(long); cnt <<= 1) {
|
||||
addr = base + cnt; /* pointer arith! */
|
||||
|
||||
val = *addr;
|
||||
*addr = save[--i];
|
||||
|
||||
if (val != (~cnt)) {
|
||||
return (cnt * sizeof(long));
|
||||
}
|
||||
}
|
||||
return (maxsize);
|
||||
}
|
||||
134
board/rmu/u-boot.lds
Normal file
134
board/rmu/u-boot.lds
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* (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
|
||||
{
|
||||
/* 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/mpc8xx/start.o (.text)
|
||||
common/dlmalloc.o (.text)
|
||||
lib_ppc/ppcstring.o (.text)
|
||||
lib_generic/vsprintf.o (.text)
|
||||
lib_generic/crc32.o (.text)
|
||||
lib_generic/zlib.o (.text)
|
||||
/* XXX ?
|
||||
. = env_offset;
|
||||
*/
|
||||
common/environment.o(.text)
|
||||
|
||||
*(.text)
|
||||
*(.fixup)
|
||||
*(.got1)
|
||||
}
|
||||
_etext = .;
|
||||
PROVIDE (etext = .);
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata)
|
||||
*(.rodata1)
|
||||
}
|
||||
.fini : { *(.fini) } =0
|
||||
.ctors : { *(.ctors) }
|
||||
.dtors : { *(.dtors) }
|
||||
|
||||
/* Read-write section, merged into data segment: */
|
||||
. = (. + 0x00FF) & 0xFFFFFF00;
|
||||
_erotext = .;
|
||||
PROVIDE (erotext = .);
|
||||
.reloc :
|
||||
{
|
||||
*(.got)
|
||||
_GOT2_TABLE_ = .;
|
||||
*(.got2)
|
||||
_FIXUP_TABLE_ = .;
|
||||
*(.fixup)
|
||||
}
|
||||
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
|
||||
__fixup_entries = (. - _FIXUP_TABLE_)>>2;
|
||||
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
*(.data1)
|
||||
*(.sdata)
|
||||
*(.sdata2)
|
||||
*(.dynamic)
|
||||
CONSTRUCTORS
|
||||
}
|
||||
_edata = .;
|
||||
PROVIDE (edata = .);
|
||||
|
||||
__start___ex_table = .;
|
||||
__ex_table : { *(__ex_table) }
|
||||
__stop___ex_table = .;
|
||||
|
||||
. = ALIGN(256);
|
||||
__init_begin = .;
|
||||
.text.init : { *(.text.init) }
|
||||
.data.init : { *(.data.init) }
|
||||
. = ALIGN(256);
|
||||
__init_end = .;
|
||||
|
||||
__bss_start = .;
|
||||
.bss :
|
||||
{
|
||||
*(.sbss) *(.scommon)
|
||||
*(.dynbss)
|
||||
*(.bss)
|
||||
*(COMMON)
|
||||
}
|
||||
_end = . ;
|
||||
PROVIDE (end = .);
|
||||
}
|
||||
|
||||
131
board/rmu/u-boot.lds.debug
Normal file
131
board/rmu/u-boot.lds.debug
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* (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
|
||||
{
|
||||
/* 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/mpc8xx/start.o (.text)
|
||||
common/dlmalloc.o (.text)
|
||||
lib_generic/vsprintf.o (.text)
|
||||
lib_generic/crc32.o (.text)
|
||||
|
||||
. = env_offset;
|
||||
common/environment.o(.text)
|
||||
|
||||
*(.text)
|
||||
*(.fixup)
|
||||
*(.got1)
|
||||
}
|
||||
_etext = .;
|
||||
PROVIDE (etext = .);
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata)
|
||||
*(.rodata1)
|
||||
}
|
||||
.fini : { *(.fini) } =0
|
||||
.ctors : { *(.ctors) }
|
||||
.dtors : { *(.dtors) }
|
||||
|
||||
/* Read-write section, merged into data segment: */
|
||||
. = (. + 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 = .);
|
||||
|
||||
__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 = .);
|
||||
}
|
||||
|
||||
@@ -21,8 +21,11 @@
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* #define DEBUG */
|
||||
|
||||
#include <common.h>
|
||||
#include <mpc8xx.h>
|
||||
#include <environment.h>
|
||||
|
||||
#ifndef CFG_ENV_ADDR
|
||||
#define CFG_ENV_ADDR (CFG_FLASH_BASE + CFG_ENV_OFFSET)
|
||||
@@ -53,8 +56,12 @@ unsigned long flash_init (void)
|
||||
|
||||
/* Static FLASH Bank configuration here - FIXME XXX */
|
||||
|
||||
debug ("\n## Get flash bank 1 size @ 0x%08x\n",FLASH_BASE0_PRELIM);
|
||||
|
||||
size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]);
|
||||
|
||||
debug ("## Get flash bank 2 size @ 0x%08x\n",FLASH_BASE1_PRELIM);
|
||||
|
||||
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);
|
||||
@@ -62,6 +69,8 @@ unsigned long flash_init (void)
|
||||
|
||||
size_b1 = flash_get_size((vu_long *)FLASH_BASE1_PRELIM, &flash_info[1]);
|
||||
|
||||
debug ("## Prelim. Flash bank sizes: %08lx + 0x%08lx\n",size_b0,size_b1);
|
||||
|
||||
if (size_b1 > size_b0) {
|
||||
printf ("## ERROR: "
|
||||
"Bank 1 (0x%08lx = %ld MB) > Bank 0 (0x%08lx = %ld MB)\n",
|
||||
@@ -77,26 +86,59 @@ unsigned long flash_init (void)
|
||||
return (0);
|
||||
}
|
||||
|
||||
debug ("## Before remap: "
|
||||
"BR0: 0x%08x OR0: 0x%08x "
|
||||
"BR1: 0x%08x OR1: 0x%08x\n",
|
||||
memctl->memc_br0, memctl->memc_or0,
|
||||
memctl->memc_br1, memctl->memc_or1);
|
||||
|
||||
/* Remap FLASH according to real size */
|
||||
memctl->memc_or0 = CFG_OR_TIMING_FLASH | (-size_b0 & OR_AM_MSK);
|
||||
memctl->memc_br0 = (CFG_FLASH_BASE & BR_BA_MSK) | BR_MS_GPCM | BR_V;
|
||||
|
||||
debug ("## BR0: 0x%08x OR0: 0x%08x\n",
|
||||
memctl->memc_br0, memctl->memc_or0);
|
||||
|
||||
/* Re-do sizing to get full correct info */
|
||||
size_b0 = flash_get_size((vu_long *)CFG_FLASH_BASE, &flash_info[0]);
|
||||
|
||||
#if CFG_MONITOR_BASE >= CFG_FLASH_BASE
|
||||
/* monitor protection ON by default */
|
||||
debug ("Protect monitor: %08lx ... %08lx\n",
|
||||
(ulong)CFG_MONITOR_BASE,
|
||||
(ulong)CFG_MONITOR_BASE + monitor_flash_len - 1);
|
||||
|
||||
flash_protect(FLAG_PROTECT_SET,
|
||||
CFG_MONITOR_BASE,
|
||||
CFG_MONITOR_BASE+monitor_flash_len-1,
|
||||
CFG_MONITOR_BASE + monitor_flash_len - 1,
|
||||
&flash_info[0]);
|
||||
#endif
|
||||
|
||||
#ifdef CFG_ENV_IS_IN_FLASH
|
||||
/* ENV protection ON by default */
|
||||
debug ("Protect %senvironment: %08lx ... %08lx\n",
|
||||
# ifdef CFG_ENV_ADDR_REDUND
|
||||
"primary ",
|
||||
# else
|
||||
"",
|
||||
# endif
|
||||
(ulong)CFG_ENV_ADDR,
|
||||
(ulong)CFG_ENV_ADDR + CFG_ENV_SECT_SIZE - 1);
|
||||
|
||||
flash_protect(FLAG_PROTECT_SET,
|
||||
CFG_ENV_ADDR,
|
||||
CFG_ENV_ADDR+CFG_ENV_SIZE-1,
|
||||
CFG_ENV_ADDR + CFG_ENV_SECT_SIZE - 1,
|
||||
&flash_info[0]);
|
||||
#endif
|
||||
|
||||
#ifdef CFG_ENV_ADDR_REDUND
|
||||
debug ("Protect redundand environment: %08lx ... %08lx\n",
|
||||
(ulong)CFG_ENV_ADDR_REDUND,
|
||||
(ulong)CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - 1);
|
||||
|
||||
flash_protect(FLAG_PROTECT_SET,
|
||||
CFG_ENV_ADDR_REDUND,
|
||||
CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - 1,
|
||||
&flash_info[0]);
|
||||
#endif
|
||||
|
||||
@@ -105,6 +147,9 @@ unsigned long flash_init (void)
|
||||
memctl->memc_br1 = ((CFG_FLASH_BASE + size_b0) & BR_BA_MSK) |
|
||||
BR_MS_GPCM | BR_V;
|
||||
|
||||
debug ("## BR1: 0x%08x OR1: 0x%08x\n",
|
||||
memctl->memc_br1, memctl->memc_or1);
|
||||
|
||||
/* Re-do sizing to get full correct info */
|
||||
size_b1 = flash_get_size((vu_long *)(CFG_FLASH_BASE + size_b0),
|
||||
&flash_info[1]);
|
||||
@@ -129,8 +174,14 @@ unsigned long flash_init (void)
|
||||
|
||||
flash_info[1].flash_id = FLASH_UNKNOWN;
|
||||
flash_info[1].sector_count = -1;
|
||||
flash_info[1].size = 0;
|
||||
|
||||
debug ("## DISABLE BR1: 0x%08x OR1: 0x%08x\n",
|
||||
memctl->memc_br1, memctl->memc_or1);
|
||||
}
|
||||
|
||||
debug ("## Final Flash bank sizes: %08lx + 0x%08lx\n",size_b0,size_b1);
|
||||
|
||||
flash_info[0].size = size_b0;
|
||||
flash_info[1].size = size_b1;
|
||||
|
||||
@@ -155,6 +206,10 @@ void flash_print_info (flash_info_t *info)
|
||||
}
|
||||
|
||||
switch (info->flash_id & FLASH_TYPEMASK) {
|
||||
#ifdef CONFIG_TQM8xxM /* mirror bit flash */
|
||||
case FLASH_AMLV128U: printf ("AM29LV128ML (128Mbit, uniform sector size)\n");
|
||||
break;
|
||||
# else /* ! TQM8xxM */
|
||||
case FLASH_AM400B: printf ("AM29LV400B (4 Mbit, bottom boot sect)\n");
|
||||
break;
|
||||
case FLASH_AM400T: printf ("AM29LV400T (4 Mbit, top boot sector)\n");
|
||||
@@ -171,6 +226,7 @@ void flash_print_info (flash_info_t *info)
|
||||
break;
|
||||
case FLASH_AM320T: printf ("AM29LV320T (32 Mbit, top boot sector)\n");
|
||||
break;
|
||||
#endif /* TQM8xxM */
|
||||
default: printf ("Unknown Chip Type\n");
|
||||
break;
|
||||
}
|
||||
@@ -215,6 +271,8 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
|
||||
|
||||
value = addr[0];
|
||||
|
||||
debug ("Manuf. ID @ 0x%08lx: 0x%08lx\n", (ulong)addr, value);
|
||||
|
||||
switch (value) {
|
||||
case AMD_MANUFACT:
|
||||
info->flash_id = FLASH_MAN_AMD;
|
||||
@@ -231,7 +289,28 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
|
||||
|
||||
value = addr[1]; /* device ID */
|
||||
|
||||
debug ("Device ID @ 0x%08lx: 0x%08lx\n", (ulong)(&addr[1]), value);
|
||||
|
||||
switch (value) {
|
||||
#ifdef CONFIG_TQM8xxM /* mirror bit flash */
|
||||
case AMD_ID_MIRROR:
|
||||
switch(addr[14]) {
|
||||
case AMD_ID_LV128U_2:
|
||||
if (addr[15] != AMD_ID_LV128U_3) {
|
||||
info->flash_id = FLASH_UNKNOWN;
|
||||
}
|
||||
else {
|
||||
info->flash_id += FLASH_AMLV128U;
|
||||
info->sector_count = 256;
|
||||
info->size = 0x02000000;
|
||||
}
|
||||
break; /* => 32 MB */
|
||||
default:
|
||||
info->flash_id = FLASH_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
# else /* ! TQM8xxM */
|
||||
case AMD_ID_LV400T:
|
||||
info->flash_id += FLASH_AM400T;
|
||||
info->sector_count = 11;
|
||||
@@ -267,6 +346,7 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
|
||||
info->sector_count = 35;
|
||||
info->size = 0x00400000;
|
||||
break; /* => 4 MB */
|
||||
|
||||
case AMD_ID_LV320T:
|
||||
info->flash_id += FLASH_AM320T;
|
||||
info->sector_count = 71;
|
||||
@@ -278,6 +358,7 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
|
||||
info->sector_count = 71;
|
||||
info->size = 0x00800000;
|
||||
break; /* => 8 MB */
|
||||
#endif /* TQM8xxM */
|
||||
default:
|
||||
info->flash_id = FLASH_UNKNOWN;
|
||||
return (0); /* => no or unknown flash */
|
||||
@@ -285,6 +366,19 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
|
||||
|
||||
/* set up sector start address table */
|
||||
switch (value) {
|
||||
#ifdef CONFIG_TQM8xxM /* mirror bit flash */
|
||||
case AMD_ID_MIRROR:
|
||||
switch (info->flash_id & FLASH_TYPEMASK) {
|
||||
/* only known types here - no default */
|
||||
case FLASH_AMLV128U:
|
||||
for (i = 0; i < info->sector_count; i++) {
|
||||
info->start[i] = base;
|
||||
base += 0x20000;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
# else /* ! TQM8xxM */
|
||||
case AMD_ID_LV400B:
|
||||
case AMD_ID_LV800B:
|
||||
case AMD_ID_LV160B:
|
||||
@@ -333,6 +427,7 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
|
||||
: 2 * ( 8 << 10);
|
||||
}
|
||||
break;
|
||||
#endif /* TQM8xxM */
|
||||
default:
|
||||
return (0);
|
||||
break;
|
||||
@@ -368,6 +463,8 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
|
||||
int flag, prot, sect, 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");
|
||||
|
||||
@@ -66,7 +66,7 @@ SECTIONS
|
||||
lib_ppc/cache.o (.text)
|
||||
lib_ppc/time.o (.text)
|
||||
|
||||
. = env_offset;
|
||||
. = DEFINED(env_offset) ? env_offset : .;
|
||||
common/environment.o (.ppcenv)
|
||||
|
||||
*(.text)
|
||||
|
||||
@@ -31,10 +31,11 @@ COBJS = main.o altera.o bedbug.o \
|
||||
cmd_autoscript.o cmd_bedbug.o cmd_bmp.o cmd_boot.o \
|
||||
cmd_bootm.o cmd_cache.o cmd_console.o cmd_date.o \
|
||||
cmd_dcr.o cmd_diag.o cmd_doc.o cmd_nand.o cmd_dtt.o \
|
||||
cmd_eeprom.o cmd_elf.o cmd_fdc.o cmd_fdos.o cmd_flash.o \
|
||||
cmd_eeprom.o cmd_elf.o \
|
||||
cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o \
|
||||
cmd_fpga.o cmd_i2c.o cmd_ide.o cmd_immap.o \
|
||||
cmd_jffs2.o cmd_log.o cmd_mem.o cmd_mii.o cmd_misc.o \
|
||||
cmd_net.o cmd_nvedit.o env_common.o \
|
||||
cmd_mmc.o cmd_net.o cmd_nvedit.o env_common.o \
|
||||
env_flash.o env_eeprom.o env_nvram.o env_nowhere.o \
|
||||
cmd_pci.o cmd_pcmcia.o cmd_portio.o \
|
||||
cmd_reginfo.o cmd_scsi.o cmd_vfd.o cmd_usb.o \
|
||||
|
||||
231
common/cmd_fat.c
Normal file
231
common/cmd_fat.c
Normal file
@@ -0,0 +1,231 @@
|
||||
/*
|
||||
* (C) Copyright 2002
|
||||
* Richard Jones, rjones@nexus-tech.net
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* Boot support
|
||||
*/
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <cmd_boot.h>
|
||||
#include <cmd_autoscript.h>
|
||||
#include <s_record.h>
|
||||
#include <net.h>
|
||||
#include <ata.h>
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_FAT)
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <fat.h>
|
||||
|
||||
extern block_dev_desc_t *ide_get_dev (int dev);
|
||||
|
||||
int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
{
|
||||
long size;
|
||||
unsigned long offset;
|
||||
unsigned long count;
|
||||
|
||||
if (argc < 3) {
|
||||
printf ("usage:fatload <filename> <addr> [bytes]\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
offset = simple_strtoul (argv[2], NULL, 16);
|
||||
if (argc == 4)
|
||||
count = simple_strtoul (argv[3], NULL, 16);
|
||||
else
|
||||
count = 0;
|
||||
|
||||
size = file_fat_read (argv[1], (unsigned char *) offset, count);
|
||||
|
||||
printf ("%ld bytes read\n", size);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
{
|
||||
char *filename = "/";
|
||||
int ret;
|
||||
|
||||
if (argc == 2)
|
||||
ret = file_fat_ls (argv[1]);
|
||||
else
|
||||
ret = file_fat_ls (filename);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = 0;
|
||||
|
||||
printf ("FAT info: %d\n", file_fat_detectfs ());
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
#ifdef NOT_IMPLEMENTED_YET
|
||||
/* find first device whose first partition is a DOS filesystem */
|
||||
int find_fat_partition (void)
|
||||
{
|
||||
int i, j;
|
||||
block_dev_desc_t *dev_desc;
|
||||
unsigned char *part_table;
|
||||
unsigned char buffer[ATA_BLOCKSIZE];
|
||||
|
||||
for (i = 0; i < CFG_IDE_MAXDEVICE; i++) {
|
||||
dev_desc = ide_get_dev (i);
|
||||
if (!dev_desc) {
|
||||
debug ("couldn't get ide device!\n");
|
||||
return (-1);
|
||||
}
|
||||
if (dev_desc->part_type == PART_TYPE_DOS) {
|
||||
if (dev_desc->
|
||||
block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1) {
|
||||
debug ("can't perform block_read!\n");
|
||||
return (-1);
|
||||
}
|
||||
part_table = &buffer[0x1be]; /* start with partition #4 */
|
||||
for (j = 0; j < 4; j++) {
|
||||
if ((part_table[4] == 1 || /* 12-bit FAT */
|
||||
part_table[4] == 4 || /* 16-bit FAT */
|
||||
part_table[4] == 6) && /* > 32Meg part */
|
||||
part_table[0] == 0x80) { /* bootable? */
|
||||
curr_dev = i;
|
||||
part_offset = part_table[11];
|
||||
part_offset <<= 8;
|
||||
part_offset |= part_table[10];
|
||||
part_offset <<= 8;
|
||||
part_offset |= part_table[9];
|
||||
part_offset <<= 8;
|
||||
part_offset |= part_table[8];
|
||||
debug ("found partition start at %ld\n", part_offset);
|
||||
return (0);
|
||||
}
|
||||
part_table += 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debug ("no valid devices found!\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
int
|
||||
do_fat_dump (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
|
||||
{
|
||||
__u8 block[1024];
|
||||
int ret;
|
||||
int bknum;
|
||||
|
||||
ret = 0;
|
||||
|
||||
if (argc != 2) {
|
||||
printf ("needs an argument!\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
bknum = simple_strtoul (argv[1], NULL, 10);
|
||||
|
||||
if (disk_read (0, bknum, block) != 0) {
|
||||
printf ("Error: reading block\n");
|
||||
return -1;
|
||||
}
|
||||
printf ("FAT dump: %d\n", bknum);
|
||||
hexdump (512, block);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
int disk_read (__u32 startblock, __u32 getsize, __u8 *bufptr)
|
||||
{
|
||||
ulong tot;
|
||||
block_dev_desc_t *dev_desc;
|
||||
|
||||
if (curr_dev < 0) {
|
||||
if (find_fat_partition () != 0)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
dev_desc = ide_get_dev (curr_dev);
|
||||
if (!dev_desc) {
|
||||
debug ("couldn't get ide device\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
tot = dev_desc->block_read (0, startblock + part_offset,
|
||||
getsize, (ulong *) bufptr);
|
||||
|
||||
/* should we do this here?
|
||||
flush_cache ((ulong)buf, cnt*ide_dev_desc[device].blksz);
|
||||
*/
|
||||
|
||||
if (tot == getsize)
|
||||
return (0);
|
||||
|
||||
debug ("unable to read from device!\n");
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
static int isprint (unsigned char ch)
|
||||
{
|
||||
if (ch >= 32 && ch < 127)
|
||||
return (1);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
void hexdump (int cnt, unsigned char *data)
|
||||
{
|
||||
int i;
|
||||
int run;
|
||||
int offset;
|
||||
|
||||
offset = 0;
|
||||
while (cnt) {
|
||||
printf ("%04X : ", offset);
|
||||
if (cnt >= 16)
|
||||
run = 16;
|
||||
else
|
||||
run = cnt;
|
||||
cnt -= run;
|
||||
for (i = 0; i < run; i++)
|
||||
printf ("%02X ", (unsigned int) data[i]);
|
||||
printf (": ");
|
||||
for (i = 0; i < run; i++)
|
||||
printf ("%c", isprint (data[i]) ? data[i] : '.');
|
||||
printf ("\n");
|
||||
data = &data[16];
|
||||
offset += run;
|
||||
}
|
||||
}
|
||||
#endif /* NOT_IMPLEMENTED_YET */
|
||||
|
||||
#endif /* CFG_CMD_FAT */
|
||||
@@ -30,6 +30,9 @@
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <cmd_mem.h>
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_MMC)
|
||||
#include <mmc.h>
|
||||
#endif
|
||||
|
||||
#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | CFG_CMD_PCI | CFG_CMD_I2C\
|
||||
| CMD_CMD_PORTIO))
|
||||
@@ -323,6 +326,46 @@ int do_mem_cp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_MMC)
|
||||
if (mmc2info(dest)) {
|
||||
int rc;
|
||||
|
||||
printf ("Copy to MMC... ");
|
||||
switch (rc = mmc_write ((uchar *)addr, dest, count*size)) {
|
||||
case 0:
|
||||
printf ("\n");
|
||||
return 1;
|
||||
case -1:
|
||||
printf("failed\n");
|
||||
return 1;
|
||||
default:
|
||||
printf ("%s[%d] FIXME: rc=%d\n",__FILE__,__LINE__,rc);
|
||||
return 1;
|
||||
}
|
||||
puts ("done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mmc2info(addr)) {
|
||||
int rc;
|
||||
|
||||
printf ("Copy from MMC... ");
|
||||
switch (rc = mmc_read (addr, (uchar *)dest, count*size)) {
|
||||
case 0:
|
||||
printf ("\n");
|
||||
return 1;
|
||||
case -1:
|
||||
printf("failed\n");
|
||||
return 1;
|
||||
default:
|
||||
printf ("%s[%d] FIXME: rc=%d\n",__FILE__,__LINE__,rc);
|
||||
return 1;
|
||||
}
|
||||
puts ("done\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (count-- > 0) {
|
||||
if (size == 4)
|
||||
*((ulong *)dest) = *((ulong *)addr);
|
||||
@@ -820,30 +863,29 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[])
|
||||
|
||||
int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
{
|
||||
ulong addr, length;
|
||||
ulong crc;
|
||||
ulong *ptr;
|
||||
ulong addr, length;
|
||||
ulong crc;
|
||||
ulong *ptr;
|
||||
|
||||
if (argc < 3) {
|
||||
printf ("Usage:\n%s\n", cmdtp->usage);
|
||||
return 1;
|
||||
}
|
||||
|
||||
addr = simple_strtoul(argv[1], NULL, 16);
|
||||
addr = simple_strtoul (argv[1], NULL, 16);
|
||||
addr += base_address;
|
||||
|
||||
length = simple_strtoul(argv[2], NULL, 16);
|
||||
length = simple_strtoul (argv[2], NULL, 16);
|
||||
|
||||
crc = crc32 (0, (const uchar *)addr, length);
|
||||
crc = crc32 (0, (const uchar *) addr, length);
|
||||
|
||||
printf ("CRC32 for %08lx ... %08lx ==> %08lx\n",
|
||||
addr, addr + length -1, crc);
|
||||
addr, addr + length - 1, crc);
|
||||
|
||||
if (argc > 3)
|
||||
{
|
||||
ptr = (ulong *)simple_strtoul(argv[3], NULL, 16);
|
||||
*ptr = crc;
|
||||
}
|
||||
if (argc > 3) {
|
||||
ptr = (ulong *) simple_strtoul (argv[3], NULL, 16);
|
||||
*ptr = crc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
40
common/cmd_mmc.c
Normal file
40
common/cmd_mmc.c
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* (C) Copyright 2003
|
||||
* Kyle Harris, kharris@nexus-tech.net
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_MMC)
|
||||
|
||||
#include <mmc.h>
|
||||
|
||||
int do_mmc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
{
|
||||
if (mmc_init (1) != 0) {
|
||||
printf ("No MMC card found\n");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CFG_CMD_MMC */
|
||||
@@ -95,6 +95,10 @@ static void netboot_update_env(void)
|
||||
ip_to_string (NetOurDNSIP, tmp);
|
||||
setenv("dnsip", tmp);
|
||||
}
|
||||
|
||||
if (NetOurNISDomain[0])
|
||||
setenv("domain", NetOurNISDomain);
|
||||
|
||||
}
|
||||
static int
|
||||
netboot_common (int proto, cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||
@@ -165,4 +169,27 @@ netboot_common (int proto, cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||
return rcode;
|
||||
}
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
int do_ping (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
{
|
||||
if (argc < 2)
|
||||
return -1;
|
||||
|
||||
NetPingIP = string_to_ip(argv[1]);
|
||||
if (NetPingIP == 0) {
|
||||
printf ("Usage:\n%s\n", cmdtp->usage);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (NetLoop(PING) < 0) {
|
||||
printf("ping failed; host %s is not alive\n", argv[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("host %s is alive\n", argv[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CFG_CMD_PING */
|
||||
|
||||
#endif /* CFG_CMD_NET */
|
||||
|
||||
@@ -74,6 +74,8 @@
|
||||
#include <cmd_fdos.h>
|
||||
#include <cmd_bmp.h>
|
||||
#include <cmd_portio.h>
|
||||
#include <cmd_mmc.h>
|
||||
#include <cmd_fat.h>
|
||||
|
||||
#ifdef CONFIG_AMIGAONEG3SE
|
||||
#include <cmd_menu.h>
|
||||
@@ -131,13 +133,14 @@ do_echo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
|
||||
if (i > 1)
|
||||
putc(' ');
|
||||
while ((c = *p++) != '\0')
|
||||
while ((c = *p++) != '\0') {
|
||||
if (c == '\\' && *p == 'c') {
|
||||
putnl = 0;
|
||||
p++;
|
||||
}
|
||||
else
|
||||
} else {
|
||||
putc(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (putnl)
|
||||
@@ -190,8 +193,7 @@ do_help (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
if (cmdtp->usage)
|
||||
puts (cmdtp->usage);
|
||||
#endif /* CFG_LONGHELP */
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
printf ("Unknown command '%s' - try 'help'"
|
||||
" without arguments for list of all"
|
||||
" known commands\n\n",
|
||||
@@ -263,6 +265,7 @@ cmd_tbl_t cmd_tbl[] = {
|
||||
CMD_TBL_DTT
|
||||
CMD_TBL_ECHO
|
||||
CMD_TBL_EEPROM
|
||||
CMD_TBL_FAT
|
||||
CMD_TBL_FCCINFO
|
||||
CMD_TBL_FLERASE
|
||||
CMD_TBL_FDC
|
||||
@@ -302,6 +305,7 @@ cmd_tbl_t cmd_tbl[] = {
|
||||
CMD_TBL_LOOP
|
||||
CMD_TBL_JFFS2_LS
|
||||
CMD_TBL_MCCINFO
|
||||
CMD_TBL_MMC
|
||||
CMD_TBL_MD
|
||||
CMD_TBL_MEMCINFO
|
||||
#ifdef CONFIG_AMIGAONEG3SE
|
||||
@@ -316,6 +320,7 @@ cmd_tbl_t cmd_tbl[] = {
|
||||
CMD_TBL_NANDBOOT
|
||||
CMD_TBL_NEXT
|
||||
CMD_TBL_NM
|
||||
CMD_TBL_PING
|
||||
CMD_TBL_PORTIO_OUT
|
||||
CMD_TBL_PCI
|
||||
CMD_TBL_PRINTENV
|
||||
|
||||
@@ -173,17 +173,16 @@ static bd_t *bis_save = NULL; /* for eth_init upon mal error */
|
||||
static int is_receiving = 0; /* sync with eth interrupt */
|
||||
static int print_speed = 1; /* print speed message upon start */
|
||||
|
||||
static void enet_rcv (unsigned long malisr);
|
||||
|
||||
/*-----------------------------------------------------------------------------+
|
||||
* Prototypes and externals.
|
||||
*-----------------------------------------------------------------------------*/
|
||||
void mal_err (unsigned long isr, unsigned long uic, unsigned long mal_def,
|
||||
static void enet_rcv (unsigned long malisr);
|
||||
static int enetInt(void);
|
||||
static void mal_err (unsigned long isr, unsigned long uic, unsigned long mal_def,
|
||||
unsigned long mal_errr);
|
||||
void emac_err (unsigned long isr);
|
||||
static void emac_err (unsigned long isr);
|
||||
|
||||
|
||||
void eth_halt (void)
|
||||
static void ppc_4xx_eth_halt (struct eth_device *dev)
|
||||
{
|
||||
mtdcr (malier, 0x00000000); /* disable mal interrupts */
|
||||
out32 (EMAC_IER, 0x00000000); /* disable emac interrupts */
|
||||
@@ -202,7 +201,7 @@ void eth_halt (void)
|
||||
}
|
||||
|
||||
|
||||
int eth_init (bd_t * bis)
|
||||
static int ppc_4xx_eth_init (struct eth_device *dev, bd_t * bis)
|
||||
{
|
||||
int i;
|
||||
unsigned long reg;
|
||||
@@ -478,11 +477,11 @@ int eth_init (bd_t * bis)
|
||||
bis_save = bis;
|
||||
first_init = 1;
|
||||
|
||||
return (0);
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
int eth_send (volatile void *ptr, int len)
|
||||
static int ppc_4xx_eth_send (struct eth_device *dev, volatile void *ptr, int len)
|
||||
{
|
||||
struct enet_frame *ef_ptr;
|
||||
ulong time_start, time_now;
|
||||
@@ -539,7 +538,7 @@ int eth_send (volatile void *ptr, int len)
|
||||
return (-1);
|
||||
}
|
||||
} else {
|
||||
return (0);
|
||||
return (len);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -696,7 +695,7 @@ int enetInt ()
|
||||
/*-----------------------------------------------------------------------------+
|
||||
* MAL Error Routine
|
||||
*-----------------------------------------------------------------------------*/
|
||||
void mal_err (unsigned long isr, unsigned long uic, unsigned long maldef,
|
||||
static void mal_err (unsigned long isr, unsigned long uic, unsigned long maldef,
|
||||
unsigned long mal_errr)
|
||||
{
|
||||
mtdcr (malesr, isr); /* clear interrupt */
|
||||
@@ -724,7 +723,7 @@ void mal_err (unsigned long isr, unsigned long uic, unsigned long maldef,
|
||||
/*-----------------------------------------------------------------------------+
|
||||
* EMAC Error Routine
|
||||
*-----------------------------------------------------------------------------*/
|
||||
void emac_err (unsigned long isr)
|
||||
static void emac_err (unsigned long isr)
|
||||
{
|
||||
printf ("EMAC error occured.... ISR = %lx\n", isr);
|
||||
out32 (EMAC_ISR, isr);
|
||||
@@ -816,7 +815,7 @@ static void enet_rcv (unsigned long malisr)
|
||||
}
|
||||
|
||||
|
||||
int eth_rx (void)
|
||||
static int ppc_4xx_eth_rx (struct eth_device *dev)
|
||||
{
|
||||
int length;
|
||||
int user_index;
|
||||
@@ -864,4 +863,46 @@ int eth_rx (void)
|
||||
return length;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_NET_MULTI)
|
||||
int ppc_4xx_eth_initialize(bd_t *bis)
|
||||
{
|
||||
struct eth_device *dev;
|
||||
int eth_num = 0;
|
||||
|
||||
dev = malloc (sizeof *dev);
|
||||
if (dev == NULL) {
|
||||
printf(__FUNCTION__ ": Cannot allocate eth_device\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
sprintf(dev->name, "ppc_4xx_eth%d", eth_num);
|
||||
dev->priv = (void *) eth_num;
|
||||
dev->init = ppc_4xx_eth_init;
|
||||
dev->halt = ppc_4xx_eth_halt;
|
||||
dev->send = ppc_4xx_eth_send;
|
||||
dev->recv = ppc_4xx_eth_rx;
|
||||
|
||||
eth_register (dev);
|
||||
}
|
||||
#else /* !defined(CONFIG_NET_MULTI) */
|
||||
void eth_halt (void)
|
||||
{
|
||||
ppc_4xx_eth_halt(NULL);
|
||||
}
|
||||
|
||||
int eth_init (bd_t *bis)
|
||||
{
|
||||
return (ppc_4xx_eth_init(NULL, bis));
|
||||
}
|
||||
int eth_send(volatile void *packet, int length)
|
||||
{
|
||||
return (ppc_4xx_eth_send(NULL, packet, length));
|
||||
}
|
||||
|
||||
int eth_rx(void)
|
||||
{
|
||||
return (ppc_4xx_eth_rx(NULL));
|
||||
}
|
||||
#endif /* !defined(CONFIG_NET_MULTI) */
|
||||
|
||||
#endif /* CONFIG_405GP */
|
||||
|
||||
@@ -177,7 +177,7 @@ void pci_405gp_init(struct pci_controller *hose)
|
||||
* PLB address 0x80000000-0xBFFFFFFF ==> PCI address 0x80000000-0xBFFFFFFF
|
||||
* Use byte reversed out routines to handle endianess.
|
||||
*--------------------------------------------------------------------------*/
|
||||
out32r(PMM0MA, pmmma[0]); /* ensure disabled b4 setting PMM0LA */
|
||||
out32r(PMM0MA, (pmmma[0]&~0x1)); /* disable, configure PMMxLA, PMMxPCILA first */
|
||||
out32r(PMM0LA, pmmla[0]);
|
||||
out32r(PMM0PCILA, pmmpcila[0]);
|
||||
out32r(PMM0PCIHA, pmmpciha[0]);
|
||||
@@ -186,7 +186,7 @@ void pci_405gp_init(struct pci_controller *hose)
|
||||
/*--------------------------------------------------------------------------+
|
||||
* PMM1 is not used. Initialize them to zero.
|
||||
*--------------------------------------------------------------------------*/
|
||||
out32r(PMM1MA, pmmma[1]); /* ensure disabled b4 setting PMM2LA */
|
||||
out32r(PMM1MA, (pmmma[1]&~0x1));
|
||||
out32r(PMM1LA, pmmla[1]);
|
||||
out32r(PMM1PCILA, pmmpcila[1]);
|
||||
out32r(PMM1PCIHA, pmmpciha[1]);
|
||||
@@ -195,7 +195,7 @@ void pci_405gp_init(struct pci_controller *hose)
|
||||
/*--------------------------------------------------------------------------+
|
||||
* PMM2 is not used. Initialize them to zero.
|
||||
*--------------------------------------------------------------------------*/
|
||||
out32r(PMM2MA, pmmma[2]); /* ensure disabled b4 setting PMM2LA */
|
||||
out32r(PMM2MA, (pmmma[2]&~0x1));
|
||||
out32r(PMM2LA, pmmla[2]);
|
||||
out32r(PMM2PCILA, pmmpcila[2]);
|
||||
out32r(PMM2PCIHA, pmmpciha[2]);
|
||||
|
||||
@@ -30,6 +30,73 @@
|
||||
|
||||
#define mtebc(reg, data) mtdcr(ebccfga,reg);mtdcr(ebccfgd,data)
|
||||
|
||||
#ifdef CFG_INIT_DCACHE_CS
|
||||
# if (CFG_INIT_DCACHE_CS == 0)
|
||||
# define PBxAP pb0ap
|
||||
# define PBxCR pb0cr
|
||||
# if (defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR))
|
||||
# define PBxAP_VAL CFG_EBC_PB0AP
|
||||
# define PBxCR_VAL CFG_EBC_PB0CR
|
||||
# endif
|
||||
# endif
|
||||
# if (CFG_INIT_DCACHE_CS == 1)
|
||||
# define PBxAP pb1ap
|
||||
# define PBxCR pb1cr
|
||||
# if (defined(CFG_EBC_PB1AP) && defined(CFG_EBC_PB1CR))
|
||||
# define PBxAP_VAL CFG_EBC_PB1AP
|
||||
# define PBxCR_VAL CFG_EBC_PB1CR
|
||||
# endif
|
||||
# endif
|
||||
# if (CFG_INIT_DCACHE_CS == 2)
|
||||
# define PBxAP pb2ap
|
||||
# define PBxCR pb2cr
|
||||
# if (defined(CFG_EBC_PB2AP) && defined(CFG_EBC_PB2CR))
|
||||
# define PBxAP_VAL CFG_EBC_PB2AP
|
||||
# define PBxCR_VAL CFG_EBC_PB2CR
|
||||
# endif
|
||||
# endif
|
||||
# if (CFG_INIT_DCACHE_CS == 3)
|
||||
# define PBxAP pb3ap
|
||||
# define PBxCR pb3cr
|
||||
# if (defined(CFG_EBC_PB3AP) && defined(CFG_EBC_PB3CR))
|
||||
# define PBxAP_VAL CFG_EBC_PB3AP
|
||||
# define PBxCR_VAL CFG_EBC_PB3CR
|
||||
# endif
|
||||
# endif
|
||||
# if (CFG_INIT_DCACHE_CS == 4)
|
||||
# define PBxAP pb4ap
|
||||
# define PBxCR pb4cr
|
||||
# if (defined(CFG_EBC_PB4AP) && defined(CFG_EBC_PB4CR))
|
||||
# define PBxAP_VAL CFG_EBC_PB4AP
|
||||
# define PBxCR_VAL CFG_EBC_PB4CR
|
||||
# endif
|
||||
# endif
|
||||
# if (CFG_INIT_DCACHE_CS == 5)
|
||||
# define PBxAP pb5ap
|
||||
# define PBxCR pb5cr
|
||||
# if (defined(CFG_EBC_PB5AP) && defined(CFG_EBC_PB5CR))
|
||||
# define PBxAP_VAL CFG_EBC_PB5AP
|
||||
# define PBxCR_VAL CFG_EBC_PB5CR
|
||||
# endif
|
||||
# endif
|
||||
# if (CFG_INIT_DCACHE_CS == 6)
|
||||
# define PBxAP pb6ap
|
||||
# define PBxCR pb6cr
|
||||
# if (defined(CFG_EBC_PB6AP) && defined(CFG_EBC_PB6CR))
|
||||
# define PBxAP_VAL CFG_EBC_PB6AP
|
||||
# define PBxCR_VAL CFG_EBC_PB6CR
|
||||
# endif
|
||||
# endif
|
||||
# if (CFG_INIT_DCACHE_CS == 7)
|
||||
# define PBxAP pb7ap
|
||||
# define PBxCR pb7cr
|
||||
# if (defined(CFG_EBC_PB7AP) && defined(CFG_EBC_PB7CR))
|
||||
# define PBxAP_VAL CFG_EBC_PB7AP
|
||||
# define PBxCR_VAL CFG_EBC_PB7CR
|
||||
# endif
|
||||
# endif
|
||||
#endif /* CFG_INIT_DCACHE_CS */
|
||||
|
||||
|
||||
/*
|
||||
* Breath some life into the CPU...
|
||||
@@ -82,37 +149,37 @@ cpu_init_f (void)
|
||||
mtebc(pb0cr, CFG_EBC_PB0CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CFG_EBC_PB1AP) && defined(CFG_EBC_PB1CR))
|
||||
#if (defined(CFG_EBC_PB1AP) && defined(CFG_EBC_PB1CR) && !(CFG_INIT_DCACHE_CS == 1))
|
||||
mtebc(pb1ap, CFG_EBC_PB1AP);
|
||||
mtebc(pb1cr, CFG_EBC_PB1CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CFG_EBC_PB2AP) && defined(CFG_EBC_PB2CR))
|
||||
#if (defined(CFG_EBC_PB2AP) && defined(CFG_EBC_PB2CR) && !(CFG_INIT_DCACHE_CS == 2))
|
||||
mtebc(pb2ap, CFG_EBC_PB2AP);
|
||||
mtebc(pb2cr, CFG_EBC_PB2CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CFG_EBC_PB3AP) && defined(CFG_EBC_PB3CR))
|
||||
#if (defined(CFG_EBC_PB3AP) && defined(CFG_EBC_PB3CR) && !(CFG_INIT_DCACHE_CS == 3))
|
||||
mtebc(pb3ap, CFG_EBC_PB3AP);
|
||||
mtebc(pb3cr, CFG_EBC_PB3CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CFG_EBC_PB4AP) && defined(CFG_EBC_PB4CR))
|
||||
#if (defined(CFG_EBC_PB4AP) && defined(CFG_EBC_PB4CR) && !(CFG_INIT_DCACHE_CS == 4))
|
||||
mtebc(pb4ap, CFG_EBC_PB4AP);
|
||||
mtebc(pb4cr, CFG_EBC_PB4CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CFG_EBC_PB5AP) && defined(CFG_EBC_PB5CR))
|
||||
#if (defined(CFG_EBC_PB5AP) && defined(CFG_EBC_PB5CR) && !(CFG_INIT_DCACHE_CS == 5))
|
||||
mtebc(pb5ap, CFG_EBC_PB5AP);
|
||||
mtebc(pb5cr, CFG_EBC_PB5CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CFG_EBC_PB6AP) && defined(CFG_EBC_PB6CR))
|
||||
#if (defined(CFG_EBC_PB6AP) && defined(CFG_EBC_PB6CR) && !(CFG_INIT_DCACHE_CS == 6))
|
||||
mtebc(pb6ap, CFG_EBC_PB6AP);
|
||||
mtebc(pb6cr, CFG_EBC_PB6CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CFG_EBC_PB7AP) && defined(CFG_EBC_PB7CR))
|
||||
#if (defined(CFG_EBC_PB7AP) && defined(CFG_EBC_PB7CR) && !(CFG_INIT_DCACHE_CS == 7))
|
||||
mtebc(pb7ap, CFG_EBC_PB7AP);
|
||||
mtebc(pb7cr, CFG_EBC_PB7CR);
|
||||
#endif
|
||||
@@ -146,6 +213,24 @@ int cpu_init_r (void)
|
||||
uint pvr = get_pvr();
|
||||
#endif
|
||||
|
||||
#ifdef CFG_INIT_DCACHE_CS
|
||||
/*
|
||||
* Flush and invalidate dcache, then disable CS for temporary stack.
|
||||
* Afterwards, this CS can be used for other purposes
|
||||
*/
|
||||
dcache_disable(); /* flush and invalidate dcache */
|
||||
mtebc(PBxAP, 0);
|
||||
mtebc(PBxCR, 0); /* disable CS for temporary stack */
|
||||
|
||||
#if (defined(PBxAP_VAL) && defined(PBxCR_VAL))
|
||||
/*
|
||||
* Write new value into CS register
|
||||
*/
|
||||
mtebc(PBxAP, PBxAP_VAL);
|
||||
mtebc(PBxCR, PBxCR_VAL);
|
||||
#endif
|
||||
#endif /* CFG_INIT_DCACHE_CS */
|
||||
|
||||
/*
|
||||
* Write Ethernetaddress into on-chip register
|
||||
*/
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
/* Copyright MontaVista Software Incorporated, 2000 */
|
||||
|
||||
|
||||
#include <config.h>
|
||||
.section .resetvec,"ax"
|
||||
#if defined(CONFIG_440)
|
||||
b _start_440
|
||||
#else
|
||||
#if defined(CONFIG_BOOT_PCI) && defined(CONFIG_MIP405)
|
||||
b _start_pci
|
||||
#else
|
||||
b _start
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk
|
||||
LIB = lib$(CPU).a
|
||||
|
||||
START = start.o
|
||||
OBJS = serial.o interrupts.o cpu.o i2c.o
|
||||
OBJS = serial.o interrupts.o cpu.o i2c.o pxafb.o mmc.o
|
||||
|
||||
all: .depend $(START) $(LIB)
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <asm/arch/pxa-regs.h>
|
||||
|
||||
int cpu_init (void)
|
||||
{
|
||||
@@ -150,3 +151,21 @@ int dcache_status (void)
|
||||
{
|
||||
return 0; /* always off */
|
||||
}
|
||||
|
||||
void set_GPIO_mode(int gpio_mode)
|
||||
{
|
||||
int gpio = gpio_mode & GPIO_MD_MASK_NR;
|
||||
int fn = (gpio_mode & GPIO_MD_MASK_FN) >> 8;
|
||||
int gafr;
|
||||
|
||||
if (gpio_mode & GPIO_MD_MASK_DIR)
|
||||
{
|
||||
GPDR(gpio) |= GPIO_bit(gpio);
|
||||
}
|
||||
else
|
||||
{
|
||||
GPDR(gpio) &= ~GPIO_bit(gpio);
|
||||
}
|
||||
gafr = GAFR(gpio) & ~(0x3 << (((gpio) & 0xf)*2));
|
||||
GAFR(gpio) = gafr | (fn << (((gpio) & 0xf)*2));
|
||||
}
|
||||
|
||||
483
cpu/pxa/mmc.c
Normal file
483
cpu/pxa/mmc.c
Normal file
@@ -0,0 +1,483 @@
|
||||
/*
|
||||
* (C) Copyright 2003
|
||||
* Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <common.h>
|
||||
#include <mmc.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
|
||||
#ifdef CONFIG_MMC
|
||||
|
||||
extern int
|
||||
fat_register_read(int(*block_read)(int device, ulong blknr, ulong blkcnt, uchar *buffer));
|
||||
|
||||
/*
|
||||
* FIXME needs to read cid and csd info to determine block size
|
||||
* and other parameters
|
||||
*/
|
||||
static uchar mmc_buf[MMC_BLOCK_SIZE];
|
||||
static mmc_csd_t mmc_csd;
|
||||
static int mmc_ready = 0;
|
||||
|
||||
|
||||
static uchar *
|
||||
/****************************************************/
|
||||
mmc_cmd(ushort cmd, ushort argh, ushort argl, ushort cmdat)
|
||||
/****************************************************/
|
||||
{
|
||||
static uchar resp[20];
|
||||
ulong status;
|
||||
int words, i;
|
||||
|
||||
debug("mmc_cmd %x %x %x %x\n", cmd, argh, argl, cmdat);
|
||||
MMC_STRPCL = MMC_STRPCL_STOP_CLK;
|
||||
MMC_I_MASK = ~MMC_I_MASK_CLK_IS_OFF;
|
||||
while (!(MMC_I_REG & MMC_I_REG_CLK_IS_OFF));
|
||||
MMC_CMD = cmd;
|
||||
MMC_ARGH = argh;
|
||||
MMC_ARGL = argl;
|
||||
MMC_CMDAT = cmdat;
|
||||
MMC_I_MASK = ~MMC_I_MASK_END_CMD_RES;
|
||||
MMC_STRPCL = MMC_STRPCL_START_CLK;
|
||||
while (!(MMC_I_REG & MMC_I_REG_END_CMD_RES));
|
||||
|
||||
status = MMC_STAT;
|
||||
debug("MMC status %x\n", status);
|
||||
if (status & MMC_STAT_TIME_OUT_RESPONSE)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (cmdat & 0x3)
|
||||
{
|
||||
case MMC_CMDAT_R1:
|
||||
case MMC_CMDAT_R3:
|
||||
words = 3;
|
||||
break;
|
||||
|
||||
case MMC_CMDAT_R2:
|
||||
words = 8;
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
for (i = words-1; i >= 0; i--)
|
||||
{
|
||||
ulong res_fifo = MMC_RES;
|
||||
int offset = i << 1;
|
||||
|
||||
resp[offset] = ((uchar *)&res_fifo)[0];
|
||||
resp[offset+1] = ((uchar *)&res_fifo)[1];
|
||||
}
|
||||
#ifdef MMC_DEBUG
|
||||
for (i=0; i<words*2; i += 2)
|
||||
{
|
||||
printf("MMC resp[%d] = %02x\n", i, resp[i]);
|
||||
printf("MMC resp[%d] = %02x\n", i+1, resp[i+1]);
|
||||
}
|
||||
#endif
|
||||
return resp;
|
||||
}
|
||||
|
||||
int
|
||||
/****************************************************/
|
||||
mmc_block_read(uchar *dst, ulong src, ulong len)
|
||||
/****************************************************/
|
||||
{
|
||||
uchar *resp;
|
||||
ushort argh, argl;
|
||||
ulong status;
|
||||
|
||||
if (len == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
debug("mmc_block_rd dst %lx src %lx len %d\n", (ulong)dst, src, len);
|
||||
|
||||
argh = len >> 16;
|
||||
argl = len & 0xffff;
|
||||
|
||||
/* set block len */
|
||||
resp = mmc_cmd(MMC_CMD_SET_BLOCKLEN, argh, argl, MMC_CMDAT_R1);
|
||||
|
||||
/* send read command */
|
||||
argh = src >> 16;
|
||||
argl = src & 0xffff;
|
||||
MMC_STRPCL = MMC_STRPCL_STOP_CLK;
|
||||
MMC_RDTO = 0xffff;
|
||||
MMC_NOB = 1;
|
||||
MMC_BLKLEN = len;
|
||||
resp = mmc_cmd(MMC_CMD_READ_BLOCK, argh, argl,
|
||||
MMC_CMDAT_R1|MMC_CMDAT_READ|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN);
|
||||
|
||||
|
||||
MMC_I_MASK = ~MMC_I_MASK_RXFIFO_RD_REQ;
|
||||
while (len)
|
||||
{
|
||||
if (MMC_I_REG & MMC_I_REG_RXFIFO_RD_REQ)
|
||||
{
|
||||
*dst++ = MMC_RXFIFO;
|
||||
len--;
|
||||
}
|
||||
status = MMC_STAT;
|
||||
if (status & MMC_STAT_ERRORS)
|
||||
{
|
||||
printf("MMC_STAT error %lx\n", status);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
MMC_I_MASK = ~MMC_I_MASK_DATA_TRAN_DONE;
|
||||
while (!(MMC_I_REG & MMC_I_REG_DATA_TRAN_DONE));
|
||||
status = MMC_STAT;
|
||||
if (status & MMC_STAT_ERRORS)
|
||||
{
|
||||
printf("MMC_STAT error %lx\n", status);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
/****************************************************/
|
||||
mmc_block_write(ulong dst, uchar *src, int len)
|
||||
/****************************************************/
|
||||
{
|
||||
uchar *resp;
|
||||
ushort argh, argl;
|
||||
ulong status;
|
||||
|
||||
if (len == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
debug("mmc_block_wr dst %lx src %lx len %d\n", dst, (ulong)src, len);
|
||||
|
||||
argh = len >> 16;
|
||||
argl = len & 0xffff;
|
||||
|
||||
/* set block len */
|
||||
resp = mmc_cmd(MMC_CMD_SET_BLOCKLEN, argh, argl, MMC_CMDAT_R1);
|
||||
|
||||
/* send write command */
|
||||
argh = dst >> 16;
|
||||
argl = dst & 0xffff;
|
||||
MMC_STRPCL = MMC_STRPCL_STOP_CLK;
|
||||
MMC_NOB = 1;
|
||||
MMC_BLKLEN = len;
|
||||
resp = mmc_cmd(MMC_CMD_WRITE_BLOCK, argh, argl,
|
||||
MMC_CMDAT_R1|MMC_CMDAT_WRITE|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN);
|
||||
|
||||
MMC_I_MASK = ~MMC_I_MASK_TXFIFO_WR_REQ;
|
||||
while (len)
|
||||
{
|
||||
if (MMC_I_REG & MMC_I_REG_TXFIFO_WR_REQ)
|
||||
{
|
||||
int i, bytes = min(32,len);
|
||||
|
||||
for (i=0; i<bytes; i++)
|
||||
{
|
||||
MMC_TXFIFO = *src++;
|
||||
}
|
||||
if (bytes < 32)
|
||||
{
|
||||
MMC_PRTBUF = MMC_PRTBUF_BUF_PART_FULL;
|
||||
}
|
||||
len -= bytes;
|
||||
}
|
||||
status = MMC_STAT;
|
||||
if (status & MMC_STAT_ERRORS)
|
||||
{
|
||||
printf("MMC_STAT error %lx\n", status);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
MMC_I_MASK = ~MMC_I_MASK_DATA_TRAN_DONE;
|
||||
while (!(MMC_I_REG & MMC_I_REG_DATA_TRAN_DONE));
|
||||
MMC_I_MASK = ~MMC_I_MASK_PRG_DONE;
|
||||
while (!(MMC_I_REG & MMC_I_REG_PRG_DONE));
|
||||
status = MMC_STAT;
|
||||
if (status & MMC_STAT_ERRORS)
|
||||
{
|
||||
printf("MMC_STAT error %lx\n", status);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
/****************************************************/
|
||||
mmc_read(ulong src, uchar *dst, int size)
|
||||
/****************************************************/
|
||||
{
|
||||
ulong end, part_start, part_end, part_len, aligned_start, aligned_end;
|
||||
ulong mmc_block_size, mmc_block_address;
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!mmc_ready)
|
||||
{
|
||||
printf("Please initial the MMC first\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
mmc_block_size = MMC_BLOCK_SIZE;
|
||||
mmc_block_address = ~(mmc_block_size - 1);
|
||||
|
||||
src -= CFG_MMC_BASE;
|
||||
end = src + size;
|
||||
part_start = ~mmc_block_address & src;
|
||||
part_end = ~mmc_block_address & end;
|
||||
aligned_start = mmc_block_address & src;
|
||||
aligned_end = mmc_block_address & end;
|
||||
|
||||
/* all block aligned accesses */
|
||||
debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if (part_start)
|
||||
{
|
||||
part_len = mmc_block_size - part_start;
|
||||
debug("ps src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if ((mmc_block_read(mmc_buf, aligned_start, mmc_block_size)) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
memcpy(dst, mmc_buf+part_start, part_len);
|
||||
dst += part_len;
|
||||
src += part_len;
|
||||
}
|
||||
debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
for (; src < aligned_end; src += mmc_block_size, dst += mmc_block_size)
|
||||
{
|
||||
debug("al src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if ((mmc_block_read((uchar *)(dst), src, mmc_block_size)) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if (part_end && src < end)
|
||||
{
|
||||
debug("pe src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if ((mmc_block_read(mmc_buf, aligned_end, mmc_block_size)) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
memcpy(dst, mmc_buf, part_end);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
/****************************************************/
|
||||
mmc_write(uchar *src, ulong dst, int size)
|
||||
/****************************************************/
|
||||
{
|
||||
ulong end, part_start, part_end, part_len, aligned_start, aligned_end;
|
||||
ulong mmc_block_size, mmc_block_address;
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!mmc_ready)
|
||||
{
|
||||
printf("Please initial the MMC first\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
mmc_block_size = MMC_BLOCK_SIZE;
|
||||
mmc_block_address = ~(mmc_block_size - 1);
|
||||
|
||||
dst -= CFG_MMC_BASE;
|
||||
end = dst + size;
|
||||
part_start = ~mmc_block_address & dst;
|
||||
part_end = ~mmc_block_address & end;
|
||||
aligned_start = mmc_block_address & dst;
|
||||
aligned_end = mmc_block_address & end;
|
||||
|
||||
/* all block aligned accesses */
|
||||
debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if (part_start)
|
||||
{
|
||||
part_len = mmc_block_size - part_start;
|
||||
debug("ps src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
(ulong)src, dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if ((mmc_block_read(mmc_buf, aligned_start, mmc_block_size)) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
memcpy(mmc_buf+part_start, src, part_len);
|
||||
if ((mmc_block_write(aligned_start, mmc_buf, mmc_block_size)) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
dst += part_len;
|
||||
src += part_len;
|
||||
}
|
||||
debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
for (; dst < aligned_end; src += mmc_block_size, dst += mmc_block_size)
|
||||
{
|
||||
debug("al src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if ((mmc_block_write(dst, (uchar *)src, mmc_block_size)) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if (part_end && dst < end)
|
||||
{
|
||||
debug("pe src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n",
|
||||
src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end);
|
||||
if ((mmc_block_read(mmc_buf, aligned_end, mmc_block_size)) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
memcpy(mmc_buf, src, part_end);
|
||||
if ((mmc_block_write(aligned_end, mmc_buf, mmc_block_size)) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
/****************************************************/
|
||||
mmc_bread(int dev_num, ulong blknr, ulong blkcnt, uchar *dst)
|
||||
/****************************************************/
|
||||
{
|
||||
int mmc_block_size = MMC_BLOCK_SIZE;
|
||||
ulong src = blknr * mmc_block_size + CFG_MMC_BASE;
|
||||
|
||||
mmc_read(src, (uchar *)dst, blkcnt*mmc_block_size);
|
||||
return blkcnt;
|
||||
}
|
||||
|
||||
int
|
||||
/****************************************************/
|
||||
mmc_init(int verbose)
|
||||
/****************************************************/
|
||||
{
|
||||
int retries, rc = -ENODEV;
|
||||
uchar *resp;
|
||||
|
||||
#ifdef CONFIG_LUBBOCK
|
||||
set_GPIO_mode( GPIO6_MMCCLK_MD );
|
||||
set_GPIO_mode( GPIO8_MMCCS0_MD );
|
||||
#endif
|
||||
CKEN |= CKEN12_MMC; /* enable MMC unit clock */
|
||||
|
||||
mmc_csd.c_size = 0;
|
||||
|
||||
MMC_CLKRT = MMC_CLKRT_0_3125MHZ;
|
||||
MMC_RESTO = MMC_RES_TO_MAX;
|
||||
MMC_SPI = MMC_SPI_DISABLE;
|
||||
|
||||
/* reset */
|
||||
retries = 10;
|
||||
resp = mmc_cmd(0, 0, 0, 0);
|
||||
resp = mmc_cmd(1, 0x00ff, 0xc000, MMC_CMDAT_INIT|MMC_CMDAT_BUSY|MMC_CMDAT_R3);
|
||||
while (retries-- && resp && !(resp[4] & 0x80))
|
||||
{
|
||||
debug("resp %x %x\n", resp[0], resp[1]);
|
||||
udelay(50);
|
||||
resp = mmc_cmd(1, 0x00ff, 0xff00, MMC_CMDAT_BUSY|MMC_CMDAT_R3);
|
||||
}
|
||||
|
||||
/* try to get card id */
|
||||
resp = mmc_cmd(2, 0, 0, MMC_CMDAT_R2);
|
||||
if (resp)
|
||||
{
|
||||
/* TODO configure mmc driver depending on card attributes */
|
||||
mmc_cid_t *cid = (mmc_cid_t *)resp;
|
||||
if (verbose)
|
||||
{
|
||||
printf("MMC found. Card desciption is:\n");
|
||||
printf("Manufacturer ID = %02x%02x%02x\n",
|
||||
cid->id[0], cid->id[1], cid->id[2]);
|
||||
printf("HW/FW Revision = %x %x\n",cid->hwrev, cid->fwrev);
|
||||
cid->hwrev = cid->fwrev = 0; /* null terminate string */
|
||||
printf("Product Name = %s\n",cid->name);
|
||||
printf("Serial Number = %02x%02x%02x\n",
|
||||
cid->sn[0], cid->sn[1], cid->sn[2]);
|
||||
printf("Month = %d\n",cid->month);
|
||||
printf("Year = %d\n",1997 + cid->year);
|
||||
}
|
||||
|
||||
/* MMC exists, get CSD too */
|
||||
resp = mmc_cmd(MMC_CMD_SET_RCA, MMC_DEFAULT_RCA, 0, MMC_CMDAT_R1);
|
||||
resp = mmc_cmd(MMC_CMD_SEND_CSD, MMC_DEFAULT_RCA, 0, MMC_CMDAT_R2);
|
||||
if (resp)
|
||||
{
|
||||
mmc_csd_t *csd = (mmc_csd_t *)resp;
|
||||
memcpy(&mmc_csd, csd, sizeof(csd));
|
||||
rc = 0;
|
||||
mmc_ready = 1;
|
||||
/* FIXME add verbose printout for csd */
|
||||
}
|
||||
}
|
||||
|
||||
MMC_CLKRT = 0; /* 20 MHz */
|
||||
resp = mmc_cmd(7, MMC_DEFAULT_RCA, 0, MMC_CMDAT_R1);
|
||||
|
||||
fat_register_read(mmc_bread);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
mmc_ident(block_dev_desc_t *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
mmc2info(ulong addr)
|
||||
{
|
||||
/* FIXME hard codes to 32 MB device */
|
||||
if (addr >= CFG_MMC_BASE && addr < CFG_MMC_BASE + 0x02000000)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
1089
cpu/pxa/pxafb.c
Normal file
1089
cpu/pxa/pxafb.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -317,6 +317,17 @@ static int poll4int( byte mask, int timeout ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Only one release command at a time, please */
|
||||
static inline void smc_wait_mmu_release_complete(void)
|
||||
{
|
||||
int count = 0;
|
||||
/* assume bank 2 selected */
|
||||
while ( SMC_inw(MMU_CMD_REG) & MC_BUSY ) {
|
||||
udelay(1); // Wait until not busy
|
||||
if( ++count > 200) break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
. Function: smc_reset( void )
|
||||
. Purpose:
|
||||
@@ -374,6 +385,7 @@ static void smc_reset( void )
|
||||
|
||||
/* Reset the MMU */
|
||||
SMC_SELECT_BANK( 2 );
|
||||
smc_wait_mmu_release_complete();
|
||||
SMC_outw( MC_RESET, MMU_CMD_REG );
|
||||
while ( SMC_inw( MMU_CMD_REG ) & MC_BUSY )
|
||||
udelay(1); /* Wait until not busy */
|
||||
@@ -674,6 +686,8 @@ static int smc_open()
|
||||
/* SMC_SELECT_BANK(0); */
|
||||
/* SMC_outw(0, RPC_REG); */
|
||||
|
||||
SMC_SELECT_BANK(1);
|
||||
|
||||
#ifdef USE_32_BIT
|
||||
for ( i = 0; i < 6; i += 2 ) {
|
||||
word address;
|
||||
|
||||
@@ -80,7 +80,7 @@ typedef unsigned long int dword;
|
||||
#define SMC_inw(r) (*((volatile word *)(SMC_BASE_ADDRESS+(r))))
|
||||
#define SMC_inb(p) ({ \
|
||||
unsigned int __p = (unsigned int)(SMC_BASE_ADDRESS + (p)); \
|
||||
unsigned int __v = *(volatile unsigned short *)((SMC_BASE_ADDRESS + __p) & ~1); \
|
||||
unsigned int __v = *(volatile unsigned short *)((__p) & ~1); \
|
||||
if (__p & 1) __v >>= 8; \
|
||||
else __v &= 0xff; \
|
||||
__v; })
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#
|
||||
#
|
||||
|
||||
SUBDIRS := jffs2 fdos
|
||||
SUBDIRS := jffs2 fdos fat
|
||||
|
||||
.depend all:
|
||||
@for dir in $(SUBDIRS) ; do \
|
||||
|
||||
46
fs/fat/Makefile
Normal file
46
fs/fat/Makefile
Normal file
@@ -0,0 +1,46 @@
|
||||
#
|
||||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
TOPDIR=../../
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = libfat.a
|
||||
|
||||
AOBJS =
|
||||
COBJS = fat.o file.o
|
||||
|
||||
OBJS = $(AOBJS) $(COBJS)
|
||||
|
||||
all: $(LIB) $(AOBJS)
|
||||
|
||||
$(LIB): .depend $(OBJS)
|
||||
$(AR) crv $@ $(OBJS)
|
||||
|
||||
|
||||
#########################################################################
|
||||
|
||||
.depend: Makefile $(AOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
$(CC) -M $(CFLAGS) $(AOBJS:.o=.S) $(COBJS:.o=.c) > $@
|
||||
|
||||
sinclude .depend
|
||||
|
||||
#########################################################################
|
||||
901
fs/fat/fat.c
Normal file
901
fs/fat/fat.c
Normal file
@@ -0,0 +1,901 @@
|
||||
/*
|
||||
* fat.c
|
||||
*
|
||||
* R/O (V)FAT 12/16/32 filesystem implementation by Marcus Sundberg
|
||||
*
|
||||
* 2002-07-28 - rjones@nexus-tech.net - ported to ppcboot v1.1.6
|
||||
* 2003-03-10 - kharris@nexus-tech.net - ported to uboot
|
||||
*
|
||||
* 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 <config.h>
|
||||
#include <fat.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_FAT)
|
||||
|
||||
/*
|
||||
* Convert a string to lowercase.
|
||||
*/
|
||||
static void
|
||||
downcase(char *str)
|
||||
{
|
||||
while (*str != '\0') {
|
||||
TOLOWER(*str);
|
||||
str++;
|
||||
}
|
||||
}
|
||||
|
||||
int (*dev_block_read)(int device, __u32 blknr, __u32 blkcnt, __u8 *buffer) = 0;
|
||||
|
||||
int disk_read (__u32 startblock, __u32 getsize, __u8 * bufptr)
|
||||
{
|
||||
/* FIXME we need to determine the start block of the
|
||||
* partition where the DOS FS resides
|
||||
*/
|
||||
startblock += 32;
|
||||
|
||||
if (dev_block_read) {
|
||||
return dev_block_read (0, startblock, getsize, bufptr);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
fat_register_read (int (*block_read)(int, __u32, __u32, __u8 *))
|
||||
{
|
||||
dev_block_read = block_read;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Get the first occurence of a directory delimiter ('/' or '\') in a string.
|
||||
* Return index into string if found, -1 otherwise.
|
||||
*/
|
||||
static int
|
||||
dirdelim(char *str)
|
||||
{
|
||||
char *start = str;
|
||||
|
||||
while (*str != '\0') {
|
||||
if (ISDIRDELIM(*str)) return str - start;
|
||||
str++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Match volume_info fs_type strings.
|
||||
* Return 0 on match, -1 otherwise.
|
||||
*/
|
||||
static int
|
||||
compare_sign(char *str1, char *str2)
|
||||
{
|
||||
char *end = str1+SIGNLEN;
|
||||
|
||||
while (str1 != end) {
|
||||
if (*str1 != *str2) {
|
||||
return -1;
|
||||
}
|
||||
str1++;
|
||||
str2++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Extract zero terminated short name from a directory entry.
|
||||
*/
|
||||
static void get_name (dir_entry *dirent, char *s_name)
|
||||
{
|
||||
char *ptr;
|
||||
|
||||
memcpy (s_name, dirent->name, 8);
|
||||
s_name[8] = '\0';
|
||||
ptr = s_name;
|
||||
while (*ptr && *ptr != ' ')
|
||||
ptr++;
|
||||
if (dirent->ext[0] && dirent->ext[0] != ' ') {
|
||||
*ptr = '.';
|
||||
ptr++;
|
||||
memcpy (ptr, dirent->ext, 3);
|
||||
ptr[3] = '\0';
|
||||
while (*ptr && *ptr != ' ')
|
||||
ptr++;
|
||||
}
|
||||
*ptr = '\0';
|
||||
if (*s_name == DELETED_FLAG)
|
||||
*s_name = '\0';
|
||||
else if (*s_name == aRING)
|
||||
*s_name = 'å';
|
||||
downcase (s_name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the entry at index 'entry' in a FAT (12/16/32) table.
|
||||
* On failure 0x00 is returned.
|
||||
*/
|
||||
static __u32
|
||||
get_fatent(fsdata *mydata, __u32 entry)
|
||||
{
|
||||
__u32 bufnum;
|
||||
__u32 offset;
|
||||
__u32 ret = 0x00;
|
||||
|
||||
switch (mydata->fatsize) {
|
||||
case 32:
|
||||
bufnum = entry / FAT32BUFSIZE;
|
||||
offset = entry - bufnum * FAT32BUFSIZE;
|
||||
break;
|
||||
case 16:
|
||||
bufnum = entry / FAT16BUFSIZE;
|
||||
offset = entry - bufnum * FAT16BUFSIZE;
|
||||
break;
|
||||
case 12:
|
||||
bufnum = entry / FAT12BUFSIZE;
|
||||
offset = entry - bufnum * FAT12BUFSIZE;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Unsupported FAT size */
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Read a new block of FAT entries into the cache. */
|
||||
if (bufnum != mydata->fatbufnum) {
|
||||
int getsize = FATBUFSIZE/FS_BLOCK_SIZE;
|
||||
__u8 *bufptr = mydata->fatbuf;
|
||||
__u32 fatlength = mydata->fatlength;
|
||||
__u32 startblock = bufnum * FATBUFBLOCKS;
|
||||
|
||||
fatlength *= SECTOR_SIZE; /* We want it in bytes now */
|
||||
startblock += mydata->fat_sect; /* Offset from start of disk */
|
||||
|
||||
if (getsize > fatlength) getsize = fatlength;
|
||||
if (disk_read(startblock, getsize, bufptr) < 0) {
|
||||
FAT_DPRINT("Error reading FAT blocks\n");
|
||||
return ret;
|
||||
}
|
||||
mydata->fatbufnum = bufnum;
|
||||
}
|
||||
|
||||
/* Get the actual entry from the table */
|
||||
switch (mydata->fatsize) {
|
||||
case 32:
|
||||
ret = FAT2CPU32(((__u32*)mydata->fatbuf)[offset]);
|
||||
break;
|
||||
case 16:
|
||||
ret = FAT2CPU16(((__u16*)mydata->fatbuf)[offset]);
|
||||
break;
|
||||
case 12: {
|
||||
__u32 off16 = (offset*3)/4;
|
||||
__u16 val1, val2;
|
||||
|
||||
switch (offset & 0x3) {
|
||||
case 0:
|
||||
ret = FAT2CPU16(((__u16*)mydata->fatbuf)[off16]);
|
||||
ret &= 0xfff;
|
||||
break;
|
||||
case 1:
|
||||
val1 = FAT2CPU16(((__u16*)mydata->fatbuf)[off16]);
|
||||
val1 &= 0xf000;
|
||||
val2 = FAT2CPU16(((__u16*)mydata->fatbuf)[off16+1]);
|
||||
val2 &= 0x00ff;
|
||||
ret = (val2 << 4) | (val1 >> 12);
|
||||
break;
|
||||
case 2:
|
||||
val1 = FAT2CPU16(((__u16*)mydata->fatbuf)[off16]);
|
||||
val1 &= 0xff00;
|
||||
val2 = FAT2CPU16(((__u16*)mydata->fatbuf)[off16+1]);
|
||||
val2 &= 0x000f;
|
||||
ret = (val2 << 8) | (val1 >> 8);
|
||||
break;
|
||||
case 3:
|
||||
ret = FAT2CPU16(((__u16*)mydata->fatbuf)[off16]);;
|
||||
ret = (ret & 0xfff0) >> 4;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
FAT_DPRINT("ret: %d, offset: %d\n", ret, offset);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Read at most 'size' bytes from the specified cluster into 'buffer'.
|
||||
* Return 0 on success, -1 otherwise.
|
||||
*/
|
||||
static int
|
||||
get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
|
||||
{
|
||||
int idx = 0;
|
||||
__u32 startsect;
|
||||
|
||||
if (clustnum > 0) {
|
||||
startsect = mydata->data_begin + clustnum*mydata->clust_size;
|
||||
} else {
|
||||
startsect = mydata->rootdir_sect;
|
||||
}
|
||||
|
||||
FAT_DPRINT("gc - clustnum: %d, startsect: %d\n", clustnum, startsect);
|
||||
while (size > 0) {
|
||||
if (size >= FS_BLOCK_SIZE) {
|
||||
if (disk_read(startsect + idx, 1, buffer) < 0) {
|
||||
FAT_DPRINT("Error reading data\n");
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
__u8 tmpbuf[FS_BLOCK_SIZE];
|
||||
if (disk_read(startsect + idx, 1, tmpbuf) < 0) {
|
||||
FAT_DPRINT("Error reading data\n");
|
||||
return -1;
|
||||
}
|
||||
memcpy(buffer, tmpbuf, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
buffer += FS_BLOCK_SIZE;
|
||||
size -= FS_BLOCK_SIZE;
|
||||
idx++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Read at most 'maxsize' bytes from the file associated with 'dentptr'
|
||||
* into 'buffer'.
|
||||
* Return the number of bytes read or -1 on fatal errors.
|
||||
*/
|
||||
static long
|
||||
get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
|
||||
unsigned long maxsize)
|
||||
{
|
||||
unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
|
||||
unsigned int bytesperclust = mydata->clust_size * SECTOR_SIZE;
|
||||
__u32 curclust = START(dentptr);
|
||||
|
||||
FAT_DPRINT("Filesize: %ld bytes\n", filesize);
|
||||
|
||||
if (maxsize > 0 && filesize > maxsize) filesize = maxsize;
|
||||
|
||||
FAT_DPRINT("Reading: %ld bytes\n", filesize);
|
||||
|
||||
do {
|
||||
int getsize = (filesize > bytesperclust) ? bytesperclust :
|
||||
filesize;
|
||||
|
||||
if (get_cluster(mydata, curclust, buffer, getsize) != 0) {
|
||||
FAT_ERROR("Error reading cluster\n");
|
||||
return -1;
|
||||
}
|
||||
gotsize += getsize;
|
||||
filesize -= getsize;
|
||||
if (filesize <= 0) return gotsize;
|
||||
buffer += getsize;
|
||||
|
||||
curclust = get_fatent(mydata, curclust);
|
||||
if (curclust <= 0x0001 || curclust >= 0xfff0) {
|
||||
FAT_DPRINT("curclust: 0x%x\n", curclust);
|
||||
FAT_ERROR("Invalid FAT entry\n");
|
||||
return gotsize;
|
||||
}
|
||||
} while (1);
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_SUPPORT_VFAT
|
||||
/*
|
||||
* Extract the file name information from 'slotptr' into 'l_name',
|
||||
* starting at l_name[*idx].
|
||||
* Return 1 if terminator (zero byte) is found, 0 otherwise.
|
||||
*/
|
||||
static int
|
||||
slot2str(dir_slot *slotptr, char *l_name, int *idx)
|
||||
{
|
||||
int j;
|
||||
|
||||
for (j = 0; j <= 8; j += 2) {
|
||||
l_name[*idx] = slotptr->name0_4[j];
|
||||
if (l_name[*idx] == 0x00) return 1;
|
||||
(*idx)++;
|
||||
}
|
||||
for (j = 0; j <= 10; j += 2) {
|
||||
l_name[*idx] = slotptr->name5_10[j];
|
||||
if (l_name[*idx] == 0x00) return 1;
|
||||
(*idx)++;
|
||||
}
|
||||
for (j = 0; j <= 2; j += 2) {
|
||||
l_name[*idx] = slotptr->name11_12[j];
|
||||
if (l_name[*idx] == 0x00) return 1;
|
||||
(*idx)++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Extract the full long filename starting at 'retdent' (which is really
|
||||
* a slot) into 'l_name'. If successful also copy the real directory entry
|
||||
* into 'retdent'
|
||||
* Return 0 on success, -1 otherwise.
|
||||
*/
|
||||
static int
|
||||
get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,
|
||||
dir_entry *retdent, char *l_name)
|
||||
{
|
||||
dir_entry *realdent;
|
||||
dir_slot *slotptr = (dir_slot*) retdent;
|
||||
__u8 *nextclust = cluster + mydata->clust_size * SECTOR_SIZE;
|
||||
__u8 counter = slotptr->id & 0xf;
|
||||
int idx = 0;
|
||||
|
||||
while ((__u8*)slotptr < nextclust) {
|
||||
if (counter == 0) break;
|
||||
if ((slotptr->id & 0x0f) != counter) return -1;
|
||||
slotptr++;
|
||||
counter--;
|
||||
}
|
||||
|
||||
if ((__u8*)slotptr >= nextclust) {
|
||||
__u8 block[MAX_CLUSTSIZE];
|
||||
dir_slot *slotptr2;
|
||||
|
||||
slotptr--;
|
||||
curclust = get_fatent(mydata, curclust);
|
||||
if (curclust <= 0x0001 || curclust >= 0xfff0) {
|
||||
FAT_DPRINT("curclust: 0x%x\n", curclust);
|
||||
FAT_ERROR("Invalid FAT entry\n");
|
||||
return -1;
|
||||
}
|
||||
if (get_cluster(mydata, curclust, block,
|
||||
mydata->clust_size * SECTOR_SIZE) != 0) {
|
||||
FAT_DPRINT("Error: reading directory block\n");
|
||||
return -1;
|
||||
}
|
||||
slotptr2 = (dir_slot*) block;
|
||||
while (slotptr2->id > 0x01) {
|
||||
slotptr2++;
|
||||
}
|
||||
/* Save the real directory entry */
|
||||
realdent = (dir_entry*)slotptr2 + 1;
|
||||
while ((__u8*)slotptr2 >= block) {
|
||||
slot2str(slotptr2, l_name, &idx);
|
||||
slotptr2--;
|
||||
}
|
||||
} else {
|
||||
/* Save the real directory entry */
|
||||
realdent = (dir_entry*)slotptr;
|
||||
}
|
||||
|
||||
do {
|
||||
slotptr--;
|
||||
if (slot2str(slotptr, l_name, &idx)) break;
|
||||
} while (!(slotptr->id & 0x40));
|
||||
|
||||
l_name[idx] = '\0';
|
||||
if (*l_name == DELETED_FLAG) *l_name = '\0';
|
||||
else if (*l_name == aRING) *l_name = 'å';
|
||||
downcase(l_name);
|
||||
|
||||
/* Return the real directory entry */
|
||||
memcpy(retdent, realdent, sizeof(dir_entry));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Calculate short name checksum */
|
||||
static __u8
|
||||
mkcksum(const char *str)
|
||||
{
|
||||
int i;
|
||||
__u8 ret = 0;
|
||||
|
||||
for (i = 0; i < 11; i++) {
|
||||
ret = (((ret&1)<<7)|((ret&0xfe)>>1)) + str[i];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Get the directory entry associated with 'filename' from the directory
|
||||
* starting at 'startsect'
|
||||
*/
|
||||
static dir_entry *get_dentfromdir (fsdata * mydata, int startsect,
|
||||
char *filename, dir_entry * retdent,
|
||||
int dols)
|
||||
{
|
||||
__u16 prevcksum = 0xffff;
|
||||
__u8 block[MAX_CLUSTSIZE];
|
||||
__u32 curclust = START (retdent);
|
||||
int files = 0, dirs = 0;
|
||||
|
||||
FAT_DPRINT ("get_dentfromdir: %s\n", filename);
|
||||
while (1) {
|
||||
dir_entry *dentptr;
|
||||
int i;
|
||||
|
||||
if (get_cluster (mydata, curclust, block,
|
||||
mydata->clust_size * SECTOR_SIZE) != 0) {
|
||||
FAT_DPRINT ("Error: reading directory block\n");
|
||||
return NULL;
|
||||
}
|
||||
dentptr = (dir_entry *) block;
|
||||
for (i = 0; i < DIRENTSPERCLUST; i++) {
|
||||
char s_name[14], l_name[256];
|
||||
|
||||
l_name[0] = '\0';
|
||||
if ((dentptr->attr & ATTR_VOLUME)) {
|
||||
#ifdef CONFIG_SUPPORT_VFAT
|
||||
if ((dentptr->attr & ATTR_VFAT) &&
|
||||
(dentptr->name[0] & 0x40)) {
|
||||
prevcksum = ((dir_slot *) dentptr)
|
||||
->alias_checksum;
|
||||
get_vfatname (mydata, curclust, block,
|
||||
dentptr, l_name);
|
||||
if (dols) {
|
||||
int isdir = (dentptr->attr & ATTR_DIR);
|
||||
char dirc;
|
||||
int doit = 0;
|
||||
|
||||
if (isdir) {
|
||||
dirs++;
|
||||
dirc = '/';
|
||||
doit = 1;
|
||||
} else {
|
||||
dirc = ' ';
|
||||
if (l_name[0] != 0) {
|
||||
files++;
|
||||
doit = 1;
|
||||
}
|
||||
}
|
||||
if (doit) {
|
||||
if (dirc == ' ') {
|
||||
printf (" %8ld %s%c\n",
|
||||
(long) FAT2CPU32 (dentptr->size),
|
||||
l_name, dirc);
|
||||
} else {
|
||||
printf (" %s%c\n", l_name, dirc);
|
||||
}
|
||||
}
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
FAT_DPRINT ("vfatname: |%s|\n", l_name);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
/* Volume label or VFAT entry */
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (dentptr->name[0] == 0) {
|
||||
if (dols) {
|
||||
printf ("\n%d file(s), %d dir(s)\n\n", files, dirs);
|
||||
}
|
||||
FAT_DPRINT ("Dentname == NULL - %d\n", i);
|
||||
return NULL;
|
||||
}
|
||||
#ifdef CONFIG_SUPPORT_VFAT
|
||||
if (dols && mkcksum (dentptr->name) == prevcksum) {
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
get_name (dentptr, s_name);
|
||||
if (dols) {
|
||||
int isdir = (dentptr->attr & ATTR_DIR);
|
||||
char dirc;
|
||||
int doit = 0;
|
||||
|
||||
if (isdir) {
|
||||
dirs++;
|
||||
dirc = '/';
|
||||
doit = 1;
|
||||
} else {
|
||||
dirc = ' ';
|
||||
if (s_name[0] != 0) {
|
||||
files++;
|
||||
doit = 1;
|
||||
}
|
||||
}
|
||||
if (doit) {
|
||||
if (dirc == ' ') {
|
||||
printf (" %8ld %s%c\n",
|
||||
(long) FAT2CPU32 (dentptr->size), s_name,
|
||||
dirc);
|
||||
} else {
|
||||
printf (" %s%c\n", s_name, dirc);
|
||||
}
|
||||
}
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
if (strcmp (filename, s_name) && strcmp (filename, l_name)) {
|
||||
FAT_DPRINT ("Mismatch: |%s|%s|\n", s_name, l_name);
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
memcpy (retdent, dentptr, sizeof (dir_entry));
|
||||
|
||||
FAT_DPRINT ("DentName: %s", s_name);
|
||||
FAT_DPRINT (", start: 0x%x", START (dentptr));
|
||||
FAT_DPRINT (", size: 0x%x %s\n",
|
||||
FAT2CPU32 (dentptr->size),
|
||||
(dentptr->attr & ATTR_DIR) ? "(DIR)" : "");
|
||||
|
||||
return retdent;
|
||||
}
|
||||
curclust = get_fatent (mydata, curclust);
|
||||
if (curclust <= 0x0001 || curclust >= 0xfff0) {
|
||||
FAT_DPRINT ("curclust: 0x%x\n", curclust);
|
||||
FAT_ERROR ("Invalid FAT entry\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Read boot sector and volume info from a FAT filesystem
|
||||
*/
|
||||
static int
|
||||
read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)
|
||||
{
|
||||
__u8 block[FS_BLOCK_SIZE];
|
||||
volume_info *vistart;
|
||||
|
||||
if (disk_read(0, 1, block) < 0) {
|
||||
FAT_DPRINT("Error: reading block\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(bs, block, sizeof(boot_sector));
|
||||
bs->reserved = FAT2CPU16(bs->reserved);
|
||||
bs->fat_length = FAT2CPU16(bs->fat_length);
|
||||
bs->secs_track = FAT2CPU16(bs->secs_track);
|
||||
bs->heads = FAT2CPU16(bs->heads);
|
||||
#if 0 /* UNUSED */
|
||||
bs->hidden = FAT2CPU32(bs->hidden);
|
||||
#endif
|
||||
bs->total_sect = FAT2CPU32(bs->total_sect);
|
||||
|
||||
/* FAT32 entries */
|
||||
if (bs->fat_length == 0) {
|
||||
/* Assume FAT32 */
|
||||
bs->fat32_length = FAT2CPU32(bs->fat32_length);
|
||||
bs->flags = FAT2CPU16(bs->flags);
|
||||
bs->root_cluster = FAT2CPU32(bs->root_cluster);
|
||||
bs->info_sector = FAT2CPU16(bs->info_sector);
|
||||
bs->backup_boot = FAT2CPU16(bs->backup_boot);
|
||||
vistart = (volume_info*) (block + sizeof(boot_sector));
|
||||
*fatsize = 32;
|
||||
} else {
|
||||
vistart = (volume_info*) &(bs->fat32_length);
|
||||
*fatsize = 0;
|
||||
}
|
||||
memcpy(volinfo, vistart, sizeof(volume_info));
|
||||
|
||||
/* Terminate fs_type string. Writing past the end of vistart
|
||||
is ok - it's just the buffer. */
|
||||
vistart->fs_type[8] = '\0';
|
||||
|
||||
if (*fatsize == 32) {
|
||||
if (compare_sign(FAT32_SIGN, vistart->fs_type) == 0) {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (compare_sign(FAT12_SIGN, vistart->fs_type) == 0) {
|
||||
*fatsize = 12;
|
||||
return 0;
|
||||
}
|
||||
if (compare_sign(FAT16_SIGN, vistart->fs_type) == 0) {
|
||||
*fatsize = 16;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
FAT_DPRINT("Error: broken fs_type sign\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
static long
|
||||
do_fat_read (const char *filename, void *buffer, unsigned long maxsize,
|
||||
int dols)
|
||||
{
|
||||
__u8 block[FS_BLOCK_SIZE]; /* Block buffer */
|
||||
char fnamecopy[2048];
|
||||
boot_sector bs;
|
||||
volume_info volinfo;
|
||||
fsdata datablock;
|
||||
fsdata *mydata = &datablock;
|
||||
dir_entry *dentptr;
|
||||
__u16 prevcksum = 0xffff;
|
||||
char *subname = "";
|
||||
int rootdir_size, cursect;
|
||||
int idx, isdir = 0;
|
||||
int files = 0, dirs = 0;
|
||||
long ret = 0;
|
||||
int firsttime;
|
||||
|
||||
if (read_bootsectandvi (&bs, &volinfo, &mydata->fatsize)) {
|
||||
FAT_DPRINT ("Error: reading boot sector\n");
|
||||
return -1;
|
||||
}
|
||||
if (mydata->fatsize == 32) {
|
||||
mydata->fatlength = bs.fat32_length;
|
||||
} else {
|
||||
mydata->fatlength = bs.fat_length;
|
||||
}
|
||||
mydata->fat_sect = bs.reserved;
|
||||
cursect = mydata->rootdir_sect
|
||||
= mydata->fat_sect + mydata->fatlength * bs.fats;
|
||||
mydata->clust_size = bs.cluster_size;
|
||||
if (mydata->fatsize == 32) {
|
||||
rootdir_size = mydata->clust_size;
|
||||
mydata->data_begin = mydata->rootdir_sect /* + rootdir_size */
|
||||
- (mydata->clust_size * 2);
|
||||
} else {
|
||||
rootdir_size = ((bs.dir_entries[1] * (int) 256 + bs.dir_entries[0])
|
||||
* sizeof (dir_entry)) / SECTOR_SIZE;
|
||||
mydata->data_begin = mydata->rootdir_sect + rootdir_size
|
||||
- (mydata->clust_size * 2);
|
||||
}
|
||||
mydata->fatbufnum = -1;
|
||||
|
||||
FAT_DPRINT ("FAT%d, fatlength: %d\n", mydata->fatsize,
|
||||
mydata->fatlength);
|
||||
FAT_DPRINT ("Rootdir begins at sector: %d, offset: %x, size: %d\n"
|
||||
"Data begins at: %d\n",
|
||||
mydata->rootdir_sect, mydata->rootdir_sect * SECTOR_SIZE,
|
||||
rootdir_size, mydata->data_begin);
|
||||
FAT_DPRINT ("Cluster size: %d\n", mydata->clust_size);
|
||||
|
||||
/* "cwd" is always the root... */
|
||||
while (ISDIRDELIM (*filename))
|
||||
filename++;
|
||||
/* Make a copy of the filename and convert it to lowercase */
|
||||
strcpy (fnamecopy, filename);
|
||||
downcase (fnamecopy);
|
||||
if (*fnamecopy == '\0') {
|
||||
if (!dols)
|
||||
return -1;
|
||||
dols = LS_ROOT;
|
||||
} else if ((idx = dirdelim (fnamecopy)) >= 0) {
|
||||
isdir = 1;
|
||||
fnamecopy[idx] = '\0';
|
||||
subname = fnamecopy + idx + 1;
|
||||
/* Handle multiple delimiters */
|
||||
while (ISDIRDELIM (*subname))
|
||||
subname++;
|
||||
} else if (dols) {
|
||||
isdir = 1;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
int i;
|
||||
|
||||
if (disk_read (cursect, 1, block) < 0) {
|
||||
FAT_DPRINT ("Error: reading rootdir block\n");
|
||||
return -1;
|
||||
}
|
||||
dentptr = (dir_entry *) block;
|
||||
for (i = 0; i < DIRENTSPERBLOCK; i++) {
|
||||
char s_name[14], l_name[256];
|
||||
|
||||
l_name[0] = '\0';
|
||||
if ((dentptr->attr & ATTR_VOLUME)) {
|
||||
#ifdef CONFIG_SUPPORT_VFAT
|
||||
if ((dentptr->attr & ATTR_VFAT) &&
|
||||
(dentptr->name[0] & 0x40)) {
|
||||
prevcksum = ((dir_slot *) dentptr)->alias_checksum;
|
||||
get_vfatname (mydata, 0, block, dentptr, l_name);
|
||||
if (dols == LS_ROOT) {
|
||||
int isdir = (dentptr->attr & ATTR_DIR);
|
||||
char dirc;
|
||||
int doit = 0;
|
||||
|
||||
if (isdir) {
|
||||
dirs++;
|
||||
dirc = '/';
|
||||
doit = 1;
|
||||
} else {
|
||||
dirc = ' ';
|
||||
if (l_name[0] != 0) {
|
||||
files++;
|
||||
doit = 1;
|
||||
}
|
||||
}
|
||||
if (doit) {
|
||||
if (dirc == ' ') {
|
||||
printf (" %8ld %s%c\n",
|
||||
(long) FAT2CPU32 (dentptr->size),
|
||||
l_name, dirc);
|
||||
} else {
|
||||
printf (" %s%c\n", l_name, dirc);
|
||||
}
|
||||
}
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
FAT_DPRINT ("Rootvfatname: |%s|\n", l_name);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
/* Volume label or VFAT entry */
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
} else if (dentptr->name[0] == 0) {
|
||||
FAT_DPRINT ("RootDentname == NULL - %d\n", i);
|
||||
if (dols == LS_ROOT) {
|
||||
printf ("\n%d file(s), %d dir(s)\n\n", files, dirs);
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
#ifdef CONFIG_SUPPORT_VFAT
|
||||
else if (dols == LS_ROOT
|
||||
&& mkcksum (dentptr->name) == prevcksum) {
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
get_name (dentptr, s_name);
|
||||
if (dols == LS_ROOT) {
|
||||
int isdir = (dentptr->attr & ATTR_DIR);
|
||||
char dirc;
|
||||
int doit = 0;
|
||||
|
||||
if (isdir) {
|
||||
dirs++;
|
||||
dirc = '/';
|
||||
doit = 1;
|
||||
} else {
|
||||
dirc = ' ';
|
||||
if (s_name[0] != 0) {
|
||||
files++;
|
||||
doit = 1;
|
||||
}
|
||||
}
|
||||
if (doit) {
|
||||
if (dirc == ' ') {
|
||||
printf (" %8ld %s%c\n",
|
||||
(long) FAT2CPU32 (dentptr->size), s_name,
|
||||
dirc);
|
||||
} else {
|
||||
printf (" %s%c\n", s_name, dirc);
|
||||
}
|
||||
}
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
if (strcmp (fnamecopy, s_name) && strcmp (fnamecopy, l_name)) {
|
||||
FAT_DPRINT ("RootMismatch: |%s|%s|\n", s_name, l_name);
|
||||
dentptr++;
|
||||
continue;
|
||||
}
|
||||
if (isdir && !(dentptr->attr & ATTR_DIR))
|
||||
return -1;
|
||||
|
||||
FAT_DPRINT ("RootName: %s", s_name);
|
||||
FAT_DPRINT (", start: 0x%x", START (dentptr));
|
||||
FAT_DPRINT (", size: 0x%x %s\n",
|
||||
FAT2CPU32 (dentptr->size), isdir ? "(DIR)" : "");
|
||||
|
||||
goto rootdir_done; /* We got a match */
|
||||
}
|
||||
cursect++;
|
||||
}
|
||||
rootdir_done:
|
||||
|
||||
firsttime = 1;
|
||||
while (isdir) {
|
||||
int startsect = mydata->data_begin
|
||||
+ START (dentptr) * mydata->clust_size;
|
||||
dir_entry dent;
|
||||
char *nextname = NULL;
|
||||
|
||||
dent = *dentptr;
|
||||
dentptr = &dent;
|
||||
|
||||
idx = dirdelim (subname);
|
||||
if (idx >= 0) {
|
||||
subname[idx] = '\0';
|
||||
nextname = subname + idx + 1;
|
||||
/* Handle multiple delimiters */
|
||||
while (ISDIRDELIM (*nextname))
|
||||
nextname++;
|
||||
if (dols && *nextname == '\0')
|
||||
firsttime = 0;
|
||||
} else {
|
||||
if (dols && firsttime) {
|
||||
firsttime = 0;
|
||||
} else {
|
||||
isdir = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (get_dentfromdir (mydata, startsect, subname, dentptr,
|
||||
isdir ? 0 : dols) == NULL) {
|
||||
if (dols && !isdir)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (idx >= 0) {
|
||||
if (!(dentptr->attr & ATTR_DIR))
|
||||
return -1;
|
||||
subname = nextname;
|
||||
}
|
||||
}
|
||||
ret = get_contents (mydata, dentptr, buffer, maxsize);
|
||||
FAT_DPRINT ("Size: %d, got: %ld\n", FAT2CPU32 (dentptr->size), ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_fat_detectfs(void)
|
||||
{
|
||||
boot_sector bs;
|
||||
volume_info volinfo;
|
||||
int fatsize;
|
||||
|
||||
return read_bootsectandvi(&bs, &volinfo, &fatsize);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_fat_ls(const char *dir)
|
||||
{
|
||||
return do_fat_read(dir, NULL, 0, LS_YES);
|
||||
}
|
||||
|
||||
|
||||
long
|
||||
file_fat_read(const char *filename, void *buffer, unsigned long maxsize)
|
||||
{
|
||||
return do_fat_read(filename, buffer, maxsize, LS_NO);
|
||||
}
|
||||
|
||||
#endif /* #if (CONFIG_COMMANDS & CFG_CMD_FAT) */
|
||||
208
fs/fat/file.c
Normal file
208
fs/fat/file.c
Normal file
@@ -0,0 +1,208 @@
|
||||
/*
|
||||
* file.c
|
||||
*
|
||||
* Mini "VFS" by Marcus Sundberg
|
||||
*
|
||||
* 2002-07-28 - rjones@nexus-tech.net - ported to ppcboot v1.1.6
|
||||
* 2003-03-10 - kharris@nexus-tech.net - ported to uboot
|
||||
*
|
||||
* 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 <config.h>
|
||||
#include <malloc.h>
|
||||
#include <fat.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/time.h>
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_FAT)
|
||||
|
||||
/* Supported filesystems */
|
||||
static const struct filesystem filesystems[] = {
|
||||
{ file_fat_detectfs, file_fat_ls, file_fat_read, "FAT" },
|
||||
};
|
||||
#define NUM_FILESYS (sizeof(filesystems)/sizeof(struct filesystem))
|
||||
|
||||
/* The filesystem which was last detected */
|
||||
static int current_filesystem = FSTYPE_NONE;
|
||||
|
||||
/* The current working directory */
|
||||
#define CWD_LEN 511
|
||||
char file_cwd[CWD_LEN+1] = "/";
|
||||
|
||||
const char *
|
||||
file_getfsname(int idx)
|
||||
{
|
||||
if (idx < 0 || idx >= NUM_FILESYS) return NULL;
|
||||
|
||||
return filesystems[idx].name;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pathcpy(char *dest, const char *src)
|
||||
{
|
||||
char *origdest = dest;
|
||||
|
||||
do {
|
||||
if (dest-file_cwd >= CWD_LEN) {
|
||||
*dest = '\0';
|
||||
return;
|
||||
}
|
||||
*(dest) = *(src);
|
||||
if (*src == '\0') {
|
||||
if (dest-- != origdest && ISDIRDELIM(*dest)) {
|
||||
*dest = '\0';
|
||||
}
|
||||
return;
|
||||
}
|
||||
++dest;
|
||||
if (ISDIRDELIM(*src)) {
|
||||
while (ISDIRDELIM(*src)) src++;
|
||||
} else {
|
||||
src++;
|
||||
}
|
||||
} while (1);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_cd(const char *path)
|
||||
{
|
||||
if (ISDIRDELIM(*path)) {
|
||||
while (ISDIRDELIM(*path)) path++;
|
||||
strncpy(file_cwd+1, path, CWD_LEN-1);
|
||||
} else {
|
||||
const char *origpath = path;
|
||||
char *tmpstr = file_cwd;
|
||||
int back = 0;
|
||||
|
||||
while (*tmpstr != '\0') tmpstr++;
|
||||
do {
|
||||
tmpstr--;
|
||||
} while (ISDIRDELIM(*tmpstr));
|
||||
|
||||
while (*path == '.') {
|
||||
path++;
|
||||
while (*path == '.') {
|
||||
path++;
|
||||
back++;
|
||||
}
|
||||
if (*path != '\0' && !ISDIRDELIM(*path)) {
|
||||
path = origpath;
|
||||
back = 0;
|
||||
break;
|
||||
}
|
||||
while (ISDIRDELIM(*path)) path++;
|
||||
origpath = path;
|
||||
}
|
||||
|
||||
while (back--) {
|
||||
/* Strip off path component */
|
||||
while (!ISDIRDELIM(*tmpstr)) {
|
||||
tmpstr--;
|
||||
}
|
||||
if (tmpstr == file_cwd) {
|
||||
/* Incremented again right after the loop. */
|
||||
tmpstr--;
|
||||
break;
|
||||
}
|
||||
/* Skip delimiters */
|
||||
while (ISDIRDELIM(*tmpstr)) tmpstr--;
|
||||
}
|
||||
tmpstr++;
|
||||
if (*path == '\0') {
|
||||
if (tmpstr == file_cwd) {
|
||||
*tmpstr = '/';
|
||||
tmpstr++;
|
||||
}
|
||||
*tmpstr = '\0';
|
||||
return 0;
|
||||
}
|
||||
*tmpstr = '/';
|
||||
pathcpy(tmpstr+1, path);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_detectfs(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
current_filesystem = FSTYPE_NONE;
|
||||
|
||||
for (i = 0; i < NUM_FILESYS; i++) {
|
||||
if (filesystems[i].detect() == 0) {
|
||||
strcpy(file_cwd, "/");
|
||||
current_filesystem = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return current_filesystem;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_ls(const char *dir)
|
||||
{
|
||||
char fullpath[1024];
|
||||
const char *arg;
|
||||
|
||||
if (current_filesystem == FSTYPE_NONE) {
|
||||
printf("Can't list files without a filesystem!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ISDIRDELIM(*dir)) {
|
||||
arg = dir;
|
||||
} else {
|
||||
sprintf(fullpath, "%s/%s", file_cwd, dir);
|
||||
arg = fullpath;
|
||||
}
|
||||
return filesystems[current_filesystem].ls(arg);
|
||||
}
|
||||
|
||||
|
||||
long
|
||||
file_read(const char *filename, void *buffer, unsigned long maxsize)
|
||||
{
|
||||
char fullpath[1024];
|
||||
const char *arg;
|
||||
|
||||
if (current_filesystem == FSTYPE_NONE) {
|
||||
printf("Can't load file without a filesystem!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ISDIRDELIM(*filename)) {
|
||||
arg = filename;
|
||||
} else {
|
||||
sprintf(fullpath, "%s/%s", file_cwd, filename);
|
||||
arg = fullpath;
|
||||
}
|
||||
|
||||
return filesystems[current_filesystem].read(arg, buffer, maxsize);
|
||||
}
|
||||
|
||||
#endif /* #if (CONFIG_COMMANDS & CFG_CMD_FAT) */
|
||||
@@ -241,6 +241,4 @@ struct arp_entry {
|
||||
/*-----------------------------------------------------------------------------+
|
||||
| Function prototypes for device table.
|
||||
+-----------------------------------------------------------------------------*/
|
||||
int enetInt(void);
|
||||
|
||||
#endif /* _enetLib_h_ */
|
||||
|
||||
200
include/asm-arm/arch-pxa/mmc.h
Normal file
200
include/asm-arm/arch-pxa/mmc.h
Normal file
@@ -0,0 +1,200 @@
|
||||
/*
|
||||
* linux/drivers/mmc/mmc_pxa.h
|
||||
*
|
||||
* Author: Vladimir Shebordaev, Igor Oblakov
|
||||
* Copyright: MontaVista Software Inc.
|
||||
*
|
||||
* $Id: mmc_pxa.h,v 0.3.1.6 2002/09/25 19:25:48 ted Exp ted $
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef __MMC_PXA_P_H__
|
||||
#define __MMC_PXA_P_H__
|
||||
|
||||
/* PXA-250 MMC controller registers */
|
||||
|
||||
/* MMC_STRPCL */
|
||||
#define MMC_STRPCL_STOP_CLK (0x0001UL)
|
||||
#define MMC_STRPCL_START_CLK (0x0002UL)
|
||||
|
||||
/* MMC_STAT */
|
||||
#define MMC_STAT_END_CMD_RES (0x0001UL << 13)
|
||||
#define MMC_STAT_PRG_DONE (0x0001UL << 12)
|
||||
#define MMC_STAT_DATA_TRAN_DONE (0x0001UL << 11)
|
||||
#define MMC_STAT_CLK_EN (0x0001UL << 8)
|
||||
#define MMC_STAT_RECV_FIFO_FULL (0x0001UL << 7)
|
||||
#define MMC_STAT_XMIT_FIFO_EMPTY (0x0001UL << 6)
|
||||
#define MMC_STAT_RES_CRC_ERROR (0x0001UL << 5)
|
||||
#define MMC_STAT_SPI_READ_ERROR_TOKEN (0x0001UL << 4)
|
||||
#define MMC_STAT_CRC_READ_ERROR (0x0001UL << 3)
|
||||
#define MMC_STAT_CRC_WRITE_ERROR (0x0001UL << 2)
|
||||
#define MMC_STAT_TIME_OUT_RESPONSE (0x0001UL << 1)
|
||||
#define MMC_STAT_READ_TIME_OUT (0x0001UL)
|
||||
|
||||
#define MMC_STAT_ERRORS (MMC_STAT_RES_CRC_ERROR|MMC_STAT_SPI_READ_ERROR_TOKEN\
|
||||
|MMC_STAT_CRC_READ_ERROR|MMC_STAT_TIME_OUT_RESPONSE\
|
||||
|MMC_STAT_READ_TIME_OUT|MMC_STAT_CRC_WRITE_ERROR)
|
||||
|
||||
/* MMC_CLKRT */
|
||||
#define MMC_CLKRT_20MHZ (0x0000UL)
|
||||
#define MMC_CLKRT_10MHZ (0x0001UL)
|
||||
#define MMC_CLKRT_5MHZ (0x0002UL)
|
||||
#define MMC_CLKRT_2_5MHZ (0x0003UL)
|
||||
#define MMC_CLKRT_1_25MHZ (0x0004UL)
|
||||
#define MMC_CLKRT_0_625MHZ (0x0005UL)
|
||||
#define MMC_CLKRT_0_3125MHZ (0x0006UL)
|
||||
|
||||
/* MMC_SPI */
|
||||
#define MMC_SPI_DISABLE (0x00UL)
|
||||
#define MMC_SPI_EN (0x01UL)
|
||||
#define MMC_SPI_CS_EN (0x01UL << 2)
|
||||
#define MMC_SPI_CS_ADDRESS (0x01UL << 3)
|
||||
#define MMC_SPI_CRC_ON (0x01UL << 1)
|
||||
|
||||
/* MMC_CMDAT */
|
||||
#define MMC_CMDAT_MMC_DMA_EN (0x0001UL << 7)
|
||||
#define MMC_CMDAT_INIT (0x0001UL << 6)
|
||||
#define MMC_CMDAT_BUSY (0x0001UL << 5)
|
||||
#define MMC_CMDAT_STREAM (0x0001UL << 4)
|
||||
#define MMC_CMDAT_BLOCK (0x0000UL << 4)
|
||||
#define MMC_CMDAT_WRITE (0x0001UL << 3)
|
||||
#define MMC_CMDAT_READ (0x0000UL << 3)
|
||||
#define MMC_CMDAT_DATA_EN (0x0001UL << 2)
|
||||
#define MMC_CMDAT_R1 (0x0001UL)
|
||||
#define MMC_CMDAT_R2 (0x0002UL)
|
||||
#define MMC_CMDAT_R3 (0x0003UL)
|
||||
|
||||
/* MMC_RESTO */
|
||||
#define MMC_RES_TO_MAX (0x007fUL) /* [6:0] */
|
||||
|
||||
/* MMC_RDTO */
|
||||
#define MMC_READ_TO_MAX (0x0ffffUL) /* [15:0] */
|
||||
|
||||
/* MMC_BLKLEN */
|
||||
#define MMC_BLK_LEN_MAX (0x03ffUL) /* [9:0] */
|
||||
|
||||
/* MMC_PRTBUF */
|
||||
#define MMC_PRTBUF_BUF_PART_FULL (0x01UL)
|
||||
#define MMC_PRTBUF_BUF_FULL (0x00UL )
|
||||
|
||||
/* MMC_I_MASK */
|
||||
#define MMC_I_MASK_TXFIFO_WR_REQ (0x01UL << 6)
|
||||
#define MMC_I_MASK_RXFIFO_RD_REQ (0x01UL << 5)
|
||||
#define MMC_I_MASK_CLK_IS_OFF (0x01UL << 4)
|
||||
#define MMC_I_MASK_STOP_CMD (0x01UL << 3)
|
||||
#define MMC_I_MASK_END_CMD_RES (0x01UL << 2)
|
||||
#define MMC_I_MASK_PRG_DONE (0x01UL << 1)
|
||||
#define MMC_I_MASK_DATA_TRAN_DONE (0x01UL)
|
||||
#define MMC_I_MASK_ALL (0x07fUL)
|
||||
|
||||
|
||||
/* MMC_I_REG */
|
||||
#define MMC_I_REG_TXFIFO_WR_REQ (0x01UL << 6)
|
||||
#define MMC_I_REG_RXFIFO_RD_REQ (0x01UL << 5)
|
||||
#define MMC_I_REG_CLK_IS_OFF (0x01UL << 4)
|
||||
#define MMC_I_REG_STOP_CMD (0x01UL << 3)
|
||||
#define MMC_I_REG_END_CMD_RES (0x01UL << 2)
|
||||
#define MMC_I_REG_PRG_DONE (0x01UL << 1)
|
||||
#define MMC_I_REG_DATA_TRAN_DONE (0x01UL)
|
||||
#define MMC_I_REG_ALL (0x007fUL)
|
||||
|
||||
/* MMC_CMD */
|
||||
#define MMC_CMD_INDEX_MAX (0x006fUL) /* [5:0] */
|
||||
#define CMD(x) (x)
|
||||
|
||||
#define MMC_DEFAULT_RCA 1
|
||||
|
||||
#define MMC_BLOCK_SIZE 512
|
||||
#define MMC_CMD_RESET 0
|
||||
#define MMC_CMD_SEND_OP_COND 1
|
||||
#define MMC_CMD_ALL_SEND_CID 2
|
||||
#define MMC_CMD_SET_RCA 3
|
||||
#define MMC_CMD_SEND_CSD 9
|
||||
#define MMC_CMD_SEND_CID 10
|
||||
#define MMC_CMD_SEND_STATUS 13
|
||||
#define MMC_CMD_SET_BLOCKLEN 16
|
||||
#define MMC_CMD_READ_BLOCK 17
|
||||
#define MMC_CMD_RD_BLK_MULTI 18
|
||||
#define MMC_CMD_WRITE_BLOCK 24
|
||||
|
||||
#define MMC_MAX_BLOCK_SIZE 512
|
||||
|
||||
#define MMC_R1_IDLE_STATE 0x01
|
||||
#define MMC_R1_ERASE_STATE 0x02
|
||||
#define MMC_R1_ILLEGAL_CMD 0x04
|
||||
#define MMC_R1_COM_CRC_ERR 0x08
|
||||
#define MMC_R1_ERASE_SEQ_ERR 0x01
|
||||
#define MMC_R1_ADDR_ERR 0x02
|
||||
#define MMC_R1_PARAM_ERR 0x04
|
||||
|
||||
#define MMC_R1B_WP_ERASE_SKIP 0x0002
|
||||
#define MMC_R1B_ERR 0x0004
|
||||
#define MMC_R1B_CC_ERR 0x0008
|
||||
#define MMC_R1B_CARD_ECC_ERR 0x0010
|
||||
#define MMC_R1B_WP_VIOLATION 0x0020
|
||||
#define MMC_R1B_ERASE_PARAM 0x0040
|
||||
#define MMC_R1B_OOR 0x0080
|
||||
#define MMC_R1B_IDLE_STATE 0x0100
|
||||
#define MMC_R1B_ERASE_RESET 0x0200
|
||||
#define MMC_R1B_ILLEGAL_CMD 0x0400
|
||||
#define MMC_R1B_COM_CRC_ERR 0x0800
|
||||
#define MMC_R1B_ERASE_SEQ_ERR 0x1000
|
||||
#define MMC_R1B_ADDR_ERR 0x2000
|
||||
#define MMC_R1B_PARAM_ERR 0x4000
|
||||
|
||||
typedef struct mmc_cid
|
||||
{
|
||||
/* FIXME: BYTE_ORDER */
|
||||
uchar year:4,
|
||||
month:4;
|
||||
uchar sn[3];
|
||||
uchar fwrev:4,
|
||||
hwrev:4;
|
||||
uchar name[6];
|
||||
uchar id[3];
|
||||
} mmc_cid_t;
|
||||
|
||||
typedef struct mmc_csd
|
||||
{
|
||||
uchar ecc:2,
|
||||
file_format:2,
|
||||
tmp_write_protect:1,
|
||||
perm_write_protect:1,
|
||||
copy:1,
|
||||
file_format_grp:1;
|
||||
uint64_t content_prot_app:1,
|
||||
rsvd3:4,
|
||||
write_bl_partial:1,
|
||||
write_bl_len:4,
|
||||
r2w_factor:3,
|
||||
default_ecc:2,
|
||||
wp_grp_enable:1,
|
||||
wp_grp_size:5,
|
||||
erase_grp_mult:5,
|
||||
erase_grp_size:5,
|
||||
c_size_mult1:3,
|
||||
vdd_w_curr_max:3,
|
||||
vdd_w_curr_min:3,
|
||||
vdd_r_curr_max:3,
|
||||
vdd_r_curr_min:3,
|
||||
c_size:12,
|
||||
rsvd2:2,
|
||||
dsr_imp:1,
|
||||
read_blk_misalign:1,
|
||||
write_blk_misalign:1,
|
||||
read_bl_partial:1;
|
||||
|
||||
ushort read_bl_len:4,
|
||||
ccc:12;
|
||||
uchar tran_speed;
|
||||
uchar nsac;
|
||||
uchar taac;
|
||||
uchar rsvd1:2,
|
||||
spec_vers:4,
|
||||
csd_structure:2;
|
||||
} mmc_csd_t;
|
||||
|
||||
|
||||
#endif /* __MMC_PXA_P_H__ */
|
||||
138
include/asm-arm/errno.h
Normal file
138
include/asm-arm/errno.h
Normal file
@@ -0,0 +1,138 @@
|
||||
#ifndef _ARM_ERRNO_H
|
||||
#define _ARM_ERRNO_H
|
||||
|
||||
#define EPERM 1 /* Operation not permitted */
|
||||
#define ENOENT 2 /* No such file or directory */
|
||||
#define ESRCH 3 /* No such process */
|
||||
#define EINTR 4 /* Interrupted system call */
|
||||
#define EIO 5 /* I/O error */
|
||||
#define ENXIO 6 /* No such device or address */
|
||||
#define E2BIG 7 /* Arg list too long */
|
||||
#define ENOEXEC 8 /* Exec format error */
|
||||
#define EBADF 9 /* Bad file number */
|
||||
#define ECHILD 10 /* No child processes */
|
||||
#define EAGAIN 11 /* Try again */
|
||||
#define ENOMEM 12 /* Out of memory */
|
||||
#define EACCES 13 /* Permission denied */
|
||||
#define EFAULT 14 /* Bad address */
|
||||
#define ENOTBLK 15 /* Block device required */
|
||||
#define EBUSY 16 /* Device or resource busy */
|
||||
#define EEXIST 17 /* File exists */
|
||||
#define EXDEV 18 /* Cross-device link */
|
||||
#define ENODEV 19 /* No such device */
|
||||
#define ENOTDIR 20 /* Not a directory */
|
||||
#define EISDIR 21 /* Is a directory */
|
||||
#define EINVAL 22 /* Invalid argument */
|
||||
#define ENFILE 23 /* File table overflow */
|
||||
#define EMFILE 24 /* Too many open files */
|
||||
#define ENOTTY 25 /* Not a typewriter */
|
||||
#define ETXTBSY 26 /* Text file busy */
|
||||
#define EFBIG 27 /* File too large */
|
||||
#define ENOSPC 28 /* No space left on device */
|
||||
#define ESPIPE 29 /* Illegal seek */
|
||||
#define EROFS 30 /* Read-only file system */
|
||||
#define EMLINK 31 /* Too many links */
|
||||
#define EPIPE 32 /* Broken pipe */
|
||||
#define EDOM 33 /* Math argument out of domain of func */
|
||||
#define ERANGE 34 /* Math result not representable */
|
||||
#define EDEADLK 35 /* Resource deadlock would occur */
|
||||
#define ENAMETOOLONG 36 /* File name too long */
|
||||
#define ENOLCK 37 /* No record locks available */
|
||||
#define ENOSYS 38 /* Function not implemented */
|
||||
#define ENOTEMPTY 39 /* Directory not empty */
|
||||
#define ELOOP 40 /* Too many symbolic links encountered */
|
||||
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
||||
#define ENOMSG 42 /* No message of desired type */
|
||||
#define EIDRM 43 /* Identifier removed */
|
||||
#define ECHRNG 44 /* Channel number out of range */
|
||||
#define EL2NSYNC 45 /* Level 2 not synchronized */
|
||||
#define EL3HLT 46 /* Level 3 halted */
|
||||
#define EL3RST 47 /* Level 3 reset */
|
||||
#define ELNRNG 48 /* Link number out of range */
|
||||
#define EUNATCH 49 /* Protocol driver not attached */
|
||||
#define ENOCSI 50 /* No CSI structure available */
|
||||
#define EL2HLT 51 /* Level 2 halted */
|
||||
#define EBADE 52 /* Invalid exchange */
|
||||
#define EBADR 53 /* Invalid request descriptor */
|
||||
#define EXFULL 54 /* Exchange full */
|
||||
#define ENOANO 55 /* No anode */
|
||||
#define EBADRQC 56 /* Invalid request code */
|
||||
#define EBADSLT 57 /* Invalid slot */
|
||||
#define EDEADLOCK 58 /* File locking deadlock error */
|
||||
#define EBFONT 59 /* Bad font file format */
|
||||
#define ENOSTR 60 /* Device not a stream */
|
||||
#define ENODATA 61 /* No data available */
|
||||
#define ETIME 62 /* Timer expired */
|
||||
#define ENOSR 63 /* Out of streams resources */
|
||||
#define ENONET 64 /* Machine is not on the network */
|
||||
#define ENOPKG 65 /* Package not installed */
|
||||
#define EREMOTE 66 /* Object is remote */
|
||||
#define ENOLINK 67 /* Link has been severed */
|
||||
#define EADV 68 /* Advertise error */
|
||||
#define ESRMNT 69 /* Srmount error */
|
||||
#define ECOMM 70 /* Communication error on send */
|
||||
#define EPROTO 71 /* Protocol error */
|
||||
#define EMULTIHOP 72 /* Multihop attempted */
|
||||
#define EDOTDOT 73 /* RFS specific error */
|
||||
#define EBADMSG 74 /* Not a data message */
|
||||
#define EOVERFLOW 75 /* Value too large for defined data type */
|
||||
#define ENOTUNIQ 76 /* Name not unique on network */
|
||||
#define EBADFD 77 /* File descriptor in bad state */
|
||||
#define EREMCHG 78 /* Remote address changed */
|
||||
#define ELIBACC 79 /* Can not access a needed shared library */
|
||||
#define ELIBBAD 80 /* Accessing a corrupted shared library */
|
||||
#define ELIBSCN 81 /* .lib section in a.out corrupted */
|
||||
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
|
||||
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
|
||||
#define EILSEQ 84 /* Illegal byte sequence */
|
||||
#define ERESTART 85 /* Interrupted system call should be restarted */
|
||||
#define ESTRPIPE 86 /* Streams pipe error */
|
||||
#define EUSERS 87 /* Too many users */
|
||||
#define ENOTSOCK 88 /* Socket operation on non-socket */
|
||||
#define EDESTADDRREQ 89 /* Destination address required */
|
||||
#define EMSGSIZE 90 /* Message too long */
|
||||
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
|
||||
#define ENOPROTOOPT 92 /* Protocol not available */
|
||||
#define EPROTONOSUPPORT 93 /* Protocol not supported */
|
||||
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
|
||||
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
|
||||
#define EPFNOSUPPORT 96 /* Protocol family not supported */
|
||||
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
|
||||
#define EADDRINUSE 98 /* Address already in use */
|
||||
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
|
||||
#define ENETDOWN 100 /* Network is down */
|
||||
#define ENETUNREACH 101 /* Network is unreachable */
|
||||
#define ENETRESET 102 /* Network dropped connection because of reset */
|
||||
#define ECONNABORTED 103 /* Software caused connection abort */
|
||||
#define ECONNRESET 104 /* Connection reset by peer */
|
||||
#define ENOBUFS 105 /* No buffer space available */
|
||||
#define EISCONN 106 /* Transport endpoint is already connected */
|
||||
#define ENOTCONN 107 /* Transport endpoint is not connected */
|
||||
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
|
||||
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
|
||||
#define ETIMEDOUT 110 /* Connection timed out */
|
||||
#define ECONNREFUSED 111 /* Connection refused */
|
||||
#define EHOSTDOWN 112 /* Host is down */
|
||||
#define EHOSTUNREACH 113 /* No route to host */
|
||||
#define EALREADY 114 /* Operation already in progress */
|
||||
#define EINPROGRESS 115 /* Operation now in progress */
|
||||
#define ESTALE 116 /* Stale NFS file handle */
|
||||
#define EUCLEAN 117 /* Structure needs cleaning */
|
||||
#define ENOTNAM 118 /* Not a XENIX named type file */
|
||||
#define ENAVAIL 119 /* No XENIX semaphores available */
|
||||
#define EISNAM 120 /* Is a named type file */
|
||||
#define EREMOTEIO 121 /* Remote I/O error */
|
||||
#define EDQUOT 122 /* Quota exceeded */
|
||||
|
||||
#define ENOMEDIUM 123 /* No medium found */
|
||||
#define EMEDIUMTYPE 124 /* Wrong medium type */
|
||||
|
||||
/* Should never be seen by user programs */
|
||||
#define ERESTARTSYS 512
|
||||
#define ERESTARTNOINTR 513
|
||||
#define ERESTARTNOHAND 514 /* restart if no handler.. */
|
||||
#define ENOIOCTLCMD 515 /* No ioctl command */
|
||||
|
||||
#define _LAST_ERRNO 515
|
||||
|
||||
#endif
|
||||
@@ -41,8 +41,8 @@ typedef struct global_data {
|
||||
unsigned long reloc_off; /* Relocation Offset */
|
||||
unsigned long env_addr; /* Address of Environment struct */
|
||||
unsigned long env_valid; /* Checksum of Environment valid? */
|
||||
#ifdef CONFIG_VFD
|
||||
unsigned long fb_base; /* base address of frame buffer */
|
||||
#ifdef CONFIG_VFD
|
||||
unsigned char vfd_type; /* display type */
|
||||
#endif
|
||||
#if 0
|
||||
|
||||
@@ -81,6 +81,9 @@
|
||||
#define CFG_CMD_NAND 0x0000800000000000 /* NAND support */
|
||||
#define CFG_CMD_BMP 0x0001000000000000 /* BMP support */
|
||||
#define CFG_CMD_PORTIO 0x0002000000000000 /* Port I/O */
|
||||
#define CFG_CMD_PING 0x0004000000000000 /* ping support */
|
||||
#define CFG_CMD_MMC 0x0008000000000000 /* MMC support */
|
||||
#define CFG_CMD_FAT 0x0010000000000000 /* FAT support */
|
||||
|
||||
#define CFG_CMD_ALL 0xFFFFFFFFFFFFFFFF /* ALL commands */
|
||||
|
||||
@@ -101,6 +104,7 @@
|
||||
CFG_CMD_EEPROM | \
|
||||
CFG_CMD_ELF | \
|
||||
CFG_CMD_FDC | \
|
||||
CFG_CMD_FAT | \
|
||||
CFG_CMD_FDOS | \
|
||||
CFG_CMD_HWFLOW | \
|
||||
CFG_CMD_I2C | \
|
||||
@@ -110,9 +114,11 @@
|
||||
CFG_CMD_JFFS2 | \
|
||||
CFG_CMD_KGDB | \
|
||||
CFG_CMD_MII | \
|
||||
CFG_CMD_MMC | \
|
||||
CFG_CMD_NAND | \
|
||||
CFG_CMD_PCI | \
|
||||
CFG_CMD_PCMCIA | \
|
||||
CFG_CMD_PING | \
|
||||
CFG_CMD_REGINFO | \
|
||||
CFG_CMD_SAVES | \
|
||||
CFG_CMD_SCSI | \
|
||||
|
||||
61
include/cmd_fat.h
Normal file
61
include/cmd_fat.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* (C) Copyright 2002
|
||||
* Richard Jones, rjones@nexus-tech.net
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* FAT support
|
||||
*/
|
||||
#ifndef _CMD_FAT_H
|
||||
#define _CMD_FAT_H
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_FAT)
|
||||
|
||||
int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
int do_fat_dump (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
|
||||
#define CMD_TBL_FAT MK_CMD_TBL_ENTRY( \
|
||||
"fatload", 5, 4, 0, do_fat_fsload, \
|
||||
"fatload - load binary file from a dos filesystem\n", \
|
||||
"[ off ] [ filename ]\n" \
|
||||
" - load binary file from dos filesystem\n" \
|
||||
" with offset 'off'\n" \
|
||||
), \
|
||||
MK_CMD_TBL_ENTRY( \
|
||||
"fatinfo", 5, 1, 1, do_fat_fsinfo, \
|
||||
"fatinfo - print information about filesystem\n", \
|
||||
"\n" \
|
||||
" - print information about filesystem\n" \
|
||||
), \
|
||||
MK_CMD_TBL_ENTRY( \
|
||||
"fatls", 2, 2, 1, do_fat_ls, \
|
||||
"fatls - list files in a directory (default /)\n", \
|
||||
"[ directory ]\n" \
|
||||
" - list files in a directory.\n" \
|
||||
),
|
||||
|
||||
#else
|
||||
#define CMD_TBL_FAT
|
||||
#endif /* CFG_CMD_FAT */
|
||||
|
||||
#endif /* _CMD_FAT_H */
|
||||
41
include/cmd_mmc.h
Normal file
41
include/cmd_mmc.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
*
|
||||
* 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 _CMD_MMC_H_
|
||||
#define _CMD_MMC_H_
|
||||
|
||||
#include <command.h>
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_MMC)
|
||||
|
||||
#define CMD_TBL_MMC MK_CMD_TBL_ENTRY( \
|
||||
"mmcinit", 4, 1, 0, do_mmc, \
|
||||
"mmcinit - init mmc card\n", \
|
||||
),
|
||||
#else
|
||||
|
||||
#define CMD_TBL_MMC
|
||||
|
||||
#endif
|
||||
|
||||
int do_mmc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
|
||||
#endif /* _CMD_MMC_H_ */
|
||||
@@ -64,11 +64,24 @@ int do_dhcp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
#define CMD_TBL_DHCP
|
||||
#endif /* CFG_CMD_DHCP */
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
#define CMD_TBL_PING MK_CMD_TBL_ENTRY( \
|
||||
"ping", 4, 2, 1, do_ping, \
|
||||
"ping - check if host is reachable\n", \
|
||||
"host\n" \
|
||||
),
|
||||
|
||||
int do_ping (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
#else
|
||||
#define CMD_TBL_PING
|
||||
#endif /* CFG_CMD_PING */
|
||||
|
||||
#else
|
||||
#define CMD_TBL_BOOTP
|
||||
#define CMD_TBL_TFTPB
|
||||
#define CMD_TBL_RARPB
|
||||
#define CMD_TBL_DHCP
|
||||
#define CMD_TBL_PING
|
||||
#endif /* CFG_CMD_NET */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -73,10 +73,21 @@ typedef void (interrupt_handler_t)(void *);
|
||||
#include <asm/u-boot.h> /* boot information for Linux kernel */
|
||||
#include <asm/global_data.h> /* global data used for startup functions */
|
||||
|
||||
/* enable common handling for all TQM8xxL boards */
|
||||
/*
|
||||
* enable common handling for all TQM8xxL/M boards:
|
||||
* - CONFIG_TQM8xxM will be defined for all TQM8xxM boards
|
||||
* - CONFIG_TQM8xxL will be defined for all TQM8xxL _and_ TQM8xxM boards
|
||||
*/
|
||||
#if defined(CONFIG_TQM823M) || defined(CONFIG_TQM850M) || \
|
||||
defined(CONFIG_TQM855M) || defined(CONFIG_TQM860M) || \
|
||||
defined(CONFIG_TQM862M)
|
||||
# ifndef CONFIG_TQM8xxM
|
||||
# define CONFIG_TQM8xxM
|
||||
# endif
|
||||
#endif
|
||||
#if defined(CONFIG_TQM823L) || defined(CONFIG_TQM850L) || \
|
||||
defined(CONFIG_TQM855L) || defined(CONFIG_TQM860L) || \
|
||||
defined(CONFIG_TQM862L)
|
||||
defined(CONFIG_TQM862L) || defined(CONFIG_TQM8xxM)
|
||||
# ifndef CONFIG_TQM8xxL
|
||||
# define CONFIG_TQM8xxL
|
||||
# endif
|
||||
@@ -237,6 +248,7 @@ void load_sernum_ethaddr (void);
|
||||
|
||||
/* $(BOARD)/$(BOARD).c */
|
||||
int board_pre_init (void);
|
||||
int board_post_init (void);
|
||||
int board_postclk_init (void); /* after clocks/timebase, before env/serial */
|
||||
void board_poweroff (void);
|
||||
|
||||
|
||||
@@ -1254,7 +1254,11 @@ typedef struct scc_enet {
|
||||
#define PA_ENET_TXD ((ushort)0x0008)
|
||||
#define PA_ENET_TCLK ((ushort)0x0200)
|
||||
#define PA_ENET_RCLK ((ushort)0x0800)
|
||||
#if defined(CONFIG_RMU)
|
||||
#define PC_ENET_TENA ((uint)0x00000002) /* PC14 */
|
||||
#else
|
||||
#define PB_ENET_TENA ((uint)0x00002000)
|
||||
#endif
|
||||
#define PC_ENET_CLSN ((ushort)0x0040)
|
||||
#define PC_ENET_RENA ((ushort)0x0080)
|
||||
|
||||
@@ -1327,15 +1331,13 @@ typedef struct scc_enet {
|
||||
|
||||
#endif /* CONFIG_SXNI855T */
|
||||
|
||||
/*** MVS1, TQM823L, TQM850L, ETX094, R360MPI ***********************/
|
||||
/*** MVS1, TQM823L/M, TQM850L/M, ETX094, R360MPI *******************/
|
||||
|
||||
#if (defined(CONFIG_MVS) && CONFIG_MVS < 2) || \
|
||||
defined(CONFIG_R360MPI) || \
|
||||
defined(CONFIG_RBC823) || \
|
||||
defined(CONFIG_TQM823L) || \
|
||||
defined(CONFIG_TQM850L) || \
|
||||
defined(CONFIG_ETX094) || \
|
||||
defined(CONFIG_RRVISION)|| \
|
||||
defined(CONFIG_R360MPI) || defined(CONFIG_RBC823) || \
|
||||
defined(CONFIG_TQM823L) || defined(CONFIG_TQM823M) || \
|
||||
defined(CONFIG_TQM850L) || defined(CONFIG_TQM850M) || \
|
||||
defined(CONFIG_ETX094) || defined(CONFIG_RRVISION)|| \
|
||||
(defined(CONFIG_LANTEC) && CONFIG_LANTEC < 2)
|
||||
/* Bits in parallel I/O port registers that have to be set/cleared
|
||||
* to configure the pins for SCC2 use.
|
||||
@@ -1361,13 +1363,13 @@ typedef struct scc_enet {
|
||||
*/
|
||||
#define SICR_ENET_MASK ((uint)0x0000ff00)
|
||||
#define SICR_ENET_CLKRT ((uint)0x00002600)
|
||||
#endif /* CONFIG_MVS v1, CONFIG_TQM823L, CONFIG_TQM850L, etc. */
|
||||
#endif /* CONFIG_MVS v1, CONFIG_TQM823L/M, CONFIG_TQM850L/M, etc. */
|
||||
|
||||
/*** TQM855L, TQM860L, TQM862L **************************************/
|
||||
/*** TQM855L/M, TQM860L/M, TQM862L/M ********************************/
|
||||
|
||||
#if defined(CONFIG_TQM855L) || \
|
||||
defined(CONFIG_TQM860L) || \
|
||||
defined(CONFIG_TQM862L)
|
||||
#if defined(CONFIG_TQM855L) || defined(CONFIG_TQM855M) || \
|
||||
defined(CONFIG_TQM860L) || defined(CONFIG_TQM860M) || \
|
||||
defined(CONFIG_TQM862L) || defined(CONFIG_TQM862M)
|
||||
|
||||
# ifdef CONFIG_SCC1_ENET /* use SCC for 10Mbps Ethernet */
|
||||
|
||||
@@ -1415,7 +1417,7 @@ typedef struct scc_enet {
|
||||
#define PD_MII_MASK ((ushort)0x1FFF) /* PD 3...15 */
|
||||
|
||||
# endif /* CONFIG_FEC_ENET */
|
||||
#endif /* CONFIG_TQM855L, TQM860L, TQM862L */
|
||||
#endif /* CONFIG_TQM855L/M, TQM860L/M, TQM862L/M */
|
||||
|
||||
/*** V37 **********************************************************/
|
||||
|
||||
|
||||
@@ -125,6 +125,10 @@
|
||||
|
||||
#define CONFIG_ZERO_BOOTDELAY_CHECK /* check for keypress on bootdelay==0 */
|
||||
|
||||
#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */
|
||||
|
||||
#define CFG_RX_ETH_BUFFER 16 /* use 16 rx buffer on 405 emac */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* NAND-FLASH stuff
|
||||
*-----------------------------------------------------------------------
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
/*
|
||||
* NS16550 Configuration
|
||||
*/
|
||||
#define CFG_NS16550
|
||||
#define CFG_NS16550
|
||||
#define CFG_NS16550_SERIAL
|
||||
|
||||
#define CFG_NS16550_REG_SIZE 1
|
||||
@@ -171,7 +171,7 @@
|
||||
* Memory configuration using SPD information stored on the SODIMMs
|
||||
* not yet supported.
|
||||
*/
|
||||
|
||||
|
||||
#define CFG_SDRAM_SIZE 64 /* SDRAM size -- 64 or 128 MB supported */
|
||||
|
||||
/* Bit-field values for MCCR1.
|
||||
@@ -186,7 +186,7 @@
|
||||
#else
|
||||
# error "SDRAM size not supported"
|
||||
#endif
|
||||
#define CFG_BANK1_ROW 0
|
||||
#define CFG_BANK1_ROW 0
|
||||
#define CFG_BANK2_ROW 0
|
||||
#define CFG_BANK3_ROW 0
|
||||
#define CFG_BANK4_ROW 0
|
||||
@@ -361,7 +361,7 @@
|
||||
/* IRQ_ENA_2 bit definitions */
|
||||
#define I_ENA_2_IEAB 0x80 /* ABORT IRQ enable */
|
||||
#define I_ENA_2_IEK1 0x40 /* KEY1 IRQ enable */
|
||||
#define I_ENA_2_IEK2 0x20 /* KEY2 IRQ enable */
|
||||
#define I_ENA_2_IEK2 0x20 /* KEY2 IRQ enable */
|
||||
#define I_ENA_2_IERT 0x10 /* RTC IRQ enable */
|
||||
#define I_ENA_2_IESM 0x08 /* LM81 IRQ enable */
|
||||
#define I_ENA_2_IEDG 0x04 /* DEGENERATING IRQ enable */
|
||||
@@ -371,9 +371,9 @@
|
||||
/* IRQ_STAT_2 bit definitions */
|
||||
#define I_STAT_2_ABO 0x80 /* ABORT IRQ status */
|
||||
#define I_STAT_2_KY1 0x40 /* KEY1 IRQ status */
|
||||
#define I_STAT_2_KY2 0x20 /* KEY2 IRQ status */
|
||||
#define I_STAT_2_KY2 0x20 /* KEY2 IRQ status */
|
||||
#define I_STAT_2_RTC 0x10 /* RTC IRQ status */
|
||||
#define I_STAT_2_SMN 0x08 /* LM81 IRQ status */
|
||||
#define I_STAT_2_SMN 0x08 /* LM81 IRQ status */
|
||||
#define I_STAT_2_DEG 0x04 /* DEGENERATING IRQ status */
|
||||
#define I_STAT_2_SIO2 0x02 /* ST16552/B IRQ status */
|
||||
#define I_STAT_2_SIO1 0x01 /* ST16552/A IRQ status */
|
||||
@@ -421,14 +421,14 @@
|
||||
#define DISP_UDC_ADR *((volatile uchar*)(DISPLAY_BASE + 0x00)) /* UDC Address Reg. */
|
||||
#define DISP_CWORD *((volatile uchar*)(DISPLAY_BASE + 0x10)) /* Control Word Reg. */
|
||||
|
||||
#define DISP_DIG0 *((volatile uchar*)(DISP_CHR_RAM + 0x00)) /* Digit 0 address */
|
||||
#define DISP_DIG1 *((volatile uchar*)(DISP_CHR_RAM + 0x01)) /* Digit 0 address */
|
||||
#define DISP_DIG0 *((volatile uchar*)(DISP_CHR_RAM + 0x00)) /* Digit 0 address */
|
||||
#define DISP_DIG1 *((volatile uchar*)(DISP_CHR_RAM + 0x01)) /* Digit 0 address */
|
||||
#define DISP_DIG2 *((volatile uchar*)(DISP_CHR_RAM + 0x02)) /* Digit 0 address */
|
||||
#define DISP_DIG3 *((volatile uchar*)(DISP_CHR_RAM + 0x03)) /* Digit 0 address */
|
||||
#define DISP_DIG4 *((volatile uchar*)(DISP_CHR_RAM + 0x04)) /* Digit 0 address */
|
||||
#define DISP_DIG3 *((volatile uchar*)(DISP_CHR_RAM + 0x03)) /* Digit 0 address */
|
||||
#define DISP_DIG4 *((volatile uchar*)(DISP_CHR_RAM + 0x04)) /* Digit 0 address */
|
||||
#define DISP_DIG5 *((volatile uchar*)(DISP_CHR_RAM + 0x05)) /* Digit 0 address */
|
||||
#define DISP_DIG6 *((volatile uchar*)(DISP_CHR_RAM + 0x06)) /* Digit 0 address */
|
||||
#define DISP_DIG7 *((volatile uchar*)(DISP_CHR_RAM + 0x07)) /* Digit 0 address */
|
||||
#define DISP_DIG6 *((volatile uchar*)(DISP_CHR_RAM + 0x06)) /* Digit 0 address */
|
||||
#define DISP_DIG7 *((volatile uchar*)(DISP_CHR_RAM + 0x07)) /* Digit 0 address */
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
@@ -441,6 +441,7 @@
|
||||
#define CONFIG_NET_MULTI /* Multi ethernet cards support */
|
||||
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
|
||||
#define PCI_ENET0_IOADDR 0x00104000
|
||||
#define PCI_ENET0_MEMADDR 0x82000000
|
||||
|
||||
@@ -146,6 +146,8 @@
|
||||
|
||||
#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */
|
||||
|
||||
#define CFG_RX_ETH_BUFFER 16 /* use 16 rx buffer on 405 emac */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PCI stuff
|
||||
*-----------------------------------------------------------------------
|
||||
|
||||
@@ -55,15 +55,7 @@
|
||||
#endif
|
||||
|
||||
#undef CONFIG_BOOTARGS
|
||||
#define CONFIG_RAMBOOTCOMMAND \
|
||||
"setenv bootargs root=/dev/ram rw nfsroot=$(serverip):$(rootpath) " \
|
||||
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off;" \
|
||||
"bootm ffc00000 ffca0000"
|
||||
#define CONFIG_NFSBOOTCOMMAND \
|
||||
"setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath) " \
|
||||
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off;" \
|
||||
"bootm ffc00000"
|
||||
#define CONFIG_BOOTCOMMAND CONFIG_RAMBOOTCOMMAND
|
||||
#define CONFIG_BOOTCOMMAND "bootm 100000" /* default boot command */
|
||||
|
||||
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
|
||||
#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */
|
||||
@@ -73,12 +65,7 @@
|
||||
|
||||
#define CONFIG_RTC_M48T35A 1 /* ST Electronics M48 timekeeper */
|
||||
|
||||
#if 0 /* test-only */
|
||||
#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAULT | \
|
||||
CONFIG_BOOTP_VENDOREX)
|
||||
#else
|
||||
#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAULT)
|
||||
#endif
|
||||
|
||||
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
|
||||
CFG_CMD_DHCP | \
|
||||
@@ -147,6 +134,8 @@
|
||||
|
||||
#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */
|
||||
|
||||
#define CFG_RX_ETH_BUFFER 16 /* use 16 rx buffer on 405 emac */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PCI stuff
|
||||
*-----------------------------------------------------------------------
|
||||
@@ -202,7 +191,7 @@
|
||||
#define CFG_FLASH_BASE 0xFFFC0000
|
||||
#define CFG_MONITOR_BASE CFG_FLASH_BASE
|
||||
#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Monitor */
|
||||
#define CFG_MALLOC_LEN (128 * 1024) /* Reserve 128 kB for malloc() */
|
||||
#define CFG_MALLOC_LEN (256 * 1024) /* Reserve 256 kB for malloc() */
|
||||
|
||||
/*
|
||||
* For booting Linux, the board info and command line data
|
||||
@@ -360,7 +349,7 @@
|
||||
#define CFG_FPGA_STATUS_TS_IRQ 0x1000
|
||||
|
||||
#define CFG_FPGA_SPARTAN2 1 /* using Xilinx Spartan 2 now */
|
||||
#define CFG_FPGA_MAX_SIZE 64*1024 /* 64kByte is enough for XC2S15 */
|
||||
#define CFG_FPGA_MAX_SIZE 128*1024 /* 128kByte is enough for XC2S30 */
|
||||
|
||||
/* FPGA program pin configuration */
|
||||
#define CFG_FPGA_PRG 0x04000000 /* FPGA program pin (ppc output) */
|
||||
|
||||
@@ -304,6 +304,7 @@
|
||||
#define CFG_ETH_IOBASE 0x00104000
|
||||
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
#define PCI_ENET0_IOADDR 0x00104000
|
||||
#define PCI_ENET0_MEMADDR 0x80000000
|
||||
#endif /* __CONFIG_H */
|
||||
|
||||
@@ -333,6 +333,7 @@
|
||||
|
||||
#define CONFIG_NET_MULTI /* Multi ethernet cards support */
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
#define CONFIG_EEPRO100_SROM_WRITE
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
& ~CFG_CMD_JFFS2 \
|
||||
& ~CFG_CMD_KGDB \
|
||||
& ~CFG_CMD_MII \
|
||||
& ~CFG_CMD_MMC \
|
||||
& ~CFG_CMD_NAND \
|
||||
& ~CFG_CMD_PCI \
|
||||
& ~CFG_CMD_PCMCIA \
|
||||
|
||||
@@ -35,6 +35,16 @@
|
||||
#define CONFIG_405GP 1 /* This is a PPC405 CPU */
|
||||
#define CONFIG_4xx 1 /* ...member of PPC4xx family */
|
||||
#define CONFIG_MIP405 1 /* ...on a MIP405 board */
|
||||
/***********************************************************
|
||||
* Note that it may also be a MIP405T board which is a subset of the
|
||||
* MIP405
|
||||
***********************************************************/
|
||||
/***********************************************************
|
||||
* WARNING:
|
||||
* CONFIG_BOOT_PCI is only used for first boot-up and should
|
||||
* NOT be enabled for production bootloader
|
||||
***********************************************************/
|
||||
/*#define CONFIG_BOOT_PCI 1*/
|
||||
/***********************************************************
|
||||
* Clock
|
||||
***********************************************************/
|
||||
@@ -43,7 +53,7 @@
|
||||
/***********************************************************
|
||||
* Command definitions
|
||||
***********************************************************/
|
||||
#define CONFIG_COMMANDS \
|
||||
#define MIP405_COMMON_CMDS \
|
||||
(CONFIG_CMD_DFL | \
|
||||
CFG_CMD_IDE | \
|
||||
CFG_CMD_DHCP | \
|
||||
@@ -56,12 +66,21 @@
|
||||
CFG_CMD_REGINFO | \
|
||||
CFG_CMD_DATE | \
|
||||
CFG_CMD_ELF | \
|
||||
CFG_CMD_USB | \
|
||||
CFG_CMD_MII | \
|
||||
CFG_CMD_DOC | \
|
||||
CFG_CMD_SAVES | \
|
||||
CFG_CMD_BSP )
|
||||
|
||||
#if defined(CONFIG_MIP405T)
|
||||
#define CONFIG_COMMANDS \
|
||||
MIP405_COMMON_CMDS
|
||||
#else
|
||||
#define CONFIG_COMMANDS \
|
||||
(MIP405_COMMON_CMDS | \
|
||||
CFG_CMD_USB | \
|
||||
CFG_CMD_DOC )
|
||||
|
||||
#endif
|
||||
|
||||
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
|
||||
#include <cmd_confdefs.h>
|
||||
|
||||
@@ -97,9 +116,9 @@
|
||||
* Definitions for Serial Presence Detect EEPROM address
|
||||
* (to get SDRAM settings)
|
||||
***************************************************************/
|
||||
#define SDRAM_EEPROM_WRITE_ADDRESS 0xA0
|
||||
/*#define SDRAM_EEPROM_WRITE_ADDRESS 0xA0
|
||||
#define SDRAM_EEPROM_READ_ADDRESS 0xA1
|
||||
|
||||
*/
|
||||
/**************************************************************
|
||||
* Environment definitions
|
||||
**************************************************************/
|
||||
@@ -287,7 +306,12 @@
|
||||
/************************************************************
|
||||
* IDE/ATA stuff
|
||||
************************************************************/
|
||||
#if defined(CONFIG_MIP405T)
|
||||
#define CFG_IDE_MAXBUS 1 /* MIP405T has only one IDE bus */
|
||||
#else
|
||||
#define CFG_IDE_MAXBUS 2 /* max. 2 IDE busses */
|
||||
#endif
|
||||
|
||||
#define CFG_IDE_MAXDEVICE (CFG_IDE_MAXBUS*2) /* max. 2 drives per IDE bus */
|
||||
|
||||
#define CFG_ATA_BASE_ADDR CFG_ISA_IO_BASE_ADDRESS /* base address */
|
||||
@@ -351,13 +375,14 @@
|
||||
/************************************************************
|
||||
* USB support EXPERIMENTAL
|
||||
************************************************************/
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
#define CONFIG_USB_UHCI
|
||||
#define CONFIG_USB_KEYBOARD
|
||||
#define CONFIG_USB_STORAGE
|
||||
|
||||
/* Enable needed helper functions */
|
||||
#define CFG_DEVICE_DEREGISTER /* needs device_deregister */
|
||||
|
||||
#endif
|
||||
/************************************************************
|
||||
* Debug support
|
||||
************************************************************/
|
||||
@@ -369,8 +394,19 @@
|
||||
/************************************************************
|
||||
* Ident
|
||||
************************************************************/
|
||||
|
||||
#define VERSION_TAG "released"
|
||||
#define CONFIG_IDENT_STRING "\n(c) 2002 by MPL AG Switzerland, MEV-10072-001 " VERSION_TAG
|
||||
#if !defined(CONFIG_MIP405T)
|
||||
#define CONFIG_ISO_STRING "MEV-10072-001"
|
||||
#else
|
||||
#define CONFIG_ISO_STRING "MEV-10082-001"
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_BOOT_PCI)
|
||||
#define CONFIG_IDENT_STRING "\n(c) 2003 by MPL AG Switzerland, " CONFIG_ISO_STRING " " VERSION_TAG
|
||||
#else
|
||||
#define CONFIG_IDENT_STRING "\n(c) 2003 by MPL AG Switzerland, PCI_BOOT Version"
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
|
||||
@@ -129,6 +129,7 @@
|
||||
CFG_CMD_KGDB | \
|
||||
CFG_CMD_NAND | \
|
||||
CFG_CMD_MII | \
|
||||
CFG_CMD_MMC | \
|
||||
CFG_CMD_PCI | \
|
||||
CFG_CMD_PCMCIA | \
|
||||
CFG_CMD_SCSI | \
|
||||
|
||||
@@ -161,6 +161,7 @@
|
||||
CFG_CMD_IDE | \
|
||||
CFG_CMD_JFFS2 | \
|
||||
CFG_CMD_KGDB | \
|
||||
CFG_CMD_MMC | \
|
||||
CFG_CMD_NAND | \
|
||||
CFG_CMD_PCMCIA | \
|
||||
CFG_CMD_SCSI | \
|
||||
|
||||
@@ -94,6 +94,7 @@
|
||||
#define CONFIG_NET_MULTI /* Multi ethernet cards support */
|
||||
|
||||
#define CONFIG_EEPRO100 /* Ethernet Express PRO 100 */
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
|
||||
#define PCI_ENET0_IOADDR 0x80000000
|
||||
#define PCI_ENET0_MEMADDR 0x80000000
|
||||
|
||||
@@ -261,6 +261,7 @@
|
||||
#define CONFIG_NET_MULTI /* Multi ethernet cards support */
|
||||
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
#define CONFIG_TULIP
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
|
||||
@@ -263,6 +263,7 @@
|
||||
#define CONFIG_NET_MULTI /* Multi ethernet cards support */
|
||||
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
#define CONFIG_TULIP
|
||||
|
||||
|
||||
|
||||
@@ -368,7 +368,8 @@
|
||||
* Ident
|
||||
************************************************************/
|
||||
#define VERSION_TAG "released"
|
||||
#define CONFIG_IDENT_STRING "\n(c) 2002 by MPL AG Switzerland, MEV-10066-001 " VERSION_TAG
|
||||
#define CONFIG_ISO_STRING "MEV-10066-001"
|
||||
#define CONFIG_IDENT_STRING "\n(c) 2002 by MPL AG Switzerland, " CONFIG_ISO_STRING " " VERSION_TAG
|
||||
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
|
||||
@@ -316,6 +316,7 @@
|
||||
#ifdef CONFIG_PCI
|
||||
#define CONFIG_PCI_PNP
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -128,6 +128,10 @@
|
||||
|
||||
#define CONFIG_ZERO_BOOTDELAY_CHECK /* check for keypress on bootdelay==0 */
|
||||
|
||||
#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */
|
||||
|
||||
#define CFG_RX_ETH_BUFFER 16 /* use 16 rx buffer on 405 emac */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PCI stuff
|
||||
*-----------------------------------------------------------------------
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
~CFG_CMD_JFFS2 & \
|
||||
~CFG_CMD_DTT & \
|
||||
~CFG_CMD_MII & \
|
||||
~CFG_CMD_MMC & \
|
||||
/*~CFG_CMD_NET &*/ \
|
||||
/*~CFG_CMD_ELF &*/ \
|
||||
/* ~CFG_CMD_EEPROM & */ \
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
#define CONFIG_NET_MULTI /* Multi ethernet cards support */
|
||||
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
|
||||
#define PCI_ENET0_IOADDR 0x80000000
|
||||
#define PCI_ENET0_MEMADDR 0x80000000
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
#define CONFIG_NET_MULTI /* Multi ethernet cards support */
|
||||
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
#define CONFIG_NATSEMI
|
||||
#define CONFIG_NS8382X
|
||||
|
||||
|
||||
@@ -179,6 +179,7 @@
|
||||
#define CFG_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms) */
|
||||
|
||||
#define CFG_ENV_IS_IN_FLASH 1
|
||||
|
||||
#define CFG_ENV_OFFSET 0x8000 /* Offset of Environment Sector */
|
||||
#define CFG_ENV_SIZE 0x4000 /* Total Size of Environment Sector */
|
||||
|
||||
@@ -251,14 +252,15 @@
|
||||
* Reset PLL lock status sticky bit, timer expired status bit and timer
|
||||
* interrupt status bit
|
||||
*
|
||||
* If this is a 80 MHz CPU, set PLL multiplication factor to 5 (5*16=80)!
|
||||
* If this is a 80 MHz or 100 MHz CPU,
|
||||
* set PLL multiplication factor to 5 (5 * 16 = 80, 5 * 20 = 100)
|
||||
*/
|
||||
#ifdef CONFIG_80MHz /* for 80 MHz, we use a 16 MHz clock * 5 */
|
||||
#if defined(CONFIG_80MHz) || defined(CONFIG_100MHz)
|
||||
#define CFG_PLPRCR \
|
||||
( (5-1)<<PLPRCR_MF_SHIFT | PLPRCR_TEXPS | PLPRCR_TMIST )
|
||||
#else /* up to 50 MHz we use a 1:1 clock */
|
||||
#define CFG_PLPRCR (PLPRCR_SPLSS | PLPRCR_TEXPS | PLPRCR_TMIST)
|
||||
#endif /* CONFIG_80MHz */
|
||||
#endif /* CONFIG_80MHz | CONFIG_100MHz */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* SCCR - System Clock and reset Control Register 15-27
|
||||
@@ -267,7 +269,7 @@
|
||||
* power management and some other internal clocks
|
||||
*/
|
||||
#define SCCR_MASK SCCR_EBDF11
|
||||
#ifdef CONFIG_80MHz /* for 80 MHz, we use a 16 MHz clock * 5 */
|
||||
#if defined(CONFIG_80MHz) || defined(CONFIG_100MHz) /* use 16/20 MHz * 5 */
|
||||
#define CFG_SCCR (/* SCCR_TBS | */ \
|
||||
SCCR_COM00 | SCCR_DFSYNC00 | SCCR_DFBRG00 | \
|
||||
SCCR_DFNL000 | SCCR_DFNH000 | SCCR_DFLCD000 | \
|
||||
@@ -277,7 +279,7 @@
|
||||
SCCR_COM00 | SCCR_DFSYNC00 | SCCR_DFBRG00 | \
|
||||
SCCR_DFNL000 | SCCR_DFNH000 | SCCR_DFLCD000 | \
|
||||
SCCR_DFALCD00)
|
||||
#endif /* CONFIG_80MHz */
|
||||
#endif /* CONFIG_80MHz | CONFIG_100MHz */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PCMCIA stuff
|
||||
@@ -334,7 +336,7 @@
|
||||
*/
|
||||
|
||||
#define FLASH_BASE0_PRELIM 0x40000000 /* FLASH bank #0 */
|
||||
#define FLASH_BASE1_PRELIM 0x60000000 /* FLASH bank #0 */
|
||||
#define FLASH_BASE1_PRELIM 0x60000000 /* FLASH bank #1 */
|
||||
|
||||
/* used to re-map FLASH both when starting from SRAM or FLASH:
|
||||
* restrict access enough to keep SRAM working (if any)
|
||||
@@ -346,8 +348,13 @@
|
||||
/*
|
||||
* FLASH timing:
|
||||
*/
|
||||
#if defined(CONFIG_80MHz)
|
||||
/* 80 MHz CPU - 40 MHz bus: ACS = 00, TRLX = 0, CSNT = 1, SCY = 3, EHTR = 1 */
|
||||
#if defined(CONFIG_100MHz)
|
||||
/* 100 MHz CPU - 50 MHz bus:
|
||||
* ACS = 01, TRLX = 0, CSNT = 0, SCY = 7, EHTR = 0 */
|
||||
#define CFG_OR_TIMING_FLASH (OR_ACS_DIV4 | OR_SCY_7_CLK | OR_BI)
|
||||
#elif defined(CONFIG_80MHz)
|
||||
/* 80 MHz CPU - 40 MHz bus:
|
||||
* ACS = 00, TRLX = 0, CSNT = 1, SCY = 3, EHTR = 1 */
|
||||
#define CFG_OR_TIMING_FLASH (OR_ACS_DIV1 | 0 | OR_CSNT_SAM | \
|
||||
OR_SCY_3_CLK | OR_EHTR | OR_BI)
|
||||
#elif defined(CONFIG_66MHz)
|
||||
@@ -415,11 +422,14 @@
|
||||
* --------------------------------------------
|
||||
* Divider = 4096 * 32 * 1000 / (4 * 64) = 512000
|
||||
*
|
||||
* 50 MHz => 50.000.000 / Divider = 98
|
||||
* 66 Mhz => 66.000.000 / Divider = 129
|
||||
* 80 Mhz => 80.000.000 / Divider = 156
|
||||
* 50 MHz => 50.000.000 / Divider = 98
|
||||
* 66 Mhz => 66.000.000 / Divider = 129
|
||||
* 80 Mhz => 80.000.000 / Divider = 156
|
||||
* 100 Mhz => 100.000.000 / Divider = 195
|
||||
*/
|
||||
#if defined(CONFIG_80MHz)
|
||||
#if defined(CONFIG_100MHz)
|
||||
#define CFG_MAMR_PTA 195
|
||||
#elif defined(CONFIG_80MHz)
|
||||
#define CFG_MAMR_PTA 156
|
||||
#elif defined(CONFIG_66MHz)
|
||||
#define CFG_MAMR_PTA 129
|
||||
|
||||
484
include/configs/TQM862M.h
Normal file
484
include/configs/TQM862M.h
Normal file
@@ -0,0 +1,484 @@
|
||||
/*
|
||||
* (C) Copyright 2000, 2001, 2002
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* board/config.h - configuration options, board specific
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
/*
|
||||
* High Level Configuration Options
|
||||
* (easy to change)
|
||||
*/
|
||||
|
||||
#define CONFIG_MPC860 1
|
||||
#define CONFIG_MPC860T 1
|
||||
#define CONFIG_MPC862 1
|
||||
|
||||
#define CONFIG_TQM862M 1 /* ...on a TQM8xxM module */
|
||||
|
||||
#define CONFIG_8xx_CONS_SMC1 1 /* Console is on SMC1 */
|
||||
#undef CONFIG_8xx_CONS_SMC2
|
||||
#undef CONFIG_8xx_CONS_NONE
|
||||
|
||||
#define CONFIG_BAUDRATE 115200 /* console baudrate = 115kbps */
|
||||
|
||||
#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */
|
||||
|
||||
#define CONFIG_CLOCKS_IN_MHZ 1 /* clocks passsed to Linux in MHz */
|
||||
|
||||
#define CONFIG_BOARD_TYPES 1 /* support board types */
|
||||
|
||||
#define CONFIG_PREBOOT "echo;" \
|
||||
"echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \
|
||||
"echo"
|
||||
|
||||
#undef CONFIG_BOOTARGS
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"netdev=eth0\0" \
|
||||
"nfsargs=setenv bootargs root=/dev/nfs rw " \
|
||||
"nfsroot=$(serverip):$(rootpath)\0" \
|
||||
"ramargs=setenv bootargs root=/dev/ram rw\0" \
|
||||
"addip=setenv bootargs $(bootargs) " \
|
||||
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask)" \
|
||||
":$(hostname):$(netdev):off panic=1\0" \
|
||||
"flash_nfs=run nfsargs addip;" \
|
||||
"bootm $(kernel_addr)\0" \
|
||||
"flash_self=run ramargs addip;" \
|
||||
"bootm $(kernel_addr) $(ramdisk_addr)\0" \
|
||||
"net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0" \
|
||||
"rootpath=/opt/eldk/ppc_8xx\0" \
|
||||
"bootfile=/tftpboot/TQM862M/uImage\0" \
|
||||
"kernel_addr=40080000\0" \
|
||||
"ramdisk_addr=40180000\0" \
|
||||
""
|
||||
#define CONFIG_BOOTCOMMAND "run flash_self"
|
||||
|
||||
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
|
||||
#undef CFG_LOADS_BAUD_CHANGE /* don't allow baudrate change */
|
||||
|
||||
#undef CONFIG_WATCHDOG /* watchdog disabled */
|
||||
|
||||
#define CONFIG_STATUS_LED 1 /* Status LED enabled */
|
||||
|
||||
#undef CONFIG_CAN_DRIVER /* CAN Driver support disabled */
|
||||
|
||||
#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAULT | CONFIG_BOOTP_BOOTFILESIZE)
|
||||
|
||||
#define CONFIG_MAC_PARTITION
|
||||
#define CONFIG_DOS_PARTITION
|
||||
|
||||
#define CONFIG_RTC_MPC8xx /* use internal RTC of MPC8xx */
|
||||
|
||||
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
|
||||
CFG_CMD_ASKENV | \
|
||||
CFG_CMD_DHCP | \
|
||||
CFG_CMD_IDE | \
|
||||
CFG_CMD_DATE )
|
||||
|
||||
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
|
||||
#include <cmd_confdefs.h>
|
||||
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CFG_LONGHELP /* undef to save memory */
|
||||
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
|
||||
|
||||
#if 0
|
||||
#define CFG_HUSH_PARSER 1 /* use "hush" command parser */
|
||||
#endif
|
||||
#ifdef CFG_HUSH_PARSER
|
||||
#define CFG_PROMPT_HUSH_PS2 "> "
|
||||
#endif
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
|
||||
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
|
||||
#else
|
||||
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#endif
|
||||
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
|
||||
#define CFG_MAXARGS 16 /* max number of command args */
|
||||
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
|
||||
|
||||
#define CFG_MEMTEST_START 0x0400000 /* memtest works on */
|
||||
#define CFG_MEMTEST_END 0x0C00000 /* 4 ... 12 MB in DRAM */
|
||||
|
||||
#define CFG_LOAD_ADDR 0x100000 /* default load address */
|
||||
|
||||
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
|
||||
|
||||
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
|
||||
|
||||
/*
|
||||
* Low Level Configuration Settings
|
||||
* (address mappings, register initial values, etc.)
|
||||
* You should know what you are doing if you make changes here.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------
|
||||
* Internal Memory Mapped Register
|
||||
*/
|
||||
#define CFG_IMMR 0xFFF00000
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Definitions for initial stack pointer and data area (in DPRAM)
|
||||
*/
|
||||
#define CFG_INIT_RAM_ADDR CFG_IMMR
|
||||
#define CFG_INIT_RAM_END 0x2F00 /* End of used area in DPRAM */
|
||||
#define CFG_GBL_DATA_SIZE 64 /* size in bytes reserved for initial data */
|
||||
#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
|
||||
#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Start addresses for the final memory configuration
|
||||
* (Set up by the startup code)
|
||||
* Please note that CFG_SDRAM_BASE _must_ start at 0
|
||||
*/
|
||||
#define CFG_SDRAM_BASE 0x00000000
|
||||
#define CFG_FLASH_BASE 0x40000000
|
||||
#define CFG_MONITOR_LEN (256 << 10) /* Reserve 256 kB for Monitor */
|
||||
#define CFG_MONITOR_BASE CFG_FLASH_BASE
|
||||
#define CFG_MALLOC_LEN (128 << 10) /* Reserve 128 kB for malloc() */
|
||||
|
||||
/*
|
||||
* For booting Linux, the board info and command line data
|
||||
* have to be in the first 8 MB of memory, since this is
|
||||
* the maximum mapped by the Linux kernel during initialization.
|
||||
*/
|
||||
#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* FLASH organization
|
||||
*/
|
||||
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
|
||||
#define CFG_MAX_FLASH_SECT 256 /* max number of sectors on one chip */
|
||||
|
||||
#define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms) */
|
||||
#define CFG_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms) */
|
||||
|
||||
#define CFG_ENV_IS_IN_FLASH 1
|
||||
|
||||
#define CFG_ENV_OFFSET 0x40000 /* Offset of Environment Sector */
|
||||
#define CFG_ENV_SIZE 0x08000 /* Total Size of Environment Sector */
|
||||
#define CFG_ENV_SECT_SIZE 0x20000 /* Total Size of Environment Sector */
|
||||
|
||||
/* Address and size of Redundant Environment Sector */
|
||||
#define CFG_ENV_OFFSET_REDUND (CFG_ENV_OFFSET+CFG_ENV_SECT_SIZE)
|
||||
#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Hardware Information Block
|
||||
*/
|
||||
#define CFG_HWINFO_OFFSET 0x0003FFC0 /* offset of HW Info block */
|
||||
#define CFG_HWINFO_SIZE 0x00000040 /* size of HW Info block */
|
||||
#define CFG_HWINFO_MAGIC 0x54514D38 /* 'TQM8' */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Cache Configuration
|
||||
*/
|
||||
#define CFG_CACHELINE_SIZE 16 /* For all MPC8xx CPUs */
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
|
||||
#define CFG_CACHELINE_SHIFT 4 /* log base 2 of the above value */
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* SYPCR - System Protection Control 11-9
|
||||
* SYPCR can only be written once after reset!
|
||||
*-----------------------------------------------------------------------
|
||||
* Software & Bus Monitor Timer max, Bus Monitor enable, SW Watchdog freeze
|
||||
*/
|
||||
#if defined(CONFIG_WATCHDOG)
|
||||
#define CFG_SYPCR (SYPCR_SWTC | SYPCR_BMT | SYPCR_BME | SYPCR_SWF | \
|
||||
SYPCR_SWE | SYPCR_SWRI| SYPCR_SWP)
|
||||
#else
|
||||
#define CFG_SYPCR (SYPCR_SWTC | SYPCR_BMT | SYPCR_BME | SYPCR_SWF | SYPCR_SWP)
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* SIUMCR - SIU Module Configuration 11-6
|
||||
*-----------------------------------------------------------------------
|
||||
* PCMCIA config., multi-function pin tri-state
|
||||
*/
|
||||
#ifndef CONFIG_CAN_DRIVER
|
||||
#define CFG_SIUMCR (SIUMCR_DBGC00 | SIUMCR_DBPC00 | SIUMCR_MLRC01)
|
||||
#else /* we must activate GPL5 in the SIUMCR for CAN */
|
||||
#define CFG_SIUMCR (SIUMCR_DBGC11 | SIUMCR_DBPC00 | SIUMCR_MLRC01)
|
||||
#endif /* CONFIG_CAN_DRIVER */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* TBSCR - Time Base Status and Control 11-26
|
||||
*-----------------------------------------------------------------------
|
||||
* Clear Reference Interrupt Status, Timebase freezing enabled
|
||||
*/
|
||||
#define CFG_TBSCR (TBSCR_REFA | TBSCR_REFB | TBSCR_TBF)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* RTCSC - Real-Time Clock Status and Control Register 11-27
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
#define CFG_RTCSC (RTCSC_SEC | RTCSC_ALR | RTCSC_RTF| RTCSC_RTE)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PISCR - Periodic Interrupt Status and Control 11-31
|
||||
*-----------------------------------------------------------------------
|
||||
* Clear Periodic Interrupt Status, Interrupt Timer freezing enabled
|
||||
*/
|
||||
#define CFG_PISCR (PISCR_PS | PISCR_PITF)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PLPRCR - PLL, Low-Power, and Reset Control Register 15-30
|
||||
*-----------------------------------------------------------------------
|
||||
* Reset PLL lock status sticky bit, timer expired status bit and timer
|
||||
* interrupt status bit
|
||||
*
|
||||
* If this is a 80 MHz or 100 MHz CPU,
|
||||
* set PLL multiplication factor to 5 (5 * 16 = 80, 5 * 20 = 100)
|
||||
*/
|
||||
#if defined(CONFIG_80MHz) || defined(CONFIG_100MHz)
|
||||
#define CFG_PLPRCR \
|
||||
( (5-1)<<PLPRCR_MF_SHIFT | PLPRCR_TEXPS | PLPRCR_TMIST )
|
||||
#else /* up to 50 MHz we use a 1:1 clock */
|
||||
#define CFG_PLPRCR (PLPRCR_SPLSS | PLPRCR_TEXPS | PLPRCR_TMIST)
|
||||
#endif /* CONFIG_80MHz | CONFIG_100MHz */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* SCCR - System Clock and reset Control Register 15-27
|
||||
*-----------------------------------------------------------------------
|
||||
* Set clock output, timebase and RTC source and divider,
|
||||
* power management and some other internal clocks
|
||||
*/
|
||||
#define SCCR_MASK SCCR_EBDF11
|
||||
#if defined(CONFIG_80MHz) || defined(CONFIG_100MHz) /* use 16/20 MHz * 5 */
|
||||
#define CFG_SCCR (/* SCCR_TBS | */ \
|
||||
SCCR_COM00 | SCCR_DFSYNC00 | SCCR_DFBRG00 | \
|
||||
SCCR_DFNL000 | SCCR_DFNH000 | SCCR_DFLCD000 | \
|
||||
SCCR_DFALCD00)
|
||||
#else /* up to 50 MHz we use a 1:1 clock */
|
||||
#define CFG_SCCR (SCCR_TBS | \
|
||||
SCCR_COM00 | SCCR_DFSYNC00 | SCCR_DFBRG00 | \
|
||||
SCCR_DFNL000 | SCCR_DFNH000 | SCCR_DFLCD000 | \
|
||||
SCCR_DFALCD00)
|
||||
#endif /* CONFIG_80MHz | CONFIG_100MHz */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PCMCIA stuff
|
||||
*-----------------------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
#define CFG_PCMCIA_MEM_ADDR (0xE0000000)
|
||||
#define CFG_PCMCIA_MEM_SIZE ( 64 << 20 )
|
||||
#define CFG_PCMCIA_DMA_ADDR (0xE4000000)
|
||||
#define CFG_PCMCIA_DMA_SIZE ( 64 << 20 )
|
||||
#define CFG_PCMCIA_ATTRB_ADDR (0xE8000000)
|
||||
#define CFG_PCMCIA_ATTRB_SIZE ( 64 << 20 )
|
||||
#define CFG_PCMCIA_IO_ADDR (0xEC000000)
|
||||
#define CFG_PCMCIA_IO_SIZE ( 64 << 20 )
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* IDE/ATA stuff (Supports IDE harddisk on PCMCIA Adapter)
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define CONFIG_IDE_8xx_PCCARD 1 /* Use IDE with PC Card Adapter */
|
||||
|
||||
#undef CONFIG_IDE_8xx_DIRECT /* Direct IDE not supported */
|
||||
#undef CONFIG_IDE_LED /* LED for ide not supported */
|
||||
#undef CONFIG_IDE_RESET /* reset for ide not supported */
|
||||
|
||||
#define CFG_IDE_MAXBUS 1 /* max. 1 IDE bus */
|
||||
#define CFG_IDE_MAXDEVICE 1 /* max. 1 drive per IDE bus */
|
||||
|
||||
#define CFG_ATA_IDE0_OFFSET 0x0000
|
||||
|
||||
#define CFG_ATA_BASE_ADDR CFG_PCMCIA_MEM_ADDR
|
||||
|
||||
/* Offset for data I/O */
|
||||
#define CFG_ATA_DATA_OFFSET (CFG_PCMCIA_MEM_SIZE + 0x320)
|
||||
|
||||
/* Offset for normal register accesses */
|
||||
#define CFG_ATA_REG_OFFSET (2 * CFG_PCMCIA_MEM_SIZE + 0x320)
|
||||
|
||||
/* Offset for alternate registers */
|
||||
#define CFG_ATA_ALT_OFFSET 0x0100
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*
|
||||
*-----------------------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
#define CFG_DER 0
|
||||
|
||||
/*
|
||||
* Init Memory Controller:
|
||||
*
|
||||
* BR0/1 and OR0/1 (FLASH)
|
||||
*/
|
||||
|
||||
#define FLASH_BASE0_PRELIM 0x40000000 /* FLASH bank #0 */
|
||||
#define FLASH_BASE1_PRELIM 0x60000000 /* FLASH bank #1 */
|
||||
|
||||
/* used to re-map FLASH both when starting from SRAM or FLASH:
|
||||
* restrict access enough to keep SRAM working (if any)
|
||||
* but not too much to meddle with FLASH accesses
|
||||
*/
|
||||
#define CFG_REMAP_OR_AM 0x80000000 /* OR addr mask */
|
||||
#define CFG_PRELIM_OR_AM 0xE0000000 /* OR addr mask */
|
||||
|
||||
/*
|
||||
* FLASH timing:
|
||||
*/
|
||||
#if defined(CONFIG_100MHz)
|
||||
/* 100 MHz CPU - 50 MHz bus:
|
||||
* ACS = 01, TRLX = 0, CSNT = 0, SCY = 7, EHTR = 0 */
|
||||
#define CFG_OR_TIMING_FLASH (OR_ACS_DIV4 | OR_SCY_7_CLK | OR_BI)
|
||||
#elif defined(CONFIG_80MHz)
|
||||
/* 80 MHz CPU - 40 MHz bus:
|
||||
* ACS = 00, TRLX = 0, CSNT = 1, SCY = 3, EHTR = 1 */
|
||||
#define CFG_OR_TIMING_FLASH (OR_ACS_DIV1 | 0 | OR_CSNT_SAM | \
|
||||
OR_SCY_3_CLK | OR_EHTR | OR_BI)
|
||||
#elif defined(CONFIG_66MHz)
|
||||
/* 66 MHz CPU - 66 MHz bus: ACS = 00, TRLX = 1, CSNT = 1, SCY = 3, EHTR = 1 */
|
||||
#define CFG_OR_TIMING_FLASH (OR_ACS_DIV1 | OR_TRLX | OR_CSNT_SAM | \
|
||||
OR_SCY_3_CLK | OR_EHTR | OR_BI)
|
||||
#else /* 50 MHz */
|
||||
/* 50 MHz CPU - 50 MHz bus: ACS = 00, TRLX = 1, CSNT = 1, SCY = 2, EHTR = 1 */
|
||||
#define CFG_OR_TIMING_FLASH (OR_ACS_DIV1 | OR_TRLX | OR_CSNT_SAM | \
|
||||
OR_SCY_2_CLK | OR_EHTR | OR_BI)
|
||||
#endif /*CONFIG_??MHz */
|
||||
|
||||
#define CFG_OR0_REMAP (CFG_REMAP_OR_AM | CFG_OR_TIMING_FLASH)
|
||||
#define CFG_OR0_PRELIM (CFG_PRELIM_OR_AM | CFG_OR_TIMING_FLASH)
|
||||
#define CFG_BR0_PRELIM ((FLASH_BASE0_PRELIM & BR_BA_MSK) | BR_V )
|
||||
|
||||
#define CFG_OR1_REMAP CFG_OR0_REMAP
|
||||
#define CFG_OR1_PRELIM CFG_OR0_PRELIM
|
||||
#define CFG_BR1_PRELIM ((FLASH_BASE1_PRELIM & BR_BA_MSK) | BR_V )
|
||||
|
||||
/*
|
||||
* BR2/3 and OR2/3 (SDRAM)
|
||||
*
|
||||
*/
|
||||
#define SDRAM_BASE2_PRELIM 0x00000000 /* SDRAM bank #0 */
|
||||
#define SDRAM_BASE3_PRELIM 0x20000000 /* SDRAM bank #1 */
|
||||
#define SDRAM_MAX_SIZE 0x04000000 /* max 64 MB per bank */
|
||||
|
||||
/* SDRAM timing: Multiplexed addresses, GPL5 output to GPL5_A (don't care) */
|
||||
#define CFG_OR_TIMING_SDRAM 0x00000A00
|
||||
|
||||
#define CFG_OR2_PRELIM (CFG_PRELIM_OR_AM | CFG_OR_TIMING_SDRAM )
|
||||
#define CFG_BR2_PRELIM ((SDRAM_BASE2_PRELIM & BR_BA_MSK) | BR_MS_UPMA | BR_V )
|
||||
|
||||
#ifndef CONFIG_CAN_DRIVER
|
||||
#define CFG_OR3_PRELIM CFG_OR2_PRELIM
|
||||
#define CFG_BR3_PRELIM ((SDRAM_BASE3_PRELIM & BR_BA_MSK) | BR_MS_UPMA | BR_V )
|
||||
#else /* CAN uses CS3#, so we can have only one SDRAM bank anyway */
|
||||
#define CFG_CAN_BASE 0xC0000000 /* CAN mapped at 0xC0000000 */
|
||||
#define CFG_CAN_OR_AM 0xFFFF8000 /* 32 kB address mask */
|
||||
#define CFG_OR3_CAN (CFG_CAN_OR_AM | OR_G5LA | OR_BI)
|
||||
#define CFG_BR3_CAN ((CFG_CAN_BASE & BR_BA_MSK) | \
|
||||
BR_PS_8 | BR_MS_UPMB | BR_V )
|
||||
#endif /* CONFIG_CAN_DRIVER */
|
||||
|
||||
/*
|
||||
* Memory Periodic Timer Prescaler
|
||||
*
|
||||
* The Divider for PTA (refresh timer) configuration is based on an
|
||||
* example SDRAM configuration (64 MBit, one bank). The adjustment to
|
||||
* the number of chip selects (NCS) and the actually needed refresh
|
||||
* rate is done by setting MPTPR.
|
||||
*
|
||||
* PTA is calculated from
|
||||
* PTA = (gclk * Trefresh) / ((2 ^ (2 * DFBRG)) * PTP * NCS)
|
||||
*
|
||||
* gclk CPU clock (not bus clock!)
|
||||
* Trefresh Refresh cycle * 4 (four word bursts used)
|
||||
*
|
||||
* 4096 Rows from SDRAM example configuration
|
||||
* 1000 factor s -> ms
|
||||
* 32 PTP (pre-divider from MPTPR) from SDRAM example configuration
|
||||
* 4 Number of refresh cycles per period
|
||||
* 64 Refresh cycle in ms per number of rows
|
||||
* --------------------------------------------
|
||||
* Divider = 4096 * 32 * 1000 / (4 * 64) = 512000
|
||||
*
|
||||
* 50 MHz => 50.000.000 / Divider = 98
|
||||
* 66 Mhz => 66.000.000 / Divider = 129
|
||||
* 80 Mhz => 80.000.000 / Divider = 156
|
||||
* 100 Mhz => 100.000.000 / Divider = 195
|
||||
*/
|
||||
#if defined(CONFIG_100MHz)
|
||||
#define CFG_MAMR_PTA 195
|
||||
#elif defined(CONFIG_80MHz)
|
||||
#define CFG_MAMR_PTA 156
|
||||
#elif defined(CONFIG_66MHz)
|
||||
#define CFG_MAMR_PTA 129
|
||||
#else /* 50 MHz */
|
||||
#define CFG_MAMR_PTA 98
|
||||
#endif /*CONFIG_??MHz */
|
||||
|
||||
/*
|
||||
* For 16 MBit, refresh rates could be 31.3 us
|
||||
* (= 64 ms / 2K = 125 / quad bursts).
|
||||
* For a simpler initialization, 15.6 us is used instead.
|
||||
*
|
||||
* #define CFG_MPTPR_2BK_2K MPTPR_PTP_DIV32 for 2 banks
|
||||
* #define CFG_MPTPR_1BK_2K MPTPR_PTP_DIV64 for 1 bank
|
||||
*/
|
||||
#define CFG_MPTPR_2BK_4K MPTPR_PTP_DIV16 /* setting for 2 banks */
|
||||
#define CFG_MPTPR_1BK_4K MPTPR_PTP_DIV32 /* setting for 1 bank */
|
||||
|
||||
/* refresh rate 7.8 us (= 64 ms / 8K = 31.2 / quad bursts) for 256 MBit */
|
||||
#define CFG_MPTPR_2BK_8K MPTPR_PTP_DIV8 /* setting for 2 banks */
|
||||
#define CFG_MPTPR_1BK_8K MPTPR_PTP_DIV16 /* setting for 1 bank */
|
||||
|
||||
/*
|
||||
* MAMR settings for SDRAM
|
||||
*/
|
||||
|
||||
/* 8 column SDRAM */
|
||||
#define CFG_MAMR_8COL ((CFG_MAMR_PTA << MAMR_PTA_SHIFT) | MAMR_PTAE | \
|
||||
MAMR_AMA_TYPE_0 | MAMR_DSA_1_CYCL | MAMR_G0CLA_A11 | \
|
||||
MAMR_RLFA_1X | MAMR_WLFA_1X | MAMR_TLFA_4X)
|
||||
/* 9 column SDRAM */
|
||||
#define CFG_MAMR_9COL ((CFG_MAMR_PTA << MAMR_PTA_SHIFT) | MAMR_PTAE | \
|
||||
MAMR_AMA_TYPE_1 | MAMR_DSA_1_CYCL | MAMR_G0CLA_A10 | \
|
||||
MAMR_RLFA_1X | MAMR_WLFA_1X | MAMR_TLFA_4X)
|
||||
|
||||
|
||||
/*
|
||||
* Internal Definitions
|
||||
*
|
||||
* Boot Flags
|
||||
*/
|
||||
#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */
|
||||
#define BOOTFLAG_WARM 0x02 /* Software reboot */
|
||||
|
||||
#define CONFIG_NET_MULTI
|
||||
#define CONFIG_SCC1_ENET
|
||||
#define CONFIG_FEC_ENET
|
||||
#define CONFIG_ETHPRIME "SCC ETHERNET"
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
@@ -283,6 +283,7 @@
|
||||
~CFG_CMD_JFFS2 & \
|
||||
~CFG_CMD_KGDB & \
|
||||
~CFG_CMD_MII & \
|
||||
~CFG_CMD_MMC & \
|
||||
~CFG_CMD_NAND & \
|
||||
~CFG_CMD_PCI & \
|
||||
~CFG_CMD_PCMCIA & \
|
||||
|
||||
@@ -148,6 +148,7 @@
|
||||
CFG_CMD_JFFS2 | \
|
||||
CFG_CMD_NAND | \
|
||||
CFG_CMD_MII | \
|
||||
CFG_CMD_MMC | \
|
||||
CFG_CMD_PCMCIA | \
|
||||
CFG_CMD_PCI | \
|
||||
CFG_CMD_USB | \
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
*
|
||||
* 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
|
||||
* 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
|
||||
@@ -34,21 +34,24 @@
|
||||
* If we are developing, we might want to start armboot from ram
|
||||
* so we MUST NOT initialize critical regs like mem-timing ...
|
||||
*/
|
||||
#define CONFIG_INIT_CRITICAL /* undef for developing */
|
||||
#define CONFIG_INIT_CRITICAL /* undef for developing */
|
||||
|
||||
/*
|
||||
* High Level Configuration Options
|
||||
* (easy to change)
|
||||
*/
|
||||
#define CONFIG_PXA250 1 /* This is an PXA250 CPU */
|
||||
#define CONFIG_LUBBOCK 1 /* on an LUBBOCK Board */
|
||||
#define CONFIG_PXA250 1 /* This is an PXA250 CPU */
|
||||
#define CONFIG_LUBBOCK 1 /* on an LUBBOCK Board */
|
||||
#define CONFIG_LCD 1
|
||||
#define CONFIG_MMC 1
|
||||
#define BOARD_POST_INIT 1
|
||||
|
||||
#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
|
||||
#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
|
||||
|
||||
/*
|
||||
* Size of malloc() pool
|
||||
*/
|
||||
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024)
|
||||
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024)
|
||||
|
||||
/*
|
||||
* Hardware drivers
|
||||
@@ -59,166 +62,176 @@
|
||||
/*
|
||||
* select serial console configuration
|
||||
*/
|
||||
#define CONFIG_FFUART 1 /* we use FFUART on LUBBOCK */
|
||||
#define CONFIG_FFUART 1 /* we use FFUART on LUBBOCK */
|
||||
|
||||
/* allow to overwrite serial and ethaddr */
|
||||
#define CONFIG_ENV_OVERWRITE
|
||||
|
||||
#define CONFIG_BAUDRATE 115200
|
||||
#define CONFIG_BAUDRATE 115200
|
||||
|
||||
#define CONFIG_COMMANDS (CONFIG_CMD_DFL)
|
||||
#define CONFIG_COMMANDS (CONFIG_CMD_DFL | CFG_CMD_MMC | CFG_CMD_FAT)
|
||||
|
||||
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
|
||||
#include <cmd_confdefs.h>
|
||||
|
||||
#define CONFIG_BOOTDELAY 3
|
||||
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
|
||||
#define CONFIG_NETMASK 255.255.0.0
|
||||
#define CONFIG_IPADDR 192.168.0.21
|
||||
#define CONFIG_SERVERIP 192.168.0.250
|
||||
#define CONFIG_BOOTCOMMAND "bootm 40000"
|
||||
#define CONFIG_BOOTARGS "root=/dev/mtdblock2 rootfstype=cramfs console=ttyS0,115200"
|
||||
#define CONFIG_CMDLINE_TAG
|
||||
#define CONFIG_BOOTDELAY 3
|
||||
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
|
||||
#define CONFIG_NETMASK 255.255.0.0
|
||||
#define CONFIG_IPADDR 192.168.0.21
|
||||
#define CONFIG_SERVERIP 192.168.0.250
|
||||
#define CONFIG_BOOTCOMMAND "bootm 40000"
|
||||
#define CONFIG_BOOTARGS "root=/dev/mtdblock2 rootfstype=cramfs console=ttyS0,115200"
|
||||
#define CONFIG_CMDLINE_TAG
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
|
||||
#define CONFIG_KGDB_BAUDRATE 230400 /* speed to run kgdb serial port */
|
||||
#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */
|
||||
#define CONFIG_KGDB_BAUDRATE 230400 /* speed to run kgdb serial port */
|
||||
#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CFG_LONGHELP /* undef to save memory */
|
||||
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
|
||||
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#define CFG_HUSH_PARSER 1
|
||||
#define CFG_PROMPT_HUSH_PS2 "> "
|
||||
|
||||
#define CFG_LONGHELP /* undef to save memory */
|
||||
#ifdef CFG_HUSH_PARSER
|
||||
#define CFG_PROMPT "$ " /* Monitor Command Prompt */
|
||||
#else
|
||||
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
|
||||
#endif
|
||||
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
|
||||
#define CFG_MAXARGS 16 /* max number of command args */
|
||||
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
|
||||
#define CFG_MAXARGS 16 /* max number of command args */
|
||||
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
|
||||
#define CFG_DEVICE_NULLDEV 1
|
||||
|
||||
#define CFG_MEMTEST_START 0xa0400000 /* memtest works on */
|
||||
#define CFG_MEMTEST_END 0xa0800000 /* 4 ... 8 MB in DRAM */
|
||||
#define CFG_MEMTEST_START 0xa0400000 /* memtest works on */
|
||||
#define CFG_MEMTEST_END 0xa0800000 /* 4 ... 8 MB in DRAM */
|
||||
|
||||
#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
|
||||
#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
|
||||
|
||||
#define CFG_LOAD_ADDR 0xa8000000 /* default load address */
|
||||
#define CFG_LOAD_ADDR 0xa8000000 /* default load address */
|
||||
|
||||
#define CFG_HZ 3686400 /* incrementer freq: 3.6864 MHz */
|
||||
#define CFG_CPUSPEED 0x161 /* set core clock to 400/200/100 MHz */
|
||||
#define CFG_HZ 3686400 /* incrementer freq: 3.6864 MHz */
|
||||
#define CFG_CPUSPEED 0x161 /* set core clock to 400/200/100 MHz */
|
||||
|
||||
/* valid baudrates */
|
||||
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
|
||||
/* valid baudrates */
|
||||
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
|
||||
|
||||
#define CFG_MMC_BASE 0xF0000000
|
||||
|
||||
/*
|
||||
* Stack sizes
|
||||
*
|
||||
* The stack sizes are set up in start.S using the settings below
|
||||
*/
|
||||
#define CONFIG_STACKSIZE (128*1024) /* regular stack */
|
||||
#define CONFIG_STACKSIZE (128*1024) /* regular stack */
|
||||
#ifdef CONFIG_USE_IRQ
|
||||
#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
|
||||
#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
|
||||
#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
|
||||
#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Physical Memory Map
|
||||
*/
|
||||
#define CONFIG_NR_DRAM_BANKS 4 /* we have 2 banks of DRAM */
|
||||
#define PHYS_SDRAM_1 0xa0000000 /* SDRAM Bank #1 */
|
||||
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
|
||||
#define PHYS_SDRAM_2 0xa4000000 /* SDRAM Bank #2 */
|
||||
#define PHYS_SDRAM_2_SIZE 0x00000000 /* 0 MB */
|
||||
#define PHYS_SDRAM_3 0xa8000000 /* SDRAM Bank #3 */
|
||||
#define PHYS_SDRAM_3_SIZE 0x00000000 /* 0 MB */
|
||||
#define PHYS_SDRAM_4 0xac000000 /* SDRAM Bank #4 */
|
||||
#define PHYS_SDRAM_4_SIZE 0x00000000 /* 0 MB */
|
||||
#define CONFIG_NR_DRAM_BANKS 4 /* we have 2 banks of DRAM */
|
||||
#define PHYS_SDRAM_1 0xa0000000 /* SDRAM Bank #1 */
|
||||
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
|
||||
#define PHYS_SDRAM_2 0xa4000000 /* SDRAM Bank #2 */
|
||||
#define PHYS_SDRAM_2_SIZE 0x00000000 /* 0 MB */
|
||||
#define PHYS_SDRAM_3 0xa8000000 /* SDRAM Bank #3 */
|
||||
#define PHYS_SDRAM_3_SIZE 0x00000000 /* 0 MB */
|
||||
#define PHYS_SDRAM_4 0xac000000 /* SDRAM Bank #4 */
|
||||
#define PHYS_SDRAM_4_SIZE 0x00000000 /* 0 MB */
|
||||
|
||||
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
|
||||
#define PHYS_FLASH_2 0x04000000 /* Flash Bank #2 */
|
||||
#define PHYS_FLASH_SIZE 0x02000000 /* 32 MB */
|
||||
#define PHYS_FLASH_BANK_SIZE 0x02000000 /* 32 MB Banks */
|
||||
#define PHYS_FLASH_SECT_SIZE 0x00040000 /* 256 KB sectors (x2) */
|
||||
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
|
||||
#define PHYS_FLASH_2 0x04000000 /* Flash Bank #2 */
|
||||
#define PHYS_FLASH_SIZE 0x02000000 /* 32 MB */
|
||||
#define PHYS_FLASH_BANK_SIZE 0x02000000 /* 32 MB Banks */
|
||||
#define PHYS_FLASH_SECT_SIZE 0x00040000 /* 256 KB sectors (x2) */
|
||||
|
||||
#define CFG_DRAM_BASE 0xa0000000
|
||||
#define CFG_DRAM_SIZE 0x04000000
|
||||
#define CFG_DRAM_BASE 0xa0000000
|
||||
#define CFG_DRAM_SIZE 0x04000000
|
||||
|
||||
#define CFG_FLASH_BASE PHYS_FLASH_1
|
||||
#define CFG_FLASH_BASE PHYS_FLASH_1
|
||||
|
||||
#define FPGA_REGS_BASE_PHYSICAL 0x08000000
|
||||
|
||||
/*
|
||||
* GPIO settings
|
||||
*/
|
||||
#define CFG_GPSR0_VAL 0x00008000
|
||||
#define CFG_GPSR1_VAL 0x00FC0382
|
||||
#define CFG_GPSR2_VAL 0x0001FFFF
|
||||
#define CFG_GPCR0_VAL 0x00000000
|
||||
#define CFG_GPCR1_VAL 0x00000000
|
||||
#define CFG_GPCR2_VAL 0x00000000
|
||||
#define CFG_GPDR0_VAL 0x0060A800
|
||||
#define CFG_GPDR1_VAL 0x00FF0382
|
||||
#define CFG_GPDR2_VAL 0x0001C000
|
||||
#define CFG_GAFR0_L_VAL 0x98400000
|
||||
#define CFG_GAFR0_U_VAL 0x00002950
|
||||
#define CFG_GAFR1_L_VAL 0x000A9558
|
||||
#define CFG_GAFR1_U_VAL 0x0005AAAA
|
||||
#define CFG_GAFR2_L_VAL 0xA0000000
|
||||
#define CFG_GAFR2_U_VAL 0x00000002
|
||||
#define CFG_GPSR0_VAL 0x00008000
|
||||
#define CFG_GPSR1_VAL 0x00FC0382
|
||||
#define CFG_GPSR2_VAL 0x0001FFFF
|
||||
#define CFG_GPCR0_VAL 0x00000000
|
||||
#define CFG_GPCR1_VAL 0x00000000
|
||||
#define CFG_GPCR2_VAL 0x00000000
|
||||
#define CFG_GPDR0_VAL 0x0060A800
|
||||
#define CFG_GPDR1_VAL 0x00FF0382
|
||||
#define CFG_GPDR2_VAL 0x0001C000
|
||||
#define CFG_GAFR0_L_VAL 0x98400000
|
||||
#define CFG_GAFR0_U_VAL 0x00002950
|
||||
#define CFG_GAFR1_L_VAL 0x000A9558
|
||||
#define CFG_GAFR1_U_VAL 0x0005AAAA
|
||||
#define CFG_GAFR2_L_VAL 0xA0000000
|
||||
#define CFG_GAFR2_U_VAL 0x00000002
|
||||
|
||||
#define CFG_PSSR_VAL 0x20
|
||||
#define CFG_PSSR_VAL 0x20
|
||||
|
||||
/*
|
||||
* Memory settings
|
||||
*/
|
||||
#define CFG_MSC0_VAL 0x23F223F2
|
||||
#define CFG_MSC1_VAL 0x3FF1A441
|
||||
#define CFG_MSC2_VAL 0x7FF17FF1
|
||||
#define CFG_MDCNFG_VAL 0x00001AC9
|
||||
#define CFG_MDREFR_VAL 0x00018018
|
||||
#define CFG_MDMRS_VAL 0x00000000
|
||||
#define CFG_MSC0_VAL 0x23F223F2
|
||||
#define CFG_MSC1_VAL 0x3FF1A441
|
||||
#define CFG_MSC2_VAL 0x7FF97FF1
|
||||
#define CFG_MDCNFG_VAL 0x00001AC9
|
||||
#define CFG_MDREFR_VAL 0x00018018
|
||||
#define CFG_MDMRS_VAL 0x00000000
|
||||
|
||||
/*
|
||||
* PCMCIA and CF Interfaces
|
||||
*/
|
||||
#define CFG_MECR_VAL 0x00000000
|
||||
#define CFG_MCMEM0_VAL 0x00010504
|
||||
#define CFG_MCMEM1_VAL 0x00010504
|
||||
#define CFG_MCATT0_VAL 0x00010504
|
||||
#define CFG_MCATT1_VAL 0x00010504
|
||||
#define CFG_MCIO0_VAL 0x00004715
|
||||
#define CFG_MCIO1_VAL 0x00004715
|
||||
#define CFG_MECR_VAL 0x00000000
|
||||
#define CFG_MCMEM0_VAL 0x00010504
|
||||
#define CFG_MCMEM1_VAL 0x00010504
|
||||
#define CFG_MCATT0_VAL 0x00010504
|
||||
#define CFG_MCATT1_VAL 0x00010504
|
||||
#define CFG_MCIO0_VAL 0x00004715
|
||||
#define CFG_MCIO1_VAL 0x00004715
|
||||
|
||||
#define _LED 0x08000010
|
||||
#define LED_BLANK (0x08000040)
|
||||
#define _LED 0x08000010
|
||||
#define LED_BLANK 0x08000040
|
||||
|
||||
/*
|
||||
* FLASH and environment organization
|
||||
*/
|
||||
#define CFG_MAX_FLASH_BANKS 2 /* max number of memory banks */
|
||||
#define CFG_MAX_FLASH_SECT 128 /* max number of sectors on one chip */
|
||||
#define CFG_MAX_FLASH_BANKS 2 /* max number of memory banks */
|
||||
#define CFG_MAX_FLASH_SECT 128 /* max number of sectors on one chip */
|
||||
|
||||
/* timeout values are in ticks */
|
||||
#define CFG_FLASH_ERASE_TOUT (25*CFG_HZ) /* Timeout for Flash Erase */
|
||||
#define CFG_FLASH_WRITE_TOUT (25*CFG_HZ) /* Timeout for Flash Write */
|
||||
#define CFG_FLASH_ERASE_TOUT (25*CFG_HZ) /* Timeout for Flash Erase */
|
||||
#define CFG_FLASH_WRITE_TOUT (25*CFG_HZ) /* Timeout for Flash Write */
|
||||
|
||||
/* FIXME */
|
||||
#define CFG_ENV_IS_IN_FLASH 1
|
||||
#define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x1C000) /* Addr of Environment Sector */
|
||||
#define CFG_ENV_SIZE 0x4000 /* Total Size of Environment Sector */
|
||||
#define CFG_ENV_IS_IN_FLASH 1
|
||||
#define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x1C000) /* Addr of Environment Sector */
|
||||
#define CFG_ENV_SIZE 0x4000 /* Total Size of Environment Sector */
|
||||
|
||||
|
||||
/*
|
||||
* FPGA Offsets
|
||||
*/
|
||||
#define WHOAMI_OFFSET 0x00
|
||||
#define HEXLED_OFFSET 0x10
|
||||
#define BLANKLED_OFFSET 0x40
|
||||
#define DISCRETELED_OFFSET 0x40
|
||||
#define CNFG_SWITCHES_OFFSET 0x50
|
||||
#define USER_SWITCHES_OFFSET 0x60
|
||||
#define MISC_WR_OFFSET 0x80
|
||||
#define MISC_RD_OFFSET 0x90
|
||||
#define INT_MASK_OFFSET 0xC0
|
||||
#define INT_CLEAR_OFFSET 0xD0
|
||||
#define GP_OFFSET 0x100
|
||||
#define WHOAMI_OFFSET 0x00
|
||||
#define HEXLED_OFFSET 0x10
|
||||
#define BLANKLED_OFFSET 0x40
|
||||
#define DISCRETELED_OFFSET 0x40
|
||||
#define CNFG_SWITCHES_OFFSET 0x50
|
||||
#define USER_SWITCHES_OFFSET 0x60
|
||||
#define MISC_WR_OFFSET 0x80
|
||||
#define MISC_RD_OFFSET 0x90
|
||||
#define INT_MASK_OFFSET 0xC0
|
||||
#define INT_CLEAR_OFFSET 0xD0
|
||||
#define GP_OFFSET 0x100
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
#endif /* __CONFIG_H */
|
||||
|
||||
379
include/configs/rmu.h
Normal file
379
include/configs/rmu.h
Normal file
@@ -0,0 +1,379 @@
|
||||
/*
|
||||
* (C) Copyright 2003
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* board/config.h - configuration options, board specific
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
|
||||
/*
|
||||
* High Level Configuration Options
|
||||
* (easy to change)
|
||||
*/
|
||||
|
||||
#undef CONFIG_MPC860
|
||||
#define CONFIG_MPC850 1 /* This is a MPC850 CPU */
|
||||
#define CONFIG_RPXLITE 1 /* RMU is the RPXlite clone */
|
||||
#define CONFIG_RMU 1
|
||||
|
||||
#define CONFIG_8xx_CONS_SMC1 1 /* Console is on SMC1 */
|
||||
#undef CONFIG_8xx_CONS_SMC2
|
||||
#undef CONFIG_8xx_CONS_NONE
|
||||
#define CONFIG_BAUDRATE 9600 /* console baudrate = 9600bps */
|
||||
#if 0
|
||||
#define CONFIG_BOOTDELAY -1 /* autoboot disabled */
|
||||
#else
|
||||
#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */
|
||||
#endif
|
||||
|
||||
#define CONFIG_CLOCKS_IN_MHZ 1 /* clocks passsed to Linux in MHz */
|
||||
|
||||
#undef CONFIG_BOOTARGS
|
||||
#define CONFIG_BOOTCOMMAND \
|
||||
"bootp; " \
|
||||
"setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath) " \
|
||||
"ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off; " \
|
||||
"bootm"
|
||||
|
||||
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
|
||||
#undef CFG_LOADS_BAUD_CHANGE /* don't allow baudrate change */
|
||||
|
||||
#undef CONFIG_WATCHDOG /* watchdog disabled */
|
||||
|
||||
#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAULT | CONFIG_BOOTP_BOOTFILESIZE)
|
||||
|
||||
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
|
||||
#include <cmd_confdefs.h>
|
||||
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CFG_LONGHELP /* undef to save memory */
|
||||
#define CFG_PROMPT "=> " /* Monitor Command Prompt */
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
|
||||
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
|
||||
#else
|
||||
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#endif
|
||||
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
|
||||
#define CFG_MAXARGS 16 /* max number of command args */
|
||||
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
|
||||
|
||||
#define CFG_MEMTEST_START 0x0040000 /* memtest works on */
|
||||
#define CFG_MEMTEST_END 0x00C0000 /* 4 ... 12 MB in DRAM */
|
||||
|
||||
#define CFG_LOAD_ADDR 0x100000 /* default load address */
|
||||
|
||||
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
|
||||
|
||||
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
|
||||
|
||||
/*
|
||||
* Low Level Configuration Settings
|
||||
* (address mappings, register initial values, etc.)
|
||||
* You should know what you are doing if you make changes here.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------
|
||||
* Internal Memory Mapped Register
|
||||
*/
|
||||
#define CFG_IMMR 0xFA200000
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Definitions for initial stack pointer and data area (in DPRAM)
|
||||
*/
|
||||
#define CFG_INIT_RAM_ADDR CFG_IMMR
|
||||
#define CFG_INIT_RAM_END 0x2F00 /* End of used area in DPRAM */
|
||||
#define CFG_GBL_DATA_SIZE 64 /* size in bytes reserved for initial data */
|
||||
#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
|
||||
#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Start addresses for the final memory configuration
|
||||
* (Set up by the startup code)
|
||||
* Please note that CFG_SDRAM_BASE _must_ start at 0
|
||||
*/
|
||||
#define CFG_SDRAM_BASE 0x00000000
|
||||
#define CFG_FLASH_BASE 0xFF800000
|
||||
/*%%% #define CFG_FLASH_BASE 0xFFF00000 */
|
||||
#if defined(DEBUG) || (CONFIG_COMMANDS & CFG_CMD_IDE)
|
||||
#define CFG_MONITOR_LEN (256 << 10) /* Reserve 256 kB for Monitor */
|
||||
#else
|
||||
#define CFG_MONITOR_LEN (128 << 10) /* Reserve 128 kB for Monitor */
|
||||
#endif
|
||||
#define CFG_MONITOR_BASE 0xFFF00000
|
||||
/*%%% #define CFG_MONITOR_BASE CFG_FLASH_BASE */
|
||||
#define CFG_MALLOC_LEN (128 << 10) /* Reserve 128 kB for malloc() */
|
||||
|
||||
/*
|
||||
* For booting Linux, the board info and command line data
|
||||
* have to be in the first 8 MB of memory, since this is
|
||||
* the maximum mapped by the Linux kernel during initialization.
|
||||
*/
|
||||
#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* FLASH organization
|
||||
*/
|
||||
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
|
||||
#define CFG_MAX_FLASH_SECT 35 /* max number of sectors on one chip */
|
||||
|
||||
#define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms) */
|
||||
#define CFG_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms) */
|
||||
|
||||
#define CFG_ENV_IS_IN_FLASH 1
|
||||
#define CFG_ENV_OFFSET 0x00740000 /* Offset of Environment Sector */
|
||||
#define CFG_ENV_SIZE 0x40000 /* Total Size of Environment Sector */
|
||||
#define CFG_ENV_ADDR (CFG_FLASH_BASE + CFG_ENV_OFFSET)
|
||||
|
||||
/* Address and size of Redundant Environment Sector */
|
||||
#define CFG_ENV_OFFSET_REDUND (CFG_ENV_OFFSET+CFG_ENV_SIZE)
|
||||
#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Cache Configuration
|
||||
*/
|
||||
#define CFG_CACHELINE_SIZE 16 /* For all MPC8xx CPUs */
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
|
||||
#define CFG_CACHELINE_SHIFT 4 /* log base 2 of the above value */
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* SYPCR - System Protection Control 11-9
|
||||
* SYPCR can only be written once after reset!
|
||||
*-----------------------------------------------------------------------
|
||||
* Software & Bus Monitor Timer max, Bus Monitor enable, SW Watchdog freeze
|
||||
*/
|
||||
#if defined(CONFIG_WATCHDOG)
|
||||
#define CFG_SYPCR (SYPCR_SWTC | SYPCR_BMT | SYPCR_BME | SYPCR_SWF | \
|
||||
SYPCR_SWE | SYPCR_SWRI| SYPCR_SWP)
|
||||
#else
|
||||
#define CFG_SYPCR (SYPCR_SWTC | 0x00000600 | SYPCR_BME | SYPCR_SWF | SYPCR_SWP)
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* SIUMCR - SIU Module Configuration 11-6
|
||||
*-----------------------------------------------------------------------
|
||||
* PCMCIA config., multi-function pin tri-state
|
||||
*/
|
||||
#define CFG_SIUMCR (SIUMCR_MLRC10)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* TBSCR - Time Base Status and Control 11-26
|
||||
*-----------------------------------------------------------------------
|
||||
* Clear Reference Interrupt Status, Timebase freezing enabled
|
||||
*/
|
||||
#define CFG_TBSCR (TBSCR_REFA | TBSCR_REFB | TBSCR_TBF | TBSCR_TBE)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* RTCSC - Real-Time Clock Status and Control Register 11-27
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
/*%%%#define CFG_RTCSC (RTCSC_SEC | RTCSC_ALR | RTCSC_RTF| RTCSC_RTE) */
|
||||
#define CFG_RTCSC (RTCSC_SEC | RTCSC_RTE)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PISCR - Periodic Interrupt Status and Control 11-31
|
||||
*-----------------------------------------------------------------------
|
||||
* Clear Periodic Interrupt Status, Interrupt Timer freezing enabled
|
||||
*/
|
||||
#define CFG_PISCR (PISCR_PS | PISCR_PITF)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PLPRCR - PLL, Low-Power, and Reset Control Register 15-30
|
||||
*-----------------------------------------------------------------------
|
||||
* Reset PLL lock status sticky bit, timer expired status bit and timer
|
||||
* interrupt status bit
|
||||
*
|
||||
* If this is a 80 MHz CPU, set PLL multiplication factor to 5 (5*16=80)!
|
||||
*/
|
||||
/* up to 50 MHz we use a 1:1 clock */
|
||||
#define CFG_PLPRCR ( (5 << PLPRCR_MF_SHIFT) | PLPRCR_TEXPS )
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* SCCR - System Clock and reset Control Register 15-27
|
||||
*-----------------------------------------------------------------------
|
||||
* Set clock output, timebase and RTC source and divider,
|
||||
* power management and some other internal clocks
|
||||
*/
|
||||
#define SCCR_MASK SCCR_EBDF00
|
||||
/* up to 50 MHz we use a 1:1 clock */
|
||||
#define CFG_SCCR (SCCR_COM00 | SCCR_TBS)
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* PCMCIA stuff
|
||||
*-----------------------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
#define CFG_PCMCIA_MEM_ADDR (0xE0000000)
|
||||
#define CFG_PCMCIA_MEM_SIZE ( 64 << 20 )
|
||||
#define CFG_PCMCIA_DMA_ADDR (0xE4000000)
|
||||
#define CFG_PCMCIA_DMA_SIZE ( 64 << 20 )
|
||||
#define CFG_PCMCIA_ATTRB_ADDR (0xE8000000)
|
||||
#define CFG_PCMCIA_ATTRB_SIZE ( 64 << 20 )
|
||||
#define CFG_PCMCIA_IO_ADDR (0xEC000000)
|
||||
#define CFG_PCMCIA_IO_SIZE ( 64 << 20 )
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* IDE/ATA stuff (Supports IDE harddisk on PCMCIA Adapter)
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define CONFIG_IDE_8xx_PCCARD 1 /* Use IDE with PC Card Adapter */
|
||||
|
||||
#undef CONFIG_IDE_8xx_DIRECT /* Direct IDE not supported */
|
||||
#undef CONFIG_IDE_LED /* LED for ide not supported */
|
||||
#undef CONFIG_IDE_RESET /* reset for ide not supported */
|
||||
|
||||
#define CFG_IDE_MAXBUS 1 /* max. 1 IDE bus */
|
||||
#define CFG_IDE_MAXDEVICE 1 /* max. 1 drive per IDE bus */
|
||||
|
||||
#define CFG_ATA_IDE0_OFFSET 0x0000
|
||||
|
||||
#define CFG_ATA_BASE_ADDR CFG_PCMCIA_MEM_ADDR
|
||||
|
||||
/* Offset for data I/O */
|
||||
#define CFG_ATA_DATA_OFFSET (CFG_PCMCIA_MEM_SIZE + 0x320)
|
||||
|
||||
/* Offset for normal register accesses */
|
||||
#define CFG_ATA_REG_OFFSET (2 * CFG_PCMCIA_MEM_SIZE + 0x320)
|
||||
|
||||
/* Offset for alternate registers */
|
||||
#define CFG_ATA_ALT_OFFSET 0x0100
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
*
|
||||
*-----------------------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
/*#define CFG_DER 0x2002000F*/
|
||||
#define CFG_DER 0
|
||||
|
||||
/*
|
||||
* Init Memory Controller:
|
||||
*
|
||||
* BR0 and OR0 (FLASH)
|
||||
*/
|
||||
|
||||
#define FLASH_BASE_PRELIM 0xFE000000 /* FLASH base */
|
||||
#define CFG_PRELIM_OR_AM 0xFE000000 /* OR addr mask */
|
||||
|
||||
/* FLASH timing: ACS = 0, TRLX = 0, CSNT = 0, SCY = 4, ETHR = 0, BIH = 1 */
|
||||
#define CFG_OR_TIMING_FLASH (OR_SCY_4_CLK | OR_BI)
|
||||
|
||||
#define CFG_OR0_PRELIM (CFG_PRELIM_OR_AM | CFG_OR_TIMING_FLASH)
|
||||
#define CFG_BR0_PRELIM ((FLASH_BASE_PRELIM & BR_BA_MSK) | BR_V)
|
||||
|
||||
/*
|
||||
* BR1 and OR1 (SDRAM)
|
||||
*
|
||||
*/
|
||||
#define SDRAM_BASE_PRELIM 0x00000000 /* SDRAM base */
|
||||
#define SDRAM_MAX_SIZE 0x01000000 /* max 16 MB */
|
||||
|
||||
/* SDRAM timing: Multiplexed addresses, GPL5 output to GPL5_A (don't care) */
|
||||
#define CFG_OR_TIMING_SDRAM 0x00000E00
|
||||
|
||||
#define CFG_OR1_PRELIM (CFG_PRELIM_OR_AM | CFG_OR_TIMING_SDRAM )
|
||||
#define CFG_BR1_PRELIM ((SDRAM_BASE_PRELIM & BR_BA_MSK) | BR_MS_UPMA | BR_V )
|
||||
|
||||
/* RPXLITE mem setting */
|
||||
#define CFG_BR3_PRELIM 0xFA400001 /* BCSR */
|
||||
#define CFG_OR3_PRELIM 0xFFFF8910
|
||||
#define CFG_BR4_PRELIM 0xFA000401 /* NVRAM&SRAM */
|
||||
#define CFG_OR4_PRELIM 0xFFFE0970
|
||||
|
||||
/*
|
||||
* Memory Periodic Timer Prescaler
|
||||
*/
|
||||
|
||||
/* periodic timer for refresh */
|
||||
#define CFG_MAMR_PTA 20
|
||||
|
||||
/*
|
||||
* Refresh clock Prescalar
|
||||
*/
|
||||
#define CFG_MPTPR MPTPR_PTP_DIV2
|
||||
|
||||
/*
|
||||
* MAMR settings for SDRAM
|
||||
*/
|
||||
|
||||
/* 10 column SDRAM */
|
||||
#define CFG_MAMR_10COL ((CFG_MAMR_PTA << MAMR_PTA_SHIFT) | MAMR_PTAE | \
|
||||
MAMR_AMA_TYPE_1 | MAMR_DSA_1_CYCL | MAMR_G0CLA_A10 | \
|
||||
MAMR_RLFA_16X | MAMR_WLFA_16X | MAMR_TLFA_16X)
|
||||
|
||||
/*
|
||||
* Internal Definitions
|
||||
*
|
||||
* Boot Flags
|
||||
*/
|
||||
#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */
|
||||
#define BOOTFLAG_WARM 0x02 /* Software reboot */
|
||||
|
||||
/*
|
||||
* BCSRx
|
||||
*
|
||||
* Board Status and Control Registers
|
||||
*
|
||||
*/
|
||||
|
||||
#define BCSR0 0xFA400000
|
||||
#define BCSR1 0xFA400001
|
||||
#define BCSR2 0xFA400002
|
||||
#define BCSR3 0xFA400003
|
||||
|
||||
#define BCSR0_ENMONXCVR 0x01 /* Monitor XVCR Control */
|
||||
#define BCSR0_ENNVRAM 0x02 /* CS4# Control */
|
||||
#define BCSR0_LED5 0x04 /* LED5 control 0='on' 1='off' */
|
||||
#define BCSR0_LED4 0x08 /* LED4 control 0='on' 1='off' */
|
||||
#define BCSR0_FULLDPLX 0x10 /* Ethernet XCVR Control */
|
||||
#define BCSR0_COLTEST 0x20
|
||||
#define BCSR0_ETHLPBK 0x40
|
||||
#define BCSR0_ETHEN 0x80
|
||||
|
||||
#define BCSR1_PCVCTL7 0x01 /* PC Slot B Control */
|
||||
#define BCSR1_PCVCTL6 0x02
|
||||
#define BCSR1_PCVCTL5 0x04
|
||||
#define BCSR1_PCVCTL4 0x08
|
||||
#define BCSR1_IPB5SEL 0x10
|
||||
|
||||
#define BCSR2_ENPA5HDR 0x08 /* USB Control */
|
||||
#define BCSR2_ENUSBCLK 0x10
|
||||
#define BCSR2_USBPWREN 0x20
|
||||
#define BCSR2_USBSPD 0x40
|
||||
#define BCSR2_USBSUSP 0x80
|
||||
|
||||
#define BCSR3_BWRTC 0x01 /* Real Time Clock Battery */
|
||||
#define BCSR3_BWNVR 0x02 /* NVRAM Battery */
|
||||
#define BCSR3_RDY_BSY 0x04 /* Flash Operation */
|
||||
#define BCSR3_RPXL 0x08 /* Reserved (reads back '1') */
|
||||
#define BCSR3_D27 0x10 /* Dip Switch settings */
|
||||
#define BCSR3_D26 0x20
|
||||
#define BCSR3_D25 0x40
|
||||
#define BCSR3_D24 0x80
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
@@ -36,7 +36,7 @@
|
||||
#define CONFIG_X86 1 /* This is a X86 CPU */
|
||||
#define CONFIG_SC520 1 /* Include support for AMD SC520 */
|
||||
|
||||
#define CFG_SDRAM_PRECHARGE_DELAY 6 /* 6T */
|
||||
#define CFG_SDRAM_PRECHARGE_DELAY 6 /* 6T */
|
||||
#define CFG_SDRAM_REFRESH_RATE 78 /* 7.8uS (choices are 7.8, 15.6, 31.2 or 62.5uS) */
|
||||
#define CFG_SDRAM_RAS_CAS_DELAY 3 /* 3T */
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
|
||||
#define CONFIG_BOOTDELAY 15
|
||||
#define CONFIG_BOOTARGS "root=/dev/mtdblock1 console=ttyS0,9600 mtdparts=phys:7936k(root),256k(uboot) "
|
||||
#define CONFIG_BOOTCOMMAND "setenv bootargs root=/dev/nfs ip=autoconf console=ttyS0,9600 mtdparts=phys:7808k(root),128k(env),256k(uboot); bootp; bootm"
|
||||
#define CONFIG_BOOTCOMMAND "setenv bootargs root=/dev/nfs ip=autoconf console=ttyS0,9600 mtdparts=phys:7808k(root),128k(env),256k(uboot); bootp; bootm"
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
|
||||
#define CONFIG_KGDB_BAUDRATE 115200 /* speed to run kgdb serial port */
|
||||
@@ -123,7 +123,7 @@
|
||||
#define CONFIG_SPI_EEPROM /* SPI EEPROMs such as AT25010 or AT25640 */
|
||||
#define CONFIG_MW_EEPROM /* MicroWire EEPROMS such as AT93LC46 */
|
||||
#define CONFIG_DS1722 /* Dallas DS1722 SPI Temperature probe */
|
||||
|
||||
|
||||
|
||||
/* allow to overwrite serial and ethaddr */
|
||||
#define CONFIG_ENV_OVERWRITE
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
#if 0
|
||||
/* Environment in flash */
|
||||
#define CFG_ENV_IS_IN_FLASH 1
|
||||
#define CFG_ENV_IS_IN_FLASH 1
|
||||
# define CFG_ENV_ADDR (0x387a0000) /* Addr of Environment Sector */
|
||||
# define CFG_ENV_SIZE 0x20000 /* Total Size of Environment Sector (or 0x10000) */
|
||||
# define CFG_ENV_OFFSET 0
|
||||
@@ -143,7 +143,7 @@
|
||||
# define CONFIG_SPI
|
||||
# define CONFIG_SPI_X 1
|
||||
# define CFG_ENV_SIZE 0x2000 /* Total Size of Environment EEPROM */
|
||||
# define CFG_ENV_OFFSET 0x1c00
|
||||
# define CFG_ENV_OFFSET 0x1c00
|
||||
|
||||
#endif
|
||||
|
||||
@@ -155,6 +155,7 @@
|
||||
*/
|
||||
#define CONFIG_NET_MULTI /* Multi ethernet cards support */
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
|
||||
/************************************************************
|
||||
* IDE/ATA stuff
|
||||
@@ -204,8 +205,8 @@
|
||||
#define CONFIG_PCI_SCAN_SHOW
|
||||
|
||||
#define CFG_FIRST_PCI_IRQ 9
|
||||
#define CFG_SECOND_PCI_IRQ 10
|
||||
#define CFG_THIRD_PCI_IRQ 11
|
||||
#define CFG_SECOND_PCI_IRQ 10
|
||||
#define CFG_THIRD_PCI_IRQ 11
|
||||
#define CFG_FORTH_PCI_IRQ 12
|
||||
|
||||
|
||||
|
||||
@@ -125,6 +125,7 @@ protect on $(u-boot_startaddr) $(u-boot_endaddr)"
|
||||
#define CONFIG_PCI_SCAN_SHOW
|
||||
#define CONFIG_NET_MULTI
|
||||
#define CONFIG_EEPRO100
|
||||
#define CFG_RX_ETH_BUFFER 8 /* use 8 rx buffer on eepro100 */
|
||||
#define CONFIG_EEPRO100_SROM_WRITE
|
||||
|
||||
#define PCI_ENET0_IOADDR 0xF0000000
|
||||
|
||||
208
include/fat.h
Normal file
208
include/fat.h
Normal file
@@ -0,0 +1,208 @@
|
||||
/*
|
||||
* R/O (V)FAT 12/16/32 filesystem implementation by Marcus Sundberg
|
||||
*
|
||||
* 2002-07-28 - rjones@nexus-tech.net - ported to ppcboot v1.1.6
|
||||
* 2003-03-10 - kharris@nexus-tech.net - ported to u-boot
|
||||
*
|
||||
* 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 _FAT_H_
|
||||
#define _FAT_H_
|
||||
|
||||
#define CONFIG_SUPPORT_VFAT
|
||||
|
||||
#define SECTOR_SIZE FS_BLOCK_SIZE
|
||||
|
||||
#define FS_BLOCK_SIZE 512
|
||||
|
||||
#if FS_BLOCK_SIZE != SECTOR_SIZE
|
||||
#error FS_BLOCK_SIZE != SECTOR_SIZE - This code needs to be fixed!
|
||||
#endif
|
||||
|
||||
#define MAX_CLUSTSIZE 65536
|
||||
#define DIRENTSPERBLOCK (FS_BLOCK_SIZE/sizeof(dir_entry))
|
||||
#define DIRENTSPERCLUST ((mydata->clust_size*SECTOR_SIZE)/sizeof(dir_entry))
|
||||
|
||||
#define FATBUFBLOCKS 6
|
||||
#define FATBUFSIZE (FS_BLOCK_SIZE*FATBUFBLOCKS)
|
||||
#define FAT12BUFSIZE ((FATBUFSIZE*3)/2)
|
||||
#define FAT16BUFSIZE (FATBUFSIZE/2)
|
||||
#define FAT32BUFSIZE (FATBUFSIZE/4)
|
||||
|
||||
|
||||
/* Filesystem identifiers */
|
||||
#define FAT12_SIGN "FAT12 "
|
||||
#define FAT16_SIGN "FAT16 "
|
||||
#define FAT32_SIGN "FAT32 "
|
||||
#define SIGNLEN 8
|
||||
|
||||
/* File attributes */
|
||||
#define ATTR_RO 1
|
||||
#define ATTR_HIDDEN 2
|
||||
#define ATTR_SYS 4
|
||||
#define ATTR_VOLUME 8
|
||||
#define ATTR_DIR 16
|
||||
#define ATTR_ARCH 32
|
||||
|
||||
#define ATTR_VFAT (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
|
||||
|
||||
#define DELETED_FLAG ((char)0xe5) /* Marks deleted files when in name[0] */
|
||||
#define aRING 0x05 /* Used to represent 'å' in name[0] */
|
||||
|
||||
|
||||
/* Flags telling whether we should read a file or list a directory */
|
||||
#define LS_NO 0
|
||||
#define LS_YES 1
|
||||
#define LS_DIR 1
|
||||
#define LS_ROOT 2
|
||||
|
||||
#ifdef DEBUG
|
||||
#define FAT_DPRINT(args...) printf(args)
|
||||
#else
|
||||
#define FAT_DPRINT(args...)
|
||||
#endif
|
||||
#define FAT_ERROR(arg) printf(arg)
|
||||
|
||||
#define ISDIRDELIM(c) ((c) == '/' || (c) == '\\')
|
||||
|
||||
#define FSTYPE_NONE (-1)
|
||||
|
||||
#if defined(__linux__) && defined(__KERNEL__)
|
||||
#define FAT2CPU16 le16_to_cpu
|
||||
#define FAT2CPU32 le32_to_cpu
|
||||
#else
|
||||
#if 1
|
||||
#define FAT2CPU16(x) (x)
|
||||
#define FAT2CPU32(x) (x)
|
||||
#else
|
||||
#define FAT2CPU16(x) ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8))
|
||||
#define FAT2CPU32(x) ((((x) & 0x000000ff) << 24) | \
|
||||
(((x) & 0x0000ff00) << 8) | \
|
||||
(((x) & 0x00ff0000) >> 8) | \
|
||||
(((x) & 0xff000000) >> 24))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define TOLOWER(c) if((c) >= 'A' && (c) <= 'Z'){(c)+=('a' - 'A');}
|
||||
#define START(dent) (FAT2CPU16((dent)->start) \
|
||||
+ (mydata->fatsize != 32 ? 0 : \
|
||||
(FAT2CPU16((dent)->starthi) << 16)))
|
||||
|
||||
|
||||
typedef struct boot_sector {
|
||||
__u8 ignored[3]; /* Bootstrap code */
|
||||
char system_id[8]; /* Name of fs */
|
||||
__u8 sector_size[2]; /* Bytes/sector */
|
||||
__u8 cluster_size; /* Sectors/cluster */
|
||||
__u16 reserved; /* Number of reserved sectors */
|
||||
__u8 fats; /* Number of FATs */
|
||||
__u8 dir_entries[2]; /* Number of root directory entries */
|
||||
__u8 sectors[2]; /* Number of sectors */
|
||||
__u8 media; /* Media code */
|
||||
__u16 fat_length; /* Sectors/FAT */
|
||||
__u16 secs_track; /* Sectors/track */
|
||||
__u16 heads; /* Number of heads */
|
||||
__u32 hidden; /* Number of hidden sectors */
|
||||
__u32 total_sect; /* Number of sectors (if sectors == 0) */
|
||||
|
||||
/* FAT32 only */
|
||||
__u32 fat32_length; /* Sectors/FAT */
|
||||
__u16 flags; /* Bit 8: fat mirroring, low 4: active fat */
|
||||
__u8 version[2]; /* Filesystem version */
|
||||
__u32 root_cluster; /* First cluster in root directory */
|
||||
__u16 info_sector; /* Filesystem info sector */
|
||||
__u16 backup_boot; /* Backup boot sector */
|
||||
__u16 reserved2[6]; /* Unused */
|
||||
} boot_sector;
|
||||
|
||||
typedef struct volume_info
|
||||
{
|
||||
__u8 drive_number; /* BIOS drive number */
|
||||
__u8 reserved; /* Unused */
|
||||
__u8 ext_boot_sign; /* 0x29 if fields below exist (DOS 3.3+) */
|
||||
__u8 volume_id[4]; /* Volume ID number */
|
||||
char volume_label[11]; /* Volume label */
|
||||
char fs_type[8]; /* Typically FAT12, FAT16, or FAT32 */
|
||||
/* Boot code comes next, all but 2 bytes to fill up sector */
|
||||
/* Boot sign comes last, 2 bytes */
|
||||
} volume_info;
|
||||
|
||||
typedef struct dir_entry {
|
||||
char name[8],ext[3]; /* Name and extension */
|
||||
__u8 attr; /* Attribute bits */
|
||||
__u8 lcase; /* Case for base and extension */
|
||||
__u8 ctime_ms; /* Creation time, milliseconds */
|
||||
__u16 ctime; /* Creation time */
|
||||
__u16 cdate; /* Creation date */
|
||||
__u16 adate; /* Last access date */
|
||||
__u16 starthi; /* High 16 bits of cluster in FAT32 */
|
||||
__u16 time,date,start;/* Time, date and first cluster */
|
||||
__u32 size; /* File size in bytes */
|
||||
} dir_entry;
|
||||
|
||||
typedef struct dir_slot {
|
||||
__u8 id; /* Sequence number for slot */
|
||||
__u8 name0_4[10]; /* First 5 characters in name */
|
||||
__u8 attr; /* Attribute byte */
|
||||
__u8 reserved; /* Unused */
|
||||
__u8 alias_checksum;/* Checksum for 8.3 alias */
|
||||
__u8 name5_10[12]; /* 6 more characters in name */
|
||||
__u16 start; /* Unused */
|
||||
__u8 name11_12[4]; /* Last 2 characters in name */
|
||||
} dir_slot;
|
||||
|
||||
/* Private filesystem parameters */
|
||||
typedef struct {
|
||||
int fatsize; /* Size of FAT in bits */
|
||||
__u16 fatlength; /* Length of FAT in sectors */
|
||||
__u16 fat_sect; /* Starting sector of the FAT */
|
||||
__u16 rootdir_sect; /* Start sector of root directory */
|
||||
__u16 clust_size; /* Size of clusters in sectors */
|
||||
__u16 data_begin; /* The sector of the first cluster */
|
||||
__u8 fatbuf[FATBUFSIZE]; /* Current FAT buffer */
|
||||
int fatbufnum; /* Used by get_fatent, init to -1 */
|
||||
} fsdata;
|
||||
|
||||
typedef int (file_detectfs_func)(void);
|
||||
typedef int (file_ls_func)(const char *dir);
|
||||
typedef long (file_read_func)(const char *filename, void *buffer,
|
||||
unsigned long maxsize);
|
||||
|
||||
struct filesystem {
|
||||
file_detectfs_func *detect;
|
||||
file_ls_func *ls;
|
||||
file_read_func *read;
|
||||
const char name[12];
|
||||
};
|
||||
|
||||
/* FAT tables */
|
||||
file_detectfs_func file_fat_detectfs;
|
||||
file_ls_func file_fat_ls;
|
||||
file_read_func file_fat_read;
|
||||
|
||||
/* Currently this doesn't check if the dir exists or is valid... */
|
||||
int file_cd(const char *path);
|
||||
int file_fat_detectfs(void);
|
||||
int file_fat_ls(const char *dir);
|
||||
long file_fat_read(const char *filename, void *buffer, unsigned long maxsize);
|
||||
const char *file_getfsname(int idx);
|
||||
|
||||
#endif /* _FAT_H_ */
|
||||
@@ -158,6 +158,10 @@ extern int flash_real_protect(flash_info_t *info, long sector, int prot);
|
||||
#define AMD_ID_DL324B 0x225F225F /* 29DL324B ID (32 M, bottom boot sect) */
|
||||
|
||||
#define AMD_ID_DL640 0x227E227E /* 29DL640D ID (64 M, dual boot sectors)*/
|
||||
#define AMD_ID_MIRROR 0x227E227E /* 1st ID word for MirrorBit family */
|
||||
#define AMD_ID_LV128U_2 0x22122212 /* 2d ID word for AM29LV128M at 0x38 */
|
||||
#define AMD_ID_LV128U_3 0x22002200 /* 3d ID word for AM29LV128M at 0x3c */
|
||||
|
||||
#define AMD_ID_LV640U 0x22D722D7 /* 29LV640U ID (64 M, uniform sectors) */
|
||||
|
||||
#define ATM_ID_BV1614 0x000000C0 /* 49BV1614 ID */
|
||||
@@ -302,6 +306,7 @@ extern int flash_real_protect(flash_info_t *info, long sector, int prot);
|
||||
#define FLASH_28F320C3B 0x009F /* Intel 28F320C3B ( 32M = 2M x 16 ) */
|
||||
#define FLASH_28F640C3T 0x00A0 /* Intel 28F640C3T ( 64M = 4M x 16 ) */
|
||||
#define FLASH_28F640C3B 0x00A1 /* Intel 28F640C3B ( 64M = 4M x 16 ) */
|
||||
#define FLASH_AMLV128U 0x00A2 /* AMD 29LV128M ( 128M = 8M x 16 ) */
|
||||
|
||||
#define FLASH_UNKNOWN 0xFFFF /* unknown flash type */
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* (C) Copyright 2000
|
||||
* (C) Copyright 2000-2003
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
@@ -21,20 +21,13 @@
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _MMC_H_
|
||||
#define _MMC_H_
|
||||
#include <asm/arch/mmc.h>
|
||||
|
||||
#ifndef __ARP_H__
|
||||
#define __ARP_H__
|
||||
|
||||
/**********************************************************************/
|
||||
/*
|
||||
* Global functions and variables.
|
||||
*/
|
||||
|
||||
extern int ArpTry;
|
||||
|
||||
extern void ArpRequest (void); /* Send a ARP request */
|
||||
|
||||
/**********************************************************************/
|
||||
|
||||
#endif /* __ARP_H__ */
|
||||
int mmc_init(int verbose);
|
||||
int mmc_read(ulong src, uchar *dst, int size);
|
||||
int mmc_write(uchar *src, ulong dst, int size);
|
||||
int mmc2info(ulong addr);
|
||||
|
||||
#endif /* _MMC_H_ */
|
||||
@@ -12,12 +12,14 @@
|
||||
#ifndef __NET_H__
|
||||
#define __NET_H__
|
||||
|
||||
#if !defined(CONFIG_NET_MULTI) && defined(CONFIG_8xx)
|
||||
#if defined(CONFIG_8xx)
|
||||
#include <commproc.h>
|
||||
#if defined(FEC_ENET) || defined(SCC_ENET)
|
||||
#define CONFIG_NET_MULTI
|
||||
#endif
|
||||
#endif
|
||||
# if !defined(CONFIG_NET_MULTI)
|
||||
# if defined(FEC_ENET) || defined(SCC_ENET)
|
||||
# define CONFIG_NET_MULTI
|
||||
# endif
|
||||
# endif
|
||||
#endif /* CONFIG_8xx */
|
||||
|
||||
#if !defined(CONFIG_NET_MULTI) && defined(CONFIG_8260)
|
||||
#include <config.h>
|
||||
@@ -51,10 +53,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_EEPRO100
|
||||
#define PKTBUFSRX 4
|
||||
#ifdef CFG_RX_ETH_BUFFER
|
||||
# define PKTBUFSRX CFG_RX_ETH_BUFFER
|
||||
#else
|
||||
#define PKTBUFSRX 8
|
||||
# define PKTBUFSRX 4
|
||||
#endif
|
||||
|
||||
#define PKTALIGN 32
|
||||
@@ -75,8 +77,6 @@ typedef void rxhand_f(uchar *, unsigned, unsigned, unsigned);
|
||||
*/
|
||||
typedef void thand_f(void);
|
||||
|
||||
#ifdef CONFIG_NET_MULTI
|
||||
|
||||
#define NAMESIZE 16
|
||||
|
||||
enum eth_state_t {
|
||||
@@ -105,7 +105,6 @@ extern int eth_register(struct eth_device* dev);/* Register network device */
|
||||
extern void eth_try_another(int first_restart); /* Change the device */
|
||||
extern struct eth_device *eth_get_dev(void); /* get the current device MAC */
|
||||
extern void eth_set_enetaddr(int num, char* a); /* Set new MAC address */
|
||||
#endif
|
||||
|
||||
extern int eth_init(bd_t *bis); /* Initialize the device */
|
||||
extern int eth_send(volatile void *packet, int length); /* Send a packet */
|
||||
@@ -203,7 +202,9 @@ typedef struct
|
||||
/*
|
||||
* ICMP stuff (just enough to handle (host) redirect messages)
|
||||
*/
|
||||
#define ICMP_ECHO_REPLY 0 /* Echo reply */
|
||||
#define ICMP_REDIRECT 5 /* Redirect (change route) */
|
||||
#define ICMP_ECHO_REQUEST 8 /* Echo request */
|
||||
|
||||
/* Codes for REDIRECT. */
|
||||
#define ICMP_REDIR_NET 0 /* Redirect Net */
|
||||
@@ -295,11 +296,15 @@ extern int NetState; /* Network loop state */
|
||||
extern int NetRestartWrap; /* Tried all network devices */
|
||||
#endif
|
||||
|
||||
typedef enum { BOOTP, RARP, ARP, TFTP, DHCP } proto_t;
|
||||
typedef enum { BOOTP, RARP, ARP, TFTP, DHCP, PING, DNS } proto_t;
|
||||
|
||||
/* from net/net.c */
|
||||
extern char BootFile[128]; /* Boot File name */
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
extern IPaddr_t NetPingIP; /* the ip address to ping */
|
||||
#endif
|
||||
|
||||
/* Initialize the network adapter */
|
||||
extern int NetLoop(proto_t);
|
||||
|
||||
@@ -326,6 +331,9 @@ extern void NetSetTimeout(int, thand_f *); /* Set timeout handler */
|
||||
/* Transmit "NetTxPacket" */
|
||||
extern void NetSendPacket(volatile uchar *, int);
|
||||
|
||||
/* Transmit UDP packet, performing ARP request if needed */
|
||||
extern int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len);
|
||||
|
||||
/* Processes a received packet */
|
||||
extern void NetReceive(volatile uchar *, int);
|
||||
|
||||
@@ -376,6 +384,9 @@ static inline void NetCopyLong(ulong *to, ulong *from)
|
||||
/* Convert an IP address to a string */
|
||||
extern void ip_to_string (IPaddr_t x, char *s);
|
||||
|
||||
/* Convert a string to ip address */
|
||||
extern IPaddr_t string_to_ip(char *s);
|
||||
|
||||
/* read an IP address from a environment variable */
|
||||
extern IPaddr_t getenv_IPaddr (char *);
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = libnet.a
|
||||
|
||||
OBJS = net.o tftp.o bootp.o rarp.o arp.o eth.o
|
||||
OBJS = net.o tftp.o bootp.o rarp.o eth.o
|
||||
all: $(LIB)
|
||||
|
||||
$(LIB): $(START) $(OBJS)
|
||||
|
||||
120
net/arp.c
120
net/arp.c
@@ -1,120 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2000
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <net.h>
|
||||
#include "bootp.h"
|
||||
#include "tftp.h"
|
||||
#include "arp.h"
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_NET)
|
||||
|
||||
#define TIMEOUT 5 /* Seconds before trying ARP again */
|
||||
#ifndef CONFIG_NET_RETRY_COUNT
|
||||
# define TIMEOUT_COUNT 5 /* # of timeouts before giving up */
|
||||
#else
|
||||
# define TIMEOUT_COUNT (CONFIG_NET_RETRY_COUNT)
|
||||
#endif
|
||||
|
||||
static void ArpHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len);
|
||||
static void ArpTimeout(void);
|
||||
|
||||
int ArpTry = 0;
|
||||
|
||||
/*
|
||||
* Handle a ARP received packet.
|
||||
*/
|
||||
static void
|
||||
ArpHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len)
|
||||
{
|
||||
/* Check if the frame is really an ARP reply */
|
||||
if (memcmp (NetServerEther, NetBcastAddr, 6) != 0) {
|
||||
#ifdef DEBUG
|
||||
printf("Got good ARP - start TFTP\n");
|
||||
#endif
|
||||
TftpStart ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Timeout on ARP request.
|
||||
*/
|
||||
static void
|
||||
ArpTimeout(void)
|
||||
{
|
||||
if (ArpTry >= TIMEOUT_COUNT) {
|
||||
puts ("\nRetry count exceeded; starting again\n");
|
||||
NetStartAgain ();
|
||||
} else {
|
||||
NetSetTimeout (TIMEOUT * CFG_HZ, ArpTimeout);
|
||||
ArpRequest ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ArpRequest (void)
|
||||
{
|
||||
int i;
|
||||
volatile uchar *pkt;
|
||||
ARP_t * arp;
|
||||
|
||||
printf("ARP broadcast %d\n", ++ArpTry);
|
||||
pkt = NetTxPacket;
|
||||
|
||||
NetSetEther(pkt, NetBcastAddr, PROT_ARP);
|
||||
pkt += ETHER_HDR_SIZE;
|
||||
|
||||
arp = (ARP_t *)pkt;
|
||||
|
||||
arp->ar_hrd = htons(ARP_ETHER);
|
||||
arp->ar_pro = htons(PROT_IP);
|
||||
arp->ar_hln = 6;
|
||||
arp->ar_pln = 4;
|
||||
arp->ar_op = htons(ARPOP_REQUEST);
|
||||
|
||||
memcpy (&arp->ar_data[0], NetOurEther, 6); /* source ET addr */
|
||||
NetWriteIP((uchar*)&arp->ar_data[6], NetOurIP); /* source IP addr */
|
||||
for (i=10; i<16; ++i) {
|
||||
arp->ar_data[i] = 0; /* dest ET addr = 0 */
|
||||
}
|
||||
|
||||
if((NetServerIP & NetOurSubnetMask) != (NetOurIP & NetOurSubnetMask)) {
|
||||
if (NetOurGatewayIP == 0) {
|
||||
puts ("## Warning: gatewayip needed but not set\n");
|
||||
}
|
||||
NetWriteIP((uchar*)&arp->ar_data[16], NetOurGatewayIP);
|
||||
} else {
|
||||
NetWriteIP((uchar*)&arp->ar_data[16], NetServerIP);
|
||||
}
|
||||
|
||||
|
||||
NetSendPacket(NetTxPacket, ETHER_HDR_SIZE + ARP_HDR_SIZE);
|
||||
|
||||
NetSetTimeout(TIMEOUT * CFG_HZ, ArpTimeout);
|
||||
NetSetHandler(ArpHandler);
|
||||
}
|
||||
|
||||
#endif /* CFG_CMD_NET */
|
||||
11
net/bootp.c
11
net/bootp.c
@@ -24,7 +24,6 @@
|
||||
#include <net.h>
|
||||
#include "bootp.h"
|
||||
#include "tftp.h"
|
||||
#include "arp.h"
|
||||
#ifdef CONFIG_STATUS_LED
|
||||
#include <status_led.h>
|
||||
#endif
|
||||
@@ -336,10 +335,7 @@ BootpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Send ARP request to get TFTP server ethernet address.
|
||||
* This automagically starts TFTP, too.
|
||||
*/
|
||||
ArpRequest();
|
||||
TftpStart();
|
||||
}
|
||||
#endif /* !CFG_CMD_DHCP */
|
||||
|
||||
@@ -866,10 +862,7 @@ DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
||||
NetState = NETLOOP_SUCCESS;
|
||||
return;
|
||||
}
|
||||
/* Send ARP request to get TFTP server ethernet address.
|
||||
* This automagically starts TFTP, too.
|
||||
*/
|
||||
ArpRequest();
|
||||
TftpStart();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -41,6 +41,7 @@ extern int pcnet_initialize(bd_t*);
|
||||
extern int fec_initialize(bd_t*);
|
||||
extern int scc_initialize(bd_t*);
|
||||
extern int inca_switch_initialize(bd_t*);
|
||||
extern int ppc_4xx_eth_initialize(bd_t *);
|
||||
extern int plb2800_eth_initialize(bd_t*);
|
||||
|
||||
static struct eth_device *eth_devices, *eth_current;
|
||||
@@ -98,6 +99,9 @@ int eth_initialize(bd_t *bis)
|
||||
eth_devices = NULL;
|
||||
eth_current = NULL;
|
||||
|
||||
#if defined(CONFIG_405GP) || defined(CONFIG_440) || defined(CONFIG_405EP)
|
||||
ppc_4xx_eth_initialize(bis);
|
||||
#endif
|
||||
#ifdef CONFIG_INCA_IP_SWITCH
|
||||
inca_switch_initialize(bis);
|
||||
#endif
|
||||
|
||||
368
net/net.c
368
net/net.c
@@ -65,10 +65,16 @@
|
||||
#include "bootp.h"
|
||||
#include "tftp.h"
|
||||
#include "rarp.h"
|
||||
#include "arp.h"
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_NET)
|
||||
|
||||
#define ARP_TIMEOUT 5 /* Seconds before trying ARP again */
|
||||
#ifndef CONFIG_NET_RETRY_COUNT
|
||||
# define ARP_TIMEOUT_COUNT 5 /* # of timeouts before giving up */
|
||||
#else
|
||||
# define ARP_TIMEOUT_COUNT (CONFIG_NET_RETRY_COUNT)
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#define ET_DEBUG
|
||||
#endif
|
||||
@@ -88,7 +94,7 @@ ushort NetBootFileSize=0; /* Our bootfile size in blocks */
|
||||
ulong NetBootFileXferSize; /* The actual transferred size of the bootfile (in bytes) */
|
||||
uchar NetOurEther[6]; /* Our ethernet address */
|
||||
uchar NetServerEther[6] = /* Boot server enet address */
|
||||
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
{ 0, 0, 0, 0, 0, 0 };
|
||||
IPaddr_t NetOurIP; /* Our IP addr (0 = unknown) */
|
||||
IPaddr_t NetServerIP; /* Our IP addr (0 = unknown) */
|
||||
volatile uchar *NetRxPkt; /* Current receive packet */
|
||||
@@ -96,6 +102,8 @@ int NetRxPktLen; /* Current rx packet length */
|
||||
unsigned NetIPID; /* IP packet ID */
|
||||
uchar NetBcastAddr[6] = /* Ethernet bcast address */
|
||||
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
uchar NetEtherNullAddr[6] =
|
||||
{ 0, 0, 0, 0, 0, 0 };
|
||||
int NetState; /* Network loop state */
|
||||
#ifdef CONFIG_NET_MULTI
|
||||
int NetRestartWrap = 0; /* Tried all network devices */
|
||||
@@ -105,6 +113,12 @@ static int NetDevExists = 0; /* At least one device configured */
|
||||
|
||||
char BootFile[128]; /* Boot File name */
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
IPaddr_t NetPingIP; /* the ip address to ping */
|
||||
|
||||
static void PingStart(void);
|
||||
#endif
|
||||
|
||||
volatile uchar PktBuf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN];
|
||||
|
||||
volatile uchar *NetRxPackets[PKTBUFSRX]; /* Receive packets */
|
||||
@@ -116,6 +130,81 @@ volatile uchar *NetTxPacket = 0; /* THE transmit packet */
|
||||
|
||||
static int net_check_prereq (proto_t protocol);
|
||||
|
||||
/**********************************************************************/
|
||||
|
||||
IPaddr_t NetArpWaitPacketIP;
|
||||
IPaddr_t NetArpWaitReplyIP;
|
||||
uchar *NetArpWaitPacketMAC; /* MAC address of waiting packet's destination */
|
||||
uchar *NetArpWaitTxPacket; /* THE transmit packet */
|
||||
int NetArpWaitTxPacketSize;
|
||||
uchar NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN];
|
||||
ulong NetArpWaitTimerStart;
|
||||
int NetArpWaitTry;
|
||||
|
||||
void ArpRequest(void)
|
||||
{
|
||||
int i;
|
||||
volatile uchar *pkt;
|
||||
ARP_t * arp;
|
||||
|
||||
#ifdef ET_DEBUG
|
||||
printf("ARP broadcast %d\n", NetArpWaitTry);
|
||||
#endif
|
||||
pkt = NetTxPacket;
|
||||
|
||||
NetSetEther(pkt, NetBcastAddr, PROT_ARP);
|
||||
pkt += ETHER_HDR_SIZE;
|
||||
|
||||
arp = (ARP_t *)pkt;
|
||||
|
||||
arp->ar_hrd = htons(ARP_ETHER);
|
||||
arp->ar_pro = htons(PROT_IP);
|
||||
arp->ar_hln = 6;
|
||||
arp->ar_pln = 4;
|
||||
arp->ar_op = htons(ARPOP_REQUEST);
|
||||
|
||||
memcpy (&arp->ar_data[0], NetOurEther, 6); /* source ET addr */
|
||||
NetWriteIP((uchar*)&arp->ar_data[6], NetOurIP); /* source IP addr */
|
||||
for (i=10; i<16; ++i) {
|
||||
arp->ar_data[i] = 0; /* dest ET addr = 0 */
|
||||
}
|
||||
|
||||
if((NetArpWaitPacketIP & NetOurSubnetMask) != (NetOurIP & NetOurSubnetMask)) {
|
||||
if (NetOurGatewayIP == 0) {
|
||||
puts ("## Warning: gatewayip needed but not set\n");
|
||||
}
|
||||
NetArpWaitReplyIP = NetOurGatewayIP;
|
||||
} else
|
||||
NetArpWaitReplyIP = NetArpWaitPacketIP;
|
||||
|
||||
NetWriteIP((uchar*)&arp->ar_data[16], NetArpWaitReplyIP);
|
||||
(void) eth_send(NetTxPacket, ETHER_HDR_SIZE + ARP_HDR_SIZE);
|
||||
}
|
||||
|
||||
void ArpTimeoutCheck(void)
|
||||
{
|
||||
ulong t;
|
||||
|
||||
if (!NetArpWaitPacketIP)
|
||||
return;
|
||||
|
||||
t = get_timer(0);
|
||||
|
||||
/* check for arp timeout */
|
||||
if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT * CFG_HZ) {
|
||||
NetArpWaitTry++;
|
||||
|
||||
if (NetArpWaitTry >= ARP_TIMEOUT_COUNT) {
|
||||
puts ("\nARP Retry count exceeded; starting again\n");
|
||||
NetArpWaitTry = 0;
|
||||
NetStartAgain();
|
||||
} else {
|
||||
NetArpWaitTimerStart = t;
|
||||
ArpRequest();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
/*
|
||||
* Main network processing loop.
|
||||
@@ -133,6 +222,14 @@ NetLoop(proto_t protocol)
|
||||
NetDevExists = 0;
|
||||
#endif
|
||||
|
||||
/* XXX problem with bss workaround */
|
||||
NetArpWaitPacketMAC = NULL;
|
||||
NetArpWaitTxPacket = NULL;
|
||||
NetArpWaitPacketIP = 0;
|
||||
NetArpWaitReplyIP = 0;
|
||||
NetArpWaitTxPacket = NULL;
|
||||
NetTxPacket = NULL;
|
||||
|
||||
if (!NetTxPacket) {
|
||||
int i;
|
||||
|
||||
@@ -144,6 +241,13 @@ NetLoop(proto_t protocol)
|
||||
for (i = 0; i < PKTBUFSRX; i++) {
|
||||
NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!NetArpWaitTxPacket) {
|
||||
NetArpWaitTxPacket = &NetArpWaitPacketBuf[0] + (PKTALIGN - 1);
|
||||
NetArpWaitTxPacket -= (ulong)NetArpWaitTxPacket % PKTALIGN;
|
||||
NetArpWaitTxPacketSize = 0;
|
||||
}
|
||||
|
||||
eth_halt();
|
||||
@@ -165,11 +269,27 @@ restart:
|
||||
*/
|
||||
|
||||
switch (protocol) {
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
case PING:
|
||||
#endif
|
||||
case TFTP:
|
||||
NetCopyIP(&NetOurIP, &bd->bi_ip_addr);
|
||||
NetServerIP = getenv_IPaddr ("serverip");
|
||||
NetOurGatewayIP = getenv_IPaddr ("gatewayip");
|
||||
NetOurSubnetMask= getenv_IPaddr ("netmask");
|
||||
|
||||
switch (protocol) {
|
||||
case TFTP:
|
||||
NetServerIP = getenv_IPaddr ("serverip");
|
||||
break;
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
case PING:
|
||||
/* nothing */
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case BOOTP:
|
||||
case RARP:
|
||||
@@ -202,8 +322,7 @@ restart:
|
||||
switch (protocol) {
|
||||
case TFTP:
|
||||
/* always use ARP to get server ethernet address */
|
||||
ArpTry = 0;
|
||||
ArpRequest ();
|
||||
TftpStart();
|
||||
break;
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
|
||||
@@ -224,6 +343,11 @@ restart:
|
||||
RarpTry = 0;
|
||||
RarpRequest ();
|
||||
break;
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
case PING:
|
||||
PingStart();
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -260,6 +384,7 @@ restart:
|
||||
return (-1);
|
||||
}
|
||||
|
||||
ArpTimeoutCheck();
|
||||
|
||||
/*
|
||||
* Check for a timeout, and run the timeout handler
|
||||
@@ -376,7 +501,138 @@ NetSendPacket(volatile uchar * pkt, int len)
|
||||
(void) eth_send(pkt, len);
|
||||
}
|
||||
|
||||
int
|
||||
NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len)
|
||||
{
|
||||
/* convert to new style broadcast */
|
||||
if (dest == 0)
|
||||
dest = 0xFFFFFFFF;
|
||||
|
||||
/* if broadcast, make the ether address a broadcast and don't do ARP */
|
||||
if (dest == 0xFFFFFFFF)
|
||||
ether = NetBcastAddr;
|
||||
|
||||
/* if MAC address was not discovered yet, save the packet and do an ARP request */
|
||||
if (memcmp(ether, NetEtherNullAddr, 6) == 0) {
|
||||
|
||||
#ifdef ET_DEBUG
|
||||
printf("sending ARP for %08lx\n", dest);
|
||||
#endif
|
||||
|
||||
NetArpWaitPacketIP = dest;
|
||||
NetArpWaitPacketMAC = ether;
|
||||
NetSetEther (NetArpWaitTxPacket, NetArpWaitPacketMAC, PROT_IP);
|
||||
NetSetIP (NetArpWaitTxPacket + ETHER_HDR_SIZE, dest, dport, sport, len);
|
||||
memcpy(NetArpWaitTxPacket + ETHER_HDR_SIZE + IP_HDR_SIZE,
|
||||
(uchar *)NetTxPacket + ETHER_HDR_SIZE + IP_HDR_SIZE, len);
|
||||
|
||||
/* size of the waiting packet */
|
||||
NetArpWaitTxPacketSize = ETHER_HDR_SIZE + IP_HDR_SIZE + len;
|
||||
|
||||
/* and do the ARP request */
|
||||
NetArpWaitTry = 1;
|
||||
NetArpWaitTimerStart = get_timer(0);
|
||||
ArpRequest();
|
||||
return 1; /* waiting */
|
||||
}
|
||||
|
||||
#ifdef ET_DEBUG
|
||||
printf("sending UDP to %08lx/%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
dest, ether[0], ether[1], ether[2], ether[3], ether[4], ether[5]);
|
||||
#endif
|
||||
|
||||
NetSetEther (NetTxPacket, ether, PROT_IP);
|
||||
NetSetIP (NetTxPacket + ETHER_HDR_SIZE, dest, dport, sport, len);
|
||||
(void) eth_send(NetTxPacket, ETHER_HDR_SIZE + IP_HDR_SIZE + len);
|
||||
|
||||
return 0; /* transmited */
|
||||
}
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
static ushort PingSeqNo;
|
||||
|
||||
int PingSend(void)
|
||||
{
|
||||
static uchar mac[6];
|
||||
volatile IP_t *ip;
|
||||
volatile ushort *s;
|
||||
|
||||
/* XXX always send arp request */
|
||||
|
||||
memcpy(mac, NetEtherNullAddr, 6);
|
||||
|
||||
#ifdef ET_DEBUG
|
||||
printf("sending ARP for %08lx\n", NetPingIP);
|
||||
#endif
|
||||
|
||||
NetArpWaitPacketIP = NetPingIP;
|
||||
NetArpWaitPacketMAC = mac;
|
||||
|
||||
NetSetEther(NetArpWaitTxPacket, mac, PROT_IP);
|
||||
|
||||
ip = (volatile IP_t *)(NetArpWaitTxPacket + ETHER_HDR_SIZE);
|
||||
|
||||
/*
|
||||
* Construct an IP and ICMP header. (need to set no fragment bit - XXX)
|
||||
*/
|
||||
ip->ip_hl_v = 0x45; /* IP_HDR_SIZE / 4 (not including UDP) */
|
||||
ip->ip_tos = 0;
|
||||
ip->ip_len = htons(IP_HDR_SIZE_NO_UDP + 8);
|
||||
ip->ip_id = htons(NetIPID++);
|
||||
ip->ip_off = htons(0x4000); /* No fragmentation */
|
||||
ip->ip_ttl = 255;
|
||||
ip->ip_p = 0x01; /* ICMP */
|
||||
ip->ip_sum = 0;
|
||||
NetCopyIP((void*)&ip->ip_src, &NetOurIP); /* already in network byte order */
|
||||
NetCopyIP((void*)&ip->ip_dst, &NetPingIP); /* - "" - */
|
||||
ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);
|
||||
|
||||
s = &ip->udp_src; /* XXX ICMP starts here */
|
||||
s[0] = htons(0x0800); /* echo-request, code */
|
||||
s[1] = 0; /* checksum */
|
||||
s[2] = 0; /* identifier */
|
||||
s[3] = htons(PingSeqNo++); /* sequence number */
|
||||
s[1] = ~NetCksum((uchar *)s, 8/2);
|
||||
|
||||
/* size of the waiting packet */
|
||||
NetArpWaitTxPacketSize = ETHER_HDR_SIZE + IP_HDR_SIZE_NO_UDP + 8;
|
||||
|
||||
/* and do the ARP request */
|
||||
NetArpWaitTry = 1;
|
||||
NetArpWaitTimerStart = get_timer(0);
|
||||
ArpRequest();
|
||||
return 1; /* waiting */
|
||||
}
|
||||
|
||||
static void
|
||||
PingTimeout (void)
|
||||
{
|
||||
eth_halt();
|
||||
NetState = NETLOOP_FAIL; /* we did not get the reply */
|
||||
}
|
||||
|
||||
static void
|
||||
PingHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
|
||||
{
|
||||
IPaddr_t tmp;
|
||||
volatile IP_t *ip = (volatile IP_t *)pkt;
|
||||
|
||||
tmp = NetReadIP((void *)&ip->ip_src);
|
||||
if (tmp != NetPingIP)
|
||||
return;
|
||||
|
||||
NetState = NETLOOP_SUCCESS;
|
||||
}
|
||||
|
||||
static void PingStart(void)
|
||||
{
|
||||
NetSetTimeout (10 * CFG_HZ, PingTimeout);
|
||||
NetSetHandler (PingHandler);
|
||||
|
||||
PingSend();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
NetReceive(volatile uchar * pkt, int len)
|
||||
@@ -387,7 +643,6 @@ NetReceive(volatile uchar * pkt, int len)
|
||||
IPaddr_t tmp;
|
||||
int x;
|
||||
|
||||
|
||||
NetRxPkt = pkt;
|
||||
NetRxPktLen = len;
|
||||
et = (Ethernet_t *)pkt;
|
||||
@@ -462,14 +717,40 @@ NetReceive(volatile uchar * pkt, int len)
|
||||
NetCopyIP(&arp->ar_data[16], &arp->ar_data[6]);
|
||||
memcpy (&arp->ar_data[ 0], NetOurEther, 6);
|
||||
NetCopyIP(&arp->ar_data[ 6], &NetOurIP);
|
||||
NetSendPacket((uchar *)et,((uchar *)arp-pkt)+ARP_HDR_SIZE);
|
||||
(void) eth_send((uchar *)et, ((uchar *)arp-pkt) + ARP_HDR_SIZE);
|
||||
return;
|
||||
case ARPOP_REPLY: /* set TFTP server eth addr */
|
||||
|
||||
case ARPOP_REPLY: /* arp reply */
|
||||
/* are we waiting for a reply */
|
||||
if (!NetArpWaitPacketIP || !NetArpWaitPacketMAC)
|
||||
break;
|
||||
#ifdef ET_DEBUG
|
||||
printf("Got ARP REPLY, set server/gtwy eth addr\n");
|
||||
printf("Got ARP REPLY, set server/gtwy eth addr (%02x:%02x:%02x:%02x:%02x:%02x)\n",
|
||||
arp->ar_data[0], arp->ar_data[1],
|
||||
arp->ar_data[2], arp->ar_data[3],
|
||||
arp->ar_data[4], arp->ar_data[5]);
|
||||
#endif
|
||||
memcpy (NetServerEther, &arp->ar_data[0], 6);
|
||||
(*packetHandler)(0,0,0,0); /* start TFTP */
|
||||
|
||||
tmp = NetReadIP(&arp->ar_data[6]);
|
||||
|
||||
/* matched waiting packet's address */
|
||||
if (tmp == NetArpWaitReplyIP) {
|
||||
#ifdef ET_DEBUG
|
||||
printf("Got it\n");
|
||||
#endif
|
||||
/* save address for later use */
|
||||
memcpy(NetArpWaitPacketMAC, &arp->ar_data[0], 6);
|
||||
|
||||
/* modify header, and transmit it */
|
||||
memcpy(((Ethernet_t *)NetArpWaitTxPacket)->et_dest, NetArpWaitPacketMAC, 6);
|
||||
(void) eth_send(NetArpWaitTxPacket, NetArpWaitTxPacketSize);
|
||||
|
||||
/* no arp request pending now */
|
||||
NetArpWaitPacketIP = 0;
|
||||
NetArpWaitTxPacketSize = 0;
|
||||
NetArpWaitPacketMAC = NULL;
|
||||
|
||||
}
|
||||
return;
|
||||
default:
|
||||
#ifdef ET_DEBUG
|
||||
@@ -553,13 +834,26 @@ NetReceive(volatile uchar * pkt, int len)
|
||||
if (ip->ip_p == IPPROTO_ICMP) {
|
||||
ICMP_t *icmph = (ICMP_t *)&(ip->udp_src);
|
||||
|
||||
if (icmph->type != ICMP_REDIRECT)
|
||||
return;
|
||||
switch (icmph->type) {
|
||||
case ICMP_REDIRECT:
|
||||
if (icmph->code != ICMP_REDIR_HOST)
|
||||
return;
|
||||
puts (" ICMP Host Redirect to ");
|
||||
print_IPaddr(icmph->un.gateway);
|
||||
putc(' ');
|
||||
break;
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
case ICMP_ECHO_REPLY:
|
||||
/*
|
||||
* IP header OK. Pass the packet to the current handler.
|
||||
*/
|
||||
/* XXX point to ip packet */
|
||||
(*packetHandler)((uchar *)ip, 0, 0, 0);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return;
|
||||
}
|
||||
} else if (ip->ip_p != IPPROTO_UDP) { /* Only UDP packets */
|
||||
return;
|
||||
}
|
||||
@@ -582,15 +876,25 @@ NetReceive(volatile uchar * pkt, int len)
|
||||
static int net_check_prereq (proto_t protocol)
|
||||
{
|
||||
switch (protocol) {
|
||||
case ARP: /* nothing to do */
|
||||
break;
|
||||
|
||||
/* Fall through */
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
case PING:
|
||||
if (NetPingIP == 0) {
|
||||
puts ("*** ERROR: ping address not given\n");
|
||||
return (1);
|
||||
}
|
||||
goto common;
|
||||
#endif
|
||||
case TFTP:
|
||||
if (NetServerIP == 0) {
|
||||
puts ("*** ERROR: `serverip' not set\n");
|
||||
return (1);
|
||||
}
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_PING)
|
||||
common:
|
||||
#endif
|
||||
|
||||
if (NetOurIP == 0) {
|
||||
puts ("*** ERROR: `ipaddr' not set\n");
|
||||
return (1);
|
||||
@@ -626,6 +930,8 @@ static int net_check_prereq (proto_t protocol)
|
||||
#endif
|
||||
}
|
||||
/* Fall through */
|
||||
default:
|
||||
return(0);
|
||||
}
|
||||
return (0); /* OK */
|
||||
}
|
||||
@@ -723,22 +1029,14 @@ void ip_to_string (IPaddr_t x, char *s)
|
||||
);
|
||||
}
|
||||
|
||||
void print_IPaddr (IPaddr_t x)
|
||||
{
|
||||
char tmp[16];
|
||||
|
||||
ip_to_string(x, tmp);
|
||||
|
||||
puts(tmp);
|
||||
}
|
||||
|
||||
IPaddr_t getenv_IPaddr (char *var)
|
||||
IPaddr_t string_to_ip(char *s)
|
||||
{
|
||||
IPaddr_t addr;
|
||||
char *s, *e;
|
||||
char *e;
|
||||
int i;
|
||||
|
||||
s = getenv (var);
|
||||
if (s == NULL)
|
||||
return(0);
|
||||
|
||||
for (addr=0, i=0; i<4; ++i) {
|
||||
ulong val = s ? simple_strtoul(s, &e, 10) : 0;
|
||||
@@ -751,3 +1049,17 @@ IPaddr_t getenv_IPaddr (char *var)
|
||||
|
||||
return (htonl(addr));
|
||||
}
|
||||
|
||||
void print_IPaddr (IPaddr_t x)
|
||||
{
|
||||
char tmp[16];
|
||||
|
||||
ip_to_string(x, tmp);
|
||||
|
||||
puts(tmp);
|
||||
}
|
||||
|
||||
IPaddr_t getenv_IPaddr (char *var)
|
||||
{
|
||||
return (string_to_ip(getenv(var)));
|
||||
}
|
||||
|
||||
19
net/tftp.c
19
net/tftp.c
@@ -142,10 +142,7 @@ TftpSend (void)
|
||||
break;
|
||||
}
|
||||
|
||||
NetSetEther (NetTxPacket, NetServerEther, PROT_IP);
|
||||
NetSetIP (NetTxPacket + ETHER_HDR_SIZE, NetServerIP,
|
||||
TftpServerPort, TftpOurPort, len);
|
||||
NetSendPacket (NetTxPacket, ETHER_HDR_SIZE + IP_HDR_SIZE + len);
|
||||
NetSendUDPPacket(NetServerEther, NetServerIP, TftpServerPort, TftpOurPort, len);
|
||||
}
|
||||
|
||||
|
||||
@@ -257,17 +254,6 @@ TftpTimeout (void)
|
||||
void
|
||||
TftpStart (void)
|
||||
{
|
||||
#ifdef ET_DEBUG
|
||||
printf ("\nServer ethernet address %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
NetServerEther[0],
|
||||
NetServerEther[1],
|
||||
NetServerEther[2],
|
||||
NetServerEther[3],
|
||||
NetServerEther[4],
|
||||
NetServerEther[5]
|
||||
);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (BootFile[0] == '\0') {
|
||||
IPaddr_t OurIP = ntohl(NetOurIP);
|
||||
|
||||
@@ -320,6 +306,9 @@ TftpStart (void)
|
||||
TftpState = STATE_RRQ;
|
||||
TftpOurPort = 1024 + (get_timer(0) % 3072);
|
||||
|
||||
/* zero out server ether in case the server ip has changed */
|
||||
memset(NetServerEther, 0, 6);
|
||||
|
||||
TftpSend ();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user