#ifndef RTAPI_COMMON_H
#define RTAPI_COMMON_H
#ifdef RTAPI
#include <linux/sched.h>
#else
#include <sched.h>
#endif
#include "rtapi_bitops.h"
#include <rtapi_mutex.h>
#define RTAPI_MAX_MODULES 64
#define RTAPI_MAX_TASKS 64
#define RTAPI_MAX_SHMEMS 32
#define RTAPI_MAX_SEMS 64
#define RTAPI_MAX_FIFOS 32
#define RTAPI_MAX_IRQS 16
static unsigned int rev_code = 1;
typedef enum {
NO_MODULE = 0,
REALTIME,
USERSPACE
} mod_type_t;
typedef struct {
mod_type_t state;
char name[RTAPI_NAME_LEN + 1];
} module_data;
typedef enum {
EMPTY = 0,
PAUSED,
PERIODIC,
FREERUN,
ENDED
} task_state_t;
typedef struct {
task_state_t state;
int prio;
int owner;
void (*taskcode) (void *);
void *arg;
} task_data;
typedef struct {
int key;
int rtusers;
int ulusers;
unsigned long size;
unsigned long bitmap[(RTAPI_MAX_SHMEMS / 8) + 1];
} shmem_data;
typedef struct {
int users;
int key;
unsigned long bitmap[(RTAPI_MAX_SEMS / 8) + 1];
} sem_data;
typedef enum {
UNUSED = 0,
HAS_READER = 1,
HAS_WRITER = 2,
HAS_BOTH = 3
} fifo_state_t;
typedef struct {
fifo_state_t state;
int key;
int reader;
int writer;
unsigned long int size;
} fifo_data;
typedef struct {
int irq_num;
int owner;
void (*handler) (void);
} irq_data;
typedef struct {
int magic;
int rev_code;
rtapi_mutex_t mutex;
int rt_module_count;
int ul_module_count;
int task_count;
int shmem_count;
int sem_count;
int fifo_count;
int irq_count;
int timer_running;
int rt_cpu;
long int timer_period;
module_data module_array[RTAPI_MAX_MODULES + 1];
task_data task_array[RTAPI_MAX_TASKS + 1];
shmem_data shmem_array[RTAPI_MAX_SHMEMS + 1];
sem_data sem_array[RTAPI_MAX_SEMS + 1];
fifo_data fifo_array[RTAPI_MAX_FIFOS + 1];
irq_data irq_array[RTAPI_MAX_IRQS + 1];
} rtapi_data_t;
#define RTAPI_KEY 0x90280A48
#define RTAPI_MAGIC 0x12601409
rtapi_data_t *rtapi_data = NULL;
module_data *module_array = NULL;
task_data *task_array = NULL;
shmem_data *shmem_array = NULL;
sem_data *sem_array = NULL;
fifo_data *fifo_array = NULL;
irq_data *irq_array = NULL;
static void init_rtapi_data(rtapi_data_t * data)
{
int n, m;
if (data->magic == RTAPI_MAGIC) {
return;
}
rtapi_mutex_try(&(data->mutex));
data->magic = RTAPI_MAGIC;
data->rev_code = rev_code;
data->rt_module_count = 0;
data->ul_module_count = 0;
data->task_count = 0;
data->shmem_count = 0;
data->sem_count = 0;
data->fifo_count = 0;
data->irq_count = 0;
data->timer_running = 0;
data->timer_period = 0;
for (n = 0; n <= RTAPI_MAX_MODULES; n++) {
data->module_array[n].state = EMPTY;
data->module_array[n].name[0] = '\0';
}
for (n = 0; n <= RTAPI_MAX_TASKS; n++) {
data->task_array[n].state = EMPTY;
data->task_array[n].prio = 0;
data->task_array[n].owner = 0;
data->task_array[n].taskcode = NULL;
}
for (n = 0; n <= RTAPI_MAX_SHMEMS; n++) {
data->shmem_array[n].key = 0;
data->shmem_array[n].rtusers = 0;
data->shmem_array[n].ulusers = 0;
data->shmem_array[n].size = 0;
for (m = 0; m < (RTAPI_MAX_SHMEMS / 8) + 1; m++) {
data->shmem_array[n].bitmap[m] = 0;
}
}
for (n = 0; n <= RTAPI_MAX_SEMS; n++) {
data->sem_array[n].users = 0;
data->sem_array[n].key = 0;
for (m = 0; m < (RTAPI_MAX_SEMS / 8) + 1; m++) {
data->sem_array[n].bitmap[m] = 0;
}
}
for (n = 0; n <= RTAPI_MAX_FIFOS; n++) {
data->fifo_array[n].state = UNUSED;
data->fifo_array[n].key = 0;
data->fifo_array[n].size = 0;
data->fifo_array[n].reader = 0;
data->fifo_array[n].writer = 0;
}
for (n = 0; n <= RTAPI_MAX_IRQS; n++) {
data->irq_array[n].irq_num = 0;
data->irq_array[n].owner = 0;
data->irq_array[n].handler = NULL;
}
rtapi_mutex_give(&(data->mutex));
return;
}
#endif