- #define KDBG_WAIT_READY() do { loop_until_bit_is_set(UCSR1A, UDRE); } while(0)
- #define KDBG_WRITE_CHAR(c) do { UCSR1B |= BV(TXEN); UDR1 = (c); } while(0)
- #define KDBG_MASK_IRQ(old) do { (old) = UCSR1B & BV(TXCIE); cbi(UCSR1B, TXCIE); } while(0)
- #define KDBG_RESTORE_IRQ(old) do { UCSR1B |= (old); } while(0)
+
+ /*
+ * Support for special bus policies or external transceivers
+ * on UART1 (to be overridden in "hw_ser.h").
+ *
+ * HACK: if we don't set TXEN, kdbg disables the transmitter
+ * after each output statement until the serial driver
+ * is initialized. These glitches confuse the debug
+ * terminal that ends up printing some trash.
+ */
+ #ifndef KDBG_UART1_BUS_INIT
+ #define KDBG_UART1_BUS_INIT do { \
+ UCSR1B = BV(TXEN1); \
+ } while (0)
+ #endif
+ #ifndef KDBG_UART1_BUS_RX
+ #define KDBG_UART1_BUS_RX do {} while (0)
+ #endif
+ #ifndef KDBG_UART1_BUS_TX
+ #define KDBG_UART1_BUS_TX do {} while (0)
+ #endif
+
+ #define KDBG_WAIT_READY() do { loop_until_bit_is_set(UCSR1A, UDRE1); } while(0)
+ #define KDBG_WAIT_TXDONE() do { loop_until_bit_is_set(UCSR1A, TXC1); } while(0)
+ #define KDBG_WRITE_CHAR(c) do { UCSR1A |= BV(TXC1); UDR1 = (c); } while(0)
+
+ #define KDBG_MASK_IRQ(old) do { \
+ (old) = UCSR1B; \
+ UCSR1B |= BV(TXEN1); \
+ UCSR1B &= ~(BV(TXCIE1) | BV(UDRIE1)); \
+ KDBG_UART1_BUS_TX; \
+ } while(0)
+
+ #define KDBG_RESTORE_IRQ(old) do { \
+ KDBG_WAIT_TXDONE(); \
+ KDBG_UART1_BUS_RX; \
+ UCSR1B = (old); \
+ } while(0)
+
+ typedef uint8_t kdbg_irqsave_t;
+
+ /*
+ * Special debug port for BitBanged Serial see below for details...
+ */
+ #elif CONFIG_KDEBUG_PORT == 666
+ #include "hw_ser.h"
+ #define KDBG_WAIT_READY() do { /*nop*/ } while(0)
+ #define KDBG_WRITE_CHAR(c) _kdebug_bitbang_putchar((c))
+ #define KDBG_MASK_IRQ(old) do { IRQ_SAVE_DISABLE((old)); } while(0)
+ #define KDBG_RESTORE_IRQ(old) do { IRQ_RESTORE((old)); } while(0)
+ typedef cpuflags_t kdbg_irqsave_t;
+
+ #define KDBG_DELAY (((CLOCK_FREQ + CONFIG_KDEBUG_BAUDRATE / 2) / CONFIG_KDEBUG_BAUDRATE) + 7) / 14
+
+ static void _kdebug_bitbang_delay(void)
+ {
+ unsigned long i;
+
+ for (i = 0; i < KDBG_DELAY; i++)
+ {
+ NOP;
+ NOP;
+ NOP;
+ NOP;
+ NOP;
+ }
+ }