Write proper change status commands

This commit is contained in:
Miodrag Milanovic 2024-12-07 19:29:27 +01:00
parent bffb2ed8d9
commit fe8e82cdd7
3 changed files with 36 additions and 12 deletions

View File

@ -65,6 +65,7 @@ class Die
bool is_clkin_cfg_empty() const; bool is_clkin_cfg_empty() const;
bool is_glbout_cfg_empty() const; bool is_glbout_cfg_empty() const;
bool is_status_cfg_empty() const; bool is_status_cfg_empty() const;
bool is_using_cfg_gpios() const;
void write_latch(int x, int y, const std::vector<uint8_t> &data); void write_latch(int x, int y, const std::vector<uint8_t> &data);
void write_ram(int x, int y, const std::vector<uint8_t> &data); void write_ram(int x, int y, const std::vector<uint8_t> &data);

View File

@ -49,6 +49,15 @@ static constexpr const uint8_t CMD_WAIT_PLL = 0xdc; //
static constexpr const uint8_t CMD_SPLL = 0xdd; static constexpr const uint8_t CMD_SPLL = 0xdd;
static constexpr const uint8_t CMD_SLAVE_MODE = 0xde; static constexpr const uint8_t CMD_SLAVE_MODE = 0xde;
static constexpr const uint8_t CFG_NONE = 0x00;
static constexpr const uint8_t CFG_DONE = 0x01;
static constexpr const uint8_t CFG_STOP = 0x02;
static constexpr const uint8_t CFG_RECONFIG = 0x04;
static constexpr const uint8_t CFG_CPE_CFG = 0x08;
static constexpr const uint8_t CFG_CPE_RESET = 0x10;
static constexpr const uint8_t CFG_FILL_RAM = 0x20;
static constexpr const uint8_t CFG_SERDES = 0x40;
static const uint16_t crc_table_x25[256] = { static const uint16_t crc_table_x25[256] = {
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5,
0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52,
@ -345,6 +354,19 @@ class BitstreamReadWriter
write_byte(0x33); write_byte(0x33);
write_nops(4); write_nops(4);
} }
void write_cmd_chg_status(uint8_t cfg, std::vector<uint8_t> data)
{
write_header(CMD_CHG_STATUS, 12);
write_byte(cfg);
write_byte(0x00);
for (int i = 2; i < 12; i++)
write_byte(data[Die::STATUS_CFG_START + i]);
insert_crc16();
write_nops(4);
write_byte(0x33);
write_nops(4);
}
}; };
void check_crc(BitstreamReadWriter &rd) void check_crc(BitstreamReadWriter &rd)
@ -673,7 +695,7 @@ Bitstream Bitstream::serialise_chip(const Chip &chip)
// Write RAM contents // Write RAM contents
if (ram_used) { if (ram_used) {
wr.write_cmd_chg_status(0x20); wr.write_cmd_chg_status(CFG_FILL_RAM);
for (int y = Die::MAX_RAM_ROWS - 1; y >= 0; y--) { for (int y = Die::MAX_RAM_ROWS - 1; y >= 0; y--) {
for (int x = Die::MAX_RAM_COLS - 1; x >= 0; x--) { for (int x = Die::MAX_RAM_COLS - 1; x >= 0; x--) {
// Empty configuration is skipped // Empty configuration is skipped
@ -688,7 +710,7 @@ Bitstream Bitstream::serialise_chip(const Chip &chip)
ram_used = true; ram_used = true;
} }
} }
wr.write_cmd_chg_status(0x00); wr.write_cmd_chg_status(CFG_NONE);
} }
// Write latch configuration // Write latch configuration
@ -748,16 +770,15 @@ Bitstream Bitstream::serialise_chip(const Chip &chip)
} }
} }
// Write change status // Write change status
wr.write_header(CMD_CHG_STATUS, 12); if (die.is_using_cfg_gpios())
wr.write_byte(0x13); // 0 wr.write_cmd_chg_status(CFG_DONE);
wr.write_byte(0x00); // 1
for (int i = 2; i < 12; i++) uint8_t cfg_stat = CFG_DONE | CFG_STOP | CFG_CPE_RESET;
wr.write_byte(die_config[Die::STATUS_CFG_START + i]); // 2 // cfg_stat |= CFG_RECONFIG | CFG_CPE_CFG;
wr.insert_crc16(); // cfg_stat |= CFG_SERDES;
wr.write_nops(4);
wr.write_byte(0x33); wr.write_cmd_chg_status(cfg_stat, die_config);
wr.write_nops(4);
return Bitstream(wr.get()); return Bitstream(wr.get());
} }

View File

@ -92,6 +92,8 @@ bool Die::is_status_cfg_empty() const
return true; return true;
} }
bool Die::is_using_cfg_gpios() const { return die_cfg[STATUS_CFG_START + 2] & 0x08; }
void Die::write_latch(int x, int y, const std::vector<uint8_t> &data) void Die::write_latch(int x, int y, const std::vector<uint8_t> &data)
{ {
int pos = 0; int pos = 0;