X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fecosboard.c;h=b0f9525a92fd6df8d5d50ab5f21798a2b8fad859;hp=937da9220047760165a2c4f2471ad5e3c5a7e916;hb=a9abfa7d06dbcfded97b7fb41f50d3581c24fbae;hpb=dc575dc5bf8cb597a0e9a47794744ae6b1928087 diff --git a/src/ecosboard.c b/src/ecosboard.c index 937da92200..b0f9525a92 100644 --- a/src/ecosboard.c +++ b/src/ecosboard.c @@ -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 * @@ -155,8 +155,8 @@ static char reboot_stack[2048]; static void zylinjtag_reboot(cyg_addrword_t data) { serialLog = true; - diag_printf("Rebooting in 100 ticks..\n"); - cyg_thread_delay(100); + diag_printf("Rebooting in 500 ticks..\n"); + cyg_thread_delay(500); diag_printf("Unmounting /config..\n"); umount("/config"); diag_printf("Rebooting..\n"); @@ -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) { @@ -272,6 +328,7 @@ void openocd_sleep_postlude(void) void format(void) { +#ifdef CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1 diag_printf("Formatting JFFS2...\n"); cyg_io_handle_t handle; @@ -309,6 +366,7 @@ void format(void) } diag_printf("Flash formatted successfully\n"); +#endif reboot(); } @@ -416,7 +474,6 @@ static int zylinjtag_Jim_Command_reboot(Jim_Interp *interp, int argc, return JIM_OK; } - static void zylinjtag_startNetwork(void) { // Bring TCP/IP up immediately before we're ready to accept commands. @@ -432,6 +489,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); @@ -443,7 +504,7 @@ static void zylinjtag_startNetwork(void) Jim_CreateCommand(httpstate.jim_interp, "log", zylinjtag_Jim_Command_log, NULL, NULL); - Jim_CreateCommand(httpstate.jim_interp, "reboot", + Jim_CreateCommand(httpstate.jim_interp, "zy1000_reboot", zylinjtag_Jim_Command_reboot, NULL, NULL); Jim_CreateCommand(httpstate.jim_interp, "threads", zylinjtag_Jim_Command_threads, NULL, NULL); @@ -529,6 +590,7 @@ static void print_exception_handler(cyg_addrword_t data, cyg_code_t exception, } +#ifdef CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION static void setHandler(cyg_code_t exception) { cyg_exception_handler_t *old_handler; @@ -537,6 +599,7 @@ static void setHandler(cyg_code_t exception) cyg_exception_set_handler(exception, print_exception_handler, 0, &old_handler, &old_data); } +#endif static cyg_thread zylinjtag_uart_thread_object; static cyg_handle_t zylinjtag_uart_thread_handle; @@ -563,6 +626,9 @@ void setNoDelay(int session, int flag) #endif } +#define TEST_TCPIP() 0 + +#if TEST_TCPIP struct { int req; @@ -571,6 +637,7 @@ struct int actual2; } tcpipSent[512 * 1024]; int cur; +#endif static void zylinjtag_uart(cyg_addrword_t data) { @@ -635,7 +702,9 @@ static void zylinjtag_uart(cyg_addrword_t data) size_t pos, pos2; pos = 0; pos2 = 0; +#if TEST_TCPIP cur = 0; +#endif for (;;) { fd_set write_fds; @@ -680,7 +749,6 @@ static void zylinjtag_uart(cyg_addrword_t data) pos2 = 0; } - size_t x = actual2; size_t y = 0; if (actual2 > 0) { @@ -710,7 +778,6 @@ static void zylinjtag_uart(cyg_addrword_t data) actual += t; } - int x2 = actual; int y2 = 0; if (actual > 0) { @@ -736,6 +803,7 @@ static void zylinjtag_uart(cyg_addrword_t data) } y2 = written; } +#if TEST_TCPIP if (cur < 1024) { tcpipSent[cur].req = x; @@ -744,11 +812,12 @@ static void zylinjtag_uart(cyg_addrword_t data) tcpipSent[cur].actual2 = y2; cur++; } - +#endif } closeSession: close(session); close(serHandle); +#if TEST_TCPIP int i; for (i = 0; i < 1024; i++) { @@ -756,6 +825,7 @@ static void zylinjtag_uart(cyg_addrword_t data) tcpipSent[i].req2, tcpipSent[i].actual2); } +#endif } close(fd); @@ -858,7 +928,7 @@ command_context_t *setup_command_handler(void); static const char *zylin_config_dir="/config/settings"; -int add_default_dirs(void) +static int add_default_dirs(void) { add_script_search_dir(zylin_config_dir); add_script_search_dir("/rom/lib/openocd");