base/include/rtai_fifos.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#ifndef _RTAI_FIFOS_H
00027
#define _RTAI_FIFOS_H
00028
00029
#include <rtai_types.h>
00030
00031 #define MAX_FIFOS 64
00032
00033 #define RTAI_FIFOS_MAJOR 150
00034
00035 #define RESET 1
00036 #define RESIZE 2
00037 #define RTF_SUSPEND_TIMED 3
00038 #define OPEN_SIZED 4
00039 #define READ_ALL_AT_ONCE 5
00040 #define READ_TIMED 6
00041 #define WRITE_TIMED 7
00042 #define RTF_SEM_INIT 8
00043 #define RTF_SEM_WAIT 9
00044 #define RTF_SEM_TRYWAIT 10
00045 #define RTF_SEM_TIMED_WAIT 11
00046 #define RTF_SEM_POST 12
00047 #define RTF_SEM_DESTROY 13
00048 #define SET_ASYNC_SIG 14
00049 #define EAVESDROP 19
00050 #define OVRWRITE 20
00051 #define READ_IF 21
00052 #define WRITE_IF 22
00053 #define RTF_NAMED_CREATE 23
00054
00055 #define RTF_GET_N_FIFOS 15
00056 #define RTF_GET_FIFO_INFO 16
00057 #define RTF_CREATE_NAMED 17
00058 #define RTF_NAME_LOOKUP 18
00059
00060 #define RTF_NAMELEN 15
00061
00062 struct rt_fifo_info_struct{
00063 unsigned int fifo_number;
00064 unsigned int size;
00065 unsigned int opncnt;
00066 char name[
RTF_NAMELEN+1];
00067 };
00068
00069 struct rt_fifo_get_info_struct{
00070 unsigned int fifo;
00071 unsigned int n;
00072 struct rt_fifo_info_struct *
ptr;
00073 };
00074
00075 #define FUN_FIFOS_LXRT_INDX 10
00076
00077 #define _CREATE 0
00078 #define _DESTROY 1
00079 #define _PUT 2
00080 #define _GET 3
00081 #define _RESET 4
00082 #define _RESIZE 5
00083 #define _SEM_INIT 6
00084 #define _SEM_DESTRY 7
00085 #define _SEM_POST 8
00086 #define _SEM_TRY 9
00087 #define _CREATE_NAMED 10
00088 #define _GETBY_NAME 11
00089 #define _OVERWRITE 12
00090 #define _PUT_IF 13
00091 #define _GET_IF 14
00092 #define _NAMED_CREATE 15
00093
00094
#ifdef __KERNEL__
00095
00096
#ifdef __cplusplus
00097
extern "C" {
00098
#endif
00099
00100
int __rtai_fifos_init(
void);
00101
00102
void __rtai_fifos_exit(
void);
00103
00104
int rtf_init(
void);
00105
00106
00107
00108
00109
00110
00111
00112
00113
int rtf_create_handler(
unsigned int fifo,
00114
int (*
handler)(
unsigned int fifo) );
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
#define X_FIFO_HANDLER(handler) ((int (*)(unsigned int))(handler))
00130
00131
00132
00133
00134
00135
00136
#undef rtf_create
00137
int rtf_create(
unsigned int fifo,
int size);
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
int rtf_named_create(
const char *name,
int size);
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
int rtf_create_named(
const char *name);
00158
00159
00160
00161
00162
00163
00164
00165
00166
int rtf_getfifobyname(
const char *name);
00167
00168
00169
00170
00171
00172
00173
00174
00175
int rtf_reset(
unsigned int fifo);
00176
00177
00178
00179
00180
00181
00182
int rtf_destroy(
unsigned int fifo);
00183
00184
00185
00186
00187
00188
00189
00190
00191
int rtf_resize(
unsigned int minor,
int size);
00192
00193
00194
00195
00196
00197
00198
00199
int rtf_put(
unsigned int fifo,
00200
void * buf,
00201
int count );
00202
00203
00204
00205
00206
00207
00208
00209
00210
int rtf_ovrwr_put(
unsigned int fifo,
00211
void * buf,
00212
int count );
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
extern int rtf_put_if (
unsigned int fifo,
00223
void * buf,
00224
int count );
00225
00226
00227
00228
00229
00230
00231
int rtf_get(
unsigned int fifo,
00232
void * buf,
00233
int count );
00234
00235
00236
00237
00238
00239
00240
00241
int rtf_get_if(
unsigned int fifo,
00242
void * buf,
00243
int count );
00244
00245
00246
00247
00248
00249
00250
int rtf_evdrp(
unsigned int fifo,
00251
void * buf,
00252
int count );
00253
00254
00255
00256
00257
00258
int rtf_sem_init(
unsigned int fifo,
00259
int value );
00260
00261
00262
00263
00264
00265
00266
int rtf_sem_post(
unsigned int fifo );
00267
00268
00269
00270
00271
00272
00273
int rtf_sem_trywait(
unsigned int fifo );
00274
00275
00276
00277
00278
00279
00280
int rtf_sem_destroy(
unsigned int fifo );
00281
00282
#define rtf_sem_delete rtf_sem_destroy
00283
00284
00285
00286
00287
#define rtf_create_using_bh(fifo, size, bh_list) rtf_create(fifo, size)
00288
#define rtf_create_using_bh_and_usr_buf(fifo, buf, size, bh_list) rtf_create(fifo, size)
00289
#define rtf_destroy_using_usr_buf(fifo) rtf_destroy(fifo)
00290
00291
#ifdef __cplusplus
00292
}
00293
#endif
00294
00295
#else
00296
00297
#include <sys/types.h>
00298
#include <sys/stat.h>
00299
#include <sys/ioctl.h>
00300
#include <fcntl.h>
00301
#include <unistd.h>
00302
#include <stdio.h>
00303
#include <string.h>
00304
#include <rtai_lxrt.h>
00305
00306
#ifdef __cplusplus
00307
extern "C" {
00308
#endif
00309
00310 RTAI_PROTO(
int, rtf_create,(
unsigned int fifo,
int size))
00311 {
00312
struct {
unsigned long fifo, size; } arg = { fifo, size };
00313
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_CREATE, &arg).
i[
LOW];
00314 }
00315
00316 RTAI_PROTO(
int, rtf_destroy,(
unsigned int fifo))
00317 {
00318
struct {
unsigned long fifo; } arg = { fifo };
00319
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_DESTROY, &arg).
i[
LOW];
00320 }
00321
00322 RTAI_PROTO(
int, rtf_put,(
unsigned int fifo,
const void *buf,
int count))
00323 {
00324
char lbuf[
count];
00325
struct {
unsigned long fifo;
void *buf;
long count; } arg = { fifo, lbuf,
count };
00326 memcpy(lbuf, buf,
count);
00327
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_PUT, &arg).
i[
LOW];
00328 }
00329
00330 RTAI_PROTO(
int, rtf_put_if,(
unsigned int fifo,
const void *buf,
int count))
00331 {
00332
char lbuf[
count];
00333
struct {
unsigned long fifo;
void *buf;
long count; } arg = { fifo, lbuf,
count };
00334 memcpy(lbuf, buf,
count);
00335
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_PUT_IF, &arg).
i[
LOW];
00336 }
00337
00338 RTAI_PROTO(
int, rtf_get,(
unsigned int fifo,
void *buf,
int count))
00339 {
00340
int retval;
00341
char lbuf[
count];
00342
struct {
unsigned long fifo;
void *buf;
long count; } arg = { fifo, lbuf,
count };
00343 retval =
rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_GET, &arg).
i[
LOW];
00344
if (retval > 0) {
00345 memcpy(buf, lbuf, retval);
00346 }
00347
return retval;
00348 }
00349
00350 RTAI_PROTO(
int, rtf_get_if,(
unsigned int fifo,
void *buf,
int count))
00351 {
00352
int retval;
00353
char lbuf[
count];
00354
struct {
unsigned long fifo;
void *buf;
long count; } arg = { fifo, lbuf,
count };
00355 retval =
rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_GET_IF, &arg).
i[
LOW];
00356
if (retval > 0) {
00357 memcpy(buf, lbuf, retval);
00358 }
00359
return retval;
00360 }
00361
00362 RTAI_PROTO(
int, rtf_reset_lxrt,(
unsigned int fifo))
00363 {
00364
struct {
unsigned long fifo; } arg = { fifo };
00365
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_RESET, &arg).
i[
LOW];
00366 }
00367
00368 RTAI_PROTO(
int, rtf_resize_lxrt,(
unsigned int fifo,
int size))
00369 {
00370
struct {
unsigned long fifo, size; } arg = { fifo, size };
00371
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_RESIZE, &arg).
i[
LOW];
00372 }
00373
00374 RTAI_PROTO(
int, rtf_sem_init_lxrt,(
unsigned int fifo,
int value))
00375 {
00376
struct {
unsigned long fifo, value; } arg = { fifo, value };
00377
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_SEM_INIT, &arg).
i[
LOW];
00378 }
00379
00380 RTAI_PROTO(
int, rtf_sem_post_lxrt,(
unsigned int fifo))
00381 {
00382
struct {
unsigned long fifo; } arg = { fifo };
00383
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_SEM_POST, &arg).
i[
LOW];
00384 }
00385
00386 RTAI_PROTO(
int, rtf_sem_trywait_lxrt,(
unsigned int fifo))
00387 {
00388
struct {
unsigned long fifo; } arg = { fifo };
00389
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_SEM_TRY, &arg).
i[
LOW];
00390 }
00391
00392 RTAI_PROTO(
int, rtf_sem_destroy_lxrt,(
unsigned int fifo))
00393 {
00394
struct {
unsigned long fifo; } arg = { fifo };
00395
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_SEM_DESTRY, &arg).
i[
LOW];
00396 }
00397
00398 RTAI_PROTO(
int, rtf_named_create_lxrt,(
const char *name,
int size))
00399 {
00400
int len;
00401
char lname[len = strlen(name)];
00402
struct {
char * name;
long size; } arg = { lname, size };
00403 strncpy(lname, name, len);
00404
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_NAMED_CREATE, &arg).
i[
LOW];
00405 }
00406
00407 RTAI_PROTO(
int, rtf_create_named_lxrt,(
const char *name))
00408 {
00409
int len;
00410
char lname[len = strlen(name)];
00411
struct {
char * name; } arg = { lname };
00412 strncpy(lname, name, len);
00413
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_CREATE_NAMED, &arg).
i[
LOW];
00414 }
00415
00416 RTAI_PROTO(
int, rtf_getfifobyname_lxrt,(
const char *name))
00417 {
00418
int len;
00419
char lname[len = strlen(name)];
00420
struct {
char * name; } arg = { lname };
00421 strncpy(lname, name, len);
00422
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_GETBY_NAME, &arg).
i[
LOW];
00423 }
00424
00425 RTAI_PROTO(
int, rtf_ovrwr_put,(
unsigned int fifo,
const void *buf,
int count))
00426 {
00427
char lbuf[
count];
00428
struct {
unsigned long fifo;
void *buf;
long count; } arg = { fifo, lbuf,
count };
00429 memcpy(lbuf, buf,
count);
00430
return rtai_lxrt(
FUN_FIFOS_LXRT_INDX,
SIZARG,
_OVERWRITE, &arg).
i[
LOW];
00431 }
00432
00433 RTAI_PROTO(
int, rtf_reset,(
int fd))
00434 {
00435
int ret = ioctl(fd,
RESET);
00436
return ret < 0 ? -
errno : ret;
00437 }
00438
00439 RTAI_PROTO(
int, rtf_resize,(
int fd,
int size))
00440 {
00441
int ret = ioctl(fd,
RESIZE, size);
00442
return ret < 0 ? -
errno : ret;
00443 }
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459 RTAI_PROTO(
int, rtf_suspend_timed,(
int fd,
int ms_delay))
00460 {
00461
int ret = ioctl(fd,
RTF_SUSPEND_TIMED, ms_delay);
00462
return ret < 0 ? -
errno : ret;
00463 }
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499 RTAI_PROTO(
int, rtf_open_sized,(
const char *dev,
int perm,
int size))
00500 {
00501
int fd;
00502
00503
if ((fd = open(dev, perm)) < 0) {
00504
return -
errno;
00505 }
00506
if (ioctl(fd,
RESIZE, size) < 0) {
00507 close(fd);
00508
return -
errno;
00509 }
00510
return fd;
00511 }
00512
00513 RTAI_PROTO(
int, rtf_evdrp,(
int fd,
void *buf,
int count))
00514 {
00515
struct {
void *buf;
long count; } args = { buf,
count };
00516
int ret = ioctl(fd,
EAVESDROP, &args);
00517
return ret < 0 ? -
errno : ret;
00518 }
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536 RTAI_PROTO(
int, rtf_read_all_at_once,(
int fd,
void *buf,
int count))
00537 {
00538
struct {
void *buf;
long count; } args = { buf,
count };
00539
int ret = ioctl(fd,
READ_ALL_AT_ONCE, &args);
00540
return ret < 0 ? -
errno : ret;
00541 }
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564 RTAI_PROTO(
int, rtf_read_timed,(
int fd,
void *buf,
int count,
int ms_delay))
00565 {
00566
struct {
void *buf;
long count, delay; } args = { buf,
count, ms_delay };
00567
int ret = ioctl(fd,
READ_TIMED, &args);
00568
return ret < 0 ? -
errno : ret;
00569 }
00570
00571 RTAI_PROTO(
int, rtf_read_if,(
int fd,
void *buf,
int count))
00572 {
00573
struct {
void *buf;
long count; } args = { buf,
count };
00574
int ret = ioctl(fd,
READ_IF, &args);
00575
return ret < 0 ? -
errno : ret;
00576 }
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599 RTAI_PROTO(
int, rtf_write_timed,(
int fd,
void *buf,
int count,
int ms_delay))
00600 {
00601
struct {
void *buf;
long count, delay; } args = { buf,
count, ms_delay };
00602
int ret = ioctl(fd,
WRITE_TIMED, &args);
00603
return ret < 0 ? -
errno : ret;
00604 }
00605
00606 RTAI_PROTO(
int, rtf_overwrite,(
int fd,
void *buf,
int count))
00607 {
00608
struct {
void *buf;
long count; } args = { buf,
count };
00609
int ret = ioctl(fd,
OVRWRITE, &args);
00610
return ret < 0 ? -
errno : ret;
00611 }
00612
00613 RTAI_PROTO(
int, rtf_write_if,(
int fd,
void *buf,
int count))
00614 {
00615
struct {
void *buf;
long count; } args = { buf,
count };
00616
int ret = ioctl(fd,
WRITE_IF, &args);
00617
return ret < 0 ? -
errno : ret;
00618 }
00619
00620 RTAI_PROTO(
int, rtf_sem_init,(
int fd,
int value))
00621 {
00622
int ret = ioctl(fd,
RTF_SEM_INIT, value);
00623
return ret < 0 ? -
errno : ret;
00624 }
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648 RTAI_PROTO(
int, rtf_sem_wait,(
int fd))
00649 {
00650
int ret = ioctl(fd,
RTF_SEM_WAIT);
00651
return ret < 0 ? -
errno : ret;
00652 }
00653
00654 RTAI_PROTO(
int, rtf_sem_trywait,(
int fd))
00655 {
00656
int ret = ioctl(fd,
RTF_SEM_TRYWAIT);
00657
return ret < 0 ? -
errno : ret;
00658 }
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686 RTAI_PROTO(
int, rtf_sem_timed_wait,(
int fd,
int ms_delay))
00687 {
00688
int ret = ioctl(fd,
RTF_SEM_TIMED_WAIT, ms_delay);
00689
return ret < 0 ? -
errno : ret;
00690 }
00691
00692 RTAI_PROTO(
int, rtf_sem_post,(
int fd))
00693 {
00694
int ret = ioctl(fd,
RTF_SEM_POST);
00695
return ret < 0 ? -
errno : ret;
00696 }
00697
00698 RTAI_PROTO(
int, rtf_sem_destroy,(
int fd))
00699 {
00700
int ret = ioctl(fd,
RTF_SEM_DESTROY);
00701
return ret < 0 ? -
errno : ret;
00702 }
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715 RTAI_PROTO(
int, rtf_set_async_sig,(
int fd,
int signum))
00716 {
00717
int ret = ioctl(fd,
SET_ASYNC_SIG, signum);
00718
return ret < 0 ? -
errno : ret;
00719 }
00720
00721
00722
00723
00724
00725
00726 RTAI_PROTO_ALWAYS_INLINE(
char *, rtf_getfifobyminor,(
int minor,
char *buf,
int len))
00727 {
00728 snprintf(buf,len,
CONFIG_RTAI_FIFOS_TEMPLATE,minor);
00729
return buf;
00730 }
00731
00732 RTAI_PROTO(
int, rtf_getfifobyname,(
const char *name))
00733 {
00734
int fd, minor;
00735
char nm[
RTF_NAMELEN+1];
00736
00737
if (strlen(name) >
RTF_NAMELEN) {
00738
return -1;
00739 }
00740
if ((fd = open(rtf_getfifobyminor(0,nm,
sizeof(nm)), O_RDONLY)) < 0) {
00741
return -
errno;
00742 }
00743 strncpy(nm, name,
RTF_NAMELEN+1);
00744 minor = ioctl(fd,
RTF_NAME_LOOKUP, nm);
00745 close(fd);
00746
return minor < 0 ? -
errno : minor;
00747 }
00748
00749 RTAI_PROTO(
int, rtf_named_create,(
const char *name,
int size))
00750 {
00751
int fd, minor;
00752
char nm[
RTF_NAMELEN+1];
00753
00754
if (strlen(name) >
RTF_NAMELEN) {
00755
return -1;
00756 }
00757
if ((fd = open(rtf_getfifobyminor(0,nm,
sizeof(nm)), O_RDONLY)) < 0) {
00758
return -
errno;
00759 }
00760 strncpy(nm, name,
RTF_NAMELEN+1);
00761 minor = ioctl(fd,
RTF_NAMED_CREATE, nm, size);
00762 close(fd);
00763
return minor < 0 ? -
errno : minor;
00764 }
00765
00766 RTAI_PROTO(
int, rtf_create_named,(
const char *name))
00767 {
00768
int fd, minor;
00769
char nm[
RTF_NAMELEN+1];
00770
00771
if (strlen(name) >
RTF_NAMELEN) {
00772
return -1;
00773 }
00774
if ((fd = open(rtf_getfifobyminor(0,nm,
sizeof(nm)), O_RDONLY)) < 0) {
00775
return -
errno;
00776 }
00777 strncpy(nm, name,
RTF_NAMELEN+1);
00778 minor = ioctl(fd,
RTF_CREATE_NAMED, nm);
00779 close(fd);
00780
return minor < 0 ? -
errno : minor;
00781 }
00782
00783
#ifdef __cplusplus
00784
}
00785
#endif
00786
00787
#endif
00788
00789
#endif
Generated on Thu Nov 20 11:49:49 2008 for RTAI API by
1.3.8