Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Revision:
6:0ae6fe8c8512
Parent:
5:ff30f5b58617
Child:
7:815366f003ee
--- a/main.cpp	Sun Aug 25 01:49:08 2013 +0000
+++ b/main.cpp	Sun Aug 25 02:54:53 2013 +0000
@@ -13,14 +13,39 @@
 #define     BAUD_RATE           115200
 
 #define     STR_BUFF_SIZE       64
-//#define     RAM_START_ADDRESS   0x10000300L
-#define     RAM_START_ADDRESS   0x10000200L
+#define     RAM_START_ADDRESS   0x10000000
+#define     RAM_WRITE_OFFSET    0x200
+#define     RAM_WRITE_START     (RAM_START_ADDRESS + RAM_WRITE_OFFSET)
 #define     SECTOR_SIZE         4096
 
-//#define     FLASH_WRITING_SIZE  1024            //  This value should be 256, 512, 1024 or 4096
-#define     FLASH_WRITING_SIZE  256            //  This value should be 256, 512, 1024 or 4096
-#define     LINES_PER_TRANSFER  (((FLASH_WRITING_SIZE / 45) + 3) & ~0x3)
-#define     TRANSFER_SIZE       (LINES_PER_TRANSFER * 45)
+//#define     FLASH_WRITING_SIZE  1024          //  This value should be 256, 512, 1024 or 4096
+#define     FLASH_WRITING_SIZE  512             //  This value should be 256, 512, 1024 or 4096
+#define     BYTES_PER_LINE      45
+#define     LINES_PER_TRANSFER  (((FLASH_WRITING_SIZE / BYTES_PER_LINE) + 3) & ~0x3)
+#define     TRANSFER_SIZE       (LINES_PER_TRANSFER * BYTES_PER_LINE)
+
+
+
+int get_flash_writing_size( int ram_size )
+{
+    int flash_writing_size[]    = {
+        4096,
+        1024,
+        512,
+        256
+    };
+    int     available_size;
+    int     i;
+
+    available_size  = ram_size - RAM_WRITE_OFFSET;
+
+    for ( i = 0; i < sizeof( flash_writing_size ) / sizeof( int ); i++ ) {
+        if ( flash_writing_size[ i ] < available_size )
+            break;
+    }
+
+    return ( flash_writing_size[ i ] );
+}
 
 
 enum {
@@ -110,9 +135,9 @@
     long            checksum    = 0;
     int             strpos      = 0;
 
-    *(str + strpos++) = ' ' + 45;
+    *(str + strpos++) = ' ' + BYTES_PER_LINE;
 
-    for ( int i = 0; i < 45; i += 3 ) {
+    for ( int i = 0; i < BYTES_PER_LINE; i += 3 ) {
         checksum    += *(bin + i + 0) + *(bin + i + 1) + *(bin + i + 2);
         v   = (*(bin + i + 0) << 16) | (*(bin + i + 1) << 8) | (*(bin + i + 2) << 0);
         *(str + strpos++) = uue_table[ (v >> 18) & 0x3F ];
@@ -170,9 +195,7 @@
 }
 
 
-char    b[ TRANSFER_SIZE ];
-
-void write_binary_data( FILE *fp )
+int write_binary_data( FILE *fp, int ram_size )
 {
     char    command_str[ STR_BUFF_SIZE ];
     long    checksum        = 0;
@@ -180,12 +203,27 @@
     int     total_size      = 0;
     int     size;
 
+    int     flash_writing_size;
+    int     lines_per_transfer;
+    int     transfer_size;
+
     initialize_uue_table();
 
-    for ( int i = FLASH_WRITING_SIZE; i < TRANSFER_SIZE; i++ )
+    flash_writing_size  = get_flash_writing_size( ram_size );
+    lines_per_transfer=(((flash_writing_size / BYTES_PER_LINE) + 3) & ~0x3);
+    transfer_size=(lines_per_transfer * BYTES_PER_LINE);
+
+    //  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" );
+
+    for ( int i = flash_writing_size; i < transfer_size; i++ )
         b[ i ]  = 0;    //  this is not neccesary but just stuffing stuffing bytes
 
-    while ( size    = fread( b, sizeof( char ), FLASH_WRITING_SIZE, fp ) ) {
+    while ( size    = fread( b, sizeof( char ), flash_writing_size, fp ) ) {
 
         if ( !total_size ) {
             //  overwriting 4 bytes data for address=0x1C
@@ -193,11 +231,11 @@
             add_isp_checksum( b );
         }
 
-        sprintf( command_str, "W %ld %ld\r\n", RAM_START_ADDRESS, TRANSFER_SIZE );
+        sprintf( command_str, "W %ld %ld\r\n", RAM_WRITE_START, transfer_size );
         try_and_check( command_str, "0", 0 );
 
-        for ( int i = 0; i < LINES_PER_TRANSFER; i++ ) {
-            checksum   += bin2uue( b + (i * 45), command_str );
+        for ( int i = 0; i < lines_per_transfer; i++ ) {
+            checksum   += bin2uue( b + (i * BYTES_PER_LINE), command_str );
 
             printf( "%02d %s\r", i, command_str );
 
@@ -215,12 +253,16 @@
         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_ADDRESS, FLASH_WRITING_SIZE );
+        sprintf( command_str, "C %d %d %d\r\n", total_size, RAM_WRITE_START, flash_writing_size );
         try_and_check( command_str, "0", 0 );
 
         total_size  += size;
     }
+
     try_and_check( "G 0 T\r\n", "0", 0 );
+    free( b );
+    
+    return ( transfer_count );
 }
 
 int file_size( FILE *fp )
@@ -287,11 +329,11 @@
     tpp  = find_target_param( str_buf0 );
     printf( "target device found : type       = \"%s\"\r\n",   tpp->type_name );
     printf( "                      ID         = 0x%08X\r\n", tpp->id );
-    printf( "                      RAM size   = %7d bytes\r\n", tpp->ram_size );
-    printf( "                      flash size = %7d bytes\r\n", tpp->flash_size );
+    printf( "                      RAM size   = %10d bytes\r\n", tpp->ram_size );
+    printf( "                      flash size = %10d bytes\r\n", tpp->flash_size );
 
     erase_sectors( last_sector );
-    write_binary_data( fp );
+    write_binary_data( fp, tpp->ram_size );
 
     fclose( fp );