[U-Boot] [PATCH v3 2/6] fdt: Add support for embedded device tree (CONFIG_OF_EMBED)

Simon Glass sjg at chromium.org
Sat Oct 15 07:21:12 CEST 2011


Hi Stephen,

On Thu, Oct 13, 2011 at 2:50 PM, Stephen Warren <swarren at nvidia.com> wrote:
> Simon Glass wrote at Thursday, October 13, 2011 3:25 PM:
>> Hi Stephen,
>>
>> On Thu, Oct 13, 2011 at 2:21 PM, Stephen Warren <swarren at nvidia.com> wrote:
>> > Simon Glass wrote at Tuesday, October 11, 2011 4:26 PM:
>> >> 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.
>> > ...
>> >> +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)
>> >
>> > Instead of all that, can't you just run a trivial script to generate a .c
>> > file containing the data from DTB_BIN, and then use the compiler to compile
>> > that, i.e. spit out something like:
>> >
>> > const unsigned char dtb[] = {
>> >  0xaa, 0x55, ......
>> > };
>> >
>> > That'd certainly drastically simplify the makefile, although waste a little
>> > more time and temp disk space.
>>
>> What, and withdraw my Makefile contest entry? :-)
>
> :-)
>
>> I feel that objcopy is designed to do exactly this, and generating C
>> code is a roundabout way of producing an object file with data in it.
>> The difficulty of finding out the output format/architecture is
>> something we might clean up in U-Boot generally at some point (e.g.
>> figure it out as part of the original 'make ..._config') in which case
>> this would all go away.
>>
>> Thoughts?
>
> Looking some more, dtc has option "-O asm" which writes directly to a text
> file that can be assembled; there'd be no extra temp files or conversions
> if you used that.

Yes! That's much better - I will use that. I think I should still
create the temp files just so that people can see what went wrong with
a failed build. For example, if there is an error in the device tree
file it is nice to see the exact file that was compiled, including
preprocessing.

But it gets rid of the architecture stuff. I do feel that objcopy is
there partly to support putting binary bobs into object files, but the
reality is that it is just too ugly.

Thanks very much for looking into this and for the suggestion.

Regards,
Simon

>
> --
> nvpublic
>
>


More information about the U-Boot mailing list