[PATCH 3/3] README: bring it up to date

Ahmad Fatoum a.fatoum at pengutronix.de
Fri Aug 9 07:24:44 PDT 2024


Most of the file was written when barebox used to be called U-Boot v2.
It thus focused on comparisons and highlighted some aspects that
U-Boot has since adopted.

Give the file an overhaul by converting it to ReST and highlight
my subjective take on what makes barebox cool in 2024.

Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
 README     | 271 -------------------------------------------
 README.rst | 328 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 328 insertions(+), 271 deletions(-)
 delete mode 100644 README
 create mode 100644 README.rst

diff --git a/README b/README
deleted file mode 100644
index 37fd80c10280..000000000000
--- a/README
+++ /dev/null
@@ -1,271 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-
-barebox
--------
-
-barebox is a bootloader that follows the tradition of Das U-Boot, while
-adopting modern design ideas from the Linux kernel.
-
-
-Features
---------
-
-- A POSIX-based file API
-  Inside barebox the usual open/close/read/write/lseek functions are used.
-  This makes it familiar to everyone who has programmed under UNIX systems.
-
-- Usual shell commands like ls/cd/mkdir/echo/cat,...
-
-- The environment is not a variable store anymore, but a file store. It has
-  currently some limitations, of course. The environment is not a real
-  read/write filesystem, but more like a tar archive.
-  The saveenv command saves the files under a certain directory (by default
-  /env) in persistent storage (by default /dev/env0). There is a counterpart
-  called loadenv, too.
-
-- filesystem support
-  The loader starts up with mounting a ramdisk on /. Then a devfs is mounted
-  on /dev allowing the user (or shell commands) to access devices. Apart from
-  these two filesystems there are a number of different filesystems ported:
-  ext4, efi, efivarfs, ext4, fat, jffs2, NFS, pstore, squashfs, ubifs,
-  u-boot variable FS among others.
-
-- device/driver model
-  Devices are no longer described by defines in the config file. Instead
-  devices are registered as they are discovered (e.g. through OpenFirmware
-  device tree traversal or EFI handles) or by board code.
-  Drivers will match upon the devices automatically.
-
-- clocksource support
-  Timekeeping has been simplified by the use of the Linux clocksource API.
-  no [gs]et_timer[masked]() or reset_timer[masked]() functions.
-
-- Kconfig and Kernel build system
-  Only targets which are really needed get recompiled. Parallel builds are
-  no problem anymore. This also removes the need for many many ifdefs in
-  the code.
-
-- ARCH=sandbox simulation target
-  barebox can be compiled to run under Linux. While this is rather useless
-  in real world this is a great debugging and development aid. New features
-  can be easily developed and tested on long train journeys and started
-  under gdb. There is a console driver for Linux which emulates a serial
-  device and a TAP-based Ethernet driver. Linux files can be mapped to
-  devices under barebox to emulate storage devices.
-
-- device parameter support
-  Each device can have an unlimited number of parameters. They can be accessed
-  on the command line with <devid>.<param>="...", for example
-  'eth0.ip=192.168.0.7' or 'echo $eth0.ip'
-
-- initcalls
-  hooks in the startup process can be achieved with *_initcall() directives
-  in each file.
-
-- getopt
-  There is a small getopt implementation. Some commands got really
-  complicated (both in code and in usage) due to the fact that U-Boot
-  allowed only positional parameters.
-
-- editor
-  Scripts can be edited with a small editor. This editor has no features
-  except the ones really needed: moving the cursor and typing characters.
-
-
-Building barebox
-----------------
-
-barebox uses the Linux kernel's build system. It consists of two parts:
-the Makefile infrastructure (kbuild), plus a configuration system
-(kconfig). So building barebox is very similar to building the Linux
-kernel.
-
-For the examples below, we use the User Mode barebox implementation, which
-is a port of barebox to the Linux userspace. This makes it possible to
-test drive the code without having real hardware. So for this test
-scenario, ARCH=sandbox is the valid architecture selection. This currently
-works on at least IA32 hosts and x86-64 hosts.
-
-Selection of the architecture and the cross compiler can be done by using
-the environment variables ARCH and CROSS_COMPILE.
-
-In order to configure the various aspects of barebox, start the barebox
-configuration system:
-
-  # make menuconfig
-
-This command starts a menu box and lets you select all the different
-options available for your architecture. Once the configuration was
-finished (you can simulate this by using the standard demo config file
-with 'make sandbox_defconfig'), there is a .config file in the toplevel
-directory of the source code.
-
-Once barebox is configured, we can start the compilation
-
-  # make
-
-If everything goes well, the result is a file called barebox:
-
-  # ls -l barebox
-    -rwxr-xr-x 1 rsc ptx 114073 Jun 26 22:34 barebox
-
-barebox usually needs an environment for storing the configuration data.
-You can generate an environment using the example environment contained
-in board/sandbox/env:
-
-  # ./scripts/bareboxenv -s -p 0x10000 arch/sandbox/board/env env.bin
-
-To get some files to play with, you can generate a cramfs image:
-  # mkcramfs somedir/ cramfs.bin
-
-The barebox image is a normal Linux executable, so it can be started
-just like every other program:
-
-  # ./barebox -e env.bin -i cramfs.bin
-
-  barebox 2.0.0-trunk (Jun 26 2007 - 22:34:38)
-
-  loading environment from /dev/env0
-  barebox> /
-
-Specifying -[ie] <file> tells barebox to map the file as a device
-under /dev. Files given with '-e' will appear as /dev/env[n]. Files
-given with '-i' will appear as /dev/fd[n].
-
-If barebox finds a valid configuration sector on /dev/env0 it will
-load it to /env. It then executes /env/init if it exists. If you have
-loaded the example environment, barebox will show you a menu asking for
-your settings.
-
-If you have started barebox as root, you will find a new tap device on your
-host which you can configure using ifconfig. Once you configured barebox'
-network settings accordingly you can do a ping or tftpboot.
-
-If you have mapped a cramfs image, try mounting it with
-
-  # mkdir /cram
-  # mount /dev/fd0 cramfs /cram
-
-Memory can be examined as usual using md/mw commands. They both understand
-the -f <file> option to tell the commands that they should work on the
-specified files instead of /dev/mem which holds the complete address space.
-Note that if you call 'md /dev/fd0' (without -f) barebox will segfault on
-the host, because it will interpret /dev/fd0 as a number.
-
-
-Directory Layout
-----------------
-
-Most of the directory layout is based upon the Linux Kernel:
-
-arch/*                -> contains architecture specific parts
-arch/*/include        -> architecture specific includes
-arch/*/mach-*         -> SoC specific code
-arch/*/mach-*/include -> SoC specific includes
-
-drivers/serial        -> drivers
-drivers/net
-drivers/...
-
-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/        -> Sphinx generated documentation. Call "make docs" to
-                         generate a HTML version in Documentation/html.
-
-
-Release Strategy
-----------------
-
-barebox is developed with git. On a monthly schedule, tarball releases are
-branched from the repository and released on the project web site. Here
-are the release rules:
-
-- Releases follow a time based scheme:
-
-  barebox-xxxx.yy.z.tar.bz2
-          ^^^^ ^^ ^----------- Bugfix Number, starting at 0
-            \   \------------- Month
-             \---------------- Year
-
-  Example: barebox-2009.12.0.tar.bz2
-
-- Releases are made around the beginning of the month. As we are aiming
-  for monthly releases, development is considered to be a continuous
-  process. If you find bugs in one release, you have the chance to get
-  patches in on a very short time scale.
-
-- Usually, there are no bugfix releases, so z=0. If there is a need
-  to make a bugfix release, z is the right place to increment.
-
-- If there may be a reason for pre releases, they are called
-
-  barebox-xxxx.yy.z-pren.tar.bz
-                       ^------ Number of prerelease, starting with 1
-
-  Example: barebox-2009.12.0-pre1.tar.bz2
-
-  We think that there is no need for pre releases, but if it's ever
-  necessary, this is the scheme we follow.
-
-- Only the monthly releases are archived on the web site. The tarballs
-  are located in https://www.barebox.org/download/ and this location
-  does never change, in order to make life easier for distribution
-  people.
-
-
-Contributing
-------------
-
-For any questions regarding barebox, send a mail to the mailing list at
-<barebox at lists.infradead.org>. The archives for this list are available
-publicly at <http://lists.infradead.org/pipermail/barebox/> and
-<https://lore.barebox.org/barebox/>.
-
-The same list should also be used to send patches. barebox uses a similar
-process as the Linux kernel, so most of the Linux guide for submitting patches
-<https://www.kernel.org/doc/html/latest/process/submitting-patches.html> also
-applies to barebox (except the step for selecting your recipient - we don't
-have a MAINTAINERS file, instead all patches go to the list).
-
-
-License
--------
-
-Copyright (C) 2000 - 2005 Wolfgang Denk, DENX Software Engineering, wd at denx.de.
-Copyright (C) 2018 Sascha Hauer, Pengutronix, and individual contributors
-
-barebox is free software: you can redistribute it and/or modify it under the
-terms of the GNU General Public License, version 2, as published by the Free
-Software Foundation.
-
-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 in the file
-COPYING along with this program. If not, see <https://www.gnu.org/licenses/>.
-
-Individual files may contain the following SPDX license tags as a shorthand for
-the above copyright and warranty notices:
-
-    SPDX-License-Identifier: GPL-2.0-only
-    SPDX-License-Identifier: GPL-2.0-or-later
-
-This eases machine processing of licensing information based on the SPDX
-License Identifiers that are available at http://spdx.org/licenses/.
-
-Also note that some files in the barebox source tree are available under
-several different GPLv2-compatible open-source licenses. This fact is noted
-clearly in the file headers of the respective files.
diff --git a/README.rst b/README.rst
new file mode 100644
index 000000000000..17bf288c4c60
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,328 @@
+..
+  SPDX-License-Identifier: GPL-2.0-only
+
+=======
+barebox
+=======
+
+A bootloader that follows the tradition of Das U-Boot, while
+adopting modern design ideas from the Linux kernel.
+
+.. class:: center
+
+`Try it out in your browser ✨ <https://www.barebox.org/jsbarebox/?graphic=0>`_
+·
+`Check out the documentation 📖 <https://www.barebox.org/doc/latest/index.html>`_
+·
+`Get involved 🫶 <https://www.barebox.org/doc/latest/user/introduction.html#feedback>`_
+
+Features
+--------
+
+* A POSIX-based file API:
+  Inside barebox the usual ``open/close/read/write/lseek`` functions are used.
+  This makes it familiar to everyone who has programmed under UNIX systems.
+
+* Usual shell commands like ``ls/cd/mkdir/echo/cat/cp/mount``,...
+  which work uniformly across file systems
+
+* Filesystem support:
+  The loader starts up with mounting a ramdisk on ``/``. Then a devfs is mounted
+  on ``/dev`` allowing the user (or shell commands) to access devices. Apart from
+  these two filesystems there are a number of different filesystems ported:
+  ext4, efi, efivarfs, ext4, fat, jffs2, NFS, tftp, pstore, squashfs, ubifs,
+  ratp (RFC916), u-boot variable FS among others.
+
+* Multiplatform support:
+  Configurations like ``multi_v7_defconfig`` and ``multi_v8_defconfig`` build
+  barebox for many dozens of boards all at once. All resulting images share the
+  same barebox proper binary, each time with a different prebootloader that does
+  low-level initialization and passes in the device tree. Prebootloaders may
+  detect board/SoC type and pass in different device trees to support various
+  boards with the same image.
+
+* Focus on developer experience:
+  barebox provides many features that should be familiar to kernel developers
+
+  * barebox images are designed to be bootable from within barebox itself,
+    so developers can trivially network boot. For chainloading from existing
+    bootloaders, there's also an extra ``barebox-dt-2nd.img`` that is bootable
+    exactly like a Linux kernel.
+  * KASAN (KernelAddressSanitizer) and kallsyms (symbolized stack traces)
+    help in hunting down memory issues
+  * ramoops allows barebox to share its own ``dmesg`` log with Linux
+  * Linux kernel drivers are easier to port, because the driver frameworks are
+    closely based on the upstream Linux counterpart
+
+* Device parameter support:
+  Each device can have an unlimited number of parameters. They can be accessed
+  on the command line with ``<devid>.<param>="..."``, for example
+  ``eth0.ip=192.168.0.7`` or echo ``$eth0.ip``.
+
+* Editor:
+  Scripts can be edited with a small editor. This editor has no features
+  except the ones really needed: moving the cursor and typing characters
+  on multiple lines.
+
+* The environment is not a variable store anymore, but a file store.
+  The ``saveenv`` command archives the files under a certain directory (by default
+  ``/env``) in persistent storage (by default ``/dev/env0``). There is a counterpart
+  called ``loadenv``, too. Additionally, barebox-state provides power-fail-safe
+  variable-only storage with optional authentication, so the mutable environment
+  can be disabled for security reasons.
+
+* Uniformity: Finding out where barebox booted from, determining what caused
+  the last reset, booting in a redundant fail-safe manner, updating barebox on disk
+  are examples of functionality handled generically by frameworks, so boards can look
+  and feel the same and custom scripts or board code are only needed for the
+  exceptional stuff.
+
+* device/driver model:
+  Devices are no longer described by defines in the config file. Instead
+  devices are registered as they are discovered (e.g. through OpenFirmware
+  device tree traversal or EFI handles) or by board code.
+  Drivers will match upon the devices automatically.
+
+* Device Tree Manipulation:
+  barebox has extensive support for fixing up both its own device tree at
+  runtime and the kernel's, whether from board code, shell scripts or within
+  device tree overlays
+
+* Initcalls:
+  hooks in the startup process can be achieved with ``*_initcall()`` directives
+  in each file.
+
+* ``ARCH=sandbox`` simulation target:
+  barebox can be compiled to run under Linux. While this is rather useless
+  in real world this is a great debugging and development aid. New features
+  can be easily developed and tested on long train journeys and started
+  under gdb. There is a console driver for Linux which emulates a serial
+  device and a TAP-based Ethernet driver. Linux files can be mapped to
+  devices under barebox to emulate storage devices.
+
+* and `yes, of course it runs DOOM <https://doomwiki.org/wiki/BareDOOM>`_.
+
+Building barebox
+----------------
+
+barebox uses the Linux kernel's build system. It consists of two parts:
+the Makefile infrastructure (kbuild), plus a configuration system
+(kconfig). So building barebox is very similar to building the Linux
+kernel.
+
+For the examples below, we use the User Mode barebox implementation, which
+is a port of barebox to the Linux userspace. This makes it possible to
+test drive the code without having real hardware. So for this test
+scenario, ``ARCH=sandbox`` is the valid architecture selection. This currently
+works on at least IA32 hosts and x86-64 hosts.
+
+Selection of the architecture and the cross compiler can be done by using
+the environment variables ``ARCH`` and ``CROSS_COMPILE``.
+
+In order to configure the various aspects of barebox, start the barebox
+configuration system::
+
+  # make menuconfig
+
+This command starts a menu box and lets you select all the different
+options available for your architecture. Once the configuration was
+finished (you can simulate this by using the standard demo config file
+with ``make sandbox_defconfig``), there is a ``.config`` file in the
+toplevel directory of the source code.
+
+Once barebox is configured, we can start the compilation::
+
+  # make
+
+If everything goes well, the result is a file called barebox::
+
+  # ls -l barebox
+    -rwxr-xr-x 1 rsc ptx 114073 Jun 26 22:34 barebox
+
+To get some files to play with, you can generate a squashfs image::
+
+  # mksquashfs somedir/ squashfs.bin
+
+The barebox image is a normal Linux executable, so it can be started
+just like every other program::
+
+  # ./barebox -i squashfs.bin
+
+  add fd0 backed by file squashfs.bin
+  add stickypage backed by file /run/user/1000/barebox/stickypage.1661112
+
+  barebox 2024.07.0 #0 Wed Jul 18 11:36:31 CEST 2024
+  [...]
+
+  barebox at Sandbox:/
+
+Specifying ``-[ie] <file>`` tells barebox to map the file as a device
+under /dev. Files given with ``-e`` will appear as ``/dev/env[n]``. Files
+given with ``-i`` will appear as ``/dev/fd[n]``.
+
+If barebox finds a valid configuration sector on ``/dev/env0`` it will
+load it to ``/env``. It then source ``/env/init/*`` if it exists. If you have
+loaded the example environment, barebox will show you a menu asking for
+your settings. The sandbox configuration embeds a "sticky page", which is
+inherited across barebox resets. This way, there's a usable environment
+out-of-the-box.
+
+If you have started barebox as root, you will find a new tap device on your
+host which you can configure using ifconfig. Once you configured barebox'
+network settings accordingly you can do a ping or tftpboot.
+
+If you have mapped a squashfs image, try mounting it with::
+
+  barebox at Sandbox:/ mount fd0
+  mounted /dev/fd0 on /mnt/fd0
+
+When called with a single argument, the barebox ``mount`` command will inspect
+the source device file's magic bytes and mount it with the appropriate file system
+under ``/mnt``.
+
+Memory can be examined as usual using md/mw commands. They understand
+the ``-s <file>`` and ``-d <file>`` options respectively to tell the commands
+that they should work on the specified files instead of ``/dev/mem`` which holds
+the complete address space.
+
+Directory Layout
+----------------
+
+Most of the directory layout is based upon the Linux Kernel
+
+.. list-table::
+
+  * - | ``arch/*``
+      | ``arch/*/include``
+      | ``arch/*/mach-*``
+      | ``include/mach/*``
+    - | contains architecture specific parts
+      | architecture specific includes
+      | SoC specific code
+      | SoC specific includes
+
+  * - | ``drivers/serial``
+      | ``drivers/net/dsa/``
+      | ``drivers/...``
+    - | drivers
+
+  * - | ``fs/``
+    - | filesystem support and filesystem drivers
+
+  * - | ``lib/``
+    - | generic library functions (getopt, readline and the like)
+
+  * - | ``common/``
+      | ``common/boards``
+    - | common stuff
+      | board code shared between multiple boards (possibly of different architectures)
+
+  * - | ``commands/``
+    - | Commands that can be executed by the barebox shell
+
+  * - | ``net/``
+    - | Networking stuff
+
+  * - | ``scripts/``
+    - | Kconfig system and tools used during barebox build or for deploying it
+
+  * - | ``Documentation/``
+    - | Sphinx generated documentation. Call "make docs" to generate a HTML version in Documentation/html.
+
+  * - | ``defaultenv/``
+    - | default environment assembled into images. Board environment is overlaid on top
+
+  * - | ``dts/``
+    - | An import of the upstream device tree repository maintained as part of the Linux kernel
+
+Release Strategy
+----------------
+
+barebox is developed with git. On a monthly schedule, tarball releases are
+branched from the repository and released on the project web site. Here
+are the release rules:
+
+- Releases follow a time based scheme::
+
+    barebox-xxxx.yy.z.tar.bz2
+            ^^^^ ^^ ^----------- Bugfix Number, starting at 0
+              \   \------------- Month
+               \---------------- Year
+
+  Example: barebox-2024.08.0.tar.bz2
+
+- As we are aiming for monthly releases, development is considered to be
+  a continuous process. If you find bugs in one release, you have the chance
+  to get patches in on a very short time scale (usually a month at most).
+
+- New features are applied to the ``next`` branch. Fixes directly to the
+  ``master`` branch. Releases are always branched from ``master`` and then
+  ``next`` is merged into ``master``. Thus new features take 1-2 months
+  until they hit a release.
+
+- Usually, there are no bugfix releases, so z=0. If there is a need
+  to make a bugfix release, z is the right place to increment.
+
+- If there may be a reason for pre releases, they are called ::
+
+    barebox-xxxx.yy.z-pren.tar.bz
+                         ^------ Number of prerelease, starting with 1
+
+  Example: barebox-2009.12.0-pre1.tar.bz2
+
+  We think that there is no need for pre releases, but if it's ever
+  necessary, this is the scheme we follow.
+
+- Only the monthly releases are archived on the web site. The tarballs
+  are located in https://www.barebox.org/download/ and this location
+  does never change, in order to make life easier for distribution
+  people.
+
+.. _contributing:
+
+Contributing
+------------
+
+barebox collaboration happens chiefly on the
+<barebox at lists.infradead.org> mailing list.
+
+The repository can be forked on `Github <https://github.com/barebox/barebox>`
+to run the CI test suite against the virtualized targets before submitting
+patches.
+
+Refer to the
+`introduction section <https://www.barebox.org/doc/latest/user/introduction.html#feedback>`_
+in the documentation for more information.
+
+License
+-------
+
+| Copyright (C) 2000 - 2005 Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+| Copyright (C) 2018 Sascha Hauer, Pengutronix, and individual contributors
+|
+
+
+barebox is free software: you can redistribute it and/or modify it under the
+terms of the GNU General Public License, version 2, as published by the Free
+Software Foundation.
+
+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 in the file
+COPYING along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Individual files may contain the following SPDX license tags as a shorthand for
+the above copyright and warranty notices::
+
+    SPDX-License-Identifier: GPL-2.0-only
+    SPDX-License-Identifier: GPL-2.0-or-later
+
+This eases machine processing of licensing information based on the SPDX
+License Identifiers that are available at http://spdx.org/licenses/.
+
+Also note that some files in the barebox source tree are available under
+several different GPLv2-compatible open-source licenses. This fact is noted
+clearly in the file headers of the respective files and the full license
+text is reproduced in the ``LICENSES/`` directory.
-- 
2.39.2




More information about the barebox mailing list