sysSerial.c
上传用户:yingyi0918
上传日期:2022-06-26
资源大小:214k
文件大小:5k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysSerial.c - BSP serial device initialization */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * This file has been developed or significantly modified by the
  6.  * MIPS Center of Excellence Dedicated Engineering Staff.
  7.  * This notice is as per the MIPS Center of Excellence Master Partner
  8.  * Agreement, do not remove this notice without checking first with
  9.  * WR/Platforms MIPS Center of Excellence engineering management.
  10.  */
  11. /*
  12. modification history
  13. --------------------
  14. 01b,12jul02,d_c  Make base address offset for endianness a #define
  15. 01a,19Jun02,d_c  Code from IDT modified to approach C of E standards.
  16. */
  17. /*
  18. DESCRIPTION
  19. This module contains all the functions needed to initialize the serial device
  20. */
  21. /*includes */
  22. #include "copyright_wrs.h"
  23. #include "vxWorks.h"
  24. #include "arch/mips/ivMips.h"
  25. #include "intLib.h"
  26. #include "config.h"
  27. #include "sysLib.h"
  28. #include "drv/sio/ns16552Sio.h"
  29. /*typedefs*/
  30. /* device initialization structure */
  31. typedef struct
  32.     {
  33.     int     intNum ;
  34.     ULONG  baseAdrs;                    /* Register base address */
  35.     } NS16550_DEV_PARAMS;
  36. /* Local data structures */
  37. static NS16550_CHAN  ns16550Chan[N_UART_CHANNELS];
  38. /* Device paramters: Note that UART_ENDIAN_OFFSET is added to the base
  39.  * addresses to account for endianness. The device is inherently
  40.  * little endian.
  41.  */
  42. static NS16550_DEV_PARAMS devParams[N_UART_CHANNELS] = 
  43.     {
  44.     {COM1_INT_NUM, UART0_BASE + UART_ENDIAN_OFFSET},
  45.     };
  46. /******************************************************************************
  47. *
  48. * sysSerialHwInit - initialize the BSP serial devices to a quiesent state
  49. *
  50. * This routine initializes the BSP serial device descriptors and puts the
  51. * devices in a quiesent state.  It is called from sysHwInit() with
  52. * interrupts locked.
  53. *
  54. * RETURNS: N/A
  55. */
  56. void sysSerialHwInit (void)
  57.     {
  58.     int chan;                   /* Serial channel */
  59.     for (chan = 0; chan < N_UART_CHANNELS; chan++)
  60.         {
  61.         ns16550Chan[chan].regs       = (UINT8 *)devParams[chan].baseAdrs;
  62.         ns16550Chan[chan].level      = devParams[chan].intNum;
  63.         ns16550Chan[chan].regDelta   = UART_REG_ADDR_INTERVAL;
  64.         ns16550Chan[chan].baudRate   = UART_DEFAULT_BAUD_RATE;
  65.         ns16550Chan[chan].xtal       = NS16550_XTAL_FREQ;
  66.         ns16550DevInit (&ns16550Chan[chan]);
  67.         sysWbFlush ();
  68.         }
  69.     }
  70. /******************************************************************************
  71. *
  72. * sysSerialInt - BSP specific serial device ISR
  73. *
  74. * This function is the BSP Specific serial device Interrupt Service Routine
  75. *
  76. * RETURNS: N/A
  77. */
  78. void sysSerialInt
  79.     (
  80.     int chan     /*serial channel */
  81.     )
  82.     {
  83.     ns16550Int (&ns16550Chan[chan]);
  84.     }
  85. /******************************************************************************
  86. *
  87. * sysSerialHwInit2 - connect BSP serial device interrupts
  88. *
  89. * This routine connects the BSP serial device interrupts.  It is called from
  90. * sysHwInit2().  Serial device interrupts could not be connected in
  91. * sysSerialHwInit() because the kernel memory allocator was not initialized
  92. * at that point, and intConnect() calls malloc().
  93. *
  94. * RETURNS: N/A
  95. */
  96. void sysSerialHwInit2 (void)
  97.     {
  98.     int chan; /*channel */
  99.    
  100.     for (chan = 0; chan < N_UART_CHANNELS; chan++)
  101.         {
  102.         intConnect (INUM_TO_IVEC(devParams[chan].intNum), sysSerialInt, chan);
  103.         }
  104.      
  105.     /* connect serial interrupts */
  106.     
  107.     INTERRUPT.i5.imask &= ~(UART0_GENERAL_INTR_MASK);
  108.     sysWbFlush ();
  109.     }
  110. /******************************************************************************
  111. *
  112. * sysSerialHwReset - reset the serial controllers
  113. *
  114. * Shutdown all controllers capable of generating interrupts, especially
  115. * controllers using DMA to transfer channel command blocks.  Most Bug
  116. * monitors presume that a hardware reset precedes entry to the monitor
  117. * code.
  118. *
  119. * RETURNS: N/A.
  120. */
  121. VOID sysSerialHwReset (void)
  122.     {
  123.     int iCount; /*index counter */
  124.     for (iCount = 0; iCount < N_UART_CHANNELS; iCount++)
  125.         ns16550DevInit (&ns16550Chan[iCount]);
  126.     }
  127. /******************************************************************************
  128. *
  129. * sysSerialChanGet - get the SIO_CHAN device associated with a serial channel
  130. *
  131. * This routine gets the SIO_CHAN device associated with a specified serial
  132. * channel.
  133. *
  134. * RETURNS: A pointer to the SIO_CHAN structure for the channel, or ERROR
  135. * if the channel is invalid.
  136. */
  137. SIO_CHAN * sysSerialChanGet
  138.     (
  139.     int channel         /* serial channel */
  140.     )
  141.     {
  142.     if (channel < 0 || channel >= NELEMENTS(ns16550Chan))
  143.         return (SIO_CHAN *)ERROR;
  144.     return ((SIO_CHAN *) &ns16550Chan[channel]);
  145.     }