Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Revision:
12:5a33b5d39792
Parent:
11:8dfc3217d1ca
Child:
13:60995bf8b2c7
--- a/main.cpp	Tue Aug 27 03:09:07 2013 +0000
+++ b/main.cpp	Tue Aug 27 05:47:02 2013 +0000
@@ -2,13 +2,8 @@
  *  Sample of ISP operation for NXP MCUs
  *
  *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
- *  @version 1.0
+ *  @version 0.5
  *  @date    Aug-2013
- *
- *  ISP
- *
- *
- *
  */
 
 #include    "mbed.h"
@@ -20,30 +15,17 @@
 Serial          target ( p28, p27 );
 LocalFileSystem local( "local" );
 
+#define     ENTER_TO_ISP_MODE   0
+#define     NO_ISP_MODE         1
+#define     STR_BUFF_SIZE       64
+
 #define     SOURCE_FILE         "/local/bin"
 #define     BAUD_RATE           115200
 //#define     BAUD_RATE           57600
 //#define     BAUD_RATE           9600
 
-#define     SECTOR_SIZE         4096
-#define     RAM_START_ADDRESS   0x10000000
-
-//#define     RAM_WRITE_OFFSET    0x130
-#define     RAM_WRITE_OFFSET    0x200
-#define     RAM_WRITE_START     (RAM_START_ADDRESS + RAM_WRITE_OFFSET)
-#define     BYTES_PER_LINE      45
-#define     STR_BUFF_SIZE       64
-
-#pragma diag_suppress 1293  //  surpressing a warning message of "assignment in condition" ;)
-
-char    uue_table[ 64 ];
 int     error_state         = 0;
 
-enum {
-    ENTER_TO_ISP_MODE,
-    NO_ISP_MODE
-};
-
 int     file_size( FILE *fp );
 void    reset_target( int isp_pin_state );
 int     try_and_check( char *command, char *expected_return_str, int mode );
@@ -52,15 +34,19 @@
 void    print_result( int r );
 char    read_byte( void );
 void    erase_sectors( int last_sector );
-int     write_binary_data( FILE *fp, int ram_size );
+int     write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int  );
+int     write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start );
 void    initialize_uue_table( void );
 long    bin2uue( char *bin, char *str, int size );
-int     get_flash_writing_size( int ram_size );
+int     get_flash_writing_size( int ram_size, unsigned int ram_start );
 void    add_isp_checksum( char *b );
 void    send_RAM_transfer_checksum( int checksum );
 void    put_string( char *s );
+void    put_binary( char *b, int size );
 void    get_string( char *s );
 
