Go to the source code of this file.
Classes | |
struct | swd_cmd_t |
SWD Command Element Structure. More... | |
struct | swd_context_config_t |
Context configuration structure. More... | |
struct | swd_swdp_t |
Most actual Serial Wire Debug Port Registers. More... | |
struct | swd_ahbap_t |
Most actual Advanced High Bandwidth Access Peripherial Bus Reisters. More... | |
struct | swd_transaction_t |
Most actual SWD bus transaction/packet data. More... | |
struct | swd_driver_t |
Interface Driver structure. More... | |
struct | swd_ctx_t |
SWD Context Structure definition. More... | |
Defines | |
#define | SWD_REQUEST_START_BITNUM 7 |
SWD Packets Bit Fields and Values. | |
#define | SWD_REQUEST_APnDP_BITNUM 6 |
Access Port (high) or Debug Port (low) access. | |
#define | SWD_REQUEST_RnW_BITNUM 5 |
Read (high) or Write (low) access. | |
#define | SWD_REQUEST_ADDR_BITNUM 4 |
LSB of the address field in request header. | |
#define | SWD_REQUEST_A2_BITNUM 4 |
Target Register Address bit 2. | |
#define | SWD_REQUEST_A3_BITNUM 3 |
Target Register Address bit 3. | |
#define | SWD_REQUEST_PARITY_BITNUM 2 |
Odd Parity calculated from APnDP, RnW, A[2:3]. | |
#define | SWD_REQUEST_STOP_BITNUM 1 |
Packet Stop bit, always 0. | |
#define | SWD_REQUEST_PARK_BITNUM 0 |
Park wire and switch between receive/transmit. | |
#define | SWD_REQUEST_START_VAL 1 |
Start Bit Value is always 1. | |
#define | SWD_REQUEST_STOP_VAL 0 |
Stop Bit Value is always 0. | |
#define | SWD_REQUEST_PARK_VAL 1 |
Park bus and put outputs into Hi-Z state. | |
#define | SWD_REQUEST_BITLEN 8 |
Number of bits in request packet header. | |
#define | SWD_ADDR_MINVAL 0 |
Address field minimal value. | |
#define | SWD_ADDR_MAXVAL 3 |
Address field maximal value. | |
#define | SWD_ACK_BITLEN 3 |
Number of bits in Acknowledge packet. | |
#define | SWD_ACK_OK_VAL 4 |
OK code value. | |
#define | SWD_ACK_WAIT_VAL 2 |
WAIT code value. | |
#define | SWD_ACK_FAULT_VAL 1 |
FAULT code value. | |
#define | SWD_DP_ADDR_IDCODE 0 |
IDCODE register address (RO). | |
#define | SWD_DP_ADDR_ABORT 0 |
ABORT register address (WO). | |
#define | SWD_DP_ADDR_CTRLSTAT 1 |
CTRLSTAT register address (R/W, CTRLSEL=b0). | |
#define | SWD_DP_ADDR_WCR 1 |
WCR register address (R/W, CTRLSEL=b1). | |
#define | SWD_DP_ADDR_RESEND 2 |
RESEND register address (RO). | |
#define | SWD_DP_ADDR_SELECT 2 |
SELECT register address (WO). | |
#define | SWD_DP_ADDR_RDBUF 3 |
RDBUF register address (RO). | |
#define | SWD_ABORT_BITNUM_DAPABORT 0 |
SW-DP ABORT Register map. | |
#define | SWD_ABORT_BITNUM_DSTKCMPCLR 1 |
DSTKCMPCLR bit number. | |
#define | SWD_ABORT_BITNUM_DSTKERRCLR 2 |
DSTKERRCLR bit number. | |
#define | SWD_ABORT_BITNUM_DWDERRCLR 3 |
DWDERRCLR bit number. | |
#define | SWD_ABORT_BITNUM_DORUNERRCLR 4 |
DORUNERRCLR bit number. | |
#define | SWD_CTRLSTAT_BITNUM_ORUNDETECT 0 |
SW-DP CTRL/STAT Register map. | |
#define | SWD_CTRLSTAT_BITNUM_OSTICKYORUN 1 |
OSTICKYORUN bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OTRNMODE 2 |
OTRNMODE bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OSTICKYCMP 4 |
OSTICKYCMP bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OSTICKYERR 5 |
OSTICKYERR bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OREADOK 6 |
OREADOK bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OWDATAERR 7 |
OWDATAERR bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OMASKLANE 8 |
OMASKLANE bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OTRNCNT 12 |
OTRNCNT bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OCDBGRSTREQ 26 |
OCDBGRSTREQ bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OCDBGRSTACK 27 |
OCDBGRSTACK bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OCDBGPWRUPREQ 28 |
OCDBGPWRUPREQ bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OCDBGPWRUPACK 29 |
OCDBGPWRUPACK bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OCSYSPWRUPREQ 30 |
OCSYSPWRUPREQ bit number. | |
#define | SWD_CTRLSTAT_BITNUM_OCSYSPWRUPACK 31 |
OCSYSPWRUPACK bit number. | |
#define | SWD_MASKLANE_0 0b0001 |
SW-DP CTRLSTAT MASKLANE available values. | |
#define | SWD_MASKLANE_1 0b0010 |
Compare byte lane 1 (0x----FF--). | |
#define | SWD_MASKLANE_2 0b0100 |
Compare byte lane 2 (0x--FF----). | |
#define | SWD_MASKLANE_3 0b1000 |
Compare byte lane 3 (0xFF------). | |
#define | SWD_SELECT_BITNUM_CTRLSEL 0 |
SW-DP SELECT Register map. | |
#define | SWD_SELECT_BITNUM_APBANKSEL 4 |
APBANKSEL bit number. | |
#define | SWD_SELECT_BITNUM_APSEL 24 |
APSEL bit number. | |
#define | SWD_WCR_BITNUM_PRESCALER 0 |
SW-DP WCR Register map. | |
#define | SWD_WCR_BITNUM_WIREMODE 6 |
#define | SWD_WCR_BITNUM_TURNROUND 8 |
#define | SWD_TURNROUND_1_CODE 0 |
SW-DP WCR TURNROUND available values. | |
#define | SWD_TURNROUND_1_VAL 1 |
#define | SWD_TURNROUND_2_CODE 1 |
#define | SWD_TURNROUNT_2_VAL 2 |
#define | SWD_TURNROUND_3_CODE 2 |
#define | SWD_TURNROUND_3_VAL 3 |
#define | SWD_TURNROUND_4_CODE 3 |
#define | SWD_TURNROUND_4_VAL 4 |
#define | SWD_TURNROUND_MIN_VAL SWD_TURNROUND_1_VAL |
#define | SWD_TURNROUND_MIN_CODE SWD_TURNOUND_1_CODE |
#define | SWD_TURNROUND_MAX_VAL SWD_TURNROUND_4_VAL |
#define | SWD_TURNROUND_MAX_CODE SWD_TURNROUND_4_CODE |
#define | SWD_TURNROUND_DEFAULT_VAL SWD_TURNROUND_1_VAL |
#define | AHB_AP_CONTROLSTATUS 0x00 |
AHB-AP Registers Map. | |
#define | AHB_AP_TAR 0x04 |
R/W, 32bit, reset value: 0x00000000. | |
#define | AHB_AP_DRW 0x0C |
R/W, 32bit. | |
#define | AHB_AP_BD0 0x10 |
R/W, 32bit. | |
#define | AHB_AP_BD1 0x14 |
R/W, 32bit. | |
#define | AHB_AP_BD2 0x18 |
R/W, 32bit. | |
#define | AHB_AP_BD3 0x1C |
R/W, 32bit. | |
#define | AHB_AP_DROMT 0xF8 |
RO, 32bit, reset value: 0xE00FF000. | |
#define | AHB_AP_IDR 0xFC |
RO, 32bit, reset value: 0x24770001. | |
#define | SWD_DATA_MAXBITCOUNT 32 |
SWD queue and payload data definitions. | |
#define | SWD_DATA_BYTESIZE 8 |
How many bits are there in a byte. | |
#define | SWD_DATA_BITLEN 32 |
How many bits are there in data payload. | |
#define | SWD_CMDQLEN_DEFAULT 1024; |
How long is the command queue by default. | |
Typedefs | |
typedef struct swd_cmd_t | swd_cmd_t |
SWD Command Element Structure. | |
Enumerations | |
enum | swd_error_code_t { SWD_OK = 0, SWD_ERROR_GENERAL = -1, SWD_ERROR_NULLPOINTER = -2, SWD_ERROR_NULLQUEUE = -3, SWD_ERROR_NULLTRN = -4, SWD_ERROR_PARAM = -5, SWD_ERROR_OUTOFMEM = -6, SWD_ERROR_RESULT = -7, SWD_ERROR_RANGE = -8, SWD_ERROR_DEFINITION = -9, SWD_ERROR_NULLCONTEXT = -10, SWD_ERROR_QUEUE = -11, SWD_ERROR_ADDR = -12, SWD_ERROR_APnDP = -13, SWD_ERROR_RnW = -14, SWD_ERROR_PARITY = -15, SWD_ERROR_ACK = -16, SWD_ERROR_ACKUNKNOWN = -19, SWD_ERROR_ACKNOTDONE = -20, SWD_ERROR_ACKMISSING = -21, SWD_ERROR_ACKMISMATCH = -22, SWD_ERROR_ACKORDER = -23, SWD_ERROR_BADOPCODE = -24, SWD_ERROR_NODATACMD = -25, SWD_ERROR_DATAPTR = -26, SWD_ERROR_NOPARITYCMD = -27, SWD_ERROR_PARITYPTR = -28, SWD_ERROR_NOTDONE = -29, SWD_ERROR_QUEUEROOT = -30, SWD_ERROR_QUEUETAIL = -31, SWD_ERROR_BADCMDTYPE = -32, SWD_ERROR_BADCMDDATA = -33, SWD_ERROR_TURNAROUND = -34, SWD_ERROR_DRIVER = -35, SWD_ERROR_ACK_WAIT = -36, SWD_ERROR_ACK_FAULT = -37, SWD_ERROR_QUEUENOTFREE = -38, SWD_ERROR_TRANSPORT = -39, SWD_ERROR_DIRECTION = -40, SWD_ERROR_LOGLEVEL = -41 } |
Status and Error Codes definitions. More... | |
enum | swd_loglevel_t { SWD_LOGLEVEL_MIN = 0, SWD_LOGLEVEL_SILENT = 0, SWD_LOGLEVEL_ERROR = 1, SWD_LOGLEVEL_WARNING = 2, SWD_LOGLEVEL_NORMAL = 3, SWD_LOGLEVEL_INFO = 4, SWD_LOGLEVEL_DEBUG = 5, SWD_LOGLEVEL_MAX = 5 } |
Logging Level Codes definition. More... | |
enum | swd_cmdtype_t { SWD_CMDTYPE_MOSI_DATA = -7, SWD_CMDTYPE_MOSI_REQUEST = -6, SWD_CMDTYPE_MOSI_TRN = -5, SWD_CMDTYPE_MOSI_PARITY = -4, SWD_CMDTYPE_MOSI_BITBANG = -3, SWD_CMDTYPE_MOSI_CONTROL = -2, SWD_CMDTYPE_MOSI = -1, SWD_CMDTYPE_UNDEFINED = 0, SWD_CMDTYPE_MISO = 1, SWD_CMDTYPE_MISO_ACK = 2, SWD_CMDTYPE_MISO_BITBANG = 3, SWD_CMDTYPE_MISO_PARITY = 4, SWD_CMDTYPE_MISO_TRN = 5, SWD_CMDTYPE_MISO_DATA = 6 } |
SWD Command Codes definitions. More... | |
enum | swd_shiftdir_t { SWD_DIR_LSBFIRST = 0, SWD_DIR_MSBFIRST = 1 } |
What is the shift direction LSB-first or MSB-first. More... | |
enum | swd_operation_t { SWD_OPERATION_FIRST = 1, SWD_OPERATION_ENQUEUE = 1, SWD_OPERATION_EXECUTE = 2, SWD_OPERATION_TRANSMIT_HEAD = 3, SWD_OPERATION_TRANSMIT_TAIL = 4, SWD_OPERATION_TRANSMIT_ALL = 5, SWD_OPERATION_TRANSMIT_ONE = 6, SWD_OPERATION_TRANSMIT_LAST = 7, SWD_OPERATION_LAST = 7 } |
Command Queue operations codes. More... | |
enum | swd_bool_t { SWD_FALSE = 0, SWD_TRUE = 1 } |
Boolean values definition. More... | |
Functions | |
int | swd_bin8_parity_even (char *data, char *parity) |
Some comments on the function behavior. | |
int | swd_bin32_parity_even (int *data, char *parity) |
Data parity calculator, calculates even parity on integer type. | |
int | swd_bin8_print (char *data) |
Prints binary data of a char value on the screen. | |
int | swd_bin32_print (int *data) |
Prints binary data of an integer value on the screen. | |
char * | swd_bin8_string (char *data) |
Generates string containing binary data of a char value. | |
char * | swd_bin32_string (int *data) |
Generates string containing binary data of an integer value. | |
int | swd_bin8_bitswap (unsigned char *buffer, int bitcount) |
Bit swap helper function that reverse bit order in char *buffer. | |
int | swd_bin32_bitswap (unsigned int *buffer, int bitcount) |
Bit swap helper function that reverse bit order in int *buffer. | |
int | swd_cmdq_init (swd_cmd_t *cmdq) |
Initialize new queue element in memory that becomes a queue root. | |
swd_cmd_t * | swd_cmdq_find_root (swd_cmd_t *cmdq) |
Find queue root (first element). | |
swd_cmd_t * | swd_cmdq_find_tail (swd_cmd_t *cmdq) |
Find queue tail (last element). | |
int | swd_cmdq_append (swd_cmd_t *cmdq, swd_cmd_t *cmd) |
Append element pointed by *cmd at the end of the quque pointed by *cmdq. | |
int | swd_cmdq_free (swd_cmd_t *cmdq) |
Free queue pointed by *cmdq element. | |
int | swd_cmdq_free_head (swd_cmd_t *cmdq) |
Free queue head up to *cmdq element. | |
int | swd_cmdq_free_tail (swd_cmd_t *cmdq) |
Free queue tail starting after *cmdq element. | |
int | swd_cmdq_flush (swd_ctx_t *swdctx, swd_operation_t operation) |
Flush command queue contents into interface driver. | |
int | swd_cmd_enqueue (swd_ctx_t *swdctx, swd_cmd_t *cmd) |
Append selected command to a context's command queue. | |
int | swd_cmd_enqueue_mosi_request (swd_ctx_t *swdctx, char *request) |
Appends command queue with SWD Request packet header. | |
int | swd_cmd_enqueue_mosi_trn (swd_ctx_t *swdctx) |
Append command queue with Turnaround activating MOSI mode. | |
int | swd_cmd_enqueue_miso_trn (swd_ctx_t *swdctx) |
Append command queue with Turnaround activating MISO mode. | |
int | swd_cmd_enqueue_miso_nbit (swd_ctx_t *swdctx, char **data, int count) |
Append command queue with bus binary read bit-by-bit operation. | |
int | swd_cmd_enqueue_mosi_nbit (swd_ctx_t *swdctx, char *data, int count) |
Append command queue with bus binary write bit-by-bit operation. | |
int | swd_cmd_enqueue_mosi_parity (swd_ctx_t *swdctx, char *parity) |
Append command queue with parity bit write. | |
int | swd_cmd_enqueue_miso_parity (swd_ctx_t *swdctx, char **parity) |
Append command queue with parity bit read. | |
int | swd_cmd_enqueue_miso_data (swd_ctx_t *swdctx, int **data) |
Append command queue with data read. | |
int | swd_cmd_enqueue_miso_data_p (swd_ctx_t *swdctx, int **data, char **parity) |
Append command queue with data and parity read. | |
int | swd_cmd_enqueue_miso_n_data_p (swd_ctx_t *swdctx, int **data, char **parity, int count) |
Append command queue with series of data and parity read. | |
int | swd_cmd_enqueue_mosi_data (swd_ctx_t *swdctx, int *data) |
Append command queue with data and parity write. | |
int | swd_cmd_enqueue_mosi_data_ap (swd_ctx_t *swdctx, int *data) |
Append command queue with data and automatic parity write. | |
int | swd_cmd_enqueue_mosi_data_p (swd_ctx_t *swdctx, int *data, char *parity) |
Append command queue with data and provided parity write. | |
int | swd_cmd_enqueue_mosi_n_data_ap (swd_ctx_t *swdctx, int **data, int count) |
Append command queue with series of data and automatic parity writes. | |
int | swd_cmd_enqueue_mosi_n_data_p (swd_ctx_t *swdctx, int **data, char **parity, int count) |
Append command queue with series of data and provided parity writes. | |
int | swd_cmd_enqueue_miso_ack (swd_ctx_t *swdctx, char **ack) |
Append queue with ACK read. | |
int | swd_cmd_enqueue_mosi_control (swd_ctx_t *swdctx, char *ctlmsg, int len) |
Append command queue with len-octet size control seruence. | |
int | swd_cmd_enqueue_mosi_dap_reset (swd_ctx_t *swdctx) |
Append command queue with SW-DP-RESET sequence. | |
int | swd_cmd_enqueue_mosi_idle (swd_ctx_t *swdctx) |
Append command queue with idle sequence. | |
int | swd_cmd_enqueue_mosi_jtag2swd (swd_ctx_t *swdctx) |
Append command queue with JTAG-TO-SWD DAP-switch sequence. | |
int | swd_cmd_enqueue_mosi_swd2jtag (swd_ctx_t *swdctx) |
Append command queue with SWD-TO-JTAG DAP-switch sequence. | |
char * | swd_cmd_string_cmdtype (swd_cmd_t *cmd) |
int | swd_bus_setdir_mosi (swd_ctx_t *swdctx) |
Append command queue with TRN WRITE/MOSI, if previous command was READ/MISO. | |
int | swd_bus_setdir_miso (swd_ctx_t *swdctx) |
Append command queue with TRN READ/MISO, if previous command was WRITE/MOSI. | |
int | swd_bus_write_request (swd_ctx_t *swdctx, swd_operation_t operation, char *APnDP, char *RnW, char *addr) |
Perform Request. | |
int | swd_bus_read_ack (swd_ctx_t *swdctx, swd_operation_t operation, char **ack) |
Perform ACK read into *ack and verify received data. | |
int | swd_bus_write_data_p (swd_ctx_t *swdctx, swd_operation_t operation, int *data, char *parity) |
Perform (MOSI) data write with provided parity value. | |
int | swd_bus_write_data_ap (swd_ctx_t *swdctx, swd_operation_t operation, int *data) |
Perform (MOSI) data write with automatic parity calculation. | |
int | swd_bus_read_data_p (swd_ctx_t *swdctx, swd_operation_t operation, int **data, char **parity) |
Perform (MISO) data read. | |
int | swd_bus_write_control (swd_ctx_t *swdctx, swd_operation_t operation, char *ctlmsg, int len) |
Write CONTROL byte to the Target's DAP. | |
int | swd_bitgen8_request (swd_ctx_t *swdctx, char *APnDP, char *RnW, char *addr, char *request) |
Generate 8-bit SWD-REQUEST packet contents with provided parameters. | |
int | swd_drv_transmit (swd_ctx_t *swdctx, swd_cmd_t *cmd) |
Transmit selected command from the command queue to the interface driver. | |
int | swd_drv_mosi_8 (swd_ctx_t *swdctx, swd_cmd_t *cmd, char *data, int bits, int nLSBfirst) |
int | swd_drv_mosi_32 (swd_ctx_t *swdctx, swd_cmd_t *cmd, int *data, int bits, int nLSBfirst) |
int | swd_drv_miso_8 (swd_ctx_t *swdctx, swd_cmd_t *cmd, char *data, int bits, int nLSBfirst) |
int | swd_drv_miso_32 (swd_ctx_t *swdctx, swd_cmd_t *cmd, int *data, int bits, int nLSBfirst) |
int | swd_drv_mosi_trn (swd_ctx_t *swdctx, int clks) |
int | swd_drv_miso_trn (swd_ctx_t *swdctx, int clks) |
int | swd_dap_reset (swd_ctx_t *swdctx, swd_operation_t operation) |
Debug Access Port Reset sends 50 CLK with TMS high that brings both SW-DP and JTAG-DP into reset state. | |
int | swd_dap_select (swd_ctx_t *swdctx, swd_operation_t operation) |
Activate SW-DP by sending out RESET and JTAG-TO-SWD sequence on SWDIOTMS line. | |
int | swd_dap_detect (swd_ctx_t *swdctx, swd_operation_t operation, int **idcode) |
Macro: Reset target DAP, select SW-DP, read out IDCODE. | |
int | swd_dp_read_idcode (swd_ctx_t *swdctx, swd_operation_t operation, int **idcode) |
Macro: Read out IDCODE register and return its value on function return. | |
int | swd_log (swd_ctx_t *swdctx, swd_loglevel_t loglevel, char *msg,...) |
Put a message into swd context log at specified verbosity level. | |
int | swd_log_level_set (swd_ctx_t *swdctx, swd_loglevel_t loglevel) |
Change log level to increase or decrease verbosity level. | |
int | swd_log_level_inherit (swd_ctx_t *swdctx, int loglevel) |
char * | swd_error_string (swd_error_code_t error) |
swd_ctx_t * | swd_init (void) |
LibSWD initialization routine. | |
int | swd_deinit_ctx (swd_ctx_t *swdctx) |
De-initialize selected swd context and free its memory. | |
int | swd_deinit_cmdq (swd_ctx_t *swdctx) |
De-initialize command queue and free its memory on selected swd context. | |
int | swd_deinit (swd_ctx_t *swdctx) |
De-initialize selected swd context and its command queue. |
#define AHB_AP_BD0 0x10 |
R/W, 32bit.
R/W, 32bit
#define AHB_AP_BD1 0x14 |
R/W, 32bit.
R/W, 32bit
#define AHB_AP_BD2 0x18 |
R/W, 32bit.
R/W, 32bit
#define AHB_AP_BD3 0x1C |
R/W, 32bit.
R/W, 32bit
#define AHB_AP_CONTROLSTATUS 0x00 |
AHB-AP Registers Map.
TODO!!!! R/W, 32bit, reset value: 0x43800042 R/W, 32bit, reset value: 0x43800042
#define AHB_AP_DROMT 0xF8 |
RO, 32bit, reset value: 0xE00FF000.
RO, 32bit, reset value: 0xE00FF000
#define AHB_AP_DRW 0x0C |
R/W, 32bit.
R/W, 32bit
#define AHB_AP_IDR 0xFC |
RO, 32bit, reset value: 0x24770001.
RO, 32bit, reset value: 0x24770001
#define AHB_AP_TAR 0x04 |
R/W, 32bit, reset value: 0x00000000.
R/W, 32bit, reset value: 0x00000000
#define SWD_ABORT_BITNUM_DAPABORT 0 |
SW-DP ABORT Register map.
DAPABORT bit number.
#define SWD_CTRLSTAT_BITNUM_ORUNDETECT 0 |
SW-DP CTRL/STAT Register map.
ORUNDETECT bit number.
#define SWD_DATA_MAXBITCOUNT 32 |
SWD queue and payload data definitions.
What is the maximal bit length of the data.
#define SWD_MASKLANE_0 0b0001 |
SW-DP CTRLSTAT MASKLANE available values.
Compare byte lane 0 (0x------FF)
#define SWD_REQUEST_START_BITNUM 7 |
SWD Packets Bit Fields and Values.
Packet Start bit, always set to 1.
#define SWD_SELECT_BITNUM_CTRLSEL 0 |
SW-DP SELECT Register map.
CTRLSEL bit number.
#define SWD_TURNROUND_1_CODE 0 |
SW-DP WCR TURNROUND available values.
TRN takes one CLK cycle. TRN takes one CLK cycle.
#define SWD_TURNROUND_2_CODE 1 |
TRN takes two CLK cycles.
#define SWD_TURNROUND_3_CODE 2 |
TRN takes three CLK cycles.
#define SWD_TURNROUND_4_CODE 3 |
TRN takes four CLK cycles. ????
#define SWD_TURNROUND_DEFAULT_VAL SWD_TURNROUND_1_VAL |
Default TRN length is one CLK.
#define SWD_TURNROUND_MAX_VAL SWD_TURNROUND_4_VAL |
longest TRN time.
#define SWD_TURNROUND_MIN_VAL SWD_TURNROUND_1_VAL |
shortest TRN time.
#define SWD_WCR_BITNUM_PRESCALER 0 |
SW-DP WCR Register map.
PRESCALER bit number. PRESCALER bit number.
#define SWD_WCR_BITNUM_TURNROUND 8 |
TURNROUND bit number.
#define SWD_WCR_BITNUM_WIREMODE 6 |
WIREMODE bit number.
SWD Command Element Structure.
In libswd each operation is split into separate commands (request, trn, ack, data, parity) that can be appended to the command queue and later executed. This organization allows better granularity for tracing bugs and makes possible to compose complete bus/target operations made of simple commands.
enum swd_bool_t |
enum swd_cmdtype_t |
SWD Command Codes definitions.
Available values: MISO>0, MOSI<0, undefined=0. To check command direction (read/write) multiply tested value with one of the MOSI or MISO commands
enum swd_error_code_t |
Status and Error Codes definitions.
Error Codes definition, use this to have its name on debugger.
enum swd_loglevel_t |
Logging Level Codes definition.
Logging Level codes definition, use this to have its name on debugger.
enum swd_operation_t |
Command Queue operations codes.
enum swd_shiftdir_t |
int swd_bin32_bitswap | ( | unsigned int * | buffer, | |
int | bitcount | |||
) |
Bit swap helper function that reverse bit order in int *buffer.
Most Significant Bit becomes Least Significant Bit. It is possible to swap only n-bits from int (32-bit) *buffer.
*buffer | unsigned char (32-bit) data pointer. | |
bitcount | how many bits to swap. |
int swd_bin32_parity_even | ( | int * | data, | |
char * | parity | |||
) |
Data parity calculator, calculates even parity on integer type.
*data | source data pointer. | |
*parity | resulting data pointer. |
int swd_bin32_print | ( | int * | data | ) |
Prints binary data of an integer value on the screen.
*data | source data pointer. |
char* swd_bin32_string | ( | int * | data | ) |
Generates string containing binary data of an integer value.
*data | source data pointer. |
int swd_bin8_bitswap | ( | unsigned char * | buffer, | |
int | bitcount | |||
) |
Bit swap helper function that reverse bit order in char *buffer.
Most Significant Bit becomes Least Significant Bit. It is possible to swap only n-bits from char (8-bit) *buffer.
*buffer | unsigned char (8-bit) data pointer. | |
bitcount | how many bits to swap. |
int swd_bin8_parity_even | ( | char * | data, | |
char * | parity | |||
) |
Some comments on the function behavior.
Some comments on the function behavior.
*data | source data pointer. | |
*parity | resulting data pointer. |
int swd_bin8_print | ( | char * | data | ) |
Prints binary data of a char value on the screen.
*data | source data pointer. |
char* swd_bin8_string | ( | char * | data | ) |
Generates string containing binary data of a char value.
*data | source data pointer. |
int swd_bitgen8_request | ( | swd_ctx_t * | swdctx, | |
char * | APnDP, | |||
char * | RnW, | |||
char * | addr, | |||
char * | request | |||
) |
Generate 8-bit SWD-REQUEST packet contents with provided parameters.
Note that parity bit value is calculated automatically.
*swdctx | swd context pointer. | |
*APnDP | AccessPort (high) or DebugPort (low) access type pointer. | |
*RnW | Read (high) or Write (low) operation type pointer. | |
*addr | target register address value pointer. | |
*request | pointer where to store resulting packet. |
int swd_bus_read_ack | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation, | |||
char ** | ack | |||
) |
Perform ACK read into *ack and verify received data.
*swdctx | swd context pointer. | |
operation | type of action to perform with generated request. | |
*ack | pointer to the result location. |
int swd_bus_read_data_p | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation, | |||
int ** | data, | |||
char ** | parity | |||
) |
Perform (MISO) data read.
*swdctx | swd context pointer. | |
operation | type of action to perform on generated command. | |
*data | payload value pointer. | |
*parity | payload parity value pointer. |
int swd_bus_setdir_miso | ( | swd_ctx_t * | swdctx | ) |
Append command queue with TRN READ/MISO, if previous command was WRITE/MOSI.
*swdctx | swd context pointer. |
int swd_bus_setdir_mosi | ( | swd_ctx_t * | swdctx | ) |
Append command queue with TRN WRITE/MOSI, if previous command was READ/MISO.
*swdctx | swd context pointer. |
int swd_bus_write_control | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation, | |||
char * | ctlmsg, | |||
int | len | |||
) |
Write CONTROL byte to the Target's DAP.
*swdctx | swd context. | |
operation | can be SWD_OPERATION_ENQUEUE or SWD_OPERATION_EXECUTE. | |
*ctlmsg | byte/char array that contains control payload. | |
len | number of bytes in the *ctlmsg to send. |
int swd_bus_write_data_ap | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation, | |||
int * | data | |||
) |
Perform (MOSI) data write with automatic parity calculation.
*swdctx | swd context pointer. | |
operation | type of action to perform on generated command. | |
*data | payload value pointer. |
int swd_bus_write_data_p | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation, | |||
int * | data, | |||
char * | parity | |||
) |
Perform (MOSI) data write with provided parity value.
*swdctx | swd context pointer. | |
operation | type of action to perform on generated command. | |
*data | payload value pointer. | |
*parity | payload parity value pointer. |
int swd_bus_write_request | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation, | |||
char * | APnDP, | |||
char * | RnW, | |||
char * | addr | |||
) |
Perform Request.
*swdctx | swd context pointer. | |
operation | type of action to perform with generated request. | |
*APnDP | AccessPort (high) or DebugPort (low) access value pointer. | |
*RnW | Read (high) or Write (low) access value pointer. | |
*addr | target register address value pointer. |
Append selected command to a context's command queue.
*swdctx | swd context pointer containing the command queue. | |
*cmd | command to be appended to the context's command queue. |
int swd_cmd_enqueue_miso_ack | ( | swd_ctx_t * | swdctx, | |
char ** | ack | |||
) |
Append queue with ACK read.
*swdctx | swd context pointer. | |
*ack | packet value pointer. |
int swd_cmd_enqueue_miso_data | ( | swd_ctx_t * | swdctx, | |
int ** | data | |||
) |
Append command queue with data read.
*swdctx | swd context pointer. | |
*data | data pointer. |
int swd_cmd_enqueue_miso_data_p | ( | swd_ctx_t * | swdctx, | |
int ** | data, | |||
char ** | parity | |||
) |
Append command queue with data and parity read.
*swdctx | swd context pointer. | |
*data | data value pointer. | |
*parity | parity value pointer. |
int swd_cmd_enqueue_miso_n_data_p | ( | swd_ctx_t * | swdctx, | |
int ** | data, | |||
char ** | parity, | |||
int | count | |||
) |
Append command queue with series of data and parity read.
*swdctx | swd context pointer. | |
**data | data value array pointer. | |
**parity | parity value array pointer. | |
count | number of (data+parity) elements to read. |
int swd_cmd_enqueue_miso_nbit | ( | swd_ctx_t * | swdctx, | |
char ** | data, | |||
int | count | |||
) |
Append command queue with bus binary read bit-by-bit operation.
This function will append command to the queue for each bit, and store one bit into single char array element, so read is not constrained to 8 bits. On error memory is released and apropriate error code is returned. Important: Memory pointed by *data must be allocated prior call!
*swdctx | swd context pointer. | |
**data | allocated data array to write result into. | |
count | number of bits to read (also the **data size). |
int swd_cmd_enqueue_miso_parity | ( | swd_ctx_t * | swdctx, | |
char ** | parity | |||
) |
Append command queue with parity bit read.
*swdctx | swd context pointer. | |
*parity | parity value pointer. |
int swd_cmd_enqueue_miso_trn | ( | swd_ctx_t * | swdctx | ) |
Append command queue with Turnaround activating MISO mode.
*swdctx | swd context pointer. |
int swd_cmd_enqueue_mosi_control | ( | swd_ctx_t * | swdctx, | |
char * | ctlmsg, | |||
int | len | |||
) |
Append command queue with len-octet size control seruence.
This control sequence can be used for instance to send payload of packets switching DAP between JTAG and SWD mode.
*swdctx | swd context pointer. | |
*ctlmsg | control message array pointer. | |
len | number of elements to send from *ctlmsg. |
int swd_cmd_enqueue_mosi_dap_reset | ( | swd_ctx_t * | swdctx | ) |
Append command queue with SW-DP-RESET sequence.
*swdctx | swd context pointer. |
int swd_cmd_enqueue_mosi_data | ( | swd_ctx_t * | swdctx, | |
int * | data | |||
) |
Append command queue with data and parity write.
*swdctx | swd context pointer. | |
*data | data value pointer. |
int swd_cmd_enqueue_mosi_data_ap | ( | swd_ctx_t * | swdctx, | |
int * | data | |||
) |
Append command queue with data and automatic parity write.
*swdctx | swd context pointer. | |
*data | data value pointer. |
int swd_cmd_enqueue_mosi_data_p | ( | swd_ctx_t * | swdctx, | |
int * | data, | |||
char * | parity | |||
) |
Append command queue with data and provided parity write.
*swdctx | swd context pointer. | |
*data | data value pointer. | |
*parity | parity value pointer. |
int swd_cmd_enqueue_mosi_idle | ( | swd_ctx_t * | swdctx | ) |
Append command queue with idle sequence.
*swdctx | swd context pointer. |
int swd_cmd_enqueue_mosi_jtag2swd | ( | swd_ctx_t * | swdctx | ) |
Append command queue with JTAG-TO-SWD DAP-switch sequence.
*swdctx | swd context pointer. |
int swd_cmd_enqueue_mosi_n_data_ap | ( | swd_ctx_t * | swdctx, | |
int ** | data, | |||
int | count | |||
) |
Append command queue with series of data and automatic parity writes.
*swdctx | swd context pointer. | |
**data | data value array pointer. | |
count | number of (data+parity) elements to read. |
int swd_cmd_enqueue_mosi_n_data_p | ( | swd_ctx_t * | swdctx, | |
int ** | data, | |||
char ** | parity, | |||
int | count | |||
) |
Append command queue with series of data and provided parity writes.
*swdctx | swd context pointer. | |
**data | data value array pointer. | |
**parity | parity value array pointer. | |
count | number of (data+parity) elements to read. |
int swd_cmd_enqueue_mosi_nbit | ( | swd_ctx_t * | swdctx, | |
char * | data, | |||
int | count | |||
) |
Append command queue with bus binary write bit-by-bit operation.
This function will append command to the queue for each bit and store one bit into single char array element, so read is not constrained to 8 bits. On error memory is released and apropriate error code is returned. Important: Memory pointed by *data must be allocated prior call!
*swdctx | swd context pointer. | |
**data | allocated data array to write result into. | |
count | number of bits to read (also the **data size). |
int swd_cmd_enqueue_mosi_parity | ( | swd_ctx_t * | swdctx, | |
char * | parity | |||
) |
Append command queue with parity bit write.
*swdctx | swd context pointer. | |
*parity | parity value pointer. |
int swd_cmd_enqueue_mosi_request | ( | swd_ctx_t * | swdctx, | |
char * | request | |||
) |
Appends command queue with SWD Request packet header.
Note that contents is not validated, so bad request can be sent as well.
*swdctx | swd context pointer. | |
*request | pointer to the 8-bit request payload. |
int swd_cmd_enqueue_mosi_swd2jtag | ( | swd_ctx_t * | swdctx | ) |
Append command queue with SWD-TO-JTAG DAP-switch sequence.
*swdctx | swd context pointer. |
int swd_cmd_enqueue_mosi_trn | ( | swd_ctx_t * | swdctx | ) |
Append command queue with Turnaround activating MOSI mode.
*swdctx | swd context pointer. |
Append element pointed by *cmd at the end of the quque pointed by *cmdq.
After this operation queue will be pointed by appended element (ie. last element added becomes actual quque pointer to show what was added recently).
*cmdq | pointer to any element on command queue | |
*cmd | pointer to the command to be appended |
Find queue root (first element).
*cmdq | pointer to any queue element |
Find queue tail (last element).
*cmdq | pointer to any queue element |
int swd_cmdq_flush | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation | |||
) |
Flush command queue contents into interface driver.
Operation is specified by SWD_OPERATION and can be used to select how to flush the queue, ie. head-only, tail-only, one, all, etc.
*swdctx | swd context pointer. | |
operation | tells how to flush the queue. |
int swd_cmdq_free | ( | swd_cmd_t * | cmdq | ) |
Free queue pointed by *cmdq element.
*cmdq | pointer to any element on command queue |
int swd_cmdq_free_head | ( | swd_cmd_t * | cmdq | ) |
Free queue head up to *cmdq element.
*cmdq | pointer to the element that becomes new queue root. |
int swd_cmdq_free_tail | ( | swd_cmd_t * | cmdq | ) |
Free queue tail starting after *cmdq element.
*cmdq | pointer to the last element on the new queue. |
int swd_cmdq_init | ( | swd_cmd_t * | cmdq | ) |
Initialize new queue element in memory that becomes a queue root.
*cmdq | pointer to the command queue element of type swd_cmd_t |
int swd_dap_detect | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation, | |||
int ** | idcode | |||
) |
Macro: Reset target DAP, select SW-DP, read out IDCODE.
This is the proper SW-DP initialization as stated by ARM Information Center.
*swdctx | swd context pointer. | |
operation | type (SWD_OPERATION_ENQUEUE or SWD_OPERATION_EXECUTE). |
int swd_dap_reset | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation | |||
) |
Debug Access Port Reset sends 50 CLK with TMS high that brings both SW-DP and JTAG-DP into reset state.
*swdctx | swd context pointer. | |
operation | type (SWD_OPERATION_ENQUEUE or SWD_OPERATION_EXECUTE). |
int swd_dap_select | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation | |||
) |
Activate SW-DP by sending out RESET and JTAG-TO-SWD sequence on SWDIOTMS line.
*swdctx | swd context. |
int swd_deinit | ( | swd_ctx_t * | swdctx | ) |
De-initialize selected swd context and its command queue.
*swdctx | swd context pointer. |
int swd_deinit_cmdq | ( | swd_ctx_t * | swdctx | ) |
De-initialize command queue and free its memory on selected swd context.
*swdctx | swd context pointer. |
int swd_deinit_ctx | ( | swd_ctx_t * | swdctx | ) |
De-initialize selected swd context and free its memory.
Note: This function will not free command queue for selected context!
*swdctx | swd context pointer. |
int swd_dp_read_idcode | ( | swd_ctx_t * | swdctx, | |
swd_operation_t | operation, | |||
int ** | idcode | |||
) |
Macro: Read out IDCODE register and return its value on function return.
*swdctx | swd context pointer. | |
operation | operation type. |
Transmit selected command from the command queue to the interface driver.
*swdctx | swd context pointer. | |
*cmd | pointer to the command to be sent. |
swd_ctx_t* swd_init | ( | void | ) |
LibSWD initialization routine.
It should be called prior any operation made with libswd. It initializes command queue and basic parameters for context that is returned as pointer.
int swd_log | ( | swd_ctx_t * | swdctx, | |
swd_loglevel_t | loglevel, | |||
char * | msg, | |||
... | ||||
) |
Put a message into swd context log at specified verbosity level.
If specified message's log level is lower than actual context configuration, message will be omitted. Verbosity level increases from 0 (silent) to 4 (debug).
*swdctx | swd context. | |
loglevel | at which to put selected message. | |
*msg | message body with variable arguments as in "printf". |
int swd_log_level_set | ( | swd_ctx_t * | swdctx, | |
swd_loglevel_t | loglevel | |||
) |
Change log level to increase or decrease verbosity level.
*swdctx | swd context. | |
loglevel | is the target verbosity level to be set. |