[PATCH 34.1 2/6] LEON3: add console attributes such as parity and baudrate

Daniel Hellstrom daniel at gaisler.com
Thu Apr 19 09:19:27 UTC 2012


On 04/18/2012 05:29 PM, Joel Sherrill wrote:
> Rather than the switch on Bxxx, please use
> rtems_termios_baud_to_number(). It does
> the conversion so we don't end up with this
> switch in every UART driver. :)
>
> Other than that, the patch is OK.
Ok, I will update the patch. Thanks

>
> On 04/18/2012 10:19 AM, Daniel Hellstrom wrote:
>> Signed-off-by: Daniel Hellstrom<daniel at gaisler.com>
>> ---
>>   c/src/lib/libbsp/sparc/leon3/console/console.c |   93 +++++++++++++++++++++++-
>>   1 files changed, 90 insertions(+), 3 deletions(-)
>>
>> diff --git a/c/src/lib/libbsp/sparc/leon3/console/console.c b/c/src/lib/libbsp/sparc/leon3/console/console.c
>> index fa67d37..7eafaef 100644
>> --- a/c/src/lib/libbsp/sparc/leon3/console/console.c
>> +++ b/c/src/lib/libbsp/sparc/leon3/console/console.c
>> @@ -13,8 +13,6 @@
>>    *  The license and distribution terms for this file may be
>>    *  found in the file LICENSE in this distribution or at
>>    *  http://www.rtems.com/license/LICENSE.
>> - *
>> - *  $Id$
>>    */
>>
>>   #include<bsp.h>
>> @@ -102,6 +100,95 @@ int console_pollRead(int minor)
>>     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 */
>> +  switch (t->c_cflag&  CBAUD) {
>> +    default:      baud = -1;      break;
>> +    case B50:     baud = 50;      break;
>> +    case B75:     baud = 75;      break;
>> +    case B110:    baud = 110;     break;
>> +    case B134:    baud = 134;     break;
>> +    case B150:    baud = 150;     break;
>> +    case B200:    baud = 200;     break;
>> +    case B300:    baud = 300;     break;
>> +    case B600:    baud = 600;     break;
>> +    case B1200:   baud = 1200;    break;
>> +    case B1800:   baud = 1800;    break;
>> +    case B2400:   baud = 2400;    break;
>> +    case B4800:   baud = 4800;    break;
>> +    case B9600:   baud = 9600;    break;
>> +    case B19200:  baud = 19200;   break;
>> +    case B38400:  baud = 38400;   break;
>> +    case B57600:  baud = 57600;   break;
>> +    case B115200: baud = 115200;  break;
>> +    case B230400: baud = 230400;  break;
>> +    case B460800: baud = 460800;  break;
>> +  }
>> +
>> +  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. */
>>   int find_matching_apbuart(struct ambapp_dev *dev, int index, void *arg)
>>   {
>> @@ -208,7 +295,7 @@ rtems_device_driver console_open(
>>       NULL,                        /* lastClose */
>>       console_pollRead,            /* pollRead */
>>       console_write_support,       /* write */
>> -    NULL,                        /* setAttributes */
>> +    console_set_attributes,      /* setAttributes */
>>       NULL,                        /* stopRemoteTx */
>>       NULL,                        /* startRemoteTx */
>>       0                            /* outputUsesInterrupts */
>
>




More information about the devel mailing list