+#pragma diag_suppress 1293  //  surpressing a warning message of "assignment in condition" ;)
+
 
 int main()
 {
@@ -75,19 +61,6 @@
 
     target.baud( BAUD_RATE );
 
-    printf( "  opening file: \"%s\"\r\n", SOURCE_FILE );
-
-    if ( NULL == (fp    = fopen( SOURCE_FILE, "rb" )) ) {
-        error( "couldn't open source file" );
-        return ( 1 );
-    }
-
-    data_size   = file_size( fp );
-    last_sector = data_size / SECTOR_SIZE;
-
-    printf( "  data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
-    printf( "  resetting target\r\n" );
-
     reset_target( ENTER_TO_ISP_MODE );
 
     try_and_check( "?", "Synchronized", 0 );
@@ -114,9 +87,26 @@
     printf( "                        RAM size   = %10d bytes\r\n", tpp->ram_size );
     printf( "                        flash size = %10d bytes\r\n", tpp->flash_size );
 
+    printf( "  opening file: \"%s\"\r\n", SOURCE_FILE );
+
+    if ( NULL == (fp    = fopen( SOURCE_FILE, "rb" )) ) {
+        error( "couldn't open source file" );
+        return ( 1 );
+    }
+
+    data_size   = file_size( fp );
+    last_sector = data_size / tpp->sector_size;
+
+    printf( "  data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
+    printf( "  resetting target\r\n" );
+
     erase_sectors( last_sector );
-    write_binary_data( fp, tpp->ram_size );
- 
+
+    if ( tpp->write_type == BINARY )
+        write_binary_data( fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address );
+    else // UUENCODE
+        write_uuencoded_data(  fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address );
+
     fclose( fp );
 
     printf( "\r\n  %s\r\n\r\n",
@@ -242,12 +232,13 @@
     try_and_check( command_str, "0", 0 );
 }
 
+#define     BYTES_PER_LINE      45
+char        uue_table[ 64 ];
 
-int write_binary_data( FILE *fp, int ram_size )
+int write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start )
 {
     char    command_str[ STR_BUFF_SIZE ];
     long    checksum        = 0;
-    int     transfer_count  = 0;
     int     total_size      = 0;
     int     size;
 
@@ -255,17 +246,16 @@
     int     lines_per_transfer;
     int     transfer_size;
 
+    char    *b;
+
     initialize_uue_table();
 
-    flash_writing_size  = get_flash_writing_size( ram_size );
-    //lines_per_transfer  = (((flash_writing_size / BYTES_PER_LINE) + 3) & ~0x3);
+    flash_writing_size  = get_flash_writing_size( ram_size, ram_start );
     lines_per_transfer  = ((flash_writing_size / BYTES_PER_LINE) + 1);
     transfer_size       = (((flash_writing_size + 11) / 12) * 12);
 
     //  char    b[ transfer_size ]; // this can be done in mbed-compiler. but I should do it in common way
 
-    char    *b;
-
     if ( NULL == (b = (char *)malloc( transfer_size * sizeof( char ) )) )
         error( "malloc error happened\r\n" );
 
@@ -280,15 +270,14 @@
             add_isp_checksum( b );
         }
 
-        sprintf( command_str, "W %ld %ld\r\n", RAM_WRITE_START, transfer_size );
+        sprintf( command_str, "W %ld %ld\r\n", ram_start, transfer_size );
         try_and_check( command_str, "0", 0 );
 
         for ( int i = 0; i < lines_per_transfer; i++ ) {
-        
+
             checksum   += bin2uue( b + (i * BYTES_PER_LINE), command_str, i == (lines_per_transfer - 1) ? (transfer_size % BYTES_PER_LINE) : BYTES_PER_LINE );
 
-            printf( "  data -- %02d %s\r", i, command_str );
-            printf( "  (%d)\r\n", i == (lines_per_transfer - 1) ? (transfer_size % BYTES_PER_LINE) : BYTES_PER_LINE );
+//            printf( "  data -- %02d %s\r", i, command_str );
 
             put_string( command_str );
 
@@ -301,10 +290,10 @@
         send_RAM_transfer_checksum( checksum );
         checksum   = 0;
 
-        sprintf( command_str, "P %d %d\r\n", total_size / SECTOR_SIZE, total_size / SECTOR_SIZE );
+        sprintf( command_str, "P %d %d\r\n", total_size / sector_size, total_size / sector_size );
         try_and_check( command_str, "0", 0 );
 
-        sprintf( command_str, "C %d %d %d\r\n", total_size, RAM_WRITE_START, flash_writing_size );
+        sprintf( command_str, "C %d %d %d\r\n", total_size, ram_start, flash_writing_size );
         try_and_check( command_str, "0", 0 );
 
         total_size  += size;
@@ -313,10 +302,53 @@
     try_and_check( "G 0 T\r\n", "0", 0 );
     free( b );
 
-    return ( transfer_count );
+    return ( total_size );
 }
 
 
+int write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start )
+{
+    char    command_str[ STR_BUFF_SIZE ];
+    int     total_size      = 0;
+    int     size;
+    int     flash_writing_size;
+    char    *b;
+
+    flash_writing_size  = 256;
+
+    if ( NULL == (b     = (char *)malloc( flash_writing_size * sizeof( char ) )) )
+        error( "malloc error happened\r\n" );
+
+    while ( size    = fread( b, sizeof( char ), flash_writing_size, fp ) ) {
+
+        if ( !total_size ) {
+            //  overwriting 4 bytes data for address=0x1C
+            //  there is a slot for checksum that is checked in (target's) boot process
+            add_isp_checksum( b );
+        }
+
+        sprintf( command_str, "W %ld %ld\r\n", ram_start, flash_writing_size );
+        try_and_check( command_str, "0", 0 );
+
+        put_binary( b, flash_writing_size );
+        put_string( "\r\n" );
+
+        sprintf( command_str, "P %d %d\r\n", total_size / sector_size, total_size / sector_size );
+        try_and_check( command_str, "0", 0 );
+
+        sprintf( command_str, "C %d %d %d\r\n", total_size, ram_start, flash_writing_size );
+        try_and_check( command_str, "0", 0 );
+
+        total_size  += size;
+        printf( "  total %d bytes transferred\r", total_size );
+
+    }
+
+    free( b );
+
+    return ( total_size );
+}
+
 void initialize_uue_table( void )
 {
     int     i;
@@ -352,7 +384,7 @@
 }
 
 
-int get_flash_writing_size( int ram_size )
+int get_flash_writing_size( int ram_size, unsigned int ram_start )
 {
     int flash_writing_size[]    = {
         4096,
@@ -363,7 +395,7 @@
     int     available_size;
     int     i;
 
-    available_size  = ram_size - RAM_WRITE_OFFSET;
+    available_size  = ram_size - (ram_start & 0xFFFF);
 
     for ( i = 0; i < sizeof( flash_writing_size ) / sizeof( int ); i++ ) {
         if ( flash_writing_size[ i ] < available_size )
@@ -417,6 +449,13 @@
 }
 
 
+void put_binary( char *b, int size )
+{
+    for ( int i = 0; i < size; i++ )
+        target.putc( *b++ );
+}
+
+
 Timeout timeout;
 
 int timeout_flag    = 0;
@@ -455,4 +494,3 @@
     *s  = '\0';
 }
 
-