diff --git a/flavours/linux/bblayers.conf.sample b/flavours/linux/bblayers.conf.sample index 1fd21176bd8d04cc0e8e72da88a0c3c58c55f3bc..33bfde3b1a2e177ba611e8ad9d7b2674272840c7 100644 --- a/flavours/linux/bblayers.conf.sample +++ b/flavours/linux/bblayers.conf.sample @@ -14,12 +14,12 @@ BBLAYERS ?= " \ ##OEROOT##/meta-poky \ ##OEROOT##/meta-clang \ ##OEROOT##/meta-yocto-bsp \ - ##OEROOT##/../meta-freertos \ ##OEROOT##/../meta-zephyr \ ##OEROOT##/../meta-ohos/meta-ohos-core \ ##OEROOT##/../meta-ohos/meta-ohos-acts \ ##OEROOT##/../meta-ohos/meta-ohos-blueprints \ ##OEROOT##/../meta-ohos/meta-ohos-staging \ + ##OEROOT##/../meta-freertos \ ##OEROOT##/../meta-intel \ ##OEROOT##/../meta-seco-intel \ ##OEROOT##/../meta-freescale \ diff --git a/meta-ohos-core/classes/freertos-image.bbclass b/meta-ohos-core/classes/freertos-image.bbclass new file mode 100644 index 0000000000000000000000000000000000000000..617d68fd390751d87b41642b66d258dacb0b9be6 --- /dev/null +++ b/meta-ohos-core/classes/freertos-image.bbclass @@ -0,0 +1,153 @@ +# FreeRTOS image class +# +# This class is meant to be inherited by recipes for FreeRTOS apps +# It contains code that would be used by all of them, where every +# recipe would just need to override certain parts. +# +# For scalability purposes, code within this class focuses on the +# "image" wiring that makes apps work properly with openembedded-core +# infrastructure. + +# We are getting the FreeRTOS source code from upstream (this class) +# We have a BSP repo where we get the portable code from (bsp class) +# And we get the app code from a different repo (app recipe) + +# FreeRTOS kernel version (FreeRTOS.h) +FREERTOS_VERSION = "FreeRTOSv10.2.1" + +LICENSE = "MIT" +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI = " \ + gitsm://github.com/aws/amazon-freertos.git;name=freertos;destsuffix=freertos;branch=main; \ +" + +SRCREV_FORMAT ?= "freertos_bsp" + +# FreeRTOS License +LIC_FILES_CHKSUM = "file://../freertos/LICENSE;md5=8f5b865d5179a4a0d9037aebbd00fc2e" + +SRCREV_freertos ?= "5bee12b2cd5ddbf2c6b3bf394ea41649999a1453" + +PV = "${FREERTOS_VERSION}+git${SRCPV}" + +FREERTOS_KERNEL_SRC = "${WORKDIR}/freertos/freertos_kernel/" + +inherit rootfs-postcommands +IMGDEPLOYDIR ?= "${WORKDIR}/deploy-${PN}-image-complete" +DEPLOYDIR = "${IMGDEPLOYDIR}" +do_rootfs[dirs] = "${DEPLOYDIR} ${DEPLOY_DIR_IMAGE}" +IMAGE_LINK_NAME ?= "freertos-image-${MACHINE}" +IMAGE_NAME_SUFFIX ?= "" + +# QEMU crashes when FreeRTOS is built with optimizations, disable those for now +CFLAGS_remove = "-O2" + +# Extra CFLAGS required for FreeRTOS include files +CFLAGS_append = " -I${FREERTOS_KERNEL_SRC} -I${FREERTOS_KERNEL_SRC}/include/" + +# We need to define the FreeRTOS source code location, the port we'll be using +# should be defined on the specific bsp class +EXTRA_OEMAKE = " FREERTOS_SRC=${FREERTOS_KERNEL_SRC} 'CFLAGS=${CFLAGS}'" + +do_compile(){ + oe_runmake ${EXTRA_OEMAKE} +} + +do_install(){ + install -m 755 ${B}/image.bin ${D}/image.bin + install -m 755 ${B}/image.elf ${D}/image.elf +} + +do_image(){ + install ${D}/image.bin ${DEPLOYDIR}/${IMAGE_LINK_NAME}.bin + install ${D}/image.elf ${DEPLOYDIR}/${IMAGE_LINK_NAME}.elf +} + +do_image_complete(){ +: +} + +FILES_${PN} += "image.bin image.elf" + +python do_rootfs(){ + from oe.utils import execute_pre_post_process + from pathlib import Path + + # Write empty manifest testdate file + deploy_dir = d.getVar('DEPLOYDIR') + link_name = d.getVar('IMAGE_LINK_NAME') + manifest_name = d.getVar('IMAGE_MANIFEST') + + Path(manifest_name).touch() + if os.path.exists(manifest_name) and link_name: + manifest_link = deploy_dir + "/" + link_name + ".manifest" + if os.path.lexists(manifest_link): + os.remove(manifest_link) + os.symlink(os.path.basename(manifest_name), manifest_link) + + # A lot of postprocess commands assume the existence of rootfs/etc + sysconfdir = d.getVar("IMAGE_ROOTFS") + d.getVar('sysconfdir') + bb.utils.mkdirhier(sysconfdir) + + execute_pre_post_process(d, d.getVar('ROOTFS_POSTPROCESS_COMMAND')) +} + +# QEMU generic FreeRTOS parameters +QB_DEFAULT_KERNEL = "${IMAGE_LINK_NAME}.bin" +QB_MEM = "-m 128" +QB_OPT_APPEND = "-nographic" +QB_DEFAULT_FSTYPE = "bin" + +# Assure binaries, manifest and qemubootconf are populated on DEPLOY_DIR_IMAGE +do_image_complete[dirs] = "${TOPDIR}" +do_image_complete[umask] = "022" +SSTATETASKS += "do_image_complete" +SSTATE_SKIP_CREATION_task-image-complete = '1' +do_image_complete[sstate-inputdirs] = "${IMGDEPLOYDIR}" +do_image_complete[sstate-outputdirs] = "${DEPLOY_DIR_IMAGE}" +do_image_complete[stamp-extra-info] = "${MACHINE_ARCH}" +addtask do_image_complete after do_image before do_build + +python do_image_complete_setscene () { + sstate_setscene(d) +} +addtask do_image_complete_setscene + +# This next part is necessary to trick the build system into thinking +# its building an image recipe so it generates the qemuboot.conf +addtask do_rootfs before do_image after do_install +addtask do_image after do_rootfs before do_build +addtask do_image_complete after do_image before do_build +inherit qemuboot + + +# Based on image.bbclass to make sure we build qemu +python(){ + # do_addto_recipe_sysroot doesnt exist for all recipes, but we need it to have + # /usr/bin on recipe-sysroot (qemu) populated + def extraimage_getdepends(task): + deps = "" + for dep in (d.getVar('EXTRA_IMAGEDEPENDS') or "").split(): + # Make sure we only add it for qemu + if 'qemu' in dep: + deps += " %s:%s" % (dep, task) + return deps + d.appendVarFlag('do_image', 'depends', extraimage_getdepends('do_addto_recipe_sysroot')) + d.appendVarFlag('do_image', 'depends', extraimage_getdepends('do_populate_sysroot')) +} + +# Add boot patterns to use with OE testimage infrastructure with the serial console +TESTIMAGE_BOOT_PATTERNS = "search_reached_prompt send_login_user search_login_succeeded search_cmd_finished" +# Look for FreeRTOS to check when the device has booted +TESTIMAGE_BOOT_PATTERNS[search_reached_prompt] = " FreeRTOS" +# Use carriage return as the user to "log in" +TESTIMAGE_BOOT_PATTERNS[send_login_user] = "\r" +# Use the string You entered to check if the "log in" was successful (which is what would be printed afterwards) +TESTIMAGE_BOOT_PATTERNS[search_login_succeeded] = "You entered" +# Use the string Unblocked to check if the "command" finished, in the Linux case this should look for a prompt +# In our case, this checks if the task has been Unblocked which is printed on the serial console after a command +TESTIMAGE_BOOT_PATTERNS[search_cmd_finished] = "Unblocked" + +# We have to do = otherwise it tries to run the Linux tests from OpenEmbedded +TEST_SUITES = "freertos_echo"