all devices: use spiFlash dump & verify
This commit is contained in:
parent
f5254294eb
commit
3983726a66
|
|
@ -100,30 +100,8 @@ void Efinix::program(unsigned int offset)
|
||||||
flash.erase_and_prog(offset, data, length);
|
flash.erase_and_prog(offset, data, length);
|
||||||
|
|
||||||
/* verify write if required */
|
/* verify write if required */
|
||||||
if (_verify) {
|
if (_verify)
|
||||||
printInfo("Verifying write");
|
flash.verify(offset, data, length);
|
||||||
std::string verify_data;
|
|
||||||
verify_data.resize(length);
|
|
||||||
printInfo("Read flash ", false);
|
|
||||||
if (0 != flash.read(offset, (uint8_t*)&verify_data[0], length)) {
|
|
||||||
printError("FAIL");
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
printSuccess("DONE");
|
|
||||||
}
|
|
||||||
|
|
||||||
ProgressBar progress("Check", length, 50, _quiet);
|
|
||||||
for (int i = 0; i < length; i++) {
|
|
||||||
if ((uint8_t)verify_data[i] != data[i]) {
|
|
||||||
progress.fail();
|
|
||||||
printError("Verification failed at " +
|
|
||||||
std::to_string(offset + i));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
progress.display(i);
|
|
||||||
}
|
|
||||||
progress.done();
|
|
||||||
}
|
|
||||||
|
|
||||||
_spi->gpio_set(_rst_pin);
|
_spi->gpio_set(_rst_pin);
|
||||||
usleep(12000);
|
usleep(12000);
|
||||||
|
|
@ -145,37 +123,20 @@ bool Efinix::dumpFlash(const std::string &filename,
|
||||||
uint32_t timeout = 1000;
|
uint32_t timeout = 1000;
|
||||||
_spi->gpio_clear(_rst_pin);
|
_spi->gpio_clear(_rst_pin);
|
||||||
|
|
||||||
std::string data;
|
|
||||||
data.resize(len);
|
|
||||||
|
|
||||||
/* prepare SPI access */
|
/* prepare SPI access */
|
||||||
printInfo("Read Flash ", false);
|
printInfo("Read Flash ", false);
|
||||||
try {
|
try {
|
||||||
SPIFlash flash(reinterpret_cast<SPIInterface *>(_spi), _verbose);
|
SPIFlash flash(reinterpret_cast<SPIInterface *>(_spi), _verbose);
|
||||||
flash.reset();
|
flash.reset();
|
||||||
flash.power_up();
|
flash.power_up();
|
||||||
flash.read_id();
|
flash.dump(filename, base_addr, len);
|
||||||
flash.read_status_reg();
|
|
||||||
flash.read(base_addr, (uint8_t*)&data[0], len);
|
|
||||||
} catch (std::exception &e) {
|
} catch (std::exception &e) {
|
||||||
printError("Fail");
|
printError("Fail");
|
||||||
printError(std::string(e.what()));
|
printError(std::string(e.what()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *fd = fopen(filename.c_str(), "wb");
|
/* release SPI access */
|
||||||
if (!fd) {
|
|
||||||
printError("Fail");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
fwrite(data.c_str(), sizeof(uint8_t), len, fd);
|
|
||||||
fclose(fd);
|
|
||||||
|
|
||||||
printSuccess("Done");
|
|
||||||
|
|
||||||
/* prepare SPI access */
|
|
||||||
|
|
||||||
_spi->gpio_set(_rst_pin);
|
_spi->gpio_set(_rst_pin);
|
||||||
usleep(12000);
|
usleep(12000);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,30 +80,8 @@ void Ice40::program(unsigned int offset)
|
||||||
flash.read_id();
|
flash.read_id();
|
||||||
flash.erase_and_prog(offset, data, length);
|
flash.erase_and_prog(offset, data, length);
|
||||||
|
|
||||||
if (_verify) {
|
if (_verify)
|
||||||
printInfo("Verifying write");
|
flash.verify(offset, data, length);
|
||||||
std::string verify_data;
|
|
||||||
verify_data.resize(length);
|
|
||||||
printInfo("Read flash ", false);
|
|
||||||
if (0 != flash.read(offset, (uint8_t*)&verify_data[0], length)) {
|
|
||||||
printError("FAIL");
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
printSuccess("DONE");
|
|
||||||
}
|
|
||||||
|
|
||||||
ProgressBar progress("Check", length, 50, _quiet);
|
|
||||||
for (int i = 0; i < length; i++) {
|
|
||||||
if ((uint8_t)verify_data[i] != data[i]) {
|
|
||||||
progress.fail();
|
|
||||||
printError("Verification failed at " +
|
|
||||||
std::to_string(offset + i));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
progress.display(i);
|
|
||||||
}
|
|
||||||
progress.done();
|
|
||||||
}
|
|
||||||
|
|
||||||
_spi->gpio_set(_rst_pin);
|
_spi->gpio_set(_rst_pin);
|
||||||
usleep(12000);
|
usleep(12000);
|
||||||
|
|
@ -125,36 +103,20 @@ bool Ice40::dumpFlash(const std::string &filename,
|
||||||
uint32_t timeout = 1000;
|
uint32_t timeout = 1000;
|
||||||
_spi->gpio_clear(_rst_pin);
|
_spi->gpio_clear(_rst_pin);
|
||||||
|
|
||||||
std::string data;
|
|
||||||
data.resize(len);
|
|
||||||
|
|
||||||
/* prepare SPI access */
|
/* prepare SPI access */
|
||||||
printInfo("Read Flash ", false);
|
printInfo("Read Flash ", false);
|
||||||
try {
|
try {
|
||||||
SPIFlash flash(reinterpret_cast<SPIInterface *>(_spi), _verbose);
|
SPIFlash flash(reinterpret_cast<SPIInterface *>(_spi), _verbose);
|
||||||
flash.reset();
|
flash.reset();
|
||||||
flash.power_up();
|
flash.power_up();
|
||||||
flash.read_id();
|
flash.dump(filename, base_addr, len);
|
||||||
flash.read_status_reg();
|
|
||||||
flash.read(base_addr, (uint8_t*)&data[0], len);
|
|
||||||
} catch (std::exception &e) {
|
} catch (std::exception &e) {
|
||||||
printError("Fail");
|
printError("Fail");
|
||||||
printError(std::string(e.what()));
|
printError(std::string(e.what()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *fd = fopen(filename.c_str(), "wb");
|
/* release SPI access */
|
||||||
if (!fd) {
|
|
||||||
printError("Fail");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
fwrite(data.c_str(), sizeof(uint8_t), len, fd);
|
|
||||||
fclose(fd);
|
|
||||||
|
|
||||||
printSuccess("Done");
|
|
||||||
|
|
||||||
/* prepare SPI access */
|
|
||||||
|
|
||||||
_spi->gpio_set(_rst_pin);
|
_spi->gpio_set(_rst_pin);
|
||||||
usleep(12000);
|
usleep(12000);
|
||||||
|
|
|
||||||
|
|
@ -447,33 +447,12 @@ bool Lattice::program_extFlash(unsigned int offset)
|
||||||
flash.read_status_reg();
|
flash.read_status_reg();
|
||||||
flash.erase_and_prog(offset, data, length);
|
flash.erase_and_prog(offset, data, length);
|
||||||
|
|
||||||
if (_verify) {
|
int ret = true;
|
||||||
printInfo("Verifying write");
|
if (_verify)
|
||||||
string verify_data;
|
ret = flash.verify(offset, data, length);
|
||||||
verify_data.resize(length);
|
|
||||||
printInfo("Read flash ", false);
|
|
||||||
if (0 != flash.read(offset, (uint8_t*)&verify_data[0], length)) {
|
|
||||||
printError("FAIL");
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
printSuccess("DONE");
|
|
||||||
}
|
|
||||||
|
|
||||||
ProgressBar progress("Check", length, 50, _quiet);
|
|
||||||
for (int i = 0; i < length; i++) {
|
|
||||||
if ((uint8_t)verify_data[i] != data[i]) {
|
|
||||||
progress.fail();
|
|
||||||
printError("Verification failed at " +
|
|
||||||
std::to_string(offset + i));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
progress.display(i);
|
|
||||||
}
|
|
||||||
progress.done();
|
|
||||||
}
|
|
||||||
|
|
||||||
delete _bit;
|
delete _bit;
|
||||||
return true;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Lattice::program_flash(unsigned int offset)
|
bool Lattice::program_flash(unsigned int offset)
|
||||||
|
|
@ -580,8 +559,6 @@ bool Lattice::dumpFlash(const string &filename,
|
||||||
|
|
||||||
DisableISC();
|
DisableISC();
|
||||||
|
|
||||||
string data;
|
|
||||||
data.resize(len);
|
|
||||||
/* switch to SPI mode */
|
/* switch to SPI mode */
|
||||||
_jtag->shiftIR(0x3A, 8, Jtag::EXIT1_IR);
|
_jtag->shiftIR(0x3A, 8, Jtag::EXIT1_IR);
|
||||||
uint8_t tmp[2] = {0xFE, 0x68};
|
uint8_t tmp[2] = {0xFE, 0x68};
|
||||||
|
|
@ -590,17 +567,7 @@ bool Lattice::dumpFlash(const string &filename,
|
||||||
/* prepare SPI access */
|
/* prepare SPI access */
|
||||||
SPIFlash flash(this, _verbose);
|
SPIFlash flash(this, _verbose);
|
||||||
flash.reset();
|
flash.reset();
|
||||||
flash.read_id();
|
flash.dump(filename, base_addr, len);
|
||||||
flash.read_status_reg();
|
|
||||||
flash.read(base_addr, (uint8_t*)&data[0], len);
|
|
||||||
|
|
||||||
FILE *fd = fopen(filename.c_str(), "wb");
|
|
||||||
if (!fd) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
fwrite(data.c_str(), sizeof(uint8_t), len, fd);
|
|
||||||
fclose(fd);
|
|
||||||
|
|
||||||
/* ISC REFRESH 0x79 */
|
/* ISC REFRESH 0x79 */
|
||||||
printInfo("Refresh: ", false);
|
printInfo("Refresh: ", false);
|
||||||
|
|
|
||||||
|
|
@ -203,7 +203,8 @@ int main(int argc, char **argv)
|
||||||
flash.reset();
|
flash.reset();
|
||||||
flash.read_id();
|
flash.read_id();
|
||||||
|
|
||||||
if (!args.bit_file.empty() || !args.file_type.empty()) {
|
if (args.prg_type != Device::RD_FLASH &&
|
||||||
|
(!args.bit_file.empty() || !args.file_type.empty())) {
|
||||||
printInfo("Open file " + args.bit_file + " ", false);
|
printInfo("Open file " + args.bit_file + " ", false);
|
||||||
try {
|
try {
|
||||||
bit = new RawParser(args.bit_file, false);
|
bit = new RawParser(args.bit_file, false);
|
||||||
|
|
@ -226,10 +227,13 @@ int main(int argc, char **argv)
|
||||||
flash.erase_and_prog(args.offset, bit->getData(), bit->getLength()/8);
|
flash.erase_and_prog(args.offset, bit->getData(), bit->getLength()/8);
|
||||||
|
|
||||||
if (args.verify)
|
if (args.verify)
|
||||||
printWarn("writing verification not supported");
|
flash.verify(args.offset, bit->getData(), bit->getLength() / 8);
|
||||||
|
|
||||||
delete bit;
|
delete bit;
|
||||||
|
} else if (args.prg_type == Device::RD_FLASH) {
|
||||||
|
flash.dump(args.bit_file, args.offset, args.file_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (board->reset_pin)
|
if (board->reset_pin)
|
||||||
spi->gpio_set(board->reset_pin, true);
|
spi->gpio_set(board->reset_pin, true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -172,34 +172,8 @@ void Xilinx::program_spi(ConfigBitstreamParser * bit, unsigned int offset)
|
||||||
spiFlash.erase_and_prog(offset, data, length);
|
spiFlash.erase_and_prog(offset, data, length);
|
||||||
|
|
||||||
/* verify write if required */
|
/* verify write if required */
|
||||||
if (_verify) {
|
if (_verify)
|
||||||
std::string verify_data;
|
spiFlash.verify(offset, data, length, 256);
|
||||||
verify_data.resize(256);
|
|
||||||
|
|
||||||
ProgressBar progress("Verifying write", length, 50, _quiet);
|
|
||||||
int rd_length = 256;
|
|
||||||
for (int i = 0; i < length; i+=rd_length) {
|
|
||||||
if (rd_length + i > length)
|
|
||||||
rd_length = length - i;
|
|
||||||
if (0 != spiFlash.read(offset + i, (uint8_t*)&verify_data[0],
|
|
||||||
rd_length)) {
|
|
||||||
progress.fail();
|
|
||||||
printError("Failed to read flash");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int ii = 0; ii < rd_length; ii++) {
|
|
||||||
if ((uint8_t)verify_data[ii] != data[i + ii]) {
|
|
||||||
progress.fail();
|
|
||||||
printError("Verification failed at " +
|
|
||||||
std::to_string(offset + i + ii));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
progress.display(i);
|
|
||||||
}
|
|
||||||
progress.done();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Xilinx::program_mem(ConfigBitstreamParser *bitfile)
|
void Xilinx::program_mem(ConfigBitstreamParser *bitfile)
|
||||||
|
|
@ -314,49 +288,26 @@ void Xilinx::program_mem(ConfigBitstreamParser *bitfile)
|
||||||
bool Xilinx::dumpFlash(const std::string &filename,
|
bool Xilinx::dumpFlash(const std::string &filename,
|
||||||
uint32_t base_addr, uint32_t len)
|
uint32_t base_addr, uint32_t len)
|
||||||
{
|
{
|
||||||
|
int ret = true;
|
||||||
/* first need to have bridge in RAM */
|
/* first need to have bridge in RAM */
|
||||||
if (load_bridge() == false)
|
if (load_bridge() == false)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* prepare SPI access */
|
/* prepare SPI access */
|
||||||
SPIFlash flash(this, _verbose);
|
SPIFlash flash(this, _verbose);
|
||||||
flash.reset();
|
|
||||||
flash.read_id();
|
|
||||||
flash.read_status_reg();
|
|
||||||
|
|
||||||
FILE *fd = fopen(filename.c_str(), "wb");
|
try {
|
||||||
if (!fd) {
|
flash.reset();
|
||||||
printError("Open dump file failed\n");
|
ret = flash.dump(filename, base_addr, len, 256);
|
||||||
return false;
|
} catch (std::exception &e) {
|
||||||
|
printError(e.what());
|
||||||
|
ret = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t rd_length = 256;
|
|
||||||
std::string data;
|
|
||||||
data.resize(rd_length);
|
|
||||||
|
|
||||||
ProgressBar progress("Dump flash", len, 50, _quiet);
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < len; i+=rd_length) {
|
|
||||||
if (rd_length + i > len)
|
|
||||||
rd_length = len - i;
|
|
||||||
if (0 != flash.read(base_addr + i, (uint8_t*)&data[0],
|
|
||||||
rd_length)) {
|
|
||||||
progress.fail();
|
|
||||||
printError("Failed to read flash");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
fwrite(data.c_str(), sizeof(uint8_t), rd_length, fd);
|
|
||||||
|
|
||||||
progress.display(i);
|
|
||||||
}
|
|
||||||
progress.done();
|
|
||||||
fclose(fd);
|
|
||||||
|
|
||||||
/* reset device */
|
/* reset device */
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
return false;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue