X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fzy1000%2Fzy1000.c;h=f2db47b3ad683bde43322d2570810bfc598163a2;hb=558f760ff06c499b4525dcb4ba731f585256dacb;hp=f972191731c751f33b6f4b01509d1a606207af83;hpb=2321bb3c42b1d47374e51d9e5aa548a37a70b53a;p=openocd.git diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index f972191731..f2db47b3ad 100644 --- a/src/jtag/zy1000/zy1000.c +++ b/src/jtag/zy1000/zy1000.c @@ -45,6 +45,8 @@ #include "config.h" #endif +#include + #include #include #include @@ -170,6 +172,45 @@ static int zy1000_power_dropout(int *dropout) return ERROR_OK; } +/* Wait for SRST to assert or deassert */ +static void waitSRST(bool asserted) +{ + bool first = true; + long long start = 0; + long total = 0; + const char *mode = asserted ? "assert" : "deassert"; + + for (;;) + { + bool srstAsserted = readSRST(); + if ( (asserted && srstAsserted) || (!asserted && !srstAsserted) ) + { + if (total > 1) + { + LOG_USER("SRST took %dms to %s", (int)total, mode); + } + break; + } + + if (first) + { + first = false; + start = timeval_ms(); + } + + total = timeval_ms() - start; + + keep_alive(); + + if (total > 5000) + { + LOG_ERROR("SRST took too long to %s: %dms", mode, (int)total); + break; + } + } +} + + void zy1000_reset(int trst, int srst) { LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst); @@ -190,6 +231,8 @@ void zy1000_reset(int trst, int srst) * idle in TAP_IDLE, reset halt on str912 will fail. */ ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000001); + + waitSRST(true); } if (!trst) @@ -216,40 +259,7 @@ void zy1000_reset(int trst, int srst) if ((!srst && ((jtag_get_reset_config() & RESET_TRST_PULLS_SRST) == 0))|| (!srst && !trst && (jtag_get_reset_config() & RESET_TRST_PULLS_SRST))) { - bool first = true; - long long start = 0; - long total = 0; - for (;;) - { - // We don't want to sense our own reset, so we clear here. - // There is of course a timing hole where we could loose - // a "real" reset. - if (!readSRST()) - { - if (total > 1) - { - LOG_USER("SRST took %dms to deassert", (int)total); - } - break; - } - - if (first) - { - first = false; - start = timeval_ms(); - } - - total = timeval_ms() - start; - - keep_alive(); - - if (total > 5000) - { - LOG_ERROR("SRST took too long to deassert: %dms", (int)total); - break; - } - } - + waitSRST(false); } } @@ -1026,7 +1036,6 @@ static const struct command_registration zy1000_commands[] = { }; -#if !BUILD_ZY1000_MASTER || BUILD_ECOSBOARD static int tcp_ip = -1; /* Write large packets if we can */ @@ -1098,7 +1107,6 @@ static bool readLong(uint32_t *out_data) *out_data = data; return true; } -#endif enum ZY1000_CMD { @@ -1353,14 +1361,15 @@ static void writeShiftValue(uint8_t *data, int bits) #endif -#if BUILD_ECOSBOARD -static char tcpip_stack[2048]; -static cyg_thread tcpip_thread_object; -static cyg_handle_t tcpip_thread_handle; +#if BUILD_ZY1000_MASTER +pthread_t thread; + +#if BUILD_ECOSBOARD static char watchdog_stack[2048]; static cyg_thread watchdog_thread_object; static cyg_handle_t watchdog_thread_handle; +#endif /* Infinite loop peeking & poking */ static void tcpipserver(void) @@ -1412,7 +1421,7 @@ static void tcpipserver(void) } -static void tcpip_server(cyg_addrword_t data) +static void *tcpip_server(void *data) { int so_reuseaddr_option = 1; @@ -1474,8 +1483,10 @@ static void tcpip_server(cyg_addrword_t data) close(tcp_ip); } + /* Never reached actually */ close(fd); + return NULL; } #ifdef WATCHDOG_BASE @@ -1616,18 +1627,17 @@ int zy1000_init(void) return retval; zy1000_speed(jtag_speed_var); +#if BUILD_ZY1000_MASTER + pthread_create(&thread, NULL, tcpip_server, NULL); #if BUILD_ECOSBOARD - cyg_thread_create(1, tcpip_server, (cyg_addrword_t) 0, "tcip/ip server", - (void *) tcpip_stack, sizeof(tcpip_stack), - &tcpip_thread_handle, &tcpip_thread_object); - cyg_thread_resume(tcpip_thread_handle); #ifdef WATCHDOG_BASE cyg_thread_create(1, watchdog_server, (cyg_addrword_t) 0, "watchdog tcip/ip server", (void *) watchdog_stack, sizeof(watchdog_stack), &watchdog_thread_handle, &watchdog_thread_object); cyg_thread_resume(watchdog_thread_handle); #endif +#endif #endif return ERROR_OK;