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

VxWorks

开发平台:

C/C++

  1. /* sa150xIntrCtl.h - ARM 1500/1501 interrupt controller */
  2. /* Copyright 1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01a,23sep98,cdp  written.
  7. */
  8. #ifndef __INCsa150xIntrCtlh
  9. #define __INCsa150xIntrCtlh
  10. #ifdef __cplusplus
  11. extern "C" {
  12. #endif
  13. #define SA150X_INT_REG_ADDR_INTERVAL 16
  14. #ifdef _ASMLANGUAGE
  15. #define SA150X_INT_ADRS(base,reg) ((base) + 
  16.  (reg)*SA150X_INT_REG_ADDR_INTERVAL)
  17. #else
  18. #define SA150X_INT_ADRS(base,reg) ((UINT32)(base) + 
  19.  (reg)*SA150X_INT_REG_ADDR_INTERVAL)
  20. #endif
  21. /* interrupt controller registers */
  22. #define SA150X_INT_DESTINATION(base) SA150X_INT_ADRS(base,0)
  23. #define SA150X_INT_SPECIAL(base) SA150X_INT_ADRS(base,1)
  24. #define SA150X_INT_ENABLE(base) SA150X_INT_ADRS(base,2)
  25. #define SA150X_INT_POLARITY(base) SA150X_INT_ADRS(base,3)
  26. #define SA150X_INT_IRQ_REQUEST(base) SA150X_INT_ADRS(base,4)
  27. #define SA150X_INT_FIQ_REQUEST(base) SA150X_INT_ADRS(base,5)
  28. #define SA150X_INT_STATUS(base) SA150X_INT_ADRS(base,6)
  29. #define SA150X_INT_CLEAR(base) SA150X_INT_STATUS(base)
  30. #define SA150X_INT_SOURCE(base) SA150X_INT_ADRS(base,7)
  31. #define SA150X_INT_SET(base) SA150X_INT_SOURCE(base)
  32. #ifndef _ASMLANGUAGE
  33. /* hardware access methods */
  34. #ifndef SA150X_INT_REG_READ
  35. #define SA150X_INT_REG_READ(a,val) ((val) = *(volatile UINT32 *)(a))
  36. #endif
  37. #ifndef SA150X_INT_REG_WRITE
  38. #define SA150X_INT_REG_WRITE(a,val) (*(volatile UINT32 *)(a) = (val))
  39. #endif
  40. #if defined(SA150X_INT_RETRY_WRITES) && 
  41.    !defined(SA150X_INT_REG_WRITE_RETRY)
  42. #define SA150X_INT_REG_WRITE_RETRY(reg,val)
  43.     {
  44.     UINT32 _rVal, _wVal;
  45.     _wVal = (val);
  46.     do
  47. {
  48. SA150X_INT_REG_WRITE ((reg), _wVal);
  49. SA150X_INT_REG_READ ((reg), _rVal);
  50. }
  51.     while (_rVal != _wVal);
  52.     }
  53. #endif
  54. #ifndef SA150X_INT_REQ_REG_READ
  55. #ifdef SA150X_INT_RETRY_READS
  56. #define SA150X_INT_REQ_REG_READ(reg,val,mask,tries,ok)
  57.     {
  58.     int _i;
  59.     for (_i = 0; _i < (tries); ++_i)
  60. {
  61. SA150X_INT_REG_READ ((reg), (val));
  62. if (((val) & (mask)) == 0)
  63.     break;
  64. }
  65.     (ok) = _i < tries;
  66.     }
  67. #else
  68. #define SA150X_INT_REQ_REG_READ(reg,val,mask,tries,ok)
  69. SA150X_INT_REG_READ ((reg), (val));
  70. #endif
  71. #endif
  72. /* structure describing an interrupt controller */
  73. typedef struct
  74.     {
  75.     /*
  76.      * The following values should be initialised in the BSP before
  77.      * the interrupt driver is initialised.
  78.      */
  79.     volatile UINT32 * base; /* base of registers */
  80. #ifdef SA150X_INT_HANDLE_1501_DESTINATION
  81.     UINT32 destModifier; /* EOR with destination reg */
  82. #endif
  83.     /*
  84.      * The following value should be initialised in the BSP to the FIQ
  85.      * bits enabled prior to the call to sa150xIntDevInit()  (e.g. by
  86.      * sysInit) or 0 if no FIQ sources are enabled until after that
  87.      * call.  Calls to sa150xIntFiqEnable/Disable will change bits in
  88.      * this word.  It should not be changed by any other means.
  89.      */
  90.     UINT32 enabledFiqs; /* FIQs currently enabled */
  91.     /*
  92.      * The following values are reserved for internal use by the
  93.      * interrupt driver and should not be changed by anything else.
  94.      * They do not require initialisation by the BSP.
  95.      */
  96.     UINT32 enabledIrqs; /* IRQs enabled by intEnable */
  97. #ifdef SA150X_INT_CACHE_IRQ_REQUEST
  98.     UINT32 irqRequests; /* cached current requests */
  99.     int requestsValid; /* is irqRequests valid */
  100. #endif
  101.     } sa150xIntrCtlDetails;
  102. /* interrupt feature bits for configuration */
  103. #define SA150X_INT_POLARITY_NEGATIVE (0 << 0)
  104. #define SA150X_INT_POLARITY_POSITIVE (1 << 0)
  105. #define SA150X_INT_TYPE_EDGE (0 << 1)
  106. #define SA150X_INT_TYPE_LEVEL (1 << 1)
  107. #define SA150X_INT_DESTINATION_IRQ (0 << 2)
  108. #define SA150X_INT_DESTINATION_FIQ (1 << 2)
  109. IMPORT STATUS sa150xIntLvlConfigure (int level, int features);
  110. /* macro to convert level number to vector number */
  111. #ifndef SA150X_INT_LVL_VEC_MAP
  112. #   define SA150X_INT_LVL_VEC_MAP(level, vector) 
  113.     ((vector) = ((level) + SA150X_INT_VEC_BASE))
  114. #endif
  115. #endif /* _ASMLANGUAGE */
  116. /* debug macro */
  117. #ifndef SA150X_INT_DEBUG
  118. #define SA150X_INT_DEBUG(a,b)
  119. #endif
  120. #ifdef __cplusplus
  121. }
  122. #endif
  123. #endif /* __INCsa150xIntrCtlh */