I wanted to get a gift for my blind friend who has been interested in learning Linux for a while now. Just when I was about to start looking for something I decided to take a look at Brian Lunduke’s newest video featuring the Raspberry Pi 400. The Raspberry Pi 400 has come full circle in terms of computing. It is a keyboard. All the computing is done from within the keyboard. Much like the Comodore64, this computer comes without a screen but is still technically fully functional without one. I had my ‘Aha!’ moment, and decided that the Raspberry Pi 400 would be a very cool present.
No Headphone Jack
My first problem was that the Raspberry Pi 400 does not come with a headphone jack, even though every other Raspberry Pi A/B/B+ board with the exception of the compute modules and Zero series have included one. That said, the Raspberry Pi audio jacks are also known to crackle and pop due to either bad drivers or cheap manufacturing.
To compensate, I got an external USB audio card. I ended up going with the DuKabel USB to 3.5mm Jack Adapter (Amazon).
There are cheaper options for sure, but when I was looking around Raspberry Pi forums and Amazon reviews, this specific model seemed to come out on top in terms of performance. It costed me around 40 Canadian dollars. I figure this isn’t too bad considering my friend doesn’t need a screen, haha!
I wanted to choose something which will age well, and run the latest and greatest. For visually impaired users, the most important piece of software is the screen reader. If the screen reader doesn’t work, the rest of the work is toast! Some Raspberry Pi Orca installation guides like this one, have actually asked the user to compile Orca from source to get the latest version due to how out-of-date Debian’s package repositories are. A distribution which has none of these fusses was top priority, especially because Orca receives frequent updates.
I decided to go with Manjaro ARM Xfce:
- Xfce is lightweight.
- Runs a 64-bit kernel.
- Is based on Arch Linux, so receives very frequent package updates.
- Has the AUR (with some effort, as we’ll see).
The only downside of Manjaro ARM, and likewise other Aarch64 (ARM 64-bit) architecture kernels is that it did not have HEVC nor H264 hardware decoding available. Apparently, support for the Raspberry Pi’s VC4 graphics is getting mainlined in Linux kernel 5.10. Unfortunately, running the release candidate (RC) kernel did not make the Raspberry Pi 400 use hardware decoding. Perhaps other applications like
ffmpeg and Chromium need to add support as well before this works.
As stated before, minimum requirement for a visually impaired desktop Linux user is a screen reader. The most used screen reader for Linux is Orca, headed by the GNOME Project. This is relatively easy to install with a standard
# pacman -S orca
If logged in via SSH, you can start Orca with the
orca command. This will start reading the screen to you so you can do the next parts.
To activate Orca on login with LightDM, enable it in the ‘LightDM GTK+ Greeter Settings’ application. The ‘Misc.’ tab will have a drop-down for asking which screen reader you want to use. This will start Orca when the LightDM login system starts.
LightDM’s Orca will not help us once we are logged in however. To activate Orca on login, open the ‘Session And Startup application’ program, then add Orca to the “startup” list of apps.
And now Orca will be activated on boot and login.
The AUR, or the Arch User Repository has community maintained and distributed packages. Basically, you download a file which will tell your computer how to download, build and install a package for you.
To get the AUR working in a more automatic way, we need to install the
pacaur helper. This merited its own article, so check that out here: How to Install Pacaur on Manjaro ARM
The TL;DR is that we need to open the
/etc/makepkg.conf file and replace any mention of
This can be done as a oneliner, thanks to the
# sed -i 's/-march=armv8-a/-march=armv8-a+crypto/' /etc/makepkg.conf
Emacs is a scriptable document editor run by the GNU Project. Infamous for its high learning curve though it may be, there is a very extensive speech extension for it called Emacspeak. Emacspeak is built entirely by T. V. Ramen and has been freely available since its inception in 1999. Due to its age (and thus maturity), Emacspeak is an important tool in any “eyes-free” software developer toolkit.
Lucky for me, Emacspeak appears to not only to be available in the AUR, but also compilable with the Aarch64 architecture—the architecture of the Raspberry Pi 400. So this is as easy to install as:
$ pacaur -S emacspeak
I’ll cover a couple web browsers here based on how they worked.
Firefox will run in accessibility mode with caret browsing enabled automatically when it detects Orca is running. This makes Firefox by far the best browser for the job.
Chromium… Ugh. So it works, sort of. You need to enable two special flags, and add an environment variable.
To do this, I suggest editing the main profile in
/etc/profile. Add the following line to the end of that file:
Next, add two flags to the
You will need to relog to set the ENABLE_ACCESSIBILITY environment variable. Now Chromium should work with Orca.
The Badwolf browser is based on the WebkitGTK engine, as opposed to Firefox’s Gecko and Google’s Blink engines. It almost works out of the box. It is really fast compared to the other two, but it lacks some features like announcing a page is done loading and it doesn’t appear to support caret browsing, which will cause some other problems. Interesting though for such a young browser to have a minimal level of accessibility so early!
I would be interested where this goes in the future.
Somehow I forgot that you would need to setup the dummy display driver to work with the graphics without a display attached. To do this, install the
# pacman -S xf86-video-dummy
Next, override any
/etc/X11/xorg.conf you may have with this:
Section "Monitor" Identifier "Monitor0" HorizSync 28.0-80.0 VertRefresh 48.0-75.0 # https://arachnoid.com/modelines/ # 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync EndSection Section "Device" Identifier "Card0" Driver "dummy" VideoRam 256000 EndSection Section "Screen" DefaultDepth 24 Identifier "Screen0" Device "Card0" Monitor "Monitor0" SubSection "Display" Depth 24 Modes "1920x1080_60.00" EndSubSection EndSection
Now, when you boot, you should head ‘Screen reader on’.
It took a bit of messing around to get this working, but I’m glad I did! Now I can nerd out with another Linux friend and given how well they seem to find problems with accessibility, hopefully a few upstream patches can be made.
Happy hacking, for everyone!