On Tue, Jan 12, 2010 at 4:55 AM, Sam Carter <[email protected]> wrote:

> I've just installed strace and run as you advised although there is no
> extra information on top of the 'No such device or address'. Does my driver
> and loader code look right?
>
> Thanks for the continued support, Sam
>

Where is your read/write function defined? there may be some error in these
functions.

~cnanda


> 2010/1/8 Durga Prasad <[email protected]>
>
>> On quick glance, do you know what is throwing up the error?
>> Can you do 'strace -vv cat .. '
>>
>>
>>
>> ------------------------------
>> *From:* Sam Carter <[email protected]>
>> *To:* Daniel Baluta <[email protected]>
>> *Cc:* kernelnewbies <[email protected]>
>> *Sent:* Fri, January 8, 2010 6:02:54 PM
>> *Subject:* Re: 'No such device or address' when writing to device driver
>>
>> Hi all,
>>
>> Thanks for the responses. Here is the load/unload part of my driver.
>>
>> #include <linux/init.h>
>> #include <linux/module.h>
>> #include <linux/kernel.h>
>> #include <linux/sched.h>
>> #include <linux/version.h>
>> #include <linux/types.h>
>> #include <linux/fs.h>
>> #include <linux/string.h>
>> #include <linux/dirent.h>
>> #include <asm/uaccess.h>
>> #include <linux/cdev.h>
>>
>> #include "memo.h"
>>
>> static int __init memo(void);
>> static void __exit cleanup(void);
>>
>> static int ioctlManager(int i);
>> static int read(void);
>> static int write(char *s);
>> static int testDirent(int is64bit, int length, void *p);
>> static int modulePrint(char *s);
>> int dev, result;
>>
>> struct cdev *memoc;
>>
>> static struct file_operations fops = {
>>     .owner = THIS_MODULE,
>>     .llseek = NULL,
>>     .read = read,
>>     .write = write,
>>     .ioctl = ioctlManager,
>>     .open = NULL,
>>     .release = NULL,
>> };
>>
>> extern void (*interceptor)(int, int, void *);
>>
>> static int __init memo(void){
>>     if(MAJOR){
>>         dev = MKDEV(MAJOR, MINOR);
>>         result = register_chrdev_region(dev, number_of_devices, "memo");
>>     }else{
>>         result = alloc_chrdev_region(&dev, MINOR, number_of_devices,
>> "memo");
>>     }
>>     memoc = cdev_alloc();
>>     cdev_init(memoc, &fops);
>>     memoc->owner = THIS_MODULE;
>>     if(cdev_add(memoc, 249, 1) < 0){
>>         printk("cdev device registration failed\n");
>>     }else{
>>         printk("cdev device registration success\n");
>>     }
>>
>>     printk(KERN_INFO "- Module interceptor loaded -\n");
>>     interceptor = testDirent;
>>     if(result < 0){
>>         printk(KERN_WARNING "memo: can't get major/minor numbers");
>>         return result;
>>     }else{
>>         return 0;
>>     }
>> }
>>
>> static void __exit cleanup(void){
>>     int i = 0;
>>     unregister_chrdev_region(dev, number_of_devices);
>>     cdev_del(memoc);
>>     interceptor = NULL;
>>     printk(KERN_INFO "- Module interceptor cleanup -%d\n",i);
>> }
>>
>> And here is the load script I'm using to load the module.
>>
>> module="memo"
>> device="memo"
>> mode="664"
>>
>> #if grep -q '^staff:' /etc/group; then
>> #    group="staff"
>> #else
>> #    group="wheel"
>> #fi
>> group="root"
>> /sbin/insmod ./$module.ko $* || exit 1
>>
>> rm -f /dev/${device}
>>
>> major=$(awk "\$2==\"$module\" {print \$1}" /proc/devices)
>>
>> mknod /dev/${device} c $major 0
>> chgrp $group /dev/${device}
>> chmod $mode /dev/${device}
>>
>> As far as I'm aware the Major/Minor numbers match up fine. With ls -l
>> /dev, the major is 249, which is the same as in /proc/devices once I've
>> loaded the module. Hope this helps someone find the problem.
>>
>> Sam
>>
>> 2010/1/8 Daniel Baluta <[email protected]>
>>
>>> On Thu, Jan 7, 2010 at 3:31 AM, Sam Carter <[email protected]>
>>> wrote:
>>> > Hi all,
>>> >
>>> > I'm trying to write a simple char driver following the 'Linux Device
>>> > Drivers' book from O' Reilly. My driver appears in /proc/devices and
>>> under
>>> > lsmod. I've been trying to register the device fops table so I can
>>> > read/write to it, however when I try to cat some data to it in
>>> /dev/myDevice
>>> > I get the error 'No such device or address'. The device does appear on
>>> the
>>> > list with ls /dev/.
>>> >
>>> > Can anyone help me find the source of this problem? Thanks in advance.
>>>
>>>
>>> Is the major/minor number of /dev/myDevice the same with major/minor
>>> allocated in your driver ?
>>> Can you post a pointer to your code?
>>>
>>> thanks,
>>> Daniel.
>>>
>>
>>
>>
>

Reply via email to