summaryrefslogtreecommitdiff
path: root/dts/Makefile
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2011-10-15 05:48:21 +0000
committerWolfgang Denk <wd@denx.de>2011-10-26 21:38:59 +0200
commitbbb0b128c3956ac549471addc314702fbe0ace63 (patch)
tree7cc3c4c3d3206154381ed31a8a1419a68cd6a476 /dts/Makefile
parent45ba8077f3ed7039b6cde5fe56149d390dc5ff0c (diff)
fdt: Add support for embedded device tree (CONFIG_OF_EMBED)
This new option allows U-Boot to embed a binary device tree into its image to allow run-time control of peripherals. This device tree is for U-Boot's own use and is not necessarily the same one as is passed to the kernel. The device tree compiler output should be placed in the $(obj) rooted tree. Since $(OBJCOPY) insists on adding the path to the generated symbol names, to ensure consistency it should be invoked from the directory where the .dtb file is located and given the input file name without the path. This commit contains my entry for the ugliest Makefile / shell interaction competition. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'dts/Makefile')
-rw-r--r--dts/Makefile103
1 files changed, 103 insertions, 0 deletions
diff --git a/dts/Makefile b/dts/Makefile
new file mode 100644
index 0000000000..5792afd271
--- /dev/null
+++ b/dts/Makefile
@@ -0,0 +1,103 @@
+#
+# Copyright (c) 2011 The Chromium OS Authors.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundatio; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+# This Makefile builds the internal U-Boot fdt if CONFIG_OF_CONTROL is
+# enabled. See doc/README.fdt-control for more details.
+
+include $(TOPDIR)/config.mk
+
+LIB = $(obj)libdts.o
+
+$(if $(CONFIG_DEFAULT_DEVICE_TREE),,\
+$(error Please define CONFIG_DEFAULT_DEVICE_TREE in your board header file))
+DEVICE_TREE = $(subst ",,$(CONFIG_DEFAULT_DEVICE_TREE))
+
+$(if $(CONFIG_ARCH_DEVICE_TREE),,\
+$(error Your architecture does not have device tree support enabled. \
+Please define CONFIG_ARCH_DEVICE_TREE))
+
+# We preprocess the device tree file provide a useful define
+DTS_CPPFLAGS := -DARCH_CPU_DTS=\"../arch/$(ARCH)/dts/$(CONFIG_ARCH_DEVICE_TREE).dtsi\"
+
+all: $(obj).depend $(LIB)
+
+# Use a constant name for this so we can access it from C code.
+# objcopy doesn't seem to allow us to set the symbol name independently of
+# the filename.
+DT_BIN := $(obj)dt.dtb
+
+$(DT_BIN): $(TOPDIR)/board/$(VENDOR)/dts/$(DEVICE_TREE).dts
+ cat $< | $(CPP) -P $(DTS_CPPFLAGS) - >$@.tmp
+ $(DTC) -R 4 -p 0x1000 -O dtb -o ${DT_BIN} $@.tmp
+ rm $@.tmp
+
+process_lds = \
+ $(1) | sed -r -n 's/^OUTPUT_$(2)[ ("]*([^")]*).*/\1/p'
+
+# Run the compiler and get the link script from the linker
+GET_LDS = $(CC) $(CFLAGS) $(LDFLAGS) -Wl,--verbose 2>&1
+
+$(obj)dt.o: $(DT_BIN)
+ # We want the output format and arch.
+ # We also hope to win a prize for ugliest Makefile / shell interaction
+ # We look in the LDSCRIPT first.
+ # Then try the linker which should give us the answer.
+ # Then check it worked.
+ oformat=`$(call process_lds,cat $(LDSCRIPT),FORMAT)` ;\
+ oarch=`$(call process_lds,cat $(LDSCRIPT),ARCH)` ;\
+ \
+ [ -z $${oformat} ] && \
+ oformat=`$(call process_lds,$(GET_LDS),FORMAT)` ;\
+ [ -z $${oarch} ] && \
+ oarch=`$(call process_lds,$(GET_LDS),ARCH)` ;\
+ \
+ [ -z $${oformat} ] && \
+ echo "Cannot read OUTPUT_FORMAT from lds file $(LDSCRIPT)" && \
+ exit 1 || true ;\
+ [ -z $${oarch} ] && \
+ echo "Cannot read OUTPUT_ARCH from lds file $(LDSCRIPT)" && \
+ exit 1 || true ;\
+ \
+ cd $(dir ${DT_BIN}) && \
+ $(OBJCOPY) -I binary -O $${oformat} -B $${oarch} \
+ $(notdir ${DT_BIN}) $@
+ rm $(DT_BIN)
+
+OBJS-$(CONFIG_OF_EMBED) := dt.o
+
+COBJS := $(OBJS-y)
+
+OBJS := $(addprefix $(obj),$(COBJS))
+
+binary: $(DT_BIN)
+
+$(LIB): $(OBJS) $(DTB)
+ $(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################