@@ -161,10 +161,23 @@ class FitImageTestCase(OESelftestTestCase):
@staticmethod
def _get_dtb_files(bb_vars):
+ """Return a list of devicetree names
+
+ The list should be used to check the dtb and conf nodes in the FIT image or its file.
+ In addition to the entries from KERNEL_DEVICETREE, the external devicetree and the
+ external devicetree overlay added by the test recipe bbb-dtbs-as-ext are handled as well.
+ """
kernel_devicetree = bb_vars.get('KERNEL_DEVICETREE')
+ all_dtbs = []
+ dtb_symlinks = []
if kernel_devicetree:
- return [os.path.basename(dtb) for dtb in kernel_devicetree.split()]
- return []
+ all_dtbs += [os.path.basename(dtb) for dtb in kernel_devicetree.split()]
+ # Support only the test recipe which provides 1 devicetree and 1 devicetree overlay
+ pref_prov_dtb = bb_vars.get('PREFERRED_PROVIDER_virtual/dtb')
+ if pref_prov_dtb == "bbb-dtbs-as-ext":
+ all_dtbs += ["am335x-bonegreen-ext.dtb", "BBORG_RELAY-00A2.dtbo"]
+ dtb_symlinks.append("am335x-bonegreen-ext-alias.dtb")
+ return (all_dtbs, dtb_symlinks)
def _is_req_dict_in_dict(self, found_dict, req_dict):
"""
@@ -379,6 +392,7 @@ class KernelFitImageTests(FitImageTestCase):
'KERNEL_DEVICETREE',
'KERNEL_FIT_LINK_NAME',
'MACHINE',
+ 'PREFERRED_PROVIDER_virtual/dtb',
'UBOOT_ARCH',
'UBOOT_ENTRYPOINT',
'UBOOT_LOADADDRESS',
@@ -452,7 +466,7 @@ class KernelFitImageTests(FitImageTestCase):
['/', 'images', 'kernel-1', 'signature-1'],
]
"""
- dtb_files = FitImageTestCase._get_dtb_files(bb_vars)
+ dtb_files, dtb_symlinks = FitImageTestCase._get_dtb_files(bb_vars)
fit_sign_individual = bb_vars['FIT_SIGN_INDIVIDUAL']
fit_uboot_env = bb_vars['FIT_UBOOT_ENV']
initramfs_image = bb_vars['INITRAMFS_IMAGE']
@@ -470,9 +484,9 @@ class KernelFitImageTests(FitImageTestCase):
if initramfs_image and initramfs_image_bundle != "1":
images.append('ramdisk-1')
- # configuration nodes
+ # configuration nodes (one per DTB and also one per symlink)
if dtb_files:
- configurations = [ 'conf-' + conf for conf in dtb_files ]
+ configurations = [ 'conf-' + conf for conf in dtb_files + dtb_symlinks]
else:
configurations = [ 'conf-1' ]
@@ -548,7 +562,7 @@ class KernelFitImageTests(FitImageTestCase):
def _get_req_sections(self, bb_vars):
"""Generate a dictionary of expected sections in the output of dumpimage"""
- dtb_files = FitImageTestCase._get_dtb_files(bb_vars)
+ dtb_files, dtb_symlinks = FitImageTestCase._get_dtb_files(bb_vars)
fit_hash_alg = bb_vars['FIT_HASH_ALG']
fit_sign_alg = bb_vars['FIT_SIGN_ALG']
fit_sign_individual = bb_vars['FIT_SIGN_INDIVIDUAL']
@@ -584,11 +598,20 @@ class KernelFitImageTests(FitImageTestCase):
}
# Create a configuration section for each DTB
if dtb_files:
- for dtb in dtb_files:
- req_sections['conf-' + dtb] = {
- "Kernel": "kernel-1",
- "FDT": 'fdt-' + dtb,
- }
+ for dtb in dtb_files + dtb_symlinks:
+ # Assume that DTBs with an "-alias" in its name are symlink DTBs created e.g. by the
+ # bbb-dtbs-as-ext test recipe. Make the configuration node pointing to the real DTB.
+ real_dtb = dtb.replace("-alias", "")
+ # dtb overlays do not refer to a kernel (yet?)
+ if dtb.endswith('.dtbo'):
+ req_sections['conf-' + dtb] = {
+ "FDT": 'fdt-' + real_dtb,
+ }
+ else:
+ req_sections['conf-' + dtb] = {
+ "Kernel": "kernel-1",
+ "FDT": 'fdt-' + real_dtb,
+ }
if initramfs_image and initramfs_image_bundle != "1":
req_sections['conf-' + dtb]['Init Ramdisk'] = "ramdisk-1"
else:
@@ -635,7 +658,12 @@ class KernelFitImageTests(FitImageTestCase):
self.assertEqual(sign_algo, req_sign_algo, 'Signature algorithm for %s not expected value' % section)
sign_value = values.get('Sign value', None)
self.assertEqual(len(sign_value), fit_sign_alg_len, 'Signature value for section %s not expected length' % section)
- dtb_path = os.path.join(deploy_dir_image, section.replace('conf-', ''))
+ dtb_file_name = section.replace('conf-', '')
+ dtb_path = os.path.join(deploy_dir_image, dtb_file_name)
+ # External devicetrees created by devicetree.bbclass are in a subfolder and have priority
+ dtb_path_ext = os.path.join(deploy_dir_image, "devicetree", dtb_file_name)
+ if os.path.exists(dtb_path_ext):
+ dtb_path = dtb_path_ext
self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, dtb_path, section)
else:
# Image nodes always need a hash which gets indirectly signed by the config signature
@@ -696,6 +724,27 @@ FIT_DESC = "A model description"
self._test_fitimage(bb_vars)
+ def test_fit_image_ext_dtb_dtbo(self):
+ """
+ Summary: Check if FIT image and Image Tree Source (its) are created correctly.
+ Expected: 1) its and FIT image are built successfully
+ 2) The its file contains also the external devicetree overlay
+ 3) Dumping the FIT image indicates the devicetree overlay
+ """
+ config = """
+# Enable creation of fitImage
+MACHINE = "beaglebone-yocto"
+KERNEL_IMAGETYPES += " fitImage "
+KERNEL_CLASSES = " kernel-fitimage "
+# Add a devicetree overlay which does not need kernel sources
+PREFERRED_PROVIDER_virtual/dtb = "bbb-dtbs-as-ext"
+"""
+ config = self._config_add_uboot_env(config)
+ self.write_config(config)
+ bb_vars = self._fit_get_bb_vars()
+ self._test_fitimage(bb_vars)
+
+
def test_sign_fit_image_configurations(self):
"""
Summary: Check if FIT image and Image Tree Source (its) are created