Reputation: 680
I am attempting to develop Linux device drivers and as my first attempt I am trying to develop a char device driver that has the following file options,
struct file_operations fops{
.open=open_fun,
.release=release_fun,
.write=write_fun,
.read=read_fun,
};
When I load the driver using insmod
, I see that /proc/devices
lists the driver under char devices but I can't find it in /dev
. A Google search suggested use of mknod
to create a device in /dev
and associate it with the driver's major and minor. However, an attempt to do so resulted in "Permission denied" error even when done as a super user.
What should I do to make the device appear in /dev
when the kernel module is loaded? I tried both the older (register_chrdev
) and the newer version (cdev_init & cdev_add
) of registering the device but none of them works.
Upvotes: 16
Views: 39967
Reputation: 36
There are two ways to create the device file in /dev
mknod
$ mknod -m <permission> <name> <device_type> <major> <minor>
chmod
.dev_t dev=0;
static struct class *devicefileClass;
deviceFileClass=class_create(THIS_MODULE,"device_name");
device_create( deviceFileClass , NULL , dev ,"device_name")
Upvotes: 1
Reputation: 101
Include the header file linux/device.h and linux/kdev_t.h
static struct class c_dev;
Add the below API 's inside __init fuction of the driver
where x - Name to be displayed inside /sys/class/ when driver is loaded.
where d - device file to be created under /dev.
where dev is variable for the first device number that is initialized during the usage of alloc_chrdev_region API for dynamic allocation of major number for the driver
For Further reference please go through the link http://opensourceforu.com/2011/04/character-device-files-creation-operations/
Upvotes: 9
Reputation: 27
First you have to use : sudo mknod /dev/devicename c 81 0
It creates device file in /dev but you have to give it read/write permission. to do so,
sudo chmod 777 /dev/devicename
Done !!!
Upvotes: 0
Reputation: 2218
I could see entries within /dev
after creating node by running following command at console.
sudo mknod -m 0666 /dev/msio c 22 0
The user was not root, so I had to use sudo. My entry name was msio
, a character device with major and minor number 22, 0 respectively.
I will let you know if this can be achieved programatically.
Upvotes: 3
Reputation: 21
CONFIG_DEVTMPFS is quite nice if you can use that with your distro. You can have the kernel automount that for you at boot (CONFIG_DEVTMPFS_MOUNT) or mount it manually (mount -t devtmpfs none /dev).
Upvotes: 2
Reputation:
You may have to create some udev rules to tell the system what device node(s) you need it to create.
Upvotes: 3