在注册驱动成功之后,若要与应用层进行通信,则需要生成设备节点。上层应用通过调用标准的接口函数调用设备节点来实现与底层驱动之间的通信。本节将介绍生成杂项设备的设备节点的操作流程
1. 杂项设备注册函数及结构体
所需头文件路径:
include/linux/miscdevice.h
注册和卸载函数:
extern int misc_deregister(struct miscdevice *misc);
- 两个函数中使用到的结构体:
struct miscdevice
结构为:
struct miscdevice {
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const char *nodename;
mode_t mode;
};
常用参数说明:
minor:设备号,赋值为MISC_DYNAMIC_MINOR
name:设备名
struct file_operations :该结构体的成员函数是驱动设计的主体内容,里面的函数和linux系统给应用程序提供的系统接口一一对应,是实现与应用层通信的关键;该结构体的头文件为:include/linux/fs.h
;其中包含参数众多,这里介绍几个常用的参数:
struct file_operations {
struct module *owner;
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
int (*open) (struct inode *, struct file *);
int (*release) (struct inode *, struct file *);
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
……
};
struct module * owner:一般设置为THIS_MODULE
read函数:读函数,拷贝数据到应用程序空间,即应用层从低层读取数据
write函数:写函数,从应用程序空间拷贝数据,即应用层向底层传输数据
open函数:对应上层的open函数,打开文件
release函数:对应应用层的close()函数,打开文件操作之后一般需要关闭
unlocked_ioctl函数:这个函数功能和写函数功能稍微有点重合,但是这个函数占用的内存非常小,主要针对IO口的控制。
2.杂项设备生成设备节点实现操作
- 在驱动注册中的probe函数中添加杂项设备注册函数:misc_register
- 配置结构体”struct miscdevice”:
struct miscdevice led_dev = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &led_ops,
};
- 配置结构体”struct file_operations”:
struct file_operations led_ops = {
.owner = THIS_MODULE,
.open = led_open,
.release = led_release,
.unlocked_ioctl = led_ioctl,
};
- 创建函数led_open、led_release、led_ioctl:
/*打开文件操作*/
static int led_open(struct inode * inode,struct file * file){
printk(KERN_EMERG "led open\n");
return 0;
}
/*对应应用层的close()函数,关闭文件*/
static int led_release(struct inode * inode,struct file * file){
printk(KERN_EMERG "led release\n");
return 0;
}
/*对IO口进行控制,cmd 是控制命令,arg是控制哪个参数*/
static long led_ioctl(struct file * file,unsigned int cmd,unsigned long arg){
printk(KERN_EMERG "cmd is%d,arg is %d\n",cmd,arg);
return 0;
}
- 在驱动注册中的remove函数中添加杂项设备卸载函数:misc_deregister
3. 测试驱动程序
- 在开发板中加载测试编译好驱动程序,查看设备节点
参考
《linux设备驱动程序》
itop4412驱动实验手册