* Update TRAB auto update code

* Make fatload set filesize environment variable
  fix potential buffer overlow problem

* enable basic / medium / high-end configurations for PPChameleonEVB
  board; fix NAND code

* enable TFTP client code to specify to the server the desired
  timeout value (see RFC-2349)
This commit is contained in:
wdenk 2003-10-06 21:55:32 +00:00
parent bb65a31267
commit fbe4b5cbde
9 changed files with 116 additions and 39 deletions

View File

@ -2,6 +2,14 @@
Changes for U-Boot 1.0.0: Changes for U-Boot 1.0.0:
====================================================================== ======================================================================
* Make fatload set filesize environment variable
* enable basic / medium / high-end configurations for PPChameleonEVB
board; fix NAND code
* enable TFTP client code to specify to the server the desired
timeout value (see RFC-2349)
* Improve SDRAM setup for TRAB board * Improve SDRAM setup for TRAB board
* Suppress all output with splashscreen configured only if "splashimage" * Suppress all output with splashscreen configured only if "splashimage"

View File

@ -478,6 +478,7 @@ wtk_config: unconfig
######################################################################### #########################################################################
## PPC4xx Systems ## PPC4xx Systems
######################################################################### #########################################################################
xtract_4xx = $(subst _MODEL_BA,,$(subst _MODEL_ME,,$(subst _MODEL_HI,,$(subst _config,,$1))))
ADCIOP_config: unconfig ADCIOP_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx adciop esd @./mkconfig $(@:_config=) ppc ppc4xx adciop esd
@ -557,8 +558,24 @@ PLU405_config: unconfig
PMC405_config: unconfig PMC405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx pmc405 esd @./mkconfig $(@:_config=) ppc ppc4xx pmc405 esd
PPChameleonEVB_MODEL_BA_config \
PPChameleonEVB_MODEL_ME_config \
PPChameleonEVB_MODEL_HI_config \
PPChameleonEVB_config: unconfig PPChameleonEVB_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx PPChameleonEVB dave @ >include/config.h
@[ -z "$(findstring _MODEL_BA,$@)" ] || \
{ echo "#define CONFIG_PPCHAMELEON_MODULE_MODEL 0" >>include/config.h ; \
echo "... BASIC model" ; \
}
@[ -z "$(findstring _MODEL_ME,$@)" ] || \
{ echo "#define CONFIG_PPCHAMELEON_MODULE_MODEL 1" >>include/config.h ; \
echo "... MEDIUM model" ; \
}
@[ -z "$(findstring _MODEL_HI,$@)" ] || \
{ echo "#define CONFIG_PPCHAMELEON_MODULE_MODEL 2" >>include/config.h ; \
echo "... HIGH-END model" ; \
}
@./mkconfig -a $(call xtract_4xx,$@) ppc ppc4xx PPChameleonEVB dave
VOH405_config: unconfig VOH405_config: unconfig
@./mkconfig $(@:_config=) ppc ppc4xx voh405 esd @./mkconfig $(@:_config=) ppc ppc4xx voh405 esd

View File

