71 #define IAP_PREP_SECS 50
72 #define IAP_RAM_TO_FLASH 51
73 #define IAP_ERASE_SECS 52
74 #define IAP_BLANK_CHECK_SECS 53
75 #define IAP_READ_PART_ID 54
76 #define IAP_READ_BOOT_CODE_VER 55
77 #define IAP_READ_DEV_SERIAL_NUM 58
78 #define IAP_COMPARE 56
79 #define IAP_REINVOKE_ISP 57
80 #define IAP_ERASE_PAGE 59
81 #define IAP_SET_ACTIVE_FLASH_BANK 60
84 #define IAP_COMMAND_SUCCESS 0x00
85 #define IAP_INVALID_COMMAND 0x01
86 #define IAP_SRC_ADDR_ERROR 0x02
87 #define IAP_DST_ADDR_ERROR 0x03
88 #define IAP_SRC_ADDR_NOT_MAPPED 0x04
89 #define IAP_DST_ADDR_NOT_MAPPED 0x05
90 #define IAP_COUNT_ERROR 0x06
91 #define IAP_INVALID_SECTOR 0x - 7
92 #define IAP_SECTOR_NOT_BLANK 0x08
93 #define IAP_SECTOR_NOT_PREPARED 0x09
94 #define IAP_COMPARE_ERROR 0x0A
96 #define IAP_PARAM_ERROR 0x0C
97 #define IAP_ADDR_ERROR 0x0D
98 #define IAP_ADDR_NOT_MAPPED 0x0E
99 #define IAP_CMD_LOCKED 0x0F
100 #define IAP_INVALID_CODE 0x10
101 #define IAP_INVALID_BAUD_RATE 0x11
102 #define IAP_INVALID_STOP_BIT 0x12
103 #define IAP_CRP_ENABLED 0x13
104 #define IAP_INVALID_FLASH_UNIT 0x14
105 #define IAP_USER_CODE_CHECKSUM 0x15
106 #define IAP_ERROR_SETTING_ACTIVE_PART 0x16
109 #define FLASHMAXSIZE (512 * 1024)
113 #define CPUCLOCKFRQINKHZ 90000
121 {0x00000000, 0x00002000},
122 {0x00002000, 0x00002000},
123 {0x00004000, 0x00002000},
124 {0x00006000, 0x00002000},
125 {0x00008000, 0x00002000},
126 {0x0000A000, 0x00002000},
127 {0x0000C000, 0x00002000},
128 {0x0000E000, 0x00002000},
129 {0x00010000, 0x00010000},
130 {0x00020000, 0x00010000},
131 {0x00030000, 0x00010000},
132 {0x00040000, 0x00010000},
133 {0x00050000, 0x00010000},
134 {0x00060000, 0x00010000},
135 {0x00070000, 0x00010000},
136 {0xFFFFFFFF, 0xFFFFFFFF}
140 #define PAGE_SIZE 512
144 #define IAP_LOCATION *((uint32_t *) 0x10400100);
158 #define DFU_BUFF_PROG_SIZE PAGE_SIZE
169 #define PROGRAM_REGIONS 2
174 {0x00000000, 0x00000000},
175 {0x00000000, 0x00000000}
206 for (bank = 0; bank < dfuregion.
num_regions; bank++) {
207 if ((addr >= pregions[bank].region_addr) &&
208 (addr < (pregions[bank].region_addr + pregions[bank].region_size))) {
227 usbDebug(
"FLASH: Address does not map to bank\n");
233 usbDebug(
"FLASH: Address is not 512 byte aligned\n");
240 usbDebug(
"FLASH: Size must be a multiple of 512 bytes\n");
258 uint32_t addrend, addrbase, regstart, regend;
265 addrend = addr + size - 1;
274 *secstart = 0xFFFFFFFF;
275 while ((*secstart == 0xFFFFFFFF) && (idx != -1)) {
276 if (sectorinfo[idx].sector_offset == 0xFFFFFFFF) {
281 regend = regstart + sectorinfo[idx].
sector_size - 1;
282 if ((addr >= regstart) && (addr <= regend)) {
287 if (addr == regstart) {
307 *secend = 0xFFFFFFFF;
308 while ((*secend == 0xFFFFFFFF) && (idx != -1)) {
309 if (sectorinfo[idx].sector_offset == 0xFFFFFFFF) {
314 regend = regstart + sectorinfo[idx].
sector_size - 1;
315 if ((addrend >= regstart) && (addrend <= regend)) {
320 if (addrend == regend) {
354 sprintf(
tempSTR,
"ERASE: Error preparing sectors %d-%d (bank %d)\n",
355 secstart, secend, bank);
374 sprintf(
tempSTR,
"ERASE: Error erasing sectors %d-%d (bank %d)\n",
375 secstart, secend, bank);
388 sprintf(
tempSTR,
"ERASE: %p with size %p\n",
389 (
void *) start, (
void *) size);
394 usbDebug(
"ERASE: address/size validation failure\r\n");
400 &secstart, &secend, &aligned) == 0) {
401 usbDebug(
"ERASE: sector range lookup failure\r\n");
407 usbDebug(
"ERASE: Address range must be sector aligned\r\n");
411 sprintf(
tempSTR,
"ERASE: Bank %d, Start sec %d, End sec %d\n",
412 bank, secstart, secend);
432 usbDebug(
"ERASE: Error erasing sectors\r\n");
450 for (bank = 0; bank < dfuregion.
num_regions; bank++) {
452 pregions[bank].region_size) == 0) {
469 uint32_t secstart, secend, offset, wsize = size;
470 uint8_t *fbuff = (uint8_t *) buff;
472 sprintf(
tempSTR,
"WRITE: %p with size %p\n", (
void *) start, (
void *) size);
479 usbDebug(
"WRITE: Program buffer too big\r\n");
492 sprintf(
tempSTR,
"WRITE: Last sector too small, padded %d bytes\n",
499 usbDebug(
"WRITE: Input address/size is not valid\r\n");
505 &secstart, &secend, &aligned) == 0) {
506 usbDebug(
"WRITE: sector range lookup failure\r\n");
511 sprintf(
tempSTR,
"WRITE: programming: Bank %d, Start sec %d, End sec %d offset %d size %d\n",
512 bank, secstart, secend, offset, wsize);
528 usbDebug(
"WRITE: Error programming address range\r\n");
539 usbDebug(
"WRITE: Verify error on program\r\n");
550 sprintf(
tempSTR,
"READ @ 0x%p, %p bytes\n", (
void *) start, (
void *) size);
554 memmove(buff, (
void *) start, size);
563 const int bank_shift[2] = {0, 4};
564 const int bank_mask[2] = {0x0F, 0xF0};
566 flash_size = ((part_id2 & bank_mask[bank]) >> bank_shift[bank]) * 0x10000;
591 const uint32_t bankAddress[2] = {0x1A000000, 0x1B000000};
598 if (*iapTest32 == 0) {
599 usbDebug(
"FLASH not supported on this device");
612 for (idx = 0; idx < 2; idx++) {
615 if (pregions[idx].region_size > 0) {
628 for (idx = 0; idx < dfuregion.
num_regions; idx++) {
629 sprintf(
tempSTR,
"FLASH bank %d: Start: %p, Size %p\n", idx,
630 (
void *) pregions[idx].region_addr, (
void *) pregions[idx].region_size);