Add to 11U68 11E68
Dependencies: DirectoryList MODSERIAL mbed
Fork of ika_shouyu_poppoyaki by
isp.cpp@32:3700d5df4e18, 2013-09-24 (annotated)
- 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?
User | Revision | Line number | New 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 |