Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Fri Sep 13 12:56:23 2013 +0000
Revision:
26:a63e73885b21
Parent:
25:33cb5ad8ae24
Child:
27:2b5c1eb39bb5
code is still dirty but it works. I hope I will have chance to clean up some day...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 11:8dfc3217d1ca 1 /**
okano 11:8dfc3217d1ca 2 * Sample of ISP operation for NXP MCUs
okano 11:8dfc3217d1ca 3 *
okano 14:a7b9f74fb856 4 * @author Tedd OKANO
okano 26:a63e73885b21 5 * @version 0.9
okano 18:b401da200216 6 * @date Sep-2013
okano 26:a63e73885b21 7 *
okano 26:a63e73885b21 8 * This program programs MCU flash memory through UART. It uses
okano 14:a7b9f74fb856 9 * "In-System Programming (ISP)" interface in target MCU (NXP LPC micro-
okano 14:a7b9f74fb856 10 * controllers).
okano 26:a63e73885b21 11 *
okano 26:a63e73885b21 12 * The ISP is done by PC and serial cable normally. The ISP protocol is
okano 14:a7b9f74fb856 13 * executed software on a PC. The software reads a data file and transfers
okano 26:a63e73885b21 14 * the data with the ISP protocol.
okano 26:a63e73885b21 15 * This program does same process of that. The mbed perform the function like
okano 14:a7b9f74fb856 16 * "FlashMagic" and "lpc21isp".
okano 26:a63e73885b21 17 * (This program not just copies the binary but also insert 4 byte checksum at
okano 14:a7b9f74fb856 18 * address 0x1C.)
okano 26:a63e73885b21 19 *
okano 26:a63e73885b21 20 * This program currently supports LPC1114(LPC1114FN28/102 - DIP28-ARM) and
okano 14:a7b9f74fb856 21 * LPC810(LPC810M021FN8 - DIP8-ARM).
okano 11:8dfc3217d1ca 22 */
okano 11:8dfc3217d1ca 23
okano 5:ff30f5b58617 24 #include "mbed.h"
okano 5:ff30f5b58617 25 #include "target_table.h"
okano 22:bd98a782fba6 26 #include "serial_utilities.h"
okano 22:bd98a782fba6 27 #include "command_interface.h"
okano 22:bd98a782fba6 28 #include "writing.h"
okano 22:bd98a782fba6 29 #include "uu_coding.h"
okano 23:017f306cf3ca 30 #include "target_handling.h"
okano 24:9830b4f1207b 31 #include "verification.h"
okano 25:33cb5ad8ae24 32 #include "_user_settings.h"
okano 21:e149d0bdbf4a 33 #include "ika.h"
okano 21:e149d0bdbf4a 34
okano 2:8d75eb0ecd20 35 BusOut leds( LED4, LED3, LED2, LED1 );
okano 2:8d75eb0ecd20 36 LocalFileSystem local( "local" );
okano 16:cac2348cfcfb 37 Ticker success;
okano 0:6baefda2e511 38
okano 8:b220fadbb3d8 39 int error_state = 0;
okano 7:815366f003ee 40
okano 20:98d7b5878e3e 41 int post_writing_process( target_param *tpp );
okano 7:815366f003ee 42 int file_size( FILE *fp );
okano 7:815366f003ee 43 char read_byte( void );
okano 16:cac2348cfcfb 44 void success_indicator();
okano 7:815366f003ee 45
okano 19:7a7381e78025 46
okano 7:815366f003ee 47 int main()
okano 7:815366f003ee 48 {
okano 7:815366f003ee 49 FILE *fp;
okano 20:98d7b5878e3e 50 target_param *tpp;
okano 7:815366f003ee 51 int data_size;
okano 7:815366f003ee 52 int last_sector;
okano 8:b220fadbb3d8 53
okano 7:815366f003ee 54 printf( "\r\n\r\n\r\nmbed ISP program : programming LPC device from mbed\r\n" );
okano 7:815366f003ee 55
okano 26:a63e73885b21 56 if ( NULL == (tpp = open_target( ISP_BAUD_RATE )) ) {
okano 20:98d7b5878e3e 57 error( "couldn't open the taget" );
okano 20:98d7b5878e3e 58 return ( 1 );
okano 20:98d7b5878e3e 59 }
okano 8:b220fadbb3d8 60
okano 8:b220fadbb3d8 61 printf( " target device found : type = \"%s\"\r\n", tpp->type_name );
okano 8:b220fadbb3d8 62 printf( " ID = 0x%08X\r\n", tpp->id );
okano 8:b220fadbb3d8 63 printf( " RAM size = %10d bytes\r\n", tpp->ram_size );
okano 8:b220fadbb3d8 64 printf( " flash size = %10d bytes\r\n", tpp->flash_size );
okano 8:b220fadbb3d8 65
okano 12:5a33b5d39792 66 printf( " opening file: \"%s\"\r\n", SOURCE_FILE );
okano 12:5a33b5d39792 67
okano 12:5a33b5d39792 68 if ( NULL == (fp = fopen( SOURCE_FILE, "rb" )) ) {
okano 12:5a33b5d39792 69 error( "couldn't open source file" );
okano 12:5a33b5d39792 70 return ( 1 );
okano 12:5a33b5d39792 71 }
okano 12:5a33b5d39792 72
okano 12:5a33b5d39792 73 data_size = file_size( fp );
okano 12:5a33b5d39792 74 last_sector = data_size / tpp->sector_size;
okano 12:5a33b5d39792 75
okano 12:5a33b5d39792 76 printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
okano 12:5a33b5d39792 77 printf( " resetting target\r\n" );
okano 12:5a33b5d39792 78
okano 7:815366f003ee 79 erase_sectors( last_sector );
okano 12:5a33b5d39792 80
okano 26:a63e73885b21 81 printf( "\r\n ==== flash writing ====\r\n" );
okano 20:98d7b5878e3e 82 write_flash( fp, tpp );
okano 26:a63e73885b21 83
okano 26:a63e73885b21 84 printf( "\r\n ==== flash reading and verifying ====\r\n" );
okano 20:98d7b5878e3e 85 verify_flash( fp, tpp );
okano 12:5a33b5d39792 86
okano 7:815366f003ee 87 fclose( fp );
okano 8:b220fadbb3d8 88
okano 8:b220fadbb3d8 89 printf( "\r\n %s\r\n\r\n",
okano 8:b220fadbb3d8 90 error_state ?
okano 8:b220fadbb3d8 91 "** The data could not be written :(" :
okano 8:b220fadbb3d8 92 "** The data has been written successflly :)"
okano 8:b220fadbb3d8 93 );
okano 26:a63e73885b21 94
okano 19:7a7381e78025 95 if ( error_state )
okano 19:7a7381e78025 96 error( " ** ISP failed\r\n" );
okano 26:a63e73885b21 97
okano 20:98d7b5878e3e 98 post_writing_process( tpp );
okano 20:98d7b5878e3e 99
okano 8:b220fadbb3d8 100
okano 14:a7b9f74fb856 101 #ifdef AUTO_PROGRAM_START
okano 21:e149d0bdbf4a 102 set_target_baud_rate( TARGET_OPERATION_BAUD_RATE );
okano 16:cac2348cfcfb 103
okano 14:a7b9f74fb856 104 reset_target( NO_ISP_MODE );
okano 16:cac2348cfcfb 105 printf( " ** The program in flash has been started!!\r\n" );
okano 14:a7b9f74fb856 106 #endif
okano 14:a7b9f74fb856 107
okano 16:cac2348cfcfb 108 printf( " (now the mbed is working in \"serial through mode\")\r\n\r\n" );
okano 16:cac2348cfcfb 109
okano 16:cac2348cfcfb 110 success.attach( &success_indicator, 0.1 );
okano 16:cac2348cfcfb 111
okano 21:e149d0bdbf4a 112 usb_serial_bridge_operation(); // doesn't return. infinite loop in this function
okano 20:98d7b5878e3e 113 }
okano 16:cac2348cfcfb 114
okano 20:98d7b5878e3e 115
okano 22:bd98a782fba6 116 int post_writing_process( target_param *tpp )
okano 22:bd98a782fba6 117 {
okano 22:bd98a782fba6 118 if ( tpp->write_type == UUENCODE )
okano 26:a63e73885b21 119 return ( try_and_check( "G 0 T\r\n", "0", 0 ) );
okano 26:a63e73885b21 120 else
okano 26:a63e73885b21 121 return ( 0 );
okano 22:bd98a782fba6 122 }
okano 22:bd98a782fba6 123
okano 22:bd98a782fba6 124
okano 22:bd98a782fba6 125 int file_size( FILE *fp )
okano 22:bd98a782fba6 126 {
okano 22:bd98a782fba6 127 int size;
okano 22:bd98a782fba6 128
okano 22:bd98a782fba6 129 fseek( fp, 0, SEEK_END ); // seek to end of file
okano 22:bd98a782fba6 130 size = ftell( fp ); // get current file pointer
okano 22:bd98a782fba6 131 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 22:bd98a782fba6 132
okano 22:bd98a782fba6 133 return size;
okano 22:bd98a782fba6 134 }
okano 22:bd98a782fba6 135
okano 22:bd98a782fba6 136
okano 16:cac2348cfcfb 137 void success_indicator()
okano 16:cac2348cfcfb 138 {
okano 16:cac2348cfcfb 139 static int i = 0;
okano 26:a63e73885b21 140
okano 16:cac2348cfcfb 141 leds = 0x1 << (i++ & 0x3);
okano 16:cac2348cfcfb 142 }
okano 21:e149d0bdbf4a 143
okano 21:e149d0bdbf4a 144
okano 21:e149d0bdbf4a 145 void set_leds( char v )
okano 21:e149d0bdbf4a 146 {
okano 21:e149d0bdbf4a 147 leds = v;
okano 21:e149d0bdbf4a 148 }
okano 26:a63e73885b21 149
okano 26:a63e73885b21 150