OpenOCD
linuxspidev.c File Reference

Implementation of SWD protocol with a Linux SPI device. More...

Include dependency graph for linuxspidev.c:

Go to the source code of this file.

Data Structures

struct  queue_info
 

Macros

#define ACK_BITS   3
 
#define AP_DELAY_BYTES   (DIV_ROUND_UP(AP_DELAY_CLOCKS, SPI_BITS))
 
#define AP_DELAY_CLOCKS   8
 
#define CMD_BITS   8
 
#define DATA_BITS   32
 
#define END_IDLE_BYTES   (DIV_ROUND_UP(END_IDLE_CLOCKS, SPI_BITS))
 
#define END_IDLE_CLOCKS   8
 
#define MAX_QUEUE_ENTRIES   64
 
#define PARITY_BITS   1
 
#define SPI_BITS   8
 
#define SPI_DESELECT_DELAY   0
 
#define SWD_OP_BITS   (MAX(SWD_WR_BITS, SWD_RD_BITS))
 
#define SWD_OP_BYTES   (DIV_ROUND_UP(SWD_OP_BITS, SPI_BITS))
 
#define SWD_RD_BITS   (CMD_BITS + TURN_BITS + ACK_BITS + DATA_BITS + PARITY_BITS + TURN_BITS)
 
#define SWD_WR_BITS   (CMD_BITS + TURN_BITS + ACK_BITS + TURN_BITS + DATA_BITS + PARITY_BITS)
 
#define TURN_BITS   1
 

Functions

 COMMAND_HANDLER (spidev_handle_mode_command)
 
 COMMAND_HANDLER (spidev_handle_path_command)
 
 COMMAND_HANDLER (spidev_handle_queue_entries_command)
 
static void spi_exchange (const uint8_t *tx_data, uint8_t *rx_data, unsigned int len)
 
static int spidev_alloc_queue (unsigned int new_queue_entries)
 
static void spidev_clear_queue (void)
 
static void spidev_free_queue (void)
 
static int spidev_init (void)
 
static int spidev_khz (int khz, int *jtag_speed)
 
static int spidev_quit (void)
 
static int spidev_speed (int speed)
 
static int spidev_speed_div (int speed, int *khz)
 
static int spidev_swd_execute_queue (unsigned int end_idle_bytes)
 
static int spidev_swd_init (void)
 
static void spidev_swd_queue_cmd (uint8_t cmd, uint32_t *dst, uint32_t data, uint32_t ap_delay_clk)
 
