The USBKit (now actually part of the device kit, therefore residing in libdevice.so) is relevant for userland access to USB devices. As described in the document, it interfaces with the kernel and the USB stack through usb_raw. The listusb command line tool (src/bin/listusb. cpp) is one of the users of the USBKit and should serve as a nice example of how to use pretty much all of the enumeration features. Thanks for the idea. I'm looking at listusb right now. I had already used it to find my camera. It finds it and its many interfaces without issue, although for some reason my camera doesn't appear to have manufacturer or product fields. This appears to be normal for Logitech cameras, although, not for their mice (which also shows up) The usb_disk_device_added() hook is registered as the device added notify hook for the usb_floppy driver in this case. Line 1249 of the file you linked does that. The init_driver() function is the generic entry point for all kernel drivers (old style drivers anyway). As mentioned above you probably won't concern yourself with kernel drivers at all. So do userland drivers not register hook functions? This is the usb_webcam media add-on. It is loaded by the media_addon_server and therefore runs in userland. Hence all the hardware access it does goes through the USBKit as mentioned above. I'm not sure how exactly this one is structured, but I guess it uses a similar support descriptor based scheme as the USB stack itself. Not having your device details it's hard to tell if it would actually match the list of course. I was able to add my camera (A Logitech Quickcam Pro 9000) to the list of cameras. It was almost identical to the information for the 5000, but with changed productID. Doing this caused crashes into kernel debug land upon media server restart....sometimes. > usb_webcam_support_descriptor kSupportedDevices[] = { > // ofcourse we support a generic UVC device... > {{ CC_VIDEO, SC_VIDEOCONTROL, 0, 0, 0 }, "USB", "Video Class", > "??" }, ..... > > but I don't think this code is ever reached. Note that while the usb_webcam add-on is present on an average Haiku image, the UVCCamDevice.cpp isn't actually compiled in. Jérôme disabled it because it wasn't ready back in r36740. So before this would actually be usable you'd need to enable it again in the corresponding Jamfile (src/add-ons/media/media-add-ons/usb_webcam/Jamfile). I've done this. And have been moving it to the correct spot on my boot partition. New debug message and crashes confirm this. > If anyone could give me a clue as to the hierarchy of calls or just a > strategy for extracting any information at all from my camera, I'd > really appreciate it. You're most probably going to extend and finish implementing UVCCamDevice.cpp, so the first step would be to add it to your build and see where that gets you. Then maybe you'll also need to extend the list already present by your vendor and device ID (you can get them through listusb). However since the goal is a UVC video driver, the device should really already be of the USB Video Class and therefore match the generic support descriptor you mentioned above. I still don't know whether or not my device was ever picked up as a generic UVC device. I'll be looking into this, although I'm not sure how yet. I doubt it as when I placed my camera in the list of approved cameras manually things went bad pretty quickly. Also if you look at the listusb output for the camera (below) you can see that it's class is listed as Miscelaneous [sic]. Perhaps this has something to do with it not being deteced as a UVC device. If you want to just generally mess with your device without going too deep I'd suggest you start with the listusb source (src/bin/listusb. cpp) and modify it. It already provides the enumeration, so you could just check for your device and then use the other USBKit functions to interface with it. Thank you. I'm going to do this. One last thing. I was under the impression that isochronous transfers are not working porpoerly for EHCI. Do you know if this is true? --Gabriel P.S. listusb -v output follows. [Device /dev/bus/usb/1/0/3] Class .................. 0xef (Miscelaneous) Subclass ............... 0x02 Protocol ............... 0x01 Max Endpoint 0 Packet .. 64 USB Version ............ 0x0200 Vendor ID .............. 0x046d Product ID ............. 0x0809 Product Version ........ 0x0010 Manufacturer String .... "" Product String ......... "" Serial Number .......... "62190688" [Configuration 0] Configuration String . "" [Interface 0] [Alternate 0 active] Class .............. 0x0e (Video) Subclass ........... 0x01 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 16 Interval ......... 8 Type ............. Interrupt Direction ........ Input [Descriptor 0] Type ............. 0x24 Data ............. 01 00 01 f5 00 00 6c dc 02 01 01 [Descriptor 1] Type ............. 0x24 Data ............. 02 01 01 02 00 00 00 00 00 00 00 00 03 0e 08 00 [Descriptor 2] Type ............. 0x24 Data ............. 05 02 01 00 40 02 5b 17 00 [Descriptor 3] Type ............. 0x24 Data ............. 06 04 82 06 61 63 70 50 ab 49 b8 cc b3 85 5e 8d 22 1e 0a 01 02 02 ff 03 00 [Descriptor 4] Type ............. 0x24 Data ............. 06 0d 82 06 61 63 70 50 ab 49 b8 cc b3 85 5e 8d 22 1f 07 01 02 02 6f 01 00 [Descriptor 5] Type ............. 0x24 Data ............. 06 08 82 06 61 63 70 50 ab 49 b8 cc b3 85 5e 8d 22 51 03 01 04 03 19 00 00 00 [Descriptor 6] Type ............. 0x24 Data ............. 06 0a 82 06 61 63 70 50 ab 49 b8 cc b3 85 5e 8d 22 52 18 01 04 03 ff ff ff 00 [Descriptor 7] Type ............. 0x24 Data ............. 06 0e b7 93 5b a4 15 c7 02 45 90 f4 53 2a 3b 31 13 65 04 01 01 03 0f 00 00 00 [Descriptor 8] Type ............. 0x24 Data ............. 06 09 82 06 61 63 70 50 ab 49 b8 cc b3 85 5e 8d 22 56 05 01 04 03 0c 00 00 00 [Descriptor 9] Type ............. 0x24 Data ............. 06 0c 82 06 61 63 70 50 ab 49 b8 cc b3 85 5e 8d 22 50 11 01 04 03 fe 7f 70 00 [Descriptor 10] Type ............. 0x24 Data ............. 03 05 01 01 00 04 00 [Descriptor 11] Type ............. 0x41 Data ............. 01 0b 82 06 61 63 70 50 ab 49 b8 cc b3 85 5e 8d 22 55 01 01 04 03 01 00 00 00 00 00 00 00 [Descriptor 12] Type ............. 0x25 Data ............. 03 10 00 [Interface 1] [Alternate 0 active] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Descriptor 0] Type ............. 0x24 Data ............. 01 03 3c 07 81 00 05 02 01 00 01 00 04 04 [Descriptor 1] Type ............. 0x24 Data ............. 04 01 12 59 55 59 32 00 00 10 00 80 00 00 aa 00 38 9b 71 10 01 00 00 00 00 [Descriptor 2] Type ............. 0x24 Data ............. 05 01 00 80 02 e0 01 00 00 77 01 00 00 ca 08 00 60 09 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 3] Type ............. 0x24 Data ............. 05 02 00 a0 00 78 00 00 70 17 00 00 a0 8c 00 00 96 00 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 4] Type ............. 0x24 Data ............. 05 03 00 b0 00 90 00 00 f0 1e 00 00 a0 b9 00 00 c6 00 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 5] Type ............. 0x24 Data ............. 05 04 00 40 01 f0 00 00 c0 5d 00 00 80 32 02 00 58 02 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 6] Type ............. 0x24 Data ............. 05 05 00 60 01 20 01 00 c0 7b 00 00 80 e6 02 00 18 03 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 7] Type ............. 0x24 Data ............. 05 06 00 80 02 68 01 00 40 19 01 00 80 97 06 00 08 07 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 8] Type ............. 0x24 Data ............. 05 07 00 80 02 90 01 00 80 38 01 00 00 53 07 00 d0 07 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 9] Type ............. 0x24 Data ............. 05 08 00 00 03 e0 01 00 00 c2 01 00 00 ca 08 00 40 0b 00 80 1a 06 00 05 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 10] Type ............. 0x24 Data ............. 05 09 00 20 03 c8 01 00 50 bd 01 00 90 b2 08 00 22 0b 00 80 1a 06 00 05 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 11] Type ............. 0x24 Data ............. 05 0a 00 20 03 f8 01 00 30 ec 01 00 f0 9c 09 00 4e 0c 00 80 1a 06 00 05 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 12] Type ............. 0x24 Data ............. 05 0b 00 20 03 58 02 00 f0 49 02 00 b0 71 0b 00 a6 0e 00 80 1a 06 00 05 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 13] Type ............. 0x24 Data ............. 05 0c 00 60 03 e0 01 00 40 fa 01 00 40 e3 09 00 a8 0c 00 80 1a 06 00 05 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 14] Type ............. 0x24 Data ............. 05 0d 00 c0 03 d0 02 00 c0 4b 03 00 40 e3 09 00 18 15 00 40 42 0f 00 03 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 15] Type ............. 0x24 Data ............. 05 0e 00 00 05 d0 02 00 00 65 04 00 00 ca 08 00 20 1c 00 80 84 1e 00 02 55 58 14 00 80 84 1e 00 [Descriptor 16] Type ............. 0x24 Data ............. 05 0f 00 00 05 20 03 00 00 e2 04 00 00 c4 09 00 40 1f 00 80 84 1e 00 02 55 58 14 00 80 84 1e 00 [Descriptor 17] Type ............. 0x24 Data ............. 05 10 00 40 06 88 03 00 a0 e5 06 00 a0 e5 06 00 24 2c 00 80 84 1e 00 01 80 84 1e 00 [Descriptor 18] Type ............. 0x24 Data ............. 05 11 00 40 06 e8 03 00 20 a1 07 00 20 a1 07 00 d4 30 00 80 84 1e 00 01 80 84 1e 00 [Descriptor 19] Type ............. 0x24 Data ............. 05 12 00 40 06 b0 04 00 c0 27 09 00 c0 27 09 00 98 3a 00 80 84 1e 00 01 80 84 1e 00 [Descriptor 20] Type ............. 0x24 Data ............. 03 00 12 80 02 e0 01 a0 00 78 00 b0 00 90 00 40 01 f0 00 60 01 20 01 80 02 68 01 80 02 90 01 00 03 e0 01 20 03 c8 01 20 03 f8 01 20 03 58 02 60 03 e0 01 c0 03 d0 02 00 05 d0 02 00 05 20 03 40 06 88 03 40 06 e8 03 40 06 b0 04 01 05 [Descriptor 21] Type ............. 0x24 Data ............. 0d 01 01 04 [Descriptor 22] Type ............. 0x24 Data ............. 06 02 12 01 01 00 00 00 00 [Descriptor 23] Type ............. 0x24 Data ............. 07 01 00 80 02 e0 01 00 00 77 01 00 00 ca 08 00 60 09 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 24] Type ............. 0x24 Data ............. 07 02 00 a0 00 78 00 00 70 17 00 00 a0 8c 00 00 96 00 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 25] Type ............. 0x24 Data ............. 07 03 00 b0 00 90 00 00 f0 1e 00 00 a0 b9 00 00 c6 00 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 26] Type ............. 0x24 Data ............. 07 04 00 40 01 f0 00 00 c0 5d 00 00 80 32 02 00 58 02 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 27] Type ............. 0x24 Data ............. 07 05 00 60 01 20 01 00 c0 7b 00 00 80 e6 02 00 18 03 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 28] Type ............. 0x24 Data ............. 07 06 00 80 02 68 01 00 40 19 01 00 80 97 06 00 08 07 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 29] Type ............. 0x24 Data ............. 07 07 00 80 02 90 01 00 80 38 01 00 00 53 07 00 d0 07 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 30] Type ............. 0x24 Data ............. 07 08 00 00 03 e0 01 00 00 c2 01 00 00 8c 0a 00 40 0b 00 15 16 05 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 31] Type ............. 0x24 Data ............. 07 09 00 20 03 c8 01 00 50 bd 01 00 e0 6f 0a 00 22 0b 00 2a 2c 0a 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 32] Type ............. 0x24 Data ............. 07 0a 00 20 03 f8 01 00 30 ec 01 00 20 89 0b 00 4e 0c 00 2a 2c 0a 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 33] Type ............. 0x24 Data ............. 07 0b 00 20 03 58 02 00 f0 49 02 00 a0 bb 0d 00 a6 0e 00 2a 2c 0a 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 34] Type ............. 0x24 Data ............. 07 0c 00 60 03 e0 01 00 40 fa 01 00 80 dd 0b 00 a8 0c 00 2a 2c 0a 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 35] Type ............. 0x24 Data ............. 07 0d 00 c0 03 d0 02 00 c0 4b 03 00 80 c6 13 00 18 15 00 40 42 0f 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 36] Type ............. 0x24 Data ............. 07 0e 00 00 05 d0 02 00 00 65 04 00 00 5e 1a 00 20 1c 00 40 42 0f 00 06 15 16 05 00 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 37] Type ............. 0x24 Data ............. 07 0f 00 00 05 20 03 00 00 e2 04 00 00 6a 18 00 40 1f 00 40 42 0f 00 05 80 1a 06 00 20 a1 07 00 2a 2c 0a 00 40 42 0f 00 80 84 1e 00 [Descriptor 38] Type ............. 0x24 Data ............. 07 10 00 40 06 88 03 00 a0 e5 06 00 40 cb 0d 00 24 2c 00 40 42 0f 00 02 40 42 0f 00 80 84 1e 00 [Descriptor 39] Type ............. 0x24 Data ............. 07 11 00 40 06 e8 03 00 20 a1 07 00 40 42 0f 00 d4 30 00 40 42 0f 00 02 40 42 0f 00 80 84 1e 00 [Descriptor 40] Type ............. 0x24 Data ............. 07 12 00 40 06 b0 04 00 c0 27 09 00 80 4f 12 00 98 3a 00 80 84 1e 00 02 40 42 0f 00 80 84 1e 00 [Descriptor 41] Type ............. 0x24 Data ............. 03 00 12 80 02 e0 01 a0 00 78 00 b0 00 90 00 40 01 f0 00 60 01 20 01 80 02 68 01 80 02 90 01 00 03 e0 01 20 03 c8 01 20 03 f8 01 20 03 58 02 60 03 e0 01 c0 03 d0 02 00 05 d0 02 00 05 20 03 40 06 88 03 40 06 e8 03 40 06 b0 04 05 05 0a 0f 14 19 [Descriptor 42] Type ............. 0x24 Data ............. 0d 01 01 04 [Alternate 1] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 192 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 2] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 384 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 3] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 512 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 4] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 640 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 5] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 800 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 6] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 944 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 7] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 2688 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 8] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 2848 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 9] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 3040 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 10] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 4992 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Alternate 11] Class .............. 0x0e (Video) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 5116 Interval ......... 1 Type ............. Isochronous Direction ........ Input [Descriptor 0] Type ............. 0x0b Data ............. 02 02 01 02 00 00 [Interface 2] [Alternate 0 active] Class .............. 0x01 (Audio) Subclass ........... 0x01 Protocol ........... 0x00 Interface String ... "" [Descriptor 0] Type ............. 0x24 Data ............. 01 00 01 26 00 01 03 [Descriptor 1] Type ............. 0x24 Data ............. 02 01 01 02 00 01 00 00 00 00 [Descriptor 2] Type ............. 0x24 Data ............. 03 03 01 01 01 05 00 [Descriptor 3] Type ............. 0x24 Data ............. 06 05 01 01 03 00 00 [Interface 3] [Alternate 0 active] Class .............. 0x01 (Audio) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Alternate 1] Class .............. 0x01 (Audio) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 68 Interval ......... 4 Type ............. Isochronous Direction ........ Input [Descriptor 0] Type ............. 0x24 Data ............. 01 03 01 01 00 [Descriptor 1] Type ............. 0x24 Data ............. 02 01 01 02 10 01 80 3e 00 [Descriptor 2] Type ............. 0x25 Data ............. 01 01 00 00 00 [Alternate 2] Class .............. 0x01 (Audio) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 100 Interval ......... 4 Type ............. Isochronous Direction ........ Input [Descriptor 0] Type ............. 0x24 Data ............. 01 03 01 01 00 [Descriptor 1] Type ............. 0x24 Data ............. 02 01 01 02 10 01 c0 5d 00 [Descriptor 2] Type ............. 0x25 Data ............. 01 01 00 00 00 [Alternate 3] Class .............. 0x01 (Audio) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 132 Interval ......... 4 Type ............. Isochronous Direction ........ Input [Descriptor 0] Type ............. 0x24 Data ............. 01 03 01 01 00 [Descriptor 1] Type ............. 0x24 Data ............. 02 01 01 02 10 01 00 7d 00 [Descriptor 2] Type ............. 0x25 Data ............. 01 01 00 00 00 [Alternate 4] Class .............. 0x01 (Audio) Subclass ........... 0x02 Protocol ........... 0x00 Interface String ... "" [Endpoint 0] MaxPacketSize .... 196 Interval ......... 4 Type ............. Isochronous Direction ........ Input [Descriptor 0] Type ............. 0x24 Data ............. 01 03 01 01 00 [Descriptor 1] Type ............. 0x24 Data ............. 02 01 01 02 10 01 80 bb 00 [Descriptor 2] Type ............. 0x25 Data ............. 01 01 00 00 00 On 6/13/11, Michael Lotz <mmlr@xxxxxxxx> wrote: >> You can safely ignore the usb_floppy driver messages. All USB add-ons >> (drivers) on the system are loaded/called when a USB device is >> plugged. > > For completeness: That's not accurate. The usb_floppy driver had a bug > which caused it to be called for all devices. In normal operation > however, USB drivers register with a specific set of supported devices > (via usb_support_descriptors) so they are only called for devices they > are actually interested in. > > Regards > Michael > >