ldd_ scull (scull.h).txt
来自「详细介绍的scull字符设备驱动程序的实现!」· 文本 代码 · 共 178 行
TXT
178 行
1 /*
2 * scull.h -- definitions for the char module
3 *
4 * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
5 * Copyright (C) 2001 O'Reilly & Associates
6 *
7 * The source code in this file can be freely used, adapted,
8 * and redistributed in source or binary form, so long as an
9 * acknowledgment appears in derived source files. The citation
10 * should list that the code comes from the book "Linux Device
11 * Drivers" by Alessandro Rubini and Jonathan Corbet, published
12 * by O'Reilly & Associates. No warranty is attached;
13 * we cannot take responsibility for errors or fitness for use.
14 *
15 * $Id: scull.h,v 1.15 2004/11/04 17:51:18 rubini Exp $
16 */
17
18 #ifndef _SCULL_H_
19 #define _SCULL_H_
20
21 #include <linux/ioctl.h> /* needed for the _IOW etc stuff used later */
22
23 /*
24 * Macros to help debugging
25 */
26
27 #undef PDEBUG /* undef it, just in case */
28 #ifdef SCULL_DEBUG
29 # ifdef __KERNEL__
30 /* This one if debugging is on, and kernel space */
31 # define PDEBUG(fmt, args...) printk( KERN_DEBUG "scull: " fmt, ## args)
32 # else
33 /* This one for user space */
34 # define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)
35 # endif
36 #else
37 # define PDEBUG(fmt, args...) /* not debugging: nothing */
38 #endif
39
40 #undef PDEBUGG
41 #define PDEBUGG(fmt, args...) /* nothing: it's a placeholder */
42
43 #ifndef SCULL_MAJOR
44 #define SCULL_MAJOR 0 /* dynamic major by default */
45 #endif
46
47 #ifndef SCULL_NR_DEVS
48 #define SCULL_NR_DEVS 4 /* scull0 through scull3 */
49 #endif
50
51 #ifndef SCULL_P_NR_DEVS
52 #define SCULL_P_NR_DEVS 4 /* scullpipe0 through scullpipe3 */
53 #endif
54
55 /*
56 * The bare device is a variable-length region of memory.
57 * Use a linked list of indirect blocks.
58 *
59 * "scull_dev->data" points to an array of pointers, each
60 * pointer refers to a memory area of SCULL_QUANTUM bytes.
61 *
62 * The array (quantum-set) is SCULL_QSET long.
63 */
64 #ifndef SCULL_QUANTUM
65 #define SCULL_QUANTUM 4000
66 #endif
67
68 #ifndef SCULL_QSET
69 #define SCULL_QSET 1000
70 #endif
71
72 /*
73 * The pipe device is a simple circular buffer. Here its default size
74 */
75 #ifndef SCULL_P_BUFFER
76 #define SCULL_P_BUFFER 4000
77 #endif
78
79 /*
80 * Representation of scull quantum sets.
81 */
82 struct scull_qset {
83 void **data;
84 struct scull_qset *next;
85 };
86
87 struct scull_dev {
88 struct scull_qset *data; /* Pointer to first quantum set */
89 int quantum; /* the current quantum size */
90 int qset; /* the current array size */
91 unsigned long size; /* amount of data stored here */
92 unsigned int access_key; /* used by sculluid and scullpriv */
93 struct semaphore sem; /* mutual exclusion semaphore */
94 struct cdev cdev; /* Char device structure */
95 };
96
97 /*
98 * Split minors in two parts
99 */
100 #define TYPE(minor) (((minor) >> 4) & 0xf) /* high nibble */
101 #define NUM(minor) ((minor) & 0xf) /* low nibble */
102
103
104 /*
105 * The different configurable parameters
106 */
107 extern int scull_major; /* main.c */
108 extern int scull_nr_devs;
109 extern int scull_quantum;
110 extern int scull_qset;
111
112 extern int scull_p_buffer; /* pipe.c */
113
114
115 /*
116 * Prototypes for shared functions
117 */
118
119 int scull_p_init(dev_t dev);
120 void scull_p_cleanup(void);
121 int scull_access_init(dev_t dev);
122 void scull_access_cleanup(void);
123
124 int scull_trim(struct scull_dev *dev);
125
126 ssize_t scull_read(struct file *filp, char __user *buf, size_t count,
127 loff_t *f_pos);
128 ssize_t scull_write(struct file *filp, const char __user *buf, size_t count,
129 loff_t *f_pos);
130 loff_t scull_llseek(struct file *filp, loff_t off, int whence);
131 int scull_ioctl(struct inode *inode, struct file *filp,
132 unsigned int cmd, unsigned long arg);
133
134
135 /*
136 * Ioctl definitions
137 */
138
139 /* Use 'k' as magic number */
140 #define SCULL_IOC_MAGIC 'k'
141 /* Please use a different 8-bit number in your code */
142
143 #define SCULL_IOCRESET _IO(SCULL_IOC_MAGIC, 0)
144
145 /*
146 * S means "Set" through a ptr,
147 * T means "Tell" directly with the argument value
148 * G means "Get": reply by setting through a pointer
149 * Q means "Query": response is on the return value
150 * X means "eXchange": switch G and S atomically
151 * H means "sHift": switch T and Q atomically
152 */
153 #define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC, 1, int)
154 #define SCULL_IOCSQSET _IOW(SCULL_IOC_MAGIC, 2, int)
155 #define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3)
156 #define SCULL_IOCTQSET _IO(SCULL_IOC_MAGIC, 4)
157 #define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC, 5, int)
158 #define SCULL_IOCGQSET _IOR(SCULL_IOC_MAGIC, 6, int)
159 #define SCULL_IOCQQUANTUM _IO(SCULL_IOC_MAGIC, 7)
160 #define SCULL_IOCQQSET _IO(SCULL_IOC_MAGIC, 8)
161 #define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, int)
162 #define SCULL_IOCXQSET _IOWR(SCULL_IOC_MAGIC,10, int)
163 #define SCULL_IOCHQUANTUM _IO(SCULL_IOC_MAGIC, 11)
164 #define SCULL_IOCHQSET _IO(SCULL_IOC_MAGIC, 12)
165
166 /*
167 * The other entities only have "Tell" and "Query", because they're
168 * not printed in the book, and there's no need to have all six.
169 * (The previous stuff was only there to show different ways to do it.
170 */
171 #define SCULL_P_IOCTSIZE _IO(SCULL_IOC_MAGIC, 13)
172 #define SCULL_P_IOCQSIZE _IO(SCULL_IOC_MAGIC, 14)
173 /* ... more to come */
174
175 #define SCULL_IOC_MAXNR 14
176
177 #endif /* _SCULL_H_ */
178
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?