libtrellis: Add Jump command and generate_jump Bitstream function Needed for Golden image support. Signed-off-by: Jens Andersen <jens.andersen@gmail.com>
diff --git a/libtrellis/include/Bitstream.hpp b/libtrellis/include/Bitstream.hpp index ab20abd..72c475b 100644 --- a/libtrellis/include/Bitstream.hpp +++ b/libtrellis/include/Bitstream.hpp
@@ -15,6 +15,7 @@ namespace Trellis { enum class BitstreamCommand : uint8_t { SPI_MODE = 0b01111001, + JUMP = 0b01111110, LSC_RESET_CRC = 0b00111011, VERIFY_ID = 0b11100010, LSC_WRITE_COMP_DIC = 0b00000010, @@ -47,6 +48,7 @@ // Serialise a Chip back to a bitstream static Bitstream serialise_chip(const Chip &chip, const map<string, string> options); + static Bitstream generate_jump(uint32_t address); // Deserialise a bitstream to a Chip Chip deserialise_chip(boost::optional<uint32_t> idcode = boost::optional<uint32_t>());
diff --git a/libtrellis/src/Bitstream.cpp b/libtrellis/src/Bitstream.cpp index 6bcf450..b0a4275 100644 --- a/libtrellis/src/Bitstream.cpp +++ b/libtrellis/src/Bitstream.cpp
@@ -382,6 +382,11 @@ BITSTREAM_NOTE("SPI Mode " << spimode->first); } + case BitstreamCommand::JUMP: + rd.skip_bytes(3); + BITSTREAM_DEBUG("Jump command"); + /* TODO: Parse address and SPI Flash read speed */ + rd.skip_bytes(4); break; case BitstreamCommand::DUMMY: break; @@ -396,6 +401,36 @@ } } +Bitstream Bitstream::generate_jump(uint32_t address) { + BitstreamReadWriter wr; + + // Dummy bytes + wr.insert_dummy(16); + // Preamble + wr.write_bytes(preamble.begin(), preamble.size()); + + // Padding + wr.insert_dummy(4); + + // Dummy control register + wr.write_byte(uint8_t(BitstreamCommand::LSC_PROG_CNTRL0)); + wr.insert_zeros(3); + wr.insert_zeros(4); + + // Jump command + wr.write_byte(uint8_t(BitstreamCommand::JUMP)); + wr.insert_zeros(3); + wr.write_byte(0x03); // TODO: Allow specifying SPI Flash read speed + + wr.write_byte(uint8_t((address >> 16UL) & 0xFF)); + wr.write_byte(uint8_t((address >> 8UL) & 0xFF)); + wr.write_byte(uint8_t(address & 0xFF)); + + wr.insert_dummy(18); + + return Bitstream(wr.get(), std::vector<string>()); +} + Bitstream Bitstream::serialise_chip(const Chip &chip, const map<string, string> options) { BitstreamReadWriter wr; // Preamble