PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)

Committer:
Pokitto
Date:
Tue Jan 30 10:41:47 2018 +0000
Revision:
31:f4b9b85c7b62
Sound output improvements added:  louder, clearer, faster!

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