/* Set up the UART. */ static void dbgu_init(int minor) { console_tbl *console_entry; at91rm9200_dbgu_regs_t *dbgu; console_entry = BSP_get_uart_from_minor(minor); if (console_entry == NULL) { return; } dbgu = (at91rm9200_dbgu_regs_t *)console_entry->ulCtrlPort1; /* Clear error bits, and reset */ dbgu->cr = (DBGU_CR_RSTSTA | DBGU_CR_RSTTX | DBGU_CR_RSTRX); /* Clear pending interrupts */ dbgu->idr = DBGU_INT_ALL; dbgu->imr = 0; /* Set port to no parity, no loopback */ dbgu->mr = DBGU_MR_PAR_NONE | DBGU_MR_CHMODE_NORM; /* Set the baud rate */ dbgu->brgr = (at91rm9200_get_mck() / 16) / BSP_get_baud(); /* Enable the DBGU */ dbgu->cr = (DBGU_CR_TXEN | DBGU_CR_RXEN); }
/* This is for setting baud rate, bits, etc. */ static int usart_set_attributes(int minor, const struct termios *t) { uint32_t brgr; uint32_t mode, baud, baud_requested; at91rm9200_usart_regs_t *usart; usart = usart_get_base(minor); if ( !usart ) return -1; /* Get current mode register */ mode = usart->mr & ~(US_MR_USMODE | US_MR_USCLKS | US_MR_CHRL | US_MR_PAR | US_MR_NBSTOP); /* Byte size */ switch (t->c_cflag & CSIZE){ case CS5: mode |= US_MR_CHRL_5; break; case CS6: mode |= US_MR_CHRL_6; break; case CS7: mode |= US_MR_CHRL_7; break; default: mode |= US_MR_CHRL_8; break; } /* Stop bits */ if (t->c_cflag & CSTOPB){ mode |= US_MR_NBSTOP_2; /* 2 stop bits */ } else mode |= US_MR_NBSTOP_1; /* 1 stop bits */ /* Parity */ if (t->c_cflag & PARENB){ /* Mark or Space parity */ if (t->c_cflag & PARODD){ mode |= US_MR_PAR_ODD; } else mode |= US_MR_PAR_EVEN; } else mode |= US_MR_PAR_NONE; baud_requested = t->c_cflag & CBAUD; /* If not, set the dbgu console baud as USART baud default */ if (!baud_requested) baud_requested = BSP_get_baud(); baud = rtems_termios_baud_to_number(baud_requested); brgr = (at91rm9200_get_mck() / 16) / baud; if (brgr > 65535){ /* BRGR is 16-bit, so switch to slower clock */ brgr /= 8; mode |= US_MR_USCLKS_MCK_DIV8; } usart->mr = mode; usart->brgr = brgr; return 0; }