使用mdev自动创建多个major相同的设备节点

#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>


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

#define beep_name "beep"
#define DEV_NUM 5

struct class * class;
struct device * devices[DEV_NUM];

#define MAGIC 'b'
#define START_BEEP _IO(MAGIC,0)
#define STOP_BEEP _IO(MAGIC,1)


static struct cdev beep_dev;

static ssize_t beep_read(struct file * fp,char __user * buffer,size_t count,loff_t * l)
{
	return 0;
}

static ssize_t beep_write(struct file * fp,const char __user * buffer,size_t count,loff_t * l)
{
	return 0;
}


static int beep_open(struct inode * ip,struct file *fp)
{
	return 0;
}

static int beep_release(struct inode * ip,struct file *fp)
{
	return 0;
}

static void start_beep()
{
	s3c2410_gpio_cfgpin(S3C2410_GPB(0),S3C2410_GPIO_OUTPUT);
	s3c2410_gpio_setpin(S3C2410_GPB(0),1);
}

static void stop_beep()
{
	
	s3c2410_gpio_cfgpin(S3C2410_GPB(0),S3C2410_GPIO_OUTPUT);
	s3c2410_gpio_setpin(S3C2410_GPB(0),0);
}


static int beep_ioctl(struct inode * ip,struct file *fp,unsigned int cmd,unsigned long count)
{
	switch(cmd)
	{
	case START_BEEP :
	{
		start_beep();
		break;
	}
	
	case STOP_BEEP :
	{
		stop_beep();
		break;
	}

	default:
	{
		return 0;
	}
	}
		

	return 0;
}


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()
{
	int i = 0;
	char dev_name[10];
	//alloc dev_t
	dev_t dev = MKDEV(beep_major,0);
	if(beep_major){
		register_chrdev_region(dev,DEV_NUM,beep_name);	
	} else 
	{
		alloc_chrdev_region(&dev,0,DEV_NUM,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,DEV_NUM);

// class is like a container of devices--------------
// class相当于一个容器,可以存放多个类型相同的device
	class = class_create(   THIS_MODULE,"beep_class");

	for( i=0;i<DEV_NUM;i++  )
	{
		dev = MKDEV( beep_major,i  );
		sprintf(   dev_name,"beep%d",i);
		devices[i] = device_create(   class,NULL,dev,NULL,dev_name);
	}
	//then /sys/class/beep_class/beepN   directories created

	return 0;
}

static void __exit beep_exit()
{
	int i = 0;
	dev_t dev = 0;
	cdev_del(&beep_dev);

	for(   i=0;i<DEV_NUM;i++)
	{
		
		dev = MKDEV(   beep_major,DEV_NUM);
		device_destroy(   class,dev);
	}

	class_destroy(   class);
	unregister_chrdev_region(dev,2);
}

module_init(beep_init);
module_exit(beep_exit);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值