feat(coreos-installer): add coreos-installer and emmc support

Now coreos-installer can be used with Beaglebone and cn9130-cf-pro
to install CoreOS into the emmc instead of booting only on the
SDCard
This commit is contained in:
Samuel Dolt 2023-06-02 17:28:38 +02:00
parent 29209c6d83
commit 6bf03fbec2
46 changed files with 810 additions and 211 deletions

View File

@ -3,7 +3,9 @@
"**/build/cache/**": true, "**/build/cache/**": true,
"**/build/downloads/**": true, "**/build/downloads/**": true,
"**/build/sstate-cache/**": true, "**/build/sstate-cache/**": true,
"**/build/tmp/**": true "**/build/tmp/**": true,
"**/documentation/_build/**": true,
"**/build/workspace": true
}, },
"python.formatting.provider": "black", "python.formatting.provider": "black",
"editor.rulers": [80,100,120] "editor.rulers": [80,100,120]

View File

@ -12,3 +12,4 @@ CoreOS Optional Components
Network Manager: NetworkManager <networkmanager> Network Manager: NetworkManager <networkmanager>
SSH Server: OpenSSH <openssh> SSH Server: OpenSSH <openssh>
Container: Podman <podman> Container: Podman <podman>
CoreOS Installer <installer>

View File

@ -0,0 +1,35 @@
.. index:: COREOS_INSTALLER
CoreOS Installer
****************
The CoreOS installer is a set of script running on the target and a
corresponding bitbake image that is used into the bootstrap process of CoreOS.
coreos-image-installer
======================
The CoreOS installer image is a single binary EFI file that include a kernel,
device tree and an initramfs with all the tools needed to install CoreOS.
An installer image is automatically built in parallel of a normal image.
This can be deactivated by setting `COREOS_IMAGE_GENERATE_INSTALLER` to 0.
The installer image build by default only a single EFI binary named
coreos-installer-MACHINE.efi. An SDCard image can be generate if
`COREOS_INSTALLER_WKS_FILE` is set to a wks file.
coreos-installer
================
The coreos-installer recipe installs some script that is used at startup
to automatically format the internal emmc of the device. It also contains
a swupdate configuration file to setup swupdate correctly for that use case.
coreos-installer-config
=======================
The coreos-installer-config recipe installs device specific configuration file
used by the coreos-installer. This includes the partitionner config file. Distro
and project based on CoreOS can change the partionning scheme or partition size
by installing their own version of this package using a `bbappend file`.

View File

@ -0,0 +1,61 @@
.. _beaglebone:
**********
BeagleBone
**********
.. important::
The BeagleBone target uses an old TI AM3358 ARM 32 BIT CPU. This processor
of the AM335x family is used in a lot of current and legacy device at
Hirschmann and NetModule. Thus we only support this target to ensure
that our architecture is working on older architecture too.
CoreOS build instruction
========================
.. code-block::
MACHINE=beaglebone bitbake coreos-image-all-features
cd tmp/deploy/images/beaglebone
.. list-table:: Image artifacts for BeagleBone
:widths: 25 75
:header-rows: 1
* - Filename
- Description
* - <IMAGE>-beaglebone.swu
- System image bundle used by the CoreOS installer or the CoreOS updater
* - <IMAGE>-beaglebone.wic.xz
- System image for SDCard
* - coreos-image-installer-beaglebone.wic.xz
- CoreOS installer image for SD Card
.. hint::
Only the .swu image is need if you have already a working installation of CoreOS
running on the board that you want to update.
CoreOS Pre-installation guide
=============================
If you want to use the internal emmc storage as boot target, you will need to
flash coreos-image-installer-beaglebone.wic.xz to your SDCard using bmaptool.
If you want to use the sdcard as boot target, you will need to flash
<IMAGE>-beaglebone.wic.xz to your SDCard using bmaptool.
By default the board boot on the internal emmc storage. To boot with a SDCard
instead, you will need to push the S2 button (boot switch) while powering up the
board.
.. image:: beaglebone/beaglebone-s2-switch.png
Serial access is available on the 5-pin header. See
`this page <https://elinux.org/Beagleboard:BeagleBone_Black_Serial>`_ for
more info on the serial connector.
Now that you have the installer running, CoreOS can be installed by following
the :ref:`generic installation manual<Installation Manual>` using the SDCard
mehtod.

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

View File

@ -0,0 +1,126 @@
.. _netmodule-hw34:
*******************************
NetModule HW34 (XG900 A-Sample)
*******************************
.. important::
netmodule-hw34 support is currently only available on the features branch
feat/netmodule-bsp
.. image:: netmodule-hw34/hw34.png
CoreOS build instruction
========================
.. code-block::
MACHINE=netmodule-hw34 bitbake coreos-image-all-features
cd tmp/deploy/images/netmodule-hw34
.. list-table:: Image artifacts for NetModule HW32
:widths: 25 75
:header-rows: 1
* - Filename
- Description
* - <IMAGE>-netmodule-hw34.swu
- System image bundle used by the CoreOS installer or the CoreOS updater
* - coreos-installer-netmodule-hw34.efi
- CoreOS installer bundled in a single EFI binary
* - tiboot3.bin
- SPL Bootloader for the wakeup domain (arm32 R5 core)
* - tispl.bin
- SPL bootloader for the main domain (aarch64 main core)
* - u-boot.bin
- Third stage bootloader the main domain (aarch64 main core)
.. hint::
Only the .swu image is need if you have already a working installation of CoreOS
running on the board that you want to update.
CoreOS Pre-installation guide
=============================
The CoreOS installation process expect a working EFI firmware based on u-boot
running on the board.
For board that have no firmware or a defect firmware, we can provide the firmware by
booting over USB.
First, we need to put the board in USB Boot mode by modifying the dip-switch
on the back of the board:
.. code-block::
ON
S500 ▄ ▀ ▄ ▀ ▄ ▄ ▄ ▄
1 2 3 4 5 6 7 8
.. hint::
Unflashed board or board without a valid tiboot3.bin image will default to
USB boot mode, so settings the dip-switch may be skipped in this case.
Then you need to populate the jumper X600 near the USB port:
.. image:: netmodule-hw34/hw34-usb-device.png
Then power-up the board by first apply 12V throug the main connector, then
connect a USB-C cable. Console access to the board can be accessed using the
serial port on the main connector.
.. important::
When removing the power, ensure that the USB cable is removed first. Otherwise
the processor will not get shutdown properly
Now you should see the board from you computer:
.. code-block:: sh
lsusb | grep DFU
Bus 003 Device 048: ID 0451:6165 Texas Instruments, Inc. AM64x DFU
Now we start downloading the bootloaders into RAM by using dfu-utils:
.. code-block:: sh
dfu-util -D tiboot3.bin -a 0
dfu-util -D tispl.bin -a 0
# Eject and start execution of tispl
dfu-util -e -a 0
dfu-util -D u-boot.img -a 1
# Eject ans tart of u-boot.img
dfu-util -e -a 1
.. hint::
The firmware was uploaded to the RAM, thus will not survice a reboot.
Now that we have a firmware running, CoreOS can be installed by following
the :ref:`generic installation manual<Installation Manual>`.
CoreOS Post-Installation
========================
When the installation of CoreOS is done, power down the board by first
removing the USB-C cable then the main power.
Now, put the board back in emmc boot mode:
.. code-block::
ON
S500 ▀ ▄ ▄ ▀ ▄ ▄ ▄ ▄
1 2 3 4 5 6 7 8
Then power-up the board again and CoreOS should boot.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

