在虚拟机的 Ubuntu 系统上,如下图所示,使用命令“cat /proc/misc”,可以查看到 PC

机 Ubuntu 系统的杂项设备。

启动开发板,在超级终端中输入命令“cat /proc/misc”也可以查看对应的杂项设备。

前面介绍过主设备号只有 256 个,设备又非常多,所以引入了子设备号。

其中杂项设备的主设备号是 10,在任何 Linux 系统中它都是固定的。

一般将 Linux 驱动分为字符设备、块设备、网络设备,但是这个分类不能包含所有的设备,

所以将无法归类的设备统称为杂项设备,杂项设备可能用到字符设备、快设备、网络设备中的

一项或者多项设备。

如下图所示,进入源码文件夹,使用命令“ls drivers/char/”,可以查看到杂项设备的文

件“misc.c”。

如上图所示,可以看到它被编译为“misc.o”,也就是被编译进了内核 zImage 文件。

使用命令“vim drivers/char/Makefile”打开杂项设备文件的编译文件。如下图所示,可

以看到,这个文件相当于被强制编译的。

杂项设备设备部分完全制作好了,只需要添加子设备,非常方便,在后面实验操作中大家

就可以感受到。

这样杂项设备的引入即解决了设备号数量少的问题,又降低了使用难度,还能防止碎片化,

一举多得。

8.4 杂项设备注册函数以及结构体

杂项设备的头文件在“include/linux/miscdevice.h”,有两个需要掌握的函数和一个结

构体,如下图所示,在源码目录下使用命令“vim include/linux/miscdevice.h”。

如下图所示,到最底行。

有两个函数。

extern int misc_register(struct miscdevice * misc);

杂项设备注册函数;一般在 probe 中调用,参数是 miscdevice

extern int misc_deregister(struct miscdevice *misc);

杂项设备卸载函数;一般是在 hello_remove 中用于卸载驱动。

结构体 miscdevice 中参数很多,下面几个是常用的。

int .minor;设备号,赋值为 MISC_DYNAMIC_MINOR,这个宏定义可以查到为 10

const char *name;设备名称

const struct file_operations *fops;file_operations 结构体,在下一小节专门介绍。

ions 结构体

file_operations 结构体的成员函数属于驱动设计的主体内容,里面的函数和 Linux 系统

给应用程序提供系统接口一一对应。

file_operations 结构体在头文件“include/linux/fs.h”中,如下图所示,使用命令“vim

include/linux/fs.h”打开头文件。

查找“file_operations”,如下图所示,在 1546 行可以找到其定义。

如上图所示,可以看到结构体中包含的参数非常多。

struct module *owner;一般是 THIS_MODULE。

int (*open) (struct inode *, struct file *);对应上层的 open 函数,打开文件。

int (*release) (struct inode *, struct file *);对应上层的 close 函数,打开文件操作之后一

般需要关闭。

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);读函数,上层应用从底层读取

函数。

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);写函数,上层应用向底

层传输数据。

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);这个函数功能和写

函数稍微有点重合,但是这个函数占用的内存非常小,主要针对 IO 口的控制。

其它结构体中的参数,具体用到再介绍。

简单程序实例:

#include

#include

/*驱动注册的头文件,包含驱动的结构体和注册和卸载的函数*/

#include

/*注册杂项设备头文件*/

#include

/*注册设备节点的文件结构体*/

#include

#define DRIVER_NAME "hello_ctl"

#define DEVICE_NAME "hello_ctl123"

MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("songmao");

static long hello_ioctl( struct file *files, unsigned int cmd, unsigned long arg){

printk("cmd is %d,arg is %d\n",cmd,arg);

return 0;

}

static int hello_release(struct inode *inode, struct file *file){

printk(KERN_EMERG "hello release\n");

return 0;

}

static int hello_open(struct inode *inode, struct file *file){

printk(KERN_EMERG "hello open\n");

return 0;

}

static struct file_operations hello_ops = {

.owner = THIS_MODULE,

.open = hello_open,

.release = hello_release,

.unlocked_ioctl = hello_ioctl,

};

static  struct miscdevice hello_dev = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &hello_ops,

};

static int hello_probe(struct platform_device *pdv){

printk(KERN_EMERG "\tinitialized\n");

misc_register(&hello_dev);

return 0;

}

static int hello_remove(struct platform_device *pdv){

printk(KERN_EMERG "\tremove\n");

misc_deregister(&hello_dev);

return 0;

}

static void hello_shutdown(struct platform_device *pdv){

;

}

static int hello_suspend(struct platform_device *pdv,pm_message_t pmt){

return 0;

}

static int hello_resume(struct platform_device *pdv){

return 0;

}

struct platform_driver hello_driver = {

.probe = hello_probe,

.remove = hello_remove,

.shutdown = hello_shutdown,

.suspend = hello_suspend,

.resume = hello_resume,

.driver = {

.name = DRIVER_NAME,

.owner = THIS_MODULE,

}

};

