xilinx: allow bin file to memory

This commit is contained in:
Gwenhael Goavec-Merou 2021-02-04 07:29:35 +01:00
parent ad21a3bb36
commit 582261c758
2 changed files with 54 additions and 44 deletions

View File

@ -24,7 +24,7 @@ Xilinx::Xilinx(Jtag *jtag, const std::string &filename,
} }
if (_file_extension == "mcs") { if (_file_extension == "mcs") {
_mode = Device::SPI_MODE; _mode = Device::SPI_MODE;
} else if (_file_extension == "bit") { } else if (_file_extension == "bit" || _file_extension == "bin") {
if (sram_wr) if (sram_wr)
_mode = Device::MEM_MODE; _mode = Device::MEM_MODE;
else else
@ -77,60 +77,70 @@ int Xilinx::idCode()
void Xilinx::program(unsigned int offset) void Xilinx::program(unsigned int offset)
{ {
switch (_mode) { ConfigBitstreamParser *bit;
case Device::NONE_MODE: bool reverse = false;
return;
break; /* nothing to do */
case Device::SPI_MODE: if (_mode == Device::NONE_MODE)
program_spi(offset); return;
reset();
break; if (_mode == Device::MEM_MODE)
case Device::MEM_MODE: reverse = true;
BitParser bitfile(_filename, true, _verbose);
bitfile.parse(); printInfo("Open file " + _filename + " ", false);
program_mem(bitfile); try {
break; if (_file_extension == "bit")
bit = new BitParser(_filename, reverse, _verbose);
else if (_file_extension == "mcs")
bit = new McsParser(_filename, reverse, _verbose);
else
bit = new RawParser(_filename, reverse);
} catch (std::exception &e) {
printError("FAIL");
return;
} }
printSuccess("DONE");
int err = bit->parse();
printInfo("Parse file ", false);
if (err == EXIT_FAILURE) {
printError("FAIL");
delete bit;
return;
} else {
printSuccess("DONE");
}
if (_mode == Device::SPI_MODE) {
program_spi(bit, offset);
reset();
} else {
program_mem(bit);
}
delete bit;
} }
void Xilinx::program_spi(unsigned int offset) void Xilinx::program_spi(ConfigBitstreamParser * bit, unsigned int offset)
{ {
// DATA_DIR is defined at compile time. // DATA_DIR is defined at compile time.
std::string bitname = DATA_DIR "/openFPGALoader/spiOverJtag_"; std::string bitname = DATA_DIR "/openFPGALoader/spiOverJtag_";
bitname += fpga_list[idCode()].model + ".bit"; bitname += fpga_list[idCode()].model + ".bit";
/* first: load spi over jtag */ /* first: load spi over jtag */
BitParser bitfile(bitname, true, _verbose); BitParser bridge(bitname, true, _verbose);
bitfile.parse(); bridge.parse();
program_mem(bitfile); program_mem(&bridge);
/* last: read file and erase/flash spi flash */
ConfigBitstreamParser *_bit;
if (_file_extension == "mcs")
_bit = new McsParser(_filename, false, _verbose);
else if (_file_extension == "bit")
_bit = new BitParser(_filename, false, _verbose);
else
_bit = new RawParser(_filename, false);
int err = _bit->parse();
printInfo("Parse file ", false);
if (err == EXIT_FAILURE) {
printError("FAIL");
return;
} else {
printSuccess("DONE");
}
SPIFlash spiFlash(this, (_verbose ? 1 : (_quiet ? -1 : 0))); SPIFlash spiFlash(this, (_verbose ? 1 : (_quiet ? -1 : 0)));
spiFlash.reset(); spiFlash.reset();
spiFlash.read_id(); spiFlash.read_id();
spiFlash.read_status_reg(); spiFlash.read_status_reg();
spiFlash.erase_and_prog(offset, _bit->getData(), _bit->getLength()/8); spiFlash.erase_and_prog(offset, bit->getData(), bit->getLength()/8);
delete _bit;
} }
void Xilinx::program_mem(BitParser &bitfile) void Xilinx::program_mem(ConfigBitstreamParser *bitfile)
{ {
if (_filename == "") return; if (_filename == "") return;
std::cout << "load program" << std::endl; std::cout << "load program" << std::endl;
@ -189,8 +199,8 @@ void Xilinx::program_mem(BitParser &bitfile)
* EXIT1-DR. * EXIT1-DR.
*/ */
/* GGM: TODO */ /* GGM: TODO */
int byte_length = bitfile.getLength() / 8; int byte_length = bitfile->getLength() / 8;
uint8_t *data = bitfile.getData(); uint8_t *data = bitfile->getData();
int tx_len, tx_end; int tx_len, tx_end;
int burst_len = byte_length / 100; int burst_len = byte_length / 100;

View File

@ -3,7 +3,7 @@
#include <string> #include <string>
#include "bitparser.hpp" #include "configBitstreamParser.hpp"
#include "device.hpp" #include "device.hpp"
#include "jtag.hpp" #include "jtag.hpp"
#include "spiInterface.hpp" #include "spiInterface.hpp"
@ -15,8 +15,8 @@ class Xilinx: public Device, SPIInterface {
~Xilinx(); ~Xilinx();
void program(unsigned int offset = 0) override; void program(unsigned int offset = 0) override;
void program_spi(unsigned int offset = 0); void program_spi(ConfigBitstreamParser * bit, unsigned int offset = 0);
void program_mem(BitParser &bitfile); void program_mem(ConfigBitstreamParser *bitfile);
int idCode() override; int idCode() override;
void reset() override; void reset() override;