@ -0,0 +1,33 @@
******************
Supported Hardware
******************
.. _Hardware Overview:
.. list-table:: Supported BitBake MACHINE
:widths: 25 75 25
:header-rows: 1
* - BitBake MACHINE
- Compatible hardware
- Documentation
* - cn9131-bldn-mbv
- Falcon A3 Sample
-
* - netmodule-hw34
- NetModule HW34 (XG900 Sample)
- :ref:`🔗 links <netmodule-hw34>`
* - cn9130-cf-pro
- Solidrun cn9130-cf-pro
-
* - beaglebone
- Beaglebone, Beaglebone Black, Beaglebone Green
- :ref:`🔗 links <beaglebone>`
* - vm-x64
- Virtual Machine
-
.. hint::
Please contact the CoreOS team when starting a new project based on CoreOS
or want to contribute the hardware support for an existing Hardware.

View File

@ -28,20 +28,28 @@ same structures.
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
:caption: Software Components :caption: Supported Hardware
Core Components <components/core/index>
Optional Components <components/optional/index>
Overview <hardware/overview>
NetModule HW34 (XG900 Sample) <hardware/netmodule-hw34>
BeagleBone <hardware/beaglebone>
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
:caption: Manuals :caption: Manuals
Installation Manual <installation/index>
Reference Manual <ref-manual/index> Reference Manual <ref-manual/index>
Boot Concepts <boot/index> Boot Concepts <boot/index>
Best Practices <best_practices/index> Best Practices <best_practices/index>
.. toctree::
:maxdepth: 1
:caption: Software Components
Core Components <components/core/index>
Optional Components <components/optional/index>
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
:caption: Indexes :caption: Indexes

View File

@ -0,0 +1,22 @@
.. _Installation Manual:
======================================
Belden CoreOS EMMC Installation Manual
======================================
.. important::
This manual expect that the board you want to install CoreOS on have a
running UEFI firmware based on u-boot. Information about how to get console
access and a running firmware can be found for your hardware in the
:ref:`Hardware Overview <Hardware Overview>`
|
.. toctree::
:caption: Table of Contents
:numbered:
starting
partitionning

View File

@ -0,0 +1,50 @@
************
Installation
************
The installer automatically creates all the needed partitions when starting up.
Now you have to upload the .swu file to start the flashing process.
Choose one of these methods to upload the system image to the installer:
Upload the .swu file over the network using a browser
=====================================================
Now you can install the desired CoreOS version by uploading the desired
.swu file to the board using a browser, by going to http://<TARGET_IP>:8080
Upload the .swu file over the network using devtool
===================================================
If you have a working build environement, you can upload the image using
the devtool command:
.. code-block::
MACHINE=<MACHINE> devtool swupdate-www-push <IMAGE> <TARGET_IP>
.. hint::
Replace <IMAGE> with the image recipe name, eg: coreos-image-all-features
Replace <MACHINE> by the machine name (if not set in local.conf)
Replace <TARGET_IP> by the IP adress of the board
Upload the .swu file over the network using coreos-device
=========================================================
If you don't have a working build environement, you can upload the image using
the coreos-device python script:
.. code-block::
./coreos-device swupdate-www-push <SWU_PATH> <TARGET_IP>
.. hint::
Replace <SWU_PATH> with the the path to the SWU, eg: ./coreos-image-all-features-<MACHINE>.swu
Replace <TARGET_IP> by the IP adress of the board
.. hint::
You will find the coreos-device script under the scripts directory inside
the CoreOS repository.

View File

@ -0,0 +1,64 @@
**********************
Starting the installer
**********************
Choose one of these methods to start the bootloader:
Starting the installer over the network with TFTP
=================================================
Put the coreos-installer EFI bundle (coreos-installer-<MACHINE>.efi) into an
accessible TFTP server, then enter the following command into u-boot:
.. code-block::
setenv ipaddr <TARGET_IP>; setenv serverip <SERVER_IP>;
tftp $loadaddr coreos-installer-<MACHINE>.efi
bootefi $loadaddr
.. hint::
Replace <TARGET_IP> by a valid IP adress for the target, eg: 192.168.1.1
Replace <SERVER_IP> by the IP adress of the server, eg: 192.168.1.254
Replace <MACHINE> by the name of the machine set in bitbake
Starting the installer over the network with DHCP/BOOTP/TFTP
============================================================
Use a DHCP/BOOTP/TFTP server to configure automatically the device. You can
use dnsmasq for this task.
.. code-block: ini
interface=<INTERFACE>
dhcp-range=<INTERFACE>,10.237.30.2,10.237.30.100,4h
dhcp-range=<INTERFACE>,10.237.40.2,10.237.40.100,4h
enable-tftp
dhcp-boot=tag:<INTERFACE>,coreos-installer-<MACHINE>.efi
tftp-root=/var/lib/tftpboot
.. hint::
Replace <INTERFACE> by the name of the network interface that is connected
to the target. Eg: enp3s0
Replace <MACHINE> by the name of the machine set in bitbake
Put the coreos-installer EFI bundle (coreos-installer-<MACHINE>.efi) into the
/var/lib/tftpboot folder then enter the following command into u-boot:
.. code-block::
setenv autoload yes
setenv autostart no
dhcp
bootefi $loadaddr
Starting the installer using an SD Card
=======================================
Flash the coreos-image-installer.wic.xz into an SDCard and put the board
in SDCard boot mode. Insert the SDCard and power up the board. The CoreOS
installer should start automatically.

View File

@ -10,9 +10,14 @@ to Belden CoreOS.
Machine Features Machine Features
================ ================
CoreOS doesn't define any custom machine feature for now, but the
:external:ref:`MACHINE_FEATURES <ref-features-machine>` of OpenEmbedded-Core :external:ref:`MACHINE_FEATURES <ref-features-machine>` of OpenEmbedded-Core
can be used. can be used with CoreOS.
In addition, those CoreOS specific MACHINE_FEATURES can be used too:
- *sdcard:* the machine as an internal SD Card or MicroSD Slot.
- *emmc:* the machine as an internal emmc based storage
.. index:: DISTRO_FEATURES .. index:: DISTRO_FEATURES

View File

