00001
00023 #ifndef __ANALOGY_OS_FACILITIES__
00024 #define __ANALOGY_OS_FACILITIES__
00025
00026 #if defined(__KERNEL__) && !defined(DOXYGEN_CPP)
00027
00028 #include <linux/fs.h>
00029 #include <linux/spinlock.h>
00030 #include <linux/sched.h>
00031 #include <linux/time.h>
00032 #include <linux/delay.h>
00033 #include <linux/interrupt.h>
00034 #include <asm/uaccess.h>
00035
00036 #if !(defined(CONFIG_XENO_SKIN_RTDM) || \
00037 defined(CONFIG_XENO_SKIN_RTDM_MODULE))
00038 #error Analogy needs RTDM enabled \
00039 (statically or as amodule) to compile properly
00040 #endif
00041
00042
00043 #include <rtdm/rtdm_driver.h>
00044
00045
00046
00047 #define A4L_PROMPT "Analogy: "
00048
00049 #define RTDM_SUBCLASS_ANALOGY 0
00050
00051 #define __a4l_err(fmt, args...) \
00052 rtdm_printk(KERN_ERR A4L_PROMPT fmt, ##args)
00053
00054 #define __a4l_warn(fmt, args...) \
00055 rtdm_printk(KERN_WARNING A4L_PROMPT fmt, ##args)
00056
00057 #define __a4l_info(fmt, args...) \
00058 rtdm_printk(KERN_INFO A4L_PROMPT fmt, ##args)
00059
00060 #ifdef CONFIG_XENO_DRIVERS_ANALOGY_DEBUG
00061
00062 #define __a4l_dbg(level, debug, fmt, args...) \
00063 do { \
00064 if ((debug) >= (level)) \
00065 rtdm_printk(KERN_DEBUG A4L_PROMPT fmt, ##args); \
00066 } while (0)
00067
00068 #define core_dbg CONFIG_XENO_DRIVERS_ANALOGY_DEBUG_LEVEL
00069 #define drv_dbg CONFIG_XENO_DRIVERS_ANALOGY_DRIVER_DEBUG_LEVEL
00070
00071 #else
00072
00073 #define __a4l_dbg(level, debug, fmt, args...)
00074
00075 #endif
00076
00077 #define __a4l_dev_name(dev) \
00078 (dev->driver == NULL) ? "unattached dev" : dev->driver->board_name
00079
00080 #define a4l_err(dev, fmt, args...) \
00081 __a4l_err("%s: " fmt, __a4l_dev_name(dev), ##args)
00082
00083 #define a4l_warn(dev, fmt, args...) \
00084 __a4l_warn("%s: " fmt, __a4l_dev_name(dev), ##args)
00085
00086 #define a4l_info(dev, fmt, args...) \
00087 __a4l_info("%s: " fmt, __a4l_dev_name(dev), ##args)
00088
00089 #define a4l_dbg(level, debug, dev, fmt, args...) \
00090 __a4l_dbg(level, debug, "%s: " fmt, __a4l_dev_name(dev), ##args)
00091
00092
00093
00094 typedef rtdm_lock_t a4l_lock_t;
00095
00096 #define A4L_LOCK_UNLOCKED RTDM_LOCK_UNLOCKED
00097
00098 #define a4l_lock_init(lock) rtdm_lock_init(lock)
00099 #define a4l_lock(lock) rtdm_lock_get(lock)
00100 #define a4l_unlock(lock) rtdm_lock_put(lock)
00101 #define a4l_lock_irqsave(lock, context) \
00102 rtdm_lock_get_irqsave(lock, context)
00103 #define a4l_unlock_irqrestore(lock, context) \
00104 rtdm_lock_put_irqrestore(lock, context)
00105
00106
00107
00108 #define A4L_TASK_LOWEST_PRIORITY RTDM_TASK_LOWEST_PRIORITY
00109 #define A4L_TASK_HIGHEST_PRIORITY RTDM_TASK_HIGHEST_PRIORITY
00110
00111 typedef rtdm_task_t a4l_task_t;
00112 typedef rtdm_task_proc_t a4l_task_proc_t;
00113
00114 #define a4l_task_init(tsk, name, proc, arg, priority) \
00115 rtdm_task_init(tsk, name, proc, arg, priority, 0)
00116
00117 #define a4l_task_destroy(tsk) rtdm_task_destroy(tsk)
00118
00119 #define a4l_task_sleep(delay) rtdm_task_sleep(delay)
00120
00121
00122
00123 static inline void a4l_udelay(unsigned int us)
00124 {
00125 rtdm_task_busy_sleep(((nanosecs_rel_t) us) * 1000);
00126 }
00127
00128 static inline nanosecs_abs_t a4l_get_rawtime(void)
00129 {
00130 return rtdm_clock_read();
00131 }
00132
00133
00134 nanosecs_abs_t a4l_get_time(void);
00135
00136
00137 void a4l_init_time(void);
00138
00139
00140
00141 #define A4L_IRQ_SHARED RTDM_IRQTYPE_SHARED
00142 #define A4L_IRQ_EDGE RTDM_IRQTYPE_EDGE
00143 #define A4L_IRQ_DISABLED 0
00144
00145 typedef int (*a4l_irq_hdlr_t) (unsigned int irq, void *d);
00146
00147 struct a4l_irq_descriptor {
00148
00149
00150 a4l_irq_hdlr_t handler;
00151 unsigned int irq;
00152 void *cookie;
00153 rtdm_irq_t rtdm_desc;
00154 };
00155 typedef struct a4l_irq_descriptor a4l_irq_desc_t;
00156
00157 int __a4l_request_irq(a4l_irq_desc_t * dsc,
00158 unsigned int irq,
00159 a4l_irq_hdlr_t handler,
00160 unsigned long flags, void *cookie);
00161 int __a4l_free_irq(a4l_irq_desc_t * dsc);
00162
00163
00164
00165 #define __NRT_WAITER 1
00166 #define __RT_WAITER 2
00167 #define __EVT_PDING 3
00168
00169 struct a4l_sync {
00170 unsigned long status;
00171 rtdm_event_t rtdm_evt;
00172 rtdm_nrtsig_t nrt_sig;
00173 wait_queue_head_t wq;
00174 };
00175 typedef struct a4l_sync a4l_sync_t;
00176
00177 #define a4l_select_sync(snc, slr, type, fd) \
00178 rtdm_event_select_bind(&((snc)->rtdm_evt), slr, type, fd)
00179
00180 int a4l_init_sync(a4l_sync_t * snc);
00181 void a4l_cleanup_sync(a4l_sync_t * snc);
00182 void a4l_flush_sync(a4l_sync_t * snc);
00183 int a4l_wait_sync(a4l_sync_t * snc, int rt);
00184 int a4l_timedwait_sync(a4l_sync_t * snc,
00185 int rt, unsigned long long ns_timeout);
00186 void a4l_signal_sync(a4l_sync_t * snc);
00187
00188
00189
00190 #define a4l_test_rt() rtdm_in_rt_context()
00191
00192 #endif
00193
00194 #endif