From a39aa2d43edfdbdc3a37ea17c4e2827cce230cd4 Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Mon, 10 Mar 2025 15:29:06 +0100 Subject: [PATCH] libgpiodJtagBitbang: add support for XVC server --- src/libgpiodJtagBitbang.cpp | 24 ++++++++++++++++++++++++ src/libgpiodJtagBitbang.hpp | 2 ++ src/xvc_server.cpp | 8 ++++++++ 3 files changed, 34 insertions(+) diff --git a/src/libgpiodJtagBitbang.cpp b/src/libgpiodJtagBitbang.cpp index 021bd2c..a6bcd20 100644 --- a/src/libgpiodJtagBitbang.cpp +++ b/src/libgpiodJtagBitbang.cpp @@ -343,3 +343,27 @@ int LibgpiodJtagBitbang::toggleClk(uint8_t tms, uint8_t tdi, uint32_t clk_len) return clk_len; } + +bool LibgpiodJtagBitbang::writeTMSTDI(const uint8_t *tms, const uint8_t *tdi, uint8_t *tdo, + uint32_t len) +{ + memset(tdo, 0, (len+7) / 8); + + for (uint32_t i = 0; i < len; i++) { +#ifdef GPIOD_APIV2 + gpiod_line_value tdix = (tdi[i >> 3] & (1 << (i & 7))) ? GPIOD_LINE_VALUE_ACTIVE : GPIOD_LINE_VALUE_INACTIVE; + gpiod_line_value tmsx = (tms[i >> 3] & (1 << (i & 7))) ? GPIOD_LINE_VALUE_ACTIVE : GPIOD_LINE_VALUE_INACTIVE; + update_pins(tmsx, tdix); +#else + int tdix = (tdi[i >> 3] & (1 << (i & 7))) ? 1 : 0; + int tmsx = (tms[i >> 3] & (1 << (i & 7))) ? 1 : 0; + + update_pins(0, tmsx, tdix); + update_pins(1, tmsx, tdix); +#endif + if (read_tdo() > 0) + tdo[i >> 3] |= 1 << (i & 7); + } + + return true; +} diff --git a/src/libgpiodJtagBitbang.hpp b/src/libgpiodJtagBitbang.hpp index 6844a6d..5682500 100644 --- a/src/libgpiodJtagBitbang.hpp +++ b/src/libgpiodJtagBitbang.hpp @@ -36,6 +36,8 @@ class LibgpiodJtagBitbang : public JtagInterface { int writeTMS(const uint8_t *tms_buf, uint32_t len, bool flush_buffer, const uint8_t tdi = 1) override; int writeTDI(const uint8_t *tx, uint8_t *rx, uint32_t len, bool end) override; int toggleClk(uint8_t tms, uint8_t tdo, uint32_t clk_len) override; + bool writeTMSTDI(const uint8_t *tms, const uint8_t *tdi, uint8_t *tdo, + uint32_t len) override; int get_buffer_size() override { return 0; } bool isFull() override { return false; } diff --git a/src/xvc_server.cpp b/src/xvc_server.cpp index 5d325a1..d7bcf8f 100644 --- a/src/xvc_server.cpp +++ b/src/xvc_server.cpp @@ -14,6 +14,9 @@ #include #include "ftdiJtagMPSSE.hpp" +#ifdef ENABLE_LIBGPIOD +#include "libgpiodJtagBitbang.hpp" +#endif #include "cable.hpp" #include "display.hpp" @@ -36,6 +39,11 @@ XVC_server::XVC_server(int port, const cable_t & cable, _jtag = new FtdiJtagMPSSE(cable, dev, serial, clkHZ, invert_read_edge, _verbose); break; +#ifdef ENABLE_LIBGPIOD + case MODE_LIBGPIOD_BITBANG: + _jtag = new LibgpiodJtagBitbang(pin_conf, dev, clkHZ, verbose); + break; +#endif #if 0 case MODE_ANLOGICCABLE: _jtag = new AnlogicCable(clkHZ);