杂项设备驱动--Linux驱动学习(2)

杂项设备驱动

【学习笔记】

简介

作用

Linux杂项驱动出现的意义在于:有很多简单的外围字符设备,它们功能相对简单,一个设备占用一个主设备号对于内核资源来说太浪费。
所以对于这些简单的字符设备它们共用一个主设备号,不同的设备使用不同的次设备号.

特点

杂项设备是字符设备的一种,可以自动生成设备节点

系统中有很多杂项设备,可以输入cat/proc/misc命令来查看

杂项设备比字符设备代码简单

杂项设备的主设备号是相同的,固定均为10,次设备号是不同的,主设备号相同就可以节省内核的资源

主设备号和次设备号:

主设备号在Linux系统里边是唯一的,次设备号不一定唯一。

设备号是计算机识别设备的一种方式,主设备号相同就被视为同一类设备

主设备号可以看作是电话号码的区号,次设备号相当于电话号码

主设备号可以通过命令cat /proc/devices来查看

杂项设备

杂项设备的描述

定义在内核源码路径:include/linux/miscdevice.h

...
#define MISC_DYNAMIC_MINOR 255 //表示会自动的分配次设备号:即动态分配

struct miscdevice {
	int minor;//次设备号
	const char *name;//设备节点名字
	const struct file_operations *fops;//文件操作集
	struct list_head list;
	struct device *parent;//父设备名
	struct device *this_device;//自己的设备
	const struct attribute_group **groups;
	const char *nodename;
	umode_t mode;
};

extern int misc_register(struct miscdevice *misc);//注册杂项设备
extern int misc_deregister(struct miscdevice *misc);//注销杂项设备
...

file_operations文件操作集定义在include/linux/fs.h下面

image

里边的每一个结构体成员都要对应一个调用。

注册杂项设备的流程

(1)填充miscdevice这个结构体

(2)填充file_operations这个结构体

(3)注册杂项设备并生成设备节点

编写杂项设备驱动

一个简单的杂项驱动代码

#include <linux/init.h>
#include <linux/module.h>
//增加两个头文件
#include <linux/miscdevice.h>
#include <linux/fs.h>
//第2步:填充文件操作集
struct file_operations misc_fops = {
	.owner = THIS_MODULE	//这里简单的填充一个owner
};

//第1步:填充杂项设备结构体
struct miscdevice misc_dev = {
	.minor = MISC_DYNAMIC_MINOR,	//次设备号,动态分配
	.name = "hello_misc",			//设备节点的名字
	.fops = &misc_fops				//填充文件操作集
};
//第3步;注册到内核
static int misc_init(void){
	int ret;
	ret = misc_register(&misc_dev);//存储注册的地址
	//判断是否注册成功
	if(ret < 0){
		printk("misc registe is error\n");
		return -1;
	}
	printk("misc registe is successful\n");  //内核里不能使用c语言库,所以不能用printf
	return 0;
}
//卸载驱动
static void misc_exit(void){
	misc_deregister(&misc_dev);
	printk("misc bye bye\n");
}

//入口和出口
module_init(misc_init);
module_exit(misc_exit);

//声明许可证
MODULE_LICENSE("GPL");

接下来把驱动编译到内核即可

然后使用杂项设备生成了设备节点

整理自嵌入式学习之Linux驱动篇

posted @ 2021-05-11 22:42  AkiyamaYusuke  阅读(46)  评论(0编辑  收藏  举报