[FE training-materials-updates] MTD rework step

Boris Brezillon boris.brezillon at free-electrons.com
Tue May 12 18:08:51 CEST 2015


Repository : git://git.free-electrons.com/training-materials.git

On branch  : mtd-rework-WIP
Link       : http://git.free-electrons.com/training-materials/commit/?id=10b07e280f382a7129c6b589ae8633c1926b8238

>---------------------------------------------------------------

commit 10b07e280f382a7129c6b589ae8633c1926b8238
Author: Boris Brezillon <boris.brezillon at free-electrons.com>
Date:   Tue May 12 18:06:46 2015 +0200

    MTD rework step
    
    Signed-off-by: Boris Brezillon <boris.brezillon at free-electrons.com>


>---------------------------------------------------------------

10b07e280f382a7129c6b589ae8633c1926b8238
 .../sysdev-flash-filesystems/nand-organization.dia | Bin 0 -> 1648 bytes
 .../sysdev-flash-filesystems.tex                   | 410 ++++++++++++---------
 .../{ubifs-layout.dia => ubifs-bad-layout.dia}     |   4 +-
 .../{ubifs-layout.dia => ubifs-good-layout.dia}    | 292 ++++-----------
 4 files changed, 305 insertions(+), 401 deletions(-)

diff --git a/slides/sysdev-flash-filesystems/nand-organization.dia b/slides/sysdev-flash-filesystems/nand-organization.dia
new file mode 100644
index 0000000..f898796
Binary files /dev/null and b/slides/sysdev-flash-filesystems/nand-organization.dia differ
diff --git a/slides/sysdev-flash-filesystems/sysdev-flash-filesystems.tex b/slides/sysdev-flash-filesystems/sysdev-flash-filesystems.tex
index f676a4c..7587c46 100644
--- a/slides/sysdev-flash-filesystems/sysdev-flash-filesystems.tex
+++ b/slides/sysdev-flash-filesystems/sysdev-flash-filesystems.tex
@@ -1,15 +1,116 @@
-\section{Flash filesystems}
+\section{Using flash memories}
 
 \begin{frame}
-  \frametitle{The MTD subsystem}
-  MTD stands for {\em Memory Technology Devices}
+  \frametitle{Block devices vs flash devices}
+  \begin{itemize}
+  \item Block devices:
+    \begin{itemize}
+    \item Allow for random data access using fixed size blocks
+    \item Do not require special care when writing on the media
+    \item Block size is relatively small (minimum 512 bytes, can be
+      increased for performance reasons)
+    \item Considered as reliable (if the storage media is not, some
+      hardware or software parts are supposed to make it reliable)
+    \item Used by the {\em mtd-utils} utilities
+    \end{itemize}
+  \item Flash devices:
+    \begin{itemize}
+    \item Allow for random data access too
+    \item Require special care before writing on the media (erasing
+      the region you are about to write on)
+    \item Erase, write and read operation might not use the same block
+      size
+    \item Reliability depends on the flash technology
+    \end{itemize}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+  \frametitle{NAND flashes: how they work ?}
+  \begin{itemize}
+  \item Encode bits with Voltage levels
+  \item Start with all bits set to 1
+  \item Programming implies changing some bits from 1 to 0
+  \item Restoring bits to 1 is done via the ERASE operation
+  \item Programming and erasing is not done on a per bit or per byte
+    basis
+  \item Organization
+    \begin{itemize}
+    \item Page: minimum unit for PROGRAM operation
+    \item Block: minimum unit for ERASE operation
+    \end{itemize}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{NAND flashes: organization}
+  \begin{center}
+    \includegraphics[scale=0.3]{slides/sysdev-flash-filesystems/nand-organization.pdf}
+  \end{center}
+\end{frame}
+
+\begin{frame}
+  \frametitle{NAND flashes: constraints}
+  \begin{itemize}
+  \item Reliability
+    \begin{itemize}
+    \item Far less reliable than NOR flashes
+    \item Reliability depends on the NAND flash technology (SLC, MLC)
+    \item Require additional mechanisms to correct errors: ECC (Error
+       Corrector Code)
+    \item ECC information stored in the OOB (Out-of-band area)
+    \end{itemize}
+  \item Lifetime
+    \begin{itemize}
+    \item Short lifetime compared to other storage media
+    \item Lifetime depends on the NAND flash technology (SLC, MLC):
+      between 1000000 and 1000 erase cycles per block
+    \item Wear leveling mechanisms are required
+    \item Bad block detection/handling required too
+    \end{itemize}
+  \item Despite the number of constraints brought by NAND they are
+    widely used in embedded systems for several reasons:
+    \begin{itemize}
+    \item Cheaper than other flash technologies
+    \item Provide high capacity storage
+    \item Provide good performances (both in read and write access)
+    \end{itemize}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+  \frametitle{The MTD subsystem (1)}
+  \begin{itemize}
+  \item MTD stands for {\em Memory Technology Devices}
+  \item Generic subsystem dealing with all type of storage media that
+    are not fitting in the block subsystem
+  \item Supported media types: RAM, ROM, NORFLASH, NANDFLASH,
+    DATAFLASH
+  \item Independent of the communication interface (drivers available
+    for parallel, SPI, direct memory mapping, ...)
+  \item Abstract storage media characteristics and provide a simple
+    API to access MTD devices
+  \item MTD device characteristics exposed to users:
+    \begin{itemize}
+    \item \code{erasesize}: minimum erase size unit
+    \item \code{writesize}: minimum write size unit
+    \item \code{oobsize}: extra size to store metadata or ECC data
+    \item \code{size}: device size
+    \item \code{flags}: information about device type and capabilities
+    \end{itemize}
+  \item Various kind of MTD users: file-systems, block device emulation
+    layers, userspace interfaces, ...
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+  \frametitle{The MTD subsystem (2)}
   \begin{center}
     \includegraphics[width=\textwidth]{slides/sysdev-flash-filesystems/mtd-architecture.pdf}
   \end{center}
 \end{frame}
 
 \begin{frame}
-  \frametitle{MTD devices}
+  \frametitle{MTD devices: interface with userspace}
   \begin{itemize}
   \item MTD devices are visible in \code{/proc/mtd}
   \item The {\bf mtdchar} driver creates a character device for each
@@ -55,8 +156,10 @@
       \code{sda2})
     \item \code{/dev/mtd1} is either the second partition of the first
       flash device, or the first partition of the second flash device
-\end{itemize}
-\end{itemize}
+    \item Note that the master MTD device (the device those partitions
+      belongs to) is not exposed in /dev
+    \end{itemize}
+  \end{itemize}
 \end{frame}
 
 \begin{frame}[fragile]
@@ -148,6 +251,10 @@ Creating 5 MTD partitions on "omap2-nand.0":
     \item \code{Root filesystem} (16 MiB)
     \item \code{Data filesystem} (Remaining space)
     \end{itemize}
+  \item Be careful: when doing that you might impact MTD users which
+    have already stored data on existing partitions: e.g. a file system
+    might complain about data corruption if you change your partition
+    layout after its initialization
   \end{itemize}
 \end{frame}
 
@@ -163,151 +270,77 @@ Creating 5 MTD partitions on "omap2-nand.0":
 \end{frame}
 
 \begin{frame}
-  \frametitle{mtd-utils}
+  \frametitle{Flash wear leveling (1)}
   \begin{itemize}
-  \item A set of utilities to manipulate MTD devices
+  \item Wear leveling is about distributing write over the whole flash
+    device to avoid quickly loosing blocks that are written really often
+  \item Can be done in:
     \begin{itemize}
-    \item \code{mtdinfo} to get detailed information about an MTD device
-    \item \code{flash_eraseall} to completely erase a given MTD device
-    \item \code{flashcp} to write to NOR flash
-    \item \code{nandwrite} to write to NAND flash
-    \item UBI utilities
-    \item Flash filesystem image creation tools: \code{mkfs.jffs2},
-      \code{mkfs.ubifs}
+    \item the filesystem layer (JFFS2, YAFFS/YAFFS2, ...)
+    \item an intermediate layer dedicated to wear leveling (UBI)
     \end{itemize}
