I'm replying to myself, just that someone else could propably find (by
googling) the issue interesting
Anyway, I solved my problem by using a new char device and class for my
USB device.
alloc_chrdev_region(&x2s_dev, 0, X2S_NR_OF_DEVICES*X2S_MINORS,
"x2s_usb");
x2s_class = class_simple_create(THIS_MODULE, "x2s_usb");
And then I was able to do whatever I wanted with the char device entries
and minors. Now I have only firmware loading device appearing upon
plug-in. The block and iso streams become available, when the firmware
is succesfully loaded.
How reasonable it is to create new classes, I don't know. But it works.
Jouni
On Mon, 2005-08-29 at 09:56 +0300, Jouni Rynö wrote:
> The problem with reimplementing the usb_register_dev() is the non
> existing external access to the "static struct file_operations
> *usb_minors[MAX_USB_MINORS]".
>
> The FPGA board itself has only iso endpoints, the rest of the system is
> controlled via control messages. One could in principle implement the
> access via library, but then that would need wrappers for different
> languges. A file access interface is much much cleaner to do, and
> something the hardware designers mentally like better :)
>
>
> So now I have working hack, of which I'm not very proud of :(
>
> First the probel:
>
> usb_set_intfdata(interface, dev);
>
> retval = usb_register_dev(interface, &x2s_firmware);
> if (retval) {
> err ("Not able to get a minor for this device.");
> usb_set_intfdata(interface, NULL);
> goto error;
> }
> dev->io_minors[0] = interface->minor;
> info ("USB X2S device firmware now attached to minor %d",
> interface->minor);
> retval = usb_register_dev(interface, &x2s_io);
> if (retval) {
> err ("Not able to get a minor for this device.");
> usb_set_intfdata(interface, NULL);
> goto error;
> }
> dev->io_minors[1] = interface->minor;
> info ("USB X2S device io now attached to minor %d", interface->minor);
> retval = usb_register_dev(interface, &x2s_iso);
> if (retval) {
> err ("Not able to get a minor for this device.");
> usb_set_intfdata(interface, NULL);
> goto error;
> }
> dev->io_minors[2] = interface->minor;
> info ("USB X2S device iso now attached to minor %d", interface->minor);
> interface->minor = dev->io_minors[0];
> dev->minor = interface->minor;
>
>
> and then in the open():
>
> minor = iminor(inode);
>
> interface = usb_find_interface(&x2s_driver, minor);
> if (!interface) {
> interface = usb_find_interface(&x2s_driver, minor-1);
> if (!interface) {
> interface = usb_find_interface(&x2s_driver, minor-2);
> if (!interface) {
> err("%s-error, can't find device for minor %d",
> __FUNCTION__, minor);
> return -ENODEV;
> }
> }
> }
>
> dev = usb_get_intfdata(interface);
> if (!dev) {
> return -ENODEV;
> }
>
> index = -1;
> for (ii=0;ii<X2S_MINORS;ii++) {
> if (minor == dev->io_minors[ii]) {
> index = ii;
> }
> }
> dbg ( " - minor is %d, index %i", minor, index);
> if (index < 0) {
> return -ENODEV;
> }
>
>
>
> regards
> Jouni
>
>
>
> On Thu, 2005-08-25 at 15:03 +0200, Clemens Ladisch wrote:
> > Jouni Rynö wrote:
> > > I try to upgrade my x2s_usb 2.4 kernel driver to 2.6.
> > >
> > > On 2.4 the driver had 6 /dev entries (via devfs)
> > >
> > > Now I have to say, that I cannot figure out the proper way to
> > > generate these /dev entries for the USB-driver. None of the kernel
> > > provided drivers seem to have that kind of multiple interface.
> >
> > The ALSA drivers do this. Their device registrations end up in
> > snd_register_device() (in sound/core/sound.c).
> >
> > The main difference to usb_register_dev() seems to be that the former
> > stores the minors in a list. I'd guess you'd have to reimplement
> > usb_register_dev() with this change.
> >
> >
> > HTH
> > Clemens
> >
--
Jouni Rynö mailto://[EMAIL PROTECTED]/
http://www.geo.fmi.fi/~ryno/
Finnish Meteorological Institute http://www.fmi.fi/
Space Research http://www.geo.fmi.fi/
P.O.BOX 503 Tel (+358)-9-19294656
FIN-00101 Helsinki FAX (+358)-9-19294603
Finland priv-GSM (+358)-50-5302903
"It's just zeros and ones, it cannot be hard"
-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel