static int atmel_serial_pending(struct udevice *dev, bool input) { struct atmel_serial_priv *priv = dev_get_priv(dev); uint32_t csr = readl(&priv->usart->csr); if (input) return csr & USART3_BIT(RXRDY) ? 1 : 0; else return csr & USART3_BIT(TXEMPTY) ? 0 : 1; }
static void atmel_serial_init_internal(atmel_usart3_t *usart) { /* * Just in case: drain transmitter register * 1000us is enough for baudrate >= 9600 */ if (!(readl(&usart->csr) & USART3_BIT(TXEMPTY))) __udelay(1000); writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), &usart->cr); }
static void atmel_serial_activate(atmel_usart3_t *usart) { writel((USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL) | USART3_BF(USCLKS, USART3_USCLKS_MCK) | USART3_BF(CHRL, USART3_CHRL_8) | USART3_BF(PAR, USART3_PAR_NONE) | USART3_BF(NBSTOP, USART3_NBSTOP_1)), &usart->mr); writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), &usart->cr); /* 100us is enough for the new settings to be settled */ __udelay(100); }
int serial_init(void) { usart3_writel(CR, USART3_BIT(RSTRX) | USART3_BIT(RSTTX)); serial_setbrg(); usart3_writel(CR, USART3_BIT(RXEN) | USART3_BIT(TXEN)); usart3_writel(MR, (USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL) | USART3_BF(USCLKS, USART3_USCLKS_MCK) | USART3_BF(CHRL, USART3_CHRL_8) | USART3_BF(PAR, USART3_PAR_NONE) | USART3_BF(NBSTOP, USART3_NBSTOP_1))); return 0; }
void serial_putc(char c) { if (c == '\n') serial_putc('\r'); while (!(usart3_readl(CSR) & USART3_BIT(TXRDY))) ; usart3_writel(THR, c); }
static int atmel_serial_getc(void) { atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; while (!(readl(&usart->csr) & USART3_BIT(RXRDY))) WATCHDOG_RESET(); return readl(&usart->rhr); }
static inline void _debug_uart_putc(int ch) { atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_DEBUG_UART_BASE; while (!(readl(&usart->csr) & USART3_BIT(TXRDY))) ; writel(ch, &usart->thr); }
static int atmel_serial_getc(struct udevice *dev) { struct atmel_serial_priv *priv = dev_get_priv(dev); if (!(readl(&priv->usart->csr) & USART3_BIT(RXRDY))) return -EAGAIN; return readl(&priv->usart->rhr); }
static void atmel_serial_putc(char c) { atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; if (c == '\n') serial_putc('\r'); while (!(readl(&usart->csr) & USART3_BIT(TXRDY))); writel(c, &usart->thr); }
static int atmel_serial_putc(struct udevice *dev, const char ch) { struct atmel_serial_priv *priv = dev_get_priv(dev); if (!(readl(&priv->usart->csr) & USART3_BIT(TXRDY))) return -EAGAIN; writel(ch, &priv->usart->thr); return 0; }
void _atmel_serial_init(atmel_usart3_t *usart, ulong usart_clk_rate, int baudrate) { writel(USART3_BIT(RXDIS) | USART3_BIT(TXDIS), &usart->cr); writel((USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL) | USART3_BF(USCLKS, USART3_USCLKS_MCK) | USART3_BF(CHRL, USART3_CHRL_8) | USART3_BF(PAR, USART3_PAR_NONE) | USART3_BF(NBSTOP, USART3_NBSTOP_1)), &usart->mr); _atmel_serial_set_brg(usart, usart_clk_rate, baudrate); writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), &usart->cr); writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), &usart->cr); }
int serial_tstc(void) { return (usart3_readl(CSR) & USART3_BIT(RXRDY)) != 0; }
int serial_getc(void) { while (!(usart3_readl(CSR) & USART3_BIT(RXRDY))) WATCHDOG_RESET(); return usart3_readl(RHR); }
int serial_tstc(void) { return (usart3_readl(gd->console_uart, CSR) & USART3_BIT(RXRDY)) != 0; }
int serial_getc(void) { while (!(usart3_readl(gd->console_uart, CSR) & USART3_BIT(RXRDY))) ; return usart3_readl(gd->console_uart, RHR); }
static int atmel_serial_tstc(void) { atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; return (readl(&usart->csr) & USART3_BIT(RXRDY)) != 0; }