-  \item Usually available as the \code{mtd-utils} package in your distribution
-  \item Most commands now also available in BusyBox
-  \item See \url{http://www.linux-mtd.infradead.org/}
+  \item The wear leveling implementation is what makes your flash
+    lifetime good or not
   \end{itemize}
 \end{frame}
 
 \begin{frame}
-  \frametitle{jffs2}
-  \begin{columns}
-    \column{0.7\textwidth}
+  \frametitle{Flash wear leveling (2)}
+  \begin{itemize}
+  \item Flash users should also take the limited lifetime of flash
+    devices into account by taking additional precautions
     \begin{itemize}
-    \item Today's standard filesystem for MTD flash
-    \item Nice features: on the fly compression (saves storage space
-      and reduces I/O), power down reliable, wear-leveling and ECC.
-    \item Drawbacks: doesn't scale well
-      \begin{itemize}
-      \item Mount time depending on filesystem size: the kernel has to
-        scan the whole filesystem at mount time, to read which block
-        belongs to each file.
-      \item Need to use the \code{CONFIG_JFFS2_SUMMARY} kernel option
-        to store such information in flash. This dramatically reduces
-        mount time (from 16 s to 0.8 s for a 128 MB partition).
-      \end{itemize}
-    \item \url{http://www.linux-mtd.infradead.org/doc/jffs2.html}
+    \item Do not use your flash storage as swap area (rare in embedded
+      systems anyway)
+    \item Mount your filesystems as read-only, or use read-only
+      filesystems (SquashFS), whenever possible.
+    \item Keep volatile files in RAM (tmpfs)
+    \item Don't use the \code{sync} mount option (commits writes
+      immediately). Use the \code{fsync()} system call for per-file
+      synchronization.
     \end{itemize}
-    \column{0.3\textwidth}
-    \includegraphics[width=\textwidth]{slides/sysdev-flash-filesystems/jffs2.pdf}
-  \end{columns}
-\end{frame}
-
-\begin{frame}
-  \frametitle{jffs2 - How to use}
-  On the Linux {\bf target}
-  \begin{itemize}
-  \item Need either the \code{mtd-utils} package from the MTD project,
-    or their embedded variants from Busybox
-  \item Erase and format a partition with jffs2:\\
-    \code{flash_eraseall -j /dev/mtd2}
-  \item Mount the partition:\\
-    \code{mount -t jffs2 /dev/mtdblock2 /mnt/flash}\\
-  \item Fill the contents by writing\\
-    (copying through the network or from external storage)
-  \item Other possibility: use a {\em jffs2} image (see next page to
-    make it):\\
-    \code{flash_eraseall /dev/mtd2}\\
-    \code{nandwrite -p /dev/mtd2 rootfs.jffs2}
-  \end{itemize}
-\end{frame}
-
-\begin{frame}
-  \frametitle{How to create a jffs2 image}
-  \begin{itemize}
-  \item \code{mkfs.jffs2} command available in the mtd-utils package.\\
-    Caution: unlike some \code{mkfs} commands, it doesn't create a
-    filesystem, but a filesystem image.
-  \item First, find the erase block size (on the target running Linux):\\
-    \code{cat /proc/mtd} \\
-    For example: \code{00040000} (256 KiB)
-  \item Then create the image on your workstation:\\
-    \code{mkfs.jffs2 --pad --no-cleanmarkers --eraseblock=256 -d rootfs/ -o rootfs.jffs2}
-  \item The \code{--pad} option pads the jffs2 image contents\\
-    until the end of the final erase block.
-  \item It is fine if the jffs2 image is smaller than the MTD partition.\\
-    The jffs2 file system will use the entire partition anyway.
-  \item The \code{--no-cleanmarkers} option is for NAND flash only.
   \end{itemize}
 \end{frame}
 
 \begin{frame}
-  \frametitle{Mounting a jffs2 image on your host}
-  Useful to edit \code{jffs2} images on your development system\\
-  Mounting an MTD device as a loop device is a bit complex task.\\
-  Here's an example for \code{jffs2}, for your reference:
+  \frametitle{Flash file-systems}
   \begin{itemize}
-  \item First find the erase block size used to create the jffs2 image.\\
-    Let's assume it is 256KiB (262144 bytes).
-  \item Create a block device from the image\\
-    \code{losetup /dev/loop0 root.jffs2}
-  \item Emulate an MTD device from a block device,\\
-    using the \code{block2mtd} kernel module\\
-    \code{modprobe block2mtd block2mtd=/dev/loop0,262144}
-  \item Load the mtdblock driver if needed\\
-    \code{modprobe mtdblock}
-  \item Finally, mount the filesystem (create \code{/mnt/jffs2} if needed)\\
-    \code{mount -t jffs2 /dev/mtdblock0 /mnt/jffs2}
+  \item 'Standard' file systems are meant to work on block devices
+  \item Specific file systems have been developed to deal flash
+    constraints
+  \item These file systems are relying on the MTD layer to access
+    flash chips
+  \item There exists several legacy flash filesystems which might be
+    useful for specific usage: JFFS2, YAFFS2, ...
+  \item Nowadays, a lot of people are using UBI/UBIFS, and it is the
+    de facto standard for medium to large capacity NANDs (128MB
+    to several GB)
   \end{itemize}
 \end{frame}
 
 \begin{frame}
-  \frametitle{Initializing jffs2 partitions from U-boot}
-  You may not want to have \code{mtd-utils} on your target!
-  \begin{itemize}
-  \item Create a JFFS2 image on your workstation
-  \item In the U-Boot prompt:
+  \frametitle{Legacy flash filesystems: JFFS2}
+  \begin{columns}
+    \column{0.7\textwidth}
     \begin{itemize}
-    \item Download the jffs2 image to RAM with \code{tftp}\\
-      Or copy this image to RAM from external storage\\
-      (U-boot understands FAT filesystems and supports USB storage)
-    \item Flash it inside an MTD partition\\
-      (exact instructions depending on flash type, NOR or NAND,\\
-      reuse the instructions used to flash your kernel). Make sure to
-      write only the size of the image, not more!
+    \item Supports on the fly compression
+    \item Wear leveling, power failure resistant
+    \item Boot time depends on the filesystem size (doesn't scale well)
+    \item \url{http://www.linux-mtd.infradead.org/doc/jffs2.html}
     \end{itemize}
-  \item Limitation: need to split the jffs2 image in several chunks\\
-    if bigger than the RAM size.
-  \end{itemize}
-\end{frame}
-
-\begin{frame}
-  \frametitle{Booting from a jffs2 root partition}
-  \begin{itemize}
-  \item To boot on a jffs2 root filesystem, add
-    \code{root=/dev/mtdblock<x>} and \code{rootfstype=jffs2} to the
-    Linux command line arguments.
-  \item The Linux kernel cannot autodetect the type of a root filesystem
-    in MTD flash. That's why the \code{rootfstype} kernel parameter is
-    needed.
-  \item For root partitions on a block device, using \code{rootfstype}
-    (for example: \code{rootfstype=ext3}) can reduce boot time a little
-    bit. This way, the kernel doesn't have to try all the block
-    filesystems it supports.
-  \end{itemize}
+    \column{0.3\textwidth}
+    \includegraphics[width=\textwidth]{slides/sysdev-flash-filesystems/jffs2.pdf}
+  \end{columns}
 \end{frame}
 
-
 \begin{frame}
-  \frametitle{yaffs2}
+  \frametitle{Legacy flash filesystems: YAFFS2}
   \begin{columns}
     \column{0.7\textwidth}
     \begin{itemize}
     \item Mainly supports NAND flash
     \item No compression
-    \item Wear leveling, ECC, power failure resistant
+    \item Wear leveling, power failure resistant
     \item Fast boot time
     \item Code available separately through git\\
       (Dual GPL / Proprietary license\\
@@ -319,16 +352,25 @@ Creating 5 MTD partitions on "omap2-nand.0":
   \end{columns}
 \end{frame}
 
+
 \begin{frame}
-  \frametitle{yaffs2 - How to use}
-  \begin{itemize}
-  \item Erase a partition:\\
-    \code{flash_eraseall /dev/mtd2}
-  \item The filesystem is automatically formatted at the first mount:\\
-    \code{mount -t yaffs2 /dev/mtdblock2 /mnt/flash}
-  \item Images can be created with the \code{mkyaffs} tool, from \code{yaffs-utils}\\
-    \url{http://code.google.com/p/yaffs2utils/}
-  \end{itemize}
+  \frametitle{UBI/UBIFS}
+  \begin{columns}
+    \column{0.7\textwidth}
+    \begin{itemize}
+    \item Aimed at replacing JFFS2 by addressing its limitations
+    \item Design choices:
+      \begin{itemize}
+      \item Split the wear leveling and filesystem parts
+      \item Add some flexibility
+      \item Focus on scalability, performance and reliability
+      \item Introduce noticeable overhead (especially when used on small
+        devices or partitions)
+      \end{itemize}
+    \end{itemize}
+    \column{0.3\textwidth}
+    \includegraphics[width=\textwidth]{slides/sysdev-flash-filesystems/ubifs.pdf}
+  \end{columns}
 \end{frame}
 
 \begin{frame}
@@ -336,15 +378,16 @@ Creating 5 MTD partitions on "omap2-nand.0":
   Unsorted Block Images
   \begin{itemize}
   \item \url{http://www.linux-mtd.infradead.org/doc/ubi.html}
-  \item Volume management system on top of MTD devices.
+  \item Volume management system on top of MTD devices (similar to
+    what LVM provides for block devices)
   \item Allows to create multiple logical volumes and spread writes
-    across all physical blocks.
+    across all physical blocks
   \item Takes care of managing the erase blocks and wear
-    leveling. Makes filesystems easier to implement.
+    leveling. Makes filesystems easier to implement
   \item Wear leveling can operate on the whole storage,
-    not only on individual partitions (strong advantage).
+    not only on individual partitions (strong advantage)
   \item Volumes can be dynamically resized or, on the opposite, can be
-    read-only (static).
+    read-only (static)
   \end{itemize}
 \end{frame}
 
@@ -356,30 +399,68 @@ Creating 5 MTD partitions on "omap2-nand.0":
 \end{frame}
 
 \begin{frame}
-  \frametitle{UBIFS}
-  \begin{columns}
-    \column{0.7\textwidth}
-    \url{http://www.linux-mtd.infradead.org/doc/ubifs.html}
-    \begin{itemize}
-    \item The next generation of the jffs2 filesystem, from the same
-      linux-mtd developers.
-    \item Works on top of UBI volumes
-    \item Has a noticeable metadata overhead on very small partitions
-      (4M, 8M)
-    \end{itemize}
-    \column{0.3\textwidth}
-    \includegraphics[width=\textwidth]{slides/sysdev-flash-filesystems/ubifs.pdf}
-  \end{columns}
+  \frametitle{UBI: good practice}
+  \begin{itemize}
+  \item UBI is responsible for distributing writes all over the flash
+    device: the more space you assign to a partition attached to the
+    UBI layer the more efficient the wear leveling will be
+  \item If you need partitioning, use UBI volumes not MTD partitions
+  \item Some partitions will still have to be MTD partitions: e.g. the
+    bootloaders and bootloader environments
+  \item If you need extra MTD partitions, try to group them at the end
+    or the beginning of the flash device
+  \end{itemize}
 \end{frame}
 
 \begin{frame}
-  \frametitle{UBI layout example}
+  \frametitle{UBI layout: bad example}
   \begin{center}
-    \includegraphics[width=\textwidth]{slides/sysdev-flash-filesystems/ubifs-layout.pdf}
+    \includegraphics[width=\textwidth]{slides/sysdev-flash-filesystems/ubifs-bad-layout.pdf}
   \end{center}
 \end{frame}
 
 \begin{frame}
+  \frametitle{UBI layout: good example}
+  \begin{center}
+    \includegraphics[width=\textwidth]{slides/sysdev-flash-filesystems/ubifs-good-layout.pdf}
+  \end{center}
+\end{frame}
+
+\begin{frame}
+  \frametitle{UBIFS}
+  Unsorted Block Images File System
+  \begin{itemize}
+  \item \url{http://www.linux-mtd.infradead.org/doc/ubifs.html}
+  \item The filesystem part of the UBI/UBIFS couple
+  \item Works on top of UBI volumes
+  \item Journaling file system providing better performances than
+    JFFS2 and addressing its scalability issues
+  \item See this paper for more technical details about UBIFS internals
+    \url{http://www.linux-mtd.infradead.org/doc/ubifs_whitepaper.pdf}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+  \frametitle{mtd-utils}
+  \begin{itemize}
+  \item A set of utilities to manipulate MTD devices
+    \begin{itemize}
+    \item \code{mtdinfo} to get detailed information about an MTD device
+    \item \code{flash_erase} to partially or completely erase a given
+      MTD device
+    \item \code{flashcp} to write to NOR flash
+    \item \code{nandwrite} to write to NAND flash
+    \item UBI utilities
+    \item Flash filesystem image creation tools: \code{mkfs.jffs2},
+      \code{mkfs.ubifs}
+    \end{itemize}
+  \item Usually available as the \code{mtd-utils} package in your distribution
+  \item Most commands now also available in BusyBox
+  \item See \url{http://www.linux-mtd.infradead.org/}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
   \frametitle{UBI - Preparation}
   \begin{itemize}
   \item Have \code{/dev/} mounted as a \code{devtmpfs} filesystem
@@ -536,23 +617,6 @@ vol_alignment=1
 \end{frame}
 
 \begin{frame}
-  \frametitle{Reducing the number of writes}
-  \begin{itemize}
-  \item Of course, do not use your flash storage as swap area (rare in
-    embedded systems anyway)
-  \item Mount your filesystems as read-only, or use read-only
-    filesystems (SquashFS), whenever possible.
-  \item Keep volatile files in RAM (tmpfs)
-  \item Don't use the \code{sync} mount option (commits writes
-    immediately). Use the \code{fsync()} system call for per-file
-    synchronization.
-  \item You may decide to do without journaled filesystems. They cause
-    more writes, but are also much more power down resistant
-    (trade-off).
-  \end{itemize}
-\end{frame}
-
-\begin{frame}
   \frametitle{Useful reading}
   \begin{itemize}
   \item Arnd Bergmann: Optimizing Linux with cheap flash drives\\
@@ -569,8 +633,8 @@ vol_alignment=1
 {Flash Filesystems}
 {
   \begin{itemize}
-  \item Creating partitions in your internal flash storage.
-  \item Use a read-only JFFS2 partition for the system
-  \item Use a read-write JFFS2 partition for data
+  \item Creating partitions in your internal flash storage
+  \item Create a UBI image with several volumes and flash it from u-boot
+  \item Manipulate UBI volumes from linux
   \end{itemize}
 }
diff --git a/slides/sysdev-flash-filesystems/ubifs-layout.dia b/slides/sysdev-flash-filesystems/ubifs-bad-layout.dia
similarity index 99%
copy from slides/sysdev-flash-filesystems/ubifs-layout.dia
copy to slides/sysdev-flash-filesystems/ubifs-bad-layout.dia
index 5e535fb..edbf429 100644
--- a/slides/sysdev-flash-filesystems/ubifs-layout.dia
+++ b/slides/sysdev-flash-filesystems/ubifs-bad-layout.dia
@@ -845,7 +845,7 @@ ubi0:data)#</dia:string>
         <dia:point val="18.75,-2.75"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="17.13,-4.23332;20.3816,-1.26668"/>
+        <dia:rectangle val="17.13,-4.21597;20.37,-1.28403"/>
       </dia:attribute>
       <dia:attribute name="text">
         <dia:composite type="text">
@@ -864,7 +864,7 @@ on /otherapp
             <dia:real val="0.49388886988162994"/>
           </dia:attribute>
           <dia:attribute name="pos">
-            <dia:point val="18.75,-3.85425"/>
+            <dia:point val="18.75,-3.84847"/>
           </dia:attribute>
           <dia:attribute name="color">
             <dia:color val="#000000"/>
diff --git a/slides/sysdev-flash-filesystems/ubifs-layout.dia b/slides/sysdev-flash-filesystems/ubifs-good-layout.dia
similarity index 77%
copy from slides/sysdev-flash-filesystems/ubifs-layout.dia
copy to slides/sysdev-flash-filesystems/ubifs-good-layout.dia
index 5e535fb..1cad4c8 100644
--- a/slides/sysdev-flash-filesystems/ubifs-layout.dia
+++ b/slides/sysdev-flash-filesystems/ubifs-good-layout.dia
@@ -68,13 +68,13 @@
         <dia:point val="0.5,-7"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.45,-7.05;28.55,5.05"/>
+        <dia:rectangle val="0.45,-7.05;27.55,5.05"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
         <dia:point val="0.5,-7"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
-        <dia:real val="28"/>
+        <dia:real val="27"/>
       </dia:attribute>
       <dia:attribute name="elem_height">
         <dia:real val="12"/>
@@ -97,13 +97,13 @@
         <dia:point val="1,-6.5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.95,-6.55;16.05,3.55"/>
+        <dia:rectangle val="0.95,-6.55;21.05,3.55"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
         <dia:point val="1,-6.5"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
-        <dia:real val="15"/>
+        <dia:real val="20"/>
       </dia:attribute>
       <dia:attribute name="elem_height">
         <dia:real val="10"/>
@@ -126,42 +126,13 @@
         <dia:point val="21.5,-6.5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="21.45,-6.55;28.05,3.55"/>
+        <dia:rectangle val="21.45,-6.55;27.05,3.55"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
         <dia:point val="21.5,-6.5"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
-        <dia:real val="6.5"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="10"/>
-      </dia:attribute>
-      <dia:attribute name="border_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="border_color">
-        <dia:color val="#5cacff"/>
-      </dia:attribute>
-      <dia:attribute name="inner_color">
-        <dia:color val="#d8e5e5"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O3">
-      <dia:attribute name="obj_pos">
-        <dia:point val="16.5,-6.5"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="16.45,-6.55;21.05,3.55"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="16.5,-6.5"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="4.5"/>
+        <dia:real val="5.5"/>
       </dia:attribute>
       <dia:attribute name="elem_height">
         <dia:real val="10"/>
@@ -179,12 +150,12 @@
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O4">
+    <dia:object type="Standard - Text" version="1" id="O3">
       <dia:attribute name="obj_pos">
-        <dia:point val="14.5,5"/>
+        <dia:point val="14,5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="12.5075,4.2525;16.4925,5"/>
+        <dia:rectangle val="12.0075,4.2525;15.9925,5"/>
       </dia:attribute>
       <dia:attribute name="text">
         <dia:composite type="text">
@@ -198,7 +169,7 @@
             <dia:real val="0.80000000000000004"/>
           </dia:attribute>
           <dia:attribute name="pos">
-            <dia:point val="14.5,4.8475"/>
+            <dia:point val="14,4.8475"/>
           </dia:attribute>
           <dia:attribute name="color">
             <dia:color val="#000000"/>
@@ -215,12 +186,12 @@
         <dia:connection handle="0" to="O0" connection="6"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O5">
+    <dia:object type="Standard - Text" version="1" id="O4">
       <dia:attribute name="obj_pos">
-        <dia:point val="8.5,3.5"/>
+        <dia:point val="11,3.5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="6.01875,2.7525;10.9812,3.5"/>
+        <dia:rectangle val="8.51875,2.7525;13.4813,3.5"/>
       </dia:attribute>
       <dia:attribute name="text">
         <dia:composite type="text">
@@ -234,7 +205,7 @@
             <dia:real val="0.80000000000000004"/>
           </dia:attribute>
           <dia:attribute name="pos">
-            <dia:point val="8.5,3.3475"/>
+            <dia:point val="11,3.3475"/>
           </dia:attribute>
           <dia:attribute name="color">
             <dia:color val="#000000"/>
@@ -251,54 +222,17 @@
         <dia:connection handle="0" to="O1" connection="6"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O6">
-      <dia:attribute name="obj_pos">
-        <dia:point val="18.75,3.5"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="17.0875,1.9525;20.4125,3.5"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#MTD
-partition 1#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="18.75,2.5475"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="1"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O3" connection="6"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O7">
+    <dia:object type="Standard - Text" version="1" id="O5">
       <dia:attribute name="obj_pos">
-        <dia:point val="24.75,3.5"/>
+        <dia:point val="24.25,3.5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="22.2688,2.7525;27.2313,3.5"/>
+        <dia:rectangle val="21.7688,2.7525;26.7313,3.5"/>
       </dia:attribute>
       <dia:attribute name="text">
         <dia:composite type="text">
           <dia:attribute name="string">
-            <dia:string>#MTD partition 2#</dia:string>
+            <dia:string>#MTD partition 1#</dia:string>
           </dia:attribute>
           <dia:attribute name="font">
             <dia:font family="sans" style="0" name="Helvetica"/>
@@ -307,7 +241,7 @@ partition 1#</dia:string>
             <dia:real val="0.80000000000000004"/>
           </dia:attribute>
           <dia:attribute name="pos">
-            <dia:point val="24.75,3.3475"/>
+            <dia:point val="24.25,3.3475"/>
           </dia:attribute>
           <dia:attribute name="color">
             <dia:color val="#000000"/>
@@ -324,18 +258,18 @@ partition 1#</dia:string>
         <dia:connection handle="0" to="O2" connection="6"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O8">
+    <dia:object type="Standard - Box" version="0" id="O6">
       <dia:attribute name="obj_pos">
         <dia:point val="1.5,-6"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="1.45,-6.05;15.55,2.55"/>
+        <dia:rectangle val="1.45,-6.05;20.55,2.55"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
         <dia:point val="1.5,-6"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
-        <dia:real val="14"/>
+        <dia:real val="19"/>
       </dia:attribute>
       <dia:attribute name="elem_height">
         <dia:real val="8.5"/>
@@ -353,7 +287,7 @@ partition 1#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O9">
+    <dia:object type="Standard - Box" version="0" id="O7">
       <dia:attribute name="obj_pos">
         <dia:point val="2,-5.5"/>
       </dia:attribute>
@@ -382,7 +316,7 @@ partition 1#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O10">
+    <dia:object type="Standard - Text" version="1" id="O8">
       <dia:attribute name="obj_pos">
         <dia:point val="4,1.5"/>
       </dia:attribute>
@@ -416,10 +350,10 @@ rootfs#</dia:string>
         <dia:enum val="1"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O9" connection="6"/>
+        <dia:connection handle="0" to="O7" connection="6"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O11">
+    <dia:object type="Standard - Box" version="0" id="O9">
       <dia:attribute name="obj_pos">
         <dia:point val="6.5,-5.5"/>
       </dia:attribute>
@@ -448,7 +382,7 @@ rootfs#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O12">
+    <dia:object type="Standard - Text" version="1" id="O10">
       <dia:attribute name="obj_pos">
         <dia:point val="8.25,1.5"/>
       </dia:attribute>
@@ -482,10 +416,10 @@ raw#</dia:string>
         <dia:enum val="1"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O11" connection="6"/>
+        <dia:connection handle="0" to="O9" connection="6"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O13">
+    <dia:object type="Standard - Box" version="0" id="O11">
       <dia:attribute name="obj_pos">
         <dia:point val="10.5,-5.5"/>
       </dia:attribute>
@@ -514,7 +448,7 @@ raw#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O14">
+    <dia:object type="Standard - Text" version="1" id="O12">
       <dia:attribute name="obj_pos">
         <dia:point val="12.75,1.5"/>
       </dia:attribute>
@@ -548,10 +482,10 @@ data#</dia:string>
         <dia:enum val="1"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O13" connection="6"/>
+        <dia:connection handle="0" to="O11" connection="6"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O15">
+    <dia:object type="Standard - Box" version="0" id="O13">
       <dia:attribute name="obj_pos">
         <dia:point val="2.5,-5"/>
       </dia:attribute>
@@ -580,36 +514,7 @@ data#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O16">
-      <dia:attribute name="obj_pos">
-        <dia:point val="17,-5"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="16.95,-5.05;20.55,-0.45"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="17,-5"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="3.5"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="4.5"/>
-      </dia:attribute>
-      <dia:attribute name="border_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="border_color">
-        <dia:color val="#6a8954"/>
-      </dia:attribute>
-      <dia:attribute name="inner_color">
-        <dia:color val="#c5e387"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O17">
+    <dia:object type="Standard - Text" version="1" id="O14">
       <dia:attribute name="obj_pos">
         <dia:point val="4,-2.75"/>
       </dia:attribute>
@@ -647,10 +552,10 @@ ubi0:rootfs)#</dia:string>
         <dia:enum val="2"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O15" connection="8"/>
+        <dia:connection handle="0" to="O13" connection="8"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O18">
+    <dia:object type="Standard - Text" version="1" id="O15">
       <dia:attribute name="obj_pos">
         <dia:point val="11,6"/>
       </dia:attribute>
@@ -683,7 +588,7 @@ ubi0:rootfs)#</dia:string>
         <dia:enum val="3"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O19">
+    <dia:object type="Standard - Box" version="0" id="O16">
       <dia:attribute name="obj_pos">
         <dia:point val="11,-5"/>
       </dia:attribute>
@@ -712,7 +617,7 @@ ubi0:rootfs)#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O20">
+    <dia:object type="Standard - Text" version="1" id="O17">
       <dia:attribute name="obj_pos">
         <dia:point val="12.75,-2.75"/>
       </dia:attribute>
@@ -750,47 +655,18 @@ ubi0:data)#</dia:string>
         <dia:enum val="2"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O19" connection="8"/>
+        <dia:connection handle="0" to="O16" connection="8"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O21">
-      <dia:attribute name="obj_pos">
-        <dia:point val="22,-6"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="21.95,-6.05;27.55,2.55"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="22,-6"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="5.5"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="8.5"/>
-      </dia:attribute>
-      <dia:attribute name="border_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="border_color">
-        <dia:color val="#d9cb2f"/>
-      </dia:attribute>
-      <dia:attribute name="inner_color">
-        <dia:color val="#fff8a8"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O22">
+    <dia:object type="Standard - Box" version="0" id="O18">
       <dia:attribute name="obj_pos">
-        <dia:point val="22.5,-5.5"/>
+        <dia:point val="15.5,-5.5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="22.45,-5.55;27.05,1.55"/>
+        <dia:rectangle val="15.45,-5.55;20.05,1.55"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="22.5,-5.5"/>
+        <dia:point val="15.5,-5.5"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="4.5"/>
@@ -811,15 +687,15 @@ ubi0:data)#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Box" version="0" id="O23">
+    <dia:object type="Standard - Box" version="0" id="O19">
       <dia:attribute name="obj_pos">
-        <dia:point val="23,-5"/>
+        <dia:point val="16,-5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="22.95,-5.05;26.55,-0.45"/>
+        <dia:rectangle val="15.95,-5.05;19.55,-0.45"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="23,-5"/>
+        <dia:point val="16,-5"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="3.5"/>
@@ -840,12 +716,12 @@ ubi0:data)#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O24">
+    <dia:object type="Standard - Text" version="1" id="O20">
       <dia:attribute name="obj_pos">
-        <dia:point val="18.75,-2.75"/>
+        <dia:point val="24.25,-1.5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="17.13,-4.23332;20.3816,-1.26668"/>
+        <dia:rectangle val="22.63,-2.96597;25.87,-0.0340278"/>
       </dia:attribute>
       <dia:attribute name="text">
         <dia:composite type="text">
@@ -864,7 +740,7 @@ on /otherapp
             <dia:real val="0.49388886988162994"/>
           </dia:attribute>
           <dia:attribute name="pos">
-            <dia:point val="18.75,-3.85425"/>
+            <dia:point val="24.25,-2.59847"/>
           </dia:attribute>
           <dia:attribute name="color">
             <dia:color val="#000000"/>
@@ -878,15 +754,15 @@ on /otherapp
         <dia:enum val="2"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O16" connection="8"/>
+        <dia:connection handle="0" to="O2" connection="8"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O25">
+    <dia:object type="Standard - Text" version="1" id="O21">
       <dia:attribute name="obj_pos">
-        <dia:point val="24.75,-2.75"/>
+        <dia:point val="17.75,-2.75"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="23.8625,-4.21597;25.6375,-1.28403"/>
+        <dia:rectangle val="16.8625,-4.21597;18.6375,-1.28403"/>
       </dia:attribute>
       <dia:attribute name="text">
         <dia:composite type="text">
@@ -905,7 +781,7 @@ ubi1:log)#</dia:string>
             <dia:real val="0.49388886988162994"/>
           </dia:attribute>
           <dia:attribute name="pos">
-            <dia:point val="24.75,-3.84847"/>
+            <dia:point val="17.75,-3.84847"/>
           </dia:attribute>
           <dia:attribute name="color">
             <dia:color val="#000000"/>
@@ -919,15 +795,15 @@ ubi1:log)#</dia:string>
         <dia:enum val="2"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O23" connection="8"/>
