void print_pftp_put( void ) { u32 ulSum; u16 i; u8 ucByte; // This function establishes connection globalModemStatus |= (MODEM_PFTPINPROGRESS|MODEM_BUSY); // Setting this earlier causes a UART conflict print( MODEM_COM, "GET /cgi/pftp.py?put=" ); print( MODEM_COM, globalModemPFTP.File.Name ); if( globalModemPFTP.ChunkSize != 256 ) { // 256 is PFTP server default print( MODEM_COM, "&sz=%d", globalModemPFTP.ChunkSize ); } // if // Character '+' is substitute for SPACE in URI print( MODEM_COM, "&dat=PFTP+%d+", globalModemPFTP.CurrentChunk ); fileSetPosition( &globalModemPFTP.File, START, ( globalModemPFTP.CurrentChunk - 1 ) * globalModemPFTP.ChunkSize ); ulSum = 0; pdiaEncode( 0, PDIA_NEW, &ulSum ); for( i = 0; i < globalModemPFTP.ChunkSize; i++ ){ if( globalModemPFTP.File.Attributes & EOF ){ break; } // if ucByte = fileGetChar( &globalModemPFTP.File ); // feed each byte sent to PDIA Encoder pdiaEncode( ucByte, PDIA_ADD, &ulSum ); print( MODEM_COM, "%2X", ucByte ); // send in bar uppercase hex with no prefix } // for // PDIA will not increment the frame if only 256 bytes are sent pdiaEncode( 0, PDIA_END, &ulSum ); // Close out PDIA print( MODEM_COM, "+%d+%08X", i, ulSum ); print( MODEM_COM, " HTTP/1.1%s", (u8*)AT_CRLF ); print( MODEM_COM, "Host: %s%s%s", globalModemPFTP.HostName, (u8*)AT_CRLF, (u8*)AT_CRLF ); }
void main( void ) { PYGMYFILE pygmyFile; u8 i, ucStatus, ucBuffer[ 65 ], *ucSubString; sysInit(); print( COM3, "\rUpdating bootloader, cancel boot after completion" ); print( COM3, "\rOpening Resource..." ); if( !fileOpenResource( &pygmyFile, (u8*)PYGMY_boothex ) ){ print( COM3, "\rFile Failed to Open" ); } else{ print( COM3, "\rErasing..." ); for( i = 0; i < 8; i++ ){ fpecErasePage( i ); } // for; print( COM3, "\rFlashing..." ); for( ucStatus = 0; !( fileIsEOF( &pygmyFile ) ) && ucStatus != 0xFF; ){ for( i = 0; i < 64; i++ ){ ucBuffer[ i ] = fileGetChar( &pygmyFile ); if( ucBuffer[ i ] == '\r' ){ ucBuffer[ i ] = '\0'; ucSubString = getNextSubString( (u8*)ucBuffer, WHITESPACE|NEWLINE ); // Add 1 to pointer before passing to skip the ':' packet start char ucStatus = fpecProcessIHEX( (u8*)( ucSubString + 1 ) ); break; // Time to fetch next IHEX entry } // if } // for } // for } // else print( COM3, "\rBootloader Updated" ); print( COM3, "\rReseting..." ); delay( 100 ); PYGMY_RESET; //boot(); }
u8 bootTestAndLoad( u32 Address, u8 *FileName ) { PYGMYFILE *File; u32 i, Length; u8 Buffer[ 64 ], *SubString, Status; File = fileOpen( FileName, READ, 0 ); if( !File ){ return( FALSE ); } // if //Length = fpecGetIHEXLength( FileName ); print( STDIO, "\rFlashing %d bytes to 0x%08", Length, Address ); fpecEraseProgramMemory(); print( STDIO, "..." ); for( Status = 0; !( File->Properties.Attributes & EOF ) && Status != 0xFF; ){ for( i = 0; i < 64; i++ ){ Buffer[ i ] = fileGetChar( File ); if( Buffer[ i ] == '\r' ){ Buffer[ i ] = '\0'; SubString = getNextSubString( (u8*)Buffer, WHITESPACE|NEWLINE ); // Add 1 to pointer before passing to skip the ':' packet start char Status = fpecProcessIHEX( (u8*)( SubString + 1 ) ); break; // Time to fetch next IHEX entry } // if } // for } // for }
/** * Shell command () prints existing files or creates new ones. * @param args array of arguments * @return OK for success, SYSERR for syntax error */ command xsh_cat(int nargs, char *args[]) { int fd = 0; char c = 0; /* Output help, if '--help' argument was supplied */ if ((nargs == 2 && strncmp(args[1], "--help", 6) == 0) || (nargs > 3) || (nargs < 2)) { printf("Usage: cat [filename] or cat > [filename]\n"); printf("Print file contents or copy console input into new file.\n"); printf("\t--help\t display this help and exit\n"); return OK; } if (nargs == 2) { /* Cat a file */ fd = fileOpen(args[1]); if (SYSERR != fd) { fileSeek(fd, 0); while ((c = fileGetChar(fd)) != (char)SYSERR) { printf("%c", c); } } else { printf("File \"%s\" not found.\n", args[1]); } printf("\n\n"); return OK; } if (strncmp(args[1], ">", 2)) { printf("ERROR: Cannot read from \"%s\", only CONSOLE!\n", args[1]); return SYSERR; } if (SYSERR != fileOpen(args[2])) { printf("ERROR: file \"%s\" already exists!\n", args[2]); return SYSERR; } fd = fileCreate(args[2]); if (SYSERR == fd) { printf("ERROR creating file \"%s\"\n", args[2]); return SYSERR; } printf("Creating new file \"%s\". Enter ~ to exit.\n", args[2]); while ((c = getc(CONSOLE)) != '~') { filePutChar(fd, c); } fileClose(fd); return OK; }
u8 bootTest( void ) { // This function pre-tests every row in firmware file for corruption before erase and program u32 i; u8 ucBuffer[ 64 ], *ucSubString; //if( !fileOpen( &pygmyFile, (u8*)BOOT_filename, READ ) ){ // return( FALSE ); //} for( ; !( pygmyFile.Properties.Attributes & EOF ); ){ // Get an IHEX packet for( i = 0; i < 64; i++ ){ ucBuffer[ i ] = fileGetChar( &pygmyFile ); if( ucBuffer[ i ] == '\r' ){ ucBuffer[ i ] = '\0'; break; } // if } // for ucSubString = getNextSubString( ucBuffer, WHITESPACE|NEWLINE ); if( *(ucSubString++) != ':' ){ return( 0 ); } // if // Following works because the output cannot be longer than the input being converted convertHexEncodedStringToBuffer( ucSubString, ucSubString ); if( ucSubString[ 3 ] == IHEX_EOF ){ break; // We have reached EOF without error } //for( i = 0, ucCalculatedSum = 0; i < ucSubString[ 0 ]+4; i++ ){ // ucCalculatedSum += ucSubString[ i ]; //} // for //ucCalculatedSum = 1 + ( 0xFF ^ (u8)ucCalculatedSum ); //if( (u8)ucCalculatedSum != ucSubString[ i ] ){ // Last short is checksum if( sysCRC8( ucSubString, ucSubString[ 0 ]+4 ) != ucSubString[ i ] ){ // Last short is checksum return( FALSE ); // Corrupt HEX Row } // if i = ( (u16)ucSubString[ 1 ] << 8 ) + ucSubString[ 2 ]; if( ucSubString[ 3 ] == IHEX_DATA && i < 0x2000 ){ return( 0 ); } // if } // for //putstr( (u8*)BOOT_OK ); print( STDIO, (u8*)BOOT_OK ); return( 1 ); }
u8 bootTest( PYGMYFILE *pygmyFile ) { // This function pre-tests every row in firmware file for corruption before erase and program u32 i; u8 ucBuffer[ 64 ], ucCalculatedSum, *ucSubString; for( ; !( fileIsEOF( pygmyFile ) ); ){ // Get an IHEX packet for( i = 0; i < 64; i++ ){ ucBuffer[ i ] = fileGetChar( pygmyFile ); if( ucBuffer[ i ] == '\r' ){ ucBuffer[ i ] = '\0'; break; } // if } // for ucSubString = getNextSubString( ucBuffer, WHITESPACE|NEWLINE ); if( *(ucSubString++) != ':' ){ return( 0 ); } // if // Following works because the output cannot be longer than the input being converted convertHexEncodedStringToBuffer( ucSubString, ucSubString ); if( ucSubString[ 3 ] == IHEX_EOF ){ break; // We have reached EOF without error } for( i = 0, ucCalculatedSum = 0; i < ucSubString[ 0 ]+4; i++ ){ ucCalculatedSum += ucSubString[ i ]; } // for ucCalculatedSum = 1 + ( 0xFF ^ (u8)ucCalculatedSum ); if( (u8)ucCalculatedSum != ucSubString[ i ] ){ // Last short is checksum return( 0 ); // Corrupt HEX Row } // if i = ( (u16)ucSubString[ 1 ] << 8 ) + ucSubString[ 2 ]; //if( ucSubString[ 3 ] == IHEX_DATA && i > 0x2000 ){ // return( 0 ); //} // if } // for return( 1 ); }