Changeset 25c3ff91 in rtems


Ignore:
Timestamp:
Jun 23, 1998, 2:55:21 PM (22 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
b7ebcea
Parents:
790d421
Message:

Added set attributes and written initialize and first open.

Location:
c/src
Files:
2 edited

Legend:

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

    r790d421 r25c3ff91  
    5252  mc68681_initialize_interrupts,  /* deviceInitialize */
    5353  mc68681_write_polled,           /* deviceWritePolled */
     54  mc68681_set_attributes,         /* deviceSetAttributes */
    5455  FALSE,                          /* deviceOutputUsesInterrupts */
    5556};
     
    6465  mc68681_init,                        /* deviceInitialize */
    6566  mc68681_write_polled,                /* deviceWritePolled */
     67  mc68681_set_attributes,              /* deviceSetAttributes */
    6668  FALSE,                               /* deviceOutputUsesInterrupts */
    6769};
     
    8082   */
    8183  return(TRUE);
     84}
     85
     86static int mc68681_baud_rate(
     87  int           minor,
     88  int           baud,
     89  unsigned int *baud_mask_p,
     90  unsigned int *acr_bit_p
     91)
     92{
     93  unsigned int baud_mask;
     94  unsigned int acr_bit;
     95  int          status;
     96
     97  baud_mask = 0;
     98  acr_bit = 0;
     99  status = 0;
     100
     101  if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
     102    acr_bit = 1;
     103
     104  if (!(baud & CBAUD)) {
     105    *baud_mask_p = 0x0B;     /* default to 9600 baud */
     106    *acr_bit_p   = acr_bit;
     107    return status;
     108  }
     109
     110  if ( !acr_bit ) {
     111    switch (baud & CBAUD) {
     112      case B50:    baud_mask = 0x00; break;
     113      case B110:   baud_mask = 0x01; break;
     114      case B134:   baud_mask = 0x02; break;
     115      case B200:   baud_mask = 0x03; break;
     116      case B300:   baud_mask = 0x04; break;
     117      case B600:   baud_mask = 0x05; break;
     118      case B1200:  baud_mask = 0x06; break;
     119      case B2400:  baud_mask = 0x08; break;
     120      case B4800:  baud_mask = 0x09; break;
     121      case B9600:  baud_mask = 0x0B; break;
     122      case B38400: baud_mask = 0x0C; break;
     123
     124      case B0:
     125      case B75:
     126      case B150:
     127      case B1800:
     128      case B19200:
     129      case B57600:
     130      case B115200:
     131      case B230400:
     132      case B460800:
     133        status = -1;
     134        break;
     135    }
     136  } else {
     137    switch (baud & CBAUD) {
     138      case B75:    baud_mask = 0x00; break;
     139      case B110:   baud_mask = 0x01; break;
     140      case B134:   baud_mask = 0x02; break;
     141      case B150:   baud_mask = 0x03; break;
     142      case B300:   baud_mask = 0x04; break;
     143      case B600:   baud_mask = 0x05; break;
     144      case B1200:  baud_mask = 0x06; break;
     145      case B1800:  baud_mask = 0x0A; break;
     146      case B2400:  baud_mask = 0x08; break;
     147      case B4800:  baud_mask = 0x09; break;
     148      case B9600:  baud_mask = 0x0B; break;
     149      case B19200: baud_mask = 0x0C; break;
     150
     151      case B0:
     152      case B50:
     153      case B200:
     154      case B38400:
     155      case B57600:
     156      case B115200:
     157      case B230400:
     158      case B460800:
     159        status = -1;
     160        break;
     161    }
     162  }
     163
     164  *baud_mask_p = baud_mask;
     165  *acr_bit_p   = acr_bit;
     166  return status;
     167}
     168
     169#define MC68681_PORT_MASK( _port, _bits ) \
     170  ((_port) ? ((_bits) << 4) : (_bits))
     171
     172static int mc68681_set_attributes(
     173  int minor,
     174  const struct termios *t
     175)
     176{
     177  unsigned32             pMC68681_port;
     178  unsigned32             pMC68681;
     179  unsigned int           mode1;
     180  unsigned int           mode2;
     181  unsigned int           baud_mask;
     182  unsigned int           acr_bit;
     183  setRegister_f          setReg;
     184  rtems_interrupt_level  Irql;
     185
     186  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
     187  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
     188  setReg        = Console_Port_Tbl[minor].setRegister;
     189
     190  /*
     191   *  Set the baud rate
     192   */
     193
     194  if ( mc68681_baud_rate( minor, t->c_cflag, &baud_mask, &acr_bit ) == -1 )
     195    return -1;
     196
     197  baud_mask |=  baud_mask << 4;
     198  acr_bit   <<= 7;
     199
     200  /*
     201   *  Parity
     202   */
     203
     204  mode1 = 0;
     205  mode2 = 0;
     206
     207  if (t->c_cflag & PARENB) {
     208    if (t->c_cflag & PARODD)
     209      mode1 |= 0x04;
     210    else
     211      mode1 |= 0x04;
     212  } else {
     213   mode1 |= 0x10;
     214  }
     215
     216  /*
     217   *  Character Size
     218   */
     219
     220  if (t->c_cflag & CSIZE) {
     221    switch (t->c_cflag & CSIZE) {
     222      case CS5:  break;
     223      case CS6:  mode1 |= 0x01;  break;
     224      case CS7:  mode1 |= 0x02;  break;
     225      case CS8:  mode1 |= 0x03;  break;
     226    }
     227  } else {
     228    mode1 |= 0x03;       /* default to 9600,8,N,1 */
     229  }
     230
     231  /*
     232   *  Stop Bits
     233   */
     234 
     235  if (t->c_cflag & CSTOPB) {
     236    mode2 |= 0x07;                      /* 2 stop bits */
     237  } else {
     238    if ((t->c_cflag & CSIZE) == CS5)    /* CS5 and 2 stop bits not supported */
     239      return -1;
     240    mode2 |= 0x0F;                      /* 1 stop bit */
     241  }
     242
     243  rtems_interrupt_disable(Irql);
     244    (*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
     245    (*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud_mask );
     246    (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
     247    (*setReg)( pMC68681_port, MC68681_MODE, mode1 );
     248    (*setReg)( pMC68681_port, MC68681_MODE, mode2 );
     249  rtems_interrupt_enable(Irql);
     250  return 0;
    82251}
    83252
     
    87256  unsigned32              pMC68681_port;
    88257  unsigned32              pMC68681;
    89   unsigned8               ucTrash;
    90   unsigned8               ucDataByte;
    91   unsigned32              ulBaudDivisor;
    92258  mc68681_context        *pmc68681Context;
    93259  setRegister_f           setReg;
    94260  getRegister_f           getReg;
    95 
    96 #if 1
    97 ulBaudDivisor = ucDataByte = ucTrash =  0;
    98 #endif
     261  unsigned int            port;
     262
    99263  pmc68681Context = (mc68681_context *) malloc(sizeof(mc68681_context));
    100264
     
    108272  setReg        = Console_Port_Tbl[minor].setRegister;
    109273  getReg        = Console_Port_Tbl[minor].getRegister;
    110 
    111 
    112   /*
    113    *  Reset Receiver
     274  port          = Console_Port_Tbl[minor].ulDataPort;
     275
     276  /*
     277   *  Reset everything and leave this port disabled.
    114278   */
    115279
    116280  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_RX );
    117   (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_RX );
    118 
    119   /*
    120    *  Reset Transmitter
    121    */
    122 
    123281  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_TX );
    124   (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_TX );
     282  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_ERROR );
     283  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_BREAK );
     284  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_STOP_BREAK );
     285  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_TX );
     286  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_RX );
     287
    125288
    126289  (*setReg)( pMC68681, MC68681_MODE_REG_1A, 0x00 );
    127290  (*setReg)( pMC68681, MC68681_MODE_REG_2A, 0x02 );
    128 
    129  
    130 #if 0
    131   /* FOM NS16550 */
    132   /* Clear the divisor latch, clear all interrupt enables,
    133    * and reset and
    134    * disable the FIFO's.
    135    */
    136 
    137   (*setReg)(pMC68681, MC68681_LINE_CONTROL, 0x0);
    138   (*setReg)(pMC68681, MC68681_INTERRUPT_ENABLE, 0x0);
    139 
    140   /* Set the divisor latch and set the baud rate. */
    141 
    142   ulBaudDivisor=MC68681_Baud((unsigned32)Console_Port_Tbl[minor].pDeviceParams);
    143   ucDataByte = SP_LINE_DLAB;
    144   (*setReg)(pMC68681, MC68681_LINE_CONTROL, ucDataByte);
    145   (*setReg)(pMC68681, MC68681_TRANSMIT_BUFFER, ulBaudDivisor&0xff);
    146   (*setReg)(pMC68681, MC68681_INTERRUPT_ENABLE, (ulBaudDivisor>>8)&0xff);
    147 
    148   /* Clear the divisor latch and set the character size to eight bits */
    149   /* with one stop bit and no parity checking. */
    150   ucDataByte = EIGHT_BITS;
    151   (*setReg)(pMC68681, MC68681_LINE_CONTROL, ucDataByte);
    152 
    153   /* Enable and reset transmit and receive FIFOs. TJA     */
    154   ucDataByte = SP_FIFO_ENABLE;
    155   (*setReg)(pMC68681, MC68681_FIFO_CONTROL, ucDataByte);
    156 
    157   ucDataByte = SP_FIFO_ENABLE | SP_FIFO_RXRST | SP_FIFO_TXRST;
    158   (*setReg)(pMC68681, MC68681_FIFO_CONTROL, ucDataByte);
    159 
    160   /*
    161    * Disable interrupts
    162    */
    163   ucDataByte = 0;
    164   (*setReg)(pMC68681, MC68681_INTERRUPT_ENABLE, ucDataByte);
    165 
    166   /* Set data terminal ready. */
    167   /* And open interrupt tristate line */
    168   (*setReg)(pMC68681, MC68681_MODEM_CONTROL,pmc68681Context->ucModemCtrl);
    169 
    170   ucTrash = (*getReg)(pMC68681, MC68681_LINE_STATUS );
    171   ucTrash = (*getReg)(pMC68681, MC68681_RECEIVE_BUFFER );
    172 #endif
    173 }
     291}
     292
     293/*
     294 *  Initialize to 9600, 8, N, 1
     295 */
    174296
    175297static int mc68681_open(
    176298  int      major,
    177299  int      minor,
    178   void    * arg
     300  void    *arg
    179301)
    180302{
    181303/* XXX */
     304  unsigned32             pMC68681;
     305  unsigned32             pMC68681_port;
     306  unsigned int           baud;
     307  unsigned int           acr;
     308  unsigned int           port;
     309  unsigned int           vector;
     310  rtems_interrupt_level  Irql;
     311  setRegister_f          setReg;
     312  getRegister_f          getReg;
     313
     314  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
     315  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
     316  getReg        = Console_Port_Tbl[minor].getRegister;
     317  setReg        = Console_Port_Tbl[minor].setRegister;
     318  port          = Console_Port_Tbl[minor].ulDataPort;
     319  vector        = Console_Port_Tbl[minor].ulIntVector;
     320
     321  (void) mc68681_baud_rate( minor, B9600, &baud, &acr );
     322
     323  rtems_interrupt_disable(Irql);
     324    (*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr );
     325    (*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
     326    (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
     327    (*setReg)( pMC68681_port, MC68681_MODE, 0x13 );
     328    (*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
     329  rtems_interrupt_enable(Irql);
     330
     331  (*setReg)(
     332     pMC68681,
     333     MC68681_INTERRUPT_MASK_REG,
     334     MC68681_PORT_MASK( port, 0x03 )  /* intr on RX and TX -- not break */
     335  );
     336
     337  (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_ENABLE_TX );
     338  (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_ENABLE_RX );
     339
     340  (*setReg)( pMC68681, MC68681_INTERRUPT_VECTOR_REG, vector );
     341
    182342  /*
    183343   * Assert DTR
     
    194354  int      major,
    195355  int      minor,
    196   void    * arg
     356  void    *arg
    197357)
    198358{
     
    217377)
    218378{
    219   unsigned32              pMC68681;
     379  unsigned32              pMC68681_port;
    220380  unsigned char           ucLineStatus;
    221381  int                     iTimeout;
    222382  getRegister_f           getReg;
    223   setData_f               setData;
    224 
    225   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    226   getReg   = Console_Port_Tbl[minor].getRegister;
    227   setData  = Console_Port_Tbl[minor].setData;
     383  setRegister_f           setReg;
     384
     385  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
     386  getReg        = Console_Port_Tbl[minor].getRegister;
     387  setReg        = Console_Port_Tbl[minor].setRegister;
    228388
    229389  /*
     
    231391   */
    232392  iTimeout = 1000;
    233   ucLineStatus = (*getReg)(pMC68681, MC68681_STATUS);
     393  ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
    234394  while ((ucLineStatus & MC68681_TX_READY) == 0) {
    235395
     
    241401       rtems_task_wake_after(RTEMS_YIELD_PROCESSOR);
    242402     }
    243      ucLineStatus = (*getReg)(pMC68681, MC68681_STATUS);
     403     ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
    244404     if(!--iTimeout) {
    245405       break;
     
    251411   */
    252412
    253   (*setData)(pMC68681, cChar);
     413  (*setReg)(pMC68681_port, MC68681_TX_BUFFER, cChar);
    254414}
    255415
     
    657817)
    658818{
    659   unsigned32           pMC68681;
     819  unsigned32           pMC68681_port;
    660820  unsigned char        ucLineStatus;
    661821  char                 cChar;
    662822  getRegister_f        getReg;
    663   getData_f            getData;
    664 
    665   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    666   getReg   = Console_Port_Tbl[minor].getRegister;
    667   getData  = Console_Port_Tbl[minor].getData;
    668 
    669   ucLineStatus = (*getReg)(pMC68681, MC68681_STATUS);
     823
     824  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
     825  getReg        = Console_Port_Tbl[minor].getRegister;
     826
     827  ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
    670828  if(ucLineStatus & MC68681_RX_READY) {
    671     cChar = (*getData)(pMC68681);
     829    cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
    672830    return (int)cChar;
    673831  } else {
    674     return(-1);
    675   }
    676 }
     832    return -1;
     833  }
     834}
  • c/src/libchip/serial/mc68681.c

    r790d421 r25c3ff91  
    5252  mc68681_initialize_interrupts,  /* deviceInitialize */
    5353  mc68681_write_polled,           /* deviceWritePolled */
     54  mc68681_set_attributes,         /* deviceSetAttributes */
    5455  FALSE,                          /* deviceOutputUsesInterrupts */
    5556};
     
    6465  mc68681_init,                        /* deviceInitialize */
    6566  mc68681_write_polled,                /* deviceWritePolled */
     67  mc68681_set_attributes,              /* deviceSetAttributes */
    6668  FALSE,                               /* deviceOutputUsesInterrupts */
    6769};
     
    8082   */
    8183  return(TRUE);
     84}
     85
     86static int mc68681_baud_rate(
     87  int           minor,
     88  int           baud,
     89  unsigned int *baud_mask_p,
     90  unsigned int *acr_bit_p
     91)
     92{
     93  unsigned int baud_mask;
     94  unsigned int acr_bit;
     95  int          status;
     96
     97  baud_mask = 0;
     98  acr_bit = 0;
     99  status = 0;
     100
     101  if ( !(Console_Port_Tbl[minor].ulDataPort & MC68681_DATA_BAUD_RATE_SET_1) )
     102    acr_bit = 1;
     103
     104  if (!(baud & CBAUD)) {
     105    *baud_mask_p = 0x0B;     /* default to 9600 baud */
     106    *acr_bit_p   = acr_bit;
     107    return status;
     108  }
     109
     110  if ( !acr_bit ) {
     111    switch (baud & CBAUD) {
     112      case B50:    baud_mask = 0x00; break;
     113      case B110:   baud_mask = 0x01; break;
     114      case B134:   baud_mask = 0x02; break;
     115      case B200:   baud_mask = 0x03; break;
     116      case B300:   baud_mask = 0x04; break;
     117      case B600:   baud_mask = 0x05; break;
     118      case B1200:  baud_mask = 0x06; break;
     119      case B2400:  baud_mask = 0x08; break;
     120      case B4800:  baud_mask = 0x09; break;
     121      case B9600:  baud_mask = 0x0B; break;
     122      case B38400: baud_mask = 0x0C; break;
     123
     124      case B0:
     125      case B75:
     126      case B150:
     127      case B1800:
     128      case B19200:
     129      case B57600:
     130      case B115200:
     131      case B230400:
     132      case B460800:
     133        status = -1;
     134        break;
     135    }
     136  } else {
     137    switch (baud & CBAUD) {
     138      case B75:    baud_mask = 0x00; break;
     139      case B110:   baud_mask = 0x01; break;
     140      case B134:   baud_mask = 0x02; break;
     141      case B150:   baud_mask = 0x03; break;
     142      case B300:   baud_mask = 0x04; break;
     143      case B600:   baud_mask = 0x05; break;
     144      case B1200:  baud_mask = 0x06; break;
     145      case B1800:  baud_mask = 0x0A; break;
     146      case B2400:  baud_mask = 0x08; break;
     147      case B4800:  baud_mask = 0x09; break;
     148      case B9600:  baud_mask = 0x0B; break;
     149      case B19200: baud_mask = 0x0C; break;
     150
     151      case B0:
     152      case B50:
     153      case B200:
     154      case B38400:
     155      case B57600:
     156      case B115200:
     157      case B230400:
     158      case B460800:
     159        status = -1;
     160        break;
     161    }
     162  }
     163
     164  *baud_mask_p = baud_mask;
     165  *acr_bit_p   = acr_bit;
     166  return status;
     167}
     168
     169#define MC68681_PORT_MASK( _port, _bits ) \
     170  ((_port) ? ((_bits) << 4) : (_bits))
     171
     172static int mc68681_set_attributes(
     173  int minor,
     174  const struct termios *t
     175)
     176{
     177  unsigned32             pMC68681_port;
     178  unsigned32             pMC68681;
     179  unsigned int           mode1;
     180  unsigned int           mode2;
     181  unsigned int           baud_mask;
     182  unsigned int           acr_bit;
     183  setRegister_f          setReg;
     184  rtems_interrupt_level  Irql;
     185
     186  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
     187  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
     188  setReg        = Console_Port_Tbl[minor].setRegister;
     189
     190  /*
     191   *  Set the baud rate
     192   */
     193
     194  if ( mc68681_baud_rate( minor, t->c_cflag, &baud_mask, &acr_bit ) == -1 )
     195    return -1;
     196
     197  baud_mask |=  baud_mask << 4;
     198  acr_bit   <<= 7;
     199
     200  /*
     201   *  Parity
     202   */
     203
     204  mode1 = 0;
     205  mode2 = 0;
     206
     207  if (t->c_cflag & PARENB) {
     208    if (t->c_cflag & PARODD)
     209      mode1 |= 0x04;
     210    else
     211      mode1 |= 0x04;
     212  } else {
     213   mode1 |= 0x10;
     214  }
     215
     216  /*
     217   *  Character Size
     218   */
     219
     220  if (t->c_cflag & CSIZE) {
     221    switch (t->c_cflag & CSIZE) {
     222      case CS5:  break;
     223      case CS6:  mode1 |= 0x01;  break;
     224      case CS7:  mode1 |= 0x02;  break;
     225      case CS8:  mode1 |= 0x03;  break;
     226    }
     227  } else {
     228    mode1 |= 0x03;       /* default to 9600,8,N,1 */
     229  }
     230
     231  /*
     232   *  Stop Bits
     233   */
     234 
     235  if (t->c_cflag & CSTOPB) {
     236    mode2 |= 0x07;                      /* 2 stop bits */
     237  } else {
     238    if ((t->c_cflag & CSIZE) == CS5)    /* CS5 and 2 stop bits not supported */
     239      return -1;
     240    mode2 |= 0x0F;                      /* 1 stop bit */
     241  }
     242
     243  rtems_interrupt_disable(Irql);
     244    (*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr_bit );
     245    (*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud_mask );
     246    (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
     247    (*setReg)( pMC68681_port, MC68681_MODE, mode1 );
     248    (*setReg)( pMC68681_port, MC68681_MODE, mode2 );
     249  rtems_interrupt_enable(Irql);
     250  return 0;
    82251}
    83252
     
    87256  unsigned32              pMC68681_port;
    88257  unsigned32              pMC68681;
    89   unsigned8               ucTrash;
    90   unsigned8               ucDataByte;
    91   unsigned32              ulBaudDivisor;
    92258  mc68681_context        *pmc68681Context;
    93259  setRegister_f           setReg;
    94260  getRegister_f           getReg;
    95 
    96 #if 1
    97 ulBaudDivisor = ucDataByte = ucTrash =  0;
    98 #endif
     261  unsigned int            port;
     262
    99263  pmc68681Context = (mc68681_context *) malloc(sizeof(mc68681_context));
    100264
     
    108272  setReg        = Console_Port_Tbl[minor].setRegister;
    109273  getReg        = Console_Port_Tbl[minor].getRegister;
    110 
    111 
    112   /*
    113    *  Reset Receiver
     274  port          = Console_Port_Tbl[minor].ulDataPort;
     275
     276  /*
     277   *  Reset everything and leave this port disabled.
    114278   */
    115279
    116280  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_RX );
    117   (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_RX );
    118 
    119   /*
    120    *  Reset Transmitter
    121    */
    122 
    123281  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_TX );
    124   (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_TX );
     282  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_ERROR );
     283  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_RESET_BREAK );
     284  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_STOP_BREAK );
     285  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_TX );
     286  (*setReg)( pMC68681, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_RX );
     287
    125288
    126289  (*setReg)( pMC68681, MC68681_MODE_REG_1A, 0x00 );
    127290  (*setReg)( pMC68681, MC68681_MODE_REG_2A, 0x02 );
    128 
    129  
    130 #if 0
    131   /* FOM NS16550 */
    132   /* Clear the divisor latch, clear all interrupt enables,
    133    * and reset and
    134    * disable the FIFO's.
    135    */
    136 
    137   (*setReg)(pMC68681, MC68681_LINE_CONTROL, 0x0);
    138   (*setReg)(pMC68681, MC68681_INTERRUPT_ENABLE, 0x0);
    139 
    140   /* Set the divisor latch and set the baud rate. */
    141 
    142   ulBaudDivisor=MC68681_Baud((unsigned32)Console_Port_Tbl[minor].pDeviceParams);
    143   ucDataByte = SP_LINE_DLAB;
    144   (*setReg)(pMC68681, MC68681_LINE_CONTROL, ucDataByte);
    145   (*setReg)(pMC68681, MC68681_TRANSMIT_BUFFER, ulBaudDivisor&0xff);
    146   (*setReg)(pMC68681, MC68681_INTERRUPT_ENABLE, (ulBaudDivisor>>8)&0xff);
    147 
    148   /* Clear the divisor latch and set the character size to eight bits */
    149   /* with one stop bit and no parity checking. */
    150   ucDataByte = EIGHT_BITS;
    151   (*setReg)(pMC68681, MC68681_LINE_CONTROL, ucDataByte);
    152 
    153   /* Enable and reset transmit and receive FIFOs. TJA     */
    154   ucDataByte = SP_FIFO_ENABLE;
    155   (*setReg)(pMC68681, MC68681_FIFO_CONTROL, ucDataByte);
    156 
    157   ucDataByte = SP_FIFO_ENABLE | SP_FIFO_RXRST | SP_FIFO_TXRST;
    158   (*setReg)(pMC68681, MC68681_FIFO_CONTROL, ucDataByte);
    159 
    160   /*
    161    * Disable interrupts
    162    */
    163   ucDataByte = 0;
    164   (*setReg)(pMC68681, MC68681_INTERRUPT_ENABLE, ucDataByte);
    165 
    166   /* Set data terminal ready. */
    167   /* And open interrupt tristate line */
    168   (*setReg)(pMC68681, MC68681_MODEM_CONTROL,pmc68681Context->ucModemCtrl);
    169 
    170   ucTrash = (*getReg)(pMC68681, MC68681_LINE_STATUS );
    171   ucTrash = (*getReg)(pMC68681, MC68681_RECEIVE_BUFFER );
    172 #endif
    173 }
     291}
     292
     293/*
     294 *  Initialize to 9600, 8, N, 1
     295 */
    174296
    175297static int mc68681_open(
    176298  int      major,
    177299  int      minor,
    178   void    * arg
     300  void    *arg
    179301)
    180302{
    181303/* XXX */
     304  unsigned32             pMC68681;
     305  unsigned32             pMC68681_port;
     306  unsigned int           baud;
     307  unsigned int           acr;
     308  unsigned int           port;
     309  unsigned int           vector;
     310  rtems_interrupt_level  Irql;
     311  setRegister_f          setReg;
     312  getRegister_f          getReg;
     313
     314  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
     315  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
     316  getReg        = Console_Port_Tbl[minor].getRegister;
     317  setReg        = Console_Port_Tbl[minor].setRegister;
     318  port          = Console_Port_Tbl[minor].ulDataPort;
     319  vector        = Console_Port_Tbl[minor].ulIntVector;
     320
     321  (void) mc68681_baud_rate( minor, B9600, &baud, &acr );
     322
     323  rtems_interrupt_disable(Irql);
     324    (*setReg)( pMC68681, MC68681_AUX_CTRL_REG, acr );
     325    (*setReg)( pMC68681_port, MC68681_CLOCK_SELECT, baud );
     326    (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_RESET_MR_PTR );
     327    (*setReg)( pMC68681_port, MC68681_MODE, 0x13 );
     328    (*setReg)( pMC68681_port, MC68681_MODE, 0x07 );
     329  rtems_interrupt_enable(Irql);
     330
     331  (*setReg)(
     332     pMC68681,
     333     MC68681_INTERRUPT_MASK_REG,
     334     MC68681_PORT_MASK( port, 0x03 )  /* intr on RX and TX -- not break */
     335  );
     336
     337  (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_ENABLE_TX );
     338  (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_ENABLE_RX );
     339
     340  (*setReg)( pMC68681, MC68681_INTERRUPT_VECTOR_REG, vector );
     341
    182342  /*
    183343   * Assert DTR
     
    194354  int      major,
    195355  int      minor,
    196   void    * arg
     356  void    *arg
    197357)
    198358{
     
    217377)
    218378{
    219   unsigned32              pMC68681;
     379  unsigned32              pMC68681_port;
    220380  unsigned char           ucLineStatus;
    221381  int                     iTimeout;
    222382  getRegister_f           getReg;
    223   setData_f               setData;
    224 
    225   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    226   getReg   = Console_Port_Tbl[minor].getRegister;
    227   setData  = Console_Port_Tbl[minor].setData;
     383  setRegister_f           setReg;
     384
     385  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
     386  getReg        = Console_Port_Tbl[minor].getRegister;
     387  setReg        = Console_Port_Tbl[minor].setRegister;
    228388
    229389  /*
     
    231391   */
    232392  iTimeout = 1000;
    233   ucLineStatus = (*getReg)(pMC68681, MC68681_STATUS);
     393  ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
    234394  while ((ucLineStatus & MC68681_TX_READY) == 0) {
    235395
     
    241401       rtems_task_wake_after(RTEMS_YIELD_PROCESSOR);
    242402     }
    243      ucLineStatus = (*getReg)(pMC68681, MC68681_STATUS);
     403     ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
    244404     if(!--iTimeout) {
    245405       break;
     
    251411   */
    252412
    253   (*setData)(pMC68681, cChar);
     413  (*setReg)(pMC68681_port, MC68681_TX_BUFFER, cChar);
    254414}
    255415
     
    657817)
    658818{
    659   unsigned32           pMC68681;
     819  unsigned32           pMC68681_port;
    660820  unsigned char        ucLineStatus;
    661821  char                 cChar;
    662822  getRegister_f        getReg;
    663   getData_f            getData;
    664 
    665   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    666   getReg   = Console_Port_Tbl[minor].getRegister;
    667   getData  = Console_Port_Tbl[minor].getData;
    668 
    669   ucLineStatus = (*getReg)(pMC68681, MC68681_STATUS);
     823
     824  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
     825  getReg        = Console_Port_Tbl[minor].getRegister;
     826
     827  ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
    670828  if(ucLineStatus & MC68681_RX_READY) {
    671     cChar = (*getData)(pMC68681);
     829    cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
    672830    return (int)cChar;
    673831  } else {
    674     return(-1);
    675   }
    676 }
     832    return -1;
     833  }
     834}
Note: See TracChangeset for help on using the changeset viewer.