X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fjtag.h;h=786b2b839fc0873fbddef4d6c536c08b1715f436;hb=4119cd6db2de637b07a208fdbac217b1554f85fc;hp=7cdaa51ff9971c3bebd0b2aff9e8293325429b49;hpb=f0fd28a66ca5866de557941113b35de5b55b554d;p=openocd.git diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 7cdaa51ff9..786b2b839f 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 * @@ -144,7 +144,7 @@ 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 decloration reasons" */ +/* due to "forward declaration reasons" */ struct jtag_tap_s { const char* chip; @@ -161,6 +161,7 @@ struct jtag_tap_s uint32_t ir_capture_mask; uint8_t* expected_mask; /**< Capture-IR expected mask */ uint32_t idcode; + bool hasidcode; /* not all devices have idcode, we'll discover this during chain examination */ /**< device identification code */ /// Array of expected identification codes */ @@ -191,20 +192,30 @@ extern unsigned jtag_tap_count(void); /* - * 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 - * currently a queue being built). + * - TRST_ASSERTED triggers two sets of callbacks, after operations to + * reset the scan chain -- via TMS+TCK signaling, or deasserting the + * nTRST signal -- are queued: * - * - TMS reset - * - SRST pulls TRST - * - TRST asserted + * + Callbacks in C code fire first, patching internal state + * + Then post-reset event scripts fire ... activating JTAG circuits + * via TCK cycles, exiting SWD mode via TMS sequences, etc * - * TAP activation/deactivation is currently implemented outside the core - * using scripted code that understands the specific router type. + * During those callbacks, scan chain contents have not been validated. + * JTAG operations that address a specific TAP (primarily DR/IR scans) + * must *not* be queued. + * + * - TAP_EVENT_SETUP is reported after TRST_ASSERTED, and after the scan + * chain has been validated. JTAG operations including scans that + * target specific TAPs may be performed. + * + * - TAP_EVENT_ENABLE and TAP_EVENT_DISABLE implement TAP activation and + * deactivation outside the core using scripted code that understands + * the specific JTAG router type. They might be triggered indirectly + * from EVENT_SETUP operations. */ enum jtag_event { JTAG_TRST_ASSERTED, + JTAG_TAP_EVENT_SETUP, JTAG_TAP_EVENT_ENABLE, JTAG_TAP_EVENT_DISABLE, }; @@ -252,13 +263,16 @@ int jtag_get_speed_readable(int *speed); * @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); +int jtag_config_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); +/** + * 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); @@ -272,6 +286,7 @@ enum reset_types { RESET_TRST_PULLS_SRST = 0x8, RESET_TRST_OPEN_DRAIN = 0x10, RESET_SRST_PUSH_PULL = 0x20, + RESET_SRST_GATES_JTAG = 0x40, }; enum reset_types jtag_get_reset_config(void); @@ -283,6 +298,12 @@ unsigned jtag_get_nsrst_delay(void); void jtag_set_ntrst_delay(unsigned delay); unsigned jtag_get_ntrst_delay(void); +void jtag_set_nsrst_assert_width(unsigned delay); +unsigned jtag_get_nsrst_assert_width(void); + +void jtag_set_ntrst_assert_width(unsigned delay); +unsigned jtag_get_ntrst_assert_width(void); + /// @returns The current state of TRST. int jtag_get_trst(void); /// @returns The current state of SRST. @@ -314,8 +335,9 @@ extern int jtag_interface_quit(void); extern int jtag_init(struct command_context_s* cmd_ctx); /// reset, then initialize JTAG chain -extern int jtag_init_reset(struct command_context_s* cmd_ctx); -extern int jtag_register_commands(struct command_context_s* cmd_ctx); +extern int jtag_init_reset(struct command_context_s* cmd_ctx); +extern int jtag_register_commands(struct command_context_s* cmd_ctx); +extern int jtag_init_inner(struct command_context_s *cmd_ctx); /** * @file @@ -437,7 +459,7 @@ typedef int (*jtag_callback_t)(jtag_callback_data_t data0, jtag_callback_data_t * 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. @@ -631,6 +653,9 @@ extern void jtag_execute_queue_noclear(void); /// @returns the number of times the scan queue has been flushed int jtag_get_flush_queue_count(void); +/// Report Tcl event to all TAPs +void jtag_notify_event(enum jtag_event); + /* can be implemented by hw + sw */ extern int jtag_power_dropout(int* dropout);