In Application Programming with support for both LPC1768 and LPC2368. Original library here http://mbed.org/users/okano/notebook/iap-in-application-programming-internal-flash-eras/

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers IAP.h Source File

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 
00017 #ifndef        MBED_IAP
00018 #define        MBED_IAP
00019 
00020 #include    "mbed.h"
00021 
00022 /*
00023  *  memory map information is available in next URL also.
00024  *    http://mbed.org/projects/libraries/svn/mbed/trunk/LPC1768/LPC17xx.h
00025  */
00026 
00027 #ifdef TARGET_LPC1768
00028 
00029 #define IAP_LOCATION 0x1fff1ff1
00030 
00031 #define     FLASH_SECTOR_0       0x00000000
00032 #define     FLASH_SECTOR_1       0x00001000
00033 #define     FLASH_SECTOR_2       0x00002000
00034 #define     FLASH_SECTOR_3       0x00003000
00035 #define     FLASH_SECTOR_4       0x00004000
00036 #define     FLASH_SECTOR_5       0x00005000
00037 #define     FLASH_SECTOR_6       0x00006000
00038 #define     FLASH_SECTOR_7       0x00007000
00039 #define     FLASH_SECTOR_8       0x00008000
00040 #define     FLASH_SECTOR_9       0x00009000
00041 #define     FLASH_SECTOR_10      0x0000A000
00042 #define     FLASH_SECTOR_11      0x0000B000
00043 #define     FLASH_SECTOR_12      0x0000C000
00044 #define     FLASH_SECTOR_13      0x0000D000
00045 #define     FLASH_SECTOR_14      0x0000E000
00046 #define     FLASH_SECTOR_15      0x0000F000
00047 #define     FLASH_SECTOR_16      0x00010000
00048 #define     FLASH_SECTOR_17      0x00018000
00049 #define     FLASH_SECTOR_18      0x00020000
00050 #define     FLASH_SECTOR_19      0x00028000
00051 #define     FLASH_SECTOR_20      0x00030000
00052 #define     FLASH_SECTOR_21      0x00038000
00053 #define     FLASH_SECTOR_22      0x00040000
00054 #define     FLASH_SECTOR_23      0x00048000
00055 #define     FLASH_SECTOR_24      0x00050000
00056 #define     FLASH_SECTOR_25      0x00058000
00057 #define     FLASH_SECTOR_26      0x00060000
00058 #define     FLASH_SECTOR_27      0x00068000
00059 #define     FLASH_SECTOR_28      0x00070000
00060 #define     FLASH_SECTOR_29      0x00078000
00061 
00062 #define     FLASH_SECTOR_SIZE_0_TO_15    ( 4 * 1024)
00063 #define     FLASH_SECTOR_SIZE_16_TO_29   (32 * 1024)
00064 
00065 #define     USER_FLASH_AREA_START   FLASH_SECTOR_29
00066 #define     USER_FLASH_AREA_SIZE    (FLASH_SECTOR_SIZE_16_TO_29 * 1)
00067 
00068 static char * sector_start_adress[]    = {
00069     (char *)FLASH_SECTOR_0,
00070     (char *)FLASH_SECTOR_1,
00071     (char *)FLASH_SECTOR_2,
00072     (char *)FLASH_SECTOR_3,
00073     (char *)FLASH_SECTOR_4,
00074     (char *)FLASH_SECTOR_5,
00075     (char *)FLASH_SECTOR_6,
00076     (char *)FLASH_SECTOR_7,
00077     (char *)FLASH_SECTOR_8,
00078     (char *)FLASH_SECTOR_9,
00079     (char *)FLASH_SECTOR_10,
00080     (char *)FLASH_SECTOR_11,
00081     (char *)FLASH_SECTOR_12,
00082     (char *)FLASH_SECTOR_13,
00083     (char *)FLASH_SECTOR_14,
00084     (char *)FLASH_SECTOR_15,
00085     (char *)FLASH_SECTOR_16,
00086     (char *)FLASH_SECTOR_17,
00087     (char *)FLASH_SECTOR_18,
00088     (char *)FLASH_SECTOR_19,
00089     (char *)FLASH_SECTOR_20,
00090     (char *)FLASH_SECTOR_21,
00091     (char *)FLASH_SECTOR_22,
00092     (char *)FLASH_SECTOR_23,
00093     (char *)FLASH_SECTOR_24,
00094     (char *)FLASH_SECTOR_25,
00095     (char *)FLASH_SECTOR_26,
00096     (char *)FLASH_SECTOR_27,
00097     (char *)FLASH_SECTOR_28,
00098     (char *)FLASH_SECTOR_29
00099 };
00100 
00101 
00102 #endif
00103 
00104 #ifdef TARGET_LPC2368
00105 #define IAP_LOCATION 0x7FFFFFF1
00106 
00107 #define     FLASH_SECTOR_0       0x00000000
00108 #define     FLASH_SECTOR_1       0x00001000
00109 #define     FLASH_SECTOR_2       0x00002000
00110 #define     FLASH_SECTOR_3       0x00003000
00111 #define     FLASH_SECTOR_4       0x00004000
00112 #define     FLASH_SECTOR_5       0x00005000
00113 #define     FLASH_SECTOR_6       0x00006000
00114 #define     FLASH_SECTOR_7       0x00007000
00115 #define     FLASH_SECTOR_8       0x00008000
00116 #define     FLASH_SECTOR_9       0x00010000
00117 #define     FLASH_SECTOR_10      0x00018000
00118 #define     FLASH_SECTOR_11      0x00020000
00119 #define     FLASH_SECTOR_12      0x00028000
00120 #define     FLASH_SECTOR_13      0x00030000
00121 #define     FLASH_SECTOR_14      0x00038000
00122 #define     FLASH_SECTOR_15      0x00040000
00123 #define     FLASH_SECTOR_16      0x00048000
00124 #define     FLASH_SECTOR_17      0x00050000
00125 #define     FLASH_SECTOR_18      0x00058000
00126 #define     FLASH_SECTOR_19      0x00060000
00127 #define     FLASH_SECTOR_20      0x00068000
00128 #define     FLASH_SECTOR_21      0x00070000
00129 #define     FLASH_SECTOR_22      0x00078000
00130 #define     FLASH_SECTOR_23      0x00079000
00131 #define     FLASH_SECTOR_24      0x0007A000
00132 #define     FLASH_SECTOR_25      0x0007B000
00133 #define     FLASH_SECTOR_26      0x0007C000
00134 #define     FLASH_SECTOR_27      0x0007D000
00135 
00136 #define     FLASH_SECTOR_SIZE_0_TO_7    ( 4 * 1024)
00137 #define     FLASH_SECTOR_SIZE_8_TO_21   (32 * 1024)
00138 #define     FLASH_SECTOR_SIZE_22_TO_27    ( 4 * 1024)
00139 
00140 
00141 #define     USER_FLASH_AREA_START   FLASH_SECTOR_21
00142 #define     USER_FLASH_AREA_SIZE    (FLASH_SECTOR_SIZE_8_TO_21 * 1)
00143 
00144 static char * sector_start_adress[]    = {
00145     (char *)FLASH_SECTOR_0,
00146     (char *)FLASH_SECTOR_1,
00147     (char *)FLASH_SECTOR_2,
00148     (char *)FLASH_SECTOR_3,
00149     (char *)FLASH_SECTOR_4,
00150     (char *)FLASH_SECTOR_5,
00151     (char *)FLASH_SECTOR_6,
00152     (char *)FLASH_SECTOR_7,
00153     (char *)FLASH_SECTOR_8,
00154     (char *)FLASH_SECTOR_9,
00155     (char *)FLASH_SECTOR_10,
00156     (char *)FLASH_SECTOR_11,
00157     (char *)FLASH_SECTOR_12,
00158     (char *)FLASH_SECTOR_13,
00159     (char *)FLASH_SECTOR_14,
00160     (char *)FLASH_SECTOR_15,
00161     (char *)FLASH_SECTOR_16,
00162     (char *)FLASH_SECTOR_17,
00163     (char *)FLASH_SECTOR_18,
00164     (char *)FLASH_SECTOR_19,
00165     (char *)FLASH_SECTOR_20,
00166     (char *)FLASH_SECTOR_21,
00167     (char *)FLASH_SECTOR_22,
00168     (char *)FLASH_SECTOR_23,
00169     (char *)FLASH_SECTOR_24,
00170     (char *)FLASH_SECTOR_25,
00171     (char *)FLASH_SECTOR_26,
00172     (char *)FLASH_SECTOR_27
00173 };
00174 
00175 
00176 #endif
00177 
00178 
00179 /**    Error code by IAP routine
00180  *
00181  *        Table 588 "ISP Return Codes Summary", Section 7.15 "ISP Return Codes", usermanual
00182  */
00183 
00184 enum error_code {
00185     CMD_SUCCESS,
00186     INVALID_COMMAND,
00187     SRC_ADDR_ERROR,
00188     DST_ADDR_ERROR,
00189     SRC_ADDR_NOT_MAPPED,
00190     DST_ADDR_NOT_MAPPED,
00191     COUNT_ERROR,
00192     INVALID_SECTOR,
00193     SECTOR_NOT_BLANK,
00194     SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION,
00195     COMPARE_ERROR,
00196     BUSY,
00197     PARAM_ERROR,
00198     ADDR_ERROR,
00199     ADDR_NOT_MAPPED,
00200     CMD_LOCKED,
00201     INVALID_CODE,
00202     INVALID_BAUD_RATE,
00203     INVALID_STOP_BIT,
00204     CODE_READ_PROTECTION_ENABLED
00205 };
00206 
00207 
00208 
00209 /*
00210  *  IAP routine entry
00211  *
00212  *        Chapter 8. "IAP commands", usermanual
00213  */
00214 
00215 
00216 //#define     IAP_LOCATION    0x1fff1ff1
00217 
00218 
00219 typedef     void (*IAP_call)(unsigned int [], unsigned int []);
00220 
00221 /**    IAP class
00222  *
00223  *        Interface for internal flash memory access
00224  */
00225 
00226 
00227 class IAP {
00228 public:
00229 
00230     /*
00231      *  SystemCoreClock ??? :
00232      *    http://mbed.org/forum/mbed/topic/229/
00233      *    http://mbed.org/users/simon/programs/SystemCoreClock/16mhsh/
00234      */
00235 
00236 
00237     /**    Constructor for IAP
00238      *
00239      */
00240 
00241     IAP() : iap_entry( reinterpret_cast<IAP_call>(IAP_LOCATION) ), cclk_kHz( SystemCoreClock / 1000 ) {}
00242     int read_ID( void );
00243     int read_serial( void );
00244     int blank_check( int start, int end );
00245     int erase( int start, int end );
00246     int prepare( int start, int end );
00247     int write( char *source_addr, char *target_addr, int size );
00248     int compare( char *source_addr, char *target_addr, int size );
00249 
00250     char *reserved_flash_area_start( void );
00251     int   reserved_flash_area_size( void );
00252 
00253 private:
00254     IAP_call        iap_entry;
00255     unsigned int    IAP_command[ 5 ];
00256     unsigned int    IAP_result[ 5 ];
00257     int             cclk_kHz;
00258 
00259     //int cpu_clock( void );
00260 }
00261 ;
00262 
00263 #endif    //  #ifndef  MBED_IAP