@ -0,0 +1,26 @@
SWUPDATE_IMAGES += "MLO"
SWUPDATE_IMAGES += "u-boot-beaglebone"
SWUPDATE_IMAGES_FSTYPES[MLO] = ""
SWUPDATE_IMAGES_FSTYPES[u-boot-beaglebone] = ".img"
COREOS_SWUPDATE_EXTENDS_FOR:append = "beaglebone"
def coreos_swupdate_extends_images_for_beaglebone(d,s):
mlo = {
"filename" : "MLO",
"installed-directly" : "true",
"device" : "/dev/disk/by-partlabel/mlo",
"type" : "raw",
"sha256" : swupdate_get_sha256(d, s, "MLO"),
}
uboot = {
"filename" : "u-boot-beaglebone.img",
"installed-directly" : "true",
"device" : "/dev/disk/by-partlabel/uboot",
"type" : "raw",
"sha256" : swupdate_get_sha256(d, s, "u-boot-beaglebone.img"),
}
return [mlo, uboot]

View File

@ -11,6 +11,7 @@ include conf/machine/include/arm/armv7a/tune-cortexa8.inc
IMAGE_FSTYPES += "wic wic.xz wic.bmap" IMAGE_FSTYPES += "wic wic.xz wic.bmap"
WKS_FILE ?= "beaglebone-sdcard.wks.in" WKS_FILE ?= "beaglebone-sdcard.wks.in"
COREOS_INSTALLER_WKS_FILE ?= "beaglebone-sdcard-installer.wks"
MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "kernel-image kernel-devicetree" MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "kernel-image kernel-devicetree"
do_image_wic[depends] += "mtools-native:do_populate_sysroot dosfstools-native:do_populate_sysroot gptfdisk-native:do_populate_sysroot virtual/bootloader:do_deploy" do_image_wic[depends] += "mtools-native:do_populate_sysroot dosfstools-native:do_populate_sysroot gptfdisk-native:do_populate_sysroot virtual/bootloader:do_deploy"
do_image_wic[recrdeptask] += "do_bootimg" do_image_wic[recrdeptask] += "do_bootimg"
@ -36,9 +37,6 @@ UBOOT_LOADADDRESS = "0x80008000"
MACHINE_FEATURES = "usbgadget usbhost vfat alsa" MACHINE_FEATURES = "usbgadget usbhost vfat alsa"
IMAGE_BOOT_FILES ?= "u-boot.${UBOOT_SUFFIX} ${SPL_BINARY}"
IMAGE_EFI_BOOT_FILES ?= "${KERNEL_DEVICETREE}"
# support runqemu # support runqemu
EXTRA_IMAGEDEPENDS += "qemu-native qemu-helper-native" EXTRA_IMAGEDEPENDS += "qemu-native qemu-helper-native"
IMAGE_CLASSES += "qemuboot" IMAGE_CLASSES += "qemuboot"
@ -59,5 +57,7 @@ QB_TCPSERIAL_OPT = "-device virtio-serial-device -chardev socket,id=virtcon,port
# No watchdog available yet # No watchdog available yet
EFIBOOTGUARD_TIMEOUT ?= "0" EFIBOOTGUARD_TIMEOUT ?= "0"
COREOS_IMAGE_SWUPDATE_EXTRACLASSES += "coreos-image-swupdate-beaglebone"
require conf/machine/include/coreos-generic-features/efi.inc require conf/machine/include/coreos-generic-features/efi.inc
require conf/machine/include/coreos-generic-features/emmc.inc require conf/machine/include/coreos-generic-features/partitions.inc

View File

@ -4,12 +4,3 @@
MACHINE_FEATURES:append = " efi" MACHINE_FEATURES:append = " efi"
do_image_wic[depends] += "efibootguard-native:do_populate_sysroot efibootguard:do_deploy" do_image_wic[depends] += "efibootguard-native:do_populate_sysroot efibootguard:do_deploy"
# Variable used in WKS file
WKS_PART_EFI ??= 'part --source efibootguard-efi --label efi --align 1024 --part-type=EF00'
WKS_PART_ROOT_A ??= 'part / --source rootfs --fstype=ext4 --label rootfs0 --align 1024'
WKS_PART_ROOT_B ??= 'part --fstype=ext4 --label rootfs1 --align 1024'
WKS_PART_ROOT_SIZE ??= '2G'
WKS_PART_EFIBOOTGUARD_A ??= 'part --source efibootguard-boot --label ebg0 --align 1024 --part-type=0700 --sourceparams "watchdog=${EFIBOOTGUARD_TIMEOUT},revision=2,kernel=kernel0-${MACHINE}.efi;KERNEL.EFI"'
WKS_PART_EFIBOOTGUARD_B ??= 'part --source efibootguard-boot --label ebg1 --align 1024 --part-type=0700 --sourceparams "watchdog=${EFIBOOTGUARD_TIMEOUT},revision=1,kernel=kernel1-${MACHINE}.efi;KERNEL.EFI"'

View File

@ -1,7 +0,0 @@
# This configuration file should be included for all hardware that has an
# integrated emmc
MACHINE_FEATURES += "emmc"
# Generate a SWU image to flash the emmc
do_image[depends] += "coreos-emmc-flasher-${MACHINE}:do_swuimage"

View File

@ -0,0 +1,15 @@
# Variable used in WKS file
WKS_PART_EFI ??= 'part --source efibootguard-efi --label efi --part-type=EF00'
WKS_PART_EFIBOOTGUARD_A ??= 'part --source efibootguard-boot --label ebg0 --part-type=0700 --sourceparams "watchdog=${EFIBOOTGUARD_TIMEOUT},revision=2,kernel=kernel0-${MACHINE}.efi;KERNEL.EFI"'
WKS_PART_EFIBOOTGUARD_B ??= 'part --source efibootguard-boot --label ebg1 --part-type=0700 --sourceparams "watchdog=${EFIBOOTGUARD_TIMEOUT},revision=1,kernel=kernel1-${MACHINE}.efi;KERNEL.EFI"'
WKS_PART_ROOT_A ??= 'part / --source rootfs --fstype=ext4 --label rootfs0'
WKS_PART_ROOT_B ??= 'part --fstype=ext4 --label rootfs1'
WKS_PART_ROOT_SIZE ??= '2G'
SFDISK_PART_EFI ??= 'type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, name="efi"'
SFDISK_PART_EFIBOOTGUARD_A ??= 'type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name="ebg0"'
SFDISK_PART_EFIBOOTGUARD_B ??= 'type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name="ebg1"'
SFDISK_PART_ROOT_A ??= 'type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, name="rootfs0"'
SFDISK_PART_ROOT_B ??= 'type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, name="rootfs0"'

View File

@ -22,3 +22,4 @@ do_image_wic[recrdeptask] += "do_bootimg"
COREOS_EFI_SECUREBOOT_INSTALL_PUBKEY_IN_EFIDIR = "1" COREOS_EFI_SECUREBOOT_INSTALL_PUBKEY_IN_EFIDIR = "1"
require conf/machine/include/coreos-generic-features/efi.inc require conf/machine/include/coreos-generic-features/efi.inc
require conf/machine/include/coreos-generic-features/partitions.inc