static void spidev_swd_read_reg (uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
 
static int spidev_swd_run_queue (void)
 
static int spidev_swd_switch_seq (enum swd_special_seq seq)
 
static void spidev_swd_write_reg (uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
 

Variables

struct adapter_driver linuxspidev_adapter_driver
 
static unsigned int max_queue_entries
 
static unsigned int queue_buf_fill
 
static unsigned int queue_buf_size
 
static unsigned int queue_fill
 
static struct queue_infoqueue_infos
 
static int queue_retval
 
static uint8_t * queue_rx_buf
 
static uint8_t * queue_tx_buf
 
static int spi_fd = -1
 
static uint32_t spi_mode = SPI_MODE_3
 
static char * spi_path
 
static uint32_t spi_speed
 
static const struct command_registration spidev_command_handlers []
 
static const struct command_registration spidev_subcommand_handlers []
 
const struct swd_driver spidev_swd
 
static const char *const spidev_transports [] = { "swd", NULL }
 
static uint8_t * tx_flip_buf
 

Detailed Description

Implementation of SWD protocol with a Linux SPI device.

Definition in file linuxspidev.c.

Macro Definition Documentation

◆ ACK_BITS

#define ACK_BITS   3

Definition at line 71 of file linuxspidev.c.

◆ AP_DELAY_BYTES

#define AP_DELAY_BYTES   (DIV_ROUND_UP(AP_DELAY_CLOCKS, SPI_BITS))

Definition at line 81 of file linuxspidev.c.

◆ AP_DELAY_CLOCKS

#define AP_DELAY_CLOCKS   8

Definition at line 80 of file linuxspidev.c.

◆ CMD_BITS

#define CMD_BITS   8

Definition at line 69 of file linuxspidev.c.

◆ DATA_BITS

#define DATA_BITS   32

Definition at line 72 of file linuxspidev.c.

◆ END_IDLE_BYTES

#define END_IDLE_BYTES   (DIV_ROUND_UP(END_IDLE_CLOCKS, SPI_BITS))

Definition at line 84 of file linuxspidev.c.

◆ END_IDLE_CLOCKS

#define END_IDLE_CLOCKS   8

Definition at line 83 of file linuxspidev.c.

◆ MAX_QUEUE_ENTRIES

#define MAX_QUEUE_ENTRIES   64

Definition at line 67 of file linuxspidev.c.

◆ PARITY_BITS

#define PARITY_BITS   1

Definition at line 73 of file linuxspidev.c.

◆ SPI_BITS

#define SPI_BITS   8

Definition at line 61 of file linuxspidev.c.

◆ SPI_DESELECT_DELAY

#define SPI_DESELECT_DELAY   0

Definition at line 64 of file linuxspidev.c.

◆ SWD_OP_BITS

#define SWD_OP_BITS   (MAX(SWD_WR_BITS, SWD_RD_BITS))

Definition at line 77 of file linuxspidev.c.

◆ SWD_OP_BYTES

#define SWD_OP_BYTES   (DIV_ROUND_UP(SWD_OP_BITS, SPI_BITS))

Definition at line 78 of file linuxspidev.c.

◆ SWD_RD_BITS

#define SWD_RD_BITS   (CMD_BITS + TURN_BITS + ACK_BITS + DATA_BITS + PARITY_BITS + TURN_BITS)

Definition at line 76 of file linuxspidev.c.

◆ SWD_WR_BITS

#define SWD_WR_BITS   (CMD_BITS + TURN_BITS + ACK_BITS + TURN_BITS + DATA_BITS + PARITY_BITS)

Definition at line 75 of file linuxspidev.c.

◆ TURN_BITS

#define TURN_BITS   1

Definition at line 70 of file linuxspidev.c.

Function Documentation

◆ COMMAND_HANDLER() [1/3]

COMMAND_HANDLER ( spidev_handle_mode_command  )

◆ COMMAND_HANDLER() [2/3]

COMMAND_HANDLER ( spidev_handle_path_command  )

◆ COMMAND_HANDLER() [3/3]

COMMAND_HANDLER ( spidev_handle_queue_entries_command  )

◆ spi_exchange()

static void spi_exchange ( const uint8_t *  tx_data,
uint8_t *  rx_data,
unsigned int  len 
)
static

◆ spidev_alloc_queue()

static int spidev_alloc_queue ( unsigned int  new_queue_entries)
static

◆ spidev_clear_queue()

static void spidev_clear_queue ( void  )
static

◆ spidev_free_queue()

static void spidev_free_queue ( void  )
static

◆ spidev_init()

static int spidev_init ( void  )
static

◆ spidev_khz()

static int spidev_khz ( int  khz,
int *  jtag_speed 
)
static

Definition at line 204 of file linuxspidev.c.

References ERROR_FAIL, ERROR_OK, and LOG_DEBUG.

◆ spidev_quit()

static int spidev_quit ( void  )
static

Definition at line 344 of file linuxspidev.c.

References ERROR_OK, NULL, spi_fd, spi_path, and spidev_free_queue().

◆ spidev_speed()

static int spidev_speed ( int  speed)
static

Definition at line 183 of file linuxspidev.c.

References ERROR_FAIL, ERROR_OK, LOG_ERROR, spi_fd, and spi_speed.

◆ spidev_speed_div()

static int spidev_speed_div ( int  speed,
int *  khz 
)
static

Definition at line 198 of file linuxspidev.c.

References ERROR_OK.

◆ spidev_swd_execute_queue()

◆ spidev_swd_init()

static int spidev_swd_init ( void  )
static

Definition at line 360 of file linuxspidev.c.

References ERROR_OK, and LOG_DEBUG.

◆ spidev_swd_queue_cmd()

◆ spidev_swd_read_reg()

static void spidev_swd_read_reg ( uint8_t  cmd,
uint32_t *  value,
uint32_t  ap_delay_clk 
)
static

Definition at line 488 of file linuxspidev.c.

References cmd, spidev_swd_queue_cmd(), and SWD_CMD_RNW.

◆ spidev_swd_run_queue()

static int spidev_swd_run_queue ( void  )
static

Definition at line 436 of file linuxspidev.c.

References END_IDLE_BYTES, and spidev_swd_execute_queue().

◆ spidev_swd_switch_seq()

◆ spidev_swd_write_reg()

static void spidev_swd_write_reg ( uint8_t  cmd,
uint32_t  value,
uint32_t  ap_delay_clk 
)
static

Definition at line 494 of file linuxspidev.c.

References cmd, NULL, spidev_swd_queue_cmd(), and SWD_CMD_RNW.

Variable Documentation

◆ linuxspidev_adapter_driver

struct adapter_driver linuxspidev_adapter_driver
Initial value:
= {
.name = "linuxspidev",
.transports = spidev_transports,
.init = spidev_init,
.quit = spidev_quit,
.speed = spidev_speed,
.khz = spidev_khz,
.speed_div = spidev_speed_div,
.swd_ops = &spidev_swd,
}
const struct swd_driver spidev_swd
Definition: linuxspidev.c:575
static int spidev_quit(void)
Definition: linuxspidev.c:344
static const char *const spidev_transports[]
Definition: linuxspidev.c:620
static int spidev_khz(int khz, int *jtag_speed)
Definition: linuxspidev.c:204
static int spidev_init(void)
Definition: linuxspidev.c:286
static int spidev_speed_div(int speed, int *khz)
Definition: linuxspidev.c:198
static const struct command_registration spidev_command_handlers[]
Definition: linuxspidev.c:608
static int spidev_speed(int speed)
Definition: linuxspidev.c:183

Definition at line 620 of file linuxspidev.c.

◆ max_queue_entries

unsigned int max_queue_entries
static

◆ queue_buf_fill

unsigned int queue_buf_fill
static

◆ queue_buf_size

unsigned int queue_buf_size
static

◆ queue_fill

unsigned int queue_fill
static

◆ queue_infos

◆ queue_retval

int queue_retval
static

Definition at line 99 of file linuxspidev.c.

Referenced by spidev_swd_execute_queue(), and spidev_swd_queue_cmd().

◆ queue_rx_buf

uint8_t* queue_rx_buf
static

◆ queue_tx_buf

uint8_t* queue_tx_buf
static

◆ spi_fd

int spi_fd = -1
static

Definition at line 87 of file linuxspidev.c.

Referenced by spi_exchange(), spidev_init(), spidev_quit(), and spidev_speed().

◆ spi_mode

uint32_t spi_mode = SPI_MODE_3
static

Definition at line 91 of file linuxspidev.c.

Referenced by COMMAND_HANDLER(), and spidev_init().

◆ spi_path

char* spi_path
static

Definition at line 90 of file linuxspidev.c.

Referenced by COMMAND_HANDLER(), spidev_init(), and spidev_quit().

◆ spi_speed

uint32_t spi_speed
static

Definition at line 92 of file linuxspidev.c.

Referenced by spi_exchange(), and spidev_speed().

◆ spidev_command_handlers

const struct command_registration spidev_command_handlers[]
static
Initial value:
= {
{
.name = "spidev",
.mode = COMMAND_ANY,
.help = "perform spidev management",
.usage = "",
},
}
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:253
@ COMMAND_ANY
Definition: command.h:42
static const struct command_registration spidev_subcommand_handlers[]
Definition: linuxspidev.c:583
const char * usage
a string listing the options and arguments, required or optional
Definition: command.h:241

Definition at line 563 of file linuxspidev.c.

◆ spidev_subcommand_handlers

const struct command_registration spidev_subcommand_handlers[]
static
Initial value:
= {
{
.name = "path",
.handler = &spidev_handle_path_command,
.mode = COMMAND_CONFIG,
.help = "set the path to the spidev device",
.usage = "path_to_spidev",
},
{
.name = "mode",
.handler = &spidev_handle_mode_command,
.mode = COMMAND_CONFIG,
.help = "set the mode of the spi port with optional bit flags (default=3)",
.usage = "mode",
},
{
.name = "queue_entries",
.handler = &spidev_handle_queue_entries_command,
.mode = COMMAND_CONFIG,
.help = "set the queue entry size (default=64)",
.usage = "queue_entries",
},
}
@ COMMAND_CONFIG
Definition: command.h:41

Definition at line 563 of file linuxspidev.c.

◆ spidev_swd

const struct swd_driver spidev_swd
Initial value:
= {
.init = spidev_swd_init,
.switch_seq = spidev_swd_switch_seq,
.read_reg = spidev_swd_read_reg,
.write_reg = spidev_swd_write_reg,
}
static void spidev_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
Definition: linuxspidev.c:494
static int spidev_swd_init(void)
Definition: linuxspidev.c:360
static int spidev_swd_switch_seq(enum swd_special_seq seq)
Definition: linuxspidev.c:500
static void spidev_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
Definition: linuxspidev.c:488
static int spidev_swd_run_queue(void)
Definition: linuxspidev.c:436

Definition at line 563 of file linuxspidev.c.

◆ spidev_transports

const char* const spidev_transports[] = { "swd", NULL }
static

Definition at line 620 of file linuxspidev.c.

◆ tx_flip_buf

uint8_t* tx_flip_buf
static