diff mbox series

[meta-rockchip,4/4] rauc demo: add

Message ID 20240522230808.14409-4-twoerner@gmail.com
State New
Headers show
Series [meta-rockchip,1/4] rename root partition | expand

Commit Message

Trevor Woerner May 22, 2024, 11:08 p.m. UTC
Add an example of implementing rauc on a rockchip board. Adding the meta-rauc
layer, adding 'rauc' to DISTRO_FEATURES, and enabling RK_RAUC_DEMO will build
an image using the example provided in dynamic-layers/rk-rauc-demo.

This example uses a simple A/B + D scheme (i.e. two root partitions and a
non-updated /data partition). Repartitioning occurs automatically on first
boot thanks to systemd's 'repart' mechanism.

NOTE:
- this example only works with systemd

If you wish to provide your own implementation, simply add the meta-rauc
layer, add 'rauc' to DISTRO_FEATURES, don't enable RK_RAUC_DEMO, and provide
your own implementation in a separate layer.

Signed-off-by: Trevor Woerner <twoerner@gmail.com>
---
 classes-recipe/rk-rauc-demo.bbclass           |  8 ++
 classes/rk-rauc-demo.bbclass                  |  3 +
 conf/layer.conf                               |  4 +
 conf/machine/include/rockchip-wic.inc         |  5 +-
 .../recipes-bsp/u-boot/files/boot.cmd.in      | 51 ++++++++++++
 .../recipes-bsp/u-boot/files/uboot-rauc.cfg   |  8 ++
 .../recipes-bsp/u-boot/u-boot_%.bbappend      | 26 ++++++
 .../base-files/base-files_%.bbappend          |  6 ++
 .../recipes-core/base-files/files/fstab       |  7 ++
 .../rauc-bundles/files/development-1.cert.pem | 80 +++++++++++++++++++
 .../rauc-bundles/files/development-1.key.pem  | 28 +++++++
 .../rauc-bundles/rockchip-rauc-bundle.bb      | 14 ++++
 .../recipes-core/rauc/files/ca.cert.pem       | 80 +++++++++++++++++++
 .../recipes-core/rauc/files/system.conf.in    | 17 ++++
 .../recipes-core/rauc/rauc-conf%.bbappend     | 12 +++
 .../systemd/files/25-rootfsA.conf             |  4 +
 .../systemd/files/35-rootfsB.conf             |  7 ++
 .../recipes-core/systemd/files/45-data.conf   |  6 ++
 .../recipes-core/systemd/systemd_%.bbappend   | 20 +++++
 19 files changed, 385 insertions(+), 1 deletion(-)
 create mode 100644 classes-recipe/rk-rauc-demo.bbclass
 create mode 100644 classes/rk-rauc-demo.bbclass
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/boot.cmd.in
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/uboot-rauc.cfg
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/u-boot_%.bbappend
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/base-files/base-files_%.bbappend
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/base-files/files/fstab
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.cert.pem
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.key.pem
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/rockchip-rauc-bundle.bb
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/ca.cert.pem
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/system.conf.in
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc/rauc-conf%.bbappend
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/25-rootfsA.conf
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/35-rootfsB.conf
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/45-data.conf
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/systemd_%.bbappend

Comments

Quentin Schulz May 23, 2024, 12:53 p.m. UTC | #1
Hi Trevor,

On 5/23/24 1:08 AM, Trevor Woerner via lists.yoctoproject.org wrote:
> Add an example of implementing rauc on a rockchip board. Adding the meta-rauc
> layer, adding 'rauc' to DISTRO_FEATURES, and enabling RK_RAUC_DEMO will build
> an image using the example provided in dynamic-layers/rk-rauc-demo.
> 
> This example uses a simple A/B + D scheme (i.e. two root partitions and a
> non-updated /data partition). Repartitioning occurs automatically on first
> boot thanks to systemd's 'repart' mechanism.
> 
> NOTE:
> - this example only works with systemd
> 
> If you wish to provide your own implementation, simply add the meta-rauc
> layer, add 'rauc' to DISTRO_FEATURES, don't enable RK_RAUC_DEMO, and provide
> your own implementation in a separate layer.
> 

I think this would be nice to document in the README (or somewhere more 
appropriate?).

> Signed-off-by: Trevor Woerner <twoerner@gmail.com>
> ---
>   classes-recipe/rk-rauc-demo.bbclass           |  8 ++
>   classes/rk-rauc-demo.bbclass                  |  3 +
>   conf/layer.conf                               |  4 +
>   conf/machine/include/rockchip-wic.inc         |  5 +-
>   .../recipes-bsp/u-boot/files/boot.cmd.in      | 51 ++++++++++++
>   .../recipes-bsp/u-boot/files/uboot-rauc.cfg   |  8 ++
>   .../recipes-bsp/u-boot/u-boot_%.bbappend      | 26 ++++++
>   .../base-files/base-files_%.bbappend          |  6 ++
>   .../recipes-core/base-files/files/fstab       |  7 ++
>   .../rauc-bundles/files/development-1.cert.pem | 80 +++++++++++++++++++
>   .../rauc-bundles/files/development-1.key.pem  | 28 +++++++
>   .../rauc-bundles/rockchip-rauc-bundle.bb      | 14 ++++
>   .../recipes-core/rauc/files/ca.cert.pem       | 80 +++++++++++++++++++
>   .../recipes-core/rauc/files/system.conf.in    | 17 ++++
>   .../recipes-core/rauc/rauc-conf%.bbappend     | 12 +++
>   .../systemd/files/25-rootfsA.conf             |  4 +
>   .../systemd/files/35-rootfsB.conf             |  7 ++
>   .../recipes-core/systemd/files/45-data.conf   |  6 ++
>   .../recipes-core/systemd/systemd_%.bbappend   | 20 +++++
>   19 files changed, 385 insertions(+), 1 deletion(-)
>   create mode 100644 classes-recipe/rk-rauc-demo.bbclass
>   create mode 100644 classes/rk-rauc-demo.bbclass

Please name them differently to not confuse users as to which class is 
used in which context. Are they even both used?

>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/boot.cmd.in
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/uboot-rauc.cfg
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/u-boot_%.bbappend
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/base-files/base-files_%.bbappend
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/base-files/files/fstab
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.cert.pem
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.key.pem
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/rockchip-rauc-bundle.bb
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/ca.cert.pem
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/system.conf.in
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/rauc/rauc-conf%.bbappend
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/25-rootfsA.conf
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/35-rootfsB.conf
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/45-data.conf
>   create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/systemd_%.bbappend
> 
> diff --git a/classes-recipe/rk-rauc-demo.bbclass b/classes-recipe/rk-rauc-demo.bbclass
> new file mode 100644
> index 000000000000..25e105b53d09
> --- /dev/null
> +++ b/classes-recipe/rk-rauc-demo.bbclass
> @@ -0,0 +1,8 @@
> +inherit features_check
> +
> +REQUIRED_DISTRO_FEATURES += "systemd rauc"
> +REQUIRED_MACHINE_FEATURES += "rk-u-boot-env"
> +
> +# 'RK_RAUC_DEMO' indicates the user wants to use the
> +# rauc demo configuration from this layer
> +OVERRIDES .= "${@ ':rk-rauc-demo' if bb.utils.to_boolean(d.getVar('RK_RAUC_DEMO'), False) else ''}"

This very much smells like we should have a DISTRO for this instead no? 
What made you decide to go for a class?

Also, why is here and also in the global class just below? This should 
be in the global class only to apply to all recipes?

> diff --git a/classes/rk-rauc-demo.bbclass b/classes/rk-rauc-demo.bbclass
> new file mode 100644
> index 000000000000..1382b645f96b
> --- /dev/null
> +++ b/classes/rk-rauc-demo.bbclass
> @@ -0,0 +1,3 @@
> +# 'RK_RAUC_DEMO' indicates the user wants to use the
> +# rauc demo configuration from this layer
> +OVERRIDES .= "${@ ':rk-rauc-demo' if bb.utils.to_boolean(d.getVar('RK_RAUC_DEMO'), False) else ''}" > diff --git a/conf/layer.conf b/conf/layer.conf
> index 68205dd7ea4c..03914d2952e1 100644
> --- a/conf/layer.conf
> +++ b/conf/layer.conf
> @@ -21,3 +21,7 @@ BBFILES_DYNAMIC += " \
>       qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/*/*/*.bb \
>       qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/*/*/*.bbappend \
>   "
> +BBFILES_DYNAMIC += " \
> +    rauc:${LAYERDIR}/dynamic-layers/rk-rauc-demo/*/*/*.bb \
> +    rauc:${LAYERDIR}/dynamic-layers/rk-rauc-demo/*/*/*.bbappend \
> +"
> diff --git a/conf/machine/include/rockchip-wic.inc b/conf/machine/include/rockchip-wic.inc
> index dab61d83ed2c..9e3b62f2a99b 100644
> --- a/conf/machine/include/rockchip-wic.inc
> +++ b/conf/machine/include/rockchip-wic.inc
> @@ -1,11 +1,14 @@
>   # common meta-rockchip wic/wks items
>   
> +inherit rk-rauc-demo
> +
>   require conf/machine/include/rockchip-extlinux.inc
>   require conf/machine/include/rockchip-rk-u-boot-env.inc
>   
>   SPL_BINARY ?= "idbloader.img"
>   
> -IMAGE_FSTYPES += "wic wic.bmap"
> +IMAGE_FSTYPES ?= "wic wic.bmap"
> +IMAGE_FSTYPES:append:rk-rauc-demo = " ext4"

Put this into a separate variable, e.g. RAUC_ROOTFS_TYPE so that 
RAUC_SLOT_rootfs[fstype] can use that variable directly.

