ftdispi: start to use spi_pins_conf

This commit is contained in:
Gwenhael Goavec-Merou 2020-10-30 08:24:45 +01:00
parent e347d2afd6
commit b2abafa76d
3 changed files with 42 additions and 19 deletions

View File

@ -4,6 +4,7 @@
#include <ftdi.h> #include <ftdi.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include "board.hpp"
#include "ftdipp_mpsse.hpp" #include "ftdipp_mpsse.hpp"
#include "ftdispi.hpp" #include "ftdispi.hpp"
@ -13,8 +14,6 @@
* MISO -> ADBUS2 * MISO -> ADBUS2
* CS -> ADBUS3 * CS -> ADBUS3
*/ */
#define SPI_CLK (1 << 0)
#define cs_bits 0x08
/* GGM: Faut aussi definir l'etat des broches par defaut */ /* GGM: Faut aussi definir l'etat des broches par defaut */
/* necessaire en mode0 et 1, ainsi qu'entre 2 et 3 /* necessaire en mode0 et 1, ainsi qu'entre 2 et 3
@ -33,31 +32,31 @@ void FtdiSpi::setMode(uint8_t mode)
{ {
switch (mode) { switch (mode) {
case 0: case 0:
_clk = 0; _clk_idle = 0;
_wr_mode = MPSSE_WRITE_NEG; _wr_mode = MPSSE_WRITE_NEG;
_rd_mode = 0; _rd_mode = 0;
break; break;
case 1: case 1:
_clk = 0; _clk_idle = 0;
_wr_mode = 0; _wr_mode = 0;
_rd_mode = MPSSE_READ_NEG; _rd_mode = MPSSE_READ_NEG;
break; break;
case 2: case 2:
_clk = SPI_CLK; _clk_idle = _clk;
_wr_mode = 0; //POS _wr_mode = 0; //POS
_rd_mode = MPSSE_READ_NEG; _rd_mode = MPSSE_READ_NEG;
break; break;
case 3: case 3:
_clk = SPI_CLK; _clk_idle = _clk;
_wr_mode = MPSSE_WRITE_NEG; _wr_mode = MPSSE_WRITE_NEG;
_rd_mode = 0; _rd_mode = 0;
break; break;
} }
/* for clk pin in idle state */ /* for clk pin in idle state */
if (_clk) if (_clk_idle)
gpio_set(SPI_CLK, true); gpio_set(_clk, true);
else else
gpio_clear(SPI_CLK, true); gpio_clear(_clk, true);
} }
static FTDIpp_MPSSE::mpsse_bit_config bit_conf = static FTDIpp_MPSSE::mpsse_bit_config bit_conf =
@ -74,10 +73,30 @@ FtdiSpi::FtdiSpi(int vid, int pid, unsigned char interface, uint32_t clkHZ,
init(1, 0x00, BITMODE_MPSSE); init(1, 0x00, BITMODE_MPSSE);
} }
FtdiSpi::FtdiSpi(const FTDIpp_MPSSE::mpsse_bit_config &conf, uint32_t clkHZ, FtdiSpi::FtdiSpi(const FTDIpp_MPSSE::mpsse_bit_config &conf,
bool verbose): spi_pins_conf_t spi_config,
FTDIpp_MPSSE(conf, "", "", clkHZ, verbose) uint32_t clkHZ, bool verbose):
FTDIpp_MPSSE(conf, "", "", clkHZ, verbose),
_cs_bits(1 << 3), _clk(1 << 0)
{ {
/* if cs not provided use pin 4 */
/*if (_cs == 0)
_cs = (1<<4);
_cable.low_dir |= _cs;*/
printf("cs pin : %d\n", spi_config.cs_pin);
if (spi_config.cs_pin)
_cs_bits = spi_config.cs_pin;
if (spi_config.sck_pin)
_clk = spi_config.sck_pin;
/* clk is fixed by MPSSE engine
* but CS is free -> update bit direction
*/
gpio_set_output(_cs_bits, true);
gpio_set(_cs_bits, true);
setMode(0); setMode(0);
setCSmode(SPI_CS_AUTO); setCSmode(SPI_CS_AUTO);
setEndianness(SPI_MSB_FIRST); setEndianness(SPI_MSB_FIRST);
@ -94,11 +113,11 @@ bool FtdiSpi::confCs(char stat)
{ {
bool ret; bool ret;
if (stat == 0) { if (stat == 0) {
ret = gpio_clear(cs_bits, true); ret = gpio_clear(_cs_bits, true);
ret |= gpio_clear(cs_bits, true); ret |= gpio_clear(_cs_bits, true);
} else { } else {
ret = gpio_set(cs_bits, true); ret = gpio_set(_cs_bits, true);
ret |= gpio_set(cs_bits, true); ret |= gpio_set(_cs_bits, true);
} }
if (!ret) if (!ret)
printf("Error: CS update\n"); printf("Error: CS update\n");
@ -107,7 +126,7 @@ bool FtdiSpi::confCs(char stat)
bool FtdiSpi::setCs() bool FtdiSpi::setCs()
{ {
_cs = cs_bits; _cs = _cs_bits;
return confCs(_cs); return confCs(_cs);
} }

View File

@ -2,6 +2,7 @@
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include "board.hpp"
#include "ftdipp_mpsse.hpp" #include "ftdipp_mpsse.hpp"
#include "spiInterface.hpp" #include "spiInterface.hpp"
@ -19,7 +20,8 @@ class FtdiSpi : public FTDIpp_MPSSE, SPIInterface {
FtdiSpi(int vid, int pid, unsigned char interface, uint32_t clkHZ, FtdiSpi(int vid, int pid, unsigned char interface, uint32_t clkHZ,
bool verbose); bool verbose);
FtdiSpi(const FTDIpp_MPSSE::mpsse_bit_config &conf, uint32_t clkHZ, FtdiSpi(const FTDIpp_MPSSE::mpsse_bit_config &conf,
spi_pins_conf_t spi_config, uint32_t clkHZ,
bool verbose); bool verbose);
~FtdiSpi(); ~FtdiSpi();
@ -48,7 +50,9 @@ class FtdiSpi : public FTDIpp_MPSSE, SPIInterface {
private: private:
uint8_t _cs; uint8_t _cs;
uint8_t _cs_bits;
uint8_t _clk; uint8_t _clk;
uint8_t _clk_idle;
uint8_t _wr_mode; uint8_t _wr_mode;
uint8_t _rd_mode; uint8_t _rd_mode;
unsigned char _endian; unsigned char _endian;

View File

@ -147,7 +147,7 @@ int main(int argc, char **argv)
RawParser *bit = NULL; RawParser *bit = NULL;
try { try {
spi = new FtdiSpi(cable.config, args.freq, args.verbose); spi = new FtdiSpi(cable.config, {}, args.freq, args.verbose);
} catch (std::exception &e) { } catch (std::exception &e) {
printError("Error: Failed to claim cable"); printError("Error: Failed to claim cable");
return EXIT_FAILURE; return EXIT_FAILURE;