shmiq.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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