View File

@ -1,6 +0,0 @@
COMPATIBLE_MACHINE = "beaglebone"
require coreos-emmc-flasher.inc
require coreos-emmc-flasher-uboot.inc
SWUPDATE_IMAGES += "MLO"

View File

@ -1,48 +0,0 @@
software =
{
version = "@@DISTRO_VERSION@@";
@@MACHINE@@ = {
hardware-compatibility: ["1.0"];
factory = {
emmc = {
partitions: (
{
type = "diskpart";
device = "/dev/mmcblk1";
properties: {
labeltype = "dos";
partition-1 = [ "size=32M", "start=133120", "name=efi", "type=0xef", "fstype=fat16"];
};
}
);
images: (
{
filename = "MLO";
device = "/dev/mmcblk1";
offset = "128K";
sha256 = "$swupdate_get_sha256(MLO)";
},
{
filename = "u-boot-beaglebone.img";
device = "/dev/mmcblk1";
offset = "384K";
sha256 = "$swupdate_get_sha256(u-boot-beaglebone.img)";
}
);
files: (
{
filename = "efibootguardarm.efi";
path = "/EFI/BOOT/bootarm.efi";
device = "/dev/mmcblk1p1";
filesystem = "vfat";
sha256 = "$swupdate_get_sha256(efibootguardarm.efi)";
properties: {
create-destination = "true";
}
}
);
}
}
}
}

View File

@ -1,10 +0,0 @@
# Machine that use u-boot can include this file after
# coreo-swupdate-flasher.inc
# Add support to flash u-boot
IMAGE_DEPENDS += "virtual/bootloader"
UBOOT_SUFFIX ??= "img"
SWUPDATE_IMAGES += "u-boot"
SWUPDATE_IMAGES_FSTYPES[u-boot] = ".${UBOOT_SUFFIX}"

View File

@ -1,31 +0,0 @@
DESCRIPTION = "SWU Image generation to flash the internal emmc"
SECTION = "bootloaders"
LICENSE = "CLOSED"
PR = "r1"
SRC_URI = " \
file://sw-description \
"
# efibootguard
# ==============================================================================
# efibootguard support is not machine depends so it can be done here
require conf/image-uefi.conf
# The efibootguard binary has to be embedded into the image. swupdate will check
# that the binary exist
IMAGE_DEPENDS += "efibootguard"
SWUPDATE_IMAGES += "efibootguard${EFI_ARCH}"
# Override or variable are not supported in var[flag] statement, but having more
# flags than necessary doesn't do any arm
SWUPDATE_IMAGES_FSTYPES[efibootguardx64] = ".efi"
SWUPDATE_IMAGES_FSTYPES[efibootguardaa64] = ".efi"
SWUPDATE_IMAGES_FSTYPES[efibootguardarm] = ".efi"
# Image generated should be named coreos-swupdater-flasher-${MACHINE}
# and not the default coreos-swupdate-flasher-${MACHINE}-${MACHINE}
IMAGE_BASENAME ?= "coreos-emmc-flasher"
inherit swupdate

View File

@ -0,0 +1,19 @@
label: gpt
device: /dev/mmcblk1
unit: sectors
first-lba: 34
last-lba: 7471070
sector-size: 512
# EBBR 2.1.0 section 4.1.1 mandate the use of an unused type UUID and to set
# the RequiredPartition label for part of the firmware stored in the main disk
# https://arm-software.github.io/ebbr/#section-gpt-parts
# next two type were generated
/dev/mmcblk1p1 : start= 256, size= 512, type=4DA6E9DA-C803-4BE4-BAC4-8192717C5EB0, name="mlo", attrs="RequiredPartition"
/dev/mmcblk1p2 : start= 768, size= 8192, type=5B97345D-B7A1-47D3-A491-ED40F4841639, name="uboot", attrs="RequiredPartition"
/dev/mmcblk1p3 : start= 8960, size= 131072, ${SFDISK_PART_EFI}
/dev/mmcblk1p4 : start= 140032, size= 262144, ${SFDISK_PART_EFIBOOTGUARD_A}
/dev/mmcblk1p5 : start= 402176, size= 262144, ${SFDISK_PART_EFIBOOTGUARD_B}
/dev/mmcblk1p6 : start= 664320, size= 3403375, ${SFDISK_PART_ROOT_A}
/dev/mmcblk1p7 : start= 4067695, size= 3403375, ${SFDISK_PART_ROOT_B}

View File

@ -0,0 +1,3 @@
FILESEXTRAPATHS:prepend := "${THISDIR}/coreos-installer-config:"
SRC_URI:append:beaglebone = " file://beaglebone_1.0.sfdisk"

View File

@ -0,0 +1,20 @@
# short-description: Create SD card image for Beaglebone
# long-description: Creates a partitioned SD card image for Beaglebone.
# offset 1S => 1 sector (1x512 byte)
# The bootloader can be at 4 different position in raw mode: 0S, 256S, 512S, 768S
# MBR disk use only the sector 0, so 1S is free
# GPT disk use sector 0-33S, so first free slot is 256S
# Offset are from the BBB default settings
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# Don't name partition in the installer disk image, otherwise the installer may not work as it rely on partition label!
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
part --offset 256S --source rawcopy --sourceparams="file=MLO" --ondisk mmcblk0 --fixed-size 256K
part --offset 768S --source rawcopy --sourceparams="file=u-boot.img" --ondisk mmcblk0 --fixed-size 4M
# Let's define a 4MiB maximum size for the bootloader
# 4MiB => 4*1024*1024/512=8192S | 768S + 8192S => 8960S
part --source bootimg-partition --part-type=EF00 --ondisk mmcblk0 --offset 8960S --fixed-size 125M
bootloader --ptable gpt

View File

