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 */ 00018 00019 #ifndef MBED_IAP 00020 #define MBED_IAP 00021 00022 #include "mbed.h" 00023 00024 #define USER_FLASH_AREA_START FLASH_SECTOR_22 00025 #define USER_FLASH_AREA_SIZE (FLASH_SECTOR_SIZE_16_TO_29 * 8) 00026 00027 /* 00028 * memory map information is available in next URL also. 00029 * http://mbed.org/projects/libraries/svn/mbed/trunk/LPC1768/LPC17xx.h 00030 */ 00031 00032 /** Table for start adress of sectors 00033 * 00034 * LPC1768 internal flash memory sector numbers and addresses 00035 * 00036 * LPC1768 flash memory are and sector number/size 00037 * Table 568 "Sectors in a LPC17xx device", Section 5. "Sector numbers", usermanual 00038 * 00039 * 0x00000000 - 0x0007FFFF flash (29 sectors) 00040 * 00041 * Sector0: 0x00000000 - 0x00000FFF 4K 00042 * Sector1: 0x00001000 - 0x00001FFF 4K 00043 * Sector2: 0x00002000 - 0x00002FFF 4K 00044 * Sector3: 0x00003000 - 0x00003FFF 4K 00045 * Sector4: 0x00004000 - 0x00004FFF 4K 00046 * Sector5: 0x00005000 - 0x00005FFF 4K 00047 * Sector6: 0x00006000 - 0x00006FFF 4K 00048 * Sector7: 0x00007000 - 0x00007FFF 4K 00049 * Sector8: 0x00008000 - 0x00008FFF 4K 00050 * Sector9: 0x00009000 - 0x00009FFF 4K 00051 * Sector10: 0x0000A000 - 0x0000AFFF 4K 00052 * Sector11: 0x0000B000 - 0x0000BFFF 4K 00053 * Sector12: 0x0000C000 - 0x0000CFFF 4K 00054 * Sector13: 0x0000D000 - 0x0000DFFF 4K 00055 * Sector14: 0x0000E000 - 0x0000EFFF 4K 00056 * Sector15: 0x0000F000 - 0x0000FFFF 4K 00057 * 00058 * Sector16: 0x00010000 - 0x00017FFF 32K 00059 * Sector17: 0x00018000 - 0x0001FFFF 32K 00060 * Sector18: 0x00020000 - 0x00027FFF 32K 00061 * Sector19: 0x00028000 - 0x0002FFFF 32K 00062 * Sector20: 0x00030000 - 0x00037FFF 32K 00063 * Sector21: 0x00038000 - 0x0003FFFF 32K 00064 * Sector22: 0x00040000 - 0x00047FFF 32K 00065 * Sector23: 0x00048000 - 0x0004FFFF 32K 00066 * Sector24: 0x00050000 - 0x00057FFF 32K 00067 * Sector25: 0x00058000 - 0x0005FFFF 32K 00068 * Sector26: 0x00060000 - 0x00067FFF 32K 00069 * Sector27: 0x00068000 - 0x0006FFFF 32K 00070 * Sector28: 0x00070000 - 0x00077FFF 32K 00071 * Sector29: 0x00078000 - 0x0007FFFF 32K 00072 */ 00073 00074 #define FLASH_SECTOR_0 0x00000000 00075 #define FLASH_SECTOR_1 0x00001000 00076 #define FLASH_SECTOR_2 0x00002000 00077 #define FLASH_SECTOR_3 0x00003000 00078 #define FLASH_SECTOR_4 0x00004000 00079 #define FLASH_SECTOR_5 0x00005000 00080 #define FLASH_SECTOR_6 0x00006000 00081 #define FLASH_SECTOR_7 0x00007000 00082 #define FLASH_SECTOR_8 0x00008000 00083 #define FLASH_SECTOR_9 0x00009000 00084 #define FLASH_SECTOR_10 0x0000A000 00085 #define FLASH_SECTOR_11 0x0000B000 00086 #define FLASH_SECTOR_12 0x0000C000 00087 #define FLASH_SECTOR_13 0x0000D000 00088 #define FLASH_SECTOR_14 0x0000E000 00089 #define FLASH_SECTOR_15 0x0000F000 00090 #define FLASH_SECTOR_16 0x00010000 00091 #define FLASH_SECTOR_17 0x00018000 00092 #define FLASH_SECTOR_18 0x00020000 00093 #define FLASH_SECTOR_19 0x00028000 00094 #define FLASH_SECTOR_20 0x00030000 00095 #define FLASH_SECTOR_21 0x00038000 00096 #define FLASH_SECTOR_22 0x00040000 00097 #define FLASH_SECTOR_23 0x00048000 00098 #define FLASH_SECTOR_24 0x00050000 00099 #define FLASH_SECTOR_25 0x00058000 00100 #define FLASH_SECTOR_26 0x00060000 00101 #define FLASH_SECTOR_27 0x00068000 00102 #define FLASH_SECTOR_28 0x00070000 00103 #define FLASH_SECTOR_29 0x00078000 00104 00105 #define FLASH_SECTOR_SIZE_0_TO_15 ( 4 * 1024) 00106 #define FLASH_SECTOR_SIZE_16_TO_29 (32 * 1024) 00107 00108 static char * sector_start_adress[] = { 00109 (char *)FLASH_SECTOR_0, 00110 (char *)FLASH_SECTOR_1, 00111 (char *)FLASH_SECTOR_2, 00112 (char *)FLASH_SECTOR_3, 00113 (char *)FLASH_SECTOR_4, 00114 (char *)FLASH_SECTOR_5, 00115 (char *)FLASH_SECTOR_6, 00116 (char *)FLASH_SECTOR_7, 00117 (char *)FLASH_SECTOR_8, 00118 (char *)FLASH_SECTOR_9, 00119 (char *)FLASH_SECTOR_10, 00120 (char *)FLASH_SECTOR_11, 00121 (char *)FLASH_SECTOR_12, 00122 (char *)FLASH_SECTOR_13, 00123 (char *)FLASH_SECTOR_14, 00124 (char *)FLASH_SECTOR_15, 00125 (char *)FLASH_SECTOR_16, 00126 (char *)FLASH_SECTOR_17, 00127 (char *)FLASH_SECTOR_18, 00128 (char *)FLASH_SECTOR_19, 00129 (char *)FLASH_SECTOR_20, 00130 (char *)FLASH_SECTOR_21, 00131 (char *)FLASH_SECTOR_22, 00132 (char *)FLASH_SECTOR_23, 00133 (char *)FLASH_SECTOR_24, 00134 (char *)FLASH_SECTOR_25, 00135 (char *)FLASH_SECTOR_26, 00136 (char *)FLASH_SECTOR_27, 00137 (char *)FLASH_SECTOR_28, 00138 (char *)FLASH_SECTOR_29 00139 }; 00140 00141 00142 /** Error code by IAP routine 00143 * 00144 * Table 588 "ISP Return Codes Summary", Section 7.15 "ISP Return Codes", usermanual 00145 */ 00146 00147 enum error_code 00148 { 00149 CMD_SUCCESS, 00150 INVALID_COMMAND, 00151 SRC_ADDR_ERROR, 00152 DST_ADDR_ERROR, 00153 SRC_ADDR_NOT_MAPPED, 00154 DST_ADDR_NOT_MAPPED, 00155 COUNT_ERROR, 00156 INVALID_SECTOR, 00157 SECTOR_NOT_BLANK, 00158 SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION, 00159 COMPARE_ERROR, 00160 BUSY, 00161 PARAM_ERROR, 00162 ADDR_ERROR, 00163 ADDR_NOT_MAPPED, 00164 CMD_LOCKED, 00165 INVALID_CODE, 00166 INVALID_BAUD_RATE, 00167 INVALID_STOP_BIT, 00168 CODE_READ_PROTECTION_ENABLED 00169 }; 00170 00171 00172 00173 /* 00174 * IAP routine entry 00175 * 00176 * Chapter 8. "IAP commands", usermanual 00177 */ 00178 00179 #define IAP_LOCATION 0x1fff1ff1 00180 typedef void (*IAP_call)(unsigned int [], unsigned int []); 00181 00182 /** IAP class 00183 * 00184 * Interface for internal flash memory access 00185 */ 00186 00187 00188 class IAP { 00189 public: 00190 00191 /* 00192 * SystemCoreClock ??? : 00193 * http://mbed.org/forum/mbed/topic/229/ 00194 * http://mbed.org/users/simon/programs/SystemCoreClock/16mhsh/ 00195 */ 00196 00197 00198 /** Constructor for IAP 00199 * 00200 */ 00201 00202 IAP() : iap_entry( reinterpret_cast<IAP_call>(IAP_LOCATION) ), cclk_kHz( SystemCoreClock / 1000 ) {} 00203 int read_ID( void ); 00204 int read_serial( void ); 00205 int blank_check( int start, int end ); 00206 int erase( int start, int end ); 00207 int prepare( int start, int end ); 00208 int write( char *source_addr, char *target_addr, int size ); 00209 int compare( char *source_addr, char *target_addr, int size ); 00210 00211 char *reserved_flash_area_start( void ); 00212 int reserved_flash_area_size( void ); 00213 00214 private: 00215 IAP_call iap_entry; 00216 unsigned int IAP_command[ 5 ]; 00217 unsigned int IAP_result[ 5 ]; 00218 int cclk_kHz; 00219 00220 //int cpu_clock( void ); 00221 } 00222 ; 00223 00224 #endif // #ifndef MBED_IAP
Generated on Sat Jul 16 2022 13:37:35 by
1.7.2