[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