前言
在第一个驱动程序文章中,我们知道应用的设备节点文件每次创建都需要查看(cat /proc/devices)驱动的主设备号,根据主设备号才能创建对应的设备节点。
每一次这样操作,看起来非常麻烦。
所以,本文记录一个非常有用的方法,可以自动创建对应的设备节点
提示:以下是本篇文章正文内容,下面案例可供参考
一、驱动和应用
驱动的主设备号如何设置?
①手工指定
②自动分配主设备号,设备号设置为0
应用的设备节点文件如何设置?
①手工建立
②自动创建(mdev)
根据系统的信息创建设备节点
static struct calss* firstdrv_class;
static struct class_device *firstdrv_class_dev;
二、代码
1.驱动程序
first_drv.c代码如下(示例):
#include <linux/init.h>
#include <linux/module.h>
#include <linux/ioctl.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/list.h>
#include <linux/errno.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/spi/spi.h>
#include <linux/spi/spidev.h>
#include <asm/uaccess.h>
static struct calss* firstdrv_class;
static struct class_device *firstdrv_class_dev;
//open函数
static int first_drv_open(struct inode *inode, struct file *file) {
printk("first_drv_open"); //打印信息
return 0;
}
//write函数
static ssize_t first_drv_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) {
printk("first_drv_write"); //打印信息
return 0;
}
//定义一个file_operations,里面成员放的是函数,对应起来
static const struct file_operations first_drv_fops = {
.owner = THIS_MODULE,
.open = first_drv_open,
.write = first_drv_write,
};
//系统自动帮我分配主设备号
int major;
//驱动程序的入口函数
static int first_drv_init(void) {
major = register_chrdev(0, "first_drv", &first_drv_fops); //注册驱动程序,告诉内核。
//先创建一个类
firstdrv_class = class_create(THIS_MODULE, "firstdrv");
//在类的里面建立设备
firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */ //参数:(主设备号是111,驱动程序名字为first_drv,file_operations的名字)
return 0;
}
//驱动程序出口函数
static int first_drv_exit(void) {
unregister_chrdev(major, "first_drv"); //卸载驱动程序
class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);
return 0;
}
//修饰入口函数
module_init(first_drv_init);
//修饰出口函数
module_exit(first_drv_exit);
MODULE_LICENSE("GPL");
2.测试驱动程序
firstdrv_test.c代码如下(示例):
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
char buf[10] = "a";
int fd = open("/dev/xyz", O_RDWR);
if( fd < 0 ) {
printf("open xyz fail!\n");
} else {
printf("\t open xyz success!\n");
}
write(fd, buf, sizeof(buf));
return 0;
}