Code to load a LPC1114 over tx/rx. I have only tested with a 1114 chip but it should work with other LPC uControllers

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Files at this revision

API Documentation at this revision

Comitter:
okano
Date:
Wed Dec 10 09:24:00 2014 +0000
Parent:
43:c7d6d62abc14
Child:
45:0520330a7528
Commit message:
LPC1768 and LPC1769 support added

Changed in this revision

_user_settings.h Show annotated file Show diff for this revision Revisions of this file
isp.cpp Show annotated file Show diff for this revision Revisions of this file
target_handling.h Show annotated file Show diff for this revision Revisions of this file
target_table.cpp Show annotated file Show diff for this revision Revisions of this file
target_table.h Show annotated file Show diff for this revision Revisions of this file
writing.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/_user_settings.h	Sat Oct 18 09:44:43 2014 +0000
+++ b/_user_settings.h	Wed Dec 10 09:24:00 2014 +0000
@@ -19,7 +19,7 @@
 
 //  suppress "command and result" monitoring output to terminal
 //  the "command and result" monitoring feature is made for debugging. 
-#define     SUPPRESS_COMMAND_RESULT_MESSAGE
+//#define     SUPPRESS_COMMAND_RESULT_MESSAGE
 
 
 //  enable "AUTO_PROGRAM_START" to let target starts the program after flash writing complete
--- a/isp.cpp	Sat Oct 18 09:44:43 2014 +0000
+++ b/isp.cpp	Wed Dec 10 09:24:00 2014 +0000
@@ -16,7 +16,6 @@
 BusOut          leds( LED4, LED3, LED2, LED1 );
 Ticker          success;
 
-
 int             file_size( FILE *fp );
 unsigned int    read_crp( FILE *fp );
 unsigned int    crp_check( FILE *fp );
@@ -36,7 +35,7 @@
         return ( ERROR_AT_TARGET_OPEN );
     }
 
-    printf( "  target device found : type       = \"%s\"\r\n",     tpp->type_name );
+    printf( "  target device found : type       = \"%s\"\r\n",      tpp->type_name );
     printf( "                        ID         =  0x%08X\r\n",     tpp->id );
     printf( "                        RAM size   =  %10d bytes\r\n", tpp->ram_size );
     printf( "                        flash size =  %10d bytes\r\n", tpp->flash_size );
@@ -52,7 +51,12 @@
     if ( !data_size )
         return ( ERROR_DATA_SIZE_ZERO );
 
