Skip to content

Commit 63a8698

Browse files
Merge pull request #4 from raleighlittles/feature/add-ps4-camera-support
[Feature] add PS4 compatibility
2 parents 001f370 + ba82085 commit 63a8698

File tree

9 files changed

+406
-149
lines changed

9 files changed

+406
-149
lines changed

.github/ISSUE_TEMPLATE

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
name: Bug Report
2+
description: File a bug report
3+
title: "[Bug]: "
4+
labels: ["bug"]
5+
assignees:
6+
- raleighlittles
7+
body:
8+
- type: textarea
9+
id: what-happened
10+
attributes:
11+
label: Provide a brief description of the issue
12+
description: Also tell us, what did you expect to happen?
13+
placeholder:
14+
value: "Bug description"
15+
validations:
16+
required: true
17+
- type: dropdown
18+
id: os_version
19+
attributes:
20+
label: Operating System version
21+
description: What operating system did you encounter this issue on?
22+
options:
23+
- Linux (Default)
24+
- Mac
25+
validations:
26+
required: true
27+
- type: dropdown
28+
id: camera_version
29+
attributes:
30+
label: Which camera model was this for?
31+
multiple: true
32+
options:
33+
- PlayStation 4
34+
- PlayStation 5
35+
- type: textarea
36+
id: logs
37+
attributes:
38+
label: Relevant log output
39+
description: Please copy and paste any relevant log output. This will be automatically formatted, so no need for backticks ('`')
40+
render: shell

README.md

Lines changed: 86 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,28 @@
22

33
# About
44

5-
This tool is used to load firmware onto a Playstation 5 camera: https://www.playstation.com/en-us/accessories/hd-camera/
5+
This tool is used to install firmware onto a Playstation 5 camera: <https://www.playstation.com/en-us/accessories/hd-camera/>
66

7-
![ps5-camera](https://gmedia.playstation.com/is/image/SIEPDC/hd-camera-ps5-image-block-03-en-02jul20?$facebook$)
7+
**Despite the name, it also works on Playstataion <u>4</u> cameras.**
88

9-
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).
9+
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.
1010

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

1313
# Webcam setup
1414

