Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/raleighlittles/ps5-camera-firmware-loader

A cross-platform utility for loading custom firmware onto the PlayStation 5 camera, written in Rust
https://github.com/raleighlittles/ps5-camera-firmware-loader

libusb omnivision ov580 ps4-camera ps5 ps5-camera uvc

Last synced: about 1 month ago
JSON representation

A cross-platform utility for loading custom firmware onto the PlayStation 5 camera, written in Rust

Awesome Lists containing this project

README

        

![build-badge](https://github.com/raleighlittles/PS5-Camera-Firmware-Loader/actions/workflows/main.yml/badge.svg)
![crates.io](https://img.shields.io/crates/v/ps5_camera_firmware_loader.svg)

Buy Me A Coffee

# About

This tool is used to install firmware onto a Playstation camera. Despite the name of the repository, it also works with Playstation 4 cameras. The supported models are listed below.

| Model number | Console |
|--------------|---------|
| CUH-ZEY1 | PS4 |
| CFI-ZEY1 | PS5 |

It does NOT work with the Playstation 2 ("EyeToy"/SLEH-0003x variants) camera.

The main reason why you'd want to load custom firmware onto the camera is to be able to use it as a [UVC device](https://en.wikipedia.org/wiki/USB_video_device_class), i.e. a webcam.

This is a Linux port of [OrbisEyeCam](https://github.com/psxdev/OrbisEyeCam) for Windows. Kudos to @psxdev for the initial effort of reverse-engineering.

# Webcam setup

To use this as a webcam, we need to install custom firmware onto the device (the default firmware doesn't support UVC).

You can find custom firmware for the Playstation camera on Github, here's a few that I've used:

*
*

(Many more firmware versions are available [here](https://github.com/psxdev/luke_firmwares))

## Connect device

Connect your PS camera to a USB 3.0 port on your computer. (If you have a PS4 camera, you need to purchase an [AUX to USB adapter](https://www.amazon.com/dp/B09NTM46ND))

Make sure you see the following in the dmesg log:

```
usb 2-4.4.4.4: new SuperSpeed Gen 1 USB device number 7 using xhci_hcd
usb 2-4.4.4.4: New USB device found, idVendor=05a9, idProduct=0580, bcdDevice= 1.00
usb 2-4.4.4.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 2-4.4.4.4: Product: USB Boot
usb 2-4.4.4.4: Manufacturer: OmniVision Technologies, Inc.
```

Keep the dmesg window open, we'll need it for later.

## Setup permissions

[libusb](https://libusb.info/) needs permissions to be able to write to USB devices.

0. Make sure your user is part of the `plugdev` group. Easiest way to do this is to check your `/etc/group` file. If you're not in the plugdev group, run:

```bash
$ sudo usermod -a -G plugdev $USER
```

1. Copy the udev rules (`100-playstation-camera.rules`) to `/etc/udev/rules.d`

2. Reload the udev rules by running:

```bash
$ sudo udevadm control --reload ; sudo udevadm trigger
```

## Run the script

This product has two "back-ends", one written in C++ and one written in Rust. The C++ version is deprecated, but it still works, and going forward, I will only be supporting the Rust version.

To build & run the C++ version:

```bash
$ cmake CMakeLists.txt
$ make
$ ./ps5_camera_firmware_loader
```

To build & run the Rust version:

```bash
$ cargo build --manifest-path=Cargo.toml
$ ./target/debug/ps5_camera_firmware_loader
```

## Success :heavy_check_mark:

Go back to the dmesg window from earlier. You should see the following line:

```
uvcvideo: Found UVC 1.00 device USB Camera-OV580 (05a9:058c)
```

Open your favorite webcam program and now you're all set. Note that you must **reinstall the firmware every time the device power cycles**.

To have the firmware automatically installed at startup time, you can use this repository: https://github.com/viecili/ps5cam-firmware-loader-service

Here's a test image from the PS5 camera:

![test-image](./ps5-camera-test-image.jpg)

If you're using the firmware that I linked to above, then these are the formats and parameters it supports:

```
User Controls

brightness 0x00980900 (int) : min=0 max=8 step=1 default=4 value=4
contrast 0x00980901 (int) : min=0 max=8 step=1 default=4 value=4
saturation 0x00980902 (int) : min=0 max=8 step=1 default=4 value=4
hue 0x00980903 (int) : min=0 max=11 step=1 default=0 value=0
white_balance_automatic 0x0098090c (bool) : default=1 value=1
gain 0x00980913 (int) : min=0 max=8 step=1 default=4 value=4
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=1 (50 Hz)
white_balance_temperature 0x0098091a (int) : min=2800 max=6500 step=100 default=4600 value=4600 flags=inactive
sharpness 0x0098091b (int) : min=0 max=8 step=1 default=4 value=4

Camera Controls

auto_exposure 0x009a0901 (menu) : min=0 max=3 default=2 value=2 (Shutter Priority Mode)
exposure_time_absolute 0x009a0902 (int) : min=1 max=5000 step=1 default=1000 value=1000 flags=inactive

ioctl: VIDIOC_ENUM_FMT
Type: Video Capture

[0]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 896x256
Interval: Discrete 0.008s (120.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.125s (8.000 fps)
Size: Discrete 960x520
Interval: Discrete 0.017s (60.000 fps)
Size: Discrete 448x256
Interval: Discrete 0.008s (120.000 fps)
Size: Discrete 1280x800
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.125s (8.000 fps)
Size: Discrete 640x376
Interval: Discrete 0.008s (120.000 fps)
Size: Discrete 320x184
Interval: Discrete 0.004s (240.004 fps)
Size: Discrete 5148x1088
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.125s (8.000 fps)
Size: Discrete 3840x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.125s (8.000 fps)
Size: Discrete 1920x520
Interval: Discrete 0.017s (60.000 fps)
Size: Discrete 2560x800
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.125s (8.000 fps)
Size: Discrete 1280x376
Interval: Discrete 0.008s (120.000 fps)
Size: Discrete 640x184
Interval: Discrete 0.004s (240.004 fps)
```

# Troubleshooting

## The UVC device is recognized, but all I see is a black screen

Try turning down the frame rate. I've noticed that sometimes the auto-exposure control doesn't seem to work.

## My PS5 won't recognize my camera anymore

Try doing a full reboot (not just rest mode) of your PS5, and then plugging in your camera.