About this

This tutorial will show the details of ROC-RK3399-PC board mainline support.

Hardware Access


BSP Building

Host require few tools to build BSP, those are host and rockchip


$ git clone
$ cd /path/to/trusted-firmware-a
$ make distcleanclean
$ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3399 bl31


$ git clone
$ cd u-boot-amarula
$ git checkout -b rockchip origin/rockchip
$ export BL31=/path/to/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf
$ make roc-pc-rk3399_defconfig #sd
$ make roc-pc-rk3399-spi_defconfig #spi
$ make


$ git clone git://
$ cd linux-next
$ make mrproper
$ ARCH=arm64 make defconfig
$ ARCH=arm64 make Image dtbs -j 4

Booting from

SPI Flash:

load mmc 1:1 $kernel_addr_r idbloader.img
sf probe
sf erase 0 +$filesize
sf write $kernel_addr_r 0 ${filesize}
load mmc 1:1 ${kernel_addr_r} u-boot.itb
sf erase 0x40000 +$filesize
sf write $kernel_addr_r 0x40000 ${filesize}


cd u-boot-amarula
sudo dd if=u-boot-rockchip.bin of=/dev/mmcblk0 seek=64
sudo sync


connect USB-OTG cable.

(target side)
# mmc dev 0
# gpt write mmc 0 $partitions
# fastboot 0

(host side)
cd u-boot-amarula
sudo fastboot -i 0x2207 flash loader1 idbloader.img
sudo fastboot -i 0x2207 flash loader2 u-boot.itb


There are several ways to build and flash the distributions to external storage devices like SD, eMMC, USB, SATA.

Since the ROC-RK3399-PC has in built SPI Flash, we use this flash to boot with initramfs and program the distributions on supported external storage devices on board using distroot.

All images are available at:

git clone


Power off the board.
Remove any bootable storage media like SD, eMMC module.
(Or plug it and make sure it doesn't have bootable images)
Plug the USB Type-C cable to Type-C 1 port on ROC-RK3399-PC.
Plug the Debug port with board
Open minicom with 1500000 8N1
Power on the board.

Mask ROM mode:

lsusb command on host pc should show
Bus 001 Device 020: ID 2207:330c Fuzhou Rockchip Electronics Company RK3399 in Mask ROM mode

If mask rom mode doesn’t appear, then:

Check Prerequisites steps or
Close SPI CLK and GND pins of J16.

Program SPI Flash:

cd bsp-rockchip
unxz roc-rk3399-pc-spinor.img.xz
sha256sum roc-rk3399-pc-spinor.img
(check the sha256 values with roc-rk3399-pc-spinor.img.xz.sha256sum)

rkdeveloptool ld
rkdeveloptool db rk3399_loader_spinor_v1.15.114.bin
rkdeveloptool wl 0 roc-rk3399-pc-spinor.img
rkdeveloptool rd

Program SD card/eMMC/USB/SSD:

Once SPI booted with initramfs, then install the distroot on selected
flash device.

login with root
# wget --no-check-certificate \
# sh ./

[distroot] try to program the flash...

1 SD card
2 eMMC
3 USB disk

Choose the flash [1-3]: 2

Power off or reboot, the board will pickup the distro based
on u-boot distboot order.


Assume the disk connected via /dev/mmcblk0 in host:

cd bsp-rockchip
unxz roc-rk3399-pc-sdcard.img.xz
sha256sum roc-rk3399-pc-sdcard.img
(check the sha256 values with roc-rk3399-pc-sdcard.img.xz.sha256sum)
sudo dd if=roc-rk3399-pc-sdcard.img of=/dev/mmcblk0
sudo sync