This project includes all the necessary work for compiling the operating system, kernel, and other tools found on T3 Gemstone boards, and is intended for developers who wish to prepare a customized GNU/Linux Distribution.
All details related to the project can be found at https://docs.t3gemstone.org/en/sdk. Below, only a summary of how to perform the installation is provided.
user@host:$ ./setup.sh2. After the installation is successful, activate the jetify-devbox shell to automatically install tools such as Distrobox, taskfile, etc.
user@host:$ devbox shell📦 devbox:sdk> task fetch
📦 devbox:sdk> task permissions
📦 devbox:sdk> task box# Show all available tasks and environment variables
🚀 distrobox:workdir> task default
# Build kernel, bootloader, initrd
# Note: MACHINE can be 'intel-corei7-64', 't3-gem-o1', 'beagley-ai' or 'qemuarm64'
# Note: First build takes approximately 2 hours and you need at least 32GB empty disk space
🚀 distrobox:workdir> task yocto:build MACHINE=intel-corei7-64
# Build the PowerVR GPU userspace (TI mesa-pvr)
# Note: only 't3-gem-o1' for now; required by its task distro:build
# Note: takes a few minutes
🚀 distrobox:workdir> task graphics:build MACHINE=t3-gem-o1
# Pack Distro
# Note: DISTRO_BASE can be 'ubuntu', 'debian', 'pardus'
# Note: DISTRO_SUITE can be 'jammy', 'bookworm', 'yirmiuc', 'yirmibes'
# Note: DISTRO_TYPE can be 'minimal', 'kiosk', 'desktop', 'tablet'
🚀 distrobox:workdir> task distro:build MACHINE=intel-corei7-64 DISTRO_TYPE=desktop DISTRO_BASE=ubuntu DISTRO_SUITE=jammy IMG_SIZE=16G
# Pack Pardus Tablet
🚀 distrobox:workdir> task distro:build MACHINE=intel-corei7-64 DISTRO_TYPE=tablet DISTRO_BASE=pardus DISTRO_SUITE=yirmibes IMG_SIZE=16G
# After build images, run virtual machine
🚀 distrobox:workdir> task yocto:runqemu MACHINE=intel-corei7-64 DISTRO_TYPE=desktop DISTRO_BASE=ubuntu DISTRO_SUITE=jammy WORKDIR=$PWDThe AM67A SoC carries a PowerVR Rogue GPU. Its kernel driver (pvrsrvkm), firmware and closed IMG userspace libraries are installed by the SDK, but the piece that connects them to OpenGL ES — Mesa's pvr_dri.so — only exists in TI's patched Mesa. Without it GLES silently falls back to llvmpipe, the software rasterizer.
task graphics:build cross compiles that Mesa against the target rootfs ABI and installs it into an isolated prefix, /opt/ti-gpu. The image's own Mesa, its Xorg session and its desktop stay on the stock software path; only applications that opt in use the GPU. Opting in is a wrapper:
gemstone@t3-gem-o1:$ gem-gpu-info # where the render path stands
gemstone@t3-gem-o1:$ gem-gpu-run kmscube # any EGL/GBM program
gemstone@t3-gem-o1:$ gem-gpu-run env QT_QPA_PLATFORM=eglfs ./app # a Qt applicationRendering goes through EGL + GBM/DRM, so it needs DRM master: stop Xorg first, or use a VT that Xorg is not holding. GLX (glxinfo, indirect X11 rendering) stays on the system Mesa by design — TI's Mesa is built without GLX.
Because there is no GLX, an Xorg kiosk session renders on the CPU whatever else is installed. The kiosk image instead runs the application straight on DRM/KMS with no display server, selected by KIOSK_BACKEND in /etc/gemstone/kiosk.conf:
x11 |
eglfs (default on t3-gem-o1) |
|
|---|---|---|
| Session | Xorg + openbox | none, the app owns the panel |
| Toolkits | any | Qt only |
| Qt Quick / QML | software | GPU |
| native EGL/GL | software | GPU |
| QtWidgets | works | black screen — driver bug, see below |
The example kiosk application (~/bin/kiosk) is Qt Quick for this reason. Measured on a T3 Gemstone O1, same application on the 1024x600 DSI panel, 4x Cortex-A53 @1.4 GHz:
| App CPU | Xorg CPU | App RSS | |
|---|---|---|---|
x11 — llvmpipe |
82% | 3.0% | 130 MB |
eglfs — PowerVR |
7% | — | 62 MB |
The toolkit is the same in both rows, so that difference is the GPU. For reference the previous QtWidgets version of the example cost 74% under x11; moving to Qt Quick is what makes the GPU reachable, not what makes it cheap.
The QtWidgets caveat: under eglfs a QtWidgets window stays black. Qt reports no error — it selects the mode correctly and keeps flipping buffers — but the texture it uploads from the widget backingstore never reaches the screen. The same application renders correctly under llvmpipe, so the fault is in the PowerVR userspace, not in Qt's configuration. Set KIOSK_BACKEND=x11 for a QtWidgets application, or for anything that is not Qt.
# Initialize bitbake
🚀 distrobox:workdir> source yocto/poky/oe-init-build-env build/intel-corei7-64
# Tune Linux Kernel
🚀 distrobox:intel-corei7-64> bitbake -c menuconfig virtual/kernel
# Tune U-Boot
🚀 distrobox:intel-corei7-64> bitbake -c menuconfig virtual/bootloaderDocker is installed on your system via the ./setup.sh command. If you are installing Docker for the first time, you must log out and log in again after the installation is complete.
When you perform the compilation process with the task:distro command many times, debos may occasionally give a "Segmentation Fault" error.
Additionally, following error can occur while compiling the arm64 image for BeagleY-AI. This problem persists even after rebooting your system, so you may need to apply the solution after each reboot.
W: Failure trying to run: /sbin/ldconfig
qemu: uncaught target signal 11 (Segmentation fault) - core dumpedTo solve these problems, first try running the following command inside devbox shell
📦 devbox:sdk> distrobox stop gemstone-sdkif it does not work, run the destroy command.
📦 devbox:sdk> task destroy# Stop distrobox
📦 devbox:sdk> distrobox stop gemstone-sdk
# Start and Enter distrobox image
📦 devbox:sdk> task box
# Clean yocto image
🚀 distrobox:workdir> task yocto:build MACHINE=intel-corei7-64 TARGET='-c clean -c cleansstate gemstone-image-rd virtual/kernel'
# Rebuild
🚀 distrobox:workdir> task yocto:build MACHINE=intel-corei7-64📦 devbox:sdk> task box
task: Failed to run task "box": exit status 1
Error: An error occurredTo figure out what exact problem is, run distrobox-enter --additional-flags "--tty" --name gemstone-sdk --no-workdir --verbose
*** update-locale: Error: invalid locale settings: LC_ALL=en_EN.UTF-8 LANG=en_EN.UTF-8To solve this problem, try to update locales
📦 devbox:sdk> sudo dpkg-reconfigure locales