DEV Community

Luca Barbato
Luca Barbato

Posted on • Edited on

Bringing up BPI-F3 - Part 2

This is part2, in part1 I shown how to get a Gentoo system on the nvme taking some shortcuts. Here are the notes from the second day with some improvements.

Setting up the eMMC

stintel already documented how to build uboot and install it, I'm summarizing it as well here.

Dependencies

We need dtc to compile the device-tree and mkimage and git if we want to clone the trees.

emerge dtc u-boot-tools dev-vcs/git 
Enter fullscreen mode Exit fullscreen mode

Bootloader

This board boot process relies on opensbi + u-boot

  • First build opensbi
git clone https://github.com/BPI-SINOVOIP/pi-opensbi -b v1.3-k1 cd pi-opensbi make PLATFORM=generic menuconfig make -j 8 
Enter fullscreen mode Exit fullscreen mode

As stintel already reported, the default configuration is wrong, so we have to make sure that the build/platform/generic/kconfig/.config has the support for K1x:

# CONFIG_PLATFORM_SPACEMIT_K1PRO is not set CONFIG_PLATFORM_SPACEMIT_K1X=y 
Enter fullscreen mode Exit fullscreen mode

If everything goes well build/platform/generic/firmware/fw_dynamic.bin will exist.

  • Then build u-boot
export OPENSBI=../pi-opensbi/build/platform/generic/firmware/fw_dynamic.bin git clone https://github.com/BPI-SINOVOIP/pi-u-boot -b v2022.10-k1 cd pi-u-boot make k1_defconfig make -j8 
Enter fullscreen mode Exit fullscreen mode

If everything goes well it will produce the following files

FSBL.bin bootinfo_emmc.bin bootinfo_sd.bin bootinfo_spinand.bin bootinfo_spinor.bin u-boot.bin 
Enter fullscreen mode Exit fullscreen mode

Partitions

The upstream instructions suggest to copy over the layout, so the uboot, bootfs, rootfs partitions stay the same, but now the eMMC fsbl and opensbi are to live in their dedicated /dev/mmcblk2boot0. So it is up to you to do what you prefer with them.
Surely you have to setup /dev/mmcblk2boot0:

echo 0 > /sys/block/mmcblk2boot0/force_ro dd if=bootinfo_emmc.bin of=/dev/mmcblk2boot0 dd if=FSBL.bin of=/dev/mmcblk2boot0 bs=512 seek=1 
Enter fullscreen mode Exit fullscreen mode

As stintel tested, all that's need is that a partition labeled uboot exists and contains u-boot.bin and a bootfs partition that contains env_k1-x.txt. It is a good idea to have env and rootfs as well.

Kernel

Building the kernel is straightforward enough:

git clone https://github.com/BPI-SINOVOIP/pi-linux -b linux-6.1.15-k1 ln -s pi-linux/ linux cd linux zcat /proc/config.gz > .config make oldconfig # (or menuconfig) make -j 10 && make modules_install mount /boot # make sure it picks the right partition make install 
Enter fullscreen mode Exit fullscreen mode

Make sure to enable HWMON and HWMON_NVME so you'll have the thermal sensors available.

Edit boot/env_k1-x.txt accordingly and your new kernel is ready.

NOTE: The initial kernel has at least a known annoying bug and it is missing HWMON support for its thermal sensors.
If you use Rust, you'll notice immediately some strange issue with futex().

  • here a patch to address the bug backported to the 6.1.15 vendored kernel.
  • here my tiny patch to get something going regarding HWMON.

Coming next

  • Do not use at all an initrd (right now if you are following along you'd be using the initrd from the starting distro)
  • Other u-boot tweaks

Top comments (0)