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驱动简介及其简单使用相关推荐

  1. Linux 中的驱动开发的初学者体会

    Linux 中的驱动开发的初学者体会 很多年前,心里就存下这样一个愿望.就是把Linux 的驱动开发搞清楚. 但是一开始上上这样的开发难度天大了,对着一堆的寄存器发愁. 于是就从简单的STM8,PIC ...

  2. linux中/dev/shm简介与大小修改

    linux中/dev/shm简介与大小修改 文章目录 linux中/dev/shm简介与大小修改 简介 实操 验证/dev/shm存储位置 修改/dev/shm 大小 简介 linux中/dev目录下 ...

  3. linux 别名,Linux中的别名就这么简单,如何使用和创建永久别名?

    原标题:Linux中的别名就这么简单,如何使用和创建永久别名? 输入文本和记命令是Linux命令行爱好者的缺点之一.如果你需要输入并记住同样长的命令,这可能会降低终端的工作效率. 如果您可以用自己的短 ...

  4. Linux中用户的简介与管理

    女主宣言 众所周知,linux是一个多用户.多任务的操作系统.那么linux是如何区分和认证用户的,系统对每个用户的授权是如何管理的,出现问题时是如何追朔每个用户在系统内的操作记录,这些就涉及到了li ...

  5. linux的swap与memory,【Linux】Linux中Swap与Memory内存简单介绍

    背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇.Linux的各种设计思想和使用也被传承(当然不乏各种黑Linux,而且黑的漂亮).Linux的很多独特的设计,对性 ...

  6. linux中spi驱动框架

    原 linux中spi驱动框架 2016年09月14日 15:57:06 andylauren 阅读数:403 <span class="tags-box artic-tag-box& ...

  7. linux系统网络驱动简介

    网络设备驱动简介 网络设备驱动是linux内核中三大类设备驱动之一,它用来完成高层网络协议的底层数据传输及设备控制. 网络设备与其他两种设备的区别: 网络接口不存在于linux的文件系统中,及/dev ...

  8. linux 字符设备驱动测试,一个简单字符型设备驱动及其测试

    驱动对一些人来说很难,而对一些人来说很容易.窃以为,理解简单设备驱动模型不难,深入理解并与Linux内核设计联系到一起需要花费时间.对于移植者来说,如何将自己自定义的模块天衣无缝放到内核中,是比较重要 ...

  9. Linux绘图函数与驱动,Linux中与驱动相关的ioctl函数

    一:    ioctl函数的作用 ioctl用于向设备发控制和配置命令 ,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据.也就是说,read/ ...

  10. [转]Linux中常见目录简介

    学习一个东西只有去了解它的本源才能更好的利用它. 一.根目录下的 首先介绍一下linux中的根目录下的文件夹的作用: 目录 说明 备注 /bin   /sbin  保存系统命令 /bin所有用户都能执 ...

最新文章

  1. Python自动化开发学习6
  2. Painting A Board --POJ 1691
  3. Anaconda | CentOS7 -解决 Python2和Python3共存
  4. 好程序员web前端CSS选择符(选择器):表示要定义样式的对象
  5. 一次thinkphp框架 success跳转卡顿问题的解决
  6. listview频繁刷新报错
  7. 可转债数据一览表集思录_可转债股票数据一览表
  8. javaee实验报告心得_JavaEE实验报告.doc
  9. 转载 Microsoft .NET Pet Shop 4 架构与技术分析
  10. Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found
  11. 20190910每日一句 你有勇气直面自己的恐惧吗?
  12. Android常用应用市场和应用包名
  13. 金山词霸2010牛津旗舰破解版【最完美的】的使用方案
  14. 物联网linux系统设计,Ostro:面向物联网优化的基于 Linux的开源操作系统
  15. Rational Rose 7.0安装教程
  16. acg-faka--功能丰富的发卡二次元商城源码
  17. bootloader 启动过程
  18. 运行官方byfn.sh跑通网络
  19. 解决bootstrap中glyphicon无法显示图标只显示方框的问题
  20. 下载python的步骤ios_python苹果安装教程,ipad上怎么安装python?

热门文章

  1. 一些临时邮箱服务网站
  2. android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码...
  3. net系统安全开发手册
  4. 看完Jeff Dean新论文,我再也不相信大厂的鬼话了
  5. 大工计算机英语考试,大工15春《专业英语(计算机英语)》在线测试123
  6. 知识付费系统源码(开源知识付费系统平台下载)
  7. mysql报错error during_MySQL数据库之MYSQL报Fatal error encountered during command execution.错误的解决方法...
  8. 虚拟机Ubuntu21.04全屏显示
  9. Python selenium 简单的实现大麦网自动购票过程
  10. 爬虫项目:大麦网分析