X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fjtag.h;h=3c6c5ce2827ec48667d457d54d92da9f9470823d;hp=317566ce064ac60dbdb48e57da0e67b2fa0b08de;hb=8b994145b849c40b0a195c3fb332b9770b2f9097;hpb=5208481fb3f7f81958cd5a884b09a0a9e421e75d diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 317566ce06..3c6c5ce282 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -2,7 +2,7 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * -* Copyright (C) 2007,2008 Øyvind Harboe * +* Copyright (C) 2007,2008 Øyvind Harboe * * oyvind.harboe@zylin.com * * * * This program is free software; you can redistribute it and/or modify * @@ -62,7 +62,7 @@ */ typedef enum tap_state { -#if BUILD_ECOSBOARD +#if BUILD_ZY1000 /* These are the old numbers. Leave as-is for now... */ TAP_RESET = 0, TAP_IDLE = 8, TAP_DRSELECT = 1, TAP_DRCAPTURE = 2, TAP_DRSHIFT = 3, TAP_DREXIT1 = 4, @@ -123,21 +123,21 @@ typedef struct scan_field_s /// The number of bits this field specifies (up to 32) int num_bits; /// A pointer to value to be scanned into the device - u8* out_value; + uint8_t* out_value; /// A pointer to a 32-bit memory location for data scanned out - u8* in_value; + uint8_t* in_value; /// The value used to check the data scanned out. - u8* check_value; + uint8_t* check_value; /// The mask to go with check_value - u8* check_mask; + uint8_t* check_mask; /// in_value has been allocated for the queue int allocated; /// Indicates we modified the in_value. int modified; /// temporary storage for performing value checks synchronously - u8 intmp[4]; + uint8_t intmp[4]; } scan_field_t; typedef struct jtag_tap_event_action_s jtag_tap_event_action_t; @@ -151,23 +151,25 @@ struct jtag_tap_s const char* tapname; const char* dotted_name; int abs_chain_position; - /// Is this TAP enabled? - int enabled; + /// Is this TAP disabled after JTAG reset? + bool disabled_after_reset; + /// Is this TAP currently enabled? + bool enabled; int ir_length; /**< size of instruction register */ - u32 ir_capture_value; - u8* expected; /**< Capture-IR expected value */ - u32 ir_capture_mask; - u8* expected_mask; /**< Capture-IR expected mask */ - u32 idcode; + uint32_t ir_capture_value; + uint8_t* expected; /**< Capture-IR expected value */ + uint32_t ir_capture_mask; + uint8_t* expected_mask; /**< Capture-IR expected mask */ + uint32_t idcode; /**< device identification code */ /// Array of expected identification codes */ - u32* expected_ids; + uint32_t* expected_ids; /// Number of expected identification codes - u8 expected_ids_cnt; + uint8_t expected_ids_cnt; /// current instruction - u8* cur_instr; + uint8_t* cur_instr; /// Bypass register selected int bypass; @@ -175,53 +177,45 @@ struct jtag_tap_s jtag_tap_t* next_tap; }; + +void jtag_tap_init(jtag_tap_t *tap); +void jtag_tap_free(jtag_tap_t *tap); + extern jtag_tap_t* jtag_all_taps(void); extern const char *jtag_tap_name(const jtag_tap_t *tap); 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 jtag_tap_t* jtag_tap_next_enabled(jtag_tap_t* p); extern unsigned jtag_tap_count_enabled(void); extern unsigned jtag_tap_count(void); -enum reset_line_mode { - LINE_OPEN_DRAIN = 0x0, - LINE_PUSH_PULL = 0x1, -}; - -/* +/* * There are three cases when JTAG_TRST_ASSERTED callback is invoked. The - * event is invoked *after* TRST is asserted(or queued rather). It is illegal - * to communicate with the JTAG interface during the callback(as there is + * event is invoked *after* TRST is asserted(or queued rather). It is illegal + * to communicate with the JTAG interface during the callback(as there is * currently a queue being built). - * + * * - TMS reset * - SRST pulls TRST * - TRST asserted - * - **/ + * + * TAP activation/deactivation is currently implemented outside the core + * using scripted code that understands the specific router type. + */ enum jtag_event { - JTAG_TRST_ASSERTED -}; - -enum jtag_tap_event { + JTAG_TRST_ASSERTED, JTAG_TAP_EVENT_ENABLE, - JTAG_TAP_EVENT_DISABLE + JTAG_TAP_EVENT_DISABLE, }; struct jtag_tap_event_action_s { - enum jtag_tap_event event; + enum jtag_event event; Jim_Obj* body; jtag_tap_event_action_t* next; }; -/// @returns The current state of TRST. -int jtag_get_trst(void); -/// @returns The current state of SRST. -int jtag_get_srst(void); - /** * Defines the function signature requide for JTAG event callback * functions, which are added with jtag_register_event_callback() @@ -236,7 +230,7 @@ int jtag_get_srst(void); typedef int (*jtag_event_handler_t)(enum jtag_event event, void* priv); extern int jtag_register_event_callback(jtag_event_handler_t f, void *x); -extern int jtag_unregister_event_callback(jtag_event_handler_t f); +extern int jtag_unregister_event_callback(jtag_event_handler_t f, void *x); extern int jtag_call_event_callbacks(enum jtag_event event); @@ -245,7 +239,7 @@ extern int jtag_call_event_callbacks(enum jtag_event event); int jtag_get_speed(void); /** * Given a @a speed setting, use the interface @c speed_div callback to - * adjust the setting. + * 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. @@ -260,6 +254,15 @@ int jtag_get_speed_readable(int *speed); */ int jtag_set_speed(int speed); + +/// Attempt to configure the interface for the specified KHz. +int jtag_config_khz(unsigned khz); +/// Set the clock speed of the JTAG interface in KHz. +void jtag_set_speed_khz(unsigned speed); +/// Retreives the clock speed of the JTAG interface in KHz. +unsigned jtag_get_speed_khz(void); + + enum reset_types { RESET_NONE = 0x0, RESET_HAS_TRST = 0x1, @@ -274,6 +277,27 @@ enum reset_types { enum reset_types jtag_get_reset_config(void); void jtag_set_reset_config(enum reset_types type); +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); + +/// @returns The current state of TRST. +int jtag_get_trst(void); +/// @returns The current state of SRST. +int jtag_get_srst(void); + +/// Enable or disable data scan verification checking. +void jtag_set_verify(bool enable); +/// @returns True if data scan verification will be performed. +bool jtag_will_verify(void); + +/// Enable or disable verification of IR scan checking. +void jtag_set_verify_capture_ir(bool enable); +/// @returns True if IR scan verification will be performed. +bool jtag_will_verify_capture_ir(void); + /** * Initialize interface upon startup. Return a successful no-op upon * subsequent invocations. @@ -359,6 +383,11 @@ extern void jtag_add_dr_scan_check(int num_fields, scan_field_t* fields, tap_sta */ extern void jtag_add_plain_dr_scan(int num_fields, const scan_field_t* fields, tap_state_t endstate); +/** + * Defines the type of data passed to the jtag_callback_t interface. + * The underlying type must allow storing an @c int or pointer type. + */ +typedef intptr_t jtag_callback_data_t; /** * Defines a simple JTAG callback that can allow conversions on data @@ -368,17 +397,12 @@ extern void jtag_add_plain_dr_scan(int num_fields, const scan_field_t* fields, t * For conversion types or checks that can fail, use the more complete * variant: jtag_callback_t. */ -typedef void (*jtag_callback1_t)(u8 *in); +typedef void (*jtag_callback1_t)(jtag_callback_data_t data0); /// A simpler version of jtag_add_callback4(). -extern void jtag_add_callback(jtag_callback1_t, u8 *in); +extern void jtag_add_callback(jtag_callback1_t, jtag_callback_data_t data0); -/** - * Defines the type of data passed to the jtag_callback_t interface. - * The underlying type must allow storing an @c int or pointer type. - */ -typedef intptr_t jtag_callback_data_t; /** * Defines the interface of the JTAG callback mechanism. @@ -389,7 +413,7 @@ typedef intptr_t jtag_callback_data_t; * @param data3 An integer big enough to use as an @c int or a pointer. * @returns an error code */ -typedef int (*jtag_callback_t)(u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2, jtag_callback_data_t data3); +typedef int (*jtag_callback_t)(jtag_callback_data_t data0, jtag_callback_data_t data1, jtag_callback_data_t data2, jtag_callback_data_t data3); /** @@ -413,14 +437,14 @@ typedef int (*jtag_callback_t)(u8 *in, jtag_callback_data_t data1, jtag_callback * arguments. * * @param f The callback function to add. - * @param in Typically used to point to the data to operate on. + * @param data0 Typically used to point to the data to operate on. * Frequently this will be the data clocked in during a shift operation. * @param data1 An integer big enough to use as an @c int or a pointer. * @param data2 An integer big enough to use as an @c int or a pointer. * @param data3 An integer big enough to use as an @c int or a pointer. * */ -extern void jtag_add_callback4(jtag_callback_t f, u8 *in, +extern void jtag_add_callback4(jtag_callback_t f, jtag_callback_data_t data0, jtag_callback_data_t data1, jtag_callback_data_t data2, jtag_callback_data_t data3); @@ -487,7 +511,7 @@ extern void jtag_add_pathmove(int num_states, const tap_state_t* path); * @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. + * 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: @@ -568,7 +592,7 @@ extern tap_state_t jtag_set_end_state(tap_state_t state); * **/ extern tap_state_t jtag_get_end_state(void); -extern void jtag_add_sleep(u32 us); +extern void jtag_add_sleep(uint32_t us); /** @@ -589,7 +613,7 @@ void jtag_add_clocks(int num_cycles); * matter if the operation was executed *before* jtag_execute_queue(), * jtag_execute_queue() will still return an error code. * - * All jtag_add_xxx() calls that have in_handler!=NULL will have been + * All jtag_add_xxx() calls that have in_handler != NULL will have been * executed when this fn returns, but if what has been queued only * clocks data out, without reading anything back, then JTAG could * be running *after* jtag_execute_queue() returns. The API does @@ -601,10 +625,14 @@ void jtag_add_clocks(int num_cycles); */ extern int jtag_execute_queue(void); -/* same as jtag_execute_queue() but does not clear the error flag */ +/// same as jtag_execute_queue() but does not clear the error flag extern void jtag_execute_queue_noclear(void); -/* can be implemented by hw+sw */ +/// @returns the number of times the scan queue has been flushed +int jtag_get_flush_queue_count(void); + + +/* can be implemented by hw + sw */ extern int jtag_power_dropout(int* dropout); extern int jtag_srst_asserted(int* srst_asserted); @@ -617,9 +645,9 @@ extern 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. */ -extern void jtag_check_value_mask(scan_field_t *field, u8 *value, u8 *mask); +extern void jtag_check_value_mask(scan_field_t *field, uint8_t *value, uint8_t *mask); -extern void jtag_sleep(u32 us); +extern void jtag_sleep(uint32_t us); /* * The JTAG subsystem defines a number of error codes, @@ -662,29 +690,10 @@ extern void jtag_sleep(u32 us); * clocking data back in. Patches gladly accepted! */ extern void jtag_add_dr_out(jtag_tap_t* tap, - int num_fields, const int* num_bits, const u32* value, + int num_fields, const int* num_bits, const uint32_t* value, tap_state_t end_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); - -int jtag_config_khz(unsigned khz); -void jtag_set_speed_khz(unsigned speed); -unsigned jtag_get_speed_khz(void); - -void jtag_set_verify(bool enable); -bool jtag_will_verify(void); - -void jtag_set_verify_capture_ir(bool enable); -bool jtag_will_verify_capture_ir(void); - /** * Set the current JTAG core execution error, unless one was set * by a previous call previously. Driver or application code must