X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fjtag.h;h=eaa0c7c7a74ab69b6503630c98ad13350ec5894f;hb=f7bd1e8f3a302378687ded559e865c258d441c89;hp=c5bee07576e6262058875b62373e9fb390877dc0;hpb=5e9d18f027954c5f5e883934d6c54cb20817ea9f;p=openocd.git diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index c5bee07576..eaa0c7c7a7 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -23,9 +23,8 @@ #ifndef JTAG_H #define JTAG_H -#include "binarybuffer.h" -#include "log.h" - +#include +#include #ifdef _DEBUG_JTAG_IO_ #define DEBUG_JTAG_IO(expr ...) \ @@ -39,17 +38,6 @@ #define DEBUG_JTAG_IOZ 64 #endif -/*-------------------------------------------------------*/ - -/** - * When given an array, compute its DIMension; in other words, the - * number of elements in the array - */ -#define DIM(x) (sizeof(x)/sizeof((x)[0])) - -/** Calculate the number of bytes required to hold @a n TAP scan bits */ -#define TAP_SCAN_BYTES(n) CEIL(n, 8) - /*------------------------------------------------------*/ /** @@ -120,10 +108,9 @@ extern tap_state_t cmd_queue_cur_state; * * The allocated, modified, and intmp fields are internal work space. */ -typedef struct scan_field_s -{ +struct scan_field { /// A pointer to the tap structure to which this field refers. - jtag_tap_t* tap; + struct jtag_tap* tap; /// The number of bits this field specifies (up to 32) int num_bits; @@ -143,15 +130,9 @@ typedef struct scan_field_s int modified; /// temporary storage for performing value checks synchronously uint8_t intmp[4]; -} scan_field_t; - -typedef struct jtag_tap_event_action_s jtag_tap_event_action_t; +}; -/* this is really: typedef jtag_tap_t */ -/* But - the typedef is done in "types.h" */ -/* due to "forward declaration reasons" */ -struct jtag_tap_s -{ +struct jtag_tap { const char* chip; const char* tapname; const char* dotted_name; @@ -180,19 +161,19 @@ struct jtag_tap_s /// Bypass register selected int bypass; - jtag_tap_event_action_t *event_action; + struct jtag_tap_event_action *event_action; - jtag_tap_t* next_tap; + struct jtag_tap* next_tap; }; -void jtag_tap_init(jtag_tap_t *tap); -void jtag_tap_free(jtag_tap_t *tap); +void jtag_tap_init(struct jtag_tap *tap); +void jtag_tap_free(struct jtag_tap *tap); -jtag_tap_t* jtag_all_taps(void); -const char *jtag_tap_name(const jtag_tap_t *tap); -jtag_tap_t* jtag_tap_by_string(const char* dotted_name); -jtag_tap_t* jtag_tap_by_jim_obj(Jim_Interp* interp, Jim_Obj* obj); -jtag_tap_t* jtag_tap_next_enabled(jtag_tap_t* p); +struct jtag_tap* jtag_all_taps(void); +const char *jtag_tap_name(const struct jtag_tap *tap); +struct jtag_tap* jtag_tap_by_string(const char* dotted_name); +struct jtag_tap* jtag_tap_by_jim_obj(Jim_Interp* interp, Jim_Obj* obj); +struct jtag_tap* jtag_tap_next_enabled(struct jtag_tap* p); unsigned jtag_tap_count_enabled(void); unsigned jtag_tap_count(void); @@ -226,11 +207,16 @@ enum jtag_event { JTAG_TAP_EVENT_DISABLE, }; -struct jtag_tap_event_action_s +struct jtag_tap_event_action { - enum jtag_event event; - Jim_Obj* body; - jtag_tap_event_action_t* next; + /// The event for which this action will be triggered. + enum jtag_event event; + /// The interpreter to use for evaluating the @c body. + Jim_Interp *interp; + /// Contains a script to 'eval' when the @c event is triggered. + Jim_Obj *body; + // next action in linked list + struct jtag_tap_event_action *next; }; /** @@ -254,31 +240,25 @@ int jtag_call_event_callbacks(enum jtag_event event); /// @returns The current JTAG speed setting. int jtag_get_speed(void); + /** * Given a @a speed setting, use the interface @c speed_div callback to * adjust the setting. * @param speed The speed setting to convert back to readable KHz. * @returns ERROR_OK if the interface has not been initialized or on success; - * otherwise, the error code produced by the @c speed_div callback. + * otherwise, the error code produced by the @c speed_div callback. */ int jtag_get_speed_readable(int *speed); -/** - * 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_config_speed(int speed); - /// Attempt to configure the interface for the specified KHz. int jtag_config_khz(unsigned khz); + /** * Attempt to enable RTCK/RCLK. If that fails, fallback to the * specified frequency. */ int jtag_config_rclk(unsigned fallback_speed_khz); + /// Retreives the clock speed of the JTAG interface in KHz. unsigned jtag_get_speed_khz(void); @@ -329,7 +309,7 @@ bool jtag_will_verify_capture_ir(void); * Initialize interface upon startup. Return a successful no-op upon * subsequent invocations. */ -int jtag_interface_init(struct command_context_s* cmd_ctx); +int jtag_interface_init(struct command_context* cmd_ctx); /// Shutdown the JTAG interface upon program exit. int jtag_interface_quit(void); @@ -338,12 +318,12 @@ int jtag_interface_quit(void); * Initialize JTAG chain using only a RESET reset. If init fails, * try reset + init. */ -int jtag_init(struct command_context_s* cmd_ctx); +int jtag_init(struct command_context* cmd_ctx); /// reset, then initialize JTAG chain -int jtag_init_reset(struct command_context_s* cmd_ctx); -int jtag_register_commands(struct command_context_s* cmd_ctx); -int jtag_init_inner(struct command_context_s *cmd_ctx); +int jtag_init_reset(struct command_context* cmd_ctx); +int jtag_register_commands(struct command_context* cmd_ctx); +int jtag_init_inner(struct command_context *cmd_ctx); /** * @file @@ -371,20 +351,20 @@ int jtag_init_inner(struct command_context_s *cmd_ctx); * */ void jtag_add_ir_scan(int num_fields, - scan_field_t* fields, tap_state_t endstate); + struct scan_field* fields, tap_state_t endstate); /** * The same as jtag_add_ir_scan except no verification is performed out * the output values. */ void jtag_add_ir_scan_noverify(int num_fields, - const scan_field_t *fields, tap_state_t state); + const struct scan_field *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. */ void jtag_add_plain_ir_scan(int num_fields, - const scan_field_t* fields, tap_state_t endstate); + const struct scan_field* fields, tap_state_t endstate); /** @@ -396,7 +376,7 @@ void jtag_add_plain_ir_scan(int num_fields, * allocation method is used, for the synchronous case the temporary 32 * bits come from the input field itself. */ -void jtag_alloc_in_value32(scan_field_t *field); +void jtag_alloc_in_value32(struct scan_field *field); /** * Generate a DR SCAN using the fields passed to the function. @@ -405,17 +385,17 @@ void jtag_alloc_in_value32(scan_field_t *field); * 1-bit field. The bypass status of TAPs is set by jtag_add_ir_scan(). */ void jtag_add_dr_scan(int num_fields, - const scan_field_t* fields, tap_state_t endstate); + const struct scan_field* fields, tap_state_t endstate); /// A version of jtag_add_dr_scan() that uses the check_value/mask fields void jtag_add_dr_scan_check(int num_fields, - scan_field_t* fields, tap_state_t endstate); + struct scan_field* 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. */ void jtag_add_plain_dr_scan(int num_fields, - const scan_field_t* fields, tap_state_t endstate); + const struct scan_field* fields, tap_state_t endstate); /** * Defines the type of data passed to the jtag_callback_t interface. @@ -663,7 +643,7 @@ int jtag_srst_asserted(int* srst_asserted); * @param mask Pointer to scan mask; may be NULL. * @returns Nothing, but calls jtag_set_error() on any error. */ -void jtag_check_value_mask(scan_field_t *field, uint8_t *value, uint8_t *mask); +void jtag_check_value_mask(struct scan_field *field, uint8_t *value, uint8_t *mask); void jtag_sleep(uint32_t us); @@ -708,7 +688,7 @@ void jtag_sleep(uint32_t us); * There is no jtag_add_dr_outin() version of this fn that also allows * clocking data back in. Patches gladly accepted! */ -void jtag_add_dr_out(jtag_tap_t* tap, +void jtag_add_dr_out(struct jtag_tap* tap, int num_fields, const int* num_bits, const uint32_t* value, tap_state_t end_state);