EDIT: reading a bit more, a lot more than RAUC_SLOT_rootfs is actually 
assuming ext4, so maybe it isn't THAT useful (at least in the current 
implementation).

>   WKS_FILE ?= "rockchip.wks"
>   WKS_FILE_DEPENDS ?= " \
>   	e2fsprogs-native \
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/boot.cmd.in b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/boot.cmd.in
> new file mode 100644
> index 000000000000..0887d2b5b812
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/boot.cmd.in
> @@ -0,0 +1,51 @@
> +echo "devtype: ${devtype}"
> +echo "devnum: ${devnum}"
> +echo "distro_bootpart: ${distro_bootpart}"
> +
> +test -n "${BOOT_ORDER}" || env set BOOT_ORDER "A B"
> +test -n "${BOOT_A_LEFT}" || env set BOOT_A_LEFT 3
> +test -n "${BOOT_B_LEFT}" || env set BOOT_B_LEFT 3
> +test -n "${RAUC_BOOTDEV}" || env set RAUC_BOOTDEV "${devtype} ${devnum}:${distro_bootpart}"
> +
> +env set RAUC_BOOTPART
> +env set RAUC_SLOT
> +
> +echo "BOOT_ORDER: ${BOOT_ORDER}"
> +for RAUC_BOOTSLOT in "${BOOT_ORDER}"; do
> +  if test "x${RAUC_BOOTPART}" != "x"; then
> +    # skip remaining slots
> +  elif test "x${RAUC_BOOTSLOT}" = "xA"; then
> +    if test ${BOOT_A_LEFT} -gt 0; then
> +      echo "using RAUC slot A"
> +      setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
> +      env set RAUC_BOOTPART "PARTLABEL=rootfsA"
> +      env set RAUC_SLOT "A"
> +      env set RAUC_BOOTDEV "${devtype} ${devnum}:${distro_bootpart}"
> +      echo "RAUC_BOOTDEV: ${RAUC_BOOTDEV}"
> +    fi
> +  elif test "x${RAUC_BOOTSLOT}" = "xB"; then
> +    if test ${BOOT_B_LEFT} -gt 0; then
> +      echo "using RAUC slot B"
> +      setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
> +      env set RAUC_BOOTPART "PARTLABEL=rootfsB"
> +      env set RAUC_SLOT "B"
> +      setexpr BOOTPART1 ${distro_bootpart} + 1

This is absolutely not guaranteed to be the case.

I would recommend to use the label of the partition to find out which 
partition index to use in subsequent commands.

 > part number ${devtype} ${devnum} root BOOTPART1

> +      env set RAUC_BOOTDEV "${devtype} ${devnum}:${BOOTPART1}"
> +      echo "RAUC_BOOTDEV: ${RAUC_BOOTDEV}"
> +    fi
> +  fi
> +done
> +

Up to you but you could merge the two if conditions into one:

"""
for RAUC_BOOTSLOT in "${BOOT_ORDER}"; do
     if test "x${RAUC_BOOTPART}" != "x"; then
         # no break; in U-Boot, need to ignore til the end
     else; then
         env set BOOT_LEFT BOOT_${RAUC_BOOTSLOT}_LEFT
         if test ${BOOT_LEFT} -gt 0; then
             echo "using RAUC slot ${RAUC_BOOTSLOT}"
             setexpr BOOT_LEFT ${BOOT_LEFT} - 1
             env set RAUC_BOOTPART "PARTLABEL=rootfs${RAUC_BOOTSLOT}"
             env set RAUC_SLOT ${RAUC_BOOTSLOT}
             part number ${devtype} ${devnum} rootfs${RAUC_BOOTSLOT} 
BOOTPART
             env set RAUC_BOOTDEV "${devtype} ${devnum}:${BOOTPART}"
             echo "RAUC_BOOTDEV: ${RAUC_BOOTDEV}"
         fi
     fi
done
"""

> +if test -n "${RAUC_BOOTPART}"; then
> +  env set bootargs "${bootargsbase} root=${RAUC_BOOTPART} rauc.slot=${RAUC_SLOT}"
> +  env save
> +else
> +  echo "No valid RAUC slot found. Resetting tries to 3"
> +  env set BOOT_A_LEFT 3
> +  env set BOOT_B_LEFT 3
> +  env save
> +  reset
> +fi
> +
> +ext4load ${RAUC_BOOTDEV} ${kernel_addr_r} @@KERNEL_BOOTFILE@@
> +bootm ${kernel_addr_r}

This means we don't support Image/zImage, only fitImages. Is there no 
way to use extlinux for that to make use of the work you've already done 
to merge /boot with /?

It seems that specifying APPEND in extlinux.conf will forcefully 
overwrite the whole bootargs... I'm wondering if putting 
${rauc_bootargs} in extlinux.conf would save us. Then we would need to 
write to rauc_bootargs instead of bootargs. Also, unset 
UBOOT_EXTLINUX_ROOT so that the label won't make it to APPEND.

I haven't tested but I think this would allow us to not have to maintain 
this boot script too much. This would also allows us to have a rootfs 
type different than ext4 without having to care about the content of the 
  bootscript since extlinux will be found by whatever command is 
supposed to find it.

> diff --git a/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/uboot-rauc.cfg b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/uboot-rauc.cfg
> new file mode 100644
> index 000000000000..77b7164e0192
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/uboot-rauc.cfg
> @@ -0,0 +1,8 @@
> +CONFIG_CMD_BOOTDEV=y
> +CONFIG_CMD_BOOTMETH=y
> +CONFIG_CMD_SETEXPR=y
> +CONFIG_CMD_SETEXPR_FMT=y
> +CONFIG_BOOTSTD_DEFAULTS=n
> +CONFIG_BOOTMETH_EXTLINUX=n
> +CONFIG_BOOTMETH_EXTLINUX_PXE=n
> +CONFIG_BOOTMETH_VBE=n
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/u-boot_%.bbappend b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/u-boot_%.bbappend
> new file mode 100644
> index 000000000000..f075cb9383aa
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/u-boot_%.bbappend
> @@ -0,0 +1,26 @@
> +inherit rk-rauc-demo
> +
> +FILESEXTRAPATHS:prepend:rk-rauc-demo := "${THISDIR}/files:"
> +
> +DEPENDS:append:rk-rauc-demo = " u-boot-mkimage-native"
> +SRC_URI:append:rk-rauc-demo = " \
> +	file://uboot-rauc.cfg \
> +	file://boot.cmd.in \
> +	"
> +
> +do_compile:append:rk-rauc-demo() {
> +	# create boot script
> +	sed -e 's|@@KERNEL_BOOTFILE@@|${UBOOT_EXTLINUX_KERNEL_IMAGE}|' \
> +	    "${WORKDIR}/boot.cmd.in" > "${WORKDIR}/boot.cmd"
> +	mkimage -A ${UBOOT_ARCH} -T script -C none -n "Boot script" -d "${WORKDIR}/boot.cmd" ${WORKDIR}/boot.scr
> +
> +	# tweak environment
> +	echo "bootmeths=script extlinux" >> ${B}/u-boot-initial-env
> +	echo "bootargsbase=${UBOOT_EXTLINUX_KERNEL_ARGS} ${UBOOT_EXTLINUX_CONSOLE}" >> ${B}/u-boot-initial-env

Shouldn't those only be done if RK_IMAGE_INCLUDES_UBOOT_ENV is True?

> +}
> +
> +do_install:append:rk-rauc-demo() {
> +	install -d ${D}/boot
> +	install -m 0644 ${WORKDIR}/boot.scr ${D}/boot
> +}

Would it make sense to also deploy this file?

> +FILES:${PN}-extlinux += "/boot/boot.scr"
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/base-files/base-files_%.bbappend b/dynamic-layers/rk-rauc-demo/recipes-core/base-files/base-files_%.bbappend
> new file mode 100644
> index 000000000000..88df362b8b23
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/base-files/base-files_%.bbappend
> @@ -0,0 +1,6 @@
> +inherit rk-rauc-demo
> +
> +FILESEXTRAPATHS:prepend:rk-rauc-demo := "${THISDIR}/files:"
> +
> +# Add a mount point for a shared data partition
> +dirs755 += "/data"
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/base-files/files/fstab b/dynamic-layers/rk-rauc-demo/recipes-core/base-files/files/fstab
> new file mode 100644
> index 000000000000..de25bb1e608b
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/base-files/files/fstab
> @@ -0,0 +1,7 @@
> +/dev/root            /                    auto       x-systemd.growfs                   1  1
> +proc                 /proc                proc       defaults                           0  0
> +devpts               /dev/pts             devpts     mode=0620,ptmxmode=0666,gid=5      0  0
> +tmpfs                /run                 tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
> +tmpfs                /var/volatile        tmpfs      defaults                           0  0
> +
> +LABEL=data  /data  ext4  defaults  0  0

Systemd itself recommends using mount units instead of modifying fstab, 
c.f. 
https://manpages.debian.org/testing/systemd/systemd.mount.5.en.html#FSTAB

"""
In general, configuring mount points through /etc/fstab is the preferred 
approach to manage mounts for humans. For tooling, writing mount units 
should be preferred over editing /etc/fstab.
"""

I guess we could argue which of humans vs tooling we represent here :)

The nice thing about using mount units is that this could be a separate 
package recipe and not modify base-files and maybe even allow people to 
extend this to support systemd-less systems for the demo?

> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.cert.pem b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.cert.pem
> new file mode 100644
> index 000000000000..92e71125d22f
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.cert.pem
> @@ -0,0 +1,80 @@
> +Certificate:
> +    Data:
> +        Version: 3 (0x2)
> +        Serial Number: 2 (0x2)
> +        Signature Algorithm: sha256WithRSAEncryption
> +        Issuer: O=Test Org, CN=Test Org rauc CA Development
> +        Validity
> +            Not Before: Jan  1 00:00:00 1970 GMT
> +            Not After : Dec 31 23:59:59 9999 GMT
> +        Subject: O=Test Org, CN=Test Org Development-1
> +        Subject Public Key Info:
> +            Public Key Algorithm: rsaEncryption
> +                RSA Public-Key: (2048 bit)
> +                Modulus:
> +                    00:ac:2b:0f:05:02:d0:bb:b0:47:05:36:71:3c:20:
> +                    0e:a7:76:8d:75:c1:23:5e:6c:7a:2d:94:ff:3c:17:
> +                    d8:0b:44:48:2a:82:03:92:c5:fd:33:76:0c:42:cf:
> +                    4d:8a:c9:47:7f:af:52:7c:15:6c:3b:e7:60:d1:04:
> +                    97:24:7b:07:1f:56:7d:6c:3f:31:e8:f9:36:7b:33:
> +                    5b:cf:54:ea:37:98:a6:b1:9a:1d:da:96:a1:07:14:
> +                    9c:15:80:4d:db:0c:03:86:ce:c7:3d:72:57:a2:da:
> +                    a0:c0:8c:b2:9a:a0:6a:e5:b8:5f:52:d2:f6:27:ca:
> +                    48:f4:e3:86:eb:be:24:93:6a:af:60:68:7f:09:3b:
> +                    81:96:ce:85:0c:63:93:d8:fa:91:dc:50:2e:77:bb:
> +                    bc:38:42:e9:86:d8:ac:33:dd:e6:d4:37:69:e3:01:
> +                    8d:21:8f:a9:4a:7f:15:a5:aa:a9:be:fc:36:93:a4:
> +                    10:0c:18:33:30:06:7f:1c:13:b3:a9:c6:57:d7:6b:
> +                    96:45:15:e7:f5:8f:3d:48:e0:08:46:4f:7f:ef:14:
> +                    77:95:25:25:9b:14:21:84:25:eb:37:0b:01:48:e6:
> +                    f5:c1:8b:61:c6:cb:8c:6b:a7:d8:d2:f9:31:e3:80:
> +                    3f:78:ea:6a:41:6c:5d:4d:83:a6:54:0d:5b:c2:0e:
> +                    f6:ef
> +                Exponent: 65537 (0x10001)
> +        X509v3 extensions:
> +            X509v3 Subject Key Identifier:
> +                89:4C:FE:8A:60:4D:C9:6D:F7:A8:C0:04:49:7F:AA:05:92:29:17:FB
> +            X509v3 Authority Key Identifier:
> +                keyid:44:0C:AF:4A:74:B4:C7:65:02:B2:95:F1:91:7C:A3:CC:E6:3E:99:E8
> +                DirName:/O=Test Org/CN=Test Org rauc CA Development
> +                serial:01
> +
> +            X509v3 Basic Constraints:
> +                CA:FALSE
> +    Signature Algorithm: sha256WithRSAEncryption
> +         2c:d2:30:68:f5:84:52:1e:cf:ed:0d:fc:e7:02:69:0b:3b:f6:
> +         c3:77:00:12:1d:2d:d0:8f:49:9e:5c:f1:00:7b:1d:4f:d5:a9:
> +         46:a5:df:54:90:50:b4:8f:8e:ba:4b:2d:82:74:eb:5b:a8:f5:
> +         45:7b:77:73:b1:9b:32:93:15:c0:5c:02:2a:ed:b0:1e:bb:d8:
> +         4e:41:17:20:af:04:46:21:20:7b:86:9f:32:ab:54:71:26:e8:
> +         0b:75:12:9c:63:53:4f:54:db:a7:f9:b2:fa:e9:ee:4a:9d:80:
> +         ba:ae:3f:eb:ef:10:11:2d:4f:5a:34:fb:8b:45:10:63:0b:f8:
> +         af:f3:8b:24:21:2a:e0:0b:44:38:44:b5:9d:6e:8a:ff:1f:bf:
> +         6e:44:21:22:ec:8a:8d:73:63:e5:df:1a:ec:2a:64:1f:97:f9:
> +         5c:3a:25:7f:03:80:4c:db:99:5e:f9:7d:2b:f1:d0:97:4d:95:
> +         6f:29:47:7b:3f:29:e3:96:25:b0:1c:f1:0b:8b:8b:ba:de:3b:
> +         3f:40:2e:bd:31:68:ea:a9:8f:dc:c9:09:22:df:76:69:08:5d:
> +         5d:a4:09:62:80:20:83:9e:bd:d4:a6:35:ee:97:50:66:39:62:
> +         66:1b:2e:75:f2:6d:e7:06:ae:67:5f:4b:63:5c:52:e7:5d:dd:
> +         c9:0c:86:2b
> +-----BEGIN CERTIFICATE-----
> +MIIDfTCCAmWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADA6MREwDwYDVQQKDAhUZXN0
> +IE9yZzElMCMGA1UEAwwcVGVzdCBPcmcgcmF1YyBDQSBEZXZlbG9wbWVudDAgFw03
> +MDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowNDERMA8GA1UECgwIVGVzdCBP
> +cmcxHzAdBgNVBAMMFlRlc3QgT3JnIERldmVsb3BtZW50LTEwggEiMA0GCSqGSIb3
> +DQEBAQUAA4IBDwAwggEKAoIBAQCsKw8FAtC7sEcFNnE8IA6ndo11wSNebHotlP88
> +F9gLREgqggOSxf0zdgxCz02KyUd/r1J8FWw752DRBJckewcfVn1sPzHo+TZ7M1vP
> +VOo3mKaxmh3alqEHFJwVgE3bDAOGzsc9clei2qDAjLKaoGrluF9S0vYnykj044br
> +viSTaq9gaH8JO4GWzoUMY5PY+pHcUC53u7w4QumG2Kwz3ebUN2njAY0hj6lKfxWl
> +qqm+/DaTpBAMGDMwBn8cE7OpxlfXa5ZFFef1jz1I4AhGT3/vFHeVJSWbFCGEJes3
> +CwFI5vXBi2HGy4xrp9jS+THjgD946mpBbF1Ng6ZUDVvCDvbvAgMBAAGjgZEwgY4w
> +HQYDVR0OBBYEFIlM/opgTclt96jABEl/qgWSKRf7MGIGA1UdIwRbMFmAFEQMr0p0
> +tMdlArKV8ZF8o8zmPpnooT6kPDA6MREwDwYDVQQKDAhUZXN0IE9yZzElMCMGA1UE
> +AwwcVGVzdCBPcmcgcmF1YyBDQSBEZXZlbG9wbWVudIIBATAJBgNVHRMEAjAAMA0G
> +CSqGSIb3DQEBCwUAA4IBAQAs0jBo9YRSHs/tDfznAmkLO/bDdwASHS3Qj0meXPEA
> +ex1P1alGpd9UkFC0j466Sy2CdOtbqPVFe3dzsZsykxXAXAIq7bAeu9hOQRcgrwRG
> +ISB7hp8yq1RxJugLdRKcY1NPVNun+bL66e5KnYC6rj/r7xARLU9aNPuLRRBjC/iv
> +84skISrgC0Q4RLWdbor/H79uRCEi7IqNc2Pl3xrsKmQfl/lcOiV/A4BM25le+X0r
> +8dCXTZVvKUd7PynjliWwHPELi4u63js/QC69MWjqqY/cyQki33ZpCF1dpAligCCD
> +nr3UpjXul1BmOWJmGy518m3nBq5nX0tjXFLnXd3JDIYr
> +-----END CERTIFICATE-----
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.key.pem b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.key.pem
> new file mode 100644
> index 000000000000..80305f8291b1
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.key.pem
> @@ -0,0 +1,28 @@
> +-----BEGIN PRIVATE KEY-----
> +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCsKw8FAtC7sEcF
> +NnE8IA6ndo11wSNebHotlP88F9gLREgqggOSxf0zdgxCz02KyUd/r1J8FWw752DR
> +BJckewcfVn1sPzHo+TZ7M1vPVOo3mKaxmh3alqEHFJwVgE3bDAOGzsc9clei2qDA
> +jLKaoGrluF9S0vYnykj044brviSTaq9gaH8JO4GWzoUMY5PY+pHcUC53u7w4QumG
> +2Kwz3ebUN2njAY0hj6lKfxWlqqm+/DaTpBAMGDMwBn8cE7OpxlfXa5ZFFef1jz1I
> +4AhGT3/vFHeVJSWbFCGEJes3CwFI5vXBi2HGy4xrp9jS+THjgD946mpBbF1Ng6ZU
> +DVvCDvbvAgMBAAECggEASphBYq9sltVyf/ytpRpSnxYLhmiPFXs0mIlE6Nl/3qnQ
> +BrLcL3yfDuvntg6xjx9UXistNtvlUDMYzJcLkV/InzhPEVZ0HnfTth9zeOpWrI30
> +M2EN7EZ1MGcqlVpI4U5cPM1cn+/proLBQYv0WnCEwFFY477JrkXDxG7MZ1mz6TaL
> +IGcCCIUu1BxECngQ344eaKrSR5F2MtlxAl19Pt5QSPfmuMdmElrK6RtBjnKrDu1K
> +fe6DCfObZ3nbG2fhFV4uTxhlTC9lUmfTQMKR79rLmHNKnbMx74kFNvy3XlT2l35I
> +ZVfRMLPWph7yMom9v/Im3Q70uhJ1lxyqbbl/DFZVmQKBgQDVo19SqR/QeDIxPIPn
> +XvVWzo5ml3KO/dVxA8sok6twr+G7yUeIUnuauYFA/tX/FS32azFRa/7GjUfoTx3q
> +GHK43TBCMyEt0we6WwZb+FkWa/b/RBoyD/audrpmgDDi1+fXPs8bBvoO8/oju20D
> +I6wOjSovcIMaeLo/+u3U6ShNQwKBgQDOTpoGMsQzXchZfDmxL61h3j4Gtjrl4BpU
> +WhAkJ9U2BRpL8NSZLErn5ik8MwgK2ut+YdU7aogI0D6Gc+4zZoJDEbhhmPD9cprv
> +LMyfAKoisR01OyU57mMSGQq0dfjmK6PfYJdX5sQJGkMFptNAJLTDoYtmXItSICoY
> +1j5KTvwe5QKBgGytxmErjfakHoxzh3pdERuOylwgMPPS5xCt6FyE+pLBtmisFQqh
> +QyXLtpgUy1IPOSmBED6mXJ4u4uSn0sTymPG3+8PBdOB12RmREqQYq2E/nQ/wWg8b
> +ldbcqShZkATl5pfV6M+L9gtDS/1/bA5LyExCvbISX29I+R5xDSnhTlI3AoGBAJRK
> +VVXtOa/+UhtYOpPMxGCbgZQLemxvWB2XmxCR/SRWKJ+7XOU4vCLSAoO93qMG1szB
> +/6Y0ndFP9hFo1SfnH+ybmR+18ksLDKisV+xWavSCwI7Zk5l/a4C/tT0fqyeu6JyQ
> +bliFjBVK5i/yyNfLSo9v16ZdENuYOQofPSjmezytAoGBALhwvtzgqvqGSXID2w5N
> +ullK8ny3WRa1o5DLXuMV19CvknmrN/zmmjQLblKkdp9VBb7uo8czon+qL1ZZyywC
> +W2BmHfGMPUyQHux4btsdJhlWcS7z7aYXM9QWiKlI+EKLHLILYk+LPIEf85sUcOZV
> +eCBpViT7fv2iv/0L+mzjWtLA
> +-----END PRIVATE KEY-----
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/rockchip-rauc-bundle.bb b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/rockchip-rauc-bundle.bb
> new file mode 100644
> index 000000000000..23eac4d3c4f5
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/rockchip-rauc-bundle.bb
> @@ -0,0 +1,14 @@
> +DESCRIPTION = "Rockchip RAUC bundle generator"
> +
> +inherit bundle
> +
> +RAUC_BUNDLE_COMPATIBLE = "${MACHINE}"
> +RAUC_BUNDLE_VERSION = "v20240512"
> +RAUC_BUNDLE_DESCRIPTION = "RAUC Demo Bundle"
> +RAUC_BUNDLE_FORMAT = "verity"
> +RAUC_BUNDLE_SLOTS = "rootfs"
> +RAUC_SLOT_rootfs = "core-image-base"
> +RAUC_SLOT_rootfs[fstype] = "ext4"
> +
> +RAUC_KEY_FILE = "${THISDIR}/files/development-1.key.pem"
> +RAUC_CERT_FILE = "${THISDIR}/files/development-1.cert.pem"

