Exemplo n.º 1
0
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");
	}
}
Exemplo n.º 2
0
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;
	}
}
Exemplo n.º 3
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);
        }

}
Exemplo n.º 4
0
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
    }
  }
}
Exemplo n.º 5
0
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;
}