Compile Linux firmware

Compile Buildroot firmware

This chapter introduces the compilation process of Buildroot firmware.
It is recommended to develop under Ubuntu 22.04 system environment. If
you use other system versions, you may need to adjust the compilation
environment accordingly.

The compilation portion of this tutorial works with SDK versions above
v1.0.0a

   $ readlink -f .repo/manifest.xml
   /home2/lvsx/project/rk3506/.repo/manifests/rk3506_linux_release_20250117_v1.0.0a.xml

Preparatory work

Set up compilation environment

   sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \
   expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
   qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \
   unzip \
   device-tree-compiler ncurses-dev \

Compile SDK

Precompile Configuration

There are configuration files for different board in
"device/rockchip/rk3506/", select the configuration file:

   ./build.sh firefly_rk3506_roc-rk3506b-cc-emmc_buildroot_defconfig # EMMC interface (the default is EMMC interface)

   or

   ./build.sh firefly_rk3506_roc-rk3506b-cc-spi-flash_buildroot_defconfig # SPI FLASH interface (need to paste SPI FLASH)

Build

Automatic compilation

start compiling

   ./build.sh

the firmware will be saved to the directory "output/update".

Partial compilation

u-boot

   ./build.sh uboot

kernel

   ./build.sh kernel

recovery

   ./build.sh recovery

buildroot

   ./build.sh buildroot

Pack the firmware, the firmware will be saved to the directory
output/update.

   ./build.sh updateimg

Compile Linux AMP firmware

Overview

AMP (Asymmetric Multi-Processing) system is an asymmetric multi-core
heterogeneous system, that is, in the same chip, by grouping CPUs and
running different systems in different groups of CPUs, by reasonably
allocating tasks and resources, AMP system can provide better
performance.

The rk3506 chip has two types of CPUs: Cortex-A7 * 3 + Cortex-M0 * 1.
The three Cortex-A7 cores support linux (kernel-6.1), Baremetal (HAL),
RTOS (RT-Thread), and Cortex-M0 supports Baremetal (HAL). Using the
AMP feature, you can run linux on Cortex-A7 * 3, and Cortex-M0 * 1 as
an auxiliary core to run a bare metal system; you can also run linux
on Cortex-A7 * 2, and Cortex-A7 * 1 as an auxiliary core to run a bare
metal or real-time system, and other combinations of AMP construction.

Compilation Environment Setup

This chapter introduces the compilation environment setup for Linux
SDK

Note:

**(1) It is recommended to develop in the X86_64 Ubuntu 22.04 system
environment. If you use other system versions, you may need to make
corresponding adjustments to the compilation environment. **

**(2) Use a normal user to compile, and do not use root user
privileges to compile. **

Get SDK

First, prepare an empty folder to store the SDK. It is recommended to
be in the home directory. This article takes "~/proj" as an example

Note:

1. The SDK uses cross-compilation, so use the SDK on an X86_64
computer and do not download the SDK to the board

2. Please use Ubuntu22.04 (real machine or docker container) as the
compilation environment. If you use other versions, compilation errors
may occur

3. Do not store or decompress the SDK in a shared folder of the
virtual machine or a non-English directory

4. Please use a normal user throughout the process of obtaining and
compiling the SDK. Root permissions are not allowed or required
(unless apt is required to install the software)


Installation tools

To obtain the SDK, you need to install:

   sudo apt update
   sudo apt install -y repo git python p7zip-full

Initialize the warehouse

**We provide a basic SDK package. Please contact sales@t-firefly.com
to obtain it. **

