Xenomai API  2.5.6.1
include/native/intr.h
Go to the documentation of this file.
00001 
00022 #ifndef _XENO_INTR_H
00023 #define _XENO_INTR_H
00024 
00025 #include <nucleus/intr.h>
00026 #include <native/types.h>
00027 
00028 /* Creation flag. */
00029 #define I_NOAUTOENA  XN_ISR_NOENABLE  /* Do not auto-enable interrupt channel
00030                                         after each IRQ. */
00031 #define I_PROPAGATE  XN_ISR_PROPAGATE /* Propagate IRQs down the
00032                                        pipeline after processing; IOW,
00033                                        pass them to Linux. */
00034 typedef struct rt_intr_info {
00035 
00036     unsigned irq;       /* !< Interrupt request number. */
00037 
00038     unsigned long hits; /* !< Number of receipts (since attachment), 0 if
00039                               statistics support is disable in the nucleus. */
00040 
00041     char name[XNOBJECT_NAME_LEN]; /* !< Symbolic name. */
00042 
00043 } RT_INTR_INFO;
00044 
00045 typedef struct rt_intr_placeholder {
00046     xnhandle_t opaque;
00047 } RT_INTR_PLACEHOLDER;
00048 
00049 #if (defined(__KERNEL__) || defined(__XENO_SIM__)) && !defined(DOXYGEN_CPP)
00050 
00051 #include <nucleus/synch.h>
00052 #include <native/ppd.h>
00053 
00054 #define XENO_INTR_MAGIC 0x55550a0a
00055 
00056 /* Creation flags. */
00057 #define I_SHARED        XN_ISR_SHARED
00058 #define I_EDGE          XN_ISR_EDGE
00059 
00060 #define RT_INTR_HANDLED         XN_ISR_HANDLED
00061 #define RT_INTR_NONE            XN_ISR_NONE
00062 #define RT_INTR_PROPAGATE       XN_ISR_PROPAGATE
00063 #define RT_INTR_NOENABLE        XN_ISR_NOENABLE
00064 
00065 #define I_DESC(xintr)  ((RT_INTR *)(xintr)->cookie)
00066 
00067 typedef struct rt_intr {
00068 
00069     unsigned magic;             /* !< Magic code - must be first */
00070 
00071     xnintr_t intr_base;         /* !< Base interrupt object. */
00072 
00073     void *private_data;         /* !< Private user-defined data. */
00074 
00075     xnhandle_t handle;          /* !< Handle in registry -- zero if unregistered. */
00076 
00077     char name[XNOBJECT_NAME_LEN]; /* !< Symbolic name. */
00078 
00079 #ifdef CONFIG_XENO_OPT_PERVASIVE
00080     int mode;                   /* !< Interrupt control mode. */
00081 
00082     int pending;                /* !< Pending hits to process. */
00083 
00084     xnsynch_t synch_base;       /* !< Base synchronization object. */
00085 
00086     pid_t cpid;                 /* !< Creator's pid. */
00087 #endif /* CONFIG_XENO_OPT_PERVASIVE */
00088 
00089     xnholder_t rlink;           /* !< Link in resource queue. */
00090 
00091 #define rlink2intr(ln)          container_of(ln, RT_INTR, rlink)
00092 
00093     xnqueue_t *rqueue;          /* !< Backpointer to resource queue. */
00094 
00095 } RT_INTR;
00096 
00097 #define rt_intr_save(x)    splhigh(x)
00098 #define rt_intr_restore(x) splexit(x)
00099 #define rt_intr_unmask()   splnone()
00100 #define rt_intr_flags(x)   splget(x)
00101 
00102 #ifdef __cplusplus
00103 extern "C" {
00104 #endif
00105 
00106 #ifdef CONFIG_XENO_OPT_NATIVE_INTR
00107 
00108 int __native_intr_pkg_init(void);
00109 
00110 void __native_intr_pkg_cleanup(void);
00111 
00112 static inline void __native_intr_flush_rq(xnqueue_t *rq)
00113 {
00114         xeno_flush_rq(RT_INTR, rq, intr);
00115 }
00116 
00117 #else /* !CONFIG_XENO_OPT_NATIVE_INTR */
00118 
00119 #define __native_intr_pkg_init()                ({ 0; })
00120 #define __native_intr_pkg_cleanup()             do { } while(0)
00121 #define __native_intr_flush_rq(rq)              do { } while(0)
00122 
00123 #endif /* !CONFIG_XENO_OPT_NATIVE_INTR */
00124 
00125 int rt_intr_create(RT_INTR *intr,
00126                    const char *name,
00127                    unsigned irq,
00128                    rt_isr_t isr,
00129                    rt_iack_t iack,
00130                    int mode);
00131 
00132 #ifdef CONFIG_XENO_OPT_PERVASIVE
00133 int rt_intr_handler(xnintr_t *cookie);
00134 #endif /* CONFIG_XENO_OPT_PERVASIVE */
00135 
00136 #ifdef __cplusplus
00137 }
00138 #endif
00139 
00140 #else /* !(__KERNEL__ || __XENO_SIM__) */
00141 
00142 typedef RT_INTR_PLACEHOLDER RT_INTR;
00143 
00144 #ifdef __cplusplus
00145 extern "C" {
00146 #endif
00147 
00148 int rt_intr_bind(RT_INTR *intr,
00149                  const char *name,
00150                  RTIME timeout);
00151 
00152 static inline int rt_intr_unbind (RT_INTR *intr)
00153 
00154 {
00155     intr->opaque = XN_NO_HANDLE;
00156     return 0;
00157 }
00158 
00159 int rt_intr_create(RT_INTR *intr,
00160                    const char *name,
00161                    unsigned irq,
00162                    int mode);
00163 
00164 int rt_intr_wait(RT_INTR *intr,
00165                  RTIME timeout);
00166 
00167 #ifdef __cplusplus
00168 }
00169 #endif
00170 
00171 #endif /* __KERNEL__ || __XENO_SIM__ */
00172 
00173 #ifdef __cplusplus
00174 extern "C" {
00175 #endif
00176 
00177 /* Public interface. */
00178 
00179 int rt_intr_delete(RT_INTR *intr);
00180 
00181 int rt_intr_enable(RT_INTR *intr);
00182 
00183 int rt_intr_disable(RT_INTR *intr);
00184 
00185 int rt_intr_inquire(RT_INTR *intr,
00186                     RT_INTR_INFO *info);
00187 
00188 #ifdef __cplusplus
00189 }
00190 #endif
00191 
00192 #endif /* !_XENO_INTR_H */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines