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; }
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; }