diff --git a/posts/2019-01-16-building-a-bsp.md b/posts/2019-01-16-building-a-bsp.md new file mode 100644 index 0000000..14f8052 --- /dev/null +++ b/posts/2019-01-16-building-a-bsp.md @@ -0,0 +1,148 @@ +--- +author: Sanchayan Maity +title: Building a Board Support Package using Yocto +tags: linux, yocto, openembedded +--- + +This post assumes a basic working knowledge of Yocto/OpenEmbedded. + +At my current workplace, for the project I am handling I am responsible for +everything be it application, kernel configuration, custom drivers or existing +driver enhancements or setting up the complete board support package for the +system I am working on. I had worked on OpenEmbedded/Yocto at my previous +company however, had no experience setting up a complete BSP. This meant having +a custom meta layer for this project along with the required layers for Yocto +to work and also the vendor specific layer which in this case was Xilinx, but, +could be any for that matter. Accordingly, one would include meta-samsung, +meta-ti or meta-intel and so on. + +One of the first decisions I had to make was regarding the flashing process. We +had an eMMC on-board and also a SD card. I could have my own script and using +u-boot's "mmc write" functions to format and write to the MMC. However, I decided +to go the easier [genimage](https://github.com/pengutronix/genimage) approach. +Yocto build system will build the relevant components and I could pack it in +a single image using a configuration like below. + +```bash +image boot.vfat { + vfat { + files = { + "BOOT.bin", + "emergency.ub", + "image.ub", + "system.dtb", + "Image" + } + } + size = 128M +} + +image ged.img { + hdimage { + } + + partition boot { + partition-type = 0xC + bootable = "true" + image = "boot.vfat" + } + + partition rootfs { + partition-type = 0x83 + image = "rootfs-zynqmp.ext4" + size = 0 + } +} +``` + +This gives a single file with an img extension which I can use to flash the SD +card or eMMC using the **dd** command. + +Now, to use Yocto requires the use of several meta layers to be put together. +One way is to use the repo tool which is also used in the Android world. However, +I felt like I wanted something more along with Docker integration. Wondering if +someone has already done this kind of work, I went searching on Google and came +across [yoe-distro](https://github.com/YoeDistro/yoe-distro). + +yoe-distro provided a perfect template on which to base my work on. I only need +integrate the layers I want and it could provide the rest. Docker integration +was also included. Now, in case you are wondering why Docker is required, Yocto/ +OpenEmbedded builds can be quite sensitive to host distribution setup. Also in +my case, Xilinx's support provided through Yocto would not build on Ubuntu 18.04 +which I am running at work. Downgrading would result in waste of time and is not +actually a solution. Even if worked on Ubuntu 18.04, future upgrades may result +in the build not working. + +Docker solves this problem by providing me a sandboxed environment, think of +chroot or BSD jails simplified and on steroids. So I ended up integrating the +vendor specific meta layers and added my own layer to provide customisations. +Getting started with Yocto definitely requires putting in some effort, but, +once you understand how to use it, adding customisations and stuff is lot easy +or atleast has been quite easy for what I am doing. + +For example, I definitely need to build the kernel from my own source tree, since +I have some patches of my own and if nothing else my own custom device trees +which enable support for custom Xilinx IP core drivers. One problem I had was +we internally use stash and trying to even just clone the source tree from stash +requires authentication. I was not sure how to do this in Yocto while without +exposing my ssh keys or account information. yoe-distro's setup helped here. + +The linux source is added as a submodule just like the meta layers and then a +custom recipe builds that. + +```bash +SRC_URI = "git://${TOPDIR}/sources/ged4k-linux-kernel;protocol=file;branch=ged4k_v2018.2" +SRCREV = "fbec50e15d7b04f44690eb115d2cddd4423e0326" + +SRC_URI_append += " file://defconfig \ + file://fragment.cfg \ + " + +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +``` + +You can see the protocol specified is not git, but file. Another simpler example +is u-boot, where I just needed to apply my own patch on top of Xilinx's u-boot +source and just the below in a recipe appending the original one. + +```bash +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +SRC_URI_append = "\ + file://0001-configs-xilinx_zynqmp-Config-SD-and-eMMC-boot-for-GE.patch \ +" +``` + +I had to include a rl78flash program which was not provided by any of the meta +layers in Yocto and even that was easy. I looked at how some other recipes +were written and came up with this and it just worked. + +```bash +SUMMARY = "RL78 Flash Tool" +DESCRIPTION = "Software to program RL78 microcontrollers via Serial Bootloader" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRCREV = "d0f5f05fbbce0a278658ca0caf67f293dcd26ee3" +SRC_URI = "git://github.com/msalau/rl78flash.git;protocol=https;branch=master \ + file://rl78flash.patch \ + " + +S = "${WORKDIR}/git" + +EXTRA_OEMAKE = "'CC=${CC}' 'CFLAGS=${CFLAGS}'" + +do_compile() { + oe_runmake +} + +do_install() { + install -d ${D}${bindir} + install -m 0755 ${WORKDIR}/git/rl78flash ${D}${bindir} +} +``` + +It has been a lot fun learning how to put together a board support package and +Yocto has given so much flexibility. + + +