]> git.sur5r.net Git - openocd/commitdiff
- fix rlink build under native win32 (mingw)
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Fri, 19 Dec 2008 13:58:15 +0000 (13:58 +0000)
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Fri, 19 Dec 2008 13:58:15 +0000 (13:58 +0000)
- 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
src/jtag/rlink/init.m4
src/jtag/rlink/rlink.c
src/server/httpd.c
src/target/interface/rlink.cfg [new file with mode: 0644]
tools/rlink_make_speed_table/rlink_make_speed_table.pl [changed mode: 0644->0755]
tools/st7_dtc_as/st7_dtc_as.pl [changed mode: 0644->0755]

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