| 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 |