杂项设备示例

本文由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

杂项设备示例

时间: 2025-01-07 17:22:24

杂项设备示例的相关文章

浅谈 MISC杂项设备

在虚拟机的 Ubuntu 系统上,如下图所示,使用命令"cat /proc/misc",可以查看到 PC 机 Ubuntu 系统的杂项设备. 启动开发板,在超级终端中输入命令"cat /proc/misc"也可以查看对应的杂项设备. 前面介绍过主设备号只有 256 个,设备又非常多,所以引入了子设备号. 其中杂项设备的主设备号是 10,在任何 Linux 系统中它都是固定的. 一般将 Linux 驱动分为字符设备.块设备.网络设备,但是这个分类不能包含所有的设备,

驱动学习5-生成设备节点(杂项设备)

杂项设备的头文件在"include/linux/miscdevice.h"中,需要用到两个函数和一个结构体 杂项设备注册函数:int misc_register(struct misdevice *misc); 杂项设备卸载函数:int mis_deregister(struct misdevice *misc): struct misdevice{ int minor; const char *name; const struct file_operations *fops; str

9、Linux驱动的杂项设备

杂项设备,是字符设备中的特殊,它的主设备号,是 10,不同的杂项设备,通过次设备号进行区分. 1.注册与注销 int misc_register(struct miscdevice * misc) 完成杂项设备的注册, int misc_deregister(struct miscdevice *misc) 可见,设备的注册和注销,都是设置到 struct miscdevice  结构体 2.struct miscdevice  结构体 struct miscdevice { int minor

Linux杂项设备与字符设备

.1 杂项设备驱动的引入 字符设备指那些必须以串行顺序依次进行访问,且没有经过系统快速缓冲的设备,了解了Linux内核中驱动的框架和组成,以及编写的步骤等.但是,当我们写的驱动程序多了之后,就会发现:部分硬件并不符合预先定义的字符设备的范畴,而且普通字符设备的主设备号不管是静态分配还是动态分配,都会消耗一个主设备号(目前一个系统最多只能有255个字符设备),比较浪费主设备号资源.因此,而引入了杂项设备驱动. 杂项设备是一个典型的字符设备(与接下来要介绍的输入子系统一样,呵呵),其主设备号固定为1

编写你的第一个Linux内核模块(目前校对到杂项设备)

想要开始黑掉核?没有线索不知道如何开始?让我们向你展示如何做- 内核编程通常被视为黑魔法.在Arthur C Clarke的意义上说,它可能是.Linux内核与用户空间有很大的不同:抛开漫不经心的态度,你要格外小心,因为在你代码中的一个小小的bug都会影响整个系统.这里没有简单的方法来做浮点运算.堆栈既固定又小,你写的代码总是异步所以你需要考虑并发性.尽管如此,Linux内核是一个非常大而复杂的C程序,对每个人都是开放的(阅读.学习.提高),而你也可以成为其中的一部分. "最简单的方法开始内核编

linux设备驱动之字符设备驱动模型(2)

在上一篇中我们已经了解了字符设备驱动的原理,也了解了应用层调用内核函数的机制,但是我们每次操作设备,都必须首先通过mknod命令创建一个设备文件名,比如说我们要打开u盘,硬盘等这些设备,难道我们还要自己创建,就如同刘老师常说的一句话,这也太山寨了吧,所以我们今天我们来点比较专业的,让函数帮我们自动创建: 在Linux 下,设备和驱动通常都需要挂接在一种总线上,总线有PCI.USB.I2C.SPI 等等,总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,一总线来管理设备和驱动函

PLATFORM设备驱动

字符设备,杂项设备虽然简单,但是在工程中,比如SDK中,通常都使用platform设备驱动来实现硬件驱动,为什么呢?先看看platform设备驱动的结构: platform由两部分组成:设备--platform_device和驱动--platform_driver.它们之间通过platform总线来绑定,这个我们不需要关心,内核里面的东西. platform总线是一个虚拟的总线,跟其他总线(比如:I2C,SPI,USB,PCIE)一样,当系统注册一个设备(platform_device)的时候,

linux设备号详解

原文:http://blog.csdn.net/zjjyliuweijie/article/details/7001383 linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取).块设备(有缓冲且可以随机存取).每个字符设备和块设备都必须有主.次设备号,主设备号相同的设 备是同类设备(使用同一个驱动程序).这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备").每个设备在 /dev 目录下都有一个对应的

linux驱动开发之misc类设备介绍

1.什么是misc设备? misc是英文的简称,中文名一般叫做杂项设备/杂散设备. 我们知道大部分的设备都有一个明确的分类class,有一些设备进行分类时不太好分,我们不知道一些设备到底应该分到哪一类设备中去,所以最后将这些不知道分到哪类中的设备给分到misc设备中,也就是分到了杂散类中.像蜂鸣器还有ADC设备都被分到了misc设备杂散类设备中.杂散类设备对应的是一个类的概念.随意进到系统中的/sys/class目录中就会看到一个misc目录,这个misc就是杂散类设备,进入到misc目录中,我