scull.h
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * scull.h -- definitions for the char module
  3.  *
  4.  *********/
  5. #include <linux/ioctl.h>
  6. /* version dependencies have been confined to a separate file */
  7. #define VERSION_CODE(vers,rel,seq) ( ((vers)<<16) | ((rel)<<8) | (seq) )
  8. #include "sysdep.h"
  9. /*
  10.  * Macros to help debugging
  11.  */
  12. #undef PDEBUG             /* undef it, just in case */
  13. #ifdef SCULL_DEBUG
  14. #  ifdef __KERNEL__
  15.      /* This one if debugging is on, and kernel space */
  16. #    define PDEBUG(fmt, args...) printk( KERN_DEBUG "scull: " fmt, ## args)
  17. #  else
  18.      /* This one for user space */
  19. #    define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)
  20. #  endif
  21. #else
  22. #  define PDEBUG(fmt, args...) /* not debugging: nothing */
  23. #endif
  24. #undef PDEBUGG
  25. #define PDEBUGG(fmt, args...) /* nothing: it's a placeholder */
  26. #ifndef SCULL_MAJOR
  27. #define SCULL_MAJOR 0   /* dynamic major by default */
  28. #endif
  29. #ifndef SCULL_NR_DEVS
  30. #define SCULL_NR_DEVS 4    /* scull0 through scull3 */
  31. #endif
  32. #ifndef SCULL_P_NR_DEVS
  33. #define SCULL_P_NR_DEVS 4  /* scullpipe0 through scullpipe3 */
  34. #endif
  35. /*
  36.  * The bare device is a variable-length region of memory.
  37.  * Use a linked list of indirect blocks.
  38.  *
  39.  * "Scull_Dev->data" points to an array of pointers, each
  40.  * pointer refers to a memory area of SCULL_QUANTUM bytes.
  41.  *
  42.  * The array (quantum-set) is SCULL_QSET long.
  43.  */
  44. #ifndef SCULL_QUANTUM
  45. #define SCULL_QUANTUM 4000
  46. #endif
  47. #ifndef SCULL_QSET
  48. #define SCULL_QSET    1000
  49. #endif
  50. /*
  51.  * The pipe device is a simple circular buffer. Here its default size
  52.  */
  53. #ifndef SCULL_P_BUFFER
  54. #define SCULL_P_BUFFER 4000
  55. #endif
  56. typedef struct Scull_Dev {
  57.    void **data;
  58.    struct Scull_Dev *next;   /* next listitem */
  59.    int quantum;              /* the current quantum size */
  60.    int qset;                 /* the current array size */
  61.    unsigned long size;
  62.    unsigned int access_key;  /* used by sculluid and scullpriv */
  63.    unsigned int usage;       /* lock the device while using it */
  64. } Scull_Dev;
  65. /*
  66.  * Split minors in two parts
  67.  */
  68. #define TYPE(dev)   (MINOR(dev) >> 4)  /* high nibble */
  69. #define NUM(dev)    (MINOR(dev) & 0xf) /* low  nibble */
  70. /*
  71.  * Different minors behave differently, so let's use multiple fops
  72.  */
  73. extern struct file_operations scull_fops;        /* simplest: global */
  74. extern struct file_operations scull_priv_fops;   /* private region   */
  75. extern struct file_operations scull_pipe_fops;   /* circular buffer  */
  76. extern struct file_operations scull_sngl_fops;   /* single open      */
  77. extern struct file_operations scull_user_fops;   /* single process   */
  78. extern struct file_operations scull_wusr_fops;   /* single user      */
  79. /*
  80.  * The different configurable parameters
  81.  */
  82. extern int scull_major;     /* main.c */
  83. extern int scull_nr_devs;
  84. extern int scull_quantum;
  85. extern int scull_qset;
  86. extern int scull_p_nr_devs;    /* pipe.c */
  87. extern int scull_p_buffer;
  88. /*
  89.  * Prototypes for shared functions
  90.  */
  91. int scull_p_init(void);
  92. void scull_p_cleanup(void);
  93. int scull_access_init(void);
  94. void scull_access_cleanup(void);
  95. int scull_trim(Scull_Dev *dev);
  96. read_write_t scull_read (struct inode *inode, struct file *filp,
  97.                 char *buf, count_t count);
  98. read_write_t scull_write (struct inode *inode, struct file *filp,
  99.                 const char *buf, count_t count);
  100. int scull_lseek (struct inode *inode, struct file *filp,
  101.                  off_t off, int whence);
  102. int scull_ioctl (struct inode *inode, struct file *filp,
  103.                  unsigned int cmd, unsigned long arg);
  104. #ifdef SCULL_DEBUG
  105. #  if LINUX_VERSION_CODE > VERSION_CODE(1,99,3) /* 1.99.4 exported the needed symbols */
  106. #    define SCULL_USE_PROC
  107. #  endif
  108. #endif
  109. #ifndef min
  110. #  define min(a,b) ((a)<(b) ? (a) : (b))
  111. #endif
  112. /*
  113.  * Ioctl definitions
  114.  */
  115. /* Use 'k' as magic number */
  116. #define SCULL_IOC_MAGIC  'k'
  117. #define SCULL_IOCRESET    _IO(SCULL_IOC_MAGIC, 0)
  118. /*
  119.  * S means "Set" through a ptr,
  120.  * T means "Tell" directly with the argument value
  121.  * G means "Get": reply by setting through a pointer
  122.  * Q means "Query": response is on the return value
  123.  * X means "eXchange": G and S atomically
  124.  * H means "sHift": T and Q atomically
  125.  */
  126. #define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC,  1, scull_quantum)
  127. #define SCULL_IOCSQSET    _IOW(SCULL_IOC_MAGIC,  2, scull_qset)
  128. #define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC,   3)
  129. #define SCULL_IOCTQSET    _IO(SCULL_IOC_MAGIC,   4)
  130. #define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC,  5, scull_quantum)
  131. #define SCULL_IOCGQSET    _IOR(SCULL_IOC_MAGIC,  6, scull_qset)
  132. #define SCULL_IOCQQUANTUM _IO(SCULL_IOC_MAGIC,   7)
  133. #define SCULL_IOCQQSET    _IO(SCULL_IOC_MAGIC,   8)
  134. #define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, scull_quantum)
  135. #define SCULL_IOCXQSET    _IOWR(SCULL_IOC_MAGIC,10, scull_qset)
  136. #define SCULL_IOCHQUANTUM _IO(SCULL_IOC_MAGIC,  11)
  137. #define SCULL_IOCHQSET    _IO(SCULL_IOC_MAGIC,  12)
  138. /*
  139.  * The other entities only have "Tell" and "Query", because they're
  140.  * not printed in the book, and there's no need to have all six.
  141.  * (The previous stuff was only there to show different ways to do it.
  142.  */
  143. #define SCULL_P_IOCTSIZE _IO(SCULL_IOC_MAGIC,   13)
  144. #define SCULL_P_IOCQSIZE _IO(SCULL_IOC_MAGIC,   14)
  145. /* ... more to come */
  146. #define SCULL_IOCHARDRESET _IO(SCULL_IOC_MAGIC, 15) /* debugging tool */
  147. #define SCULL_IOC_MAXNR 15