实现自动创建/dev/xx节点
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/gfp.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/stat.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <asm/div64.h>
#include <linux/device.h>
#include <linux/cdev.h>
static int test_open(struct inode *nd , struct file *fp)
{
printk(KERN_INFO "test_open()\n");
return 0;
}
static int test_ioctl(struct file *fp, unsigned int fd, unsigned long lg)
{
printk(KERN_INFO "test_ioctl()\n");
return 0;
}
static struct file_operations test_fops = {
.owner = THIS_MODULE,
.open = test_open,
.compat_ioctl = test_ioctl,
};
static int __init test_driver_init(void)
{
int ret;
struct class *myclass;
struct cdev mycdev;
dev_t mydev;
int major;
myclass = class_create(THIS_MODULE, "rcar_test");
if(myclass == NULL)
{
printk("class_create() fail\n");
}
printk(KERN_INFO "test_driver_init()\n");
major = register_chrdev(0,"rcar_test", &test_fops);
if(major < 0)
{
printk( "test_driver_init() fail\n");
}
mydev = MKDEV(major, 0); //转换dev_t
//cdev_init(&mycdev, &test_fops);
//mycdev.owner = THIS_MODULE;
//cdev_add(&mycdev, mydev, 1);
device_create(myclass,NULL,mydev,NULL,"rcar_test");//创建/sys/class/设备节点和/dev/xxx
return 0;
}
static void __exit test_driver_exit(void)
{
printk(KERN_INFO " test_driver_exit()\n");
unregister_chrdev(0,"rcar_test");
}
module_init(test_driver_init);
module_exit(test_driver_exit);
MODULE_AUTHOR("XXX <XXX@XXXX.com>");
MODULE_DESCRIPTION("XXX XXXX test driver");
MODULE_LICENSE("GPL v2");