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
