aboutsummaryrefslogtreecommitdiffstats
path: root/meta-xilinx-standalone-experimental/classes/esw.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'meta-xilinx-standalone-experimental/classes/esw.bbclass')
-rw-r--r--meta-xilinx-standalone-experimental/classes/esw.bbclass143
1 files changed, 143 insertions, 0 deletions
diff --git a/meta-xilinx-standalone-experimental/classes/esw.bbclass b/meta-xilinx-standalone-experimental/classes/esw.bbclass
new file mode 100644
index 00000000..febdebad
--- /dev/null
+++ b/meta-xilinx-standalone-experimental/classes/esw.bbclass
@@ -0,0 +1,143 @@
+PV = "${ESW_VER}"
+
+inherit python3native xlnx-embeddedsw pkgconfig cmake
+
+# Override xlnx-embeddedsw with out version
+require conf/dtb-embeddedsw.inc
+
+SRCREV_FORMAT = "src_decouple"
+
+S = "${WORKDIR}/git"
+B = "${WORKDIR}/build"
+OECMAKE_SOURCEPATH = "${S}/${ESW_COMPONENT_SRC}"
+LICFILENAME = "license.txt"
+
+SPECFILE_PATH:arm = "${S}/scripts/specs/arm/Xilinx.spec"
+SPECFILE_PATH:aarch64 = "${S}/scripts/specs/arm/Xilinx.spec"
+SPECFILE_PATH:microblaze = "${S}/scripts/specs/microblaze/Xilinx.spec"
+
+ESW_MACHINE ?= "${MACHINE}"
+
+ESW_CFLAGS += "-specs=${SPECFILE_PATH}"
+
+inherit ccmake
+
+COMPATIBLE_HOST = ".*-elf"
+COMPATIBLE_HOST:arm = "[^-]*-[^-]*-eabi"
+
+CONFIG_DTFILE ??= ""
+DTS_FILE = "${DEPLOY_DIR_IMAGE}/devicetree/${@os.path.basename(d.getVar('CONFIG_DTFILE').replace('.dts','.dtb'))}"
+
+DEPENDS += "python3-pyyaml-native lopper-native device-tree python3-dtc-native"
+
+# We need the deployed output
+do_configure[depends] += "device-tree:do_deploy"
+do_compile[depends] += "device-tree:do_deploy"
+do_install[depends] += "device-tree:do_deploy"
+
+def get_xlnx_cmake_machine(fam, d):
+ cmake_machine = fam
+ if (fam == 'zynqmp'):
+ cmake_machine = 'ZynqMP'
+ elif (fam == 'versal'):
+ cmake_machine = 'Versal'
+ elif (fam == 'zynq'):
+ cmake_machine = 'Zynq'
+ return cmake_machine
+
+def get_xlnx_cmake_processor(tune, machine, d):
+ cmake_processor = tune
+ if tune.startswith('microblaze'):
+ if (machine == 'psu_pmu_0'):
+ cmake_processor = 'pmu_microblaze'
+ elif (machine == 'psv_pmc_0'):
+ cmake_processor = 'plm_microblaze'
+ else:
+ cmake_processor = 'microblaze'
+ elif tune == 'cortexr5':
+ cmake_processor = 'cortexr5'
+ elif tune.startswith('cortexa9'):
+ cmake_processor = 'cortexa9'
+ elif (tune in [ 'cortexa53', 'cortexa72-cortexa53' ]):
+ cmake_processor = 'cortexa53'
+ elif tune == 'cortexa72':
+ cmake_processor = 'cortexa72'
+ return cmake_processor
+
+XLNX_CMAKE_MACHINE = "${@get_xlnx_cmake_machine(d.getVar('SOC_FAMILY'), d)}"
+XLNX_CMAKE_PROCESSOR = "${@get_xlnx_cmake_processor(d.getVar('DEFAULTTUNE'), d.getVar('ESW_MACHINE'), d)}"
+XLNX_CMAKE_SYSTEM_NAME ?= "Generic"
+XLNX_CMAKE_BSP_VARS ?= ""
+
+cmake_do_generate_toolchain_file:append() {
+ cat >> ${WORKDIR}/toolchain.cmake <<EOF
+ include(CMakeForceCompiler)
+ CMAKE_FORCE_C_COMPILER("${OECMAKE_C_COMPILER}" GNU)
+ CMAKE_FORCE_CXX_COMPILER("${OECMAKE_CXX_COMPILER}" GNU)
+ set( CMAKE_SYSTEM_PROCESSOR "${XLNX_CMAKE_PROCESSOR}" )
+ set( CMAKE_MACHINE "${XLNX_CMAKE_MACHINE}" )
+ # Will need this in the future to make cmake understand esw variables
+ # set( CMAKE_SYSTEM_NAME `echo elf | sed -e 's/^./\u&/' -e 's/^\(Linux\).*/\1/'` )
+ set( CMAKE_SYSTEM_NAME "${XLNX_CMAKE_SYSTEM_NAME}" )
+ set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${S}/cmake)
+ set( CMAKE_LIBRARY_PATH ${CMAKE_INSTALL_LIBDIR})
+ if ("${XLNX_CMAKE_PROCESSOR}" STREQUAL "plm_microblaze")
+ set( CMAKE_BUILD_TYPE Release)
+ endif()
+ add_definitions( "${XLNX_CMAKE_BSP_VARS}" )
+EOF
+}
+
+do_install() {
+ install -d ${D}${libdir}
+ install -d ${D}${includedir}
+ install -m 0755 ${B}/${ESW_COMPONENT_NAME} ${D}${libdir}
+ install -m 0644 ${B}/include/*.h ${D}${includedir}
+}
+
+CFLAGS:append = " ${ESW_CFLAGS}"
+
+# We need to find the license file, which vaires depending on the component
+# recurse a maximum of x times, could be fancier but it gets complicated since
+# we dont know for certain we are running devtool or just externalsrc
+python(){
+ import os.path
+ if bb.data.inherits_class('externalsrc', d) and d.getVar('EXTERNALSRC'):
+ externalsrc = d.getVar('EXTERNALSRC')
+ lic_file = d.getVar('LIC_FILES_CHKSUM', False)
+ licpath=externalsrc
+ for i in range(5):
+ if os.path.isfile(licpath + '/' + d.getVar('LICFILENAME',True)):
+ lic_file = lic_file.replace('${S}',licpath)
+ d.setVar('LIC_FILES_CHKSUM', lic_file)
+ return
+ licpath=os.path.dirname(licpath)
+ bb.error("Couldn't find license file: %s, within directory %s or his parent directories" % (d.getVar('LICFILENAME',True), externalsrc))
+}
+
+do_generate_driver_data[dirs] = "${B}"
+do_generate_driver_data[depends] += "device-tree:do_deploy"
+python do_generate_driver_data() {
+ import glob, subprocess, os
+
+ system_dt = glob.glob(d.getVar('DTS_FILE'))
+ src_dir = glob.glob(d.getVar('OECMAKE_SOURCEPATH'))
+ machine = d.getVar('ESW_MACHINE')
+
+ driver_name = d.getVar('REQUIRED_MACHINE_FEATURES')
+
+ if len(system_dt) == 0:
+ bb.error("Couldn't find device tree %s" % d.getVar('DTS_FILE'))
+
+ if len(src_dir) == 0:
+ bb.error("Couldn't find source dir %s" % d.getVar('OECMAKE_SOURCEPATH'))
+
+ os.chdir(d.getVar('B'))
+ command = ["lopper"] + ["-f"] + [system_dt[0]] + ["--"] + ["baremetalconfig_xlnx.py"] + [machine] + [src_dir[0]]
+ subprocess.run(command, check = True)
+ src_file = str("x") + driver_name.replace('-', '_') + str("_g.c")
+ if os.path.exists(src_file):
+ bb.note("Generated config file for driver %s" % driver_name)
+ command = ["install"] + ["-m"] + ["0755"] + [src_file] + [src_dir[0]]
+ subprocess.run(command, check = True)
+}