Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
IAP.h
00001 /** IAP : internal Flash memory access library 00002 * 00003 * The internal Flash memory access is described in the LPC1768 usermanual. 00004 * http://www.nxp.com/documents/user_manual/UM10360.pdf 00005 * 00006 * Chapter 2: "LPC17xx Memory map" 00007 * Chapter 32: "LPC17xx Flash memory interface and programming" 00008 * refering Rev. 01 - 4 January 2010 00009 * 00010 * Released under the MIT License: http://mbed.org/license/mit 00011 * 00012 * revision 1.0 09-Mar-2010 1st release 00013 * revision 1.1 12-Mar-2010 chaged: to make possible to reserve flash area for user 00014 * it can be set by USER_FLASH_AREA_START and USER_FLASH_AREA_SIZE in IAP.h 00015 * 00016 * by Tedd OKANO http://mbed.org/users/okano/notebook/iap-in-application-programming-internal-flash-eras/ 00017 * modified by Suga (supported to LPC11U24) 00018 */ 00019 00020 #ifndef MBED_IAP 00021 #define MBED_IAP 00022 00023 #include "mbed.h" 00024 00025 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) 00026 #define USER_FLASH_AREA_START FLASH_SECTOR_29 00027 #define USER_FLASH_AREA_SIZE (FLASH_SECTOR_SIZE_16_TO_29 * 1) 00028 #elif defined(TARGET_LPC11U24) 00029 #define USER_FLASH_AREA_START FLASH_SECTOR_7 00030 #define USER_FLASH_AREA_SIZE (FLASH_SECTOR_SIZE_0_TO_15 * 1) 00031 #endif 00032 00033 /* 00034 * memory map information is available in next URL also. 00035 * http://mbed.org/projects/libraries/svn/mbed/trunk/LPC1768/LPC17xx.h 00036 */ 00037 00038 /** Table for start adress of sectors 00039 * 00040 * LPC1768 internal flash memory sector numbers and addresses 00041 * 00042 * LPC1768 flash memory are and sector number/size 00043 * Table 568 "Sectors in a LPC17xx device", Section 5. "Sector numbers", usermanual 00044 * 00045 * 0x00000000 - 0x0007FFFF flash (29 sectors) 00046 * 00047 * Sector0: 0x00000000 - 0x00000FFF 4K 00048 * Sector1: 0x00001000 - 0x00001FFF 4K 00049 * Sector2: 0x00002000 - 0x00002FFF 4K 00050 * Sector3: 0x00003000 - 0x00003FFF 4K 00051 * Sector4: 0x00004000 - 0x00004FFF 4K 00052 * Sector5: 0x00005000 - 0x00005FFF 4K 00053 * Sector6: 0x00006000 - 0x00006FFF 4K 00054 * Sector7: 0x00007000 - 0x00007FFF 4K 00055 * Sector8: 0x00008000 - 0x00008FFF 4K 00056 * Sector9: 0x00009000 - 0x00009FFF 4K 00057 * Sector10: 0x0000A000 - 0x0000AFFF 4K 00058 * Sector11: 0x0000B000 - 0x0000BFFF 4K 00059 * Sector12: 0x0000C000 - 0x0000CFFF 4K 00060 * Sector13: 0x0000D000 - 0x0000DFFF 4K 00061 * Sector14: 0x0000E000 - 0x0000EFFF 4K 00062 * Sector15: 0x0000F000 - 0x0000FFFF 4K 00063 * 00064 * Sector16: 0x00010000 - 0x00017FFF 32K 00065 * Sector17: 0x00018000 - 0x0001FFFF 32K 00066 * Sector18: 0x00020000 - 0x00027FFF 32K 00067 * Sector19: 0x00028000 - 0x0002FFFF 32K 00068 * Sector20: 0x00030000 - 0x00037FFF 32K 00069 * Sector21: 0x00038000 - 0x0003FFFF 32K 00070 * Sector22: 0x00040000 - 0x00047FFF 32K 00071 * Sector23: 0x00048000 - 0x0004FFFF 32K 00072 * Sector24: 0x00050000 - 0x00057FFF 32K 00073 * Sector25: 0x00058000 - 0x0005FFFF 32K 00074 * Sector26: 0x00060000 - 0x00067FFF 32K 00075 * Sector27: 0x00068000 - 0x0006FFFF 32K 00076 * Sector28: 0x00070000 - 0x00077FFF 32K 00077 * Sector29: 0x00078000 - 0x0007FFFF 32K 00078 */ 00079 00080 #define FLASH_SECTOR_0 0x00000000 00081 #define FLASH_SECTOR_1 0x00001000 00082 #define FLASH_SECTOR_2 0x00002000 00083 #define FLASH_SECTOR_3 0x00003000 00084 #define FLASH_SECTOR_4 0x00004000 00085 #define FLASH_SECTOR_5 0x00005000 00086 #define FLASH_SECTOR_6 0x00006000 00087 #define FLASH_SECTOR_7 0x00007000 00088 #define FLASH_SECTOR_8 0x00008000 00089 #define FLASH_SECTOR_9 0x00009000 00090 #define FLASH_SECTOR_10 0x0000A000 00091 #define FLASH_SECTOR_11 0x0000B000 00092 #define FLASH_SECTOR_12 0x0000C000 00093 #define FLASH_SECTOR_13 0x0000D000 00094 #define FLASH_SECTOR_14 0x0000E000 00095 #define FLASH_SECTOR_15 0x0000F000 00096 #define FLASH_SECTOR_16 0x00010000 00097 #define FLASH_SECTOR_17 0x00018000 00098 #define FLASH_SECTOR_18 0x00020000 00099 #define FLASH_SECTOR_19 0x00028000 00100 #define FLASH_SECTOR_20 0x00030000 00101 #define FLASH_SECTOR_21 0x00038000 00102 #define FLASH_SECTOR_22 0x00040000 00103 #define FLASH_SECTOR_23 0x00048000 00104 #define FLASH_SECTOR_24 0x00050000 00105 #define FLASH_SECTOR_25 0x00058000 00106 #define FLASH_SECTOR_26 0x00060000 00107 #define FLASH_SECTOR_27 0x00068000 00108 #define FLASH_SECTOR_28 0x00070000 00109 #define FLASH_SECTOR_29 0x00078000 00110 00111 #define FLASH_SECTOR_SIZE_0_TO_15 ( 4 * 1024) 00112 #define FLASH_SECTOR_SIZE_16_TO_29 (32 * 1024) 00113 00114 static char * sector_start_adress[] = { 00115 (char *)FLASH_SECTOR_0, 00116 (char *)FLASH_SECTOR_1, 00117 (char *)FLASH_SECTOR_2, 00118 (char *)FLASH_SECTOR_3, 00119 (char *)FLASH_SECTOR_4, 00120 (char *)FLASH_SECTOR_5, 00121 (char *)FLASH_SECTOR_6, 00122 (char *)FLASH_SECTOR_7, 00123 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) 00124 (char *)FLASH_SECTOR_8, 00125 (char *)FLASH_SECTOR_9, 00126 (char *)FLASH_SECTOR_10, 00127 (char *)FLASH_SECTOR_11, 00128 (char *)FLASH_SECTOR_12, 00129 (char *)FLASH_SECTOR_13, 00130 (char *)FLASH_SECTOR_14, 00131 (char *)FLASH_SECTOR_15, 00132 (char *)FLASH_SECTOR_16, 00133 (char *)FLASH_SECTOR_17, 00134 (char *)FLASH_SECTOR_18, 00135 (char *)FLASH_SECTOR_19, 00136 (char *)FLASH_SECTOR_20, 00137 (char *)FLASH_SECTOR_21, 00138 (char *)FLASH_SECTOR_22, 00139 (char *)FLASH_SECTOR_23, 00140 (char *)FLASH_SECTOR_24, 00141 (char *)FLASH_SECTOR_25, 00142 (char *)FLASH_SECTOR_26, 00143 (char *)FLASH_SECTOR_27, 00144 (char *)FLASH_SECTOR_28, 00145 (char *)FLASH_SECTOR_29 00146 #endif 00147 }; 00148 00149 00150 /** Error code by IAP routine 00151 * 00152 * Table 588 "ISP Return Codes Summary", Section 7.15 "ISP Return Codes", usermanual 00153 */ 00154 00155 enum error_code 00156 { 00157 CMD_SUCCESS, 00158 INVALID_COMMAND, 00159 SRC_ADDR_ERROR, 00160 DST_ADDR_ERROR, 00161 SRC_ADDR_NOT_MAPPED, 00162 DST_ADDR_NOT_MAPPED, 00163 COUNT_ERROR, 00164 INVALID_SECTOR, 00165 SECTOR_NOT_BLANK, 00166 SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION, 00167 COMPARE_ERROR, 00168 BUSY, 00169 PARAM_ERROR, 00170 ADDR_ERROR, 00171 ADDR_NOT_MAPPED, 00172 CMD_LOCKED, 00173 INVALID_CODE, 00174 INVALID_BAUD_RATE, 00175 INVALID_STOP_BIT, 00176 CODE_READ_PROTECTION_ENABLED 00177 }; 00178 00179 00180 00181 /* 00182 * IAP routine entry 00183 * 00184 * Chapter 8. "IAP commands", usermanual 00185 */ 00186 00187 #define IAP_LOCATION 0x1fff1ff1 00188 typedef void (*IAP_call)(unsigned int [], unsigned int []); 00189 00190 /** IAP class 00191 * 00192 * Interface for internal flash memory access 00193 */ 00194 00195 00196 class IAP { 00197 public: 00198 00199 /* 00200 * SystemCoreClock ??? : 00201 * http://mbed.org/forum/mbed/topic/229/ 00202 * http://mbed.org/users/simon/programs/SystemCoreClock/16mhsh/ 00203 */ 00204 00205 00206 /** Constructor for IAP 00207 * 00208 */ 00209 00210 IAP() : iap_entry( reinterpret_cast<IAP_call>(IAP_LOCATION) ), cclk_kHz( SystemCoreClock / 1000 ) {} 00211 int read_ID( void ); 00212 int read_serial( void ); 00213 int blank_check( int start, int end ); 00214 int erase( int start, int end ); 00215 int prepare( int start, int end ); 00216 int write( char *source_addr, char *target_addr, int size ); 00217 int compare( char *source_addr, char *target_addr, int size ); 00218 00219 char *reserved_flash_area_start( void ); 00220 int reserved_flash_area_size( void ); 00221 00222 #if defined(TARGET_LPC11U24) 00223 int write_eeprom( char *source_addr, char *target_addr, int size ); 00224 int read_eeprom( char *source_addr, char *target_addr, int size ); 00225 #endif 00226 00227 private: 00228 IAP_call iap_entry; 00229 unsigned int IAP_command[ 5 ]; 00230 unsigned int IAP_result[ 5 ]; 00231 int cclk_kHz; 00232 00233 //int cpu_clock( void ); 00234 } 00235 ; 00236 00237 #endif // #ifndef MBED_IAP
Generated on Thu Jul 14 2022 03:49:24 by
1.7.2