Firmware Images

Full credit to Texas Instruments for keeping this thing going. It was a little hairy for a long while, with Angstrom disappearing, but there are quite modern images for this ancient board available at https://beagleboard.org/latest-images with no muss or fuss. Grab it, unpack it, and go.

However… the boot story has changed dramatically since the early days, and one of the things that seemingly got lost along the way was support for some of the bbxm-specific LCD backpacks that had been made. Figuring out all the moving pieces was quite the deep dive through Linux’s view of hardware. So, here goes.

Resurrecting the Beagleboard Toys ULCD

Amusingly, the device I have next to me at the time of writing must have been a prototype or a pre-production run or something. It calls itself a beagleboardtoys.com BBT-ULCD_Lite-001 revision… blank. That said, this one of two of these I’ve seen in the wild (the other having been on eBay). Beagleboardtoys is no more (acquired by CircuitCo, in turn apparently in stasis as of 2012ish?), as are many of the related sites from the era. https://elinux.org is full of ancient, dead links. :( .

The closest surviving documentation is for a related product, the “ULCD7-Lite”. The full schematics are available, and are apparently close enough to the thing in my hand to be viable: https://github.com/CircuitCo/ULCD7-Lite/blob/master/ULCD7-Lite-schematic.pdf.

In the ancient days, some part of the BeagleBoard XM’s stack understood kernel command line arguments of the form buddy= and buddy2=, and there were probes in u-boot (e.g. https://github.com/eewiki/u-boot-patches/blob/master/v2013.04/0001-omap3_beagle-uEnv.txt-bootz-n-fixes.patch) Apparently also one was expected to manually configure u-boot, judging by some old forum threads. Anyway, it’s all become a mishmash and none of the old support is still around these days, so, time to dig in.

Looking at the schematics, we see that there are basically five aspects of this device, from the perspective of the system software (bootloader, kernel, and X). There’s the screen itself, the TSC2007 touch screen controller, a TLC59108 LED driver repurposed as a digital output device, and two I2C EEPROMs. Phrased differently, there’s the screen, driven over a dedicated digital interface which also includes the “LCD” EEPROM, and three other devices sitting on an I2C bus:

I chose to make u-boot do the very basic initialization of the TLC59108 status and generally take complete control of the boot process myself. The TSC2007 needs a Device Tree Overlay file to register itself with the kernel; fortunately, modern u-boot understands how to wire this all up before boot, so we don’t have to play with the kernel’s overlay implementation. Unfortunately, my display’s “LCD EEPROM” is not properly populated, so I also use a xorg.conf file to make it all work out. Let’s address each piece in turn.

Touch-screen Controller

The TSS2007 DTS can be found here. We will tell u-boot to mix this in with our vendor-provided DTB file, but that means it needs to know where to find it. I made the directory /boot/dtbs/nwf and then ran dtc -@ -o /boot/dtbs/nwf/lcd-tsc2007.dtbo lcd-tsc2007.dtso to generate the binary form of the overlay.

Booting

My replacement u-boot boot script is available here. This script not only takes over u-boot to boot the machine (with minimal dependencies on everything else TI packaged in this u-boot), it takes it upon itself to initialize the TLC59108. No probing is done to check that the machine is attached to the ULCD7!

When changing one’s u-boot script, it needs to be re-made into an image that u-boot understands. With /boot/uboot mount-ed and the script itself in /boot/boot.scr.txt, running mkimage -T script -C none -n 'boot script' -d /boot/boot.scr.txt /boot/uboot/boot.scr.uimg suffices to get the script to u-boot.

Xorg

Last, but certainly not least, my xorg.conf is available here.

Manual Backlight Control

If you don’t mind directly writing to the I2C bus, you can adjust the backlight. Use i2cset -y 1 0x40 12 0x20 to enable backlight control via channel PWM2 and then i2cset -y 1 0x40 4 0 for full-on and i2cset -y 1 0x40 4 0xFF for full-off.