Skip to content

Connect to any Bluetooth Braille display that uses HID, whatever its name - #180

Merged
trypsynth merged 1 commit into
trypsynth:masterfrom
emassey0135:hid-braille-displays
Oct 14, 2026
Merged

trypsynth merged 1 commit into
trypsynth:masterfrom
emassey0135:hid-braille-displays

Conversation

@emassey0135

@emassey0135 emassey0135 commented Oct 13, 2026 •

Copy link
Copy Markdown

On Android 15 and later, Backtalk connects to Braille displays that use the HID Braille standard over Bluetooth, through BrailleDisplayController. Two things kept displays that follow the standard from working, and both are fixed here in a general way, rather than by adding names. This is especially important to support the BTSpeak and BTBraille on Android.

Displays whose names Backtalk doesn't know weren't listed

Connectioneer only listed, and only reconnected to, devices whose names match SupportedDevicesHelper, so new HID displays and Braille terminal applications never appeared. Now a Bluetooth device that offers HID (0x1124 or HID over GATT, 0x1812) is listed too, whatever its name, on Android versions where Backtalk connects through HID.

  • The HID Braille usage page is in the device's report descriptor, which apps can't read before connecting, so offering HID is the filter. Connecting through BrailleDisplayController checks that the device really is a Braille display, so a keyboard picked by mistake just fails to connect, as any failed connection does.
  • Only the services that Bluetooth already knows about (getUuids()) are checked, never a new SDP query per device, and the check needs BLUETOOTH_CONNECT.
  • Automatic connection is unchanged: Bluetooth only reconnects to displays that connected before, so a keyboard is never connected to on its own.
  • USB is left as it was. Backtalk connects to the first allowed USB device as soon as it's attached, so allowing every USB HID device would connect to USB keyboards.

The HID driver wanted one report for keys and cells

The HID Braille driver (Drivers/Braille/HID/braille.c) failed with "Found multiple report IDs that include Braille usages" unless the Braille input and output were in the same report. The HID Braille standard allows separate ones, and the BT Braille 40, for example, sends its keys in report 1 and takes its cells in report 2. The driver now keeps the input and output report IDs separately, counts input bits per report ID so that the keys are found at the right bits whatever other reports the descriptor has, and writes cells with the output report ID. Braille input spread over several reports, or output over several, is still refused, as before.

Testing

On a Galaxy S26 Ultra (Android 17) with a BT Braille 40, which Backtalk didn't list before: it's listed, connects, shows Braille, and every key works, including Braille keys and space, the routing keys, and the six keys that send the D-pad, panning and rocker usages. It also reconnects on its own once it has connected. Phone and watch builds, unit tests and lint pass.

This also adds a "Braille displays" heading to differences.md, as #179 does, so whichever of the two is merged second needs a small rebase.

On Android 15 and later, a Bluetooth device that offers HID is listed as a possible braille display even when its name isn't one Backtalk knows, and connecting through BrailleDisplayController checks that it is one. Only the services Bluetooth already knows about are checked. The HID braille driver also required braille input and output to be in the same report. It now allows separate input and output reports, as the HID braille standard does; the BT Braille 40, for example, sends its keys in report 1 and takes its cells in report 2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@trypsynth
trypsynth merged commit 9255667 into trypsynth:master Oct 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants