path: root/meta-yocto-bsp
diff options
authorStefan Stanacar <>2014-04-30 12:38:58 (GMT)
committerRichard Purdie <>2014-04-30 20:52:43 (GMT)
commitceb5c4d8c1ebbe96c8ad9e97514792ce3d9d2f50 (patch)
tree74ca4ea8204adc634ff557c75306395f3b6c004d /meta-yocto-bsp
parent3a4bb1aa604189618cc16c702efb9647fbe86108 (diff)
meta-yocto-bsp: oeqa/controllers: add BeagleBoneTarget
With a serial connection and beaglebone setup correctly as per README.hardware (nand erased, default uboot config assumed, etc) and a correctly deployed core-image-testmaster, we could actually deploy and test AB built images. In the default configuration u-boot will do the right thing and will always boot into the master image (rootfs on second fs on the card, kernel in /boot on the same partition). We just need to tell it for the test image to use the third partition and update the kernel cmdline. Pexpect is used to interact with whatever serial connection we have (which for this target is mandatory). There is some handling for images that don't contain the kernel and dtb files as needed (such as core-image-minimal). Implements [YOCTO #6252]. (From meta-yocto rev: 8235464faf480811b17b062cb9aad8ebf1cd2a67) Signed-off-by: Stefan Stanacar <> Signed-off-by: Paul Eggleton <> Signed-off-by: Richard Purdie <>
Diffstat (limited to 'meta-yocto-bsp')
2 files changed, 94 insertions, 0 deletions
diff --git a/meta-yocto-bsp/lib/oeqa/controllers/ b/meta-yocto-bsp/lib/oeqa/controllers/
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/meta-yocto-bsp/lib/oeqa/controllers/
diff --git a/meta-yocto-bsp/lib/oeqa/controllers/ b/meta-yocto-bsp/lib/oeqa/controllers/
new file mode 100644
index 0000000..53f454b
--- /dev/null
+++ b/meta-yocto-bsp/lib/oeqa/controllers/
@@ -0,0 +1,94 @@
1# Copyright (C) 2014 Intel Corporation
3# Released under the MIT license (see COPYING.MIT)
5# This module adds support to testimage.bbclass to deploy images and run
6# tests on a BeagleBone (original "white" or Black models). The device must
7# be set up as per README.hardware and the master image should be deployed
8# onto the card so that it boots into it by default. For booting into the
9# image under test we interact with u-boot over serial, so for the
10# BeagleBone Black you will need an additional TTL serial cable since a
11# serial interface isn't automatically provided over the USB connection as
12# it is on the original BeagleBone ("white") version. The separate ext3
13# partition that will contain the image to be tested must be labelled
14# "testrootfs" so that the deployment code below can find it.
16# NOTE: for the BeagleBone "white" (original version) you may need to use
17# a script which handles the serial device disappearing on power down, such
18# as scripts/contrib/serdevtry in OE-Core.
20import os
21import bb
22import time
23import subprocess
24import sys
25import pexpect
27import oeqa.utils.sshcontrol as sshcontrol
28from oeqa.controllers.masterimage import MasterImageHardwareTarget
31class BeagleBoneTarget(MasterImageHardwareTarget):
33 def __init__(self, d):
34 super(BeagleBoneTarget, self).__init__(d)
36 self.dtbs = [('uImage-am335x-bone.dtb', 'am335x-bone.dtb'),
37 ('uImage-am335x-boneblack.dtb', 'am335x-boneblack.dtb')]
39 self.deploy_cmds = [
40 'mkdir -p /mnt/testrootfs',
41 'mount -L testrootfs /mnt/testrootfs',
42 'rm -rf /mnt/testrootfs/*',
43 'tar xzvf ~/test-rootfs.tar.gz -C /mnt/testrootfs',
44 '[ ! -e /mnt/testrootfs/boot/uImage ] && cp ~/test-kernel /mnt/testrootfs/boot/uImage',
45 ]
47 for _, dtbfn in self.dtbs:
48 # Kernel and dtb files may not be in the image, so copy them if not
49 self.deploy_cmds.append('[ ! -e /mnt/testrootfs/boot/{0} ] && cp ~/{0} /mnt/testrootfs/boot/'.format(dtbfn))
51 if not self.serialcontrol_cmd:
52 bb.fatal("This TEST_TARGET needs a TEST_SERIALCONTROL_CMD defined in local.conf.")
55 def _deploy(self):
56"umount /boot; umount /mnt/testrootfs;")
57 self.master.ignore_status = False
58 # Kernel and dtb files may not be in the image, so copy them just in case
59 self.master.copy_to(self.kernel, "~/test-kernel")
60 kernelpath = os.path.dirname(self.kernel)
61 for dtborig, dtbfn in self.dtbs:
62 dtbfile = os.path.join(kernelpath, dtborig)
63 if os.path.exists(dtbfile):
64 self.master.copy_to(dtbfile, "~/%s" % dtbfn)
65 self.master.copy_to(self.rootfs, "~/test-rootfs.tar.gz")
66 for cmd in self.deploy_cmds:
69 def _start(self, params=None):
70 self.power_cycle(self.master)
71 try:
72 serialconn = pexpect.spawn(self.serialcontrol_cmd, env=self.origenv, logfile=sys.stdout)
73 # We'd wait for "U-Boot" here but sometimes we connect too late on BeagleBone white to see it
74 serialconn.expect("NAND:")
75 serialconn.expect("MMC:")
76 serialconn.sendline("a")
77 serialconn.expect("U-Boot#")
78 serialconn.sendline("setenv bootpart 0:3")
79 serialconn.expect("U-Boot#")
80 serialconn.sendline("setenv mmcroot /dev/mmcblk0p3 ro")
81 serialconn.expect("U-Boot#")
82 serialconn.sendline("boot")
83 serialconn.expect("login:", timeout=120)
84 serialconn.close()
85 except pexpect.ExceptionPexpect as e:
86 bb.fatal('Serial interaction failed: %s' % str(e))
88 def _wait_until_booted(self):
89 try:
90 serialconn = pexpect.spawn(self.serialcontrol_cmd, env=self.origenv, logfile=sys.stdout)
91 serialconn.expect("login:", timeout=120)
92 serialconn.close()
93 except pexpect.ExceptionPexpect as e:
94 bb.fatal('Serial interaction failed: %s' % str(e))