First target from README.md: a BeagleY-AI (TI AM67A / J722S, 4 GB RAM) SD card image that boots into a Fossil server used to develop its own voice-controlled app, with the JK Embedded Audio Board for sound.
Split (decided 2026-10-10):
- BQ2 builds everything, including the BeagleY-AI bootloader chain and kernel, using its own LLVM/musl toolchain on an aarch64 host.
- Upstream armbian/build is a reference only, for versions and patches. Those are recorded in
bsp/beagley-ai/manifest.md.
Each phase ends in something that can be booted or demonstrated, and each one is committed here before the next starts.
What exists today (research, 2026-10-10)
| Piece | Source | State |
|---|---|---|
| Userland | bootstrap-qcow2 (BQ2) | Produces a reproducible rootfs tarball: musl 1.2.5, LLVM/Clang 18, busybox 1.36, Crystal 1.19, git, sqlite, fossil 2.25. A prebuilt seed is available as https://dl.beagle.cc/images/bq2-rootfs-0.4.0-arm64.tar.gz. It has no init system, no ALSA, no SD/QCOW2 image output, no board or kernel support. It builds natively only (no cross-compiling), so rebuilding it needs an aarch64 host. |
| Boot + kernel | TexasInstruments/armbian-build ti-main |
config/boards/beagley-ai.conf, family k3-beagle. BRANCH=vendor uses beagleboard/linux v6.12.49-ti-arm64-r56 and beagleboard/u-boot v2025.07-am6232-pocketbeagle2, with TF-A/ti-linux-firmware 11.00.09 and OP-TEE 4.6.0. Boot files are tiboot3.bin, tispl.bin and u-boot.img on a FAT boot partition, using boot-k3.cmd and uEnv.txt. The R5 SPL toolchain is x86_64-only in the TI fork. |
| upstream armbian/build (chosen BSP) | config/boards/beagley-ai.conf, family k3-beagle, KERNEL_TARGET=vendor,vendor-rt,edge. vendor uses the same beagleboard 6.12 kernel and U-Boot. Newer for this board: ti-linux-firmware 11.02.15 (needed by EdgeAI 11.02 on J722S) and a 7.2 edge kernel with C7x DMA-BUF and remoteproc patches. |
|
| ollama.openbeagle.org/armbian-build | An older copy (tip badge-snake). It has the same vendor 6.12 sources. |
|
| Audio | embedconsult/jkembedded-audio-board | A mikroBUS audio board with a TI TAC5112 codec, an Si5351B clock and a DAC53002 VCXO trim, connected over McASP0/I2S. A HAT carries an MSPM0 that acts as a pca9538 at 0x20 and routes the audio signals to the header pins. On BeagleY-AI those are WRD 35, BIT 12, DI 38 and DO 40. The only overlay so far is for the mux. There's no codec/McASP sound-card overlay, no speaker amp and no microphone. The I/O is two line-level 3.5 mm jacks. |
| TAC5112 driver | sound/soc/codecs/tac5x1x-i2c.c is present in beagleboard/linux v6.12.49-ti-arm64-r56 and in ti-linux-kernel 6.18, but not in mainline (7.3-rc6). Armbian's k3-beagle vendor config just doesn't enable it (CONFIG_SND_SOC_TAC5X1X_I2C). For edge, the driver has to be carried as a patch. |
|
| Agent bridge | OCX (ocx2) + ollama |
docs/beaglebadge-provisioning.md already describes an aarch64 Beagle agent host: fossil, Crystal, the agent binary, and either llm.openbeagle.org/v1 or a local Ollama/llama.cpp provider. |
Phases
Phase 0: Plumbing (now)
- Get forum-post → session-message delivery working for this thread. Posts by
stonewere never typed into the session, andocx posttook about 25 minutes once. - Build host: the user's aarch64 machine, serving Fossil at https://fossil.openbeagle.org. Work there will be coordinated through OCX once the OCX design is frozen and its hook is installed (pending as of 2026-10-10). This x86_64 sandbox writes code and tools, and runs anything that doesn't need aarch64.
- Board identity: a new Fossil login for the board itself.
- Done when: an agent on the aarch64 host is reachable through OCX, and a BQ2 build runs there.
Phase 1: Boot to a shell
Status (2026-10-10):
- Done:
cleave-binman(docs).cleave-image(docs).cleave-init, a Crystal PID 1. The choice of our own init over busybox init was made 2026-10-10; busybox init stays as an extlinux fallback.- The BeagleY-AI layer and build script in
image/beagley-ai/.
- Missing: a kernel and DTB from the BQ2 BSP build on the aarch64 host, and a first boot on hardware.
- Add the BSP packages to a BQ2 board plan, using the versions and patches in
bsp/beagley-ai/manifest.md:- ti-linux-firmware.
- TF-A, OP-TEE, and U-Boot in two passes: R5 SPL (armv7r) for
tiboot3.bin, then A53 fortispl.binandu-boot.img. - The beagleboard 6.12 kernel with Armbian's DT patches and our config fragment.
Everything is built with clang (LLVM=1 / CC=clang).
- binman, done in Crystal (decided 2026-10-10):
bin/cleave-binmanreplaces U-Boot's Python binman for K3 images. Put it attools/binman/binmanbeforemake. Seedocs/cleave-binman.md; its outputs were checked against Armbian's binman-built BeagleY-AI images. - flex and bison: the kernel and U-Boot need them for dtc's DTS parser and the Kconfig
parser. Add them to BQ2 for now. Later, a Crystal DTS or Kconfig parser could replace them;
the multipass rewriting parser in
crystal-robots (
docs/PARSER.md) is a candidate pattern. - Write
cleave imagein Crystal, matching BQ2's preference for Crystal over shell. It takes the BQ2 rootfs and the BSP outputs and builds an MBR SD image:- FAT
bootpartition: tiboot3/tispl/u-boot.img, Image, dtb, uEnv.txt. - ext4
rootpartition.
- FAT
It must be rootless, so it can't use loop mounts.
- Add a minimal init to the rootfs: busybox
init+inittab, a serial getty onttyS2,mdev, DHCP on ethernet and wifi (CC33xx firmware), NTP (the board has no RTC, and clock skew breaks post ordering), and sshd (dropbear). - Done when: the image boots on a BeagleY-AI to a login prompt on serial and over the network.
Phase 2: The board serves Fossil and joins OCX
- Start a
fossil serverat boot, serving a clone ofcleavethat syncs withollama.openbeagle.org/cleave(autosync and a periodic pull). - First-boot setup: hostname, Fossil login and credentials, read from the FAT partition
(a cloud-init-style
user-data), so no secrets are baked into the image. - Build
ocx2and its hook for aarch64 musl, using the BQ2 Crystal toolchain on the board itself or on an aarch64 host. The board can then post to and answer threads, usingllm.openbeagle.orgfor remote LLM agents. - Done when: a forum post on the board's thread gets an answer posted from the board.
Phase 3: Audio bring-up (JK Embedded Audio Board)
- Kernel:
- Enable McASP (
SND_SOC_DAVINCI_MCASP/ J721E EVM),COMMON_CLK_SI5351,GPIO_PCA953Xand the TI TAC5x1x driver. - beagleboard 6.12 already has
tac5x1x-i2c.c, so this is a config change only:bsp/beagley-ai/kernel-jkembedded-audio.config. Mainline (7.3-rc6) doesn't have the driver, so it's worth upstreaming.
- Enable McASP (
- Write
k3-am67a-beagley-ai-jkembedded-audio.dtso:- McASP0 pinmux on the HAT pins.
- Si5351 at 0x60 as the MCLK source.
- TAC5112 on I2C (confirm the address from the schematic).
- An
audio-graph-card/simple-audio-cardlinking them.
Upstream it to the audio-board repo next to the existing mux overlay.
- Run
set-mux-profile.sh --host byai-am67aat boot. - Userland: add
alsa-libandalsa-utilsto the BQ2 plan. - Done when:
arecord | aplayloopback through the jacks works, and capture is at 16 kHz mono for speech. - Hardware chosen (2026-10-10):
- Speaker: XMSJSIY USB-powered mini stereo speakers with a 3.5 mm TRS input (Amazon B0D7L5JQJC). Self-amplified, so the line-level OUT jack drives it directly.
- Microphone: SoundTech/VEC CM-1000 omni conference mic, 3.5 mm (Amazon B004E1VIPC). It's a PC electret mic, so it expects plug-in power (about 2-5 V bias) and puts out mic level, not line level.
- Mic bias (confirmed): TAC5112 pin 14 MICBIAS runs through R12 and R13 (1 kΩ each) to
IN_LEFTandIN_RIGHT, decoupled by C13 (1 µF), with R20 (0 Ω) also on the bias net. That's plug-in power for the CM-1000.- MICBIAS must be enabled in software, through the driver, ALSA controls or DT.
- Use the mic PGA gain, not line-in gain.
- The bias puts DC on the jack, so line-level sources plugged in there need to be AC-coupled.
Phase 4: Local speech loop (CPU first)
Everything runs on the A53 cores to begin with, within 4 GB RAM.
- Wake word / VAD: a small keyword spotter plus energy VAD, always on and cheap.
- STT: whisper.cpp
tiny.enorbase.en, quantized. Expect near-real-time on 4× A53 for short commands. - Tiny LLM front end: llama.cpp with roughly a 0.5B instruct model at Q4 (about 400 MB). It handles intent routing, local answers and acknowledgements such as "let me look that up for you". Anything bigger becomes an OCX post to a remote agent.
- TTS: Piper (small voice) or espeak-ng as a fallback.
- Glue in Crystal: a voice daemon that turns utterances into OCX posts on the board's thread and speaks the replies.
- Add the packages to the BQ2 plan, building with cmake and clang/musl.
- Done when: you speak a request, hear an acknowledgement, and the remote answer is read back.
Phase 5: Accelerator offload (C7x DSP + MMA)
- Move to ti-linux-firmware 11.02.x and the EdgeAI 11.02 remoteproc firmware. Upstream Armbian already pins it.
- Port STT encoder and/or keyword-spotting models to TIDL on the C7x/MMA.
- Risk: TI's TIDL/EdgeAI runtime is built for glibc. Running it on musl BQ2 may need a glibc sidecar or static builds. Evaluate before committing to it.
- Done when: measurable latency or CPU savings over Phase 4.
Phase 6: Voice-driven development
- Voice → OCX post → agent → commit to the board's Fossil → board rebuilds and redeploys the voice app. Spoken summaries come back through TTS.
- Long-term: the board rebuilds its own BQ2 userland natively, in line with BQ2's self-hosting goal.
Decisions wanted
- ~~Kernel~~: beagleboard 6.12 (Armbian's
vendorrefs), built by BQ2. - ~~aarch64 build host~~: https://fossil.openbeagle.org, through OCX once its hook is installed.
- ~~Microphone and speaker~~: chosen, and the mic bias is confirmed.
- Board login name: a new login. Proposed:
byai-voice. - ~~binman~~: ported to Crystal (
cleave-binman).