4xx: update esd's common auto_update code for 405 boards
PATCH 2/5 4xx: update esd's common auto_update code for 405 boards
- Coding style cleanup (long lines)
- improve handling of protected flash regions
- remove dead code
Signed-off-by Matthias Fuchs <[email protected]>
--- board/esd/common/auto_update.c | 208 ++++++++++++++++++--------------------- board/esd/common/auto_update.h | 15 ++- 2 files changed, 106 insertions(+), 117 deletions(-)
board/esd/common/auto_update.c +96 -112
@@ -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 0x04extern 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 ();
board/esd/common/auto_update.h +10 -5
@@ -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 0x04struct au_image_s {char name[80 ];ulong start;ulong size; -int type; +ulong type; };typedef struct au_image_s au_image_t ;
Signature · 1 line
1.5.3
PATCH 2/5 4xx: update esd's common auto_update code for 405 boards
Quoted 5 lines · Matthias Fuchs
- Coding style cleanup (long lines)
- improve handling of protected flash regions
- remove dead codeSigned-off-by Matthias Fuchs <[email protected]>
Applied to u-boot-ppc4xx. Thanks.
Best regards,
Stefan
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
=====================================================================