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 207 208 209 210 211 212 213 214 215 216 217 218
|
<!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: Channels and ranges</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 Page</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li><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> <u>S</u>earch for </label></td>
<td><input type="text" name="query" value="" size="20" accesskey="s"/></td>
</tr>
</table>
</form>
</li>
</ul>
</div>
</div>
<div class="contents">
<h1>Channels and ranges<br>
<small>
[<a class="el" href="group__driverfacilities.html">Driver API.</a>]</small>
</h1>
<p>
<div class="dynheader">
Collaboration diagram for Channels and ranges:</div>
<div class="dynsection">
<center><table><tr><td><img src="group__channelrange.png" border="0" alt="" usemap="#group____channelrange_map">
<map name="group____channelrange_map">
<area shape="rect" href="group__driverfacilities.html" title="Driver API." alt="" coords="5,5,93,32"></map></td></tr></table></center>
</div>
<hr><a name="_details"></a><h2>Detailed Description</h2>
Channels<p>
According to the Analogy nomenclature, the channel is the elementary acquisition entity. One channel is supposed to acquire one data at a time. A channel can be:<ul>
<li>an analog input or an analog ouput;</li><li>a digital input or a digital ouput;</li></ul>
<p>
Channels are defined by their type and by some other characteristics like:<ul>
<li>their resolutions for analog channels (which usually ranges from 8 to 32 bits);</li><li>their references;</li></ul>
<p>
Such parameters must be declared for each channel composing a subdevice. The structure <a class="el" href="structa4l__channel.html" title="Structure describing some channel's characteristics.">a4l_channel</a> (a4l_chan_t) is used to define one channel.<p>
Another structure named <a class="el" href="structa4l__channels__desc.html" title="Structure describing a channels set.">a4l_channels_desc</a> (a4l_chdesc_t) gathers all channels for a specific subdevice. This latter structure also stores :<ul>
<li>the channels count;</li><li>the channels declaration mode (A4L_CHAN_GLOBAL_CHANDESC or A4L_CHAN_PERCHAN_CHANDESC): if all the channels composing a subdevice are identical, there is no need to declare the parameters for each channel; the global declaration mode eases the structure composition.</li></ul>
<p>
Usually the channels descriptor looks like this: <code> <div class="fragment"><pre class="fragment">
a4l_chdesc_t example_chan = {
mode: A4L_CHAN_GLOBAL_CHANDESC, -> Global declaration
mode is set
length: 8, -> 8 channels
chans: {
{A4L_CHAN_AREF_GROUND, 16}, -> Each channel is 16 bits
wide with the ground as
reference
},
};
</pre></div> </code><p>
Ranges<p>
So as to perform conversion from logical values acquired by the device to physical units, some range structure(s) must be declared on the driver side.<p>
Such structures contain:<ul>
<li>the physical unit type (Volt, Ampere, none);</li><li>the minimal and maximal values;</li></ul>
<p>
These range structures must be associated with the channels at subdevice registration time as a channel can work with many ranges. At configuration time (thanks to an Analogy command), one range will be selected for each enabled channel.<p>
Consequently, for each channel, the developer must declare all the possible ranges in a structure called a4l_rngtab_t. Here is an example: <code> <div class="fragment"><pre class="fragment">
a4l_rngtab_t example_tab = {
length: 2,
rngs: {
RANGE_V(-5,5),
RANGE_V(-10,10),
},
};
</pre></div> </code><p>
For each subdevice, a specific structure is designed to gather all the ranges tabs of all the channels. In this structure, called a4l_rngdesc_t, three fields must be filled:<ul>
<li>the declaration mode (A4L_RNG_GLOBAL_RNGDESC or A4L_RNG_PERCHAN_RNGDESC);</li><li>the number of ranges tab;</li><li>the tab of ranges tabs pointers;</li></ul>
<p>
Most of the time, the channels which belong to the same subdevice use the same set of ranges. So, there is no need to declare the same ranges for each channel. A macro is defined to prevent redundant declarations: <a class="el" href="group__channelrange.html#gbb8a61456a5088a58dbd7392872af4f0" title="Macro to declare a ranges global descriptor in one line.">RNG_GLOBAL()</a>.<p>
Here is an example: <code> <div class="fragment"><pre class="fragment">
a4l_rngdesc_t example_rng = RNG_GLOBAL(example_tab);
</pre></div> </code>
<p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Data Structures</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="structa4l__channel.html">a4l_channel</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Structure describing some channel's characteristics. <a href="structa4l__channel.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="structa4l__channels__desc.html">a4l_channels_desc</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Structure describing a channels set. <a href="structa4l__channels__desc.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="structa4l__range.html">a4l_range</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Structure describing a (unique) range. <a href="structa4l__range.html#_details">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Channel reference</h2></td></tr>
<tr><td colspan="2">Flags to define the channel's reference<p>
<a class="anchor" name="A4L_CHAN_AREF_xxx"></a> <br><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g910bc672f6e55346643f9c69d175134f"></a><!-- doxytag: member="channelrange::A4L_CHAN_AREF_GROUND" ref="g910bc672f6e55346643f9c69d175134f" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g910bc672f6e55346643f9c69d175134f">A4L_CHAN_AREF_GROUND</a> 0x1</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Ground reference. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g7f3e39e0773ea29526aa72497a738474"></a><!-- doxytag: member="channelrange::A4L_CHAN_AREF_COMMON" ref="g7f3e39e0773ea29526aa72497a738474" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g7f3e39e0773ea29526aa72497a738474">A4L_CHAN_AREF_COMMON</a> 0x2</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Common reference. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g8e544207dc38e33b48d5cc35f8a62846"></a><!-- doxytag: member="channelrange::A4L_CHAN_AREF_DIFF" ref="g8e544207dc38e33b48d5cc35f8a62846" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g8e544207dc38e33b48d5cc35f8a62846">A4L_CHAN_AREF_DIFF</a> 0x4</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Differential reference. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gc53c87ed54169ca73244961fa5089331"></a><!-- doxytag: member="channelrange::A4L_CHAN_AREF_OTHER" ref="gc53c87ed54169ca73244961fa5089331" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gc53c87ed54169ca73244961fa5089331">A4L_CHAN_AREF_OTHER</a> 0x8</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Misc reference. <br></td></tr>
<tr><td colspan="2"><br><h2>Channels declaration mode</h2></td></tr>
<tr><td colspan="2">Constant to define whether the channels in a descriptor are identical<p>
<a class="anchor" name="A4L_CHAN_xxx"></a> <br><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g516bba6698176241370dabf67868b565"></a><!-- doxytag: member="channelrange::A4L_CHAN_GLOBAL_CHANDESC" ref="g516bba6698176241370dabf67868b565" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g516bba6698176241370dabf67868b565">A4L_CHAN_GLOBAL_CHANDESC</a> 0</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Global declaration, the set contains channels with similar characteristics. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gcc93cd2c7eeac7ed4b26ffdb3b9622d2"></a><!-- doxytag: member="channelrange::A4L_CHAN_PERCHAN_CHANDESC" ref="gcc93cd2c7eeac7ed4b26ffdb3b9622d2" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gcc93cd2c7eeac7ed4b26ffdb3b9622d2">A4L_CHAN_PERCHAN_CHANDESC</a> 1</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Per channel declaration, the decriptor gathers differents channels. <br></td></tr>
<tr><td colspan="2"><br><h2>Defines</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g8c3a61f5ed001486d244d26c60915552"></a><!-- doxytag: member="channelrange::A4L_CHAN_GLOBAL" ref="g8c3a61f5ed001486d244d26c60915552" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g8c3a61f5ed001486d244d26c60915552">A4L_CHAN_GLOBAL</a> 0x10</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Internal use flag (must not be used by driver developer). <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g0a6e191046fb86c68ca3fb24cbff8fe8">A4L_RNG_FACTOR</a> 1000000</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Constant for internal use only (must not be used by driver developer). <a href="#g0a6e191046fb86c68ca3fb24cbff8fe8"></a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gb98b3cfc59541c6af311aeb6b52ff813"></a><!-- doxytag: member="channelrange::A4L_RNG_VOLT_UNIT" ref="gb98b3cfc59541c6af311aeb6b52ff813" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gb98b3cfc59541c6af311aeb6b52ff813">A4L_RNG_VOLT_UNIT</a> 0x0</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Volt unit range flag. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gf116b68a39fa375929c2f121b108ec84"></a><!-- doxytag: member="channelrange::A4L_RNG_MAMP_UNIT" ref="gf116b68a39fa375929c2f121b108ec84" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gf116b68a39fa375929c2f121b108ec84">A4L_RNG_MAMP_UNIT</a> 0x1</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">MilliAmpere unit range flag. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gbe170a121b3315a6f29be6a350bd1de6"></a><!-- doxytag: member="channelrange::A4L_RNG_NO_UNIT" ref="gbe170a121b3315a6f29be6a350bd1de6" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gbe170a121b3315a6f29be6a350bd1de6">A4L_RNG_NO_UNIT</a> 0x2</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">No unit range flag. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ge66f382921343a8c186f6f0668ab52e0"></a><!-- doxytag: member="channelrange::A4L_RNG_EXT_UNIT" ref="ge66f382921343a8c186f6f0668ab52e0" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#ge66f382921343a8c186f6f0668ab52e0">A4L_RNG_EXT_UNIT</a> 0x4</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">External unit range flag. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gf7d0075068143351a7e34a660369cec2"></a><!-- doxytag: member="channelrange::A4L_RNG_UNIT" ref="gf7d0075068143351a7e34a660369cec2" args="(x)" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gf7d0075068143351a7e34a660369cec2">A4L_RNG_UNIT</a>(x)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Macro to retrieve the range unit from the range flags. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g59c40f7bdf368265e66c6e9a80ffa862"></a><!-- doxytag: member="channelrange::A4L_RNG_GLOBAL" ref="g59c40f7bdf368265e66c6e9a80ffa862" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g59c40f7bdf368265e66c6e9a80ffa862">A4L_RNG_GLOBAL</a> 0x8</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Internal use flag (must not be used by driver developer). <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g9cb4bca9f87b9fb4a34d0db84323e32d"></a><!-- doxytag: member="channelrange::RANGE" ref="g9cb4bca9f87b9fb4a34d0db84323e32d" args="(x, y)" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g9cb4bca9f87b9fb4a34d0db84323e32d">RANGE</a>(x, y)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Macro to declare a (unique) range with no unit defined. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g83f988df3128b75fe9b112eb1805d528"></a><!-- doxytag: member="channelrange::RANGE_V" ref="g83f988df3128b75fe9b112eb1805d528" args="(x, y)" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g83f988df3128b75fe9b112eb1805d528">RANGE_V</a>(x, y)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Macro to declare a (unique) range in Volt. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g6d9b9f63e82704bf3b7d421bf81e09a5"></a><!-- doxytag: member="channelrange::RANGE_mA" ref="g6d9b9f63e82704bf3b7d421bf81e09a5" args="(x, y)" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g6d9b9f63e82704bf3b7d421bf81e09a5">RANGE_mA</a>(x, y)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Macro to declare a (unique) range in milliAmpere. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gf2ad48e400262267fe1b82c7bf36ed8d"></a><!-- doxytag: member="channelrange::RANGE_ext" ref="gf2ad48e400262267fe1b82c7bf36ed8d" args="(x, y)" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gf2ad48e400262267fe1b82c7bf36ed8d">RANGE_ext</a>(x, y)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Macro to declare a (unique) range in some external reference. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g2db9f4e0fea6bd9279f40944bc0eb8d8"></a><!-- doxytag: member="channelrange::A4L_RNG_GLOBAL_RNGDESC" ref="g2db9f4e0fea6bd9279f40944bc0eb8d8" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#g2db9f4e0fea6bd9279f40944bc0eb8d8">A4L_RNG_GLOBAL_RNGDESC</a> 0</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Constant to define a ranges descriptor as global (inter-channel). <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gff4af8964f6535142618e8c9c0377791"></a><!-- doxytag: member="channelrange::A4L_RNG_PERCHAN_RNGDESC" ref="gff4af8964f6535142618e8c9c0377791" args="" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gff4af8964f6535142618e8c9c0377791">A4L_RNG_PERCHAN_RNGDESC</a> 1</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Constant to define a ranges descriptor as specific for a channel. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="gbb8a61456a5088a58dbd7392872af4f0"></a><!-- doxytag: member="channelrange::RNG_GLOBAL" ref="gbb8a61456a5088a58dbd7392872af4f0" args="(x)" -->
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__channelrange.html#gbb8a61456a5088a58dbd7392872af4f0">RNG_GLOBAL</a>(x)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Macro to declare a ranges global descriptor in one line. <br></td></tr>
</table>
<hr><h2>Define Documentation</h2>
<a class="anchor" name="g0a6e191046fb86c68ca3fb24cbff8fe8"></a><!-- doxytag: member="channel_range.h::A4L_RNG_FACTOR" ref="g0a6e191046fb86c68ca3fb24cbff8fe8" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define A4L_RNG_FACTOR 1000000 </td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
Constant for internal use only (must not be used by driver developer).
<p>
<p>Referenced by <a class="el" href="range_8c-source.html#l00589">a4l_dtoraw()</a>, <a class="el" href="range_8c-source.html#l00166">a4l_find_range()</a>, <a class="el" href="range_8c-source.html#l00519">a4l_ftoraw()</a>, <a class="el" href="range_8c-source.html#l00382">a4l_rawtod()</a>, and <a class="el" href="range_8c-source.html#l00309">a4l_rawtof()</a>.</p>
</div>
</div><p>
</div>
<hr size="1"><address style="text-align: right;"><small>Generated on Mon Aug 2 12:48:39 2010 for Xenomai API by
<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>
|