From 9d1f95e01a4d273bd0e82a98719a4ea5ff435647 Mon Sep 17 00:00:00 2001
From: ntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Fri, 19 Dec 2008 13:58:15 +0000
Subject: [PATCH] - fix rlink build under native win32 (mingw) - remove rlink
 build warnings - add usb_set_configuration to rlink_init, win32 requires this
 - add win32 ETIMEDOUT define

git-svn-id: svn://svn.berlios.de/openocd/trunk@1260 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/helper/replacements.h                     |   7 +-
 src/jtag/rlink/init.m4                        | 148 +--
 src/jtag/rlink/rlink.c                        |   7 +-
 src/server/httpd.c                            | 914 +++++++++---------
 src/target/interface/rlink.cfg                |   3 +
 .../rlink_make_speed_table.pl                 |   0
 tools/st7_dtc_as/st7_dtc_as.pl                |   0
 7 files changed, 545 insertions(+), 534 deletions(-)
 create mode 100644 src/target/interface/rlink.cfg
 mode change 100644 => 100755 tools/rlink_make_speed_table/rlink_make_speed_table.pl
 mode change 100644 => 100755 tools/st7_dtc_as/st7_dtc_as.pl

diff --git a/src/helper/replacements.h b/src/helper/replacements.h
index a1500d798..b6165085a 100644
--- a/src/helper/replacements.h
+++ b/src/helper/replacements.h
@@ -84,7 +84,6 @@ struct timeval {
 /* gettimeofday() */
 #ifndef HAVE_GETTIMEOFDAY
 
-
 #ifdef _WIN32
 struct timezone {
 	int tz_minuteswest;
@@ -161,6 +160,12 @@ void usleep(int us);
 #include <windows.h>
 #include <time.h>
 
+/* win32 systems do not support ETIMEDOUT */
+
+#ifndef ETIMEDOUT
+#define ETIMEDOUT WSAETIMEDOUT
+#endif
+
 #if IS_MINGW == 1
 static __inline unsigned char inb(unsigned short int port)
 {
diff --git a/src/jtag/rlink/init.m4 b/src/jtag/rlink/init.m4
index 268462ffe..3e64523c6 100644
--- a/src/jtag/rlink/init.m4
+++ b/src/jtag/rlink/init.m4
@@ -1,74 +1,74 @@
-m4_divert(`-1')
-/***************************************************************************
- *   Copyright (C) 2008 Lou Deluxe                                         *
- *   lou.openocd012@fixit.nospammail.net                                   *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
-
-m4_undefine(`CTRL_MPEG_L')
-m4_undefine(`CTRL_CARD_L')
-
-m4_ifelse(SHIFTER_PRESCALER, 1, `
-	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x0')')
-')
-m4_ifelse(SHIFTER_PRESCALER, 2, `
-	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x2')')
-	m4_define(`CTRL_CARD_L', `m4_eval(`0x8 | 0x1')')
-')
-m4_ifelse(SHIFTER_PRESCALER, 8, `
-	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x3')')
-')
-m4_ifelse(SHIFTER_PRESCALER, 11, `
-	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x4')')
-')
-m4_ifelse(SHIFTER_PRESCALER, 64, `
-	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x7')')
-')
-
-m4_ifdef(`CTRL_MPEG_L',,`
-	m4_errprint(`SHIFTER_PRESCALER was not defined with a supported value
-')	m4_m4exit(`1')
-')
-
-m4_divert(`0')m4_dnl
-
-init:
-	A.H = 0
-
-	A.L = 0
-
-	DR_MPEG = A	; TDI and TCK start out low
-	DR_CARD = A	; TMS starts out low
-
-	A.L = 0x6
-
-	CTRL_FCI = A	; MPEG and CARD driven by FCI
-	DDR_MPEG = A	; TDI and TCK are outputs
-
-	A.L = 0x1
-
-	X = A		; X == 1
-	DDR_CARD = A	; TMS is output
-
-	A.L = CTRL_MPEG_L
-	CTRL_MPEG = A
-m4_ifdef(`CTRL_CARD_L',
-`	A.L = 'CTRL_CARD_L`
-')m4_dnl
-	CTRL_CARD = A
-
-	STATUS STOP
+m4_divert(`-1')
+/***************************************************************************
+ *   Copyright (C) 2008 Lou Deluxe                                         *
+ *   lou.openocd012@fixit.nospammail.net                                   *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+m4_undefine(`CTRL_MPEG_L')
+m4_undefine(`CTRL_CARD_L')
+
+m4_ifelse(SHIFTER_PRESCALER, 1, `
+	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x0')')
+')
+m4_ifelse(SHIFTER_PRESCALER, 2, `
+	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x2')')
+	m4_define(`CTRL_CARD_L', `m4_eval(`0x8 | 0x1')')
+')
+m4_ifelse(SHIFTER_PRESCALER, 8, `
+	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x3')')
+')
+m4_ifelse(SHIFTER_PRESCALER, 11, `
+	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x4')')
+')
+m4_ifelse(SHIFTER_PRESCALER, 64, `
+	m4_define(`CTRL_MPEG_L', `m4_eval(`0x8 | 0x7')')
+')
+
+m4_ifdef(`CTRL_MPEG_L',,`
+	m4_errprint(`SHIFTER_PRESCALER was not defined with a supported value
+')	m4_m4exit(`1')
+')
+
+m4_divert(`0')m4_dnl
+
+init:
+	A.H = 0
+
+	A.L = 0
+
+	DR_MPEG = A	; TDI and TCK start out low
+	DR_CARD = A	; TMS starts out low
+
+	A.L = 0x6
+
+	CTRL_FCI = A	; MPEG and CARD driven by FCI
+	DDR_MPEG = A	; TDI and TCK are outputs
+
+	A.L = 0x1
+
+	X = A		; X == 1
+	DDR_CARD = A	; TMS is output
+
+	A.L = CTRL_MPEG_L
+	CTRL_MPEG = A
+m4_ifdef(`CTRL_CARD_L',
+`	A.L = 'CTRL_CARD_L`
+')m4_dnl
+	CTRL_CARD = A
+
+	STATUS STOP
diff --git a/src/jtag/rlink/rlink.c b/src/jtag/rlink/rlink.c
index 911cefe73..dc75bdef5 100644
--- a/src/jtag/rlink/rlink.c
+++ b/src/jtag/rlink/rlink.c
@@ -31,6 +31,7 @@
 #include <errno.h>
 #include <string.h>
 #include <usb.h>
+#include <stdint.h>
 
 /* project specific includes */
 #include "log.h"
@@ -1034,7 +1035,6 @@ rlink_scan(
 	int			tdi_bit_offset;
 	u8			tdi_mask, *tdi_p;
 	u8			dtc_mask;
-	dtc_reply_queue_entry_t	*rq_entry;
 
 	if(scan_size < 1) {
 		LOG_ERROR("scan_size cannot be less than 1 bit\n");
@@ -1555,7 +1555,7 @@ int rlink_init(void)
 {
 	struct usb_bus *busses;
 	struct usb_bus *bus;
-	int c, i, a, j, retries,len;
+	int i, j, retries;
 	int found=0;
 	int success=0;
 	u8 reply_buffer[USB_EP1IN_SIZE];
@@ -1597,6 +1597,9 @@ int rlink_init(void)
 					{
 						LOG_DEBUG("Opened device, pHDev = %p\n",pHDev);
 
+						/* usb_set_configuration required under win32 */
+						usb_set_configuration(pHDev, dev->config[0].bConfigurationValue);
+						
 						retries = 3;
 						do
 						{
diff --git a/src/server/httpd.c b/src/server/httpd.c
index b9df9085e..f36cf4379 100644
--- a/src/server/httpd.c
+++ b/src/server/httpd.c
@@ -1,457 +1,457 @@
-/***************************************************************************
- *   Copyright (C) 2007,2008 �yvind Harboe                                 *
- *   oyvind.harboe@zylin.com                                               *
- *                                                                         *
- *   Copyright (C) 2008 Free Software Foundation
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
-
-/* some bits were copied from ahttpd which is under eCos license and
- * copyright to FSF
- */
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "replacements.h"
-
-#include "server.h"
-
-#include "log.h"
-#include "telnet_server.h"
-#include "target.h"
-
-#include <command.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <signal.h>
-
-#include <sys/types.h>
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <microhttpd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#define PAGE_NOT_FOUND "<html><head><title>File not found</title></head><body>File not found</body></html>"
-
-static const char *appendf(const *prev, const char *format, ...)
-{
-	va_list ap;
-	va_start(ap, format);
-	char *string = alloc_vprintf(format, ap);
-	va_end(ap);
-	char *string2 = NULL;
-
-	if (string != NULL)
-	{
-		string2 = alloc_printf("%s%s", (prev == NULL) ? "" : prev, string);
-	}
-
-	if (prev != NULL)
-	{
-		free(prev);
-	}
-
-	if (string == NULL)
-		free(string);
-
-	return string2;
-}
-
-static const char *httpd_exec_cgi_tcl_error(Jim_Interp *interp)
-{
-	int len, i;
-
-	const char *t = NULL;
-	t = appendf(t, "<html><body>\n");
-
-	t = appendf(t, "Runtime error, file \"%s\", line %d:<br>",
-			interp->errorFileName, interp->errorLine);
-	t = appendf(t, "    %s<br>", Jim_GetString(interp->result, NULL));
-	Jim_ListLength(interp, interp->stackTrace, &len);
-	for (i = 0; i < len; i += 3)
-	{
-		Jim_Obj *objPtr;
-		const char *proc, *file, *line;
-
-		Jim_ListIndex(interp, interp->stackTrace, i, &objPtr, JIM_NONE);
-		proc = Jim_GetString(objPtr, NULL);
-		Jim_ListIndex(interp, interp->stackTrace, i + 1, &objPtr, JIM_NONE);
-		file = Jim_GetString(objPtr, NULL);
-		Jim_ListIndex(interp, interp->stackTrace, i + 2, &objPtr, JIM_NONE);
-		line = Jim_GetString(objPtr, NULL);
-		t = appendf(t, "In procedure '%s' called at file \"%s\", line %s<br>",
-				proc, file, line);
-	}
-	t = appendf(t, "</html></body>\n");
-
-	return t;
-}
-
-static int httpd_Jim_Command_writeform(Jim_Interp *interp, int argc,
-		Jim_Obj * const *argv)
-{
-	if (argc != 3)
-	{
-		Jim_WrongNumArgs(interp, 1, argv, "method ?args ...?");
-		return JIM_ERR;
-	}
-	char *name = (char*) Jim_GetString(argv[1], NULL);
-	char *file = (char*) Jim_GetString(argv[2], NULL);
-
-	// Find length
-	char *data;
-	int actual;
-
-	int retcode;
-
-	const char *script = alloc_printf("set dummy_val $httppostdata(%s); set dummy_val",
-			name);
-	retcode = Jim_Eval_Named(interp, script, "httpd.c", __LINE__ );
-	free((void *) script);
-	if (retcode != JIM_OK)
-		return retcode;
-
-	data = Jim_GetString(Jim_GetResult(interp), &actual);
-
-	FILE *f;
-	f = fopen(file, "wb");
-	if (f != NULL)
-	{
-		int ok;
-		ok = fwrite(data, 1, actual, f) == actual;
-		fclose(f);
-
-		if (!ok)
-		{
-			Jim_SetResultString(interp, "Could not write to file", -1);
-			return JIM_ERR;
-		}
-	}
-	else
-	{
-		Jim_SetResultString(interp, "Could not create file", -1);
-		return JIM_ERR;
-	}
-	return JIM_OK;
-}
-
-
-int
-httpd_Jim_Command_formfetch(Jim_Interp *interp,
-                                   int argc,
-                                   Jim_Obj *const *argv)
-{
-    if (argc!=2)
-    {
-        Jim_WrongNumArgs(interp, 1, argv, "method ?args ...?");
-        return JIM_ERR;
-    }
-    char *name = (char*)Jim_GetString(argv[1], NULL);
-
-
-    const char *script = alloc_printf("set dummy_val $httppostdata(%s); set dummy_val",
-    			name);
-    	int retcode = Jim_Eval_Named(interp, script, "httpd.c", __LINE__ );
-    	free((void *) script);
-    	if (retcode != JIM_OK)
-    	{
-    	    Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
-    	} else
-    	{
-    	    Jim_SetResult(interp, Jim_GetResult(interp));
-    	}
-
-    return JIM_OK;
-}
-
-struct httpd_request
-{
-	int post;
-	struct MHD_PostProcessor *postprocessor;
-
-	//Jim_Obj *dict;
-
-	int complete; /* did we receive the entire post ? */
-
-};
-
-static void request_completed(void *cls, struct MHD_Connection *connection,
-		void **con_cls, enum MHD_RequestTerminationCode toe)
-{
-	struct httpd_request *r = (struct httpd_request*) *con_cls;
-
-	if (NULL == r)
-		return;
-
-	if (r->postprocessor)
-	{
-		MHD_destroy_post_processor(r->postprocessor);
-	}
-
-	free(r);
-	*con_cls = NULL;
-}
-
-/* append to said key in dictonary */
-static void append_key(struct httpd_request *r, const char *key,
-		const char *data, size_t off, size_t size)
-{
-	Jim_Obj *keyObj = Jim_NewStringObj(interp, key, -1);
-	Jim_Obj *value = NULL;
-
-	Jim_Obj *dict = Jim_GetVariableStr(interp, "httppostdata", 0);
-
-	if (dict!=NULL)
-	{
-		if (Jim_DictKey(interp, dict, keyObj, &value, 0) != JIM_OK)
-		{
-			 value = NULL;
-		}
-	}
-	if (value == NULL)
-		value = Jim_NewStringObj(interp, "", -1);
-
-	/* create a new object we append to and insert into this location */
-	Jim_Obj *newObj = Jim_NewStringObj(interp, "", -1);
-	Jim_AppendObj(interp, newObj, value);
-	Jim_AppendString(interp, newObj, data, size);
-	/* uhh... use name here of dictionary */
-	Jim_SetDictKeysVector(interp, Jim_NewStringObj(interp, "httppostdata", -1), &keyObj, 1, newObj);
-}
-
-/* append data to each key */
-static int iterate_post(void *con_cls, enum MHD_ValueKind kind,
-		const char *key, const char *filename, const char *content_type,
-		const char *transfer_encoding, const char *data, size_t off,
-		size_t size)
-{
-	struct httpd_request *r = (struct httpd_request*) con_cls;
-
-	append_key(r, key, data, off, size);
-
-	return MHD_YES;
-}
-
-static int record_arg(void *cls, enum MHD_ValueKind kind, const char *key,
-		const char *value)
-{
-	struct httpd_request *r = (struct httpd_request*) cls;
-	append_key(r, key, value, 0, strlen(value));
-	return MHD_YES;
-}
-
-static int ahc_echo(void * cls, struct MHD_Connection * connection,
-		const char * url, const char * method, const char * version,
-		const char * upload_data, unsigned int * upload_data_size, void ** ptr)
-{
-	struct MHD_Response * response;
-	int ret;
-
-	int post = 0;
-
-	if (0 == strcmp(method, "POST"))
-	{
-		post = 1;
-	}
-	else if (0 == strcmp(method, "GET"))
-	{
-	}
-	else
-	{
-		return MHD_NO; /* unexpected method */
-	}
-
-	struct httpd_request *r;
-	if (*ptr == NULL)
-	{
-		/* The first time only the headers are valid,
-		 do not respond in the first round... */
-
-		*ptr = malloc(sizeof(struct httpd_request));
-		if (*ptr == NULL)
-			return MHD_NO;
-		memset(*ptr, 0, sizeof(struct httpd_request));
-
-		r = (struct httpd_request *) *ptr;
-
-		r->post = post;
-		Jim_SetVariableStr(interp, "httppostdata", Jim_NewDictObj(interp, NULL, 0));
-
-		/* fill in url query strings in dictonary */
-		MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND,
-				record_arg, r);
-
-		if (r->post)
-		{
-			r->postprocessor = MHD_create_post_processor(connection, 2048
-					* 1024, iterate_post, r);
-		}
-
-		return MHD_YES;
-	}
-
-	r = (struct httpd_request *) *ptr;
-
-	if (r->post)
-	{
-		/* consume post data */
-		if (*upload_data_size)
-		{
-			MHD_post_process(r->postprocessor, upload_data, *upload_data_size);
-			*upload_data_size = 0;
-			return MHD_YES;
-		}
-		else
-		{
-		}
-	} else
-	{
-	}
-
-	/* hand over to request who will be using it. */
-	//	r->dict = NULL;
-
-
-	/* FIX!!!! we need more advanced handling of url's to avoid them
-	 * being subverted to evil purposes
-	 */
-
-	url++; /* skip '/' */
-
-	const char *suffix;
-	suffix = strrchr(url, '.');
-	if ((suffix != NULL) && (strcmp(suffix, ".tcl") == 0))
-	{
-		printf("Run tcl %s\n", url);
-
-		int retcode;
-
-		const char *script = alloc_printf(
-				"global httpdata; source {%s}; set httpdata", url);
-		retcode = Jim_Eval_Named(interp, script, "httpd.c", __LINE__ );
-		free((void *) script);
-
-		if (retcode == JIM_ERR)
-		{
-			printf("Tcl failed\n");
-			const char *t = httpd_exec_cgi_tcl_error(interp);
-			if (t == NULL)
-				return MHD_NO;
-
-			response = MHD_create_response_from_data(strlen(t), (void *) t,
-					MHD_YES, MHD_NO);
-			ret = MHD_queue_response(connection,
-					MHD_HTTP_INTERNAL_SERVER_ERROR, response);
-			MHD_destroy_response(response);
-			return ret;
-		}
-		else
-		{
-			printf("Tcl OK\n");
-			/* FIX!!! how to handle mime types??? */
-			const char *result;
-			int reslen;
-			result = Jim_GetString(Jim_GetResult(interp), &reslen);
-
-			response = MHD_create_response_from_data(reslen, (void *) result,
-					MHD_NO, MHD_YES);
-			ret = MHD_queue_response(connection,
-					MHD_HTTP_INTERNAL_SERVER_ERROR, response);
-			MHD_destroy_response(response);
-			return ret;
-		}
-	}
-	else
-	{
-		void *data;
-		int len;
-
-		int retval = loadFile(url, &data, &len);
-		if (retval != ERROR_OK)
-		{
-			printf("Did not find %s\n", url);
-
-			response = MHD_create_response_from_data(strlen(PAGE_NOT_FOUND),
-					(void *) PAGE_NOT_FOUND, MHD_NO, MHD_NO);
-			ret = MHD_queue_response(connection, MHD_HTTP_NOT_FOUND, response);
-			MHD_destroy_response(response);
-			return ret;
-		}
-
-		printf("Serving %s length=%d\n", url, len);
-		/* serve file directly */
-		response = MHD_create_response_from_data(len, data, MHD_YES, MHD_NO);
-		MHD_add_response_header(response, "Content-Type", "image/png");
-
-		ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
-		MHD_destroy_response(response);
-
-		//free(data);
-		return ret;
-	}
-}
-
-static struct MHD_Daemon * d;
-
-int httpd_start(void)
-{
-
-	int port = 8888;
-	LOG_USER("Launching httpd server on port %d", port);
-	d = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, port, NULL, NULL,
-			&ahc_echo, NULL, /* could be data for handler, but we only have a single handler, use global variables instead */
-			MHD_OPTION_NOTIFY_COMPLETED, request_completed, NULL, /* Closure... what's that??? */
-			MHD_OPTION_END);
-	if (d == NULL)
-		return ERROR_FAIL;
-
-	Jim_CreateCommand(interp,
-						  "formfetch",
-						  httpd_Jim_Command_formfetch,
-						  NULL,
-						  NULL);
-
-    Jim_CreateCommand(interp,
-                      "writeform",
-                      httpd_Jim_Command_writeform,
-                      NULL,
-                      NULL);
-
-
-	return ERROR_OK;
-}
-
-void httpd_stop(void)
-{
-	MHD_stop_daemon(d);
-}
-
-void openocd_sleep_prelude(void)
-{
-}
-
-void openocd_sleep_postlude(void)
-{
-}
-
+/***************************************************************************
+ *   Copyright (C) 2007,2008 �yvind Harboe                                 *
+ *   oyvind.harboe@zylin.com                                               *
+ *                                                                         *
+ *   Copyright (C) 2008 Free Software Foundation
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+/* some bits were copied from ahttpd which is under eCos license and
+ * copyright to FSF
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "replacements.h"
+
+#include "server.h"
+
+#include "log.h"
+#include "telnet_server.h"
+#include "target.h"
+
+#include <command.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/select.h>
+#include <sys/socket.h>
+#include <microhttpd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#define PAGE_NOT_FOUND "<html><head><title>File not found</title></head><body>File not found</body></html>"
+
+static const char *appendf(const *prev, const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	char *string = alloc_vprintf(format, ap);
+	va_end(ap);
+	char *string2 = NULL;
+
+	if (string != NULL)
+	{
+		string2 = alloc_printf("%s%s", (prev == NULL) ? "" : prev, string);
+	}
+
+	if (prev != NULL)
+	{
+		free(prev);
+	}
+
+	if (string == NULL)
+		free(string);
+
+	return string2;
+}
+
+static const char *httpd_exec_cgi_tcl_error(Jim_Interp *interp)
+{
+	int len, i;
+
+	const char *t = NULL;
+	t = appendf(t, "<html><body>\n");
+
+	t = appendf(t, "Runtime error, file \"%s\", line %d:<br>",
+			interp->errorFileName, interp->errorLine);
+	t = appendf(t, "    %s<br>", Jim_GetString(interp->result, NULL));
+	Jim_ListLength(interp, interp->stackTrace, &len);
+	for (i = 0; i < len; i += 3)
+	{
+		Jim_Obj *objPtr;
+		const char *proc, *file, *line;
+
+		Jim_ListIndex(interp, interp->stackTrace, i, &objPtr, JIM_NONE);
+		proc = Jim_GetString(objPtr, NULL);
+		Jim_ListIndex(interp, interp->stackTrace, i + 1, &objPtr, JIM_NONE);
+		file = Jim_GetString(objPtr, NULL);
+		Jim_ListIndex(interp, interp->stackTrace, i + 2, &objPtr, JIM_NONE);
+		line = Jim_GetString(objPtr, NULL);
+		t = appendf(t, "In procedure '%s' called at file \"%s\", line %s<br>",
+				proc, file, line);
+	}
+	t = appendf(t, "</html></body>\n");
+
+	return t;
+}
+
+static int httpd_Jim_Command_writeform(Jim_Interp *interp, int argc,
+		Jim_Obj * const *argv)
+{
+	if (argc != 3)
+	{
+		Jim_WrongNumArgs(interp, 1, argv, "method ?args ...?");
+		return JIM_ERR;
+	}
+	char *name = (char*) Jim_GetString(argv[1], NULL);
+	char *file = (char*) Jim_GetString(argv[2], NULL);
+
+	// Find length
+	char *data;
+	int actual;
+
+	int retcode;
+
+	const char *script = alloc_printf("set dummy_val $httppostdata(%s); set dummy_val",
+			name);
+	retcode = Jim_Eval_Named(interp, script, "httpd.c", __LINE__ );
+	free((void *) script);
+	if (retcode != JIM_OK)
+		return retcode;
+
+	data = Jim_GetString(Jim_GetResult(interp), &actual);
+
+	FILE *f;
+	f = fopen(file, "wb");
+	if (f != NULL)
+	{
+		int ok;
+		ok = fwrite(data, 1, actual, f) == actual;
+		fclose(f);
+
+		if (!ok)
+		{
+			Jim_SetResultString(interp, "Could not write to file", -1);
+			return JIM_ERR;
+		}
+	}
+	else
+	{
+		Jim_SetResultString(interp, "Could not create file", -1);
+		return JIM_ERR;
+	}
+	return JIM_OK;
+}
+
+
+int
+httpd_Jim_Command_formfetch(Jim_Interp *interp,
+                                   int argc,
+                                   Jim_Obj *const *argv)
+{
+    if (argc!=2)
+    {
+        Jim_WrongNumArgs(interp, 1, argv, "method ?args ...?");
+        return JIM_ERR;
+    }
+    char *name = (char*)Jim_GetString(argv[1], NULL);
+
+
+    const char *script = alloc_printf("set dummy_val $httppostdata(%s); set dummy_val",
+    			name);
+    	int retcode = Jim_Eval_Named(interp, script, "httpd.c", __LINE__ );
+    	free((void *) script);
+    	if (retcode != JIM_OK)
+    	{
+    	    Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
+    	} else
+    	{
+    	    Jim_SetResult(interp, Jim_GetResult(interp));
+    	}
+
+    return JIM_OK;
+}
+
+struct httpd_request
+{
+	int post;
+	struct MHD_PostProcessor *postprocessor;
+
+	//Jim_Obj *dict;
+
+	int complete; /* did we receive the entire post ? */
+
+};
+
+static void request_completed(void *cls, struct MHD_Connection *connection,
+		void **con_cls, enum MHD_RequestTerminationCode toe)
+{
+	struct httpd_request *r = (struct httpd_request*) *con_cls;
+
+	if (NULL == r)
+		return;
+
+	if (r->postprocessor)
+	{
+		MHD_destroy_post_processor(r->postprocessor);
+	}
+
+	free(r);
+	*con_cls = NULL;
+}
+
+/* append to said key in dictonary */
+static void append_key(struct httpd_request *r, const char *key,
+		const char *data, size_t off, size_t size)
+{
+	Jim_Obj *keyObj = Jim_NewStringObj(interp, key, -1);
+	Jim_Obj *value = NULL;
+
+	Jim_Obj *dict = Jim_GetVariableStr(interp, "httppostdata", 0);
+
+	if (dict!=NULL)
+	{
+		if (Jim_DictKey(interp, dict, keyObj, &value, 0) != JIM_OK)
+		{
+			 value = NULL;
+		}
+	}
+	if (value == NULL)
+		value = Jim_NewStringObj(interp, "", -1);
+
+	/* create a new object we append to and insert into this location */
+	Jim_Obj *newObj = Jim_NewStringObj(interp, "", -1);
+	Jim_AppendObj(interp, newObj, value);
+	Jim_AppendString(interp, newObj, data, size);
+	/* uhh... use name here of dictionary */
+	Jim_SetDictKeysVector(interp, Jim_NewStringObj(interp, "httppostdata", -1), &keyObj, 1, newObj);
+}
+
+/* append data to each key */
+static int iterate_post(void *con_cls, enum MHD_ValueKind kind,
+		const char *key, const char *filename, const char *content_type,
+		const char *transfer_encoding, const char *data, size_t off,
+		size_t size)
+{
+	struct httpd_request *r = (struct httpd_request*) con_cls;
+
+	append_key(r, key, data, off, size);
+
+	return MHD_YES;
+}
+
+static int record_arg(void *cls, enum MHD_ValueKind kind, const char *key,
+		const char *value)
+{
+	struct httpd_request *r = (struct httpd_request*) cls;
+	append_key(r, key, value, 0, strlen(value));
+	return MHD_YES;
+}
+
+static int ahc_echo(void * cls, struct MHD_Connection * connection,
+		const char * url, const char * method, const char * version,
+		const char * upload_data, unsigned int * upload_data_size, void ** ptr)
+{
+	struct MHD_Response * response;
+	int ret;
+
+	int post = 0;
+
+	if (0 == strcmp(method, "POST"))
+	{
+		post = 1;
+	}
+	else if (0 == strcmp(method, "GET"))
+	{
+	}
+	else
+	{
+		return MHD_NO; /* unexpected method */
+	}
+
+	struct httpd_request *r;
+	if (*ptr == NULL)
+	{
+		/* The first time only the headers are valid,
+		 do not respond in the first round... */
+
+		*ptr = malloc(sizeof(struct httpd_request));
+		if (*ptr == NULL)
+			return MHD_NO;
+		memset(*ptr, 0, sizeof(struct httpd_request));
+
+		r = (struct httpd_request *) *ptr;
+
+		r->post = post;
+		Jim_SetVariableStr(interp, "httppostdata", Jim_NewDictObj(interp, NULL, 0));
+
+		/* fill in url query strings in dictonary */
+		MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND,
+				record_arg, r);
+
+		if (r->post)
+		{
+			r->postprocessor = MHD_create_post_processor(connection, 2048
+					* 1024, iterate_post, r);
+		}
+
+		return MHD_YES;
+	}
+
+	r = (struct httpd_request *) *ptr;
+
+	if (r->post)
+	{
+		/* consume post data */
+		if (*upload_data_size)
+		{
+			MHD_post_process(r->postprocessor, upload_data, *upload_data_size);
+			*upload_data_size = 0;
+			return MHD_YES;
+		}
+		else
+		{
+		}
+	} else
+	{
+	}
+
+	/* hand over to request who will be using it. */
+	//	r->dict = NULL;
+
+
+	/* FIX!!!! we need more advanced handling of url's to avoid them
+	 * being subverted to evil purposes
+	 */
+
+	url++; /* skip '/' */
+
+	const char *suffix;
+	suffix = strrchr(url, '.');
+	if ((suffix != NULL) && (strcmp(suffix, ".tcl") == 0))
+	{
+		printf("Run tcl %s\n", url);
+
+		int retcode;
+
+		const char *script = alloc_printf(
+				"global httpdata; source {%s}; set httpdata", url);
+		retcode = Jim_Eval_Named(interp, script, "httpd.c", __LINE__ );
+		free((void *) script);
+
+		if (retcode == JIM_ERR)
+		{
+			printf("Tcl failed\n");
+			const char *t = httpd_exec_cgi_tcl_error(interp);
+			if (t == NULL)
+				return MHD_NO;
+
+			response = MHD_create_response_from_data(strlen(t), (void *) t,
+					MHD_YES, MHD_NO);
+			ret = MHD_queue_response(connection,
+					MHD_HTTP_INTERNAL_SERVER_ERROR, response);
+			MHD_destroy_response(response);
+			return ret;
+		}
+		else
+		{
+			printf("Tcl OK\n");
+			/* FIX!!! how to handle mime types??? */
+			const char *result;
+			int reslen;
+			result = Jim_GetString(Jim_GetResult(interp), &reslen);
+
+			response = MHD_create_response_from_data(reslen, (void *) result,
+					MHD_NO, MHD_YES);
+			ret = MHD_queue_response(connection,
+					MHD_HTTP_INTERNAL_SERVER_ERROR, response);
+			MHD_destroy_response(response);
+			return ret;
+		}
+	}
+	else
+	{
+		void *data;
+		int len;
+
+		int retval = loadFile(url, &data, &len);
+		if (retval != ERROR_OK)
+		{
+			printf("Did not find %s\n", url);
+
+			response = MHD_create_response_from_data(strlen(PAGE_NOT_FOUND),
+					(void *) PAGE_NOT_FOUND, MHD_NO, MHD_NO);
+			ret = MHD_queue_response(connection, MHD_HTTP_NOT_FOUND, response);
+			MHD_destroy_response(response);
+			return ret;
+		}
+
+		printf("Serving %s length=%d\n", url, len);
+		/* serve file directly */
+		response = MHD_create_response_from_data(len, data, MHD_YES, MHD_NO);
+		MHD_add_response_header(response, "Content-Type", "image/png");
+
+		ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
+		MHD_destroy_response(response);
+
+		//free(data);
+		return ret;
+	}
+}
+
+static struct MHD_Daemon * d;
+
+int httpd_start(void)
+{
+
+	int port = 8888;
+	LOG_USER("Launching httpd server on port %d", port);
+	d = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, port, NULL, NULL,
+			&ahc_echo, NULL, /* could be data for handler, but we only have a single handler, use global variables instead */
+			MHD_OPTION_NOTIFY_COMPLETED, request_completed, NULL, /* Closure... what's that??? */
+			MHD_OPTION_END);
+	if (d == NULL)
+		return ERROR_FAIL;
+
+	Jim_CreateCommand(interp,
+						  "formfetch",
+						  httpd_Jim_Command_formfetch,
+						  NULL,
+						  NULL);
+
+    Jim_CreateCommand(interp,
+                      "writeform",
+                      httpd_Jim_Command_writeform,
+                      NULL,
+                      NULL);
+
+
+	return ERROR_OK;
+}
+
+void httpd_stop(void)
+{
+	MHD_stop_daemon(d);
+}
+
+void openocd_sleep_prelude(void)
+{
+}
+
+void openocd_sleep_postlude(void)
+{
+}
+
diff --git a/src/target/interface/rlink.cfg b/src/target/interface/rlink.cfg
new file mode 100644
index 000000000..bb2c50efa
--- /dev/null
+++ b/src/target/interface/rlink.cfg
@@ -0,0 +1,3 @@
+# rlink interface
+interface rlink
+
diff --git a/tools/rlink_make_speed_table/rlink_make_speed_table.pl b/tools/rlink_make_speed_table/rlink_make_speed_table.pl
old mode 100644
new mode 100755
diff --git a/tools/st7_dtc_as/st7_dtc_as.pl b/tools/st7_dtc_as/st7_dtc_as.pl
old mode 100644
new mode 100755
-- 
GitLab