From c7ec582fbf118b29f21141b1ca41ea902fc8d256 Mon Sep 17 00:00:00 2001 From: Manjukumar Matha Date: Mon, 9 Sep 2019 12:13:21 -0700 Subject: meta-xilinx-pynq: Add layer to support PYNQ This layer collects Yocto recipes required to build and run PYNQ based examples using jupyter-notebooks on Zynq and ZU+ SoC's. PYNQ is an open-source project from Xilinx that makes it easy to design embedded systems with Zynq All Programmable Systems on Chips (APSoCs). Using the Python language and libraries, designers can exploit the benefits of programmable logic and microprocessors in Zynq to build more capable and exciting embedded systems. See https://github.com/Xilinx/PYNQ for more details and examples Signed-off-by: Sai Hari Chandana Kalluri Signed-off-by: Peter Ogden Signed-off-by: Manjukumar Matha --- meta-xilinx-pynq/COPYING.MIT | 17 ++++ meta-xilinx-pynq/README.md | 30 ++++++ meta-xilinx-pynq/classes/xilinx-pynq.bbclass | 17 ++++ meta-xilinx-pynq/conf/layer.conf | 15 +++ .../recipes-devtool/python/python-pynq.inc | 53 ++++++++++ .../python/python3-pynq/pl_server_init | 109 +++++++++++++++++++++ .../recipes-devtool/python/python3-pynq_2.4.bb | 3 + .../recipes-support/libcma/libcma_1.0.bb | 33 +++++++ .../pynq-overlay/pynq-overlay/LICENSE | 23 +++++ .../pynq-overlay/pynq-overlay/generic-uio.conf | 1 + .../pynq-overlay/pynq-overlay/pynq_zynq.dtsi | 16 +++ .../pynq-overlay/pynq_zynq_symbols.dtsi | 15 +++ .../pynq-overlay/pynq-overlay/pynq_zynqmp.dtsi | 17 ++++ .../pynq-overlay/pynq_zynqmp_symbols.dtsi | 15 +++ .../pynq-overlay/pynq-overlay_1.0.bb | 45 +++++++++ 15 files changed, 409 insertions(+) create mode 100644 meta-xilinx-pynq/COPYING.MIT create mode 100644 meta-xilinx-pynq/README.md create mode 100644 meta-xilinx-pynq/classes/xilinx-pynq.bbclass create mode 100644 meta-xilinx-pynq/conf/layer.conf create mode 100644 meta-xilinx-pynq/recipes-devtool/python/python-pynq.inc create mode 100644 meta-xilinx-pynq/recipes-devtool/python/python3-pynq/pl_server_init create mode 100644 meta-xilinx-pynq/recipes-devtool/python/python3-pynq_2.4.bb create mode 100644 meta-xilinx-pynq/recipes-support/libcma/libcma_1.0.bb create mode 100644 meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/LICENSE create mode 100644 meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/generic-uio.conf create mode 100644 meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynq.dtsi create mode 100644 meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynq_symbols.dtsi create mode 100644 meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynqmp.dtsi create mode 100644 meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynqmp_symbols.dtsi create mode 100644 meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay_1.0.bb (limited to 'meta-xilinx-pynq') diff --git a/meta-xilinx-pynq/COPYING.MIT b/meta-xilinx-pynq/COPYING.MIT new file mode 100644 index 00000000..89de3547 --- /dev/null +++ b/meta-xilinx-pynq/COPYING.MIT @@ -0,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/meta-xilinx-pynq/README.md b/meta-xilinx-pynq/README.md new file mode 100644 index 00000000..99e388fa --- /dev/null +++ b/meta-xilinx-pynq/README.md @@ -0,0 +1,30 @@ +# meta-xilinx-pynq + +================================ + +Introduction +------------------------- + +This layer collects recipes required to build and run PYNQ based examples using jupyter-notebooks on yocto + +Maintainers, Patches/Submissions, Community +=========================================== +Please open pull requests for any changes. + +Maintainers: + + Manjukumar Harthikote Matha (manjukumar.harthikote-matha@xilinx.com) + + Peter Ogden (ogden@xilinx.com) + + Sai Hari Chandana Kalluri (chandana.kalluri@xilinx.com) + + +Layer dependencies +===================== + +URI: git://git.openembedded.org/bitbake + +URI: git://git.openembedded.org/openembedded-core + +URI: git://git.openembedded.org/meta-openembedded diff --git a/meta-xilinx-pynq/classes/xilinx-pynq.bbclass b/meta-xilinx-pynq/classes/xilinx-pynq.bbclass new file mode 100644 index 00000000..a571f150 --- /dev/null +++ b/meta-xilinx-pynq/classes/xilinx-pynq.bbclass @@ -0,0 +1,17 @@ +PYNQ_NOTEBOOK_DIR ?= "${datadir}/notebooks" + +PYNQ_ARCH_arm = "armv7l" +PYNQ_ARCH_aarch64 = "aarch64" + +CMA_ARCH_arm = "32" +CMA_ARCH_aarch64 = "64" + +PYNQ_BUILD_ARCH="${PYNQ_ARCH_${TARGET_ARCH}}" +PYNQ_BUILD_ROOT="${STAGING_DIR_TARGET}" +BBCLASSEXTEND = "native nativesdk" + +FILES_${PN}-notebooks += "${PYNQ_NOTEBOOK_DIR}" +PACKAGES += "${PN}-notebooks" + +# Used for setup.py on PYNQ +BOARD_NAME_ultra96-zynqmp = "Ultra96" diff --git a/meta-xilinx-pynq/conf/layer.conf b/meta-xilinx-pynq/conf/layer.conf new file mode 100644 index 00000000..045897e3 --- /dev/null +++ b/meta-xilinx-pynq/conf/layer.conf @@ -0,0 +1,15 @@ +# We have a conf and classes directory, add to BBPATH +BBPATH .= ":${LAYERDIR}" + +# We have a packages directory, add to BBFILES +BBFILES += "${LAYERDIR}/recipes-*/*/*.bb" +BBFILES += "${LAYERDIR}/recipes-*/*/*.bbappend" + +BBFILE_COLLECTIONS += "xilinx-pynq" +BBFILE_PATTERN_xilinx-pynq = "^${LAYERDIR}/" +BBFILE_PRIORITY_xilinx-pynq = "5" + +LAYERDEPENDS_xilinx-pynq = "core xilinx" + +LAYERSERIES_COMPAT_xilinx-pynq = "zeus" + diff --git a/meta-xilinx-pynq/recipes-devtool/python/python-pynq.inc b/meta-xilinx-pynq/recipes-devtool/python/python-pynq.inc new file mode 100644 index 00000000..fa717f45 --- /dev/null +++ b/meta-xilinx-pynq/recipes-devtool/python/python-pynq.inc @@ -0,0 +1,53 @@ +SUMMARY = "Xilinx PYNQ Library" +HOMEPAGE = "http://pynq.io" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b42e39ad2ddbad7e8ad47f3eee6feff5" + +RDEPENDS_${PN} += "\ + ${PYTHON_PN}-core \ + ${PYTHON_PN}-asyncio \ + ${PYTHON_PN}-cffi \ + ${PYTHON_PN}-json \ + ${PYTHON_PN}-math \ + ${PYTHON_PN}-mmap \ + ${PYTHON_PN}-multiprocessing \ + ${PYTHON_PN}-numpy \ + ${PYTHON_PN}-pycparser \ + ${PYTHON_PN}-resource \ + ${PYTHON_PN}-setuptools \ + ${PYTHON_PN}-threading \ + ${PYTHON_PN}-xml \ + lmsensors-libsensors \ + libdrm \ + libcma \ + pynq-overlay \ + " + +inherit update-rc.d xilinx-pynq + +DEPENDS += " libdrm boost libcma" + +PYNQBRANCH ?= "image_v2.4" +SRCBRANCHARG = "${@['nobranch=1', 'branch=${PYNQBRANCH}'][d.getVar('PYNQBRANCH', True) != '']}" +PYNQURI ?= "git://github.com/Xilinx/PYNQ.git;protocol=https" + +SRC_URI = "${PYNQURI};${SRCBRANCHARG} \ + file://pl_server_init \ + " +SRCREV ?= "3d659d374701b7c34fa702e7aa23f71f9113f826" + +FILESEXTRAPATHS_prepend := "${THISDIR}:" +S = "${WORKDIR}/git" + +INSANE_SKIP_${PN} = "staticdev" + +INITSCRIPT_PACKAGES = "${PN}" +INITSCRIPT_NAME = "pl_server_init" +INITSCRIPT_PARAMS = "start 99 S ." + +do_install_append() { + install -d ${D}${INIT_D_DIR} + install -m 755 ${WORKDIR}/pl_server_init ${D}${INIT_D_DIR}/pl_server_init +} + +FILES_${PN} += " ${INIT_D_DIR}/pl_server_init " diff --git a/meta-xilinx-pynq/recipes-devtool/python/python3-pynq/pl_server_init b/meta-xilinx-pynq/recipes-devtool/python/python3-pynq/pl_server_init new file mode 100644 index 00000000..8b13ae1f --- /dev/null +++ b/meta-xilinx-pynq/recipes-devtool/python/python3-pynq/pl_server_init @@ -0,0 +1,109 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start daemon at boot time +# Description: Enable service provided by daemon. +### END INIT INFO + +dir="" +cmd="start_pl_server.py" +user="" + +name="pl_server" +pid_file="/var/run/$name.pid" +stdout_log="/var/log/$name.log" +stderr_log="/var/log/$name.err" + +get_pid() { + cat "$pid_file" +} + +is_running() { + [ -f "$pid_file" ] && (ps -o"pid" | grep '^ '`get_pid`'$') > /dev/null 2>&1 +} + +install_overlay() { +if [ ! -e '/sys/kernel/config/device-tree/overlays/pynq' ]; then + modprobe uio_pdrv_genirq + if [ ! -e /proc/device-tree/__symbols__ ]; then + mkdir /sys/kernel/config/device-tree/overlays/pynq-symbols + cat /lib/firmware/pynq-symbols.dtbo > /sys/kernel/config/device-tree/overlays/pynq-symbols/dtbo + fi + mkdir /sys/kernel/config/device-tree/overlays/pynq + cat /lib/firmware/pynq.dtbo > /sys/kernel/config/device-tree/overlays/pynq/dtbo +fi +} + +case "$1" in + start) + if is_running; then + echo "Already started" + else + echo "Starting $name" + cd "$dir" + install_overlay + $cmd >> "$stdout_log" 2>> "$stderr_log" & + echo $! > "$pid_file" + if ! is_running; then + echo "Unable to start, see $stdout_log and $stderr_log" + exit 1 + fi + fi + ;; + stop) + if is_running; then + echo -n "Stopping $name.." + kill `get_pid` + for i in 1 2 3 4 5 6 7 8 9 10 + # for i in `seq 10` + do + if ! is_running; then + break + fi + + echo -n "." + sleep 1 + done + echo + + if is_running; then + echo "Not stopped; may still be shutting down or shutdown may have failed" + exit 1 + else + echo "Stopped" + if [ -f "$pid_file" ]; then + rm "$pid_file" + fi + fi + else + echo "Not running" + fi + ;; + restart) + $0 stop + if is_running; then + echo "Unable to stop, will not attempt to start" + exit 1 + fi + $0 start + ;; + status) + if is_running; then + echo "Running" + else + echo "Stopped" + exit 1 + fi + ;; + *) + echo "Usage: $0 {start|stop|restart|status}" + exit 1 + ;; +esac + +exit 0 + diff --git a/meta-xilinx-pynq/recipes-devtool/python/python3-pynq_2.4.bb b/meta-xilinx-pynq/recipes-devtool/python/python3-pynq_2.4.bb new file mode 100644 index 00000000..5a904c8f --- /dev/null +++ b/meta-xilinx-pynq/recipes-devtool/python/python3-pynq_2.4.bb @@ -0,0 +1,3 @@ +inherit pypi setuptools3 +require python-pynq.inc + diff --git a/meta-xilinx-pynq/recipes-support/libcma/libcma_1.0.bb b/meta-xilinx-pynq/recipes-support/libcma/libcma_1.0.bb new file mode 100644 index 00000000..44857256 --- /dev/null +++ b/meta-xilinx-pynq/recipes-support/libcma/libcma_1.0.bb @@ -0,0 +1,33 @@ +SUMMARY = "Recompile libcma against pynqlib c" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b42e39ad2ddbad7e8ad47f3eee6feff5" + +CMA_ARCH_arm = "32" +CMA_ARCH_aarch64 = "64" + +PYNQBRANCH ?= "image_v2.4" +SRCBRANCHARG = "${@['nobranch=1', 'branch=${PYNQBRANCH}'][d.getVar('PYNQBRANCH', True) != '']}" +PYNQURI ?= "git://github.com/Xilinx/PYNQ.git;protocol=https" + +SRC_URI ?= "${PYNQURI};${SRCBRANCHARG}" + +SRCREV ?= "3d659d374701b7c34fa702e7aa23f71f9113f826" + +S="${WORKDIR}/git" + +CMA_ARCH_arm = "32" +CMA_ARCH_aarch64 = "64" + +do_install() { + + install -d ${D}/usr/lib/ + install -d ${D}/usr/include/ + + cd ${S}/sdbuild/packages/libsds/libcma + CMA_ARCH=${CMA_ARCH_${TARGET_ARCH}} make install DESTDIR=${D} +} + +SOLIBS = ".so" +FILES_SOLIBSDEV = "" +FILES_${PN} += "/usr/lib/libcma.so /usr/include" + diff --git a/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/LICENSE b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/LICENSE new file mode 100644 index 00000000..e1e09ab5 --- /dev/null +++ b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/LICENSE @@ -0,0 +1,23 @@ +#******************************************************************************* +# +# Copyright (C) 2019 Xilinx, Inc. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +# ****************************************************************************** diff --git a/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/generic-uio.conf b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/generic-uio.conf new file mode 100644 index 00000000..84d06c84 --- /dev/null +++ b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/generic-uio.conf @@ -0,0 +1 @@ +options uio_pdrv_genirq of_id=generic-uio diff --git a/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynq.dtsi b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynq.dtsi new file mode 100644 index 00000000..8c20cdd5 --- /dev/null +++ b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynq.dtsi @@ -0,0 +1,16 @@ +/dts-v1/; +/plugin/; + +&{/amba} { + xlnk { + compatible = "xlnx,xlnk-1.0"; + }; + fabric@40000000 { + compatible = "generic-uio"; + reg = <0x40001000 0x1000>; + status = "okay"; + interrupt-parent = <&intc>; + interrupts = <0 0x1d 4>; + }; + +}; diff --git a/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynq_symbols.dtsi b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynq_symbols.dtsi new file mode 100644 index 00000000..69cbdb65 --- /dev/null +++ b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynq_symbols.dtsi @@ -0,0 +1,15 @@ +/dts-v1/; +/plugin/; + +/ { + + fragment@0 { + target-path = "/"; + __overlay__ { + __symbols__ { + intc = "/amba/interrupt-controller@f8f01000"; + }; + }; + }; + +}; diff --git a/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynqmp.dtsi b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynqmp.dtsi new file mode 100644 index 00000000..4c389dae --- /dev/null +++ b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynqmp.dtsi @@ -0,0 +1,17 @@ +/dts-v1/; +/plugin/; + +&{/amba} { + xlnk { + compatible = "xlnx,xlnk-1.0"; + }; + fabric@A0000000 { + compatible = "generic-uio"; + reg = <0x0 0xA0001000 0x0 0x1000>; + status = "okay"; + interrupt-parent = <&gic>; + interrupts = <0 89 4>; + }; + +}; + diff --git a/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynqmp_symbols.dtsi b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynqmp_symbols.dtsi new file mode 100644 index 00000000..2e8ea882 --- /dev/null +++ b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay/pynq_zynqmp_symbols.dtsi @@ -0,0 +1,15 @@ +/dts-v1/; +/plugin/; + +/ { + + fragment@0 { + target-path = "/"; + __overlay__ { + __symbols__ { + gic = "/amba_apu@0/interrupt-controller@f9010000"; + }; + }; + }; + +}; diff --git a/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay_1.0.bb b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay_1.0.bb new file mode 100644 index 00000000..fb8d7012 --- /dev/null +++ b/meta-xilinx-pynq/recipes-support/pynq-overlay/pynq-overlay_1.0.bb @@ -0,0 +1,45 @@ +SUMMARY = "Xilinx PYNQ overlay" +HOMEPAGE = "http://pynq.io" +LICENSE = "Proprietary" +LIC_FILES_CHKSUM = "file://LICENSE;beginline=1;endline=23;md5=04c57e41ad93d4d6b6ca3d766372b0fa" + +DEPENDS += "dtc-native" + +SRC_URI = " \ + file://pynq_zynqmp.dtsi \ + file://pynq_zynq.dtsi \ + file://pynq_zynqmp_symbols.dtsi \ + file://pynq_zynq_symbols.dtsi \ + file://generic-uio.conf \ + file://LICENSE \ + " + +S="${WORKDIR}" + +PYNQ_DTSI ??= "pynq_zynqmp.dtsi" +PYNQ_DTSI_zynqmp ?= "pynq_zynqmp.dtsi" +PYNQ_DTSI_zynq ?= "pynq_zynq.dtsi" +PYNQ_SYMBOL_DTSI_zynqmp ?= "pynq_zynqmp_symbols.dtsi" +PYNQ_SYMBOL_DTSI_zynq ?= "pynq_zynq_symbols.dtsi" +PYNQ_DTBO ?= "pynq.dtbo" +PYNQ_SYMBOL_DTBO ?= "pynq-symbols.dtbo" + +do_compile() { + + dtc -I dts -O dtb -@ ${WORKDIR}/${PYNQ_DTSI} -o ${S}/${PYNQ_DTBO} + dtc -I dts -O dtb -@ ${WORKDIR}/${PYNQ_SYMBOL_DTSI} -o ${S}/${PYNQ_SYMBOL_DTBO} +} + + +do_install() { + + install -d ${D}/lib/firmware + install -m 755 ${S}/${PYNQ_DTBO} ${D}/lib/firmware/${PYNQ_DTBO} + install -m 755 ${S}/${PYNQ_SYMBOL_DTBO} ${D}/lib/firmware/${PYNQ_SYMBOL_DTBO} + + install -d ${D}/etc/modprobe.d + install -m 644 ${WORKDIR}/generic-uio.conf ${D}${sysconfdir}/modprobe.d/generic-uio.conf + +} + +FILES_${PN} += "/lib/firmware/pynq.dtbo /lib/firmware/pynq-symbols.dtbo ${sysconfdir}/modprobe.d/generic-uio.conf" -- cgit v1.2.3-54-g00ecf