#include "ccdbg.h"
-void
-ccdbg_debug_mode(struct ccdbg *dbg)
-{
- /* force two rising clocks while holding RESET_N low */
- ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
- ccdbg_debug(CC_DEBUG_COMMAND, "# Debug mode\n");
- 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_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);
-}
-
-void
-ccdbg_reset(struct ccdbg *dbg)
-{
- ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
- ccdbg_debug(CC_DEBUG_COMMAND, "# Reset\n");
- 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_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);
-}
-
uint8_t
ccdbg_chip_erase(struct ccdbg *dbg)
{
uint16_t
ccdbg_get_pc(struct ccdbg *dbg)
{
- return ccdbg_cmd_write_read16(dbg, CC_GET_PC, NULL, 0);
+ uint16_t pc1, pc2;
+
+ pc1 = ccdbg_cmd_write_read16(dbg, CC_GET_PC, NULL, 0);
+ pc2 = ccdbg_cmd_write_read16(dbg, CC_GET_PC, NULL, 0);
+ if (pc1 != pc2)
+ fprintf (stderr, "Invalid pc %04x != %04x\n",
+ pc1, pc2);
+ return pc2;
}
uint8_t
return ccdbg_cmd_write_read8(dbg, CC_DEBUG_INSTR(nbytes), instr, nbytes);
}
+void
+ccdbg_debug_instr_discard(struct ccdbg *dbg, uint8_t *instr, int nbytes)
+{
+ static uint8_t discard;
+ ccdbg_cmd_write_queue8(dbg, CC_DEBUG_INSTR(nbytes),
+ instr, nbytes, &discard);
+}
+
+void
+ccdbg_debug_instr_queue(struct ccdbg *dbg, uint8_t *instr, int nbytes,
+ uint8_t *reply)
+{
+ return ccdbg_cmd_write_queue8(dbg, CC_DEBUG_INSTR(nbytes),
+ instr, nbytes, reply);
+}
+
uint8_t
ccdbg_step_instr(struct ccdbg *dbg)
{
ccdbg_debug(CC_DEBUG_INSTRUCTIONS, "\t%02x", inst[1]);
for (i = 0; i < len - 1; i++)
ccdbg_debug(CC_DEBUG_INSTRUCTIONS, " %02x", inst[i+2]);
- status = ccdbg_debug_instr(dbg, inst+1, len);
+ ccdbg_debug_instr_queue(dbg, inst+1, len, &status);
for (; i < 3; i++)
ccdbg_debug(CC_DEBUG_INSTRUCTIONS, " ");
ccdbg_debug(CC_DEBUG_INSTRUCTIONS, " -> %02x\n", status);
inst += len + 1;
}
+ ccdbg_sync(dbg);
return status;
}