2017-05-24 41 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