-    last_sector = (data_size - 1) / tpp->sector_size;
+    for ( int i = 0; i < 32768; i += 4096 )
+        printf( "%10d : %2d\r\n", i, find_sector( i, tpp ) );
+        
+
+//  last_sector = (data_size - 1) / tpp->sector_size;
+    last_sector = find_sector( data_size - 1, tpp );
 
     if ( data_size < (CRP_WORD_OFFSET + sizeof( unsigned int )) ) {
         printf( "  CRP check is not performed because data size is less than 0x300(768) bytes\r\n" );
@@ -73,9 +77,8 @@
     printf( "  data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
     printf( "  resetting target\r\n" );
 
-
 #ifdef ENABLE_WRITING
-    if ( erase_sectors( last_sector ) )
+    if ( erase_sectors( find_sector( data_size - 1, tpp ) ) )
         return ( ERROR_AT_SECTOR_ERASE );
 
     printf( "\r\n  ==== flash writing ====\r\n" );
@@ -90,16 +93,28 @@
 #endif
 
 
-#ifdef ENABLE_VERIFYING
-    printf( "\r\n  ==== flash reading and verifying ====\r\n" );
+#if 0
+    if ( tpp->id == 0x26113F37 ) {
+        //  The MEMMAP register should be operated if want to verify the LPC176x flash data
+    }
+#endif
+
 
-    if ( err    = verify_flash( fp, tpp, &transferred_size ) )
-        return ( err );
+#ifdef ENABLE_VERIFYING
+    if ( (tpp->id == 0x26113F37) || (tpp->id == 0x26013F37) ) {
+        printf( "\r\n  ==== for the LPC176x, verification is not supported ====\r\n\r\n" );
+    } else {
+        printf( "\r\n  ==== flash reading and verifying ====\r\n" );
 
-    printf( "  -- %d bytes data are read and verified\r\n", transferred_size );
-    leds_off();
+        if ( err    = verify_flash( fp, tpp, &transferred_size ) )
+            return ( err );
+
+        printf( "  -- %d bytes data are read and verified\r\n", transferred_size );
+        leds_off();
+    }
 #else
     printf( "\r\n  ==== verifying has been skipped ====\r\n\r\n" );
+}
 #endif
 
 
--- a/target_handling.h	Sat Oct 18 09:44:43 2014 +0000
+++ b/target_handling.h	Wed Dec 10 09:24:00 2014 +0000
@@ -5,6 +5,7 @@
 #define     ENTER_TO_ISP_MODE   0
 #define     NO_ISP_MODE         1
 
+#define     SECTOR_SIZE_VALIABLE4Kx16_AND_32KxN     1
 
 target_param    *open_target( int baud_date );
 void            reset_target( int isp_pin_state );
--- a/target_table.cpp	Sat Oct 18 09:44:43 2014 +0000
+++ b/target_table.cpp	Wed Dec 10 09:24:00 2014 +0000
@@ -1,6 +1,8 @@
 #include    "mbed.h"
 #include    "target_table.h"
 
+#define     SECTOR_SIZE_VALIABLE4Kx16_AND_32KxN     1
+
 target_param    target_table[]  = {
     { "unknown ttarget",        0xFFFFFFFF, 1024,    4096, 4096, UUENCODE, 0x10000200 },
     { "LPC1114FN28(FDH28)/102", 0x0A40902B, 4096,   32768, 4096, UUENCODE, 0x10000200 },
@@ -15,22 +17,40 @@
     { "LPC822M101JHI33",        0x00008221, 4096,   16384, 1024, BINARY,   0x10000300 },
     { "LPC824M201JDH20",        0x00008242, 8192,   32768, 1024, BINARY,   0x10000300 },
     { "LPC822M101JDH20",        0x00008222, 4096,   16384, 1024, BINARY,   0x10000300 },
-
+///added for LPC176x series
+    { "LPC1769FBD100",          0x26113F37, 65536, 524288, SECTOR_SIZE_VALIABLE4Kx16_AND_32KxN, UUENCODE, 0x10000200 },
+    { "LPC1768FBD100",          0x26013F37, 65536, 524288, SECTOR_SIZE_VALIABLE4Kx16_AND_32KxN, UUENCODE, 0x10000200 },
 };
 
 target_param *find_target_param( char *device_id_string )
 {
     int     id;
-    
+
     id  = atoi( device_id_string );
-    
-    for ( int i = 1; i < (sizeof( target_table ) / sizeof( target_param )); i++ )
-    {
+
+    for ( int i = 1; i < (sizeof( target_table ) / sizeof( target_param )); i++ ) {
         if ( id == target_table[ i ].id )
             return ( &(target_table[ i ]) );
     }
-    
+
     //  return ( target_table );
     return ( NULL );
 }
 
+int find_sector( int data_size, target_param *tpp )
+{
+    switch ( tpp->sector_size ) {
+        case SECTOR_SIZE_VALIABLE4Kx16_AND_32KxN :
+            if ( data_size <= (4096 * 16) ) {
+                return ( data_size / 4096 );
+            } else {
+                data_size   -= (4096 * 16);
+                return ( (data_size / (4096 * 8)) + 16 );
+            }
+            //break;
+        default :
+            return ( data_size / tpp->sector_size );
+            //break;
+    }
+}
+
--- a/target_table.h	Sat Oct 18 09:44:43 2014 +0000
+++ b/target_table.h	Wed Dec 10 09:24:00 2014 +0000
@@ -21,7 +21,8 @@
 
 extern target_param    target_table[];
 
-target_param *find_target_param( char *device_id_string );
+target_param    *find_target_param( char *device_id_string );
+int             find_sector( int data_size, target_param *tpp );
 
 
 #endif  //  MBED_ISP__TARGET_TABLE__
--- a/writing.cpp	Sat Oct 18 09:44:43 2014 +0000
+++ b/writing.cpp	Wed Dec 10 09:24:00 2014 +0000
@@ -7,7 +7,7 @@
 #include    "isp.h"
 
 
-int     write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start, int *total_size_p );
+int     write_uuencoded_data( FILE *fp, target_param *tpp, int *total_size_p );
 int     write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start, int *total_size_p );
 int     get_flash_writing_size( int ram_size, unsigned int ram_start );
 
@@ -15,13 +15,16 @@
 int write_flash( FILE *fp, target_param *tpp, int *transferred_size_p )
 {
     if ( tpp->write_type == BINARY )
-        return ( write_binary_data( fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address, transferred_size_p ) );
+        return ( write_binary_data(  fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address, transferred_size_p ) );
     else // UUENCODE
-        return ( write_uuencoded_data(  fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address, transferred_size_p ) );
+        return ( write_uuencoded_data( fp, tpp, transferred_size_p ) );
 }
 
 
-int write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start, int *total_size_p )
+
+
+
+int write_uuencoded_data( FILE *fp, target_param *tpp, int *total_size_p )
 {
 #define     BYTES_PER_LINE      45
 
@@ -29,13 +32,16 @@
     long    checksum        = 0;
     int     size;
     int     total_size      = 0;
+    int     sector_number;
 
     int     flash_writing_size;
     int     lines_per_transfer;
     int     transfer_size;
 
     char    *b;
-
+    
+    int ram_size            = tpp->ram_size;
+    unsigned int ram_start  = tpp->ram_start_address;
 
     initialize_uue_table();
 
@@ -84,7 +90,11 @@
 
         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 );
+
+        sector_number   = find_sector( total_size, tpp );
+        sprintf( command_str, "P %d %d\r\n", sector_number, sector_number );
+        
         if ( try_and_check( command_str, "0" ) )
             return ( ERROR_AT_PREPARE_COMMAND );