Patchwork [v2] linux-dtb: Use kernel build system to generate the dtb files

login
register
mail settings
Submitter Otavio Salvador
Date Aug. 13, 2013, 1:52 p.m.
Message ID <1376401955-5676-1-git-send-email-otavio@ossystems.com.br>
Download mbox | patch
Permalink /patch/55541/
State Accepted
Commit 72980d5bb465f0640ed451d1ebb9c5d2a210ad0c
Headers show

Comments

Otavio Salvador - Aug. 13, 2013, 1:52 p.m.
As the Linux kernel, unconditionally, builds the dtc application and
it is the compatible version with the DeviceTree files shipped within
the kernel it is better to use it and the kernel build system to
generate the dtb files.

Some DeviceTree files rely on CPP and kernel headers to be able to
generate the dtb binary contents and it is harder to replicate it
outside of Linux kernel build system so we /use/ it.

To comply with these assumptions we need to use the dtb file when
calling 'make' instead of pointing to the DeviceTree source file; the
code has been made backward compatible but it is advised to move to
the new definition to avoid warnings as:

,----[ Original definition ]
| KERNEL_DEVICETREE = "${S}/arch/arm/boot/dts/imx6q-sabresd.dts"
`----

Becomes:

,----[ New definition ]
| KERNEL_DEVICETREE = "imx6q-sabresd.dtb"
`----


Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
Changes in v2:
- Drop debug warning left by mistake
- Improve bbwarn message (Bruce Ashfield)
- Improve commit log (Bruce Ascfield)

 meta/recipes-kernel/linux/linux-dtb.inc | 58 +++++++++++++++------------------
 1 file changed, 26 insertions(+), 32 deletions(-)
Bruce Ashfield - Aug. 13, 2013, 6:36 p.m.
On 13-08-13 09:52 AM, Otavio Salvador wrote:
> As the Linux kernel, unconditionally, builds the dtc application and
> it is the compatible version with the DeviceTree files shipped within
> the kernel it is better to use it and the kernel build system to
> generate the dtb files.
>
> Some DeviceTree files rely on CPP and kernel headers to be able to
> generate the dtb binary contents and it is harder to replicate it
> outside of Linux kernel build system so we /use/ it.
>
> To comply with these assumptions we need to use the dtb file when
> calling 'make' instead of pointing to the DeviceTree source file; the
> code has been made backward compatible but it is advised to move to
> the new definition to avoid warnings as:
>
> ,----[ Original definition ]
> | KERNEL_DEVICETREE = "${S}/arch/arm/boot/dts/imx6q-sabresd.dts"
> `----
>
> Becomes:
>
> ,----[ New definition ]
> | KERNEL_DEVICETREE = "imx6q-sabresd.dtb"
> `----
>
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>

This passed a build test on the yocto reference mpc8315e-rdb, so at
least in a simple case, it worked for me.

Acked-by: Bruce Ashfield <bruce.ashfield@windriver.com>

