Files
openFPGALoader/src/ch347jtag.hpp
T

51 lines
1.4 KiB
C++
Raw Normal View History

2023-05-13 23:00:23 +03:00
// SPDX-License-Identifier: Apache-2.0
/*
* Copyright (C) 2023 Alexey Starikovskiy <[email protected]>
*/
#pragma once
#include <libusb.h>
#include "jtagInterface.hpp"
2023-09-01 20:24:10 +03:00
constexpr unsigned MAX_BUFFER = 512;
2023-05-13 23:00:23 +03:00
class CH347Jtag : public JtagInterface {
public:
2024-02-29 03:44:49 +08:00
CH347Jtag(uint32_t clkHZ, int8_t verbose, int vid, int pid, uint8_t bus_addr, uint8_t dev_addr);
2023-05-13 23:00:23 +03:00
virtual ~CH347Jtag();
2023-08-08 16:54:27 +03:00
int setClkFreq(uint32_t clkHZ) override { return _setClkFreq(clkHZ); };
int _setClkFreq(uint32_t clkHZ);
2023-05-13 23:00:23 +03:00
/* TMS */
int writeTMS(const uint8_t *tms, uint32_t len, bool flush_buffer, const uint8_t tdi = 1) override;
2023-05-13 23:00:23 +03:00
/* TDI */
2023-08-08 16:54:27 +03:00
int writeTDI(const uint8_t *tx, uint8_t *rx, uint32_t len, bool end) override;
2023-05-13 23:00:23 +03:00
/* clk */
int toggleClk(uint8_t tms, uint8_t tdo, uint32_t clk_len) override;
2023-09-01 20:24:10 +03:00
int get_buffer_size() override {return get_obuf_length();}
2023-05-13 23:00:23 +03:00
2023-09-01 20:24:10 +03:00
bool isFull() override {return get_obuf_length() == 0;}
2023-05-13 23:00:23 +03:00
2023-09-01 20:24:10 +03:00
int flush() override {return usb_xfer(0, 0, 0, false);}
2023-05-13 23:00:23 +03:00
private:
2023-07-30 08:39:15 +02:00
bool _verbose;
2024-02-29 03:44:49 +08:00
bool _is_largerPack;
2025-12-24 12:13:56 -08:00
int _jtagIntf;
2023-05-13 23:00:23 +03:00
int setClk(const uint8_t &factor);
libusb_device_handle *dev_handle;
libusb_context *usb_ctx;
struct libusb_transfer *wtrans, *rtrans;
2023-09-01 20:24:10 +03:00
uint8_t ibuf[MAX_BUFFER];
uint8_t _obuf[MAX_BUFFER];
uint8_t *obuf;
int get_obuf_length() const {return MAX_BUFFER - (obuf - _obuf);}
int usb_xfer(unsigned wlen, unsigned rlen, unsigned *actual, bool defer);
uint8_t _tdi;
uint8_t _tms;
2023-05-13 23:00:23 +03:00
};