Getting into USB drivers

Farhan Khan khanzf at gmail.com
Fri Oct 27 03:18:09 UTC 2017


Hi!

I am working with on a PCIe driver, but I've done a bit of reading on 
USB drivers on Linux, and its probably not too different from BSD.

Chapter 9 of the Architecture Handbook is a good start.  The usb(4) man 
page is pretty solid, it gets into the data structures and API calls. In 
my opinion though, man pages don't make any sense unless you already 
have a sense of what you are doing, so I would also read a few sample 
drivers that are out there. There's an excellent book called "FreeBSD 
Device Drivers: A Guide for the Intrepid" that helps to bring everything 
together. It has sample drivers and builds you into things slowly.

Though a different OS, the Linux documentation is pretty good. One 
article that helped me was this: 
http://matthias.vallentin.net/blog/2007/04/writing-a-linux-kernel-driver-for-an-unknown-usb-device/ 
and Linux's drivers/usb/usb-skeleton.c sample driver.

That looks like a laptop camera, right? I think I used to have it. Would 
be great if you got it over!

On 10/26/2017 10:18 PM, blubee blubeeme wrote:
> I have a USB webcam that I would like to get into writing drivers for as a
> practical introduction to writing drivers for FreeBSD. I am not sure if
> this one already has a driver but here's the usb dump of the device.
> 
> Anyone here willing to give me some pointers on writing drivers?
> 
> 
> me at blubee:~ % sudo usbconfig -d 0.5 dump_all_config_desc
> Password:
> ugen0.5: <SunplusIT Inc Chicony USB 2.0 Camera> at usbus0, cfg=0 md=HOST
> spd=HIGH (480Mbps) pwr=ON (500mA)
> 
> 
>   Configuration index 0
> 
>      bLength = 0x0009
>      bDescriptorType = 0x0002
>      wTotalLength = 0x03a9
>      bNumInterfaces = 0x0002
>      bConfigurationValue = 0x0001
>      iConfiguration = 0x0000  <no string>
>      bmAttributes = 0x0080
>      bMaxPower = 0x00fa
> 
>      Additional Descriptor
> 
>      bLength = 0x08
>      bDescriptorType = 0x0b
>      bDescriptorSubType = 0x00
>       RAW dump:
>       0x00 | 0x08, 0x0b, 0x00, 0x02, 0x0e, 0x03, 0x00, 0x04
> 
> 
>      Interface 0
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0000
>        bAlternateSetting = 0x0000
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0001
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0004  <Chicony USB 2.0 Camera>
> 
>        Additional Descriptor
> 
>        bLength = 0x0d
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x01
>         RAW dump:
>         0x00 | 0x0d, 0x24, 0x01, 0x00, 0x01, 0x6d, 0x00, 0x00,
>         0x08 | 0x6c, 0xdc, 0x02, 0x01, 0x01
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x12
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x02
>         RAW dump:
>         0x00 | 0x12, 0x24, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00,
>         0x08 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e,
>         0x10 | 0x00, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x0b
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x0b, 0x24, 0x05, 0x02, 0x01, 0x00, 0x40, 0x02,
>         0x08 | 0x7f, 0x15, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1d
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x06
>         RAW dump:
>         0x00 | 0x1d, 0x24, 0x06, 0x03, 0xc3, 0x85, 0xb8, 0x0f,
>         0x08 | 0xc2, 0x68, 0x47, 0x45, 0x90, 0xf7, 0x8f, 0x47,
>         0x10 | 0x57, 0x9d, 0x95, 0xfc, 0x00, 0x01, 0x02, 0x04,
>         0x18 | 0x1f, 0x00, 0x00, 0x00, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1d
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x06
>         RAW dump:
>         0x00 | 0x1d, 0x24, 0x06, 0x04, 0x82, 0x06, 0x61, 0x63,
>         0x08 | 0x70, 0x50, 0xab, 0x49, 0xb8, 0xcc, 0xb3, 0x85,
>         0x10 | 0x5e, 0x8d, 0x22, 0x1d, 0x00, 0x01, 0x03, 0x04,
>         0x18 | 0xff, 0xff, 0x71, 0x00, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x09
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x03
>         RAW dump:
>         0x00 | 0x09, 0x24, 0x03, 0x05, 0x01, 0x01, 0x00, 0x04,
>         0x08 | 0x00
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0087  <IN>
>          bmAttributes = 0x0003  <INTERRUPT>
>          wMaxPacketSize = 0x0010
>          bInterval = 0x0008
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
>        Additional Descriptor
> 
>        bLength = 0x05
>        bDescriptorType = 0x25
>        bDescriptorSubType = 0x03
>         RAW dump:
>         0x00 | 0x05, 0x25, 0x03, 0x05, 0x04
> 
> 
> 
>      Interface 1
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0000
>        bNumEndpoints = 0x0000
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>        Additional Descriptor
> 
>        bLength = 0x0f
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x01
>         RAW dump:
>         0x00 | 0x0f, 0x24, 0x01, 0x02, 0x5d, 0x02, 0x81, 0x00,
>         0x08 | 0x05, 0x01, 0x01, 0x00, 0x01, 0x04, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x0b
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x06
>         RAW dump:
>         0x00 | 0x0b, 0x24, 0x06, 0x01, 0x09, 0x01, 0x01, 0x00,
>         0x08 | 0x00, 0x00, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x01, 0x01, 0x80, 0x07, 0x38,
>         0x08 | 0x04, 0x00, 0x80, 0x53, 0x3b, 0x00, 0x80, 0x53,
>         0x10 | 0x3b, 0x00, 0x48, 0x3f, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x02, 0x01, 0xa0, 0x00, 0x78,
>         0x08 | 0x00, 0x00, 0xa0, 0x8c, 0x00, 0x00, 0xa0, 0x8c,
>         0x10 | 0x00, 0x00, 0x96, 0x00, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x03, 0x01, 0xb0, 0x00, 0x90,
>         0x08 | 0x00, 0x00, 0xa0, 0xb9, 0x00, 0x00, 0xa0, 0xb9,
>         0x10 | 0x00, 0x00, 0xc6, 0x00, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x04, 0x01, 0x40, 0x01, 0xf0,
>         0x08 | 0x00, 0x00, 0x80, 0x32, 0x02, 0x00, 0x80, 0x32,
>         0x10 | 0x02, 0x00, 0x58, 0x02, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x05, 0x01, 0x60, 0x01, 0x20,
>         0x08 | 0x01, 0x00, 0x80, 0xe6, 0x02, 0x00, 0x80, 0xe6,
>         0x10 | 0x02, 0x00, 0x18, 0x03, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x06, 0x01, 0x80, 0x02, 0x68,
>         0x08 | 0x01, 0x00, 0x80, 0x97, 0x06, 0x00, 0x80, 0x97,
>         0x10 | 0x06, 0x00, 0x08, 0x07, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x07, 0x01, 0x80, 0x02, 0xe0,
>         0x08 | 0x01, 0x00, 0x00, 0xca, 0x08, 0x00, 0x00, 0xca,
>         0x10 | 0x08, 0x00, 0x60, 0x09, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x08, 0x01, 0x00, 0x05, 0xd0,
>         0x08 | 0x02, 0x00, 0x00, 0x5e, 0x1a, 0x00, 0x00, 0x5e,
>         0x10 | 0x1a, 0x00, 0x20, 0x1c, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x07
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x07, 0x09, 0x01, 0x00, 0x05, 0x00,
>         0x08 | 0x04, 0x00, 0x00, 0x80, 0x25, 0x00, 0x00, 0x80,
>         0x10 | 0x25, 0x00, 0x00, 0x28, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x06
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x0d
>         RAW dump:
>         0x00 | 0x06, 0x24, 0x0d, 0x01, 0x01, 0x04
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1b
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x04
>         RAW dump:
>         0x00 | 0x1b, 0x24, 0x04, 0x02, 0x09, 0x59, 0x55, 0x59,
>         0x08 | 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00,
>         0x10 | 0xaa, 0x00, 0x38, 0x9b, 0x71, 0x10, 0x01, 0x00,
>         0x18 | 0x00, 0x00, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x01, 0x01, 0x80, 0x07, 0x38,
>         0x08 | 0x04, 0x00, 0x40, 0xe3, 0x09, 0x00, 0x40, 0xe3,
>         0x10 | 0x09, 0x00, 0x48, 0x3f, 0x00, 0x80, 0x84, 0x1e,
>         0x18 | 0x00, 0x01, 0x80, 0x84, 0x1e, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x02, 0x01, 0xa0, 0x00, 0x78,
>         0x08 | 0x00, 0x00, 0xa0, 0x8c, 0x00, 0x00, 0xa0, 0x8c,
>         0x10 | 0x00, 0x00, 0x96, 0x00, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x03, 0x01, 0xb0, 0x00, 0x90,
>         0x08 | 0x00, 0x00, 0xa0, 0xb9, 0x00, 0x00, 0xa0, 0xb9,
>         0x10 | 0x00, 0x00, 0xc6, 0x00, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x04, 0x01, 0x40, 0x01, 0xf0,
>         0x08 | 0x00, 0x00, 0x80, 0x32, 0x02, 0x00, 0x80, 0x32,
>         0x10 | 0x02, 0x00, 0x58, 0x02, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x05, 0x01, 0x60, 0x01, 0x20,
>         0x08 | 0x01, 0x00, 0x80, 0xe6, 0x02, 0x00, 0x80, 0xe6,
>         0x10 | 0x02, 0x00, 0x18, 0x03, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x06, 0x01, 0x80, 0x02, 0x68,
>         0x08 | 0x01, 0x00, 0x80, 0x97, 0x06, 0x00, 0x80, 0x97,
>         0x10 | 0x06, 0x00, 0x08, 0x07, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x07, 0x01, 0x80, 0x02, 0xe0,
>         0x08 | 0x01, 0x00, 0x00, 0xca, 0x08, 0x00, 0x00, 0xca,
>         0x10 | 0x08, 0x00, 0x60, 0x09, 0x00, 0x15, 0x16, 0x05,
>         0x18 | 0x00, 0x01, 0x15, 0x16, 0x05, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x08, 0x01, 0x00, 0x05, 0xd0,
>         0x08 | 0x02, 0x00, 0x00, 0xca, 0x08, 0x00, 0x00, 0xca,
>         0x10 | 0x08, 0x00, 0x20, 0x1c, 0x00, 0x40, 0x42, 0x0f,
>         0x18 | 0x00, 0x01, 0x40, 0x42, 0x0f, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x1e
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x05
>         RAW dump:
>         0x00 | 0x1e, 0x24, 0x05, 0x09, 0x01, 0x00, 0x05, 0x00,
>         0x08 | 0x04, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x40,
>         0x10 | 0x06, 0x00, 0x00, 0x28, 0x00, 0x80, 0x84, 0x1e,
>         0x18 | 0x00, 0x01, 0x80, 0x84, 0x1e, 0x00
> 
> 
>        Additional Descriptor
> 
>        bLength = 0x06
>        bDescriptorType = 0x24
>        bDescriptorSubType = 0x0d
>         RAW dump:
>         0x00 | 0x06, 0x24, 0x0d, 0x01, 0x01, 0x04
> 
> 
> 
>      Interface 1 Alt 1
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0001
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x00c0
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 2
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0002
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x0180
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 3
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0003
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x0200
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 4
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0004
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x0280
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 5
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0005
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x0320
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 6
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0006
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x03b0
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 7
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0007
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x0a80
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 8
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0008
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x0b20
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 9
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x0009
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x0be0
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 10
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x000a
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x13c0
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> 
> 
>      Interface 1 Alt 11
>        bLength = 0x0009
>        bDescriptorType = 0x0004
>        bInterfaceNumber = 0x0001
>        bAlternateSetting = 0x000b
>        bNumEndpoints = 0x0001
>        bInterfaceClass = 0x000e  <Video device>
>        bInterfaceSubClass = 0x0002
>        bInterfaceProtocol = 0x0000
>        iInterface = 0x0000  <no string>
> 
>       Endpoint 0
>          bLength = 0x0007
>          bDescriptorType = 0x0005
>          bEndpointAddress = 0x0081  <IN>
>          bmAttributes = 0x0005  <ASYNC-ISOCHRONOUS>
>          wMaxPacketSize = 0x13fc
>          bInterval = 0x0001
>          bRefresh = 0x0000
>          bSynchAddress = 0x0000
> _______________________________________________
> freebsd-drivers at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-drivers
> To unsubscribe, send any mail to "freebsd-drivers-unsubscribe at freebsd.org"
> 


More information about the freebsd-drivers mailing list