\section{\label{ref:Rockboxinflash}Rockbox in Flash}

\subsection{Introduction}

When you bought your \playertype, it came with the \playerman\ firmware in
flash ROM. When you power on your \dap, this \playerman\ firmware starts,
and then loads an updated firmware from disk if present (\firmwarefilename).
An ordinary Rockbox installation only replaces the on-disk firmware, leaving
the flash ROM contents intact. That means the \playerman\ firmware still
controls the boot process.

The main reason to change this is to improve the startup time of your player.
The \playerman\ bootloader is rather slow. With Rockbox in flash, your \dap\
will boot much faster, typically in three to five seconds. Furthermore you
might prefer a clean Rockbox environment, with as little remnants of the
\playerman\ software as possible.
\opt{rombox}{On your \dap\ it is also possible to execute Rockbox directly
  from flash ROM, increasing the amount of free RAM for buffering music. This
  is called \emph{Rombox}.
}

\warn{Flashing your \dap\ is somewhat dangerous, like programming a mainboard
  \emph{BIOS}, \emph{CD/DVD} drive firmware, mobile phone, etc. If the power
  fails, the chip breaks while programming or most of all the programming
  software malfunctions, you'll have a dead box. We take no responsibility of
  any kind, you do that at your own risk. However, we tried as carefully as
  possible to bulletproof this code. There are a lot of sanity checks. If any
  of them fails, it will not program.
}

\opt{ondio}{\warn{After flashing Rockbox, never try to ROLO the \playerman\
    firmware
    \opt{ondiofm}{versions 1.31f or 1.32b! These versions are flash updates
      themselves. If they are}
    \opt{ondiosp}{version 1.32b! This version is a flash update itself.
      If it is}
    applied when Rockbox is flashed, you'll end up with a garbled flash ROM
    and hence a dead box.
}}

There's an ultimate safety net to bring back boxes with even completely
garbled flash content: the \emph{UART} boot mod, which in turn requires the
\emph{serial} mod. With that it's possible to reflash independently from the
outside, even if the flash ROM is completely erased.
\nopt{ondio}{This won't work if you have one of the rare ``ROMless'' boxes. These
  have no boot ROM and boot directly from flash.
}
If the first $\approx$2~KB of the flash ROM are flashed OK, \emph{Minimon} can
be used for the same purpose.

\subsection{Terminology and Basic Operation}

\begin{description}
\item[Firmware:] The flash ROM contents as a whole.
\item[Image:] One operating software started from there.
\end{description}

The replacement firmware contains a bootloader and two images. The first image
is the \emph{permanent} rescue software, to be used in case something is wrong
with the second (main) image. In current firmware files this first image
contains \emph{Bootbox} (see wiki for details). The second image is what is
booted by default. The current firmware files contain a copy of Rockbox 3.2
in the main image. It can easily be updated/replaced later.

The bootloader allows to select which image to run. Pressing
\opt{RECORDER_PAD}{\ButtonFOne}\opt{PLAYER_PAD,ONDIO_PAD}{\ButtonLeft} at boot
selects the first image.
\opt{RECORDER_PAD}{\ButtonFTwo}\opt{PLAYER_PAD}{\ButtonPlay}\opt{ONDIO_PAD}{\ButtonUp}
selects the second image, which will also be booted if you don't press any
button. The button mapping is only there for completeness.
\opt{RECORDER_PAD}{\ButtonFThree}\opt{PLAYER_PAD,ONDIO_PAD}{\ButtonRight}
selects the built-in serial monitor called \emph{Minimon}. You should know this
in case you invoke it by accident. Minimon won't display anything on the
screen. To get out of it, perform a hardware shutdown of your \dap.

\subsection{Initial Flashing Procedure}

You only need to perform this procedure the first time you flash your
\playertype. You may also want to perform it in case the update procedure for
the second image recommends it. In the latter case do not perform the steps
listed under ``Preparation''.

\subsubsection{Preparation}

\nopt{ondio}{
  First, check whether your \playertype\ is flashable at all. Select
  \setting{System $\rightarrow$ Debug (Keep Out!) $\rightarrow$ View HW
  Info}. 
  \opt{lcd_charcell}{Cycle through the displayed values with \ButtonRight /
    \ButtonLeft\ until ``Flash:'' is displayed. If it shows question marks,
  }
  \opt{lcd_bitmap}{Check the values in the line starting with ``Flash:''. If it
    shows question marks after ``M='' and ``D='',
  }
  you're out of luck, your \dap\ is not flashable without modifying the
  hardware. You can stop here. Sorry.
}

