X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fcommands.h;h=d591814f54f8d9320c936c83208ca1e3e922c7a4;hp=5c2744359464545e6408018a202bd4a160d39f2a;hb=33a17fd35995a7f679f92600055a8f55ae380022;hpb=22b220ad7f42ea288b1762692d079ecbde10ba24 diff --git a/src/jtag/commands.h b/src/jtag/commands.h index 5c27443594..d591814f54 100644 --- a/src/jtag/commands.h +++ b/src/jtag/commands.h @@ -26,8 +26,6 @@ #ifndef JTAG_COMMANDS_H #define JTAG_COMMANDS_H -#include "jtag.h" - /** * The inferred type of a scan_command_s structure, indicating whether * the command has the host scan in from the device, the host scan out @@ -100,50 +98,75 @@ struct sleep_command { uint32_t us; }; +/** + * Encapsulates a series of bits to be clocked out, affecting state + * and mode of the interface. + * + * In JTAG mode these are clocked out on TMS, using TCK. They may be + * used for link resets, transitioning between JTAG and SWD modes, or + * to implement JTAG state machine transitions (implementing pathmove + * or statemove operations). + * + * In SWD mode these are clocked out on SWDIO, using SWCLK, and are + * used for link resets and transitioning between SWD and JTAG modes. + */ +struct tms_command { + /** How many bits should be clocked out. */ + unsigned num_bits; + /** The bits to clock out; the LSB is bit 0 of bits[0]. */ + const uint8_t *bits; +}; + /** * Defines a container type that hold a pointer to a JTAG command * structure of any defined type. */ -typedef union jtag_command_container_u -{ - struct scan_command* scan; - struct statemove_command* statemove; - struct pathmove_command* pathmove; - struct runtest_command* runtest; - struct stableclocks_command* stableclocks; - struct reset_command* reset; - struct end_state_command* end_state; - struct sleep_command* sleep; -} jtag_command_container_t; +union jtag_command_container { + struct scan_command *scan; + struct statemove_command *statemove; + struct pathmove_command *pathmove; + struct runtest_command *runtest; + struct stableclocks_command *stableclocks; + struct reset_command *reset; + struct end_state_command *end_state; + struct sleep_command *sleep; + struct tms_command *tms; +}; /** - * The type of the @c jtag_command_container_u contained by a + * The type of the @c jtag_command_container contained by a * @c jtag_command_s structure. */ enum jtag_command_type { JTAG_SCAN = 1, - JTAG_STATEMOVE = 2, + /* JTAG_TLR_RESET's non-minidriver implementation is a + * vestige from a statemove cmd. The statemove command + * is obsolete and replaced by pathmove. + * + * pathmove does not support reset as one of it's states, + * hence the need for an explicit statemove command. + */ + JTAG_TLR_RESET = 2, JTAG_RUNTEST = 3, JTAG_RESET = 4, JTAG_PATHMOVE = 6, JTAG_SLEEP = 7, - JTAG_STABLECLOCKS = 8 + JTAG_STABLECLOCKS = 8, + JTAG_TMS = 9, }; -typedef struct jtag_command_s -{ - jtag_command_container_t cmd; +struct jtag_command { + union jtag_command_container cmd; enum jtag_command_type type; - struct jtag_command_s* next; -} jtag_command_t; + struct jtag_command *next; +}; /// The current queue of jtag_command_s structures. -extern jtag_command_t* jtag_command_queue; +extern struct jtag_command* jtag_command_queue; void* cmd_queue_alloc(size_t size); -void cmd_queue_free(void); -void jtag_queue_command(jtag_command_t *cmd); +void jtag_queue_command(struct jtag_command *cmd); void jtag_command_queue_reset(void); enum scan_type jtag_scan_type(const struct scan_command* cmd);