Embedded systems
Now that the benefits of open source have been introduced to you, I believe we can go through a number of examples of embedded systems, hardware, software, and their components. For starters, embedded devices are available anywhere around us: take a look at your smartphone, car infotainment system, microwave oven, or even your MP3 player. Of course, not all of them qualify to be Linux operating systems, but they all have embedded components that make it possible for them to fulfill their designed functions.
General description
For Linux to be run on any device hardware, you will require some hardware-dependent components that are able to abstract the work for hardware-independent ones. The boot loader, kernel, and toolchain contain hardware-dependent components that make the performance of work easier for all the other components. For example, a BusyBox developer will only concentrate on developing the required functionalities for his application, and will not concentrate on hardware compatibility. All these hardware-dependent components offer support for a large variety of hardware architectures for both 32 and 64 bits. For example, the U-Boot implementation is the easiest to take as an example when it comes to source code inspection. From this, we can easily visualize how support for a new device can be added.
We will now try to do some of the little exercises presented previously, but before moving further, I must present the computer configuration on which I will continue to do the exercises, to make sure that that you face as few problems as possible. I am working on an Ubuntu 14.04 and have downloaded the 64-bit image available on the Ubuntu website at http://www.ubuntu.com/download/desktop
Information relevant to the Linux operation running on your computer can be gathered using this command:
uname –srmpio
The preceding command generates this output:
Linux 3.13.0-36-generic x86_64 x86_64 x86_64 GNU/Linux
The next command to gather the information relevant to the Linux operation is as follows:
cat /etc/lsb-release
The preceding command generates this output:
DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
Examples
Now, moving on to exercises, the first one requires you fetch the git
repository sources for the U-Boot package:
sudo apt-get install git-core git clone http://git.denx.de/u-boot.git
After the sources are available on your machine, you can try to take a look inside the board
directory; here, a number of development board manufacturers will be present. Let's take a look at board/atmel/sama5d3_xplained
, board/faraday/a320evb
, board/freescale/imx
, and board/freescale/b4860qds
. By observing each of these directories, a pattern can be visualized. Almost all of the boards contain a Kconfig
file, inspired mainly from kernel sources because they present the configuration dependencies in a clearer manner. A maintainers
file offers a list with the contributors to a particular board support. The base Makefile
file takes from the higher-level makefiles the necessary object files, which are obtained after a board-specific support is built. The difference is with board/freescale/imx
which only offers a list of configuration data that will be later used by the high-level makefiles.
At the kernel level, the hardware-dependent support is added inside the arch
file. Here, for each specific architecture besides Makefile
and Kconfig
, various numbers of subdirectories could also be added. These offer support for different aspects of a kernel, such as the boot, kernel, memory management, or specific applications.
By cloning the kernel sources, the preceding information can be easily visualized by using this code:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Some of the directories that can be visualized are arch
/arc
and arch
/metag
.
From the toolchain point of view, the hardware-dependent component is represented by the GNU C Library, which is, in turn, usually represented by glibc
. This provides the system call interface that connects to the kernel architecture-dependent code and further provides the communication mechanism between these two entities to user applications. System calls are presented inside the sysdeps
directory of the glibc
sources if the glibc
sources are cloned, as follows:
git clone http://sourceware.org/git/glibc.git
The preceding information can be verified using two methods: the first one involves opening the sysdeps/arm
directory, for example, or by reading the ChangeLog.old-ports-arm
library. Although it's old and has nonexistent links, such as ports directory, which disappeared from the newer versions of the repository, the latter can still be used as a reference point.
These packages are also very easily accessible using the Yocto Project's poky
repository. As mentioned at https://www.yoctoproject.org/about:
"The Yocto Project is an open source collaboration project that provides templates, tools and methods to help you create custom Linux-based systems for embedded products regardless of the hardware architecture. It was founded in 2010 as a collaboration among many hardware manufacturers, open-source operating systems vendors, and electronics companies to bring some order to the chaos of embedded Linux development."
Most of the interaction anyone has with the Yocto Project is done through the Poky build system, which is one of its core components that offers the features and functionalities needed to generate fully customizable Linux software stacks. The first step needed to ensure interaction with the repository sources would be to clone them:
git clone -b dizzy http://git.yoctoproject.org/git/poky
After the sources are present on your computer, a set of recipes and configuration files need to be inspected. The first location that can be inspected is the U-Boot recipe, available at meta/recipes-bsp/u-boot/u-boot_2013.07.bb
. It contains the instructions necessary to build the U-Boot package for the corresponding selected machine. The next place to inspect is in the recipes available in the kernel. Here, the work is sparse and more package versions are available. It also provides some bbappends
for available recipes, such as meta/recipes-kernel/linux/linux-yocto_3.14.bb
and meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.10.bbappend
. This constitutes a good example for one of the kernel package versions available when starting a new build using BitBake.
Toolchain construction is a big and important step for host generated packages. To do this, a set of packages are necessary, such as gcc
, binutils
, glibc
library
, and kernel headers
, which play an important role. The recipes corresponding to this package are available inside the meta/recipes-devtools/gcc/
, meta/recipes-devtools/binutils
, and meta/recipes-core/glibc
paths. In all the available locations, a multitude of recipes can be found, each one with a specific purpose. This information will be detailed in the next chapter.
The configurations and options for the selection of one package version in favor of another is mainly added inside the machine configuration. One such example is the Freescale MPC8315E-rdb
low-power model supported by Yocto 1.6, and its machine configuration is available inside the meta-yocto-bsp/conf/machine/mpc8315e-rdb.conf
file.
Note
More information on this development board can be found at http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MPC8315E.