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 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771
|
<!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/rtdm/rtdm_driver.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 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 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> <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>
<h1>include/rtdm/rtdm_driver.h</h1><a href="rtdm__driver_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001
<a name="l00026"></a>00026 <span class="preprocessor">#ifndef _RTDM_DRIVER_H</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define _RTDM_DRIVER_H</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span>
<a name="l00029"></a>00029 <span class="preprocessor">#ifndef __KERNEL__</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#error This header is for kernel space usage only. \</span>
<a name="l00031"></a>00031 <span class="preprocessor"> You are likely looking for rtdm/rtdm.h...</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__KERNEL__ */</span>
<a name="l00033"></a>00033
<a name="l00034"></a>00034 <span class="preprocessor">#include <asm/atomic.h></span>
<a name="l00035"></a>00035 <span class="preprocessor">#include <linux/list.h></span>
<a name="l00036"></a>00036
<a name="l00037"></a>00037 <span class="preprocessor">#include <nucleus/xenomai.h></span>
<a name="l00038"></a>00038 <span class="preprocessor">#include <nucleus/heap.h></span>
<a name="l00039"></a>00039 <span class="preprocessor">#include <<a class="code" href="pod_8h.html" title="Real-time pod interface header.">nucleus/pod.h</a>></span>
<a name="l00040"></a>00040 <span class="preprocessor">#include <nucleus/synch.h></span>
<a name="l00041"></a>00041 <span class="preprocessor">#include <<a class="code" href="select_8h.html" title="file descriptors events multiplexing header.">nucleus/select.h</a>></span>
<a name="l00042"></a>00042 <span class="preprocessor">#include <<a class="code" href="rtdm_8h.html" title="Real-Time Driver Model for Xenomai, user API header.">rtdm/rtdm.h</a>></span>
<a name="l00043"></a>00043
<a name="l00044"></a>00044 <span class="comment">/* debug support */</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include <nucleus/assert.h></span>
<a name="l00046"></a>00046 <span class="preprocessor">#ifdef CONFIG_PCI</span>
<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#include <asm-generic/xenomai/pci_ids.h></span>
<a name="l00048"></a>00048 <span class="preprocessor">#endif </span><span class="comment">/* CONFIG_PCI */</span>
<a name="l00049"></a>00049
<a name="l00050"></a>00050 <span class="preprocessor">#ifndef CONFIG_XENO_OPT_DEBUG_RTDM</span>
<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#define CONFIG_XENO_OPT_DEBUG_RTDM 0</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00053"></a>00053 <span class="preprocessor"></span>
<a name="l00054"></a>00054 <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a>;
<a name="l00055"></a>00055 <span class="keyword">typedef</span> <span class="keyword">struct </span>xnselector rtdm_selector_t;
<a name="l00056"></a>00056 <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a>;
<a name="l00057"></a>00057
<a name="l00070"></a><a class="code" href="group__devregister.html#g7c66ec8f269c701237437177af0704e8">00070</a> <span class="preprocessor">#define RTDM_EXCLUSIVE 0x0001</span>
<a name="l00071"></a>00071 <span class="preprocessor"></span>
<a name="l00073"></a><a class="code" href="group__devregister.html#g7651188ca1c05f7e68b36517874138b7">00073</a> <span class="preprocessor">#define RTDM_NAMED_DEVICE 0x0010</span>
<a name="l00074"></a>00074 <span class="preprocessor"></span>
<a name="l00077"></a><a class="code" href="group__devregister.html#g43ced044106ae9c1f5500d0041307d8f">00077</a> <span class="preprocessor">#define RTDM_PROTOCOL_DEVICE 0x0020</span>
<a name="l00078"></a>00078 <span class="preprocessor"></span>
<a name="l00080"></a><a class="code" href="group__devregister.html#gfdb542eb46679916b0100969e1033bfc">00080</a> <span class="preprocessor">#define RTDM_DEVICE_TYPE_MASK 0x00F0</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span>
<a name="l00090"></a><a class="code" href="group__devregister.html#ga6f17915089145982b04c51f202d950c">00090</a> <span class="preprocessor">#define RTDM_CREATED_IN_NRT 0</span>
<a name="l00091"></a>00091 <span class="preprocessor"></span>
<a name="l00093"></a><a class="code" href="group__devregister.html#g24b993fed8dae26b6597ba37f3f92eac">00093</a> <span class="preprocessor">#define RTDM_CLOSING 1</span>
<a name="l00094"></a>00094 <span class="preprocessor"></span>
<a name="l00096"></a><a class="code" href="group__devregister.html#g187778f8d7b6e5f0b459a526e6323471">00096</a> <span class="preprocessor">#define RTDM_USER_CONTEXT_FLAG 8 </span><span class="comment">/* first user-definable flag */</span>
<a name="l00097"></a>00097
<a name="l00106"></a><a class="code" href="group__devregister.html#gb0f99b00be17869d5c9cd844825766f4">00106</a> <span class="preprocessor">#define RTDM_DEVICE_STRUCT_VER 5</span>
<a name="l00107"></a>00107 <span class="preprocessor"></span>
<a name="l00109"></a><a class="code" href="group__devregister.html#gb127a755cab544c5b318d4f4a3578e9f">00109</a> <span class="preprocessor">#define RTDM_CONTEXT_STRUCT_VER 3</span>
<a name="l00110"></a>00110 <span class="preprocessor"></span>
<a name="l00112"></a><a class="code" href="group__devregister.html#gdea320d3993937f37edc6fa39a29d379">00112</a> <span class="preprocessor">#define RTDM_SECURE_DEVICE 0x80000000</span>
<a name="l00113"></a>00113 <span class="preprocessor"></span>
<a name="l00115"></a><a class="code" href="group__devregister.html#geddd03e63cdce1692edcc497a44756c2">00115</a> <span class="preprocessor">#define RTDM_DRIVER_VER(major, minor, patch) \</span>
<a name="l00116"></a>00116 <span class="preprocessor"> (((major & 0xFF) << 16) | ((minor & 0xFF) << 8) | (patch & 0xFF))</span>
<a name="l00117"></a>00117 <span class="preprocessor"></span>
<a name="l00119"></a><a class="code" href="group__devregister.html#g4df977587f67fefde551a437848b9514">00119</a> <span class="preprocessor">#define RTDM_DRIVER_MAJOR_VER(ver) (((ver) >> 16) & 0xFF)</span>
<a name="l00120"></a>00120 <span class="preprocessor"></span>
<a name="l00122"></a><a class="code" href="group__devregister.html#g1c2cb29427406f0febbb1c143f76497f">00122</a> <span class="preprocessor">#define RTDM_DRIVER_MINOR_VER(ver) (((ver) >> 8) & 0xFF)</span>
<a name="l00123"></a>00123 <span class="preprocessor"></span>
<a name="l00125"></a><a class="code" href="group__devregister.html#g606a1554fc17b5b8d6c0fa8d6dbb8f9b">00125</a> <span class="preprocessor">#define RTDM_DRIVER_PATCH_VER(ver) ((ver) & 0xFF)</span>
<a name="l00126"></a>00126 <span class="preprocessor"></span>
<a name="l00138"></a><a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">00138</a> <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> {
<a name="l00140"></a><a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e925013ddb0fbad9f52ad3646be2e5a6ba8b2b">00140</a> <a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e925013ddb0fbad9f52ad3646be2e5a6ba8b2b" title="Select input data availability events.">RTDM_SELECTTYPE_READ</a> = XNSELECT_READ,
<a name="l00141"></a>00141
<a name="l00143"></a><a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e9250137819f609dee2b20852001e9b7ecd462">00143</a> <a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e9250137819f609dee2b20852001e9b7ecd462" title="Select ouput buffer availability events.">RTDM_SELECTTYPE_WRITE</a> = XNSELECT_WRITE,
<a name="l00144"></a>00144
<a name="l00146"></a><a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e925012dd10c612a9e3c7e5134ee122ee3de74">00146</a> <a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e925012dd10c612a9e3c7e5134ee122ee3de74" title="Select exceptional events.">RTDM_SELECTTYPE_EXCEPT</a> = XNSELECT_EXCEPT
<a name="l00147"></a>00147 };
<a name="l00171"></a><a class="code" href="group__devregister.html#gf987b1139579bdb16b4541ea76121fa6">00171</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#gf987b1139579bdb16b4541ea76121fa6" title="Named device open handler.">rtdm_open_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00172"></a>00172 rtdm_user_info_t *user_info, <span class="keywordtype">int</span> oflag);
<a name="l00173"></a>00173
<a name="l00188"></a><a class="code" href="group__devregister.html#g07b8dc34cfc42f6203c510d1e982edc5">00188</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#g07b8dc34cfc42f6203c510d1e982edc5" title="Socket creation handler for protocol devices.">rtdm_socket_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00189"></a>00189 rtdm_user_info_t *user_info, <span class="keywordtype">int</span> protocol);
<a name="l00190"></a>00190
<a name="l00211"></a><a class="code" href="group__devregister.html#g6bd6c0761590d59f67b2c1e87fdd8440">00211</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#g6bd6c0761590d59f67b2c1e87fdd8440" title="Close handler.">rtdm_close_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00212"></a>00212 rtdm_user_info_t *user_info);
<a name="l00213"></a>00213
<a name="l00229"></a><a class="code" href="group__devregister.html#g3adab7928c65ee8ffd06c82c705d4804">00229</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#g3adab7928c65ee8ffd06c82c705d4804" title="IOCTL handler.">rtdm_ioctl_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00230"></a>00230 rtdm_user_info_t *user_info,
<a name="l00231"></a>00231 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> request, <span class="keywordtype">void</span> __user *arg);
<a name="l00232"></a>00232
<a name="l00246"></a><a class="code" href="group__devregister.html#g462c61f19f6bc6a0ef93a57ab6b218bf">00246</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#g462c61f19f6bc6a0ef93a57ab6b218bf" title="Select binding handler.">rtdm_select_bind_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00247"></a>00247 rtdm_selector_t *selector,
<a name="l00248"></a>00248 <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> type,
<a name="l00249"></a>00249 <span class="keywordtype">unsigned</span> fd_index);
<a name="l00250"></a>00250
<a name="l00266"></a><a class="code" href="group__devregister.html#g1a2f92a5ebe9f4d46fb6722ed5da047c">00266</a> <span class="keyword">typedef</span> ssize_t (*<a class="code" href="group__devregister.html#g1a2f92a5ebe9f4d46fb6722ed5da047c" title="Read handler.">rtdm_read_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00267"></a>00267 rtdm_user_info_t *user_info,
<a name="l00268"></a>00268 <span class="keywordtype">void</span> *buf, <span class="keywordtype">size_t</span> nbyte);
<a name="l00269"></a>00269
<a name="l00285"></a><a class="code" href="group__devregister.html#ga2b3421e29ae63cf49622765a5bc9cee">00285</a> <span class="keyword">typedef</span> ssize_t (*<a class="code" href="group__devregister.html#ga2b3421e29ae63cf49622765a5bc9cee" title="Write handler.">rtdm_write_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00286"></a>00286 rtdm_user_info_t *user_info,
<a name="l00287"></a>00287 <span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keywordtype">size_t</span> nbyte);
<a name="l00288"></a>00288
<a name="l00305"></a><a class="code" href="group__devregister.html#g8e592853e1072c8b32e2263557990a66">00305</a> <span class="keyword">typedef</span> ssize_t (*<a class="code" href="group__devregister.html#g8e592853e1072c8b32e2263557990a66" title="Receive message handler.">rtdm_recvmsg_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00306"></a>00306 rtdm_user_info_t *user_info,
<a name="l00307"></a>00307 <span class="keyword">struct </span>msghdr *msg, <span class="keywordtype">int</span> flags);
<a name="l00308"></a>00308
<a name="l00325"></a><a class="code" href="group__devregister.html#g2f142d15145b97e837f5e26775a4b0f1">00325</a> <span class="keyword">typedef</span> ssize_t (*<a class="code" href="group__devregister.html#g2f142d15145b97e837f5e26775a4b0f1" title="Transmit message handler.">rtdm_sendmsg_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00326"></a>00326 rtdm_user_info_t *user_info,
<a name="l00327"></a>00327 <span class="keyword">const</span> <span class="keyword">struct </span>msghdr *msg, <span class="keywordtype">int</span> flags);
<a name="l00330"></a>00330 <span class="keyword">typedef</span> int (*rtdm_rt_handler_t)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00331"></a>00331 rtdm_user_info_t *user_info, <span class="keywordtype">void</span> *arg);
<a name="l00335"></a><a class="code" href="structrtdm__operations.html">00335</a> <span class="keyword">struct </span><a class="code" href="structrtdm__operations.html" title="Device operations.">rtdm_operations</a> {
<a name="l00340"></a><a class="code" href="structrtdm__operations.html#23a81aa4c48d55c937c2763c27c8372c">00340</a> <a class="code" href="group__devregister.html#g6bd6c0761590d59f67b2c1e87fdd8440" title="Close handler.">rtdm_close_handler_t</a> <a class="code" href="structrtdm__operations.html#23a81aa4c48d55c937c2763c27c8372c" title="Close handler for real-time contexts (optional, deprecated).">close_rt</a>;
<a name="l00342"></a><a class="code" href="structrtdm__operations.html#218dceb0ad1125f2c1c3e3e95a8d4894">00342</a> <a class="code" href="group__devregister.html#g6bd6c0761590d59f67b2c1e87fdd8440" title="Close handler.">rtdm_close_handler_t</a> <a class="code" href="structrtdm__operations.html#218dceb0ad1125f2c1c3e3e95a8d4894" title="Close handler for non-real-time contexts (required).">close_nrt</a>;
<a name="l00343"></a>00343
<a name="l00345"></a><a class="code" href="structrtdm__operations.html#b49e368d71fd6647b0e74a6105d63528">00345</a> <a class="code" href="group__devregister.html#g3adab7928c65ee8ffd06c82c705d4804" title="IOCTL handler.">rtdm_ioctl_handler_t</a> <a class="code" href="structrtdm__operations.html#b49e368d71fd6647b0e74a6105d63528" title="IOCTL from real-time context (optional).">ioctl_rt</a>;
<a name="l00347"></a><a class="code" href="structrtdm__operations.html#1b34c77998c6795f3d26047f323ca470">00347</a> <a class="code" href="group__devregister.html#g3adab7928c65ee8ffd06c82c705d4804" title="IOCTL handler.">rtdm_ioctl_handler_t</a> <a class="code" href="structrtdm__operations.html#1b34c77998c6795f3d26047f323ca470" title="IOCTL from non-real-time context (optional).">ioctl_nrt</a>;
<a name="l00348"></a>00348
<a name="l00350"></a><a class="code" href="structrtdm__operations.html#a052e237d48e04bfb777fde1b6eb83e7">00350</a> <a class="code" href="group__devregister.html#g462c61f19f6bc6a0ef93a57ab6b218bf" title="Select binding handler.">rtdm_select_bind_handler_t</a> <a class="code" href="structrtdm__operations.html#a052e237d48e04bfb777fde1b6eb83e7" title="Select binding handler for any context (optional).">select_bind</a>;
<a name="l00356"></a><a class="code" href="structrtdm__operations.html#d3c519ed6779656dbd926f3c92cd9cfe">00356</a> <a class="code" href="group__devregister.html#g1a2f92a5ebe9f4d46fb6722ed5da047c" title="Read handler.">rtdm_read_handler_t</a> <a class="code" href="structrtdm__operations.html#d3c519ed6779656dbd926f3c92cd9cfe" title="Read handler for real-time context (optional).">read_rt</a>;
<a name="l00358"></a><a class="code" href="structrtdm__operations.html#cd37d3ca267df2944400fedeca9de653">00358</a> <a class="code" href="group__devregister.html#g1a2f92a5ebe9f4d46fb6722ed5da047c" title="Read handler.">rtdm_read_handler_t</a> <a class="code" href="structrtdm__operations.html#cd37d3ca267df2944400fedeca9de653" title="Read handler for non-real-time context (optional).">read_nrt</a>;
<a name="l00359"></a>00359
<a name="l00361"></a><a class="code" href="structrtdm__operations.html#6497c11edeab09f8f1b09cc0cb30de24">00361</a> <a class="code" href="group__devregister.html#ga2b3421e29ae63cf49622765a5bc9cee" title="Write handler.">rtdm_write_handler_t</a> <a class="code" href="structrtdm__operations.html#6497c11edeab09f8f1b09cc0cb30de24" title="Write handler for real-time context (optional).">write_rt</a>;
<a name="l00363"></a><a class="code" href="structrtdm__operations.html#6554db3606e4fbe4b3cfbd4ee6c8f4d3">00363</a> <a class="code" href="group__devregister.html#ga2b3421e29ae63cf49622765a5bc9cee" title="Write handler.">rtdm_write_handler_t</a> <a class="code" href="structrtdm__operations.html#6554db3606e4fbe4b3cfbd4ee6c8f4d3" title="Write handler for non-real-time context (optional).">write_nrt</a>;
<a name="l00369"></a><a class="code" href="structrtdm__operations.html#0c4eecce6bd0ca7e42c31ab832d0c040">00369</a> <a class="code" href="group__devregister.html#g8e592853e1072c8b32e2263557990a66" title="Receive message handler.">rtdm_recvmsg_handler_t</a> <a class="code" href="structrtdm__operations.html#0c4eecce6bd0ca7e42c31ab832d0c040" title="Receive message handler for real-time context (optional).">recvmsg_rt</a>;
<a name="l00371"></a><a class="code" href="structrtdm__operations.html#a8bf96cf72a3606f395aede8124bedbb">00371</a> <a class="code" href="group__devregister.html#g8e592853e1072c8b32e2263557990a66" title="Receive message handler.">rtdm_recvmsg_handler_t</a> <a class="code" href="structrtdm__operations.html#a8bf96cf72a3606f395aede8124bedbb" title="Receive message handler for non-real-time context (optional).">recvmsg_nrt</a>;
<a name="l00372"></a>00372
<a name="l00374"></a><a class="code" href="structrtdm__operations.html#59b5f137bf6cabb076c39e375f053ed3">00374</a> <a class="code" href="group__devregister.html#g2f142d15145b97e837f5e26775a4b0f1" title="Transmit message handler.">rtdm_sendmsg_handler_t</a> <a class="code" href="structrtdm__operations.html#59b5f137bf6cabb076c39e375f053ed3" title="Transmit message handler for real-time context (optional).">sendmsg_rt</a>;
<a name="l00376"></a><a class="code" href="structrtdm__operations.html#cba25b7a9180b7891e118b3f8568bdf7">00376</a> <a class="code" href="group__devregister.html#g2f142d15145b97e837f5e26775a4b0f1" title="Transmit message handler.">rtdm_sendmsg_handler_t</a> <a class="code" href="structrtdm__operations.html#cba25b7a9180b7891e118b3f8568bdf7" title="Transmit message handler for non-real-time context (optional).">sendmsg_nrt</a>;
<a name="l00378"></a>00378 };
<a name="l00379"></a>00379
<a name="l00380"></a>00380 <span class="keyword">struct </span>rtdm_devctx_reserved {
<a name="l00381"></a>00381 <span class="keywordtype">void</span> *owner;
<a name="l00382"></a>00382 <span class="keyword">struct </span>list_head cleanup;
<a name="l00383"></a>00383 };
<a name="l00384"></a>00384
<a name="l00396"></a><a class="code" href="structrtdm__dev__context.html">00396</a> <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> {
<a name="l00398"></a><a class="code" href="structrtdm__dev__context.html#ed55a77fa767c4915ee1a317130b8d09">00398</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="structrtdm__dev__context.html#ed55a77fa767c4915ee1a317130b8d09" title="Context flags, see Context Flags for details.">context_flags</a>;
<a name="l00399"></a>00399
<a name="l00401"></a><a class="code" href="structrtdm__dev__context.html#3347d4133672fb9dc161736105fcf251">00401</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__dev__context.html#3347d4133672fb9dc161736105fcf251" title="Associated file descriptor.">fd</a>;
<a name="l00402"></a>00402
<a name="l00405"></a><a class="code" href="structrtdm__dev__context.html#dca0cb98487cc1a5947e5ff76f62109a">00405</a> atomic_t <a class="code" href="structrtdm__dev__context.html#dca0cb98487cc1a5947e5ff76f62109a" title="Lock counter of context, held while structure is referenced by an operation handler...">close_lock_count</a>;
<a name="l00406"></a>00406
<a name="l00408"></a><a class="code" href="structrtdm__dev__context.html#91420e832bc08338b0d84b12edff9e88">00408</a> <span class="keyword">struct </span><a class="code" href="structrtdm__operations.html" title="Device operations.">rtdm_operations</a> *<a class="code" href="structrtdm__dev__context.html#91420e832bc08338b0d84b12edff9e88" title="Set of active device operation handlers.">ops</a>;
<a name="l00409"></a>00409
<a name="l00411"></a><a class="code" href="structrtdm__dev__context.html#8fea6f19169a166aa183d2e9da09df51">00411</a> <span class="keyword">struct </span><a class="code" href="structrtdm__device.html" title="RTDM device.">rtdm_device</a> *<a class="code" href="structrtdm__dev__context.html#8fea6f19169a166aa183d2e9da09df51" title="Reference to owning device.">device</a>;
<a name="l00412"></a>00412
<a name="l00414"></a><a class="code" href="structrtdm__dev__context.html#35602d44d821195ba42acb1e280a4851">00414</a> <span class="keyword">struct </span>rtdm_devctx_reserved <a class="code" href="structrtdm__dev__context.html#35602d44d821195ba42acb1e280a4851" title="Data stored by RTDM inside a device context (internal use only).">reserved</a>;
<a name="l00415"></a>00415
<a name="l00417"></a><a class="code" href="structrtdm__dev__context.html#720bc9395d80f0dea40c7ac3e449ea25">00417</a> <span class="keywordtype">char</span> <a class="code" href="structrtdm__dev__context.html#720bc9395d80f0dea40c7ac3e449ea25" title="Begin of driver defined context data structure.">dev_private</a>[0];
<a name="l00418"></a>00418 };
<a name="l00419"></a>00419
<a name="l00428"></a>00428 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> *
<a name="l00429"></a><a class="code" href="group__devregister.html#g765ab311ea9024a7ff210e963acd7a14">00429</a> <a class="code" href="group__devregister.html#g765ab311ea9024a7ff210e963acd7a14" title="Locate the driver private area associated to a device context structure.">rtdm_context_to_private</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context)
<a name="l00430"></a>00430 {
<a name="l00431"></a>00431 <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)context-><a class="code" href="structrtdm__dev__context.html#720bc9395d80f0dea40c7ac3e449ea25" title="Begin of driver defined context data structure.">dev_private</a>;
<a name="l00432"></a>00432 }
<a name="l00433"></a>00433
<a name="l00442"></a>00442 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *
<a name="l00443"></a><a class="code" href="group__devregister.html#gcc982b978fc3967b0e9d6d308f79c6ee">00443</a> <a class="code" href="group__devregister.html#gcc982b978fc3967b0e9d6d308f79c6ee" title="Locate a device context structure from its driver private area.">rtdm_private_to_context</a>(<span class="keywordtype">void</span> *<a class="code" href="structrtdm__dev__context.html#720bc9395d80f0dea40c7ac3e449ea25" title="Begin of driver defined context data structure.">dev_private</a>)
<a name="l00444"></a>00444 {
<a name="l00445"></a>00445 <span class="keywordflow">return</span> container_of(dev_private, <span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a>, dev_private);
<a name="l00446"></a>00446 }
<a name="l00447"></a>00447
<a name="l00448"></a>00448 <span class="keyword">struct </span>rtdm_dev_reserved {
<a name="l00449"></a>00449 <span class="keyword">struct </span>list_head entry;
<a name="l00450"></a>00450 atomic_t refcount;
<a name="l00451"></a>00451 <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *exclusive_context;
<a name="l00452"></a>00452 };
<a name="l00453"></a>00453
<a name="l00461"></a><a class="code" href="structrtdm__device.html">00461</a> <span class="keyword">struct </span><a class="code" href="structrtdm__device.html" title="RTDM device.">rtdm_device</a> {
<a name="l00464"></a><a class="code" href="structrtdm__device.html#aa2844f98d874f16d802b4e0b693e4e2">00464</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#aa2844f98d874f16d802b4e0b693e4e2" title="Revision number of this structure, see Driver Versioning defines.">struct_version</a>;
<a name="l00465"></a>00465
<a name="l00467"></a><a class="code" href="structrtdm__device.html#f459bf86f0d037c99bb669f627d78764">00467</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#f459bf86f0d037c99bb669f627d78764" title="Device flags, see Device Flags for details.">device_flags</a>;
<a name="l00469"></a><a class="code" href="structrtdm__device.html#48d67f835c341c5d27bc5886920a11da">00469</a> <span class="keywordtype">size_t</span> <a class="code" href="structrtdm__device.html#48d67f835c341c5d27bc5886920a11da" title="Size of driver defined appendix to struct rtdm_dev_context.">context_size</a>;
<a name="l00470"></a>00470
<a name="l00472"></a><a class="code" href="structrtdm__device.html#376a833e95ff75eb9c8033895bc5e102">00472</a> <span class="keywordtype">char</span> <a class="code" href="structrtdm__device.html#376a833e95ff75eb9c8033895bc5e102" title="Named device identification (orthogonal to Linux device name space).">device_name</a>[RTDM_MAX_DEVNAME_LEN + 1];
<a name="l00473"></a>00473
<a name="l00475"></a><a class="code" href="structrtdm__device.html#e58c050e09a79b277f718d796eda2072">00475</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#e58c050e09a79b277f718d796eda2072" title="Protocol device identification: protocol family (PF_xxx).">protocol_family</a>;
<a name="l00477"></a><a class="code" href="structrtdm__device.html#02552f2d91052bd801576b3a132ba3f9">00477</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#02552f2d91052bd801576b3a132ba3f9" title="Protocol device identification: socket type (SOCK_xxx).">socket_type</a>;
<a name="l00478"></a>00478
<a name="l00483"></a><a class="code" href="structrtdm__device.html#f05d59487bedf7d79dc6b1858c0353c9">00483</a> <a class="code" href="group__devregister.html#gf987b1139579bdb16b4541ea76121fa6" title="Named device open handler.">rtdm_open_handler_t</a> <a class="code" href="structrtdm__device.html#f05d59487bedf7d79dc6b1858c0353c9" title="Named device instance creation for real-time contexts, optional (but deprecated)...">open_rt</a>;
<a name="l00486"></a><a class="code" href="structrtdm__device.html#948b25a417f5ca6f3737402b60df05d2">00486</a> <a class="code" href="group__devregister.html#gf987b1139579bdb16b4541ea76121fa6" title="Named device open handler.">rtdm_open_handler_t</a> <a class="code" href="structrtdm__device.html#948b25a417f5ca6f3737402b60df05d2" title="Named device instance creation for non-real-time contexts, optional if open_rt is...">open_nrt</a>;
<a name="l00487"></a>00487
<a name="l00493"></a><a class="code" href="structrtdm__device.html#d83a8dff6e8705e442f9a7d352556267">00493</a> <a class="code" href="group__devregister.html#g07b8dc34cfc42f6203c510d1e982edc5" title="Socket creation handler for protocol devices.">rtdm_socket_handler_t</a> <a class="code" href="structrtdm__device.html#d83a8dff6e8705e442f9a7d352556267" title="Protocol socket creation for real-time contexts, optional (but deprecated) if socket_nrt...">socket_rt</a>;
<a name="l00496"></a><a class="code" href="structrtdm__device.html#dbba71fe2c5bbc2e3abb8cd505e088a0">00496</a> <a class="code" href="group__devregister.html#g07b8dc34cfc42f6203c510d1e982edc5" title="Socket creation handler for protocol devices.">rtdm_socket_handler_t</a> <a class="code" href="structrtdm__device.html#dbba71fe2c5bbc2e3abb8cd505e088a0" title="Protocol socket creation for non-real-time contexts, optional if socket_rt is non-NULL...">socket_nrt</a>;
<a name="l00497"></a>00497
<a name="l00499"></a><a class="code" href="structrtdm__device.html#5f92064ba1e7eb351b00277b17d513ef">00499</a> <span class="keyword">struct </span><a class="code" href="structrtdm__operations.html" title="Device operations.">rtdm_operations</a> <a class="code" href="structrtdm__device.html#5f92064ba1e7eb351b00277b17d513ef" title="Default operations on newly opened device instance.">ops</a>;
<a name="l00500"></a>00500
<a name="l00502"></a><a class="code" href="structrtdm__device.html#94aa3100258b43c812c5240b55777f07">00502</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#94aa3100258b43c812c5240b55777f07" title="Device class ID, see RTDM_CLASS_xxx.">device_class</a>;
<a name="l00505"></a><a class="code" href="structrtdm__device.html#ece6c5135a6256dbb3636f66eb97cb40">00505</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#ece6c5135a6256dbb3636f66eb97cb40" title="Device sub-class, see RTDM_SUBCLASS_xxx definition in the Device Profiles.">device_sub_class</a>;
<a name="l00507"></a><a class="code" href="structrtdm__device.html#157db58bb0025b832ca409bc40735ae9">00507</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#157db58bb0025b832ca409bc40735ae9" title="Supported device profile version.">profile_version</a>;
<a name="l00509"></a><a class="code" href="structrtdm__device.html#55d676531831124ae7e8051addde3cdc">00509</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structrtdm__device.html#55d676531831124ae7e8051addde3cdc" title="Informational driver name (reported via /proc).">driver_name</a>;
<a name="l00511"></a><a class="code" href="structrtdm__device.html#ebcb235c789d0698fd821124817e2330">00511</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#ebcb235c789d0698fd821124817e2330" title="Driver version, see Driver Versioning defines.">driver_version</a>;
<a name="l00514"></a><a class="code" href="structrtdm__device.html#ed46d0d1567069de23a7400ff987610b">00514</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structrtdm__device.html#ed46d0d1567069de23a7400ff987610b" title="Informational peripheral name the device is attached to (reported via /proc).">peripheral_name</a>;
<a name="l00516"></a><a class="code" href="structrtdm__device.html#aacffe6b5bcea62396bf09d6ae2650ba">00516</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structrtdm__device.html#aacffe6b5bcea62396bf09d6ae2650ba" title="Informational driver provider name (reported via /proc).">provider_name</a>;
<a name="l00517"></a>00517
<a name="l00519"></a><a class="code" href="structrtdm__device.html#0df5612d6bfcf6421509345384467392">00519</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structrtdm__device.html#0df5612d6bfcf6421509345384467392" title="Name of /proc entry for the device, must not be NULL.">proc_name</a>;
<a name="l00521"></a><a class="code" href="structrtdm__device.html#67894906d84ed03318277eddc36e35e3">00521</a> <span class="keyword">struct </span>proc_dir_entry *<a class="code" href="structrtdm__device.html#67894906d84ed03318277eddc36e35e3" title="Set to device&#39;s /proc root entry after registration, do not modify.">proc_entry</a>;
<a name="l00522"></a>00522
<a name="l00524"></a><a class="code" href="structrtdm__device.html#13d065b957258e702b0c0526c64b729b">00524</a> <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#13d065b957258e702b0c0526c64b729b" title="Driver definable device ID.">device_id</a>;
<a name="l00526"></a><a class="code" href="structrtdm__device.html#23bedbebe7a0d2e392ca6dce1585edcc">00526</a> <span class="keywordtype">void</span> *<a class="code" href="structrtdm__device.html#23bedbebe7a0d2e392ca6dce1585edcc" title="Driver definable device data.">device_data</a>;
<a name="l00527"></a>00527
<a name="l00529"></a><a class="code" href="structrtdm__device.html#548f89224ffc7146fd46c53a0eb48040">00529</a> <span class="keyword">struct </span>rtdm_dev_reserved <a class="code" href="structrtdm__device.html#548f89224ffc7146fd46c53a0eb48040" title="Data stored by RTDM inside a registered device (internal use only).">reserved</a>;
<a name="l00530"></a>00530 };
<a name="l00533"></a>00533 <span class="comment">/* --- device registration --- */</span>
<a name="l00534"></a>00534
<a name="l00535"></a>00535 <span class="keywordtype">int</span> <a class="code" href="group__devregister.html#g6a191b3d206680c48cad2047adb9fc98" title="Register a RTDM device.">rtdm_dev_register</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__device.html" title="RTDM device.">rtdm_device</a> *device);
<a name="l00536"></a>00536 <span class="keywordtype">int</span> <a class="code" href="group__devregister.html#g9cc04a9b6e1710d9ad3860de8d81bf14" title="Unregisters a RTDM device.">rtdm_dev_unregister</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__device.html" title="RTDM device.">rtdm_device</a> *device, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> poll_delay);
<a name="l00537"></a>00537
<a name="l00538"></a>00538 <span class="comment">/* --- inter-driver API --- */</span>
<a name="l00539"></a>00539
<a name="l00540"></a>00540 <span class="preprocessor">#define rtdm_open rt_dev_open</span>
<a name="l00541"></a>00541 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_socket rt_dev_socket</span>
<a name="l00542"></a>00542 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_close rt_dev_close</span>
<a name="l00543"></a>00543 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_ioctl rt_dev_ioctl</span>
<a name="l00544"></a>00544 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_read rt_dev_read</span>
<a name="l00545"></a>00545 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_write rt_dev_write</span>
<a name="l00546"></a>00546 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_recvmsg rt_dev_recvmsg</span>
<a name="l00547"></a>00547 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_recv rt_dev_recv</span>
<a name="l00548"></a>00548 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_recvfrom rt_dev_recvfrom</span>
<a name="l00549"></a>00549 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_sendmsg rt_dev_sendmsg</span>
<a name="l00550"></a>00550 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_send rt_dev_send</span>
<a name="l00551"></a>00551 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_sendto rt_dev_sendto</span>
<a name="l00552"></a>00552 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_bind rt_dev_bind</span>
<a name="l00553"></a>00553 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_listen rt_dev_listen</span>
<a name="l00554"></a>00554 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_accept rt_dev_accept</span>
<a name="l00555"></a>00555 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_getsockopt rt_dev_getsockopt</span>
<a name="l00556"></a>00556 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_setsockopt rt_dev_setsockopt</span>
<a name="l00557"></a>00557 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_getsockname rt_dev_getsockname</span>
<a name="l00558"></a>00558 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_getpeername rt_dev_getpeername</span>
<a name="l00559"></a>00559 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_shutdown rt_dev_shutdown</span>
<a name="l00560"></a>00560 <span class="preprocessor"></span>
<a name="l00561"></a>00561 <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *<a class="code" href="group__interdrv.html#g99e8509f4c8b404f0d5795b575d4c9cb" title="Retrieve and lock a device context.">rtdm_context_get</a>(<span class="keywordtype">int</span> <a class="code" href="structrtdm__dev__context.html#3347d4133672fb9dc161736105fcf251" title="Associated file descriptor.">fd</a>);
<a name="l00562"></a>00562
<a name="l00563"></a>00563 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l00564"></a>00564
<a name="l00565"></a>00565 <span class="preprocessor">#define CONTEXT_IS_LOCKED(context) \</span>
<a name="l00566"></a>00566 <span class="preprocessor"> (atomic_read(&(context)->close_lock_count) > 1 || \</span>
<a name="l00567"></a>00567 <span class="preprocessor"> (test_bit(RTDM_CLOSING, &(context)->context_flags) && \</span>
<a name="l00568"></a>00568 <span class="preprocessor"> atomic_read(&(context)->close_lock_count) > 0))</span>
<a name="l00569"></a>00569 <span class="preprocessor"></span>
<a name="l00570"></a>00570 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__interdrv.html#g2a37e9e938db6e8d2f50f66939de7016" title="Increment context reference counter.">rtdm_context_lock</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context)
<a name="l00571"></a>00571 {
<a name="l00572"></a>00572 XENO_ASSERT(RTDM, CONTEXT_IS_LOCKED(context),
<a name="l00573"></a>00573 <span class="comment">/* just warn if context was a dangling pointer */</span>);
<a name="l00574"></a>00574 atomic_inc(&context-><a class="code" href="structrtdm__dev__context.html#dca0cb98487cc1a5947e5ff76f62109a" title="Lock counter of context, held while structure is referenced by an operation handler...">close_lock_count</a>);
<a name="l00575"></a>00575 }
<a name="l00576"></a>00576
<a name="l00577"></a>00577 <span class="keyword">extern</span> <span class="keywordtype">int</span> rtdm_apc;
<a name="l00578"></a>00578
<a name="l00579"></a>00579 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__interdrv.html#ga48a3e04fd74cec81691d5d2187d7ef2" title="Decrement context reference counter.">rtdm_context_unlock</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context)
<a name="l00580"></a>00580 {
<a name="l00581"></a>00581 XENO_ASSERT(RTDM, CONTEXT_IS_LOCKED(context),
<a name="l00582"></a>00582 <span class="comment">/* just warn if context was a dangling pointer */</span>);
<a name="l00583"></a>00583 smp_mb__before_atomic_dec();
<a name="l00584"></a>00584 <span class="keywordflow">if</span> (unlikely(atomic_dec_and_test(&context-><a class="code" href="structrtdm__dev__context.html#dca0cb98487cc1a5947e5ff76f62109a" title="Lock counter of context, held while structure is referenced by an operation handler...">close_lock_count</a>)))
<a name="l00585"></a>00585 <a class="code" href="group__hal.html#ga0e99241b9b16e6a43a4eb0ec144448e" title="Schedule an APC invocation.">rthal_apc_schedule</a>(rtdm_apc);
<a name="l00586"></a>00586 }
<a name="l00587"></a>00587
<a name="l00588"></a>00588 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__interdrv.html#g05772193e3398e0bc3c9a6e3ed8f90f9" title="Release a device context obtained via rtdm_context_get().">rtdm_context_put</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context)
<a name="l00589"></a>00589 {
<a name="l00590"></a>00590 <a class="code" href="group__interdrv.html#ga48a3e04fd74cec81691d5d2187d7ef2" title="Decrement context reference counter.">rtdm_context_unlock</a>(context);
<a name="l00591"></a>00591 }
<a name="l00592"></a>00592
<a name="l00593"></a>00593 <span class="comment">/* --- clock services --- */</span>
<a name="l00594"></a>00594 <span class="keyword">struct </span>xntbase;
<a name="l00595"></a>00595 <span class="keyword">extern</span> <span class="keyword">struct </span>xntbase *rtdm_tbase;
<a name="l00596"></a>00596
<a name="l00597"></a>00597 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> <a class="code" href="group__clock.html#g6cca1db0fd4c207ad92cdc9e9442afa5" title="Get system time.">rtdm_clock_read</a>(<span class="keywordtype">void</span>)
<a name="l00598"></a>00598 {
<a name="l00599"></a>00599 <span class="keywordflow">return</span> xntbase_ticks2ns(rtdm_tbase, <a class="code" href="group__timebase.html#g5246b53b5b2d1b11d4fab4312fd16fda" title="Get the clock time for a given time base.">xntbase_get_time</a>(rtdm_tbase));
<a name="l00600"></a>00600 }
<a name="l00601"></a>00601
<a name="l00602"></a>00602 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> <a class="code" href="group__clock.html#g861a79090031b981c627107248cf2d14" title="Get monotonic time.">rtdm_clock_read_monotonic</a>(<span class="keywordtype">void</span>)
<a name="l00603"></a>00603 {
<a name="l00604"></a>00604 <span class="keywordflow">return</span> xntbase_ticks2ns(rtdm_tbase, xntbase_get_jiffies(rtdm_tbase));
<a name="l00605"></a>00605 }
<a name="l00606"></a>00606 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l00607"></a>00607
<a name="l00613"></a>00613 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g0f7da4cec7713ed732ffd99040e219e2" title="Bind a selector to specified event types of a given file descriptor.">rtdm_select_bind</a>(<span class="keywordtype">int</span> fd, rtdm_selector_t *selector,
<a name="l00614"></a>00614 <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> type, <span class="keywordtype">unsigned</span> fd_index);
<a name="l00615"></a>00615
<a name="l00616"></a>00616 <span class="comment">/* --- spin lock services --- */</span>
<a name="l00654"></a>00654 <span class="preprocessor">#ifdef DOXYGEN_CPP </span><span class="comment">/* Beautify doxygen output */</span>
<a name="l00655"></a><a class="code" href="group__rtdmsync.html#gbbaf52632d5dde7fa66e0b70d887493b">00655</a> <span class="preprocessor">#define RTDM_EXECUTE_ATOMICALLY(code_block) \</span>
<a name="l00656"></a>00656 <span class="preprocessor">{ \</span>
<a name="l00657"></a>00657 <span class="preprocessor"> <ENTER_ATOMIC_SECTION> \</span>
<a name="l00658"></a>00658 <span class="preprocessor"> code_block; \</span>
<a name="l00659"></a>00659 <span class="preprocessor"> <LEAVE_ATOMIC_SECTION> \</span>
<a name="l00660"></a>00660 <span class="preprocessor">}</span>
<a name="l00661"></a>00661 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* This is how it really works */</span>
<a name="l00662"></a>00662 <span class="preprocessor">#define RTDM_EXECUTE_ATOMICALLY(code_block) \</span>
<a name="l00663"></a>00663 <span class="preprocessor">{ \</span>
<a name="l00664"></a>00664 <span class="preprocessor"> spl_t __rtdm_s; \</span>
<a name="l00665"></a>00665 <span class="preprocessor"> \</span>
<a name="l00666"></a>00666 <span class="preprocessor"> xnlock_get_irqsave(&nklock, __rtdm_s); \</span>
<a name="l00667"></a>00667 <span class="preprocessor"> code_block; \</span>
<a name="l00668"></a>00668 <span class="preprocessor"> xnlock_put_irqrestore(&nklock, __rtdm_s); \</span>
<a name="l00669"></a>00669 <span class="preprocessor">}</span>
<a name="l00670"></a>00670 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00671"></a>00671 <span class="preprocessor"></span>
<a name="l00681"></a><a class="code" href="group__rtdmsync.html#g1dd901a6311b10ef7961b5fce7fa9d41">00681</a> <span class="preprocessor">#define RTDM_LOCK_UNLOCKED RTHAL_SPIN_LOCK_UNLOCKED</span>
<a name="l00682"></a>00682 <span class="preprocessor"></span>
<a name="l00684"></a><a class="code" href="group__rtdmsync.html#gb6398c5dab6f8614bc8310b2248ae0b6">00684</a> <span class="keyword">typedef</span> rthal_spinlock_t <a class="code" href="group__rtdmsync.html#gb6398c5dab6f8614bc8310b2248ae0b6" title="Lock variable.">rtdm_lock_t</a>;
<a name="l00685"></a>00685
<a name="l00687"></a><a class="code" href="group__rtdmsync.html#g7584217487c323356414e21200a57e63">00687</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="group__rtdmsync.html#g7584217487c323356414e21200a57e63" title="Variable to save the context while holding a lock.">rtdm_lockctx_t</a>;
<a name="l00688"></a>00688
<a name="l00704"></a><a class="code" href="group__rtdmsync.html#g6abf985ea7a0b13ec564cf0107fd8cba">00704</a> <span class="preprocessor">#define rtdm_lock_init(lock) rthal_spin_lock_init(lock)</span>
<a name="l00705"></a>00705 <span class="preprocessor"></span>
<a name="l00722"></a>00722 <span class="preprocessor">#ifdef DOXYGEN_CPP </span><span class="comment">/* Beautify doxygen output */</span>
<a name="l00723"></a><a class="code" href="group__rtdmsync.html#g65a4897268e15bda462b871976cb3909">00723</a> <span class="preprocessor">#define rtdm_lock_get(lock) rthal_spin_lock(lock)</span>
<a name="l00724"></a>00724 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* This is how it really works */</span>
<a name="l00725"></a>00725 <span class="preprocessor">#define rtdm_lock_get(lock) \</span>
<a name="l00726"></a>00726 <span class="preprocessor"> do { \</span>
<a name="l00727"></a>00727 <span class="preprocessor"> XENO_BUGON(RTDM, !rthal_local_irq_disabled()); \</span>
<a name="l00728"></a>00728 <span class="preprocessor"> rthal_spin_lock(lock); \</span>
<a name="l00729"></a>00729 <span class="preprocessor"> } while (0)</span>
<a name="l00730"></a>00730 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00731"></a>00731 <span class="preprocessor"></span>
<a name="l00748"></a><a class="code" href="group__rtdmsync.html#g963bdb01102d0076cd64f6bc72a347da">00748</a> <span class="preprocessor">#define rtdm_lock_put(lock) rthal_spin_unlock(lock)</span>
<a name="l00749"></a>00749 <span class="preprocessor"></span>
<a name="l00767"></a><a class="code" href="group__rtdmsync.html#g985473873f9e32af688fe8a23634693d">00767</a> <span class="preprocessor">#define rtdm_lock_get_irqsave(lock, context) \</span>
<a name="l00768"></a>00768 <span class="preprocessor"> rthal_spin_lock_irqsave(lock, context)</span>
<a name="l00769"></a>00769 <span class="preprocessor"></span>
<a name="l00787"></a><a class="code" href="group__rtdmsync.html#g4f1f8e33baf33b162636f63dec61aebd">00787</a> <span class="preprocessor">#define rtdm_lock_put_irqrestore(lock, context) \</span>
<a name="l00788"></a>00788 <span class="preprocessor"> rthal_spin_unlock_irqrestore(lock, context)</span>
<a name="l00789"></a>00789 <span class="preprocessor"></span>
<a name="l00806"></a><a class="code" href="group__rtdmsync.html#g3d563fc5def018f743c55c452e061758">00806</a> <span class="preprocessor">#define rtdm_lock_irqsave(context) \</span>
<a name="l00807"></a>00807 <span class="preprocessor"> rthal_local_irq_save(context)</span>
<a name="l00808"></a>00808 <span class="preprocessor"></span>
<a name="l00825"></a><a class="code" href="group__rtdmsync.html#ge03c387fcae8a55105dd31d7c008bbb4">00825</a> <span class="preprocessor">#define rtdm_lock_irqrestore(context) \</span>
<a name="l00826"></a>00826 <span class="preprocessor"> rthal_local_irq_restore(context)</span>
<a name="l00827"></a>00827 <span class="preprocessor"></span>
<a name="l00831"></a>00831 <span class="comment">/* --- Interrupt management services --- */</span>
<a name="l00837"></a>00837 <span class="keyword">typedef</span> xnintr_t rtdm_irq_t;
<a name="l00838"></a>00838
<a name="l00845"></a><a class="code" href="group__rtdmirq.html#gb26458b2383dd59b4977cd77c948cdfc">00845</a> <span class="preprocessor">#define RTDM_IRQTYPE_SHARED XN_ISR_SHARED</span>
<a name="l00846"></a>00846 <span class="preprocessor"></span>
<a name="l00848"></a><a class="code" href="group__rtdmirq.html#gf4e76db13d7f7aac4be2cae59e0097bc">00848</a> <span class="preprocessor">#define RTDM_IRQTYPE_EDGE XN_ISR_EDGE</span>
<a name="l00849"></a>00849 <span class="preprocessor"></span>
<a name="l00858"></a><a class="code" href="group__rtdmirq.html#gdabd8f3473098ae9128ef449a83fe3c2">00858</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__rtdmirq.html#gdabd8f3473098ae9128ef449a83fe3c2" title="Interrupt handler.">rtdm_irq_handler_t</a>)(rtdm_irq_t *irq_handle);
<a name="l00859"></a>00859
<a name="l00866"></a><a class="code" href="group__rtdmirq.html#gd7b7593bdac7e1595635f2b372110d22">00866</a> <span class="preprocessor">#define RTDM_IRQ_NONE XN_ISR_NONE</span>
<a name="l00867"></a>00867 <span class="preprocessor"></span>
<a name="l00868"></a><a class="code" href="group__rtdmirq.html#g56a2e243364bc9ff0e38c031c4c8ad57">00868</a> <span class="preprocessor">#define RTDM_IRQ_HANDLED XN_ISR_HANDLED</span>
<a name="l00869"></a>00869 <span class="preprocessor"></span>
<a name="l00888"></a><a class="code" href="group__rtdmirq.html#gc99789fe8b6b48e032ee6c22544968e4">00888</a> <span class="preprocessor">#define rtdm_irq_get_arg(irq_handle, type) ((type *)irq_handle->cookie)</span>
<a name="l00889"></a>00889 <span class="preprocessor"></span>
<a name="l00891"></a>00891 <span class="keywordtype">int</span> <a class="code" href="group__rtdmirq.html#g9bb3d95218ac5261e4033fb0bf695073" title="Register an interrupt handler.">rtdm_irq_request</a>(rtdm_irq_t *irq_handle, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> irq_no,
<a name="l00892"></a>00892 <a class="code" href="group__rtdmirq.html#gdabd8f3473098ae9128ef449a83fe3c2" title="Interrupt handler.">rtdm_irq_handler_t</a> handler, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> flags,
<a name="l00893"></a>00893 <span class="keyword">const</span> <span class="keywordtype">char</span> *device_name, <span class="keywordtype">void</span> *arg);
<a name="l00894"></a>00894
<a name="l00895"></a>00895 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l00896"></a>00896 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmirq.html#gf246c0d9fa42a18afbeabd3e3c087c8e" title="Release an interrupt handler.">rtdm_irq_free</a>(rtdm_irq_t *irq_handle)
<a name="l00897"></a>00897 {
<a name="l00898"></a>00898 <span class="keywordflow">return</span> <a class="code" href="group__intr.html#g83769b98f398774590e57ad8664925aa" title="Detach an interrupt object.">xnintr_detach</a>(irq_handle);
<a name="l00899"></a>00899 }
<a name="l00900"></a>00900
<a name="l00901"></a>00901 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmirq.html#g231362e861125cfdcbe5b4137fc70680" title="Enable interrupt line.">rtdm_irq_enable</a>(rtdm_irq_t *irq_handle)
<a name="l00902"></a>00902 {
<a name="l00903"></a>00903 <span class="keywordflow">return</span> <a class="code" href="group__intr.html#g083e000abd434e4d0fca8f6b6bbd49de" title="Enable an interrupt object.">xnintr_enable</a>(irq_handle);
<a name="l00904"></a>00904 }
<a name="l00905"></a>00905
<a name="l00906"></a>00906 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmirq.html#gb34c102e3e8af1f27786b2996247913d" title="Disable interrupt line.">rtdm_irq_disable</a>(rtdm_irq_t *irq_handle)
<a name="l00907"></a>00907 {
<a name="l00908"></a>00908 <span class="keywordflow">return</span> <a class="code" href="group__intr.html#g05570451a808b44216140e00b0eae713" title="Disable an interrupt object.">xnintr_disable</a>(irq_handle);
<a name="l00909"></a>00909 }
<a name="l00910"></a>00910 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l00911"></a>00911
<a name="l00912"></a>00912 <span class="comment">/* --- non-real-time signalling services --- */</span>
<a name="l00913"></a>00913
<a name="l00919"></a>00919 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> rtdm_nrtsig_t;
<a name="l00920"></a>00920
<a name="l00931"></a><a class="code" href="group__nrtsignal.html#g3c72df92865ad7decadab7c94fa75d0a">00931</a> <span class="keyword">typedef</span> void (*<a class="code" href="group__nrtsignal.html#g3c72df92865ad7decadab7c94fa75d0a" title="Non-real-time signal handler.">rtdm_nrtsig_handler_t</a>)(rtdm_nrtsig_t nrt_sig, <span class="keywordtype">void</span> *arg);
<a name="l00934"></a>00934 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l00935"></a>00935 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__nrtsignal.html#g38bd867e104f7e300a03200b1ccc1aae" title="Register a non-real-time signal handler.">rtdm_nrtsig_init</a>(rtdm_nrtsig_t *nrt_sig,
<a name="l00936"></a>00936 <a class="code" href="group__nrtsignal.html#g3c72df92865ad7decadab7c94fa75d0a" title="Non-real-time signal handler.">rtdm_nrtsig_handler_t</a> handler, <span class="keywordtype">void</span> *arg)
<a name="l00937"></a>00937 {
<a name="l00938"></a>00938 *nrt_sig = rthal_alloc_virq();
<a name="l00939"></a>00939
<a name="l00940"></a>00940 <span class="keywordflow">if</span> (*nrt_sig == 0)
<a name="l00941"></a>00941 <span class="keywordflow">return</span> -EAGAIN;
<a name="l00942"></a>00942
<a name="l00943"></a>00943 rthal_virtualize_irq(rthal_root_domain, *nrt_sig, handler, arg, NULL,
<a name="l00944"></a>00944 IPIPE_HANDLE_MASK);
<a name="l00945"></a>00945 <span class="keywordflow">return</span> 0;
<a name="l00946"></a>00946 }
<a name="l00947"></a>00947
<a name="l00948"></a>00948 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__nrtsignal.html#g4417c31c4990c3655f8ab4e7de6afa49" title="Release a non-realtime signal handler.">rtdm_nrtsig_destroy</a>(rtdm_nrtsig_t *nrt_sig)
<a name="l00949"></a>00949 {
<a name="l00950"></a>00950 rthal_free_virq(*nrt_sig);
<a name="l00951"></a>00951 }
<a name="l00952"></a>00952
<a name="l00953"></a>00953 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__nrtsignal.html#g80f0f176bdef54a4f3f3e202b156e450" title="Trigger non-real-time signal.">rtdm_nrtsig_pend</a>(rtdm_nrtsig_t *nrt_sig)
<a name="l00954"></a>00954 {
<a name="l00955"></a>00955 rthal_trigger_irq(*nrt_sig);
<a name="l00956"></a>00956 }
<a name="l00957"></a>00957 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l00958"></a>00958
<a name="l00959"></a>00959 <span class="comment">/* --- timer services --- */</span>
<a name="l00960"></a>00960
<a name="l00966"></a>00966 <span class="keyword">typedef</span> xntimer_t rtdm_timer_t;
<a name="l00967"></a>00967
<a name="l00973"></a><a class="code" href="group__rtdmtimer.html#g31b7b9a042260702a110bfe2c9bcac61">00973</a> <span class="keyword">typedef</span> void (*<a class="code" href="group__rtdmtimer.html#g31b7b9a042260702a110bfe2c9bcac61" title="Timer handler.">rtdm_timer_handler_t</a>)(rtdm_timer_t *timer);
<a name="l00974"></a>00974
<a name="l00980"></a><a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">00980</a> <span class="keyword">enum</span> <a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">rtdm_timer_mode</a> {
<a name="l00982"></a><a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd0ddd5d0b543bebdb1187330b7f52a94f8">00982</a> <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd0ddd5d0b543bebdb1187330b7f52a94f8" title="Monotonic timer with relative timeout.">RTDM_TIMERMODE_RELATIVE</a> = XN_RELATIVE,
<a name="l00983"></a>00983
<a name="l00985"></a><a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd077b27da267c09a5a586aab86c9cd22e2">00985</a> <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd077b27da267c09a5a586aab86c9cd22e2" title="Monotonic timer with absolute timeout.">RTDM_TIMERMODE_ABSOLUTE</a> = XN_ABSOLUTE,
<a name="l00986"></a>00986
<a name="l00988"></a><a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd08c206cf25cb340fd7ccee4489df6a220">00988</a> <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd08c206cf25cb340fd7ccee4489df6a220" title="Adjustable timer with absolute timeout.">RTDM_TIMERMODE_REALTIME</a> = XN_REALTIME
<a name="l00989"></a>00989 };
<a name="l00994"></a>00994 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid broken doxygen output */</span>
<a name="l00995"></a>00995 <span class="preprocessor">#define rtdm_timer_init(timer, handler, name) \</span>
<a name="l00996"></a>00996 <span class="preprocessor">({ \</span>
<a name="l00997"></a>00997 <span class="preprocessor"> xntimer_init((timer), rtdm_tbase, handler); \</span>
<a name="l00998"></a>00998 <span class="preprocessor"> xntimer_set_name((timer), (name)); \</span>
<a name="l00999"></a>00999 <span class="preprocessor"> 0; \</span>
<a name="l01000"></a>01000 <span class="preprocessor">})</span>
<a name="l01001"></a>01001 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01002"></a>01002
<a name="l01003"></a>01003 <span class="keywordtype">void</span> <a class="code" href="group__rtdmtimer.html#gc75c6e2f7c838b11d8e261be3a7a0326" title="Destroy a timer.">rtdm_timer_destroy</a>(rtdm_timer_t *timer);
<a name="l01004"></a>01004
<a name="l01005"></a>01005 <span class="keywordtype">int</span> <a class="code" href="group__rtdmtimer.html#g429ca4935762583edb6e1ebc955fe958" title="Start a timer.">rtdm_timer_start</a>(rtdm_timer_t *timer, <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> expiry,
<a name="l01006"></a>01006 <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> interval, <span class="keyword">enum</span> <a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">rtdm_timer_mode</a> mode);
<a name="l01007"></a>01007
<a name="l01008"></a>01008 <span class="keywordtype">void</span> <a class="code" href="group__rtdmtimer.html#g7f2accf693db9ed5a537b86a58bccd94" title="Stop a timer.">rtdm_timer_stop</a>(rtdm_timer_t *timer);
<a name="l01009"></a>01009
<a name="l01010"></a>01010 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01011"></a>01011 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtimer.html#gf585049063aa6ffb2f79511c0a091119" title="Start a timer from inside a timer handler.">rtdm_timer_start_in_handler</a>(rtdm_timer_t *timer,
<a name="l01012"></a>01012 <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> expiry,
<a name="l01013"></a>01013 <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> interval,
<a name="l01014"></a>01014 <span class="keyword">enum</span> <a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">rtdm_timer_mode</a> mode)
<a name="l01015"></a>01015 {
<a name="l01016"></a>01016 <span class="keywordflow">return</span> <a class="code" href="group__timer.html#g0ad3c70bed7fe1a45b45ee0875f031ab" title="Arm a timer.">xntimer_start</a>(timer, xntbase_ns2ticks_ceil(rtdm_tbase, expiry),
<a name="l01017"></a>01017 xntbase_ns2ticks_ceil(rtdm_tbase, interval),
<a name="l01018"></a>01018 (xntmode_t)mode);
<a name="l01019"></a>01019 }
<a name="l01020"></a>01020
<a name="l01021"></a>01021 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmtimer.html#gf76e21cc3429370612b76493fdb6d23e" title="Stop a timer from inside a timer handler.">rtdm_timer_stop_in_handler</a>(rtdm_timer_t *timer)
<a name="l01022"></a>01022 {
<a name="l01023"></a>01023 <a class="code" href="group__timer.html#g1244411df9784d63d3e2f99016d62643" title="Disarm a timer.">xntimer_stop</a>(timer);
<a name="l01024"></a>01024 }
<a name="l01025"></a>01025 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01026"></a>01026
<a name="l01027"></a>01027 <span class="comment">/* --- task services --- */</span>
<a name="l01033"></a>01033 <span class="keyword">typedef</span> xnthread_t rtdm_task_t;
<a name="l01034"></a>01034
<a name="l01040"></a><a class="code" href="group__rtdmtask.html#ga3cb481ab12462f5e54ff6fee12813e5">01040</a> <span class="keyword">typedef</span> void (*<a class="code" href="group__rtdmtask.html#ga3cb481ab12462f5e54ff6fee12813e5" title="Real-time task procedure.">rtdm_task_proc_t</a>)(<span class="keywordtype">void</span> *arg);
<a name="l01041"></a>01041
<a name="l01046"></a>01046 <span class="preprocessor">#define RTDM_TASK_LOWEST_PRIORITY XNSCHED_LOW_PRIO</span>
<a name="l01047"></a>01047 <span class="preprocessor"></span><span class="preprocessor">#define RTDM_TASK_HIGHEST_PRIORITY XNSCHED_HIGH_PRIO</span>
<a name="l01048"></a>01048 <span class="preprocessor"></span>
<a name="l01054"></a>01054 <span class="preprocessor">#define RTDM_TASK_RAISE_PRIORITY (+1)</span>
<a name="l01055"></a>01055 <span class="preprocessor"></span><span class="preprocessor">#define RTDM_TASK_LOWER_PRIORITY (-1)</span>
<a name="l01056"></a>01056 <span class="preprocessor"></span>
<a name="l01060"></a>01060 <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#g44b0701b6c28fa8035711f800fdcd371" title="Intialise and start a real-time task.">rtdm_task_init</a>(rtdm_task_t *task, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,
<a name="l01061"></a>01061 <a class="code" href="group__rtdmtask.html#ga3cb481ab12462f5e54ff6fee12813e5" title="Real-time task procedure.">rtdm_task_proc_t</a> task_proc, <span class="keywordtype">void</span> *arg,
<a name="l01062"></a>01062 <span class="keywordtype">int</span> priority, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> period);
<a name="l01063"></a>01063 <span class="keywordtype">int</span> __rtdm_task_sleep(xnticks_t timeout, xntmode_t mode);
<a name="l01064"></a>01064 <span class="keywordtype">void</span> <a class="code" href="group__rtdmtask.html#ga3940cfff7cc72d7bc064a3e279d74ac" title="Busy-wait a specified amount of time.">rtdm_task_busy_sleep</a>(<a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> delay);
<a name="l01065"></a>01065
<a name="l01066"></a>01066 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01067"></a>01067 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmtask.html#g7b5581febb2732127736817ca44e86e3" title="Destroy a real-time task.">rtdm_task_destroy</a>(rtdm_task_t *task)
<a name="l01068"></a>01068 {
<a name="l01069"></a>01069 <a class="code" href="group__pod.html#gd2b761fb70cad30339f092edb4a89587" title="Delete a thread.">xnpod_delete_thread</a>(task);
<a name="l01070"></a>01070 }
<a name="l01071"></a>01071
<a name="l01072"></a>01072 <span class="keywordtype">void</span> <a class="code" href="group__rtdmtask.html#g8a60a2a7ba5fec7dac5336b3e8f256cc" title="Wait on a real-time task to terminate.">rtdm_task_join_nrt</a>(rtdm_task_t *task, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> poll_delay);
<a name="l01073"></a>01073
<a name="l01074"></a>01074 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmtask.html#g286f2d3ff73b3e9c5f24d5a1122a57d2" title="Adjust real-time task priority.">rtdm_task_set_priority</a>(rtdm_task_t *task, <span class="keywordtype">int</span> priority)
<a name="l01075"></a>01075 {
<a name="l01076"></a>01076 <span class="keyword">union </span>xnsched_policy_param param = { .rt = { .prio = priority } };
<a name="l01077"></a>01077 <a class="code" href="group__pod.html#g6d535ef9821e98fd7f257b50a3c8d595" title="Change the base scheduling parameters of a thread.">xnpod_set_thread_schedparam</a>(task, &xnsched_class_rt, &param);
<a name="l01078"></a>01078 <a class="code" href="group__pod.html#gcf5b53f0405351327b89b0cc4976b962" title="Rescheduling procedure entry point.">xnpod_schedule</a>();
<a name="l01079"></a>01079 }
<a name="l01080"></a>01080
<a name="l01081"></a>01081 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#ga5b32e7ff35bda7c6d929f8a894149b3" title="Adjust real-time task period.">rtdm_task_set_period</a>(rtdm_task_t *task,
<a name="l01082"></a>01082 <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> period)
<a name="l01083"></a>01083 {
<a name="l01084"></a>01084 <span class="keywordflow">if</span> (period < 0)
<a name="l01085"></a>01085 period = 0;
<a name="l01086"></a>01086 <span class="keywordflow">return</span> <a class="code" href="group__pod.html#ged5776a428e7c59b52b1da76f0d765fa" title="Make a thread periodic.">xnpod_set_thread_periodic</a>(task, XN_INFINITE,
<a name="l01087"></a>01087 xntbase_ns2ticks_ceil
<a name="l01088"></a>01088 (xnthread_time_base(task), period));
<a name="l01089"></a>01089 }
<a name="l01090"></a>01090
<a name="l01091"></a>01091 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#ge52cca97ebaf78eec2e31553a4dacd5e" title="Activate a blocked real-time task.">rtdm_task_unblock</a>(rtdm_task_t *task)
<a name="l01092"></a>01092 {
<a name="l01093"></a>01093 <span class="keywordtype">int</span> res = <a class="code" href="group__pod.html#ge5f0d19e7a499b9b262f68a43ab545dd" title="Unblock a thread.">xnpod_unblock_thread</a>(task);
<a name="l01094"></a>01094
<a name="l01095"></a>01095 <a class="code" href="group__pod.html#gcf5b53f0405351327b89b0cc4976b962" title="Rescheduling procedure entry point.">xnpod_schedule</a>();
<a name="l01096"></a>01096 <span class="keywordflow">return</span> res;
<a name="l01097"></a>01097 }
<a name="l01098"></a>01098
<a name="l01099"></a>01099 <span class="keyword">static</span> <span class="keyword">inline</span> rtdm_task_t *<a class="code" href="group__rtdmtask.html#gfd58b762de7269549d1e54699ceebc0d" title="Get current real-time task.">rtdm_task_current</a>(<span class="keywordtype">void</span>)
<a name="l01100"></a>01100 {
<a name="l01101"></a>01101 <span class="keywordflow">return</span> xnpod_current_thread();
<a name="l01102"></a>01102 }
<a name="l01103"></a>01103
<a name="l01104"></a>01104 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#g577886a7588cdceac10f1b7b6ffcd1c7" title="Wait on next real-time task period.">rtdm_task_wait_period</a>(<span class="keywordtype">void</span>)
<a name="l01105"></a>01105 {
<a name="l01106"></a>01106 XENO_ASSERT(RTDM, !xnpod_unblockable_p(), <span class="keywordflow">return</span> -EPERM;);
<a name="l01107"></a>01107 <span class="keywordflow">return</span> <a class="code" href="group__pod.html#gf836996e4a3378928f2a9f93a4915cfa" title="Wait for the next periodic release point.">xnpod_wait_thread_period</a>(NULL);
<a name="l01108"></a>01108 }
<a name="l01109"></a>01109
<a name="l01110"></a>01110 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#gbfae53746165a83a75965b7b0f6710a0" title="Sleep a specified amount of time.">rtdm_task_sleep</a>(<a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> delay)
<a name="l01111"></a>01111 {
<a name="l01112"></a>01112 <span class="keywordflow">return</span> __rtdm_task_sleep(delay, XN_RELATIVE);
<a name="l01113"></a>01113 }
<a name="l01114"></a>01114
<a name="l01115"></a>01115 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span>
<a name="l01116"></a>01116 <a class="code" href="group__rtdmtask.html#g1763346568d041f9c66d68224816d15b" title="Sleep until a specified absolute time.">rtdm_task_sleep_abs</a>(<a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> wakeup_date, <span class="keyword">enum</span> <a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">rtdm_timer_mode</a> mode)
<a name="l01117"></a>01117 {
<a name="l01118"></a>01118 <span class="comment">/* For the sake of a consistent API usage... */</span>
<a name="l01119"></a>01119 <span class="keywordflow">if</span> (mode != <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd077b27da267c09a5a586aab86c9cd22e2" title="Monotonic timer with absolute timeout.">RTDM_TIMERMODE_ABSOLUTE</a> && mode != <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd08c206cf25cb340fd7ccee4489df6a220" title="Adjustable timer with absolute timeout.">RTDM_TIMERMODE_REALTIME</a>)
<a name="l01120"></a>01120 <span class="keywordflow">return</span> -EINVAL;
<a name="l01121"></a>01121 <span class="keywordflow">return</span> __rtdm_task_sleep(wakeup_date, (xntmode_t)mode);
<a name="l01122"></a>01122 }
<a name="l01123"></a>01123
<a name="l01124"></a>01124 <span class="comment">/* rtdm_task_sleep_abs shall be used instead */</span>
<a name="l01125"></a>01125 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> __deprecated <a class="code" href="group__rtdmtask.html#g741998821c05483db33f17d77c733d99" title="Sleep until a specified absolute time.">rtdm_task_sleep_until</a>(<a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> wakeup_time)
<a name="l01126"></a>01126 {
<a name="l01127"></a>01127 <span class="keywordflow">return</span> __rtdm_task_sleep(wakeup_time, XN_REALTIME);
<a name="l01128"></a>01128 }
<a name="l01129"></a>01129 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01130"></a>01130
<a name="l01131"></a>01131 <span class="comment">/* --- timeout sequences */</span>
<a name="l01132"></a>01132
<a name="l01133"></a>01133 <span class="keyword">typedef</span> <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> rtdm_toseq_t;
<a name="l01134"></a>01134
<a name="l01135"></a>01135 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g531ddf80690059302409f760bd7f14d4" title="Initialise a timeout sequence.">rtdm_toseq_init</a>(rtdm_toseq_t *timeout_seq, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> timeout);
<a name="l01136"></a>01136
<a name="l01137"></a>01137 <span class="comment">/* --- event services --- */</span>
<a name="l01138"></a>01138
<a name="l01139"></a>01139 <span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l01140"></a>01140 xnsynch_t synch_base;
<a name="l01141"></a>01141 DECLARE_XNSELECT(select_block);
<a name="l01142"></a>01142 } rtdm_event_t;
<a name="l01143"></a>01143
<a name="l01144"></a>01144 <span class="preprocessor">#define RTDM_EVENT_PENDING XNSYNCH_SPARE1</span>
<a name="l01145"></a>01145 <span class="preprocessor"></span>
<a name="l01146"></a>01146 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#gddf08d8ba5a44668bb360070a114fb19" title="Initialise an event.">rtdm_event_init</a>(rtdm_event_t *event, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> pending);
<a name="l01147"></a>01147 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_RTDM_SELECT</span>
<a name="l01148"></a>01148 <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g839656c781d87069dd1bf1c84c38e9d9" title="Bind a selector to an event.">rtdm_event_select_bind</a>(rtdm_event_t *event, rtdm_selector_t *selector,
<a name="l01149"></a>01149 <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> type, <span class="keywordtype">unsigned</span> fd_index);
<a name="l01150"></a>01150 <span class="preprocessor">#else </span><span class="comment">/* !CONFIG_XENO_OPT_RTDM_SELECT */</span>
<a name="l01151"></a>01151 <span class="preprocessor">#define rtdm_event_select_bind(e, s, t, i) ({ (void)(e); -EBADF; })</span>
<a name="l01152"></a>01152 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !CONFIG_XENO_OPT_RTDM_SELECT */</span>
<a name="l01153"></a>01153 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g1c433b50c53d49d164b084751861e855" title="Wait on event occurrence.">rtdm_event_wait</a>(rtdm_event_t *event);
<a name="l01154"></a>01154 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#gf76f858a3951ca2e20d3b1e00afa17e0" title="Wait on event occurrence with timeout.">rtdm_event_timedwait</a>(rtdm_event_t *event, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> timeout,
<a name="l01155"></a>01155 rtdm_toseq_t *timeout_seq);
<a name="l01156"></a>01156 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g1217402b82034b26fe25c26f1e5b32c9" title="Signal an event occurrence.">rtdm_event_signal</a>(rtdm_event_t *event);
<a name="l01157"></a>01157
<a name="l01158"></a>01158 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g732fe3cf3370df0f296f06fc4ac7f925" title="Clear event state.">rtdm_event_clear</a>(rtdm_event_t *event);
<a name="l01159"></a>01159
<a name="l01160"></a>01160 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01161"></a>01161 <span class="keywordtype">void</span> __rtdm_synch_flush(xnsynch_t *synch, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> reason);
<a name="l01162"></a>01162
<a name="l01163"></a>01163 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g7c9745d1db8e6de244a6c2690cbb8b22" title="Signal an event occurrence to currently listening waiters.">rtdm_event_pulse</a>(rtdm_event_t *event)
<a name="l01164"></a>01164 {
<a name="l01165"></a>01165 trace_mark(xn_rtdm, event_pulse, <span class="stringliteral">"event %p"</span>, event);
<a name="l01166"></a>01166 __rtdm_synch_flush(&event->synch_base, 0);
<a name="l01167"></a>01167 }
<a name="l01168"></a>01168
<a name="l01169"></a>01169 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g7b27d0206027a07958d4a09017e8a3fe" title="Destroy an event.">rtdm_event_destroy</a>(rtdm_event_t *event)
<a name="l01170"></a>01170 {
<a name="l01171"></a>01171 trace_mark(xn_rtdm, event_destroy, <span class="stringliteral">"event %p"</span>, event);
<a name="l01172"></a>01172 __rtdm_synch_flush(&event->synch_base, <a class="code" href="group__nucleus__info__flags.html#gb07d9dea73645dbba353dc2452c15b40" title="Pending on a removed resource.">XNRMID</a>);
<a name="l01173"></a>01173 <a class="code" href="group__select.html#g56e4b5bf3e35dd80c23e95cad8fa1614" title="Destroy the xnselect structure associated with a file descriptor.">xnselect_destroy</a>(&event->select_block);
<a name="l01174"></a>01174 }
<a name="l01175"></a>01175 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01176"></a>01176
<a name="l01177"></a>01177 <span class="comment">/* --- semaphore services --- */</span>
<a name="l01178"></a>01178
<a name="l01179"></a>01179 <span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l01180"></a>01180 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value;
<a name="l01181"></a>01181 xnsynch_t synch_base;
<a name="l01182"></a>01182 DECLARE_XNSELECT(select_block);
<a name="l01183"></a>01183 } rtdm_sem_t;
<a name="l01184"></a>01184
<a name="l01185"></a>01185 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#ge1172824e463d7705ed3033e8aea133d" title="Initialise a semaphore.">rtdm_sem_init</a>(rtdm_sem_t *sem, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value);
<a name="l01186"></a>01186 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_RTDM_SELECT</span>
<a name="l01187"></a>01187 <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#gf61f576b0ff06f99399b27725aef0ae1" title="Bind a selector to a semaphore.">rtdm_sem_select_bind</a>(rtdm_sem_t *sem, rtdm_selector_t *selector,
<a name="l01188"></a>01188 <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> type, <span class="keywordtype">unsigned</span> fd_index);
<a name="l01189"></a>01189 <span class="preprocessor">#else </span><span class="comment">/* !CONFIG_XENO_OPT_RTDM_SELECT */</span>
<a name="l01190"></a>01190 <span class="preprocessor">#define rtdm_sem_select_bind(s, se, t, i) ({ (void)(s); -EBADF; })</span>
<a name="l01191"></a>01191 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !CONFIG_XENO_OPT_RTDM_SELECT */</span>
<a name="l01192"></a>01192 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g59da1b60b7279c1fc4355e2e0b2cc77c" title="Decrement a semaphore.">rtdm_sem_down</a>(rtdm_sem_t *sem);
<a name="l01193"></a>01193 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g8aadb120a93df5dfd717c5bac6d4c1a9" title="Decrement a semaphore with timeout.">rtdm_sem_timeddown</a>(rtdm_sem_t *sem, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> timeout,
<a name="l01194"></a>01194 rtdm_toseq_t *timeout_seq);
<a name="l01195"></a>01195 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g829dbd8c5709d798ed06947b27001fed" title="Increment a semaphore.">rtdm_sem_up</a>(rtdm_sem_t *sem);
<a name="l01196"></a>01196
<a name="l01197"></a>01197 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01198"></a>01198 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#gf16f45217e54201ff3f24753982c41f8" title="Destroy a semaphore.">rtdm_sem_destroy</a>(rtdm_sem_t *sem)
<a name="l01199"></a>01199 {
<a name="l01200"></a>01200 trace_mark(xn_rtdm, <a class="code" href="group__posix__sem.html#g6dbe34606b393161567a658a32be87af" title="Destroy an unnamed semaphore.">sem_destroy</a>, <span class="stringliteral">"sem %p"</span>, sem);
<a name="l01201"></a>01201 __rtdm_synch_flush(&sem->synch_base, <a class="code" href="group__nucleus__info__flags.html#gb07d9dea73645dbba353dc2452c15b40" title="Pending on a removed resource.">XNRMID</a>);
<a name="l01202"></a>01202 <a class="code" href="group__select.html#g56e4b5bf3e35dd80c23e95cad8fa1614" title="Destroy the xnselect structure associated with a file descriptor.">xnselect_destroy</a>(&sem->select_block);
<a name="l01203"></a>01203 }
<a name="l01204"></a>01204 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01205"></a>01205
<a name="l01206"></a>01206 <span class="comment">/* --- mutex services --- */</span>
<a name="l01207"></a>01207
<a name="l01208"></a>01208 <span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l01209"></a>01209 xnsynch_t synch_base;
<a name="l01210"></a>01210 } rtdm_mutex_t;
<a name="l01211"></a>01211
<a name="l01212"></a>01212 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g8d58a144bf71df7b38bb887d036cbbb5" title="Initialise a mutex.">rtdm_mutex_init</a>(rtdm_mutex_t *mutex);
<a name="l01213"></a>01213 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g67c8f85c844df1aeed806e343a1b6437" title="Request a mutex.">rtdm_mutex_lock</a>(rtdm_mutex_t *mutex);
<a name="l01214"></a>01214 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g0789968300701ba2a940f5fe8b1fd4d8" title="Request a mutex with timeout.">rtdm_mutex_timedlock</a>(rtdm_mutex_t *mutex, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> timeout,
<a name="l01215"></a>01215 rtdm_toseq_t *timeout_seq);
<a name="l01216"></a>01216
<a name="l01217"></a>01217 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01218"></a>01218 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#gb40ed579324d8cc76387a0e06dd0f82a" title="Release a mutex.">rtdm_mutex_unlock</a>(rtdm_mutex_t *mutex)
<a name="l01219"></a>01219 {
<a name="l01220"></a>01220 XENO_ASSERT(RTDM, !xnpod_asynch_p(), <span class="keywordflow">return</span>;);
<a name="l01221"></a>01221
<a name="l01222"></a>01222 trace_mark(xn_rtdm, mutex_unlock, <span class="stringliteral">"mutex %p"</span>, mutex);
<a name="l01223"></a>01223
<a name="l01224"></a>01224 <span class="keywordflow">if</span> (unlikely(<a class="code" href="group__synch.html#g1208abb6b3d0017a4e0c43b9baff8cfb" title="Give the resource ownership to the next waiting thread.">xnsynch_release</a>(&mutex->synch_base) != NULL))
<a name="l01225"></a>01225 <a class="code" href="group__pod.html#gcf5b53f0405351327b89b0cc4976b962" title="Rescheduling procedure entry point.">xnpod_schedule</a>();
<a name="l01226"></a>01226 }
<a name="l01227"></a>01227
<a name="l01228"></a>01228 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#gd13170b569d0a4cdb46072e1e3a45527" title="Destroy a mutex.">rtdm_mutex_destroy</a>(rtdm_mutex_t *mutex)
<a name="l01229"></a>01229 {
<a name="l01230"></a>01230 trace_mark(xn_rtdm, mutex_destroy, <span class="stringliteral">"mutex %p"</span>, mutex);
<a name="l01231"></a>01231
<a name="l01232"></a>01232 __rtdm_synch_flush(&mutex->synch_base, <a class="code" href="group__nucleus__info__flags.html#gb07d9dea73645dbba353dc2452c15b40" title="Pending on a removed resource.">XNRMID</a>);
<a name="l01233"></a>01233 }
<a name="l01234"></a>01234 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01235"></a>01235
<a name="l01236"></a>01236 <span class="comment">/* --- utility functions --- */</span>
<a name="l01237"></a>01237
<a name="l01238"></a>01238 <span class="preprocessor">#define rtdm_printk(format, ...) printk(format, ##__VA_ARGS__)</span>
<a name="l01239"></a>01239 <span class="preprocessor"></span>
<a name="l01240"></a>01240 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01241"></a>01241 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> *<a class="code" href="group__util.html#g34dfd5c060c67acc684eb4b4256cd4ba" title="Allocate memory block in real-time context.">rtdm_malloc</a>(<span class="keywordtype">size_t</span> size)
<a name="l01242"></a>01242 {
<a name="l01243"></a>01243 <span class="keywordflow">return</span> xnmalloc(size);
<a name="l01244"></a>01244 }
<a name="l01245"></a>01245
<a name="l01246"></a>01246 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__util.html#g8d15b2cbb2fbf35b88362491af4e6a36" title="Release real-time memory block.">rtdm_free</a>(<span class="keywordtype">void</span> *ptr)
<a name="l01247"></a>01247 {
<a name="l01248"></a>01248 xnfree(ptr);
<a name="l01249"></a>01249 }
<a name="l01250"></a>01250
<a name="l01251"></a>01251 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_PERVASIVE</span>
<a name="l01252"></a>01252 <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__util.html#gdf5ddcdee106f1eaf4b93b2d633da441" title="Map a kernel memory range into the address space of the user.">rtdm_mmap_to_user</a>(rtdm_user_info_t *user_info,
<a name="l01253"></a>01253 <span class="keywordtype">void</span> *src_addr, <span class="keywordtype">size_t</span> len,
<a name="l01254"></a>01254 <span class="keywordtype">int</span> prot, <span class="keywordtype">void</span> **pptr,
<a name="l01255"></a>01255 <span class="keyword">struct</span> vm_operations_struct *vm_ops,
<a name="l01256"></a>01256 <span class="keywordtype">void</span> *vm_private_data);
<a name="l01257"></a>01257 <span class="keywordtype">int</span> <a class="code" href="group__util.html#ga49b4fbd57a98a9ccda1f243b40bc519" title="Map an I/O memory range into the address space of the user.">rtdm_iomap_to_user</a>(rtdm_user_info_t *user_info,
<a name="l01258"></a>01258 phys_addr_t src_addr, <span class="keywordtype">size_t</span> len,
<a name="l01259"></a>01259 <span class="keywordtype">int</span> prot, <span class="keywordtype">void</span> **pptr,
<a name="l01260"></a>01260 <span class="keyword">struct</span> vm_operations_struct *vm_ops,
<a name="l01261"></a>01261 <span class="keywordtype">void</span> *vm_private_data);
<a name="l01262"></a>01262 <span class="keywordtype">int</span> <a class="code" href="group__util.html#ga6a363aa6e2e017d3493a9c175755fa5" title="Unmap a user memory range.">rtdm_munmap</a>(rtdm_user_info_t *user_info, <span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> len);
<a name="l01263"></a>01263
<a name="l01264"></a>01264 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g341dedfbeeb511848ba5f5a9535cc0a7" title="Check if read access to user-space memory block is safe.">rtdm_read_user_ok</a>(rtdm_user_info_t *user_info,
<a name="l01265"></a>01265 <span class="keyword">const</span> <span class="keywordtype">void</span> __user *ptr, <span class="keywordtype">size_t</span> size)
<a name="l01266"></a>01266 {
<a name="l01267"></a>01267 <span class="keywordflow">return</span> access_rok(ptr, size);
<a name="l01268"></a>01268 }
<a name="l01269"></a>01269
<a name="l01270"></a>01270 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g6cecee5411773e81c83d04824864a62d" title="Check if read/write access to user-space memory block is safe.">rtdm_rw_user_ok</a>(rtdm_user_info_t *user_info,
<a name="l01271"></a>01271 <span class="keyword">const</span> <span class="keywordtype">void</span> __user *ptr, <span class="keywordtype">size_t</span> size)
<a name="l01272"></a>01272 {
<a name="l01273"></a>01273 <span class="keywordflow">return</span> access_wok(ptr, size);
<a name="l01274"></a>01274 }
<a name="l01275"></a>01275
<a name="l01276"></a>01276 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g99abc944640745604b4a77204d2d0777" title="Copy user-space memory block to specified buffer.">rtdm_copy_from_user</a>(rtdm_user_info_t *user_info,
<a name="l01277"></a>01277 <span class="keywordtype">void</span> *dst, <span class="keyword">const</span> <span class="keywordtype">void</span> __user *src,
<a name="l01278"></a>01278 <span class="keywordtype">size_t</span> size)
<a name="l01279"></a>01279 {
<a name="l01280"></a>01280 <span class="keywordflow">return</span> __xn_copy_from_user(dst, src, size) ? -EFAULT : 0;
<a name="l01281"></a>01281 }
<a name="l01282"></a>01282
<a name="l01283"></a>01283 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g8e2ada3a5665c1366cd2c91f304bfa34" title="Check if read access to user-space memory block and copy it to specified buffer.">rtdm_safe_copy_from_user</a>(rtdm_user_info_t *user_info,
<a name="l01284"></a>01284 <span class="keywordtype">void</span> *dst, <span class="keyword">const</span> <span class="keywordtype">void</span> __user *src,
<a name="l01285"></a>01285 <span class="keywordtype">size_t</span> size)
<a name="l01286"></a>01286 {
<a name="l01287"></a>01287 <span class="keywordflow">return</span> (!access_rok(src, size) ||
<a name="l01288"></a>01288 __xn_copy_from_user(dst, src, size)) ? -EFAULT : 0;
<a name="l01289"></a>01289 }
<a name="l01290"></a>01290
<a name="l01291"></a>01291 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#gb19ad9751ca1c56a53aafeb7ce8a6faf" title="Copy specified buffer to user-space memory block.">rtdm_copy_to_user</a>(rtdm_user_info_t *user_info,
<a name="l01292"></a>01292 <span class="keywordtype">void</span> __user *dst, <span class="keyword">const</span> <span class="keywordtype">void</span> *src,
<a name="l01293"></a>01293 <span class="keywordtype">size_t</span> size)
<a name="l01294"></a>01294 {
<a name="l01295"></a>01295 <span class="keywordflow">return</span> __xn_copy_to_user(dst, src, size) ? -EFAULT : 0;
<a name="l01296"></a>01296 }
<a name="l01297"></a>01297
<a name="l01298"></a>01298 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g53f7bacd08774bfd26e13798cbfb21b8" title="Check if read/write access to user-space memory block is safe and copy specified...">rtdm_safe_copy_to_user</a>(rtdm_user_info_t *user_info,
<a name="l01299"></a>01299 <span class="keywordtype">void</span> __user *dst, <span class="keyword">const</span> <span class="keywordtype">void</span> *src,
<a name="l01300"></a>01300 <span class="keywordtype">size_t</span> size)
<a name="l01301"></a>01301 {
<a name="l01302"></a>01302 <span class="keywordflow">return</span> (!access_wok(dst, size) ||
<a name="l01303"></a>01303 __xn_copy_to_user(dst, src, size)) ? -EFAULT : 0;
<a name="l01304"></a>01304 }
<a name="l01305"></a>01305
<a name="l01306"></a>01306 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g9512ab3a85bea45a47bd033bad8b4828" title="Copy user-space string to specified buffer.">rtdm_strncpy_from_user</a>(rtdm_user_info_t *user_info,
<a name="l01307"></a>01307 <span class="keywordtype">char</span> *dst,
<a name="l01308"></a>01308 <span class="keyword">const</span> <span class="keywordtype">char</span> __user *src, <span class="keywordtype">size_t</span> count)
<a name="l01309"></a>01309 {
<a name="l01310"></a>01310 <span class="keywordflow">if</span> (unlikely(!access_rok(src, 1)))
<a name="l01311"></a>01311 <span class="keywordflow">return</span> -EFAULT;
<a name="l01312"></a>01312 <span class="keywordflow">return</span> __xn_strncpy_from_user(dst, src, count);
<a name="l01313"></a>01313 }
<a name="l01314"></a>01314 <span class="preprocessor">#else </span><span class="comment">/* !CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l01315"></a>01315 <span class="comment">/* Define void user<->kernel services that simply fail */</span>
<a name="l01316"></a>01316 <span class="preprocessor">#define rtdm_mmap_to_user(...) ({ -ENOSYS; })</span>
<a name="l01317"></a>01317 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_munmap(...) ({ -ENOSYS; })</span>
<a name="l01318"></a>01318 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_read_user_ok(...) ({ 0; })</span>
<a name="l01319"></a>01319 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_rw_user_ok(...) ({ 0; })</span>
<a name="l01320"></a>01320 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_copy_from_user(...) ({ -ENOSYS; })</span>
<a name="l01321"></a>01321 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_safe_copy_from_user(...) ({ -ENOSYS; })</span>
<a name="l01322"></a>01322 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_copy_to_user(...) ({ -ENOSYS; })</span>
<a name="l01323"></a>01323 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_safe_copy_to_user(...) ({ -ENOSYS; })</span>
<a name="l01324"></a>01324 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_strncpy_from_user(...) ({ -ENOSYS; })</span>
<a name="l01325"></a>01325 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l01326"></a>01326
<a name="l01327"></a>01327 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g8f9fcd0e274324096628dfede6fb10f2" title="Test if running in a real-time task.">rtdm_in_rt_context</a>(<span class="keywordtype">void</span>)
<a name="l01328"></a>01328 {
<a name="l01329"></a>01329 <span class="keywordflow">return</span> (rthal_current_domain != rthal_root_domain);
<a name="l01330"></a>01330 }
<a name="l01331"></a>01331
<a name="l01332"></a>01332 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g321a8c48467a6268fa201c16833524db" title="Test if the caller is capable of running in real-time context.">rtdm_rt_capable</a>(rtdm_user_info_t *user_info)
<a name="l01333"></a>01333 {
<a name="l01334"></a>01334 XENO_ASSERT(RTDM, !xnpod_asynch_p(), <span class="keywordflow">return</span> 0;);
<a name="l01335"></a>01335
<a name="l01336"></a>01336 <span class="keywordflow">return</span> (user_info ? xnshadow_thread(user_info) != NULL
<a name="l01337"></a>01337 : !xnpod_root_p());
<a name="l01338"></a>01338 }
<a name="l01339"></a>01339
<a name="l01340"></a>01340 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01341"></a>01341
<a name="l01342"></a>01342 <span class="keywordtype">int</span> rtdm_exec_in_rt(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l01343"></a>01343 rtdm_user_info_t *user_info, <span class="keywordtype">void</span> *arg,
<a name="l01344"></a>01344 rtdm_rt_handler_t handler);
<a name="l01345"></a>01345
<a name="l01346"></a>01346 <span class="preprocessor">#endif </span><span class="comment">/* _RTDM_DRIVER_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
<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>
|