编写驱动程序 - “无法注册设备类”

时间:2018-06-07 05:14:28

标签: c linux driver

我正在尝试编写基于this tutorial的字符设备驱动程序。 但是当我尝试插入我的模块时,我收到以下错误:

$ sudo insmod modules/main/main.ko 
insmod: ERROR: could not insert module modules/main/main.ko: Operation not permitted

$dmesg
[ 1085.409026] Failed to register device class

这是相应的代码段:

#ifndef __KERNEL__
    #define __KERNEL__
#endif

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/device.h>

#define CLASS_NAME "my_class"
#define DEV_NAME "my_device"

static int     dev_open(struct inode *, struct file *);
static int     dev_release(struct inode *, struct file *);
static ssize_t dev_read(struct file *, char *, size_t, loff_t *);
static ssize_t dev_write(struct file *, const char *, size_t, loff_t *);
static int myCharClass;
static int myCharDevice;
int majorNumber;

static struct file_operations fops = 
{
    .open = dev_open,
    .read = dev_read,
    .write = dev_write,
    .release = dev_release
};

int init_module(void)
{
    printk("Hello world - DAO \n");

    majorNumber = register_chrdev(0, DEV_NAME, &fops);
    if (majorNumber < 0)
    {
        printk("Error when registering character device driver.\n");
        return -1;
    }

   myCharClass = class_create(THIS_MODULE, CLASS_NAME);
   if (IS_ERR(myCharClass))
   {
      unregister_chrdev(majorNumber, DEV_NAME);
      printk(KERN_ALERT "Failed to register device class\n");
      return -1;
   }

   myCharDevice = device_create(myCharClass, NULL, MKDEV(majorNumber, 0), NULL, DEV_NAME);
   if (IS_ERR(myCharDevice))
   {
      class_destroy(myCharClass);
      unregister_chrdev(majorNumber, DEV_NAME);
      printk(KERN_ALERT "Failed to create the device\n");
      return -1;
   }

    return 0;
}

void cleanup_module(void)
{
    printk("<1> Ciao - DAO\n");
}

static int dev_open(struct inode *p_inode, struct file *p_file)
{
    printk("Opened device.\n");
    return 0;
}

static ssize_t dev_read(struct file *filep, char *buffer, size_t len, loff_t *offset)
{
    printk("Reading device.\n");
    return 0;
}

static ssize_t dev_write(struct file *filep, const char *buffer, size_t len, loff_t *offset)
{
   printk("Writing device\n");
   return 0;
}

static int dev_release(struct inode *inodep, struct file *filep)
{
   printk("Releasing device.\n");
   return 0;
}

MODULE_LICENSE("GPL");

有人知道我做错了什么吗? 我看了this post,但它并没有真正帮助我,因为我真的不是问题所在。

由于

0 个答案:

没有答案
相关问题