+        <dia:connection handle="0" to="O19" connection="8"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O26">
+    <dia:object type="Standard - Text" version="1" id="O22">
       <dia:attribute name="obj_pos">
-        <dia:point val="8.5,2.5"/>
+        <dia:point val="11,2.5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="5.99625,1.7525;11.0038,2.5"/>
+        <dia:rectangle val="8.49625,1.7525;13.5038,2.5"/>
       </dia:attribute>
       <dia:attribute name="text">
         <dia:composite type="text">
@@ -941,43 +817,7 @@ ubi1:log)#</dia:string>
             <dia:real val="0.80000000000000004"/>
           </dia:attribute>
           <dia:attribute name="pos">
-            <dia:point val="8.5,2.3475"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="1"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O8" connection="6"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O27">
-      <dia:attribute name="obj_pos">
-        <dia:point val="24.75,2.5"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="22.2462,1.7525;27.2538,2.5"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#UBI device ubi1#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="24.75,2.3475"/>
+            <dia:point val="11,2.3475"/>
           </dia:attribute>
           <dia:attribute name="color">
             <dia:color val="#000000"/>
@@ -991,15 +831,15 @@ ubi1:log)#</dia:string>
         <dia:enum val="1"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O21" connection="6"/>
+        <dia:connection handle="0" to="O6" connection="6"/>
       </dia:connections>
     </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O28">
+    <dia:object type="Standard - Text" version="1" id="O23">
       <dia:attribute name="obj_pos">
-        <dia:point val="24.75,1.5"/>
+        <dia:point val="17.75,1.5"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="23.2087,0.2725;26.2912,1.5"/>
+        <dia:rectangle val="16.2087,0.2725;19.2912,1.5"/>
       </dia:attribute>
       <dia:attribute name="text">
         <dia:composite type="text">
@@ -1014,7 +854,7 @@ log#</dia:string>
             <dia:real val="0.63499997556209564"/>
           </dia:attribute>
           <dia:attribute name="pos">
-            <dia:point val="24.75,0.745"/>
+            <dia:point val="17.75,0.745"/>
           </dia:attribute>
           <dia:attribute name="color">
             <dia:color val="#000000"/>
@@ -1028,7 +868,7 @@ log#</dia:string>
         <dia:enum val="1"/>
       </dia:attribute>
       <dia:connections>
-        <dia:connection handle="0" to="O22" connection="6"/>
+        <dia:connection handle="0" to="O18" connection="6"/>
       </dia:connections>
     </dia:object>
   </dia:layer>



More information about the training-materials-updates mailing list