diff --git a/xilinx.cpp b/xilinx.cpp index ca4e55b..88e6ef5 100644 --- a/xilinx.cpp +++ b/xilinx.cpp @@ -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 */ diff --git a/xilinx.hpp b/xilinx.hpp index 1d19877..9aedd12 100644 --- a/xilinx.hpp +++ b/xilinx.hpp @@ -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