Creating a RFS with Buildroot

From DAVE Developer's Wiki
Jump to: navigation, search
Info Box
Tux.png Applies to Linux
Naon am387x-dm814x.png Applies to Naon
Maya 03.png Applies to Maya
Dido-main.png Applies to Dido
Diva-am335x-overview.png Applies to Diva

Introduction[edit | edit source]

Buildroot is a set of scripts and patches for the creation of a cross-compilation toolchain as well as the creation of a complete root file system. Buildroot provides:

  • support for prebuilt or external toolchains
  • configuration through menuconfig, gconfig and xconfig interfaces
  • lots of available libraries, tools, packages and utilities
  • support for all the major filesystems (JFFS2, UBIFS, CRAMFS, ...)
  • uClibc, glibc, eglibc generation, or use of the libc from the external toolchain
  • easy customization through Makefiles

References[edit | edit source]

Starting up[edit | edit source]

Requirements[edit | edit source]

Buildroot needs some software to be already installed on the GNU/Linux host system. Please check:

Please make sure that at least the mandatory packages are installed before launching a build.

Getting Buildroot[edit | edit source]

Buildroot releases can be downloaded from http://buildroot.net/downloads/

Daily Snapshots of the latest Buildroot source tree can be downloaded from http://buildroot.uclibc.org/downloads/snapshots/

The source tree can be browsed online: http://git.buildroot.net/buildroot/ and a copy of the repository can be grabbed with the following commands:

The following is the project directory tree:

.
├── arch
├── board
├── boot
├── CHANGES
├── Config.in
├── Config.in.legacy
├── configs
├── COPYING
├── docs
├── fs
├── linux
├── Makefile
├── Makefile.legacy
├── package
├── support
├── system
└── toolchain

Configuring Buildroot[edit | edit source]

For modifying the Buildroot configuration, enter the project directory and enter the following command:

make menuconfig

You can optionally use the O= parameter to set a specific build folder:

make O=<path_to_build_directory> menuconfig

Once everything is configured, the configuration tool generates a .config file that contains the description of the configuration. It will be used by the Makefiles to do what’s needed.

Setting up the target architecture[edit | edit source]

From the menuconfig interface, you need to select:

  • Target Architecture -> Select "ARM (little endian)"
  • Target Architecture Variant -> Select "cortex-A8"
  • Target ABI -> Select "EABI"

Buildroot-arch.jpg

Configure the build options[edit | edit source]

From the Build options menù you can define some custom directories for compilation output and file download. It is also recommended to enable the compiler cache and optionally set a custom directory.

Buildroot-options.jpg

Setting up the external toolchain[edit | edit source]

You need to set the path and prefix for the external toolchain:

  • Toolchain -> Toolchain type -> Select "External Toolchain"
  • Toolchain -> Toolchain -> Select "Custom Toolchain"
  • Toolchain -> Toolchain origin-> Select "Pre-installed toolchain"
  • Toolchain -> Toolchain path (eg. /home/shared/devel/dave/naon-DAA/sw/linux/sdk/arm-2009q1)
  • Toolchain -> Toolchain prefix (eg. $(ARCH)-none-linux-gnueabi)
  • Toolchain -> External toolchain C library -> Select glibc/eglibc
  • Toolchain -> Activate RPC support
  • Toolchain -> Activate C++ support

Buildroot-toolchain.jpg

System configuration[edit | edit source]

Entering the "System configuration" option you should set:

  • System hostname (NEW)
  • System banner (NEW)
  • Port to run a getty (login prompt) on -> Enter ttyO0
  • () Custom script to run before creating filesystem images -> If required, you can run custom scripts to do board-specific cleanups, add-ons and the like, so the generated files can be used directly without further processing.

Buildroot-system.jpg


Package selection[edit | edit source]

The list of available packages can be accessed entering the Package selection for the target option

It's important that busybox provides the depmod command, which is not enabled by default. To enable it, you need to modify the buildroot/package/busybox/busybox-1.20.x.config file adding

CONFIG_DEPMOD=y
CONFIG_DEFAULT_DEPMOD_FILE="modules.dep"

Building the root file system[edit | edit source]

Once the configuration step is completed, launch

make O=<path_to_build_directory>

to start the build process (the "O=" parameter is optional), which will perform the following tasks:

  • download source files (as required);
  • configure, build and install the cross-compiling toolchain using the appropriate toolchain backend, or simply import an external toolchain;
  • build/install selected target packages;
  • build a kernel image, if selected;
  • build a bootloader image, if selected;
  • create a root filesystem in selected formats.

Buildroot output is stored in a single directory, output, and you'll find all the built images (kernel image, bootloader and root filesystem images) stored into the images subdirectory. In particular, the root file system is saved as a rootfs.tar file. This file can be decompressed to a NFS share and used to boot the target from the network for testing and further customization steps.

For more information, please refer to Using Buildroot Section on the User Manual.

Adding platform specific components not provided with Buildroot[edit | edit source]

The targets usually provides specific features that relies on software components which can't be provided by the standard Buildroot project. Adding these components to the Buildroot root file system usually requires further operations, which depends on the particular target. The following sections provide instructions on how to perform these operations on DAVE Embedded Systems SOMs.

Adding Naon/Maya specific components[edit | edit source]

The following procedure allows adding the NELK components to the Buildroot root file system:

  • modify the EZSDK_INSTALL_DIR/Rules.make file, making the EXEC_DIR variable point to the Buildroot root file system directory
  • enter the EZSDK_INSTALL_DIR and launch the make all command to build the components
  • from the EZSDK_INSTALL_DIR, launch the make install command

Unfortunately, the last command doesn't install all the components, so further operations are required. Assuming that:

  • EXEC_DIR (Rules.make) points to the directory containg the buildroot RFS;
  • $(EXEC_DIR).ori is the name of the original root file system provided with the NELK distribution;
  • the busybox built with Buildroot and installed on the root file system supports the depmod command

you can easily add the following two targets to the EZSDK_INSTALL_DIR/Makefile:

load-firmware-buildroot-rfs_install:
    cp $(EXEC_DIR).ori/etc/init.d/load-hd-firmware.sh $(EXEC_DIR)/usr/share/ti/ti-media-controller-utils/buildroot_rfs_firmware.sh
    ln -s /usr/share/ti/ti-media-controller-utils/buildroot_rfs_firmware.sh $(EXEC_DIR)/etc/init.d/S70firm
    cp $(EXEC_DIR).ori/usr/share/ti/ti-media-controller-utils/mm_dm81xxbm.bin $(EXEC_DIR)/usr/share/ti/ti-media-controller-utils

load-firmware-buildroot-rfs_clean:
    rm -rf $(EXEC_DIR)/usr/share/ti/ti-media-controller-utils/buildroot_rfs_firmware.sh
    rm -rf $(EXEC_DIR)/etc/init.d/S70firm
    rm -rf $(EXEC_DIR)/usr/share/ti/ti-media-controller-utils/mm_dm81xxbm.bin

The first target completes the installation. The following is a brief description of the commands:

  • The first command copies the original load-hd-firmware.sh script renaming it "buildroot_rfs_firmware.sh".
  • The second command creates a symbolic link to the "buildroot_rfs_firmware.sh" file, so that init can launch that script at startup
  • The third command copies the mm_dm81xxbm.bin (external memory mapping) binary file, required by the "buildroot_rfs_firmware.sh" file

The second target restores the previous situation.