Changeset 4f0ffa57 in rtems


Ignore:
Timestamp:
Jun 23, 1998, 5:42:46 PM (22 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
414ab59
Parents:
ae21568c
Message:

Removed RTS and DTR handling code since the MC68681 seems to only have
automatic handling of RTS/CTS. This only protects the on-chip buffers
and FIFOs -- not the termios queues as the RTS/CTS code in here did. It
may be necessary in the future to enable this automatic support.

Interrupt processing code added.

In some places, channel and duart base addresses were swapped.

Location:
c/src
Files:
6 edited

Legend:

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

    rae21568c r4f0ffa57  
    3030 * Flow control is only supported when using interrupts
    3131 */
    32 
    33 console_flow mc68681_flow_RTSCTS =
    34 {
    35   mc68681_negate_RTS,             /* deviceStopRemoteTx */
    36   mc68681_assert_RTS              /* deviceStartRemoteTx */
    37 };
    38 
    39 console_flow mc68681_flow_DTRCTS =
    40 {
    41   mc68681_negate_DTR,             /* deviceStopRemoteTx */
    42   mc68681_assert_DTR              /* deviceStartRemoteTx */
    43 };
    4432
    4533console_fns mc68681_fns =
     
    123111
    124112  if ( !acr_bit ) {
     113    /*
     114     *  Baud Rate Set 1
     115     */
     116
    125117    switch (baud & CBAUD) {
    126118      case B50:    baud_mask = 0x00; break;
     
    149141    }
    150142  } else {
     143    /*
     144     *  Baud Rate Set 2
     145     */
     146
    151147    switch (baud & CBAUD) {
    152148      case B75:    baud_mask = 0x00; break;
     
    202198  rtems_interrupt_level  Irql;
    203199
    204   pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
    205   pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
     200  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
     201  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
    206202  setReg        = Console_Port_Tbl[minor].setRegister;
    207203
     
    294290  }
    295291
    296   pmc68681Context->ucModemCtrl = 0x00;   /* XXX */
    297292}
    298293
     
    306301
    307302static unsigned int mc68681_build_imr(
    308   int minor
     303  int  minor,
     304  int  enable_flag
    309305)
    310306{
     
    344340
    345341  mask = 0;
    346   if ( Console_Port_Tbl[minor].pDeviceFns->deviceOutputUsesInterrupts ) {
    347     if ( pMC68681 == pMC68681_port )
    348        mask = 0x03;
    349     else
    350        mask = 0x30;
     342  if ( enable_flag ) {
     343    if ( Console_Port_Tbl[minor].pDeviceFns->deviceOutputUsesInterrupts ) {
     344      if ( pMC68681 == pMC68681_port )
     345         mask = 0x03;
     346      else
     347         mask = 0x30;
     348    }
    351349  }
    352350
     
    374372  mc68681_initialize_context( minor, pmc68681Context );
    375373
    376   pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
    377   pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
     374  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
     375  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
    378376  setReg        = Console_Port_Tbl[minor].setRegister;
    379377  getReg        = Console_Port_Tbl[minor].getRegister;
     
    394392  (*setReg)( pMC68681, MC68681_MODE_REG_1A, 0x00 );
    395393  (*setReg)( pMC68681, MC68681_MODE_REG_2A, 0x02 );
     394
     395  /*
     396   *  Disable interrupts on RX and TX for this port
     397   */
     398
     399  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr(minor, 0));
    396400}
    397401
     
    442446  (*setReg)( pMC68681, MC68681_INTERRUPT_VECTOR_REG, vector );
    443447
    444   /*
    445    * Assert DTR
    446    */
    447 
    448   if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_DTRCTS) {
    449     mc68681_assert_DTR(minor);
    450   }
    451 
    452   return(RTEMS_SUCCESSFUL);
     448  return RTEMS_SUCCESSFUL;
    453449}
    454450
     
    479475  (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_TX );
    480476  (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_RX );
    481 
    482   /*
    483    * Negate DTR
    484    */
    485 
    486   if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_DTRCTS) {
    487     mc68681_negate_DTR(minor);
    488   }
    489477
    490478  return(RTEMS_SUCCESSFUL);
     
    540528
    541529/*
    542  * These routines provide control of the RTS and DTR lines
    543  */
    544 
    545 /*
    546  *  mc68681_assert_RTS
    547  */
    548 
    549 static int mc68681_assert_RTS(int minor)
    550 {
    551 /* XXX */
    552 
     530 *  mc68681_process
     531 *
     532 *  This routine is the per port console interrupt handler.
     533 */
     534
     535static void mc68681_process(
     536  int  minor
     537)
     538{
    553539  unsigned32              pMC68681;
    554   unsigned32              Irql;
    555   mc68681_context        *pmc68681Context;
    556   setRegister_f           setReg;
    557 
    558 
    559   pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
    560 
    561   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    562   setReg   = Console_Port_Tbl[minor].setRegister;
    563 
    564   /*
    565    * Assert RTS
    566    */
    567   rtems_interrupt_disable(Irql);
    568 #if 0
    569   pmc68681Context->ucModemCtrl |= SP_MODEM_RTS;
    570   (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
    571 #endif
    572   rtems_interrupt_enable(Irql);
    573   return 0;
    574 }
    575 
    576 /*
    577  *  mc68681_negate_RTS
    578  */
    579 
    580 static int mc68681_negate_RTS(int minor)
    581 {
    582 /* XXX */
    583   unsigned32              pMC68681;
    584   unsigned32              Irql;
    585   mc68681_context        *pmc68681Context;
    586   setRegister_f           setReg;
    587 
    588   pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
    589 
    590   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    591   setReg   = Console_Port_Tbl[minor].setRegister;
    592 
    593   /*
    594    * Negate RTS
    595    */
    596   rtems_interrupt_disable(Irql);
    597 #if 0
    598   pmc68681Context->ucModemCtrl &= ~SP_MODEM_RTS;
    599   (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
    600 #endif
    601   rtems_interrupt_enable(Irql);
    602   return 0;
    603 }
    604 
    605 /*
    606  * These flow control routines utilize a connection from the local DTR
    607  * line to the remote CTS line
    608  */
    609 
    610 /*
    611  *  mc68681_assert_DTR
    612  */
    613 
    614 static int mc68681_assert_DTR(int minor)
    615 {
    616 /* XXX */
    617   unsigned32              pMC68681;
    618   unsigned32              Irql;
    619   mc68681_context        *pmc68681Context;
    620   setRegister_f           setReg;
    621 
    622   pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
    623 
    624   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    625   setReg   = Console_Port_Tbl[minor].setRegister;
    626 
    627   /*
    628    * Assert DTR
    629    */
    630   rtems_interrupt_disable(Irql);
    631 #if 0
    632   pmc68681Context->ucModemCtrl |= SP_MODEM_DTR;
    633   (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
    634 #endif
    635   rtems_interrupt_enable(Irql);
    636   return 0;
    637 }
    638 
    639 /*
    640  *  mc68681_negate_DTR
    641  */
    642 
    643 static int mc68681_negate_DTR(int minor)
    644 {
    645 /* XXX */
    646   unsigned32              pMC68681;
    647   unsigned32              Irql;
    648   mc68681_context        *pmc68681Context;
    649   setRegister_f           setReg;
    650 
    651   pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
    652 
    653   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    654   setReg   = Console_Port_Tbl[minor].setRegister;
    655 
    656   /*
    657    * Negate DTR
    658    */
    659   rtems_interrupt_disable(Irql);
    660 #if 0
    661   pmc68681Context->ucModemCtrl &= ~SP_MODEM_DTR;
    662   (*setReg)(pMC68681, MC68681_MODEM_CONTROL,pmc68681Context->ucModemCtrl);
    663 #endif
    664   rtems_interrupt_enable(Irql);
    665   return 0;
    666 }
    667 
    668 /*
    669  *  mc68681_isr
    670  *
    671  *  This routine is the console interrupt handler.
    672  */
    673 
    674 static void mc68681_process(
    675         int             minor
    676 )
    677 {
    678 /* XXX */
    679   unsigned32              pMC68681;
     540  unsigned32              pMC68681_port;
    680541  volatile unsigned8      ucLineStatus;
    681   volatile unsigned8      ucInterruptId;
    682542  char                    cChar;
    683543  getRegister_f           getReg;
    684544  setRegister_f           setReg;
    685545
    686 #if 1
    687 cChar = ucInterruptId = ucLineStatus = 0;
    688 #endif
    689   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    690   getReg   = Console_Port_Tbl[minor].getRegister;
    691   setReg   = Console_Port_Tbl[minor].setRegister;
    692 
    693 #if 0
    694   do {
     546  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
     547  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
     548  getReg        = Console_Port_Tbl[minor].getRegister;
     549  setReg        = Console_Port_Tbl[minor].setRegister;
     550
     551  /*
     552   * Deal with any received characters
     553   */
     554  while(TRUE) {
     555    ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
     556    if(!(ucLineStatus & MC68681_RX_READY)) {
     557      break;
     558    }
    695559    /*
    696      * Deal with any received characters
     560     *  If there is a RX error, then dump all the data.
    697561     */
    698     while(TRUE) {
    699       ucLineStatus = (*getReg)(pMC68681, MC68681_LINE_STATUS);
    700       if(~ucLineStatus & SP_LSR_RDY) {
    701         break;
    702       }
    703       cChar = (*getReg)(pMC68681, MC68681_RECEIVE_BUFFER);
    704       rtems_termios_enqueue_raw_characters(
    705         Console_Port_Data[minor].termios_data,
    706         &cChar,
    707         1
    708       );
    709     }
    710 
    711     while(TRUE) {
    712       if(Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
    713         Console_Port_Data[minor].bActive = FALSE;
    714         if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
    715           mc68681_negate_RTS(minor);
    716         }
    717 
    718         /*
    719          * There is no data to transmit
    720          */
    721         break;
    722       }
    723 
    724       ucLineStatus = (*getReg)(pMC68681, MC68681_LINE_STATUS);
    725       if(~ucLineStatus & SP_LSR_THOLD) {
    726         /*
    727          * We'll get another interrupt when
    728          * the transmitter holding reg. becomes
    729          * free again
    730          */
    731         break;
    732       }
    733 
    734       Ring_buffer_Remove_character( &Console_Port_Data[minor].TxBuffer, cChar);
     562    if ( ucLineStatus & MC68681_RX_ERRORS ) {
     563      do {
     564        cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
     565        ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
     566      } while ( ucLineStatus & MC68681_RX_READY );
     567      continue;
     568    }
     569    cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
     570    rtems_termios_enqueue_raw_characters(
     571      Console_Port_Data[minor].termios_data,
     572      &cChar,
     573      1
     574    );
     575  }
     576
     577  /*
     578   *  Deal with the transmitter
     579   */
     580
     581  while(TRUE) {
     582    if(Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
     583      Console_Port_Data[minor].bActive = FALSE;
     584
    735585      /*
    736        * transmit character
     586       * There is no data to transmit
    737587       */
    738       (*setReg)(pMC68681, MC68681_TRANSMIT_BUFFER, cChar);
    739     }
    740 
    741     ucInterruptId = (*getReg)(pMC68681, MC68681_INTERRUPT_ID);
    742   }
    743   while((ucInterruptId&0xf) != 0x1);
    744 #endif
    745 }
     588      break;
     589    }
     590
     591    ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
     592    if(!(ucLineStatus & (MC68681_TX_EMPTY|MC68681_TX_READY))) {
     593      /*
     594       *  We'll get another interrupt when the TX can take another character.
     595       */
     596      break;
     597    }
     598
     599    Ring_buffer_Remove_character( &Console_Port_Data[minor].TxBuffer, cChar);
     600    /*
     601     * transmit character
     602     */
     603    (*setReg)(pMC68681_port, MC68681_TX_BUFFER, cChar);
     604  }
     605
     606}
     607
     608/*
     609 *  mc68681_isr
     610 *
     611 *  This is the single interrupt entry point which parcels interrupts
     612 *  out to the various ports.
     613 */
    746614
    747615static rtems_isr mc68681_isr(
     
    803671   */
    804672
    805   (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr( minor ));
     673  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr(minor, 1));
    806674}
    807675
     
    849717        rtems_interrupt_disable(Irql);
    850718        Console_Port_Data[minor].bActive = TRUE;
    851         if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
    852           mc68681_assert_RTS(minor);
    853         }
    854719        mc68681_process(minor);
    855720        rtems_interrupt_enable(Irql);
     
    882747    rtems_interrupt_disable(Irql);
    883748    Console_Port_Data[minor].bActive = TRUE;
    884     if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
    885       mc68681_assert_RTS(minor);
    886     }
    887749    mc68681_process(minor);
    888750    rtems_interrupt_enable(Irql);
  • c/src/lib/libchip/serial/mc68681.h

    rae21568c r4f0ffa57  
    4747extern console_fns mc68681_fns_polled;
    4848
    49 /*
    50  * Flow control function tables
    51  */
    52 
    53 extern console_flow mc68681_flow_RTSCTS;
    54 extern console_flow mc68681_flow_DTRCTS;
    55 
    5649#ifdef __cplusplus
    5750}
  • c/src/lib/libchip/serial/mc68681_p.h

    rae21568c r4f0ffa57  
    166166#define MC68681_RECEIVED_BREAK                              0x80
    167167
     168#define MC68681_RX_ERRORS \
     169  (MC68681_OVERRUN_ERROR|MC68681_PARITY_ERROR| \
     170   MC68681_FRAMING_ERROR|MC68681_RECEIVED_BREAK)
     171
    168172/*
    169173 * Interupt Status Register Definitions.
     
    226230{
    227231  int        mate;
    228   unsigned8  ucModemCtrl;
    229232} mc68681_context;
    230233
     
    256259  int   minor,
    257260  char  cChar
    258 );
    259 
    260 static int mc68681_assert_RTS(
    261   int minor
    262 );
    263 
    264 static int mc68681_negate_RTS(
    265   int minor
    266 );
    267 
    268 static int mc68681_assert_DTR(
    269   int minor
    270 );
    271 
    272 static int mc68681_negate_DTR(
    273   int minor
    274261);
    275262
  • c/src/libchip/serial/mc68681.c

    rae21568c r4f0ffa57  
    3030 * Flow control is only supported when using interrupts
    3131 */
    32 
    33 console_flow mc68681_flow_RTSCTS =
    34 {
    35   mc68681_negate_RTS,             /* deviceStopRemoteTx */
    36   mc68681_assert_RTS              /* deviceStartRemoteTx */
    37 };
    38 
    39 console_flow mc68681_flow_DTRCTS =
    40 {
    41   mc68681_negate_DTR,             /* deviceStopRemoteTx */
    42   mc68681_assert_DTR              /* deviceStartRemoteTx */
    43 };
    4432
    4533console_fns mc68681_fns =
     
    123111
    124112  if ( !acr_bit ) {
     113    /*
     114     *  Baud Rate Set 1
     115     */
     116
    125117    switch (baud & CBAUD) {
    126118      case B50:    baud_mask = 0x00; break;
     
    149141    }
    150142  } else {
     143    /*
     144     *  Baud Rate Set 2
     145     */
     146
    151147    switch (baud & CBAUD) {
    152148      case B75:    baud_mask = 0x00; break;
     
    202198  rtems_interrupt_level  Irql;
    203199
    204   pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
    205   pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
     200  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
     201  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
    206202  setReg        = Console_Port_Tbl[minor].setRegister;
    207203
     
    294290  }
    295291
    296   pmc68681Context->ucModemCtrl = 0x00;   /* XXX */
    297292}
    298293
     
    306301
    307302static unsigned int mc68681_build_imr(
    308   int minor
     303  int  minor,
     304  int  enable_flag
    309305)
    310306{
     
    344340
    345341  mask = 0;
    346   if ( Console_Port_Tbl[minor].pDeviceFns->deviceOutputUsesInterrupts ) {
    347     if ( pMC68681 == pMC68681_port )
    348        mask = 0x03;
    349     else
    350        mask = 0x30;
     342  if ( enable_flag ) {
     343    if ( Console_Port_Tbl[minor].pDeviceFns->deviceOutputUsesInterrupts ) {
     344      if ( pMC68681 == pMC68681_port )
     345         mask = 0x03;
     346      else
     347         mask = 0x30;
     348    }
    351349  }
    352350
     
    374372  mc68681_initialize_context( minor, pmc68681Context );
    375373
    376   pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
    377   pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
     374  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
     375  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
    378376  setReg        = Console_Port_Tbl[minor].setRegister;
    379377  getReg        = Console_Port_Tbl[minor].getRegister;
     
    394392  (*setReg)( pMC68681, MC68681_MODE_REG_1A, 0x00 );
    395393  (*setReg)( pMC68681, MC68681_MODE_REG_2A, 0x02 );
     394
     395  /*
     396   *  Disable interrupts on RX and TX for this port
     397   */
     398
     399  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr(minor, 0));
    396400}
    397401
     
    442446  (*setReg)( pMC68681, MC68681_INTERRUPT_VECTOR_REG, vector );
    443447
    444   /*
    445    * Assert DTR
    446    */
    447 
    448   if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_DTRCTS) {
    449     mc68681_assert_DTR(minor);
    450   }
    451 
    452   return(RTEMS_SUCCESSFUL);
     448  return RTEMS_SUCCESSFUL;
    453449}
    454450
     
    479475  (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_TX );
    480476  (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_RX );
    481 
    482   /*
    483    * Negate DTR
    484    */
    485 
    486   if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_DTRCTS) {
    487     mc68681_negate_DTR(minor);
    488   }
    489477
    490478  return(RTEMS_SUCCESSFUL);
     
    540528
    541529/*
    542  * These routines provide control of the RTS and DTR lines
    543  */
    544 
    545 /*
    546  *  mc68681_assert_RTS
    547  */
    548 
    549 static int mc68681_assert_RTS(int minor)
    550 {
    551 /* XXX */
    552 
     530 *  mc68681_process
     531 *
     532 *  This routine is the per port console interrupt handler.
     533 */
     534
     535static void mc68681_process(
     536  int  minor
     537)
     538{
    553539  unsigned32              pMC68681;
    554   unsigned32              Irql;
    555   mc68681_context        *pmc68681Context;
    556   setRegister_f           setReg;
    557 
    558 
    559   pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
    560 
    561   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    562   setReg   = Console_Port_Tbl[minor].setRegister;
    563 
    564   /*
    565    * Assert RTS
    566    */
    567   rtems_interrupt_disable(Irql);
    568 #if 0
    569   pmc68681Context->ucModemCtrl |= SP_MODEM_RTS;
    570   (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
    571 #endif
    572   rtems_interrupt_enable(Irql);
    573   return 0;
    574 }
    575 
    576 /*
    577  *  mc68681_negate_RTS
    578  */
    579 
    580 static int mc68681_negate_RTS(int minor)
    581 {
    582 /* XXX */
    583   unsigned32              pMC68681;
    584   unsigned32              Irql;
    585   mc68681_context        *pmc68681Context;
    586   setRegister_f           setReg;
    587 
    588   pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
    589 
    590   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    591   setReg   = Console_Port_Tbl[minor].setRegister;
    592 
    593   /*
    594    * Negate RTS
    595    */
    596   rtems_interrupt_disable(Irql);
    597 #if 0
    598   pmc68681Context->ucModemCtrl &= ~SP_MODEM_RTS;
    599   (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
    600 #endif
    601   rtems_interrupt_enable(Irql);
    602   return 0;
    603 }
    604 
    605 /*
    606  * These flow control routines utilize a connection from the local DTR
    607  * line to the remote CTS line
    608  */
    609 
    610 /*
    611  *  mc68681_assert_DTR
    612  */
    613 
    614 static int mc68681_assert_DTR(int minor)
    615 {
    616 /* XXX */
    617   unsigned32              pMC68681;
    618   unsigned32              Irql;
    619   mc68681_context        *pmc68681Context;
    620   setRegister_f           setReg;
    621 
    622   pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
    623 
    624   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    625   setReg   = Console_Port_Tbl[minor].setRegister;
    626 
    627   /*
    628    * Assert DTR
    629    */
    630   rtems_interrupt_disable(Irql);
    631 #if 0
    632   pmc68681Context->ucModemCtrl |= SP_MODEM_DTR;
    633   (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
    634 #endif
    635   rtems_interrupt_enable(Irql);
    636   return 0;
    637 }
    638 
    639 /*
    640  *  mc68681_negate_DTR
    641  */
    642 
    643 static int mc68681_negate_DTR(int minor)
    644 {
    645 /* XXX */
    646   unsigned32              pMC68681;
    647   unsigned32              Irql;
    648   mc68681_context        *pmc68681Context;
    649   setRegister_f           setReg;
    650 
    651   pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
    652 
    653   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    654   setReg   = Console_Port_Tbl[minor].setRegister;
    655 
    656   /*
    657    * Negate DTR
    658    */
    659   rtems_interrupt_disable(Irql);
    660 #if 0
    661   pmc68681Context->ucModemCtrl &= ~SP_MODEM_DTR;
    662   (*setReg)(pMC68681, MC68681_MODEM_CONTROL,pmc68681Context->ucModemCtrl);
    663 #endif
    664   rtems_interrupt_enable(Irql);
    665   return 0;
    666 }
    667 
    668 /*
    669  *  mc68681_isr
    670  *
    671  *  This routine is the console interrupt handler.
    672  */
    673 
    674 static void mc68681_process(
    675         int             minor
    676 )
    677 {
    678 /* XXX */
    679   unsigned32              pMC68681;
     540  unsigned32              pMC68681_port;
    680541  volatile unsigned8      ucLineStatus;
    681   volatile unsigned8      ucInterruptId;
    682542  char                    cChar;
    683543  getRegister_f           getReg;
    684544  setRegister_f           setReg;
    685545
    686 #if 1
    687 cChar = ucInterruptId = ucLineStatus = 0;
    688 #endif
    689   pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
    690   getReg   = Console_Port_Tbl[minor].getRegister;
    691   setReg   = Console_Port_Tbl[minor].setRegister;
    692 
    693 #if 0
    694   do {
     546  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
     547  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
     548  getReg        = Console_Port_Tbl[minor].getRegister;
     549  setReg        = Console_Port_Tbl[minor].setRegister;
     550
     551  /*
     552   * Deal with any received characters
     553   */
     554  while(TRUE) {
     555    ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
     556    if(!(ucLineStatus & MC68681_RX_READY)) {
     557      break;
     558    }
    695559    /*
    696      * Deal with any received characters
     560     *  If there is a RX error, then dump all the data.
    697561     */
    698     while(TRUE) {
    699       ucLineStatus = (*getReg)(pMC68681, MC68681_LINE_STATUS);
    700       if(~ucLineStatus & SP_LSR_RDY) {
    701         break;
    702       }
    703       cChar = (*getReg)(pMC68681, MC68681_RECEIVE_BUFFER);
    704       rtems_termios_enqueue_raw_characters(
    705         Console_Port_Data[minor].termios_data,
    706         &cChar,
    707         1
    708       );
    709     }
    710 
    711     while(TRUE) {
    712       if(Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
    713         Console_Port_Data[minor].bActive = FALSE;
    714         if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
    715           mc68681_negate_RTS(minor);
    716         }
    717 
    718         /*
    719          * There is no data to transmit
    720          */
    721         break;
    722       }
    723 
    724       ucLineStatus = (*getReg)(pMC68681, MC68681_LINE_STATUS);
    725       if(~ucLineStatus & SP_LSR_THOLD) {
    726         /*
    727          * We'll get another interrupt when
    728          * the transmitter holding reg. becomes
    729          * free again
    730          */
    731         break;
    732       }
    733 
    734       Ring_buffer_Remove_character( &Console_Port_Data[minor].TxBuffer, cChar);
     562    if ( ucLineStatus & MC68681_RX_ERRORS ) {
     563      do {
     564        cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
     565        ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
     566      } while ( ucLineStatus & MC68681_RX_READY );
     567      continue;
     568    }
     569    cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
     570    rtems_termios_enqueue_raw_characters(
     571      Console_Port_Data[minor].termios_data,
     572      &cChar,
     573      1
     574    );
     575  }
     576
     577  /*
     578   *  Deal with the transmitter
     579   */
     580
     581  while(TRUE) {
     582    if(Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
     583      Console_Port_Data[minor].bActive = FALSE;
     584
    735585      /*
    736        * transmit character
     586       * There is no data to transmit
    737587       */
    738       (*setReg)(pMC68681, MC68681_TRANSMIT_BUFFER, cChar);
    739     }
    740 
    741     ucInterruptId = (*getReg)(pMC68681, MC68681_INTERRUPT_ID);
    742   }
    743   while((ucInterruptId&0xf) != 0x1);
    744 #endif
    745 }
     588      break;
     589    }
     590
     591    ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
     592    if(!(ucLineStatus & (MC68681_TX_EMPTY|MC68681_TX_READY))) {
     593      /*
     594       *  We'll get another interrupt when the TX can take another character.
     595       */
     596      break;
     597    }
     598
     599    Ring_buffer_Remove_character( &Console_Port_Data[minor].TxBuffer, cChar);
     600    /*
     601     * transmit character
     602     */
     603    (*setReg)(pMC68681_port, MC68681_TX_BUFFER, cChar);
     604  }
     605
     606}
     607
     608/*
     609 *  mc68681_isr
     610 *
     611 *  This is the single interrupt entry point which parcels interrupts
     612 *  out to the various ports.
     613 */
    746614
    747615static rtems_isr mc68681_isr(
     
    803671   */
    804672
    805   (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr( minor ));
     673  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr(minor, 1));
    806674}
    807675
     
    849717        rtems_interrupt_disable(Irql);
    850718        Console_Port_Data[minor].bActive = TRUE;
    851         if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
    852           mc68681_assert_RTS(minor);
    853         }
    854719        mc68681_process(minor);
    855720        rtems_interrupt_enable(Irql);
     
    882747    rtems_interrupt_disable(Irql);
    883748    Console_Port_Data[minor].bActive = TRUE;
    884     if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
    885       mc68681_assert_RTS(minor);
    886     }
    887749    mc68681_process(minor);
    888750    rtems_interrupt_enable(Irql);
  • c/src/libchip/serial/mc68681.h

    rae21568c r4f0ffa57  
    4747extern console_fns mc68681_fns_polled;
    4848
    49 /*
    50  * Flow control function tables
    51  */
    52 
    53 extern console_flow mc68681_flow_RTSCTS;
    54 extern console_flow mc68681_flow_DTRCTS;
    55 
    5649#ifdef __cplusplus
    5750}
  • c/src/libchip/serial/mc68681_p.h

    rae21568c r4f0ffa57  
    166166#define MC68681_RECEIVED_BREAK                              0x80
    167167
     168#define MC68681_RX_ERRORS \
     169  (MC68681_OVERRUN_ERROR|MC68681_PARITY_ERROR| \
     170   MC68681_FRAMING_ERROR|MC68681_RECEIVED_BREAK)
     171
    168172/*
    169173 * Interupt Status Register Definitions.
     
    226230{
    227231  int        mate;
    228   unsigned8  ucModemCtrl;
    229232} mc68681_context;
    230233
     
    256259  int   minor,
    257260  char  cChar
    258 );
    259 
    260 static int mc68681_assert_RTS(
    261   int minor
    262 );
    263 
    264 static int mc68681_negate_RTS(
    265   int minor
    266 );
    267 
    268 static int mc68681_assert_DTR(
    269   int minor
    270 );
    271 
    272 static int mc68681_negate_DTR(
    273   int minor
    274261);
    275262
Note: See TracChangeset for help on using the changeset viewer.