All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] [PATCH 2/5] 4xx: update esd's common auto_update code for 405 boards
Date: Mon, 21 Apr 2008 14:42:06 +0200	[thread overview]
Message-ID: <200804211442.06377.matthias.fuchs@esd-electronics.com> (raw)

- Coding style cleanup (long lines)
- improve handling of protected flash regions
- remove dead code

Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
---
 board/esd/common/auto_update.c |  208 ++++++++++++++++++---------------------
 board/esd/common/auto_update.h |   15 ++-
 2 files changed, 106 insertions(+), 117 deletions(-)

diff --git a/board/esd/common/auto_update.c b/board/esd/common/auto_update.c
index 1bf81c6..7e6eea0 100644
--- a/board/esd/common/auto_update.c
+++ b/board/esd/common/auto_update.c
@@ -44,29 +44,16 @@
 extern au_image_t au_image[];
 extern int N_AU_IMAGES;
 
-#define AU_DEBUG
-#undef AU_DEBUG
-
-#undef debug
-#ifdef	AU_DEBUG
-#define debug(fmt,args...)	printf (fmt ,##args)
-#else
-#define debug(fmt,args...)
-#endif	/* AU_DEBUG */
-
-
-#define LOAD_ADDR ((unsigned char *)0x100000)   /* where to load files into memory */
-#define MAX_LOADSZ 0x1e00000
+/* where to load files into memory */
+#define LOAD_ADDR ((unsigned char *)0x100000)
+#define MAX_LOADSZ 0x1c00000
 
 /* externals */
 extern int fat_register_device(block_dev_desc_t *, int);
 extern int file_fat_detectfs(void);
 extern long file_fat_read(const char *, void *, unsigned long);
-long do_fat_read (const char *filename, void *buffer, unsigned long maxsize, int dols);
-#ifdef CONFIG_VFD
-extern int trab_vfd (ulong);
-extern int transfer_pic(unsigned char, unsigned char *, int, int);
-#endif
+long do_fat_read (const char *filename, void *buffer,
+		  unsigned long maxsize, int dols);
 extern int flash_sect_erase(ulong, ulong);
 extern int flash_sect_protect (int, ulong, ulong);
 extern int flash_write (char *, ulong, ulong);
@@ -78,14 +65,15 @@ extern int flash_write (char *, ulong, ulong);
 #define NANDRW_JFFS2	0x02
 #define NANDRW_JFFS2_SKIP	0x04
 extern struct nand_chip nand_dev_desc[];
-extern int nand_legacy_rw(struct nand_chip* nand, int cmd, size_t start, size_t len,
-		   size_t * retlen, u_char * buf);
-extern int nand_legacy_erase(struct nand_chip* nand, size_t ofs, size_t len, int clean);
+extern int nand_legacy_rw(struct nand_chip* nand, int cmd,
+			  size_t start, size_t len,
+			  size_t * retlen, u_char * buf);
+extern int nand_legacy_erase(struct nand_chip* nand, size_t ofs,
+			     size_t len, int clean);
 #endif
 
 extern block_dev_desc_t ide_dev_desc[CFG_IDE_MAXDEVICE];
 
-
 int au_check_cksum_valid(int i, long nbytes)
 {
 	image_header_t *hdr;
@@ -117,7 +105,6 @@ int au_check_cksum_valid(int i, long nbytes)
 	return 0;
 }
 
