驱动如何实现对mdev的支持(自动创建一个设备)


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>


#include <asm/io.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <mach/regs-clock.h>
#include <plat/regs-timer.h>

#include <mach/regs-gpio.h>

#include <linux/cdev.h>

#include <linux/device.h>


MODULE_LICENSE("GPL");
MODULE_AUTHOR("liuchang");

#define beep_name "beep"

#define MAGIC 'b'
#define START_BEEP _IO(MAGIC,0)
#define STOP_BEEP _IO(MAGIC,1)
//support mdev:make node /dev/* automaticly

static struct class * class;
static struct device * device;


static struct cdev beep_dev;



static struct file_operations fo = {
	.owner = THIS_MODULE,
	.read = beep_read,

	.write = beep_write,
	.ioctl = beep_ioctl,
	.open = beep_open,
	.release = beep_release,

};

static int beep_major = 0;
module_param(beep_major,int,0444);

static int __init beep_init()
{
	//alloc dev_t
	dev_t dev = MKDEV(beep_major,0);
	if(beep_major){
		register_chrdev_region(dev,1,beep_name);	
	} else 
	{
		alloc_chrdev_region(&dev,0,1,beep_name);
		beep_major = MAJOR(dev);
	}
	
	printk(KERN_EMERG"major is %d\n",beep_major);
	
	//init cdev
	cdev_init(&beep_dev,&fo);
	beep_dev.owner = THIS_MODULE;
	cdev_add(&beep_dev,dev,1);


	//mdev
	//要实现mdev只要加入以下两句代码
	//sys目录结构是 /sys/class/subsystem/device_name/dev
	
	//1.第二个参数对应的是创建的/sys/class/beep_class目录(对应的是subsystem)
	class = class_create( THIS_MODULE,"beep_class"  );
	//2.第四个参数对应的是/sys/class/beep_class/device_name目录,以及/dev/device_name设备名
	device = device_create(class,NULL,dev,NULL, "device_name"  );
	
	//mknod -m 0666 /dev/device_name c/b 130 1
	//dev文件创建在 /sys/class/beep_class/device_name/dev,
	//内核在创建完这些sys下的目录及文件后,调用用户进程/sbin/mdev创建名称为device_name,主次设备号是dev内容的设备,
	//而创建的设备是c还是b由dev_t参数决定,如果dev_t注册的是字符设备(使用register_chrdev_region或者alloc_chrdev_region函数),那么内核就在/sys/class/中创建subsystem/device_name,而不会在/sys/class/block(对应的是块设备)目录下创建目录及文件,而mdev区分是创建字符设备还是创建块设备就是检查uevent产生的DEVPATH变量中是否包含”/block/“子字符串

	return 0;
}

static void __exit beep_exit()
{
	cdev_del(&beep_dev);
	dev_t dev = MKDEV(beep_major,0);

	device_destroy(class,dev   );
	class_destroy(  class );
	unregister_chrdev_region(dev,1);
}

module_init(beep_init);
module_exit(beep_exit);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mdev机制是Linux内核中一种虚拟设备管理机制,可以动态地创建、配置、启动和销毁虚拟设备,从而实现对硬件设备的虚拟化。其核心思想是将虚拟设备的生命周期交给用户空间程序管理,以便更好地与容器技术、云计算等应用场景集成。 mdev机制的实现过程可以分为以下几个步骤: 1. 注册mdev设备驱动程序 首先需要在内核中注册一个mdev设备驱动程序,通过创建一个类似于字符设备驱动程序的结构体来实现mdev设备驱动程序实现了几个必要的函数,包括probe、remove、suspend、resume等,用于管理虚拟设备的创建、销毁、挂起和恢复等操作。 2. 创建mdev设备 用户空间程序可以通过/sys/class/mdev/目录下的mdev_ctl文件来创建虚拟设备。当用户想要创建一个虚拟设备时,需要向mdev_ctl文件写入一个描述虚拟设备的配置文件,包括设备的类型、名称、设备号等信息。内核会读取该配置文件并调用mdev设备驱动程序的probe函数来创建虚拟设备。 3. 配置mdev设备 虚拟设备创建后,用户可以通过/sys/class/mdev/目录下的相应设备文件来配置虚拟设备。用户可以通过写入相应的配置文件来修改虚拟设备的属性,例如设备的工作模式、传输速率、中断处理方式等。内核会读取这些配置文件并调用mdev设备驱动程序的相应函数来修改虚拟设备的属性。 4. 启动mdev设备 用户可以通过/sys/class/mdev/目录下的相应设备文件来启动虚拟设备。内核会调用mdev设备驱动程序的相应函数来启动虚拟设备并开始工作。 5. 销毁mdev设备 用户可以通过/sys/class/mdev/目录下的相应设备文件来销毁虚拟设备。内核会调用mdev设备驱动程序的remove函数来销毁虚拟设备并释放相关资源。 总之,mdev机制的实现过程是通过将虚拟设备的管理交给用户空间程序来实现的。用户可以通过相应的文件接口来创建、配置、启动和销毁虚拟设备,从而实现对硬件设备的虚拟化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值