@ -261,10 +261,13 @@ nand_probe(ulong physadr);
void void
nand_init(void) nand_init(void)
{ {
ulong totlen; ulong totlen = 0;
#if (CONFIG_PPCHAMELEON_MODULE_MODEL == CONFIG_PPCHAMELEON_MODULE_ME) || \
(CONFIG_PPCHAMELEON_MODULE_MODEL == CONFIG_PPCHAMELEON_MODULE_HI)
debug ("Probing at 0x%.8x\n", CFG_NAND0_BASE); debug ("Probing at 0x%.8x\n", CFG_NAND0_BASE);
totlen = nand_probe (CFG_NAND0_BASE); totlen += nand_probe (CFG_NAND0_BASE);
#endif /* CONFIG_PPCHAMELEON_MODULE_ME, CONFIG_PPCHAMELEON_MODULE_HI */
debug ("Probing at 0x%.8x\n", CFG_NAND1_BASE); debug ("Probing at 0x%.8x\n", CFG_NAND1_BASE);
totlen += nand_probe (CFG_NAND1_BASE); totlen += nand_probe (CFG_NAND1_BASE);

View File

@ -313,9 +313,12 @@ au_do_update(int idx, long sz, int repeat)
/* execute a script */ /* execute a script */
if (hdr->ih_type == IH_TYPE_SCRIPT) { if (hdr->ih_type == IH_TYPE_SCRIPT) {
addr = (char *)((char *)hdr + sizeof(*hdr) + 8); addr = (char *)((char *)hdr + sizeof(*hdr));
parse_string_outer(addr, /* stick a NULL at the end of the script, otherwise */
FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); /* parse_string_outer() runs off the end. */
addr[ntohl(hdr->ih_size)] = 0;
addr += 8;
parse_string_outer(addr, FLAG_PARSE_SEMICOLON);
return 0; return 0;
} }
@ -333,8 +336,7 @@ au_do_update(int idx, long sz, int repeat)
#endif #endif
debug ("protect off %lx %lx\n", start, end); debug ("protect off %lx %lx\n", start, end);
sprintf(strbuf, "protect off %lx %lx\n", start, end); sprintf(strbuf, "protect off %lx %lx\n", start, end);
parse_string_outer(strbuf, parse_string_outer(strbuf, FLAG_PARSE_SEMICOLON);
FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
} }
/* /*
@ -344,12 +346,11 @@ au_do_update(int idx, long sz, int repeat)
if (repeat == 0) { if (repeat == 0) {
debug ("erase %lx %lx\n", start, end); debug ("erase %lx %lx\n", start, end);
sprintf(strbuf, "erase %lx %lx\n", start, end); sprintf(strbuf, "erase %lx %lx\n", start, end);
parse_string_outer(strbuf, parse_string_outer(strbuf, FLAG_PARSE_SEMICOLON);
FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
} }
wait_ms(100); wait_ms(100);
/* strip the header - except for the kernel */ /* strip the header - except for the kernel and app */
if (idx == IDX_FIRMWARE || idx == IDX_DISK || idx == IDX_APP) { if (idx == IDX_FIRMWARE || idx == IDX_DISK) {
addr = (char *)((char *)hdr + sizeof(*hdr)); addr = (char *)((char *)hdr + sizeof(*hdr));
#ifdef AU_UPDATE_TEST #ifdef AU_UPDATE_TEST
/* copy it to where Linux goes */ /* copy it to where Linux goes */
@ -367,8 +368,7 @@ au_do_update(int idx, long sz, int repeat)
/* copy the data from RAM to FLASH */ /* copy the data from RAM to FLASH */
debug ("cp.b %p %lx %x\n", addr, start, nbytes); debug ("cp.b %p %lx %x\n", addr, start, nbytes);
sprintf(strbuf, "cp.b %p %lx %x\n", addr, start, nbytes); sprintf(strbuf, "cp.b %p %lx %x\n", addr, start, nbytes);
parse_string_outer(strbuf, parse_string_outer(strbuf, FLAG_PARSE_SEMICOLON);
FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
/* check the dcrc of the copy */ /* check the dcrc of the copy */
if (crc32 (0, (char *)(start + off), ntohl(hdr->ih_size)) != ntohl(hdr->ih_dcrc)) { if (crc32 (0, (char *)(start + off), ntohl(hdr->ih_size)) != ntohl(hdr->ih_dcrc)) {
@ -381,8 +381,7 @@ au_do_update(int idx, long sz, int repeat)
if (idx == IDX_FIRMWARE) { if (idx == IDX_FIRMWARE) {
debug ("protect on %lx %lx\n", start, end); debug ("protect on %lx %lx\n", start, end);
sprintf(strbuf, "protect on %lx %lx\n", start, end); sprintf(strbuf, "protect on %lx %lx\n", start, end);
parse_string_outer(strbuf, parse_string_outer(strbuf, FLAG_PARSE_SEMICOLON);
FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
} }
return 0; return 0;
} }
@ -493,8 +492,11 @@ do_auto_update(void)
env = getenv("firmware_nd"); env = getenv("firmware_nd");
if (env != NULL) if (env != NULL)
end = simple_strtoul(env, NULL, 16); end = simple_strtoul(env, NULL, 16);
if (start >= 0 && end && end > start) if (start >= 0 && end && end > start) {
ausize[IDX_FIRMWARE] = (end + 1) - start; ausize[IDX_FIRMWARE] = (end + 1) - start;
aufl_layout[0].start = start;
aufl_layout[0].end = end;
}
start = -1; start = -1;
end = 0; end = 0;
env = getenv("kernel_st"); env = getenv("kernel_st");
@ -503,8 +505,11 @@ do_auto_update(void)
env = getenv("kernel_nd"); env = getenv("kernel_nd");
if (env != NULL) if (env != NULL)
end = simple_strtoul(env, NULL, 16); end = simple_strtoul(env, NULL, 16);
if (start >= 0 && end && end > start) if (start >= 0 && end && end > start) {
ausize[IDX_KERNEL] = (end + 1) - start; ausize[IDX_KERNEL] = (end + 1) - start;
aufl_layout[1].start = start;
aufl_layout[1].end = end;
}
start = -1; start = -1;
end = 0; end = 0;
env = getenv("app_st"); env = getenv("app_st");
@ -513,8 +518,11 @@ do_auto_update(void)
env = getenv("app_nd"); env = getenv("app_nd");
if (env != NULL) if (env != NULL)
end = simple_strtoul(env, NULL, 16); end = simple_strtoul(env, NULL, 16);
if (start >= 0 && end && end > start) if (start >= 0 && end && end > start) {
ausize[IDX_APP] = (end + 1) - start; ausize[IDX_APP] = (end + 1) - start;
aufl_layout[2].start = start;
aufl_layout[2].end = end;
}
start = -1; start = -1;
end = 0; end = 0;
env = getenv("disk_st"); env = getenv("disk_st");
@ -523,8 +531,11 @@ do_auto_update(void)
env = getenv("disk_nd"); env = getenv("disk_nd");
if (env != NULL) if (env != NULL)
end = simple_strtoul(env, NULL, 16); end = simple_strtoul(env, NULL, 16);
if (start >= 0 && end && end > start) if (start >= 0 && end && end > start) {
ausize[IDX_DISK] = (end + 1) - start; ausize[IDX_DISK] = (end + 1) - start;
aufl_layout[3].start = start;
aufl_layout[3].end = end;
}
/* make sure that we see CTRL-C and save the old state */ /* make sure that we see CTRL-C and save the old state */
old_ctrlc = disable_ctrlc(0); old_ctrlc = disable_ctrlc(0);

View File

@ -74,6 +74,7 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
long size; long size;
unsigned long offset; unsigned long offset;
unsigned long count; unsigned long count;
char buf [12];
block_dev_desc_t *dev_desc=NULL; block_dev_desc_t *dev_desc=NULL;
int dev=0; int dev=0;
int part=1; int part=1;
@ -107,11 +108,15 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
count = 0; count = 0;
size = file_fat_read (argv[4], (unsigned char *) offset, count); size = file_fat_read (argv[4], (unsigned char *) offset, count);
if(size==-1) if(size==-1) {
printf("\n** Unable to read \"%s\" from %s %d:%d **\n",argv[4],argv[1],dev,part); printf("\n** Unable to read \"%s\" from %s %d:%d **\n",argv[4],argv[1],dev,part);
else } else {
printf ("\n%ld bytes read\n", size); printf ("\n%ld bytes read\n", size);
sprintf(buf, "%lX", size);
setenv("filesize", buf);
}
return size; return size;
} }

View File

@ -43,7 +43,7 @@ int do_fdosboot(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
char *ep; char *ep;
int size; int size;
int rcode = 0; int rcode = 0;
char buf [10]; char buf [12];
int drive = CFG_FDC_DRIVE_NUMBER; int drive = CFG_FDC_DRIVE_NUMBER;
/* pre-set load_addr */ /* pre-set load_addr */

View File

@ -1,9 +1,12 @@
/* /*
* (C) Copyright 2001-2003 * (C) Copyright 2003
* Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com * DAVE Srl
* *
* See file CREDITS for list of people who contributed to this * http://www.dave-tech.it
* project. * http://www.wawnet.biz
* mailto:info@wawnet.biz
*
* Credits: Stefan Roese, Wolfgang Denk
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as * modify it under the terms of the GNU General Public License as
@ -28,6 +31,13 @@
#ifndef __CONFIG_H #ifndef __CONFIG_H
#define __CONFIG_H #define __CONFIG_H
#define CONFIG_PPCHAMELEON_MODULE_BA 0 /* Basic Model */
#define CONFIG_PPCHAMELEON_MODULE_ME 1 /* Medium Model */
#define CONFIG_PPCHAMELEON_MODULE_HI 2 /* High-End Model */
#ifndef CONFIG_PPCHAMELEON_MODULE_MODEL
#define CONFIG_PPCHAMELEON_MODULE_MODEL CONFIG_PPCHAMELEON_MODULE_BA
#endif
/* /*
* Debug stuff * Debug stuff
*/ */
@ -150,6 +160,7 @@
#define CFG_MAX_NAND_DEVICE 2 /* Max number of NAND devices */ #define CFG_MAX_NAND_DEVICE 2 /* Max number of NAND devices */
#define SECTORSIZE 512 #define SECTORSIZE 512
#define NAND_NO_RB
#define ADDR_COLUMN 1 #define ADDR_COLUMN 1
#define ADDR_PAGE 2 #define ADDR_PAGE 2
@ -248,19 +259,15 @@
} \ } \
} while(0) } while(0)
#ifdef NAND_NO_RB
/* constant delay (see also tR in the datasheet) */
#define NAND_WAIT_READY(nand) do { \ #define NAND_WAIT_READY(nand) do { \
ulong mask = 0; \ udelay(12); \
switch ((ulong)(((struct nand_chip *)nand)->IO_ADDR)) { \
case CFG_NAND0_BASE: \
mask = CFG_NAND0_RDY; \
break; \
case CFG_NAND1_BASE: \
mask = CFG_NAND1_RDY; \
break; \
} \
while (!(in32(GPIO0_IR) & mask)) \
; \
} while (0) } while (0)
#else
/* use the R/B pin */
/* TBD */
#endif
#define WRITE_NAND_COMMAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr) = (__u8)(d); } while(0) #define WRITE_NAND_COMMAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr) = (__u8)(d); } while(0)
#define WRITE_NAND_ADDRESS(d, adr) do{ *(volatile __u8 *)((unsigned long)adr) = (__u8)(d); } while(0) #define WRITE_NAND_ADDRESS(d, adr) do{ *(volatile __u8 *)((unsigned long)adr) = (__u8)(d); } while(0)