@ -6,15 +6,15 @@
# MBR disk use only the sector 0, so 1S is free # MBR disk use only the sector 0, so 1S is free
# GPT disk use sector 0-33S, so first free slot is 256S # GPT disk use sector 0-33S, so first free slot is 256S
# Offset are from the BBB default settings # Offset are from the BBB default settings
part --offset 256S --source rawcopy --sourceparams="file=MLO" --ondisk mmcblk0 part --offset 256S --source rawcopy --sourceparams="file=MLO" --ondisk mmcblk0 --fixed-size 256K --part-name "mlo"
part --offset 768S --source rawcopy --sourceparams="file=u-boot.img" --ondisk mmcblk0 part --offset 768S --source rawcopy --sourceparams="file=u-boot.img" --ondisk mmcblk0 --fixed-size 4M --part-name "uboot"
# Let's define a 4MiB maximum size for the bootloader # Let's define a 4MiB maximum size for the bootloader
# 4MiB => 4*1024*1024/512=8192S | 768S + 8192S => 8960S # 4MiB => 4*1024*1024/512=8192S | 768S + 8192S => 8960S
${WKS_PART_EFI} --ondisk mmcblk0 --offset 8960S --align 1024 --size 32M --extra-space 0 --overhead-factor 1 ${WKS_PART_EFI} --ondisk mmcblk0 --offset 8960S --fixed-size 32M
${WKS_PART_ROOT_A} --ondisk mmcblk0 --size ${WKS_PART_ROOT_SIZE} --extra-space 0 --overhead-factor 1 ${WKS_PART_EFIBOOTGUARD_A} --ondisk mmcblk0 --fixed-size 128M
${WKS_PART_ROOT_B} --ondisk mmcblk0 --size ${WKS_PART_ROOT_SIZE} --extra-space 0 --overhead-factor 1 ${WKS_PART_EFIBOOTGUARD_B} --ondisk mmcblk0 --fixed-size 128M
${WKS_PART_EFIBOOTGUARD_A} --ondisk mmcblk0 --align 1024 --size 128M --extra-space 0 --overhead-factor 1 ${WKS_PART_ROOT_A} --ondisk mmcblk0 --fixed-size ${WKS_PART_ROOT_SIZE}
${WKS_PART_EFIBOOTGUARD_B} --ondisk mmcblk0 --align 1024 --size 128M --extra-space 0 --overhead-factor 1 ${WKS_PART_ROOT_B} --ondisk mmcblk0 --fixed-size ${WKS_PART_ROOT_SIZE}
bootloader --ptable gpt bootloader --ptable gpt

View File

@ -32,6 +32,12 @@ def get_coreos_ci_artifacts(d):
if d.getVar('COREOS_IMAGE_GENERATE_SWU') == '1': if d.getVar('COREOS_IMAGE_GENERATE_SWU') == '1':
artifacts.append(d.getVar('IMAGE_LINK_NAME') + '.swu') artifacts.append(d.getVar('IMAGE_LINK_NAME') + '.swu')
# CoreOS Installer
# ==========================================================================
if d.getVar('COREOS_IMAGE_GENERATE_INSTALLER') == '1':
artifacts.append('coreos-installer-' + d.getVar('MACHINE') + '.efi')
# Kernel # Kernel
# ========================================================================== # ==========================================================================

View File

