Changeset 2d8e51aa in rtems


Ignore:
Timestamp:
Jul 9, 1998, 6:45:28 PM (22 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
459c1d2
Parents:
b2ec38c8
Message:

Changed static to MC68681_STATIC to make all data and routines
globally visiable to ease debugging.

Added support for mc68681 "2 column" style baud rate table as
well as the Exar 88681 "4 column" style baud rate table.

Added support for user override of the default baud rate table.

Location:
c/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libchip/serial/mc68681.c

    rb2ec38c8 r2d8e51aa  
    2424
    2525#include <libchip/serial.h>
     26#include "sersupp.h"
    2627#include "mc68681_p.h"
    2728#include "mc68681.h"
     
    6970 */
    7071
    71 static boolean mc68681_probe(int minor)
     72MC68681_STATIC boolean mc68681_probe(int minor)
    7273{
    7374  /*
     
    8687 */
    8788
    88 static int mc68681_baud_rate(
     89/* major index of 0 : ACR[7] = 0, X = 0 -- 68c681 only has these */
     90/* major index of 1 : ACR[7] = 1, X = 0 -- 68c681 only has these */
     91/* major index of 2 : ACR[7] = 0, X = 1 */
     92/* major index of 3 : ACR[7] = 1, X = 1 */
     93
     94/* mc68681_baud_table_t mc68681_baud_rate_table[4] = { */
     95mc68681_baud_t mc68681_baud_rate_table[4][RTEMS_TERMIOS_NUMBER_BAUD_RATES] = {
     96  { /* ACR[7] = 0, X = 0 */
     97    MC68681_BAUD_NOT_VALID,    /* B0 */
     98    0x00,                      /* B50 */
     99    MC68681_BAUD_NOT_VALID,    /* B75 */
     100    0x01,                      /* B110 */
     101    0x02,                      /* B134 */
     102    MC68681_BAUD_NOT_VALID,    /* B150 */
     103    0x03,                      /* B200 */
     104    0x04,                      /* B300 */
     105    0x05,                      /* B600 */
     106    0x06,                      /* B1200 */
     107    MC68681_BAUD_NOT_VALID,    /* B1800 */
     108    0x08,                      /* B2400 */
     109    0x09,                      /* B4800 */
     110    0x0B,                      /* B9600 */
     111    MC68681_BAUD_NOT_VALID,    /* B19200 */
     112    0x0C,                      /* B38400 */
     113    MC68681_BAUD_NOT_VALID,    /* B57600 */
     114    MC68681_BAUD_NOT_VALID,    /* B115200 */
     115    MC68681_BAUD_NOT_VALID,    /* B230400 */
     116    MC68681_BAUD_NOT_VALID     /* B460800 */
     117  },
     118  { /* ACR[7] = 1, X = 0 */
     119    MC68681_BAUD_NOT_VALID,    /* B0 */
     120    MC68681_BAUD_NOT_VALID,    /* B50 */
     121    0x00,                      /* B75 */
     122    0x01,                      /* B110 */
     123    0x02,                      /* B134 */
     124    0x03,                      /* B150 */
     125    MC68681_BAUD_NOT_VALID,    /* B200 */
     126    0x04,                      /* B300 */
     127    0x05,                      /* B600 */
     128    0x06,                      /* B1200 */
     129    0x0A,                      /* B1800 */
     130    0x08,                      /* B2400 */
     131    0x09,                      /* B4800 */
     132    0x0B,                      /* B9600 */
     133    0x0C,                      /* B19200 */
     134    MC68681_BAUD_NOT_VALID,    /* B38400 */
     135    MC68681_BAUD_NOT_VALID,    /* B57600 */
     136    MC68681_BAUD_NOT_VALID,    /* B115200 */
     137    MC68681_BAUD_NOT_VALID,    /* B230400 */
     138    MC68681_BAUD_NOT_VALID     /* B460800 */
     139  },
     140  { /* ACR[7] = 0, X = 1 */
     141    MC68681_BAUD_NOT_VALID,    /* B0 */
     142    MC68681_BAUD_NOT_VALID,    /* B50 */
     143    0x00,                      /* B75 */
     144    0x01,                      /* B110 */
     145    0x02,                      /* B134 */
     146    0x03,                      /* B150 */
     147    MC68681_BAUD_NOT_VALID,    /* B200 */
     148    MC68681_BAUD_NOT_VALID,    /* B300 */
     149    MC68681_BAUD_NOT_VALID,    /* B600 */
     150    MC68681_BAUD_NOT_VALID,    /* B1200 */
     151    0x0A,                      /* B1800 */
     152    MC68681_BAUD_NOT_VALID,    /* B2400 */
     153    0x08,                      /* B4800 */
     154    0x0B,                      /* B9600 */
     155    0x0C,                      /* B19200 */
     156    MC68681_BAUD_NOT_VALID,    /* B38400 */
     157    0x07,                      /* B57600 */
     158    0x08,                      /* B115200 */
     159    MC68681_BAUD_NOT_VALID,    /* B230400 */
     160    MC68681_BAUD_NOT_VALID     /* B460800 */
     161  },
     162  { /* ACR[7] = 1, X = 1 */
     163    MC68681_BAUD_NOT_VALID,    /* B0 */
     164    0x00,                      /* B50 */
     165    MC68681_BAUD_NOT_VALID,    /* B75 */
     166    0x01,                      /* B110 */
     167    0x02,                      /* B134 */
     168    MC68681_BAUD_NOT_VALID,    /* B150 */
     169    0x03,                      /* B200 */
     170    MC68681_BAUD_NOT_VALID,    /* B300 */
     171    MC68681_BAUD_NOT_VALID,    /* B600 */
     172    MC68681_BAUD_NOT_VALID,    /* B1200 */
     173    MC68681_BAUD_NOT_VALID,    /* B1800 */
     174    MC68681_BAUD_NOT_VALID,    /* B2400 */
     175    0x09,                      /* B4800 */
     176    0x0B,                      /* B9600 */
     177    MC68681_BAUD_NOT_VALID,    /* B19200 */
     178    0x0C,                      /* B38400 */
     179    0x07,                      /* B57600 */
     180    0x08,                      /* B115200 */
     181    MC68681_BAUD_NOT_VALID,    /* B230400 */
     182    MC68681_BAUD_NOT_VALID     /* B460800 */
     183  },
     184};
     185
     186MC68681_STATIC int mc68681_baud_rate(
    89187  int           minor,
    90188  int           baud,
    91189  unsigned int *baud_mask_p,
    92   unsigned int *acr_bit_p
    93 )
    94 {
    95   unsigned int baud_mask;
    96   unsigned int acr_bit;
    97   int          status;
    98 
    99   baud_mask = 0;
    100   acr_bit = 0;
    101   status = 0;
    102 
    103   if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
    104     acr_bit = 1;
    105 
    106   if (!(baud & CBAUD)) {
    107     *baud_mask_p = 0x0B;     /* default to 9600 baud */
    108     *acr_bit_p   = acr_bit;
    109     return status;
    110   }
    111 
    112   if ( !acr_bit ) {
    113     /*
    114      *  Baud Rate Set 1
    115      */
    116 
    117     switch (baud & CBAUD) {
    118       case B50:    baud_mask = 0x00; break;
    119       case B110:   baud_mask = 0x01; break;
    120       case B134:   baud_mask = 0x02; break;
    121       case B200:   baud_mask = 0x03; break;
    122       case B300:   baud_mask = 0x04; break;
    123       case B600:   baud_mask = 0x05; break;
    124       case B1200:  baud_mask = 0x06; break;
    125       case B2400:  baud_mask = 0x08; break;
    126       case B4800:  baud_mask = 0x09; break;
    127       case B9600:  baud_mask = 0x0B; break;
    128       case B38400: baud_mask = 0x0C; break;
    129 
    130       case B0:
    131       case B75:
    132       case B150:
    133       case B1800:
    134       case B19200:
    135       case B57600:
    136       case B115200:
    137       case B230400:
    138       case B460800:
    139         status = -1;
    140         break;
    141     }
    142   } else {
    143     /*
    144      *  Baud Rate Set 2
    145      */
    146 
    147     switch (baud & CBAUD) {
    148       case B75:    baud_mask = 0x00; break;
    149       case B110:   baud_mask = 0x01; break;
    150       case B134:   baud_mask = 0x02; break;
    151       case B150:   baud_mask = 0x03; break;
    152       case B300:   baud_mask = 0x04; break;
    153       case B600:   baud_mask = 0x05; break;
    154       case B1200:  baud_mask = 0x06; break;
    155       case B1800:  baud_mask = 0x0A; break;
    156       case B2400:  baud_mask = 0x08; break;
    157       case B4800:  baud_mask = 0x09; break;
    158       case B9600:  baud_mask = 0x0B; break;
    159       case B19200: baud_mask = 0x0C; break;
    160 
    161       case B0:
    162       case B50:
    163       case B200:
    164       case B38400:
    165       case B57600:
    166       case B115200:
    167       case B230400:
    168       case B460800:
    169         status = -1;
    170         break;
    171     }
    172   }
    173 
    174   *baud_mask_p = baud_mask;
    175   *acr_bit_p   = acr_bit;
    176   return status;
    177 }
     190  unsigned int *acr_bit_p,
     191  unsigned int *command
     192);
    178193
    179194/*
     
    184199 */
    185200
    186 static int mc68681_set_attributes(
     201MC68681_STATIC int mc68681_set_attributes(
    187202  int minor,
    188203  const struct termios *t
     
    195210  unsigned int           baud_mask;
    196211  unsigned int           acr_bit;
     212  unsigned int           cmd;
    197213  setRegister_f          setReg;
    198214  rtems_interrupt_level  Irql;
     
    206222   */
    207223
    208   if ( mc68681_baud_rate( minor, t->c_cflag, &baud_mask, &acr_bit ) == -1 )
     224  if (mc68681_baud_rate( minor, t->c_cflag, &baud_mask, &acr_bit, &cmd ) == -1)
    209225    return -1;
    210226
     
    258274    (*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
    259275    (*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud_mask );
     276    (*setReg)( pMC68681_port, MC68681_COMMAND, cmd );
    260277    (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
    261278    (*setReg)( pMC68681_port, MC68681_MODE, mode1 );
     
    271288 */
    272289
    273 static void mc68681_initialize_context(
     290MC68681_STATIC void mc68681_initialize_context(
    274291  int               minor,
    275292  mc68681_context  *pmc68681Context
     
    300317 */
    301318
    302 static unsigned int mc68681_build_imr(
     319MC68681_STATIC unsigned int mc68681_build_imr(
    303320  int  minor,
    304321  int  enable_flag
     
    358375 */
    359376
    360 static void mc68681_init(int minor)
     377MC68681_STATIC void mc68681_init(int minor)
    361378{
    362379  unsigned32              pMC68681_port;
     
    408425 */
    409426
    410 static int mc68681_open(
     427MC68681_STATIC int mc68681_open(
    411428  int      major,
    412429  int      minor,
     
    419436  unsigned int           acr;
    420437  unsigned int           vector;
     438  unsigned int           command;
    421439  rtems_interrupt_level  Irql;
    422440  setRegister_f          setReg;
     
    427445  vector        = Console_Port_Tbl[minor].ulIntVector;
    428446
    429   (void) mc68681_baud_rate( minor, B9600, &baud, &acr );
     447  (void) mc68681_baud_rate( minor, B9600, &baud, &acr, &command );
    430448
    431449  /*
     
    437455    (*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
    438456    (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
     457    (*setReg)( pMC68681, MC68681_COMMAND, command );
    439458    (*setReg)( pMC68681_port, MC68681_MODE, 0x13 );
    440459    (*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
     
    455474 */
    456475
    457 static int mc68681_close(
     476MC68681_STATIC int mc68681_close(
    458477  int      major,
    459478  int      minor,
     
    485504 */
    486505
    487 static void mc68681_write_polled(
     506MC68681_STATIC void mc68681_write_polled(
    488507  int   minor,
    489508  char  cChar
     
    533552 */
    534553
    535 static void mc68681_process(
     554MC68681_STATIC void mc68681_process(
    536555  int  minor
    537556)
     
    613632 */
    614633
    615 static rtems_isr mc68681_isr(
     634MC68681_STATIC rtems_isr mc68681_isr(
    616635  rtems_vector_number vector
    617636)
     
    635654 */
    636655
    637 static int mc68681_flush(int major, int minor, void *arg)
     656MC68681_STATIC int mc68681_flush(int major, int minor, void *arg)
    638657{
    639658  while(!Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
     
    657676 */
    658677
    659 static void mc68681_enable_interrupts(
     678MC68681_STATIC void mc68681_enable_interrupts(
    660679  int minor
    661680)
     
    681700 */
    682701
    683 static void mc68681_initialize_interrupts(int minor)
     702MC68681_STATIC void mc68681_initialize_interrupts(int minor)
    684703{
    685704  mc68681_init(minor);
     
    700719 */
    701720
    702 static int mc68681_write_support_int(
     721MC68681_STATIC int mc68681_write_support_int(
    703722  int   minor,
    704723  const char *buf,
     
    761780 */
    762781
    763 static int mc68681_write_support_polled(
     782MC68681_STATIC int mc68681_write_support_polled(
    764783  int         minor,
    765784  const char *buf,
     
    792811 */
    793812
    794 static int mc68681_inbyte_nonblocking_polled(
     813MC68681_STATIC int mc68681_inbyte_nonblocking_polled(
    795814  int minor
    796815)
     
    812831  }
    813832}
     833
     834MC68681_STATIC int mc68681_baud_rate(
     835  int           minor,
     836  int           baud,
     837  unsigned int *baud_mask_p,
     838  unsigned int *acr_bit_p,
     839  unsigned int *command
     840)
     841{
     842  unsigned int     baud_mask;
     843  unsigned int     acr_bit;
     844  int              status;
     845  int              is_a;
     846  int              is_extended;
     847  int              baud_requested;
     848  mc68681_baud_table_t  *baud_tbl;
     849
     850  baud_mask = 0;
     851  acr_bit = 0;
     852  status = 0;
     853
     854  if (Console_Port_Tbl[minor].ulCtrlPort1 ==
     855      Console_Port_Tbl[minor].ulCtrlPort2)
     856    is_a = 1;
     857  else
     858    is_a = 0;
     859   
     860  if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
     861    acr_bit = 1;
     862
     863  is_extended = 0;
     864
     865  switch (Console_Port_Tbl[minor].ulDataPort & MC68681_XBRG_MASK) {
     866    case MC68681_XBRG_IGNORED:
     867      *command = 0x00;
     868      break;
     869    case MC68681_XBRG_ENABLED:
     870      *command = (is_a) ? 0x08 : 0x09;
     871      is_extended = 1;
     872      break;
     873    case MC68681_XBRG_DISABLED:
     874      *command = (is_a) ? 0x0A : 0x0B;
     875      break;
     876  }
     877
     878  baud_requested = baud & CBAUD;
     879  if (!baud_requested)
     880    baud_requested = B9600;
     881 
     882  baud_requested = termios_baud_to_index( baud_requested );
     883
     884  baud_tbl = (mc68681_baud_table_t *) Console_Port_Tbl[minor].ulClock;
     885  if (!baud_tbl)
     886    baud_tbl = (mc68681_baud_table_t *)mc68681_baud_rate_table;
     887
     888  if ( is_extended )
     889    baud_mask = (unsigned int)baud_tbl[ acr_bit + 2 ][ baud_requested ];
     890  else
     891    baud_mask = baud_tbl[ acr_bit ][ baud_requested ];
     892
     893  if ( baud_mask == MC68681_BAUD_NOT_VALID )
     894    status = -1;
     895
     896  *baud_mask_p = baud_mask;     /* default to 9600 baud */
     897  *acr_bit_p   = acr_bit;
     898  return status;
     899}
     900
  • c/src/libchip/serial/mc68681.c

    rb2ec38c8 r2d8e51aa  
    2424
    2525#include <libchip/serial.h>
     26#include "sersupp.h"
    2627#include "mc68681_p.h"
    2728#include "mc68681.h"
     
    6970 */
    7071
    71 static boolean mc68681_probe(int minor)
     72MC68681_STATIC boolean mc68681_probe(int minor)
    7273{
    7374  /*
     
    8687 */
    8788
    88 static int mc68681_baud_rate(
     89/* major index of 0 : ACR[7] = 0, X = 0 -- 68c681 only has these */
     90/* major index of 1 : ACR[7] = 1, X = 0 -- 68c681 only has these */
     91/* major index of 2 : ACR[7] = 0, X = 1 */
     92/* major index of 3 : ACR[7] = 1, X = 1 */
     93
     94/* mc68681_baud_table_t mc68681_baud_rate_table[4] = { */
     95mc68681_baud_t mc68681_baud_rate_table[4][RTEMS_TERMIOS_NUMBER_BAUD_RATES] = {
     96  { /* ACR[7] = 0, X = 0 */
     97    MC68681_BAUD_NOT_VALID,    /* B0 */
     98    0x00,                      /* B50 */
     99    MC68681_BAUD_NOT_VALID,    /* B75 */
     100    0x01,                      /* B110 */
     101    0x02,                      /* B134 */
     102    MC68681_BAUD_NOT_VALID,    /* B150 */
     103    0x03,                      /* B200 */
     104    0x04,                      /* B300 */
     105    0x05,                      /* B600 */
     106    0x06,                      /* B1200 */
     107    MC68681_BAUD_NOT_VALID,    /* B1800 */
     108    0x08,                      /* B2400 */
     109    0x09,                      /* B4800 */
     110    0x0B,                      /* B9600 */
     111    MC68681_BAUD_NOT_VALID,    /* B19200 */
     112    0x0C,                      /* B38400 */
     113    MC68681_BAUD_NOT_VALID,    /* B57600 */
     114    MC68681_BAUD_NOT_VALID,    /* B115200 */
     115    MC68681_BAUD_NOT_VALID,    /* B230400 */
     116    MC68681_BAUD_NOT_VALID     /* B460800 */
     117  },
     118  { /* ACR[7] = 1, X = 0 */
     119    MC68681_BAUD_NOT_VALID,    /* B0 */
     120    MC68681_BAUD_NOT_VALID,    /* B50 */
     121    0x00,                      /* B75 */
     122    0x01,                      /* B110 */
     123    0x02,                      /* B134 */
     124    0x03,                      /* B150 */
     125    MC68681_BAUD_NOT_VALID,    /* B200 */
     126    0x04,                      /* B300 */
     127    0x05,                      /* B600 */
     128    0x06,                      /* B1200 */
     129    0x0A,                      /* B1800 */
     130    0x08,                      /* B2400 */
     131    0x09,                      /* B4800 */
     132    0x0B,                      /* B9600 */
     133    0x0C,                      /* B19200 */
     134    MC68681_BAUD_NOT_VALID,    /* B38400 */
     135    MC68681_BAUD_NOT_VALID,    /* B57600 */
     136    MC68681_BAUD_NOT_VALID,    /* B115200 */
     137    MC68681_BAUD_NOT_VALID,    /* B230400 */
     138    MC68681_BAUD_NOT_VALID     /* B460800 */
     139  },
     140  { /* ACR[7] = 0, X = 1 */
     141    MC68681_BAUD_NOT_VALID,    /* B0 */
     142    MC68681_BAUD_NOT_VALID,    /* B50 */
     143    0x00,                      /* B75 */
     144    0x01,                      /* B110 */
     145    0x02,                      /* B134 */
     146    0x03,                      /* B150 */
     147    MC68681_BAUD_NOT_VALID,    /* B200 */
     148    MC68681_BAUD_NOT_VALID,    /* B300 */
     149    MC68681_BAUD_NOT_VALID,    /* B600 */
     150    MC68681_BAUD_NOT_VALID,    /* B1200 */
     151    0x0A,                      /* B1800 */
     152    MC68681_BAUD_NOT_VALID,    /* B2400 */
     153    0x08,                      /* B4800 */
     154    0x0B,                      /* B9600 */
     155    0x0C,                      /* B19200 */
     156    MC68681_BAUD_NOT_VALID,    /* B38400 */
     157    0x07,                      /* B57600 */
     158    0x08,                      /* B115200 */
     159    MC68681_BAUD_NOT_VALID,    /* B230400 */
     160    MC68681_BAUD_NOT_VALID     /* B460800 */
     161  },
     162  { /* ACR[7] = 1, X = 1 */
     163    MC68681_BAUD_NOT_VALID,    /* B0 */
     164    0x00,                      /* B50 */
     165    MC68681_BAUD_NOT_VALID,    /* B75 */
     166    0x01,                      /* B110 */
     167    0x02,                      /* B134 */
     168    MC68681_BAUD_NOT_VALID,    /* B150 */
     169    0x03,                      /* B200 */
     170    MC68681_BAUD_NOT_VALID,    /* B300 */
     171    MC68681_BAUD_NOT_VALID,    /* B600 */
     172    MC68681_BAUD_NOT_VALID,    /* B1200 */
     173    MC68681_BAUD_NOT_VALID,    /* B1800 */
     174    MC68681_BAUD_NOT_VALID,    /* B2400 */
     175    0x09,                      /* B4800 */
     176    0x0B,                      /* B9600 */
     177    MC68681_BAUD_NOT_VALID,    /* B19200 */
     178    0x0C,                      /* B38400 */
     179    0x07,                      /* B57600 */
     180    0x08,                      /* B115200 */
     181    MC68681_BAUD_NOT_VALID,    /* B230400 */
     182    MC68681_BAUD_NOT_VALID     /* B460800 */
     183  },
     184};
     185
     186MC68681_STATIC int mc68681_baud_rate(
    89187  int           minor,
    90188  int           baud,
    91189  unsigned int *baud_mask_p,
    92   unsigned int *acr_bit_p
    93 )
    94 {
    95   unsigned int baud_mask;
    96   unsigned int acr_bit;
    97   int          status;
    98 
    99   baud_mask = 0;
    100   acr_bit = 0;
    101   status = 0;
    102 
    103   if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
    104     acr_bit = 1;
    105 
    106   if (!(baud & CBAUD)) {
    107     *baud_mask_p = 0x0B;     /* default to 9600 baud */
    108     *acr_bit_p   = acr_bit;
    109     return status;
    110   }
    111 
    112   if ( !acr_bit ) {
    113     /*
    114      *  Baud Rate Set 1
    115      */
    116 
    117     switch (baud & CBAUD) {
    118       case B50:    baud_mask = 0x00; break;
    119       case B110:   baud_mask = 0x01; break;
    120       case B134:   baud_mask = 0x02; break;
    121       case B200:   baud_mask = 0x03; break;
    122       case B300:   baud_mask = 0x04; break;
    123       case B600:   baud_mask = 0x05; break;
    124       case B1200:  baud_mask = 0x06; break;
    125       case B2400:  baud_mask = 0x08; break;
    126       case B4800:  baud_mask = 0x09; break;
    127       case B9600:  baud_mask = 0x0B; break;
    128       case B38400: baud_mask = 0x0C; break;
    129 
    130       case B0:
    131       case B75:
    132       case B150:
    133       case B1800:
    134       case B19200:
    135       case B57600:
    136       case B115200:
    137       case B230400:
    138       case B460800:
    139         status = -1;
    140         break;
    141     }
    142   } else {
    143     /*
    144      *  Baud Rate Set 2
    145      */
    146 
    147     switch (baud & CBAUD) {
    148       case B75:    baud_mask = 0x00; break;
    149       case B110:   baud_mask = 0x01; break;
    150       case B134:   baud_mask = 0x02; break;
    151       case B150:   baud_mask = 0x03; break;
    152       case B300:   baud_mask = 0x04; break;
    153       case B600:   baud_mask = 0x05; break;
    154       case B1200:  baud_mask = 0x06; break;
    155       case B1800:  baud_mask = 0x0A; break;
    156       case B2400:  baud_mask = 0x08; break;
    157       case B4800:  baud_mask = 0x09; break;
    158       case B9600:  baud_mask = 0x0B; break;
    159       case B19200: baud_mask = 0x0C; break;
    160 
    161       case B0:
    162       case B50:
    163       case B200:
    164       case B38400:
    165       case B57600:
    166       case B115200:
    167       case B230400:
    168       case B460800:
    169         status = -1;
    170         break;
    171     }
    172   }
    173 
    174   *baud_mask_p = baud_mask;
    175   *acr_bit_p   = acr_bit;
    176   return status;
    177 }
     190  unsigned int *acr_bit_p,
     191  unsigned int *command
     192);
    178193
    179194/*
     
    184199 */
    185200
    186 static int mc68681_set_attributes(
     201MC68681_STATIC int mc68681_set_attributes(
    187202  int minor,
    188203  const struct termios *t
     
    195210  unsigned int           baud_mask;
    196211  unsigned int           acr_bit;
     212  unsigned int           cmd;
    197213  setRegister_f          setReg;
    198214  rtems_interrupt_level  Irql;
     
    206222   */
    207223
    208   if ( mc68681_baud_rate( minor, t->c_cflag, &baud_mask, &acr_bit ) == -1 )
     224  if (mc68681_baud_rate( minor, t->c_cflag, &baud_mask, &acr_bit, &cmd ) == -1)
    209225    return -1;
    210226
     
    258274    (*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
    259275    (*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud_mask );
     276    (*setReg)( pMC68681_port, MC68681_COMMAND, cmd );
    260277    (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
    261278    (*setReg)( pMC68681_port, MC68681_MODE, mode1 );
     
    271288 */
    272289
    273 static void mc68681_initialize_context(
     290MC68681_STATIC void mc68681_initialize_context(
    274291  int               minor,
    275292  mc68681_context  *pmc68681Context
     
    300317 */
    301318
    302 static unsigned int mc68681_build_imr(
     319MC68681_STATIC unsigned int mc68681_build_imr(
    303320  int  minor,
    304321  int  enable_flag
     
    358375 */
    359376
    360 static void mc68681_init(int minor)
     377MC68681_STATIC void mc68681_init(int minor)
    361378{
    362379  unsigned32              pMC68681_port;
     
    408425 */
    409426
    410 static int mc68681_open(
     427MC68681_STATIC int mc68681_open(
    411428  int      major,
    412429  int      minor,
     
    419436  unsigned int           acr;
    420437  unsigned int           vector;
     438  unsigned int           command;
    421439  rtems_interrupt_level  Irql;
    422440  setRegister_f          setReg;
     
    427445  vector        = Console_Port_Tbl[minor].ulIntVector;
    428446
    429   (void) mc68681_baud_rate( minor, B9600, &baud, &acr );
     447  (void) mc68681_baud_rate( minor, B9600, &baud, &acr, &command );
    430448
    431449  /*
     
    437455    (*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
    438456    (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
     457    (*setReg)( pMC68681, MC68681_COMMAND, command );
    439458    (*setReg)( pMC68681_port, MC68681_MODE, 0x13 );
    440459    (*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
     
    455474 */
    456475
    457 static int mc68681_close(
     476MC68681_STATIC int mc68681_close(
    458477  int      major,
    459478  int      minor,
     
    485504 */
    486505
    487 static void mc68681_write_polled(
     506MC68681_STATIC void mc68681_write_polled(
    488507  int   minor,
    489508  char  cChar
     
    533552 */
    534553
    535 static void mc68681_process(
     554MC68681_STATIC void mc68681_process(
    536555  int  minor
    537556)
     
    613632 */
    614633
    615 static rtems_isr mc68681_isr(
     634MC68681_STATIC rtems_isr mc68681_isr(
    616635  rtems_vector_number vector
    617636)
     
    635654 */
    636655
    637 static int mc68681_flush(int major, int minor, void *arg)
     656MC68681_STATIC int mc68681_flush(int major, int minor, void *arg)
    638657{
    639658  while(!Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
     
    657676 */
    658677
    659 static void mc68681_enable_interrupts(
     678MC68681_STATIC void mc68681_enable_interrupts(
    660679  int minor
    661680)
     
    681700 */
    682701
    683 static void mc68681_initialize_interrupts(int minor)
     702MC68681_STATIC void mc68681_initialize_interrupts(int minor)
    684703{
    685704  mc68681_init(minor);
     
    700719 */
    701720
    702 static int mc68681_write_support_int(
     721MC68681_STATIC int mc68681_write_support_int(
    703722  int   minor,
    704723  const char *buf,
     
    761780 */
    762781
    763 static int mc68681_write_support_polled(
     782MC68681_STATIC int mc68681_write_support_polled(
    764783  int         minor,
    765784  const char *buf,
     
    792811 */
    793812
    794 static int mc68681_inbyte_nonblocking_polled(
     813MC68681_STATIC int mc68681_inbyte_nonblocking_polled(
    795814  int minor
    796815)
     
    812831  }
    813832}
     833
     834MC68681_STATIC int mc68681_baud_rate(
     835  int           minor,
     836  int           baud,
     837  unsigned int *baud_mask_p,
     838  unsigned int *acr_bit_p,
     839  unsigned int *command
     840)
     841{
     842  unsigned int     baud_mask;
     843  unsigned int     acr_bit;
     844  int              status;
     845  int              is_a;
     846  int              is_extended;
     847  int              baud_requested;
     848  mc68681_baud_table_t  *baud_tbl;
     849
     850  baud_mask = 0;
     851  acr_bit = 0;
     852  status = 0;
     853
     854  if (Console_Port_Tbl[minor].ulCtrlPort1 ==
     855      Console_Port_Tbl[minor].ulCtrlPort2)
     856    is_a = 1;
     857  else
     858    is_a = 0;
     859   
     860  if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
     861    acr_bit = 1;
     862
     863  is_extended = 0;
     864
     865  switch (Console_Port_Tbl[minor].ulDataPort & MC68681_XBRG_MASK) {
     866    case MC68681_XBRG_IGNORED:
     867      *command = 0x00;
     868      break;
     869    case MC68681_XBRG_ENABLED:
     870      *command = (is_a) ? 0x08 : 0x09;
     871      is_extended = 1;
     872      break;
     873    case MC68681_XBRG_DISABLED:
     874      *command = (is_a) ? 0x0A : 0x0B;
     875      break;
     876  }
     877
     878  baud_requested = baud & CBAUD;
     879  if (!baud_requested)
     880    baud_requested = B9600;
     881 
     882  baud_requested = termios_baud_to_index( baud_requested );
     883
     884  baud_tbl = (mc68681_baud_table_t *) Console_Port_Tbl[minor].ulClock;
     885  if (!baud_tbl)
     886    baud_tbl = (mc68681_baud_table_t *)mc68681_baud_rate_table;
     887
     888  if ( is_extended )
     889    baud_mask = (unsigned int)baud_tbl[ acr_bit + 2 ][ baud_requested ];
     890  else
     891    baud_mask = baud_tbl[ acr_bit ][ baud_requested ];
     892
     893  if ( baud_mask == MC68681_BAUD_NOT_VALID )
     894    status = -1;
     895
     896  *baud_mask_p = baud_mask;     /* default to 9600 baud */
     897  *acr_bit_p   = acr_bit;
     898  return status;
     899}
     900
Note: See TracChangeset for help on using the changeset viewer.