]> git.sur5r.net Git - openocd/blobdiff - src/ecosboard.c
David Brownell <david-b@pacbell.net>:
[openocd] / src / ecosboard.c
index 62f7319db2465c8eb5bebe536f3b20fe7793e6b4..f8e327369921b450d708f8b472e11d28fb53edee 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2007-2008 by Øyvind Harboe                              *
+ *   Copyright (C) 2007-2008 by yvind Harboe                              *
  *                                                                         *
  *   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  *
@@ -93,7 +93,7 @@ struct tftpd_fileops fileops =
        (int (*)(const char *, int))open,
        close,
        (int (*)(int, const void *, int))write,
-       ( int (*)(int, void *, int))read
+       (int (*)(int, void *, int))read
 };
 
 #endif
@@ -173,6 +173,62 @@ void reboot(void)
        cyg_thread_resume(zylinjtag_thread_handle);
 }
 
+static char zylinjtag_reboot_port_stack[2048];
+static cyg_thread zylinjtag_reboot_port_thread_object;
+static cyg_handle_t zylinjtag_reboot_port_thread_handle;
+
+static void zylinjtag_reboot_port_task(cyg_addrword_t data)
+{
+       int so_reuseaddr_option = 1;
+
+       int fd;
+       if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+       {
+               LOG_ERROR("error creating socket: %s", strerror(errno));
+               exit(-1);
+       }
+
+       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*) &so_reuseaddr_option,
+                       sizeof(int));
+
+       struct sockaddr_in sin;
+       unsigned int address_size;
+       address_size = sizeof(sin);
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_family = AF_INET;
+       sin.sin_addr.s_addr = INADDR_ANY;
+       sin.sin_port = htons(1234);
+
+       if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) == -1)
+       {
+               LOG_ERROR("couldn't bind to socket: %s", strerror(errno));
+               exit(-1);
+       }
+
+       if (listen(fd, 1) == -1)
+       {
+               LOG_ERROR("couldn't listen on socket: %s", strerror(errno));
+               exit(-1);
+       }
+       //      socket_nonblock(fd);
+
+
+       accept(fd, (struct sockaddr *) &sin, &address_size);
+
+       diag_printf("Got reboot signal on port 1234");
+
+       reboot();
+
+}
+
+void reboot_port(void)
+{
+       cyg_thread_create(1, zylinjtag_reboot_port_task, (cyg_addrword_t) 0, "wait for reboot signal on port 1234",
+                       (void *) zylinjtag_reboot_port_stack, sizeof(zylinjtag_reboot_port_stack),
+                       &zylinjtag_reboot_port_thread_handle, &zylinjtag_reboot_port_thread_object);
+       cyg_thread_resume(zylinjtag_reboot_port_thread_handle);
+}
+
 int configuration_output_handler(struct command_context_s *context,
                const char* line)
 {
@@ -253,11 +309,11 @@ void copyfile(char *name2, char *name1);
 void copydir(char *name, char *destdir);
 
 #if 0
-MTAB_ENTRY( romfs_mte1,
+MTAB_ENTRY(romfs_mte1,
                "/rom",
                "romfs",
                "",
-               (CYG_ADDRWORD) &filedata[0] );
+               (CYG_ADDRWORD) &filedata[0]);
 #endif
 
 void openocd_sleep_prelude(void)
@@ -432,6 +488,10 @@ static void zylinjtag_startNetwork(void)
                diag_printf("Network not up and running\n");
                exit(-1);
        }
+
+       /* very first thing we want is a reboot capability */
+       reboot_port();
+
 #if defined(CYGPKG_NET_FREEBSD_STACK)
        /*start TFTP*/
        tftpd_start(69, &fileops);
@@ -1130,7 +1190,7 @@ static int tftpfs_fo_lseek(struct CYG_FILE_TAG *fp, off_t *apos, int whence);
 // For simplicity we use _FILESYSTEM synchronization for all accesses since
 // we should never block in any filesystem operations.
 #if 1
-FSTAB_ENTRY( tftpfs_fste, "tftpfs", 0,
+FSTAB_ENTRY(tftpfs_fste, "tftpfs", 0,
                CYG_SYNCMODE_NONE,
                tftpfs_mount,
                tftpfs_umount,
@@ -1151,12 +1211,12 @@ FSTAB_ENTRY( tftpfs_fste, "tftpfs", 0,
 // mtab entry.
 // This defines a single ROMFS loaded into ROM at the configured address
 //
-// MTAB_ENTRY( rom_mte,        // structure name
+// MTAB_ENTRY(rom_mte, // structure name
 //             "/rom",         // mount point
 //             "romfs",        // FIlesystem type
 //             "",             // hardware device
 //  (CYG_ADDRWORD) CYGNUM_FS_ROM_BASE_ADDRESS  // Address in ROM
-//           );
+//);
 
 
 // -------------------------------------------------------------------------
@@ -1459,7 +1519,7 @@ static int logfs_fo_close(struct CYG_FILE_TAG *fp);
 // This defines the entry in the filesystem table.
 // For simplicity we use _FILESYSTEM synchronization for all accesses since
 // we should never block in any filesystem operations.
-FSTAB_ENTRY( logfs_fste, "logfs", 0,
+FSTAB_ENTRY(logfs_fste, "logfs", 0,
                CYG_SYNCMODE_FILE_FILESYSTEM | CYG_SYNCMODE_IO_FILESYSTEM,
                logfs_mount,
                logfs_umount,