Please always use the walrus operator when THISDIR is used.

> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/ca.cert.pem b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/ca.cert.pem
> new file mode 100644
> index 000000000000..46944a99df22
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/ca.cert.pem
> @@ -0,0 +1,80 @@
> +Certificate:
> +    Data:
> +        Version: 3 (0x2)
> +        Serial Number: 1 (0x1)
> +        Signature Algorithm: sha256WithRSAEncryption
> +        Issuer: O=Test Org, CN=Test Org rauc CA Development
> +        Validity
> +            Not Before: Jan  1 00:00:00 1970 GMT
> +            Not After : Dec 31 23:59:59 9999 GMT
> +        Subject: O=Test Org, CN=Test Org rauc CA Development
> +        Subject Public Key Info:
> +            Public Key Algorithm: rsaEncryption
> +                RSA Public-Key: (2048 bit)
> +                Modulus:
> +                    00:c0:fe:7b:6c:c3:e3:47:cc:d4:15:e1:0c:b2:1c:
> +                    c9:f7:61:3e:42:d7:f1:a4:30:f2:db:0e:49:95:49:
> +                    70:ee:97:6d:fe:48:5d:b9:22:63:47:e0:be:63:d7:
> +                    68:9b:38:04:7d:7f:d9:65:ef:1d:6c:26:cb:05:7f:
> +                    59:45:15:9d:76:59:c4:8d:59:a0:38:a0:25:fa:86:
> +                    1b:f4:85:ff:cf:7c:c7:57:a3:7e:56:71:7d:69:c3:
> +                    69:a7:fb:e6:8e:bc:f9:49:e2:f5:9a:97:e5:2d:75:
> +                    ef:f9:76:29:5f:76:11:1b:70:6f:4d:26:4f:e0:06:
> +                    9b:8c:e3:76:91:81:4a:4e:98:5d:2e:f4:bd:23:4d:
> +                    e7:5d:9b:ea:68:4d:03:9e:35:90:c5:f2:8d:ae:ed:
> +                    44:4f:f3:50:dc:2b:ef:ae:44:35:79:78:3d:65:4b:
> +                    d9:16:98:aa:be:08:47:25:af:68:1c:0b:8e:c1:aa:
> +                    02:a7:61:4f:4d:15:1b:07:3c:4e:60:b3:9a:d5:c1:
> +                    39:34:4e:8e:e7:93:46:f1:75:95:aa:16:9a:1d:e6:
> +                    49:15:a5:ae:06:8a:45:16:a9:af:59:60:9b:c6:6d:
> +                    3d:19:57:5d:de:31:d5:dc:96:0e:a4:25:fe:7a:07:
> +                    71:c5:40:c0:a3:d0:d5:84:47:14:7a:5a:f1:07:75:
> +                    79:35
> +                Exponent: 65537 (0x10001)
> +        X509v3 extensions:
> +            X509v3 Subject Key Identifier:
> +                44:0C:AF:4A:74:B4:C7:65:02:B2:95:F1:91:7C:A3:CC:E6:3E:99:E8
> +            X509v3 Authority Key Identifier:
> +                keyid:44:0C:AF:4A:74:B4:C7:65:02:B2:95:F1:91:7C:A3:CC:E6:3E:99:E8
> +                DirName:/O=Test Org/CN=Test Org rauc CA Development
> +                serial:01
> +
> +            X509v3 Basic Constraints:
> +                CA:TRUE
> +    Signature Algorithm: sha256WithRSAEncryption
> +         30:07:51:4d:d6:2c:0c:2f:3e:6c:5c:34:1f:07:21:8d:50:77:
> +         9a:a6:81:75:62:f0:fe:ff:3b:5b:d0:7c:d1:45:e7:e2:67:d4:
> +         23:cb:af:9a:8b:f4:2b:d2:33:3d:45:bb:a7:7d:b4:9b:41:db:
> +         fb:62:ac:83:fc:41:ae:e5:dc:2d:df:7d:72:7e:df:34:01:60:
> +         94:7f:15:78:84:87:f0:23:e4:8e:b8:dc:71:cb:84:4b:25:bb:
> +         62:8f:fd:7f:d3:3c:1d:85:45:fb:03:7c:a2:bc:c4:a8:fa:2b:
> +         ec:79:67:8d:f4:5f:37:a8:5a:54:bc:b3:78:11:0b:8b:29:90:
> +         8b:48:4a:d7:87:93:96:97:72:10:1d:70:29:f8:e4:c3:81:6d:
> +         7d:c3:6e:d4:c8:1b:0b:0d:f9:c0:b9:7b:11:54:e2:af:8b:a0:
> +         45:de:c2:67:81:8c:0c:9d:ba:a1:31:8b:f2:cc:da:c7:cc:6d:
> +         21:92:2a:57:29:9c:48:92:75:d9:1a:6e:d3:ee:53:66:83:2e:
> +         08:74:09:5d:78:13:99:34:7d:16:8c:ba:29:75:80:20:8b:ca:
> +         91:19:29:64:ef:64:37:de:5b:22:18:99:5b:63:69:9a:a2:44:
> +         21:70:30:41:f2:58:27:ab:4f:5c:d0:e1:94:5d:d1:5b:8d:fd:
> +         bf:8f:a9:99
> +-----BEGIN CERTIFICATE-----
> +MIIDhjCCAm6gAwIBAgIBATANBgkqhkiG9w0BAQsFADA6MREwDwYDVQQKDAhUZXN0
> +IE9yZzElMCMGA1UEAwwcVGVzdCBPcmcgcmF1YyBDQSBEZXZlbG9wbWVudDAgFw03
> +MDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowOjERMA8GA1UECgwIVGVzdCBP
> +cmcxJTAjBgNVBAMMHFRlc3QgT3JnIHJhdWMgQ0EgRGV2ZWxvcG1lbnQwggEiMA0G
> +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA/ntsw+NHzNQV4QyyHMn3YT5C1/Gk
> +MPLbDkmVSXDul23+SF25ImNH4L5j12ibOAR9f9ll7x1sJssFf1lFFZ12WcSNWaA4
> +oCX6hhv0hf/PfMdXo35WcX1pw2mn++aOvPlJ4vWal+Utde/5dilfdhEbcG9NJk/g
> +BpuM43aRgUpOmF0u9L0jTeddm+poTQOeNZDF8o2u7URP81DcK++uRDV5eD1lS9kW
> +mKq+CEclr2gcC47BqgKnYU9NFRsHPE5gs5rVwTk0To7nk0bxdZWqFpod5kkVpa4G
> +ikUWqa9ZYJvGbT0ZV13eMdXclg6kJf56B3HFQMCj0NWERxR6WvEHdXk1AgMBAAGj
> +gZQwgZEwHQYDVR0OBBYEFEQMr0p0tMdlArKV8ZF8o8zmPpnoMGIGA1UdIwRbMFmA
> +FEQMr0p0tMdlArKV8ZF8o8zmPpnooT6kPDA6MREwDwYDVQQKDAhUZXN0IE9yZzEl
> +MCMGA1UEAwwcVGVzdCBPcmcgcmF1YyBDQSBEZXZlbG9wbWVudIIBATAMBgNVHRME
> +BTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAwB1FN1iwMLz5sXDQfByGNUHeapoF1
> +YvD+/ztb0HzRRefiZ9Qjy6+ai/Qr0jM9RbunfbSbQdv7YqyD/EGu5dwt331yft80
> +AWCUfxV4hIfwI+SOuNxxy4RLJbtij/1/0zwdhUX7A3yivMSo+ivseWeN9F83qFpU
> +vLN4EQuLKZCLSErXh5OWl3IQHXAp+OTDgW19w27UyBsLDfnAuXsRVOKvi6BF3sJn
> +gYwMnbqhMYvyzNrHzG0hkipXKZxIknXZGm7T7lNmgy4IdAldeBOZNH0WjLopdYAg
> +i8qRGSlk72Q33lsiGJlbY2maokQhcDBB8lgnq09c0OGUXdFbjf2/j6mZ
> +-----END CERTIFICATE-----
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/system.conf.in b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/system.conf.in
> new file mode 100644
> index 000000000000..4945c67345c4
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/system.conf.in
> @@ -0,0 +1,17 @@
> +[system]
> +compatible=@MACHINE@
> +bootloader=uboot
> +data-directory=/data/
> +
> +[keyring]
> +path=/etc/rauc/ca.cert.pem
> +
> +[slot.rootfs.0]
> +device=/dev/disk/by-partlabel/rootfsA
> +type=ext4
> +bootname=A
> +
> +[slot.rootfs.1]
> +device=/dev/disk/by-partlabel/rootfsB
> +type=ext4
> +bootname=B
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc/rauc-conf%.bbappend b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/rauc-conf%.bbappend
> new file mode 100644
> index 000000000000..b65e9be2afaf
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/rauc-conf%.bbappend

