Shine Ultra - FreeBSD
Hardware info on main page.
local links
History
2024-12-26: c1 - rust - the LinuxVideo crate has a few nice examples: info for video0
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example info /dev/video0 Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.03s Running `target/debug/examples/info /dev/video0` card: ET13R driver: uvcvideo bus info: usb-/dev/usb-/dev/usb all capabilities: VIDEO_CAPTURE | EXT_PIX_FORMAT | META_CAPTURE | STREAMING | DEVICE_CAPS avail. capabilities: VIDEO_CAPTURE | EXT_PIX_FORMAT | STREAMING - supported formats for VIDEO_CAPTURE buffers: - [MJPG] Motion-JPEG COMPRESSED - [ 0] 1920x1080 @ 1/15, 1/10, 1/7 - [ 1] 3840x2160 @ 1/15, 1/10, 1/7 - [ 2] 2592x1944 @ 1/15, 1/10, 1/7 - [ 3] 2048x1536 @ 1/15, 1/10, 1/7 - [ 4] 1280x720 @ 1/15, 1/10, 1/7 - [ 5] 1600x1200 @ 1/15, 1/10, 1/7 - [ 6] 1024x768 @ 1/15, 1/10, 1/7 - [ 7] 1024x576 @ 1/15, 1/10, 1/7 - [ 8] 800x480 @ 1/15, 1/10, 1/7 - [ 9] 640x480 @ 1/15, 1/10, 1/7 - [10] 4160x3120 @ 1/15, 1/10, 1/7 - [11] 1536x1152 @ 1/15, 1/10, 1/7 - [12] 3672x2754 @ 1/15, 1/10, 1/7 - active format for VIDEO_CAPTURE buffer: VideoCapture(PixFormat { width: 4160, height: 3120, pixel_format: MJPG, field: NONE, bytesperline: 0, sizeimage: 3244800, colorspace: SMPTE240M, flags: (empty), enc: 8, quantization: DEFAULT, xfer_func: SMPTE240M }) - inputs: - [CAMERA] Camera 1 audioset: 0b0 tuner: 0 std: (empty) capabilities: (empty) - outputs: - controls: - [CONTRAST] "Contrast", INTEGER [1-64, default=36] - [SATURATION] "Saturation", INTEGER [1-64, default=32] - [HUE] "Hue", INTEGER [1-64, default=32] - [GAMMA] "Gamma", INTEGER [1-64, default=32] - [POWER_LINE_FREQUENCY] "Power Line Frequency", MENU [0-2] 0: Disabled 1: 50 Hz 2: 60 Hz - [SHARPNESS] "Sharpness", INTEGER [1-64, default=28] - [CAMERA_CLASS] "Camera Controls", CTRL_CLASS READ_ONLY | WRITE_ONLY - [PAN_ABSOLUTE] "Pan, Absolute", INTEGER [-576000-576000, step=3600, default=0] - [TILT_ABSOLUTE] "Tilt, Absolute", INTEGER [-576000-576000, step=3600, default=0] - [FOCUS_ABSOLUTE] "Focus, Absolute", INTEGER [0-127, default=0] INACTIVE - [FOCUS_AUTO] "Focus, Automatic Continuous", BOOLEAN - [ZOOM_ABSOLUTE] "Zoom, Absolute", INTEGER [100-1000, default=100]
info for video1
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example info /dev/video1 Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/info /dev/video1` card: ET13R driver: uvcvideo bus info: usb-/dev/usb-/dev/usb all capabilities: VIDEO_CAPTURE | EXT_PIX_FORMAT | META_CAPTURE | STREAMING | DEVICE_CAPS avail. capabilities: EXT_PIX_FORMAT | META_CAPTURE | STREAMING - supported formats for META_CAPTURE buffers: - [UVCH] UVC Payload Header Metadata - active format for META_CAPTURE buffer: MetaCapture(MetaFormat { dataformat: UVCH, buffersize: 10240 }) - inputs: - outputs: - controls:
list doesn't work properly
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example list Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.03s Running `target/debug/examples/list` skipping device due to error: No such file or directory (os error 2) skipping device due to error: No such file or directory (os error 2)
save-jpeg
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example save-jpeg Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/save-jpeg` Error: usage: save-jpeg <device> <file> [<count>]
try it
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example save-jpeg /dev/video0 test- Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/save-jpeg /dev/video0 test-` capabilities: VIDEO_CAPTURE | EXT_PIX_FORMAT | STREAMING negotiated format: PixFormat { width: 4160, height: 3120, pixel_format: MJPG, field: NONE, bytesperline: 0, sizeimage: 3244800, colorspace: SMPTE240M, flags: (empty), enc: 8, quantization: DEFAULT, xfer_func: SMPTE240M } stream started, waiting for data wrote 1119164 bytes to test-.jpg (raw buffer size: 3244800 bytes) tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ file test-.jpg test-.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 4160x3120, components 3
save-png
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example save-png Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/save-png` Error: usage: save-png <device> <file> [<count>]
try it
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example save-png /dev/video0 test Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.03s Running `target/debug/examples/save-png /dev/video0 test` capabilities: VIDEO_CAPTURE | EXT_PIX_FORMAT | STREAMING Error: save-png does not support any of the device's formats (device supports [MJPG])
ok, no support in scanner. Try uvc then
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example uvc Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/uvc` Error: usage: uvc <device> tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example uvc /dev/video0 Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/uvc /dev/video0` Error: device does not support `META_CAPTURE` capability tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example uvc /dev/video1 Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/uvc /dev/video1` stream started, waiting for data ^C
interesting. how about uvc-xu?
tingo@kg-core1:~/personal/projects/2024/rust/webcam/LinuxVideo $ cargo run --example uvc-xu /dev/video0 0 Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/uvc-xu /dev/video0 0` 0x00: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x01: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x02: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x03: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x04: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x05: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x06: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x07: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x08: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x09: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x0a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x0b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x0c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x0d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x0e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x0f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x10: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x11: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x12: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x13: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x14: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x15: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x16: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x17: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x18: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x19: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x1a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x1b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x1c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x1d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x1e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x1f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x20: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x21: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x22: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x23: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x24: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x25: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x26: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x27: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x28: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x29: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x2a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x2b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x2c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x2d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x2e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x2f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x30: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x31: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x32: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x33: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x34: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x35: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x36: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x37: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x38: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x39: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x3a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x3b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x3c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x3d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x3e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x3f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x40: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x41: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x42: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x43: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x44: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x45: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x46: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x47: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x48: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x49: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x4a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x4b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x4c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x4d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x4e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x4f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x50: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x51: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x52: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x53: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x54: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x55: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x56: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x57: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x58: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x59: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x5a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x5b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x5c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x5d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x5e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x5f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x60: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x61: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x62: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x63: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x64: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x65: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x66: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x67: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x68: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x69: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x6a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x6b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x6c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x6d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x6e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x6f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x70: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x71: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x72: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x73: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x74: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x75: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x76: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x77: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x78: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x79: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x7a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x7b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x7c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x7d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x7e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x7f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x80: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x81: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x82: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x83: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x84: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x85: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x86: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x87: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x88: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x89: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x8a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x8b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x8c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x8d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x8e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x8f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x90: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x91: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x92: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x93: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x94: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x95: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x96: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x97: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x98: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x99: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x9a: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x9b: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x9c: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x9d: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x9e: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0x9f: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa0: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa1: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa2: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa3: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa4: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa5: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa6: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa7: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa8: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xa9: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xaa: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xab: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xac: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xad: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xae: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xaf: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb0: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb1: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb2: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb3: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb4: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb5: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb6: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb7: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb8: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xb9: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xba: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xbb: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xbc: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xbd: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xbe: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xbf: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc0: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc1: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc2: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc3: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc4: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc5: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc6: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc7: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc8: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xc9: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xca: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xcb: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xcc: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xcd: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xce: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xcf: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd0: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd1: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd2: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd3: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd4: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd5: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd6: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd7: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd8: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xd9: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xda: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xdb: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xdc: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xdd: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xde: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xdf: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe0: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe1: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe2: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe3: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe4: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe5: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe6: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe7: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe8: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xe9: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xea: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xeb: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xec: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xed: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xee: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xef: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf0: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf1: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf2: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf3: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf4: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf5: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf6: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf7: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf8: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xf9: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xfa: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xfb: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xfc: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xfd: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xfe: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" }) 0xff: Err(Os { code: 22, kind: InvalidInput, message: "Invalid argument" })
nope, doesn't work.
2024-12-26: c1 - rust - the kamera crate needs a few fixes oon FreeBSD: git status
tingo@kg-core1:~/personal/projects/2024/rust/webcam/kamera $ git status On branch main Your branch is up to date with 'origin/main'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: Cargo.toml modified: src/camera.rs modified: src/lib.rs no changes added to commit (use "git add" and/or "git commit -a")
git diff
tingo@kg-core1:~/personal/projects/2024/rust/webcam/kamera $ git diff diff --git a/Cargo.toml b/Cargo.toml index 221ef68..30d4d7d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,12 @@ windows = { version = "0.43", features = [ ] } [target.'cfg(target_os="linux")'.dependencies] -v4l = "0.14.0" +#v4l = "0.14.0" +v4l = { version = "0.14.0", path = "../libv4l-rs" } + +[target.'cfg(target_os="freebsd")'.dependencies] +#v4l = "0.14.0" +v4l = { version = "0.14.0", path = "../libv4l-rs" } [dev-dependencies] softbuffer = "0.3.0" @@ -41,3 +46,4 @@ winit = "0.27.5" [dependencies] ffimage = "0.9.0" ffimage_yuv = "0.9.0" + diff --git a/src/camera.rs b/src/camera.rs index 09e56e5..6efd8ba 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -7,6 +7,9 @@ use super::win_mf as backend; #[cfg(target_os = "linux")] use super::linux_v4l2 as backend; +#[cfg(target_os = "freebsd")] +use super::linux_v4l2 as backend; + #[derive(Debug)] pub struct Camera { inner: backend::Camera, diff --git a/src/lib.rs b/src/lib.rs index a448519..e085408 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,3 +9,6 @@ pub(crate) mod win_mf; #[cfg(target_os = "linux")] pub(crate) mod linux_v4l2; + +#[cfg(target_os = "freebsd")] +pub(crate) mod linux_v4l2;
2024-12-26: c1 - rust - this is useful
tingo@kg-core1:~/personal/projects/2024/rust/webcam/kamera $ rustc --print=cfg debug_assertions panic="unwind" target_abi="" target_arch="x86_64" target_endian="little" target_env="" target_family="unix" target_feature="fxsr" target_feature="sse" target_feature="sse2" target_has_atomic="16" target_has_atomic="32" target_has_atomic="64" target_has_atomic="8" target_has_atomic="ptr" target_os="freebsd" target_pointer_width="64" target_vendor="unknown" unix
2024-12-26: c1 - using vlc works. Also from command line, like this:
$ cvlc v4l2:///dev/video0
for some reason, vlc complains when I try to open /dev/video1, it says "not a video capture device".
2024-12-26: c1 - rust - build wincam:
tingo@kg-core1:~/personal/projects/2024/rust/webcam/wincam $ cargo build Updating crates.io index [..] Compiling serial_test v3.1.1 Compiling image v0.25.2 Compiling wincam v0.1.3 (/zs/tingo/personal/projects/2024/rust/webcam/wincam) Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 34s
try to run it
tingo@kg-core1:~/personal/projects/2024/rust/webcam/wincam $ cargo run Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s Running `target/debug/wincam` [ WARN:0@0.047] global cap_gstreamer.cpp:1173 isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created ^C
it works, and writes 'image.bmp' until the program is stopped.
2024-12-26: c1 - connecting the scanner. From /var/log/messages
Dec 26 14:36:08 kg-core1 kernel: ugen3.2: <vendor 0x1e4f ET13R> at usbus3 Dec 26 14:36:08 kg-core1 kernel: uaudio0 on uhub0 Dec 26 14:36:08 kg-core1 kernel: uaudio0: <CZUR USB HD MIC> on usbus3 Dec 26 14:36:08 kg-core1 kernel: uaudio0: No playback. Dec 26 14:36:08 kg-core1 kernel: uaudio0: Record[0]: 48000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer. Dec 26 14:36:08 kg-core1 kernel: uaudio0: No MIDI sequencer. Dec 26 14:36:08 kg-core1 kernel: pcm4: <USB audio> on uaudio0 Dec 26 14:36:08 kg-core1 kernel: uaudio0: No HID volume keys found. Dec 26 14:36:08 kg-core1 webcamd[17010]: Webcamd is already running for ugen3.2.0
since webcamd is running, lets check for video devices
root@kg-core1:~ # ll /dev/vid* crw-rw---- 1 webcamd webcamd 0x1c2 Dec 26 14:36 /dev/video0 crw-rw---- 1 webcamd webcamd 0x1c3 Dec 26 14:36 /dev/video1
yes, two of them.
2024-12-26: c1 - now runs FreeBSD 13.3-release-p8
root@kg-core1:~ # freebsd-version -ku 13.3-RELEASE-p7 13.3-RELEASE-p8
kernel
root@kg-core1:~ # uname -a FreeBSD kg-core1.kg4.no 13.3-RELEASE-p7 FreeBSD 13.3-RELEASE-p7 GENERIC amd64
and webcamd.
2024-12-26: c2 - connected up the scanner. From /var/log/messages
Dec 26 14:24:26 kg-core2 kernel: ugen1.5: <vendor 0x1e4f ET13R> at usbus1 Dec 26 14:24:26 kg-core2 kernel: uaudio0 Dec 26 14:24:26 kg-core2 kernel: on uhub3 Dec 26 14:24:26 kg-core2 kernel: uaudio0: <CZUR USB HD MIC> on usbus1 Dec 26 14:24:26 kg-core2 kernel: uaudio0: No playback. Dec 26 14:24:26 kg-core2 kernel: uaudio0: Record[0]: 48000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer. Dec 26 14:24:26 kg-core2 kernel: uaudio0: No MIDI sequencer. Dec 26 14:24:26 kg-core2 kernel: pcm3: <USB audio> on uaudio0 Dec 26 14:24:26 kg-core2 kernel: uaudio0: No HID volume keys found.
usbconfig info
root@kg-core2:~ # usbconfig -d ugen1.5 ugen1.5: <vendor 0x1e4f ET13R> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (200mA)
usbconfig - device descriptor
root@kg-core2:~ # usbconfig -d ugen1.5 dump_device_desc ugen1.5: <vendor 0x1e4f ET13R> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (200mA) bLength = 0x0012 bDescriptorType = 0x0001 bcdUSB = 0x0200 bDeviceClass = 0x00ef <Miscellaneous device> bDeviceSubClass = 0x0002 bDeviceProtocol = 0x0001 bMaxPacketSize0 = 0x0040 idVendor = 0x1e4f idProduct = 0x1301 bcdDevice = 0x0328 iManufacturer = 0x0000 <no string> iProduct = 0x0002 <ET13R> iSerialNumber = 0x0003 <HU012345> bNumConfigurations = 0x0001
usbconfig - config descriptor
root@kg-core2:~ # usbconfig -d ugen1.5 dump_curr_config_desc ugen1.5: <vendor 0x1e4f ET13R> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (200mA) Configuration index 0 bLength = 0x0009 bDescriptorType = 0x0002 wTotalLength = 0x0331 bNumInterfaces = 0x0004 bConfigurationValue = 0x0001 iConfiguration = 0x0000 <no string> bmAttributes = 0x0080 bMaxPower = 0x0064 Additional Descriptor bLength = 0x08 bDescriptorType = 0x0b bDescriptorSubType = 0x00 RAW dump: 0x00 | 0x08, 0x0b, 0x00, 0x02, 0x0e, 0x03, 0x00, 0x00 Interface 0 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0000 bAlternateSetting = 0x0000 bNumEndpoints = 0x0001 bInterfaceClass = 0x000e <Video device> bInterfaceSubClass = 0x0001 bInterfaceProtocol = 0x0000 iInterface = 0x0000 <no string> Additional Descriptor bLength = 0x0d bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x0d, 0x24, 0x01, 0x00, 0x01, 0x6e, 0x00, 0x00, 0x08 | 0x2d, 0x31, 0x01, 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, 0x20, 0x10 | 0x0a, 0x02 Additional Descriptor bLength = 0x1d bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x1d, 0x24, 0x06, 0x02, 0x92, 0x42, 0x39, 0x46, 0x08 | 0xd0, 0x0c, 0xe3, 0x4a, 0x87, 0x83, 0x31, 0x33, 0x10 | 0xf9, 0xea, 0xaa, 0x3b, 0x0a, 0x01, 0x01, 0x04, 0x18 | 0xff, 0x03, 0x00, 0x00, 0x00 Additional Descriptor bLength = 0x1d bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x1d, 0x24, 0x06, 0x09, 0x82, 0x06, 0x61, 0x63, 0x08 | 0x70, 0x50, 0xab, 0x49, 0xb8, 0xcc, 0xb3, 0x85, 0x10 | 0x5e, 0x8d, 0x22, 0x1d, 0x0a, 0x01, 0x02, 0x04, 0x18 | 0x02, 0xe2, 0x03, 0x31, 0x00 Additional Descriptor bLength = 0x0c bDescriptorType = 0x24 bDescriptorSubType = 0x05 RAW dump: 0x00 | 0x0c, 0x24, 0x05, 0x03, 0x09, 0x00, 0x00, 0x03, 0x08 | 0x3f, 0x04, 0x00, 0x00 Additional Descriptor bLength = 0x09 bDescriptorType = 0x24 bDescriptorSubType = 0x03 RAW dump: 0x00 | 0x09, 0x24, 0x03, 0x04, 0x01, 0x01, 0x00, 0x03, 0x08 | 0x00 Endpoint 0 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0081 <IN> bmAttributes = 0x0003 <INTERRUPT> wMaxPacketSize = 0x0080 bInterval = 0x0008 bRefresh = 0x0000 bSynchAddress = 0x0000 Additional Descriptor bLength = 0x05 bDescriptorType = 0x25 bDescriptorSubType = 0x03 RAW dump: 0x00 | 0x05, 0x25, 0x03, 0x80, 0x00 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 = 0x0e bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x0e, 0x24, 0x01, 0x01, 0x18, 0x02, 0x82, 0x00, 0x08 | 0x04, 0x02, 0x00, 0x00, 0x01, 0x00 Additional Descriptor bLength = 0x0b bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x0b, 0x24, 0x06, 0x02, 0x0d, 0x01, 0x01, 0x00, 0x08 | 0x00, 0x02, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x01, 0x01, 0x80, 0x07, 0x38, 0x08 | 0x04, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0xd2, 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x02, 0x01, 0x00, 0x0f, 0x70, 0x08 | 0x08, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x48, 0x3f, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x03, 0x01, 0x20, 0x0a, 0x98, 0x08 | 0x07, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x80, 0x71, 0x26, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x04, 0x01, 0x00, 0x08, 0x00, 0x08 | 0x06, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x00, 0x18, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x05, 0x01, 0x00, 0x05, 0xd0, 0x08 | 0x02, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x08, 0x07, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x06, 0x01, 0x40, 0x06, 0xb0, 0x08 | 0x04, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0xa6, 0x0e, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x07, 0x01, 0x00, 0x04, 0x00, 0x08 | 0x03, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x00, 0x06, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x08, 0x01, 0x00, 0x04, 0x40, 0x08 | 0x02, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x80, 0x04, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x09, 0x01, 0x20, 0x03, 0xe0, 0x08 | 0x01, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0xee, 0x02, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x0a, 0x01, 0x80, 0x02, 0xe0, 0x08 | 0x01, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x58, 0x02, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x0b, 0x01, 0x40, 0x10, 0x30, 0x08 | 0x0c, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x83, 0x31, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x0c, 0x01, 0x00, 0x06, 0x80, 0x08 | 0x04, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x80, 0x0d, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x0d, 0x01, 0x58, 0x0e, 0xc2, 0x08 | 0x0a, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0xac, 0x93, 0x26, 0x00, 0x2a, 0x2c, 0x0a, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x0b bDescriptorType = 0x24 bDescriptorSubType = 0x03 RAW dump: 0x00 | 0x0b, 0x24, 0x03, 0x82, 0x01, 0x40, 0x10, 0x30, 0x08 | 0x0c, 0x01, 0x01 Additional Descriptor bLength = 0x06 bDescriptorType = 0x24 bDescriptorSubType = 0x0d RAW dump: 0x00 | 0x06, 0x24, 0x0d, 0x05, 0x05, 0x05 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 = 0x0082 <IN> bmAttributes = 0x0001 <ISOCHRONOUS> wMaxPacketSize = 0x1400 bInterval = 0x0001 bRefresh = 0x0000 bSynchAddress = 0x0000 Additional Descriptor bLength = 0x08 bDescriptorType = 0x0b bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x08, 0x0b, 0x02, 0x02, 0x01, 0x02, 0x00, 0x04 Interface 2 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0002 bAlternateSetting = 0x0000 bNumEndpoints = 0x0000 bInterfaceClass = 0x0001 <Audio device> bInterfaceSubClass = 0x0001 bInterfaceProtocol = 0x0000 iInterface = 0x0004 <CZUR USB HD MIC> Additional Descriptor bLength = 0x09 bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x09, 0x24, 0x01, 0x00, 0x01, 0x27, 0x00, 0x01, 0x08 | 0x03 Additional Descriptor bLength = 0x0c bDescriptorType = 0x24 bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x0c, 0x24, 0x02, 0x01, 0x01, 0x02, 0x00, 0x01, 0x08 | 0x00, 0x00, 0x00, 0x00 Additional Descriptor bLength = 0x09 bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x09, 0x24, 0x06, 0x02, 0x01, 0x02, 0x03, 0x00, 0x08 | 0x00 Additional Descriptor bLength = 0x09 bDescriptorType = 0x24 bDescriptorSubType = 0x03 RAW dump: 0x00 | 0x09, 0x24, 0x03, 0x03, 0x01, 0x01, 0x00, 0x02, 0x08 | 0x00 Interface 3 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0003 bAlternateSetting = 0x0000 bNumEndpoints = 0x0000 bInterfaceClass = 0x0001 <Audio device> bInterfaceSubClass = 0x0002 bInterfaceProtocol = 0x0000 iInterface = 0x0004 <CZUR USB HD MIC> Interface 3 Alt 1 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0003 bAlternateSetting = 0x0001 bNumEndpoints = 0x0001 bInterfaceClass = 0x0001 <Audio device> bInterfaceSubClass = 0x0002 bInterfaceProtocol = 0x0000 iInterface = 0x0004 <CZUR USB HD MIC> Additional Descriptor bLength = 0x07 bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x07, 0x24, 0x01, 0x03, 0x01, 0x01, 0x00 Additional Descriptor bLength = 0x0b bDescriptorType = 0x24 bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x0b, 0x24, 0x02, 0x01, 0x02, 0x02, 0x10, 0x01, 0x08 | 0x80, 0xbb, 0x00 Endpoint 0 bLength = 0x0009 bDescriptorType = 0x0005 bEndpointAddress = 0x0083 <IN> bmAttributes = 0x0001 <ISOCHRONOUS> wMaxPacketSize = 0x00d8 bInterval = 0x0004 bRefresh = 0x0000 bSynchAddress = 0x0000 Additional Descriptor bLength = 0x07 bDescriptorType = 0x25 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x07, 0x25, 0x01, 0x00, 0x00, 0x01, 0x00
2021-12-12: c1 - disconnecting the scanner results in these lines in /var/log/messages
Dec 12 19:24:35 kg-core1 kernel: ugen3.4: <vendor 0x1e4f ET13R> at usbus3 (disconnected) Dec 12 19:24:35 kg-core1 kernel: uaudio0: at uhub8, port 2, addr 4 (disconnected) Dec 12 19:24:35 kg-core1 kernel: pcm4: detached Dec 12 19:24:35 kg-core1 kernel: uaudio0: detached
2021-12-12: c1 - connecting the scanner to a FreeBSD workstation running FreeBSD 13.0-release-p5 to get some info.
root@kg-core1:~ # freebsd-version -ku 13.0-RELEASE-p4 13.0-RELEASE-p5
from /var/log/messages
Dec 12 18:41:17 kg-core1 kernel: usb_alloc_device: set address 4 failed (USB_ERR_IOERROR, ignored) Dec 12 18:41:17 kg-core1 kernel: ugen3.4: <vendor 0x1e4f ET13R> at usbus3 Dec 12 18:41:17 kg-core1 kernel: uaudio0 on uhub8 Dec 12 18:41:17 kg-core1 kernel: uaudio0: <CZUR USB HD MIC> on usbus3 Dec 12 18:41:17 kg-core1 kernel: uaudio0: No playback. Dec 12 18:41:17 kg-core1 kernel: uaudio0: Record[0]: 48000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer. Dec 12 18:41:17 kg-core1 kernel: uaudio0: No MIDI sequencer. Dec 12 18:41:17 kg-core1 kernel: pcm4: <USB audio> on uaudio0 Dec 12 18:41:17 kg-core1 kernel: uaudio0: No HID volume keys found.
usbconfig info
root@kg-core1:~ # usbconfig -d ugen3.4 ugen3.4: <vendor 0x1e4f ET13R> at usbus3, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (200mA)
device descriptor
root@kg-core1:~ # usbconfig -d ugen3.4 dump_device_desc ugen3.4: <vendor 0x1e4f ET13R> at usbus3, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (200mA) bLength = 0x0012 bDescriptorType = 0x0001 bcdUSB = 0x0200 bDeviceClass = 0x00ef <Miscellaneous device> bDeviceSubClass = 0x0002 bDeviceProtocol = 0x0001 bMaxPacketSize0 = 0x0040 idVendor = 0x1e4f idProduct = 0x1301 bcdDevice = 0x0328 iManufacturer = 0x0000 <no string> iProduct = 0x0002 <ET13R> iSerialNumber = 0x0003 <HU012345> bNumConfigurations = 0x0001
current config descriptor
root@kg-core1:~ # usbconfig -d ugen3.4 dump_curr_config_desc ugen3.4: <vendor 0x1e4f ET13R> at usbus3, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (200mA) Configuration index 0 bLength = 0x0009 bDescriptorType = 0x0002 wTotalLength = 0x0331 bNumInterfaces = 0x0004 bConfigurationValue = 0x0001 iConfiguration = 0x0000 <no string> bmAttributes = 0x0080 bMaxPower = 0x0064 Additional Descriptor bLength = 0x08 bDescriptorType = 0x0b bDescriptorSubType = 0x00 RAW dump: 0x00 | 0x08, 0x0b, 0x00, 0x02, 0x0e, 0x03, 0x00, 0x00 Interface 0 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0000 bAlternateSetting = 0x0000 bNumEndpoints = 0x0001 bInterfaceClass = 0x000e <Video device> bInterfaceSubClass = 0x0001 bInterfaceProtocol = 0x0000 iInterface = 0x0000 <no string> Additional Descriptor bLength = 0x0d bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x0d, 0x24, 0x01, 0x00, 0x01, 0x6e, 0x00, 0x00, 0x08 | 0x2d, 0x31, 0x01, 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, 0x20, 0x10 | 0x0a, 0x02 Additional Descriptor bLength = 0x1d bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x1d, 0x24, 0x06, 0x02, 0x92, 0x42, 0x39, 0x46, 0x08 | 0xd0, 0x0c, 0xe3, 0x4a, 0x87, 0x83, 0x31, 0x33, 0x10 | 0xf9, 0xea, 0xaa, 0x3b, 0x0a, 0x01, 0x01, 0x04, 0x18 | 0xff, 0x03, 0x00, 0x00, 0x00 Additional Descriptor bLength = 0x1d bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x1d, 0x24, 0x06, 0x09, 0x82, 0x06, 0x61, 0x63, 0x08 | 0x70, 0x50, 0xab, 0x49, 0xb8, 0xcc, 0xb3, 0x85, 0x10 | 0x5e, 0x8d, 0x22, 0x1d, 0x0a, 0x01, 0x02, 0x04, 0x18 | 0x02, 0xe2, 0x03, 0x31, 0x00 Additional Descriptor bLength = 0x0c bDescriptorType = 0x24 bDescriptorSubType = 0x05 RAW dump: 0x00 | 0x0c, 0x24, 0x05, 0x03, 0x09, 0x00, 0x00, 0x03, 0x08 | 0x3f, 0x04, 0x00, 0x00 Additional Descriptor bLength = 0x09 bDescriptorType = 0x24 bDescriptorSubType = 0x03 RAW dump: 0x00 | 0x09, 0x24, 0x03, 0x04, 0x01, 0x01, 0x00, 0x03, 0x08 | 0x00 Endpoint 0 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0081 <IN> bmAttributes = 0x0003 <INTERRUPT> wMaxPacketSize = 0x0080 bInterval = 0x0008 bRefresh = 0x0000 bSynchAddress = 0x0000 Additional Descriptor bLength = 0x05 bDescriptorType = 0x25 bDescriptorSubType = 0x03 RAW dump: 0x00 | 0x05, 0x25, 0x03, 0x80, 0x00 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 = 0x0e bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x0e, 0x24, 0x01, 0x01, 0x18, 0x02, 0x82, 0x00, 0x08 | 0x04, 0x02, 0x00, 0x00, 0x01, 0x00 Additional Descriptor bLength = 0x0b bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x0b, 0x24, 0x06, 0x02, 0x0d, 0x01, 0x01, 0x00, 0x08 | 0x00, 0x02, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x01, 0x01, 0x80, 0x07, 0x38, 0x08 | 0x04, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0xd2, 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x02, 0x01, 0x00, 0x0f, 0x70, 0x08 | 0x08, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x48, 0x3f, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x03, 0x01, 0x20, 0x0a, 0x98, 0x08 | 0x07, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x80, 0x71, 0x26, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x04, 0x01, 0x00, 0x08, 0x00, 0x08 | 0x06, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x00, 0x18, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x05, 0x01, 0x00, 0x05, 0xd0, 0x08 | 0x02, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x08, 0x07, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x06, 0x01, 0x40, 0x06, 0xb0, 0x08 | 0x04, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0xa6, 0x0e, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x07, 0x01, 0x00, 0x04, 0x00, 0x08 | 0x03, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x00, 0x06, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x08, 0x01, 0x00, 0x04, 0x40, 0x08 | 0x02, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x80, 0x04, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x09, 0x01, 0x20, 0x03, 0xe0, 0x08 | 0x01, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0xee, 0x02, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x0a, 0x01, 0x80, 0x02, 0xe0, 0x08 | 0x01, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x58, 0x02, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x0b, 0x01, 0x40, 0x10, 0x30, 0x08 | 0x0c, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x83, 0x31, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x0c, 0x01, 0x00, 0x06, 0x80, 0x08 | 0x04, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0x00, 0x80, 0x0d, 0x00, 0x5b, 0xcc, 0x15, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x26 bDescriptorType = 0x24 bDescriptorSubType = 0x07 RAW dump: 0x00 | 0x26, 0x24, 0x07, 0x0d, 0x01, 0x58, 0x0e, 0xc2, 0x08 | 0x0a, 0x00, 0xec, 0x1d, 0x20, 0x00, 0xec, 0x1d, 0x10 | 0x20, 0xac, 0x93, 0x26, 0x00, 0x2a, 0x2c, 0x0a, 0x18 | 0x00, 0x03, 0x2a, 0x2c, 0x0a, 0x00, 0x40, 0x42, 0x20 | 0x0f, 0x00, 0x5b, 0xcc, 0x15, 0x00 Additional Descriptor bLength = 0x0b bDescriptorType = 0x24 bDescriptorSubType = 0x03 RAW dump: 0x00 | 0x0b, 0x24, 0x03, 0x82, 0x01, 0x40, 0x10, 0x30, 0x08 | 0x0c, 0x01, 0x01 Additional Descriptor bLength = 0x06 bDescriptorType = 0x24 bDescriptorSubType = 0x0d RAW dump: 0x00 | 0x06, 0x24, 0x0d, 0x05, 0x05, 0x05 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 = 0x0082 <IN> bmAttributes = 0x0001 <ISOCHRONOUS> wMaxPacketSize = 0x1400 bInterval = 0x0001 bRefresh = 0x0000 bSynchAddress = 0x0000 Additional Descriptor bLength = 0x08 bDescriptorType = 0x0b bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x08, 0x0b, 0x02, 0x02, 0x01, 0x02, 0x00, 0x04 Interface 2 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0002 bAlternateSetting = 0x0000 bNumEndpoints = 0x0000 bInterfaceClass = 0x0001 <Audio device> bInterfaceSubClass = 0x0001 bInterfaceProtocol = 0x0000 iInterface = 0x0004 <CZUR USB HD MIC> Additional Descriptor bLength = 0x09 bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x09, 0x24, 0x01, 0x00, 0x01, 0x27, 0x00, 0x01, 0x08 | 0x03 Additional Descriptor bLength = 0x0c bDescriptorType = 0x24 bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x0c, 0x24, 0x02, 0x01, 0x01, 0x02, 0x00, 0x01, 0x08 | 0x00, 0x00, 0x00, 0x00 Additional Descriptor bLength = 0x09 bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x09, 0x24, 0x06, 0x02, 0x01, 0x02, 0x03, 0x00, 0x08 | 0x00 Additional Descriptor bLength = 0x09 bDescriptorType = 0x24 bDescriptorSubType = 0x03 RAW dump: 0x00 | 0x09, 0x24, 0x03, 0x03, 0x01, 0x01, 0x00, 0x02, 0x08 | 0x00 Interface 3 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0003 bAlternateSetting = 0x0000 bNumEndpoints = 0x0000 bInterfaceClass = 0x0001 <Audio device> bInterfaceSubClass = 0x0002 bInterfaceProtocol = 0x0000 iInterface = 0x0004 <CZUR USB HD MIC> Interface 3 Alt 1 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0003 bAlternateSetting = 0x0001 bNumEndpoints = 0x0001 bInterfaceClass = 0x0001 <Audio device> bInterfaceSubClass = 0x0002 bInterfaceProtocol = 0x0000 iInterface = 0x0004 <CZUR USB HD MIC> Additional Descriptor bLength = 0x07 bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x07, 0x24, 0x01, 0x03, 0x01, 0x01, 0x00 Additional Descriptor bLength = 0x0b bDescriptorType = 0x24 bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x0b, 0x24, 0x02, 0x01, 0x02, 0x02, 0x10, 0x01, 0x08 | 0x80, 0xbb, 0x00 Endpoint 0 bLength = 0x0009 bDescriptorType = 0x0005 bEndpointAddress = 0x0083 <IN> bmAttributes = 0x0001 <ISOCHRONOUS> wMaxPacketSize = 0x00d8 bInterval = 0x0004 bRefresh = 0x0000 bSynchAddress = 0x0000 Additional Descriptor bLength = 0x07 bDescriptorType = 0x25 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x07, 0x25, 0x01, 0x00, 0x00, 0x01, 0x00
2021-12-12: I created this page.