Following yesterday feedback, I wrote a patch merging
usb_video_header_desc and usb_video_header_desc_all in uvideo.c .
Current kernel compile fine with it on amd64 and video display image.
At the moment, I can't test the patch on other platform. So I'm looking
for feedback, on the pattern used and if it change anything on
non-amd64. If those are positive, there is a couple of structure I would
alter in the same way.
Index: sys/dev/usb//uvideo.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uvideo.c,v
retrieving revision 1.181
diff -u -p -r1.181 uvideo.c
--- sys/dev/usb//uvideo.c 9 Jul 2015 14:58:32 -0000 1.181
+++ sys/dev/usb//uvideo.c 17 Jul 2015 11:03:48 -0000
@@ -84,7 +84,7 @@ struct uvideo_softc {
int sc_nframes;
struct usb_video_probe_commit sc_desc_probe;
- struct usb_video_header_desc_all sc_desc_vc_header;
+ struct usb_video_header_desc *sc_desc_vc_header;
struct usb_video_input_header_desc_all sc_desc_vs_input_header;
#define UVIDEO_MAX_PU 8
@@ -694,16 +694,15 @@ uvideo_vc_parse_desc_header(struct uvide
{
struct usb_video_header_desc *d;
- d = (struct usb_video_header_desc *)(uint8_t *)desc;
+ d = (struct usb_video_header_desc *)desc;
if (d->bInCollection == 0) {
printf("%s: no VS interface found!\n",
DEVNAME(sc));
return (USBD_INVAL);
}
-
- sc->sc_desc_vc_header.fix = d;
- sc->sc_desc_vc_header.baInterfaceNr = (uByte *)(d + 1);
+
+ sc->sc_desc_vc_header = d;
return (USBD_NORMAL_COMPLETION);
}
@@ -838,7 +837,7 @@ uvideo_vs_parse_desc(struct uvideo_softc
DPRINTF(1, "%s: number of total interfaces=%d\n",
DEVNAME(sc), sc->sc_nifaces);
DPRINTF(1, "%s: number of VS interfaces=%d\n",
- DEVNAME(sc), sc->sc_desc_vc_header.fix->bInCollection);
+ DEVNAME(sc), sc->sc_desc_vc_header->bInCollection);
usbd_desc_iter_init(sc->sc_udev, &iter);
desc = usbd_desc_iter_next(&iter);
@@ -874,8 +873,8 @@ uvideo_vs_parse_desc(struct uvideo_softc
return (error);
/* parse interface collection */
- for (i = 0; i < sc->sc_desc_vc_header.fix->bInCollection; i++) {
- iface = sc->sc_desc_vc_header.baInterfaceNr[i];
+ for (i = 0; i < sc->sc_desc_vc_header->bInCollection; i++) {
+ iface = sc->sc_desc_vc_header->baInterfaceNr[i];
id = usbd_get_interface_descriptor(&sc->sc_udev->ifaces[iface]);
if (id == NULL) {
@@ -1500,12 +1499,12 @@ uvideo_vs_negotiation(struct uvideo_soft
* Some UVC 1.00 devices return dwMaxVideoFrameSize = 0.
* If so, fix it by format/frame descriptors.
*/
- hd = sc->sc_desc_vc_header.fix;
+ hd = sc->sc_desc_vc_header;
if (UGETDW(pc->dwMaxVideoFrameSize) == 0 &&
UGETW(hd->bcdUVC) < 0x0110 ) {
DPRINTF(1, "%s: dwMaxVideoFrameSize == 0, fixed\n",
DEVNAME(sc));
- USETDW(pc->dwMaxVideoFrameSize,
+ USETDW(pc->dwMaxVideoFrameSize,
UGETDW(frame->dwMaxVideoFrameBufferSize));
}
}
Index: sys/dev/usb//uvideo.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/uvideo.h,v
retrieving revision 1.57
diff -u -p -r1.57 uvideo.h
--- sys/dev/usb//uvideo.h 9 Jul 2015 14:58:32 -0000 1.57
+++ sys/dev/usb//uvideo.h 17 Jul 2015 11:03:48 -0000
@@ -162,13 +162,9 @@ struct usb_video_header_desc {
uWord wTotalLength;
uDWord dwClockFrequency;
uByte bInCollection;
+ uByte baInterfaceNr[1];
} __packed;
-struct usb_video_header_desc_all {
- struct usb_video_header_desc *fix;
- uByte *baInterfaceNr;
-};
-
/* Table 3-4: Input Terminal Descriptor */
struct usb_video_input_terminal_desc {
uByte bLength;