X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao_dbg.c;h=8a11a444a786c7c9058098cc48b4210282ea04c0;hp=11d8d50a22de5e0a1967a5bd32e4020d1e5a6344;hb=97cecb517cd7bf75e1219c76a93bfe6964c07052;hpb=43c8f7012102cdb591ace899420c10e4a78385ad diff --git a/ao_dbg.c b/ao_dbg.c index 11d8d50a..8a11a444 100644 --- a/ao_dbg.c +++ b/ao_dbg.c @@ -29,10 +29,12 @@ static void ao_dbg_send_bits(uint8_t msk, uint8_t val) { P0 = (P0 & ~msk) | (val & msk); + _asm + nop + nop + _endasm; } -#define ao_dbg_pause() do { _asm nop; nop; nop _endasm; } while (0); - void ao_dbg_send_byte(uint8_t byte) { @@ -46,9 +48,7 @@ ao_dbg_send_byte(uint8_t byte) d = DBG_DATA; byte <<= 1; ao_dbg_send_bits(DBG_CLOCK|DBG_DATA, DBG_CLOCK|d); - ao_dbg_pause(); ao_dbg_send_bits(DBG_CLOCK|DBG_DATA, 0 |d); - ao_dbg_pause(); } P0DIR &= ~DBG_DATA; } @@ -62,11 +62,9 @@ ao_dbg_recv_byte(void) for (b = 0; b < 8; b++) { byte = byte << 1; ao_dbg_send_bits(DBG_CLOCK, DBG_CLOCK); - ao_dbg_pause(); if (DBG_DATA_PIN) byte |= 1; ao_dbg_send_bits(DBG_CLOCK, 0); - ao_dbg_pause(); } return byte; } @@ -189,28 +187,51 @@ ao_dbg_set_pins(void) P0DIR = DBG_RESET_N | DBG_CLOCK; } +static void +ao_dbg_long_delay(void) +{ + uint8_t n; + + for (n = 0; n < 20; n++) + _asm nop _endasm; +} + void ao_dbg_debug_mode(void) { 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_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| 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_dbg_long_delay(); } void ao_dbg_reset(void) { 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_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| 0 ); + 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(); } static void @@ -266,7 +287,7 @@ debug_get(void) static uint8_t getnibble(void) { - __xdata uint8_t c; + __xdata char c; c = getchar(); if ('0' <= c && c <= '9') @@ -330,12 +351,12 @@ debug_output(void) } __code struct ao_cmds ao_dbg_cmds[7] = { - { 'D', debug_enable, "D Enable debug mode\n" }, - { 'G', debug_get, "G Get data from debug port\n" }, - { 'I', debug_input, "I Input bytes to target at \n" }, - { 'O', debug_output, "O Output bytes to target at \n" }, - { 'P', debug_put, "P ... Put data to debug port\n" }, - { 'R', debug_reset, "R Reset target\n" }, + { 'D', debug_enable, "D Enable debug mode" }, + { 'G', debug_get, "G Get data from debug port" }, + { 'I', debug_input, "I Input bytes to target at " }, + { 'O', debug_output, "O Output bytes to target at " }, + { 'P', debug_put, "P ... Put data to debug port" }, + { 'R', debug_reset, "R Reset target" }, { 0, debug_reset, 0 }, };