/** * \file * * * \brief LM3S debug support (implementation). * * \author Andrea Righi */ #include #include /* for BV() */ #include /* lm3s_busyWait() */ #include #include #include "kdebug_lm3s.h" #if CONFIG_KDEBUG_PORT == 0 #define UART_BASE UART0_BASE #define UART_GPIO_BASE GPIO_PORTA_BASE #define UART_PINS (BV(1) | BV(0)) #define UART_REG_SYSCTL SYSCTL_RCGC2_GPIOA #elif CONFIG_KDEBUG_PORT == 1 #define UART_BASE UART1_BASE #define UART_GPIO_BASE GPIO_PORTD_BASE #define UART_PINS (BV(3) | BV(2)) #define UART_REG_SYSCTL SYSCTL_RCGC2_GPIOD #elif CONFIG_KDEBUG_PORT == 2 #define UART_BASE UART2_BASE #define UART_GPIO_BASE GPIO_PORTG_BASE #define UART_PINS (BV(1) | BV(0)) #define UART_REG_SYSCTL SYSCTL_RCGC2_GPIOG #else #error "UART port not supported in this board" #endif #define KDBG_WAIT_READY() while (!lm3s_uartReady(UART_BASE)) {} #define KDBG_WAIT_TXDONE() while (!lm3s_uartTxDone(UART_BASE)) {} #define KDBG_WRITE_CHAR(c) do { lm3s_uartPutCharNonBlocking(UART_BASE, c); } while(0) /* Debug unit is used only for debug purposes so does not generate interrupts. */ #define KDBG_MASK_IRQ(old) do { (void)old; } while(0) /* Debug unit is used only for debug purposes so does not generate interrupts. */ #define KDBG_RESTORE_IRQ(old) do { (void)old; } while(0) typedef uint32_t kdbg_irqsave_t; INLINE void uart_hw_config(void) { unsigned long div, baud = CONFIG_KDEBUG_BAUDRATE; bool hi_speed = false; if (baud * 16 > CPU_FREQ) { hi_speed = true; baud /= 2; } div = (CPU_FREQ * 8 / baud + 1) / 2; lm3s_uartDisable(UART_BASE); if (hi_speed) HWREG(UART_BASE + UART_O_CTL) |= UART_CTL_HSE; else HWREG(UART_BASE + UART_O_CTL) &= ~UART_CTL_HSE; /* Set the baud rate */ HWREG(UART_BASE + UART_O_IBRD) = div / 64; HWREG(UART_BASE + UART_O_FBRD) = div % 64; /* Set word lenght and parity */ HWREG(UART_BASE + UART_O_LCRH) = UART_LCRH_WLEN_8; lm3s_uartClear(UART_BASE); lm3s_uartEnable(UART_BASE); } INLINE void kdbg_hw_init(void) { uint32_t reg_clock = 1 << CONFIG_KDEBUG_PORT; /* Enable the peripheral clock */ SYSCTL_RCGC1_R |= reg_clock; SYSCTL_RCGC2_R |= UART_REG_SYSCTL; lm3s_busyWait(512); /* Configure GPIO pins to work as UART pins */ lm3s_gpioPinConfig(UART_GPIO_BASE, UART_PINS, GPIO_DIR_MODE_HW, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); /* Low-level UART configuration */ uart_hw_config(); }