最方便的字符設備驅動的寫法

記錄一下

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>
#include <linux/poll.h>
#include <linux/device.h>

static int major;
static struct class *class;
static struct class_device	*ker_dev;


static int ker_rw_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
	switch ( cmd ) {
    case 0 :
        printk("line:%d,cmd:%d,arg:%ld", __LINE__, cmd, arg);
        break;
    case 1 :
        printk("line:%d,cmd:%d,arg:%ld", __LINE__, cmd, arg);
        break;
    case 2 :
        printk("line:%d,cmd:%d,arg:%ld", __LINE__, cmd, arg);
        break;
    case 3 :
        printk("line:%d,cmd:%d,arg:%ld", __LINE__, cmd, arg);
        break;
    case 4 :
        printk("line:%d,cmd:%d,arg:%ld", __LINE__, cmd, arg);
        break;
    default:
        printk("line:%d,cmd:%d,arg:%ld", __LINE__, cmd, arg);
        return -EINVAL;
}
	return 0;
}

static struct file_operations ker_rw_ops = {
	.owner   = THIS_MODULE,
	.ioctl   = ker_rw_ioctl,
};

static int ker_rw_init(void)
{
	major = register_chrdev(0, "ker_rw", &ker_rw_ops);

	class = class_create(THIS_MODULE, "ker_rw");

	/* 爲了讓mdev根據這些信息來創建設備節點 */
	ker_dev = class_device_create(class, NULL, MKDEV(major, 0), NULL, "ker_rw"); /* /dev/ker_rw */
	
	return 0;
}

static void ker_rw_exit(void)
{
	class_device_unregister(ker_dev);
	class_destroy(class);
	unregister_chrdev(major, "ker_rw");
}

module_init(ker_rw_init);
module_exit(ker_rw_exit);


MODULE_LICENSE("GPL");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章