生成杂项设备设备节点

一部分驱动要和上层通信,就需要生成设备节点,上层应用通过一套标准的接口函数调用设备节点就可以控制底层以及和底层通信。Linux中设备节点是通过“mknod”命令来创建的。一个设备节点其实就是一个文件,Linux中称为设备文件。在Linux中,所有的设备访问都是通过文件的方式,一般的数据文件称为普通文件,设备节点称为设备文件。

为什么会引入杂项设备?
第一、节省主设备号
如果所有的驱动都是用字符设备,那么所有的设备号很快就用完了,总共就255个主设备号。
第二、驱动写起来相对简单
如果直接使用封装好的杂项设备,那么就可以减少一步注册主设备号的过程

在Ubuntu 系统上,如下图所示,使用命令“cat /proc/misc”,可以查看到 PC机 Ubuntu 系统的杂项设备。启动开发板,在超级终端中输入命令“cat /proc/misc”也可以查看对应的杂项设备。
杂项设备的主设备号是 10,在任何 Linux 系统中它都是固定的。一般将 Linux 驱动分为字符设备、块设备、网络设备,但是这个分类不能包含所有的设备,所以将无法归类的设备统称为杂项设备,杂项设备可能用到字符设备、快设备、网络设备中的一项或者多项设备。
杂项设备的头文件在“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);
杂项设备卸载函数;一般是在 remove 中用于卸载驱动。

结构体 miscdevice 中参数很多,下面几个是常用的。
int .minor;设备号,赋值为 MISC_DYNAMIC_MINOR,这个宏定义可以查到为 10
const char *name;设备名称

file_operations 结构体的成员函数属于驱动设计的主体内容,里面的函数和 Linux 系统给应用程序提供系统接口一一对应。
file_operations 结构体在头文件“include/linux/fs.h”中,使用命令“vim include/linux/fs.h”打开头文件。

file_operations结构体中包含的参数非常多。
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 口的控制。

注册杂项设备
将头文件“linux/platform_device.h”、“linux/miscdevice.h”以及
“linux/fs.h”添加到文件中。然后定义一个DEVICE_NAME,将其赋值,这个设备节点名称和前面介绍的注册设备名称是不同的。
向添加 hello_probe 中添加注册杂项设备的函数 misc_register,将 miscdevice 参数定义为 hello_dev。

定义 miscdevice hello_dev结构体。
参数 minor 为 MISC_DYNAMIC_MINOR,也就是 10
参数 name 为 DEVICE_NAME
参数 fops 为“**_ops”

定义file_operations结构体,其中有四个参数。
参数 owner 为 THIS_MODULE,
参数 open,
参数 release ,
参数 unlocked_ioctl

对 **_ops 结构体中的函数进行定义,包括ioctl函数、release函数、open函数。

编写Makefile文件,生成模块文件,将其拷贝到开发板中,使用“insmod”命令加载驱动文件,使用“ls /dev”命令,可以看到新生成的设备节点。使用“rmmod”命令卸载驱动,使用“ls /dev”命令,发现设备节点已经去掉。

设备节点和驱动名以及设备名没有统一关系,不过最好设备节点的命名便于识别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值