-
 int au_check_header_valid(int i, long nbytes)
 {
 	image_header_t *hdr;
@@ -132,20 +119,11 @@ int au_check_header_valid(int i, long nbytes)
 #endif
 
 	/* check the easy ones first */
-#undef CHECK_VALID_DEBUG
-#ifdef CHECK_VALID_DEBUG
-	printf("magic %#x %#x ", image_get_magic (hdr), IH_MAGIC);
-	printf("arch %#x %#x ", image_get_arch (hdr), IH_ARCH_PPC);
-	printf("size %#x %#lx ", image_get_data_size (hdr), nbytes);
-	printf("type %#x %#x ", image_get_type (hdr), IH_TYPE_KERNEL);
-#endif
-	if (nbytes < image_get_header_size ())
-	{
+	if (nbytes < image_get_header_size ()) {
 		printf ("Image %s bad header SIZE\n", au_image[i].name);
 		return -1;
 	}
-	if (!image_check_magic (hdr) || !image_check_arch (hdr, IH_ARCH_PPC))
-	{
+	if (!image_check_magic (hdr) || !image_check_arch (hdr, IH_ARCH_PPC)) {
 		printf ("Image %s bad MAGIC or ARCH\n", au_image[i].name);
 		return -1;
 	}
@@ -155,11 +133,13 @@ int au_check_header_valid(int i, long nbytes)
 	}
 
 	/* check the type - could do this all in one gigantic if() */
-	if ((au_image[i].type == AU_FIRMWARE) && !image_check_type (hdr, IH_TYPE_FIRMWARE)) {
+	if (((au_image[i].type & AU_TYPEMASK) == AU_FIRMWARE) &&
+	    !image_check_type (hdr, IH_TYPE_FIRMWARE)) {
 		printf ("Image %s wrong type\n", au_image[i].name);
 		return -1;
 	}
-	if ((au_image[i].type == AU_SCRIPT) && !image_check_type (hdr, IH_TYPE_SCRIPT)) {
+	if (((au_image[i].type & AU_TYPEMASK) == AU_SCRIPT) &&
+	    !image_check_type (hdr, IH_TYPE_SCRIPT)) {
 		printf ("Image %s wrong type\n", au_image[i].name);
 		return -1;
 	}
@@ -167,22 +147,9 @@ int au_check_header_valid(int i, long nbytes)
 	/* recycle checksum */
 	checksum = image_get_data_size (hdr);
 
-#if 0 /* test-only */
-	/* for kernel and app the image header must also fit into flash */
-	if (idx != IDX_DISK)
-		checksum += image_get_header_size ();
-	/* check the size does not exceed space in flash. HUSH scripts */
-	/* all have ausize[] set to 0 */
-	if ((ausize[idx] != 0) && (ausize[idx] < checksum)) {
-		printf ("Image %s is bigger than FLASH\n", au_image[i].name);
-		return -1;
-	}
-#endif
-
 	return 0;
 }
 
-
 int au_do_update(int i, long sz)
 {
 	image_header_t *hdr;
@@ -203,7 +170,7 @@ int au_do_update(int i, long sz)
 	}
 #endif
 
-	switch (au_image[i].type) {
+	switch (au_image[i].type & AU_TYPEMASK) {
 	case AU_SCRIPT:
 		printf("Executing script %s\n", au_image[i].name);
 
@@ -243,38 +210,43 @@ int au_do_update(int i, long sz)
 		 */
 		if (au_image[i].type == AU_FIRMWARE) {
 			char *orig = (char*)start;
-			char *new  = (char *)((char *)hdr + image_get_header_size ());
+			char *new  = (char *)((char *)hdr +
+					      image_get_header_size ());
 			nbytes = image_get_data_size (hdr);
 
-			while(--nbytes) {
+			while (--nbytes) {
 				if (*orig++ != *new++) {
 					break;
 				}
 			}
 			if (!nbytes) {
-				printf("Skipping firmware update - images are identical\n");
+				printf ("Skipping firmware update - "
+					"images are identical\n");
 				break;
 			}
 		}
 
 		/* unprotect the address range */
-		/* this assumes that ONLY the firmware is protected! */
-		if (au_image[i].type == AU_FIRMWARE) {
-			flash_sect_protect(0, start, end);
+		if (((au_image[i].type & AU_FLAGMASK) == AU_PROTECT) ||
+		    (au_image[i].type == AU_FIRMWARE)) {
+			flash_sect_protect (0, start, end);
 		}
 
 		/*
 		 * erase the address range.
 		 */
 		if (au_image[i].type != AU_NAND) {
-			printf("Updating NOR FLASH with image %s\n", au_image[i].name);
+			printf ("Updating NOR FLASH with image %s\n",
+				au_image[i].name);
 			debug ("flash_sect_erase(%lx, %lx);\n", start, end);
-			flash_sect_erase(start, end);
+			flash_sect_erase (start, end);
 		} else {
 #if defined(CONFIG_CMD_NAND) && defined(CFG_NAND_LEGACY)
-			printf("Updating NAND FLASH with image %s\n", au_image[i].name);
+			printf ("Updating NAND FLASH with image %s\n",
+				au_image[i].name);
 			debug ("nand_legacy_erase(%lx, %lx);\n", start, end);
-			rc = nand_legacy_erase (nand_dev_desc, start, end - start + 1, 0);
+			rc = nand_legacy_erase (nand_dev_desc, start,
+						end - start + 1, 0);
 			debug ("nand_legacy_erase returned %x\n", rc);
 #endif
 		}
@@ -296,20 +268,26 @@ int au_do_update(int i, long sz)
 		 * copy the data from RAM to FLASH
 		 */
 		if (au_image[i].type != AU_NAND) {
-			debug ("flash_write(%p, %lx %x)\n", addr, start, nbytes);
-			rc = flash_write((char *)addr, start, nbytes);
+			debug ("flash_write(%p, %lx, %x)\n",
+			       addr, start, nbytes);
+			rc = flash_write ((char *)addr, start,
+					  (nbytes + 1) & ~1);
 		} else {
 #if defined(CONFIG_CMD_NAND) && defined(CFG_NAND_LEGACY)
-			debug ("nand_legacy_rw(%p, %lx %x)\n", addr, start, nbytes);
-			rc = nand_legacy_rw(nand_dev_desc, NANDRW_WRITE | NANDRW_JFFS2,
-				     start, nbytes, (size_t *)&total, (uchar *)addr);
-			debug ("nand_legacy_rw: ret=%x total=%d nbytes=%d\n", rc, total, nbytes);
+			debug ("nand_legacy_rw(%p, %lx, %x)\n",
+			       addr, start, nbytes);
+			rc = nand_legacy_rw (nand_dev_desc,
+					     NANDRW_WRITE | NANDRW_JFFS2,
+					     start, nbytes, (size_t *)&total,
+					     (uchar *)addr);
+			debug ("nand_legacy_rw: ret=%x total=%d nbytes=%d\n",
+			       rc, total, nbytes);
 #else
 			rc = -1;
 #endif
 		}
 		if (rc != 0) {
-			printf("Flashing failed due to error %d\n", rc);
+			printf ("Flashing failed due to error %d\n", rc);
 			return -1;
 		}
 
@@ -317,23 +295,30 @@ int au_do_update(int i, long sz)
 		 * check the dcrc of the copy
 		 */
 		if (au_image[i].type != AU_NAND) {
-			rc = crc32 (0, (uchar *)(start + off), image_get_data_size (hdr));
+			rc = crc32 (0, (uchar *)(start + off),
+				    image_get_data_size (hdr));
 		} else {
 #if defined(CONFIG_CMD_NAND) && defined(CFG_NAND_LEGACY)
-			rc = nand_legacy_rw(nand_dev_desc, NANDRW_READ | NANDRW_JFFS2 | NANDRW_JFFS2_SKIP,
-				     start, nbytes, (size_t *)&total, (uchar *)addr);
-			rc = crc32 (0, (uchar *)(addr + off), image_get_data_size (hdr));
+			rc = nand_legacy_rw (nand_dev_desc,
+					     NANDRW_READ | NANDRW_JFFS2 |
+					     NANDRW_JFFS2_SKIP,
+					     start, nbytes, (size_t *)&total,
+					     (uchar *)addr);
+			rc = crc32 (0, (uchar *)(addr + off),
+				    image_get_data_size (hdr));
 #endif
 		}
 		if (rc != image_get_dcrc (hdr)) {
-			printf ("Image %s Bad Data Checksum After COPY\n", au_image[i].name);
+			printf ("Image %s Bad Data Checksum After COPY\n",
+				au_image[i].name);
 			return -1;
 		}
 
 		/* protect the address range */
 		/* this assumes that ONLY the firmware is protected! */
-		if (au_image[i].type == AU_FIRMWARE) {
-			flash_sect_protect(1, start, end);
+		if (((au_image[i].type & AU_FLAGMASK) == AU_PROTECT) ||
+		    (au_image[i].type == AU_FIRMWARE)) {
+			flash_sect_protect (1, start, end);
 		}
 
 		break;
@@ -345,7 +330,6 @@ int au_do_update(int i, long sz)
 	return 0;
 }
 
-
 static void process_macros (const char *input, char *output)
 {
 	char c, prev;
@@ -359,16 +343,17 @@ static void process_macros (const char *input, char *output)
 #ifdef DEBUG_PARSER
 	char *output_start = output;
 
-	printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n", strlen(input), input);
+	printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n",
+		strlen(input), input);
 #endif
 
-	prev = '\0';			/* previous character	*/
+	prev = '\0';			/* previous character */
 
 	while (inputcnt && outputcnt) {
 	    c = *input++;
 	    inputcnt--;
 
-	    if (state!=3) {
+	    if (state != 3) {
 	    /* remove one level of escape characters */
 	    if ((c == '\\') && (prev != '\\')) {
 		if (inputcnt-- == 0)
@@ -379,7 +364,7 @@ static void process_macros (const char *input, char *output)
 	    }
 
 	    switch (state) {
-	    case 0:			/* Waiting for (unescaped) $	*/
+	    case 0:			/* Waiting for (unescaped) $ */
 		if ((c == '\'') && (prev != '\\')) {
 			state = 3;
 			break;
@@ -391,7 +376,7 @@ static void process_macros (const char *input, char *output)
 			outputcnt--;
 		}
 		break;
-	    case 1:			/* Waiting for (	*/
+	    case 1:			/* Waiting for ( */
 		if (c == '(' || c == '{') {
 			state++;
 			varname_start = input;
@@ -410,7 +395,8 @@ static void process_macros (const char *input, char *output)
 		if (c == ')' || c == '}') {
 			int i;
 			char envname[CFG_CBSIZE], *envval;
-			int envcnt = input-varname_start-1; /* Varname # of chars */
+			/* Varname # of chars */
+			int envcnt = input - varname_start - 1;
 
 			/* Get the varname */
 			for (i = 0; i < envcnt; i++) {
@@ -448,11 +434,10 @@ static void process_macros (const char *input, char *output)
 
 #ifdef DEBUG_PARSER
 	printf ("[PROCESS_MACROS] OUTPUT len %d: \"%s\"\n",
-		strlen(output_start), output_start);
+		strlen (output_start), output_start);
 #endif
 }
 
-
 /*
  * this is called from board_init() after the hardware has been set up
  * and is usable. That seems like a good time to do this.
@@ -460,84 +445,84 @@ static void process_macros (const char *input, char *output)
  */
 int do_auto_update(void)
 {
-	block_dev_desc_t *stor_dev;
+	block_dev_desc_t *stor_dev = NULL;
 	long sz;
 	int i, res, cnt, old_ctrlc, got_ctrlc;
 	char buffer[32];
 	char str[80];
+	int n;
 
-	/*
-	 * Check whether a CompactFlash is inserted
-	 */
-	if (ide_dev_desc[0].type == DEV_TYPE_UNKNOWN) {
-		return -1;       /* no disk detected! */
+	if  (ide_dev_desc[0].type != DEV_TYPE_UNKNOWN) {
+		stor_dev = get_dev ("ide", 0);
+		if (stor_dev == NULL) {
+			debug ("ide: unknown device\n");
+			return -1;
+		}
 	}
 
-	/* check whether it has a partition table */
-	stor_dev = get_dev("ide", 0);
-	if (stor_dev == NULL) {
-		debug ("Uknown device type\n");
-		return -1;
-	}
-	if (fat_register_device(stor_dev, 1) != 0) {
-		debug ("Unable to register ide disk 0:1 for fatls\n");
+	if (fat_register_device (stor_dev, 1) != 0) {
+		debug ("Unable to register ide disk 0:1\n");
 		return -1;
 	}
 
 	/*
 	 * Check if magic file is present
 	 */
-	if (do_fat_read(AU_MAGIC_FILE, buffer, sizeof(buffer), LS_NO) <= 0) {
+	if ((n = do_fat_read (AU_MAGIC_FILE, buffer,
+			      sizeof(buffer), LS_NO)) <= 0) {
+		debug ("No auto_update magic file (n=%d)\n", n);
 		return -1;
 	}
 
 #ifdef CONFIG_AUTO_UPDATE_SHOW
-	board_auto_update_show(1);
+	board_auto_update_show (1);
 #endif
 	puts("\nAutoUpdate Disk detected! Trying to update system...\n");
 
 	/* make sure that we see CTRL-C and save the old state */
-	old_ctrlc = disable_ctrlc(0);
+	old_ctrlc = disable_ctrlc (0);
 
 	/* just loop thru all the possible files */
 	for (i = 0; i < N_AU_IMAGES; i++) {
 		/*
 		 * Try to expand the environment var in the fname
 		 */
-		process_macros(au_image[i].name, str);
-		strcpy(au_image[i].name, str);
+		process_macros (au_image[i].name, str);
+		strcpy (au_image[i].name, str);
 
 		printf("Reading %s ...", au_image[i].name);
 		/* just read the header */
-		sz = do_fat_read(au_image[i].name, LOAD_ADDR, image_get_header_size (), LS_NO);
+		sz = do_fat_read (au_image[i].name, LOAD_ADDR,
+				  image_get_header_size (), LS_NO);
 		debug ("read %s sz %ld hdr %d\n",
 			au_image[i].name, sz, image_get_header_size ());
 		if (sz <= 0 || sz < image_get_header_size ()) {
 			puts(" not found\n");
 			continue;
 		}
-		if (au_check_header_valid(i, sz) < 0) {
+		if (au_check_header_valid (i, sz) < 0) {
 			puts(" header not valid\n");
 			continue;
 		}
-		sz = do_fat_read(au_image[i].name, LOAD_ADDR, MAX_LOADSZ, LS_NO);
+		sz = do_fat_read (au_image[i].name, LOAD_ADDR,
+				  MAX_LOADSZ, LS_NO);
 		debug ("read %s sz %ld hdr %d\n",
 			au_image[i].name, sz, image_get_header_size ());
 		if (sz <= 0 || sz <= image_get_header_size ()) {
 			puts(" not found\n");
 			continue;
 		}
-		if (au_check_cksum_valid(i, sz) < 0) {
+		if (au_check_cksum_valid (i, sz) < 0) {
 			puts(" checksum not valid\n");
 			continue;
 		}
 		puts(" done\n");
 
 		do {
-			res = au_do_update(i, sz);
+			res = au_do_update (i, sz);
 			/* let the user break out of the loop */
-			if (ctrlc() || had_ctrlc()) {
-				clear_ctrlc();
+			if (ctrlc() || had_ctrlc ()) {
+				clear_ctrlc ();
 				if (res < 0)
 					got_ctrlc = 1;
 				break;
@@ -547,17 +532,16 @@ int do_auto_update(void)
 	}
 
 	/* restore the old state */
-	disable_ctrlc(old_ctrlc);
+	disable_ctrlc (old_ctrlc);
 
 	puts("AutoUpdate finished\n\n");
 #ifdef CONFIG_AUTO_UPDATE_SHOW
-	board_auto_update_show(0);
+	board_auto_update_show (0);
 #endif
 
 	return 0;
 }
 
-
 int auto_update(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
 	do_auto_update();
diff --git a/board/esd/common/auto_update.h b/board/esd/common/auto_update.h
index e2af3c7..3ed0e16 100644
--- a/board/esd/common/auto_update.h
+++ b/board/esd/common/auto_update.h
@@ -29,16 +29,21 @@
 
 #define AU_MAGIC_FILE   "__auto_update"
 
-#define AU_SCRIPT       1
-#define AU_FIRMWARE     2
-#define AU_NOR          3
-#define AU_NAND         4
+#define AU_TYPEMASK     0x000000ff
+#define AU_FLAGMASK     0xffff0000
+
+#define AU_PROTECT      0x80000000
+
+#define AU_SCRIPT       0x01
+#define AU_FIRMWARE     (0x02 | AU_PROTECT)
+#define AU_NOR          0x03
+#define AU_NAND         0x04
 
 struct au_image_s {
 	char name[80];
 	ulong start;
 	ulong size;
-	int type;
+	ulong type;
 };
 
 typedef struct au_image_s au_image_t;
-- 
1.5.3

             reply	other threads:[~2008-04-21 12:42 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-21 12:42 Matthias Fuchs [this message]
2008-04-22 11:51 ` [U-Boot-Users] [PATCH 2/5] 4xx: update esd's common auto_update code for 405 boards Stefan Roese

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200804211442.06377.matthias.fuchs@esd-electronics.com \
    --to=matthias.fuchs@esd-electronics.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.