mirror of
https://xff.cz/git/u-boot/
synced 2025-09-29 22:41:17 +02:00
Merge branch '2019-07-24-master-imports'
- Various Android related changes including A/B update and BCB updates - Assorted minor fixes
This commit is contained in:
1
doc/.gitignore
vendored
Normal file
1
doc/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
output
|
67
doc/android/ab.txt
Normal file
67
doc/android/ab.txt
Normal file
@@ -0,0 +1,67 @@
|
||||
Android A/B updates
|
||||
===================
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
A/B system updates ensures modern approach for system update. This feature
|
||||
allows one to use two sets (or more) of partitions referred to as slots
|
||||
(normally slot A and slot B). The system runs from the current slot while the
|
||||
partitions in the unused slot can be updated [1].
|
||||
|
||||
A/B enablement
|
||||
--------------
|
||||
|
||||
The A/B updates support can be activated by specifying next options in
|
||||
your board configuration file:
|
||||
|
||||
CONFIG_ANDROID_AB=y
|
||||
CONFIG_CMD_AB_SELECT=y
|
||||
|
||||
The disk space on target device must be partitioned in a way so that each
|
||||
partition which needs to be updated has two or more instances. The name of
|
||||
each instance must be formed by adding suffixes: _a, _b, _c, etc.
|
||||
For example: boot_a, boot_b, system_a, system_b, vendor_a, vendor_b.
|
||||
|
||||
As a result you can use 'ab_select' command to ensure A/B boot process in your
|
||||
boot script. This command analyzes and processes A/B metadata stored on a
|
||||
special partition (e.g. "misc") and determines which slot should be used for
|
||||
booting up.
|
||||
|
||||
Command usage
|
||||
-------------
|
||||
|
||||
ab_select <slot_var_name> <interface> <dev[:part_number|#part_name]>
|
||||
|
||||
for example:
|
||||
|
||||
=> ab_select slot_name mmc 1:4
|
||||
|
||||
or
|
||||
|
||||
=> ab_select slot_name mmc 1#misc
|
||||
|
||||
Result:
|
||||
|
||||
=> printenv slot_name
|
||||
slot_name=a
|
||||
|
||||
Based on this slot information, the current boot partition should be defined,
|
||||
and next kernel command line parameters should be generated:
|
||||
|
||||
- androidboot.slot_suffix=
|
||||
- root=
|
||||
|
||||
For example:
|
||||
|
||||
androidboot.slot_suffix=_a root=/dev/mmcblk1p12
|
||||
|
||||
A/B metadata is organized according to AOSP reference [2]. On the first system
|
||||
start with A/B enabled, when 'misc' partition doesn't contain required data,
|
||||
the default A/B metadata will be created and written to 'misc' partition.
|
||||
|
||||
References
|
||||
----------
|
||||
|
||||
[1] https://source.android.com/devices/tech/ota/ab
|
||||
[2] bootable/recovery/bootloader_message/include/bootloader_message/bootloader_message.h
|
@@ -170,7 +170,7 @@ except ImportError:
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#html_logo = None
|
||||
html_logo = '../tools/logos/u-boot_logo.svg'
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
|
@@ -39,6 +39,8 @@ from docutils.statemachine import ViewList
|
||||
from docutils.parsers.rst import directives, Directive
|
||||
from sphinx.ext.autodoc import AutodocReporter
|
||||
|
||||
import kernellog
|
||||
|
||||
__version__ = '1.0'
|
||||
|
||||
class KernelDocDirective(Directive):
|
||||
@@ -86,7 +88,8 @@ class KernelDocDirective(Directive):
|
||||
cmd += [filename]
|
||||
|
||||
try:
|
||||
env.app.verbose('calling kernel-doc \'%s\'' % (" ".join(cmd)))
|
||||
kernellog.verbose(env.app,
|
||||
'calling kernel-doc \'%s\'' % (" ".join(cmd)))
|
||||
|
||||
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
out, err = p.communicate()
|
||||
@@ -96,7 +99,8 @@ class KernelDocDirective(Directive):
|
||||
if p.returncode != 0:
|
||||
sys.stderr.write(err)
|
||||
|
||||
env.app.warn('kernel-doc \'%s\' failed with return code %d' % (" ".join(cmd), p.returncode))
|
||||
kernellog.warn(env.app,
|
||||
'kernel-doc \'%s\' failed with return code %d' % (" ".join(cmd), p.returncode))
|
||||
return [nodes.error(None, nodes.paragraph(text = "kernel-doc missing"))]
|
||||
elif env.config.kerneldoc_verbosity > 0:
|
||||
sys.stderr.write(err)
|
||||
@@ -128,8 +132,8 @@ class KernelDocDirective(Directive):
|
||||
return node.children
|
||||
|
||||
except Exception as e: # pylint: disable=W0703
|
||||
env.app.warn('kernel-doc \'%s\' processing failed with: %s' %
|
||||
(" ".join(cmd), str(e)))
|
||||
kernellog.warn(env.app, 'kernel-doc \'%s\' processing failed with: %s' %
|
||||
(" ".join(cmd), str(e)))
|
||||
return [nodes.error(None, nodes.paragraph(text = "kernel-doc missing"))]
|
||||
|
||||
def setup(app):
|
||||
|
28
doc/sphinx/kernellog.py
Normal file
28
doc/sphinx/kernellog.py
Normal file
@@ -0,0 +1,28 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Sphinx has deprecated its older logging interface, but the replacement
|
||||
# only goes back to 1.6. So here's a wrapper layer to keep around for
|
||||
# as long as we support 1.4.
|
||||
#
|
||||
import sphinx
|
||||
|
||||
if sphinx.__version__[:3] >= '1.6':
|
||||
UseLogging = True
|
||||
from sphinx.util import logging
|
||||
logger = logging.getLogger('kerneldoc')
|
||||
else:
|
||||
UseLogging = False
|
||||
|
||||
def warn(app, message):
|
||||
if UseLogging:
|
||||
logger.warning(message)
|
||||
else:
|
||||
app.warn(message)
|
||||
|
||||
def verbose(app, message):
|
||||
if UseLogging:
|
||||
logger.verbose(message)
|
||||
else:
|
||||
app.verbose(message)
|
||||
|
||||
|
@@ -60,6 +60,8 @@ import sphinx
|
||||
from sphinx.util.nodes import clean_astext
|
||||
from six import iteritems
|
||||
|
||||
import kernellog
|
||||
|
||||
PY3 = sys.version_info[0] == 3
|
||||
|
||||
if PY3:
|
||||
@@ -171,20 +173,20 @@ def setupTools(app):
|
||||
This function is called once, when the builder is initiated.
|
||||
"""
|
||||
global dot_cmd, convert_cmd # pylint: disable=W0603
|
||||
app.verbose("kfigure: check installed tools ...")
|
||||
kernellog.verbose(app, "kfigure: check installed tools ...")
|
||||
|
||||
dot_cmd = which('dot')
|
||||
convert_cmd = which('convert')
|
||||
|
||||
if dot_cmd:
|
||||
app.verbose("use dot(1) from: " + dot_cmd)
|
||||
kernellog.verbose(app, "use dot(1) from: " + dot_cmd)
|
||||
else:
|
||||
app.warn("dot(1) not found, for better output quality install "
|
||||
"graphviz from http://www.graphviz.org")
|
||||
kernellog.warn(app, "dot(1) not found, for better output quality install "
|
||||
"graphviz from http://www.graphviz.org")
|
||||
if convert_cmd:
|
||||
app.verbose("use convert(1) from: " + convert_cmd)
|
||||
kernellog.verbose(app, "use convert(1) from: " + convert_cmd)
|
||||
else:
|
||||
app.warn(
|
||||
kernellog.warn(app,
|
||||
"convert(1) not found, for SVG to PDF conversion install "
|
||||
"ImageMagick (https://www.imagemagick.org)")
|
||||
|
||||
@@ -220,12 +222,13 @@ def convert_image(img_node, translator, src_fname=None):
|
||||
|
||||
# in kernel builds, use 'make SPHINXOPTS=-v' to see verbose messages
|
||||
|
||||
app.verbose('assert best format for: ' + img_node['uri'])
|
||||
kernellog.verbose(app, 'assert best format for: ' + img_node['uri'])
|
||||
|
||||
if in_ext == '.dot':
|
||||
|
||||
if not dot_cmd:
|
||||
app.verbose("dot from graphviz not available / include DOT raw.")
|
||||
kernellog.verbose(app,
|
||||
"dot from graphviz not available / include DOT raw.")
|
||||
img_node.replace_self(file2literal(src_fname))
|
||||
|
||||
elif translator.builder.format == 'latex':
|
||||
@@ -252,7 +255,8 @@ def convert_image(img_node, translator, src_fname=None):
|
||||
|
||||
if translator.builder.format == 'latex':
|
||||
if convert_cmd is None:
|
||||
app.verbose("no SVG to PDF conversion available / include SVG raw.")
|
||||
kernellog.verbose(app,
|
||||
"no SVG to PDF conversion available / include SVG raw.")
|
||||
img_node.replace_self(file2literal(src_fname))
|
||||
else:
|
||||
dst_fname = path.join(translator.builder.outdir, fname + '.pdf')
|
||||
@@ -265,18 +269,19 @@ def convert_image(img_node, translator, src_fname=None):
|
||||
_name = dst_fname[len(translator.builder.outdir) + 1:]
|
||||
|
||||
if isNewer(dst_fname, src_fname):
|
||||
app.verbose("convert: {out}/%s already exists and is newer" % _name)
|
||||
kernellog.verbose(app,
|
||||
"convert: {out}/%s already exists and is newer" % _name)
|
||||
|
||||
else:
|
||||
ok = False
|
||||
mkdir(path.dirname(dst_fname))
|
||||
|
||||
if in_ext == '.dot':
|
||||
app.verbose('convert DOT to: {out}/' + _name)
|
||||
kernellog.verbose(app, 'convert DOT to: {out}/' + _name)
|
||||
ok = dot2format(app, src_fname, dst_fname)
|
||||
|
||||
elif in_ext == '.svg':
|
||||
app.verbose('convert SVG to: {out}/' + _name)
|
||||
kernellog.verbose(app, 'convert SVG to: {out}/' + _name)
|
||||
ok = svg2pdf(app, src_fname, dst_fname)
|
||||
|
||||
if not ok:
|
||||
@@ -305,7 +310,8 @@ def dot2format(app, dot_fname, out_fname):
|
||||
with open(out_fname, "w") as out:
|
||||
exit_code = subprocess.call(cmd, stdout = out)
|
||||
if exit_code != 0:
|
||||
app.warn("Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||
kernellog.warn(app,
|
||||
"Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||
return bool(exit_code == 0)
|
||||
|
||||
def svg2pdf(app, svg_fname, pdf_fname):
|
||||
@@ -322,7 +328,7 @@ def svg2pdf(app, svg_fname, pdf_fname):
|
||||
# use stdout and stderr from parent
|
||||
exit_code = subprocess.call(cmd)
|
||||
if exit_code != 0:
|
||||
app.warn("Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||
kernellog.warn(app, "Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||
return bool(exit_code == 0)
|
||||
|
||||
|
||||
@@ -415,15 +421,15 @@ def visit_kernel_render(self, node):
|
||||
app = self.builder.app
|
||||
srclang = node.get('srclang')
|
||||
|
||||
app.verbose('visit kernel-render node lang: "%s"' % (srclang))
|
||||
kernellog.verbose(app, 'visit kernel-render node lang: "%s"' % (srclang))
|
||||
|
||||
tmp_ext = RENDER_MARKUP_EXT.get(srclang, None)
|
||||
if tmp_ext is None:
|
||||
app.warn('kernel-render: "%s" unknown / include raw.' % (srclang))
|
||||
kernellog.warn(app, 'kernel-render: "%s" unknown / include raw.' % (srclang))
|
||||
return
|
||||
|
||||
if not dot_cmd and tmp_ext == '.dot':
|
||||
app.verbose("dot from graphviz not available / include raw.")
|
||||
kernellog.verbose(app, "dot from graphviz not available / include raw.")
|
||||
return
|
||||
|
||||
literal_block = node[0]
|
||||
|
@@ -216,7 +216,7 @@ As an example, consider this FIT:
|
||||
kernel = "kernel-1";
|
||||
fdt = "fdt-1";
|
||||
};
|
||||
conf-1 {
|
||||
conf-2 {
|
||||
kernel = "kernel-2";
|
||||
fdt = "fdt-2";
|
||||
};
|
||||
@@ -232,7 +232,7 @@ configuration 3 with kernel 1 and fdt 2:
|
||||
kernel = "kernel-1";
|
||||
fdt = "fdt-1";
|
||||
};
|
||||
conf-1 {
|
||||
conf-2 {
|
||||
kernel = "kernel-2";
|
||||
fdt = "fdt-2";
|
||||
};
|
||||
@@ -337,6 +337,7 @@ WARNING: When relying on signed FIT images with required signature check
|
||||
the legacy image format is default disabled by not defining
|
||||
CONFIG_LEGACY_IMAGE_FORMAT
|
||||
|
||||
|
||||
Testing
|
||||
-------
|
||||
An easy way to test signing and verification is to use the test script
|
||||
@@ -349,6 +350,8 @@ A sample run is show below:
|
||||
$ make O=sandbox sandbox_config
|
||||
$ make O=sandbox
|
||||
$ O=sandbox ./test/vboot/vboot_test.sh
|
||||
|
||||
|
||||
Simple Verified Boot Test
|
||||
=========================
|
||||
|
||||
|
Reference in New Issue
Block a user