void
ao_dbg_send_byte(uint8_t byte)
{
- __xdata uint8_t b, d;
+ __pdata uint8_t b, d;
DBG_PORT |= DBG_DATA;
DBG_PORT_DIR |= DBG_DATA;
uint8_t
ao_dbg_recv_byte(void)
{
- __xdata uint8_t byte, b;
+ __pdata uint8_t byte, b;
byte = 0;
for (b = 0; b < 8; b++) {
#define SFR_DPL1 0x84
#define SFR_DPH1 0x85
-__xdata uint8_t save_acc;
-__xdata uint8_t save_psw;
-__xdata uint8_t save_dpl0;
-__xdata uint8_t save_dph0;
-__xdata uint8_t save_dpl1;
-__xdata uint8_t save_dph1;
+__pdata uint8_t save_acc;
+__pdata uint8_t save_psw;
+__pdata uint8_t save_dpl0;
+__pdata uint8_t save_dph0;
+__pdata uint8_t save_dpl1;
+__pdata uint8_t save_dph1;
static uint8_t
ao_dbg_inst1(uint8_t a) __reentrant
static void
ao_dbg_set_pins(void)
{
+ /* Make the DBG pins GPIOs. On TeleMetrum, this will
+ * disable the SPI link, so don't expect SPI to work after
+ * using the debugger.
+ */
+ DBG_PORT_SEL &= ~(DBG_CLOCK|DBG_DATA|DBG_RESET_N);
+
/* make DBG_DATA tri-state */
DBG_PORT_INP |= DBG_DATA;
DBG_PORT_DIR &= ~DBG_DATA;
}
-#define ao_reset_delay() ao_delay(AO_MS_TO_TICKS(20))
+static void
+ao_dbg_long_delay(void)
+{
+ uint8_t n;
+
+ for (n = 0; n < 20; n++)
+ _asm nop _endasm;
+}
+
+#define AO_RESET_LOW_DELAY AO_MS_TO_TICKS(100)
+#define AO_RESET_HIGH_DELAY AO_MS_TO_TICKS(100)
void
ao_dbg_debug_mode(void)
{
- ao_dbg_set_pins(); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|DBG_RESET_N); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 ); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, 0 |DBG_DATA| 0 ); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 ); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, 0 |DBG_DATA| 0 ); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 ); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|DBG_RESET_N); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, 0 |DBG_DATA|DBG_RESET_N); ao_reset_delay();
+ ao_dbg_set_pins();
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|DBG_RESET_N);
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, 0 |DBG_DATA| 0 );
+ ao_delay(AO_RESET_LOW_DELAY);
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 );
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, 0 |DBG_DATA| 0 );
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 );
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, 0 |DBG_DATA|DBG_RESET_N);
+ ao_delay(AO_RESET_HIGH_DELAY);
}
void
ao_dbg_reset(void)
{
- ao_dbg_set_pins(); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|DBG_RESET_N); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 ); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|DBG_RESET_N); ao_reset_delay();
- ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, 0 |DBG_DATA|DBG_RESET_N); ao_reset_delay();
+ ao_dbg_set_pins();
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|DBG_RESET_N);
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 );
+ ao_delay(AO_RESET_LOW_DELAY);
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 );
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 );
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA| 0 );
+ ao_dbg_long_delay();
+ ao_dbg_send_bits(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|DBG_RESET_N);
+ ao_delay(AO_RESET_HIGH_DELAY);
}
static void
static void
debug_get(void)
{
- __xdata uint16_t count;
- __xdata uint16_t i;
- __xdata uint8_t byte;
+ __pdata uint16_t count;
+ __pdata uint16_t i;
+ __pdata uint8_t byte;
ao_cmd_hex();
if (ao_cmd_status != ao_cmd_success)
return;
static uint8_t
getnibble(void)
{
- __xdata char c;
+ __pdata char c;
c = getchar();
if ('0' <= c && c <= '9')
static void
debug_input(void)
{
- __xdata uint16_t count;
- __xdata uint16_t addr;
- __xdata uint8_t b;
- __xdata uint8_t i;
+ __pdata uint16_t count;
+ __pdata uint16_t addr;
+ __pdata uint8_t b;
+ __pdata uint8_t i;
ao_cmd_hex();
count = ao_cmd_lex_i;
static void
debug_output(void)
{
- __xdata uint16_t count;
- __xdata uint16_t addr;
- __xdata uint8_t b;
+ __pdata uint16_t count;
+ __pdata uint16_t addr;
+ __pdata uint8_t b;
ao_cmd_hex();
count = ao_cmd_lex_i;
}
__code struct ao_cmds ao_dbg_cmds[7] = {
- { 'D', debug_enable, "D Enable debug mode" },
- { 'G', debug_get, "G <count> Get data from debug port" },
- { 'I', debug_input, "I <count> <addr> Input <count> bytes to target at <addr>" },
- { 'O', debug_output, "O <count> <addr> Output <count> bytes to target at <addr>" },
- { 'P', debug_put, "P <byte> ... Put data to debug port" },
- { 'R', debug_reset, "R Reset target" },
- { 0, debug_reset, 0 },
+ { debug_enable, "D\0Enable debug" },
+ { debug_get, "G <count>\0Get data" },
+ { debug_input, "I <count> <addr>\0Input <count> at <addr>" },
+ { debug_output, "O <count> <addr>\0Output <count> at <addr>" },
+ { debug_put, "P <byte> ...\0Put data" },
+ { debug_reset, "R\0Reset" },
+ { 0, NULL },
};
void