Building novena firmware
Contents
Before you begin
The build environment should not be on an encrypted partition. These tend to have much lower path lengths, which can break the build in mysterious and hard-to-track-down ways.
You should not use have a symlink in the path of the build system. This can also break things.
Packages you may need
These are packages you may need over a base ubuntu 12.04 install:
git gawk make gcc g++ diffstat texi2html chrpath build-essential texinfo (for makeinfo) subversion gettext (for msgfmt) lzop device-tree-compiler u-boot-tools zip
Furthermore, you will want to change the symlink for /bin/sh to /bin/bash, instead of /bin/dash (which is the default in Ubuntu 12.04)
Setting up the environment
To set up the environment, first you must fetch the repos, then you must perform initial, one-time configuration. All of these steps only need to be run the first time you set up your build environment.
Fetching source code from scratch
Note that these steps are very similar to the generic Building Angstrom steps.
- git clone https://github.com/sutajiokousagi/setup-scripts-novena oe
- cd oe
Configure the build environment
First, perform initial setup. This creates an environment file you'll use every time you want to do development.
- Configure OE
- ./oebb.sh config novena
- ./oebb.sh update
Next, edit conf/local.conf. Particularly important variables you might want to change are:
- PARALLEL_MAKE – This tells "make" how many threads to spawn. A good rule of thumb is 1.5 times the number of cores present. Be sure to include "-j" before the number.
- BB_NUMBER_THREADS – This tells bitbake how many tasks to run at parallel. Set this equal to around the number of cores present.
Building an image
Set up your session by sourcing the OE environment file:
. ~/.oe/environment-angstromv2012.05
There are many images available. To list them all, run:
find sources/meta-* sources/openembedded-core -name '*image*.bb'
There is a Novena bringup image that contains many useful system tools for determining system performance, communicating with various peripherals, and generally bringing up the system. To build this image, run:
bitbake novena-bringup-image
Troubleshooting
- Bitbake failure when downloading the kernel
There is an issue with the long-running git fetch that bitbake does when it first pulls down the kernel source code. The error looks like:
ERROR: Fetcher failure: Fetch command ... Cloning into bare repository ...
To work around this, manually run the command listed and then retry the bitbake command.
Writing an image to a card
When an image is built, various files are added to the deploy/images/novena/ directory. The image name is embedded within the resulting compressed ROM file. For example, the image for novena-bringup-image is located at oe/build/tmp-angstrom_2010_x-eglibc/deploy/images/novena/rom-novena-hw-bringup.img.gz.
Making kernel changes
Clone the git repo for novena:
git clone https://github.com/xobs/novena-linux.git
Configure the kernel:
make novena_defconfig
Build the kernel:
make uImage LOADADDR=10008000 -j 4 # adjust -j to number of threads you want in parallel
Making kernel changes (deprecated)
If you modify the linux kernel source tree, you need to bump the PR inside the buildbot recipe in order for the changes to be absorbed into the build. This is done by incrementing MACHINE_KERNEL_PR in sources/meta-kosagi/conf/machine/include/imx61.inc
Getting the kernel
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git cd linux-next git checkout f59b51fe3d3092c08d7d554ecb40db24011b2ebc # taken from linux-novena_git.bb wget -O .config https://raw.github.com/sutajiokousagi/meta-kosagi/novena/recipes-kernel/linux/linux-novena/defconfig
git clone https://github.com/sutajiokousagi/meta-kosagi/tree/novena/recipes-kernel/linux/linux-novena
Building the kernel
Note to build the kernel, the command line must specify uimage and the LOADADDR:
make uImage LOADADDR=10008000 -j 4 # -j 4 is just to use more concurrent threads, adjust as needed
Once the kernel is built, you should copy it onto partition 1 of the disk image. Partition 1 is a FAT partition that can be mounted on almost any machine. There will be a file called uImage-novena.bin. You will want to copy arch/arm/boot/uImage over that file; u-boot will automatically load and configure that kernel using the .dtb file. Note that since device tree (dts => dtb) is used, if you make modifications to the device tree you'll also want to copy that onto partition 1.
To build the .dtb file, make sure you are in the linux-next directory and run this command:
scripts/dtc/dtc -O dtb -o novena.dtb -b 0 arch/arm/boot/dts/novena.dts
This assumes you have already copied or symlinked novena.dts into the dts directory (from the meta-kosagi repo)
Getting your changes to show up in OE
Just because you built a kernel and tested it doesn't mean the changes are automatically absorbed into OE.
the .config file and any device tree changes have to be checked into meta-kosagi. Then, you will need to bump the package revision inside imx61.inc:
increment MACHINE_KERNEL_PR in sources/meta-kosagi/conf/machine/include/imx61.inc
Source changes currently have to be overlaid on top of the existing kernel (ugly). This is because we haven't branched the kernel yet and the commit that is pulled in OE is fixed to something on the mainline.
So, for now, edit
sources/meta-kosagi/recipes-kernel/linux/linux-novena_git.bb
and modify these two areas:
SRC_URI (add the files you need to overlay)
and
do_install_append() (copy the lines starting with cp -f, changing the reference to your file and the final location you need it to end up for the overlay)
This needs to be fixed, but it's what works for now.
Getting and building u-boot
git clone git://github.com/sutajiokousagi/u-boot-imx6.git # make sure you have installed the local tooclhain and sourced the environment file (see below) cd u-boot-imx6 make novena_config # sets up u-boot for novena configuration make
To copy u-boot onto the disk, you need to use a linux machine with dd:
sudo dd if=u-boot.imx of=/dev/sdX seek=2
Replace /dev/sdX with the drive node of your SD card. seek=2 locates u-boot in the expected location for loading.
Local toolchain
A local toolchain is needed to build u-boot and the kernel, in the absence of an OE tree.
bitbake meta-toolchain # Extract build/tmp-*/deploy/sdk/toolchain to / # Edit /usr/local/oe*/environment* and add: # export ARCH=arm # export CROSS_COMPILE=arm-angstrom-linux-gnueabi-
Cloud Image
This section moved to Novena Cloud Image