Esempio n. 1
0
bool FLASH_LoadNV(const uint8* data, uint32 size)
{
	FlashFileHeader header;
	std::vector<uint8> flashdata;

	//Initialise the internal flash configuration
	block_count = 0;

	//Read flash buffer header
	if (size < sizeof(FlashFileHeader))
		return false;
	memcpy((uint8 *)&header, data, sizeof(FlashFileHeader));

	//Verify correct flash id
	if (header.valid_flash_id != FLASH_VALID_ID)
	{
		return false;
		//throw MDFN_Error(0, _("FLASH header ID is bad!"));
	}

	if (header.total_file_length < sizeof(FlashFileHeader) || header.total_file_length > 16384 * 1024)
	{
		return false;
		//throw MDFN_Error(0, _("FLASH header total_file_length is bad!"));
	}

	if (size < header.total_file_length)
		return false;

	flashdata.resize(header.total_file_length);
	memcpy(&flashdata[0], data, flashdata.size());

	if (!do_flash_read(&flashdata[0]))
		return false;

	return true;
}
Esempio n. 2
0
uint8_t cmd_loop() {
  uint8_t cmd;
  do {
    uint32_t args[4];
    uint32_t len = SLIP_recv(&cmd, 1);
    if (len != 1) {
      continue;
    }
    uint8_t resp = 0xff;
    switch (cmd) {
      case CMD_FLASH_ERASE: {
        len = SLIP_recv(args, sizeof(args));
        if (len == 8) {
          resp = do_flash_erase(args[0] /* addr */, args[1] /* len */);
        } else {
          resp = 0x31;
        }
        break;
      }
      case CMD_FLASH_WRITE: {
        len = SLIP_recv(args, sizeof(args));
        if (len == 12) {
          resp = do_flash_write(args[0] /* addr */, args[1] /* len */,
                                args[2] /* erase */);
        } else {
          resp = 0x41;
        }
        break;
      }
      case CMD_FLASH_READ: {
        len = SLIP_recv(args, sizeof(args));
        if (len == 16) {
          resp = do_flash_read(args[0] /* addr */, args[1], /* len */
                               args[2] /* block_size */,
                               args[3] /* max_in_flight */);
        } else {
          resp = 0x51;
        }
        break;
      }
      case CMD_FLASH_DIGEST: {
        len = SLIP_recv(args, sizeof(args));
        if (len == 12) {
          resp = do_flash_digest(args[0] /* addr */, args[1], /* len */
                                 args[2] /* digest_block_size */);
        } else {
          resp = 0x61;
        }
        break;
      }
      case CMD_FLASH_READ_CHIP_ID: {
        resp = do_flash_read_chip_id();
        break;
      }
      case CMD_FLASH_ERASE_CHIP: {
        resp = SPIEraseChip();
        break;
      }
      case CMD_BOOT_FW:
      case CMD_REBOOT: {
        resp = 0;
        SLIP_send(&resp, 1);
        return cmd;
      }
    }
    SLIP_send(&resp, 1);
  } while (cmd != CMD_BOOT_FW && cmd != CMD_REBOOT);
  return cmd;
}