[BRLTTY] baum: NVDA does not detect usb-braille

Alexander Epaneshnikov aarnaarn2 at gmail.com
Wed Oct 21 20:52:27 UTC 2026


On Sun, Oct 18, 2026 at 10:49:10PM +0200, Samuel Thibault wrote:
> Re,
>
> Alexander Epaneshnikov, le dim. 18 oct. 2026 22:35:58 +0300, a ecrit:
> > On Sun, Oct 18, 2026 at 09:10:39PM +0200, Samuel Thibault wrote:
> > > Does the device sends the cell count first or the device identity
> > > first?
> >
> > I don't know for sure, as I don't have a real Baum display; mine is a
> > HumanWare Brailliant, which uses its own protocol. The comment in
> > NVDA's driver lists them as "device id, serial number and number of
> > cells", so the identity seems to come first, but that is the only hint
> > I have. BRLTTY's Baum driver doesn't use 0x15 at all, it asks for each
> > of them explicitly.
> >
> > NVDA itself doesn't depend on the order: it stores the cell count and
> > the identity separately as they arrive and continues once it has both.
> > I tested sending the identity first and then the cell count, and NVDA
> > detected the display.
>
> Ok, could you check the attached patch?

Thank you. This patch indeed fixes NVDA detection of emulated braille display.

> Thanks,
> Samuel

> diff --git a/chardev/baum.c b/chardev/baum.c
> index 166d6f2f09..db0a4fff75 100644
> --- a/chardev/baum.c
> +++ b/chardev/baum.c
> @@ -97,6 +97,7 @@ struct BaumChardev {
>      brlapi_fileDescriptor brlapi_fd;
>      unsigned int x, y;
>      bool deferred_init;
> +    bool protocol_on;
>
>      uint8_t in_buf[BUF_SIZE];
>      uint8_t in_buf_used;
> @@ -337,13 +338,27 @@ static void baum_write_packet(BaumChardev *baum, const uint8_t *buf, int len)
>      }
>  }
>
> +static void baum_send_cell_count(BaumChardev *baum)
> +{
> +    uint8_t cell_count[] = { BAUM_RSP_CellCount, baum->x * baum->y };
> +    baum_write_packet(baum, cell_count, sizeof(cell_count));
> +}
> +
> +static void baum_send_device_identity(BaumChardev *baum)
> +{
> +    uint8_t identity[17] = { BAUM_RSP_DeviceIdentity,
> +        'B','a','u','m',' ','V','a','r','i','o' };
> +    identity[11] = '0' + baum->x / 10;
> +    identity[12] = '0' + baum->x % 10;
> +    baum_write_packet(baum, identity, sizeof(identity));
> +}
> +
>  /* Called when the other end seems to have a wrong idea of our display size */
>  static void baum_cellCount_timer_cb(void *opaque)
>  {
>      BaumChardev *baum = BAUM_CHARDEV(opaque);
> -    uint8_t cell_count[] = { BAUM_RSP_CellCount, baum->x * baum->y };
>      DPRINTF("Timeout waiting for DisplayData, sending cell count\n");
> -    baum_write_packet(baum, cell_count, sizeof(cell_count));
> +    baum_send_cell_count(baum);
>  }
>
>  /* Try to interpret a whole incoming packet */
> @@ -441,17 +456,18 @@ static int baum_eat_packet(BaumChardev *baum, const uint8_t *buf, int len)
>          uint8_t protocol;
>          DPRINTF("SetProtocol\n");
>          EAT(protocol);
> -        /* ignore */
> +        if (!baum->protocol_on && protocol) {
> +            /* Switching on, answer with device identity and cell count */
> +            baum_send_device_identity(baum);
> +            baum_send_cell_count(baum);
> +        }
> +        baum->protocol_on = protocol;
>          break;
>      }
>      case BAUM_REQ_GetDeviceIdentity:
>      {
> -        uint8_t identity[17] = { BAUM_RSP_DeviceIdentity,
> -            'B','a','u','m',' ','V','a','r','i','o' };
>          DPRINTF("GetDeviceIdentity\n");
> -        identity[11] = '0' + baum->x / 10;
> -        identity[12] = '0' + baum->x % 10;
> -        baum_write_packet(baum, identity, sizeof(identity));
> +        baum_send_device_identity(baum);
>          break;
>      }
>      case BAUM_REQ_GetVersionNumber:


--
Sincerely, Alexander


More information about the BRLTTY mailing list