Changeset e97e0e0 in rtems


Ignore:
Timestamp:
Sep 22, 2008, 11:46:15 AM (11 years ago)
Author:
Thomas Doerfler <Thomas.Doerfler@…>
Branches:
4.10, 4.11, master
Children:
8dcfc0a
Parents:
31c14d9
Message:

Include required header files. Removed support for old PowerPC exception handling. Various fixes for interrupt related routines. Added support for BSPs with IRQ extension API.

Location:
c/src/libchip/serial
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • c/src/libchip/serial/ns16550.c

    r31c14d9 re97e0e0  
    2121 */
    2222
     23#include <stdlib.h>
     24
    2325#include <rtems.h>
    2426#include <rtems/libio.h>
    25 #include <stdlib.h>
    2627#include <rtems/ringbuf.h>
     28#include <rtems/bspIo.h>
    2729
    2830#include <libchip/serial.h>
    2931#include <libchip/sersupp.h>
    30 #include <rtems/bspIo.h>
     32
     33#include <bsp/irq.h>
     34
    3135#include "ns16550_p.h"
     36
     37#ifdef BSP_FEATURE_IRQ_EXTENSION
     38  /* Nothing to do */
     39#elif defined BSP_FEATURE_IRQ_LEGACY
     40  /* Nothing to do */
     41#elif defined __PPC__
     42  #define BSP_FEATURE_IRQ_LEGACY
     43  #ifdef BSP_SHARED_HANDLER_SUPPORT
     44    #define BSP_FEATURE_IRQ_LEGACY_SHARED_HANDLER_SUPPORT
     45  #endif
     46#else
     47  #warning No interrupt support available
     48#endif
    3249
    3350/*
     
    6986};
    7087
    71 #if defined(__PPC__)
    72 #ifdef _OLD_EXCEPTIONS
    73 extern void set_vector( rtems_isr_entry, rtems_vector_number, int );
    74 #else
    75 #include <bsp/irq.h>
    76 #endif
    77 #endif
    78 
    7988/*
    8089 *  ns16550_init
     
    93102  pns16550Context=(ns16550_context *)malloc(sizeof(ns16550_context));
    94103
     104  if (pns16550Context == NULL) {
     105    printk( "%s: Error: Not enough memory\n", __func__);
     106    rtems_fatal_error_occurred( 0xdeadbeef);
     107  }
     108
    95109  Console_Port_Data[minor].pDeviceContext=(void *)pns16550Context;
    96110  pns16550Context->ucModemCtrl=SP_MODEM_IRQ;
     
    118132
    119133  /* XXX */
    120   (*setReg)(pNS16550, NS16550_TRANSMIT_BUFFER, ulBaudDivisor&0xff);
    121   (*setReg)(pNS16550, NS16550_INTERRUPT_ENABLE, (ulBaudDivisor>>8)&0xff);
     134  (*setReg)(pNS16550, NS16550_TRANSMIT_BUFFER, (uint8_t) (ulBaudDivisor & 0xffU));
     135  (*setReg)(pNS16550, NS16550_INTERRUPT_ENABLE, (uint8_t) ((ulBaudDivisor >> 8) & 0xffU));
    122136
    123137  /* Clear the divisor latch and set the character size to eight bits */
     
    442456 */
    443457
    444 NS16550_STATIC void ns16550_process(
    445         int             minor
    446 )
    447 {
     458NS16550_STATIC void ns16550_process( int minor)
     459{
     460  console_tbl *c = &Console_Port_Tbl [minor];
     461  console_data *d = &Console_Port_Data [minor];
     462
    448463  uint32_t                pNS16550;
    449464  volatile uint8_t        ucLineStatus;
     
    453468  setRegister_f           setReg;
    454469
    455   pNS16550 = Console_Port_Tbl[minor].ulCtrlPort1;
    456   getReg   = Console_Port_Tbl[minor].getRegister;
    457   setReg   = Console_Port_Tbl[minor].setRegister;
     470  pNS16550 = c->ulCtrlPort1;
     471  getReg   = c->getRegister;
     472  setReg   = c->setRegister;
    458473
    459474  do {
     
    461476     * Deal with any received characters
    462477     */
    463     while(true) {
     478    while (true) {
    464479      ucLineStatus = (*getReg)(pNS16550, NS16550_LINE_STATUS);
    465       if(~ucLineStatus & SP_LSR_RDY) {
     480      if (~ucLineStatus & SP_LSR_RDY) {
    466481        break;
    467482      }
    468483      cChar = (*getReg)(pNS16550, NS16550_RECEIVE_BUFFER);
    469484      rtems_termios_enqueue_raw_characters(
    470         Console_Port_Data[minor].termios_data,
     485        d->termios_data,
    471486        &cChar,
    472487        1
     
    478493     */
    479494
    480     while(true) {
    481         ucLineStatus = (*getReg)(pNS16550, NS16550_LINE_STATUS);
    482         if(~ucLineStatus & SP_LSR_THOLD) {
    483           /*
    484            * We'll get another interrupt when
    485            * the transmitter holding reg. becomes
    486            * free again
    487            */
    488           break;
    489         }
    490 
    491 #if 0
    492         /* XXX flow control not completely supported in libchip */
    493 
    494         if(Console_Port_Tbl[minor].pDeviceFlow != &ns16550_flow_RTSCTS) {
     495    while (true) {
     496      ucLineStatus = (*getReg)(pNS16550, NS16550_LINE_STATUS);
     497      if (~ucLineStatus & SP_LSR_THOLD) {
     498        /*
     499         * We'll get another interrupt when
     500         * the transmitter holding reg. becomes
     501         * free again
     502         */
     503        break;
     504      }
     505
     506      if (rtems_termios_dequeue_characters( d->termios_data, 1) == 0) {
     507        if (c->pDeviceFlow != &ns16550_flow_RTSCTS) {
    495508          ns16550_negate_RTS(minor);
    496509        }
    497 #endif
    498 
    499     rtems_termios_dequeue_characters(Console_Port_Data[minor].termios_data, 1);
    500     if (rtems_termios_dequeue_characters(
    501          Console_Port_Data[minor].termios_data, 1)) {
    502         if (Console_Port_Tbl[minor].pDeviceFlow != &ns16550_flow_RTSCTS) {
    503           ns16550_negate_RTS(minor);
    504         }
    505         Console_Port_Data[minor].bActive = FALSE;
     510        d->bActive = false;
    506511        ns16550_enable_interrupts(minor, NS16550_ENABLE_ALL_INTR_EXCEPT_TX);
    507512        break;
    508513      }
    509 
    510       ucInterruptId = (*getReg)(pNS16550, NS16550_INTERRUPT_ID);
    511514    }
     515
     516    ucInterruptId = (*getReg)(pNS16550, NS16550_INTERRUPT_ID);
    512517  } while((ucInterruptId&0xf)!=0x1);
    513518}
    514 
    515 #if defined(__PPC__)
    516 #ifdef _OLD_EXCEPTIONS
    517 
    518 /*
    519  *  ns16550_isr
    520  */
    521 
    522 NS16550_STATIC rtems_isr ns16550_isr(
    523   rtems_vector_number vector
    524 )
    525 {
    526   int     minor;
    527 
    528   for(minor=0;minor<Console_Port_Count;minor++) {
    529     if(Console_Port_Tbl[minor].ulIntVector == vector &&
    530        Console_Port_Tbl[minor].deviceType == SERIAL_NS16550 ) {
    531       ns16550_process(minor);
    532     }
    533   }
    534 }
    535 
    536 #else
    537 
    538 NS16550_STATIC rtems_isr ns16550_isr(
    539   void *entry
    540 )
    541 {
    542   console_tbl *ptr = entry;
    543   int         minor;
    544 
    545   for(minor=0;minor<Console_Port_Count;minor++) {
    546     if( &Console_Port_Tbl[minor] == ptr ) {
    547       ns16550_process(minor);
    548     }
    549   }
    550 
    551 }
    552 
    553 #endif
    554 #endif
    555519
    556520/*
     
    574538}
    575539
     540#ifdef BSP_FEATURE_IRQ_EXTENSION
     541  NS16550_STATIC void ns16550_isr( rtems_vector_number vector, void *arg)
     542  {
     543    int minor = (int) arg;
     544
     545    ns16550_process( minor);
     546  }
     547#elif defined BSP_FEATURE_IRQ_LEGACY
     548  NS16550_STATIC rtems_isr ns16550_isr( void *arg)
     549  {
     550    int minor = (int) arg;
     551
     552    ns16550_process( minor);
     553  }
     554#endif
     555
    576556/*
    577557 *  ns16550_initialize_interrupts
     
    579559 *  This routine initializes the port to operate in interrupt driver mode.
    580560 */
    581 
    582 #if defined(__PPC__)
    583 #ifdef _OLD_EXCEPTIONS
    584 NS16550_STATIC void ns16550_initialize_interrupts(int minor)
    585 {
    586   ns16550_init(minor);
    587 
    588   Console_Port_Data[minor].bActive = FALSE;
    589 
    590   set_vector(ns16550_isr, Console_Port_Tbl[minor].ulIntVector, 1);
     561NS16550_STATIC void ns16550_initialize_interrupts( int minor)
     562{
     563  console_tbl *c = &Console_Port_Tbl [minor];
     564  console_data *d = &Console_Port_Data [minor];
     565
     566  ns16550_init( minor);
     567
     568  d->bActive = false;
     569
     570  #ifdef BSP_FEATURE_IRQ_EXTENSION
     571    {
     572      rtems_status_code sc = RTEMS_SUCCESSFUL;
     573      sc = rtems_interrupt_handler_install(
     574        c->ulIntVector,
     575        "NS16550",
     576        RTEMS_INTERRUPT_SHARED,
     577        ns16550_isr,
     578        (void *) minor
     579      );
     580      if (sc != RTEMS_SUCCESSFUL) {
     581        /* FIXME */
     582        printk( "%s: Error: Install interrupt handler\n", __func__);
     583        rtems_fatal_error_occurred( 0xdeadbeef);
     584      }
     585    }
     586  #elif defined BSP_FEATURE_IRQ_LEGACY
     587    {
     588      int rv = 0;
     589      #ifdef BSP_FEATURE_IRQ_LEGACY_SHARED_HANDLER_SUPPORT
     590        rtems_irq_connect_data cd = {
     591          c->ulIntVector,
     592          ns16550_isr,
     593          (void *) minor
     594          NULL,
     595          NULL,
     596          NULL,
     597          NULL
     598        };
     599        rv = BSP_install_rtems_shared_irq_handler( &cd);
     600      #else
     601        rtems_irq_connect_data cd = {
     602          c->ulIntVector,
     603          ns16550_isr,
     604          (void *) minor
     605          NULL,
     606          NULL,
     607          NULL
     608        };
     609        rv = BSP_install_rtems_irq_handler( &cd);
     610      #endif
     611      if (rv == 0) {
     612        /* FIXME */
     613        printk( "%s: Error: Install interrupt handler\n", __func__);
     614        rtems_fatal_error_occurred( 0xdeadbeef);
     615      }
     616    }
     617  #endif
    591618 
    592   ns16550_enable_interrupts(minor, NS16550_ENABLE_ALL_INTR);
    593 }
    594 #else
    595 
    596 NS16550_STATIC void ns16550_initialize_interrupts(int minor)
    597 {
    598 #ifdef BSP_SHARED_HANDLER_SUPPORT
    599   rtems_irq_connect_data IrqData = {0,
    600                                     ns16550_isr,
    601                                     &Console_Port_Data[minor],
    602                                     NULL,
    603                                     NULL,
    604                                     NULL,
    605                                     NULL
    606                                    };
    607 #else
    608   rtems_irq_connect_data IrqData = {0,
    609                                     ns16550_isr,
    610                                     &Console_Port_Data[minor],
    611                                     NULL,
    612                                     NULL,
    613                                     NULL
    614                                    };
    615 #endif
    616 
    617   ns16550_init(minor);
    618 
    619   Console_Port_Data[minor].bActive = FALSE;
    620 
    621   IrqData.name  = (rtems_irq_number)(Console_Port_Tbl[minor].ulIntVector );
    622 
    623 #ifdef BSP_SHARED_HANDLER_SUPPORT
    624   if (!BSP_install_rtems_shared_irq_handler (&IrqData)) {
    625 #else
    626   if (!BSP_install_rtems_irq_handler(&IrqData)) {
    627 #endif
    628     printk("Error installing interrupt handler!\n");
    629     rtems_fatal_error_occurred(1);
    630   }
    631 
    632   ns16550_enable_interrupts(minor, NS16550_ENABLE_ALL_INTR);
    633 }
    634 
    635 #endif
    636 #endif
     619  ns16550_enable_interrupts( minor, NS16550_ENABLE_ALL_INTR_EXCEPT_TX);
     620}
    637621
    638622/*
     
    668652
    669653  rtems_interrupt_disable(Irql);
    670     if ( Console_Port_Data[minor].bActive == FALSE) {
    671       Console_Port_Data[minor].bActive = TRUE;
     654    if ( Console_Port_Data[minor].bActive == false) {
     655      Console_Port_Data[minor].bActive = true;
    672656      ns16550_enable_interrupts(minor, NS16550_ENABLE_ALL_INTR);
    673657    }
  • c/src/libchip/serial/ns16550_p.h

    r31c14d9 re97e0e0  
    2828 */
    2929
    30 #define NS16550_STATIC
    31 
    32 /* #define NS16550_STATIC static */
     30#define NS16550_STATIC static
    3331
    3432/*
  • c/src/libchip/serial/serial.h

    r31c14d9 re97e0e0  
    1717#define __LIBCHIP_SERIAL_h
    1818
     19#include <stdint.h>
     20#include <stdbool.h>
    1921#include <termios.h>
    2022
Note: See TracChangeset for help on using the changeset viewer.