# Support for device tree generation PACKAGES_append = " \ kernel-devicetree \ ${@['kernel-image-zimage-bundle', ''][d.getVar('KERNEL_DEVICETREE_BUNDLE') != '1']} \ " FILES_kernel-devicetree = "/${KERNEL_IMAGEDEST}/*.dtb /${KERNEL_IMAGEDEST}/*.dtbo" FILES_kernel-image-zimage-bundle = "/${KERNEL_IMAGEDEST}/zImage-*.dtb.bin" # Generate kernel+devicetree bundle KERNEL_DEVICETREE_BUNDLE ?= "0" normalize_dtb () { DTB="$1" 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 echo "${DTB}" } get_real_dtb_path_in_kernel () { DTB="$1" DTB_PATH="${B}/arch/${ARCH}/boot/dts/${DTB}" if [ ! -e "${DTB_PATH}" ]; then DTB_PATH="${B}/arch/${ARCH}/boot/${DTB}" fi echo "${DTB_PATH}" } do_configure_append() { if [ "${KERNEL_DEVICETREE_BUNDLE}" = "1" ]; then if echo ${KERNEL_IMAGETYPE_FOR_MAKE} | grep -q 'zImage'; then case "${ARCH}" in "arm") config="${B}/.config" if ! grep -q 'CONFIG_ARM_APPENDED_DTB=y' $config; then bbwarn 'CONFIG_ARM_APPENDED_DTB is NOT enabled in the kernel. Enabling it to allow the kernel to boot with the Device Tree appended!' sed -i "/CONFIG_ARM_APPENDED_DTB[ =]/d" $config echo "CONFIG_ARM_APPENDED_DTB=y" >> $config echo "# CONFIG_ARM_ATAG_DTB_COMPAT is not set" >> $config fi ;; *) bberror "KERNEL_DEVICETREE_BUNDLE is not supported for ${ARCH}. Currently it is only supported for 'ARM'." esac else bberror 'The KERNEL_DEVICETREE_BUNDLE requires the KERNEL_IMAGETYPE to contain zImage.' fi fi } do_compile_append() { for DTB in ${KERNEL_DEVICETREE}; do DTB=`normalize_dtb "${DTB}"` oe_runmake ${DTB} done } do_install_append() { for DTB in ${KERNEL_DEVICETREE}; do DTB=`normalize_dtb "${DTB}"` DTB_EXT=${DTB##*.} DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` DTB_BASE_NAME=`basename ${DTB} ."${DTB_EXT}"` install -m 0644 ${DTB_PATH} ${D}/${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.${DTB_EXT} for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` ln -sf ${DTB_BASE_NAME}.${DTB_EXT} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.${DTB_EXT} if [ "$type" = "zImage" ] && [ "${KERNEL_DEVICETREE_BUNDLE}" = "1" ]; then cat ${D}/${KERNEL_IMAGEDEST}/$type \ ${D}/${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.${DTB_EXT} \ > ${D}/${KERNEL_IMAGEDEST}/$type-${DTB_BASE_NAME}.${DTB_EXT}.bin fi done done } do_deploy_append() { for DTB in ${KERNEL_DEVICETREE}; do DTB=`normalize_dtb "${DTB}"` DTB_EXT=${DTB##*.} DTB_BASE_NAME=`basename ${DTB} ."${DTB_EXT}"` for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do base_name=${type}"-"${KERNEL_IMAGE_BASE_NAME} symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} DTB_NAME=`echo ${base_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` install -d ${DEPLOYDIR} install -m 0644 ${DTB_PATH} ${DEPLOYDIR}/${DTB_NAME}.${DTB_EXT} ln -sf ${DTB_NAME}.${DTB_EXT} ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.${DTB_EXT} ln -sf ${DTB_NAME}.${DTB_EXT} ${DEPLOYDIR}/${DTB_BASE_NAME}.${DTB_EXT} if [ "$type" = "zImage" ] && [ "${KERNEL_DEVICETREE_BUNDLE}" = "1" ]; then cat ${DEPLOYDIR}/$type \ ${DEPLOYDIR}/${DTB_NAME}.${DTB_EXT} \ > ${DEPLOYDIR}/${DTB_NAME}.${DTB_EXT}.bin ln -sf ${DTB_NAME}.${DTB_EXT}.bin ${DEPLOYDIR}/$type-${DTB_BASE_NAME}.${DTB_EXT}.bin if [ -e "${KERNEL_OUTPUT_DIR}/${type}.initramfs" ]; then cat ${KERNEL_OUTPUT_DIR}/${type}.initramfs \ ${DEPLOYDIR}/${DTB_NAME}.${DTB_EXT} \ > ${DEPLOYDIR}/${type}-${INITRAMFS_BASE_NAME}-${DTB_BASE_NAME}.${DTB_EXT}.bin ln -sf ${type}-${INITRAMFS_BASE_NAME}-${DTB_BASE_NAME}.${DTB_EXT}.bin \ ${DEPLOYDIR}/${type}-initramfs-${DTB_BASE_NAME}.${DTB_EXT}-${MACHINE}.bin fi fi done done }