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>
Is the major/minor number of /dev/myDevice the same with major/minorOn 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.
allocated in your driver ?
Can you post a pointer to your code?
thanks,
Daniel.