Linux中MISC驱动简介及其简单使用
Linux中MISC驱动简介及其简单使用
- 1、MISC 设备驱动简介
- 2、一般操作流程
- 1、定义以及填充结构体
- 2、注册MISC 设备
- 3、卸载MISC 设备
Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。正因为简单,所以它通常嵌套在platform 总线驱动中,配合总线驱动达到更复杂,多功能的效果。
1、MISC 设备驱动简介
MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。他可以夹杂到其它结构体当中,以丰富驱动的血肉。一般情况下,我们是将它嵌套在其它结构当中的。
我们需要向 Linux 注册一个 miscdevice 设备, miscdevice是一个结构体,定义在文件 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 struct attribute_group **groups;const char *nodename;umode_t mode;
};
所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。随着 Linux字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号, MISC 设备驱动就用于解决此问题。 MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设备驱动可以简化字符设备驱动的编写。
minor:次设备号
name 就是此 MISC 设备名字,当此设备注册成功以后就会在/dev 目录下生成一个名为 name的设备文件。
fops 就是字符设备的操作集合, MISC 设备驱动最终是需要使用用户提供的 fops操作集合。
parent:这个指针决定了在/sys文件系统里面,它是创建在哪个目录下。如果为空就在/sys/class根目录下创建,如果不为空都是在/sys/class/misc 文件下面创建的一些属性文件。
this_device:这个就代表当前设备的设备结构体,这个在查找扩充数据结构时,非常有用。
2、一般操作流程
1、定义以及填充结构体
定义一个 MISC 设备(miscdevice 类型)以后我们需要设置 minor、 name 和 fops 这三个成员变量。 minor 表示子设备号, MISC 设备的主设备号为 10,这个是固定的,需要用户指定子设备号, Linux 系统已经预定义了一些 MISC 设备的子设备号,这些预定义的子设备号定义在include/linux/miscdevice.h 文件中,如下所示:
#define PSMOUSE_MINOR 1
#define MS_BUSMOUSE_MINOR 2 /* unused */
#define ATIXL_BUSMOUSE_MINOR 3 /* unused */
/*#define AMIGAMOUSE_MINOR 4 FIXME OBSOLETE */
#define ATARIMOUSE_MINOR 5 /* unused */
#define SUN_MOUSE_MINOR 6 /* unused */
#define APOLLO_MOUSE_MINOR 7 /* unused */
#define PC110PAD_MINOR 9 /* unused */
/*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */
#define WATCHDOG_MINOR 130 /* Watchdog timer */
#define TEMP_MINOR 131 /* Temperature Sensor */
#define RTC_MINOR 135
#define EFI_RTC_MINOR 136 /* EFI Time services */
#define VHCI_MINOR 137
#define SUN_OPENPROM_MINOR 139
#define DMAPI_MINOR 140 /* unused */
#define NVRAM_MINOR 144
#define SGI_MMTIMER 153
#define STORE_QUEUE_MINOR 155 /* unused */
#define I2O_MINOR 166
#define MICROCODE_MINOR 184
#define VFIO_MINOR 196
#define TUN_MINOR 200
#define CUSE_MINOR 203
#define MWAVE_MINOR 219 /* ACP/Mwave Modem */
#define MPT_MINOR 220
#define MPT2SAS_MINOR 221
#define MPT3SAS_MINOR 222
#define UINPUT_MINOR 223
#define MISC_MCELOG_MINOR 227
#define HPET_MINOR 228
#define FUSE_MINOR 229
#define KVM_MINOR 232
#define BTRFS_MINOR 234
#define AUTOFS_MINOR 235
#define MAPPER_CTRL_MINOR 236
#define LOOP_CTRL_MINOR 237
#define VHOST_NET_MINOR 238
#define UHID_MINOR 239
#define MISC_DYNAMIC_MINOR 255
我们在使用的时候可以从这些预定义的子设备号中挑选一个,当然也可以自己定义,只要这个子设备号没有被其他设备使用接口。
name 就是此 MISC 设备名字,当此设备注册成功以后就会在/dev 目录下生成一个名为 name的设备文件。
fops 就是字符设备的操作集合, MISC 设备驱动最终是需要使用用户提供的 fops操作集合。
2、注册MISC 设备
当设置好 miscdevice 以后就需要使用 misc_register 函数向系统中注册一个 MISC 设备,此函数原型如下:
int misc_register(struct miscdevice * misc)
函数参数和返回值含义如下:
misc:要注册的 MISC 设备。
返回值: 负数,失败; 0,成功。
此函数可以省去一堆的字符设备注册的过程,如下:
alloc_chrdev_region(); /* 申请设备号 */
cdev_init(); /* 初始化 cdev */
cdev_add(); /* 添加 cdev */
class_create(); /* 创建类 */
device_create(); /* 创建设备 */
3、卸载MISC 设备
当我们卸载设备驱动模块的时候需要调用 misc_deregister 函数来注销掉 MISC 设备,函数原型如下:
int misc_deregister(struct miscdevice *misc)
函数参数和返回值含义如下:
misc:要注销的 MISC 设备。
返回值: 负数,失败; 0,成功
此函数可以省去一堆的字符设备注销的过程,如下:
cdev_del(); /* 删除 cdev */
unregister_chrdev_region(); /* 注销设备号 */
device_destroy(); /* 删除设备 */
class_destroy(); /* 删除类 */
Linux中MISC驱动简介及其简单使用相关推荐
- Linux 中的驱动开发的初学者体会
Linux 中的驱动开发的初学者体会 很多年前,心里就存下这样一个愿望.就是把Linux 的驱动开发搞清楚. 但是一开始上上这样的开发难度天大了,对着一堆的寄存器发愁. 于是就从简单的STM8,PIC ...
- linux中/dev/shm简介与大小修改
linux中/dev/shm简介与大小修改 文章目录 linux中/dev/shm简介与大小修改 简介 实操 验证/dev/shm存储位置 修改/dev/shm 大小 简介 linux中/dev目录下 ...
- linux 别名,Linux中的别名就这么简单,如何使用和创建永久别名?
原标题:Linux中的别名就这么简单,如何使用和创建永久别名? 输入文本和记命令是Linux命令行爱好者的缺点之一.如果你需要输入并记住同样长的命令,这可能会降低终端的工作效率. 如果您可以用自己的短 ...
- Linux中用户的简介与管理
女主宣言 众所周知,linux是一个多用户.多任务的操作系统.那么linux是如何区分和认证用户的,系统对每个用户的授权是如何管理的,出现问题时是如何追朔每个用户在系统内的操作记录,这些就涉及到了li ...
- linux的swap与memory,【Linux】Linux中Swap与Memory内存简单介绍
背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇.Linux的各种设计思想和使用也被传承(当然不乏各种黑Linux,而且黑的漂亮).Linux的很多独特的设计,对性 ...
- linux中spi驱动框架
原 linux中spi驱动框架 2016年09月14日 15:57:06 andylauren 阅读数:403 <span class="tags-box artic-tag-box& ...
- linux系统网络驱动简介
网络设备驱动简介 网络设备驱动是linux内核中三大类设备驱动之一,它用来完成高层网络协议的底层数据传输及设备控制. 网络设备与其他两种设备的区别: 网络接口不存在于linux的文件系统中,及/dev ...
- linux 字符设备驱动测试,一个简单字符型设备驱动及其测试
驱动对一些人来说很难,而对一些人来说很容易.窃以为,理解简单设备驱动模型不难,深入理解并与Linux内核设计联系到一起需要花费时间.对于移植者来说,如何将自己自定义的模块天衣无缝放到内核中,是比较重要 ...
- Linux绘图函数与驱动,Linux中与驱动相关的ioctl函数
一: ioctl函数的作用 ioctl用于向设备发控制和配置命令 ,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据.也就是说,read/ ...
- [转]Linux中常见目录简介
学习一个东西只有去了解它的本源才能更好的利用它. 一.根目录下的 首先介绍一下linux中的根目录下的文件夹的作用: 目录 说明 备注 /bin /sbin 保存系统命令 /bin所有用户都能执 ...
最新文章
- Python自动化开发学习6
- Painting A Board --POJ 1691
- Anaconda | CentOS7 -解决 Python2和Python3共存
- 好程序员web前端CSS选择符(选择器):表示要定义样式的对象
- 一次thinkphp框架 success跳转卡顿问题的解决
- listview频繁刷新报错
- 可转债数据一览表集思录_可转债股票数据一览表
- javaee实验报告心得_JavaEE实验报告.doc
- 转载 Microsoft .NET Pet Shop 4 架构与技术分析
- Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found
- 20190910每日一句 你有勇气直面自己的恐惧吗?
- Android常用应用市场和应用包名
- 金山词霸2010牛津旗舰破解版【最完美的】的使用方案
- 物联网linux系统设计,Ostro:面向物联网优化的基于 Linux的开源操作系统
- Rational Rose 7.0安装教程
- acg-faka--功能丰富的发卡二次元商城源码
- bootloader 启动过程
- 运行官方byfn.sh跑通网络
- 解决bootstrap中glyphicon无法显示图标只显示方框的问题
- 下载python的步骤ios_python苹果安装教程,ipad上怎么安装python?
热门文章
- 一些临时邮箱服务网站
- android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码...
- net系统安全开发手册
- 看完Jeff Dean新论文,我再也不相信大厂的鬼话了
- 大工计算机英语考试,大工15春《专业英语(计算机英语)》在线测试123
- 知识付费系统源码(开源知识付费系统平台下载)
- mysql报错error during_MySQL数据库之MYSQL报Fatal error encountered during command execution.错误的解决方法...
- 虚拟机Ubuntu21.04全屏显示
- Python selenium 简单的实现大麦网自动购票过程
- 爬虫项目:大麦网分析