View File

@ -112,6 +112,7 @@
#define IH_TYPE_MULTI 4 /* Multi-File Image */ #define IH_TYPE_MULTI 4 /* Multi-File Image */
#define IH_TYPE_FIRMWARE 5 /* Firmware Image */ #define IH_TYPE_FIRMWARE 5 /* Firmware Image */
#define IH_TYPE_SCRIPT 6 /* Script file */ #define IH_TYPE_SCRIPT 6 /* Script file */
#define IH_TYPE_FILESYSTEM 7 /* Filesystem Image (any type) */
/* /*
* Compression Types * Compression Types

View File

@ -15,7 +15,7 @@
#if (CONFIG_COMMANDS & CFG_CMD_NET) #if (CONFIG_COMMANDS & CFG_CMD_NET)
#define WELL_KNOWN_PORT 69 /* Well known TFTP port # */ #define WELL_KNOWN_PORT 69 /* Well known TFTP port # */
#define TIMEOUT 2 /* Seconds to timeout for a lost pkt */ #define TIMEOUT 5 /* Seconds to timeout for a lost pkt */
#ifndef CONFIG_NET_RETRY_COUNT #ifndef CONFIG_NET_RETRY_COUNT
# define TIMEOUT_COUNT 10 /* # of timeouts before giving up */ # define TIMEOUT_COUNT 10 /* # of timeouts before giving up */
#else #else
@ -32,6 +32,7 @@
#define TFTP_DATA 3 #define TFTP_DATA 3
#define TFTP_ACK 4 #define TFTP_ACK 4
#define TFTP_ERROR 5 #define TFTP_ERROR 5
#define TFTP_OACK 6
static int TftpServerPort; /* The UDP port at their end */ static int TftpServerPort; /* The UDP port at their end */
@ -44,6 +45,7 @@ static int TftpState;
#define STATE_DATA 2 #define STATE_DATA 2
#define STATE_TOO_LARGE 3 #define STATE_TOO_LARGE 3
#define STATE_BAD_MAGIC 4 #define STATE_BAD_MAGIC 4
#define STATE_OACK 5
#define DEFAULT_NAME_LEN (8 + 4 + 1) #define DEFAULT_NAME_LEN (8 + 4 + 1)
static char default_filename[DEFAULT_NAME_LEN]; static char default_filename[DEFAULT_NAME_LEN];
@ -113,10 +115,18 @@ TftpSend (void)
pkt += strlen(tftp_filename) + 1; pkt += strlen(tftp_filename) + 1;
strcpy ((char *)pkt, "octet"); strcpy ((char *)pkt, "octet");
pkt += 5 /*strlen("octet")*/ + 1; pkt += 5 /*strlen("octet")*/ + 1;
strcpy ((char *)pkt, "timeout");
pkt += 7 /*strlen("timeout")*/ + 1;
sprintf((char *)pkt, "%d", TIMEOUT);
#ifdef ET_DEBUG
printf("send option \"timeout %s\"\n", (char *)pkt);
#endif
pkt += strlen((char *)pkt) + 1;
len = pkt - xp; len = pkt - xp;
break; break;
case STATE_DATA: case STATE_DATA:
case STATE_OACK:
xp = pkt; xp = pkt;
*((ushort *)pkt)++ = htons(TFTP_ACK); *((ushort *)pkt)++ = htons(TFTP_ACK);
*((ushort *)pkt)++ = htons(TftpBlock); *((ushort *)pkt)++ = htons(TftpBlock);
@ -173,6 +183,14 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
default: default:
break; break;
case TFTP_OACK:
#ifdef ET_DEBUG
printf("Got OACK: %s %s\n", pkt, pkt+strlen(pkt)+1);
#endif
TftpState = STATE_OACK;
TftpServerPort = src;
TftpSend (); /* Send ACK */
break;
case TFTP_DATA: case TFTP_DATA:
if (len < 2) if (len < 2)
return; return;
@ -184,7 +202,13 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
puts ("\n\t "); puts ("\n\t ");
} }
#ifdef ET_DEBUG
if (TftpState == STATE_RRQ) { if (TftpState == STATE_RRQ) {
printf("Server did not acknowledge timeout option!\n");
}
#endif
if (TftpState == STATE_RRQ || TftpState == STATE_OACK) {
TftpState = STATE_DATA; TftpState = STATE_DATA;
TftpServerPort = src; TftpServerPort = src;
TftpLastBlock = 0; TftpLastBlock = 0;
@ -305,6 +329,7 @@ TftpStart (void)
TftpTimeoutCount = 0; TftpTimeoutCount = 0;
TftpState = STATE_RRQ; TftpState = STATE_RRQ;
TftpOurPort = 1024 + (get_timer(0) % 3072); TftpOurPort = 1024 + (get_timer(0) % 3072);
TftpBlock = 0;
/* zero out server ether in case the server ip has changed */ /* zero out server ether in case the server ip has changed */
memset(NetServerEther, 0, 6); memset(NetServerEther, 0, 6);