字符驱动框架
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
字符驱动框架
1.1.1 字符驱动框架
接下来将前面所讲述的编写驱动的知识融合起来,给出一个完整的字符驱动程序的框架,一个典型的字符驱动框架略缩图如图0.1所示。
相关头文件
相关变量和宏定义
#include
static int char_cdev_open(struct inode *inode, struct file *file ){}
open 方法
static int char_cdev_release(struct inode *inode, struct file *file ){}
release 方法
static ssize_t char_cdev_read(struct file *file, char *buf,size_t count, loff_t *f_pos){}
read 方法
static ssize_t char_cdev_write(struct file *file, const char *buf, size_t count, loff_t *f_pos){}
write 方法
static int char_cdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){}
ioctl 方法
struct file_operations char_cdev_fops = { .owner = THIS_MODULE, .read = char_cdev_read, .write = char_cdev_write,
.open = char_cdev_open, .release = char_cdev_release, .ioctl = char_cdev_ioctl };
fops 定义
static int __init char_cdev_init(void){}
module_init(char_cdev_init);
static void __exit char_cdev_exit(void){}
module_exit(char_cdev_exit);MODULE_LICENSE("GPL");
模块初始化代码
模块退出代码
协议声明模块描述
图0.1 char_cdev 字符驱动框架略缩图
从略缩图来看,字符驱动框架很简单,与前面一节程序代码相比,只增加了fops的定义以及char_cdev_xxx各方法的实现(尽管差不多是空函数)。一般的字符驱动都可以套用这个框架,增加设备的实质性操作代码即可。字符驱动框架完整代码如程序清单0.1所示。
程序清单0.1字符驱动程序框架
1 #include
2 #include
3 #include
4 #include
5 #include
6
7 static int major = 232; /* 静态设备号方式的默认值*/
8 static int minor = 0; /* 静态设备号方式的默认值*/
9 module_param(major, int, S_IRUGO);
10 module_param(minor, int, S_IRUGO);
11
12 struct cdev *char_cdev; /* cdev数据结构*/
13 static dev_t devno; /* 设备编号*/
14 static struct class *char_cdev_class;
15
16 #define DEVICE_NAME "char_cdev"
17
18 static int char_cdev_open(struct inode *inode, struct file *file )
19 {
20 try_module_get(THIS_MODULE);
21 printk(KERN_INFO DEVICE_NAME " opened!\n");
22 return 0;
23 }
24
25 static int char_cdev_release(struct inode *inode, struct file *file )
26 {
27 printk(KERN_INFO DEVICE_NAME " closed!\n");
28 module_put(THIS_MODULE);
29 return 0;
30 }
31
32 static ssize_t char_cdev_read(struct file *file, char *buf,size_t count, loff_t *f_pos)
33 {
34 printk(KERN_INFO DEVICE_NAME " read method!\n");
35 return count;
36 }
37
38 static ssize_t char_cdev_write(struct file *file, const char *buf, size_t count, loff_t *f_pos)
39 {