杂项设备的学习

来源:互联网 发布:钢琴练习软件 编辑:程序博客网 时间:2024/05/07 00:15

<span lang="zh-CN" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">首先</span><span lang="en-US" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">,</span><span lang="zh-CN" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">先明确为什么要使用杂项设备</span><span lang="en-US" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">,</span><span lang="zh-CN" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">杂项设备相对于字符设备有什么优越的地方</span>

本文博客地址:http://blog.csdn.net/b2997215859/article/details/47183987

转载须注明来源:http://blog.csdn.net/b2997215859/article/details/47183987


这里转载知乎上的说法还是有道理的

第一,节省主设备号:

使用普通字符设备,不管该驱动的主设备号是静态还是动态分配,都会消耗一个主设备号,这太浪费了。而且如果你的这个驱动最终会提交到内核主线版本上的话,需要申请一个专门的主设备号,这也麻烦。

如果使用misc驱动的话就好多了。因为内核中已经为misc驱动分配了一个主设备号。当系统中拥有多个misc设备驱动时,那么它们的主设备号相同,而用子设备号来区分它们。

 

第二,使用简单:

有时候驱动开发人员需要开发一个功能较简单的字符设备驱动,导出接口让用户空间程序方便地控制硬件,只需要使用misc子系统提供的接口即可快速地创建一个misc设备驱动。

当使用普通的字符设备驱动时,如果开发人员需要导出操作接口给用户空间的话,需要自己去注册字符驱动,并创建字符设备class以自动在/dev下生成设备节点,相对麻烦一点。而misc驱动则无需考虑这些,基本上只需要把一些基本信息通过structmiscdevice交给misc_register()去处理即可。

 

本质上misc驱动也是一个字符设备驱动,可能相对特殊一点而已。在drivers/char/misc.c的misc驱动初始化函数misc_init()中实际上使用了MISC_MAJOR(主设备号为10)并调用register_chrdev()去注册了一个字符设备驱动。同时也创建了一个misc_class,使得最后可自动在/dev下自动生成一个主设备号为10的字符设备。总的来讲,如果使用misc驱动可以满足要求的话,那么这可以为开发人员剩下不少麻烦。

来自 <http://www.zhihu.com/question/21508904>

-------------------------------------------------------------------------------------------------------------------

另外关于miscdevie的一些方法在内核中的描述这里有一篇博文说的比较好基本上都点到了

 

在Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。在内核中用struct miscdevice表示miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。miscdevice的API实现在drivers/char/misc.c中。

 

来自 <http://blog.csdn.net/angle_birds/article/details/8330407>

--------------------------------------------------------------------------------------------------------------------

以下是杂项设备的示例代码示例代码来源于

http://blog.csdn.net/xhz1234/article/details/38750091

 

#include<linux/module.h>  

#include<linux/kernel.h>

#include<linux/fs.h>

#include<linux/miscdevice.h>

 

#define DEVICE_NAME "my_misc_dev"    //声明设备名称

 

static intmisc_open(struct inode *nd, struct file *filp)

{

int major = MAJOR(nd->i_rdev);    //获取主设备号

int minor = MINOR(nd->i_rdev);   //获取次设备号

printk("misc_open,major=%d,minor=%d\n",major,minor);

return 0;

}

 

static ssize_tmisc_read(struct file *f, char __user *u, size_t sz, loff_t *off)

{

printk("Inthe misc_read() function!\n");

return0;

}

 

 

//.owner = THIS_MODULE是指定成员初始化搜了一下没怎么弄懂怎么回事先放着以后再深入研究

//另外俩个设备方法就是readopen

structfile_operations misc_ops =

{

.owner = THIS_MODULE,

.open = misc_open,

.read = misc_read,

};

 

 

 

//Linux系统使用一个miscdevice结构体来描述结构体

//这是内核中对miscdevice的定义可以使用source Insight来查看

//在实际使用中只需要实现次设备号minor、设备名称name、函数操作集fops即可

//MISC_DYNAMIC_MINOR是系统自动配置次设备号

struct miscdevicemisc =

{

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &misc_ops,

};

 

staticint demo_init(void)  

{

intret;

ret = misc_register(&misc);   

//misc_register的作用其实是用主标号10调用register_chrdev_region

//具体可以查一下杂项设备的主设备号CRT终端上cat /proc/devices就能看到misc的主设备号了

//该方法可以自己创建设备节点用于联系驱动程序和应用程序

//如果注册成功就返回0否则返回负数

//该函数的参数是一个名为misc的结构体

printk(DEVICE_NAME"\t initialized %s!\n",(0==ret)?"successed":"failed");

 

returnret;

}

 

 

//misc_deregister()注销杂项设备

static void demo_exit(void)

{

misc_deregister(&misc);

printk("Removing misc_dev...!\n");

}

 

module_init(demo_init);

module_exit(demo_exit);

 

MODULE_LICENSE("GPL");

MODULE_DESCRIPTION("Anmisc device driver as an example");

1 0