@ -20,22 +20,21 @@ COREOS_KERNEL1 ??= "${DEPLOY_DIR_IMAGE}/${COREOS_KERNEL1_FILENAME}"
# Kernel command line # Kernel command line
# ============================================================================== # ==============================================================================
APPEND += "rootwait "
COREOS_ROOTFS0_ROOT ??= "PARTLABEL=rootfs0" COREOS_ROOTFS0_ROOT ??= "PARTLABEL=rootfs0"
COREOS_ROOTFS1_ROOT ??= "PARTLABEL=rootfs1" COREOS_ROOTFS1_ROOT ??= "PARTLABEL=rootfs1"
COREOS_KERNEL0_CMDLINE ??= "root=${COREOS_ROOTFS0_ROOT} ${APPEND}" COREOS_KERNEL0_CMDLINE ??= "root=${COREOS_ROOTFS0_ROOT} ${APPEND} rootwait"
COREOS_KERNEL1_CMDLINE ??= "root=${COREOS_ROOTFS1_ROOT} ${APPEND}" COREOS_KERNEL1_CMDLINE ??= "root=${COREOS_ROOTFS1_ROOT} ${APPEND} rootwait"
COREOS_UKI_PART_KERNEL_FILENAME ??= "${KERNEL_IMAGETYPE}-${MACHINE}${KERNEL_IMAGE_BIN_EXT}" COREOS_UKI_PART_KERNEL_FILENAME ??= "${KERNEL_IMAGETYPE}-${MACHINE}${KERNEL_IMAGE_BIN_EXT}"
COREOS_UKI_PART_KERNEL ??= "${DEPLOY_DIR_IMAGE}/${COREOS_UKI_PART_KERNEL_FILENAME}" COREOS_UKI_PART_KERNEL ??= "${DEPLOY_DIR_IMAGE}/${COREOS_UKI_PART_KERNEL_FILENAME}"
COREOS_UKI_PART_STUB_FILENAME ??= "kernel-stub${EFI_ARCH}.efi" COREOS_UKI_PART_STUB_FILENAME ??= "kernel-stub${EFI_ARCH}.efi"
COREOS_UKI_PART_STUB ??= "${STAGING_LIBDIR}/efibootguard/${COREOS_UKI_PART_STUB_FILENAME}" COREOS_UKI_PART_STUB ??= "${STAGING_LIBDIR}/efibootguard/${COREOS_UKI_PART_STUB_FILENAME}"
COREOS_UKI_PART_INITRAMFS ??= ""
# UKI Generation # UKI Generation
# ============================================================================== # ==============================================================================
do_bundle_uki() { do_image_uki() {
deployDir="${DEPLOY_DIR_IMAGE}" deployDir="${DEPLOY_DIR_IMAGE}"
# Create an array with device tree if any # Create an array with device tree if any
@ -51,6 +50,13 @@ do_bundle_uki() {
echo "dtb: ${DTB_PARAMS}" echo "dtb: ${DTB_PARAMS}"
echo "cmdline0: ${COREOS_KERNEL0_CMDLINE}" echo "cmdline0: ${COREOS_KERNEL0_CMDLINE}"
echo "cmdline1: ${COREOS_KERNEL1_CMDLINE}" echo "cmdline1: ${COREOS_KERNEL1_CMDLINE}"
echo "initramfs: ${COREOS_UKI_PART_INITRAMFS}"
if [ ! -z "${COREOS_UKI_PART_INITRAMFS}" ]; then
DTB_PARAMS="${DTB_PARAMS} --initrd=${COREOS_UKI_PART_INITRAMFS}"
fi
echo "initramfs: ${INITRAMFS_PARAMS}"
bg_gen_unified_kernel \ bg_gen_unified_kernel \
"${COREOS_UKI_PART_STUB}" \ "${COREOS_UKI_PART_STUB}" \
@ -70,5 +76,16 @@ do_bundle_uki() {
coreos_efi_secureboot_sign_app "${deployDir}/${COREOS_KERNEL1_FILENAME}" coreos_efi_secureboot_sign_app "${deployDir}/${COREOS_KERNEL1_FILENAME}"
} }
do_bundle_uki[depends] += "virtual/kernel:do_deploy efibootguard-native:do_populate_sysroot efibootguard:do_populate_sysroot" do_image_uki[depends] += "virtual/kernel:do_deploy efibootguard-native:do_populate_sysroot efibootguard:do_populate_sysroot"
addtask bundle_uki after do_rootfs before do_image
addtask image_uki after do_image before do_image_complete
# UKI image is normally embedded into a WIC image
do_image_wic[recrdeptask] += "do_image_uki"
# UKI image is normally embedded into a SWU image
do_image_swu[recrdeptask] += "${@'do_image_uki' if d.getVar('COREOS_IMAGE_GENERATE_SWU') == '1' else ''}"
# UKI image may embedded the rootfs as a cpio archive, in this case do_image_uki should run after do_image_cpio
do_image_uki[recrdeptask] += "${@'do_image_cpio' if d.getVar('COREOS_UKI_PART_INITRAMFS') else ''}"

View File

@ -90,9 +90,13 @@ IMAGE_ROOTFS_EXTRA_SPACE:append = " ${@bb.utils.contains('DISTRO_FEATURES', 'sys
# ============================================================================== # ==============================================================================
# Support for Unified Kernel Image and Swupdate are optional # Support for Unified Kernel Image and Swupdate are optional
COREOS_IMAGE_GENERATE_INSTALLER ?= "1"
COREOS_IMAGE_GENERATE_UKI ?= "1" COREOS_IMAGE_GENERATE_UKI ?= "1"
COREOS_IMAGE_GENERATE_SWU ?= "1" COREOS_IMAGE_GENERATE_SWU ?= "1"
# Generate the installer image if needed
do_build[depends] += "${@'coreos-image-installer:do_build' if d.getVar('COREOS_IMAGE_GENERATE_INSTALLER') == '1' else ''}"
COREOS_IMAGE_EXTRACLASSES += "${@'coreos-image-uki' if d.getVar('COREOS_IMAGE_GENERATE_UKI') == '1' else ''}" COREOS_IMAGE_EXTRACLASSES += "${@'coreos-image-uki' if d.getVar('COREOS_IMAGE_GENERATE_UKI') == '1' else ''}"
COREOS_IMAGE_EXTRACLASSES += "${@'coreos-image-swupdate' if d.getVar('COREOS_IMAGE_GENERATE_SWU') == '1' else ''}" COREOS_IMAGE_EXTRACLASSES += "${@'coreos-image-swupdate' if d.getVar('COREOS_IMAGE_GENERATE_SWU') == '1' else ''}"

View File

@ -78,3 +78,10 @@ INHERIT += "coreos-efi-secureboot"
#PREFERRED_PROVIDER_virtual/runc = "crun" #PREFERRED_PROVIDER_virtual/runc = "crun"
PACKAGECONFIG:append:pn-podman = " rootless" PACKAGECONFIG:append:pn-podman = " rootless"
DISTRO_FEATURES_DEFAULT += "virtualization seccomp ipv6" DISTRO_FEATURES_DEFAULT += "virtualization seccomp ipv6"
# CoreOS specific options
# ==============================================================================
# Distro based on CoreOS can provide their own configuration files for the
# CoreOS installer by overriding this variable
PREFERRED_PROVIDER_coreos-installer-config ??= "coreos-installer-config"

View File

@ -0,0 +1,53 @@
DESCRIPTION = "Initramfs image with the CoreOS emmc installer"
# Don't reboot the device at reboot and don't do A/B switching
BAD_RECOMMENDATIONS = "swupdate-progress swupdate-coreos-config"
export IMAGE_BASENAME = "${MLPREFIX}${PN}"
IMAGE_NAME_SUFFIX ?= ""
IMAGE_LINGUAS = ""
LICENSE = "MIT"
IMAGE_FSTYPES = "cpio.gz"
# Support for generating a SDCard installer is optional
COREOS_INSTALLER_WKS_FILE ??= ""
WKS_FILE = "${COREOS_INSTALLER_WKS_FILE}"
IMAGE_FSTYPES += "${@'wic.xz wic.bmap' if d.getVar('COREOS_INSTALLER_WKS_FILE') else ''}"
IMAGE_BOOT_FILES = "${COREOS_KERNEL0_FILENAME};EFI/BOOT/${EFI_BOOT_IMAGE}"
COREOS_IMAGE_GENERATE_UKI = "1"
# Avoid dependancy loop, we are already in an installer image, so we don't need
# to bundle another one
COREOS_IMAGE_GENERATE_INSTALLER = "0"
# IMGDEPLOYDIR has to be used instead of DEPLOY_DIR_IMAGE here, because it will
# run during image generation
COREOS_UKI_PART_INITRAMFS = "${IMGDEPLOYDIR}/${IMAGE_BASENAME}-${MACHINE}.cpio.gz"
COREOS_IMAGE_GENERATE_SWU = "0"
# Change generated UKI filename and bundled command line
# Having the same name to KERNEL0 and KERNEL1 means that KERNEL1 will overwrite
# KERNEL0.
COREOS_KERNEL0_NAME ?= "coreos-installer-${MACHINE}"
COREOS_KERNEL1_NAME ?= "coreos-installer-${MACHINE}"
COREOS_KERNEL0_CMDLINE ?= "${APPEND}"
COREOS_KERNEL1_CMDLINE ?= "${APPEND}"
inherit coreos-image
# Only install a reduced set of package and feature to keep image size small
IMAGE_INSTALL = "packagegroup-coreos-boot coreos-installer swupdate-www util-linux-sfdisk util-linux-fdisk util-linux-cfdisk efibootguard efibootguard-tools"
IMAGE_FEATURES = "debug-tweaks swupdate networkmanager"
NO_RECOMMENDATIONS = "1"
IMAGE_ROOTFS_SIZE = "8192"
INITRAMFS_MAXSIZE = "976562"
IMAGE_ROOTFS_EXTRA_SPACE = "0"
# Use the same restriction as initramfs-module-install
COMPATIBLE_HOST = '(x86_64.*|i.86.*|arm.*|aarch64.*)-(linux.*|freebsd.*)'

View File

@ -3,14 +3,15 @@ DESCRIPTION = "Install swupdate and related components"
inherit packagegroup inherit packagegroup
PACKAGES = "\ PACKAGES = "\
${PN} \ ${PN} \
" "
RDEPENDS:${PN} = "\ RDEPENDS:${PN} = "\
swupdate \ swupdate \
swupdate-progress \
swupdate-client \ swupdate-client \
swupdate-lua \ swupdate-lua \
" "
# swupdate-progress will reboot the device at the end of the update
RRECOMMENDS:${PN} = "swupdate-progress"

View File

@ -0,0 +1,49 @@
DESCRIPTION = "CoreOS Installer configuration files"
SECTION = "coreos"
LICENSE = "CLOSED"
# This file can be included by a CoreOS based distro to ship a customized
# version
RPROVIDES:${PN} += "coreos-installer-config"
PROVIDES += "coreos-installer-config"
# This package is intended to ship machine specific configuration file
# See bbappend in BSP layers
PACKAGE_ARCH = "${MACHINE_ARCH}"
# If the BSP doesn't provide a machine specific configuration file, this
# package will be empty
ALLOW_EMPTY:${PN} = "1"
# Don't run default configure and compile task
do_configure[noexex] = "1"
python do_compile() {
from pathlib import Path
workdir = Path(d.getVar('WORKDIR', True))
machine = d.getVar('MACHINE', True)
b = Path(d.getVar('B', True))
for input_path in workdir.glob(f'{machine}_*.sfdisk'):
output_path = b / input_path.relative_to(workdir)
process_sfdisk_file(d, input_path, output_path)
}
def process_sfdisk_file(d, input_path, output_path):
"""
Read the file from input_path and write it to output_path with bitbake
variable expanded
"""
with open(output_path, "w") as output_file:
with open(input_path, "r") as input_file:
for line in input_file.readlines():
output_file.write(d.expand(line))
do_install() {
install -d ${D}${sysconfdir}
# Install all files for the current machine but don't fail if no file is
# found
install -m 755 ${B}/${MACHINE}_*.sfdisk ${D}${sysconfdir}/ || true
}

View File

@ -0,0 +1,3 @@
# Code is in an include file as they can be reused by a CoreOS distro to ship
# an alternative provided for coreos-installer-config using PREFERRED_PROVIDER
require coreos-installer-config.inc

View File

@ -0,0 +1,50 @@
#!/usr/bin/env sh
# Read /etc/hwrevision and turn it into a stripped string
# with the format ${MACHINE}_${VERSION}
HWREVISION=$(tr ' ' '_' < /etc/hwrevision | tr -d '[:space:]')
# Format the disk
SFDISK_DUMP_FILE="/etc/${HWREVISION}.sfdisk"
if [ ! -f "${SFDISK_DUMP_FILE}" ]
then
echo "Configuration file ${SFDISK_DUMP_FILE} not found"
exit 1
fi
DISK=$(grep "^device:\s" < "${SFDISK_DUMP_FILE}" | cut -d ' ' -f 2)
echo "Flashing ${SFDISK_DUMP_FILE} to ${DISK}"
cat "${SFDISK_DUMP_FILE}"
sfdisk "${DISK}" < "${SFDISK_DUMP_FILE}"
# Give the kernel some time to reload the partition
sleep 3
# Create EFI and EFIBootGuard partition as FAT16
mkfs.fat -F 16 -n EFI /dev/disk/by-partlabel/efi
mkfs.fat -F 16 -n EBG0 /dev/disk/by-partlabel/ebg0
mkfs.fat -F 16 -n EBG1 /dev/disk/by-partlabel/ebg1
mkdir -p /mnt/ebg0
mkdir -p /mnt/ebg1
mkdir -p /mnt/efi
mount /dev/disk/by-partlabel/ebg0 /mnt/ebg0
mount /dev/disk/by-partlabel/ebg1 /mnt/ebg1
mount /dev/disk/by-partlabel/efi /mnt/efi
mkdir -p /mnt/efi/EFI/BOOT
echo -n "EBG0" | iconv -f ascii -t UTF-16LE > /mnt/ebg0/EFILABEL
bg_setenv -f /mnt/ebg0/BGENV.DAT -r 0 -s FAILED
echo -n "EBG1" | iconv -f ascii -t UTF-16LE > /mnt/ebg1/EFILABEL
bg_setenv -f /mnt/ebg1/BGENV.DAT -r 0 -s FAILED
umount /mnt/ebg0
umount /mnt/ebg1
umount /mnt/efi
SWUPDATE_ARGS="${SWUPDATE_ARGS} -e stable,copy0"

View File

@ -0,0 +1,24 @@
DESCRIPTION = "CoreOS Installer scripts"
LICENSE = "CLOSED"
SECTION = "coreos"
SRC_URI+= " \
file://25-installer-config.sh \
"
# This package ship an alternate configuration for SWUpade to disable A/B
# switching and always flash A
RCONFLICTS:${PN}= "swupdate-coreos-config"
FILES:${PN} = " \
${libdir}/swupdate/conf.d/25-installer-config.sh \
"
# glibc-utils provide iconv
# glibc-gconv-utf-16 provide utf-16 support to iconv
RDEPENDS:${PN} = "coreos-installer-config dosfstools util-linux-lsblk util-linux-sfdisk glibc-utils glibc-gconv-utf-16"
do_install() {
install -d ${D}${libdir}/swupdate/conf.d
install -m 755 ${WORKDIR}/25-installer-config.sh ${D}${libdir}/swupdate/conf.d/
}

View File

@ -1,50 +0,0 @@
From 323c7fdda60758506dea9da6c477e42a0dbe86ca Mon Sep 17 00:00:00 2001
From: Samuel Dolt <samuel.dolt@netmodule.com>
Date: Wed, 22 Feb 2023 13:22:27 +0100
Subject: [PATCH] fs: add support to create FAT16 partition
Currently swupdate can create vfat partition using an embedded
copy of the fat_fs library. The partition created by fat_fs is
can be any FAT format (12/16/32) based on the partition size.
As the partition created by fat_fs was not readable by U-Boot,
this commit add a new "fat16" filesystem type that use the
external binary mkfs.fat to always create FAT16 partition.
---
fs/diskformat.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/fs/diskformat.c b/fs/diskformat.c
index 8d58fc3..f98c9d7 100644
--- a/fs/diskformat.c
+++ b/fs/diskformat.c
@@ -19,6 +19,21 @@ static inline int ext_mkfs_short(const char *device_name, const char *fstype)
}
#endif
+int fat_mkfs_extern(const char *device_name, const char *fstype)
+{
+ char cmd[100] = "mkfs.fat -F ";
+ if(strcmp(fstype, "fat16") == 0){
+ strcat(cmd, "16 ");
+ } else {
+ ERROR("fat_mkfs_extern: unsupported fstype %s", fstype);
+ return -1;
+ }
+ strncat(cmd, device_name, sizeof(cmd) - strlen(cmd) - 1);
+
+ TRACE("fat_mkfs_extern: running %s", cmd);
+ return system(cmd);
+}
+
struct supported_filesystems {
const char *fstype;
int (*mkfs)(const char *device_name, const char *fstype);
@@ -28,6 +43,7 @@ static struct supported_filesystems fs[] = {
#if defined(CONFIG_FAT_FILESYSTEM)
{"vfat", fat_mkfs},
#endif
+ {"fat16", fat_mkfs_extern},
#if defined(CONFIG_EXT_FILESYSTEM)
{"ext2", ext_mkfs_short},
{"ext3", ext_mkfs_short},

View File

@ -1,36 +1,43 @@
# File in the swupdate subdirectory of this recipe should overwrite the # File in the swupdate subdirectory of this recipe should overwrite the
# same file in meta-swupdate # same file in meta-swupdate
FILESEXTRAPATHS:prepend := "${THISDIR}/swupdate:" FILESEXTRAPATHS:prepend := "${THISDIR}/swupdate:"
RDEPENDS:${PN}:append = " efibootguard"
SRC_URI += "file://webserver-config.sh \ SRC_URI += "\
file://sw-collections-config.sh \ file://50-webserver-config.sh \
file://0001-fs-add-support-to-create-FAT16-partition.patch \ file://25-sw-collections-config.sh \
" "
PACKAGES =+ "${PN}-coreos-config ${PN}-coreos-installer-config"
# 0001-fs-add-support-to-create-FAT16-partition.patch depends on the
# mkfs.fat binary
RDEPENDS:${PN} += "dosfstools"
# Don't use /www as the web root # Don't use /www as the web root
wwwdir = "/usr/share/swupdate-www" wwwdir = "${datadir}/swupdate-www"
FILES:${PN} += " \ # Add the hwrevision files to the main package to prevent
${SWUPDATE_SW_VERSIONS_FILE} \ # installation of .swu image built for another machine
${SWUPDATE_HW_COMPATIBILITY_FILE} \ FILES:${PN} += "${sysconfdir}/hwrevision"
${libdir}/swupdate/conf.d/sw-collections-config.sh \
"
FILES:${PN}-www += " \ # If we install the webserver package, it should be started automatically
${libdir}/swupdate/conf.d/webserver-config.sh \ FILES:${PN}-www += "${libdir}/swupdate/conf.d/50-webserver-config.sh"
"
FILES:${PN}-coreos-config += "${libdir}/swupdate/conf.d/25-sw-collections-config.sh"
RDEPENDS:${PN}:append = " efibootguard"
# lsblk is used in sw-collections-config.sh
RDEPENDS:${PN}-coreos-config += "util-linux-lsblk"
# Recommends by default the configuration used for normal image
# that contain the A/B update path switch
RRECOMMENDS:${PN} += "${PN}-coreos-config"
# The installer configuration should prevent the normal A/B switch
# configuration to be installed
RCONFLICTS:${PN}-coreos-installer-config = "${PN}-coreos-config"
do_install:append() { do_install:append() {
# Probably replace revision with the value of the device tree # Probably replace revision with the value of the device tree
install -m 755 ${WORKDIR}/webserver-config.sh ${D}${libdir}/swupdate/conf.d/ install -m 755 ${WORKDIR}/50-webserver-config.sh ${D}${libdir}/swupdate/conf.d/
install -m 755 ${WORKDIR}/25-sw-collections-config.sh ${D}${libdir}/swupdate/conf.d/
install -m 755 ${WORKDIR}/sw-collections-config.sh ${D}${libdir}/swupdate/conf.d/ echo "${MACHINE} 1.0" > ${D}${sysconfdir}/hwrevision
echo "${MACHINE} 1.0" > ${D}${SWUPDATE_HW_COMPATIBILITY_FILE}
} }
PR = "r2"

View File

@ -51,6 +51,7 @@ APPEND += "console=ttyS0,115200"
# for a wic image # for a wic image
do_image_wic[depends] += "trusted-firmware-a:do_deploy" do_image_wic[depends] += "trusted-firmware-a:do_deploy"
WKS_FILE = "cn913x-sdcard.wks.in" WKS_FILE = "cn913x-sdcard.wks.in"
COREOS_INSTALLER_WKS_FILE ?= "cn913x-sdcard-installer.wks"
IMAGE_FSTYPES += "wic.xz wic.bmap" IMAGE_FSTYPES += "wic.xz wic.bmap"
MACHINE_ESSENTIAL_EXTRA_RDEPENDS += " kernel-modules kernel-devicetree" MACHINE_ESSENTIAL_EXTRA_RDEPENDS += " kernel-modules kernel-devicetree"
@ -59,3 +60,4 @@ COREOS_IMAGE_SWUPDATE_EXTRACLASSES += " coreos-image-swupdate-cn913x"
# No watchdog available yet # No watchdog available yet
EFIBOOTGUARD_TIMEOUT ?= "0" EFIBOOTGUARD_TIMEOUT ?= "0"
require conf/machine/include/coreos-generic-features/efi.inc require conf/machine/include/coreos-generic-features/efi.inc
require conf/machine/include/coreos-generic-features/partitions.inc

View File

@ -0,0 +1,25 @@
label: gpt
device: /dev/mmcblk0
unit: sectors
first-lba: 34
last-lba: 15269854
sector-size: 512
# Partition should be aligned at 2048S for best performance
# EBBR 2.1.0 section 4.1.1 mandate the use of an unused type UUID and to set
# the RequiredPartition label for part of the firmware stored in the main disk
# https://arm-software.github.io/ebbr/#section-gpt-parts
# UUID type of fw0 and fw1 was generated
# The bootloader can be at 5 different position: 1S, 34S, 4096S, 8192S, 12288S
# GPT disk use sector 0-33S, so first free slot is 34S
# Current bootloader is about 1.8MB, so if we put it at 4096S and 12288S we
# have 4MiB between the first bootloader and the second copy of it
/dev/mmcblk0p1 : start= 4096, size= 8192, type=71B02716-C000-4F0D-AE03-2F5DC0A114CD, name="fw0", attrs="RequiredPartition"
/dev/mmcblk0p2 : start= 12288, size= 8192, type=71B02716-C000-4F0D-AE03-2F5DC0A114CD, name="fw1", attrs="RequiredPartition"
/dev/mmcblk0p3 : start= 20480, size= 131072, ${SFDISK_PART_EFI}
/dev/mmcblk0p4 : start= 151552, size= 262144, ${SFDISK_PART_EFIBOOTGUARD_A}
/dev/mmcblk0p5 : start= 413696, size= 262144, ${SFDISK_PART_EFIBOOTGUARD_B}
/dev/mmcblk0p6 : start= 675840, size= 7294976, ${SFDISK_PART_ROOT_A}
/dev/mmcblk0p7 : start= 7970816, size= 7294976, ${SFDISK_PART_ROOT_B}

View File

@ -0,0 +1,3 @@
FILESEXTRAPATHS:prepend := "${THISDIR}/coreos-installer-config:"
SRC_URI:append:cn913x = " file://cn9130-cf-pro_1.0.sfdisk"

View File

@ -0,0 +1,18 @@
# short-description: Create SDCard installer image
# long-description: Create SDCard installer image
# offset 1S => 1 sector (1x512 byte)
# The bootloader can be at 5 different position: 1S, 34S, 4096S, 8192S, 12288S
# MBR disk use only the sector 0, so 1S is free
# GPT disk use sector 0-33S, so first free slot is 34S
# Current bootloader is about 1.8MB, so if we put it at 4096S and 12288S we
# have 4MiB between the first bootloader and the second copy of it
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# Don't name partition in the installer disk image, otherwise the installer may not work as it rely on partition label!
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
part --offset 4096S --source rawcopy --sourceparams="file=flash-image.bin" --ondisk mmcblk1 --fixed-size 4M
part --offset 12288S --source rawcopy --sourceparams="file=flash-image.bin" --ondisk mmcblk1 --fixed-size 4M
part --source bootimg-partition --part-type=EF00 --ondisk mmcblk1 --offset 20480S --fixed-size 125M
bootloader --ptable gpt