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

02.驱动学习复盘(杂项设备),第1张

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");

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5443730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存