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
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
#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)
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)
{
#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
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);