From 68937cadfb42026b4c8b2c9e43acaf3fb409c4db Mon Sep 17 00:00:00 2001 From: Nicolas Pitre Date: Tue, 27 Oct 2009 01:14:34 -0400 Subject: [PATCH 01/16] ARM: fix Thumb mode handling when single-stepping register based branch insns Currently, OpenOCD is always caching the PC value without the T bit. This means that assignment to the PC register must clear that bit and set the processor state to Thumb when it is set. And when the PC register value is transferred to another register or stored into memory then the T bit must be restored. Discussion: It is arguable if OpenOCd should have preserved the original PC value which would have greatly simplified this code. The processor state could then be obtained simply by getting at bit 0 of the PC. This however would require special handling elsewhere instead since the T bit is not always relevant (like when PC is used with ALU insns or as an index with some addressing modes). It is unclear which way would be simpler in the end. Signed-off-by: Nicolas Pitre Signed-off-by: David Brownell --- src/target/arm_simulator.c | 55 +++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/target/arm_simulator.c b/src/target/arm_simulator.c index 5af2c129b..c50a52cd9 100644 --- a/src/target/arm_simulator.c +++ b/src/target/arm_simulator.c @@ -380,7 +380,8 @@ int arm_simulate_step_core(target_t *target, uint32_t *dry_run_pc, struct arm_si else if (instruction.type == ARM_BL) { uint32_t old_pc = sim->get_reg(sim, 15); - sim->set_reg_mode(sim, 14, old_pc + 4); + int T = (sim->get_state(sim) == ARMV4_5_STATE_THUMB); + sim->set_reg_mode(sim, 14, old_pc + 4 + T); sim->set_reg(sim, 15, target); } else if (instruction.type == ARM_BX) @@ -398,7 +399,8 @@ int arm_simulate_step_core(target_t *target, uint32_t *dry_run_pc, struct arm_si else if (instruction.type == ARM_BLX) { uint32_t old_pc = sim->get_reg(sim, 15); - sim->set_reg_mode(sim, 14, old_pc + 4); + int T = (sim->get_state(sim) == ARMV4_5_STATE_THUMB); + sim->set_reg_mode(sim, 14, old_pc + 4 + T); if (target & 0x1) { @@ -465,24 +467,24 @@ int arm_simulate_step_core(target_t *target, uint32_t *dry_run_pc, struct arm_si if (dry_run_pc) { if (instruction.info.data_proc.Rd == 15) - { - *dry_run_pc = Rd; - return ERROR_OK; - } + *dry_run_pc = Rd & ~1; else - { *dry_run_pc = current_pc + instruction_size; - } return ERROR_OK; } else { + if (instruction.info.data_proc.Rd == 15) { + sim->set_reg_mode(sim, 15, Rd & ~1); + if (Rd & 1) + sim->set_state(sim, ARMV4_5_STATE_THUMB); + else + sim->set_state(sim, ARMV4_5_STATE_ARM); + return ERROR_OK; + } sim->set_reg_mode(sim, instruction.info.data_proc.Rd, Rd); LOG_WARNING("no updating of flags yet"); - - if (instruction.info.data_proc.Rd == 15) - return ERROR_OK; } } /* compare instructions (CMP, CMN, TST, TEQ) */ @@ -566,15 +568,9 @@ int arm_simulate_step_core(target_t *target, uint32_t *dry_run_pc, struct arm_si if (dry_run_pc) { if (instruction.info.load_store.Rd == 15) - { - *dry_run_pc = load_value; - return ERROR_OK; - } + *dry_run_pc = load_value & ~1; else - { *dry_run_pc = current_pc + instruction_size; - } - return ERROR_OK; } else @@ -584,10 +580,16 @@ int arm_simulate_step_core(target_t *target, uint32_t *dry_run_pc, struct arm_si { sim->set_reg_mode(sim, instruction.info.load_store.Rn, modified_address); } - sim->set_reg_mode(sim, instruction.info.load_store.Rd, load_value); - if (instruction.info.load_store.Rd == 15) + if (instruction.info.load_store.Rd == 15) { + sim->set_reg_mode(sim, 15, load_value & ~1); + if (load_value & 1) + sim->set_state(sim, ARMV4_5_STATE_THUMB); + else + sim->set_state(sim, ARMV4_5_STATE_ARM); return ERROR_OK; + } + sim->set_reg_mode(sim, instruction.info.load_store.Rd, load_value); } } /* load multiple instruction */ @@ -636,7 +638,7 @@ int arm_simulate_step_core(target_t *target, uint32_t *dry_run_pc, struct arm_si { if (instruction.info.load_store_multiple.register_list & 0x8000) { - *dry_run_pc = load_values[15]; + *dry_run_pc = load_values[15] & ~1; return ERROR_OK; } } @@ -657,7 +659,16 @@ int arm_simulate_step_core(target_t *target, uint32_t *dry_run_pc, struct arm_si { if (instruction.info.load_store_multiple.register_list & (1 << i)) { - sim->set_reg_mode(sim, i, load_values[i]); + if (i == 15) { + uint32_t val = load_values[i]; + sim->set_reg_mode(sim, i, val & ~1); + if (val & 1) + sim->set_state(sim, ARMV4_5_STATE_THUMB); + else + sim->set_state(sim, ARMV4_5_STATE_ARM); + } else { + sim->set_reg_mode(sim, i, load_values[i]); + } } } -- 2.11.4.GIT From ad5192a2b948669aeeb9ccf5da81fa59ec21c346 Mon Sep 17 00:00:00 2001 From: Oleg Seiljus Date: Tue, 27 Oct 2009 11:56:04 -0700 Subject: [PATCH 02/16] Signalyzer: new config files Add configs for H2, H4, LITE. Signed-off-by: David Brownell --- tcl/interface/signalyzer-h2.cfg | 11 +++++++++++ tcl/interface/signalyzer-h4.cfg | 11 +++++++++++ tcl/interface/signalyzer-lite.cfg | 11 +++++++++++ 3 files changed, 33 insertions(+) create mode 100644 tcl/interface/signalyzer-h2.cfg create mode 100644 tcl/interface/signalyzer-h4.cfg create mode 100644 tcl/interface/signalyzer-lite.cfg diff --git a/tcl/interface/signalyzer-h2.cfg b/tcl/interface/signalyzer-h2.cfg new file mode 100644 index 000000000..24288acba --- /dev/null +++ b/tcl/interface/signalyzer-h2.cfg @@ -0,0 +1,11 @@ +# +# Xverve Signalyzer H2 (DT-USB-SH2) +# +# http://www.signalyzer.com +# + +interface ft2232 +ft2232_device_desc "Signalyzer H2" +ft2232_layout signalyzer-h +ft2232_vid_pid 0x0403 0xbca2 + diff --git a/tcl/interface/signalyzer-h4.cfg b/tcl/interface/signalyzer-h4.cfg new file mode 100644 index 000000000..d2b260b82 --- /dev/null +++ b/tcl/interface/signalyzer-h4.cfg @@ -0,0 +1,11 @@ +# +# Xverve Signalyzer H4 (DT-USB-SH4) +# +# http://www.signalyzer.com +# + +interface ft2232 +ft2232_device_desc "Signalyzer H4" +ft2232_layout signalyzer-h +ft2232_vid_pid 0x0403 0xbca4 + diff --git a/tcl/interface/signalyzer-lite.cfg b/tcl/interface/signalyzer-lite.cfg new file mode 100644 index 000000000..834bc0c59 --- /dev/null +++ b/tcl/interface/signalyzer-lite.cfg @@ -0,0 +1,11 @@ +# +# Xverve Signalyzer LITE (DT-USB-SLITE) +# +# http://www.signalyzer.com +# + +interface ft2232 +ft2232_device_desc "Signalyzer LITE" +ft2232_layout signalyzer +ft2232_vid_pid 0x0403 0xbca1 + -- 2.11.4.GIT From 993fe4ab633eff4f04dd63e4751ccc2a6ea2d52e Mon Sep 17 00:00:00 2001 From: Oleg Seiljus Date: Tue, 27 Oct 2009 12:40:24 -0700 Subject: [PATCH 03/16] Signalyzer: H2 and H4 support This patch includes partial support for these new JTAG adapters. More complete support will require updates to the libftdi code, for EEPROM access. [dbrownell@users.sourceforge.net: fix whitespace, linelen, etc ] Signed-off-by: David Brownell --- src/jtag/ft2232.c | 809 +++++++++++++++++++++++++++++++++++++++++++ tcl/interface/signalyzer.cfg | 2 +- 2 files changed, 810 insertions(+), 1 deletion(-) diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c index fad07dcef..cf3fc0126 100644 --- a/src/jtag/ft2232.c +++ b/src/jtag/ft2232.c @@ -137,6 +137,7 @@ static int axm0432_jtag_init(void); static int sheevaplug_init(void); static int icebear_jtag_init(void); static int cortino_jtag_init(void); +static int signalyzer_h_init(void); /* reset procedures for supported layouts */ static void usbjtag_reset(int trst, int srst); @@ -149,11 +150,13 @@ static void stm32stick_reset(int trst, int srst); static void axm0432_jtag_reset(int trst, int srst); static void sheevaplug_reset(int trst, int srst); static void icebear_jtag_reset(int trst, int srst); +static void signalyzer_h_reset(int trst, int srst); /* blink procedures for layouts that support a blinking led */ static void olimex_jtag_blink(void); static void flyswatter_jtag_blink(void); static void turtle_jtag_blink(void); +static void signalyzer_h_blink(void); static const ft2232_layout_t ft2232_layouts[] = { @@ -173,6 +176,7 @@ static const ft2232_layout_t ft2232_layouts[] = { "sheevaplug", sheevaplug_init, sheevaplug_reset, NULL }, { "icebear", icebear_jtag_init, icebear_jtag_reset, NULL }, { "cortino", cortino_jtag_init, comstick_reset, NULL }, + { "signalyzer-h", signalyzer_h_init, signalyzer_h_reset, signalyzer_h_blink }, { NULL, NULL, NULL, NULL }, }; @@ -3070,3 +3074,808 @@ static void icebear_jtag_reset(int trst, int srst) { LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction); } + +/* --------------------------------------------------------------------- + * Support for Signalyzer H2 and Signalyzer H4 + * JTAG adapter from Xverve Technologies Inc. + * http://www.signalyzer.com or http://www.xverve.com + * + * Author: Oleg Seiljus, oleg@signalyzer.com + */ +static unsigned char signalyzer_h_side; +static unsigned int signalyzer_h_adapter_type; + +static int signalyzer_h_ctrl_write(int address, unsigned short value); + +#if BUILD_FT2232_FTD2XX == 1 +static int signalyzer_h_ctrl_read(int address, unsigned short *value); +#endif + +#define SIGNALYZER_COMMAND_ADDR 128 +#define SIGNALYZER_DATA_BUFFER_ADDR 129 + +#define SIGNALYZER_COMMAND_VERSION 0x41 +#define SIGNALYZER_COMMAND_RESET 0x42 +#define SIGNALYZER_COMMAND_POWERCONTROL_GET 0x50 +#define SIGNALYZER_COMMAND_POWERCONTROL_SET 0x51 +#define SIGNALYZER_COMMAND_PWM_SET 0x52 +#define SIGNALYZER_COMMAND_LED_SET 0x53 +#define SIGNALYZER_COMMAND_ADC 0x54 +#define SIGNALYZER_COMMAND_GPIO_STATE 0x55 +#define SIGNALYZER_COMMAND_GPIO_MODE 0x56 +#define SIGNALYZER_COMMAND_GPIO_PORT 0x57 +#define SIGNALYZER_COMMAND_I2C 0x58 + +#define SIGNALYZER_CHAN_A 1 +#define SIGNALYZER_CHAN_B 2 +/* LEDS use channel C */ +#define SIGNALYZER_CHAN_C 4 + +#define SIGNALYZER_LED_GREEN 1 +#define SIGNALYZER_LED_RED 2 + +#define SIGNALYZER_MODULE_TYPE_EM_LT16_A 0x0301 +#define SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG 0x0302 +#define SIGNALYZER_MODULE_TYPE_EM_JTAG 0x0303 +#define SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P 0x0304 +#define SIGNALYZER_MODULE_TYPE_EM_JTAG_P 0x0305 + + +static int signalyzer_h_ctrl_write(int address, unsigned short value) +{ +#if BUILD_FT2232_FTD2XX == 1 + return FT_WriteEE(ftdih, address, value); +#elif BUILD_FT2232_LIBFTDI == 1 + return 0; +#endif +} + +#if BUILD_FT2232_FTD2XX == 1 +static int signalyzer_h_ctrl_read(int address, unsigned short *value) +{ + return FT_ReadEE(ftdih, address, value); +} +#endif + +static int signalyzer_h_led_set(unsigned char channel, unsigned char led, + int on_time_ms, int off_time_ms, unsigned char cycles) +{ + unsigned char on_time; + unsigned char off_time; + + if (on_time_ms < 0xFFFF) + on_time = (unsigned char)(on_time_ms / 62); + else + on_time = 0xFF; + + off_time = (unsigned char)(off_time_ms / 62); + +#if BUILD_FT2232_FTD2XX == 1 + FT_STATUS status; + + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR, + ((uint32_t)(channel << 8) | led))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + (SIGNALYZER_DATA_BUFFER_ADDR + 1), + ((uint32_t)(on_time << 8) | off_time))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + (SIGNALYZER_DATA_BUFFER_ADDR + 2), + ((uint32_t)cycles))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_LED_SET)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; +#elif BUILD_FT2232_LIBFTDI == 1 + int retval; + + if ((retval = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR, + ((uint32_t)(channel << 8) | led))) < 0) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftdi_get_error_string(&ftdic)); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((retval = signalyzer_h_ctrl_write( + (SIGNALYZER_DATA_BUFFER_ADDR + 1), + ((uint32_t)(on_time << 8) | off_time))) < 0) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftdi_get_error_string(&ftdic)); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((retval = signalyzer_h_ctrl_write( + (SIGNALYZER_DATA_BUFFER_ADDR + 2), + (uint32_t)cycles)) < 0) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftdi_get_error_string(&ftdic)); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((retval = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_LED_SET)) < 0) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftdi_get_error_string(&ftdic)); + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; +#endif +} + +static int signalyzer_h_init(void) +{ +#if BUILD_FT2232_FTD2XX == 1 + FT_STATUS status; + int i; +#endif + + char *end_of_desc; + + uint16_t read_buf[12]; + uint8_t buf[3]; + uint32_t bytes_written; + + /* turn on center green led */ + signalyzer_h_led_set(SIGNALYZER_CHAN_C, SIGNALYZER_LED_GREEN, + 0xFFFF, 0x00, 0x00); + + /* determine what channel config wants to open + * TODO: change me... current implementation is made to work + * with openocd description parsing. + */ + end_of_desc = strrchr(ft2232_device_desc, 0x00); + + if (end_of_desc) + { + signalyzer_h_side = *(end_of_desc - 1); + if (signalyzer_h_side == 'B') + signalyzer_h_side = SIGNALYZER_CHAN_B; + else + signalyzer_h_side = SIGNALYZER_CHAN_A; + } + else + { + LOG_ERROR("No Channel was specified"); + return ERROR_FAIL; + } + + signalyzer_h_led_set(signalyzer_h_side, SIGNALYZER_LED_GREEN, + 1000, 1000, 0xFF); + +#if BUILD_FT2232_FTD2XX == 1 + /* read signalyzer versionining information */ + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_VERSION)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + for (i = 0; i < 10; i++) + { + if ((status = signalyzer_h_ctrl_read( + (SIGNALYZER_DATA_BUFFER_ADDR + i), + &read_buf[i])) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + } + + LOG_INFO("Signalyzer: ID info: { %.4x %.4x %.4x %.4x %.4x %.4x %.4x }", + read_buf[0], read_buf[1], read_buf[2], read_buf[3], + read_buf[4], read_buf[5], read_buf[6]); + + /* set gpio register */ + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR, + (uint32_t)(signalyzer_h_side << 8))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, + 0x0404)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* read adapter type information */ + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR, + ((uint32_t)(signalyzer_h_side << 8) | 0x01))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + (SIGNALYZER_DATA_BUFFER_ADDR + 1), 0xA000)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + (SIGNALYZER_DATA_BUFFER_ADDR + 2), 0x0008)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_I2C)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + usleep(100000); + + if ((status = signalyzer_h_ctrl_read(SIGNALYZER_COMMAND_ADDR, + &read_buf[0])) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if (read_buf[0] != 0x0498) + signalyzer_h_adapter_type = 0x0000; + else + { + for (i = 0; i < 4; i++) + { + if ((status = signalyzer_h_ctrl_read( + (SIGNALYZER_DATA_BUFFER_ADDR + i), + &read_buf[i])) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + } + + signalyzer_h_adapter_type = read_buf[0]; + } + +#elif BUILD_FT2232_LIBFTDI == 1 + /* currently libftdi does not allow reading individual eeprom + * locations, therefore adapter type cannot be detected. + * override with most common type + */ + signalyzer_h_adapter_type = SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG; +#endif + + enum reset_types jtag_reset_config = jtag_get_reset_config(); + + /* ADAPTOR: EM_LT16_A */ + if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A) + { + LOG_INFO("Signalyzer: EM-LT (16-channel level translator) " + "detected. (HW: %2x).", (read_buf[1] >> 8)); + + nTRST = 0x10; + nTRSTnOE = 0x10; + nSRST = 0x20; + nSRSTnOE = 0x20; + + low_output = 0x08; + low_direction = 0x1b; + + high_output = 0x0; + high_direction = 0x0; + + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + { + low_direction &= ~nTRSTnOE; /* nTRST input */ + low_output &= ~nTRST; /* nTRST = 0 */ + } + else + { + low_direction |= nTRSTnOE; /* nTRST output */ + low_output |= nTRST; /* nTRST = 1 */ + } + + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + { + low_direction |= nSRSTnOE; /* nSRST output */ + low_output |= nSRST; /* nSRST = 1 */ + } + else + { + low_direction &= ~nSRSTnOE; /* nSRST input */ + low_output &= ~nSRST; /* nSRST = 0 */ + } + +#if BUILD_FT2232_FTD2XX == 1 + /* enable power to the module */ + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR, + ((uint32_t)(signalyzer_h_side << 8) | 0x01))) + != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_POWERCONTROL_SET)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* set gpio mode register */ + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR, + (uint32_t)(signalyzer_h_side << 8))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000)) + != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_GPIO_MODE)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* set gpio register */ + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR, + (uint32_t)(signalyzer_h_side << 8))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x4040)) + != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } +#endif + } + + /* ADAPTOR: EM_ARM_JTAG, EM_ARM_JTAG_P, EM_JTAG, EM_JTAG_P */ + else if ((signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) || + (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) || + (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG) || + (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)) + { + if (signalyzer_h_adapter_type + == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) + LOG_INFO("Signalyzer: EM-ARM-JTAG (ARM JTAG) " + "detected. (HW: %2x).", (read_buf[1] >> 8)); + else if (signalyzer_h_adapter_type + == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) + LOG_INFO("Signalyzer: EM-ARM-JTAG_P " + "(ARM JTAG with PSU) detected. (HW: %2x).", + (read_buf[1] >> 8)); + else if (signalyzer_h_adapter_type + == SIGNALYZER_MODULE_TYPE_EM_JTAG) + LOG_INFO("Signalyzer: EM-JTAG (Generic JTAG) " + "detected. (HW: %2x).", (read_buf[1] >> 8)); + else if (signalyzer_h_adapter_type + == SIGNALYZER_MODULE_TYPE_EM_JTAG_P) + LOG_INFO("Signalyzer: EM-JTAG-P " + "(Generic JTAG with PSU) detected. (HW: %2x).", + (read_buf[1] >> 8)); + + nTRST = 0x02; + nTRSTnOE = 0x04; + nSRST = 0x08; + nSRSTnOE = 0x10; + + low_output = 0x08; + low_direction = 0x1b; + + high_output = 0x0; + high_direction = 0x1f; + + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + { + high_output |= nTRSTnOE; + high_output &= ~nTRST; + } + else + { + high_output &= ~nTRSTnOE; + high_output |= nTRST; + } + + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + { + high_output &= ~nSRSTnOE; + high_output |= nSRST; + } + else + { + high_output |= nSRSTnOE; + high_output &= ~nSRST; + } + +#if BUILD_FT2232_FTD2XX == 1 + /* enable power to the module */ + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR, + ((uint32_t)(signalyzer_h_side << 8) | 0x01))) + != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_POWERCONTROL_SET)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* set gpio mode register (IO_16 and IO_17 set as analog + * inputs, other is gpio) + */ + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR, + (uint32_t)(signalyzer_h_side << 8))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0060)) + != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_GPIO_MODE)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* set gpio register (all inputs, for -P modules, + * PSU will be turned off) + */ + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR, + (uint32_t)(signalyzer_h_side << 8))) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000)) + != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } + + if ((status = signalyzer_h_ctrl_write( + SIGNALYZER_COMMAND_ADDR, + SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK) + { + LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", + status); + return ERROR_JTAG_DEVICE_ERROR; + } +#endif + } + + else if (signalyzer_h_adapter_type == 0x0000) + { + LOG_INFO("Signalyzer: No external modules were detected."); + + nTRST = 0x10; + nTRSTnOE = 0x10; + nSRST = 0x20; + nSRSTnOE = 0x20; + + low_output = 0x08; + low_direction = 0x1b; + + high_output = 0x0; + high_direction = 0x0; + + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + { + low_direction &= ~nTRSTnOE; /* nTRST input */ + low_output &= ~nTRST; /* nTRST = 0 */ + } + else + { + low_direction |= nTRSTnOE; /* nTRST output */ + low_output |= nTRST; /* nTRST = 1 */ + } + + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + { + low_direction |= nSRSTnOE; /* nSRST output */ + low_output |= nSRST; /* nSRST = 1 */ + } + else + { + low_direction &= ~nSRSTnOE; /* nSRST input */ + low_output &= ~nSRST; /* nSRST = 0 */ + } + } + else + { + LOG_ERROR("Unknown module type is detected: %.4x", + signalyzer_h_adapter_type); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* initialize low byte of controller for jtag operation */ + buf[0] = 0x80; + buf[1] = low_output; + buf[2] = low_direction; + + if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) + || (bytes_written != 3)) + { + LOG_ERROR("couldn't initialize Signalyzer-H layout"); + return ERROR_JTAG_INIT_FAILED; + } + +#if BUILD_FT2232_FTD2XX == 1 + if (ftdi_device == FT_DEVICE_2232H) + { + /* initialize high byte of controller for jtag operation */ + buf[0] = 0x82; + buf[1] = high_output; + buf[2] = high_direction; + + if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) + || (bytes_written != 3)) + { + LOG_ERROR("couldn't initialize Signalyzer-H layout"); + return ERROR_JTAG_INIT_FAILED; + } + } +#elif BUILD_FT2232_LIBFTDI == 1 + if (ftdi_device == TYPE_2232H) + { + /* initialize high byte of controller for jtag operation */ + buf[0] = 0x82; + buf[1] = high_output; + buf[2] = high_direction; + + if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) + || (bytes_written != 3)) + { + LOG_ERROR("couldn't initialize Signalyzer-H layout"); + return ERROR_JTAG_INIT_FAILED; + } + } +#endif + return ERROR_OK; +} + +static void signalyzer_h_reset(int trst, int srst) +{ + enum reset_types jtag_reset_config = jtag_get_reset_config(); + + /* ADAPTOR: EM_LT16_A */ + if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A) + { + if (trst == 1) + { + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + /* switch to output pin (output is low) */ + low_direction |= nTRSTnOE; + else + /* switch output low */ + low_output &= ~nTRST; + } + else if (trst == 0) + { + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + /* switch to input pin (high-Z + internal + * and external pullup) */ + low_direction &= ~nTRSTnOE; + else + /* switch output high */ + low_output |= nTRST; + } + + if (srst == 1) + { + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + /* switch output low */ + low_output &= ~nSRST; + else + /* switch to output pin (output is low) */ + low_direction |= nSRSTnOE; + } + else if (srst == 0) + { + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + /* switch output high */ + low_output |= nSRST; + else + /* switch to input pin (high-Z) */ + low_direction &= ~nSRSTnOE; + } + + /* command "set data bits low byte" */ + buffer_write(0x80); + buffer_write(low_output); + buffer_write(low_direction); + LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, " + "low_direction: 0x%2.2x", + trst, srst, low_output, low_direction); + } + /* ADAPTOR: EM_ARM_JTAG, EM_ARM_JTAG_P, EM_JTAG, EM_JTAG_P */ + else if ((signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) || + (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) || + (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG) || + (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)) + { + if (trst == 1) + { + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + high_output &= ~nTRSTnOE; + else + high_output &= ~nTRST; + } + else if (trst == 0) + { + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + high_output |= nTRSTnOE; + else + high_output |= nTRST; + } + + if (srst == 1) + { + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + high_output &= ~nSRST; + else + high_output &= ~nSRSTnOE; + } + else if (srst == 0) + { + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + high_output |= nSRST; + else + high_output |= nSRSTnOE; + } + + /* command "set data bits high byte" */ + buffer_write(0x82); + buffer_write(high_output); + buffer_write(high_direction); + LOG_INFO("trst: %i, srst: %i, high_output: 0x%2.2x, " + "high_direction: 0x%2.2x", + trst, srst, high_output, high_direction); + } + else if (signalyzer_h_adapter_type == 0x0000) + { + if (trst == 1) + { + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + /* switch to output pin (output is low) */ + low_direction |= nTRSTnOE; + else + /* switch output low */ + low_output &= ~nTRST; + } + else if (trst == 0) + { + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + /* switch to input pin (high-Z + internal + * and external pullup) */ + low_direction &= ~nTRSTnOE; + else + /* switch output high */ + low_output |= nTRST; + } + + if (srst == 1) + { + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + /* switch output low */ + low_output &= ~nSRST; + else + /* switch to output pin (output is low) */ + low_direction |= nSRSTnOE; + } + else if (srst == 0) + { + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + /* switch output high */ + low_output |= nSRST; + else + /* switch to input pin (high-Z) */ + low_direction &= ~nSRSTnOE; + } + + /* command "set data bits low byte" */ + buffer_write(0x80); + buffer_write(low_output); + buffer_write(low_direction); + LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, " + "low_direction: 0x%2.2x", + trst, srst, low_output, low_direction); + } +} + +static void signalyzer_h_blink(void) +{ + signalyzer_h_led_set(signalyzer_h_side, SIGNALYZER_LED_RED, 100, 0, 1); +} diff --git a/tcl/interface/signalyzer.cfg b/tcl/interface/signalyzer.cfg index ff5f1251c..b0581c5c3 100644 --- a/tcl/interface/signalyzer.cfg +++ b/tcl/interface/signalyzer.cfg @@ -1,7 +1,7 @@ # # Xverve Signalyzer Tool (DT-USB-ST) # -# http://www.signalyzer.com/products/development-tools/signalyzer-tool-dt-usb-st.html +# http://www.signalyzer.com # interface ft2232 -- 2.11.4.GIT From 39dd68bca649e9275c602fa212f448ae8497f306 Mon Sep 17 00:00:00 2001 From: Nicolas Pitre Date: Tue, 27 Oct 2009 21:19:42 -0400 Subject: [PATCH 04/16] ARM: fix target address when disassembling Thumb BLX A Thumb BLX instruction is branching to ARM code, and therefore the first 2 bits of the target address must be cleared. Signed-off-by: Nicolas Pitre Signed-off-by: David Brownell --- src/target/arm_disassembler.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/target/arm_disassembler.c b/src/target/arm_disassembler.c index 5b0046b7d..ee087b121 100644 --- a/src/target/arm_disassembler.c +++ b/src/target/arm_disassembler.c @@ -1768,6 +1768,7 @@ static int evaluate_b_bl_blx_thumb(uint16_t opcode, case 1: instruction->type = ARM_BLX; mnemonic = "BLX"; + target_address &= 0xfffffffc; break; /* BL/BLX prefix */ case 2: -- 2.11.4.GIT From 76afa936ba4bfa5a5780dbad562c6637c252524b Mon Sep 17 00:00:00 2001 From: Nicolas Pitre Date: Tue, 27 Oct 2009 21:19:43 -0400 Subject: [PATCH 05/16] ARM: fix single-step of Thumb unconditional branch Only type 1 branch instruction has a condition code, not type 2. Currently they're both tagged with ARM_B which doesn't allow for the distinction. Signed-off-by: Nicolas Pitre Signed-off-by: David Brownell --- src/target/arm_simulator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/target/arm_simulator.c b/src/target/arm_simulator.c index c50a52cd9..27957b2f6 100644 --- a/src/target/arm_simulator.c +++ b/src/target/arm_simulator.c @@ -317,8 +317,8 @@ int arm_simulate_step_core(target_t *target, uint32_t *dry_run_pc, struct arm_si return retval; instruction_size = 2; - /* check condition code (only for branch instructions) */ - if (instruction.type == ARM_B && + /* check condition code (only for branch (1) instructions) */ + if ((opcode & 0xf000) == 0xd000 && !thumb_pass_branch_condition(sim->get_cpsr(sim, 0, 32), opcode)) { if (dry_run_pc) -- 2.11.4.GIT From 89c1bea9310c5ecfe09ba3b544240556160cfbec Mon Sep 17 00:00:00 2001 From: Zachary T Welch Date: Sat, 24 Oct 2009 03:05:41 -0700 Subject: [PATCH 06/16] Improve .gitignore rules. A '.*' rule prevents the 'git submodule add' from correctly adding the first submodule, because it creates the .gitmodule file. This file will not be added (without -f) result in incomplete submodule commits. The new rules mask the specific files present in my own build tree, but additional rules may be needed to hide other types of temporary files. --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c0aba19e7..2c1c536ad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,17 @@ # stuff "git status" should ignore # build output -.* +.libs +.deps *.o *.a *.lo *.la *.in +# editor files +*.swp + startup_tcl.c xscale_debug.h -- 2.11.4.GIT From eb9790dc91bd2d46c480277b1f275ba2d6e1ca3f Mon Sep 17 00:00:00 2001 From: Zachary T Welch Date: Sat, 24 Oct 2009 03:04:28 -0700 Subject: [PATCH 07/16] Add git2cl from repo.or.cz as a submodule in tools/git2cl. --- .gitmodules | 3 +++ tools/git2cl | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 tools/git2cl diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..2fcecfd7d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "tools/git2cl"] + path = tools/git2cl + url = git://repo.or.cz/git2cl.git diff --git a/tools/git2cl b/tools/git2cl new file mode 160000 index 000000000..8373c9f74 --- /dev/null +++ b/tools/git2cl @@ -0,0 +1 @@ +Subproject commit 8373c9f74993e218a08819cbcdbab3f3564bbeba -- 2.11.4.GIT From c970d03ddb7084713533c935864df18a6828d21a Mon Sep 17 00:00:00 2001 From: Zachary T Welch Date: Thu, 22 Oct 2009 01:38:22 -0700 Subject: [PATCH 08/16] Factor release version functions into new script. --- tools/release/helpers.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 tools/release/helpers.sh diff --git a/tools/release/helpers.sh b/tools/release/helpers.sh new file mode 100644 index 000000000..2dd5bae15 --- /dev/null +++ b/tools/release/helpers.sh @@ -0,0 +1,60 @@ +#!/bin/sh -e + +die() { + echo "$@" >&2 + exit 1 +} + +package_info_load_name() { + grep AC_INIT configure.in | perl -ne 's/^.+\(\[([-\w]*)\],.+$/$1/ and print' +} +package_info_load_version() { + grep AC_INIT configure.in | perl -ne 's/^.+\[([-\w\.]*)\],$/$1/ and print' +} + +package_info_load() { + [ -f "configure.in" ] || \ + die "package_info_load: configure.in is missing" + + PACKAGE_NAME="$(package_info_load_name)" + # todo: fix this + PACKAGE_TARNAME="${PACKAGE_NAME}" + + PACKAGE_VERSION="$(package_info_load_version)" + + [ "${PACKAGE_NAME}" -a "${PACKAGE_VERSION}" ] || \ + die "package information is missing from configure script" + + PACKAGE_VERSION_TAGS= + [ "${PACKAGE_VERSION/-/}" = "${PACKAGE_VERSION}" ] || \ + PACKAGE_VERSION_TAGS="-${PACKAGE_VERSION#*-}" + PACKAGE_VERSION_BASE="${PACKAGE_VERSION%%-*}" + PACKAGE_MICRO="${PACKAGE_VERSION_BASE##*.}" + PACKAGE_MAJOR_AND_MINOR="${PACKAGE_VERSION_BASE%.*}" + PACKAGE_MAJOR="${PACKAGE_MAJOR_AND_MINOR%.*}" + PACKAGE_MINOR="${PACKAGE_MAJOR_AND_MINOR#*.}" + + [ "${RELEASE_FINAL}" ] \ + && RELEASE_VERSION="${PACKAGE_VERSION_BASE}" \ + || RELEASE_VERSION="${PACKAGE_VERSION/-dev/}" + PACKAGE_RELEASE="${PACKAGE_TARNAME}-${RELEASE_VERSION}" + PACKAGE_STRING="${PACKAGE_NAME} ${PACKAGE_VERSION}" +} + +package_info_show() { + cat < Date: Tue, 20 Oct 2009 17:12:17 -0700 Subject: [PATCH 09/16] Factor version munging capabilities out of release.sh. --- tools/release/version.sh | 137 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100755 tools/release/version.sh diff --git a/tools/release/version.sh b/tools/release/version.sh new file mode 100755 index 000000000..bef79d0e2 --- /dev/null +++ b/tools/release/version.sh @@ -0,0 +1,137 @@ +#!/bin/sh -e +# version.sh: openocd version process automation +# Copyright (C) 2009 by Zachary T Welch +# Release under the GNU GPL v2 (or later versions). + +source "tools/release/helpers.sh" + +do_version_usage() { + cat << USAGE +usage: $0 +Version Commands: + tag {add|remove}