Xenomai API
2.5.6.1
|
00001 /* 00002 * @note Copyright (C) 2001,2002,2003 Philippe Gerum. 00003 * 00004 * Xenomai is free software; you can redistribute it and/or modify 00005 * it under the terms of the GNU General Public License as published 00006 * by the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 00007 * 02139, USA; either version 2 of the License, or (at your option) 00008 * any later version. 00009 * 00010 * Xenomai is distributed in the hope that it will be useful, but 00011 * WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with this program; if not, write to the Free Software 00017 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00018 */ 00019 00020 #ifndef _XENO_NUCLEUS_PIPE_H 00021 #define _XENO_NUCLEUS_PIPE_H 00022 00023 #define XNPIPE_NDEVS CONFIG_XENO_OPT_PIPE_NRDEV 00024 #define XNPIPE_DEV_MAJOR 150 00025 00026 #define XNPIPE_IOCTL_BASE 'p' 00027 #define XNPIPEIOC_GET_NRDEV _IOW(XNPIPE_IOCTL_BASE, 0, int) 00028 #define XNPIPEIOC_IFLUSH _IO(XNPIPE_IOCTL_BASE,1) 00029 #define XNPIPEIOC_OFLUSH _IO(XNPIPE_IOCTL_BASE,2) 00030 #define XNPIPEIOC_FLUSH XNPIPEIOC_OFLUSH 00031 #define XNPIPEIOC_SETSIG _IO(XNPIPE_IOCTL_BASE,3) 00032 00033 #define XNPIPE_NORMAL 0x0 00034 #define XNPIPE_URGENT 0x1 00035 00036 #define XNPIPE_IFLUSH 0x1 00037 #define XNPIPE_OFLUSH 0x2 00038 00039 #define XNPIPE_MINOR_AUTO -1 00040 00041 #ifdef __KERNEL__ 00042 00043 #include <nucleus/queue.h> 00044 #include <nucleus/synch.h> 00045 #include <nucleus/thread.h> 00046 #include <linux/types.h> 00047 #include <linux/poll.h> 00048 00049 #define XNPIPE_KERN_CONN 0x1 00050 #define XNPIPE_KERN_LCLOSE 0x2 00051 #define XNPIPE_USER_CONN 0x4 00052 #define XNPIPE_USER_SIGIO 0x8 00053 #define XNPIPE_USER_WREAD 0x10 00054 #define XNPIPE_USER_WREAD_READY 0x20 00055 #define XNPIPE_USER_WSYNC 0x40 00056 #define XNPIPE_USER_WSYNC_READY 0x80 00057 00058 #define XNPIPE_USER_ALL_WAIT \ 00059 (XNPIPE_USER_WREAD|XNPIPE_USER_WSYNC) 00060 00061 #define XNPIPE_USER_ALL_READY \ 00062 (XNPIPE_USER_WREAD_READY|XNPIPE_USER_WSYNC_READY) 00063 00064 typedef struct xnpipe_mh { 00065 00066 struct xnholder link; 00067 unsigned size; 00068 unsigned rdoff; 00069 00070 } xnpipe_mh_t; 00071 00072 static inline xnpipe_mh_t *link2mh(struct xnholder *ln) 00073 { 00074 return ln ? container_of(ln, xnpipe_mh_t, link) : NULL; 00075 } 00076 00077 struct xnpipe_state; 00078 00079 struct xnpipe_operations { 00080 void (*output)(struct xnpipe_mh *mh, void *xstate); 00081 int (*input)(struct xnpipe_mh *mh, int retval, void *xstate); 00082 void *(*alloc_ibuf)(size_t size, void *xstate); 00083 void (*free_ibuf)(void *buf, void *xstate); 00084 void (*free_obuf)(void *buf, void *xstate); 00085 void (*release)(void *xstate); 00086 }; 00087 00088 struct xnpipe_state { 00089 00090 struct xnholder slink; /* Link on sleep queue */ 00091 struct xnholder alink; /* Link on async queue */ 00092 #define link2xnpipe(ln, fld) container_of(ln, struct xnpipe_state, fld) 00093 00094 struct xnqueue inq; /* From user-space to kernel */ 00095 struct xnqueue outq; /* From kernel to user-space */ 00096 struct xnsynch synchbase; 00097 struct xnpipe_operations ops; 00098 void *xstate; /* Extra state managed by caller */ 00099 00100 /* Linux kernel part */ 00101 xnflags_t status; 00102 struct fasync_struct *asyncq; 00103 wait_queue_head_t readq; /* open/read/poll waiters */ 00104 wait_queue_head_t syncq; /* sync waiters */ 00105 int wcount; /* number of waiters on this minor */ 00106 size_t ionrd; 00107 00108 }; 00109 00110 extern struct xnpipe_state xnpipe_states[]; 00111 00112 #define xnminor_from_state(s) (s - xnpipe_states) 00113 00114 #ifdef __cplusplus 00115 extern "C" { 00116 #endif /* __cplusplus */ 00117 00118 int xnpipe_mount(void); 00119 00120 void xnpipe_umount(void); 00121 00122 /* Entry points of the kernel interface. */ 00123 00124 int xnpipe_connect(int minor, 00125 struct xnpipe_operations *ops, void *xstate); 00126 00127 int xnpipe_disconnect(int minor); 00128 00129 ssize_t xnpipe_send(int minor, 00130 struct xnpipe_mh *mh, size_t size, int flags); 00131 00132 ssize_t xnpipe_mfixup(int minor, struct xnpipe_mh *mh, ssize_t size); 00133 00134 ssize_t xnpipe_recv(int minor, 00135 struct xnpipe_mh **pmh, xnticks_t timeout); 00136 00137 int xnpipe_flush(int minor, int mode); 00138 00139 #ifdef __cplusplus 00140 } 00141 #endif /* __cplusplus */ 00142 00143 static inline struct xnholder *xnpipe_m_link(xnpipe_mh_t *mh) 00144 { 00145 return &mh->link; 00146 } 00147 00148 static inline char *xnpipe_m_data(xnpipe_mh_t *mh) 00149 { 00150 return (char *)(mh + 1); 00151 } 00152 00153 #define xnpipe_m_size(mh) ((mh)->size) 00154 00155 #define xnpipe_m_rdoff(mh) ((mh)->rdoff) 00156 00157 #endif /* __KERNEL__ */ 00158 00159 #endif /* !_XENO_NUCLEUS_PIPE_H */