forked from Imagelibrary/rtems
LEON3: add console attributes such as parity and baudrate
Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
This commit is contained in:
committed by
Gedare Bloom
parent
6845f8005c
commit
07557c86fd
@@ -13,8 +13,6 @@
|
|||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
* found in the file LICENSE in this distribution or at
|
* found in the file LICENSE in this distribution or at
|
||||||
* http://www.rtems.com/license/LICENSE.
|
* http://www.rtems.com/license/LICENSE.
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <bsp.h>
|
#include <bsp.h>
|
||||||
@@ -102,6 +100,73 @@ int console_pollRead(int minor)
|
|||||||
return apbuart_inbyte_nonblocking(apbuarts[port].regs);
|
return apbuart_inbyte_nonblocking(apbuarts[port].regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int console_set_attributes(int minor, const struct termios *t)
|
||||||
|
{
|
||||||
|
unsigned int scaler;
|
||||||
|
unsigned int ctrl;
|
||||||
|
int baud;
|
||||||
|
struct apbuart_priv *uart;
|
||||||
|
|
||||||
|
switch (t->c_cflag & CSIZE) {
|
||||||
|
default:
|
||||||
|
case CS5:
|
||||||
|
case CS6:
|
||||||
|
case CS7:
|
||||||
|
/* Hardware doesn't support other than CS8 */
|
||||||
|
return -1;
|
||||||
|
case CS8:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minor == 0)
|
||||||
|
uart = &apbuarts[syscon_uart_index];
|
||||||
|
else
|
||||||
|
uart = &apbuarts[minor - 1];
|
||||||
|
|
||||||
|
/* Read out current value */
|
||||||
|
ctrl = uart->regs->ctrl;
|
||||||
|
|
||||||
|
switch (t->c_cflag & (PARENB|PARODD)) {
|
||||||
|
case (PARENB|PARODD):
|
||||||
|
/* Odd parity */
|
||||||
|
ctrl |= LEON_REG_UART_CTRL_PE|LEON_REG_UART_CTRL_PS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PARENB:
|
||||||
|
/* Even parity */
|
||||||
|
ctrl &= ~LEON_REG_UART_CTRL_PS;
|
||||||
|
ctrl |= LEON_REG_UART_CTRL_PE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case 0:
|
||||||
|
case PARODD:
|
||||||
|
/* No Parity */
|
||||||
|
ctrl &= ~(LEON_REG_UART_CTRL_PS|LEON_REG_UART_CTRL_PE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(t->c_cflag & CLOCAL)) {
|
||||||
|
ctrl |= LEON_REG_UART_CTRL_FL;
|
||||||
|
} else {
|
||||||
|
ctrl &= ~LEON_REG_UART_CTRL_FL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update new settings */
|
||||||
|
uart->regs->ctrl = ctrl;
|
||||||
|
|
||||||
|
/* Baud rate */
|
||||||
|
baud = rtems_termios_baud_to_number(t->c_cflag);
|
||||||
|
if (baud > 0) {
|
||||||
|
/* Calculate Baud rate generator "scaler" number */
|
||||||
|
scaler = (((uart->freq_hz * 10) / (baud * 8)) - 5) / 10;
|
||||||
|
|
||||||
|
/* Set new baud rate by setting scaler */
|
||||||
|
uart->regs->scaler = scaler;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* AMBA PP find routine. Extract AMBA PnP information into data structure. */
|
/* AMBA PP find routine. Extract AMBA PnP information into data structure. */
|
||||||
int find_matching_apbuart(struct ambapp_dev *dev, int index, void *arg)
|
int find_matching_apbuart(struct ambapp_dev *dev, int index, void *arg)
|
||||||
{
|
{
|
||||||
@@ -208,7 +273,7 @@ rtems_device_driver console_open(
|
|||||||
NULL, /* lastClose */
|
NULL, /* lastClose */
|
||||||
console_pollRead, /* pollRead */
|
console_pollRead, /* pollRead */
|
||||||
console_write_support, /* write */
|
console_write_support, /* write */
|
||||||
NULL, /* setAttributes */
|
console_set_attributes, /* setAttributes */
|
||||||
NULL, /* stopRemoteTx */
|
NULL, /* stopRemoteTx */
|
||||||
NULL, /* startRemoteTx */
|
NULL, /* startRemoteTx */
|
||||||
0 /* outputUsesInterrupts */
|
0 /* outputUsesInterrupts */
|
||||||
|
|||||||
Reference in New Issue
Block a user