2017-05-24 1 views
1

Lorsque je tente de cat /dev/gpio-reflect, je reçois l'erreur: No such device or addressAucun tel dispositif ou l'adresse - le développement de pilote de périphérique Linux

cat proc/devices listes mon chauffeur avec le nombre important correct. Imprime les journaux à partir des fonctions init et exit.

dmesg J'ai également créé le fichier correspondant sous/dev (majeur est correct).

cdev_add et alloc_chrdev_region ne renvoient pas de codes d'erreur.

Je ne sais pas ce que je fais mal. Aidez-moi, s'il vous plaît.

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); 

Désolé pour le code mal formaté :)

+0

Je pense que la meilleure approche est de lire un exemple de code. Peut-être qu'un livre comme LDD3 vous aidera. – 0andriy

+0

Merci, mais j'ai déjà lu des livres :) – Appyx

Répondre

1

Dans le cas où quelqu'un a le même problème. C'était juste une erreur stupide.

mal: cdev_add(&c_dev, MAJOR(dev), 1);

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

0

Si votre noeud de périphérique sous /dev/ est /dev/gpio-reflect essayer cat /dev/gpio-reflect

+0

C'est exactement ce qui ne fonctionne pas ... – Appyx