首页 > 代码库 > 杂项设备示例

杂项设备示例

本文由xhz1234(徐洪志)编写,转载请注明出处。

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


    上一篇博文中,创建了一个字符设备驱动,如何用户程序要使用该驱动提供的功能,必须要手动创建一个字符设备文件节点。那有没有办法在insmod设备驱动模块时,自动创建对应的设备文件节点呢?答案是肯定的,其中一种方法是使用一种特殊的字符设备--杂项设备。

    原理:杂项设备的misc_init函数中,创建了一个misc class,同时注册了一个字符设备驱动,该字符设备的主设备号为10,在调用misc_register函数去注册一个杂项设备时,最终会创建一个设备节点,如果杂项设备的minor为MISC_DYNAMIC_MINOR,表示由系统分配一个次设备号。所以杂项设备最终还是主设备号为10的一个字符设备驱动。

    好了,我们看看示例代码:

杂项设备驱动程序:misc_dev.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>

#define DEVICE_NAME "my_misc_dev"

static int misc_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_t misc_read(struct file *f, char __user *u, size_t sz, loff_t *off)
{
	printk("In the misc_read() function!\n");
	return 0;
}

struct file_operations misc_ops = 
{
	.owner = THIS_MODULE,
	.open = misc_open,
	.read = misc_read,
};

struct miscdevice misc = 
{
	.minor = MISC_DYNAMIC_MINOR,
	.name = DEVICE_NAME,
	.fops = &misc_ops,
};

static int demo_init(void)
{
	int ret;
	ret = misc_register(&misc);
	printk(DEVICE_NAME "\t initialized %s!\n", (0==ret)?"successed":"failed");

	return ret;
}

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_AUTHOR("Huoxin");
MODULE_DESCRIPTION("An misc device driver as an example");

用户程序:usr_app.c

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

#define MISC_DEV_NAME "/dev/my_misc_dev"

int main(void)
{
	int ret;
	char buf[32];
	int fd = open(MISC_DEV_NAME, O_RDONLY|O_NDELAY);
	if(fd < 0)
	{
		printf("open file %s failed\n", MISC_DEV_NAME);
		return -1;
	}

	read(fd, buf, 32);
	close(fd);
	
	return 0;
}

编译misc_dev.c后,insmod对应的驱动模块,发现在/dev目录下自动创建了my_misc_dev的设备文件节点。

执行用户态程序对应的bin程序,dmesg得到如下打印:

Aug 22 08:00:27 xhz-Rev-1-0 kernel: [ 2286.814994] misc_open,major=10,minor=55
Aug 22 08:00:27 xhz-Rev-1-0 kernel: [ 2286.815002] In the misc_read() function!

程序源代码下载地址: http://huoxin.github.io/miscdevice