Yocto for MitySOM-AM57X


Reference: TI Building SDK
Reference crops/poky

The crops/poky:ubuntu-18.04 image is setup with all the packages to build Yocto images and we can also use it to build U-boot and the Kernel.


  • Download a prebuilt toolchain from ARM and extract it to /home/tools (You can put it wherever you like, you'll just need to update the instructions accordingly)
    $ mkdir -p /home/tools/mitysom-57x/
    $ wget -O - | tar -Jxv -C /home/tools/mitysom-57x/
  • Pull crops/poky image and echo test
    docker pull crops/poky:ubuntu-18.04
    docker run --rm crops/poky:ubuntu-18.04 echo Test


If we mount our local directory into the docker container we can enter the docker container and run our builds.
  • cd to your work directory
  • Launch poky image
     $ docker run --rm -it -v $PWD:/work -v /home/tools:/home/tools --tmpfs /opt/poky --env "TOOLCHAIN_PATH_ARMV7=/home/tools/mitysom-57x/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf" crops/poky:ubuntu-18.04 --workdir=/work
    pokyuser@e34e187356b3:/workdir$ id
    uid=9338(pokyuser) gid=502(pokyuser) groups=502(pokyuser)

    docker run Run a command in a new container
    --rm Automatically remove the container when it exits
    -it Allows interracting with container over STDIN
    -v $PWD:/work Mounts current directory to /workdir inside container
    -v /home/tools:/home/tools Mount tools directory so we can access downloaded toolchain
    --tmpfs /opt/poky Work around: Overrides the /opt/poky directory that crops/poky installs on their image. This updated the toolchain and python version, which is not compatible with the thud yocto build. So by mounting a empty tmpfs over it, we can go back to using the original packages from ubuntu 18.04
    --env "TOOLCHAIN_PATH_ARMV7=/home/tools/mitysom-57x/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf" Set environment variable needed for processor-sdk Yocto build
    crops/poky:ubuntu-18.04 Selects docker image to run
    --workdir=/work Tells crops script to create a user pokyuser with a matching user id and group id of the owner of /work

Alternatively, we can run a command directly (echo Test) and the docker container will exit when the command finishes.

 $ docker run --rm -it -v $PWD:/work -v /home/tools:/home/tools --tmpfs /opt/poky --env "TOOLCHAIN_PATH_ARMV7=/home/tools/mitysom-57x/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf" crops/poky:ubuntu-18.04 --workdir=/work echo Test

All of this can be wrapped into a bash script so we don't forget. See sources/meta-mitysom/build/

Using your Docker image for Yocto Development

There are many ways to use your Docker image for development depending on your needs. Once you have completed the Docker setup previously described, you can use the Yocto project to build your own kernel, U-Boot, and filesystem.

Critical Link uses TI's Yocto infrastructure to generate the MitySOM-AM57x binaries listed under the Files tab.

These instructions will show you how to create a Yocto build structure interactively. Once you are comfortable with the setup, you can script it using a build server (e.g. Jenkins) for repeatable builds.

First, create a development directory and start your docker image and run a shell:

 $ mkdir devel
 $ cd devel
 $ docker run --rm -it -v $PWD:/work -v /home/tools:/home/tools --tmpfs /opt/poky --env "TOOLCHAIN_PATH_ARMV7=/home/tools/mitysom-57x/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf" crops/poky:ubuntu-18.04 --workdir=/work

This will give you a shell prompt inside the docker image. Go to the /work directory (actually the devel directory outside of the docker image) and run the following commands:

Starting with UID : 9337
user@8ec23474095b:~$ cd /work
user@8ec23474095b:~$ git clone  --single-branch --branch criticallink
user@8ec23474095b:~$ cd oe-layersetup
user@8ec23474095b:~$ ./ -f configs/processor-sdk/processor-sdk-

This will download many Yocto repositories, including Critical Link's meta-mitysom.

Now, enter the build directory and configure your local.conf. These additions to the local.conf are optional but recommended. The rm_work option helps reduce disk usage and the archiver options are used to save the source code used for your builds. Finally the source command sets up your build environment.

user@8ec23474095b:~$ cd build
user@8ec23474095b:~$ source conf/setenv
user@8ec23474095b:~$ echo 'INHERIT           += "rm_work" '    >> conf/local.conf
user@8ec23474095b:~$ echo 'INHERIT           += "archiver"'    >> conf/local.conf
user@8ec23474095b:~$ echo 'ARCHIVER_MODE[src] = "original"'     >> conf/local.conf

Note: For companies which have strict firewalls, you can add the following to attempt to download git repos over http/https instead of the git protocol

user@8ec23474095b:~$ echo 'PREMIRRORS_append = " \
     git://.*/.* git://HOST/PATH;protocol=https \
     git://.*/.* git://HOST/PATH;protocol=http"'     >> conf/local.conf

At this point, your Yocto build environment is configured and you can bring your build. As a starting point, you could build a filesystem, kernel, and U-Boot compatible with our MitySOM-AM57x Dev Board by running:

user@8ec23474095b:~$ MACHINE=mitysom-am57x bitbake arago-base-tisdk-image

Note: The arago-base-tisdk-image is a pretty minimal filesystem. It does not include wayland or the PVR gpu drivers. The tisdk-rootfs-image does.

You can also build a full image using:
Note: This is a very large build, on a 8-core build machine with nvme build disks it can take >7 hours and >100GB of diskspace

user@8ec23474095b:~$  MACHINE=mitysom-am57x bitbake tisdk-rootfs-image

Or a custom image using (See more about setting up a custom meta layer below):

user@8ec23474095b:~$ MACHINE=mitysom-am57x bitbake custom-image

A Note about Yocto Errors

A full Yocto build will stress your CPU, RAM, and disk space. This can sometimes cause errors that are difficult to troubleshoot.

If you get an error in a recipe that you did not modify, and you are certain there is not a RAM or disk space problem, you can usually clear the offending error by building the package independently.

user@8ec23474095b:~$ MACHINE=mitysom-am57x bitbake arago-base-tisdk-image
... <Various status and output from each recipe> ...
NOTE: recipe vlib-c66x-3_2_1_0-r0: task do_populate_lic: Started
WARNING: vlib-c66x-3_2_1_0-r0 do_populate_lic: Could not copy license file /work/build/arago-tmp-external-arm-toolchain/work/armv7at2hf-neon-linux-gnueabi/vlib-c66x/3_2_1_0-r0/vlib_c66x_3_2_1_0/docs/VLIB_Software_Manifest.html to /work/build/arago-tmp-external-arm-toolchain/work/armv7at2hf-neon-linux-gnueabi/vlib-c66x/3_2_1_0-r0/license-destdir/vlib-c66x/VLIB_Software_Manifest.html: [Errno 2] No such file or directory: '/work/build/arago-tmp-external-arm-toolchain/work/armv7at2hf-neon-linux-gnueabi/vlib-c66x/3_2_1_0-r0/vlib_c66x_3_2_1_0/docs/VLIB_Software_Manifest.html'
ERROR: vlib-c66x-3_2_1_0-r0 do_populate_lic: QA Issue: vlib-c66x: LIC_FILES_CHKSUM points to an invalid file: /work/build/arago-tmp-external-arm-toolchain/work/armv7at2hf-neon-linux-gnueabi/vlib-c66x/3_2_1_0-r0/vlib_c66x_3_2_1_0/docs/VLIB_Software_Manifest.html [license-checksum]
ERROR: vlib-c66x-3_2_1_0-r0 do_populate_lic: Fatal QA errors found, failing task.
ERROR: vlib-c66x-3_2_1_0-r0 do_populate_lic: Function failed: populate_lic_qa_checksum
ERROR: Logfile of failure stored in: /work/build/arago-tmp-external-arm-toolchain/work/armv7at2hf-neon-linux-gnueabi/vlib-c66x/3_2_1_0-r0/temp/log.do_populate_lic.32041
NOTE: recipe vlib-c66x-3_2_1_0-r0: task do_populate_lic: Failed
ERROR: Task (/work/sources/meta-ti/recipes-ti/vlib/ failed with exit code '1'

In this case, the build was stopped due to an error in the vlib-c66x-3_2_1_0-r0. The error is complaining that it can't find "VLIB_Software_Manifest.html." Instead of just restarting the build, you can run the following commands to reset the vlib-c66x recipe and build it independently:
user@8ec23474095b:~$ MACHINE=mitysom-am57x bitbake -c clean vlib-c66x
user@8ec23474095b:~$ MACHINE=mitysom-am57x bitbake vlib-c66x

If that succeeds, the result will be cached and you can re-run your previous bitbake command (e.g. MACHINE=mitysom-am57x bitbake arago-base-tisdk-image).

Yocto Linux Kernel Build

You can change the configuration of the kernel by running:

user@8ec23474095b:~$ MACHINE=mitysom-am57x bitbake -c menuconfig virtual/kernel

Then, to build the kernel:

user@8ec23474095b:~$ MACHINE=mitysom-am57x bitbake virtual/kernel

Note: The crops/poky image does not have the required libncurses-dev to run the kernels menuconfig.

You can create your own Dockerfile, using the crops image as a base, and add the missing packages you want
  • mkdir custom-crops && cd custom-crops
  • vim Dockerfile
    FROM crops/poky:ubuntu-18.04
    USER root
    RUN apt-get install libncurses5-dev -y
    USER usersetup
  • docker build . --tag custom_crops
  • Then replace "crops/poky:ubuntu-18.04" in the docker command with "custom_crops"
    docker run --rm -it -v $PWD:/work -v /home/tools:/home/tools --tmpfs /opt/poky --env "TOOLCHAIN_PATH_ARMV7=/home/tools/mitysom-57x/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf" custom_crops --workdir=/work
    pokyuser@a6dbf190ee68:/work/build$ MACHINE=mitysom-am57x bitbake virtual/kernel -c menuconfig
    Loading cache: 100% |##############################################################################| Time: 0:00:01
    Loaded 4677 entries from dependency cache.

Yocto U-Boot Build

user@8ec23474095b:~$ MACHINE=mitysom-am57x bitbake virtual/bootloader

Custom Yocto layer

A custom meta layer is provided as a starting point and found here:;a=summary

├── conf
│   └── layer.conf
├── recipes
│   └── images
│       └──
├── recipes-am57
│   └── mitysom-am57f-fpga
│       ├── mitysom-am57f-fpga
│       │   └── fpga_7a15t.bin
│       └── mitysom-am57f-fpga.bbappend
├── recipes-bsp
│   ├── custom-application
│   │   ├── custom-application
│   │   │   └── mitysom-am57x
│   │   │       ├── custom_application.c
│   │   │       └── custom_application.service
│   │   └──
│   └── u-boot
│       ├── u-boot-cl-ti
│       │   └── mitysom-am57x
│       │       ├── custom.patch
│       │       └── uEnv.txt
│       └── u-boot-cl-ti_%.bbappend
└── recipes-kernel
    └── linux
        ├── linux-cl-ti
        │   └── mitysom-am57x
        │       ├── am57xx-mitysom-custom.cfg
        │       └── am57xx-mitysom-custom.dts
        └── linux-cl-ti_%.bbappend

The word "custom" can be replaced within all of the files and filenames to be replaced with the project name / custom-layer name.

This file is the image recipe for the build. In this file, packages can be added to IMAGE_INSTALL argument to install the packages required for your build.


This recipe is used for compiling and installing a custom application on the file system. This application will start upon boot up.


These files append the u-boot recipes to modify the u-boot compilation. You can add a custom.patch file and add custom uEnv commands to fit your needs. The provided uEnv.txt makes sure that the custom device tree is selected to boot with. Make sure to change the name to the custom device tree of your project.


These files append the kernel recipes to modify the kernel compilation. You can add a custom device tree and change the kernel CONFIG options to fit your needs.


This recipe appends the meta-mitysom fpga installation of Critical Link's default fpga binaries. Updating the fpga binary in this directory with a custom fpga binary named accordingly (E.g. fpga_7a15t.bin) will replace the default binary installed and will be used upon boot up.

Building the custom layer

The custom layer comes with a build script capable of building the yocto filesystem and creating an SD card image. The build script uses docker (crops/poky:ubuntu-18.04). The build can be started with one simple command. This command assumes you are in the meta-custom directory.

docker run --rm -it -v $PWD:/work --tmpfs /opt/poky crops/poky:ubuntu-18.04 --workdir=/work /work/

Once completed, the SD card image will be in the deploy directory. It can be written to an SD card using bmaptool or dd, however the easiest option is to use balenaEtcher. It will even unzip and verify the md5sum for you.

Go to top
Add picture from clipboard (Maximum size: 1 GB)