summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ccdbg-command.c6
-rw-r--r--lib/ccdbg-io.c12
-rw-r--r--lib/ccdbg.h9
3 files changed, 25 insertions, 2 deletions
diff --git a/lib/ccdbg-command.c b/lib/ccdbg-command.c
index d99e8ff3..74313bdf 100644
--- a/lib/ccdbg-command.c
+++ b/lib/ccdbg-command.c
@@ -27,11 +27,12 @@ ccdbg_debug_mode(struct ccdbg *dbg)
ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_DATA );
+ ccdbg_wait_reset(dbg);
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA );
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_DATA );
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA );
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_DATA|CC_RESET_N);
- ccdbg_sync_io(dbg);
+ ccdbg_wait_reset(dbg);
}
void
@@ -42,11 +43,12 @@ ccdbg_reset(struct ccdbg *dbg)
ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA );
+ ccdbg_wait_reset(dbg);
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA );
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA );
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA );
ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
- ccdbg_sync_io(dbg);
+ ccdbg_wait_reset(dbg);
}
uint8_t
diff --git a/lib/ccdbg-io.c b/lib/ccdbg-io.c
index e5e85e43..3606c57c 100644
--- a/lib/ccdbg-io.c
+++ b/lib/ccdbg-io.c
@@ -25,6 +25,7 @@
#endif
static uint32_t cc_clock_us = CC_CLOCK_US;
+static uint32_t cc_reset_us = CC_RESET_US;
void
ccdbg_set_clock(uint32_t us)
@@ -41,6 +42,17 @@ ccdbg_half_clock(struct ccdbg *dbg)
nanosleep(&req, &rem);
}
+void
+ccdbg_wait_reset(struct ccdbg *dbg)
+{
+ struct timespec req, rem;
+
+ ccdbg_sync_io(dbg);
+ req.tv_sec = (cc_reset_us) / 1000000;
+ req.tv_nsec = ((cc_reset_us) % 1000000) * 1000;
+ nanosleep(&req, &rem);
+}
+
struct ccdbg *
ccdbg_open(void)
{
diff --git a/lib/ccdbg.h b/lib/ccdbg.h
index 037d8ff5..8bc9444a 100644
--- a/lib/ccdbg.h
+++ b/lib/ccdbg.h
@@ -37,6 +37,12 @@
#define CC_RESET_N 0x4
#define CC_CLOCK_US (0)
+/* Telemetrum has a 10k pull-up to 3.3v, a 0.001uF cap to ground
+ * and a 2.7k resistor to the reset line. This takes about 6us
+ * to settle, so we'll wait longer than that after changing the reset line
+ */
+#define CC_RESET_US (12)
+
/* 8051 instructions
*/
#define NOP 0x00
@@ -264,6 +270,9 @@ ccdbg_set_clock(uint32_t us);
void
ccdbg_half_clock(struct ccdbg *dbg);
+void
+ccdbg_wait_reset(struct ccdbg *dbg);
+
int
ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);