From 7d244761461701e1161df32c2f1d4cd50ae2bb26 Mon Sep 17 00:00:00 2001 From: drath Date: Tue, 1 Aug 2006 09:45:22 +0000 Subject: [PATCH] - allow building for MinGW using either -mno-cygwin or the MinGW gcc - added GiveIO support to the amt_jtagaccel driver - explicitly disable loopback mode for FT2232 devices - changed configuration options n[st]rst_delay to jtag_n[st]rst_delay - shutdown network services on exit git-svn-id: svn://svn.berlios.de/openocd/trunk@80 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- configure.in | 14 ++++++++--- src/jtag/amt_jtagaccel.c | 51 ++++++++++++++++++++++++++++++++++++++-- src/jtag/ftd2xx.c | 9 +++++++ src/jtag/jtag.c | 8 +++---- src/openocd.c | 5 +++- src/server/server.c | 2 +- src/server/server.h | 1 + 7 files changed, 79 insertions(+), 11 deletions(-) diff --git a/configure.in b/configure.in index 2cf08cf401..3518b38d74 100644 --- a/configure.in +++ b/configure.in @@ -48,14 +48,22 @@ AC_ARG_WITH(ftd2xx, case $host in *-*-cygwin*) - is_cygwin=yes is_win32=yes AC_ARG_ENABLE(parport_giveio, AS_HELP_STRING([--enable-parport_giveio], [Enable use of giveio for parport instead of ioperm]), [parport_use_giveio=$enableval], [parport_use_giveio=no]) - - AC_DEFINE(IS_CYGWIN, 1, [1 if building for Cygwin.]) + + AC_COMPILE_IFELSE(AC_LANG_PROGRAM([],[return __MINGW32__;]),[is_mingw=yes],[is_mingw=no]) + if test $is_mingw = yes; then + AC_DEFINE(IS_MINGW, 1, [1 if building for MinGW.]) + parport_use_giveio=yes + is_cygwin=no + else + is_cygwin=yes + AC_DEFINE(IS_CYGWIN, 1, [1 if building for Cygwin.]) + fi + AC_DEFINE(IS_WIN32, 1, [1 if building for Win32.]) ;; *-*-mingw*) diff --git a/src/jtag/amt_jtagaccel.c b/src/jtag/amt_jtagaccel.c index 113aee664a..d788728b1e 100644 --- a/src/jtag/amt_jtagaccel.c +++ b/src/jtag/amt_jtagaccel.c @@ -21,11 +21,18 @@ #include "config.h" #endif -#include "log.h" +#include "replacements.h" + #include "jtag.h" /* system includes */ + +#ifndef _WIN32 #include +#else +#include "errno.h" +#endif /* _WIN32 */ + #include #include @@ -40,6 +47,16 @@ #include #endif +#if PARPORT_USE_GIVEIO == 1 +#if IS_CYGWIN == 1 +#include +#include +#undef ERROR +#endif +#endif + +#include "log.h" + /* configuration */ unsigned long amt_jtagaccel_port; @@ -382,6 +399,32 @@ int amt_jtagaccel_execute_queue(void) return ERROR_OK; } +#if PARPORT_USE_GIVEIO == 1 +int amt_jtagaccel_get_giveio_access() +{ + HANDLE h; + OSVERSIONINFO version; + + version.dwOSVersionInfoSize = sizeof version; + if (!GetVersionEx( &version )) { + errno = EINVAL; + return -1; + } + if (version.dwPlatformId != VER_PLATFORM_WIN32_NT) + return 0; + + h = CreateFile( "\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); + if (h == INVALID_HANDLE_VALUE) { + errno = ENODEV; + return -1; + } + + CloseHandle( h ); + + return 0; +} +#endif + int amt_jtagaccel_init(void) { #if PARPORT_USE_PPDEV == 1 @@ -435,8 +478,12 @@ int amt_jtagaccel_init(void) amt_jtagaccel_port = 0x378; WARNING("No parport port specified, using default '0x378' (LPT1)"); } - + +#if PARPORT_USE_GIVEIO == 1 + if (amt_jtagaccel_get_giveio_access() != 0) { +#else /* PARPORT_USE_GIVEIO */ if (ioperm(amt_jtagaccel_port, 5, 1) != 0) { +#endif /* PARPORT_USE_GIVEIO */ ERROR("missing privileges for direct i/o"); return ERROR_JTAG_INIT_FAILED; } diff --git a/src/jtag/ftd2xx.c b/src/jtag/ftd2xx.c index e8d29a88ad..050f9c04d9 100644 --- a/src/jtag/ftd2xx.c +++ b/src/jtag/ftd2xx.c @@ -799,6 +799,8 @@ int ftd2xx_init(void) u8 latency_timer; FT_STATUS status; DWORD num_devices; + u8 buf[1]; + DWORD bytes_written; ftd2xx_layout_t *cur_layout = ftd2xx_layouts; @@ -900,6 +902,13 @@ int ftd2xx_init(void) return ERROR_JTAG_INIT_FAILED; ftd2xx_speed(jtag_speed); + + buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */ + if (((status = FT_Write(ftdih, buf, 1, &bytes_written)) != FT_OK) || (bytes_written != 1)) + { + ERROR("couldn't write to ftdi device: %i", status); + return ERROR_JTAG_INIT_FAILED; + } if ((status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX)) != FT_OK) { diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index b8846f17b8..7c6c911a10 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -1147,9 +1147,9 @@ int jtag_register_commands(struct command_context_s *cmd_ctx) COMMAND_CONFIG, NULL); register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command, COMMAND_CONFIG, NULL); - register_command(cmd_ctx, NULL, "nsrst_delay", handle_jtag_nsrst_delay_command, + register_command(cmd_ctx, NULL, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command, COMMAND_CONFIG, NULL); - register_command(cmd_ctx, NULL, "ntrst_delay", handle_jtag_ntrst_delay_command, + register_command(cmd_ctx, NULL, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command, COMMAND_CONFIG, NULL); register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command, @@ -1375,7 +1375,7 @@ int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd { if (argc < 1) { - ERROR("nsrst_delay command takes one required argument"); + ERROR("jtag_nsrst_delay command takes one required argument"); exit(-1); } else @@ -1390,7 +1390,7 @@ int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd { if (argc < 1) { - ERROR("ntrst_delay command takes one required argument"); + ERROR("jtag_ntrst_delay command takes one required argument"); exit(-1); } else diff --git a/src/openocd.c b/src/openocd.c index 53ff45485a..b078958e0c 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -18,7 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#define OPENOCD_VERSION "Open On-Chip Debugger (2006-07-30 13:30 CEST)" +#define OPENOCD_VERSION "Open On-Chip Debugger (2006-08-01 12:00 CEST)" #ifdef HAVE_CONFIG_H #include "config.h" @@ -115,6 +115,9 @@ int main(int argc, char *argv[]) /* handle network connections */ server_loop(cmd_ctx); + /* shut server down */ + server_quit(); + /* free commandline interface */ command_done(cmd_ctx); diff --git a/src/server/server.c b/src/server/server.c index 5d7df1af11..951be45053 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -417,7 +417,7 @@ int server_init() return ERROR_OK; } -int server_close() +int server_quit() { remove_services(); diff --git a/src/server/server.h b/src/server/server.h index ddf0b97d5e..811e26ecdd 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -65,6 +65,7 @@ typedef struct service_s extern int add_service(char *name, enum connection_type type, unsigned short port, int max_connections, new_connection_handler_t new_connection_handler, input_handler_t input_handler, connection_closed_handler_t connection_closed_handler, void *priv); extern int server_init(); +extern int server_quit(); extern int server_loop(command_context_t *command_context); extern int server_register_commands(command_context_t *context); -- 2.30.2