Make a PlayStation 3 Eye (USB 1415:2000) work on an NVIDIA Jetson —
driver, measured specs, and tested C++ / Python capture code.
If you plugged one in and got no /dev/video0, this is why: the PS3 Eye is
not a UVC camera, and JetPack ships # CONFIG_USB_GSPCA is not set, so
gspca_ov534 does not exist on your board. The fix is a two-minute out-of-tree
module build — no device tree, no overlay, no reboot.
What you get: 640×480 @ 60 fps, or 320×240 @ 187 fps, for about $10 used. Capture costs under 1% of one CPU core.
What you do not get: it is a 2007 rolling-shutter USB 2.0 VGA camera with no manual white balance and a 50 Hz-only flicker filter. Its one superpower is frame rate. If you need a global shutter or good colour, buy something else.
lsusb | grep 1415:2000 # camera on the bus?
ls /dev/video* # any video node?
zcat /proc/config.gz | grep GSPCA # expect: # CONFIG_USB_GSPCA is not setCamera present, no video node, GSPCA unset → yes.
Run it on the Jetson:
git clone https://github.com/tabris2015/jetson-ps3eye
cd jetson-ps3eye
./install-ps3eye.shPrerequisites it will check for and name if missing:
sudo apt install -y build-essential bc "linux-headers-$(uname -r)" v4l-utilsThe installer downloads four GPL-2.0 gspca sources from kernel.org, verifies
their SHA-256 against sources.sha256, builds them against your
kernel headers, installs, and loads. Nothing GPL is redistributed here — see
NOTICE.md.
Useful flags: --verify (state report, put this in bug reports), --uninstall,
--force (rebuild after a kernel upgrade), --udev (stable /dev/ps3eye),
--fix-acl, --dry-run.
v4l2-ctl -d /dev/video0 --list-formats-ext
python3 python/ps3eye.py --mode gray --frames 300Python — RawCamera needs only numpy; PS3Eye adds OpenCV + v4l-utils.
from ps3eye import PS3Eye
with PS3Eye(width=640, height=480, fps=60, mode="gray") as cam:
cam.set_manual(exposure=60, gain=20) # lock AE/AGC, or your inputs drift
for frame in cam.frames(300):
... # (480, 640) uint8mode="gray" is nearly free: YUYV luma is byte 0 of each pixel, so grayscale is a
stride-2 view. OpenCV's BGR conversion costs about 9× the capture itself.
C++ — header-only, zero-copy, OpenCV optional.
#include "ps3eye.hpp"
ps3eye::Camera cam; // finds the node by USB VID:PID
cam.open(320, 240, 187, ps3eye::Format::YUYV);
cam.set_manual(60, 20);
ps3eye::Frame f;
while (cam.read(f)) { cv::Mat gray = cam.gray(f); } // a view, no conversionsudo apt install cmake # not on a stock JetPack image
cmake -S cpp -B build && cmake --build build -j4
./build/capture_demo --frames 300
./build/capture_demo --width 320 --height 240 --fps 187 --frames 600 --flow| Resolution | Format | Rate | Bandwidth | Capture CPU |
|---|---|---|---|---|
| 640×480 | YUYV | 60 fps | 36.8 MB/s | 0.3% |
| 640×480 | raw Bayer GRBG | 60 fps | 18.4 MB/s | 0.3% |
| 320×240 | YUYV | 187 fps | 28.8 MB/s | 0.2% |
| 320×240 | raw Bayer GRBG | 187 fps | 14.4 MB/s | 0.2% |
Frame-interval jitter is 0.009–0.025 ms sd, with byte-exact payloads and no dropped frames on an idle bus. The 4-microphone array works with no driver work at all. Full numbers, controls, and the measurement environment: docs/camera-guide.md.
Reproduce the table yourself:
python3 python/ps3eye.py --bench
./build/capture_demo --bench- Locking exposure takes two controls, not one:
auto_exposure=1(1 means manual) andgain_automatic=0. Otherwise the AE retunes every frame. - V4L2
GRBGis OpenCVCOLOR_BayerGB2BGR, notCOLOR_BayerGR2BGR. The obvious constant silently swaps red and blue. - OpenCV cannot capture this camera's Bayer format — it returns a flat,
all-zero buffer. Use
RawCameraor the C++ header. - 187 fps needs bright light. The exposure ceiling is 5.3 ms, so indoors the AE pins the gain and the image looks dark and noisy.
pkg-config --cflags opencv4is broken on JetPack — it points at/usr/local, which does not exist. Use CMake.
More in docs/troubleshooting.md.
| Board | Jetson Orin Nano 8 GB devkit (p3767-0005 / p3768-0000) |
| Software | JetPack 7.2, L4T R39.2.0, kernel 6.8.12-1021-tegra |
| Date | 2026-08-08 |
That is the only configuration verified end to end. The approach is not
Jetson-specific — it should work on any Linux where CONFIG_USB_GSPCA is unset
and kernel headers are available, and the checksum allowlist covers kernels
v5.10 through v6.16. Reports from other boards and JetPack versions are welcome.
| docs/driver.md | Why it fails, what the installer does, the depmod/ACL trap, durability across kernel upgrades |
| docs/camera-guide.md | Measured specs, Python and C++ usage, GPU integration, and how to get good data out of it |
| docs/troubleshooting.md | Symptom → cause → fix |
MIT for everything in this repository — see LICENSE.
The kernel module you build from it is GPL-2.0-or-later and is not redistributed here. Credit for the driver itself belongs to the gspca authors; see NOTICE.md.