Currently, OE is unable to use the linux kernel's built-in
support to generate a device tree blob (dtb). This is an
issue for device tree source (dts) files that need to be run
through CPP (dtsp).

The kernel build system has built-in support for device tree
source files that /include/ additional files and it also
supports the source file to be pre-processed using CPP.

This commits lets OE use kbuild if $KERNEL_DEVICETREE points
to file(s) that are located in arch/${ARCH}/boot/dts/, e.g.
KERNEL_DEVICETREE = "<machine>.dts". In this case, no
dependency is added on dtc-native, as that is not needed any
more.

The previous way of handling dts files, i.e. compilation via
the stand-alone dtc-native, is still supported - it is triggered
by specifying the full path to the dts file, as before, e.g.
KERNEL_DEVICETREE = "arch/${ARCH}/boot/dts/<machine>.dts"

Signed-off-by: André Draszik <[email protected]>
---
 meta/recipes-kernel/linux/linux-dtb.inc | 75 +++++++++++++++++++++++++++------
 1 file changed, 63 insertions(+), 12 deletions(-)

diff --git a/meta/recipes-kernel/linux/linux-dtb.inc 
b/meta/recipes-kernel/linux/linux-dtb.inc
index 7747718..75b8b76 100644
--- a/meta/recipes-kernel/linux/linux-dtb.inc
+++ b/meta/recipes-kernel/linux/linux-dtb.inc
@@ -1,28 +1,66 @@
+inherit kernel-arch
+
 # Support for device tree generation
 FILES_kernel-devicetree = "/boot/devicetree*"
 KERNEL_DEVICETREE_FLAGS ?= "-R 8 -p 0x3000"
 
 python __anonymous () {
+    from os import path
+
     devicetree = d.getVar("KERNEL_DEVICETREE", True) or ''
     if devicetree:
-        depends = d.getVar("DEPENDS", True)
-        d.setVar("DEPENDS", "%s dtc-native" % depends)
+        S = d.getVar("S", True)
+        for DTS_FILE in devicetree.split():
+            DTS_FILE = S + "/" + DTS_FILE
+            if os.path.exists(DTS_FILE):
+                # full path given, use dtc-native
+                print "old style KERNEL_DEVICETREE, adding depend on 
dtc-native"
+                depends = d.getVar("DEPENDS", True)
+                d.setVar("DEPENDS", "%s dtc-native" % depends)
+            else:
+                # new style - it's just a file name, under 
arch/${ARCH}/boot/dts
+                # we don't need dtc-native, as we use the kernel's compiler
+                print "new style KERNEL_DEVICETREE"
         packages = d.getVar("PACKAGES", True)
         d.setVar("PACKAGES", "%s kernel-devicetree" % packages)
 }
 
-do_install_append() {
+do_compile_append() {
        if test -n "${KERNEL_DEVICETREE}"; then
                for DTS_FILE in ${KERNEL_DEVICETREE}; do
                        if [ ! -f ${DTS_FILE} ]; then
-                               echo "Warning: ${DTS_FILE} is not available!"
-                               continue
+                               if [ ! -f arch/${ARCH}/boot/dts/${DTS_FILE} ]; 
then
+                                       echo "Warning: ${DTS_FILE} is not 
available!"
+                                       continue
+                               fi
+
+                               # standard build using kbuild
+                               echo "Info: standard kbuild for device tree 
blob"
+                               DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F 
"." '{print $1}'`
+
+                               unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
+                               oe_runmake ${DTS_BASE_NAME}.dtb 
CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS}
                        fi
+               done
+       fi
+}
+
+do_install_append() {
+       if test -n "${KERNEL_DEVICETREE}"; then
+               for DTS_FILE in ${KERNEL_DEVICETREE}; do
                        DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." 
'{print $1}'`
-                       DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed 
"s/${MACHINE}/${DTS_BASE_NAME}/g"`
                        DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | 
sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
-                       dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o 
${DTS_BASE_NAME} ${DTS_FILE}
-                       install -m 0644 ${DTS_BASE_NAME} 
${D}/boot/devicetree-${DTB_SYMLINK_NAME}.dtb
+                       if [ ! -f ${DTS_FILE} ]; then
+                               if [ ! -f arch/${ARCH}/boot/dts/${DTS_FILE} ]; 
then
+                                       echo "Warning: ${DTS_FILE} is not 
available!"
+                                       continue
+                               fi
+
+                               install -m 0644 
arch/${ARCH}/boot/${DTS_BASE_NAME}.dtb 
${D}/boot/devicetree-${DTB_SYMLINK_NAME}.dtb
+                               continue
+                       fi
+                       dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o 
${DTS_BASE_NAME}.dtb ${DTS_FILE}
+                       install -m 0644 ${DTS_BASE_NAME}.dtb 
${D}/boot/devicetree-${DTB_SYMLINK_NAME}.dtb
                done
        fi
 }
@@ -30,15 +68,28 @@ do_install_append() {
 do_deploy_append() {
        if test -n "${KERNEL_DEVICETREE}"; then
                for DTS_FILE in ${KERNEL_DEVICETREE}; do
+                       DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." 
'{print $1}'`
                        if [ ! -f ${DTS_FILE} ]; then
-                               echo "Warning: ${DTS_FILE} is not available!"
-                               continue
+                               if [ ! -f arch/${ARCH}/boot/dts/${DTS_FILE} ]; 
then
+                                       echo "Warning: ${DTS_FILE} is not 
available!"
+                                       continue
+                               fi
+
+                               # standard build using kbuild
+                               echo "Info: standard kbuild for device tree 
blob"
                        fi
-                       DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." 
'{print $1}'`
+
                        DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed 
"s/${MACHINE}/${DTS_BASE_NAME}/g"`
                        DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | 
sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
+
                        install -d ${DEPLOYDIR}
-                       install -m 0644 ${B}/${DTS_BASE_NAME} 
${DEPLOYDIR}/${DTB_NAME}.dtb
+
+                       if [ -f arch/${ARCH}/boot/dts/${DTS_FILE} ]; then
+                               install -m 0644 
${B}/arch/${ARCH}/boot/${DTS_BASE_NAME}.dtb ${DEPLOYDIR}/${DTB_NAME}.dtb
+                       else
+                               install -m 0644 ${B}/${DTS_BASE_NAME}.dtb 
${DEPLOYDIR}/${DTB_NAME}.dtb
+                       fi
+
                        cd ${DEPLOYDIR}
                        ln -sf ${DTB_NAME}.dtb ${DTB_SYMLINK_NAME}.dtb
                        cd -
-- 
1.8.2

_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to