栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

02.驱动学习复盘(杂项设备)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

02.驱动学习复盘(杂项设备)

1.Linux三大设备驱动:

字符设备:IO的传输过程是以字符为单位的,没有缓冲。比如I2C,SPI都是字符设备。

块设备:IO的传输过程是以块为单位的。跟存储相关的都属于块设备,比如TF卡。

网络设备:与前两个不一样,是以socket套接字来进行访问的。

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

我们的系统里有很多杂项设备,可以输入 cat /proc/misc 命令来查看。

3.杂项设备的主设备号是相同的,次设备号是不同的。主设备号相同可以节省内核资源。

4.设备号包含主设备号和次设备号,主设备号在Linux系统里面是唯一的,次设备号不一定。

主设备号相同的被视为同一类设备。查看:cat /proc/devices

杂项设备的主设备号是10,也就是说我们设计的驱动都是misc下面的子设备。

5.杂项设备的描述,定义在内核源码路径:  include/linux/miscdevice.h

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

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

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

有很多成员,里面的一个结构体成员都对应一个调用。

7.注册杂项设备的流程。

(1)填充 miscdevice 这个结构体

(2)填充 file_operations 这个结构体

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

8.上代码!

//包含宏定义的头文件
#include 
//包含初始化加载模块的头文件
#include 
//杂项设备头文件
#include 
//文件操作符头文件
#include 

//定义文件操作符
struct file_operations misc_fops = {
	.owner = THIS_MODULE
};

//杂项设备结构体
struct miscdevice misc_dev = {
	//次设备号动态分配
	.minor = MISC_DYNAMIC_MINOR,
	//设备节点的名字
	.name = "hello_misc",
	//文件操作符
	.fops = &misc_fops
};

//装载卸载函数实体
static int __init misc_init(void)
{
	int ret;
	//注册杂项设备
	ret = misc_register(&misc_dev);

	if(ret < 0)
	{
		printk("misc register is errorn");
		return -1;
	}
	
	printk("misc_initn");
	return 0;
}

static void __exit misc_exit(void)
{
	//卸载杂项设备
	misc_deregister(&misc_dev);
	
	printk("misc_exitn");
}

//装载卸载函数声明
module_init(misc_init);
module_exit(misc_exit);

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/468242.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号