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

杂项设备驱动

【学习笔记】node

简介

做用

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

特色

杂项设备是字符设备的一种,能够自动生成设备节点ide

系统中有不少杂项设备,能够输入cat/proc/misc命令来查看学习

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

杂项设备的主设备号是相同的,固定均为10,次设备号是不一样的,主设备号相同就能够节省内核的资源code

主设备号和次设备号:

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

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

主设备号能够看做是电话号码的区号,次设备号至关于电话号码get

主设备号能够经过命令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驱动篇

相关文章
相关标签/搜索