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