15-
To use this as a webcam, we need to install custom firmware onto the device (the default firmware doesn't use UVC). Download `firmware.bin` from here: https://github.com/Hackinside/PS5_camera_files/blob/main/firmware.bin
15+
To use this as a webcam, we need to install custom firmware onto the device (the default firmware doesn't support UVC).
1616

17-
(Kudos to @Hackinside for the custom firmware)
17+
You can find custom firmware for the Playstation camera on Github, here's a few that I've used:
18+
19+
* <https://github.com/prosperodev/hdcamera/blob/main/firmware/21.01-03.20.00.04-00.00.00.bin>
20+
* <https://github.com/Hackinside/PS5_camera_files/blob/main/firmware.bin>
21+
22+
(Many more firmware versions are available [here](https://github.com/psxdev/luke_firmwares))
1823

1924
## Connect device
2025

21-
Connect your PS5 camera to a USB 3.0 port on your computer.
26+
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))
2227

2328
Make sure you see the following in the dmesg log:
2429

@@ -29,40 +34,45 @@ Make sure you see the following in the dmesg log:
2934
usb 2-4.4.4.4: Product: USB Boot
3035
usb 2-4.4.4.4: Manufacturer: OmniVision Technologies, Inc.
3136
```
37+
3238
Keep the dmesg window open, we'll need it for later.
3339

3440
## Setup permissions
3541

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

38-
0. Make sure your user is part of the `plugdev` group. Easiest way to do this is to check your `/etc/group` file.
44+
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:
45+
46+
```bash
47+
sudo usermod -a -G plugdev $USER
48+
```
3949

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

42-
2. Reload the udev rules by running:
52+
2. Reload the udev rules by running:
4353

44-
`$ sudo udevadm control --reload ; sudo udevadm trigger `
54+
`$ sudo udevadm control --reload ; sudo udevadm trigger`
4555

4656
## Run the script
4757

48-
This product has two "back-ends", one written in C++ and one written in Rust. You can use either, but the C++ backend has been tested more thoroughly.
58+
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.
4959

5060
To build & run the C++ version:
5161

5262
```bash
53-
$ cmake CMakeLists.txt
54-
$ make
55-
$ ./ps5_camera_firmware_loader <firmware-file-path>
63+
cmake CMakeLists.txt
64+
make
65+
./ps5_camera_firmware_loader <firmware-file-path>
5666
```
5767

5868
To build & run the Rust version:
5969

6070
```bash
61-
$ cargo build --manifest-path=Cargo.toml
62-
$ ./target/debug/ps5_camera_firmware_loader <firmware-file-path>
71+
cargo build --manifest-path=Cargo.toml
72+
./target/debug/ps5_camera_firmware_loader <firmware-file-path>
6373
```
6474

65-
## Success :heavy_check_mark:
75+
## Success :heavy_check_mark
6676

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

@@ -72,55 +82,72 @@ uvcvideo: Found UVC 1.00 device USB Camera-OV580 (05a9:058c)
7282

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

75-
Here's a test image:
85+
Here's a test image from the PS5 camera:
7686

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

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

8191
```
92+
User Controls
93+
94+
brightness 0x00980900 (int) : min=0 max=8 step=1 default=4 value=4
95+
contrast 0x00980901 (int) : min=0 max=8 step=1 default=4 value=4
96+
saturation 0x00980902 (int) : min=0 max=8 step=1 default=4 value=4
97+
hue 0x00980903 (int) : min=0 max=11 step=1 default=0 value=0
98+
white_balance_automatic 0x0098090c (bool) : default=1 value=1
99+
gain 0x00980913 (int) : min=0 max=8 step=1 default=4 value=4
100+
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=1 (50 Hz)
101+
white_balance_temperature 0x0098091a (int) : min=2800 max=6500 step=100 default=4600 value=4600 flags=inactive
102+
sharpness 0x0098091b (int) : min=0 max=8 step=1 default=4 value=4
103+
104+
Camera Controls
105+
106+
auto_exposure 0x009a0901 (menu) : min=0 max=3 default=2 value=2 (Shutter Priority Mode)
107+
exposure_time_absolute 0x009a0902 (int) : min=1 max=5000 step=1 default=1000 value=1000 flags=inactive
108+
82109
ioctl: VIDIOC_ENUM_FMT
83-
Type: Video Capture
84-
85-
[0]: 'YUYV' (YUYV 4:2:2)
86-
Size: Discrete 896x256
87-
Interval: Discrete 0.008s (120.000 fps)
88-
Size: Discrete 1920x1080
89-
Interval: Discrete 0.033s (30.000 fps)
90-
Interval: Discrete 0.067s (15.000 fps)
91-
Interval: Discrete 0.125s (8.000 fps)
92-
Size: Discrete 960x520
93-
Interval: Discrete 0.017s (60.000 fps)
94-
Size: Discrete 448x256
95-
Interval: Discrete 0.008s (120.000 fps)
96-
Size: Discrete 1280x800
97-
Interval: Discrete 0.017s (60.000 fps)
98-
Interval: Discrete 0.033s (30.000 fps)
99-
Interval: Discrete 0.067s (15.000 fps)
100-
Interval: Discrete 0.125s (8.000 fps)
101-
Size: Discrete 640x376
102-
Interval: Discrete 0.008s (120.000 fps)
103-
Size: Discrete 320x184
104-
Interval: Discrete 0.004s (240.004 fps)
105-
Size: Discrete 5148x1088
106-
Interval: Discrete 0.033s (30.000 fps)
107-
Interval: Discrete 0.067s (15.000 fps)
108-
Interval: Discrete 0.125s (8.000 fps)
109-
Size: Discrete 3840x1080
110-
Interval: Discrete 0.033s (30.000 fps)
111-
Interval: Discrete 0.067s (15.000 fps)
112-
Interval: Discrete 0.125s (8.000 fps)
113-
Size: Discrete 1920x520
114-
Interval: Discrete 0.017s (60.000 fps)
115-
Size: Discrete 2560x800
116-
Interval: Discrete 0.017s (60.000 fps)
117-
Interval: Discrete 0.033s (30.000 fps)
118-
Interval: Discrete 0.067s (15.000 fps)
119-
Interval: Discrete 0.125s (8.000 fps)
120-
Size: Discrete 1280x376
121-
Interval: Discrete 0.008s (120.000 fps)
122-
Size: Discrete 640x184
123-
Interval: Discrete 0.004s (240.004 fps)
110+
Type: Video Capture
111+
112+
[0]: 'YUYV' (YUYV 4:2:2)
113+
Size: Discrete 896x256
114+
Interval: Discrete 0.008s (120.000 fps)
115+
Size: Discrete 1920x1080
116+
Interval: Discrete 0.033s (30.000 fps)
117+
Interval: Discrete 0.067s (15.000 fps)
118+
Interval: Discrete 0.125s (8.000 fps)
119+
Size: Discrete 960x520
120+
Interval: Discrete 0.017s (60.000 fps)
121+
Size: Discrete 448x256
122+
Interval: Discrete 0.008s (120.000 fps)
123+
Size: Discrete 1280x800
124+
Interval: Discrete 0.017s (60.000 fps)
125+
Interval: Discrete 0.033s (30.000 fps)
126+
Interval: Discrete 0.067s (15.000 fps)
127+
Interval: Discrete 0.125s (8.000 fps)
128+
Size: Discrete 640x376
129+
Interval: Discrete 0.008s (120.000 fps)
130+
Size: Discrete 320x184
131+
Interval: Discrete 0.004s (240.004 fps)
132+
Size: Discrete 5148x1088
133+
Interval: Discrete 0.033s (30.000 fps)
134+
Interval: Discrete 0.067s (15.000 fps)
135+
Interval: Discrete 0.125s (8.000 fps)
136+
Size: Discrete 3840x1080
137+
Interval: Discrete 0.033s (30.000 fps)
138+
Interval: Discrete 0.067s (15.000 fps)
139+
Interval: Discrete 0.125s (8.000 fps)
140+
Size: Discrete 1920x520
141+
Interval: Discrete 0.017s (60.000 fps)
142+
Size: Discrete 2560x800
143+
Interval: Discrete 0.017s (60.000 fps)
144+
Interval: Discrete 0.033s (30.000 fps)
145+
Interval: Discrete 0.067s (15.000 fps)
146+
Interval: Discrete 0.125s (8.000 fps)
147+
Size: Discrete 1280x376
148+
Interval: Discrete 0.008s (120.000 fps)
149+
Size: Discrete 640x184
150+
Interval: Discrete 0.004s (240.004 fps)
124151
```
125152

126153
# Troubleshooting

cpp/log.txt

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
Transferred 512 bytes [0,512], value=0, index=20, size=512
2+
Transferred 512 bytes [512,1024], value=512, index=20, size=512
3+
Transferred 512 bytes [1024,1536], value=1024, index=20, size=512
4+
Transferred 512 bytes [1536,2048], value=1536, index=20, size=512
5+
Transferred 512 bytes [2048,2560], value=2048, index=20, size=512
6+
Transferred 512 bytes [2560,3072], value=2560, index=20, size=512
7+
Transferred 512 bytes [3072,3584], value=3072, index=20, size=512
8+
Transferred 512 bytes [3584,4096], value=3584, index=20, size=512
9+
Transferred 512 bytes [4096,4608], value=4096, index=20, size=512
10+
Transferred 512 bytes [4608,5120], value=4608, index=20, size=512
11+
Transferred 512 bytes [5120,5632], value=5120, index=20, size=512
12+
Transferred 512 bytes [5632,6144], value=5632, index=20, size=512
13+
Transferred 512 bytes [6144,6656], value=6144, index=20, size=512
14+
Transferred 512 bytes [6656,7168], value=6656, index=20, size=512
15+
Transferred 512 bytes [7168,7680], value=7168, index=20, size=512
16+
Transferred 512 bytes [7680,8192], value=7680, index=20, size=512
17+
Transferred 512 bytes [8192,8704], value=8192, index=20, size=512
18+
Transferred 512 bytes [8704,9216], value=8704, index=20, size=512
19+
Transferred 512 bytes [9216,9728], value=9216, index=20, size=512
20+
Transferred 512 bytes [9728,10240], value=9728, index=20, size=512
21+
Transferred 512 bytes [10240,10752], value=10240, index=20, size=512
22+
Transferred 512 bytes [10752,11264], value=10752, index=20, size=512
23+
Transferred 512 bytes [11264,11776], value=11264, index=20, size=512
24+
Transferred 512 bytes [11776,12288], value=11776, index=20, size=512
25+
Transferred 512 bytes [12288,12800], value=12288, index=20, size=512
26+
Transferred 512 bytes [12800,13312], value=12800, index=20, size=512
27+
Transferred 512 bytes [13312,13824], value=13312, index=20, size=512
28+
Transferred 512 bytes [13824,14336], value=13824, index=20, size=512
29+
Transferred 512 bytes [14336,14848], value=14336, index=20, size=512
30+
Transferred 512 bytes [14848,15360], value=14848, index=20, size=512
31+
Transferred 512 bytes [15360,15872], value=15360, index=20, size=512
32+
Transferred 512 bytes [15872,16384], value=15872, index=20, size=512
33+
Transferred 512 bytes [16384,16896], value=16384, index=20, size=512
34+
Transferred 512 bytes [16896,17408], value=16896, index=20, size=512
35+
Transferred 512 bytes [17408,17920], value=17408, index=20, size=512
36+
Transferred 512 bytes [17920,18432], value=17920, index=20, size=512
37+
Transferred 512 bytes [18432,18944], value=18432, index=20, size=512
38+
Transferred 512 bytes [18944,19456], value=18944, index=20, size=512
39+
Transferred 512 bytes [19456,19968], value=19456, index=20, size=512
40+
Transferred 512 bytes [19968,20480], value=19968, index=20, size=512
41+
Transferred 512 bytes [20480,20992], value=20480, index=20, size=512
42+
Transferred 512 bytes [20992,21504], value=20992, index=20, size=512
43+
Transferred 512 bytes [21504,22016], value=21504, index=20, size=512
44+
Transferred 512 bytes [22016,22528], value=22016, index=20, size=512
45+
Transferred 512 bytes [22528,23040], value=22528, index=20, size=512
46+
Transferred 512 bytes [23040,23552], value=23040, index=20, size=512
47+
Transferred 512 bytes [23552,24064], value=23552, index=20, size=512
48+
Transferred 512 bytes [24064,24576], value=24064, index=20, size=512
49+
Transferred 512 bytes [24576,25088], value=24576, index=20, size=512
50+
Transferred 512 bytes [25088,25600], value=25088, index=20, size=512
51+
Transferred 512 bytes [25600,26112], value=25600, index=20, size=512
52+
Transferred 512 bytes [26112,26624], value=26112, index=20, size=512
53+
Transferred 512 bytes [26624,27136], value=26624, index=20, size=512
54+
Transferred 512 bytes [27136,27648], value=27136, index=20, size=512
55+
Transferred 512 bytes [27648,28160], value=27648, index=20, size=512
56+
Transferred 512 bytes [28160,28672], value=28160, index=20, size=512
57+
Transferred 512 bytes [28672,29184], value=28672, index=20, size=512
58+
Transferred 512 bytes [29184,29696], value=29184, index=20, size=512
59+
Transferred 512 bytes [29696,30208], value=29696, index=20, size=512
60+
Transferred 512 bytes [30208,30720], value=30208, index=20, size=512
61+
Transferred 512 bytes [30720,31232], value=30720, index=20, size=512
62+
Transferred 512 bytes [31232,31744], value=31232, index=20, size=512
63+
Transferred 512 bytes [31744,32256], value=31744, index=20, size=512
64+
Transferred 512 bytes [32256,32768], value=32256, index=20, size=512
65+
Transferred 512 bytes [32768,33280], value=32768, index=20, size=512
66+
Transferred 512 bytes [33280,33792], value=33280, index=20, size=512
67+
Transferred 512 bytes [33792,34304], value=33792, index=20, size=512
68+
Transferred 512 bytes [34304,34816], value=34304, index=20, size=512
69+
Transferred 512 bytes [34816,35328], value=34816, index=20, size=512
70+
Transferred 512 bytes [35328,35840], value=35328, index=20, size=512
71+
Transferred 512 bytes [35840,36352], value=35840, index=20, size=512
72+
Transferred 512 bytes [36352,36864], value=36352, index=20, size=512
73+
Transferred 512 bytes [36864,37376], value=36864, index=20, size=512
74+
Transferred 512 bytes [37376,37888], value=37376, index=20, size=512
75+
Transferred 512 bytes [37888,38400], value=37888, index=20, size=512
76+
Transferred 512 bytes [38400,38912], value=38400, index=20, size=512
77+
Transferred 512 bytes [38912,39424], value=38912, index=20, size=512
78+
Transferred 512 bytes [39424,39936], value=39424, index=20, size=512
79+
Transferred 512 bytes [39936,40448], value=39936, index=20, size=512
80+
Transferred 512 bytes [40448,40960], value=40448, index=20, size=512
81+
Transferred 512 bytes [40960,41472], value=40960, index=20, size=512
82+
Transferred 512 bytes [41472,41984], value=41472, index=20, size=512
83+
Transferred 512 bytes [41984,42496], value=41984, index=20, size=512
84+
Transferred 512 bytes [42496,43008], value=42496, index=20, size=512
85+
Transferred 512 bytes [43008,43520], value=43008, index=20, size=512
86+
Transferred 512 bytes [43520,44032], value=43520, index=20, size=512
87+
Transferred 512 bytes [44032,44544], value=44032, index=20, size=512
88+
Transferred 512 bytes [44544,45056], value=44544, index=20, size=512
89+
Transferred 512 bytes [45056,45568], value=45056, index=20, size=512
90+
Transferred 512 bytes [45568,46080], value=45568, index=20, size=512
91+
Transferred 512 bytes [46080,46592], value=46080, index=20, size=512
92+
Transferred 512 bytes [46592,47104], value=46592, index=20, size=512
93+
Transferred 512 bytes [47104,47616], value=47104, index=20, size=512
94+
Transferred 512 bytes [47616,48128], value=47616, index=20, size=512
95+
Transferred 512 bytes [48128,48640], value=48128, index=20, size=512
96+
Transferred 512 bytes [48640,49152], value=48640, index=20, size=512
97+
Transferred 512 bytes [49152,49664], value=49152, index=20, size=512
98+
Transferred 512 bytes [49664,50176], value=49664, index=20, size=512
99+
Transferred 512 bytes [50176,50688], value=50176, index=20, size=512
100+
Transferred 512 bytes [50688,51200], value=50688, index=20, size=512
101+
Transferred 512 bytes [51200,51712], value=51200, index=20, size=512
102+
Transferred 512 bytes [51712,52224], value=51712, index=20, size=512
103+
Transferred 512 bytes [52224,52736], value=52224, index=20, size=512
104+
Transferred 512 bytes [52736,53248], value=52736, index=20, size=512
105+
Transferred 512 bytes [53248,53760], value=53248, index=20, size=512
106+
Transferred 512 bytes [53760,54272], value=53760, index=20, size=512
107+
Transferred 512 bytes [54272,54784], value=54272, index=20, size=512
108+
Transferred 512 bytes [54784,55296], value=54784, index=20, size=512
109+
Transferred 512 bytes [55296,55808], value=55296, index=20, size=512
110+
Transferred 512 bytes [55808,56320], value=55808, index=20, size=512
111+
Transferred 512 bytes [56320,56832], value=56320, index=20, size=512
112+
Transferred 512 bytes [56832,57344], value=56832, index=20, size=512
113+
Transferred 512 bytes [57344,57856], value=57344, index=20, size=512
114+
Transferred 512 bytes [57856,58368], value=57856, index=20, size=512
115+
Transferred 512 bytes [58368,58880], value=58368, index=20, size=512
116+
Transferred 512 bytes [58880,59392], value=58880, index=20, size=512
117+
Transferred 512 bytes [59392,59904], value=59392, index=20, size=512
118+
Transferred 512 bytes [59904,60416], value=59904, index=20, size=512
119+
Transferred 512 bytes [60416,60928], value=60416, index=20, size=512
120+
Transferred 512 bytes [60928,61440], value=60928, index=20, size=512
121+
Transferred 512 bytes [61440,61952], value=61440, index=20, size=512
122+
Transferred 512 bytes [61952,62464], value=61952, index=20, size=512
123+
Transferred 512 bytes [62464,62976], value=62464, index=20, size=512
124+
Transferred 512 bytes [62976,63488], value=62976, index=20, size=512
125+
Transferred 512 bytes [63488,64000], value=63488, index=20, size=512
126+
Transferred 512 bytes [64000,64512], value=64000, index=20, size=512
127+
Transferred 512 bytes [64512,65024], value=64512, index=20, size=512
128+
Transferred 512 bytes [65024,65536], value=65024, index=20, size=512
129+
Transferred 512 bytes [65536,66048], value=0, index=21, size=512
130+
Transferred 512 bytes [66048,66560], value=512, index=21, size=512
131+
Transferred 512 bytes [66560,67072], value=1024, index=21, size=512
132+
Transferred 512 bytes [67072,67584], value=1536, index=21, size=512
133+
Transferred 512 bytes [67584,68096], value=2048, index=21, size=512
134+
Transferred 512 bytes [68096,68608], value=2560, index=21, size=512
135+
Transferred 340 bytes [68608,68948], value=3072, index=21, size=340

0 commit comments

Comments
 (0)