Re: 'No such device or address' when writing to device driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <daniel.baluta@xxxxxxxxx>
On Thu, Jan 7, 2010 at 3:31 AM, Sam Carter <sam.w.carter@xxxxxxxxx> 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.


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux