Linux设备驱动实现自动创建设备节点

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/ioctl.h>

#define DRIVERNAME "xxx"
#define DEV_MINOR 0
static dev_t xxx_devno = 0;
static struct class * xxx_class;

struct xxx_dev
{
	struct cdev cdev;
}xxxdev;

/*-----------------------------------------------------------------------------------*/

static int xxx_open(struct inode *inode, struct file *filp)
{
	return 0;
}

static ssize_t xxx_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
	return 0;
}

static ssize_t xxx_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
	return 0;
}

static int xxx_release(struct inode *inode, struct file *filp)
{
	return 0;
}

static int xxx_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
	int ret = 0;	

	switch (cmd)
	{
		case CPLD_VERSION:
			break;
		case CPLD_RESET:
			break;
		case CPLD_RELAY:
			break;
		case CPLD_RJ45:
			break;
		case CPLD_INTERUPT:
				break;
		case CPLD_FAN:
			break;
		default:
			printk("Error xxx cmd\n");
			break;
	}

	return 0;
}

/*-----------------------------------------------------------------------------------*/

static struct file_operations xxx_fops = {
	.owner = THIS_MODULE,
	.open = xxx_open,
	.read = xxx_read,
	.write = xxx_write,
	.ioctl = xxx_ioctl,
	.close = xxx_release,
};

static int xxx_init(void)
{
	int ret = 0;

	/*动态申请设备号*/
	ret = alloc_chrdev_region(&xxx_devno, DEV_MINOR, 1, DRIVERNAME);
	if (ret < 0)
	{
		printk("xxx register char dev failed\n");
		goto out;
	}
	/*初始化cdev结构,注册cdev*/
	cdev_init(&(xxxdev.cdev), &xxx_fops);
	xxxdev.cdev.owner = THIS_MODULE;
	ret = cdev_add(&(xxxdev.cdev), xxx_devno, 1);
	if (ret)
	{
		printk("Error adding xxx device\n");
		goto add_err;
	}

	/*创建设备节点/sys/class/xxx和/dev/xxx*/
	xxx_class = class_create(THIS_MODULE, DRIVERNAME);
	if (IS_ERR(xxx_class))
	{
		ret = PTR_ERR(xxx_class);
		goto class_err;
	}
	device_create(xxx_class, NULL, xxx_devno, NULL, DRIVERNAME); 

	printk("xxx init\n");
	return 0;

class_err:
	cdev_del(&(xxxdev.cdev));
add_err:
	unregister_chrdev_region(xxx_devno, 1);
out:
	return ret;
}

static void xxx_exit(void)
{
	device_destroy(xxx_class, xxx_devno);
	class_destroy(xxx_class);
	cdev_del(&(xxxdev.cdev));
	unregister_chrdev_region(xxx_devno, 1);
	printk("module xxx exit\n");
}

module_init(xxx_init);
module_exit(xxx_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("liuwei");
MODULE_DESCRIPTION("char driver");

时间: 2024-07-31 18:55:46

Linux设备驱动实现自动创建设备节点的相关文章

linux驱动开发(三) 字符设备驱动框架(自动创建设备节点)

代码如下 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/device.h> int demo_major = 250; int demo_minor = 0; int demo_count = 1; stru

【Linux驱动】自动创建设备节点

开始学习驱动的时候,是将驱动程序编译成模块然后用mknod命令手动建立设备节点以提供给应用程序调用.这对于刚开始调试驱动程序的时候常用的一种方法.但是,当有种需要必须在系统启动的时候就将驱动程序就绪,来供应用层程序调用.这时就不能再手动的建立设备节点了,而必须自动的创建设备节点(不需要人为的操作). ★注册类 注册类的目的是为了使mdev可以在/dev/目录下建立设备节点. 首先要定义一个类,利用struct class结构体.这个结构体定义在头文件include/linux/device.h中

一步一步学习Linux驱动之自动创建设备节点

<span style="font-size:12px;">extern struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...) __attribute__((format(printf, 5, 6)));</span> 函数功能: 函数device_create()用于动态的建立

linux字符设备-自动创建设备号和设备节点

Linux字符设备-自动创建设备号和设备节点 先写一个自动分配字符设备号和设备节点的例子及APP 手动安装步骤: Insmod my_char_dev.ko 不需要再安装设备节点 然后是测试app ./my_char_dev_app 1 1 #include <linux/module.h> 2 #include <linux/init.h> 3 #include <linux/io.h> 4 #include <linux/fs.h> 5 #include

如何自动创建设备节点

创建设备文件的方法: 第一种是使用mknod手工创建:mknod filename type major minor 第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(嵌入式系统用mdev),由busybox配置. udev介绍 udev 运行在用户模式,而非内核中.udev 的初始化脚本在系统启动时创建设备节点,并且当插入新设备--加入驱动模块--在sysfs上注册新的数据后,udev会创新新的设备节点. udev 是一个工作在用户空间的工具,

自动创建设备节点class_create 和device_create

刚开始学习驱动的时候,每次都需要mknod /dev/timer c 500 0 这样手动去创建一个设备节点:实际上Linux内核提供一组函数,可以用来在驱动模块加载的时候自动在/dev目录下创建相应的设备节点,并在下载的时候删该节点. device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)和device_destroy(struct cla

platform型设备在/dev目录下自动创建设备节点的分析【转】

转自:http://blog.csdn.net/rockrockwu/article/details/7357648 系统启动过程中platform设备.驱动注册完毕,为什么在/dev目录下就自动创建好设备节点了? 在/dev目录自动创建设备节点可以通过class_create(),然后再device_create().但是在跟踪 内核platform注册过程中可以发现,其实这里面并未调用上诉两个函数,那么platform注册后 如何在/dev目录下创建设备文件节点? [cpp] view pl

国嵌内核驱动进阶班-7-5(自动创建设备文件)

linux 2.6.13 开始,devfs不存在,udev取代devfs. udev(mdev)存在应用层,可以实现设备文件的自动创建和删除. 过程: 驱动代码调用class_create创建一个class,再为每个设备调用class_create创建对应的设备. ※ 自动创建设备文件需要udev的支持 struct class *myclass =  class_create(THIS_MODULE, "mydriver"); device_create(myclass,NULL,

class_create(),device_create自动创建设备文件结点

class_create(),device_create自动创建设备文件结点 从linux 内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.相比devfs,udev有很多优势,在此就不罗嗦了,提醒一 点,udev是应用层的东东,不要试图在内核的配置选项里找到它;加入对udev的支持很简单,以作者所写的一个字符设备驱动为例,在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用 class_device_create创建对应的设备.