手把手教你从零实现Linux misc设备驱动一(基于友善之臂4412开发板)

简介: 关于如何来写一个misc设备,在前面有篇文章已经介绍了大致的流程,现在就让我们来实现一个最简单的misc设备驱动。http://blog.csdn.net/morixinguan/article/details/52700146关于前面的字符设备有以下四篇文章,可以做参考:http://blog.
关于如何来写一个misc设备,在前面有篇文章已经介绍了大致的流程,现在就让我们来实现一个最简单的misc设备驱动。
http://blog.csdn.net/morixinguan/article/details/52700146
关于前面的字符设备有以下四篇文章,可以做参考:
http://blog.csdn.net/morixinguan/article/details/55002774
http://blog.csdn.net/morixinguan/article/details/55003176
http://blog.csdn.net/morixinguan/article/details/55004646
http://blog.csdn.net/morixinguan/article/details/55006654

为什么要学习misc设备的编程?
因为,如果我们 每个驱动设备都要像最初那样子去写一个字符设备驱动一样,要分配主设备号,次设备号,实现对应的文件操作函数等等的步骤,未免就有点多了,而且也不好记住它,为此,Linux内核提供了一系列偷懒的技巧,那就是实现了misc设备,其实misc设备,也算是字符设备,只不过对字符设备进行了封装,看看下面的介绍就知道了。
我们先来看看misc设备的结构体:
//miscdevice结构体
struct miscdevice  {
	//次设备号一般赋值为MISC_DYNAMIC_MINOR---->由内核自动去分配次设备号
	int minor;
	//misc设备的名称
	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;
};
这里,我们写最简单的misc设备,我们只需要关注minor(次设备号),name(设备名称),fops(文件操作函数).
看到这里我们可以想象到,misc设备是对字符设备做了一个再次的封装,而且,在misc设备中,主设备号都是一样的,都是10,只有次设备号不同,当我们不知道内核中应该去分配那个此设备号时,可以直接给minor赋值为MISC_DYNAMIC_MINOR这个宏,意思就是由内核来帮我们分配次设备号。
name就不用说了,如果设备注册成功,在根文件系统/dev/下就会有注册设备后的name。
fops就是一系列的文件操作函数啦,什么open , read ,write , ioctl等等,很多,跟写字符设备是一样的。
那么,接下来,我们来看一个例子,这里我就省略我的Makefile还有Kcofig了,可以参考前面的文章,轻松实现。

实现一个简单的Misc设备驱动程序(在TINY4412开发板上编写)
cdev_test.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/delay.h>
 
#include <linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>

//misc设备名称--->就是字符设备
#define DEVICE_NAME "misc_dev"
//实现open函数
int tiny4412_misc_dev_open(struct inode *inode, struct file *filp)
{
	printk("tiny4412 misc dev open!\n");
	return 0 ;
}
//实现close函数
int tiny4412_misc_dev_close(struct inode *inode, struct file *filp)
{
	printk("tiny4412 misc dev close!\n");
	return 0 ;
}
//初始化文件操作结构体
struct file_operations tiny4412_file_ops = {
	.owner = THIS_MODULE ,
	.open = tiny4412_misc_dev_open,
	.release = tiny4412_misc_dev_close,
};
//初始化misc设备结构体
struct miscdevice tiny4412_misc_dev = {
	//由内核自动分配次设备号
	.minor = MISC_DYNAMIC_MINOR ,
	//初始化设备名称
	.name = DEVICE_NAME ,
	//初始化文件操作结构体
	.fops = &tiny4412_file_ops,	
};


static int __init tiny4412_misc_dev_init(void) 
{
	int ret_error ;
	//注册misc设备
	int ret = misc_register(&tiny4412_misc_dev);
	if(ret != 0){
	   ret_error = ret ;
	   printk("misc register fair!\n");
	   goto fair ;
	}
	printk("misc init success!\n");	
	return ret ;
	fair:
	return ret_error ;
}

static void __exit tiny4412_misc_dev_exit(void) 
{
	//注销misc设备
	misc_deregister(&tiny4412_misc_dev);
}

module_init(tiny4412_misc_dev_init);
module_exit(tiny4412_misc_dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("YYX add misc driver");
然后,将驱动程序编译后,讲zImage下载到板子上。
我们可以看到,在开机的时候,misc init成功打印,证明,misc设备注册成功。
接下来,到安卓的根文件系统里,我们打开/dev/下,可以看到设备名称为misc_dev的设备:
我们可以看到,misc_dev的主设备号是10,次设备号是39
接下来,cat /proc/misc:

说明,misc已经被注册到proc文件系统中去了。
下节,我们将实现一个真正的misc设备驱动。




目录
相关文章
|
12天前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
44 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
2月前
|
数据采集 编解码 运维
一文讲完说懂 WowKey -- WowKey 是一款 Linux 类设备的命令行(CLT)运维工具
WowKey 是一款面向 Linux 类设备的命令行运维工具,支持自动登录、批量执行及标准化维护,适用于企业、团队或个人管理多台设备,显著提升运维效率与质量。
|
3月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
172 0
|
5月前
|
安全 Ubuntu Linux
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
158 0
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
|
6月前
|
运维 安全 Linux
试试Linux设备命令行运维工具——Wowkey
WowKey 是一款专为 Linux 设备设计的命令行运维工具,提供自动化、批量化、标准化、简单化的运维解决方案。它简单易用、高效集成且无依赖,仅需 WIS 指令剧本文件、APT 账号密码文件和 wowkey 命令即可操作。通过分离鉴权内容与执行内容,WowKey 让运维人员专注于决策,摆脱繁琐的交互与执行细节工作,大幅提升运维效率与质量。无论是健康检查、数据采集还是配置更新,WowKey 都能助您轻松应对大规模设备运维挑战。立即从官方资源了解更多信息:https://atsight.top/training。
|
6月前
|
数据采集 运维 安全
Linux设备命令行运维工具WowKey问答
WowKey 是一款用于 Linux 设备运维的工具,可通过命令行手动或自动执行指令剧本,实现批量、标准化操作,如健康检查、数据采集、配置更新等。它简单易用,只需编写 WIS 指令剧本和 APT 帐号密码表文件,学习成本极低。支持不同流派的 Linux 系统,如 RHEL、Debian、SUSE 等,只要使用通用 Shell 命令即可通吃Linux设备。
|
28天前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
104 16
|
20天前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
|
3月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
669 13
|
4月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
558 21