In 2024 I tried to build Yocto straight for a generic RK3288 board and got stuck. It is a reference-design board, not Radxa or Firefly, with only a basic datasheet. The PMIC gave me the most trouble and I never got a boot. In July 2026 I went back to it with a slower plan: learn the new tooling on a Raspberry Pi 4B first, then carry the config over to the RK3288.
Full notes, configs, and original photos live in lonehog/building-yocto: rpi4b.md covers the Pi warm-up, rk3288-evb-scarthgap.md the EVB two-image build, and rk3288-generic.md my reference-design board.
RPi 4B on Wrynose 6.0
I used Poky Wrynose with the new bitbake-setup wizard. I picked template 4 (poky-wrynose), config 1 (poky, no sstate), and machine 4 (genericarm64). Then I sourced the env and cloned meta-raspberrypi on the wrynose branch.
./bitbake/bin/bitbake-setup init
source build/init-build-env
git clone -b wrynose https://git.yoctoproject.org/meta-raspberrypi
bitbake-config-build enable-fragment machine/raspberrypi4-64
Fragments are the part I liked. They compose the config instead of me appending lines to local.conf by hand. I added one line for the Pi firmware license and built.
LICENSE_FLAGS_ACCEPTED += "synaptics-killswitch"
bitbake core-image-minimal
Two things bit me on Ubuntu. Bitbake uses unprivileged user namespaces, which AppArmor blocks. I added a permissive profile for that instead of turning AppArmor off. Then bmaptool confused sda with sdb and wrote a regular file called /dev/sdb. I switched to the stable path and it worked.
ls -la /dev/disk/by-id/ | grep -i usb
sudo bmaptool copy build/tmp/deploy/images/raspberrypi4-64/core-image-minimal-raspberrypi4-64.wic.bz2 /dev/disk/by-id/usb-<exact-id>
The Pi booted to a login prompt on Poky 6.0.2. That took less time than configuring bblayers by hand back in 2024.
RK3288 EVB on Scarthgap 5.0
The EVB work was done on Poky 5.0.15 with kernel 6.1 and U-Boot 2017.09, build dir /nvme/yocto/poky/build. Layers: meta, meta-poky, meta-yocto-bsp, meta-arm, meta-oe, and meta-rockchip. meta-rockchip matters because it holds the machine conf and the kernel recipe. meta-oe holds the practical packages like htop and i2c-tools.
meta-rockchip ships three RK3288 machines. I used the standard one.
- rockchip-rk3288-evb: standard EVB, used here
- rockchip-rk3288-evb-act8846: EVB variant with ACT8846 PMIC
- rockchip-rk3288w-evb: low-power RK3288W variant
MACHINE = "rockchip-rk3288-evb"
DISTRO = "poky"
DISTRO_FEATURES:append = " systemd usrmerge"
DISTRO_FEATURES:remove = "sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j8"
EXTRA_IMAGE_FEATURES += "debug-tweaks ssh-server-openssh"
Two build failures
First failure: Nothing RPROVIDES systemd. Scarthgap requires usrmerge alongside systemd. Kirkstone did not enforce it. Adding usrmerge to DISTRO_FEATURES fixed the cascade through packagegroup-core-boot.
Second failure: fiq_debugger_arm.c complained about an implicit THREAD_INFO declaration. That macro left the kernel in 4.9 when thread_info moved into task_struct. The Rockchip driver still uses it, and -Werror turns the warning into a hard stop. I disabled the driver with a config fragment instead of patching it.
# meta-rockchip/recipes-kernel/linux/linux-rockchip/disable-fiq-debugger.cfg
CONFIG_FIQ_DEBUGGER=n
CONFIG_RK_CONSOLE_THREAD=n
# meta-rockchip/recipes-kernel/linux/linux-rockchip_6.1.bbappend
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI:append = " file://disable-fiq-debugger.cfg"
bitbake linux-rockchip -c cleansstate
bitbake core-image-minimal
Build 1 passed 4660 tasks and produced boot.img, uboot.img, trust.img, idblock.img, loader.bin, the rk808 dtb, a 17 MB rootfs tarball, and modules.
HDMI terminal image
Build 2 extends Build 1 with a login terminal on HDMI. The RK3288 HDMI block is Synopsys DesignWare IP, so the kernel needs DRM_ROCKCHIP plus DW_HDMI plus the Rockchip glue, with framebuffer console and VT on top.
DISTRO_FEATURES:append = " x11"
IMAGE_INSTALL:append = " kbd util-linux bash openssh openssh-sshd"
EXTRA_IMAGE_FEATURES += "debug-tweaks ssh-server-openssh tools-debug"
CONFIG_DRM=y
CONFIG_DRM_ROCKCHIP=y
CONFIG_FB=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_DRM_DW_HDMI=y
CONFIG_DRM_DW_HDMI_AHB_AUDIO=y
CONFIG_DRM_DW_HDMI_I2S_AUDIO=y
CONFIG_ROCKCHIP_DW_HDMI=y
I added a recipe meta-rockchip/recipes-core/images/rk3288-terminal-image.bb based on core-image-base.bb with kbd, bash, openssh, i2c-tools, htop, and e2fsprogs. systemd only starts getty on ttyFIQ0 by default, so I added an override that starts agetty with autologin root on tty1 and enables [email protected].
bitbake linux-rockchip -c cleansstate
bitbake rk3288-terminal-image
Flashing
meta-rockchip does not make a .wic image. It makes one file per partition, each with a fixed LBA offset. I put the board in Maskrom mode with RECOVERY held down and used rkdeveloptool over USB OTG.
cd /nvme/yocto/poky/build/tmp/deploy/images/rockchip-rk3288-evb/
sudo rkdeveloptool db loader.bin
sudo rkdeveloptool wl 0x0 idblock.img
sudo rkdeveloptool wl 0x40 uboot.img
sudo rkdeveloptool wl 0x1000 trust.img
sudo rkdeveloptool wl 0x2000 boot.img
sudo rkdeveloptool rd
sudo picocom /dev/ttyUSB0 -b 115200
Generic board and current boot
My generic board is the harder case. The PMIC area is shown below. If your board carries the ACT8846, start from the act8846 machine file, not the standard EVB one.
The Firefly RK3288 here boots a minimal image on kernel 6.18.24-yocto-standard at 1.61 GHz with 741 MiB RAM. fastfetch shows about 37 MiB used and a 38 MiB rootfs at 59 percent. btop shows the same 741 MiB total. The monitor photo still shows rk_iommu deferred-probe timeouts at the top, but the board reaches a root shell.
The EVB path builds and boots. The generic reference-design port is still in progress. Next step is carrying the PMIC and device-tree delta from the EVB config to my board.
Until next time PEACE
Surya Chilukuri
