Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Tue Sep 24 21:35:25 2013 +0000
Revision:
32:3700d5df4e18
Parent:
30:e0d7524661ca
Child:
33:ce9fff4cbf09
CRP checking code added (not tested yet)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 30:e0d7524661ca 1
okano 30:e0d7524661ca 2 #include "mbed.h"
okano 30:e0d7524661ca 3 #include "target_table.h"
okano 30:e0d7524661ca 4 #include "serial_utilities.h"
okano 30:e0d7524661ca 5 #include "command_interface.h"
okano 30:e0d7524661ca 6 #include "writing.h"
okano 30:e0d7524661ca 7 #include "uu_coding.h"
okano 30:e0d7524661ca 8 #include "target_handling.h"
okano 30:e0d7524661ca 9 #include "verification.h"
okano 30:e0d7524661ca 10 #include "isp.h"
okano 30:e0d7524661ca 11 #include "_user_settings.h"
okano 30:e0d7524661ca 12
okano 30:e0d7524661ca 13
okano 30:e0d7524661ca 14 BusOut leds( LED4, LED3, LED2, LED1 );
okano 30:e0d7524661ca 15 Ticker success;
okano 30:e0d7524661ca 16
okano 30:e0d7524661ca 17
okano 32:3700d5df4e18 18 int file_size( FILE *fp );
okano 32:3700d5df4e18 19 unsigned int crp_check( FILE *fp );
okano 32:3700d5df4e18 20 void success_indicator();
okano 30:e0d7524661ca 21
okano 30:e0d7524661ca 22 int isp_flash_write( char *file_name )
okano 30:e0d7524661ca 23 {
okano 30:e0d7524661ca 24 FILE *fp;
okano 30:e0d7524661ca 25 target_param *tpp;
okano 30:e0d7524661ca 26 int data_size;
okano 30:e0d7524661ca 27 int last_sector;
okano 30:e0d7524661ca 28 int transferred_size;
okano 30:e0d7524661ca 29 int err;
okano 30:e0d7524661ca 30
okano 30:e0d7524661ca 31 if ( NULL == (tpp = open_target( ISP_BAUD_RATE )) ) {
okano 30:e0d7524661ca 32 return ( ERROR_AT_TARGET_OPEN );
okano 30:e0d7524661ca 33 }
okano 30:e0d7524661ca 34
okano 30:e0d7524661ca 35 printf( " target device found : type = \"%s\"\r\n", tpp->type_name );
okano 30:e0d7524661ca 36 printf( " ID = 0x%08X\r\n", tpp->id );
okano 30:e0d7524661ca 37 printf( " RAM size = %10d bytes\r\n", tpp->ram_size );
okano 30:e0d7524661ca 38 printf( " flash size = %10d bytes\r\n", tpp->flash_size );
okano 30:e0d7524661ca 39
okano 30:e0d7524661ca 40 printf( " opening file: \"%s\"\r\n", file_name );
okano 30:e0d7524661ca 41
okano 30:e0d7524661ca 42 if ( NULL == (fp = fopen( file_name, "rb" )) ) {
okano 30:e0d7524661ca 43 return ( ERROR_AT_FILE_OPEN );
okano 30:e0d7524661ca 44 }
okano 30:e0d7524661ca 45
okano 30:e0d7524661ca 46 data_size = file_size( fp );
okano 30:e0d7524661ca 47 last_sector = data_size / tpp->sector_size;
okano 32:3700d5df4e18 48
okano 32:3700d5df4e18 49 if ( crp_check( fp ) )
okano 32:3700d5df4e18 50 {
okano 32:3700d5df4e18 51 // warn CRP
okano 32:3700d5df4e18 52 }
okano 30:e0d7524661ca 53
okano 30:e0d7524661ca 54 printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
okano 30:e0d7524661ca 55 printf( " resetting target\r\n" );
okano 30:e0d7524661ca 56
okano 30:e0d7524661ca 57 if ( erase_sectors( last_sector ) )
okano 30:e0d7524661ca 58 return ( ERROR_AT_SECTOR_ERASE );
okano 30:e0d7524661ca 59
okano 30:e0d7524661ca 60 printf( "\r\n ==== flash writing ====\r\n" );
okano 30:e0d7524661ca 61
okano 30:e0d7524661ca 62 if ( err = write_flash( fp, tpp, &transferred_size ) )
okano 30:e0d7524661ca 63 return ( err );
okano 30:e0d7524661ca 64
okano 30:e0d7524661ca 65 printf( " -- %d bytes data are written\r\n", transferred_size );
okano 30:e0d7524661ca 66
okano 30:e0d7524661ca 67
okano 30:e0d7524661ca 68 printf( "\r\n ==== flash reading and verifying ====\r\n" );
okano 30:e0d7524661ca 69
okano 30:e0d7524661ca 70 if ( err = verify_flash( fp, tpp, &transferred_size ) )
okano 30:e0d7524661ca 71 return ( err );
okano 30:e0d7524661ca 72
okano 30:e0d7524661ca 73 printf( " -- %d bytes data are read and verified\r\n", transferred_size );
okano 30:e0d7524661ca 74
okano 30:e0d7524661ca 75 fclose( fp );
okano 30:e0d7524661ca 76
okano 30:e0d7524661ca 77 post_writing_process( tpp );
okano 30:e0d7524661ca 78
okano 30:e0d7524661ca 79 return ( 0 );
okano 30:e0d7524661ca 80 }
okano 30:e0d7524661ca 81
okano 30:e0d7524661ca 82
okano 30:e0d7524661ca 83 int file_size( FILE *fp )
okano 30:e0d7524661ca 84 {
okano 30:e0d7524661ca 85 int size;
okano 30:e0d7524661ca 86
okano 30:e0d7524661ca 87 fseek( fp, 0, SEEK_END ); // seek to end of file
okano 30:e0d7524661ca 88 size = ftell( fp ); // get current file pointer
okano 30:e0d7524661ca 89 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 30:e0d7524661ca 90
okano 30:e0d7524661ca 91 return size;
okano 30:e0d7524661ca 92 }
okano 30:e0d7524661ca 93
okano 30:e0d7524661ca 94
okano 32:3700d5df4e18 95 unsigned int crp_check( FILE *fp )
okano 32:3700d5df4e18 96 {
okano 32:3700d5df4e18 97 unsigned int crp;
okano 32:3700d5df4e18 98
okano 32:3700d5df4e18 99 fseek( fp, 0x2FC, SEEK_SET ); // seek back to beginning of file
okano 32:3700d5df4e18 100
okano 32:3700d5df4e18 101 if ( 1 != fread( &crp, sizeof( crp ), 1, fp ) )
okano 32:3700d5df4e18 102 return ( CRP_CHECK_ERROR );
okano 32:3700d5df4e18 103
okano 32:3700d5df4e18 104 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 32:3700d5df4e18 105
okano 32:3700d5df4e18 106 switch ( crp ) {
okano 32:3700d5df4e18 107 case NO_ISP :
okano 32:3700d5df4e18 108 case CRP1 :
okano 32:3700d5df4e18 109 case CRP2 :
okano 32:3700d5df4e18 110 case CRP3 :
okano 32:3700d5df4e18 111 /* do nothing */
okano 32:3700d5df4e18 112 break;
okano 32:3700d5df4e18 113 default :
okano 32:3700d5df4e18 114 crp = 0x0;
okano 32:3700d5df4e18 115 }
okano 32:3700d5df4e18 116
okano 32:3700d5df4e18 117 return ( crp );
okano 32:3700d5df4e18 118 }
okano 32:3700d5df4e18 119
okano 32:3700d5df4e18 120
okano 30:e0d7524661ca 121 void start_target_in_normal_mode( int baud_rate )
okano 30:e0d7524661ca 122 {
okano 30:e0d7524661ca 123 set_target_baud_rate( baud_rate );
okano 30:e0d7524661ca 124 reset_target( NO_ISP_MODE );
okano 30:e0d7524661ca 125 }
okano 30:e0d7524661ca 126
okano 30:e0d7524661ca 127 void start_success_indicator( void )
okano 30:e0d7524661ca 128 {
okano 30:e0d7524661ca 129 success.attach( &success_indicator, 0.1 );
okano 30:e0d7524661ca 130 }
okano 30:e0d7524661ca 131
okano 30:e0d7524661ca 132 void success_indicator()
okano 30:e0d7524661ca 133 {
okano 30:e0d7524661ca 134 static int i = 0;
okano 30:e0d7524661ca 135
okano 30:e0d7524661ca 136 leds = 0x1 << (i++ & 0x3);
okano 30:e0d7524661ca 137 }
okano 30:e0d7524661ca 138
okano 30:e0d7524661ca 139
okano 30:e0d7524661ca 140 void toggle_led( char v )
okano 30:e0d7524661ca 141 {
okano 30:e0d7524661ca 142 leds = leds ^ (0x1 << v);
okano 30:e0d7524661ca 143 }
okano 30:e0d7524661ca 144