#include "config.h"
#endif
+#include <pthread.h>
+
#include <target/embeddedice.h>
#include <jtag/minidriver.h>
#include <jtag/interface.h>
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);
* idle in TAP_IDLE, reset halt on str912 will fail.
*/
ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000001);
+
+ waitSRST(true);
}
if (!trst)
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);
}
}
};
-#if !BUILD_ZY1000_MASTER || BUILD_ECOSBOARD
static int tcp_ip = -1;
/* Write large packets if we can */
*out_data = data;
return true;
}
-#endif
enum ZY1000_CMD
{
#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)
}
-static void tcpip_server(cyg_addrword_t data)
+static void *tcpip_server(void *data)
{
int so_reuseaddr_option = 1;
close(tcp_ip);
}
+ /* Never reached actually */
close(fd);
+ return NULL;
}
#ifdef WATCHDOG_BASE
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;