2017-05-24 38 views
1

當我嘗試cat /dev/gpio-reflect,我得到的錯誤: No such device or address沒有這樣的設備或地址 - Linux設備驅動開發

cat proc/devices列出我的司機用正確的主設備號。

dmesg從init和exit函數打印日誌。

我還在/ dev下創建了相應的文件(主要是正確的)。

cdev_addalloc_chrdev_region不返回錯誤代碼。

我不知道我在做什麼錯。請幫幫我。

static struct file_operations fops = { 
.owner = THIS_MODULE, 
.read = device_read, 
.write = device_write, 
.open = device_open, 
.release = device_release 
}; 


static int __init gpio_reflect_init(void) 
{ 

int err,res=alloc_chrdev_region(&dev, 0, 1, dname); 
classptr = class_create(THIS_MODULE, "socledclass"); 
device_create(classptr, NULL, MAJOR(dev), NULL, dname); 
cdev_init(&c_dev, &fops); 
c_dev.ops=&fops; 
c_dev.owner=THIS_MODULE; 
err=cdev_add(&c_dev, MAJOR(dev), 1); 

if(err){ 
    printk(KERN_INFO "Could not add device"); 
} 

if(res<0){ 
    printk(KERN_INFO "Could not alloc device"); 
    return res; 
}else{ 
    printk(KERN_INFO "Major: %i",MAJOR(dev)); 
} 
printk(KERN_INFO "Input Pin is: %i\n",in); 
printk(KERN_INFO "Output Pin is: %i\n",out); 


return 0; 
} 

static void __exit gpio_reflect_cleanup(void) 
{ 
cdev_del(&c_dev); 
unregister_chrdev_region(dev,1); 
printk(KERN_INFO "%s unloaded\n",dname); 

} 

static int device_open(struct inode *inode, struct file *file) 
{ 
printk(KERN_INFO "open\n"); 
if (Device_Open) 
    return -EBUSY; 

Device_Open++; 
sprintf(msg, "Hello\n"); 
msg_Ptr = msg; 
try_module_get(THIS_MODULE); 

return SUCCESS; 
} 

static int device_release(struct inode *inode, struct file *file) 
{ 
printk(KERN_INFO "release\n"); 
Device_Open--; 

module_put(THIS_MODULE); 

return SUCCESS; 
} 

static ssize_t device_read(struct file *filp, char *buffer,size_t length, loff_t * offset){ 
int bytes_read = 0; 
printk(KERN_INFO "read\n"); 

if (*msg_Ptr == 0) 
    return 0; 
while (length && *msg_Ptr) { 
    put_user(*(msg_Ptr++), buffer++); 

    length--; 
    bytes_read++; 
} 
return bytes_read; 
} 


static ssize_t 
device_write(struct file *filp, const char *buff, size_t len, loff_t *  off) 
{ 
printk(KERN_INFO "write\n"); 
printk(KERN_ALERT "Sorry, this operation isn't supported.\n"); 
return -EINVAL; 
} 

module_init(gpio_reflect_init); 
module_exit(gpio_reflect_cleanup); 

很抱歉的格式錯誤代碼:)

+0

我想最好的辦法是閱讀的代碼示例。也許像LDD3這樣的書會幫助你。 – 0andriy

+0

謝謝,但我已閱讀書籍:) – Appyx

回答

1

如果任何人有同樣的問題。 這只是一個愚蠢的錯誤。

錯誤:cdev_add(&c_dev, MAJOR(dev), 1);

權:cdev_add(&c_dev, dev, 1);

0

如果/dev/下您的設備節點/dev/gpio-reflect嘗試cat /dev/gpio-reflect

+0

這正是什麼不工作... – Appyx