diff options
Diffstat (limited to 'ubi-utils/README')
| -rw-r--r-- | ubi-utils/README | 312 | 
1 files changed, 111 insertions, 201 deletions
| diff --git a/ubi-utils/README b/ubi-utils/README index d976a76..5c7f9db 100644 --- a/ubi-utils/README +++ b/ubi-utils/README @@ -4,7 +4,7 @@ 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. +system directly using pfiflash, or ubimkvol, ubirmvol, ubiupdatevol.  The latter is the case when there is already Linux running which has  build in UBI support. @@ -12,6 +12,7 @@ build in UBI support.  Authors: Oliver Lohmann           Frank Haverkamp  	 Andreas Arnez +	 Artem Bityutskiy  mkpfi           - tool for flash content generation in PFI                    format @@ -27,210 +28,119 @@ ubigen          - tool to create binary UBI images e.g. for a  nandimg         - tool to add OOB data to binary images intended                    for NAND flash systems  ubilib          - UBI library +ubimkvol        - UBI volume creation utility +ubirmvol        - UBI volume removal utility +ubiupdatevol    - UBI volume update utility -!!! 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 +The following text is from original UBI announcement +==================================================== -    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 -  +UBI - Unsorted Block Images +UBI (Latin: "where?") manages multiple logical volumes on a single +flash device, specifically supporting NAND flash devices. UBI provides +a flexible partitioning concept which still allows for wear-levelling +across the whole flash device. -Appendix +In a sense, UBI may be compared to the Logical Volume Manager +(LVM). Whereas LVM maps logical sector numbers to physical HDD sector +numbers, UBI maps logical eraseblocks to physical eraseblocks. -A.1. FAQ +More information may be found in the UBI design documentation: +ubidesign.pdf. Which can be found here: +http://www.linux-mtd.infradead.org/doc/ubi.html -   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 +Partitioning/Re-partitioning + +  An UBI volume occupies a certain number of erase blocks. This is +  limited by a configured maximum volume size, which could also be +  viewed as the partition size. Each individual UBI volume's size can +  be changed independently of the other UBI volumes, provided that the +  sum of all volume sizes doesn't exceed a certain limit. + +  UBI supports dynamic volumes and static volumes. Static volumes are +  read-only and their contents are protected by CRC check sums. + +Bad eraseblocks handling + +  UBI transparently handles bad eraseblocks. When a physical +  eraseblock becomes bad, it is substituted by a good physical +  eraseblock, and the user does not even notice this. + +Scrubbing + +  On a NAND flash bit flips can occur on any write operation, +  sometimes also on read. If bit flips persist on the device, at first +  they can still be corrected by ECC, but once they accumulate, +  correction will become impossible. Thus it is best to actively scrub +  the affected eraseblock, by first copying it to a free eraseblock +  and then erasing the original. The UBI layer performs this type of +  scrubbing under the covers, transparently to the UBI volume users. + +Erase Counts + +  UBI maintains an erase count header per eraseblock. This frees +  higher-level layers (like file systems) from doing this and allows +  for centralized erase count management instead. The erase counts are +  used by the wear-levelling algorithm in the UBI layer. The algorithm +  itself is exchangeable. + +Booting from NAND + +  For booting directly from NAND flash the hardware must at least be +  capable of fetching and executing a small portion of the NAND +  flash. Some NAND flash controllers have this kind of support. They +  usually limit the window to a few kilobytes in erase block 0. This +  "initial program loader" (IPL) must then contain sufficient logic to +  load and execute the next boot phase. + +  Due to bad eraseblocks, which may be randomly scattered over the +  flash device, it is problematic to store the "secondary program +  loader" (SPL) statically. Also, due to bit-flips it may become +  corrupted over time. UBI allows to solve this problem gracefully by +  storing the SPL in a small static UBI volume. + +UBI volumes vs. static partitions + +  UBI volumes are still very similar to static MTD partitions: + +    * both consist of eraseblocks (logical eraseblocks in case of UBI +      volumes, and physical eraseblocks in case of static partitions; +    * both support three basic operations - read, write, erase. + +  But UBI volumes have the following advantages over traditional +  static MTD partitions: + +    * there are no eraseblock wear-leveling constraints in case of UBI +      volumes, so the user should not care about this; +    * there are no bit-flips and bad eraseblocks in case of UBI volumes. + +  So, UBI volumes may be considered as flash devices with relaxed +  restrictions. + +Where can it be found? + +  Documentation, kernel code and applications can be found in the MTD +  gits. + +What are the applications for? + +  The applications help to create binary flash images for two +  purposes: pfi files (partial flash images) for in-system update of +  UBI volumes, and plain binary images, with or without OOB data in +  case of NAND, for a manufacturing step. Furthermore some tools +  are/and will be created that allow flash content analysis after a +  system has crashed. + +Who did UBI? + +  The original ideas, where UBI is based on, were developed by Andreas +  Arnez, Frank Haverkamp and Thomas Gleixner. Josh W. Boyer and +  some others were involved too. The implementation of the kernel +  layer was done by Artem B. Bityutskiy. The user-space applications +  and tools were written by Oliver Lohmann with contributions from +  Frank Haverkamp, Andreas Arnez, and Artem. Joern Engel contributed a +  patch which modifies JFFS2 so that it can be run on a UBI +  volume. Thomas Gleixner did modifications to the NAND layer and also +  some to JFFS2 to make it work. | 