After downloading, verify the MD5 code first:

   $ md5sum rk3506_linux_release_20250117_v1.0.0a/*
   a5df458069569e9288b1d96097b43397  rk3506_linux_release_20250117_v1.0.0a.7z.001
   7c1a1b050ae4f0daf64fe7488a7f4b02  rk3506_linux_release_20250117_v1.0.0a.7z.002
   c7998713e7ef3512635ad2f79730d888  rk3506_linux_release_20250117_v1.0.0a.7z.003

After confirmation, you can decompress it:

   mkdir -p ~/proj/rk3506_sdk
   cd ~/proj/rk3506_sdk
   7z x /path/to/rk3506_linux_release_20250117_v1.0.0a/rk3506_linux_release_20250117_v1.0.0a.7z.001

Installation Dependencies

Method 1:

Install the environment on your PC:

   sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \
   expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
   qemu-user-static live-build bison flex fakeroot cmake \
   unzip device-tree-compiler python-pip ncurses-dev python-pyelftools scons \
   clang-format astyle libncurses5-dev build-essential python-configparser

Method 2: Use Docker

Use dockerfile to create a container and compile in the container,
which perfectly solves the compilation environment problem and
isolates it from the host environment without affecting each other.

First install docker in the host, please refer to:

Installation Tutorial

Create a directory as the Docker working directory, for example,
"~/docker/", and create a file "Dockerfile" in it with the following
content:

   FROM ubuntu:22.04
   MAINTAINER firefly "service@t-firefly.com"

   ENV DEBIAN_FRONTEND=noninteractive

   RUN cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
   RUN sed -i 's@http://.*ubuntu.com@http://repo.huaweicloud.com@g' /etc/apt/sources.list

   RUN apt update

   RUN apt install -y build-essential crossbuild-essential-arm64 \
   	bash-completion vim sudo locales time rsync bc python

   RUN apt install -y repo git ssh libssl-dev liblz4-tool lib32stdc++6 \
   	expect patchelf chrpath gawk texinfo diffstat binfmt-support \
   	qemu-user-static live-build bison flex fakeroot cmake scons \
   	unzip device-tree-compiler python-pip ncurses-dev python-pyelftools \
   	subversion asciidoc w3m dblatex graphviz python-matplotlib cpio \
   	libparse-yapp-perl default-jre patchutils swig expect-dev u-boot-tools \
       clang-format astyle libncurses5-dev build-essential python-configparser

   RUN apt update && apt install -y -f

   # language support
   RUN locale-gen en_US.UTF-8
   ENV LANG en_US.UTF-8

   # switch to a no-root user
   RUN useradd -c 'firefly user' -m -d /home/firefly -s /bin/bash firefly
   RUN sed -i -e '/\%sudo/ c \%sudo ALL=(ALL) NOPASSWD: ALL' /etc/sudoers
   RUN usermod -a -G sudo firefly

   USER firefly
   WORKDIR /home/firefly

Create an image

   cd ~/docker
   docker build -t sdkcompiler .
   # sdkcompiler is the image name, which can be changed at will. Note that there is a ‘.’ at the end of the command.
   # This process will take some time, please be patient

After the image is created, create a container and start it

   # Here, mount the folder where the SDK is located in the host to the container, so that the container can access the SDK in the host
   # source= fill in the directory where the SDK is located; target= fill in a directory in the container, which must be an empty directory
   # ubuntu22 is the container name, firefly is the container hostname, both can be changed at will
   # sdkcompiler is the image name in the previous step
   docker run --privileged --mount type=bind,source=/home/fierfly/proj,target=/home/firefly/proj --name="ubuntu22" -h firefly -it sdkcompiler

Now you can compile the SDK in the container.

How to exit and restart the container:

   # Type exit in the container to exit

   # View all containers (including those that have been exited)
   docker ps -a

   # Restart an exited container and connect
   docker start ubuntu22 # Container name
   docker attach ubuntu22

Compile Buildroot firmware

This chapter introduces the compilation process of Buildroot firmware.
It is recommended to develop in the Ubuntu 22.04 system environment.
If you use other system versions, you may need to adjust the
compilation environment accordingly.

Compile SDK

Pre-compilation configuration

Configuration files for different board types are stored in the
"/path/to/sdk/device/rockchip/rk3506/" directory

Go back to the SDK root directory and execute "build.sh" to select the
configuration file:

   ./build.sh firefly_rk3506_roc-rk3506b-cc-amp-emmc_buildroot_defconfig

Unified compilation and packaging of SDK

RK3506 supports the AMP hybrid architecture design of Linux, HAL, and
RT-Thread, so that different CPUs can run different systems to meet
flexible product design requirements. The SDK currently uses the Linux
+ RT-Thread hybrid structure model by default, where the CPU running
Linux is the main core and the CPU running rtt is the slave core;
cores 0~1 run Linux, and core 2 runs RT-Thread.

Compilation configuration

The unified compilation configuration script of the SDK is located in
the device/rockchip/rk3506/ directory. The compilation configuration
script includes the configuration of U-Boot, Kernel, HAL, RT-Thread,
and AMP-related CPU allocation, memory allocation and other
configurations. Users can add or modify the configuration script file
as needed to meet their own compilation needs. The main AMP
configuration files are as follows:

   amp_linux.its								# Linux + rtt AMP package ITS configuration file
   firefly_rk3506_roc-rk3506b-cc-amp-emmc_buildroot_defconfig		# Linux + rtt corresponding configuration file

The unified compilation script tool supports one-click compilation and
packaging of U-Boot, Kernel, HAL, RT-Thread, ROOTFS, etc., and
generates corresponding Image images.

   ./build.sh

Partial compilation

Compile u-boot

   ./build.sh uboot

Compile kernel

The hardware resources used by AMP need to be disabled in the kernel
device tree and declared under the rockchip_amp tag in the
rk3506-amp.dtsi device tree

   ./build.sh kernel

Compile recovery

   ./build.sh recovery

Compile the Buildroot root file system

Compile the Buildroot root file system, and the compilation output
directory will be generated in "buildroot/output":

   ./build.sh buildroot

   # Note: Make sure to compile the Buildroot root file system as a normal user to avoid unnecessary errors.

Compiling AMP

Compile RT-Thread to create amp image

Compile and package amp firmware

Compile and package amp firmware

   ./build.sh amp

Use /path/to/sdk/device/rockchip/rk3506/amp_linux.its configuration
file to package output/firmware/amp.img

Other

By default, hal or RT-Thread uses uart5 as the debugging serial port
with a baud rate of 1.5M.

Packaging firmware

Package the firmware, and the generated complete firmware will be
saved in the "output/update/" directory.

   ./build.sh updateimg

Partition Description

parameter partition table

The parameter.txt file contains the partition information of the
firmware. Take "parameter-buildroot-amp-emmc-fit.txt" as an example:

Path: "device/rockchip/rk3506/parameter-buildroot-amp-emmc-fit.txt"

   FIRMWARE_VER:8.1
   MACHINE_MODEL:RK3506
   MACHINE_ID:007
   MANUFACTURER: RK3506
   MAGIC: 0x5041524B
   ATAG: 0x00200800
   MACHINE: 3506
   CHECK_MASK: 0x80
   PWR_HLD: 0,0,A,0,1
   TYPE: GPT
   GROW_ALIGN: 0
   CMDLINE:mtdparts=:0x00002000@0x00002000(uboot),0x00000800@0x00004000(misc),0x0000A000@0x00004800(recovery),0x00010000@0x0000E800(boot),0x00010000@0x0001E800(backup),0x00008000@0x0002E800(oem),0x00002000@0x00036800(amp),0x00c00000@0x00038800(rootfs),-@0x00c36800(userdata:grow)
   uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
   uuid:boot=7A3F0000-0000-446A-8000-702F00006273

The CMDLINE attribute is what we are concerned about. Taking uboot as
an example, 0x00002000@0x00002000(uboot) is the starting position of
the uboot partition, 0x00002000 is the size of the partition, and so
on.

Package-file

The package-file file is used to determine the required partition
image and image path when packaging the firmware, and it needs to be
consistent with the parameter.txt file.

Path: "output/firmware/package-file"

   # NAME  PATH
   package-file    package-file
   parameter       parameter.txt
   bootloader      MiniLoaderAll.bin
   uboot   uboot.img
   misc    misc.img
   recovery        recovery.img
   boot    boot.img
   backup  RESERVED
   oem     oem.img
   amp     amp.img
   rootfs  rootfs.img
   userdata        userdata.img