226 lines
6.1 KiB
C
Executable File
226 lines
6.1 KiB
C
Executable File
/*
|
|
* Please note that the comments on this file may be out of date
|
|
* and that they represent what I have figured about the shmiq device
|
|
* so far in IRIX.
|
|
*
|
|
* This also contains some streams and idev bits.
|
|
*
|
|
* They may contain errors, please, refer to the source code of the Linux
|
|
* kernel for a definitive answer on what we have implemented
|
|
*
|
|
* Miguel.
|
|
*/
|
|
|
|
/* STREAMs ioctls */
|
|
#define STRIOC ('S' << 8)
|
|
#define I_STR (STRIOC | 010)
|
|
#define I_PUSH (STRIOC | 02)
|
|
#define I_LINK (STRIOC | 014)
|
|
#define I_UNLINK (STRIOC | 015)
|
|
|
|
/* Data structure passed on I_STR ioctls */
|
|
struct strioctl {
|
|
int ic_cmd; /* streams ioctl command */
|
|
int ic_timout; /* timeout */
|
|
int ic_len; /* lenght of data */
|
|
void *ic_dp; /* data */
|
|
};
|
|
|
|
/*
|
|
* For mapping the shared memory input queue, you have to:
|
|
*
|
|
* 1. Map /dev/zero for the number of bytes you want to use
|
|
* for your shared memory input queue plus the size of the
|
|
* sharedMemoryInputQueue structure + 4 (I still have not figured
|
|
* what this one is for
|
|
*
|
|
* 2. Open /dev/shmiq
|
|
*
|
|
* 3. Open /dev/qcntlN N is [0..Nshmiqs]
|
|
*
|
|
* 4. Fill a shmiqreq structure. user_vaddr should point to the return
|
|
* address from the /dev/zero mmap. Arg is the number of shmqevents
|
|
* that fit into the /dev/zero region (remember that at the beginning there
|
|
* is a sharedMemoryInputQueue header).
|
|
*
|
|
* 5. Issue the ioctl (qcntlfd, QIOCATTACH, &your_shmiqreq);
|
|
*/
|
|
|
|
struct shmiqreq {
|
|
char *user_vaddr;
|
|
int arg;
|
|
};
|
|
|
|
/* map the shmiq into the process address space */
|
|
#define QIOCATTACH _IOW('Q',1,struct shmiqreq)
|
|
|
|
/* remove mappings */
|
|
#define QIOCDETACH _IO('Q',2)
|
|
|
|
/*
|
|
* A shared memory input queue event.
|
|
*/
|
|
struct shmqdata {
|
|
unsigned char device; /* device major */
|
|
unsigned char which; /* device minor */
|
|
unsigned char type; /* event type */
|
|
unsigned char flags; /* little event data */
|
|
union {
|
|
int pos; /* big event data */
|
|
short ptraxis [2]; /* event data for PTR events */
|
|
} un;
|
|
};
|
|
|
|
/* indetifies the shmiq and the device */
|
|
struct shmiqlinkid {
|
|
short int devminor;
|
|
short int index;
|
|
};
|
|
|
|
struct shmqevent {
|
|
union {
|
|
int time;
|
|
struct shmiqlinkid id;
|
|
} un ;
|
|
struct shmqdata data ;
|
|
};
|
|
|
|
/*
|
|
* sharedMemoryInputQueue: this describes the shared memory input queue.
|
|
*
|
|
* head is the user index into the events, user can modify this one.
|
|
* tail is managed by the kernel.
|
|
* flags is one of SHMIQ_OVERFLOW or SHMIQ_CORRUPTED
|
|
* if OVERFLOW is set it seems ioctl QUIOCSERVICED should be called
|
|
* to notify the kernel.
|
|
* events where the kernel sticks the events.
|
|
*/
|
|
struct sharedMemoryInputQueue {
|
|
volatile int head; /* user's index into events */
|
|
volatile int tail; /* kernel's index into events */
|
|
volatile unsigned int flags; /* place for out-of-band data */
|
|
#define SHMIQ_OVERFLOW 1
|
|
#define SHMIQ_CORRUPTED 2
|
|
struct shmqevent events[1]; /* input event buffer */
|
|
};
|
|
|
|
/* have to figure this one out */
|
|
#define QIOCGETINDX _IOWR('Q', 8, int)
|
|
|
|
|
|
/* acknowledge shmiq overflow */
|
|
#define QIOCSERVICED _IO('Q', 3)
|
|
|
|
/* Double indirect I_STR ioctl, yeah, fun fun fun */
|
|
|
|
struct muxioctl {
|
|
int index; /* lower stream index */
|
|
int realcmd; /* the actual command for the subdevice */
|
|
};
|
|
/* Double indirect ioctl */
|
|
#define QIOCIISTR _IOW('Q', 7, struct muxioctl)
|
|
|
|
/* Cursor ioclts: */
|
|
|
|
/* set cursor tracking mode */
|
|
#define QIOCURSTRK _IOW('Q', 4, int)
|
|
|
|
/* set cursor filter box */
|
|
#define QIOCURSIGN _IOW('Q', 5, int [4])
|
|
|
|
/* set cursor axes */
|
|
struct shmiqsetcurs {
|
|
short index;
|
|
short axes;
|
|
};
|
|
|
|
#define QIOCSETCURS _IOWR('Q', 9, struct shmiqsetcurs)
|
|
|
|
/* set cursor position */
|
|
struct shmiqsetcpos {
|
|
short x;
|
|
short y;
|
|
};
|
|
#define QIOCSETCPOS _IOWR('Q', 10, struct shmiqsetcpos)
|
|
|
|
/* get time since last event */
|
|
#define QIOCGETITIME _IOR('Q', 11, time_t)
|
|
|
|
/* set current screen */
|
|
#define QIOCSETSCRN _IOW('Q',6,int)
|
|
|
|
|
|
/* -------------------- iDev stuff -------------------- */
|
|
|
|
#define IDEV_MAX_NAME_LEN 15
|
|
#define IDEV_MAX_TYPE_LEN 15
|
|
|
|
typedef struct {
|
|
char devName[IDEV_MAX_NAME_LEN+1];
|
|
char devType[IDEV_MAX_TYPE_LEN+1];
|
|
unsigned short nButtons;
|
|
unsigned short nValuators;
|
|
unsigned short nLEDs;
|
|
unsigned short nStrDpys;
|
|
unsigned short nIntDpys;
|
|
unsigned char nBells;
|
|
unsigned char flags;
|
|
#define IDEV_HAS_KEYMAP 0x01
|
|
#define IDEV_HAS_PROXIMITY 0x02
|
|
#define IDEV_HAS_PCKBD 0x04
|
|
} idevDesc;
|
|
|
|
typedef struct {
|
|
char *nothing_for_now;
|
|
} idevInfo;
|
|
|
|
#define IDEV_KEYMAP_NAME_LEN 15
|
|
|
|
typedef struct {
|
|
char name[IDEV_KEYMAP_NAME_LEN+1];
|
|
} idevKeymapDesc;
|
|
|
|
/* The valuator definition */
|
|
typedef struct {
|
|
unsigned hwMinRes;
|
|
unsigned hwMaxRes;
|
|
int hwMinVal;
|
|
int hwMaxVal;
|
|
|
|
unsigned char possibleModes;
|
|
#define IDEV_ABSOLUTE 0x0
|
|
#define IDEV_RELATIVE 0x1
|
|
#define IDEV_EITHER 0x2
|
|
|
|
unsigned char mode; /* One of: IDEV_ABSOLUTE, IDEV_RELATIVE */
|
|
|
|
unsigned short resolution;
|
|
int minVal;
|
|
int maxVal;
|
|
} idevValuatorDesc;
|
|
|
|
/* This is used to query a specific valuator with the IDEVGETVALUATORDESC ioctl */
|
|
typedef struct {
|
|
short valNum;
|
|
unsigned short flags;
|
|
idevValuatorDesc desc;
|
|
} idevGetSetValDesc;
|
|
|
|
#define IDEVGETDEVICEDESC _IOWR('i', 0, idevDesc)
|
|
#define IDEVGETVALUATORDESC _IOWR('i', 1, idevGetSetValDesc)
|
|
#define IDEVGETKEYMAPDESC _IOWR('i', 2, idevKeymapDesc)
|
|
#define IDEVINITDEVICE _IOW ('i', 51, unsigned int)
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
/* These are only interpreted by SHMIQ-attacheable devices and are internal
|
|
* to the kernel
|
|
*/
|
|
#define SHMIQ_OFF _IO('Q',1)
|
|
#define SHMIQ_ON _IO('Q',2)
|
|
|
|
void shmiq_push_event (struct shmqevent *e);
|
|
int get_sioc (struct strioctl *sioc, unsigned long arg);
|
|
#endif
|