Switch from GPLv2 to GPLv2+
[fw/altos] / src / cc1111 / ao_dbg.c
index d4c9567fe519039ec28713dd97282c126c919b42..ca751b88122a567cb06569b0f9bd7c14f393566f 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -22,10 +23,10 @@ static void
 ao_dbg_send_bits(uint8_t msk, uint8_t val) __reentrant
 {
        DBG_PORT = (DBG_PORT & ~msk) | (val & msk);
-       _asm
+       __asm
                nop
                nop
-       _endasm;
+       __endasm;
 }
 
 void
@@ -187,60 +188,45 @@ ao_dbg_long_delay(void)
        uint8_t n;
 
        for (n = 0; n < 20; n++)
-               _asm nop _endasm;
+               __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)
+static void
+ao_dbg_send_bits_delay(uint8_t msk, uint8_t val)
 {
-       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);
+       ao_dbg_send_bits(msk, val);
 }
 
 void
-ao_dbg_reset(void)
+ao_dbg_do_reset(uint8_t clock_up)
 {
        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_send_bits_delay(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|DBG_RESET_N);
+       ao_dbg_send_bits_delay(DBG_CLOCK|DBG_DATA|DBG_RESET_N, clock_up |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_dbg_send_bits      (DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|    0    );
+       ao_dbg_send_bits_delay(DBG_CLOCK|DBG_DATA|DBG_RESET_N, clock_up |DBG_DATA|    0    );
+       ao_dbg_send_bits_delay(DBG_CLOCK|DBG_DATA|DBG_RESET_N, DBG_CLOCK|DBG_DATA|    0    );
+       ao_dbg_send_bits_delay(DBG_CLOCK|DBG_DATA|DBG_RESET_N, clock_up |DBG_DATA|DBG_RESET_N);
        ao_delay(AO_RESET_HIGH_DELAY);
 }
 
 static void
 debug_enable(void)
 {
-       ao_dbg_debug_mode();
+       /* toggle clock line while holding reset low */
+       ao_dbg_do_reset(0);
 }
 
 static void
 debug_reset(void)
 {
-       ao_dbg_reset();
+       /* hold clock high while holding reset low */
+       ao_dbg_do_reset(DBG_CLOCK);
 }
 
 static void
@@ -281,22 +267,6 @@ debug_get(void)
        putchar('\n');
 }
 
-static uint8_t
-getnibble(void)
-{
-       __pdata char    c;
-
-       c = getchar();
-       if ('0' <= c && c <= '9')
-               return c - '0';
-       if ('a' <= c && c <= 'f')
-               return c - ('a' - 10);
-       if ('A' <= c && c <= 'F')
-               return c - ('A' - 10);
-       ao_cmd_status = ao_cmd_lex_error;
-       return 0;
-}
-
 static void
 debug_input(void)
 {
@@ -338,8 +308,8 @@ debug_output(void)
                return;
        ao_dbg_start_transfer(addr);
        while (count--) {
-               b = getnibble() << 4;
-               b |= getnibble();
+               b = ao_getnibble() << 4;
+               b |= ao_getnibble();
                if (ao_cmd_status != ao_cmd_success)
                        return;
                ao_dbg_write_byte(b);