From: Francois B <mrs...@us...> - 2005-09-22 02:00:19
|
Update of /cvsroot/openneo/openuu In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16493 Modified Files: Tag: 1.4 flash.c Log Message: Fixed a few issues Index: flash.c =================================================================== RCS file: /cvsroot/openneo/openuu/flash.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** flash.c 15 Sep 2005 05:17:19 -0000 1.3 --- flash.c 22 Sep 2005 02:00:11 -0000 1.4 *************** *** 6,9 **** --- 6,10 ---- #include "file.h" #include "button.h" + #include "system.h" #ifndef UINT8 *************** *** 27,37 **** #define UU_LOCATION 0x00010000 ! static const unsigned char *osFilenames[3] = { "/openneo.bin", "/openvoice.bin", "/neo35.bin" }; ! static const unsigned char *uuFilenames[3] = { "/OpenUU.bin", "/OpenVUU.bin", "/Nuu35.bin" }; static UINT8 sector[SECTORSIZE]; /* better not place this on the stack... */ static struct firmware_header header; static bool use_header = false; ! static bool scrambled = false; /* result of the CheckFirmwareFile() function */ --- 28,37 ---- #define UU_LOCATION 0x00010000 ! static unsigned char osFilenames[3][16] = { "/openneo.bin", "/openvoice.bin", "/neo35.bin" }; static UINT8 sector[SECTORSIZE]; /* better not place this on the stack... */ static struct firmware_header header; static bool use_header = false; ! static bool scrambled; /* result of the CheckFirmwareFile() function */ *************** *** 125,134 **** *pAddr = 0x30; /* erase the sector */ ! while (--timeout); //Must wait for timeout or chip aborts erase.. //erase typical time of 1 second - not sure about this timeout... ! while (*pAddr != 0xFF); /* poll for erased */ pBase[0] = 0xF0; /* reset flash (back to normal read mode) */ --- 125,136 ---- *pAddr = 0x30; /* erase the sector */ ! while (--timeout) ! asm volatile("nop"); //Must wait for timeout or chip aborts erase.. //erase typical time of 1 second - not sure about this timeout... ! while (*pAddr != 0xFF) /* poll for erased */ ! asm volatile("nop"); pBase[0] = 0xF0; /* reset flash (back to normal read mode) */ *************** *** 162,168 **** /* I counted 7 instructions for this loop -> min. 0.58 us per round Plus memory waitstates it will be much more, gives margin */ ! while (*pAddr != data && --timeout); /* poll for programmed */ - pBase[0] = 0xF0; /* reset flash (back to normal read mode) */ return (timeout != 0); #endif --- 164,170 ---- /* I counted 7 instructions for this loop -> min. 0.58 us per round Plus memory waitstates it will be much more, gives margin */ ! while (*pAddr != data && --timeout) /* poll for programmed */ ! asm volatile("nop"); return (timeout != 0); #endif *************** *** 191,195 **** } ! tCheckResult CheckImageFile(const unsigned char* filename, int space, UINT32 *size, int type) { int fd; --- 193,197 ---- } ! tCheckResult CheckImageFile(unsigned char* filename, int space, UINT32 *size, int type) { int fd; *************** *** 210,214 **** fsize = filesize(fd); ! if( fsize != -1 && (fsize > space) ) { close(fd); --- 212,216 ---- fsize = filesize(fd); ! if (fsize > space) { close(fd); *************** *** 217,225 **** *size=fsize; nread = read(fd,&header,sizeof(struct firmware_header)); ! if (nread<sizeof(struct firmware_header)) { close(fd); ! return eNoHeader; } --- 219,234 ---- *size=fsize; + nread = read(fd,&header,sizeof(struct firmware_header)); ! ! if( nread < 0 ) { ! close(fd); ! return eReadErr; ! } ! ! if ( (unsigned)nread<sizeof(struct firmware_header)) { close(fd); ! return eReadErr; } *************** *** 231,235 **** ,header.type,header.version,header.checksum,header.data_start); ! if( memcmp(header.type,"OPEN",4) ) { //no header at all! close(fd); --- 240,244 ---- ,header.type,header.version,header.checksum,header.data_start); ! if( strncmp(header.type,"OPEN",4) ) { //no header at all! close(fd); *************** *** 239,246 **** if( type == HEADER_TYPE_FIRMWARE ) { ! if( memcmp(header.type,"OPENVOICE",9) == 0 ) scrambled = true; ! else if( memcmp(header.type,"OPENNEO35",9) ) { ! DEBUGF("Firmware type='%s', Mine='%s'\n",header.type,type); DEBUGF("firmware is NOT my type! oh la la...\n"); --- 248,254 ---- if( type == HEADER_TYPE_FIRMWARE ) { ! if( strncmp(header.type,"OPENVOICE",9) == 0 ) scrambled = true; ! else if( strncmp(header.type,"OPENNEO35",9) ) { DEBUGF("Firmware type='%s', Mine='%s'\n",header.type,type); DEBUGF("firmware is NOT my type! oh la la...\n"); *************** *** 251,257 **** else if( type == HEADER_TYPE_UU ) { ! if( memcmp(header.type,"OPENVUU",7) == 0 ) scrambled = true; ! else if ( memcmp(header.type,"OPENUU",6) ) { DEBUGF("Firmware type='%s', Mine='%s'\n",header.type,type); DEBUGF("firmware is NOT my type! oh la la...\n"); --- 259,265 ---- else if( type == HEADER_TYPE_UU ) { ! if( strncmp(header.type,"OPENVUU",7) == 0 ) scrambled = true; ! else if ( strncmp(header.type,"OPENUU",6) ) { DEBUGF("Firmware type='%s', Mine='%s'\n",header.type,type); DEBUGF("firmware is NOT my type! oh la la...\n"); *************** *** 274,280 **** { nread = read(fd, sector, SECTORSIZE); fileread += nread; DEBUGF("Read %d bytes\n",nread); ! for (i=0;i<nread;++i) { checksum+=sector[i]; } --- 282,294 ---- { nread = read(fd, sector, SECTORSIZE); + + if( nread < 0 ) { + close(fd); + return eReadErr; + } + fileread += nread; DEBUGF("Read %d bytes\n",nread); ! for (i=0;i<(unsigned int)nread;++i) { checksum+=sector[i]; } *************** *** 283,287 **** close(fd); ! if (fileread != fsize-sizeof(struct firmware_header)) return eReadErr; --- 297,301 ---- close(fd); ! if (fileread != fsize- (signed)sizeof(struct firmware_header)) return eReadErr; *************** *** 297,302 **** /* returns the # of failures, 0 on success */ ! unsigned ProgramImageFile(const unsigned char* filename, UINT8 *pos, UINT32 size, bool reboot) __attribute__ ((section (".icode"))); ! unsigned ProgramImageFile(const unsigned char* filename, UINT8 *pos, UINT32 size, bool reboot) { int fd; --- 311,316 ---- /* returns the # of failures, 0 on success */ ! unsigned ProgramImageFile(unsigned char* filename, volatile UINT8 *pos, UINT32 size, bool reboot) __attribute__ ((section (".icode"))); ! unsigned ProgramImageFile(unsigned char* filename, volatile UINT8 *pos, UINT32 size, bool reboot) { int fd; *************** *** 304,309 **** unsigned failures = 0; int i; ! void (*start_func)(void) = (void*)0x00010200; ! char reboot_string[13]; strncpy(reboot_string,"Rebooting...",12); --- 318,323 ---- unsigned failures = 0; int i; ! volatile void (*start_func)(void) = (void*)0x00010200; ! char reboot_string[16]; strncpy(reboot_string,"Rebooting...",12); *************** *** 343,348 **** //Writing 0xff over 0xff is useless, to speed things up we skip these bytes. ! if( sector[i] == 0xFF ) ! continue; if (!ProgramByte(pos + i, sector[i])) --- 357,362 ---- //Writing 0xff over 0xff is useless, to speed things up we skip these bytes. ! //if( sector[i] == 0xFF ) ! // continue; if (!ProgramByte(pos + i, sector[i])) *************** *** 378,382 **** /* returns the # of failures, 0 on success */ ! unsigned VerifyImageFile(const unsigned char* filename, UINT8* pos, UINT32 size) { int i; --- 392,396 ---- /* returns the # of failures, 0 on success */ ! unsigned VerifyImageFile(unsigned char* filename, UINT8* pos, UINT32 size) { int i; *************** *** 459,463 **** tFlashInfo FlashInfo; UINT32 aligned_size, true_size; ! UINT8 *pos; char buf[MAX_PATH]; int button; --- 473,477 ---- tFlashInfo FlashInfo; UINT32 aligned_size, true_size; ! volatile UINT8 *pos; char buf[MAX_PATH]; int button; *************** *** 592,649 **** } } - /* - inline int uu_backup(void) __attribute__ ((section (".icode"))); - inline int uu_backup(void) - { - int i; - UINT8 *pos; - int failures = 0; - - //Read current UU - pos = (UINT8*)UU_LOCATION; - for (i=0; i<SECTORSIZE; i++) - sector[i] = pos[i]; - - pos = (UINT8*)0x00070000; - if (!EraseSector(pos)) - return 1; - - pos = (UINT8*)0x00070000; - for (i=0; i<SECTORSIZE; i++) { - - if( sector[i] == 0xFF ) - continue; - - if (!ProgramByte(pos + i, sector[i])) - { - failures++; - } - } - - return failures; - } - */ void uu_update(void) { tFlashInfo FlashInfo; UINT32 aligned_size, true_size; ! UINT8 *pos; char buf[20]; int button; ! int i,j; ! int rc; ! int filename_index = -1; use_header=true; pos=(UINT8*)UU_LOCATION; ! rc=GetFlashInfo(&FlashInfo); ShowFlashInfo(&FlashInfo); ! for (i=0;i<100;++i) //delay for users to read ! for (j=0;j<6000;++j); if (FlashInfo.size == 0) { ! splash(true,"Not flashable"); return; } --- 606,633 ---- } } void uu_update(void) { tFlashInfo FlashInfo; UINT32 aligned_size, true_size; ! volatile UINT8 *pos; char buf[20]; int button; ! tCheckResult rc; ! char filename[16]; use_header=true; pos=(UINT8*)UU_LOCATION; ! GetFlashInfo(&FlashInfo); ShowFlashInfo(&FlashInfo); ! ! //delay for users to read ! wait( 1000 ); if (FlashInfo.size == 0) { ! lcd_clear_display(); ! lcd_puts(3, 1, "Not flashable"); ! wait( 2000 ); return; } *************** *** 652,666 **** //Lets try the different file names ! rc = eFileNotFound; ! for( filename_index=0; filename_index< 3 && (rc == eFileNotFound); filename_index++ ) ! rc = CheckImageFile( uuFilenames[filename_index], 0x10000,&true_size,HEADER_TYPE_UU); ! ! lcd_puts(0, 0, "Checked:"); switch (rc) { case eOK: { lcd_puts(0, 1, "File OK."); ! for (i=0;i<100;++i) //delay for users to read ! for (j=0;j<6000;++j); } break; --- 636,653 ---- //Lets try the different file names ! strcpy( filename, "/OpenUU.bin" ); ! rc = CheckImageFile( filename, 0x10000,&true_size,HEADER_TYPE_UU); ! ! if( rc == eFileNotFound ) { ! strcpy( filename, "/nuu35.bin" ); ! rc = CheckImageFile( filename, 0x10000,&true_size,HEADER_TYPE_UU); ! } ! ! lcd_puts(0, 0, "File check result:"); switch (rc) { case eOK: { lcd_puts(0, 1, "File OK."); ! wait( 1000 ); } break; *************** *** 731,748 **** return; } - /* - lcd_clear_display(); - //Backup current UU to last sector, this will act as a test to see if the chip is programmable - lcd_puts(0, 0, "Backing up UU"); - rc = uu_backup(); - - if( rc ) { - lcd_clear_display(); - lcd_puts(0, 0, "Backup failed!"); - button = button_get(true); - return; - } - */ lcd_clear_display(); lcd_puts(0, 0, "Programming"); --- 718,722 ---- *************** *** 755,765 **** DEBUGF("Aligned Size=0x%x, Size=0x%x\n",aligned_size,true_size); ! rc = ProgramImageFile(uuFilenames[filename_index], pos, true_size,true); //must reboot as the address of flash functions can change here - - - - if (rc) { /* errors */ --- 729,735 ---- DEBUGF("Aligned Size=0x%x, Size=0x%x\n",aligned_size,true_size); ! rc = ProgramImageFile(filename, pos, true_size,true); //must reboot as the address of flash functions can change here if (rc) { /* errors */ *************** *** 770,791 **** button = button_get(true); } - - lcd_clear_display(); - lcd_puts(0, 0, "Verifying"); - - rc = VerifyImageFile(uuFilenames[filename_index], pos, true_size); - - lcd_clear_display(); - if (rc == 0) - { - lcd_puts(0, 0, "Verify OK."); - } - else - { - lcd_puts(0, 1, "Verify fail!"); - snprintf(buf, sizeof(buf), "%d errors", rc); - lcd_puts(0, 2, buf); - button = button_get(true); - } } --- 740,743 ---- |