您的位置:首页 > 其它

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

2012-09-25 18:28 323 查看
#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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: