File: include_2native_2intr_8h-source.html

package info (click to toggle)
xenomai 2.5.4-3squeeze1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 36,140 kB
  • ctags: 35,509
  • sloc: ansic: 109,084; sh: 11,745; makefile: 2,205; xml: 1,356; asm: 613; php: 316; perl: 155
file content (206 lines) | stat: -rw-r--r-- 17,271 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Xenomai API: include/native/intr.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.6 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
    <li>
      <form action="search.php" method="get">
        <table cellspacing="0" cellpadding="0" border="0">
          <tr>
            <td><label>&nbsp;<u>S</u>earch&nbsp;for&nbsp;</label></td>
            <td><input type="text" name="query" value="" size="20" accesskey="s"/></td>
          </tr>
        </table>
      </form>
    </li>
    </ul>
  </div>
<h1>include/native/intr.h</h1><a href="include_2native_2intr_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
<a name="l00022"></a>00022 <span class="preprocessor">#ifndef _XENO_INTR_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#define _XENO_INTR_H</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;nucleus/intr.h&gt;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;<a class="code" href="native_2types_8h.html" title="This file is part of the Xenomai project.">native/types.h</a>&gt;</span>
<a name="l00027"></a>00027 
<a name="l00028"></a>00028 <span class="comment">/* Creation flag. */</span>
<a name="l00029"></a>00029 <span class="preprocessor">#define I_NOAUTOENA  XN_ISR_NOENABLE  </span><span class="comment">/* Do not auto-enable interrupt channel</span>
<a name="l00030"></a>00030 <span class="comment">                                        after each IRQ. */</span>
<a name="l00031"></a>00031 <span class="preprocessor">#define I_PROPAGATE  XN_ISR_PROPAGATE </span><span class="comment">/* Propagate IRQs down the</span>
<a name="l00032"></a>00032 <span class="comment">                                       pipeline after processing; IOW,</span>
<a name="l00033"></a>00033 <span class="comment">                                       pass them to Linux. */</span>
<a name="l00034"></a>00034 <span class="keyword">typedef</span> <span class="keyword">struct </span>rt_intr_info {
<a name="l00035"></a>00035 
<a name="l00036"></a>00036     <span class="keywordtype">unsigned</span> irq;       <span class="comment">/* !&lt; Interrupt request number. */</span>
<a name="l00037"></a>00037 
<a name="l00038"></a>00038     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> hits; <span class="comment">/* !&lt; Number of receipts (since attachment), 0 if</span>
<a name="l00039"></a>00039 <span class="comment">                              statistics support is disable in the nucleus. */</span>
<a name="l00040"></a>00040 
<a name="l00041"></a>00041     <span class="keywordtype">char</span> name[XNOBJECT_NAME_LEN]; <span class="comment">/* !&lt; Symbolic name. */</span>
<a name="l00042"></a>00042 
<a name="l00043"></a>00043 } RT_INTR_INFO;
<a name="l00044"></a>00044 
<a name="l00045"></a>00045 <span class="keyword">typedef</span> <span class="keyword">struct </span>rt_intr_placeholder {
<a name="l00046"></a>00046     xnhandle_t opaque;
<a name="l00047"></a>00047 } RT_INTR_PLACEHOLDER;
<a name="l00048"></a>00048 
<a name="l00049"></a>00049 <span class="preprocessor">#if (defined(__KERNEL__) || defined(__XENO_SIM__)) &amp;&amp; !defined(DOXYGEN_CPP)</span>
<a name="l00050"></a>00050 <span class="preprocessor"></span>
<a name="l00051"></a>00051 <span class="preprocessor">#include &lt;nucleus/synch.h&gt;</span>
<a name="l00052"></a>00052 <span class="preprocessor">#include &lt;<a class="code" href="native_2ppd_8h.html" title="This file is part of the Xenomai project.">native/ppd.h</a>&gt;</span>
<a name="l00053"></a>00053 
<a name="l00054"></a>00054 <span class="preprocessor">#define XENO_INTR_MAGIC 0x55550a0a</span>
<a name="l00055"></a>00055 <span class="preprocessor"></span>
<a name="l00056"></a>00056 <span class="comment">/* Creation flags. */</span>
<a name="l00057"></a>00057 <span class="preprocessor">#define I_SHARED        XN_ISR_SHARED</span>
<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">#define I_EDGE          XN_ISR_EDGE</span>
<a name="l00059"></a>00059 <span class="preprocessor"></span>
<a name="l00060"></a>00060 <span class="preprocessor">#define RT_INTR_HANDLED         XN_ISR_HANDLED</span>
<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#define RT_INTR_NONE            XN_ISR_NONE</span>
<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#define RT_INTR_PROPAGATE       XN_ISR_PROPAGATE</span>
<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#define RT_INTR_NOENABLE        XN_ISR_NOENABLE</span>
<a name="l00064"></a>00064 <span class="preprocessor"></span>
<a name="l00065"></a>00065 <span class="preprocessor">#define I_DESC(xintr)  ((RT_INTR *)(xintr)-&gt;cookie)</span>
<a name="l00066"></a>00066 <span class="preprocessor"></span>
<a name="l00067"></a>00067 <span class="keyword">typedef</span> <span class="keyword">struct </span>rt_intr {
<a name="l00068"></a>00068 
<a name="l00069"></a>00069     <span class="keywordtype">unsigned</span> magic;             <span class="comment">/* !&lt; Magic code - must be first */</span>
<a name="l00070"></a>00070 
<a name="l00071"></a>00071     xnintr_t intr_base;         <span class="comment">/* !&lt; Base interrupt object. */</span>
<a name="l00072"></a>00072 
<a name="l00073"></a>00073     <span class="keywordtype">void</span> *private_data;         <span class="comment">/* !&lt; Private user-defined data. */</span>
<a name="l00074"></a>00074 
<a name="l00075"></a>00075     xnhandle_t handle;          <span class="comment">/* !&lt; Handle in registry -- zero if unregistered. */</span>
<a name="l00076"></a>00076 
<a name="l00077"></a>00077     <span class="keywordtype">char</span> name[XNOBJECT_NAME_LEN]; <span class="comment">/* !&lt; Symbolic name. */</span>
<a name="l00078"></a>00078 
<a name="l00079"></a>00079 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_PERVASIVE</span>
<a name="l00080"></a>00080 <span class="preprocessor"></span>    <span class="keywordtype">int</span> mode;                   <span class="comment">/* !&lt; Interrupt control mode. */</span>
<a name="l00081"></a>00081 
<a name="l00082"></a>00082     <span class="keywordtype">int</span> pending;                <span class="comment">/* !&lt; Pending hits to process. */</span>
<a name="l00083"></a>00083 
<a name="l00084"></a>00084     xnsynch_t synch_base;       <span class="comment">/* !&lt; Base synchronization object. */</span>
<a name="l00085"></a>00085 
<a name="l00086"></a>00086     pid_t cpid;                 <span class="comment">/* !&lt; Creator's pid. */</span>
<a name="l00087"></a>00087 <span class="preprocessor">#endif </span><span class="comment">/* CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l00088"></a>00088 
<a name="l00089"></a>00089     xnholder_t rlink;           <span class="comment">/* !&lt; Link in resource queue. */</span>
<a name="l00090"></a>00090 
<a name="l00091"></a>00091 <span class="preprocessor">#define rlink2intr(ln)          container_of(ln, RT_INTR, rlink)</span>
<a name="l00092"></a>00092 <span class="preprocessor"></span>
<a name="l00093"></a>00093     xnqueue_t *rqueue;          <span class="comment">/* !&lt; Backpointer to resource queue. */</span>
<a name="l00094"></a>00094 
<a name="l00095"></a>00095 } RT_INTR;
<a name="l00096"></a>00096 
<a name="l00097"></a>00097 <span class="preprocessor">#define rt_intr_save(x)    splhigh(x)</span>
<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor">#define rt_intr_restore(x) splexit(x)</span>
<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor">#define rt_intr_unmask()   splnone()</span>
<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor">#define rt_intr_flags(x)   splget(x)</span>
<a name="l00101"></a>00101 <span class="preprocessor"></span>
<a name="l00102"></a>00102 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
<a name="l00104"></a>00104 <span class="preprocessor">#endif</span>
<a name="l00105"></a>00105 <span class="preprocessor"></span>
<a name="l00106"></a>00106 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_NATIVE_INTR</span>
<a name="l00107"></a>00107 <span class="preprocessor"></span>
<a name="l00108"></a>00108 <span class="keywordtype">int</span> __native_intr_pkg_init(<span class="keywordtype">void</span>);
<a name="l00109"></a>00109 
<a name="l00110"></a>00110 <span class="keywordtype">void</span> __native_intr_pkg_cleanup(<span class="keywordtype">void</span>);
<a name="l00111"></a>00111 
<a name="l00112"></a>00112 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __native_intr_flush_rq(xnqueue_t *rq)
<a name="l00113"></a>00113 {
<a name="l00114"></a>00114         xeno_flush_rq(RT_INTR, rq, intr);
<a name="l00115"></a>00115 }
<a name="l00116"></a>00116 
<a name="l00117"></a>00117 <span class="preprocessor">#else </span><span class="comment">/* !CONFIG_XENO_OPT_NATIVE_INTR */</span>
<a name="l00118"></a>00118 
<a name="l00119"></a>00119 <span class="preprocessor">#define __native_intr_pkg_init()                ({ 0; })</span>
<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">#define __native_intr_pkg_cleanup()             do { } while(0)</span>
<a name="l00121"></a>00121 <span class="preprocessor"></span><span class="preprocessor">#define __native_intr_flush_rq(rq)              do { } while(0)</span>
<a name="l00122"></a>00122 <span class="preprocessor"></span>
<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* !CONFIG_XENO_OPT_NATIVE_INTR */</span>
<a name="l00124"></a>00124 
<a name="l00125"></a>00125 <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#g92fa8e83f6f3db05dd1d2d075dd310ee" title="Create an interrupt object from user-space.">rt_intr_create</a>(RT_INTR *intr,
<a name="l00126"></a>00126                    <span class="keyword">const</span> <span class="keywordtype">char</span> *name,
<a name="l00127"></a>00127                    <span class="keywordtype">unsigned</span> irq,
<a name="l00128"></a>00128                    rt_isr_t isr,
<a name="l00129"></a>00129                    rt_iack_t iack,
<a name="l00130"></a>00130                    <span class="keywordtype">int</span> mode);
<a name="l00131"></a>00131 
<a name="l00132"></a>00132 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_PERVASIVE</span>
<a name="l00133"></a>00133 <span class="preprocessor"></span><span class="keywordtype">int</span> rt_intr_handler(xnintr_t *cookie);
<a name="l00134"></a>00134 <span class="preprocessor">#endif </span><span class="comment">/* CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l00135"></a>00135 
<a name="l00136"></a>00136 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00137"></a>00137 <span class="preprocessor"></span>}
<a name="l00138"></a>00138 <span class="preprocessor">#endif</span>
<a name="l00139"></a>00139 <span class="preprocessor"></span>
<a name="l00140"></a>00140 <span class="preprocessor">#else </span><span class="comment">/* !(__KERNEL__ || __XENO_SIM__) */</span>
<a name="l00141"></a>00141 
<a name="l00142"></a>00142 <span class="keyword">typedef</span> RT_INTR_PLACEHOLDER RT_INTR;
<a name="l00143"></a>00143 
<a name="l00144"></a>00144 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
<a name="l00146"></a>00146 <span class="preprocessor">#endif</span>
<a name="l00147"></a>00147 <span class="preprocessor"></span>
<a name="l00148"></a>00148 <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#ge13742ca2710acfedc54c76541863fe3" title="Bind to an interrupt object.">rt_intr_bind</a>(RT_INTR *intr,
<a name="l00149"></a>00149                  <span class="keyword">const</span> <span class="keywordtype">char</span> *name,
<a name="l00150"></a>00150                  RTIME timeout);
<a name="l00151"></a>00151 
<a name="l00152"></a><a class="code" href="group__interrupt.html#g4db46e047246e5c237a3c2816bf1889a">00152</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#g4db46e047246e5c237a3c2816bf1889a" title="Unbind from an interrupt object.">rt_intr_unbind</a> (RT_INTR *intr)
<a name="l00153"></a>00153 
<a name="l00154"></a>00154 {
<a name="l00155"></a>00155     intr-&gt;opaque = XN_NO_HANDLE;
<a name="l00156"></a>00156     <span class="keywordflow">return</span> 0;
<a name="l00157"></a>00157 }
<a name="l00158"></a>00158 
<a name="l00159"></a>00159 <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#g92fa8e83f6f3db05dd1d2d075dd310ee" title="Create an interrupt object from user-space.">rt_intr_create</a>(RT_INTR *intr,
<a name="l00160"></a>00160                    <span class="keyword">const</span> <span class="keywordtype">char</span> *name,
<a name="l00161"></a>00161                    <span class="keywordtype">unsigned</span> irq,
<a name="l00162"></a>00162                    <span class="keywordtype">int</span> mode);
<a name="l00163"></a>00163 
<a name="l00164"></a>00164 <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#g222e6a9a681f83b13ed5b51021711f4d" title="Wait for the next interrupt.">rt_intr_wait</a>(RT_INTR *intr,
<a name="l00165"></a>00165                  RTIME timeout);
<a name="l00166"></a>00166 
<a name="l00167"></a>00167 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00168"></a>00168 <span class="preprocessor"></span>}
<a name="l00169"></a>00169 <span class="preprocessor">#endif</span>
<a name="l00170"></a>00170 <span class="preprocessor"></span>
<a name="l00171"></a>00171 <span class="preprocessor">#endif </span><span class="comment">/* __KERNEL__ || __XENO_SIM__ */</span>
<a name="l00172"></a>00172 
<a name="l00173"></a>00173 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00174"></a>00174 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
<a name="l00175"></a>00175 <span class="preprocessor">#endif</span>
<a name="l00176"></a>00176 <span class="preprocessor"></span>
<a name="l00177"></a>00177 <span class="comment">/* Public interface. */</span>
<a name="l00178"></a>00178 
<a name="l00179"></a>00179 <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#g6da6ddd4e65b0feb47278dae74cab6c9" title="Delete an interrupt object.">rt_intr_delete</a>(RT_INTR *intr);
<a name="l00180"></a>00180 
<a name="l00181"></a>00181 <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#gc712ee67f90d053a21bdb0041a63e17c" title="Enable an interrupt object.">rt_intr_enable</a>(RT_INTR *intr);
<a name="l00182"></a>00182 
<a name="l00183"></a>00183 <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#g9cf127812ea07326d5f4924f3e28eb3f" title="Disable an interrupt object.">rt_intr_disable</a>(RT_INTR *intr);
<a name="l00184"></a>00184 
<a name="l00185"></a>00185 <span class="keywordtype">int</span> <a class="code" href="group__interrupt.html#gea34e43cbd6d6f515966f67990738395" title="Inquire about an interrupt object.">rt_intr_inquire</a>(RT_INTR *intr,
<a name="l00186"></a>00186                     RT_INTR_INFO *info);
<a name="l00187"></a>00187 
<a name="l00188"></a>00188 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00189"></a>00189 <span class="preprocessor"></span>}
<a name="l00190"></a>00190 <span class="preprocessor">#endif</span>
<a name="l00191"></a>00191 <span class="preprocessor"></span>
<a name="l00192"></a>00192 <span class="preprocessor">#endif </span><span class="comment">/* !_XENO_INTR_H */</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Mon Aug 2 12:48:36 2010 for Xenomai API by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
</body>
</html>