+#elif CONFIG_KDEBUG_PORT == 2
+
+ /*
+ * Support for special bus policies or external transceivers
+ * on UART2 (to be overridden in "hw/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_UART2_BUS_INIT
+ #define KDBG_UART2_BUS_INIT do { \
+ UCSR2B = BV(TXEN2); \
+ } while (0)
+ #endif
+ #ifndef KDBG_UART2_BUS_RX
+ #define KDBG_UART2_BUS_RX do {} while (0)
+ #endif
+ #ifndef KDBG_UART2_BUS_TX
+ #define KDBG_UART2_BUS_TX do {} while (0)
+ #endif
+
+ #define KDBG_WAIT_READY() do { loop_until_bit_is_set(UCSR2A, UDRE2); } while(0)
+ #define KDBG_WAIT_TXDONE() do { loop_until_bit_is_set(UCSR2A, TXC2); } while(0)
+ #define KDBG_WRITE_CHAR(c) do { UCSR2A |= BV(TXC2); UDR2 = (c); } while(0)
+
+ #define KDBG_MASK_IRQ(old) do { \
+ (old) = UCSR2B; \
+ UCSR2B |= BV(TXEN2); \
+ UCSR2B &= ~(BV(TXCIE2) | BV(UDRIE2)); \
+ KDBG_UART2_BUS_TX; \
+ } while(0)
+
+ #define KDBG_RESTORE_IRQ(old) do { \
+ KDBG_WAIT_TXDONE(); \
+ KDBG_UART2_BUS_RX; \
+ UCSR2B = (old); \
+ } while(0)
+
+ typedef uint8_t kdbg_irqsave_t;
+
+#elif CONFIG_KDEBUG_PORT == 3
+
+ /*
+ * Support for special bus policies or external transceivers
+ * on UART3 (to be overridden in "hw/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_UART3_BUS_INIT
+ #define KDBG_UART3_BUS_INIT do { \
+ UCSR3B = BV(TXEN3); \
+ } while (0)
+ #endif
+ #ifndef KDBG_UART3_BUS_RX
+ #define KDBG_UART3_BUS_RX do {} while (0)
+ #endif
+ #ifndef KDBG_UART3_BUS_TX
+ #define KDBG_UART3_BUS_TX do {} while (0)
+ #endif
+
+ #define KDBG_WAIT_READY() do { loop_until_bit_is_set(UCSR3A, UDRE3); } while(0)
+ #define KDBG_WAIT_TXDONE() do { loop_until_bit_is_set(UCSR3A, TXC3); } while(0)
+ #define KDBG_WRITE_CHAR(c) do { UCSR3A |= BV(TXC3); UDR3 = (c); } while(0)
+
+ #define KDBG_MASK_IRQ(old) do { \
+ (old) = UCSR3B; \
+ UCSR3B |= BV(TXEN3); \
+ UCSR3B &= ~(BV(TXCIE3) | BV(UDRIE3)); \
+ KDBG_UART3_BUS_TX; \
+ } while(0)
+
+ #define KDBG_RESTORE_IRQ(old) do { \
+ KDBG_WAIT_TXDONE(); \
+ KDBG_UART3_BUS_RX; \
+ UCSR3B = (old); \
+ } while(0)
+
+ typedef uint8_t kdbg_irqsave_t;
+
+