2014-02-10 131 views
0

我写了一个“硬币”设备的小型设备驱动程序。我在/ drivers/char/Kconfig 和相应的Makefile中创建一个条目,然后在menuconfig中选择内置选项。内核编译正常(内建.o文件被创建)。但是我仍然无法访问该设备(/ dev/coin没有创建),并且/ proc/devices下没有条目。 请帮忙!!设备驱动程序不工作

我交叉编译为PowerPC

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/fs.h> 
#include <linux/uaccess.h> 
#include <linux/device.h> 
#include <linux/random.h> 
#include <linux/debugfs.h> 
#include <linux/init.h> 

#define DEVNAME "coin" 
#define LEN 20 
enum values {HEAD, TAIL}; 

struct dentry *dir, *file; 
int file_value; 
int stats[2] = {0, 0}; 
char *msg[2] = {"head\n", "tail\n"}; 

static int major; 
static struct class *class_coin; 
static struct device *dev_coin; 

static ssize_t r_coin(struct file *f, char __user *b, 
         size_t cnt, loff_t *lf) 
{ 
     char *ret; 
     u32 value = random32() % 2; 
     ret = msg[value]; 
     stats[value]++; 
     return simple_read_from_buffer(b, cnt, 
             lf, ret, 
             strlen(ret)); 
} 

static struct file_operations fops = { .read = r_coin }; 

#ifdef CONFIG_COIN_STAT 
static ssize_t r_stat(struct file *f, char __user *b, 
         size_t cnt, loff_t *lf) 
{ 
     char buf[LEN]; 
     snprintf(buf, LEN, "head=%d tail=%d\n", 
       stats[HEAD], stats[TAIL]); 
     return simple_read_from_buffer(b, cnt, 
             lf, buf, 
             strlen(buf)); 
} 

static struct file_operations fstat = { .read = r_stat }; 
#endif 

static int __init coin_init(void) 
{ 
     void *ptr_err; 
     major = register_chrdev(0, DEVNAME, &fops); 
     if (major < 0) 
       return major; 

     class_coin = class_create(THIS_MODULE, 
            DEVNAME); 
     if (IS_ERR(class_coin)) { 
       ptr_err = class_coin; 
       goto err_class; 
     } 

     dev_coin = device_create(class_coin, NULL, 
           MKDEV(major, 0), 
           NULL, DEVNAME); 
     if (IS_ERR(dev_coin)) 
       goto err_dev; 

#ifdef CONFIG_COIN_STAT 
     dir = debugfs_create_dir("coin", NULL); 
     file = debugfs_create_file("stats", 0644, 
            dir, &file_value, 
            &fstat); 
#endif 

     return 0; 
err_dev: 
     ptr_err = class_coin; 
     class_destroy(class_coin); 
err_class: 
     unregister_chrdev(major, DEVNAME); 
     return PTR_ERR(ptr_err); 
} 

static void __exit coin_exit(void) 
{ 
    #ifdef CONFIG_COIN_STAT 
    debugfs_remove(file); 
    debugfs_remove(dir); 
    #endif 

    device_destroy(class_coin, MKDEV(major, 0)); 
    class_destroy(class_coin); 
    return unregister_chrdev(major, DEVNAME); 
} 

module_init(coin_init); 
module_exit(coin_exit); 
+1

如果我们不知道程序的来源,我们该如何帮助您?告诉我们你的来源。 – user2699113

+0

@ user2699113:我添加了代码 –

+0

'CONFIG_COIN_STAT'在您的内核的.config文件中设置为'y'? – Jeyaram

回答

0

如果你手工用insmod插入模块插入内核?它工作吗? dmesg中的任何消息?

正如我记得应该使用mknod手动创建/ dev(/ dev/coin)中的条目,但是您需要大量的注册设备。只需在register_chrdev()后面打印它即可。