xilinx: add support for spi flash (currently only with MCS file)

This commit is contained in:
Gwenhael Goavec-Merou 2019-10-05 19:02:42 +02:00
parent 0008905f16
commit c8009b5b26
2 changed files with 46 additions and 6 deletions

View File

@ -3,14 +3,19 @@
#include "ftdijtag.hpp"
#include "bitparser.hpp"
#include "mcsParser.hpp"
#include "spiFlash.hpp"
#include "xilinx.hpp"
#include "part.hpp"
Xilinx::Xilinx(FtdiJtag *jtag, std::string filename):Device(jtag, filename),
_bitfile(filename)
Xilinx::Xilinx(FtdiJtag *jtag, std::string filename):Device(jtag, filename)
{
if (_filename != ""){
_bitfile.parse();
if (_file_extension == "bit")
_mode = Device::MEM_MODE;
else
_mode = Device::SPI_MODE;
}
}
Xilinx::~Xilinx() {}
@ -54,6 +59,41 @@ int Xilinx::idCode()
}
void Xilinx::program(unsigned int offset)
{
switch (_mode) {
case Device::NONE_MODE:
return;
break;
case Device::SPI_MODE:
program_spi(offset);
reset();
break;
case Device::MEM_MODE:
BitParser bitfile(_filename);
bitfile.parse();
program_mem(bitfile, offset);
break;
}
}
void Xilinx::program_spi(unsigned int offset)
{
std::string bitname = "/usr/local/share/cycloader/spiOverJtag_";
bitname += fpga_list[idCode()].family + ".bit";
/* first: load spi over jtag */
BitParser bitfile(bitname);
bitfile.parse();
program_mem(bitfile, offset);
/* last: read file and erase/flash spi flash */
McsParser mcs(_filename);
mcs.parse();
SPIFlash spiFlash(_jtag);
spiFlash.erase_and_prog(offset, mcs.getData(), mcs.getLength());
}
void Xilinx::program_mem(BitParser &bitfile, unsigned int offset)
{
if (_filename == "") return;
std::cout << "load program" << std::endl;
@ -112,7 +152,7 @@ void Xilinx::program(unsigned int offset)
* EXIT1-DR.
*/
/* GGM: TODO */
_jtag->shiftDR(_bitfile.getData(), NULL, 8*_bitfile.getLength());
_jtag->shiftDR(bitfile.getData(), NULL, 8*bitfile.getLength());
/*
* 15: Enter UPDATE-DR state. X 1 1
*/

View File

@ -11,10 +11,10 @@ class Xilinx: public Device {
~Xilinx();
void program(unsigned int offset = 0) override;
void program_spi(unsigned int offset = 0);
void program_mem(BitParser &bitfile, unsigned int offset = 0);
int idCode();
void reset();
private:
BitParser _bitfile;
};
#endif