shmiq.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Please note that the comments on this file may be out of date
  7.  * and that they represent what I have figured about the shmiq device
  8.  * so far in IRIX.
  9.  *
  10.  * This also contains some streams and idev bits.
  11.  *
  12.  * They may contain errors, please, refer to the source code of the Linux
  13.  * kernel for a definitive answer on what we have implemented
  14.  *
  15.  * Miguel.
  16.  */
  17. #ifndef _ASM_SHMIQ_H
  18. #define _ASM_SHMIQ_H
  19. /* STREAMs ioctls */
  20. #define STRIOC    ('S' << 8)
  21. #define I_STR     (STRIOC | 010)
  22. #define I_PUSH    (STRIOC | 02)
  23. #define I_LINK    (STRIOC | 014)
  24. #define I_UNLINK  (STRIOC | 015)
  25. /* Data structure passed on I_STR ioctls */
  26. struct strioctl {
  27.         int     ic_cmd;                 /* streams ioctl command */
  28.         int     ic_timout;              /* timeout */
  29.         int     ic_len;                 /* lenght of data */
  30.         void    *ic_dp;                 /* data */
  31. };
  32. /*
  33.  * For mapping the shared memory input queue, you have to:
  34.  *
  35.  * 1. Map /dev/zero for the number of bytes you want to use
  36.  *    for your shared memory input queue plus the size of the
  37.  *    sharedMemoryInputQueue structure + 4 (I still have not figured
  38.  *    what this one is for
  39.  *
  40.  * 2. Open /dev/shmiq
  41.  *
  42.  * 3. Open /dev/qcntlN N is [0..Nshmiqs]
  43.  *
  44.  * 4. Fill a shmiqreq structure.  user_vaddr should point to the return
  45.  *    address from the /dev/zero mmap.  Arg is the number of shmqevents
  46.  *    that fit into the /dev/zero region (remember that at the beginning there
  47.  *    is a sharedMemoryInputQueue header).
  48.  *
  49.  * 5. Issue the ioctl (qcntlfd, QIOCATTACH, &your_shmiqreq);
  50.  */
  51. struct shmiqreq {
  52. char *user_vaddr;
  53. int  arg;
  54. };
  55. /* map the shmiq into the process address space */
  56. #define QIOCATTACH       _IOW('Q',1,struct shmiqreq)
  57. /* remove mappings */
  58. #define QIOCDETACH       _IO('Q',2)
  59. /*
  60.  * A shared memory input queue event.
  61.  */
  62. struct shmqdata {
  63. unsigned char device;          /* device major */
  64.         unsigned char which;           /* device minor */
  65.         unsigned char type;            /* event type */
  66.         unsigned char flags;           /* little event data */
  67.         union {
  68.             int pos;                   /* big event data */
  69.             short ptraxis [2];         /* event data for PTR events */
  70.         } un;
  71. };
  72. /* indetifies the shmiq and the device */
  73. struct shmiqlinkid {
  74.         short int devminor;
  75.         short int index;
  76. };
  77. struct shmqevent {
  78. union {
  79.                 int time;
  80.                 struct shmiqlinkid id;
  81.         } un ;
  82.         struct shmqdata data ;
  83. };
  84. /*
  85.  * sharedMemoryInputQueue: this describes the shared memory input queue.
  86.  *
  87.  * head   is the user index into the events, user can modify this one.
  88.  * tail   is managed by the kernel.
  89.  * flags  is one of SHMIQ_OVERFLOW or SHMIQ_CORRUPTED
  90.  *        if OVERFLOW is set it seems ioctl QUIOCSERVICED should be called
  91.  *        to notify the kernel.
  92.  * events where the kernel sticks the events.
  93.  */
  94. struct sharedMemoryInputQueue {
  95. volatile int head;      /* user's index into events */
  96.         volatile int tail;      /* kernel's index into events */
  97.         volatile unsigned int flags; /* place for out-of-band data */
  98. #define SHMIQ_OVERFLOW  1
  99. #define SHMIQ_CORRUPTED 2
  100.         struct shmqevent events[1];  /* input event buffer */
  101. };
  102. /* have to figure this one out */
  103. #define QIOCGETINDX      _IOWR('Q', 8, int)
  104. /* acknowledge shmiq overflow */
  105. #define QIOCSERVICED     _IO('Q', 3)
  106. /* Double indirect I_STR ioctl, yeah, fun fun fun */
  107. struct muxioctl {
  108.         int index; /* lower stream index */
  109.         int realcmd; /* the actual command for the subdevice */
  110. };
  111. /* Double indirect ioctl */
  112. #define QIOCIISTR        _IOW('Q', 7, struct muxioctl)
  113. /* Cursor ioclts: */
  114. /* set cursor tracking mode */
  115. #define QIOCURSTRK      _IOW('Q', 4, int)
  116. /* set cursor filter box */
  117. #define QIOCURSIGN      _IOW('Q', 5, int [4])
  118. /* set cursor axes */
  119. struct shmiqsetcurs {
  120.         short index;
  121.         short axes;
  122. };
  123. #define QIOCSETCURS     _IOWR('Q',  9, struct shmiqsetcurs)
  124. /* set cursor position */
  125. struct shmiqsetcpos {
  126.         short   x;
  127.         short   y;
  128. };
  129. #define QIOCSETCPOS     _IOWR('Q', 10, struct shmiqsetcpos)
  130. /* get time since last event */
  131. #define QIOCGETITIME    _IOR('Q', 11, time_t)
  132. /* set current screen */
  133. #define QIOCSETSCRN     _IOW('Q',6,int)
  134. /* -------------------- iDev stuff -------------------- */
  135. #define IDEV_MAX_NAME_LEN 15
  136. #define IDEV_MAX_TYPE_LEN 15
  137. typedef struct {
  138.         char            devName[IDEV_MAX_NAME_LEN+1];
  139.         char            devType[IDEV_MAX_TYPE_LEN+1];
  140.         unsigned short  nButtons;
  141.         unsigned short  nValuators;
  142.         unsigned short  nLEDs;
  143.         unsigned short  nStrDpys;
  144.         unsigned short  nIntDpys;
  145.         unsigned char   nBells;
  146.         unsigned char   flags;
  147. #define IDEV_HAS_KEYMAP 0x01
  148. #define IDEV_HAS_PROXIMITY  0x02
  149. #define IDEV_HAS_PCKBD  0x04
  150. } idevDesc;
  151. typedef struct {
  152. char *nothing_for_now;
  153. } idevInfo;
  154. #define IDEV_KEYMAP_NAME_LEN 15
  155. typedef struct {
  156.         char name[IDEV_KEYMAP_NAME_LEN+1];
  157. } idevKeymapDesc;
  158. /* The valuator definition */
  159. typedef struct {
  160.         unsigned        hwMinRes;
  161.         unsigned        hwMaxRes;
  162.         int             hwMinVal;
  163.         int             hwMaxVal;
  164.         unsigned char   possibleModes;
  165. #define IDEV_ABSOLUTE           0x0
  166. #define IDEV_RELATIVE           0x1
  167. #define IDEV_EITHER             0x2
  168.         unsigned char   mode; /* One of: IDEV_ABSOLUTE, IDEV_RELATIVE */
  169.         unsigned short  resolution;
  170.         int             minVal;
  171.         int             maxVal;
  172. } idevValuatorDesc;
  173. /* This is used to query a specific valuator with the IDEVGETVALUATORDESC ioctl */
  174. typedef struct {
  175.         short                   valNum;
  176.         unsigned short          flags;
  177.         idevValuatorDesc        desc;
  178. } idevGetSetValDesc;
  179. #define IDEVGETDEVICEDESC _IOWR('i', 0,  idevDesc)
  180. #define IDEVGETVALUATORDESC     _IOWR('i', 1,  idevGetSetValDesc)
  181. #define IDEVGETKEYMAPDESC _IOWR('i', 2,  idevKeymapDesc)
  182. #define IDEVINITDEVICE _IOW ('i', 51, unsigned int)
  183. #ifdef __KERNEL__
  184. /* These are only interpreted by SHMIQ-attacheable devices and are internal
  185.  * to the kernel
  186.  */
  187. #define SHMIQ_OFF        _IO('Q',1)
  188. #define SHMIQ_ON         _IO('Q',2)
  189. void shmiq_push_event (struct shmqevent *e);
  190. int get_sioc (struct strioctl *sioc, unsigned long arg);
  191. #endif
  192. #endif /* _ASM_SHMIQ_H */