Jonne Valola / PokittoLib Featured

Dependents:   YATTT sd_map_test cPong SnowDemo ... more

PokittoLib

Library for programming Pokitto hardware

How to Use

  1. Import this library to online compiler (see button "import" on the right hand side
  2. DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
  3. Change My_settings.h according to your project
  4. Start coding!
Committer:
Pokitto
Date:
Sat Mar 24 13:17:22 2018 +0000
Revision:
34:427237571c6a
Parent:
31:f4b9b85c7b62
Bug fix (missing definition of uint8_t output)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 31:f4b9b85c7b62 1 #include <stdio.h>
Pokitto 31:f4b9b85c7b62 2 #include <stdint.h>
Pokitto 31:f4b9b85c7b62 3 #include <iap.h>
Pokitto 31:f4b9b85c7b62 4 #include "LPC11U6x.h"
Pokitto 31:f4b9b85c7b62 5 #include "PokittoDisk.h"
Pokitto 31:f4b9b85c7b62 6
Pokitto 31:f4b9b85c7b62 7 #define TICKRATE_HZ (10) /* 10 ticks per second */
Pokitto 31:f4b9b85c7b62 8 /* SystemTick Counter */
Pokitto 31:f4b9b85c7b62 9 static volatile uint32_t sysTick;
Pokitto 31:f4b9b85c7b62 10
Pokitto 31:f4b9b85c7b62 11 /* LPC1347 IAP entry address */
Pokitto 31:f4b9b85c7b62 12 #define IAP_LOCATION 0x1fff1ff1
Pokitto 31:f4b9b85c7b62 13
Pokitto 31:f4b9b85c7b62 14 #define last_sector_flash 0x00038000 //0x0000F000
Pokitto 31:f4b9b85c7b62 15 #define IAP_LAST_SECTOR 28 /* Page number 896 - 1023, 0x00038000 - 0x0003FFFF */
Pokitto 31:f4b9b85c7b62 16 #define IAP_NUM_BYTES_TO_WRITE 256
Pokitto 31:f4b9b85c7b62 17 #define WRITECOUNT (IAP_NUM_BYTES_TO_WRITE / 4) /* when data array is in uint32_t */
Pokitto 31:f4b9b85c7b62 18
Pokitto 31:f4b9b85c7b62 19 #define IAP_PREWRRITE_CMD 50 /* Prepare sector for write operation command */
Pokitto 31:f4b9b85c7b62 20 #define IAP_WRISECTOR_CMD 51
Pokitto 31:f4b9b85c7b62 21 #define IAP_ERSSECTOR_CMD 52
Pokitto 31:f4b9b85c7b62 22 #define IAP_REPID_CMD 54
Pokitto 31:f4b9b85c7b62 23
Pokitto 31:f4b9b85c7b62 24 /* IAP command variables */
Pokitto 31:f4b9b85c7b62 25 static unsigned int command[5], result[4];
Pokitto 31:f4b9b85c7b62 26
Pokitto 31:f4b9b85c7b62 27 /* IAP entry function */
Pokitto 31:f4b9b85c7b62 28 typedef int (*IAP)(unsigned int[], unsigned int[]);
Pokitto 31:f4b9b85c7b62 29 IAP iap_entry = (IAP) IAP_LOCATION;
Pokitto 31:f4b9b85c7b62 30
Pokitto 31:f4b9b85c7b62 31 int CopyPageToFlash (uint32_t address, uint8_t* data) {
Pokitto 31:f4b9b85c7b62 32 IAP iap_call = (IAP) IAP_LOCATION;
Pokitto 31:f4b9b85c7b62 33 uint32_t writecount=0;
Pokitto 31:f4b9b85c7b62 34 __disable_irq();
Pokitto 31:f4b9b85c7b62 35
Pokitto 31:f4b9b85c7b62 36 unsigned int sector, page;
Pokitto 31:f4b9b85c7b62 37 bool firstpage=false, erasepage=false;
Pokitto 31:f4b9b85c7b62 38
Pokitto 31:f4b9b85c7b62 39 //DEBUG//
Pokitto 31:f4b9b85c7b62 40 //for (int i=0;i<256;i++) data[i]=0xBB;
Pokitto 31:f4b9b85c7b62 41
Pokitto 31:f4b9b85c7b62 42 /* Calculate sector based on address */
Pokitto 31:f4b9b85c7b62 43 if (address < 0x18000) sector = address/0x1000; // sectors go in 4 k's
Pokitto 31:f4b9b85c7b62 44 else if (address >= 0x38000) sector = 28;
Pokitto 31:f4b9b85c7b62 45 else if (address >= 0x30000) sector = 27;
Pokitto 31:f4b9b85c7b62 46 else if (address >= 0x28000) sector = 26;
Pokitto 31:f4b9b85c7b62 47 else if (address >= 0x20000) sector = 25;
Pokitto 31:f4b9b85c7b62 48 else sector = 24;
Pokitto 31:f4b9b85c7b62 49
Pokitto 31:f4b9b85c7b62 50 /* Check is it the first page in the sector */
Pokitto 31:f4b9b85c7b62 51 if (sector<24) {
Pokitto 31:f4b9b85c7b62 52 if (address == sector * 0x1000) firstpage = true;
Pokitto 31:f4b9b85c7b62 53 } else {
Pokitto 31:f4b9b85c7b62 54 if (address == (sector-24)*0x4000 + 0x18000) firstpage = true;
Pokitto 31:f4b9b85c7b62 55 }
Pokitto 31:f4b9b85c7b62 56
Pokitto 31:f4b9b85c7b62 57 /* Prepare the sector for writing */
Pokitto 31:f4b9b85c7b62 58 command[0] = IAP_PREWRRITE_CMD; /* Prepare to write/erase command code */
Pokitto 31:f4b9b85c7b62 59 command[1] = sector; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 60 command[2] = sector; /* End Sector Number */
Pokitto 31:f4b9b85c7b62 61 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 62 if (result[0]) return 1;
Pokitto 31:f4b9b85c7b62 63
Pokitto 31:f4b9b85c7b62 64 /* wipe pages when writing the loader */
Pokitto 31:f4b9b85c7b62 65 if (address==0x39000) {
Pokitto 31:f4b9b85c7b62 66 erasepage=true;
Pokitto 31:f4b9b85c7b62 67 }
Pokitto 31:f4b9b85c7b62 68
Pokitto 31:f4b9b85c7b62 69 /* do sector erase only when writing first page of given sector */
Pokitto 31:f4b9b85c7b62 70 if (firstpage) {
Pokitto 31:f4b9b85c7b62 71 /* Erase the last sector */
Pokitto 31:f4b9b85c7b62 72 command[0] = IAP_ERSSECTOR_CMD; /* Erase command code*/
Pokitto 31:f4b9b85c7b62 73 command[1] = sector; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 74 command[2] = sector; /* End Sector Number */
Pokitto 31:f4b9b85c7b62 75 command[3] = SystemCoreClock / 1000UL; /* Core clock frequency in kHz */
Pokitto 31:f4b9b85c7b62 76 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 77 if (result[0]) return 1;
Pokitto 31:f4b9b85c7b62 78 /* Prepare to write/erase the last sector, needs to be done again because succesful erase re-locks sectors */
Pokitto 31:f4b9b85c7b62 79 command[0] = IAP_PREWRRITE_CMD; /* Prepare to write/erase command code */
Pokitto 31:f4b9b85c7b62 80 command[1] = sector; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 81 command[2] = sector; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 82 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 83 if (result[0]) return 1;
Pokitto 31:f4b9b85c7b62 84 }
Pokitto 31:f4b9b85c7b62 85
Pokitto 31:f4b9b85c7b62 86 /* page erase for bootloader area */
Pokitto 31:f4b9b85c7b62 87 if (erasepage) {
Pokitto 31:f4b9b85c7b62 88 command[0] = 59; //erase page command
Pokitto 31:f4b9b85c7b62 89 command[1] = 896;
Pokitto 31:f4b9b85c7b62 90 command[2] = 1023;
Pokitto 31:f4b9b85c7b62 91 command[3] = SystemCoreClock / 1000UL; /* Core clock frequency in kHz */
Pokitto 31:f4b9b85c7b62 92 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 93 if (result[0]) return 1;
Pokitto 31:f4b9b85c7b62 94 /* Prepare to write/erase the last sector, needs to be done again because succesful erase re-locks sectors */
Pokitto 31:f4b9b85c7b62 95 command[0] = IAP_PREWRRITE_CMD; /* Prepare to write/erase command code */
Pokitto 31:f4b9b85c7b62 96 command[1] = sector; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 97 command[2] = sector; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 98 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 99 if (result[0]) return 1;
Pokitto 31:f4b9b85c7b62 100 }
Pokitto 31:f4b9b85c7b62 101
Pokitto 31:f4b9b85c7b62 102 /* Write data to the sectors */
Pokitto 31:f4b9b85c7b62 103 command[0] = IAP_WRISECTOR_CMD; /* Write command code */
Pokitto 31:f4b9b85c7b62 104 command[1] = (uint32_t) (uint32_t*) address; /* Destination Flash Address */
Pokitto 31:f4b9b85c7b62 105 command[2] = (uint32_t) data; /* Source RAM Address */
Pokitto 31:f4b9b85c7b62 106 command[3] = 0x100; /* Number of Bytes to be written */
Pokitto 31:f4b9b85c7b62 107 command[4] = SystemCoreClock / 1000; /* System clock frequency */
Pokitto 31:f4b9b85c7b62 108 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 109 if (result[0]) return 1;
Pokitto 31:f4b9b85c7b62 110
Pokitto 31:f4b9b85c7b62 111 /* Re-enable interrupt mode */
Pokitto 31:f4b9b85c7b62 112 __enable_irq();
Pokitto 31:f4b9b85c7b62 113
Pokitto 31:f4b9b85c7b62 114 return 0; /*succesful write*/
Pokitto 31:f4b9b85c7b62 115
Pokitto 31:f4b9b85c7b62 116 }
Pokitto 31:f4b9b85c7b62 117
Pokitto 31:f4b9b85c7b62 118 __attribute__((section(".IAP_Code"))) int HelloFromIAP() {
Pokitto 31:f4b9b85c7b62 119 static uint32_t array_data[WRITECOUNT];
Pokitto 31:f4b9b85c7b62 120 int i;
Pokitto 31:f4b9b85c7b62 121 /* Initialize the array data to be written to FLASH */
Pokitto 31:f4b9b85c7b62 122 for (i = 0; i < WRITECOUNT; i++) {
Pokitto 31:f4b9b85c7b62 123 array_data[i] = 0xB007AB1E;
Pokitto 31:f4b9b85c7b62 124 }
Pokitto 31:f4b9b85c7b62 125
Pokitto 31:f4b9b85c7b62 126 IAP iap_call = (IAP) IAP_LOCATION;
Pokitto 31:f4b9b85c7b62 127 uint8_t teahupoo;
Pokitto 31:f4b9b85c7b62 128 //readEEPROM(0,&teahupoo,1);
Pokitto 31:f4b9b85c7b62 129 teahupoo++;
Pokitto 31:f4b9b85c7b62 130 //writeEEPROM(0,&teahupoo,1);
Pokitto 31:f4b9b85c7b62 131
Pokitto 31:f4b9b85c7b62 132 /** open file **/
Pokitto 31:f4b9b85c7b62 133 pokInitSD();
Pokitto 31:f4b9b85c7b62 134 char fn[20];
Pokitto 31:f4b9b85c7b62 135 char* now;
Pokitto 31:f4b9b85c7b62 136 now = (char*)last_sector_flash;
Pokitto 31:f4b9b85c7b62 137 switch (now[0]) {
Pokitto 31:f4b9b85c7b62 138 case 0xAA:
Pokitto 31:f4b9b85c7b62 139 fn[0]='B';fn[1]='B';fn[2]='.';fn[3]='B';fn[4]='I';fn[5]='N';fn[6]='\0';break;
Pokitto 31:f4b9b85c7b62 140 case 0xBB:
Pokitto 31:f4b9b85c7b62 141 fn[0]='C';fn[1]='C';fn[2]='.';fn[3]='B';fn[4]='I';fn[5]='N';fn[6]='\0';break;
Pokitto 31:f4b9b85c7b62 142 default:
Pokitto 31:f4b9b85c7b62 143 fn[0]='A';fn[1]='A';fn[2]='.';fn[3]='B';fn[4]='I';fn[5]='N';fn[6]='\0';
Pokitto 31:f4b9b85c7b62 144 }
Pokitto 31:f4b9b85c7b62 145 if(fileOpen(fn,FILE_MODE_BINARY)) {
Pokitto 31:f4b9b85c7b62 146 return 1;
Pokitto 31:f4b9b85c7b62 147 } else {
Pokitto 31:f4b9b85c7b62 148 for (i = 0; i < WRITECOUNT; i++) {
Pokitto 31:f4b9b85c7b62 149 fileReadBytes((uint8_t*)&array_data[i],4);
Pokitto 31:f4b9b85c7b62 150 }
Pokitto 31:f4b9b85c7b62 151 }
Pokitto 31:f4b9b85c7b62 152
Pokitto 31:f4b9b85c7b62 153
Pokitto 31:f4b9b85c7b62 154 /** write sector in flash **/
Pokitto 31:f4b9b85c7b62 155 /* Read Part Identification Number*/
Pokitto 31:f4b9b85c7b62 156 command[0] = IAP_REPID_CMD; /* Read ID command code */
Pokitto 31:f4b9b85c7b62 157 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 158
Pokitto 31:f4b9b85c7b62 159 __disable_irq();
Pokitto 31:f4b9b85c7b62 160
Pokitto 31:f4b9b85c7b62 161 /* Prepare to write/erase the last sector */
Pokitto 31:f4b9b85c7b62 162 command[0] = IAP_PREWRRITE_CMD; /* Prepare to write/erase command code */
Pokitto 31:f4b9b85c7b62 163 command[1] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 164 command[2] = IAP_LAST_SECTOR; /* End Sector Number */
Pokitto 31:f4b9b85c7b62 165 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 166 /* Erase the last sector */
Pokitto 31:f4b9b85c7b62 167 command[0] = IAP_ERSSECTOR_CMD; /* Erase command code*/
Pokitto 31:f4b9b85c7b62 168 command[1] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 169 command[2] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 170 command[3] = SystemCoreClock / 1000UL; /* Core clock frequency in kHz */
Pokitto 31:f4b9b85c7b62 171 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 172 /* Prepare to write/erase the last sector */
Pokitto 31:f4b9b85c7b62 173 command[0] = IAP_PREWRRITE_CMD; /* Prepare to write/erase command code */
Pokitto 31:f4b9b85c7b62 174 command[1] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 175 command[2] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 176 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 177 /* Write to the last sector */
Pokitto 31:f4b9b85c7b62 178 command[0] = IAP_WRISECTOR_CMD; /* Write command code */
Pokitto 31:f4b9b85c7b62 179 command[1] = (uint32_t) last_sector_flash; /* Destination Flash Address */
Pokitto 31:f4b9b85c7b62 180 command[2] = (uint32_t) &array_data; /* Source RAM Address */
Pokitto 31:f4b9b85c7b62 181 command[3] = IAP_NUM_BYTES_TO_WRITE; /* Number of Bytes to be written */
Pokitto 31:f4b9b85c7b62 182 command[4] = SystemCoreClock / 1000; /* System clock frequency */
Pokitto 31:f4b9b85c7b62 183 iap_call(command, result);
Pokitto 31:f4b9b85c7b62 184
Pokitto 31:f4b9b85c7b62 185 /* Re-enable interrupt mode */
Pokitto 31:f4b9b85c7b62 186 __enable_irq();
Pokitto 31:f4b9b85c7b62 187
Pokitto 31:f4b9b85c7b62 188
Pokitto 31:f4b9b85c7b62 189 SCB->AIRCR = 0x05FA0004; //issue system reset
Pokitto 31:f4b9b85c7b62 190 while(1); //should never come here
Pokitto 31:f4b9b85c7b62 191 return teahupoo;
Pokitto 31:f4b9b85c7b62 192 }
Pokitto 31:f4b9b85c7b62 193
Pokitto 31:f4b9b85c7b62 194
Pokitto 31:f4b9b85c7b62 195
Pokitto 31:f4b9b85c7b62 196
Pokitto 31:f4b9b85c7b62 197 void IAPstacksave()
Pokitto 31:f4b9b85c7b62 198 {
Pokitto 31:f4b9b85c7b62 199 /*need to save 32 top bytes of RAM to RAM1*/
Pokitto 31:f4b9b85c7b62 200 #define RAM1_0 (*((volatile unsigned long *) 0x20000000))
Pokitto 31:f4b9b85c7b62 201 #define RAM1_1 (*((volatile unsigned long *) 0x20000004))
Pokitto 31:f4b9b85c7b62 202 #define RAM1_2 (*((volatile unsigned long *) 0x20000008))
Pokitto 31:f4b9b85c7b62 203 #define RAM1_3 (*((volatile unsigned long *) 0x2000000C))
Pokitto 31:f4b9b85c7b62 204 #define RAM1_4 (*((volatile unsigned long *) 0x20000010))
Pokitto 31:f4b9b85c7b62 205 #define RAM1_5 (*((volatile unsigned long *) 0x20000014))
Pokitto 31:f4b9b85c7b62 206 #define RAM1_6 (*((volatile unsigned long *) 0x20000018))
Pokitto 31:f4b9b85c7b62 207 #define RAM1_7 (*((volatile unsigned long *) 0x2000001C))
Pokitto 31:f4b9b85c7b62 208
Pokitto 31:f4b9b85c7b62 209 uint32_t *saveloc = (uint32_t*)(0x10002000-0x20); // RAM top - 32 bytes
Pokitto 31:f4b9b85c7b62 210 RAM1_0 = *saveloc++;
Pokitto 31:f4b9b85c7b62 211 RAM1_1 = *saveloc++;
Pokitto 31:f4b9b85c7b62 212 RAM1_2 = *saveloc++;
Pokitto 31:f4b9b85c7b62 213 RAM1_3 = *saveloc++;
Pokitto 31:f4b9b85c7b62 214 RAM1_4 = *saveloc++;
Pokitto 31:f4b9b85c7b62 215 RAM1_5 = *saveloc++;
Pokitto 31:f4b9b85c7b62 216 RAM1_6 = *saveloc++;
Pokitto 31:f4b9b85c7b62 217 RAM1_7 = *saveloc;
Pokitto 31:f4b9b85c7b62 218 }
Pokitto 31:f4b9b85c7b62 219
Pokitto 31:f4b9b85c7b62 220
Pokitto 31:f4b9b85c7b62 221 char iaptest() {
Pokitto 31:f4b9b85c7b62 222 static uint32_t array_data[WRITECOUNT];
Pokitto 31:f4b9b85c7b62 223 int i;
Pokitto 31:f4b9b85c7b62 224 /* Initialize the array data to be written to FLASH */
Pokitto 31:f4b9b85c7b62 225 for (i = 0; i < WRITECOUNT; i++) {
Pokitto 31:f4b9b85c7b62 226 array_data[i] = 0x11223340 + i;
Pokitto 31:f4b9b85c7b62 227 }
Pokitto 31:f4b9b85c7b62 228
Pokitto 31:f4b9b85c7b62 229 /* Read Part Identification Number*/
Pokitto 31:f4b9b85c7b62 230 command[0] = IAP_REPID_CMD; /* Read ID command code */
Pokitto 31:f4b9b85c7b62 231 iap_entry(command, result);
Pokitto 31:f4b9b85c7b62 232
Pokitto 31:f4b9b85c7b62 233 /* Reinvoke ISP mode so that reprogamming of Flash possible */
Pokitto 31:f4b9b85c7b62 234 __disable_irq();
Pokitto 31:f4b9b85c7b62 235
Pokitto 31:f4b9b85c7b62 236 command[0] = IAP_REPID_CMD;
Pokitto 31:f4b9b85c7b62 237 iap_entry(command, result);
Pokitto 31:f4b9b85c7b62 238
Pokitto 31:f4b9b85c7b62 239 /* Prepare to write/erase the last sector */
Pokitto 31:f4b9b85c7b62 240 command[0] = IAP_PREWRRITE_CMD; /* Prepare to write/erase command code */
Pokitto 31:f4b9b85c7b62 241 command[1] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 242 command[2] = IAP_LAST_SECTOR; /* End Sector Number */
Pokitto 31:f4b9b85c7b62 243 iap_entry(command, result);
Pokitto 31:f4b9b85c7b62 244
Pokitto 31:f4b9b85c7b62 245 /* Erase the last sector */
Pokitto 31:f4b9b85c7b62 246 command[0] = IAP_ERSSECTOR_CMD; /* Erase command code*/
Pokitto 31:f4b9b85c7b62 247 command[1] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 248 command[2] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 249 iap_entry(command, result);
Pokitto 31:f4b9b85c7b62 250
Pokitto 31:f4b9b85c7b62 251 /* Prepare to write/erase the last sector */
Pokitto 31:f4b9b85c7b62 252 command[0] = IAP_PREWRRITE_CMD; /* Prepare to write/erase command code */
Pokitto 31:f4b9b85c7b62 253 command[1] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 254 command[2] = IAP_LAST_SECTOR; /* Start Sector Number */
Pokitto 31:f4b9b85c7b62 255 iap_entry(command, result);
Pokitto 31:f4b9b85c7b62 256
Pokitto 31:f4b9b85c7b62 257 /* Write to the last sector */
Pokitto 31:f4b9b85c7b62 258 command[0] = IAP_WRISECTOR_CMD; /* Write command code */
Pokitto 31:f4b9b85c7b62 259 command[1] = (uint32_t) last_sector_flash; /* Destination Flash Address */
Pokitto 31:f4b9b85c7b62 260 command[2] = (uint32_t) &array_data; /* Source RAM Address */
Pokitto 31:f4b9b85c7b62 261 command[3] = IAP_NUM_BYTES_TO_WRITE; /* Number of Bytes to be written */
Pokitto 31:f4b9b85c7b62 262 command[4] = SystemCoreClock / 1000; /* System clock frequency */
Pokitto 31:f4b9b85c7b62 263 iap_entry(command, result);
Pokitto 31:f4b9b85c7b62 264
Pokitto 31:f4b9b85c7b62 265 /* Re-enable interrupt mode */
Pokitto 31:f4b9b85c7b62 266 __enable_irq();
Pokitto 31:f4b9b85c7b62 267
Pokitto 31:f4b9b85c7b62 268 //while (1) {
Pokitto 31:f4b9b85c7b62 269 // __WFI();
Pokitto 31:f4b9b85c7b62 270 //}
Pokitto 31:f4b9b85c7b62 271
Pokitto 31:f4b9b85c7b62 272 return 0;
Pokitto 31:f4b9b85c7b62 273
Pokitto 31:f4b9b85c7b62 274 }
Pokitto 31:f4b9b85c7b62 275
Pokitto 31:f4b9b85c7b62 276
Pokitto 31:f4b9b85c7b62 277 //1) EEprom Write
Pokitto 31:f4b9b85c7b62 278 //
Pokitto 31:f4b9b85c7b62 279 //Command code: 61
Pokitto 31:f4b9b85c7b62 280 //Param0: eeprom address (byte, half-word or word aligned)
Pokitto 31:f4b9b85c7b62 281 //Param1: RAM address (byte, half-word or word aligned)
Pokitto 31:f4b9b85c7b62 282 //Param2: Number of bytes to be written ( Byte, Half-words write are ok)
Pokitto 31:f4b9b85c7b62 283 //Param3: System Clock Frequency (CCLK) in kHz
Pokitto 31:f4b9b85c7b62 284 //
Pokitto 31:f4b9b85c7b62 285 //Return Code CMD_SUCCESS | SRC_ADDR_NOT_MAPPED | DST_ADDR_NOT_MAPPED
Pokitto 31:f4b9b85c7b62 286 __attribute__((section(".IAP_Code"))) void writeEEPROM( uint16_t* eeAddress, uint8_t* buffAddress, uint32_t byteCount )
Pokitto 31:f4b9b85c7b62 287 {
Pokitto 31:f4b9b85c7b62 288 unsigned int command[5], result[4];
Pokitto 31:f4b9b85c7b62 289
Pokitto 31:f4b9b85c7b62 290 command[0] = 61;
Pokitto 31:f4b9b85c7b62 291 command[1] = (uint32_t) eeAddress;
Pokitto 31:f4b9b85c7b62 292 command[2] = (uint32_t) buffAddress;
Pokitto 31:f4b9b85c7b62 293 command[3] = byteCount;
Pokitto 31:f4b9b85c7b62 294 command[4] = SystemCoreClock/1000;
Pokitto 31:f4b9b85c7b62 295
Pokitto 31:f4b9b85c7b62 296 /* Invoke IAP call...*/
Pokitto 31:f4b9b85c7b62 297 #if (EEPROM_PROFILE!=0)
Pokitto 31:f4b9b85c7b62 298 LPC_CT32B0->TCR = 1;
Pokitto 31:f4b9b85c7b62 299 __disable_irq();
Pokitto 31:f4b9b85c7b62 300 iap_entry(command, result);
Pokitto 31:f4b9b85c7b62 301 __enable_irq();
Pokitto 31:f4b9b85c7b62 302 LPC_CT32B0->TCR = 0;
Pokitto 31:f4b9b85c7b62 303 #else
Pokitto 31:f4b9b85c7b62 304 __disable_irq();
Pokitto 31:f4b9b85c7b62 305 iap_entry(command, result);
Pokitto 31:f4b9b85c7b62 306 __enable_irq();
Pokitto 31:f4b9b85c7b62 307 #endif
Pokitto 31:f4b9b85c7b62 308 if (0 != result[0])
Pokitto 31:f4b9b85c7b62 309 {
Pokitto 31:f4b9b85c7b62 310 //Trap error
Pokitto 31:f4b9b85c7b62 311 while(1);
Pokitto 31:f4b9b85c7b62 312 }
Pokitto 31:f4b9b85c7b62 313 return;
Pokitto 31:f4b9b85c7b62 314 }
Pokitto 31:f4b9b85c7b62 315
Pokitto 31:f4b9b85c7b62 316 //2) EEprom Read
Pokitto 31:f4b9b85c7b62 317 //Command code: 62
Pokitto 31:f4b9b85c7b62 318 //Param0: eeprom address (byte, half-word or word aligned)
Pokitto 31:f4b9b85c7b62 319 //Param1: RAM address (byte, half-word or word aligned)
Pokitto 31:f4b9b85c7b62 320 //Param2: Number of bytes to be read ( Byte, Half-words read are ok)
Pokitto 31:f4b9b85c7b62 321 //Param3: System Clock Frequency (CCLK) in kHz
Pokitto 31:f4b9b85c7b62 322 //
Pokitto 31:f4b9b85c7b62 323 //Return Code CMD_SUCCESS | SRC_ADDR_NOT_MAPPED | DST_ADDR_NOT_MAPPED
Pokitto 31:f4b9b85c7b62 324 __attribute__((section(".IAP_Code"))) void readEEPROM( uint16_t* eeAddress, uint8_t* buffAddress, uint32_t byteCount )
Pokitto 31:f4b9b85c7b62 325 {
Pokitto 31:f4b9b85c7b62 326 unsigned int command[5], result[4];
Pokitto 31:f4b9b85c7b62 327
Pokitto 31:f4b9b85c7b62 328 command[0] = 62;
Pokitto 31:f4b9b85c7b62 329 command[1] = (uint32_t) eeAddress;
Pokitto 31:f4b9b85c7b62 330 command[2] = (uint32_t) buffAddress;
Pokitto 31:f4b9b85c7b62 331 command[3] = byteCount;
Pokitto 31:f4b9b85c7b62 332 command[4] = SystemCoreClock/1000;
Pokitto 31:f4b9b85c7b62 333
Pokitto 31:f4b9b85c7b62 334 /* Invoke IAP call...*/
Pokitto 31:f4b9b85c7b62 335 __disable_irq();
Pokitto 31:f4b9b85c7b62 336 iap_entry( command, result);
Pokitto 31:f4b9b85c7b62 337 __enable_irq();
Pokitto 31:f4b9b85c7b62 338 if (0 != result[0])
Pokitto 31:f4b9b85c7b62 339 {
Pokitto 31:f4b9b85c7b62 340 //Trap error
Pokitto 31:f4b9b85c7b62 341 while(1);
Pokitto 31:f4b9b85c7b62 342 }
Pokitto 31:f4b9b85c7b62 343 return;
Pokitto 31:f4b9b85c7b62 344 }
Pokitto 31:f4b9b85c7b62 345
Pokitto 31:f4b9b85c7b62 346 __attribute__((section(".IAP_Code"))) void IAPreadPartId( uint8_t* eeAddress, uint8_t* buffAddress, uint32_t byteCount )
Pokitto 31:f4b9b85c7b62 347 {
Pokitto 31:f4b9b85c7b62 348 unsigned int command[5], result[4];
Pokitto 31:f4b9b85c7b62 349
Pokitto 31:f4b9b85c7b62 350 command[0] = 62;
Pokitto 31:f4b9b85c7b62 351 command[1] = (uint32_t) eeAddress;
Pokitto 31:f4b9b85c7b62 352 command[2] = (uint32_t) buffAddress;
Pokitto 31:f4b9b85c7b62 353 command[3] = byteCount;
Pokitto 31:f4b9b85c7b62 354 command[4] = SystemCoreClock/1000;
Pokitto 31:f4b9b85c7b62 355
Pokitto 31:f4b9b85c7b62 356 /* Invoke IAP call...*/
Pokitto 31:f4b9b85c7b62 357 __disable_irq();
Pokitto 31:f4b9b85c7b62 358 iap_entry( command, result);
Pokitto 31:f4b9b85c7b62 359 __enable_irq();
Pokitto 31:f4b9b85c7b62 360 if (0 != result[0])
Pokitto 31:f4b9b85c7b62 361 {
Pokitto 31:f4b9b85c7b62 362 //Trap error
Pokitto 31:f4b9b85c7b62 363 while(1);
Pokitto 31:f4b9b85c7b62 364 }
Pokitto 31:f4b9b85c7b62 365 return;
Pokitto 31:f4b9b85c7b62 366 }
Pokitto 31:f4b9b85c7b62 367
Pokitto 31:f4b9b85c7b62 368 uint8_t eeprom_read_byte(uint16_t* index) {
Pokitto 31:f4b9b85c7b62 369 uint8_t val;
Pokitto 31:f4b9b85c7b62 370 readEEPROM(index,&val,1);
Pokitto 31:f4b9b85c7b62 371 return val;
Pokitto 31:f4b9b85c7b62 372 }
Pokitto 31:f4b9b85c7b62 373
Pokitto 31:f4b9b85c7b62 374 void eeprom_write_byte(uint16_t* index , uint8_t val) {
Pokitto 31:f4b9b85c7b62 375 writeEEPROM(index,&val,1);
Pokitto 31:f4b9b85c7b62 376 }
Pokitto 31:f4b9b85c7b62 377
Pokitto 31:f4b9b85c7b62 378 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 379 * $Id$
Pokitto 31:f4b9b85c7b62 380 *
Pokitto 31:f4b9b85c7b62 381 * Project: NXP LPC11U6x In Application Programming
Pokitto 31:f4b9b85c7b62 382 *
Pokitto 31:f4b9b85c7b62 383 * Description: Provides access to In-Application Programming (IAP) routines
Pokitto 31:f4b9b85c7b62 384 * contained within the bootROM sector of LPC11U6x devices.
Pokitto 31:f4b9b85c7b62 385 *
Pokitto 31:f4b9b85c7b62 386 * Copyright(C) 2010, NXP Semiconductor
Pokitto 31:f4b9b85c7b62 387 * All rights reserved.
Pokitto 31:f4b9b85c7b62 388 *
Pokitto 31:f4b9b85c7b62 389 *****************************************************************************
Pokitto 31:f4b9b85c7b62 390 * Software that is described herein is for illustrative purposes only
Pokitto 31:f4b9b85c7b62 391 * which provides customers with programming information regarding the
Pokitto 31:f4b9b85c7b62 392 * products. This software is supplied "AS IS" without any warranties.
Pokitto 31:f4b9b85c7b62 393 * NXP Semiconductors assumes no responsibility or liability for the
Pokitto 31:f4b9b85c7b62 394 * use of the software, conveys no license or title under any patent,
Pokitto 31:f4b9b85c7b62 395 * copyright, or mask work right to the product. NXP Semiconductors
Pokitto 31:f4b9b85c7b62 396 * reserves the right to make changes in the software without
Pokitto 31:f4b9b85c7b62 397 * notification. NXP Semiconductors also make no representation or
Pokitto 31:f4b9b85c7b62 398 * warranty that such application will be suitable for the specified
Pokitto 31:f4b9b85c7b62 399 * use without further testing or modification.
Pokitto 31:f4b9b85c7b62 400 *****************************************************************************/
Pokitto 31:f4b9b85c7b62 401
Pokitto 31:f4b9b85c7b62 402 /* IAP Command Definitions */
Pokitto 31:f4b9b85c7b62 403 #define IAP_CMD_PREPARE_SECTORS 50
Pokitto 31:f4b9b85c7b62 404 #define IAP_CMD_COPY_RAM_TO_FLASH 51
Pokitto 31:f4b9b85c7b62 405 #define IAP_CMD_ERASE_SECTORS 52
Pokitto 31:f4b9b85c7b62 406 #define IAP_CMD_BLANK_CHECK_SECTORS 53
Pokitto 31:f4b9b85c7b62 407 #define IAP_CMD_READ_PART_ID 54
Pokitto 31:f4b9b85c7b62 408 #define IAP_CMD_READ_BOOT_ROM_VERSION 55
Pokitto 31:f4b9b85c7b62 409 #define IAP_CMD_COMPARE 56
Pokitto 31:f4b9b85c7b62 410 #define IAP_CMD_REINVOKE_ISP 57
Pokitto 31:f4b9b85c7b62 411 #define IAP_CMD_READ_UID 58
Pokitto 31:f4b9b85c7b62 412
Pokitto 31:f4b9b85c7b62 413 #define IAP_CMD_ERASE_PAGE 59 //new
Pokitto 31:f4b9b85c7b62 414
Pokitto 31:f4b9b85c7b62 415 /* IAP boot ROM location and access function */
Pokitto 31:f4b9b85c7b62 416 #define IAP_ROM_LOCATION 0x1FFF1FF1UL
Pokitto 31:f4b9b85c7b62 417 //#define IAP_EXECUTE_CMD(a, b) ((void (*)())(IAP_ROM_LOCATION))(a, b)
Pokitto 31:f4b9b85c7b62 418
Pokitto 31:f4b9b85c7b62 419 __attribute__((section(".IAP_Code"))) void IAP_EXECUTE_CMD(uint32_t* a, uint32_t* b) {
Pokitto 31:f4b9b85c7b62 420 void (*user_code_entry)(uint32_t*,uint32_t*);
Pokitto 31:f4b9b85c7b62 421 uint32_t *p;
Pokitto 31:f4b9b85c7b62 422 p = (uint32_t *)IAP_ROM_LOCATION;
Pokitto 31:f4b9b85c7b62 423 user_code_entry = (void (*)(uint32_t*,uint32_t*))(*p);
Pokitto 31:f4b9b85c7b62 424 user_code_entry(a, b);
Pokitto 31:f4b9b85c7b62 425 }
Pokitto 31:f4b9b85c7b62 426
Pokitto 31:f4b9b85c7b62 427
Pokitto 31:f4b9b85c7b62 428 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 429 ** Function name: u32IAP_PrepareSectors
Pokitto 31:f4b9b85c7b62 430 **
Pokitto 31:f4b9b85c7b62 431 ** Description: Prepares sector(s) for erasing or write operations. This
Pokitto 31:f4b9b85c7b62 432 ** command must be executed before executing the "Copy RAM to
Pokitto 31:f4b9b85c7b62 433 ** Flash" or "Erase Sector(s)" commands.
Pokitto 31:f4b9b85c7b62 434 **
Pokitto 31:f4b9b85c7b62 435 ** Parameters: u32StartSector - Number of first sector to prepare.
Pokitto 31:f4b9b85c7b62 436 ** u32EndSector - Number of last sector to prepare.
Pokitto 31:f4b9b85c7b62 437 **
Pokitto 31:f4b9b85c7b62 438 ** Returned value: Status code returned by IAP ROM function.
Pokitto 31:f4b9b85c7b62 439 **
Pokitto 31:f4b9b85c7b62 440 ******************************************************************************/
Pokitto 31:f4b9b85c7b62 441 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_PrepareSectors(uint32_t u32StartSector, uint32_t u32EndSector)
Pokitto 31:f4b9b85c7b62 442 {
Pokitto 31:f4b9b85c7b62 443 uint32_t u32Status;
Pokitto 31:f4b9b85c7b62 444 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 445 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 446
Pokitto 31:f4b9b85c7b62 447 if (u32EndSector < u32StartSector)
Pokitto 31:f4b9b85c7b62 448 {
Pokitto 31:f4b9b85c7b62 449 u32Status = IAP_STA_INVALD_PARAM;
Pokitto 31:f4b9b85c7b62 450 }
Pokitto 31:f4b9b85c7b62 451 else
Pokitto 31:f4b9b85c7b62 452 {
Pokitto 31:f4b9b85c7b62 453 au32Command[0] = IAP_CMD_PREPARE_SECTORS;
Pokitto 31:f4b9b85c7b62 454 au32Command[1] = u32StartSector;
Pokitto 31:f4b9b85c7b62 455 au32Command[2] = u32EndSector;
Pokitto 31:f4b9b85c7b62 456 __disable_irq();
Pokitto 31:f4b9b85c7b62 457 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 458 __enable_irq();
Pokitto 31:f4b9b85c7b62 459 u32Status = au32Result[0];
Pokitto 31:f4b9b85c7b62 460 }
Pokitto 31:f4b9b85c7b62 461 return u32Status;
Pokitto 31:f4b9b85c7b62 462 }
Pokitto 31:f4b9b85c7b62 463
Pokitto 31:f4b9b85c7b62 464 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 465 ** Function name: u32IAP_CopyRAMToFlash
Pokitto 31:f4b9b85c7b62 466 **
Pokitto 31:f4b9b85c7b62 467 ** Description: Program the flash memory with data stored in RAM.
Pokitto 31:f4b9b85c7b62 468 **
Pokitto 31:f4b9b85c7b62 469 ** Parameters: u32DstAddr - Destination Flash address, should be a 256
Pokitto 31:f4b9b85c7b62 470 ** byte boundary.
Pokitto 31:f4b9b85c7b62 471 ** u32SrcAddr - Source RAM address, should be a word boundary
Pokitto 31:f4b9b85c7b62 472 ** u32Len - Number of 8-bit bytes to write, must be a
Pokitto 31:f4b9b85c7b62 473 ** multiple of 256.
Pokitto 31:f4b9b85c7b62 474 *
Pokitto 31:f4b9b85c7b62 475 ** Returned value: Status code returned by IAP ROM function.
Pokitto 31:f4b9b85c7b62 476 **
Pokitto 31:f4b9b85c7b62 477 ******************************************************************************/
Pokitto 31:f4b9b85c7b62 478 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_CopyRAMToFlash(uint32_t u32DstAddr, uint32_t u32SrcAddr, uint32_t u32Len)
Pokitto 31:f4b9b85c7b62 479 {
Pokitto 31:f4b9b85c7b62 480 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 481 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 482
Pokitto 31:f4b9b85c7b62 483 au32Command[0] = IAP_CMD_COPY_RAM_TO_FLASH;
Pokitto 31:f4b9b85c7b62 484 au32Command[1] = u32DstAddr;
Pokitto 31:f4b9b85c7b62 485 au32Command[2] = u32SrcAddr;
Pokitto 31:f4b9b85c7b62 486 au32Command[3] = u32Len;
Pokitto 31:f4b9b85c7b62 487 au32Command[4] = SystemCoreClock / 1000UL; /* Core clock frequency in kHz */
Pokitto 31:f4b9b85c7b62 488
Pokitto 31:f4b9b85c7b62 489 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 490
Pokitto 31:f4b9b85c7b62 491 return au32Result[0];
Pokitto 31:f4b9b85c7b62 492 }
Pokitto 31:f4b9b85c7b62 493
Pokitto 31:f4b9b85c7b62 494 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 495 ** Function name: u32IAP_EraseSectors
Pokitto 31:f4b9b85c7b62 496 **
Pokitto 31:f4b9b85c7b62 497 ** Description: Erase a sector or multiple sectors of on-chip Flash memory.
Pokitto 31:f4b9b85c7b62 498 **
Pokitto 31:f4b9b85c7b62 499 ** Parameters: u32StartSector - Number of first sector to erase.
Pokitto 31:f4b9b85c7b62 500 ** u32EndSector - Number of last sector to erase.
Pokitto 31:f4b9b85c7b62 501 *
Pokitto 31:f4b9b85c7b62 502 ** Returned value: Status code returned by IAP ROM function.
Pokitto 31:f4b9b85c7b62 503 **
Pokitto 31:f4b9b85c7b62 504 ******************************************************************************/
Pokitto 31:f4b9b85c7b62 505 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_EraseSectors(uint32_t u32StartSector, uint32_t u32EndSector)
Pokitto 31:f4b9b85c7b62 506 {
Pokitto 31:f4b9b85c7b62 507 uint32_t u32Status;
Pokitto 31:f4b9b85c7b62 508 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 509 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 510
Pokitto 31:f4b9b85c7b62 511 if (u32EndSector < u32StartSector)
Pokitto 31:f4b9b85c7b62 512 {
Pokitto 31:f4b9b85c7b62 513 u32Status = IAP_STA_INVALD_PARAM;
Pokitto 31:f4b9b85c7b62 514 }
Pokitto 31:f4b9b85c7b62 515 else
Pokitto 31:f4b9b85c7b62 516 {
Pokitto 31:f4b9b85c7b62 517 au32Command[0] = IAP_CMD_ERASE_SECTORS;
Pokitto 31:f4b9b85c7b62 518 au32Command[1] = u32StartSector;
Pokitto 31:f4b9b85c7b62 519 au32Command[2] = u32EndSector;
Pokitto 31:f4b9b85c7b62 520 au32Command[3] = SystemCoreClock / 1000UL; /* Core clock frequency in kHz */
Pokitto 31:f4b9b85c7b62 521
Pokitto 31:f4b9b85c7b62 522 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 523
Pokitto 31:f4b9b85c7b62 524 u32Status = au32Result[0];
Pokitto 31:f4b9b85c7b62 525 }
Pokitto 31:f4b9b85c7b62 526 return u32Status;
Pokitto 31:f4b9b85c7b62 527 }
Pokitto 31:f4b9b85c7b62 528
Pokitto 31:f4b9b85c7b62 529 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 530 ** Function name: u32IAP_BlankCheckSectors
Pokitto 31:f4b9b85c7b62 531 **
Pokitto 31:f4b9b85c7b62 532 ** Description: Blank check a sector or multiple sectors of on-chip flash
Pokitto 31:f4b9b85c7b62 533 ** memory.
Pokitto 31:f4b9b85c7b62 534 **
Pokitto 31:f4b9b85c7b62 535 ** Parameters: u32StartSector - Number of first sector to check.
Pokitto 31:f4b9b85c7b62 536 ** u32EndSector - Number of last sector to check.
Pokitto 31:f4b9b85c7b62 537 ** pu32Result[0] - Offset of the first non blank word location
Pokitto 31:f4b9b85c7b62 538 ** if the Status Code is IAP_STA_SECTOR_NOT_BLANK.
Pokitto 31:f4b9b85c7b62 539 ** pu32Result[1] - Contents of non blank word location.
Pokitto 31:f4b9b85c7b62 540 **
Pokitto 31:f4b9b85c7b62 541 ** Returned value: Status code returned by IAP ROM function.
Pokitto 31:f4b9b85c7b62 542 **
Pokitto 31:f4b9b85c7b62 543 ******************************************************************************/
Pokitto 31:f4b9b85c7b62 544 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_BlankCheckSectors(uint32_t u32StartSector, uint32_t u32EndSector, uint32_t *pu32Result)
Pokitto 31:f4b9b85c7b62 545 {
Pokitto 31:f4b9b85c7b62 546 uint32_t u32Status;
Pokitto 31:f4b9b85c7b62 547 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 548 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 549
Pokitto 31:f4b9b85c7b62 550 if (u32EndSector < u32StartSector)
Pokitto 31:f4b9b85c7b62 551 {
Pokitto 31:f4b9b85c7b62 552 u32Status = IAP_STA_INVALD_PARAM;
Pokitto 31:f4b9b85c7b62 553 }
Pokitto 31:f4b9b85c7b62 554 else
Pokitto 31:f4b9b85c7b62 555 {
Pokitto 31:f4b9b85c7b62 556 au32Command[0] = IAP_CMD_BLANK_CHECK_SECTORS;
Pokitto 31:f4b9b85c7b62 557 au32Command[1] = u32StartSector;
Pokitto 31:f4b9b85c7b62 558 au32Command[2] = u32EndSector;
Pokitto 31:f4b9b85c7b62 559
Pokitto 31:f4b9b85c7b62 560 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 561
Pokitto 31:f4b9b85c7b62 562 if (au32Result[0] == IAP_STA_SECTOR_NOT_BLANK)
Pokitto 31:f4b9b85c7b62 563 {
Pokitto 31:f4b9b85c7b62 564 *pu32Result = au32Result[0];
Pokitto 31:f4b9b85c7b62 565 *(pu32Result + 1) = au32Result[1];
Pokitto 31:f4b9b85c7b62 566 }
Pokitto 31:f4b9b85c7b62 567 u32Status = au32Result[0];
Pokitto 31:f4b9b85c7b62 568 }
Pokitto 31:f4b9b85c7b62 569 return u32Status;
Pokitto 31:f4b9b85c7b62 570 }
Pokitto 31:f4b9b85c7b62 571
Pokitto 31:f4b9b85c7b62 572 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 573 ** Function name: u32IAP_ReadPartID
Pokitto 31:f4b9b85c7b62 574 **
Pokitto 31:f4b9b85c7b62 575 ** Description: Read the part identification number.
Pokitto 31:f4b9b85c7b62 576 **
Pokitto 31:f4b9b85c7b62 577 ** Parameters: pu32PartID - Pointer to storage for part ID number.
Pokitto 31:f4b9b85c7b62 578 *
Pokitto 31:f4b9b85c7b62 579 ** Returned value: Status code returned by IAP ROM function.
Pokitto 31:f4b9b85c7b62 580 **
Pokitto 31:f4b9b85c7b62 581 ******************************************************************************/
Pokitto 31:f4b9b85c7b62 582 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_ReadPartID(uint32_t *pu32PartID)
Pokitto 31:f4b9b85c7b62 583 {
Pokitto 31:f4b9b85c7b62 584 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 585 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 586
Pokitto 31:f4b9b85c7b62 587 au32Command[0] = IAP_CMD_READ_PART_ID;
Pokitto 31:f4b9b85c7b62 588 __disable_irq();
Pokitto 31:f4b9b85c7b62 589 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 590 __enable_irq();
Pokitto 31:f4b9b85c7b62 591 *pu32PartID = au32Result[1];
Pokitto 31:f4b9b85c7b62 592
Pokitto 31:f4b9b85c7b62 593 return au32Result[0];
Pokitto 31:f4b9b85c7b62 594 }
Pokitto 31:f4b9b85c7b62 595
Pokitto 31:f4b9b85c7b62 596 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 597 ** Function name: u32IAP_ReadBootVersion
Pokitto 31:f4b9b85c7b62 598 **
Pokitto 31:f4b9b85c7b62 599 ** Description: Read the boot code version number.
Pokitto 31:f4b9b85c7b62 600 **
Pokitto 31:f4b9b85c7b62 601 ** Parameters: pu32Major - Major version number in ASCII format.
Pokitto 31:f4b9b85c7b62 602 ** pu32Minor - Minor version number in ASCII format.
Pokitto 31:f4b9b85c7b62 603 **
Pokitto 31:f4b9b85c7b62 604 ** Returned value: Status code returned by IAP ROM function.
Pokitto 31:f4b9b85c7b62 605 **
Pokitto 31:f4b9b85c7b62 606 ******************************************************************************/
Pokitto 31:f4b9b85c7b62 607 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_ReadBootVersion(uint32_t *pu32Major, uint32_t *pu32Minor)
Pokitto 31:f4b9b85c7b62 608 //uint32_t u32IAP_ReadBootVersion(uint32_t *pu32Major)
Pokitto 31:f4b9b85c7b62 609 {
Pokitto 31:f4b9b85c7b62 610 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 611 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 612
Pokitto 31:f4b9b85c7b62 613 au32Command[0] = IAP_CMD_READ_BOOT_ROM_VERSION;
Pokitto 31:f4b9b85c7b62 614
Pokitto 31:f4b9b85c7b62 615 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 616
Pokitto 31:f4b9b85c7b62 617
Pokitto 31:f4b9b85c7b62 618 *pu32Major = (au32Result[1] & 0x0000FF00UL) >> 8;
Pokitto 31:f4b9b85c7b62 619 *pu32Minor = au32Result[1] & 0x000000FFUL;
Pokitto 31:f4b9b85c7b62 620
Pokitto 31:f4b9b85c7b62 621 return au32Result[0];
Pokitto 31:f4b9b85c7b62 622 }
Pokitto 31:f4b9b85c7b62 623
Pokitto 31:f4b9b85c7b62 624 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 625 ** Function name: u32IAP_Compare
Pokitto 31:f4b9b85c7b62 626 **
Pokitto 31:f4b9b85c7b62 627 ** Description: Compares the memory contents at two locations.
Pokitto 31:f4b9b85c7b62 628 **
Pokitto 31:f4b9b85c7b62 629 ** Parameters: u32Len - Number of bytes to compare, must be a multiple of 4.
Pokitto 31:f4b9b85c7b62 630 ** pu32Offset - Offset of the first mismatch if the Status Code is COMPARE_ERROR
Pokitto 31:f4b9b85c7b62 631 **
Pokitto 31:f4b9b85c7b62 632 ** Returned value: Status code returned by IAP ROM function.
Pokitto 31:f4b9b85c7b62 633 **
Pokitto 31:f4b9b85c7b62 634 ******************************************************************************/
Pokitto 31:f4b9b85c7b62 635 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_Compare(uint32_t u32DstAddr, uint32_t u32SrcAddr, uint32_t u32Len, uint32_t *pu32Offset)
Pokitto 31:f4b9b85c7b62 636 {
Pokitto 31:f4b9b85c7b62 637 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 638 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 639
Pokitto 31:f4b9b85c7b62 640 au32Command[0] = IAP_CMD_COMPARE;
Pokitto 31:f4b9b85c7b62 641 au32Command[1] = u32DstAddr;
Pokitto 31:f4b9b85c7b62 642 au32Command[2] = u32SrcAddr;
Pokitto 31:f4b9b85c7b62 643 au32Command[3] = u32Len;
Pokitto 31:f4b9b85c7b62 644
Pokitto 31:f4b9b85c7b62 645 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 646
Pokitto 31:f4b9b85c7b62 647 if (au32Result[0] == IAP_STA_COMPARE_ERROR)
Pokitto 31:f4b9b85c7b62 648 {
Pokitto 31:f4b9b85c7b62 649 if (pu32Offset != 0)
Pokitto 31:f4b9b85c7b62 650 {
Pokitto 31:f4b9b85c7b62 651 *pu32Offset = au32Result[1];
Pokitto 31:f4b9b85c7b62 652 }
Pokitto 31:f4b9b85c7b62 653 }
Pokitto 31:f4b9b85c7b62 654 return au32Result[0];
Pokitto 31:f4b9b85c7b62 655 }
Pokitto 31:f4b9b85c7b62 656
Pokitto 31:f4b9b85c7b62 657 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 658 ** Function name: vIAP_ReinvokeISP
Pokitto 31:f4b9b85c7b62 659 **
Pokitto 31:f4b9b85c7b62 660 ** Description: Invoke the bootloader in ISP mode.
Pokitto 31:f4b9b85c7b62 661 **
Pokitto 31:f4b9b85c7b62 662 ** Parameters: None.
Pokitto 31:f4b9b85c7b62 663 *
Pokitto 31:f4b9b85c7b62 664 ** Returned value: None.
Pokitto 31:f4b9b85c7b62 665 **
Pokitto 31:f4b9b85c7b62 666 ******************************************************************************/
Pokitto 31:f4b9b85c7b62 667 __attribute__((section(".IAP_Code"))) void vIAP_ReinvokeISP(void)
Pokitto 31:f4b9b85c7b62 668 {
Pokitto 31:f4b9b85c7b62 669 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 670 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 671
Pokitto 31:f4b9b85c7b62 672 au32Command[0] = IAP_CMD_REINVOKE_ISP;
Pokitto 31:f4b9b85c7b62 673
Pokitto 31:f4b9b85c7b62 674 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 675 }
Pokitto 31:f4b9b85c7b62 676
Pokitto 31:f4b9b85c7b62 677 // read UID
Pokitto 31:f4b9b85c7b62 678 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_ReadUID(uint32_t * pu32UID)
Pokitto 31:f4b9b85c7b62 679 {
Pokitto 31:f4b9b85c7b62 680 uint32_t au32Result[5];
Pokitto 31:f4b9b85c7b62 681 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 682
Pokitto 31:f4b9b85c7b62 683 au32Command[0] = IAP_CMD_READ_UID;
Pokitto 31:f4b9b85c7b62 684
Pokitto 31:f4b9b85c7b62 685 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 686 // *pu32UID++ = au32Result[1];
Pokitto 31:f4b9b85c7b62 687 // *pu32UID++ = au32Result[2];
Pokitto 31:f4b9b85c7b62 688 // *pu32UID++ = au32Result[3];
Pokitto 31:f4b9b85c7b62 689 // *pu32UID = au32Result[4];
Pokitto 31:f4b9b85c7b62 690
Pokitto 31:f4b9b85c7b62 691 *pu32UID = au32Result[1];
Pokitto 31:f4b9b85c7b62 692 *pu32UID++ = au32Result[2];
Pokitto 31:f4b9b85c7b62 693 *pu32UID++ = au32Result[3];
Pokitto 31:f4b9b85c7b62 694 *pu32UID++ = au32Result[4];
Pokitto 31:f4b9b85c7b62 695
Pokitto 31:f4b9b85c7b62 696 return au32Result[0];
Pokitto 31:f4b9b85c7b62 697
Pokitto 31:f4b9b85c7b62 698 }
Pokitto 31:f4b9b85c7b62 699
Pokitto 31:f4b9b85c7b62 700 //IAP erase Page 256B 64K have 0-255 pages, page0-15 in sector 0, 32K have 0-127 pages, 128k have 0-511 pages,
Pokitto 31:f4b9b85c7b62 701 __attribute__((section(".IAP_Code"))) uint32_t u32IAP_ErasePage(uint32_t u32StartPage, uint32_t u32EndPage)
Pokitto 31:f4b9b85c7b62 702 {
Pokitto 31:f4b9b85c7b62 703 uint32_t u32Status;
Pokitto 31:f4b9b85c7b62 704 uint32_t au32Result[3];
Pokitto 31:f4b9b85c7b62 705 uint32_t au32Command[5];
Pokitto 31:f4b9b85c7b62 706
Pokitto 31:f4b9b85c7b62 707 if (u32EndPage < u32StartPage)
Pokitto 31:f4b9b85c7b62 708 {
Pokitto 31:f4b9b85c7b62 709 u32Status = IAP_STA_INVALD_PARAM;
Pokitto 31:f4b9b85c7b62 710 }
Pokitto 31:f4b9b85c7b62 711 else
Pokitto 31:f4b9b85c7b62 712 {
Pokitto 31:f4b9b85c7b62 713 au32Command[0] = IAP_CMD_ERASE_PAGE;
Pokitto 31:f4b9b85c7b62 714 au32Command[1] = u32StartPage;
Pokitto 31:f4b9b85c7b62 715 au32Command[2] = u32EndPage;
Pokitto 31:f4b9b85c7b62 716 au32Command[3] = SystemCoreClock / 1000UL; /* Core clock frequency in kHz */
Pokitto 31:f4b9b85c7b62 717
Pokitto 31:f4b9b85c7b62 718 IAP_EXECUTE_CMD(au32Command, au32Result);
Pokitto 31:f4b9b85c7b62 719
Pokitto 31:f4b9b85c7b62 720 u32Status = au32Result[0];
Pokitto 31:f4b9b85c7b62 721 }
Pokitto 31:f4b9b85c7b62 722 return u32Status;
Pokitto 31:f4b9b85c7b62 723 }
Pokitto 31:f4b9b85c7b62 724
Pokitto 31:f4b9b85c7b62 725
Pokitto 31:f4b9b85c7b62 726 /*****************************************************************************
Pokitto 31:f4b9b85c7b62 727 ** End Of File
Pokitto 31:f4b9b85c7b62 728 *****************************************************************************/
Pokitto 31:f4b9b85c7b62 729
Pokitto 31:f4b9b85c7b62 730