Hello old-browser-using friend! Despite the mid-2000s aesthetics here, this site is actually built mainly with modern web technologies. So, if you're not using one the site will probably look broken.
I try to make it work as much possible where the fixes are simple, and the site shouldn't be so broken as to be unusable (let me know if it is) - but my sanity and experience for modern browsers trumps supporting IE7 or whatever.

2025-02-09-bsb-hid.md - Notepad

Bigscreen Beyond HID Protocol

• filed under protocols, notes, usb, hid, vr, bigscreen beyond, protocols

Caution!

Everything in this document was obtained through reverse engineering. The information has not been reviewed by Bigscreen or any of its employees. If you choose to use any of the information below, I do not accept any respnsibility. If you break your expensive headset, thats on you. Furthermore, all the information in here was tested on my BSB1. There may be differences between the BSB1 and the BSB2/2e. If you would like me to look into the BSB2e, get in touch regarding getting my face scan ;)

Protocol Basics

Most of the features implemented in the BeyondHID application (the little ImGUI utility that comes with the drivers) use USB HID Feature Reports with report ID 0, sent to a specific 'Beyond' USB device.

All commands are sent in a 64-byte buffer, the first of which is a command ID, followed by 63-bytes of data. Most of which will usually be zero.

Device ID

  • Bigscreen Beyond: 35bd:0101

Commands

0x26 - Get serial number

Example: 26

Response: 26 42 53 31 33 33 37 36 39 34 32 30 36 39 (ASCII: 'BS13376942069')

0x2a - Get firmware version

Example: 2a

Response: 2a 30 2e 32 2e 32 32 (ASCII: '0.2.22')

0x46 - Set Fan Speed

Example: f6 64 sets to 100%.

Response: 24

Official application does not allow setting below 0x28 (40%)

0x49 - Set Display Brightness

Example: 49 00 06 sets to lowest brightness.

Response: 24

Official application keeps values in range: 0x006 - 0x21E.

0x4c - Set LED Color

Example: 4c ff 00 ff sets to #ff00ff (magenta)

Response: 24

0x5a - Get Usage stats

Example: 5a 00 (???) Response: 5a 7f 46 (???)

Example: 5a 01 (get total usage time) Response: 5a 18 01 (0x118 = 280 = 2800 minutes = 46h40m)

Example: 5a 02 (get longest session) Response: 5a 0e (0x0e = 14 = 140 minutes, 2h20m)

Notifications

0x23 - Status report

This, unlike the other commands is sent automatically from the headset to the PC every 5 seconds. It does not need to be requested

I'm not entirely sure what the output format is on this. I think it's related to the 'log.txt' file placed next to BeyondHID. Here's a few examples

2314000000d00000021faefc9f430038a6bc0038a6bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2314000000d80000021eaefc9f430038a6bc0038a6bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2314173400200000022ddfa9a34385222e420f8f3942000000000000000000000000000000000000000000000000000000000000000000000000000000000000
231417340808000002280fd2a34385222e42a7fd3042000000000000000000000000000000000000000000000000000000000000000000000000000000000000

The format seems to have changed over time with firmware updates. On firmware 0.3.18 it looks like this

23181eb43a9000000229682fa243b3ff1c4291241a42010a431b0200000000000000000000000000000000000000000000000000000000000000000000000000
                                                  ^^ (appears to be 18 if not on head, 1b or 1c if on head)

Example code

Set the headset RGB LED to #FF0000 (full red)

let [dev] = await navigator.hid.requestDevice({
    filters: [
        {
            vendorId: 0x35bd, // Bigscreen, Inc. 
            productId: 0x0101  // Beyond
        }
    ],
});
console.log(dev);
await dev.open();

let data = new Uint8Array(64);
data[0] = 0x4c;
data[1] = 0xFF;
data[2] = 0x00;
data[3] = 0x00;
await dev.sendFeatureReport(0, data);

Display mode switching

Switching between 90/75hz involves multiple steps, of which I've been able to figure out is:

  • it changes the Lighthouse configuration of the built in Tundra Tracker. You can do this using the lighthouse_console included with SteamVR
  • it changes the EDID passed to the PC to add an additional 5088x2544@75 display mode that becomes preferred (as the 90hz display mode is still present in the EDID)

Example, 90hz

EDID: 00ffffffffffff0009273412d2040000ff200104a5000078007875aa553bb22910505400000001010101010101010101010101010101000000100000000000000000000000000000000000100000000000000000000000000000000000100000000000000000000000000000000000fc004265796f6e640a202020202020015b70207907002209141ef50a88ff0eff003f801f007f071b000e8001007e00073a029281000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008690

{
    "manufacturer": "Bigscreen",
    "model_number": "Beyond",
    "revision": 0.12,
    "device": {
        "eye_target_height_in_pixels": 1920,
        "eye_target_width_in_pixels": 1920,
        "first_eye": "eEYE_LEFT",
        "last_eye": "eEYE_RIGHT",
        "num_windows": 1
    },
[...]

Example, 75hz

EDID: 00ffffffffffff0009273412d2040000ff200104a5000078007875aa553bb22910505400000001010101010101010101010101010101000000100000000000000000000000000000000000100000000000000000000000000000000000100000000000000000000000000000000000fc004265796f6e640a202020202020015b702079070022092839540f88df137f003f801f00ef0917000e8001001ef50a08ff0eff003f801f007f071b000e8001007e00073a0292810008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e190

{
    "manufacturer": "Bigscreen",
    "model_number": "Beyond",
    "revision": 0.12,
    "device": {
        "eye_target_height_in_pixels": 2544,
        "eye_target_width_in_pixels": 2544,
        "first_eye": "eEYE_LEFT",
        "last_eye": "eEYE_RIGHT",
        "num_windows": 1
    },
[...]

See also: https://github.com/ValveSoftware/openvr/wiki/The-JSON-File-(Lighthouse-Devices)