static int hello_init(void)

{

int DriverState;

printk(KERN_EMERG "HELLO WORLD enter!\n");

DriverState = platform_driver_register(&hello_driver);

printk(KERN_EMERG "\tDriverState is %d\n",DriverState);

return 0;

}

static void hello_exit(void)

{

printk(KERN_EMERG "HELLO WORLD exit!\n");

platform_driver_unregister(&hello_driver);

}

module_init(hello_init);

module_exit(hello_exit);

linux 杂项设备,浅谈 MISC杂项设备相关推荐

  1. android绑定手机设备,浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID

    场景 : 客户提出一个问题就是把用户的登录记录和设备绑定到一起,就是每个人都是固定的设备(可能是安全因素吧). 一开始想的是回去设备的IMEI号和用户账号绑定起来,结果发现IMEI不对外开发,只能另寻 ...

  2. Linux内核之浅谈内存寻址

    Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...

  3. linux 网卡virtio,浅谈linux设备中virtio组织关系

    当我们查看Linux kernel.C的Virtio代码时,我们会发现许多相关的文件.那么,verdio,我们只有Virtio\UC',Virtio\ubk.C. 美德\ubalon.C. 等等.与这 ...

  4. misc类设备驱动2——misc类设备的简介

    以下内容源于朱有鹏嵌入式课程的学习与整理,如有其侵权请告知删除. 一.misc类设备的含义 1.名字含义 misc是英文Miscellaneous的缩写,中文意思是"杂项.混杂", ...

  5. Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用

    想了解浅谈Linux条件变量的使用的相关内容吗,在本文为您仔细讲解linux 条件变量的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,条件变量,下面大家一起来学习吧. Linu ...

  6. [Linux学习笔记] 浅谈信号(文章含不少学习资源)

    百金买骏马,千金买美人,万金买爵禄,何处买青春? 目录 信号的概念 信号的种类: kill -l 命令可以查看信号列表 man 7 signal 查看信号详细内容 信号的产生 补充知识 Core Du ...

  7. 红帽linux挑战赛题目,浅谈红帽linux挑战赛(三)

    前言 当你不够强大的时候,你想要一个小小的机会,都没有:当你足够优秀的时候,你想要的一切都会主动来找你. 继上文 浅谈红帽linux挑战赛 浅谈红帽linux挑战赛(二) 继续介绍一下红帽挑战赛吧 红 ...

  8. linux安全加固浅谈

    难易程度:★★★ 阅读点:linux;python;web安全; 文章作者:xiaoye 文章来源:i春秋 关键字:网络渗透技术 前言 linux被越来越多的企业使用,因此掌握一些基本的linux安全 ...

  9. 浅谈物联网时代设备加密的重要性

    随着物联网技术和互联网技术的日益发展,勒索病毒.工控安全.产线作业都面领着极大的威胁.智慧互联正在成为各个行业未来的发展方向,智慧互联包括物联网.万物互联,机器与机器,工业控制体系,信息化,也就是德国 ...

最新文章

  1. Current Biology | 以退为进——白逢彦组揭示酿酒酵母通过基因网络的逆向进化适应环境的新机制...
  2. LaTeX集合运算相关命令
  3. 网易会议开源指南 | 极速构建你的专属会议软件!
  4. python编程与下位机通讯_ros 与下位机通信
  5. 运维人员打字耍不要快_法考经验与教训 —— 打字
  6. 读写Excel 用 xlsxwriter,openpyxl 更灵活
  7. 数学连乘和累加运算符号_数学符号归纳
  8. task7b-TP53突变与否的TNBC病人基因表达相关性改变
  9. ac多模式匹配 java_Aho-Corasick 多模式匹配算法、AC自动机详解
  10. 华为认证: 高级redhat例题及答案
  11. 高中数学关于计算机的知识,高中数学必修三-算法概念基础知识解读
  12. CSS常用英语词汇大全
  13. 企业微信回调实现(java)
  14. python_pdf常规使用
  15. 剑14 TEST1 听力复盘
  16. 2020高交会第二十二届中国国际高新技术成果交易会
  17. Win32的时间类型
  18. UCOSII MailBox
  19. Codevs 1219 骑士游历
  20. STM32外部高速晶振不起振的故障分析

热门文章

  1. Python微信防撤回,基于itchat模块
  2. ( 算法树之几何 )【 皮克定理 】
  3. 苹果手机怎么用计算机打出字,使用苹果手机的注意啦!iphone输入法不好用?这些使用技巧教给你...
  4. ICP经营许可证与ICP备案有什么区别?
  5. 解线性方程组c语言实验报告,实验五线性方程组的迭代法实验
  6. 请你估算一下学校门口卖煎饼商贩的收入,使用哪些方式可以增加收入?
  7. PubWin服务器同步时间
  8. 高德地图实时定位接口的调用
  9. gird和flex布局
  10. 用计算机研究脑电波,可用于计算机硬盘识别及脑电波测量的量子传感器【中国科讯】...