字符驱动框架

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

字符驱动框架

1.1.1 字符驱动框架

接下来将前面所讲述的编写驱动的知识融合起来,给出一个完整的字符驱动程序的框架,一个典型的字符驱动框架略缩图如图0.1所示。

相关头文件

相关变量和宏定义

#include #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 {

相关文档
最新文档