On Tue, Feb 10, 2009 at 11:52 AM, Daniel Baluta <daniel.baluta@xxxxxxxxx> wrote: > On Mon, Feb 9, 2009 at 9:45 PM, Greg KH <greg@xxxxxxxxx> wrote: >> On Mon, Feb 09, 2009 at 09:23:47PM +0200, Daniel Baluta wrote: >>> On Mon, Feb 9, 2009 at 7:56 PM, Daniel Baluta <daniel.baluta@xxxxxxxxx> wrote: >>> > On Mon, Feb 9, 2009 at 7:19 PM, Greg KH <greg@xxxxxxxxx> wrote: >>> >> On Mon, Feb 09, 2009 at 06:43:51PM +0200, Daniel Baluta wrote: >>> >>> On Mon, Feb 9, 2009 at 12:20 AM, Greg KH <greg@xxxxxxxxx> wrote: >>> >>> > On Sun, Feb 08, 2009 at 07:47:05PM +0200, Daniel Baluta wrote: >>> >>> >> Hello, >>> >>> >> >>> >>> >> I don't really understand how kernel generates events when working >>> >>> >> with platform devices and drivers ( [1] ). >>> >>> >> I have registered my driver with platform_driver_register and my >>> >>> >> device with platform_device_register_simple. >>> >>> >> >>> >>> >> I want to dynamically create the node in /dev , and for that i need >>> >>> >> the kernel to send events like ( MAJOR=x, MINOR=y) >>> >>> >> that will be interpreted by the udev daemon acording to rules from >>> >>> >> /etc/udev/rules.d. >>> >>> > >>> >>> > Platform devices can't do this, you need to use a "real" struct device, >>> >>> > or register with a class that handles major/minor allocation for you >>> >>> > (input, block, etc.) >>> >>> > >>> >>> > hope this helps, >>> >>> > >>> >>> > greg k-h >>> >>> > >>> >>> >>> >>> thanks for your answer. >>> >>> >>> >>> I'm writing a driver for a character device [hex display] . >>> >>> >>> >>> Registering with an existing class its pretty hard since it doesn't >>> >>> fit well in none of the existing classes. >>> >> >>> >> There are other drivers in the kernel that already do something like >>> >> this, are you sure there isn't an existing class for you already? >>> >> >>> > >>> > I'm still searching for it. Any suggestion , it's welcomed. >> >> I know one staging driver supports it, and I think a few different USB >> ones do as well. Have you looked at the LED class? That might be what >> I was thinking of. >> >>> >>> One good option would be misc class but this enforces the usage of major 10. >>> >> >>> >> What's wrong with that? It's a dynamic minor number that will "just >>> >> work" for your device. >>> >> >>> > Yes , you are right here it's "just working". But I have some requirements >>> > that ask for major to be dynamically allocated. >> >> What kind of requirement would require something like that? Do you >> really need to support 16k different devices? Hm, even with that kind >> of requirement, the misc interface would still work just fine. >> >> Have a pointer to your code anywhere? >> >> thanks, >> >> greg k-h >> > > Hello , > > Led class seems to be a very good idea. > > You can find below a snippet of my reworked code: > > > static struct led_classdev hex_classdev = { > .name = "hexclass", > }; > > static int my_probe(struct platform_device *pdev) > { > int ret; > > ret = led_classdev_register(&pdev->dev, &hex_classdev); > if (ret < 0) > return ret; > printk("led_classdev_register called in probe!\n"); > return ret; > } > > static int my_remove(struct platform_device *pdev) > { > led_classdev_unregister(&hex_classdev); > printk("led_clasdev_unregister called in remove\n"); > > return 0; > } > > > static struct platform_driver my_driver = { > .probe = my_probe, > .remove = my_remove, > .driver = { > .name = "led", > .owner = THIS_MODULE, > }, > }; > > static struct platform_device *my_device; > static int __init my_init(void) > { > > my_device = platform_device_register_simple("led", -1 , NULL, 0); > > return platform_driver_register(&my_driver); > } > > static void __exit my_exit(void) > { > > platform_device_unregister(my_device); > platform_driver_unregister(&my_driver); > } > > > The idea is that i want to dynamically create /dev/hexd in order to > write to my hexdisplay. > So i need to send an event like MAJOR=x, MINOR=y to udev and this > should do mknod /dev/hexd c MAJOR MINOR. > > I've noticed that for example , for printer class there is a file > /sys/class/printer/lp0/dev that contains MAJOR:MINOR. > > When i run my code there is no /sys/class/leds/hexclass/dev file created. > Could this be the problem? Is there any special function that must be called. > > > Thanks, > Daniel. > Ok , so it seems that /sys/class/leds/hexclass/dev is not created because of this function call chain: led_classdev_register - device_create_drvdata(led_class, parent , 0 , ... ) The third parameter should be a dev_t containing major and minor but is 0 , so no /hexclass/dev file is created. -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