2014-02-10 6 views
0

"동전"장치 용 소형 장치 드라이버를 작성했습니다./drivers/char/Kconfig 및 해당 Makefile에 항목을 작성한 다음 menuconfig에서 선택한 내장 옵션을 작성합니다. 커널이 잘 컴파일되었습니다 (built-in.o 파일이 생성되었습니다). 하지만 여전히 장치에 액세스 할 수 없습니다. (/ dev/coin이 생성되지 않았습니다.)/proc/devices 아래에 항목이 없습니다. 도와주세요 !!장치 드라이버가 작동하지 않습니다.

내가 파워

#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에서'CONFIG_COIN_STAT'가'y'로 설정되어 있습니까 ?? – Jeyaram

답변

0

에 대한 크로스 컴파일하고 당신이 직접 insmod 명령을 사용하여 커널에 모듈을 삽입하면? 작동합니까? dmesg에있는 모든 메시지?

/dev (/ dev/coin)의 항목은 mknod를 사용하여 수동으로 만들어야하지만 등록 된 장치는 많이 필요합니다. register_chrdev() 다음에 printk하십시오.

관련 문제