From 3ed1d9e24a7784bd9857fc84b3f5e69f493a7c5a Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 5 Jul 2016 12:06:51 -0700 Subject: [PATCH] CPLD: Method to calculate bitstream CRC32. --- firmware/common/cpld_max5.cpp | 18 ++++++++++++++++++ firmware/common/cpld_max5.hpp | 6 ++++++ 2 files changed, 24 insertions(+) diff --git a/firmware/common/cpld_max5.cpp b/firmware/common/cpld_max5.cpp index b6c4f6c5..f0c13d68 100644 --- a/firmware/common/cpld_max5.cpp +++ b/firmware/common/cpld_max5.cpp @@ -114,6 +114,13 @@ bool CPLD::verify( return block_0_success && block_1_success; } +uint32_t CPLD::crc() { + crc_t crc { 0x04c11db7, 0xffffffff, 0xffffffff }; + block_crc(0, 3328, crc); + block_crc(1, 512, crc); + return crc.checksum(); +} + void CPLD::sector_select(const uint16_t id) { shift_ir(0x203); // Sector select jtag.runtest_tck(93); // 5us @@ -219,6 +226,17 @@ bool CPLD::is_blank_block(const uint16_t id, const size_t count) { return success; } +void CPLD::block_crc(const uint16_t id, const size_t count, crc_t& crc) { + sector_select(id); + shift_ir(0x205); // Read + jtag.runtest_tck(93); // 5us + + for(size_t i=0; i #include @@ -75,6 +76,8 @@ public: bool is_blank(); + uint32_t crc(); + std::pair boundary_scan(); enum class Instruction { @@ -135,6 +138,9 @@ private: bool is_blank_block(const uint16_t id, const size_t count); + using crc_t = CRC<32, true, true>; + void block_crc(const uint16_t id, const size_t count, crc_t& crc); + const uint32_t IDCODE = 0b00000010000010100101000011011101; const size_t IR_LENGTH = 10;