Yocto tests
From ElphelWiki
Contents
- 1 About
- 2 Required packages
- 3 Output targets
- 4 Setup
- 5 Build bootloader
- 6 Build kernel
- 7 Build ramdisk.image.gz
- 8 Build everything all together
- 9 Build toolchain (not necessary - needed only for building ezynq targets outside poky)
- 10 Apply a patch from a recipe
- 11 Create *.bbappend for an existing package in meta-*
- 12 Switch to dora branch
- 13 Branching in git
- 14 Disappeared errors
- 15 RTC config example in DTS
- 16 Program bitstream from Linux
- 17 Create and set up an own external mirror in Yocto/OpenEmbedded
About
- All of the described things happen in Kubuntu 13.04
- Building Linux images for Zynq platform - ARMv7
Required packages
- Essentials. Packages needed to build an image on a headless system:
sudo apt-get install gawk wget git-core diffstat unzip texinfo build-essential chrpath
- Graphical Extras. Packages recommended if the host system has graphics support:
sudo apt-get install libsdl1.2-dev xterm
- Documentation. Packages needed if you are going to build out the Yocto Project documentation manuals:
sudo apt-get install make xsltproc docbook-utils fop dblatex xmlto
- ADT Installer Extras. Packages needed if you are going to be using the Application Development Toolkit (ADT) Installer:
sudo apt-get install autoconf automake libtool libglib2.0-dev
Output targets
Output folder: poky/build/tmp/deploy/images
These names are as they appear in the u-boot configuration header file - actual output files have different names:
- boot.bin+(u-boot.img) - u-boot as the first stage bootloader = Secondary Program Loader tha boots u-boot.img
- devicetree.dtb - device tree with described interfaces, zynq registers, interrupts and drivers
- uImage - kernel, drivers
- uramdisk.image.gz - applications
Copy them on the micro SD card > run boot once in the u-boot command line.
Setup
- Step 1: Copy into some_script.sh, modify and run:
#Part 1 git clone -b dora git://git.yoctoproject.org/poky.git poky cd poky; git checkout f1276b066223e7f501f7f711680215ff8edee252 git clone -b dora https://github.com/openembedded/meta-oe.git meta-oe cd meta-oe; git checkout 40e0f371f3eb1628655c484feac0cebf810737b4; cd .. git clone -b dora https://github.com/Xilinx/meta-xilinx.git meta-xilinx cd meta-xilinx; git checkout aa7d677515ab7d45bbd3bdd6c5383f4143147c6d; cd .. git clone -b master git://git.code.sf.net/p/elphel/meta-ezynq meta-ezynq cd meta-ezynq; git checkout 33d8ebb91d6c2882ad79f7794641d7eb7e2effbe; cd .. git clone -b master git://git.code.sf.net/p/elphel/meta-elphel393 meta-elphel393 cd meta-elphel393; git checkout 32a711b4e61a371f1bbccd0d26fd1b14a74387bc; cd .. #Part 2 : init environment and auto-fill Yocto's conf-files CURRENT_PATH=$(dirname $(readlink -f "$0")) . ./oe-init-build-env BBLAYERS_CONF="conf/bblayers.conf" echo "BBLAYERS = \" \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/meta \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/meta-yocto \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/meta-yocto-bsp \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/$META_ELPHEL393_dir \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/$META_EZYNQ_dir \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/$META_OE_dir/meta-oe \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/$META_OE_dir/meta-webserver \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/$META_OE_dir/meta-networking \\" >> $BBLAYERS_CONF echo " $CURRENT_PATH/$META_XILINX_dir \\" >> $BBLAYERS_CONF echo " \"" >> $BBLAYERS_CONF LOCAL_CONF="conf/local.conf" # number of parallel tasks (including compiles) echo "BB_NUMBER_THREADS ?= \"8\"" >> $LOCAL_CONF # number of parallel compiles echo "PARALLEL_MAKE ?= \"-j 8\"" >> $LOCAL_CONF # change the MACHINE echo "MACHINE ?= \"elphel393\"" >> $LOCAL_CONF # Elphel's MIRROR website echo "MIRRORS =+ \"http://.*/.* http://mirror.elphel.com/elphel393_mirror/ \n \"" >> $LOCAL_CONF
- Step 2: re-init environment
cd poky . ./oe-init-build-env
- Step 3: build bootable image (3 targets)
bitbake u-boot-ezynq linux-xlnx core-image-elphel393
Notes
- Currently having 4 MACHINES: elphel393, microzed, zc706 and zedboard
Build bootloader
bitbake u-boot-ezynq or bitbake u-boot or bitbake virtual/bootloader
Output
- poky/build/tmp/deploy/images/boot.bin
- poky/build/tmp/deploy/images/u-boot.img
Notes
- Is there a way to build it by running bitbake core-image-elphel393
Build kernel
bitbake linux-xlnx or bitbake virtual/kernel
Output
- poky/build/tmp/deploy/images/uImage (kernel)
- poky/build/tmp/deploy/images/devicetree.dtb (or some *.dtb)
Notes
- Sources are cloned to:
poky/build/tmp/work/MACHINE-poky-linux-gnueabi/linux-xlnx/.../linux
- If you change files like debug drivers for example, when done editing run:
bitbake linux-xlnx -c compile bitbake linux-xlnx -c deploy
- When linux-xlnx is 'clean' it is built with the ramdisk.image.gz by bitbake core-image-elphel393, however the boot.bin does not, why?
Build ramdisk.image.gz
bitbake core-image-elphel393
Output
- poky/build/tmp/deploy/images/uramdisk.image.gz (the file has *.u-boot extension after it's built)
Notes
- Current packages:
elphel393.bb: IMAGE_INSTALL = "packagegroup-core-boot python-core ${ROOTFS_PKGMANAGE_BOOTSTRAP} ${CORE_IMAGE_EXTRA_INSTALL}"
- Also works:
elphel393.bb: IMAGE_INSTALL = "packagegroup-core-boot ${ROOTFS_PKGMANAGE_BOOTSTRAP} ${CORE_IMAGE_EXTRA_INSTALL}" IMAGE_INSTALL_append = "python-core"
- Why python-core and not python?
- poky/meta/recipes-devtools/python/python-2.7-manifest.inc has a list in PACKAGES, items from which should go into IMAGE_INSTALL
- Among all there's no python in the PACKAGES list.
- Does hob install all the PACKAGES if python is checked? Haven't tried, also the used hob version doesn't support saving recipes.
- Steps for adding packages:
- elphel393.bb (some discussions mention the leading space is mandatory but somehow it works even without it):
IMAGE_INSTALL_append = "<mandatory space?>python-core \ i2c-tools \ mtd-utils \ net-tools \ openssh \ modphp \ apache2 \ php-cli"
- Why php-cli and not just php?
meta-oe/meta-oe/recipes-devtools/php/php.inc: PACKAGES = "${PN}-dbg ${PN}-cli ${PN}-cgi ${PN}-fpm ${PN}-fpm-apache2 ${PN}-pear ${PN}-dev ${PN}-staticdev ${PN}-doc ${PN}"
- PACKAGES list includes php. What is installed? (No php-cli: missing /usr/bin/php) Didn't investigate.
- What does hob build if php is checked? Didn't test.
- Using php-cli increases the unpacked image size from ~16MB to ~50MB.
- The default UNPACKED ramdisk max size for zynq is 16MB - once it gets bigger you get KERNEL PANIC - the solution is modifying the device tree - then recompile into DTB:
*.dts, add to bootargs parameter ramdisk_size=32768 (takes KB), example: bootargs = "console=ttyPS0,115200 root=/dev/ram rw ip=192.168.1.10 earlyprintk ramdisk_size=65536";
- The default COMPRESSED ramdisk max size for zynq is 10MB set in u-boot - change according to your needs, example:
zynq_zed.h: "sdboot=echo Copying Linux from SD to RAM... && " \ "mmcinfo && " \ "fatload mmc 0 0x3000000 ${kernel_image} && " \ "fatload mmc 0 0x2A00000 ${devicetree_image} && " \ "fatload mmc 0 0x2000000 ${ramdisk_image} && " \ "bootm 0x3000000 0x2000000 0x2A00000\0" \ So, the max sizes: compressed ramdisk = 0x2A00000 - 0x2000000 = 0xA00000 = 10MB devicetree = 0x3000000 - 0x2A00000 = 0x600000 = 6MB
Build everything all together
bitbake u-boot-ezynq linux-xlnx core-image-elphel393
Build toolchain (not necessary - needed only for building ezynq targets outside poky)
- Step 1: build
bitbake meta-toolchain
- Step 2: install - launch installer from <some-path>/poky/build/tmp/deploy/
Apply a patch from a recipe
- Example file tree (meta-elphel393):
meta-elphel393/ recipes-kernel/ linux/ linux-xlnx_3.8.bb linux-xlnx.inc linux-xlnx/ elphel393_defconfig_3.8.cfg elphel393.dts xilinx_nandps.patch
- Goal: apply a patch to linux-xlnx files
- Step 1:
bitbake linux-xlnx
- Step 2: Go to where the linux-xlnx got cloned - find and edit the target file:
poky/build/tmp/work/elphel393-poky-linux-gnueabi/linux-xlnx/.../linux/
- Step 3: In the mentioned above directory run:
git diff > somefile.patch
- Step 4: Copy the patch file into recipes/kernel/linux/linux-xlnx/.
- Step 5: Edit the recipe, here it's linux-xlnx.inc, add a line like the following:
Apply the patch when building for any MACHINE:
SRC_URI_append += "file://xilinx_nandps.patch"
or only a certain MACHINE="elphel393"
SRC_URI_append_elphel393 += "file://xilinx_nandps.patch"
- Step 6(?):
bitbake linux-xlnx -c clean -f bitbake linux-xlnx
Create *.bbappend for an existing package in meta-*
- Define FILESEXTRAPATHS_prepend := "${THISDIR}/files:" for files that come with the bbappend - so the fetcher could find them
- Try to add "_append" & "_prepend" to functions
- If some do_function is incompatible just rewrite it
Switch to dora branch
cd poky; git checkout dora cd meta-oe; git checkout dora cd meta-elphel393; git checkout master
Branching in git
- switch to a branch:
git checkout <name>
- create a new local branch
git checkout -b <new-branch> <existing-branch>
- delete a local branch
git branch -D <name>
- create a new remote branch (from existing local)
git push origin <name>
- delete a remote branch
git push origin :<name>
Disappeared errors
- (Is there a better solution for kubuntu 13.04? in kubuntu 12.10 there is no such error - or is it just newer version?) To fix the ERROR="Could not inherit file classes/vala.bbclass" in bitbake copy vala.bbclass from oe-core? or delete the conflicting recipes (2?)?
- (Is there a better solution for kubuntu 13.04? in kubuntu 12.10 there is no such error - or is it just newer version?) To fix the ERROR="Failed to parse krb5_1.11.3.bb" in bitbake delete the directory meta-oe/meta-oe/recipes-connectivity/krb5
RTC config example in DTS
http://www.denx.de/wiki/DULG/Appendix
Program bitstream from Linux
- PL status (1=programmed, 0=not):
cat /sys/devices/amba.0/f8007000.ps7-dev-cfg/prog_done
- Program (the driver understands both *.bit and *.bit.bin)
cat test.bit > /dev/xdevcfg
Create and set up an own external mirror in Yocto/OpenEmbedded
- To the build/conf/local.conf add:
SOURCE_MIRROR_URL = "file:///data/sources/" INHERIT += "own-mirrors" BB_GENERATE_MIRROR_TARBALLS = "1"
- Rebuild the target
It didn't store anything in /data/sources/, but in the build/downloads/ instead - tar.gz + tar.gz's made from cloned git repositories.
- Upload the archives to your mirror website
- To the build/conf/local.conf add:
MIRRORS =+ "http://.*/.* http://mirror.elphel.com/elphel393_mirror/ \n "
- If no need - comment out the files in the build/conf/local.conf:
#SOURCE_MIRROR_URL = "file:///data/sources/" #INHERIT += "own-mirrors" #BB_GENERATE_MIRROR_TARBALLS = "1"