xilinx: allow bin file to memory
This commit is contained in:
parent
ad21a3bb36
commit
582261c758
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue