README ====== The programs and libraries in this directory provide a tool-chain to generate binary data for embedded systems which can be flashed either by a hardware flash programmer, e.g. JTAG debugger, or on the target system directly using pfiflash, or ubimkvol, ubirmvol, ubiwritevol. The latter is the case when there is already Linux running which has build in UBI support. Authors: Oliver Lohmann Frank Haverkamp Andreas Arnez mkpfi - tool for flash content generation in PFI format pfi2bin - conversion tool to transfer a PFI file into a binary image pfiflash - tool to update the embedded systems flash using pfi files created by mkpfi libbootenv - library for boot-parameter processing libpfi - library for partial flash image (PFI) creation and handling ubigen - tool to create binary UBI images e.g. for a jtag flashing tool nandimg - tool to add OOB data to binary images intended for NAND flash systems ubilib - UBI library !!! NOTICE !!! If you execute ./configure in the top_level directory the helper Makefile gets overwritten. Thats actually no problem, but be aware of that. 1. Build Process 1.1 Build, install and forget o Build all and everything $make all (takes a while, builds ppc and x86 binaries/libs) o Installation: $make install o Uninstallation: $make uninstall o x86 only would be: $make x86 && make install_x86 1.2 Usage for a developer 1.2.1 The build process in detail o If you've checked out the sources from the CVS repository you'll find a directory setup like this: flashutils/ -rw-r--r-- 1 olli olli 1.3K Mar 14 11:53 Makefile -rw-r--r-- 1 olli olli 1.9K Mar 14 10:50 Makefile.am -rwxr-xr-x 1 olli olli 265 Mar 9 00:47 bootstrap -rw-r--r-- 1 olli olli 1.1K Mar 9 16:55 configure.ac drwxr-xr-x 2 olli olli 4.0K Mar 9 00:28 doc drwxr-xr-x 2 olli olli 4.0K Mar 14 11:56 inc drwxr-xr-x 2 olli olli 4.0K Mar 14 11:56 lib drwxr-xr-x 17 olli olli 4.0K Mar 13 16:50 src o To generate the initial build templates you have to call the bootstrap script: $ ./bootstrap o Create a directory for the target platform $ mkdir build_x86 o Descend into the directory and call the top-level configure script with the desired options. $ cd build_x86 $ ../configure --prefix=/usr/local [...] o Now you'll find a directory structure like this: flashutils/build_x86/ -rw-r--r-- 1 olli olli 47K Mar 14 13:33 Makefile -rw-r--r-- 1 olli olli 33K Mar 14 13:33 config.log -rwxr-xr-x 1 olli olli 38K Mar 14 13:33 config.status drwxr-xr-x 2 olli olli 4.0K Mar 14 13:33 inc drwxr-xr-x 3 olli olli 4.0K Mar 14 13:33 lib -rwxr-xr-x 1 olli olli 202K Mar 14 13:33 libtool o The config.guess script can be used to update the Makefiles in the target directory after a change of the top-level template files (i.e. the Makefile.in files). $ ./config.guess o To compile everything for this platform just invoke make in flashutils/build_x86: $ make or from toplevel: $ make -C ./build_x86 o The build process creates a new directory "bin": flashutils/build_x86/ [...] drwxr-xr-x 3 olli olli 4.0K Mar 14 13:41 bin [...] This directory contains all binary files which will be installed by make install, e.g.: flashutils/build_x86/bin/ -rwxr-xr-x 1 olli olli 7.2K Mar 14 13:41 bin2nand -rwxr-xr-x 1 olli olli 15K Mar 14 13:41 mkbootenv -rwxr-xr-x 1 olli olli 16K Mar 14 13:41 pddcustomize -rwxr-xr-x 1 olli olli 36K Mar 14 13:41 pfi2bin -rwxr-xr-x 1 olli olli 6.8K Mar 14 13:41 pfiflash -rwxr-xr-x 1 olli olli 5.0K Mar 14 13:41 ubicrc32 -rwxr-xr-x 1 olli olli 13K Mar 14 13:41 ubigen -rwxr-xr-x 1 olli olli 6.3K Mar 14 13:41 ubimirror 1.2.2 Modifying and Adding Sources o There is a dedicated directory which contains all source code of the flashutils package, e.g.: flashutils/src/ drwxr-xr-x 2 olli olli 4.0K Mar 13 11:42 libbootenv drwxr-xr-x 2 olli olli 4.0K Mar 13 11:42 liberror drwxr-xr-x 2 olli olli 4.0K Mar 13 16:48 mkpfi drwxr-xr-x 2 olli olli 4.0K Mar 13 16:12 pddcustomize The prefix "lib" is used to mark directories as part of a convenience library. Binaries have no special prefix. o How to add sources? Just create a new directory at flashutils/src/, e.g.: For a binary: $ mkdir rider $ cd rider $ vi rider.c /* do sth with that file... */ For a convenience library (as well as for "normal libs") $ mkdir libworld $ cd libworld $ vi world.c /* do sth with that file... */ o How to register sources in the build process (for binaries)? You have to register your sources at the top-level automake Makefile: In directory flashutils/ $ vi Makefile.am Binaries have to be registered at "bin_PROGRAMS", e.g.: bin_PROGRAMS = bin/pddcustomize \ bin/rider Add the rule how the binary is assembled, e.g.: bin_pddcustomize_SOURCES = \ $(top_srcdir)/src/pddcustomize/pddcustomize.c bin_pddcustomize_LDADD = \ $(top_builddir)/lib/libbootenv.la \ $(top_builddir)/lib/liberror.la bin_rider_SOURCES = \ $(top_srcdir)/src/rider/rider.c This example reflects a simple build process for "rider". "rider" is built without any other dependencies or convenience libraries. The example for pddcustomize is a bit more complicated. "_LDADD" adds some convenience libraris into the link process of "pddcustomize". Imagine, that your "rider" has common code with "dragon_bin" which is held in a library called "libworld". The build rules would like like the following: bin_rider_SOURCES = \ $(top_srcdir)/src/rider/rider.c bin_rider_LDADD = \ $(top_builddir)/lib/libworld.la bin_dragon_SOURCES = \ $(top_srcdir)/src/dragon_bin/dragon_bin.c bin_dragon_LDADD = \ $(top_builddir)/lib/libworld.la Don't forget to add "dragon" to "bin_PROGRAMS"! Don't forget to set the build rule for the "libworld" itself! This is documented in the next section. o How to register sources in the build process (for libraries)? Until now we didn't care about the build process of "libworld". Libraries are handled special in this build process because they are handled as "modules", i.e. they are able to be built without building the binaries in the same step. Additionally, it is possible to assemble complex libraries out of simple ones. That especially makes sense if you want to export (install) a library on a system which uses some common code and makes some adoptions for usability and presents a comfortable interface to the user (see libpfiflash in the sources for an example). o Registering "libworld" as convenience library. Instead of editing the "Makefile.am" in "flashtools/", we have to edit now the "Makefile.am" in "flashtools/lib/": noinst_LTLIBRARIES = libworld.la libworld_la_SOURCES = $(top_srcdir)/src/libworld/world.c o Registering "libworld" as library which gets installed. lib_LTLIBRARIES = libworld.la libworld_la_SOURCES = $(top_srcdir)/src/libworld/world.c libworld_la_LDFLAGS = -no-undefined -version-info 0:0:0 o Header files All header files are stored at "flashutils/inc", regardless if convenience library or not. If you want to export headers you have to specify this in the Makefile.am located at "flashutils/inc", e.g. (this should not be done for convenience libraries): nobase_include_HEADERS = world.h Appendix A.1. FAQ Q How to call configure to setup a cross-platform build? A $ ./configure --build=i686-pc-linux-gnu --host=ppc-linux \ --prefix=/opt/.../ppcnf/crossroot/ \ --exec-prefix=/opt/..../ppcnf/crossroot/usr