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