[xilinx] add jtag->flush before sleep

This commit is contained in:
Alexey Starikovskiy 2023-09-19 17:56:50 +03:00 committed by Gwenhael Goavec-Merou
parent b10be9ae8a
commit 01ac90a172
1 changed files with 12 additions and 2 deletions

View File

@ -508,6 +508,8 @@ bool Xilinx::load_bridge()
void Xilinx::program_spi(ConfigBitstreamParser * bit, unsigned int offset,
bool unprotect_flash)
{
if (!bit)
throw std::runtime_error("called with null bitstream");
const uint8_t *data = bit->getData();
int length = bit->getLength() / 8;
SPIInterface::write(offset, data, length, unprotect_flash);
@ -1034,6 +1036,7 @@ void Xilinx::xcf_flow_enable(uint8_t mode)
void Xilinx::xcf_flow_disable()
{
_jtag->shiftIR(XCF_ISC_DISABLE, 8);
_jtag->flush();
usleep(110000);
_jtag->shiftIR(BYPASS, 8);
_jtag->toggleClk(1);
@ -1051,11 +1054,13 @@ bool Xilinx::xcf_flow_erase()
_jtag->toggleClk(1);
_jtag->shiftIR(XCF_ISC_ERASE, 8);
_jtag->flush();
usleep(500000);
int i;
for (i = 0; i < 32; i++) {
_jtag->shiftIR(XCF_ISCTESTSTATUS, 8);
_jtag->flush();
usleep(500000);
_jtag->shiftDR(NULL, xfer_buf, 8);
if ((xfer_buf[0] & 0x04))
@ -1079,6 +1084,8 @@ bool Xilinx::xcf_program(ConfigBitstreamParser *bitfile)
uint8_t tx_buf[4096 / 8];
uint16_t pkt_len =
((_jtag->get_target_device_id() == 0x05044093) ? 2048 : 4096) / 8;
if (!bitfile)
throw std::runtime_error("called with null bitstream");
const uint8_t *data = bitfile->getData();
uint32_t data_len = bitfile->getLength() / 8;
uint32_t xfer_len, offset = 0;
@ -1129,12 +1136,14 @@ bool Xilinx::xcf_program(ConfigBitstreamParser *bitfile)
/* send program instruction */
_jtag->shiftIR(XCF_ISC_PROGRAM, 8);
_jtag->flush();
usleep((addr == 0) ? 14000: 500);
/* wait until bit 3 != 1 */
int i;
for (i = 0; i < 29; i++) {
_jtag->shiftIR(XCF_ISCTESTSTATUS, 8);
_jtag->flush();
usleep(500);
_jtag->shiftDR(NULL, tx_buf, 8);
if ((tx_buf[0] & 0x04))
@ -1222,6 +1231,7 @@ std::string Xilinx::xcf_read()
/* send data to PROM */
_jtag->shiftIR(XCF_ISC_READ, 8);
_jtag->flush();
usleep(50);
_jtag->shiftDR(NULL, rx_buf, pkt_len * 8);
@ -1468,7 +1478,7 @@ bool Xilinx::xc2c_flow_program(JedParser *jed)
_jtag->shiftIR(XC2C_ISC_PROGRAM, 8);
uint16_t iter = 0;
for (auto row : listfuse) {
for (const auto &row : listfuse) {
uint16_t pos = 0;
uint8_t addr = _gray_code[iter] >> shift_addr;
uint8_t wr_buf[249] = {0}; // largest section length
@ -1494,7 +1504,7 @@ bool Xilinx::xc2c_flow_program(JedParser *jed)
if (_verify) {
std::string rx_buffer = xc2c_flow_read();
iter = 0;
for (auto row : listfuse) {
for (const auto &row : listfuse) {
for (auto col : row) {
if ((rx_buffer[iter >> 3] >> (iter & 0x07)) != col) {
throw std::runtime_error("Program: verify failed");