pccVme.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:5k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* pccVme.c - Peripheral Channel Controller (PCC) library */
  2. /* Copyright 1984-1996 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01d,12jun96,wlf  more doc: fix ClearCase comment, cleanup.
  8. 01c,06jun96,wlf  doc: cleanup.
  9. 01b,25sep92,ccc  acknowledge SIGHP interrupt before calling MailboxRoutine.
  10. 01a,11jun92,ccc  created by copying routines from mv147 sysLib.c, ansified.
  11. */
  12. /*
  13. DESCRIPTION
  14. This library contains routines which relate to the Peripheral Channel
  15. Controller (PCC).
  16. The functions addressed here include:
  17.     Bus interrupt functions:
  18. - enable/disable VMEbus interrupt levels
  19. - generate bus interrupts
  20.     Mailbox/locations monitor functions:
  21. - enable mailbox/location monitor interrupts
  22. */
  23. #include "drv/multi/pccchip.h"
  24. LOCAL FUNCPTR sysMailboxRoutine  = NULL;
  25. LOCAL int sysMailboxArg          = NULL;
  26. LOCAL BOOL sysMailboxConnected   = FALSE;
  27. /********************************************************************************
  28. * sysIntDisable - disable a bus interrupt level
  29. *
  30. * This routine disables a specified VMEbus interrupt level.
  31. *
  32. * RETURNS: OK, or ERROR if <intLevel> is not in the range 1 - 7.
  33. *
  34. * SEE ALSO: sysIntEnable()
  35. */
  36.  
  37. STATUS sysIntDisable
  38.     (
  39.     int intLevel       /* interrupt level to disable (1-7) */
  40.     )
  41.     {
  42.     if (intLevel < 1 || intLevel > 7)
  43.         return (ERROR);
  44.  
  45.     *LCSR_INT_MASK &= ~(1 << intLevel);
  46.  
  47.     return (OK);
  48.     }
  49. /********************************************************************************
  50. * sysIntEnable - enable a bus interrupt level
  51. *
  52. * This routine enables a specified VMEbus interrupt level.
  53. *
  54. * RETURNS: OK, or ERROR if <intLevel> is not in the range 1 - 7.
  55. *
  56. * SEE ALSO: sysIntDisable()
  57. */
  58.  
  59. STATUS sysIntEnable
  60.     (
  61.     int intLevel       /* interrupt level to enable (1-7) */
  62.     )
  63.     {
  64.     if (intLevel < 1 || intLevel > 7)
  65.         return (ERROR);
  66.  
  67.     *LCSR_INT_MASK |= (1 << intLevel);
  68.  
  69.     return (OK);
  70.     }
  71.  
  72. /********************************************************************************
  73. * sysBusIntAck - acknowledge a bus interrupt
  74. *
  75. * This routine acknowledges a specified VMEbus interrupt level.
  76. *
  77. * NOTE: This routine has no effect, since the hardware acknowledges VMEbus
  78. * interrupts automatically if the interrupt level is enabled.
  79. *
  80. * RETURNS: NULL.
  81. *
  82. * SEE ALSO: sysBusIntGen()
  83. */
  84.  
  85. int sysBusIntAck
  86.     (
  87.     int intLevel       /* interrupt level to acknowledge */
  88.     )
  89.     {
  90.     return (NULL);
  91.     }
  92. /********************************************************************************
  93. * sysBusIntGen - generate a bus interrupt
  94. *
  95. * This routine generates a VMEbus interrupt for a specified level with a
  96. * specified vector.
  97. *
  98. * RETURNS: OK, or ERROR if <level> is out of range or the board cannot
  99. * generate bus interrupt.
  100. *
  101. * SEE ALSO: sysBusIntAck()
  102. */
  103.  
  104. STATUS sysBusIntGen
  105.     (
  106.     int  level,        /* VMEbus interrupt level to generate (1-7) */
  107.     int  vector        /* interrupt vector to generate (0-255)     */
  108.     )
  109.     {
  110.     *LCSR_INT_STATUS_ID = (char) vector;
  111.     *LCSR_INT_REQ       = (char) level; /* check if level between 1 & 7? */
  112.  
  113.     return (OK);
  114.     }
  115. /********************************************************************************
  116. * sysMailboxInt - handle mailbox interrupt
  117. *
  118. * Mailbox interrupts must be acknowledged.
  119. */
  120.  
  121. LOCAL void sysMailboxInt (void)
  122.  
  123.     {
  124.     /* acknowledge SIGHP interrupt */
  125.     *GCSR_GLOBAL_1 |= GLOBAL_1_SIGHP;
  126.     if (sysMailboxRoutine != NULL)
  127.         sysMailboxRoutine (sysMailboxArg);
  128.     }
  129. /********************************************************************************
  130. * sysMailboxConnect - connect a routine to the mailbox interrupt
  131. *
  132. * This routine specifies the interrupt service routine to be called at each
  133. * mailbox interrupt.
  134. *
  135. * NOTE: The mailbox interrupt is assigned as signal high priority (SIGHP).
  136. *
  137. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  138. *
  139. * SEE ALSO: intConnect(), sysMailboxEnable()
  140. */
  141.  
  142. STATUS sysMailboxConnect
  143.     (
  144.     FUNCPTR routine,   /* routine called at each mailbox interrupt */
  145.     int arg            /* argument with which to call routine      */
  146.     )
  147.     {
  148.  
  149.     sysMailboxConnected = TRUE;
  150.     sysMailboxRoutine   = routine;
  151.     sysMailboxArg       = arg;
  152.  
  153.     return (OK);
  154.     }
  155. /********************************************************************************
  156. * sysMailboxEnable - enable the mailbox interrupt
  157. *
  158. * This routine enables the mailbox interrupt.
  159. *
  160. * NOTE:  The mailbox interrupt is assigned as signal high priority (SIGHP).
  161. * The address of the register used to set SIGHP is configured as a function
  162. * of the processor number and is set in sysProcNumSet(); thus <mailboxAdrs>
  163. * is ignored.
  164. *
  165. * RETURNS: OK, always.
  166. *
  167. * SEE ALSO: sysMailboxConnect()
  168. */
  169.  
  170. STATUS sysMailboxEnable
  171.     (
  172.     char *mailboxAdrs          /* address of mailbox (ignored) */
  173.     )
  174.     {
  175.     /* unmask SIGHP interrupt */
  176.  
  177.     *LCSR_UTIL_INT_MASK |= UTIL_INT_MASK_SIGHEN;
  178.  
  179.     return (OK);
  180.     }