字符设备驱动程序(理论篇)
2011-12-21 14:29
204 查看
1. 设备编号
"主设备号标识设备对应的驱动程序" 而 "次设备号用于正确确定设备文件所指的设备"(LDD3 p48)
也就是说:主设备号对应驱动程序;次设备号对应使用同个驱动程序的设备;一般一个驱动程序可以被多个设备共享
一个主设备号和一个次设备号 合在一起 可以唯一确定一个设备文件,Linux内核使用一个叫做dev_t的类型来保存主设备号和次设备号,我们称dev_t类型的数据为设备编号。
要通过设备编号获取主次设备号,可以用以下宏:
MAJOR(dev_t dev);
MINOR(dev_t dev);
要通过主次设备号组成设备编号,可以用以下宏:
MKDEV(int major, int minor);
"在建立一个字符设备之前,我们的驱动程序首先要做的事情就是获得一个或者多个设备编号"(LDD3 P49)
至于分配和释放设备编号,感谢LDD3的作者已经为我们提供了很好的范例:
view plainprint?
if(scull_major) { dev = MKDEV(scull_major, scull_minor); result = register_chrdev_region(dev, scull_nr_devs, "scull"); } else { result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull"); scull_major = MAJOR(dev); } if(result < 0) { printk(KERN_WARNING "scull cannot register character device /n"); return result; }
2. 重要的数据结构
file_operations结构的作用是将驱动程序的操作连接到我们注册号的设备编号上:
view plainprint?
struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, };
file结构是在打开一个设备时创建的,所有在该设备上操作的方法都共享这个结构描述符,直到最后关闭这个设备文件。
inode结构唯一标识一个设备,一个设备可能会有多个file结构的描述符,但是有且只有一个inode,其成员i_cdev表示字符设备。
3. scull的设备布局
scull使用链表存储量子集,一个量子集有多个量子,每个量子有一定的大小。
转自:http://blog.csdn.net/victorsummer/article/details/6092199
"主设备号标识设备对应的驱动程序" 而 "次设备号用于正确确定设备文件所指的设备"(LDD3 p48)
也就是说:主设备号对应驱动程序;次设备号对应使用同个驱动程序的设备;一般一个驱动程序可以被多个设备共享
一个主设备号和一个次设备号 合在一起 可以唯一确定一个设备文件,Linux内核使用一个叫做dev_t的类型来保存主设备号和次设备号,我们称dev_t类型的数据为设备编号。
要通过设备编号获取主次设备号,可以用以下宏:
MAJOR(dev_t dev);
MINOR(dev_t dev);
要通过主次设备号组成设备编号,可以用以下宏:
MKDEV(int major, int minor);
"在建立一个字符设备之前,我们的驱动程序首先要做的事情就是获得一个或者多个设备编号"(LDD3 P49)
至于分配和释放设备编号,感谢LDD3的作者已经为我们提供了很好的范例:
view plainprint?
if(scull_major) { dev = MKDEV(scull_major, scull_minor); result = register_chrdev_region(dev, scull_nr_devs, "scull"); } else { result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull"); scull_major = MAJOR(dev); } if(result < 0) { printk(KERN_WARNING "scull cannot register character device /n"); return result; }
if(scull_major) { dev = MKDEV(scull_major, scull_minor); result = register_chrdev_region(dev, scull_nr_devs, "scull"); } else { result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull"); scull_major = MAJOR(dev); } if(result < 0) { printk(KERN_WARNING "scull cannot register character device /n"); return result; }
2. 重要的数据结构
file_operations结构的作用是将驱动程序的操作连接到我们注册号的设备编号上:
view plainprint?
struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, };
struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, };
file结构是在打开一个设备时创建的,所有在该设备上操作的方法都共享这个结构描述符,直到最后关闭这个设备文件。
inode结构唯一标识一个设备,一个设备可能会有多个file结构的描述符,但是有且只有一个inode,其成员i_cdev表示字符设备。
3. scull的设备布局
scull使用链表存储量子集,一个量子集有多个量子,每个量子有一定的大小。
转自:http://blog.csdn.net/victorsummer/article/details/6092199
相关文章推荐
- 字符设备驱动程序(理论篇)
- Linux设备驱动程序第三版学习(2)-字符设备驱动程序源码分析(续)
- android 字符设备驱动程序的一点小总结
- LDD3源码分析之字符设备驱动程序
- LED字符设备驱动程序
- linux设备驱动程序之简单字符设备驱动
- 字符设备驱动程序学习笔记一
- 字符设备驱动程序编写基础
- 字符设备驱动程序
- arm 驱动基础:字符设备驱动程序之同步互斥阻塞
- 简单字符设备驱动程序 以及 相应测试程序
- 字符设备驱动程序----概念分析
- 字符设备驱动程序
- 简单字符设备驱动程序
- 字符设备驱动程序之poll机制
- linux字符设备驱动程序设计概述
- 字符设备驱动程序之按键——异步通信机制
- Linux字符设备驱动程序的编写框架
- 字符设备驱动--LED驱动程序
- 字符设备驱动程序中重要的三个数据结构file_operations、inode、file