26 #ifndef _RTDM_DRIVER_H
27 #define _RTDM_DRIVER_H
30 #error This header is for kernel space usage only. \
31 You are likely looking for rtdm/rtdm.h...
34 #include <asm/atomic.h>
35 #include <linux/list.h>
37 #include <nucleus/xenomai.h>
38 #include <nucleus/heap.h>
40 #include <nucleus/synch.h>
46 #include <nucleus/assert.h>
48 #include <asm-generic/xenomai/pci_ids.h>
51 #ifndef CONFIG_XENO_OPT_DEBUG_RTDM
52 #define CONFIG_XENO_OPT_DEBUG_RTDM 0
56 typedef struct xnselector rtdm_selector_t;
71 #define RTDM_EXCLUSIVE 0x0001
74 #define RTDM_NAMED_DEVICE 0x0010
78 #define RTDM_PROTOCOL_DEVICE 0x0020
81 #define RTDM_DEVICE_TYPE_MASK 0x00F0
91 #define RTDM_CREATED_IN_NRT 0
94 #define RTDM_CLOSING 1
97 #define RTDM_USER_CONTEXT_FLAG 8
107 #define RTDM_DEVICE_STRUCT_VER 5
110 #define RTDM_CONTEXT_STRUCT_VER 3
113 #define RTDM_SECURE_DEVICE 0x80000000
116 #define RTDM_DRIVER_VER(major, minor, patch) \
117 (((major & 0xFF) << 16) | ((minor & 0xFF) << 8) | (patch & 0xFF))
120 #define RTDM_DRIVER_MAJOR_VER(ver) (((ver) >> 16) & 0xFF)
123 #define RTDM_DRIVER_MINOR_VER(ver) (((ver) >> 8) & 0xFF)
126 #define RTDM_DRIVER_PATCH_VER(ver) ((ver) & 0xFF)
173 rtdm_user_info_t *user_info,
int oflag);
190 rtdm_user_info_t *user_info,
int protocol);
213 rtdm_user_info_t *user_info);
231 rtdm_user_info_t *user_info,
232 unsigned int request,
void __user *arg);
248 rtdm_selector_t *selector,
268 rtdm_user_info_t *user_info,
269 void *buf,
size_t nbyte);
287 rtdm_user_info_t *user_info,
288 const void *buf,
size_t nbyte);
307 rtdm_user_info_t *user_info,
308 struct user_msghdr *msg,
int flags);
327 rtdm_user_info_t *user_info,
328 const struct user_msghdr *msg,
int flags);
332 rtdm_user_info_t *user_info,
void *arg);
381 struct rtdm_devctx_reserved {
383 struct list_head cleanup;
449 struct rtdm_dev_reserved {
450 struct list_head entry;
521 #ifdef CONFIG_XENO_OPT_VFILE
523 struct xnvfile_directory vfroot;
524 struct xnvfile_regular info_vfile;
544 #define rtdm_open rt_dev_open
545 #define rtdm_socket rt_dev_socket
546 #define rtdm_close rt_dev_close
547 #define rtdm_ioctl rt_dev_ioctl
548 #define rtdm_read rt_dev_read
549 #define rtdm_write rt_dev_write
550 #define rtdm_recvmsg rt_dev_recvmsg
551 #define rtdm_recv rt_dev_recv
552 #define rtdm_recvfrom rt_dev_recvfrom
553 #define rtdm_sendmsg rt_dev_sendmsg
554 #define rtdm_send rt_dev_send
555 #define rtdm_sendto rt_dev_sendto
556 #define rtdm_bind rt_dev_bind
557 #define rtdm_listen rt_dev_listen
558 #define rtdm_accept rt_dev_accept
559 #define rtdm_getsockopt rt_dev_getsockopt
560 #define rtdm_setsockopt rt_dev_setsockopt
561 #define rtdm_getsockname rt_dev_getsockname
562 #define rtdm_getpeername rt_dev_getpeername
563 #define rtdm_shutdown rt_dev_shutdown
569 #define CONTEXT_IS_LOCKED(context) \
570 (atomic_read(&(context)->close_lock_count) > 1 || \
571 (test_bit(RTDM_CLOSING, &(context)->context_flags) && \
572 atomic_read(&(context)->close_lock_count) > 0))
576 XENO_ASSERT(RTDM, CONTEXT_IS_LOCKED(context),
585 XENO_ASSERT(RTDM, CONTEXT_IS_LOCKED(context),
587 smp_mb__before_atomic();
589 rthal_apc_schedule(rtdm_apc);
599 extern struct xntbase *rtdm_tbase;
608 return xntbase_ticks2ns(rtdm_tbase, xntbase_get_jiffies(rtdm_tbase));
659 #define RTDM_EXECUTE_ATOMICALLY(code_block) \
661 <ENTER_ATOMIC_SECTION> \
663 <LEAVE_ATOMIC_SECTION> \
666 #define RTDM_EXECUTE_ATOMICALLY(code_block) \
670 xnlock_get_irqsave(&nklock, __rtdm_s); \
671 __xnpod_lock_sched(); \
673 __xnpod_unlock_sched(); \
674 xnlock_put_irqrestore(&nklock, __rtdm_s); \
687 #define RTDM_LOCK_UNLOCKED RTHAL_SPIN_LOCK_UNLOCKED
710 #define rtdm_lock_init(lock) rthal_spin_lock_init(lock)
729 #define rtdm_lock_get(lock) rthal_spin_lock(lock)
731 #define rtdm_lock_get(lock) \
733 XENO_BUGON(RTDM, !rthal_local_irq_disabled()); \
734 rthal_spin_lock(lock); \
735 __xnpod_lock_sched(); \
755 #define rtdm_lock_put(lock) \
757 rthal_spin_unlock(lock); \
758 __xnpod_unlock_sched(); \
778 #define rtdm_lock_get_irqsave(lock, context) \
780 rthal_spin_lock_irqsave(lock, context); \
781 __xnpod_lock_sched(); \
801 #define rtdm_lock_put_irqrestore(lock, context) \
803 rthal_spin_unlock(lock); \
804 __xnpod_unlock_sched(); \
805 rthal_local_irq_restore(context); \
824 #define rtdm_lock_irqsave(context) \
825 rthal_local_irq_save(context)
843 #define rtdm_lock_irqrestore(context) \
844 rthal_local_irq_restore(context)
855 typedef xnintr_t rtdm_irq_t;
863 #define RTDM_IRQTYPE_SHARED XN_ISR_SHARED
866 #define RTDM_IRQTYPE_EDGE XN_ISR_EDGE
884 #define RTDM_IRQ_NONE XN_ISR_NONE
886 #define RTDM_IRQ_HANDLED XN_ISR_HANDLED
906 #define rtdm_irq_get_arg(irq_handle, type) ((type *)irq_handle->cookie)
911 const char *device_name,
void *arg);
916 XENO_ASSERT(RTDM, xnpod_root_p(),
return -EPERM;);
938 typedef unsigned rtdm_nrtsig_t;
957 *nrt_sig = rthal_alloc_virq();
962 rthal_virtualize_irq(rthal_root_domain, *nrt_sig, handler, arg, NULL,
969 rthal_virtualize_irq(rthal_root_domain, *nrt_sig, NULL, NULL, NULL, 0);
971 rthal_free_virq(*nrt_sig);
976 rthal_trigger_irq(*nrt_sig);
987 typedef xntimer_t rtdm_timer_t;
1016 #define rtdm_timer_init(timer, handler, name) \
1018 xntimer_init((timer), rtdm_tbase, handler); \
1019 xntimer_set_name((timer), (name)); \
1037 return xntimer_start(timer, xntbase_ns2ticks_ceil(rtdm_tbase, expiry),
1038 xntbase_ns2ticks_ceil(rtdm_tbase, interval),
1054 typedef xnthread_t rtdm_task_t;
1067 #define RTDM_TASK_LOWEST_PRIORITY XNSCHED_LOW_PRIO
1068 #define RTDM_TASK_HIGHEST_PRIORITY XNSCHED_HIGH_PRIO
1075 #define RTDM_TASK_RAISE_PRIORITY (+1)
1076 #define RTDM_TASK_LOWER_PRIORITY (-1)
1084 int __rtdm_task_sleep(xnticks_t timeout, xntmode_t mode);
1097 union xnsched_policy_param param = { .rt = { .prio = priority } };
1108 xntbase_ns2ticks_ceil
1109 (xnthread_time_base(task), period));
1122 return xnpod_current_thread();
1127 XENO_ASSERT(RTDM, !xnpod_unblockable_p(),
return -EPERM;);
1133 return __rtdm_task_sleep(delay, XN_RELATIVE);
1142 return __rtdm_task_sleep(wakeup_date, (xntmode_t)mode);
1148 return __rtdm_task_sleep(wakeup_time, XN_REALTIME);
1161 xnsynch_t synch_base;
1162 DECLARE_XNSELECT(select_block);
1165 #define RTDM_EVENT_PENDING XNSYNCH_SPARE1
1168 #ifdef CONFIG_XENO_OPT_RTDM_SELECT
1172 #define rtdm_event_select_bind(e, s, t, i) ({ (void)(e); -EBADF; })
1176 rtdm_toseq_t *timeout_seq);
1182 void __rtdm_synch_flush(xnsynch_t *synch,
unsigned long reason);
1186 trace_mark(xn_rtdm, event_pulse,
"event %p", event);
1187 __rtdm_synch_flush(&event->synch_base, 0);
1192 trace_mark(xn_rtdm, event_destroy,
"event %p", event);
1193 __rtdm_synch_flush(&event->synch_base,
XNRMID);
1201 unsigned long value;
1202 xnsynch_t synch_base;
1203 DECLARE_XNSELECT(select_block);
1207 #ifdef CONFIG_XENO_OPT_RTDM_SELECT
1211 #define rtdm_sem_select_bind(s, se, t, i) ({ (void)(s); -EBADF; })
1215 rtdm_toseq_t *timeout_seq);
1222 __rtdm_synch_flush(&sem->synch_base,
XNRMID);
1230 xnsynch_t synch_base;
1236 rtdm_toseq_t *timeout_seq);
1241 XENO_ASSERT(RTDM, !xnpod_asynch_p(),
return;);
1243 trace_mark(xn_rtdm, mutex_unlock,
"mutex %p", mutex);
1251 trace_mark(xn_rtdm, mutex_destroy,
"mutex %p", mutex);
1253 __rtdm_synch_flush(&mutex->synch_base,
XNRMID);
1259 #define rtdm_printk(format, ...) printk(format, ##__VA_ARGS__)
1261 struct rtdm_ratelimit_state {
1270 int rtdm_ratelimit(
struct rtdm_ratelimit_state *rs,
const char *func);
1272 #define DEFINE_RTDM_RATELIMIT_STATE(name, interval_init, burst_init) \
1273 struct rtdm_ratelimit_state name = { \
1274 .lock = RTDM_LOCK_UNLOCKED, \
1275 .interval = interval_init, \
1276 .burst = burst_init, \
1280 #define DEF_RTDM_RATELIMIT_INTERVAL 5000000000LL
1281 #define DEF_RTDM_RATELIMIT_BURST 10
1283 #define rtdm_printk_ratelimited(fmt, ...) ({ \
1284 static DEFINE_RTDM_RATELIMIT_STATE(_rs, \
1285 DEF_RTDM_RATELIMIT_INTERVAL, \
1286 DEF_RTDM_RATELIMIT_BURST); \
1288 if (rtdm_ratelimit(&_rs, __func__)) \
1289 printk(fmt, ##__VA_ARGS__); \
1295 return xnmalloc(size);
1303 #ifdef CONFIG_XENO_OPT_PERVASIVE
1305 void *src_addr,
size_t len,
1306 int prot,
void **pptr,
1307 struct vm_operations_struct *vm_ops,
1308 void *vm_private_data);
1310 phys_addr_t src_addr,
size_t len,
1311 int prot,
void **pptr,
1312 struct vm_operations_struct *vm_ops,
1313 void *vm_private_data);
1314 int rtdm_munmap(rtdm_user_info_t *user_info,
void *ptr,
size_t len);
1317 const void __user *ptr,
size_t size)
1319 return access_rok(ptr, size);
1323 const void __user *ptr,
size_t size)
1325 return access_wok(ptr, size);
1329 void *dst,
const void __user *src,
1332 return __xn_copy_from_user(dst, src, size) ? -EFAULT : 0;
1336 void *dst,
const void __user *src,
1339 return (!access_rok(src, size) ||
1340 __xn_copy_from_user(dst, src, size)) ? -EFAULT : 0;
1344 void __user *dst,
const void *src,
1347 return __xn_copy_to_user(dst, src, size) ? -EFAULT : 0;
1351 void __user *dst,
const void *src,
1354 return (!access_wok(dst, size) ||
1355 __xn_copy_to_user(dst, src, size)) ? -EFAULT : 0;
1360 const char __user *src,
size_t count)
1362 if (unlikely(!access_rok(src, 1)))
1364 return __xn_strncpy_from_user(dst, src, count);
1369 XENO_ASSERT(RTDM, !xnpod_asynch_p(),
return 0;);
1371 return (user_info ? xnshadow_thread(user_info) != NULL
1377 #define rtdm_mmap_to_user(...) ({ -ENOSYS; })
1378 #define rtdm_munmap(...) ({ -ENOSYS; })
1379 #define rtdm_read_user_ok(...) ({ 0; })
1380 #define rtdm_rw_user_ok(...) ({ 0; })
1381 #define rtdm_copy_from_user(...) ({ -ENOSYS; })
1382 #define rtdm_safe_copy_from_user(...) ({ -ENOSYS; })
1383 #define rtdm_copy_to_user(...) ({ -ENOSYS; })
1384 #define rtdm_safe_copy_to_user(...) ({ -ENOSYS; })
1385 #define rtdm_strncpy_from_user(...) ({ -ENOSYS; })
1389 XENO_ASSERT(RTDM, !xnpod_asynch_p(),
return 0;);
1391 return !xnpod_root_p();
1398 return (rthal_current_domain != rthal_root_domain);
1404 rtdm_user_info_t *user_info,
void *arg,
1405 rtdm_rt_handler_t handler);
int rtdm_select_bind(int fd, rtdm_selector_t *selector, enum rtdm_selecttype type, unsigned fd_index)
Bind a selector to specified event types of a given file descriptor.
Definition: core.c:623
This file is part of the Xenomai project.
void rtdm_context_unlock(struct rtdm_dev_context *context)
Decrement context reference counter.
size_t context_size
Size of driver defined appendix to struct rtdm_dev_context.
Definition: rtdm_driver.h:470
int rtdm_task_sleep_abs(nanosecs_abs_t wakeup_time, enum rtdm_timer_mode mode)
Sleep until a specified absolute time.
Select ouput buffer availability events.
Definition: rtdm_driver.h:144
int rtdm_dev_register(struct rtdm_device *device)
Register a RTDM device.
Definition: device.c:195
Device operations.
Definition: rtdm_driver.h:336
ssize_t(* rtdm_read_handler_t)(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, void *buf, size_t nbyte)
Read handler.
Definition: rtdm_driver.h:267
int xnpod_wait_thread_period(unsigned long *overruns_r)
Wait for the next periodic release point.
Definition: pod.c:2951
int rtdm_safe_copy_from_user(rtdm_user_info_t *user_info, void *dst, const void __user *src, size_t size)
Check if read access to user-space memory block and copy it to specified buffer.
int rtdm_task_set_period(rtdm_task_t *task, nanosecs_rel_t period)
Adjust real-time task period.
Adjustable timer with absolute timeout.
Definition: rtdm_driver.h:1009
Monotonic timer with absolute timeout.
Definition: rtdm_driver.h:1006
int rtdm_mmap_to_user(rtdm_user_info_t *user_info, void *src_addr, size_t len, int prot, void **pptr, struct vm_operations_struct *vm_ops, void *vm_private_data)
Map a kernel memory range into the address space of the user.
Definition: drvlib.c:1991
int rtdm_task_unblock(rtdm_task_t *task)
Activate a blocked real-time task.
int rtdm_task_sleep(nanosecs_rel_t delay)
Sleep a specified amount of time.
int64_t nanosecs_rel_t
RTDM type for representing relative intervals.
Definition: rtdm.h:95
int xnpod_set_thread_periodic(xnthread_t *thread, xnticks_t idate, xnticks_t period)
Make a thread periodic.
Definition: pod.c:2850
int rtdm_safe_copy_to_user(rtdm_user_info_t *user_info, void __user *dst, const void *src, size_t size)
Check if read/write access to user-space memory block is safe and copy specified buffer to it...
char dev_private[0]
Begin of driver defined context data structure.
Definition: rtdm_driver.h:418
file descriptors events multiplexing header.
void rtdm_sem_init(rtdm_sem_t *sem, unsigned long value)
Initialise a semaphore.
Definition: drvlib.c:1120
void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, nanosecs_rel_t timeout)
Initialise a timeout sequence.
Definition: drvlib.c:735
rtdm_read_handler_t read_nrt
Read handler for non-real-time context (optional)
Definition: rtdm_driver.h:359
int rtdm_task_init(rtdm_task_t *task, const char *name, rtdm_task_proc_t task_proc, void *arg, int priority, nanosecs_rel_t period)
Intialise and start a real-time task.
Definition: drvlib.c:139
rtdm_select_bind_handler_t select_bind
Select binding handler for any context (optional)
Definition: rtdm_driver.h:351
int(* rtdm_ioctl_handler_t)(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, unsigned int request, void __user *arg)
IOCTL handler.
Definition: rtdm_driver.h:230
void rtdm_timer_destroy(rtdm_timer_t *timer)
Destroy a timer.
Definition: drvlib.c:527
int profile_version
Supported device profile version.
Definition: rtdm_driver.h:508
int rtdm_mutex_lock(rtdm_mutex_t *mutex)
Request a mutex.
Definition: drvlib.c:1482
int xnintr_enable(xnintr_t *intr)
Enable an interrupt object.
Definition: intr.c:833
void * device_data
Driver definable device data.
Definition: rtdm_driver.h:530
rtdm_sendmsg_handler_t sendmsg_rt
Transmit message handler for real-time context (optional)
Definition: rtdm_driver.h:375
int xnpod_unblock_thread(xnthread_t *thread)
Unblock a thread.
Definition: pod.c:1713
void rtdm_event_clear(rtdm_event_t *event)
Clear event state.
Definition: drvlib.c:1024
int rtdm_dev_unregister(struct rtdm_device *device, unsigned int poll_delay)
Unregisters a RTDM device.
Definition: device.c:397
void rtdm_nrtsig_pend(rtdm_nrtsig_t *nrt_sig)
Trigger non-real-time signal.
void rtdm_free(void *ptr)
Release real-time memory block.
int rtdm_sem_timeddown(rtdm_sem_t *sem, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq)
Decrement a semaphore with timeout.
Definition: drvlib.c:1229
rthal_spinlock_t rtdm_lock_t
Lock variable.
Definition: rtdm_driver.h:690
rtdm_write_handler_t write_rt
Write handler for real-time context (optional)
Definition: rtdm_driver.h:362
static xnticks_t xntbase_get_time(xntbase_t *base)
Get the clock time for a given time base.
Definition: timebase.h:301
rtdm_recvmsg_handler_t recvmsg_nrt
Receive message handler for non-real-time context (optional)
Definition: rtdm_driver.h:372
Select input data availability events.
Definition: rtdm_driver.h:141
int fd
Associated file descriptor.
Definition: rtdm_driver.h:402
int rtdm_irq_enable(rtdm_irq_t *irq_handle)
Enable interrupt line.
rtdm_ioctl_handler_t ioctl_rt
IOCTL from real-time context (optional)
Definition: rtdm_driver.h:346
rtdm_close_handler_t close_rt
Close handler for real-time contexts (optional, deprecated)
Definition: rtdm_driver.h:341
rtdm_socket_handler_t socket_rt
Protocol socket creation for real-time contexts, optional (but deprecated) if socket_nrt is non-NULL...
Definition: rtdm_driver.h:494
void rtdm_task_set_priority(rtdm_task_t *task, int priority)
Adjust real-time task priority.
void(* rtdm_timer_handler_t)(rtdm_timer_t *timer)
Timer handler.
Definition: rtdm_driver.h:994
struct rtdm_operations ops
Default operations on newly opened device instance.
Definition: rtdm_driver.h:500
void xnselect_destroy(struct xnselect *select_block)
Destroy the xnselect structure associated with a file descriptor.
Definition: select.c:179
int rtdm_nrtsig_init(rtdm_nrtsig_t *nrt_sig, rtdm_nrtsig_handler_t handler, void *arg)
Register a non-real-time signal handler.
void rtdm_nrtsig_destroy(rtdm_nrtsig_t *nrt_sig)
Release a non-realtime signal handler.
const char * peripheral_name
Informational peripheral name the device is attached to (reported via /proc)
Definition: rtdm_driver.h:515
struct rtdm_dev_context * rtdm_context_get(int fd)
Retrieve and lock a device context.
Definition: core.c:77
void rtdm_event_signal(rtdm_event_t *event)
Signal an event occurrence.
Definition: drvlib.c:850
int rtdm_strncpy_from_user(rtdm_user_info_t *user_info, char *dst, const char __user *src, size_t count)
Copy user-space string to specified buffer.
int rtdm_in_rt_context(void)
Test if running in a real-time task.
int xnpod_set_thread_schedparam(struct xnthread *thread, struct xnsched_class *sched_class, const union xnsched_policy_param *sched_param)
Change the base scheduling parameters of a thread.
Definition: pod.c:1817
int rtdm_munmap(rtdm_user_info_t *user_info, void *ptr, size_t len)
Unmap a user memory range.
Definition: drvlib.c:2101
void rtdm_timer_stop(rtdm_timer_t *timer)
Stop a timer.
Definition: drvlib.c:598
rtdm_open_handler_t open_nrt
Named device instance creation for non-real-time contexts, optional if open_rt is non-NULL...
Definition: rtdm_driver.h:487
int rtdm_sem_select_bind(rtdm_sem_t *sem, rtdm_selector_t *selector, enum rtdm_selecttype type, unsigned fd_index)
Bind a selector to a semaphore.
Definition: drvlib.c:1353
int rtdm_copy_to_user(rtdm_user_info_t *user_info, void __user *dst, const void *src, size_t size)
Copy specified buffer to user-space memory block.
rtdm_close_handler_t close_nrt
Close handler for non-real-time contexts (required)
Definition: rtdm_driver.h:343
Select exceptional events.
Definition: rtdm_driver.h:147
int device_flags
Device flags, see Device Flags for details.
Definition: rtdm_driver.h:468
static struct rtdm_dev_context * rtdm_private_to_context(void *dev_private)
Locate a device context structure from its driver private area.
Definition: rtdm_driver.h:444
uint64_t nanosecs_abs_t
RTDM type for representing absolute dates.
Definition: rtdm.h:89
struct xnthread * xnsynch_release(struct xnsynch *synch)
Give the resource ownership to the next waiting thread.
Definition: synch.c:775
void rtdm_event_init(rtdm_event_t *event, unsigned long pending)
Initialise an event.
Definition: drvlib.c:769
const char * provider_name
Informational driver provider name (reported via /proc)
Definition: rtdm_driver.h:517
int socket_type
Protocol device identification: socket type (SOCK_xxx)
Definition: rtdm_driver.h:478
void rtdm_task_busy_sleep(nanosecs_rel_t delay)
Busy-wait a specified amount of time.
Definition: drvlib.c:471
int(* rtdm_select_bind_handler_t)(struct rtdm_dev_context *context, rtdm_selector_t *selector, enum rtdm_selecttype type, unsigned fd_index)
Select binding handler.
Definition: rtdm_driver.h:247
int rtdm_irq_free(rtdm_irq_t *irq_handle)
Release an interrupt handler.
const char * proc_name
Name of /proc entry for the device, must not be NULL.
Definition: rtdm_driver.h:520
Real-time pod interface header.
char device_name[RTDM_MAX_DEVNAME_LEN+1]
Named device identification (orthogonal to Linux device name space)
Definition: rtdm_driver.h:473
ssize_t(* rtdm_recvmsg_handler_t)(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, struct user_msghdr *msg, int flags)
Receive message handler.
Definition: rtdm_driver.h:306
struct rtdm_operations * ops
Set of active device operation handlers.
Definition: rtdm_driver.h:409
unsigned long rtdm_lockctx_t
Variable to save the context while holding a lock.
Definition: rtdm_driver.h:693
void rtdm_mutex_init(rtdm_mutex_t *mutex)
Initialise a mutex.
Definition: drvlib.c:1405
int(* rtdm_irq_handler_t)(rtdm_irq_t *irq_handle)
Interrupt handler.
Definition: rtdm_driver.h:876
rtdm_read_handler_t read_rt
Read handler for real-time context (optional)
Definition: rtdm_driver.h:357
int rtdm_task_sleep_until(nanosecs_abs_t wakeup_time)
Sleep until a specified absolute time.
static void xnpod_schedule(void)
Rescheduling procedure entry point.
Definition: pod.h:251
int rtdm_copy_from_user(rtdm_user_info_t *user_info, void *dst, const void __user *src, size_t size)
Copy user-space memory block to specified buffer.
int rtdm_read_user_ok(rtdm_user_info_t *user_info, const void __user *ptr, size_t size)
Check if read access to user-space memory block is safe.
void xnpod_delete_thread(xnthread_t *thread)
Delete a thread.
Definition: pod.c:1070
void rtdm_mutex_destroy(rtdm_mutex_t *mutex)
Destroy a mutex.
rtdm_ioctl_handler_t ioctl_nrt
IOCTL from non-real-time context (optional)
Definition: rtdm_driver.h:348
struct rtdm_dev_reserved reserved
Data stored by RTDM inside a registered device (internal use only)
Definition: rtdm_driver.h:533
struct rtdm_device * device
Reference to owning device.
Definition: rtdm_driver.h:412
#define XNRMID
Pending on a removed resource.
Definition: thread.h:109
static void xntimer_stop(xntimer_t *timer)
Disarm a timer.
Definition: timer.h:420
int rtdm_sem_down(rtdm_sem_t *sem)
Decrement a semaphore.
Definition: drvlib.c:1184
int rtdm_event_timedwait(rtdm_event_t *event, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq)
Wait on event occurrence with timeout.
Definition: drvlib.c:944
ssize_t(* rtdm_write_handler_t)(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, const void *buf, size_t nbyte)
Write handler.
Definition: rtdm_driver.h:286
void rtdm_sem_destroy(rtdm_sem_t *sem)
Destroy a semaphore.
rtdm_socket_handler_t socket_nrt
Protocol socket creation for non-real-time contexts, optional if socket_rt is non-NULL, ignored for named devices.
Definition: rtdm_driver.h:497
int(* rtdm_open_handler_t)(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, int oflag)
Named device open handler.
Definition: rtdm_driver.h:172
int(* rtdm_close_handler_t)(struct rtdm_dev_context *context, rtdm_user_info_t *user_info)
Close handler.
Definition: rtdm_driver.h:212
nanosecs_abs_t rtdm_clock_read_monotonic(void)
Get monotonic time.
void rtdm_timer_stop_in_handler(rtdm_timer_t *timer)
Stop a timer from inside a timer handler.
rtdm_recvmsg_handler_t recvmsg_rt
Receive message handler for real-time context (optional)
Definition: rtdm_driver.h:370
int device_id
Driver definable device ID.
Definition: rtdm_driver.h:528
int rtdm_timer_start(rtdm_timer_t *timer, nanosecs_abs_t expiry, nanosecs_rel_t interval, enum rtdm_timer_mode mode)
Start a timer.
Definition: drvlib.c:565
int xnintr_disable(xnintr_t *intr)
Disable an interrupt object.
Definition: intr.c:865
rtdm_open_handler_t open_rt
Named device instance creation for real-time contexts, optional (but deprecated) if open_nrt is non-N...
Definition: rtdm_driver.h:484
int rtdm_rw_user_ok(rtdm_user_info_t *user_info, const void __user *ptr, size_t size)
Check if read/write access to user-space memory block is safe.
nanosecs_abs_t rtdm_clock_read(void)
Get system time.
void rtdm_event_destroy(rtdm_event_t *event)
Destroy an event.
int(* rtdm_socket_handler_t)(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, int protocol)
Socket creation handler for protocol devices.
Definition: rtdm_driver.h:189
int rtdm_task_wait_period(void)
Wait on next real-time task period.
int rtdm_irq_disable(rtdm_irq_t *irq_handle)
Disable interrupt line.
static int xntimer_start(xntimer_t *timer, xnticks_t value, xnticks_t interval, xntmode_t mode)
Arm a timer.
Definition: timer.h:388
void * rtdm_malloc(size_t size)
Allocate memory block in real-time context.
int rtdm_event_wait(rtdm_event_t *event)
Wait on event occurrence.
Definition: drvlib.c:899
const char * driver_name
Informational driver name (reported via /proc)
Definition: rtdm_driver.h:510
void rtdm_sem_up(rtdm_sem_t *sem)
Increment a semaphore.
Definition: drvlib.c:1302
struct rtdm_devctx_reserved reserved
Data stored by RTDM inside a device context (internal use only)
Definition: rtdm_driver.h:415
void rtdm_task_destroy(rtdm_task_t *task)
Destroy a real-time task.
rtdm_selecttype
Definition: rtdm_driver.h:139
void rtdm_task_join_nrt(rtdm_task_t *task, unsigned int poll_delay)
Wait on a real-time task to terminate.
Definition: drvlib.c:427
int rtdm_timer_start_in_handler(rtdm_timer_t *timer, nanosecs_abs_t expiry, nanosecs_rel_t interval, enum rtdm_timer_mode mode)
Start a timer from inside a timer handler.
void rtdm_context_put(struct rtdm_dev_context *context)
Release a device context obtained via rtdm_context_get()
atomic_t close_lock_count
Lock counter of context, held while structure is referenced by an operation handler.
Definition: rtdm_driver.h:406
Device context.
Definition: rtdm_driver.h:397
int xnintr_detach(xnintr_t *intr)
Detach an interrupt object.
Definition: intr.c:780
Monotonic timer with relative timeout.
Definition: rtdm_driver.h:1003
void rtdm_mutex_unlock(rtdm_mutex_t *mutex)
Release a mutex.
rtdm_timer_mode
Definition: rtdm_driver.h:1001
void(* rtdm_nrtsig_handler_t)(rtdm_nrtsig_t nrt_sig, void *arg)
Non-real-time signal handler.
Definition: rtdm_driver.h:950
int struct_version
Revision number of this structure, see Driver Versioning defines.
Definition: rtdm_driver.h:465
static void * rtdm_context_to_private(struct rtdm_dev_context *context)
Locate the driver private area associated to a device context structure.
Definition: rtdm_driver.h:430
void(* rtdm_task_proc_t)(void *arg)
Real-time task procedure.
Definition: rtdm_driver.h:1061
rtdm_task_t * rtdm_task_current(void)
Get current real-time task.
int driver_version
Driver version, see Driver Versioning defines.
Definition: rtdm_driver.h:512
void rtdm_context_lock(struct rtdm_dev_context *context)
Increment context reference counter.
RTDM device.
Definition: rtdm_driver.h:462
int rtdm_ratelimit(struct rtdm_ratelimit_state *rs, const char *func)
Enforces a rate limit.
Definition: drvlib.c:2136
int sem_destroy(sem_t *sem)
Destroy an unnamed semaphore.
Definition: sem.c:214
int device_sub_class
Device sub-class, see RTDM_SUBCLASS_xxx definition in the Device Profiles.
Definition: rtdm_driver.h:506
int rtdm_rt_capable(rtdm_user_info_t *user_info)
Test if the caller is capable of running in real-time context.
ssize_t(* rtdm_sendmsg_handler_t)(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, const struct user_msghdr *msg, int flags)
Transmit message handler.
Definition: rtdm_driver.h:326
unsigned long context_flags
Context flags, see Context Flags for details.
Definition: rtdm_driver.h:399
int device_class
Device class ID, see RTDM_CLASS_xxx.
Definition: rtdm_driver.h:503
int rtdm_iomap_to_user(rtdm_user_info_t *user_info, phys_addr_t src_addr, size_t len, int prot, void **pptr, struct vm_operations_struct *vm_ops, void *vm_private_data)
Map an I/O memory range into the address space of the user.
Definition: drvlib.c:2059
int rtdm_irq_request(rtdm_irq_t *irq_handle, unsigned int irq_no, rtdm_irq_handler_t handler, unsigned long flags, const char *device_name, void *arg)
Register an interrupt handler.
Definition: drvlib.c:1622
int rtdm_mutex_timedlock(rtdm_mutex_t *mutex, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq)
Request a mutex with timeout.
Definition: drvlib.c:1523
rtdm_sendmsg_handler_t sendmsg_nrt
Transmit message handler for non-real-time context (optional)
Definition: rtdm_driver.h:377
rtdm_write_handler_t write_nrt
Write handler for non-real-time context (optional)
Definition: rtdm_driver.h:364
Real-Time Driver Model for Xenomai, user API header.
void rtdm_event_pulse(rtdm_event_t *event)
Signal an event occurrence to currently listening waiters.
int rtdm_event_select_bind(rtdm_event_t *event, rtdm_selector_t *selector, enum rtdm_selecttype type, unsigned fd_index)
Bind a selector to an event.
Definition: drvlib.c:1071
int protocol_family
Protocol device identification: protocol family (PF_xxx)
Definition: rtdm_driver.h:476