> ---
> Changes in v2:
> - Drop debug warning left by mistake
> - Improve bbwarn message (Bruce Ashfield)
> - Improve commit log (Bruce Ascfield)
>
>   meta/recipes-kernel/linux/linux-dtb.inc | 58 +++++++++++++++------------------
>   1 file changed, 26 insertions(+), 32 deletions(-)
>
> diff --git a/meta/recipes-kernel/linux/linux-dtb.inc b/meta/recipes-kernel/linux/linux-dtb.inc
> index 41dd599..cebc76a 100644
> --- a/meta/recipes-kernel/linux/linux-dtb.inc
> +++ b/meta/recipes-kernel/linux/linux-dtb.inc
> @@ -1,44 +1,38 @@
>   # Support for device tree generation
>   FILES_kernel-devicetree = "/${KERNEL_IMAGEDEST}/devicetree*"
> -KERNEL_DEVICETREE_FLAGS ?= "-R 8 -p 0x3000"
>
>   python __anonymous () {
> -    devicetree = d.getVar("KERNEL_DEVICETREE", True) or ''
> -    if devicetree:
> -        depends = d.getVar("DEPENDS", True)
> -        d.setVar("DEPENDS", "%s dtc-native" % depends)
> -        packages = d.getVar("PACKAGES", True)
> -        d.setVar("PACKAGES", "%s kernel-devicetree" % packages)
> +    d.appendVar("PACKAGES", " kernel-devicetree")
>   }
>
>   do_install_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
> +		for DTB in ${KERNEL_DEVICETREE}; do
> +			if echo ${DTB} | grep -q '/dts/'; then
> +				bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
> +				DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>   			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"`
> -			dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o ${DTS_BASE_NAME} ${DTS_FILE}
> -			install -m 0644 ${DTS_BASE_NAME} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb
> +			DTB_BASE_NAME=`basename ${DTB} .dtb`
> +			DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			oe_runmake ${DTB}
> +			install -m 0644 ${B}/arch/${ARCH}/boot/${DTB} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb
>   		done
>   	fi
>   }
>
>   do_deploy_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
> +		for DTB in ${KERNEL_DEVICETREE}; do
> +			if echo ${DTB} | grep -q '/dts/'; then
> +				bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
> +				DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>   			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"`
> +			DTB_BASE_NAME=`basename ${DTB} .dtb`
> +			DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
>   			install -d ${DEPLOYDIR}
> -			install -m 0644 ${B}/${DTS_BASE_NAME} ${DEPLOYDIR}/${DTB_NAME}.dtb
> +			install -m 0644 ${B}/arch/${ARCH}/boot/${DTB} ${DEPLOYDIR}/${DTB_NAME}.dtb
>   			cd ${DEPLOYDIR}
>   			ln -sf ${DTB_NAME}.dtb ${DTB_SYMLINK_NAME}.dtb
>   			cd -
> @@ -48,20 +42,20 @@ do_deploy_append() {
>
>   pkg_postinst_kernel-devicetree () {
>   	cd /${KERNEL_IMAGEDEST}
> -	for DTS_FILE in ${KERNEL_DEVICETREE}
> +	for DTB_FILE in ${KERNEL_DEVICETREE}
>   	do
> -		DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> -		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> -		update-alternatives --install /${KERNEL_IMAGEDEST}/${DTS_BASE_NAME}.dtb ${DTS_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
> +		DTB_BASE_NAME=`basename ${DTB_FILE} | awk -F "." '{print $1}'`
> +		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +		update-alternatives --install /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
>   	done
>   }
>
>   pkg_postrm_kernel-devicetree () {
>   	cd /${KERNEL_IMAGEDEST}
> -	for DTS_FILE in ${KERNEL_DEVICETREE}
> +	for DTB_FILE in ${KERNEL_DEVICETREE}
>   	do
> -		DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> -		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> -		update-alternatives --remove ${DTS_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
> +		DTB_BASE_NAME=`basename ${DTB_FILE} | awk -F "." '{print $1}'`
> +		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +		update-alternatives --remove ${DTB_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
>   	done
>   }
>
André Draszik - Aug. 14, 2013, 7:32 a.m.
Hi,

Can this please be pushed to dylan as well, please. It's a useful
change, and I then could remove my version of that patch from our
layer :-)


Cheers,
Andre'

On Tue, 2013-08-13 at 10:52 -0300, Otavio Salvador wrote:
> As the Linux kernel, unconditionally, builds the dtc application and
> it is the compatible version with the DeviceTree files shipped within
> the kernel it is better to use it and the kernel build system to
> generate the dtb files.
> 
> Some DeviceTree files rely on CPP and kernel headers to be able to
> generate the dtb binary contents and it is harder to replicate it
> outside of Linux kernel build system so we /use/ it.
> 
> To comply with these assumptions we need to use the dtb file when
> calling 'make' instead of pointing to the DeviceTree source file; the
> code has been made backward compatible but it is advised to move to
> the new definition to avoid warnings as:
> 
> ,----[ Original definition ]
> | KERNEL_DEVICETREE = "${S}/arch/arm/boot/dts/imx6q-sabresd.dts"
> `----
> 
> Becomes:
> 
> ,----[ New definition ]
> | KERNEL_DEVICETREE = "imx6q-sabresd.dtb"
> `----
> 
> 
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
> Changes in v2:
> - Drop debug warning left by mistake
> - Improve bbwarn message (Bruce Ashfield)
> - Improve commit log (Bruce Ascfield)
> 
>  meta/recipes-kernel/linux/linux-dtb.inc | 58 +++++++++++++++------------------
>  1 file changed, 26 insertions(+), 32 deletions(-)
> 
> diff --git a/meta/recipes-kernel/linux/linux-dtb.inc b/meta/recipes-kernel/linux/linux-dtb.inc
> index 41dd599..cebc76a 100644
> --- a/meta/recipes-kernel/linux/linux-dtb.inc
> +++ b/meta/recipes-kernel/linux/linux-dtb.inc
> @@ -1,44 +1,38 @@
>  # Support for device tree generation
>  FILES_kernel-devicetree = "/${KERNEL_IMAGEDEST}/devicetree*"
> -KERNEL_DEVICETREE_FLAGS ?= "-R 8 -p 0x3000"
>  
>  python __anonymous () {
> -    devicetree = d.getVar("KERNEL_DEVICETREE", True) or ''
> -    if devicetree:
> -        depends = d.getVar("DEPENDS", True)
> -        d.setVar("DEPENDS", "%s dtc-native" % depends)
> -        packages = d.getVar("PACKAGES", True)
> -        d.setVar("PACKAGES", "%s kernel-devicetree" % packages)
> +    d.appendVar("PACKAGES", " kernel-devicetree")
>  }
>  
>  do_install_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
> +		for DTB in ${KERNEL_DEVICETREE}; do
> +			if echo ${DTB} | grep -q '/dts/'; then
> +				bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
> +				DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>  			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"`
> -			dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o ${DTS_BASE_NAME} ${DTS_FILE}
> -			install -m 0644 ${DTS_BASE_NAME} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb
> +			DTB_BASE_NAME=`basename ${DTB} .dtb`
> +			DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			oe_runmake ${DTB}
> +			install -m 0644 ${B}/arch/${ARCH}/boot/${DTB} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb
>  		done
>  	fi
>  }
>  
>  do_deploy_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
> +		for DTB in ${KERNEL_DEVICETREE}; do
> +			if echo ${DTB} | grep -q '/dts/'; then
> +				bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
> +				DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>  			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"`
> +			DTB_BASE_NAME=`basename ${DTB} .dtb`
> +			DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
>  			install -d ${DEPLOYDIR}
> -			install -m 0644 ${B}/${DTS_BASE_NAME} ${DEPLOYDIR}/${DTB_NAME}.dtb
> +			install -m 0644 ${B}/arch/${ARCH}/boot/${DTB} ${DEPLOYDIR}/${DTB_NAME}.dtb
>  			cd ${DEPLOYDIR}
>  			ln -sf ${DTB_NAME}.dtb ${DTB_SYMLINK_NAME}.dtb
>  			cd -
> @@ -48,20 +42,20 @@ do_deploy_append() {
>  
>  pkg_postinst_kernel-devicetree () {
>  	cd /${KERNEL_IMAGEDEST}
> -	for DTS_FILE in ${KERNEL_DEVICETREE}
> +	for DTB_FILE in ${KERNEL_DEVICETREE}
>  	do
> -		DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> -		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> -		update-alternatives --install /${KERNEL_IMAGEDEST}/${DTS_BASE_NAME}.dtb ${DTS_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
> +		DTB_BASE_NAME=`basename ${DTB_FILE} | awk -F "." '{print $1}'`
> +		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +		update-alternatives --install /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
>  	done
>  }
>  
>  pkg_postrm_kernel-devicetree () {
>  	cd /${KERNEL_IMAGEDEST}
> -	for DTS_FILE in ${KERNEL_DEVICETREE}
> +	for DTB_FILE in ${KERNEL_DEVICETREE}
>  	do
> -		DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> -		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> -		update-alternatives --remove ${DTS_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
> +		DTB_BASE_NAME=`basename ${DTB_FILE} | awk -F "." '{print $1}'`
> +		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +		update-alternatives --remove ${DTB_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
>  	done
>  }
mike.looijmans@topic.nl - Aug. 14, 2013, 2:17 p.m.
?
On 08/13/2013 03:52 PM, Otavio Salvador wrote:
> As the Linux kernel, unconditionally, builds the dtc application and
> it is the compatible version with the DeviceTree files shipped within
> the kernel it is better to use it and the kernel build system to
> generate the dtb files.
>
> Some DeviceTree files rely on CPP and kernel headers to be able to
> generate the dtb binary contents and it is harder to replicate it
> outside of Linux kernel build system so we /use/ it.
>
> To comply with these assumptions we need to use the dtb file when
> calling 'make' instead of pointing to the DeviceTree source file; the
> code has been made backward compatible but it is advised to move to
> the new definition to avoid warnings as:
>
> ,----[ Original definition ]
> | KERNEL_DEVICETREE = "${S}/arch/arm/boot/dts/imx6q-sabresd.dts"
> `----
>
> Becomes:
>
> ,----[ New definition ]
> | KERNEL_DEVICETREE = "imx6q-sabresd.dtb"
> `----

I currently have a "bbappend" that adds a DTB file from outside the 
kernel (listing driver configuration that is implemented in the FPGA 
part of the SOC). The DTB file /include/s files from the kernel (that 
is, it gets everything from the standard files and adds a single device).

How would I go about adding this after this change?

(as for the change itself, I'm all in favor)

Mike.


Met vriendelijke groet / kind regards,

Mike Looijmans

TOPIC Embedded Systems
Eindhovenseweg 32-C, NL-5683 KH Best
Postbus 440, NL-5680 AK Best
Telefoon: (+31) – (0)499 - 33.69.79
Telefax: (+31) - (0)499 - 33.69.70
E-mail: mike.looijmans@topic.nl
Website: www.topic.nl

Dit e-mail bericht en de eventueel daarbij behorende bijlagen zijn uitsluitend bestemd voor de geadresseerde, zoals die blijkt uit het e-mail bericht en/of de bijlagen. Er kunnen gegevens met betrekking tot een derde instaan. Indien u als niet-geadresseerde dit bericht en de bijlagen ontvangt, terwijl u niet bevoegd of gemachtigd bent om dit bericht namens de geadresseerde te ontvangen, wordt u verzocht de afzender hierover direct te informeren en het e-mail bericht met de bijlagen te vernietigen. Ieder gebruik van de inhoud van het e-mail bericht, waaronder de daarbij behorende bijlagen, door een ander dan de geadresseerde is onrechtmatig jegens ons dan wel de eventueel in het e-mail bericht of de bijlagen voorkomende andere personen. TOPIC Embedded Systems is niet aansprakelijk voor enigerlei schade voortvloeiend uit het gebruik en/of acceptatie van dit e-mail bericht of de daarbij behorende bijlagen.

The contents of this message, as well as any enclosures, are addressed personally to, and thus solely intended for the addressee. They may contain information regarding a third party. A recipient who is neither the addressee, nor empowered to receive this message on behalf of the addressee, is kindly requested to immediately inform the sender of receipt, and to destroy the message and the enclosures. Any use of the contents of this message and/or the enclosures by any other person than the addressee or person who is empowered to receive this message, is illegal towards the sender and/or the aforementioned third party. TOPIC Embedded Systems is not  liable for any damage as a result of the use and/or acceptance of this message and as well as any enclosures.
mike.looijmans@topic.nl - Aug. 14, 2013, 2:32 p.m.
?Now that the subject came up, maybe it's good to exchange some ideas here.

Building the DTB is one thing. But we have to get it on the target as well.

Currently, a bitbake virtual/kernel will also build one or more dtb 
files, and put them in the directory where the images will end up. It's 
up to the user to make it so that the blobs actually get programmed onto 
the target. Nothing wrong with that.

At some point, I thought it would be a good idea to be able to upgrade 
boards "in the field". So I added a postinstall script to the kernel to 
deploy in "/tmp/boot" instead of "/boot" and then make it write itself 
into the flash device or onto the FAT partition on the SD card, or 
whatever other method I came up with to load the kernel.

Now for the devicetree, I thought I could just include the 
"kernel-devicetree" package onto my system, add a bit of script, and 
that would allow me to have devices upgrade themselves.

The "kernel-devicetree" package contains multiple DTB files. I would 
expect a target to actually use only one, and that the various dtb files 
are intended for different targets. I think it would make sense to split 
that single package into a package for each DTB file. Then you can pick 
and choose which dtb you want on your target.

Another issue is that the kernel-devicetree package postinstall script 
calls "awk" and "update-alternatives". Those must therefore be present 
on the target, if you expect to be able to install or upgrade it. As far 
as I can see, the only reason for using these tools is to create a 
symbolic link. As far as I know, no other package provides a dtb file. 
So why is it registering itself as an alternative?

And I was just wondering, how do you guys handle upgrading kernel, 
bootloader and devicetree files?


Met vriendelijke groet / kind regards,

Mike Looijmans

TOPIC Embedded Systems
Eindhovenseweg 32-C, NL-5683 KH Best
Postbus 440, NL-5680 AK Best
Telefoon: (+31) – (0)499 - 33.69.79
Telefax: (+31) - (0)499 - 33.69.70
E-mail: mike.looijmans@topic.nl
Website: www.topic.nl

Dit e-mail bericht en de eventueel daarbij behorende bijlagen zijn uitsluitend bestemd voor de geadresseerde, zoals die blijkt uit het e-mail bericht en/of de bijlagen. Er kunnen gegevens met betrekking tot een derde instaan. Indien u als niet-geadresseerde dit bericht en de bijlagen ontvangt, terwijl u niet bevoegd of gemachtigd bent om dit bericht namens de geadresseerde te ontvangen, wordt u verzocht de afzender hierover direct te informeren en het e-mail bericht met de bijlagen te vernietigen. Ieder gebruik van de inhoud van het e-mail bericht, waaronder de daarbij behorende bijlagen, door een ander dan de geadresseerde is onrechtmatig jegens ons dan wel de eventueel in het e-mail bericht of de bijlagen voorkomende andere personen. TOPIC Embedded Systems is niet aansprakelijk voor enigerlei schade voortvloeiend uit het gebruik en/of acceptatie van dit e-mail bericht of de daarbij behorende bijlagen.

The contents of this message, as well as any enclosures, are addressed personally to, and thus solely intended for the addressee. They may contain information regarding a third party. A recipient who is neither the addressee, nor empowered to receive this message on behalf of the addressee, is kindly requested to immediately inform the sender of receipt, and to destroy the message and the enclosures. Any use of the contents of this message and/or the enclosures by any other person than the addressee or person who is empowered to receive this message, is illegal towards the sender and/or the aforementioned third party. TOPIC Embedded Systems is not  liable for any damage as a result of the use and/or acceptance of this message and as well as any enclosures.
Otavio Salvador - Aug. 15, 2013, 2:39 a.m.
On Wed, Aug 14, 2013 at 11:17 AM, Mike Looijmans
<mike.looijmans@topic.nl> wrote:
>
> On 08/13/2013 03:52 PM, Otavio Salvador wrote:
>>
>> As the Linux kernel, unconditionally, builds the dtc application and
>> it is the compatible version with the DeviceTree files shipped within
>> the kernel it is better to use it and the kernel build system to
>> generate the dtb files.
>>
>> Some DeviceTree files rely on CPP and kernel headers to be able to
>> generate the dtb binary contents and it is harder to replicate it
>> outside of Linux kernel build system so we /use/ it.
>>
>> To comply with these assumptions we need to use the dtb file when
>> calling 'make' instead of pointing to the DeviceTree source file; the
>> code has been made backward compatible but it is advised to move to
>> the new definition to avoid warnings as:
>>
>> ,----[ Original definition ]
>> | KERNEL_DEVICETREE = "${S}/arch/arm/boot/dts/imx6q-sabresd.dts"
>> `----
>>
>> Becomes:
>>
>> ,----[ New definition ]
>> | KERNEL_DEVICETREE = "imx6q-sabresd.dtb"
>> `----
>
>
> I currently have a "bbappend" that adds a DTB file from outside the kernel
> (listing driver configuration that is implemented in the FPGA part of the
> SOC). The DTB file /include/s files from the kernel (that is, it gets
> everything from the standard files and adds a single device).
>
> How would I go about adding this after this change?

Apply a patch?
mike.looijmans@topic.nl - Aug. 20, 2013, 9:55 a.m.
?I cannot get this to work, do_install fails because it cannot find the 
generated ".dtb" file.

See further in the message:

On 08/13/2013 03:52 PM, Otavio Salvador wrote:
> As the Linux kernel, unconditionally, builds the dtc application and
> it is the compatible version with the DeviceTree files shipped within
> the kernel it is better to use it and the kernel build system to
> generate the dtb files.
>
> Some DeviceTree files rely on CPP and kernel headers to be able to
> generate the dtb binary contents and it is harder to replicate it
> outside of Linux kernel build system so we /use/ it.
>
> To comply with these assumptions we need to use the dtb file when
> calling 'make' instead of pointing to the DeviceTree source file; the
> code has been made backward compatible but it is advised to move to
> the new definition to avoid warnings as:
>
> ,----[ Original definition ]
> | KERNEL_DEVICETREE = "${S}/arch/arm/boot/dts/imx6q-sabresd.dts"
> `----
>
> Becomes:
>
> ,----[ New definition ]
> | KERNEL_DEVICETREE = "imx6q-sabresd.dtb"
> `----
>
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
> Changes in v2:
> - Drop debug warning left by mistake
> - Improve bbwarn message (Bruce Ashfield)
> - Improve commit log (Bruce Ascfield)
>
>   meta/recipes-kernel/linux/linux-dtb.inc | 58 +++++++++++++++------------------
>   1 file changed, 26 insertions(+), 32 deletions(-)
>
> diff --git a/meta/recipes-kernel/linux/linux-dtb.inc b/meta/recipes-kernel/linux/linux-dtb.inc
> index 41dd599..cebc76a 100644
> --- a/meta/recipes-kernel/linux/linux-dtb.inc
> +++ b/meta/recipes-kernel/linux/linux-dtb.inc
> @@ -1,44 +1,38 @@
>   # Support for device tree generation
>   FILES_kernel-devicetree = "/${KERNEL_IMAGEDEST}/devicetree*"
> -KERNEL_DEVICETREE_FLAGS ?= "-R 8 -p 0x3000"
>
>   python __anonymous () {
> -    devicetree = d.getVar("KERNEL_DEVICETREE", True) or ''
> -    if devicetree:
> -        depends = d.getVar("DEPENDS", True)
> -        d.setVar("DEPENDS", "%s dtc-native" % depends)
> -        packages = d.getVar("PACKAGES", True)
> -        d.setVar("PACKAGES", "%s kernel-devicetree" % packages)
> +    d.appendVar("PACKAGES", " kernel-devicetree")
>   }
>
>   do_install_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
> +		for DTB in ${KERNEL_DEVICETREE}; do
> +			if echo ${DTB} | grep -q '/dts/'; then
> +				bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
> +				DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>   			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"`
> -			dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o ${DTS_BASE_NAME} ${DTS_FILE}
> -			install -m 0644 ${DTS_BASE_NAME} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb
> +			DTB_BASE_NAME=`basename ${DTB} .dtb`
> +			DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			oe_runmake ${DTB}
> +			install -m 0644 ${B}/arch/${ARCH}/boot/${DTB} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb

This fails now, because  ${B}/arch/${ARCH}/boot/${DTB} cannot be found. 
The dtb file is in the "dts" subdirectory, so should this line read:

+			install -m 0644 ${B}/arch/${ARCH}/boot/dts/${DTB} 
${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb

I wonder why this works on your system?


>   		done
>   	fi
>   }
>
>   do_deploy_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
> +		for DTB in ${KERNEL_DEVICETREE}; do
> +			if echo ${DTB} | grep -q '/dts/'; then
> +				bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
> +				DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>   			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"`
> +			DTB_BASE_NAME=`basename ${DTB} .dtb`
> +			DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +			DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
>   			install -d ${DEPLOYDIR}
> -			install -m 0644 ${B}/${DTS_BASE_NAME} ${DEPLOYDIR}/${DTB_NAME}.dtb
> +			install -m 0644 ${B}/arch/${ARCH}/boot/${DTB} ${DEPLOYDIR}/${DTB_NAME}.dtb
>   			cd ${DEPLOYDIR}
>   			ln -sf ${DTB_NAME}.dtb ${DTB_SYMLINK_NAME}.dtb
>   			cd -
> @@ -48,20 +42,20 @@ do_deploy_append() {
>
>   pkg_postinst_kernel-devicetree () {
>   	cd /${KERNEL_IMAGEDEST}
> -	for DTS_FILE in ${KERNEL_DEVICETREE}
> +	for DTB_FILE in ${KERNEL_DEVICETREE}
>   	do
> -		DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> -		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> -		update-alternatives --install /${KERNEL_IMAGEDEST}/${DTS_BASE_NAME}.dtb ${DTS_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
> +		DTB_BASE_NAME=`basename ${DTB_FILE} | awk -F "." '{print $1}'`
> +		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +		update-alternatives --install /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
>   	done
>   }
>
>   pkg_postrm_kernel-devicetree () {
>   	cd /${KERNEL_IMAGEDEST}
> -	for DTS_FILE in ${KERNEL_DEVICETREE}
> +	for DTB_FILE in ${KERNEL_DEVICETREE}
>   	do
> -		DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> -		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> -		update-alternatives --remove ${DTS_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
> +		DTB_BASE_NAME=`basename ${DTB_FILE} | awk -F "." '{print $1}'`
> +		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
> +		update-alternatives --remove ${DTB_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
>   	done
>   }
>



Met vriendelijke groet / kind regards,

Mike Looijmans

TOPIC Embedded Systems
Eindhovenseweg 32-C, NL-5683 KH Best
Postbus 440, NL-5680 AK Best
Telefoon: (+31) – (0)499 - 33.69.79
Telefax: (+31) - (0)499 - 33.69.70
E-mail: mike.looijmans@topic.nl
Website: www.topic.nl

Dit e-mail bericht en de eventueel daarbij behorende bijlagen zijn uitsluitend bestemd voor de geadresseerde, zoals die blijkt uit het e-mail bericht en/of de bijlagen. Er kunnen gegevens met betrekking tot een derde instaan. Indien u als niet-geadresseerde dit bericht en de bijlagen ontvangt, terwijl u niet bevoegd of gemachtigd bent om dit bericht namens de geadresseerde te ontvangen, wordt u verzocht de afzender hierover direct te informeren en het e-mail bericht met de bijlagen te vernietigen. Ieder gebruik van de inhoud van het e-mail bericht, waaronder de daarbij behorende bijlagen, door een ander dan de geadresseerde is onrechtmatig jegens ons dan wel de eventueel in het e-mail bericht of de bijlagen voorkomende andere personen. TOPIC Embedded Systems is niet aansprakelijk voor enigerlei schade voortvloeiend uit het gebruik en/of acceptatie van dit e-mail bericht of de daarbij behorende bijlagen.

The contents of this message, as well as any enclosures, are addressed personally to, and thus solely intended for the addressee. They may contain information regarding a third party. A recipient who is neither the addressee, nor empowered to receive this message on behalf of the addressee, is kindly requested to immediately inform the sender of receipt, and to destroy the message and the enclosures. Any use of the contents of this message and/or the enclosures by any other person than the addressee or person who is empowered to receive this message, is illegal towards the sender and/or the aforementioned third party. TOPIC Embedded Systems is not  liable for any damage as a result of the use and/or acceptance of this message and as well as any enclosures.
Otavio Salvador - Aug. 20, 2013, 12:02 p.m.
On Tue, Aug 20, 2013 at 6:55 AM, Mike Looijmans <mike.looijmans@topic.nl> wrote:
> I cannot get this to work, do_install fails because it cannot find the
> generated ".dtb" file.

Yes and I sent another patch, few days ago, to address this
regression. I think it is queued for merging.

http://patchwork.openembedded.org/patch/55951/

Patch

diff --git a/meta/recipes-kernel/linux/linux-dtb.inc b/meta/recipes-kernel/linux/linux-dtb.inc
index 41dd599..cebc76a 100644
--- a/meta/recipes-kernel/linux/linux-dtb.inc
+++ b/meta/recipes-kernel/linux/linux-dtb.inc
@@ -1,44 +1,38 @@ 
 # Support for device tree generation
 FILES_kernel-devicetree = "/${KERNEL_IMAGEDEST}/devicetree*"
-KERNEL_DEVICETREE_FLAGS ?= "-R 8 -p 0x3000"
 
 python __anonymous () {
-    devicetree = d.getVar("KERNEL_DEVICETREE", True) or ''
-    if devicetree:
-        depends = d.getVar("DEPENDS", True)
-        d.setVar("DEPENDS", "%s dtc-native" % depends)
-        packages = d.getVar("PACKAGES", True)
-        d.setVar("PACKAGES", "%s kernel-devicetree" % packages)
+    d.appendVar("PACKAGES", " kernel-devicetree")
 }
 
 do_install_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
+		for DTB in ${KERNEL_DEVICETREE}; do
+			if echo ${DTB} | grep -q '/dts/'; then
+				bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
+				DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
 			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"`
-			dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o ${DTS_BASE_NAME} ${DTS_FILE}
-			install -m 0644 ${DTS_BASE_NAME} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb
+			DTB_BASE_NAME=`basename ${DTB} .dtb`
+			DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
+			DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
+			oe_runmake ${DTB}
+			install -m 0644 ${B}/arch/${ARCH}/boot/${DTB} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb
 		done
 	fi
 }
 
 do_deploy_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
+		for DTB in ${KERNEL_DEVICETREE}; do
+			if echo ${DTB} | grep -q '/dts/'; then
+				bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
+				DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
 			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"`
+			DTB_BASE_NAME=`basename ${DTB} .dtb`
+			DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
+			DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
 			install -d ${DEPLOYDIR}
-			install -m 0644 ${B}/${DTS_BASE_NAME} ${DEPLOYDIR}/${DTB_NAME}.dtb
+			install -m 0644 ${B}/arch/${ARCH}/boot/${DTB} ${DEPLOYDIR}/${DTB_NAME}.dtb
 			cd ${DEPLOYDIR}
 			ln -sf ${DTB_NAME}.dtb ${DTB_SYMLINK_NAME}.dtb
 			cd -
@@ -48,20 +42,20 @@  do_deploy_append() {
 
 pkg_postinst_kernel-devicetree () {
 	cd /${KERNEL_IMAGEDEST}
-	for DTS_FILE in ${KERNEL_DEVICETREE}
+	for DTB_FILE in ${KERNEL_DEVICETREE}
 	do
-		DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
-		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
-		update-alternatives --install /${KERNEL_IMAGEDEST}/${DTS_BASE_NAME}.dtb ${DTS_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
+		DTB_BASE_NAME=`basename ${DTB_FILE} | awk -F "." '{print $1}'`
+		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
+		update-alternatives --install /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
 	done
 }
 
 pkg_postrm_kernel-devicetree () {
 	cd /${KERNEL_IMAGEDEST}
-	for DTS_FILE in ${KERNEL_DEVICETREE}
+	for DTB_FILE in ${KERNEL_DEVICETREE}
 	do
-		DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
-		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
-		update-alternatives --remove ${DTS_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
+		DTB_BASE_NAME=`basename ${DTB_FILE} | awk -F "." '{print $1}'`
+		DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"`
+		update-alternatives --remove ${DTB_BASE_NAME}.dtb devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true
 	done
 }