openFPGALoader/src/ftdispi.hpp

61 lines
1.4 KiB
C++

#include <ftdi.h>
#include <iostream>
#include <vector>
#include "board.hpp"
#include "ftdipp_mpsse.hpp"
#include "spiInterface.hpp"
class FtdiSpi : public FTDIpp_MPSSE, SPIInterface {
public:
enum SPI_endianness {
SPI_MSB_FIRST = 0,
SPI_LSB_FIRST = 1
};
enum SPI_CS_mode {
SPI_CS_AUTO = 0,
SPI_CS_MANUAL = 1
};
FtdiSpi(int vid, int pid, unsigned char interface, uint32_t clkHZ,
bool verbose);
FtdiSpi(const FTDIpp_MPSSE::mpsse_bit_config &conf,
spi_pins_conf_t spi_config, uint32_t clkHZ,
bool verbose);
~FtdiSpi();
void setMode(uint8_t mode);
void setEndianness(unsigned char endian) {
_endian =(endian == SPI_MSB_FIRST) ? 0 : MPSSE_LSB;
}
/* CS handling */
void setCSmode(uint8_t cs_mode) {_cs_mode = cs_mode;}
bool confCs(char stat);
bool setCs();
bool clearCs();
int ft2232_spi_wr_then_rd(const uint8_t *tx_data, uint32_t tx_len,
uint8_t *rx_data, uint32_t rx_len);
int ft2232_spi_wr_and_rd(uint32_t writecnt,
const uint8_t *writearr, uint8_t *readarr);
/* spi interface */
int spi_put(uint8_t cmd, uint8_t *tx, uint8_t *rx,
uint32_t len) override;
int spi_put(uint8_t *tx, uint8_t *rx, uint32_t len) override;
int spi_wait(uint8_t cmd, uint8_t mask, uint8_t cond,
uint32_t timeout, bool verbose=false) override;
private:
uint8_t _cs;
uint8_t _cs_bits;
uint8_t _clk;
uint8_t _clk_idle;
uint8_t _wr_mode;
uint8_t _rd_mode;
unsigned char _endian;
uint8_t _cs_mode;
};