Skip to contentSkip to conversation

How to create "dev" files in sysfs?

DISCUSSION Arvid Brodin 2 participants 2 messages Jan 19, 2011

lore
Share & tools
lore
#0 lore raw

Hello,

How do I make my platform device a character device that can be handled by udev?

Background:

I've written a driver for a very simple platform device (a jumper connected to an input pin on the processor). Today I can read the status of the pin through a driver attribute file in sysfs at:

/sys/devices/platform/msel/

As a learning experience I want to get udev to detect this device and create a character device file under /dev for it, that I could read to get the pin status. If I understand correctly, udev looks for files named "dev" in sysfs, which contains the major and minor device numbers which udev use to create the device node.

From the kernel code it seems that ((struct platform_device *)
my_platform_device)->dev->devt would have to be set to contain the major & minor device numbers when the device is created for a "dev" file to appear, which is not possible in this case since the device is registered in board setup code where it seems wrong to get device numbers by calling call alloc_chrdev_region() (right?).

I found a few previous questions about this same problem in these kernelnewbies threads:

http://www.mail-archive.com/kernelnewbies at nl.linux.org/msg08461.html
http://www.mail-archive.com/kernelnewbies at nl.linux.org/msg06807.html

Using that info, and looking at the hpet driver code, I initialised a struct miscdevice and called misc_register(). This gives me a /sys/class/misc/msel_chrdev/ folder with the required dev and uevent files. udev also picks up this and creates the corresponding file in /dev.

Is this the correct way to do this? One "device" for the hardware and one or more "devices" for the userland interface(s)? Also, looking at my desktop system, there's one device under /sys/devices/platform that also has "dev" files:

/sys/devices/platform/serial8250/tty/ttyS1/dev
/sys/devices/platform/serial8250/tty/ttyS2/dev
/sys/devices/platform/serial8250/tty/ttyS3/dev

I notice that these "dev" files appear as subfolders under the platform device's own folder, and not under /sys/class/. Perhaps this is more correct? The source for 8250 is ~223K in 14 different files so I have not been able to decode how they do this.

(Please CC me directly if you respond!)

Thanks for reading all this,
Arvid Brodin
Enea Services Stockholm AB

#1 lore raw
Quoted 4 lines · Arvid Brodin

Hello,

How do I make my platform device a character device that can be handled by udev?

Have you read the Linux Device Drivers book about this very topic? If not, I suggest you do so.

Quoted 24 lines

Background:

I've written a driver for a very simple platform device (a jumper connected to an input pin on the processor). Today I can read the status of the pin through a driver attribute file in sysfs at:

/sys/devices/platform/msel/

As a learning experience I want to get udev to detect this device and create a character device file under /dev for it, that I could read to get the pin status. If I understand correctly, udev looks for files named "dev" in sysfs, which contains the major and minor device numbers which udev use to create the device node.

From the kernel code it seems that ((struct platform_device *)
my_platform_device)->dev->devt would have to be set to contain the major & minor device numbers when the device is created for a "dev" file to appear, which is not possible in this case since the device is registered in board setup code where it seems wrong to get device numbers by calling call alloc_chrdev_region() (right?).

I found a few previous questions about this same problem in these kernelnewbies threads:

Quoted 8 lines

http://www.mail-archive.com/kernelnewbies at nl.linux.org/msg08461.html
http://www.mail-archive.com/kernelnewbies at nl.linux.org/msg06807.html

Using that info, and looking at the hpet driver code, I initialised a struct miscdevice and called misc_register(). This gives me a /sys/class/misc/msel_chrdev/ folder with the required dev and uevent files. udev also picks up this and creates the corresponding file in /dev.

Great.

Quoted 2 lines

Is this the correct way to do this? One "device" for the hardware and one or more "devices" for the userland interface(s)?

Yes.

But you might want to rethink a char device for your user interface, as it doesn't sound like it fits very well. What about the GPIO interface instead?

thanks,

greg k-h