* [PATCH 1/2] meta-yocto-bsp: oeqa/controllers: add BeagleBoneTarget
2014-04-30 12:38 [PATCH 0/2] Automated hardware testing support for reference platforms Paul Eggleton
@ 2014-04-30 12:38 ` Paul Eggleton
2014-04-30 12:38 ` [PATCH 2/2] meta-yocto-bsp: oeqa/controllers: add EdgeRouterTarget Paul Eggleton
1 sibling, 0 replies; 3+ messages in thread
From: Paul Eggleton @ 2014-04-30 12:38 UTC (permalink / raw)
To: poky
From: Stefan Stanacar <stefanx.stanacar@intel.com>
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].
Signed-off-by: Stefan Stanacar <stefanx.stanacar@intel.com>
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
meta-yocto-bsp/lib/oeqa/controllers/__init__.py | 0
.../lib/oeqa/controllers/beaglebonetarget.py | 94 ++++++++++++++++++++++
2 files changed, 94 insertions(+)
create mode 100644 meta-yocto-bsp/lib/oeqa/controllers/__init__.py
create mode 100644 meta-yocto-bsp/lib/oeqa/controllers/beaglebonetarget.py
diff --git a/meta-yocto-bsp/lib/oeqa/controllers/__init__.py b/meta-yocto-bsp/lib/oeqa/controllers/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/meta-yocto-bsp/lib/oeqa/controllers/beaglebonetarget.py b/meta-yocto-bsp/lib/oeqa/controllers/beaglebonetarget.py
new file mode 100644
index 0000000..53f454b
--- /dev/null
+++ b/meta-yocto-bsp/lib/oeqa/controllers/beaglebonetarget.py
@@ -0,0 +1,94 @@
+# Copyright (C) 2014 Intel Corporation
+#
+# Released under the MIT license (see COPYING.MIT)
+
+# This module adds support to testimage.bbclass to deploy images and run
+# tests on a BeagleBone (original "white" or Black models). The device must
+# be set up as per README.hardware and the master image should be deployed
+# onto the card so that it boots into it by default. For booting into the
+# image under test we interact with u-boot over serial, so for the
+# BeagleBone Black you will need an additional TTL serial cable since a
+# serial interface isn't automatically provided over the USB connection as
+# it is on the original BeagleBone ("white") version. The separate ext3
+# partition that will contain the image to be tested must be labelled
+# "testrootfs" so that the deployment code below can find it.
+#
+# NOTE: for the BeagleBone "white" (original version) you may need to use
+# a script which handles the serial device disappearing on power down, such
+# as scripts/contrib/serdevtry in OE-Core.
+
+import os
+import bb
+import time
+import subprocess
+import sys
+import pexpect
+
+import oeqa.utils.sshcontrol as sshcontrol
+from oeqa.controllers.masterimage import MasterImageHardwareTarget
+
+
+class BeagleBoneTarget(MasterImageHardwareTarget):
+
+ def __init__(self, d):
+ super(BeagleBoneTarget, self).__init__(d)
+
+ self.dtbs = [('uImage-am335x-bone.dtb', 'am335x-bone.dtb'),
+ ('uImage-am335x-boneblack.dtb', 'am335x-boneblack.dtb')]
+
+ self.deploy_cmds = [
+ 'mkdir -p /mnt/testrootfs',
+ 'mount -L testrootfs /mnt/testrootfs',
+ 'rm -rf /mnt/testrootfs/*',
+ 'tar xzvf ~/test-rootfs.tar.gz -C /mnt/testrootfs',
+ '[ ! -e /mnt/testrootfs/boot/uImage ] && cp ~/test-kernel /mnt/testrootfs/boot/uImage',
+ ]
+
+ for _, dtbfn in self.dtbs:
+ # Kernel and dtb files may not be in the image, so copy them if not
+ self.deploy_cmds.append('[ ! -e /mnt/testrootfs/boot/{0} ] && cp ~/{0} /mnt/testrootfs/boot/'.format(dtbfn))
+
+ if not self.serialcontrol_cmd:
+ bb.fatal("This TEST_TARGET needs a TEST_SERIALCONTROL_CMD defined in local.conf.")
+
+
+ def _deploy(self):
+ self.master.run("umount /boot; umount /mnt/testrootfs;")
+ self.master.ignore_status = False
+ # Kernel and dtb files may not be in the image, so copy them just in case
+ self.master.copy_to(self.kernel, "~/test-kernel")
+ kernelpath = os.path.dirname(self.kernel)
+ for dtborig, dtbfn in self.dtbs:
+ dtbfile = os.path.join(kernelpath, dtborig)
+ if os.path.exists(dtbfile):
+ self.master.copy_to(dtbfile, "~/%s" % dtbfn)
+ self.master.copy_to(self.rootfs, "~/test-rootfs.tar.gz")
+ for cmd in self.deploy_cmds:
+ self.master.run(cmd)
+
+ def _start(self, params=None):
+ self.power_cycle(self.master)
+ try:
+ serialconn = pexpect.spawn(self.serialcontrol_cmd, env=self.origenv, logfile=sys.stdout)
+ # We'd wait for "U-Boot" here but sometimes we connect too late on BeagleBone white to see it
+ serialconn.expect("NAND:")
+ serialconn.expect("MMC:")
+ serialconn.sendline("a")
+ serialconn.expect("U-Boot#")
+ serialconn.sendline("setenv bootpart 0:3")
+ serialconn.expect("U-Boot#")
+ serialconn.sendline("setenv mmcroot /dev/mmcblk0p3 ro")
+ serialconn.expect("U-Boot#")
+ serialconn.sendline("boot")
+ serialconn.expect("login:", timeout=120)
+ serialconn.close()
+ except pexpect.ExceptionPexpect as e:
+ bb.fatal('Serial interaction failed: %s' % str(e))
+
+ def _wait_until_booted(self):
+ try:
+ serialconn = pexpect.spawn(self.serialcontrol_cmd, env=self.origenv, logfile=sys.stdout)
+ serialconn.expect("login:", timeout=120)
+ serialconn.close()
+ except pexpect.ExceptionPexpect as e:
+ bb.fatal('Serial interaction failed: %s' % str(e))
--
1.9.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH 2/2] meta-yocto-bsp: oeqa/controllers: add EdgeRouterTarget
2014-04-30 12:38 [PATCH 0/2] Automated hardware testing support for reference platforms Paul Eggleton
2014-04-30 12:38 ` [PATCH 1/2] meta-yocto-bsp: oeqa/controllers: add BeagleBoneTarget Paul Eggleton
@ 2014-04-30 12:38 ` Paul Eggleton
1 sibling, 0 replies; 3+ messages in thread
From: Paul Eggleton @ 2014-04-30 12:38 UTC (permalink / raw)
To: poky
Based on BeagleBoneTarget, this provides support for deploying images
and running tests on an EdgeRouter Lite (edgerouter). The device must
be set up to boot into the master image already - see the instructions
in the file.
Implements [YOCTO #6253].
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
.../lib/oeqa/controllers/edgeroutertarget.py | 89 ++++++++++++++++++++++
1 file changed, 89 insertions(+)
create mode 100644 meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py
diff --git a/meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py b/meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py
new file mode 100644
index 0000000..5df9fda
--- /dev/null
+++ b/meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py
@@ -0,0 +1,89 @@
+# Copyright (C) 2014 Intel Corporation
+#
+# Released under the MIT license (see COPYING.MIT)
+
+# This module adds support to testimage.bbclass to deploy images and run
+# tests on a Ubiquiti Networks EdgeRouter Lite. The device must be set up
+# to boot into the master image already - the easiest way to do that is as
+# follows:
+#
+# 1. Take out the internal USB drive and plug it into your PC
+# 2. Repartition the USB drive so that you have three partitions in this
+# order:
+# 1: vfat, labelled "boot" (it will need to be formatted with mkfs.vfat
+# for this to be possible, since FAT partitions formatted under
+# DOS/Windows will only support uppercase labels)
+# 2: ext3 (for master image) labelled "testmaster"
+# 3: ext3 (for image under test) labelled "testrootfs"
+# 3. Copy the kernel to be used by the master image to the FAT partition
+# (it should be named "vmlinux.64" with the factory u-boot configuration)
+# 4. Install the master image onto the "testmaster" ext3 partition. If
+# you do this by just extracting the contents of an image onto the
+# partition, you will also likely need to create the master image marker
+# file /etc/masterimage within this partition so that we can tell when
+# we're booted into it that it is the master image.
+# 5. Put the USB drive back into the device, and ensure the console port
+# and first ethernet port are connected before powering on
+#
+# TEST_SERIALCONTROL_CMD will need to be set in local.conf so that we can
+# interact with u-boot over the serial console port.
+
+import os
+import bb
+import time
+import subprocess
+import sys
+import pexpect
+
+import oeqa.utils.sshcontrol as sshcontrol
+from oeqa.controllers.masterimage import MasterImageHardwareTarget
+
+
+class EdgeRouterTarget(MasterImageHardwareTarget):
+
+ def __init__(self, d):
+ super(EdgeRouterTarget, self).__init__(d)
+
+ self.deploy_cmds = [
+ 'mount -L boot /boot',
+ 'mkdir -p /mnt/testrootfs',
+ 'mount -L testrootfs /mnt/testrootfs',
+ 'cp ~/test-kernel /boot',
+ 'rm -rf /mnt/testrootfs/*',
+ 'tar xzvf ~/test-rootfs.tar.gz -C /mnt/testrootfs'
+ ]
+ if not self.serialcontrol_cmd:
+ bb.fatal("This TEST_TARGET needs a TEST_SERIALCONTROL_CMD defined in local.conf.")
+
+
+ def _deploy(self):
+ self.master.run("umount /mnt/testrootfs;")
+ self.master.ignore_status = False
+ self.master.copy_to(self.kernel, "~/test-kernel")
+ self.master.copy_to(self.rootfs, "~/test-rootfs.tar.gz")
+ for cmd in self.deploy_cmds:
+ self.master.run(cmd)
+
+ def _start(self, params=None):
+ self.power_cycle(self.master)
+ try:
+ serialconn = pexpect.spawn(self.serialcontrol_cmd, env=self.origenv, logfile=sys.stdout)
+ serialconn.expect("U-Boot")
+ serialconn.sendline("a")
+ serialconn.expect("Octeon ubnt_e100#")
+ serialconn.sendline("fatload usb 0:1 $loadaddr test-kernel")
+ serialconn.expect(" bytes read")
+ serialconn.expect("Octeon ubnt_e100#")
+ serialconn.sendline("bootoctlinux $loadaddr coremask=0x3 root=/dev/sda3 rw rootwait mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)")
+ serialconn.expect("login:", timeout=120)
+ serialconn.close()
+ except pexpect.ExceptionPexpect as e:
+ bb.fatal('Serial interaction failed: %s' % str(e))
+
+ def _wait_until_booted(self):
+ try:
+ serialconn = pexpect.spawn(self.serialcontrol_cmd, env=self.origenv, logfile=sys.stdout)
+ serialconn.expect("login:", timeout=120)
+ serialconn.close()
+ except pexpect.ExceptionPexpect as e:
+ bb.fatal('Serial interaction failed: %s' % str(e))
--
1.9.0
^ permalink raw reply related [flat|nested] 3+ messages in thread