X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fjtag.h;h=d7698ac7589734cd09c14d3ca4b51d2626aca1d5;hb=f9596e96c9835101343603b7ad9c02682b3e7485;hp=a63aa371012adb71925f5523f460906f7e0c3d64;hpb=d3d02f478946415660f9d641283a3fefb97d6899;p=openocd.git diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index a63aa37101..d7698ac758 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -175,21 +175,20 @@ struct jtag_tap_s jtag_tap_t* next_tap; }; -extern jtag_tap_t* jtag_AllTaps(void); +extern jtag_tap_t* jtag_all_taps(void); extern const char *jtag_tap_name(const jtag_tap_t *tap); -extern jtag_tap_t* jtag_TapByPosition(int n); -extern jtag_tap_t* jtag_TapByString(const char* dotted_name); -extern jtag_tap_t* jtag_TapByJimObj(Jim_Interp* interp, Jim_Obj* obj); -extern jtag_tap_t* jtag_TapByAbsPosition(int abs_position); -extern int jtag_NumEnabledTaps(void); -extern int jtag_NumTotalTaps(void); - -static __inline__ jtag_tap_t* jtag_NextEnabledTap(jtag_tap_t* p) +extern jtag_tap_t* jtag_tap_by_string(const char* dotted_name); +extern jtag_tap_t* jtag_tap_by_jim_obj(Jim_Interp* interp, Jim_Obj* obj); +extern jtag_tap_t* jtag_tap_by_position(unsigned abs_position); +extern unsigned jtag_tap_count_enabled(void); +extern unsigned jtag_tap_count(void); + +static __inline__ jtag_tap_t* jtag_tap_next_enabled(jtag_tap_t* p) { if (p == NULL) { /* start at the head of list */ - p = jtag_AllTaps(); + p = jtag_all_taps(); } else { @@ -232,15 +231,11 @@ enum jtag_event { JTAG_TRST_ASSERTED }; -extern char* jtag_event_strings[]; - enum jtag_tap_event { JTAG_TAP_EVENT_ENABLE, JTAG_TAP_EVENT_DISABLE }; -extern const Jim_Nvp nvp_jtag_tap_event[]; - struct jtag_tap_event_action_s { enum jtag_tap_event event; @@ -248,8 +243,10 @@ struct jtag_tap_event_action_s jtag_tap_event_action_t* next; }; -extern int jtag_trst; -extern int jtag_srst; +/// @returns The current state of TRST. +int jtag_get_trst(void); +/// @returns The current state of SRST. +int jtag_get_srst(void); typedef struct jtag_event_callback_s { @@ -258,10 +255,16 @@ typedef struct jtag_event_callback_s struct jtag_event_callback_s* next; } jtag_event_callback_t; -extern jtag_event_callback_t* jtag_event_callbacks; - -extern int jtag_speed; -extern int jtag_speed_post_reset; +/// @returns The current JTAG speed setting. +int jtag_get_speed(void); +/** + * Set the JTAG speed. This routine will call the underlying + * interface @c speed callback, if the interface has been initialized. + * @param speed The new speed setting. + * @returns ERROR_OK during configuration or on success, or an error + * code returned from the interface @c speed callback. + */ +int jtag_set_speed(int speed); enum reset_types { RESET_NONE = 0x0, @@ -274,7 +277,8 @@ enum reset_types { RESET_SRST_PUSH_PULL = 0x20, }; -extern enum reset_types jtag_reset_config; +enum reset_types jtag_get_reset_config(void); +void jtag_set_reset_config(enum reset_types type); /** * Initialize interface upon startup. Return a successful no-op upon @@ -309,12 +313,29 @@ extern int jtag_register_commands(struct command_context_s* cmd_ctx); * end state and a subsequent jtag_add_pathmove() must be issued. */ +/** + * Generate an IR SCAN with a list of scan fields with one entry for + * each enabled TAP. + * + * If the input field list contains an instruction value for a TAP then + * that is used otherwise the TAP is set to bypass. + * + * TAPs for which no fields are passed are marked as bypassed for + * subsequent DR SCANs. + * + */ extern void jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate); /** * The same as jtag_add_ir_scan except no verification is performed out * the output values. */ extern void jtag_add_ir_scan_noverify(int num_fields, const scan_field_t *fields, tap_state_t state); +/** + * Duplicate the scan fields passed into the function into an IR SCAN + * command. This function assumes that the caller handles extra fields + * for bypassed TAPs. + */ +extern void jtag_add_plain_ir_scan(int num_fields, const scan_field_t* fields, tap_state_t endstate); /** @@ -328,10 +349,20 @@ extern void jtag_add_ir_scan_noverify(int num_fields, const scan_field_t *fields */ extern void jtag_alloc_in_value32(scan_field_t *field); +/** + * Generate a DR SCAN using the fields passed to the function. + * For connected TAPs, the function checks in_fields and uses fields + * specified there. For bypassed TAPs, the function generates a dummy + * 1-bit field. The bypass status of TAPs is set by jtag_add_ir_scan(). + */ extern void jtag_add_dr_scan(int num_fields, const scan_field_t* fields, tap_state_t endstate); /// A version of jtag_add_dr_scan() that uses the check_value/mask fields extern void jtag_add_dr_scan_check(int num_fields, scan_field_t* fields, tap_state_t endstate); -extern void jtag_add_plain_ir_scan(int num_fields, const scan_field_t* fields, tap_state_t endstate); +/** + * Duplicate the scan fields passed into the function into a DR SCAN + * command. Unlike jtag_add_dr_scan(), this function assumes that the + * caller handles extra fields for bypassed TAPs. + */ extern void jtag_add_plain_dr_scan(int num_fields, const scan_field_t* fields, tap_state_t endstate); @@ -447,6 +478,12 @@ extern void jtag_add_tlr(void); * can only implement a few transitions and therefore * a partial implementation of pathmove would have little practical * application. + * + * If an error occurs, jtag_error will contain one of these error codes: + * - ERROR_JTAG_NOT_STABLE_STATE -- The final state was not stable. + * - ERROR_JTAG_STATE_INVALID -- The path passed through TAP_RESET. + * - ERROR_JTAG_TRANSITION_INVALID -- The path includes invalid + * state transitions. */ extern void jtag_add_pathmove(int num_states, const tap_state_t* path); @@ -541,27 +578,19 @@ extern int jtag_execute_queue(void); extern void jtag_execute_queue_noclear(void); /** - * The jtag_error variable is set when an error occurs while executing - * the queue. - * - * This flag can also be set from application code, if an error happens - * during processing that should be reported during jtag_execute_queue(). - * - * It is cleared by jtag_execute_queue(). + * Set the current JTAG core execution error, unless one was set + * by a previous call previously. Driver or application code must + * use jtag_error_clear to reset jtag_error once this routine has been + * called with a non-zero error code. */ -extern int jtag_error; - -static __inline__ void jtag_set_error(int error) -{ - if ((error==ERROR_OK)||(jtag_error!=ERROR_OK)) - { - /* keep first error */ - return; - } - jtag_error=error; -} - - +void jtag_set_error(int error); +/// @returns The current value of jtag_error +int jtag_get_error(void); +/** + * Resets jtag_error to ERROR_OK, returning its previous value. + * @returns The previous value of @c jtag_error. + */ +int jtag_error_clear(void); /* can be implemented by hw+sw */ extern int jtag_power_dropout(int* dropout); @@ -597,6 +626,8 @@ void jtag_tap_handle_event(jtag_tap_t* tap, enum jtag_tap_event e); #define ERROR_JTAG_QUEUE_FAILED (-104) #define ERROR_JTAG_NOT_STABLE_STATE (-105) #define ERROR_JTAG_DEVICE_ERROR (-107) +#define ERROR_JTAG_STATE_INVALID (-108) +#define ERROR_JTAG_TRANSITION_INVALID (-109) /** * jtag_add_dr_out() is a version of jtag_add_dr_scan() which @@ -632,12 +663,49 @@ extern void jtag_add_dr_out(jtag_tap_t* tap, /** * jtag_add_statemove() moves from the current state to @a goal_state. * - * This function was originally designed to handle the XSTATE command - * from the XSVF specification. - * * @param goal_state The final TAP state. * @return ERROR_OK on success, or an error code on failure. + * + * Moves from the current state to the goal \a state. + * + * This needs to be handled according to the xsvf spec, see the XSTATE + * command description. From the XSVF spec, pertaining to XSTATE: + * + * For special states known as stable states (Test-Logic-Reset, + * Run-Test/Idle, Pause-DR, Pause- IR), an XSVF interpreter follows + * predefined TAP state paths when the starting state is a stable state + * and when the XSTATE specifies a new stable state. See the STATE + * command in the [Ref 5] for the TAP state paths between stable + * states. + * + * For non-stable states, XSTATE should specify a state that is only one + * TAP state transition distance from the current TAP state to avoid + * undefined TAP state paths. A sequence of multiple XSTATE commands can + * be issued to transition the TAP through a specific state path. + * + * @note Unless @c tms_bits holds a path that agrees with [Ref 5] in the + * above spec, then this code is not fully conformant to the xsvf spec. + * This puts a burden on tap_get_tms_path() function from the xsvf spec. + * If in doubt, you should confirm that that burden is being met. + * + * Otherwise, @a goal_state must be immediately reachable in one clock + * cycle, and does not need to be a stable state. */ extern int jtag_add_statemove(tap_state_t goal_state); +/// @returns the number of times the scan queue has been flushed +int jtag_get_flush_queue_count(void); + +void jtag_set_nsrst_delay(unsigned delay); +unsigned jtag_get_nsrst_delay(void); + +void jtag_set_ntrst_delay(unsigned delay); +unsigned jtag_get_ntrst_delay(void); + +void jtag_set_speed_khz(unsigned speed); +unsigned jtag_get_speed_khz(void); + +void jtag_set_verify(bool enable); +bool jtag_will_verify(void); + #endif /* JTAG_H */