Don't you want rauc-conf.bbappend here to avoid matching 
rauc-conf-mycustomrecipe.bb from other layers?

> @@ -0,0 +1,12 @@
> +inherit rk-rauc-demo
> +
> +FILESEXTRAPATHS:prepend:rk-rauc-demo := "${THISDIR}/files:"
> +SRC_URI:append:rk-rauc-demo := "  \
> +	file://system.conf.in \
> +	file://ca.cert.pem \

This is not needed, RAUC_KEYRING_FILE is already set to ca.cert.pem and 
SRC_URI has RAUC_KEYRING_URI (which is file://RAUC_KEYRING_FILE) in 
there, so it'll be found with only FILESEXTRAPATHS:prepend:rk-rauc-demo.

> +	"
> +
> +do_install:append:rk-rauc-demo() {
> +	install -d ${D}${sysconfdir}/rauc
> +	sed -e 's!@MACHINE@!${MACHINE}!g' ${WORKDIR}/system.conf.in > ${D}${sysconfdir}/rauc/system.conf
> +}

I would suggest to run:

sed -e 's!@MACHINE@!${MACHINE}!g' ${WORKDIR}/system.conf.in > 
${WORKDIR}/system.conf

in a do_install:prepend, and let the do_instal from rauc-conf do the 
rest for you.

Similarly, you could actually name system.conf.in directly system.conf 
to avoid having to specify it in SRC_URI:append as it's already included 
in SRC_URI of the main recipe.

> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/25-rootfsA.conf b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/25-rootfsA.conf
> new file mode 100644
> index 000000000000..dba01e1ff863
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/25-rootfsA.conf
> @@ -0,0 +1,4 @@
> +[Partition]
> +Type=root
> +Weight=250
> +SizeMaxBytes=5G

Why no

Label=rootfsA
Format=ext4
GrowFileSystem=yes

in this one?

> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/35-rootfsB.conf b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/35-rootfsB.conf
> new file mode 100644
> index 000000000000..31a7c06c17ff
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/35-rootfsB.conf
> @@ -0,0 +1,7 @@
> +[Partition]
> +Type=root
> +Label=rootfsB
> +Weight=250
> +SizeMaxBytes=5G
> +Format=ext4
> +GrowFileSystem=yes
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/45-data.conf b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/45-data.conf
> new file mode 100644
> index 000000000000..1aac59addc26
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/45-data.conf
> @@ -0,0 +1,6 @@
> +[Partition]
> +Type=root-secondary
> +Label=data
> +Weight=500
> +Format=ext4
> +GrowFileSystem=yes
> diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/systemd_%.bbappend b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/systemd_%.bbappend
> new file mode 100644
> index 000000000000..2b9da514749e
> --- /dev/null
> +++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/systemd_%.bbappend
> @@ -0,0 +1,20 @@
> +inherit rk-rauc-demo
> +
> +FILESEXTRAPATHS:prepend:rk-rauc-demo := "${THISDIR}/files:"
> +
> +SRC_URI:append:rk-rauc-demo = " \
> +	file://25-rootfsA.conf \
> +	file://35-rootfsB.conf \
> +	file://45-data.conf \
> +	"
> +
> +PACKAGECONFIG:append:rk-rauc-demo = " repart openssl"
> +
> +do_install:append:rk-rauc-demo() {
> +	install -d ${D}${sysconfdir}/repart.d/
> +	install -m 0644 ${WORKDIR}/25-rootfsA.conf ${D}${sysconfdir}/repart.d/
> +	install -m 0644 ${WORKDIR}/35-rootfsB.conf ${D}${sysconfdir}/repart.d/
> +	install -m 0644 ${WORKDIR}/45-data.conf ${D}${sysconfdir}/repart.d/
> +}
> +
> +FILES:${PN}:append:rk-rauc-demo = " ${sysconfdir}/repart.d/"

I have a feeling the files should be done in another package recipe, we 
don't want to rebuild systemd if we change the files in here I think.

Cheers,
Quentin
diff mbox series

Patch

diff --git a/classes-recipe/rk-rauc-demo.bbclass b/classes-recipe/rk-rauc-demo.bbclass
new file mode 100644
index 000000000000..25e105b53d09
--- /dev/null
+++ b/classes-recipe/rk-rauc-demo.bbclass
@@ -0,0 +1,8 @@ 
+inherit features_check
+
+REQUIRED_DISTRO_FEATURES += "systemd rauc"
+REQUIRED_MACHINE_FEATURES += "rk-u-boot-env"
+
+# 'RK_RAUC_DEMO' indicates the user wants to use the
+# rauc demo configuration from this layer
+OVERRIDES .= "${@ ':rk-rauc-demo' if bb.utils.to_boolean(d.getVar('RK_RAUC_DEMO'), False) else ''}"
diff --git a/classes/rk-rauc-demo.bbclass b/classes/rk-rauc-demo.bbclass
new file mode 100644
index 000000000000..1382b645f96b
--- /dev/null
+++ b/classes/rk-rauc-demo.bbclass
@@ -0,0 +1,3 @@ 
+# 'RK_RAUC_DEMO' indicates the user wants to use the
+# rauc demo configuration from this layer
+OVERRIDES .= "${@ ':rk-rauc-demo' if bb.utils.to_boolean(d.getVar('RK_RAUC_DEMO'), False) else ''}"
diff --git a/conf/layer.conf b/conf/layer.conf
index 68205dd7ea4c..03914d2952e1 100644
--- a/conf/layer.conf
+++ b/conf/layer.conf
@@ -21,3 +21,7 @@  BBFILES_DYNAMIC += " \
     qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/*/*/*.bb \
     qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/*/*/*.bbappend \
 "
+BBFILES_DYNAMIC += " \
+    rauc:${LAYERDIR}/dynamic-layers/rk-rauc-demo/*/*/*.bb \
+    rauc:${LAYERDIR}/dynamic-layers/rk-rauc-demo/*/*/*.bbappend \
+"
diff --git a/conf/machine/include/rockchip-wic.inc b/conf/machine/include/rockchip-wic.inc
index dab61d83ed2c..9e3b62f2a99b 100644
--- a/conf/machine/include/rockchip-wic.inc
+++ b/conf/machine/include/rockchip-wic.inc
@@ -1,11 +1,14 @@ 
 # common meta-rockchip wic/wks items
 
+inherit rk-rauc-demo
+
 require conf/machine/include/rockchip-extlinux.inc
 require conf/machine/include/rockchip-rk-u-boot-env.inc
 
 SPL_BINARY ?= "idbloader.img"
 
-IMAGE_FSTYPES += "wic wic.bmap"
+IMAGE_FSTYPES ?= "wic wic.bmap"
+IMAGE_FSTYPES:append:rk-rauc-demo = " ext4"
 WKS_FILE ?= "rockchip.wks"
 WKS_FILE_DEPENDS ?= " \
 	e2fsprogs-native \
diff --git a/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/boot.cmd.in b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/boot.cmd.in
new file mode 100644
index 000000000000..0887d2b5b812
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/boot.cmd.in
@@ -0,0 +1,51 @@ 
+echo "devtype: ${devtype}"
+echo "devnum: ${devnum}"
+echo "distro_bootpart: ${distro_bootpart}"
+
+test -n "${BOOT_ORDER}" || env set BOOT_ORDER "A B"
+test -n "${BOOT_A_LEFT}" || env set BOOT_A_LEFT 3
+test -n "${BOOT_B_LEFT}" || env set BOOT_B_LEFT 3
+test -n "${RAUC_BOOTDEV}" || env set RAUC_BOOTDEV "${devtype} ${devnum}:${distro_bootpart}"
+
+env set RAUC_BOOTPART
+env set RAUC_SLOT
+
+echo "BOOT_ORDER: ${BOOT_ORDER}"
+for RAUC_BOOTSLOT in "${BOOT_ORDER}"; do
+  if test "x${RAUC_BOOTPART}" != "x"; then
+    # skip remaining slots
+  elif test "x${RAUC_BOOTSLOT}" = "xA"; then
+    if test ${BOOT_A_LEFT} -gt 0; then
+      echo "using RAUC slot A"
+      setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
+      env set RAUC_BOOTPART "PARTLABEL=rootfsA"
+      env set RAUC_SLOT "A"
+      env set RAUC_BOOTDEV "${devtype} ${devnum}:${distro_bootpart}"
+      echo "RAUC_BOOTDEV: ${RAUC_BOOTDEV}"
+    fi
+  elif test "x${RAUC_BOOTSLOT}" = "xB"; then
+    if test ${BOOT_B_LEFT} -gt 0; then
+      echo "using RAUC slot B"
+      setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
+      env set RAUC_BOOTPART "PARTLABEL=rootfsB"
+      env set RAUC_SLOT "B"
+      setexpr BOOTPART1 ${distro_bootpart} + 1
+      env set RAUC_BOOTDEV "${devtype} ${devnum}:${BOOTPART1}"
+      echo "RAUC_BOOTDEV: ${RAUC_BOOTDEV}"
+    fi
+  fi
+done
+
+if test -n "${RAUC_BOOTPART}"; then
+  env set bootargs "${bootargsbase} root=${RAUC_BOOTPART} rauc.slot=${RAUC_SLOT}"
+  env save
+else
+  echo "No valid RAUC slot found. Resetting tries to 3"
+  env set BOOT_A_LEFT 3
+  env set BOOT_B_LEFT 3
+  env save
+  reset
+fi
+
+ext4load ${RAUC_BOOTDEV} ${kernel_addr_r} @@KERNEL_BOOTFILE@@
+bootm ${kernel_addr_r}
diff --git a/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/uboot-rauc.cfg b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/uboot-rauc.cfg
new file mode 100644
index 000000000000..77b7164e0192
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/files/uboot-rauc.cfg
@@ -0,0 +1,8 @@ 
+CONFIG_CMD_BOOTDEV=y
+CONFIG_CMD_BOOTMETH=y
+CONFIG_CMD_SETEXPR=y
+CONFIG_CMD_SETEXPR_FMT=y
+CONFIG_BOOTSTD_DEFAULTS=n
+CONFIG_BOOTMETH_EXTLINUX=n
+CONFIG_BOOTMETH_EXTLINUX_PXE=n
+CONFIG_BOOTMETH_VBE=n
diff --git a/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/u-boot_%.bbappend b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/u-boot_%.bbappend
new file mode 100644
index 000000000000..f075cb9383aa
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-bsp/u-boot/u-boot_%.bbappend
@@ -0,0 +1,26 @@ 
+inherit rk-rauc-demo
+
+FILESEXTRAPATHS:prepend:rk-rauc-demo := "${THISDIR}/files:"
+
+DEPENDS:append:rk-rauc-demo = " u-boot-mkimage-native"
+SRC_URI:append:rk-rauc-demo = " \
+	file://uboot-rauc.cfg \
+	file://boot.cmd.in \
+	"
+
+do_compile:append:rk-rauc-demo() {
+	# create boot script
+	sed -e 's|@@KERNEL_BOOTFILE@@|${UBOOT_EXTLINUX_KERNEL_IMAGE}|' \
+	    "${WORKDIR}/boot.cmd.in" > "${WORKDIR}/boot.cmd"
+	mkimage -A ${UBOOT_ARCH} -T script -C none -n "Boot script" -d "${WORKDIR}/boot.cmd" ${WORKDIR}/boot.scr
+
+	# tweak environment
+	echo "bootmeths=script extlinux" >> ${B}/u-boot-initial-env
+	echo "bootargsbase=${UBOOT_EXTLINUX_KERNEL_ARGS} ${UBOOT_EXTLINUX_CONSOLE}" >> ${B}/u-boot-initial-env
+}
+
+do_install:append:rk-rauc-demo() {
+	install -d ${D}/boot
+	install -m 0644 ${WORKDIR}/boot.scr ${D}/boot
+}
+FILES:${PN}-extlinux += "/boot/boot.scr"
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/base-files/base-files_%.bbappend b/dynamic-layers/rk-rauc-demo/recipes-core/base-files/base-files_%.bbappend
new file mode 100644
index 000000000000..88df362b8b23
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/base-files/base-files_%.bbappend
@@ -0,0 +1,6 @@ 
+inherit rk-rauc-demo
+
+FILESEXTRAPATHS:prepend:rk-rauc-demo := "${THISDIR}/files:"
+
+# Add a mount point for a shared data partition
+dirs755 += "/data"
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/base-files/files/fstab b/dynamic-layers/rk-rauc-demo/recipes-core/base-files/files/fstab
new file mode 100644
index 000000000000..de25bb1e608b
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/base-files/files/fstab
@@ -0,0 +1,7 @@ 
+/dev/root            /                    auto       x-systemd.growfs                   1  1
+proc                 /proc                proc       defaults                           0  0
+devpts               /dev/pts             devpts     mode=0620,ptmxmode=0666,gid=5      0  0
+tmpfs                /run                 tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
+tmpfs                /var/volatile        tmpfs      defaults                           0  0
+
+LABEL=data  /data  ext4  defaults  0  0
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.cert.pem b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.cert.pem
new file mode 100644
index 000000000000..92e71125d22f
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.cert.pem
@@ -0,0 +1,80 @@ 
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 2 (0x2)
+        Signature Algorithm: sha256WithRSAEncryption
+        Issuer: O=Test Org, CN=Test Org rauc CA Development
+        Validity
+            Not Before: Jan  1 00:00:00 1970 GMT
+            Not After : Dec 31 23:59:59 9999 GMT
+        Subject: O=Test Org, CN=Test Org Development-1
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                RSA Public-Key: (2048 bit)
+                Modulus:
+                    00:ac:2b:0f:05:02:d0:bb:b0:47:05:36:71:3c:20:
+                    0e:a7:76:8d:75:c1:23:5e:6c:7a:2d:94:ff:3c:17:
+                    d8:0b:44:48:2a:82:03:92:c5:fd:33:76:0c:42:cf:
+                    4d:8a:c9:47:7f:af:52:7c:15:6c:3b:e7:60:d1:04:
+                    97:24:7b:07:1f:56:7d:6c:3f:31:e8:f9:36:7b:33:
+                    5b:cf:54:ea:37:98:a6:b1:9a:1d:da:96:a1:07:14:
+                    9c:15:80:4d:db:0c:03:86:ce:c7:3d:72:57:a2:da:
+                    a0:c0:8c:b2:9a:a0:6a:e5:b8:5f:52:d2:f6:27:ca:
+                    48:f4:e3:86:eb:be:24:93:6a:af:60:68:7f:09:3b:
+                    81:96:ce:85:0c:63:93:d8:fa:91:dc:50:2e:77:bb:
+                    bc:38:42:e9:86:d8:ac:33:dd:e6:d4:37:69:e3:01:
+                    8d:21:8f:a9:4a:7f:15:a5:aa:a9:be:fc:36:93:a4:
+                    10:0c:18:33:30:06:7f:1c:13:b3:a9:c6:57:d7:6b:
+                    96:45:15:e7:f5:8f:3d:48:e0:08:46:4f:7f:ef:14:
+                    77:95:25:25:9b:14:21:84:25:eb:37:0b:01:48:e6:
+                    f5:c1:8b:61:c6:cb:8c:6b:a7:d8:d2:f9:31:e3:80:
+                    3f:78:ea:6a:41:6c:5d:4d:83:a6:54:0d:5b:c2:0e:
+                    f6:ef
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Subject Key Identifier:
+                89:4C:FE:8A:60:4D:C9:6D:F7:A8:C0:04:49:7F:AA:05:92:29:17:FB
+            X509v3 Authority Key Identifier:
+                keyid:44:0C:AF:4A:74:B4:C7:65:02:B2:95:F1:91:7C:A3:CC:E6:3E:99:E8
+                DirName:/O=Test Org/CN=Test Org rauc CA Development
+                serial:01
+
+            X509v3 Basic Constraints:
+                CA:FALSE
+    Signature Algorithm: sha256WithRSAEncryption
+         2c:d2:30:68:f5:84:52:1e:cf:ed:0d:fc:e7:02:69:0b:3b:f6:
+         c3:77:00:12:1d:2d:d0:8f:49:9e:5c:f1:00:7b:1d:4f:d5:a9:
+         46:a5:df:54:90:50:b4:8f:8e:ba:4b:2d:82:74:eb:5b:a8:f5:
+         45:7b:77:73:b1:9b:32:93:15:c0:5c:02:2a:ed:b0:1e:bb:d8:
+         4e:41:17:20:af:04:46:21:20:7b:86:9f:32:ab:54:71:26:e8:
+         0b:75:12:9c:63:53:4f:54:db:a7:f9:b2:fa:e9:ee:4a:9d:80:
+         ba:ae:3f:eb:ef:10:11:2d:4f:5a:34:fb:8b:45:10:63:0b:f8:
+         af:f3:8b:24:21:2a:e0:0b:44:38:44:b5:9d:6e:8a:ff:1f:bf:
+         6e:44:21:22:ec:8a:8d:73:63:e5:df:1a:ec:2a:64:1f:97:f9:
+         5c:3a:25:7f:03:80:4c:db:99:5e:f9:7d:2b:f1:d0:97:4d:95:
+         6f:29:47:7b:3f:29:e3:96:25:b0:1c:f1:0b:8b:8b:ba:de:3b:
+         3f:40:2e:bd:31:68:ea:a9:8f:dc:c9:09:22:df:76:69:08:5d:
+         5d:a4:09:62:80:20:83:9e:bd:d4:a6:35:ee:97:50:66:39:62:
+         66:1b:2e:75:f2:6d:e7:06:ae:67:5f:4b:63:5c:52:e7:5d:dd:
+         c9:0c:86:2b
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADA6MREwDwYDVQQKDAhUZXN0
+IE9yZzElMCMGA1UEAwwcVGVzdCBPcmcgcmF1YyBDQSBEZXZlbG9wbWVudDAgFw03
+MDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowNDERMA8GA1UECgwIVGVzdCBP
+cmcxHzAdBgNVBAMMFlRlc3QgT3JnIERldmVsb3BtZW50LTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCsKw8FAtC7sEcFNnE8IA6ndo11wSNebHotlP88
+F9gLREgqggOSxf0zdgxCz02KyUd/r1J8FWw752DRBJckewcfVn1sPzHo+TZ7M1vP
+VOo3mKaxmh3alqEHFJwVgE3bDAOGzsc9clei2qDAjLKaoGrluF9S0vYnykj044br
+viSTaq9gaH8JO4GWzoUMY5PY+pHcUC53u7w4QumG2Kwz3ebUN2njAY0hj6lKfxWl
+qqm+/DaTpBAMGDMwBn8cE7OpxlfXa5ZFFef1jz1I4AhGT3/vFHeVJSWbFCGEJes3
+CwFI5vXBi2HGy4xrp9jS+THjgD946mpBbF1Ng6ZUDVvCDvbvAgMBAAGjgZEwgY4w
+HQYDVR0OBBYEFIlM/opgTclt96jABEl/qgWSKRf7MGIGA1UdIwRbMFmAFEQMr0p0
+tMdlArKV8ZF8o8zmPpnooT6kPDA6MREwDwYDVQQKDAhUZXN0IE9yZzElMCMGA1UE
+AwwcVGVzdCBPcmcgcmF1YyBDQSBEZXZlbG9wbWVudIIBATAJBgNVHRMEAjAAMA0G
+CSqGSIb3DQEBCwUAA4IBAQAs0jBo9YRSHs/tDfznAmkLO/bDdwASHS3Qj0meXPEA
+ex1P1alGpd9UkFC0j466Sy2CdOtbqPVFe3dzsZsykxXAXAIq7bAeu9hOQRcgrwRG
+ISB7hp8yq1RxJugLdRKcY1NPVNun+bL66e5KnYC6rj/r7xARLU9aNPuLRRBjC/iv
+84skISrgC0Q4RLWdbor/H79uRCEi7IqNc2Pl3xrsKmQfl/lcOiV/A4BM25le+X0r
+8dCXTZVvKUd7PynjliWwHPELi4u63js/QC69MWjqqY/cyQki33ZpCF1dpAligCCD
+nr3UpjXul1BmOWJmGy518m3nBq5nX0tjXFLnXd3JDIYr
+-----END CERTIFICATE-----
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.key.pem b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.key.pem
new file mode 100644
index 000000000000..80305f8291b1
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/files/development-1.key.pem
@@ -0,0 +1,28 @@ 
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCsKw8FAtC7sEcF
+NnE8IA6ndo11wSNebHotlP88F9gLREgqggOSxf0zdgxCz02KyUd/r1J8FWw752DR
+BJckewcfVn1sPzHo+TZ7M1vPVOo3mKaxmh3alqEHFJwVgE3bDAOGzsc9clei2qDA
+jLKaoGrluF9S0vYnykj044brviSTaq9gaH8JO4GWzoUMY5PY+pHcUC53u7w4QumG
+2Kwz3ebUN2njAY0hj6lKfxWlqqm+/DaTpBAMGDMwBn8cE7OpxlfXa5ZFFef1jz1I
+4AhGT3/vFHeVJSWbFCGEJes3CwFI5vXBi2HGy4xrp9jS+THjgD946mpBbF1Ng6ZU
+DVvCDvbvAgMBAAECggEASphBYq9sltVyf/ytpRpSnxYLhmiPFXs0mIlE6Nl/3qnQ
+BrLcL3yfDuvntg6xjx9UXistNtvlUDMYzJcLkV/InzhPEVZ0HnfTth9zeOpWrI30
+M2EN7EZ1MGcqlVpI4U5cPM1cn+/proLBQYv0WnCEwFFY477JrkXDxG7MZ1mz6TaL
+IGcCCIUu1BxECngQ344eaKrSR5F2MtlxAl19Pt5QSPfmuMdmElrK6RtBjnKrDu1K
+fe6DCfObZ3nbG2fhFV4uTxhlTC9lUmfTQMKR79rLmHNKnbMx74kFNvy3XlT2l35I
+ZVfRMLPWph7yMom9v/Im3Q70uhJ1lxyqbbl/DFZVmQKBgQDVo19SqR/QeDIxPIPn
+XvVWzo5ml3KO/dVxA8sok6twr+G7yUeIUnuauYFA/tX/FS32azFRa/7GjUfoTx3q
+GHK43TBCMyEt0we6WwZb+FkWa/b/RBoyD/audrpmgDDi1+fXPs8bBvoO8/oju20D
+I6wOjSovcIMaeLo/+u3U6ShNQwKBgQDOTpoGMsQzXchZfDmxL61h3j4Gtjrl4BpU
+WhAkJ9U2BRpL8NSZLErn5ik8MwgK2ut+YdU7aogI0D6Gc+4zZoJDEbhhmPD9cprv
+LMyfAKoisR01OyU57mMSGQq0dfjmK6PfYJdX5sQJGkMFptNAJLTDoYtmXItSICoY
+1j5KTvwe5QKBgGytxmErjfakHoxzh3pdERuOylwgMPPS5xCt6FyE+pLBtmisFQqh
+QyXLtpgUy1IPOSmBED6mXJ4u4uSn0sTymPG3+8PBdOB12RmREqQYq2E/nQ/wWg8b
+ldbcqShZkATl5pfV6M+L9gtDS/1/bA5LyExCvbISX29I+R5xDSnhTlI3AoGBAJRK
+VVXtOa/+UhtYOpPMxGCbgZQLemxvWB2XmxCR/SRWKJ+7XOU4vCLSAoO93qMG1szB
+/6Y0ndFP9hFo1SfnH+ybmR+18ksLDKisV+xWavSCwI7Zk5l/a4C/tT0fqyeu6JyQ
+bliFjBVK5i/yyNfLSo9v16ZdENuYOQofPSjmezytAoGBALhwvtzgqvqGSXID2w5N
+ullK8ny3WRa1o5DLXuMV19CvknmrN/zmmjQLblKkdp9VBb7uo8czon+qL1ZZyywC
+W2BmHfGMPUyQHux4btsdJhlWcS7z7aYXM9QWiKlI+EKLHLILYk+LPIEf85sUcOZV
+eCBpViT7fv2iv/0L+mzjWtLA
+-----END PRIVATE KEY-----
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/rockchip-rauc-bundle.bb b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/rockchip-rauc-bundle.bb
new file mode 100644
index 000000000000..23eac4d3c4f5
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc-bundles/rockchip-rauc-bundle.bb
@@ -0,0 +1,14 @@ 
+DESCRIPTION = "Rockchip RAUC bundle generator"
+
+inherit bundle
+
+RAUC_BUNDLE_COMPATIBLE = "${MACHINE}"
+RAUC_BUNDLE_VERSION = "v20240512"
+RAUC_BUNDLE_DESCRIPTION = "RAUC Demo Bundle"
+RAUC_BUNDLE_FORMAT = "verity"
+RAUC_BUNDLE_SLOTS = "rootfs"
+RAUC_SLOT_rootfs = "core-image-base"
+RAUC_SLOT_rootfs[fstype] = "ext4"
+
+RAUC_KEY_FILE = "${THISDIR}/files/development-1.key.pem"
+RAUC_CERT_FILE = "${THISDIR}/files/development-1.cert.pem"
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/ca.cert.pem b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/ca.cert.pem
new file mode 100644
index 000000000000..46944a99df22
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/ca.cert.pem
@@ -0,0 +1,80 @@ 
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+        Signature Algorithm: sha256WithRSAEncryption
+        Issuer: O=Test Org, CN=Test Org rauc CA Development
+        Validity
+            Not Before: Jan  1 00:00:00 1970 GMT
+            Not After : Dec 31 23:59:59 9999 GMT
+        Subject: O=Test Org, CN=Test Org rauc CA Development
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                RSA Public-Key: (2048 bit)
+                Modulus:
+                    00:c0:fe:7b:6c:c3:e3:47:cc:d4:15:e1:0c:b2:1c:
+                    c9:f7:61:3e:42:d7:f1:a4:30:f2:db:0e:49:95:49:
+                    70:ee:97:6d:fe:48:5d:b9:22:63:47:e0:be:63:d7:
+                    68:9b:38:04:7d:7f:d9:65:ef:1d:6c:26:cb:05:7f:
+                    59:45:15:9d:76:59:c4:8d:59:a0:38:a0:25:fa:86:
+                    1b:f4:85:ff:cf:7c:c7:57:a3:7e:56:71:7d:69:c3:
+                    69:a7:fb:e6:8e:bc:f9:49:e2:f5:9a:97:e5:2d:75:
+                    ef:f9:76:29:5f:76:11:1b:70:6f:4d:26:4f:e0:06:
+                    9b:8c:e3:76:91:81:4a:4e:98:5d:2e:f4:bd:23:4d:
+                    e7:5d:9b:ea:68:4d:03:9e:35:90:c5:f2:8d:ae:ed:
+                    44:4f:f3:50:dc:2b:ef:ae:44:35:79:78:3d:65:4b:
+                    d9:16:98:aa:be:08:47:25:af:68:1c:0b:8e:c1:aa:
+                    02:a7:61:4f:4d:15:1b:07:3c:4e:60:b3:9a:d5:c1:
+                    39:34:4e:8e:e7:93:46:f1:75:95:aa:16:9a:1d:e6:
+                    49:15:a5:ae:06:8a:45:16:a9:af:59:60:9b:c6:6d:
+                    3d:19:57:5d:de:31:d5:dc:96:0e:a4:25:fe:7a:07:
+                    71:c5:40:c0:a3:d0:d5:84:47:14:7a:5a:f1:07:75:
+                    79:35
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Subject Key Identifier:
+                44:0C:AF:4A:74:B4:C7:65:02:B2:95:F1:91:7C:A3:CC:E6:3E:99:E8
+            X509v3 Authority Key Identifier:
+                keyid:44:0C:AF:4A:74:B4:C7:65:02:B2:95:F1:91:7C:A3:CC:E6:3E:99:E8
+                DirName:/O=Test Org/CN=Test Org rauc CA Development
+                serial:01
+
+            X509v3 Basic Constraints:
+                CA:TRUE
+    Signature Algorithm: sha256WithRSAEncryption
+         30:07:51:4d:d6:2c:0c:2f:3e:6c:5c:34:1f:07:21:8d:50:77:
+         9a:a6:81:75:62:f0:fe:ff:3b:5b:d0:7c:d1:45:e7:e2:67:d4:
+         23:cb:af:9a:8b:f4:2b:d2:33:3d:45:bb:a7:7d:b4:9b:41:db:
+         fb:62:ac:83:fc:41:ae:e5:dc:2d:df:7d:72:7e:df:34:01:60:
+         94:7f:15:78:84:87:f0:23:e4:8e:b8:dc:71:cb:84:4b:25:bb:
+         62:8f:fd:7f:d3:3c:1d:85:45:fb:03:7c:a2:bc:c4:a8:fa:2b:
+         ec:79:67:8d:f4:5f:37:a8:5a:54:bc:b3:78:11:0b:8b:29:90:
+         8b:48:4a:d7:87:93:96:97:72:10:1d:70:29:f8:e4:c3:81:6d:
+         7d:c3:6e:d4:c8:1b:0b:0d:f9:c0:b9:7b:11:54:e2:af:8b:a0:
+         45:de:c2:67:81:8c:0c:9d:ba:a1:31:8b:f2:cc:da:c7:cc:6d:
+         21:92:2a:57:29:9c:48:92:75:d9:1a:6e:d3:ee:53:66:83:2e:
+         08:74:09:5d:78:13:99:34:7d:16:8c:ba:29:75:80:20:8b:ca:
+         91:19:29:64:ef:64:37:de:5b:22:18:99:5b:63:69:9a:a2:44:
+         21:70:30:41:f2:58:27:ab:4f:5c:d0:e1:94:5d:d1:5b:8d:fd:
+         bf:8f:a9:99
+-----BEGIN CERTIFICATE-----
+MIIDhjCCAm6gAwIBAgIBATANBgkqhkiG9w0BAQsFADA6MREwDwYDVQQKDAhUZXN0
+IE9yZzElMCMGA1UEAwwcVGVzdCBPcmcgcmF1YyBDQSBEZXZlbG9wbWVudDAgFw03
+MDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowOjERMA8GA1UECgwIVGVzdCBP
+cmcxJTAjBgNVBAMMHFRlc3QgT3JnIHJhdWMgQ0EgRGV2ZWxvcG1lbnQwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA/ntsw+NHzNQV4QyyHMn3YT5C1/Gk
+MPLbDkmVSXDul23+SF25ImNH4L5j12ibOAR9f9ll7x1sJssFf1lFFZ12WcSNWaA4
+oCX6hhv0hf/PfMdXo35WcX1pw2mn++aOvPlJ4vWal+Utde/5dilfdhEbcG9NJk/g
+BpuM43aRgUpOmF0u9L0jTeddm+poTQOeNZDF8o2u7URP81DcK++uRDV5eD1lS9kW
+mKq+CEclr2gcC47BqgKnYU9NFRsHPE5gs5rVwTk0To7nk0bxdZWqFpod5kkVpa4G
+ikUWqa9ZYJvGbT0ZV13eMdXclg6kJf56B3HFQMCj0NWERxR6WvEHdXk1AgMBAAGj
+gZQwgZEwHQYDVR0OBBYEFEQMr0p0tMdlArKV8ZF8o8zmPpnoMGIGA1UdIwRbMFmA
+FEQMr0p0tMdlArKV8ZF8o8zmPpnooT6kPDA6MREwDwYDVQQKDAhUZXN0IE9yZzEl
+MCMGA1UEAwwcVGVzdCBPcmcgcmF1YyBDQSBEZXZlbG9wbWVudIIBATAMBgNVHRME
+BTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAwB1FN1iwMLz5sXDQfByGNUHeapoF1
+YvD+/ztb0HzRRefiZ9Qjy6+ai/Qr0jM9RbunfbSbQdv7YqyD/EGu5dwt331yft80
+AWCUfxV4hIfwI+SOuNxxy4RLJbtij/1/0zwdhUX7A3yivMSo+ivseWeN9F83qFpU
+vLN4EQuLKZCLSErXh5OWl3IQHXAp+OTDgW19w27UyBsLDfnAuXsRVOKvi6BF3sJn
+gYwMnbqhMYvyzNrHzG0hkipXKZxIknXZGm7T7lNmgy4IdAldeBOZNH0WjLopdYAg
+i8qRGSlk72Q33lsiGJlbY2maokQhcDBB8lgnq09c0OGUXdFbjf2/j6mZ
+-----END CERTIFICATE-----
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/system.conf.in b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/system.conf.in
new file mode 100644
index 000000000000..4945c67345c4
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/files/system.conf.in
@@ -0,0 +1,17 @@ 
+[system]
+compatible=@MACHINE@
+bootloader=uboot
+data-directory=/data/
+
+[keyring]
+path=/etc/rauc/ca.cert.pem
+
+[slot.rootfs.0]
+device=/dev/disk/by-partlabel/rootfsA
+type=ext4
+bootname=A
+
+[slot.rootfs.1]
+device=/dev/disk/by-partlabel/rootfsB
+type=ext4
+bootname=B
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/rauc/rauc-conf%.bbappend b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/rauc-conf%.bbappend
new file mode 100644
index 000000000000..b65e9be2afaf
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/rauc/rauc-conf%.bbappend
@@ -0,0 +1,12 @@ 
+inherit rk-rauc-demo
+
+FILESEXTRAPATHS:prepend:rk-rauc-demo := "${THISDIR}/files:"
+SRC_URI:append:rk-rauc-demo := "  \
+	file://system.conf.in \
+	file://ca.cert.pem \
+	"
+
+do_install:append:rk-rauc-demo() {
+	install -d ${D}${sysconfdir}/rauc
+	sed -e 's!@MACHINE@!${MACHINE}!g' ${WORKDIR}/system.conf.in > ${D}${sysconfdir}/rauc/system.conf
+}
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/25-rootfsA.conf b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/25-rootfsA.conf
new file mode 100644
index 000000000000..dba01e1ff863
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/25-rootfsA.conf
@@ -0,0 +1,4 @@ 
+[Partition]
+Type=root
+Weight=250
+SizeMaxBytes=5G
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/35-rootfsB.conf b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/35-rootfsB.conf
new file mode 100644
index 000000000000..31a7c06c17ff
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/35-rootfsB.conf
@@ -0,0 +1,7 @@ 
+[Partition]
+Type=root
+Label=rootfsB
+Weight=250
+SizeMaxBytes=5G
+Format=ext4
+GrowFileSystem=yes
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/45-data.conf b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/45-data.conf
new file mode 100644
index 000000000000..1aac59addc26
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/45-data.conf
@@ -0,0 +1,6 @@ 
+[Partition]
+Type=root-secondary
+Label=data
+Weight=500
+Format=ext4
+GrowFileSystem=yes
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/systemd_%.bbappend b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/systemd_%.bbappend
new file mode 100644
index 000000000000..2b9da514749e
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/systemd_%.bbappend
@@ -0,0 +1,20 @@ 
+inherit rk-rauc-demo
+
+FILESEXTRAPATHS:prepend:rk-rauc-demo := "${THISDIR}/files:"
+
+SRC_URI:append:rk-rauc-demo = " \
+	file://25-rootfsA.conf \
+	file://35-rootfsB.conf \
+	file://45-data.conf \
+	"
+
+PACKAGECONFIG:append:rk-rauc-demo = " repart openssl"
+
+do_install:append:rk-rauc-demo() {
+	install -d ${D}${sysconfdir}/repart.d/
+	install -m 0644 ${WORKDIR}/25-rootfsA.conf ${D}${sysconfdir}/repart.d/
+	install -m 0644 ${WORKDIR}/35-rootfsB.conf ${D}${sysconfdir}/repart.d/
+	install -m 0644 ${WORKDIR}/45-data.conf ${D}${sysconfdir}/repart.d/
+}
+
+FILES:${PN}:append:rk-rauc-demo = " ${sysconfdir}/repart.d/"