/** @mainpage Barebox

Barebox is a bootloader that initializes a hardware and boots Linux and
maybe other operating systems or bare metal code on a variety of
processors. It was initialy derived from U-Boot and captures up with
several of it's ideas, so users being familiar with U-Boot should come
into production quickly with Barebox.

However, as the Barebox developers are highly addicted to the Linux
kernel, it's coding style and code quality, we try to stick as closely
as possible to the methodologies and techniques developed in Linux. In
addition we have a strong background in POSIX, so you'll find several
good old Unix traditions realized in Barebox as well.

@par Highlights:

- <b>POSIX File API:</b><br>
  @a Barebox uses the the well known open/close/read/write/lseek access
  functions, together with a model of representing devices by files. This
  makes the APIs familiar to everyone who has experience with Unix
  systems.

- <b>Shell:</b><br>
  We have the standard shell commands like ls/cd/mkdir/echo/cat,...

- <b>Environment Filesystem:</b><br>
  In contrast to U-Boot, Barebox doesn't misuse the environment for
  scripting. If you start the bootloader, it gives you a shell and
  something that looks like a filesystem. In fact it isn't: it is a very
  simple ar archive being extracted from flash into a ramdisk with 'loadenv'
  and stored back with 'saveenv'.

- <b>Filesystem Support:</b><br>
  When starting up, the environment is mounted to /, followed by a
  device filesytem being mounted to /dev in order to make it possible to
  access devices. Other filesystems can be mounted on demand.

- <b>Driver Model (borrowed from Linux):</b><br>
  Barebox follows the Linux driver model: devices can be specified in a
  hardware specific file, and drivers feel responsible for these devices
  if they have the same name.

- <b>Clocksource:</b><br>
  We use the clocksource API knwon from Linux.

- <b>Kconfig/Kbuild:</b><br>
  This gives us parallel builds and removes the need for lots of ifdefs.

- <b>Sandbox:</b><br>
  If you develop features for @a Barebox, you can use the 'sandbox'
  target which compiles @a Barebox as a POSIX application in the Linux
  userspace: it can be started like a normal command and even has
  network access (tun/tap). Files from the local filesytem can be used
  to simulate devices.

- <b>Device Parameters:</b><br>
  There is a parameter model in @a Barebox: each device can specify it's
  own parameters, which do exist for every instance. Parameters can be
  changed on the command line with \<devid\>.\<param\>="...". For
  example, if you want to access the IPv4 address for eth0, this is done
  with 'eth0.ip=192.168.0.7' and 'echo $eth0.ip'.

- <b>Getopt:</b><br>
  @a Barebox has a lightweight getopt() implementation. This makes it
  unnecessary to use positional parameters, which can be hard to read.

- <b>Integrated Editor:</b><br>
  Scripts can be edited with a small integrated fullscreen editor.
  This editor has no features except the ones really needed: moving
  the cursor around, typing characters, exiting and saving.


@par Directory layout

Most of the directory layout is based upon the Linux Kernel:

@verbatim
arch / * /                -> contains architecture specific parts
arch / * / mach-* /       -> SoC specific code

drivers / serial          -> drivers
drivers / net
drivers / ...

include / asm-*           -> architecture specific includes
include / asm-* / arch-*  -> SoC specific includes

fs /                      -> filesystem support and filesystem drivers

lib /                     -> generic library functions (getopt, readline and the
                              like)

common /                  -> common stuff

commands /                -> many things previously in common/cmd_*, one command
                             per file

net /                     -> Networking stuff

scripts /                 -> Kconfig system

Documentation /           -> Parts of the documentation, also doxygen
@endverbatim

@section license barebox's License

@verbatim
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston,
MA 02111-1307 USA
@endverbatim

@subpage users_manual

@subpage developers_manual

@subpage supported_boards

*/
