How to create dev files in sysfs?
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@nl.linux.org/msg08461.html http://www.mail-archive.com/kernelnewbies@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 ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: How to create dev files in sysfs?
On Wed, Jan 19, 2011 at 02:23:41PM +0100, Arvid Brodin wrote: 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. 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@nl.linux.org/msg08461.html http://www.mail-archive.com/kernelnewbies@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. 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 ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies