summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-03-06 22:52:35 -0800
committerKeith Packard <keithp@keithp.com>2009-03-06 22:56:47 -0800
commitcc0495b7028f4b1189a00707d828a68534d1dea2 (patch)
treea7727c8af99af7781f801a00235a6b9fb8d107f1
parent41289e6d8f1767547a33fea349866e928e44910f (diff)
Wait for a while when switching the RESET_N line
The cc1111 manual suggests placing a 2.7kΩ resister and 1nF capacitor on the RESET_N line to filter out noise. This increases the time necessary to reset the chip to several microseconds which is longer than the interval between two USB packets. Flush the USB packet queue and sleep for a while after changing the value on the RESET_N line to make sure the chip sees the state change. Signed-off-by: Keith Packard <keithp@keithp.com>
-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);