\nopt{ondio}{If your \dap\ is flashable, you}\opt{ondio}{You} should perform a
backup of the current flash ROM contents, in case you want to restore it later.
Select \setting{System $\rightarrow$ Debug (Keep Out!) $\rightarrow$ Dump ROM
contents}. You'll notice a few seconds of disk activity. When you connect your
\dap\ to the PC afterwards, you'll find two files in the root of your \dap.
Copy the 256~KB-sized file named \fname{internal\_rom\_2000000-203FFFF.bin} to
a safe place.

\subsubsection{Flashing}

\begin{enumerate}
\item Download the correct package for your \dap\ from
  \url{http://download.rockbox.org/bootloader/archos/}. It is named
  \fname{flash-{\textless}model{\textgreater}-{\textless}version{\textgreater}.zip}.
  The current packages are v3.
\item Unzip the flash package to the root of your \dap.
  \nopt{ondio}{This will extract two files to the root,
    \fname{firmware\_{\textless}model{\textgreater}.bin} and
    \fname{firmware\_{\textless}model{\textgreater}\_norom.bin}.
    \opt{recorder,recorderv2fm}{(The {\textless}model{\textgreater} part is
      slighty different from that in the .zip file name.)
    }
    The flash plugin will select the correct one for your \dap.
  }
  \opt{ondio}{This will extract one file to the root,
    \fname{firmware\_{\textless}model{\textgreater}.bin}.
  }
  Now safely disconnect USB.
\item
  \nopt{ondio}{Make sure your batteries are in good shape and fully charged.}
  \opt{ondio}{Make sure you use a set of fresh batteries.}
  Flashing doesn't need more power than normal operation, but you don't want
  your \dap\ to run out of power while flashing.
\item Select \setting{Plugins $\rightarrow$ Applications}, and run the
  \fname{firmware\_flash} plugin. It will tell you about your flash and
  which file it is going to program. After pressing
  \opt{RECORDER_PAD}{\ButtonFOne}\opt{PLAYER_PAD}{\ButtonMenu}\opt{ONDIO_PAD}{\ButtonLeft}
  it will check the file. If the file is OK, pressing
  \opt{RECORDER_PAD}{\ButtonFTwo}\opt{PLAYER_PAD}{\ButtonOn}\opt{ONDIO_PAD}{\ButtonUp}
  will give you a big warning. If we still didn't manage to scare you off, you
  need to press 
  \opt{RECORDER_PAD}{\ButtonFThree}\opt{PLAYER_PAD,ONDIO_PAD}{\ButtonRight}
  to actually program and verify. The programming takes just a few seconds.
\item In the unlikely event that the programming or verify steps should give
  you any error, \emph{do not switch off the box!} Otherwise you'll have seen
  it working for the last time. While Rockbox is still in RAM and operational,
  we could upgrade the plugin via USB and try again. If you switch it off,
  it's gone.
\end{enumerate}

\note{After successful flashing you may delete the \fname{.bin} files from the
  root of your \dap.
}

\note{There are no separate flash packages for {\dap}s modified to have 8~MB
  of RAM. You need to use the corresponding package for non-modified
  \playertype. You should then install a Rockbox image that makes use of all
  available RAM as described in the following section.
}

\subsection{Updating the Rockbox Image in Flash}

When Rockbox is booted from flash, it does not check for an updated firmware
on disk. This is one of the reasons why it boots faster than the \playerman\
firmware. It means that whenever you update Rockbox, you also need to update
the image in the flash. This is a simple and safe procedure:

\begin{enumerate}
\item Download (or build) the Rockbox build you want to use, and unzip it to
  the root of your \dap. Safely disconnect USB.
\item ROLO into the new Rockbox version.
\item Go to the file browser, and enter the \fname{.rockbox} directory (you
  might need to set the \setting{File View} option to \setting{All}.)
\item Play the file \fname{rockbox.ucl}\opt{rombox}{, or preferably
  \fname{rombox.ucl}}, and follow the instructions. The plugin handling
  this is \fname{rockbox\_flash}, a viewer plugin.
\end{enumerate}

\subsection{Restoring the Original Flash ROM Contents}

In case you ever want to restore the original flash contents, you will need
the backup file. The procedure is very similar to initial flashing, with the
following differences:

\begin{enumerate}
\item Check that you do not have any \fname{firmware\_*.bin} files in your
  \dap's root.
\item Select \setting{Plugins $\rightarrow$ Applications}, and run the
  \fname{firmware\_flash} plugin. Write down the filename it displays in the
  first screen, then exit the plugin.
\item Connect USB, and copy the flash ROM backup file to the root of your
  \dap. \emph{Only use the backup file from that very box, otherwise you're
  asking for trouble!} Rename the file so that it matches the name requested
  by the \fname{firmware\_flash} plugin. Safely disconnect USB.
\end{enumerate}

Now follow the instructions given for initial flashing, starting with step 3.
