Hi everybody, here's a patch to fix camera descriptors parsing for UVC devices. The camera descriptors currently reports "junk at descriptor end".
Laurent Pinchart
? camera_controls.patch Index: lsusb.c =================================================================== RCS file: /cvsroot/linux-usb/usbutils/lsusb.c,v retrieving revision 1.22 diff -u -r1.22 lsusb.c --- lsusb.c 17 Jan 2006 15:59:46 -0000 1.22 +++ lsusb.c 6 Feb 2006 13:46:45 -0000 @@ -1236,6 +1236,14 @@ "White Balance Component, Auto", "Digital Multiplier", "Digital Multiplier Limit", "Analog Video Standard", "Analog Video Lock Status" }; + static const char *camctrlnames[] = { + "Scanning Mode", "Auto-Exposure Mode", "Auto-Exposure Priority", + "Exposure Time (Absolute)", "Exposure Time (Relative)", "Focus (Absolute)", + "Focus (Relative)", "Iris (Absolute)", "Iris (Relative)", "Zoom (Absolute)", + "Zoom (Relative)", "PanTilt (Absolute)", "PanTilt (Relative)", + "Roll (Absolute)", "Roll (Relative)", "Reserved", "Reserved", "Focus, Auto", + "Privacy" + }; static const char *stdnames[] = { "None", "NTSC - 525/60", "PAL - 625/50", "SECAM - 625/50", "NTSC - 625/50", "PAL - 525/60" }; @@ -1273,8 +1281,9 @@ printf("(INPUT_TERMINAL)\n"); get_string(dev, term, sizeof(term), buf[7]); termt = buf[4] | (buf[5] << 8); + n = termt == 0x0201 ? 7 : 0; get_videoterminal_string(termts, sizeof(termts), termt); - if (buf[0] < 8) + if (buf[0] < 8 + n) printf(" Warning: Descriptor too short\n"); printf(" bTerminalID %5u\n" " wTerminalType 0x%04x %s\n" @@ -1282,8 +1291,23 @@ buf[3], termt, termts, buf[6]); printf(" iTerminal %5u %s\n", buf[7], term); - /* TODO: handle additional data */ - dump_junk(buf, " ", 8); + if (termt == 0x0201) { + n += buf[14]; + printf(" wObjectiveFocalLengthMin %5u\n" + " wObjectiveFocalLengthMax %5u\n" + " wOcularFocalLength %5u\n" + " bControlSize %5u\n", + buf[8] | (buf[9] << 8), buf[10] | (buf[11] << 8), + buf[12] | (buf[13] << 8), buf[14]); + ctrls = 0; + for (i = 0; i < 3 && i < buf[14]; i++) + ctrls = (ctrls << 8) | buf[8+n-i-1]; + printf(" bmControls 0x%08x\n", ctrls); + for (i = 0; i < 19; i++) + if ((ctrls >> i) & 1) + printf(" %s\n", camctrlnames[i]); + } + dump_junk(buf, " ", 8+n); break; case 0x03: /* OUTPUT_TERMINAL */ @@ -1525,7 +1549,8 @@ buf[9] | (buf[10] << 8) | (buf[11] << 16) | (buf[12] << 24), buf[13] | (buf[14] << 8) | (buf[15] << 16) | (buf[16] << 24), buf[17] | (buf[18] << 8) | (buf[19] << 16) | (buf[20] << 24), - buf[23], buf[25]); + buf[21] | (buf[22] << 8) | (buf[23] << 16) | (buf[24] << 24), + buf[25]); if (buf[25] == 0) printf(" dwMinFrameInterval %9u\n" " dwMaxFrameInterval %9u\n"