void dfuExecCommand() { if (dfuSubCommand == DFU_CMD_ERASE_PAGE) { debug("erasing ...\n"); if (address >= ENTRY && address <= FLASH_END) { eraseFlash(address); } else { dfu_status.bState = dfuERROR; dfu_status.bStatus = errADDRESS; } } else if (dfuSubCommand == DFU_CMD_MASS_ERASE) { u32 erase_address; debug("start mass-erase\n"); for (erase_address = ENTRY; erase_address < FLASH_END; erase_address += ERASE_PAGE_SIZE) { eraseFlash(erase_address); } debug("stop mass-erase\n"); } else if (dfuSubCommand == DFU_CMD_DOWNLOAD) { if (address >= ENTRY && address <= FLASH_END) { int counter; int written = 0; if ((FLASH_END - address + 1) < transfer_length) { transfer_length = FLASH_END - address + 1; } counter = transfer_length; debug2("writing address: %lx\n", address); while (counter > 0) { if (counter >= FLASH_WRITE_SIZE) { writeFlash(address + written, (u8 __data *)&transfer[written], FLASH_WRITE_SIZE); } else { writeFlash(address + written, (u8 __data *)&transfer[written], counter); } counter = counter - FLASH_WRITE_SIZE; written = written + FLASH_WRITE_SIZE; } } else { dfu_status.bState = dfuERROR; dfu_status.bStatus = errADDRESS; } } else { debug("do nothing\n"); } }
void run_task(uint8_t *Task) { switch(Task[2]) { case '0': send_string("boot"); break; case '1': page_address = Task[9] << 8; page_address |= Task[8]; readFlashPage(page_address, 128); send_buff(gBuffer, 128); Task[2] = 0; break; case '2': Task[2] = 0; break; case '3': page_address = Task[9] << 8; page_address |= Task[8]; for (uint16_t i = 0; i < SPM_PAGESIZE; i++) gBuffer[i] = data_buffer[i + 16]; writeFlashPage(page_address,SPM_PAGESIZE); send_string("page done"); Task[2] = 0; break; case '4': eraseFlash(); send_string("erase ok"); Task[2] = 0; break; case '5': Task[2] = 0; break; case '6': fill_page(); send_buff(gBuffer, 256); Task[2] = 0; break; case '7': blink_led(); Task[2] = 0; break; case '8': MCUCR |= 1<<IVCE; MCUCR = 0<<IVSEL; send_string("jump ok"); jump_to_app(); // Jump to application sector Task[2] = 0; break; default: Task[2] = 0; } }
void writeWordFlash(uint32_t address,uint32_t data){ if (address >= StartAppVectPhysical && (address < EndAppVectPhysical)){ NVMWriteWord((uint32_t*)address, data); if ((*(int *)(address|0x80000000)) != data){ println_E("FAULT read did not match write on address: ");prHEX32(address,ERROR_PRINT); eraseFlash(); callBootloaderReset(); } }else{ println_E("FAULT can not reach address: ");prHEX32(address,ERROR_PRINT); } }
Cstorage::Cstorage(Cat45db041* flashdrv) { u08 buf[pageSize]; this->flashdrv = flashdrv; // Check if FLASH storage has been initialized flashdrv->read(buf, configBasePage); memcpy((u08*) &flash, buf, sizeof(flash)); if (flash.magic != FLASH_MAGIC_NUM_0) { #ifndef LOADER eraseFlash(); #endif } // Check if storage has been initilized. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { eeprom_read_block(&eeprom, 0, sizeof(eeprom)); if (eeprom.magic != EEPROM_MAGIC_NUM_0) { #ifndef LOADER eraseEeprom(); #endif } } }
int main(int argc, char *argv[]) { int speed = B115200; const char *device = "/dev/ttyUSB0"; unsigned char x; int fd, n; unsigned char buf[32768]; unsigned do_erase = 0; unsigned do_write = 0; unsigned do_exec = 0; unsigned addr = 0; if (argc < 2) return usage(); if (!strcmp(argv[1],"erase")) { do_erase = 1; } else if (!strcmp(argv[1],"flash")) { do_erase = 1; do_write = 1; addr = 0x08000000; } else if (!strcmp(argv[1],"exec")) { do_write = 1; do_exec = 1; addr = 0x20001000; } else { return usage(); } if (do_write && argc != 3) return usage(); fd = openserial(device, speed); if (fd < 0) { fprintf(stderr, "stderr open '%s'\n", device); return -1; } n = TIOCM_DTR; ioctl(fd, TIOCMBIS, &n); usleep(2500); ioctl(fd, TIOCMBIC, &n); usleep(2500); /* If the board just powered up, we need to send an ACK * to auto-baud and will get an ACK back. If the board * is already up, two ACKs will get a NAK (invalid cmd). * Either way, we're talking! */ for (n = 0; n < 5; n++) { unsigned char SYNC = 0x7F; if (write(fd, &SYNC, 1)) { /* do nothing */ } if (read(fd, &x, 1) != 1) continue; if ((x == 0x79) || (x == 0x1f)) break; } if (n == 5) { fprintf(stderr,"sync failure\n"); return -1; } #if 0 readMemory(fd, 0x1FFFF000, buf, 4096); for (n = 0; n < 1024; n++) fprintf(stderr,"%02x ", buf[n]); return 0; #endif if (do_write) { int fd2 = open(argv[2], O_RDONLY); n = read(fd2, buf, sizeof(buf)); close(fd2); if ((fd2 < 0) || (n <= 0)) { fprintf(stderr,"cannot read '%s'\n", argv[2]); return -1; } n += (n % 4); if (do_erase) { fprintf(stderr,"erasing flash...\n"); if (eraseFlash(fd)) { fprintf(stderr,"erase failed\n"); return -1; } } fprintf(stderr,"sending %d bytes...\n", n); if (writeMemory(fd, addr, buf, n)) { fprintf(stderr,"write failed\n"); return -1; } fprintf(stderr,"done\n"); if (do_exec) { jumpToAddress(fd, addr); } else { return 0; } } else if (do_erase) { if (eraseFlash(fd)) { fprintf(stderr,"erase failed\n"); return -1; } fprintf(stderr,"flash erased\n"); return 0; } for (;;) { if (read(fd, &x, 1) == 1) { if (x == 27) break; if ((x < 0x20) || (x > 0x7f)) if ((x != 10) && (x != 13)) x = '.'; fprintf(stderr,"%c", x); } } return 0; }