From 441164c575ad7b1f066902e18727ad50aea3d2af Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 20 Sep 2023 10:43:34 +0200 Subject: [PATCH 001/118] dey-examples: connectcore-demo: restart service on suspend If the system is send to suspend mode, the bluetooth core is reconfigured. Therefore, restart the service if it is running, to configure the ble service. https://onedigi.atlassian.net/browse/DEL-8694 Signed-off-by: Isaac Hermida --- .../dey-examples/connectcore-demo-example.inc | 8 +++++++- .../suspendtarget-connectcore-demo-server.service | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example/suspendtarget-connectcore-demo-server.service diff --git a/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.inc b/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.inc index 9fbf094b6..707d26ae8 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.inc +++ b/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.inc @@ -11,6 +11,7 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0-only;md5=801f80980d171d SRC_URI += " \ file://connectcore-demo-server-init \ file://connectcore-demo-server.service \ + file://suspendtarget-connectcore-demo-server.service \ " RDEPENDS:${PN}-server = " \ @@ -41,6 +42,7 @@ do_install() { # Install systemd unit files install -d ${D}${systemd_unitdir}/system install -m 0644 ${WORKDIR}/connectcore-demo-server.service ${D}${systemd_unitdir}/system/ + install -m 0644 ${WORKDIR}/suspendtarget-connectcore-demo-server.service ${D}${systemd_unitdir}/system/ fi # Install connectcore-demo-server-init @@ -72,6 +74,7 @@ FILES:${PN}-multimedia += " \ FILES:${PN}-server = " \ /srv/www/demoserver.py \ ${systemd_unitdir}/system/connectcore-demo-server.service \ + ${systemd_unitdir}/system/suspendtarget-connectcore-demo-server.service \ ${sysconfdir}/connectcore-demo-server \ ${sysconfdir}/init.d/connectcore-demo-server \ " @@ -88,6 +91,9 @@ INITSCRIPT_NAME:${PN}-server = "connectcore-demo-server" INITSCRIPT_PARAMS:${PN}-server = "start 20 2 3 4 5 . stop 21 0 1 6 ." SYSTEMD_PACKAGES = "${PN}-server" -SYSTEMD_SERVICE:${PN}-server = "connectcore-demo-server.service" +SYSTEMD_SERVICE:${PN}-server = " \ + connectcore-demo-server.service \ + suspendtarget-connectcore-demo-server.service \ +" PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example/suspendtarget-connectcore-demo-server.service b/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example/suspendtarget-connectcore-demo-server.service new file mode 100644 index 000000000..390537974 --- /dev/null +++ b/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example/suspendtarget-connectcore-demo-server.service @@ -0,0 +1,11 @@ +[Unit] +Description=Restart ConnectCore demo server after suspend if running +After=suspend.target + +[Service] +Type=simple +# try-restart: only restart if it is running +ExecStart=/bin/systemctl --no-block try-restart connectcore-demo-server + +[Install] +WantedBy=suspend.target From d7692af7a43b9a03402b832cffccc6dc506792b0 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 18 Sep 2023 13:42:20 +0200 Subject: [PATCH 002/118] trustfence-cst: merge paches, no functional change Merge the patches for the PKI tree generation scripts, to ease maintenance (still keeping two separate patches for HAB4/AHAB). Signed-off-by: Javier Viguera --- .../trustfence-cst/trustfence-cst-3.3.1.inc | 11 +- ...lper-use-dev-urandom-as-seed-source.patch} | 0 ...b4_pki_tree.sh-adapt-script-for-DEY.patch} | 100 +++++++++++------- ...ab_pki_tree.sh-adapt-script-for-DEY.patch} | 92 ++++++++++------ ...-usa-a-random-password-for-the-defau.patch | 28 ----- ...mk-weaken-specific-function-err_msg.patch} | 3 +- ...-use-a-random-password-for-the-defau.patch | 28 ----- ...xtract-public-keys-from-certificates.patch | 42 -------- 8 files changed, 127 insertions(+), 177 deletions(-) rename meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/{0003-openssl_helper-use-dev-urandom-as-seed-source.patch => 0002-openssl_helper-use-dev-urandom-as-seed-source.patch} (100%) rename meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/{0002-hab4_pki_tree.sh-automate-script.patch => 0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch} (79%) rename meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/{0005-ahab_pki_tree.sh-automate-script.patch => 0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch} (76%) delete mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-hab4_pki_tree.sh-usa-a-random-password-for-the-defau.patch rename meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/{0007-rules.mk-weaken-specific-function-err_msg.patch => 0005-rules.mk-weaken-specific-function-err_msg.patch} (90%) delete mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0006-ahab_pki_tree.sh-use-a-random-password-for-the-defau.patch delete mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0008-pki_tree.sh-extract-public-keys-from-certificates.patch diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.1.inc b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.1.inc index cf5dda093..593a5f127 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.1.inc +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.1.inc @@ -15,13 +15,10 @@ SRC_URI = " \ ${DIGI_PKG_SRC}/cst-${PV}.tgz;name=cst \ https://www.openssl.org/source/openssl-${OPENSSL1_VERSION}.tar.gz;name=openssl \ file://0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch \ - file://0002-hab4_pki_tree.sh-automate-script.patch \ - file://0003-openssl_helper-use-dev-urandom-as-seed-source.patch \ - file://0004-hab4_pki_tree.sh-usa-a-random-password-for-the-defau.patch \ - file://0005-ahab_pki_tree.sh-automate-script.patch \ - file://0006-ahab_pki_tree.sh-use-a-random-password-for-the-defau.patch \ - file://0007-rules.mk-weaken-specific-function-err_msg.patch \ - file://0008-pki_tree.sh-extract-public-keys-from-certificates.patch \ + file://0002-openssl_helper-use-dev-urandom-as-seed-source.patch \ + file://0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch \ + file://0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch \ + file://0005-rules.mk-weaken-specific-function-err_msg.patch \ " SRC_URI[cst.md5sum] = "27ba9c8bc0b8a7f14d23185775c53794" diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0003-openssl_helper-use-dev-urandom-as-seed-source.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0002-openssl_helper-use-dev-urandom-as-seed-source.patch similarity index 100% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0003-openssl_helper-use-dev-urandom-as-seed-source.patch rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0002-openssl_helper-use-dev-urandom-as-seed-source.patch diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0002-hab4_pki_tree.sh-automate-script.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch similarity index 79% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0002-hab4_pki_tree.sh-automate-script.patch rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch index b28303ae0..408bc1cd7 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0002-hab4_pki_tree.sh-automate-script.patch +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch @@ -1,23 +1,31 @@ From: Arturo Buzarra Date: Wed, 22 Jul 2020 14:37:03 +0200 -Subject: [PATCH] hab4_pki_tree.sh: automate script +Subject: [PATCH] hab4_pki_tree.sh: adapt script for DEY -This commit introduce a new command line argument to specify the -CSF path folder and prepare it to automate the build process. +* support non interactive execution: introduce a new command line + argument to specify the CSF path folder and prepare it to automate the + build process. +* use a random password for the default PKI generation + +* extract public keys from certificates: the public key needs to be + available on the rootfs so that signed SWU packages can be authenticated. + +Co-Authored-By: Hector Palacios +Co-Authored-By: Diaz de Grenu, Jose Signed-off-by: Arturo Buzarra --- - keys/hab4_pki_tree.sh | 78 ++++++++++++++++++++++++++++--------------- - 1 file changed, 51 insertions(+), 27 deletions(-) + keys/hab4_pki_tree.sh | 88 ++++++++++++++++++++++++++++--------------- + 1 file changed, 58 insertions(+), 30 deletions(-) diff --git a/keys/hab4_pki_tree.sh b/keys/hab4_pki_tree.sh -index 944cc66..39ed3bf 100755 +index 944cc66..e76f22f 100755 --- a/keys/hab4_pki_tree.sh +++ b/keys/hab4_pki_tree.sh @@ -66,6 +66,8 @@ printf " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" - + stty erase  - + +SCRIPT_BASEDIR="$(cd $(dirname ${0}) && pwd)" + if [ $# -gt 0 ]; then @@ -35,13 +43,13 @@ index 944cc66..39ed3bf 100755 @@ -89,10 +91,18 @@ usage() echo } - + -max_param=16 -min_param=12 +max_param=18 +min_param=1 num_param=1 - + +# Default values +existing_ca="n" +use_ecc="n" @@ -80,7 +88,7 @@ index 944cc66..39ed3bf 100755 @@ -242,6 +256,16 @@ then read duration fi - + +# CSF folder structure +if [ ! -d "${CSF_PATH}" ]; then + echo "Invalid CSF_PATH: ${CSF_PATH}" @@ -93,7 +101,7 @@ index 944cc66..39ed3bf 100755 + # Compute validity period val_period=$((duration*365)) - + @@ -275,9 +299,9 @@ then script_name=$0 fi @@ -104,13 +112,13 @@ index 944cc66..39ed3bf 100755 +keys_dir=${CSF_PATH}/keys/ +crts_dir=${CSF_PATH}/crts/ +ca_dir=${CSF_PATH}/ca/ - + if [ ! -d "${keys_dir}" ] then @@ -291,11 +315,11 @@ then exit 1 fi - + -if [ ! -d "${ca_dir}" ] -then - echo ERROR: "Openssl configuration directory ${ca_dir} is missing. Expecting /ca directory to hold openssl configuration files." @@ -121,28 +129,42 @@ index 944cc66..39ed3bf 100755 +# echo ERROR: "Openssl configuration directory ${ca_dir} is missing. Expecting /ca directory to hold openssl configuration files." +# exit 1 +# fi - + # Switch current working directory to keys directory, if needed. if [ "${crt_dir}" != "${keys_dir}" ] -@@ -365,7 +389,7 @@ then +@@ -318,9 +342,10 @@ fi + # Check that the file "key_pass.txt" is present, if not create it with default user/pwd: + if [ ! -f key_pass.txt ] + then +- echo "test" > key_pass.txt +- echo "test" >> key_pass.txt +- echo "A default file 'key_pass.txt' was created with password = test!" ++ password="$(openssl rand -base64 32)" ++ echo "${password}" > key_pass.txt ++ echo "${password}" >> key_pass.txt ++ echo "A file 'key_pass.txt' was created with a random password!" + fi + + # The following is required otherwise OpenSSL complains +@@ -365,7 +390,7 @@ then -x509 -extensions v3_ca \ -keyout temp_ca.pem \ -out ${ca_cert}.pem \ - -days ${val_period} -config ../ca/openssl.cnf + -days ${val_period} -config "${SCRIPT_BASEDIR}/openssl.cnf" - + # Generate CA key in PKCS #8 format - both PEM and DER openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ -@@ -382,7 +406,7 @@ then +@@ -382,7 +407,7 @@ then openssl x509 -inform PEM -outform DER -in ${ca_cert}.pem -out ${ca_cert}.der - + # Cleanup - \rm temp_ca.pem + rm temp_ca.pem fi - - -@@ -432,10 +456,10 @@ then + + +@@ -432,10 +457,10 @@ then -in ./temp_srk_req.pem \ -cert ${ca_cert}.pem \ -keyfile ${ca_key}.pem \ @@ -152,19 +174,19 @@ index 944cc66..39ed3bf 100755 -days ${val_period} \ - -config ../ca/openssl.cnf + -config "${SCRIPT_BASEDIR}/openssl.cnf" - + # Convert SRK Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -456,7 +480,7 @@ then +@@ -456,7 +481,7 @@ then -out ${srk_key}.pem - + # Cleanup - \rm ./temp_srk.pem ./temp_srk_req.pem + rm ./temp_srk.pem ./temp_srk_req.pem i=$((i+1)) done else -@@ -505,10 +529,10 @@ do +@@ -505,10 +530,10 @@ do -in ./temp_srk_req.pem \ -cert ${ca_cert}.pem \ -keyfile ${ca_key}.pem \ @@ -174,10 +196,10 @@ index 944cc66..39ed3bf 100755 -days ${val_period} \ - -config ../ca/openssl.cnf + -config "${SCRIPT_BASEDIR}/openssl.cnf" - + # Convert SRK Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -574,10 +598,10 @@ do +@@ -574,10 +599,10 @@ do -in ./temp_csf_req.pem \ -cert ${srk_crt_i} \ -keyfile ${srk_key_i} \ @@ -187,19 +209,19 @@ index 944cc66..39ed3bf 100755 -days ${val_period} \ - -config ../ca/openssl.cnf + -config "${SCRIPT_BASEDIR}/openssl.cnf" - + # Convert CSF Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -596,7 +620,7 @@ do +@@ -596,7 +621,7 @@ do -out ${csf_key}.pem - + # Cleanup - \rm ./temp_csf.pem ./temp_csf_req.pem + rm ./temp_csf.pem ./temp_csf_req.pem - + echo echo ++++++++++++++++++++++++++++++++++++++++ -@@ -636,10 +660,10 @@ do +@@ -636,10 +661,10 @@ do -in ./temp_img_req.pem \ -cert ${srk_crt_i} \ -keyfile ${srk_key_i} \ @@ -209,15 +231,19 @@ index 944cc66..39ed3bf 100755 -days ${val_period} \ - -config ../ca/openssl.cnf + -config "${SCRIPT_BASEDIR}/openssl.cnf" - + # Convert IMG Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -658,7 +682,7 @@ do +@@ -657,8 +682,11 @@ do + -in temp_img.pem \ -out ${img_key}.pem - + ++ # Extract public key from the certificate ++ openssl x509 -pubkey -noout -in "${img_crt}.pem" > ../crts/key${i}.pub ++ # Cleanup - \rm ./temp_img.pem ./temp_img_req.pem + rm ./temp_img.pem ./temp_img_req.pem - + i=$((i+1)) done diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-ahab_pki_tree.sh-automate-script.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch similarity index 76% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-ahab_pki_tree.sh-automate-script.patch rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch index e5e60aff1..55bcd3d77 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-ahab_pki_tree.sh-automate-script.patch +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch @@ -1,23 +1,31 @@ From: Arturo Buzarra Date: Wed, 22 Jul 2020 15:10:21 +0200 -Subject: [PATCH] ahab_pki_tree.sh: automate script +Subject: [PATCH] ahab_pki_tree.sh: adapt script for DEY -This commit introduce a new command line argument to specify the -CSF path folder and prepare it to automate the build process. +* support non interactive execution: introduce a new command line + argument to specify the CSF path folder and prepare it to automate the + build process. +* use a random password for the default PKI generation + +* extract public keys from certificates: the public key needs to be + available on the rootfs so that signed SWU packages can be authenticated. + +Co-Authored-By: Hector Palacios +Co-Authored-By: Mike Engel Signed-off-by: Arturo Buzarra --- - keys/ahab_pki_tree.sh | 70 +++++++++++++++++++++++++++++-------------- - 1 file changed, 47 insertions(+), 23 deletions(-) + keys/ahab_pki_tree.sh | 80 +++++++++++++++++++++++++++++-------------- + 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/keys/ahab_pki_tree.sh b/keys/ahab_pki_tree.sh -index f5ab36c..2c16533 100755 +index f5ab36c..13843f9 100755 --- a/keys/ahab_pki_tree.sh +++ b/keys/ahab_pki_tree.sh @@ -64,6 +64,8 @@ printf " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" - + stty erase  - + +SCRIPT_BASEDIR="$(cd $(dirname ${0}) && pwd)" + if [ $# -gt 0 ]; then @@ -35,13 +43,13 @@ index f5ab36c..2c16533 100755 @@ -88,10 +90,18 @@ usage() echo } - + -max_param=16 -min_param=12 +max_param=18 +min_param=1 num_param=1 - + +# Default values +existing_ca="n" +use_ecc="y" @@ -80,7 +88,7 @@ index f5ab36c..2c16533 100755 @@ -255,6 +269,16 @@ then read duration fi - + +# CSF folder structure +if [ ! -d "${CSF_PATH}" ]; then + echo "Invalid CSF_PATH: ${CSF_PATH}" @@ -93,7 +101,7 @@ index f5ab36c..2c16533 100755 + # Compute validity period val_period=$((duration*365)) - + @@ -286,9 +310,9 @@ then script_name=$0 fi @@ -104,13 +112,13 @@ index f5ab36c..2c16533 100755 +keys_dir=${CSF_PATH}/keys/ +crts_dir=${CSF_PATH}/crts/ +ca_dir=${CSF_PATH}/ca/ - + if [ ! -d "${keys_dir}" ] then @@ -302,11 +326,11 @@ then exit 1 fi - + -if [ ! -d "${ca_dir}" ] -then - echo ERROR: "Openssl configuration directory ${ca_dir} is missing. Expecting /ca directory to hold openssl configuration files." @@ -121,37 +129,51 @@ index f5ab36c..2c16533 100755 +# echo ERROR: "Openssl configuration directory ${ca_dir} is missing. Expecting /ca directory to hold openssl configuration files." +# exit 1 +# fi - + # Switch current working directory to keys directory, if needed. if [ "${crt_dir}" != "${keys_dir}" ] -@@ -377,7 +401,7 @@ then +@@ -329,9 +353,10 @@ fi + # Check that the file "key_pass.txt" is present, if not create it with default user/pwd: + if [ ! -f key_pass.txt ] + then +- echo "test" > key_pass.txt +- echo "test" >> key_pass.txt +- echo "A default file 'key_pass.txt' was created with password = test!" ++ password="$(openssl rand -base64 32)" ++ echo "${password}" > key_pass.txt ++ echo "${password}" >> key_pass.txt ++ echo "A file 'key_pass.txt' was created with a random password!" + fi + + # The following is required otherwise OpenSSL complains +@@ -377,7 +402,7 @@ then -x509 -extensions v3_ca \ -keyout temp_ca.pem \ -out ${ca_cert}.pem \ - -days ${val_period} -config ../ca/openssl.cnf + -days ${val_period} -config "${SCRIPT_BASEDIR}/openssl.cnf" - + # Generate CA key in PKCS #8 format - both PEM and DER openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ -@@ -394,7 +418,7 @@ then +@@ -394,7 +419,7 @@ then openssl x509 -inform PEM -outform DER -in ${ca_cert}.pem -out ${ca_cert}.der - + # Cleanup - \rm temp_ca.pem + rm temp_ca.pem fi - - -@@ -468,7 +492,7 @@ then + + +@@ -468,7 +493,7 @@ then -out ${srk_key}.pem - + # Cleanup - \rm ./temp_srk.pem ./temp_srk_req.pem + rm ./temp_srk.pem ./temp_srk_req.pem i=$((i+1)) done else -@@ -517,10 +541,10 @@ do +@@ -517,10 +542,10 @@ do -in ./temp_srk_req.pem \ -cert ${ca_cert}.pem \ -keyfile ${ca_key}.pem \ @@ -161,19 +183,19 @@ index f5ab36c..2c16533 100755 -days ${val_period} \ - -config ../ca/openssl.cnf + -config "${SCRIPT_BASEDIR}/openssl.cnf" - + # Convert SRK Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -541,7 +565,7 @@ do +@@ -541,7 +566,7 @@ do -out ${srk_key}.pem - + # Cleanup - \rm ./temp_srk.pem ./temp_srk_req.pem + rm ./temp_srk.pem ./temp_srk_req.pem - + echo echo ++++++++++++++++++++++++++++++++++++++++ -@@ -586,10 +610,10 @@ do +@@ -586,10 +611,10 @@ do -in ./temp_sgk_req.pem \ -cert ${srk_crt_i} \ -keyfile ${srk_key_i} \ @@ -183,15 +205,19 @@ index f5ab36c..2c16533 100755 -days ${val_period} \ - -config ../ca/openssl.cnf + -config "${SCRIPT_BASEDIR}/openssl.cnf" - + # Convert SGK Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -608,7 +632,7 @@ do +@@ -607,8 +632,11 @@ do + -in temp_sgk.pem \ -out ${sgk_key}.pem - + ++ # Extract public key from the certificate ++ openssl x509 -pubkey -noout -in "${srk_crt_i}" > ../crts/key${i}.pub ++ # Cleanup - \rm ./temp_sgk.pem ./temp_sgk_req.pem + rm ./temp_sgk.pem ./temp_sgk_req.pem - + i=$((i+1)) done diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-hab4_pki_tree.sh-usa-a-random-password-for-the-defau.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-hab4_pki_tree.sh-usa-a-random-password-for-the-defau.patch deleted file mode 100644 index cafd77ef6..000000000 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-hab4_pki_tree.sh-usa-a-random-password-for-the-defau.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: "Diaz de Grenu, Jose" -Date: Fri, 29 Jul 2016 17:20:28 +0200 -Subject: [PATCH] hab4_pki_tree.sh: usa a random password for the default PKI - generation - -Signed-off-by: Diaz de Grenu, Jose ---- - keys/hab4_pki_tree.sh | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/keys/hab4_pki_tree.sh b/keys/hab4_pki_tree.sh -index 39ed3bf..ac6fb29 100755 ---- a/keys/hab4_pki_tree.sh -+++ b/keys/hab4_pki_tree.sh -@@ -342,9 +342,10 @@ fi - # Check that the file "key_pass.txt" is present, if not create it with default user/pwd: - if [ ! -f key_pass.txt ] - then -- echo "test" > key_pass.txt -- echo "test" >> key_pass.txt -- echo "A default file 'key_pass.txt' was created with password = test!" -+ password="$(openssl rand -base64 32)" -+ echo "${password}" > key_pass.txt -+ echo "${password}" >> key_pass.txt -+ echo "A file 'key_pass.txt' was created with a random password!" - fi - - # The following is required otherwise OpenSSL complains diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0007-rules.mk-weaken-specific-function-err_msg.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-rules.mk-weaken-specific-function-err_msg.patch similarity index 90% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0007-rules.mk-weaken-specific-function-err_msg.patch rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-rules.mk-weaken-specific-function-err_msg.patch index 03049e35b..1ba99780d 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0007-rules.mk-weaken-specific-function-err_msg.patch +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-rules.mk-weaken-specific-function-err_msg.patch @@ -1,4 +1,3 @@ -From fe51b132c7c07de5a63c3dfc5a16bc9fc7816f7e Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Mon, 30 Jan 2023 10:38:22 +0100 Subject: [PATCH] rules.mk: weaken specific function err_msg() @@ -19,7 +18,7 @@ https://onedigi.atlassian.net/browse/DEL-8033 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/cst/code/build/make/rules.mk b/code/cst/code/build/make/rules.mk -index 1c0842bd070e..032e18bc5134 100755 +index 1c0842b..032e18b 100755 --- a/code/cst/code/build/make/rules.mk +++ b/code/cst/code/build/make/rules.mk @@ -27,7 +27,7 @@ LFLAGS := -t diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0006-ahab_pki_tree.sh-use-a-random-password-for-the-defau.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0006-ahab_pki_tree.sh-use-a-random-password-for-the-defau.patch deleted file mode 100644 index 1c715b10f..000000000 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0006-ahab_pki_tree.sh-use-a-random-password-for-the-defau.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Mike Engel -Date: Fri, 24 Jan 2020 17:47:56 +0100 -Subject: [PATCH] ahab_pki_tree.sh: use a random password for the default PKI - generation - -Signed-off-by: Mike Engel ---- - keys/ahab_pki_tree.sh | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/keys/ahab_pki_tree.sh b/keys/ahab_pki_tree.sh -index 2c16533..b85b00d 100755 ---- a/keys/ahab_pki_tree.sh -+++ b/keys/ahab_pki_tree.sh -@@ -353,9 +353,10 @@ fi - # Check that the file "key_pass.txt" is present, if not create it with default user/pwd: - if [ ! -f key_pass.txt ] - then -- echo "test" > key_pass.txt -- echo "test" >> key_pass.txt -- echo "A default file 'key_pass.txt' was created with password = test!" -+ password="$(openssl rand -base64 32)" -+ echo "${password}" > key_pass.txt -+ echo "${password}" >> key_pass.txt -+ echo "A file 'key_pass.txt' was created with a random password!" - fi - - # The following is required otherwise OpenSSL complains diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0008-pki_tree.sh-extract-public-keys-from-certificates.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0008-pki_tree.sh-extract-public-keys-from-certificates.patch deleted file mode 100644 index dcaa24120..000000000 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0008-pki_tree.sh-extract-public-keys-from-certificates.patch +++ /dev/null @@ -1,42 +0,0 @@ -From: Hector Palacios -Date: Thu, 3 Aug 2023 16:25:36 +0200 -Subject: [PATCH] pki_tree.sh: extract public keys from certificates - -The public key needs to be available on the rootfs so that signed SWU -packages can be authenticated. -Do this on the PKI generation script so that recipes don't need to do it. - -Signed-off-by: Hector Palacios ---- - keys/ahab_pki_tree.sh | 3 +++ - keys/hab4_pki_tree.sh | 3 +++ - 2 files changed, 6 insertions(+) - -diff --git a/keys/ahab_pki_tree.sh b/keys/ahab_pki_tree.sh -index 7f10c5388146..63b5ce58ade7 100755 ---- a/keys/ahab_pki_tree.sh -+++ b/keys/ahab_pki_tree.sh -@@ -632,6 +632,9 @@ do - -in temp_sgk.pem \ - -out ${sgk_key}.pem - -+ # Extract public key from the certificate -+ openssl x509 -pubkey -noout -in "${srk_crt_i}" > ../crts/key${i}.pub -+ - # Cleanup - rm ./temp_sgk.pem ./temp_sgk_req.pem - -diff --git a/keys/hab4_pki_tree.sh b/keys/hab4_pki_tree.sh -index ac6fb29b7f91..e76f22f40643 100755 ---- a/keys/hab4_pki_tree.sh -+++ b/keys/hab4_pki_tree.sh -@@ -682,6 +682,9 @@ do - -in temp_img.pem \ - -out ${img_key}.pem - -+ # Extract public key from the certificate -+ openssl x509 -pubkey -noout -in "${img_crt}.pem" > ../crts/key${i}.pub -+ - # Cleanup - rm ./temp_img.pem ./temp_img_req.pem - From b4df14280514875770794eef5c21bfbe56a72d76 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 12 Sep 2023 18:00:28 +0200 Subject: [PATCH 003/118] trustfence-cst: upgrade to version 3.3.2 This version supports i.MX8ULP and i.MX9x devices. NOTICE: changed the "srk_ca" parameter in ahab_pki_tree.sh from "yes" to "no". This script is shared between cc8x and ccimx93. The imx93 does not support that option at the moment (generation of subordinate SGK certs) and for the cc8x we were generating them but never used them to sign the artifacts. Signed-off-by: Javier Viguera --- ...1.bb => nativesdk-trustfence-cst_3.3.2.bb} | 0 ...cst-3.3.1.inc => trustfence-cst-3.3.2.inc} | 15 ++-- ...crypted_data-reuse-existing-DEK-file.patch | 12 +-- ...elper-use-dev-urandom-as-seed-source.patch | 4 +- ...ab4_pki_tree.sh-adapt-script-for-DEY.patch | 77 +++++----------- ...hab_pki_tree.sh-adapt-script-for-DEY.patch | 90 +++++++++---------- ....3.1.bb => trustfence-cst-native_3.3.2.bb} | 0 ....mk-weaken-specific-function-err_msg.patch | 32 ------- 8 files changed, 81 insertions(+), 149 deletions(-) rename meta-digi-arm/recipes-bsp/trustfence-cst/{nativesdk-trustfence-cst_3.3.1.bb => nativesdk-trustfence-cst_3.3.2.bb} (100%) rename meta-digi-arm/recipes-bsp/trustfence-cst/{trustfence-cst-3.3.1.inc => trustfence-cst-3.3.2.inc} (78%) rename meta-digi-arm/recipes-bsp/trustfence-cst/{trustfence-cst => trustfence-cst-3.3.2}/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch (66%) rename meta-digi-arm/recipes-bsp/trustfence-cst/{trustfence-cst => trustfence-cst-3.3.2}/0002-openssl_helper-use-dev-urandom-as-seed-source.patch (90%) rename meta-digi-arm/recipes-bsp/trustfence-cst/{trustfence-cst => trustfence-cst-3.3.2}/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch (79%) rename meta-digi-arm/recipes-bsp/trustfence-cst/{trustfence-cst => trustfence-cst-3.3.2}/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch (74%) rename meta-digi-arm/recipes-bsp/trustfence-cst/{trustfence-cst-native_3.3.1.bb => trustfence-cst-native_3.3.2.bb} (100%) delete mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-rules.mk-weaken-specific-function-err_msg.patch diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/nativesdk-trustfence-cst_3.3.1.bb b/meta-digi-arm/recipes-bsp/trustfence-cst/nativesdk-trustfence-cst_3.3.2.bb similarity index 100% rename from meta-digi-arm/recipes-bsp/trustfence-cst/nativesdk-trustfence-cst_3.3.1.bb rename to meta-digi-arm/recipes-bsp/trustfence-cst/nativesdk-trustfence-cst_3.3.2.bb diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.1.inc b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2.inc similarity index 78% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.1.inc rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2.inc index 593a5f127..5406f6215 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.1.inc +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2.inc @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2022 Digi International +# Copyright (C) 2017-2023 Digi International SUMMARY = "NXP Code signing Tool for the High Assurance Boot library" DESCRIPTION = "Provides software code signing support designed for use with \ @@ -9,7 +9,7 @@ LIC_FILES_CHKSUM = "file://LICENSE.bsd3;md5=1fbcd66ae51447aa94da10cbf6271530" DEPENDS = "byacc-native flex-native" -OPENSSL1_VERSION = "1.1.1s" +OPENSSL1_VERSION = "1.1.1t" SRC_URI = " \ ${DIGI_PKG_SRC}/cst-${PV}.tgz;name=cst \ @@ -18,20 +18,19 @@ SRC_URI = " \ file://0002-openssl_helper-use-dev-urandom-as-seed-source.patch \ file://0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch \ file://0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch \ - file://0005-rules.mk-weaken-specific-function-err_msg.patch \ " -SRC_URI[cst.md5sum] = "27ba9c8bc0b8a7f14d23185775c53794" -SRC_URI[cst.sha256sum] = "8b7e44e3e126f814f5caf8a634646fe64021405302ca59ff02f5c8f3b9a5abb9" -SRC_URI[openssl.md5sum] = "077f69d357758c7d6ef686f813e16f30" -SRC_URI[openssl.sha256sum] = "c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" +SRC_URI[cst.md5sum] = "4b9fccac381fa412cba8ba7028c154c7" +SRC_URI[cst.sha256sum] = "517b11dca181e8c438a6249f56f0a13a0eb251b30e690760be3bf6191ee06c68" +SRC_URI[openssl.md5sum] = "1cfee919e0eac6be62c88c5ae8bcd91e" +SRC_URI[openssl.sha256sum] = "8dee9b24bdb1dcbf0c3d1e9b02fb8f6bf22165e807f45adeb7c9677536859d3b" S = "${WORKDIR}/cst-${PV}" do_compile() { cd code/cst oe_runmake OPENSSL_PATH=${WORKDIR}/openssl-${OPENSSL1_VERSION} OSTYPE=linux64 openssl - oe_runmake OPENSSL_PATH=${WORKDIR}/openssl-${OPENSSL1_VERSION} OSTYPE=linux64 rel_bin + oe_runmake OPENSSL_PATH=${WORKDIR}/openssl-${OPENSSL1_VERSION} OSTYPE=linux64 os_bin } do_install() { diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch similarity index 66% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch index 709cae579..887f79e83 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch @@ -12,14 +12,14 @@ https://jira.digi.com/browse/DUB-608 Signed-off-by: Diaz de Grenu, Jose --- - code/cst/code/back_end/src/adapt_layer_openssl.c | 1 + + code/cst/code/back_end-ssl/src/adapt_layer_openssl.c | 1 + 1 file changed, 1 insertion(+) -diff --git a/code/cst/code/back_end/src/adapt_layer_openssl.c b/code/cst/code/back_end/src/adapt_layer_openssl.c -index 38b8bf5..f389e23 100755 ---- a/code/cst/code/back_end/src/adapt_layer_openssl.c -+++ b/code/cst/code/back_end/src/adapt_layer_openssl.c -@@ -1146,6 +1146,7 @@ int32_t gen_auth_encrypted_data(const char* in_file, +diff --git a/code/cst/code/back_end-ssl/src/adapt_layer_openssl.c b/code/cst/code/back_end-ssl/src/adapt_layer_openssl.c +index d8df54e..86e7e4f 100755 +--- a/code/cst/code/back_end-ssl/src/adapt_layer_openssl.c ++++ b/code/cst/code/back_end-ssl/src/adapt_layer_openssl.c +@@ -1231,6 +1231,7 @@ int32_t gen_auth_encrypted_data(const char* in_file, printf("\n"); #endif if (0 == key_init_done) { diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0002-openssl_helper-use-dev-urandom-as-seed-source.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0002-openssl_helper-use-dev-urandom-as-seed-source.patch similarity index 90% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0002-openssl_helper-use-dev-urandom-as-seed-source.patch rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0002-openssl_helper-use-dev-urandom-as-seed-source.patch index 4aa674105..9035f62cb 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0002-openssl_helper-use-dev-urandom-as-seed-source.patch +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0002-openssl_helper-use-dev-urandom-as-seed-source.patch @@ -10,10 +10,10 @@ Signed-off-by: Diaz de Grenu, Jose 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/cst/code/common/src/openssl_helper.c b/code/cst/code/common/src/openssl_helper.c -index 871cf55..b62c8a8 100755 +index 1e1131b..918c82e 100755 --- a/code/cst/code/common/src/openssl_helper.c +++ b/code/cst/code/common/src/openssl_helper.c -@@ -414,7 +414,7 @@ void print_version(void) +@@ -404,7 +404,7 @@ void print_version(void) ---------------------------*/ uint32_t seed_prng(uint32_t bytes) { diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch similarity index 79% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch index 408bc1cd7..78bde2d42 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0003-hab4_pki_tree.sh-adapt-script-for-DEY.patch @@ -11,15 +11,16 @@ Subject: [PATCH] hab4_pki_tree.sh: adapt script for DEY * extract public keys from certificates: the public key needs to be available on the rootfs so that signed SWU packages can be authenticated. +Co-Authored-By: Javier Viguera Co-Authored-By: Hector Palacios Co-Authored-By: Diaz de Grenu, Jose Signed-off-by: Arturo Buzarra --- - keys/hab4_pki_tree.sh | 88 ++++++++++++++++++++++++++++--------------- - 1 file changed, 58 insertions(+), 30 deletions(-) + keys/hab4_pki_tree.sh | 80 +++++++++++++++++++++++++++++-------------- + 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/keys/hab4_pki_tree.sh b/keys/hab4_pki_tree.sh -index 944cc66..e76f22f 100755 +index 49834f0..de0c969 100755 --- a/keys/hab4_pki_tree.sh +++ b/keys/hab4_pki_tree.sh @@ -66,6 +66,8 @@ printf " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" @@ -35,12 +36,12 @@ index 944cc66..e76f22f 100755 echo "$0" echo echo "Command Line Mode:" -- echo "$0 -existing-ca [-ca-key -ca-cert ] -use-ecc -kl -duration -num-srk <1-4> -srk-ca " -+ echo "$0 [-csf-path] -existing-ca [-ca-key -ca-cert ] -use-ecc -kl -duration -num-srk <1-4> -srk-ca " - echo "Options:" - echo " -kl: -use-ecc = y then Supported key lengths: p256, p384, p521" - echo " : -use-ecc = n then Supported key lengths: 1024, 2048, 3072, 4096" -@@ -89,10 +91,18 @@ usage() +- echo "$0 -existing-ca [-ca-key -ca-cert ] -kt < rsa/rsa-pss/ecc> -kl -duration -num-srk <1-4> -srk-ca " ++ echo "$0 [-csf-path] -existing-ca [-ca-key -ca-cert ] -kt < rsa/rsa-pss/ecc> -kl -duration -num-srk <1-4> -srk-ca " + echo " Key Type Options:" + echo " -kl ecc : then Supported key lengths: p256, p384, p521" + echo " -kl rsa : then Supported key lengths: 1024, 2048, 3072, 4096" +@@ -90,10 +92,18 @@ usage() echo } @@ -52,7 +53,7 @@ index 944cc66..e76f22f 100755 +# Default values +existing_ca="n" -+use_ecc="n" ++kt="rsa" +kl=4096 +duration=10 +num_srk=4 @@ -61,7 +62,7 @@ index 944cc66..e76f22f 100755 if [ $interactive = "n" ] then # Validate command line parameters -@@ -111,6 +121,11 @@ then +@@ -112,6 +122,11 @@ then while [ $num_param -le $max_param ] && [ "$1" != "" ] do case $1 in @@ -73,7 +74,7 @@ index 944cc66..e76f22f 100755 -existing-ca) shift existing_ca=$1 -@@ -164,9 +179,8 @@ then +@@ -165,9 +180,8 @@ then shift ;; *) @@ -85,7 +86,7 @@ index 944cc66..e76f22f 100755 ;; esac num_param=$(( num_param + 2 )) -@@ -242,6 +256,16 @@ then +@@ -261,6 +275,16 @@ then read duration fi @@ -102,7 +103,7 @@ index 944cc66..e76f22f 100755 # Compute validity period val_period=$((duration*365)) -@@ -275,9 +299,9 @@ then +@@ -294,9 +318,9 @@ then script_name=$0 fi script_path=$(cd $(dirname "${script_name}") && pwd -P) @@ -115,7 +116,7 @@ index 944cc66..e76f22f 100755 if [ ! -d "${keys_dir}" ] then -@@ -291,11 +315,11 @@ then +@@ -310,11 +334,11 @@ then exit 1 fi @@ -132,7 +133,7 @@ index 944cc66..e76f22f 100755 # Switch current working directory to keys directory, if needed. if [ "${crt_dir}" != "${keys_dir}" ] -@@ -318,9 +342,10 @@ fi +@@ -337,9 +361,10 @@ fi # Check that the file "key_pass.txt" is present, if not create it with default user/pwd: if [ ! -f key_pass.txt ] then @@ -146,7 +147,7 @@ index 944cc66..e76f22f 100755 fi # The following is required otherwise OpenSSL complains -@@ -365,7 +390,7 @@ then +@@ -384,7 +409,7 @@ then -x509 -extensions v3_ca \ -keyout temp_ca.pem \ -out ${ca_cert}.pem \ @@ -155,16 +156,7 @@ index 944cc66..e76f22f 100755 # Generate CA key in PKCS #8 format - both PEM and DER openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ -@@ -382,7 +407,7 @@ then - openssl x509 -inform PEM -outform DER -in ${ca_cert}.pem -out ${ca_cert}.der - - # Cleanup -- \rm temp_ca.pem -+ rm temp_ca.pem - fi - - -@@ -432,10 +457,10 @@ then +@@ -452,10 +477,10 @@ then -in ./temp_srk_req.pem \ -cert ${ca_cert}.pem \ -keyfile ${ca_key}.pem \ @@ -177,16 +169,7 @@ index 944cc66..e76f22f 100755 # Convert SRK Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -456,7 +481,7 @@ then - -out ${srk_key}.pem - - # Cleanup -- \rm ./temp_srk.pem ./temp_srk_req.pem -+ rm ./temp_srk.pem ./temp_srk_req.pem - i=$((i+1)) - done - else -@@ -505,10 +530,10 @@ do +@@ -526,10 +551,10 @@ do -in ./temp_srk_req.pem \ -cert ${ca_cert}.pem \ -keyfile ${ca_key}.pem \ @@ -199,7 +182,7 @@ index 944cc66..e76f22f 100755 # Convert SRK Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -574,10 +599,10 @@ do +@@ -596,10 +621,10 @@ do -in ./temp_csf_req.pem \ -cert ${srk_crt_i} \ -keyfile ${srk_key_i} \ @@ -212,16 +195,7 @@ index 944cc66..e76f22f 100755 # Convert CSF Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -596,7 +621,7 @@ do - -out ${csf_key}.pem - - # Cleanup -- \rm ./temp_csf.pem ./temp_csf_req.pem -+ rm ./temp_csf.pem ./temp_csf_req.pem - - echo - echo ++++++++++++++++++++++++++++++++++++++++ -@@ -636,10 +661,10 @@ do +@@ -659,10 +684,10 @@ do -in ./temp_img_req.pem \ -cert ${srk_crt_i} \ -keyfile ${srk_key_i} \ @@ -234,7 +208,7 @@ index 944cc66..e76f22f 100755 # Convert IMG Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -657,8 +682,11 @@ do +@@ -680,6 +705,9 @@ do -in temp_img.pem \ -out ${img_key}.pem @@ -242,8 +216,5 @@ index 944cc66..e76f22f 100755 + openssl x509 -pubkey -noout -in "${img_crt}.pem" > ../crts/key${i}.pub + # Cleanup -- \rm ./temp_img.pem ./temp_img_req.pem -+ rm ./temp_img.pem ./temp_img_req.pem + \rm ./temp_img.pem ./temp_img_req.pem - i=$((i+1)) - done diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch similarity index 74% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch index 55bcd3d77..11387df9d 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.3.2/0004-ahab_pki_tree.sh-adapt-script-for-DEY.patch @@ -11,15 +11,16 @@ Subject: [PATCH] ahab_pki_tree.sh: adapt script for DEY * extract public keys from certificates: the public key needs to be available on the rootfs so that signed SWU packages can be authenticated. +Co-Authored-By: Javier Viguera Co-Authored-By: Hector Palacios Co-Authored-By: Mike Engel Signed-off-by: Arturo Buzarra --- - keys/ahab_pki_tree.sh | 80 +++++++++++++++++++++++++++++-------------- - 1 file changed, 54 insertions(+), 26 deletions(-) + keys/ahab_pki_tree.sh | 79 ++++++++++++++++++++++++++++++------------- + 1 file changed, 55 insertions(+), 24 deletions(-) diff --git a/keys/ahab_pki_tree.sh b/keys/ahab_pki_tree.sh -index f5ab36c..13843f9 100755 +index 0327f83..5c986b2 100755 --- a/keys/ahab_pki_tree.sh +++ b/keys/ahab_pki_tree.sh @@ -64,6 +64,8 @@ printf " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" @@ -35,12 +36,12 @@ index f5ab36c..13843f9 100755 echo "$0" echo echo "Command Line Mode:" -- echo "$0 -existing-ca [-ca-key -ca-cert ] -use-ecc -kl -da -duration -srk-ca " -+ echo "$0 [-csf-path] -existing-ca [-ca-key -ca-cert ] -use-ecc -kl -da -duration -srk-ca " +- echo "$0 -existing-ca [-ca-key -ca-cert ] -kt -kl -da -duration -srk-ca " ++ echo "$0 [-csf-path] -existing-ca [-ca-key -ca-cert ] -kt -kl -da -duration -srk-ca " echo "Options:" - echo " -kl: -use-ecc = y then Supported key lengths: p256, p384, p521" - echo " : -use-ecc = n then Supported key lengths: 2048, 3072, 4096" -@@ -88,10 +90,18 @@ usage() + echo " -kt ecc : then Supported key lengths: p256, p384, p521" + echo " -kt rsa : then Supported key lengths: 2048, 3072, 4096" +@@ -89,10 +91,18 @@ usage() echo } @@ -52,16 +53,16 @@ index f5ab36c..13843f9 100755 +# Default values +existing_ca="n" -+use_ecc="y" ++kt="ecc" +kl=p521 +da=sha512 +duration=10 -+srk_ca="y" ++srk_ca="n" + if [ $interactive = "n" ] then # Validate command line parameters -@@ -110,6 +120,11 @@ then +@@ -111,6 +121,11 @@ then while [ $num_param -le $max_param ] && [ "$1" != "" ] do case $1 in @@ -73,7 +74,7 @@ index f5ab36c..13843f9 100755 -existing-ca) shift existing_ca=$1 -@@ -163,9 +178,8 @@ then +@@ -164,9 +179,8 @@ then shift ;; *) @@ -85,7 +86,7 @@ index f5ab36c..13843f9 100755 ;; esac num_param=$(( num_param + 2 )) -@@ -255,6 +269,16 @@ then +@@ -274,6 +288,16 @@ then read duration fi @@ -102,7 +103,7 @@ index f5ab36c..13843f9 100755 # Compute validity period val_period=$((duration*365)) -@@ -286,9 +310,9 @@ then +@@ -305,9 +329,9 @@ then script_name=$0 fi script_path=$(cd $(dirname "${script_name}") && pwd -P) @@ -115,14 +116,14 @@ index f5ab36c..13843f9 100755 if [ ! -d "${keys_dir}" ] then -@@ -302,11 +326,11 @@ then - exit 1 +@@ -321,11 +345,11 @@ then + exit 1 fi -if [ ! -d "${ca_dir}" ] -then - echo ERROR: "Openssl configuration directory ${ca_dir} is missing. Expecting /ca directory to hold openssl configuration files." -- exit 1 +- exit 1 -fi +# if [ ! -d "${ca_dir}" ] +# then @@ -132,7 +133,7 @@ index f5ab36c..13843f9 100755 # Switch current working directory to keys directory, if needed. if [ "${crt_dir}" != "${keys_dir}" ] -@@ -329,9 +353,10 @@ fi +@@ -348,9 +372,10 @@ fi # Check that the file "key_pass.txt" is present, if not create it with default user/pwd: if [ ! -f key_pass.txt ] then @@ -146,7 +147,7 @@ index f5ab36c..13843f9 100755 fi # The following is required otherwise OpenSSL complains -@@ -377,7 +402,7 @@ then +@@ -396,7 +421,7 @@ then -x509 -extensions v3_ca \ -keyout temp_ca.pem \ -out ${ca_cert}.pem \ @@ -155,25 +156,30 @@ index f5ab36c..13843f9 100755 # Generate CA key in PKCS #8 format - both PEM and DER openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ -@@ -394,7 +419,7 @@ then - openssl x509 -inform PEM -outform DER -in ${ca_cert}.pem -out ${ca_cert}.der +@@ -464,10 +489,10 @@ then + -in ./temp_srk_req.pem \ + -cert ${ca_cert}.pem \ + -keyfile ${ca_key}.pem \ +- -extfile ../ca/v3_usr.cnf \ ++ -extfile "${SCRIPT_BASEDIR}/v3_usr.cnf" \ + -out ${srk_crt}.pem \ + -days ${val_period} \ +- -config ../ca/openssl.cnf ++ -config "${SCRIPT_BASEDIR}/openssl.cnf" - # Cleanup -- \rm temp_ca.pem -+ rm temp_ca.pem - fi - - -@@ -468,7 +493,7 @@ then + # Convert SRK Certificate to DER format + openssl x509 -inform PEM -outform DER \ +@@ -487,6 +512,9 @@ then + -in temp_srk.pem \ -out ${srk_key}.pem ++ # Extract public key from the certificate ++ openssl x509 -pubkey -noout -in "${srk_crt}.pem" > ../crts/key${i}.pub ++ # Cleanup -- \rm ./temp_srk.pem ./temp_srk_req.pem -+ rm ./temp_srk.pem ./temp_srk_req.pem + \rm ./temp_srk.pem ./temp_srk_req.pem i=$((i+1)) - done - else -@@ -517,10 +542,10 @@ do +@@ -539,10 +567,10 @@ do -in ./temp_srk_req.pem \ -cert ${ca_cert}.pem \ -keyfile ${ca_key}.pem \ @@ -186,16 +192,7 @@ index f5ab36c..13843f9 100755 # Convert SRK Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -541,7 +566,7 @@ do - -out ${srk_key}.pem - - # Cleanup -- \rm ./temp_srk.pem ./temp_srk_req.pem -+ rm ./temp_srk.pem ./temp_srk_req.pem - - echo - echo ++++++++++++++++++++++++++++++++++++++++ -@@ -586,10 +611,10 @@ do +@@ -609,10 +637,10 @@ do -in ./temp_sgk_req.pem \ -cert ${srk_crt_i} \ -keyfile ${srk_key_i} \ @@ -208,7 +205,7 @@ index f5ab36c..13843f9 100755 # Convert SGK Certificate to DER format openssl x509 -inform PEM -outform DER \ -@@ -607,8 +632,11 @@ do +@@ -630,6 +658,9 @@ do -in temp_sgk.pem \ -out ${sgk_key}.pem @@ -216,8 +213,5 @@ index f5ab36c..13843f9 100755 + openssl x509 -pubkey -noout -in "${srk_crt_i}" > ../crts/key${i}.pub + # Cleanup -- \rm ./temp_sgk.pem ./temp_sgk_req.pem -+ rm ./temp_sgk.pem ./temp_sgk_req.pem + \rm ./temp_sgk.pem ./temp_sgk_req.pem - i=$((i+1)) - done diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-native_3.3.1.bb b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-native_3.3.2.bb similarity index 100% rename from meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-native_3.3.1.bb rename to meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-native_3.3.2.bb diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-rules.mk-weaken-specific-function-err_msg.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-rules.mk-weaken-specific-function-err_msg.patch deleted file mode 100644 index 1ba99780d..000000000 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst/0005-rules.mk-weaken-specific-function-err_msg.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Hector Palacios -Date: Mon, 30 Jan 2023 10:38:22 +0100 -Subject: [PATCH] rules.mk: weaken specific function err_msg() - -A bug in binutils 2.38 objcopy '--weaken' produces malformed -binaries. -For the cst, it looks like it's enough to weaken function err_msg() -which is otherwise redefined. -Change the global '--weaken' flag with '--weaken-symbol err_msg' -to have the build process generate a valid 'cst' binary. - -Signed-off-by: Hector Palacios - -https://onedigi.atlassian.net/browse/DEL-8332 -https://onedigi.atlassian.net/browse/DEL-8033 ---- - code/cst/code/build/make/rules.mk | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/code/cst/code/build/make/rules.mk b/code/cst/code/build/make/rules.mk -index 1c0842b..032e18b 100755 ---- a/code/cst/code/build/make/rules.mk -+++ b/code/cst/code/build/make/rules.mk -@@ -27,7 +27,7 @@ LFLAGS := -t - $(AR) $(ARFLAGS) $@ $^ - ifneq ($(OSTYPE),mingw32) - ifneq ($(OSTYPE),osx) -- $(OBJCOPY) --weaken $@ -+ $(OBJCOPY) --weaken-symbol err_msg $@ - endif - endif - From 8f6660c0b0a4eb3ebc521efa19c3c6f085cfcf9d Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 12 Sep 2023 18:00:48 +0200 Subject: [PATCH 004/118] imx-boot: ccimx93: capture mkimage output into a log file mkimage output provides some information (basically image offsets) that cst (code signing tool) uses to sign imx-boot images. Signed-off-by: Javier Viguera --- ...ture-commands-output-into-a-log-file.patch | 45 +++++++++++++++++++ .../imx-mkimage/imx-boot_1.0.bbappend | 9 +++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch new file mode 100644 index 000000000..763f23979 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch @@ -0,0 +1,45 @@ +From: Javier Viguera +Date: Thu, 31 Aug 2023 16:33:13 +0200 +Subject: [PATCH] imx9: soc.mak: capture commands output into a log file + +This is later used to get the needed information for the signing of the +boot artifacts. + +Signed-off-by: Javier Viguera +--- + iMX9/soc.mak | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/iMX9/soc.mak b/iMX9/soc.mak +index 7c4086c153d0..7ec4bb5eaeb4 100644 +--- a/iMX9/soc.mak ++++ b/iMX9/soc.mak +@@ -1,4 +1,5 @@ + MKIMG = ../mkimage_imx8 ++MKIMAGE_LOG = "mkimage-$(firstword $(MAKECMDGOALS)).log" + + CC ?= gcc + REV ?= A0 +@@ -71,7 +72,7 @@ u-boot-atf-container.img: bl31.bin u-boot-hash.bin + fi; \ + else \ + ./$(MKIMG) -soc IMX9 -c -ap bl31.bin a35 $(ATF_LOAD_ADDR) -ap u-boot-hash.bin a35 $(UBOOT_LOAD_ADDR) -out u-boot-atf-container.img; \ +- fi ++ fi | tee $(MKIMAGE_LOG) + + .PHONY: clean nightly + clean: +@@ -80,11 +81,11 @@ clean: + @echo "imx8ulp clean done" + + flash_singleboot: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container.img +- ./$(MKIMG) -soc IMX9 -append $(AHAB_IMG) -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin ++ ./$(MKIMG) -soc IMX9 -append $(AHAB_IMG) -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin | tee -a $(MKIMAGE_LOG) + cp flash.bin boot-spl-container.img + @flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \ + pad_cnt=$$(((flashbin_size + 0x400 - 1) / 0x400)); \ +- echo "append u-boot-atf-container.img at $$pad_cnt KB"; \ ++ echo "append u-boot-atf-container.img at $$pad_cnt KB" | tee -a $(MKIMAGE_LOG); \ + dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt; + + flash_singleboot_flexspi: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container.img diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index 918a7310c..6ee026814 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -1,4 +1,4 @@ -# Copyright (C) 2022 Digi International +# Copyright (C) 2022,2023 Digi International FILESEXTRAPATHS:prepend := "${THISDIR}/files:" @@ -7,6 +7,10 @@ SRC_URI:append:ccimx8m = " \ file://0002-imx8m-soc.mak-capture-commands-output-into-a-log-fil.patch \ " +SRC_URI:append:ccimx93 = " \ + file://0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch \ +" + # Use NXP's lf-6.1.22-2.0.0 release for ccimx93 SRC_URI:ccimx93 = "git://github.com/nxp-imx/imx-mkimage.git;protocol=https;branch=${SRCBRANCH}" SRCBRANCH:ccimx93 = "lf-6.1.22_2.0.0" @@ -85,6 +89,9 @@ do_deploy:append:ccimx8m() { do_deploy:append:ccimx93() { generate_symlinks + for target in ${IMXBOOT_TARGETS}; do + install -m 0644 ${BOOT_STAGING}/mkimage-${target}.log ${DEPLOYDIR}/${BOOT_TOOLS} + done } do_deploy:ccimx8x () { From c014e211a4ffdd57e138237fcb5be6c391bb7d8d Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 13 Sep 2023 14:21:29 +0200 Subject: [PATCH 005/118] ccimx93-dvk: fix machine overrides order ARM64 generic overrides where in the middle of the chain with more precedence than IMX overrides. From: MACHINEOVERRIDES="imx-generic-bsp:imx-nxp-bsp:imxdrm:imxpxp:mx9-generic-bsp:mx9-nxp-bsp:mx93-generic-bsp:mx93-nxp-bsp:ccimx93:ccimx93:aarch64:armv8-2a:use-nxp-bsp:ccimx93-dvk" To: MACHINEOVERRIDES="aarch64:armv8-2a:use-nxp-bsp:imx-generic-bsp:imx-nxp-bsp:imxdrm:imxpxp:mx9-generic-bsp:mx9-nxp-bsp:mx93-generic-bsp:mx93-nxp-bsp:ccimx93:ccimx93:ccimx93-dvk" Signed-off-by: Javier Viguera --- meta-digi-arm/conf/machine/ccimx93-dvk.conf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccimx93-dvk.conf b/meta-digi-arm/conf/machine/ccimx93-dvk.conf index e8201cea0..9561c2653 100644 --- a/meta-digi-arm/conf/machine/ccimx93-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx93-dvk.conf @@ -3,12 +3,10 @@ #@DESCRIPTION: Machine configuration for Digi's ConnectCore 93 DVK DIGI_SOM = "ccimx93" +MACHINEOVERRIDES =. "mx93:${DIGI_FAMILY}:${DIGI_SOM}:" require include/ccimx93.inc -MACHINEOVERRIDES =. "${DIGI_FAMILY}:${DIGI_SOM}:" -MACHINEOVERRIDES =. "mx93:" - # U-Boot configurations UBOOT_CONFIG ??= "ccimx93-dvk" UBOOT_CONFIG[ccimx93-dvk] = "ccimx93-dvk_defconfig" From f1bdbe74c81ce32be39450fa0ec00e9793694917 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 14 Sep 2023 18:46:54 +0200 Subject: [PATCH 006/118] trustfence: decouple signing external artifacts Some platforms do not support signing external artifacts (kernel, dtb, etc.) yet, so we need to decouple the signing of the bootloader from the signing of the external artifacts. This commit generalizes the code, so instead of having platform exceptions scattered along the recipes, we create a new variable used conditionally to sign or not the external artifacts. Signed-off-by: Javier Viguera --- .../classes/image_types_digi.bbclass | 28 ++++++------------- .../recipes-bsp/u-boot/u-boot-dey.inc | 4 +-- .../recipes-kernel/linux/linux-trustfence.inc | 10 ++----- meta-digi-dey/classes/trustfence.bbclass | 16 ++++++++++- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/meta-digi-arm/classes/image_types_digi.bbclass b/meta-digi-arm/classes/image_types_digi.bbclass index ca0c6f60a..5cabc03cd 100644 --- a/meta-digi-arm/classes/image_types_digi.bbclass +++ b/meta-digi-arm/classes/image_types_digi.bbclass @@ -200,21 +200,13 @@ trustence_sign_cpio() { # Image generation code for image type 'cpio.gz.u-boot.tf' # (signed/encrypted ramdisk) # - if [ "${TRUSTFENCE_SIGN}" = "1" ]; then + if [ "${TRUSTFENCE_SIGN_ARTIFACTS}" = "1" ]; then # Set environment variables for trustfence configuration export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_DEK_PATH}" - # Sign/encrypt the ramdisk - if [ "${DEY_SOC_VENDOR}" = "NXP" ]; then - trustfence-sign-artifact.sh -p "${DIGI_SOM}" -i "${1}" "${1}.tf" - elif [ "${DEY_SOC_VENDOR}" = "STM" ]; then - # TODO: sign the ramdisk for ST platforms - - # (fall-back) Copy the image with no changes - cp "${1}" "${1}.tf" - fi + trustfence-sign-artifact.sh -p "${DIGI_SOM}" -i "${1}" "${1}.tf" else # Copy the image with no changes cp "${1}" "${1}.tf" @@ -228,22 +220,18 @@ IMAGE_TYPES += "cpio.gz.u-boot.tf" # # Sign read-only rootfs # -do_image_squashfs[postfuncs] += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'rootfs_sign', '', d)}" - +do_image_squashfs[postfuncs] += "${@oe.utils.vartrue('TRUSTFENCE_SIGN_ARTIFACTS', 'rootfs_sign', '', d)}" rootfs_sign() { # Set environment variables for trustfence configuration export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" [ -n "${CONFIG_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" - if [ "${DEY_SOC_VENDOR}" = "NXP" ]; then - ROOTFS_IMAGE="${IMGDEPLOYDIR}/${IMAGE_NAME}.rootfs.squashfs" - TMP_ROOTFS_IMAGE_SIGNED="$(mktemp ${ROOTFS_IMAGE}-signed.XXXXXX)" - # Sign rootfs read-only image - trustfence-sign-artifact.sh -p "${DIGI_SOM}" -r "${ROOTFS_IMAGE}" "${TMP_ROOTFS_IMAGE_SIGNED}" - mv "${TMP_ROOTFS_IMAGE_SIGNED}" "${ROOTFS_IMAGE}" - fi + ROOTFS_IMAGE="${IMGDEPLOYDIR}/${IMAGE_NAME}.rootfs.squashfs" + TMP_ROOTFS_IMAGE_SIGNED="$(mktemp ${ROOTFS_IMAGE}-signed.XXXXXX)" + # Sign rootfs read-only image + trustfence-sign-artifact.sh -p "${DIGI_SOM}" -r "${ROOTFS_IMAGE}" "${TMP_ROOTFS_IMAGE_SIGNED}" + mv "${TMP_ROOTFS_IMAGE_SIGNED}" "${ROOTFS_IMAGE}" } - rootfs_sign[dirs] = "${DEPLOY_DIR_IMAGE}" do_image_squashfs[vardeps] += "TRUSTFENCE_SIGN_KEYS_PATH TRUSTFENCE_KEY_INDEX" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc index 894da6074..81c1418ba 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc @@ -95,8 +95,8 @@ build_uboot_scripts() { mkimage -T script -n bootscript -C none -d ${TMP_BOOTSCR} ${DEPLOYDIR}/boot.scr rm -f ${TMP_BOOTSCR} - # Sign the scripts (TODO signing of artifacts for STM-based platforms) - if [ "${TRUSTFENCE_SIGN}" = "1" ] && [ "${DEY_SOC_VENDOR}" != "STM" ]; then + # Sign the boot script + if [ "${TRUSTFENCE_SIGN_ARTIFACTS}" = "1" ]; then export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_DEK_PATH}" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-trustfence.inc b/meta-digi-arm/recipes-kernel/linux/linux-trustfence.inc index 690e2cdf2..6d2b06ee3 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-trustfence.inc +++ b/meta-digi-arm/recipes-kernel/linux/linux-trustfence.inc @@ -1,13 +1,9 @@ -# Copyright (C) 2022 Digi International +# Copyright (C) 2022-2023 Digi International -DEPENDS += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'trustfence-sign-tools-native', '', d)}" - -do_deploy[postfuncs] += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'trustfence_sign', '', d)}" +DEPENDS += "${@oe.utils.vartrue('TRUSTFENCE_SIGN_ARTIFACTS', 'trustfence-sign-tools-native', '', d)}" +do_deploy[postfuncs] += "${@oe.utils.vartrue('TRUSTFENCE_SIGN_ARTIFACTS', 'trustfence_sign', '', d)}" trustfence_sign() { - # TODO: signing of artifacts for STM-based platforms - [ "${DEY_SOC_VENDOR}" = "STM" ] && return - # Set environment variables for trustfence configuration export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 35597ecd8..19f86bd2f 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -34,6 +34,15 @@ TRUSTFENCE_ENCRYPT_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-only- # Read-only rootfs TRUSTFENCE_READ_ONLY_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "1", "0", d)}" +# +# NOTHING TO CUSTOMIZE BELOW THIS LINE +# + +# TrustFence sign artifacts is not supported on all platforms +TRUSTFENCE_SIGN_ARTIFACTS = "1" +TRUSTFENCE_SIGN_ARTIFACTS:ccmp1 = "0" +TRUSTFENCE_SIGN_ARTIFACTS:ccimx93 = "0" + IMAGE_FEATURES += "dey-trustfence" # Function to generate a PKI tree (with lock dir protection) @@ -155,6 +164,8 @@ python () { d.setVar("TRUSTFENCE_PASSWORD_FILE", d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") + "/keys/key_pass.txt") d.appendVar("UBOOT_TF_CONF", "CONFIG_SIGN_IMAGE=y ") + if (d.getVar("TRUSTFENCE_SIGN_ARTIFACTS") == "1"): + d.appendVar("UBOOT_TF_CONF", "CONFIG_AUTH_ARTIFACTS=y ") if (d.getVar("TRUSTFENCE_READ_ONLY_ROOTFS") == "1"): d.appendVar("UBOOT_TF_CONF", "CONFIG_AUTHENTICATE_SQUASHFS_ROOTFS=y ") if d.getVar("TRUSTFENCE_SIGN_KEYS_PATH"): @@ -164,11 +175,14 @@ python () { if d.getVar("TRUSTFENCE_KEY_INDEX"): d.appendVar("UBOOT_TF_CONF", "CONFIG_KEY_INDEX=%s " % d.getVar("TRUSTFENCE_KEY_INDEX")) if (d.getVar("DEY_SOC_VENDOR") == "NXP"): - d.appendVar("UBOOT_TF_CONF", "CONFIG_AUTH_ARTIFACTS=y ") if (d.getVar("TRUSTFENCE_DEK_PATH") not in [None, "0"]): d.appendVar("UBOOT_TF_CONF", 'CONFIG_DEK_PATH="%s" ' % d.getVar("TRUSTFENCE_DEK_PATH")) if d.getVar("TRUSTFENCE_SIGN_MODE"): d.appendVar("UBOOT_TF_CONF", 'CONFIG_SIGN_MODE="%s" ' % d.getVar("TRUSTFENCE_SIGN_MODE")) + else: + # Disable signing artifacts if TRUSTFENCE_SIGN != 1 + d.setVar("TRUSTFENCE_SIGN_ARTIFACTS", "0") + if (d.getVar("TRUSTFENCE_ENCRYPT_ENVIRONMENT") == "1"): if (d.getVar("DEY_SOC_VENDOR") == "NXP"): d.appendVar("UBOOT_TF_CONF", "CONFIG_ENV_AES=y CONFIG_ENV_AES_CAAM_KEY=y ") From 34e82e9bac7ae0b68bb3257f94fc5e61951f1b5b Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 14 Sep 2023 18:47:20 +0200 Subject: [PATCH 007/118] trustfence-initramfs: make compatible with ccimx93 Signed-off-by: Javier Viguera --- meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb index 673017e47..1162c099d 100644 --- a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2016-2022, Digi International Inc. +# Copyright (C) 2016-2023, Digi International Inc. SUMMARY = "Trustfence initramfs required files" LICENSE = "GPL-2.0-only" @@ -27,4 +27,4 @@ RDEPENDS:${PN} = " \ " PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6|ccimx8x|ccimx8m)" +COMPATIBLE_MACHINE = "(ccimx6|ccimx8x|ccimx8m|ccimx93)" From 07525e1c2ca6854777c97e8642b0fafd9fff63b6 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 18 Sep 2023 17:21:55 +0200 Subject: [PATCH 008/118] trustfence: relax the expression to match AHAB based SRK certs Current pattern does not match the SRKs generated for the ccimx93. The ccimx93 does not support subordinated SGK certs, so the name of the SRKs do not contain the "_ca_" pattern. So relax the expression used in the trustfence bbclass to match the SRKs generated for both platforms. # For the ccimx93 $ ls -1 crts/SRK1*crt.pem crts/SRK1_sha512_secp521r1_v3_usr_crt.pem # For the ccimx8x $ ls -1 crts/SRK1*crt.pem crts/SRK1_sha512_secp521r1_v3_ca_crt.pem Signed-off-by: Javier Viguera --- meta-digi-dey/classes/trustfence.bbclass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 19f86bd2f..823151566 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -91,7 +91,7 @@ copy_public_key() { if [ "${TRUSTFENCE_SIGN_MODE}" = "HAB" ]; then CERT_IMG="$(echo ${TRUSTFENCE_SIGN_KEYS_PATH}/crts/IMG${KEY_INDEX}*crt.pem)" elif [ "${TRUSTFENCE_SIGN_MODE}" = "AHAB" ]; then - CERT_IMG="$(echo ${TRUSTFENCE_SIGN_KEYS_PATH}/crts/SRK${KEY_INDEX}*_ca_crt.pem)" + CERT_IMG="$(echo ${TRUSTFENCE_SIGN_KEYS_PATH}/crts/SRK${KEY_INDEX}*crt.pem)" else bberror "Unknown TRUSTFENCE_SIGN_MODE value" exit 1 From fec5eefebd7f3b7d980c375cb703ace81392a201 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 20 Sep 2023 11:42:01 +0200 Subject: [PATCH 009/118] conf: machines: cosmetic, add missing newlines at end of file Signed-off-by: Javier Viguera --- meta-digi-arm/conf/machine/ccimx6qpsbc.conf | 2 +- meta-digi-arm/conf/machine/ccimx6sbc.conf | 2 +- meta-digi-arm/conf/machine/ccimx8mm-dvk.conf | 2 +- meta-digi-arm/conf/machine/ccimx8mn-dvk.conf | 2 +- meta-digi-arm/conf/machine/ccimx93-dvk.conf | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccimx6qpsbc.conf b/meta-digi-arm/conf/machine/ccimx6qpsbc.conf index 6e47aa6a3..54cdcbd6e 100644 --- a/meta-digi-arm/conf/machine/ccimx6qpsbc.conf +++ b/meta-digi-arm/conf/machine/ccimx6qpsbc.conf @@ -59,4 +59,4 @@ BOOTABLE_ARTIFACTS = " \ # Default overlayfs_etc mount point and type OVERLAYFS_ETC_MOUNT_POINT ?= "/mnt/data" OVERLAYFS_ETC_DEVICE ?= "/dev/mmcblk0p7" -OVERLAYFS_ETC_FSTYPE ?= "ext4" \ No newline at end of file +OVERLAYFS_ETC_FSTYPE ?= "ext4" diff --git a/meta-digi-arm/conf/machine/ccimx6sbc.conf b/meta-digi-arm/conf/machine/ccimx6sbc.conf index b4cde1a4b..e116cf8b2 100644 --- a/meta-digi-arm/conf/machine/ccimx6sbc.conf +++ b/meta-digi-arm/conf/machine/ccimx6sbc.conf @@ -64,4 +64,4 @@ BOOTABLE_ARTIFACTS = " \ # Default overlayfs_etc mount point and type OVERLAYFS_ETC_MOUNT_POINT ?= "/mnt/data" OVERLAYFS_ETC_DEVICE ?= "/dev/mmcblk0p7" -OVERLAYFS_ETC_FSTYPE ?= "ext4" \ No newline at end of file +OVERLAYFS_ETC_FSTYPE ?= "ext4" diff --git a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf index 05af26d26..742405f79 100644 --- a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf @@ -58,4 +58,4 @@ BOOTABLE_ARTIFACTS = "imx-boot-ccimx8mm-dvk.bin" # Default overlayfs_etc mount point and type OVERLAYFS_ETC_MOUNT_POINT ?= "/mnt/data" OVERLAYFS_ETC_DEVICE ?= "/dev/mmcblk0p7" -OVERLAYFS_ETC_FSTYPE ?= "ext4" \ No newline at end of file +OVERLAYFS_ETC_FSTYPE ?= "ext4" diff --git a/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf index d6b0fbf53..e3fbc2f46 100644 --- a/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf @@ -60,4 +60,4 @@ BOOTABLE_ARTIFACTS = "imx-boot-ccimx8mn-dvk.bin" # Default overlayfs_etc mount point and type OVERLAYFS_ETC_MOUNT_POINT ?= "/mnt/data" OVERLAYFS_ETC_DEVICE ?= "/dev/mmcblk0p7" -OVERLAYFS_ETC_FSTYPE ?= "ext4" \ No newline at end of file +OVERLAYFS_ETC_FSTYPE ?= "ext4" diff --git a/meta-digi-arm/conf/machine/ccimx93-dvk.conf b/meta-digi-arm/conf/machine/ccimx93-dvk.conf index 9561c2653..30f5ba12c 100644 --- a/meta-digi-arm/conf/machine/ccimx93-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx93-dvk.conf @@ -60,4 +60,4 @@ BOOTABLE_ARTIFACTS = "imx-boot-ccimx93-dvk.bin" # Default overlayfs_etc mount point and type OVERLAYFS_ETC_MOUNT_POINT ?= "/mnt/data" OVERLAYFS_ETC_DEVICE ?= "/dev/mmcblk0p7" -OVERLAYFS_ETC_FSTYPE ?= "ext4" \ No newline at end of file +OVERLAYFS_ETC_FSTYPE ?= "ext4" From ef1857fac5c2e415e974dc6cfeb4e582d50e599f Mon Sep 17 00:00:00 2001 From: Tatiana Leon Date: Fri, 29 Sep 2023 10:25:55 +0200 Subject: [PATCH 010/118] connectcore-demo: fix systemd service dependency on connectcore-demo-server.service This fix systemd error on boot: [ 6.974370] systemd[1]: /lib/systemd/system/connectcore-demo-example.service:3: Failed to add dependency on connectcore-demo-server, ignoring: Invalid argument Signed-off-by: Tatiana Leon --- .../connectcore-demo-example.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example.service b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example.service index 091d1fb90..bbe9fe677 100644 --- a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example.service +++ b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example.service @@ -1,6 +1,6 @@ [Unit] Description=Initialization of the ConnectCore demo example -After=connectcore-demo-server +After=connectcore-demo-server.service # Make sure we are started after graphic service is available After=##WESTON_SERVICE## From 12c14ffc186b68ee79c9867778c22f4cd23c7d99 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Mon, 2 Oct 2023 09:26:10 +0200 Subject: [PATCH 011/118] nativesdk: add STM signtools to SDK The appropriate way to add STM signtools to the SDK is via RDEPENDS on nativesdk-packagegroup-sdk-host, not through the parent recipe of STM signtools recipe itself. Signed-off-by: Hector Palacios https://onedigi.atlassian.net/browse/DEL-8720 --- .../packagegroup/nativesdk-packagegroup-sdk-host.bbappend | 5 +++++ .../trustfence/nativesdk-trustfence-sign-tools_git.bb | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/meta-digi-arm/recipes-core/packagegroup/nativesdk-packagegroup-sdk-host.bbappend b/meta-digi-arm/recipes-core/packagegroup/nativesdk-packagegroup-sdk-host.bbappend index 94b076552..bd339562f 100644 --- a/meta-digi-arm/recipes-core/packagegroup/nativesdk-packagegroup-sdk-host.bbappend +++ b/meta-digi-arm/recipes-core/packagegroup/nativesdk-packagegroup-sdk-host.bbappend @@ -10,7 +10,12 @@ IMX_TRUSTFENCE_SDK_TOOLS ?= " \ ${@oe.utils.conditional('TRUSTFENCE_SIGN_MODE', 'AHAB', 'nativesdk-imx-mkimage', '', d)} \ " +STM_TRUSTFENCE_SDK_TOOLS ?= " \ + nativesdk-trustfence-stm-signtools \ +" + RDEPENDS:${PN} += " \ nativesdk-trustfence-sign-tools \ ${@oe.utils.conditional('DEY_SOC_VENDOR', 'NXP', '${IMX_OPTEE_SDK_RDEPENDS} ${IMX_TRUSTFENCE_SDK_TOOLS}', '', d)} \ + ${@oe.utils.conditional('DEY_SOC_VENDOR', 'STM', '${STM_TRUSTFENCE_SDK_TOOLS}', '', d)} \ " diff --git a/meta-digi-arm/recipes-digi/trustfence/nativesdk-trustfence-sign-tools_git.bb b/meta-digi-arm/recipes-digi/trustfence/nativesdk-trustfence-sign-tools_git.bb index e1f5f9ade..3d55e7a65 100644 --- a/meta-digi-arm/recipes-digi/trustfence/nativesdk-trustfence-sign-tools_git.bb +++ b/meta-digi-arm/recipes-digi/trustfence/nativesdk-trustfence-sign-tools_git.bb @@ -2,8 +2,3 @@ require trustfence-sign-tools.inc inherit nativesdk - -RDEPENDS:${PN} = " \ - ${@oe.utils.conditional('DEY_SOC_VENDOR', 'NXP', 'nativesdk-trustfence-cst', '', d)} \ - ${@oe.utils.conditional('DEY_SOC_VENDOR', 'STM', 'nativesdk-trustfence-stm-signtools', '', d)} \ -" From 54a4e5779ddcdcc54182ea500b05eab26bc88fad Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Mon, 2 Oct 2023 09:35:29 +0200 Subject: [PATCH 012/118] trustfence-stm-signtools: rework package so that the tools are accessible The STM signtools are precompiled binaries with a fixed RPATH to look for dynamic libraries. When the binaries are installed to the regular ${bindir} (either native or nativesdk), additional toolchain libraries in the regular ${libdir} folder confuse the binaries, resulting in segmentation faults when running them or missing symbols. The package has been reworked to place the directory structure expected by the binaries, in a subfolder "stm" within the ${bindir}. Two wrapper scripts with the names of the binaries (STM32MP_KeyGen_CLI and STM32MP_SigningTool_CLI) have been created to run the binaries in the new subfolder. Package version has been bumped to 1.1. While on it, remove the 'do_install' from trustfence-stm-signtools.inc which is not needed because the 'bin_package' class already provides the same functionality. Signed-off-by: Hector Palacios https://onedigi.atlassian.net/browse/DEL-8720 --- ...bb => nativesdk-trustfence-stm-signtools_1.1.bb} | 0 ....0.bb => trustfence-stm-signtools-native_1.1.bb} | 0 .../trustfence-stm-signtools.inc | 13 ++----------- 3 files changed, 2 insertions(+), 11 deletions(-) rename meta-digi-arm/recipes-bsp/trustfence-stm-signtools/{nativesdk-trustfence-stm-signtools_1.0.bb => nativesdk-trustfence-stm-signtools_1.1.bb} (100%) rename meta-digi-arm/recipes-bsp/trustfence-stm-signtools/{trustfence-stm-signtools-native_1.0.bb => trustfence-stm-signtools-native_1.1.bb} (100%) diff --git a/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/nativesdk-trustfence-stm-signtools_1.0.bb b/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/nativesdk-trustfence-stm-signtools_1.1.bb similarity index 100% rename from meta-digi-arm/recipes-bsp/trustfence-stm-signtools/nativesdk-trustfence-stm-signtools_1.0.bb rename to meta-digi-arm/recipes-bsp/trustfence-stm-signtools/nativesdk-trustfence-stm-signtools_1.1.bb diff --git a/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools-native_1.0.bb b/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools-native_1.1.bb similarity index 100% rename from meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools-native_1.0.bb rename to meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools-native_1.1.bb diff --git a/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools.inc b/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools.inc index 2c8e9d882..54540ab00 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools.inc +++ b/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools.inc @@ -10,18 +10,9 @@ PKGNAME = "trustfence-stm-signtools" # tarball SRC_URI = "${DIGI_PKG_SRC}/${PKGNAME}-${PV}.tar.gz" -SRC_URI[md5sum] = "5621d99156b75e69eecbae721475463b" -SRC_URI[sha256sum] = "5c04b16934aa316d2586980f93680e90af1968bcb9b76c18b9cecddbcf5d6a1b" - -S = "${WORKDIR}/${PKGNAME}-${PV}" +SRC_URI[md5sum] = "38ce0cd682350b15e773e725ee842da4" +SRC_URI[sha256sum] = "cc349bdcaa764d5af25b12ee9e0c143f93dc80d531f42f8a57a735e170cd378b" inherit bin_package INSANE_SKIP:${PN} = "already-stripped" - -do_install() { - install -d ${D}${bindir} - install -m 0755 bin/* ${D}${bindir} - install -d ${D}${base_libdir} - install -m 0644 lib/* ${D}${base_libdir} -} From 8fb4832433d459b6165bae74083209c441f7a954 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Tue, 3 Oct 2023 08:43:29 +0200 Subject: [PATCH 013/118] ccmp1: don't build additional UBI/UBIFS images via meta-st-stm32mp layer Through the inclusion of 'nand-4-256' in BOOTDEVICE_LABELS, the include file 'st-machine-common-stm32mp.inc' adds strings to MULTIUBI_BUILD and IMAGE_FSTYPES that result in building ubi and ubifs images. These are redundant and not needed since meta-digi's 'image_types_digi.bbclass' already generates the needed ubifs images. Signed-off-by: Hector Palacios https://onedigi.atlassian.net/browse/DEL-8714 --- meta-digi-arm/conf/machine/include/ccmp1.inc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index 15ff18221..fd74a2ad8 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -51,6 +51,11 @@ BOOTDEVICE_LABELS ?= "nand-4-256" # Supported boot schemes BOOTSCHEME_LABELS ?= "optee" +# Remove NAND-based ubi/ubifs images added by st-machine-common-stm32mp.inc +# because image_types_digi.bbclass already builds their own. +MULTIUBI_BUILD:remove = "nand_4_256" +IMAGE_FSTYPES:remove = "stmultiubi" + # Wic files WKS_FILE += "ccmp1.wks.in" WKS_FILE_DEPENDS ?= " \ From 614c7c62c8b86a302ec2eb8bed2b06476fcbf5aa Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Mon, 9 Oct 2023 15:38:35 +0200 Subject: [PATCH 014/118] meta-digi-dey: bump distro version to 4.0-r5 Signed-off-by: Arturo Buzarra --- README.md | 2 +- meta-digi-dey/conf/distro/dey.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index beb1eeefa..bb471b700 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Digi Embedded Yocto (DEY) 4.0 -## Release 4.0-r4 +## Release 4.0-r5 This document provides information about Digi Embedded Yocto, Digi International's professional embedded Yocto development environment. diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index 263b7642d..77960fad1 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -3,7 +3,7 @@ require conf/distro/poky.conf # Discrete version values. YOCTO_MAJOR = "4" YOCTO_MINOR = "0" -DEY_RELEASE = "4" +DEY_RELEASE = "5" DEY_BUILD = "1" # Firmware version of the system. From 5956782ac3f040ae5cbeec955518930c8c917047 Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Tue, 3 Oct 2023 20:16:41 +0200 Subject: [PATCH 015/118] build.sh: support dey-image-webkit on ccimx6sbc/ccimx6qpsbc platforms Signed-off-by: Arturo Buzarra --- sdk/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/build.sh b/sdk/build.sh index 0c803c107..61ac6ff1d 100755 --- a/sdk/build.sh +++ b/sdk/build.sh @@ -174,8 +174,8 @@ done<<-_EOF_ ccimx8mn-dvk dey-image-qt,dey-image-crank,dey-image-webkit ccimx8x-sbc-pro dey-image-qt,dey-image-crank,dey-image-webkit ccimx8x-sbc-express dey-image-qt - ccimx6qpsbc dey-image-qt,dey-image-crank - ccimx6sbc dey-image-qt,dey-image-crank + ccimx6qpsbc dey-image-qt,dey-image-crank,dey-image-webkit + ccimx6sbc dey-image-qt,dey-image-crank,dey-image-webkit ccimx6ulsbc core-image-base,dey-image-qt,dey-image-crank ccimx6ulstarter core-image-base ccimx6ulsom dey-image-mft-module-min From 94a865cc0e7ca72347cd3da85eaa3417a4cd33f4 Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Tue, 3 Oct 2023 20:15:08 +0200 Subject: [PATCH 016/118] build scripts: sync internal and Github build scripts Signed-off-by: Arturo Buzarra --- sdk/build-github.sh | 52 +++++++++++++++++++++++++++++++++------------ sdk/build.sh | 8 +++++-- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/sdk/build-github.sh b/sdk/build-github.sh index c505a6166..106e41c8d 100755 --- a/sdk/build-github.sh +++ b/sdk/build-github.sh @@ -14,9 +14,11 @@ # !Description: Yocto autobuild script from Jenkins. # # Parameters set by Jenkins: -# DY_PLATFORMS: Platforms to build -# DY_REVISION: Revision of the manifest repository (for 'repo init') -# DY_TARGET: Target image (the default is platform dependent) +# DY_BUILD_RELEASE: Build for release mode +# DY_BUILD_TCHAIN: Build toolchains for DEY images +# DY_PLATFORMS: Platforms to build +# DY_REVISION: Revision of the manifest repository (for 'repo init') +# DY_TARGET: Target image (the default is platform dependent) # #=============================================================================== @@ -56,10 +58,15 @@ copy_images() { # Copy individual packages only for 'release' builds, not for 'daily'. # For 'daily' builds just copy the firmware images (the buildserver # cannot afford such amount of disk space) - if echo "${JOB_NAME}" | grep -qs 'dey.*release'; then + if [ "${DY_BUILD_RELEASE}" = "true" ]; then cp -r tmp/deploy/* "${1}"/ else cp -r tmp/deploy/images "${1}"/ + if [ "${DY_BUILD_TCHAIN}" = "true" ]; then + if [ -d tmp/deploy/sdk ]; then + cp -r tmp/deploy/sdk "${1}"/ + fi + fi fi # Images directory post-processing @@ -109,9 +116,15 @@ swu_recipe_name() { fi } -# Sanity checks (Jenkins environment) -[ -z "${DY_REVISION}" ] && error "DY_REVISION not specified" -[ -z "${WORKSPACE}" ] && error "WORKSPACE not specified" +# Sanity check (Jenkins environment) +[ -z "${DY_REVISION}" ] && error "DY_REVISION not specified" +[ -z "${WORKSPACE}" ] && error "WORKSPACE not specified" + +# Set default settings if Jenkins does not do it +[ -z "${DY_BUILD_RELEASE}" ] && [[ "${JOB_NAME}" =~ dey-.*-release ]] && DY_BUILD_RELEASE="true" + +# If DY_BUILD_TCHAIN is unset, set it for release jobs +[ -z "${DY_BUILD_TCHAIN}" ] && [ "${DY_BUILD_RELEASE}" = "true" ] && DY_BUILD_TCHAIN="true" # Per-platform data while read -r _pl _tgt; do @@ -139,7 +152,8 @@ _EOF_ DY_PLATFORMS="${DY_PLATFORMS:-${AVAILABLE_PLATFORMS}}" YOCTO_IMGS_DIR="${WORKSPACE}/images" -YOCTO_INST_DIR="${WORKSPACE}/dey.$(echo "${DY_REVISION}" | tr '/' '_')" +YOCTO_INST_DIR="${WORKSPACE}/digi-yocto-sdk-github.$(echo "${DY_REVISION}" | tr '/' '_')" +YOCTO_DOWNLOAD_DIR="${DY_DOWNLOADS:-${WORKSPACE}}/downloads" YOCTO_PROJ_DIR="${WORKSPACE}/projects" # If CPUS is unset, set it with the machine cpus @@ -150,8 +164,8 @@ fi printf "\n[INFO] Build Yocto \"%s\" for \"%s\" (cpus=%s)\n\n" "${DY_REVISION}" "${DY_PLATFORMS}" "${CPUS}" -# Install DEY -rm -rf "${YOCTO_INST_DIR}" && mkdir -p "${YOCTO_INST_DIR}" +# Install/Update Digi's Yocto SDK +mkdir -p "${YOCTO_INST_DIR}" if pushd "${YOCTO_INST_DIR}"; then # Use git ls-remote to check the revision type if [ "${DY_REVISION}" != "master" ]; then @@ -175,13 +189,20 @@ if pushd "${YOCTO_INST_DIR}"; then popd fi -# Create projects and build +# Clean downloads directory +if [ "${DY_RM_DOWNLOADS}" = "true" ]; then + printf "\n[INFO] Removing the downloads folder.\n" + rm -rf "${YOCTO_DOWNLOAD_DIR}" +fi + +# Clean images and projects folders rm -rf "${YOCTO_IMGS_DIR}" "${YOCTO_PROJ_DIR}" + +# Create projects and build for platform in ${DY_PLATFORMS}; do # The variable _tgt got its dashes converted to # underscores, so we must convert also the ones in ${platform}. eval "platform_targets=\"\${${platform//-/_}_tgt}\"" - _this_prj_dir="${YOCTO_PROJ_DIR}/${platform}" _this_img_dir="${YOCTO_IMGS_DIR}/${platform}" mkdir -p "${_this_img_dir}" "${_this_prj_dir}" @@ -193,7 +214,7 @@ for platform in ${DY_PLATFORMS}; do # shellcheck disable=SC1091,SC2086 MKP_PAGER="" . ${YOCTO_INST_DIR}/mkproject.sh -p "${platform}" <<< "y" # Set a common DL_DIR and SSTATE_DIR for all platforms - sed -i -e "/^#DL_DIR ?=/cDL_DIR ?= \"${YOCTO_PROJ_DIR}/downloads\"" \ + sed -i -e "/^#DL_DIR ?=/cDL_DIR ?= \"${YOCTO_DOWNLOAD_DIR}\"" \ -e "/^#SSTATE_DIR ?=/cSSTATE_DIR ?= \"${YOCTO_PROJ_DIR}/sstate-cache\"" \ conf/local.conf { @@ -205,6 +226,11 @@ for platform in ${DY_PLATFORMS}; do printf "\n[INFO] Building the %s target.\n" "${target}" # shellcheck disable=SC2046 time bitbake "${target}" $(swu_recipe_name "${target}") + # Build the toolchain for DEY images + if [ "${DY_BUILD_TCHAIN}" = "true" ] && echo "${target}" | grep -qs '^\(core\|dey\)-image-[^-]\+$'; then + printf "\n[INFO] Building the toolchain for %s.\n" "${target}" + time bitbake -c populate_sdk "${target}" + fi done purge_sstate ) diff --git a/sdk/build.sh b/sdk/build.sh index 61ac6ff1d..311d6f435 100755 --- a/sdk/build.sh +++ b/sdk/build.sh @@ -14,12 +14,13 @@ # !Description: Yocto autobuild script from Jenkins. # # Parameters set by Jenkins: +# DY_BUILD_RELEASE: Build for release mode # DY_BUILD_TCHAIN: Build toolchains for DEY images # DY_DISTRO: Distribution name (the default is 'dey') # DY_PLATFORMS: Platforms to build # DY_REVISION: Revision of the manifest repository (for 'repo init') # DY_RM_WORK: Remove the package working folders to save disk space. -# DY_TARGET: Target image (the default is 'dey-image-qt') +# DY_TARGET: Target image (the default is platform dependent) # DY_USE_MIRROR: Use internal Digi mirror to download packages # DY_CVE_REPORT: Generate Vigiles CVE report # DY_VIGILES_DIR: Path to Vigiles configuration files on the build server @@ -138,7 +139,6 @@ swu_recipe_name() { } # Sanity check (Jenkins environment) -[ -z "${DY_PLATFORMS}" ] && error "DY_PLATFORMS not specified" [ -z "${DY_REVISION}" ] && error "DY_REVISION not specified" [ -z "${DY_RM_WORK}" ] && error "DY_RM_WORK not specified" [ -z "${DY_USE_MIRROR}" ] && error "DY_USE_MIRROR not specified" @@ -164,6 +164,7 @@ fi # Per-platform data while read -r _pl _tgt; do + AVAILABLE_PLATFORMS="${AVAILABLE_PLATFORMS:+${AVAILABLE_PLATFORMS} }${_pl}" # shellcheck disable=SC2015 [ -n "${DY_TARGET}" ] && _tgt="${DY_TARGET}" || true # Dashes are not allowed in variables so let's substitute them on @@ -185,6 +186,9 @@ done<<-_EOF_ ccimx93-dvk dey-image-qt _EOF_ +# Set default values if not provided by Jenkins +DY_PLATFORMS="${DY_PLATFORMS:-${AVAILABLE_PLATFORMS}}" + YOCTO_IMGS_DIR="${WORKSPACE}/images" YOCTO_INST_DIR="${WORKSPACE}/digi-yocto-sdk.$(echo "${DY_REVISION}" | tr '/' '_')" YOCTO_DOWNLOAD_DIR="${DY_DOWNLOADS:-${WORKSPACE}}/downloads" From 3ccbcdec0f17ae880cd3b9114e8ba52228f517e1 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Tue, 10 Oct 2023 12:23:34 +0200 Subject: [PATCH 017/118] packagegroup-qt6-dey: remove qtquick3d-dev This package was inadvertantly pulling in a lot of dependencies into our images that make use of Qt6. Most of these packages consisted of *-dev packages, which are only useful for development with the SDK. Remove this package along with its dependencies to significantly reduce the dey-image-qt rootfs image size. Note that this change was already done in commit 8979331ef8a2a47e2368d33ae58c36f73f937d33, but it was accidentally reverted when upgrading to Qt 6.5 in commit a5c6f2b795467b2cb3d21e73c911638d227e3a3e. Signed-off-by: Gabriel Valcazar (cherry picked from commit 0d6d6d219f4ecdd10b46ef8549f0645bd3f89124) --- .../qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-dey/dynamic-layers/qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb b/meta-digi-dey/dynamic-layers/qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb index a51cd5eb8..54fe9ea18 100644 --- a/meta-digi-dey/dynamic-layers/qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb +++ b/meta-digi-dey/dynamic-layers/qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb @@ -29,6 +29,6 @@ QT6_IMAGE_INSTALL_EXAMPLES = "qtbase-examples qtdeclarative-examples" QT6_IMAGE_INSTALL_FONTS = "ttf-dejavu-common ttf-dejavu-sans ttf-dejavu-sans-mono ttf-dejavu-serif " -QT6_IMAGE_INSTALL_QUICK3D = "qtquick3d qtquick3d-dev qtquick3d-examples" +QT6_IMAGE_INSTALL_QUICK3D = "qtquick3d qtquick3d-examples" # Quick3d does not work on systems without a proper GPU QT6_IMAGE_INSTALL_QUICK3D:ccimx93 = "" From c8a33e8de932a4f24cffa828665e411f5921777a Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 9 Oct 2023 15:52:21 +0200 Subject: [PATCH 018/118] imx-boot: fix build of imx-boot artifacts Recently, meta-freescale backported the support to build multiple boot artifacts. This clashes with the changes in our imx-boot bbappend, so update the bbappend to make it compatible with the latest changes in meta-freescale. Signed-off-by: Javier Viguera (cherry picked from commit 2fd1dbfed7cc09e35a989975ce64042c9c310d16) --- .../imx-mkimage/imx-boot_1.0.bbappend | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index 6ee026814..d54d26b15 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -1,4 +1,4 @@ -# Copyright (C) 2022,2023 Digi International +# Copyright (C) 2022-2023 Digi International Inc. FILESEXTRAPATHS:prepend := "${THISDIR}/files:" @@ -34,30 +34,25 @@ do_compile:append:ccimx8m() { make SOC=${IMX_BOOT_SOC_TARGET} dtbs=${UBOOT_DTB_NAME} print_fit_hab } -do_compile:ccimx8x () { - compile_${SOC_FAMILY} +do_compile:ccimx8x() { + # Copy TEE binary to SoC target folder to mkimage if ${DEPLOY_OPTEE}; then - cp ${DEPLOY_DIR_IMAGE}/tee.bin {BOOT_STAGING} + cp ${DEPLOY_DIR_IMAGE}/tee.bin ${BOOT_STAGING} fi - # mkimage for i.MX8 - + UBOOT_CONFIG_EXTRA="${UBOOT_CONFIG}" + UBOOT_NAME_EXTRA="u-boot-${MACHINE}.bin-${UBOOT_CONFIG_EXTRA}" for target in ${IMXBOOT_TARGETS}; do + compile_${SOC_FAMILY} for rev in ${SOC_REVISIONS}; do bbnote "building ${IMX_BOOT_SOC_TARGET} - REV=${rev} ${target}" - make SOC=${IMX_BOOT_SOC_TARGET} dtbs=${UBOOT_DTB_NAME} REV=${rev} ${target} > ${S}/mkimage-${rev}-${target}.log 2>&1 + make SOC=${IMX_BOOT_SOC_TARGET} REV=${rev} ${target} > ${S}/mkimage-${rev}-${target}.log 2>&1 if [ -e "${BOOT_STAGING}/flash.bin" ]; then - cp ${BOOT_STAGING}/flash.bin ${S}/${UBOOT_PREFIX}-${MACHINE}-${rev}.bin-${target} + cp ${BOOT_STAGING}/flash.bin ${S}/${BOOT_NAME}-${MACHINE}-${rev}.bin-${target} fi - SCFWBUILT="yes" - # Remove u-boot-atf-container.img so it gets generated in the next iteration - rm ${BOOT_STAGING}/u-boot-atf-container.img done done - - # Check that SCFW was built at least once - if [ "${IMX_BOOT_SOC_TARGET}" = "iMX8QX" and "${SCFWBUILT}" != "yes" ]; then - bbfatal "SCFW was not built!" - fi + unset UBOOT_CONFIG_EXTRA + unset UBOOT_NAME_EXTRA } do_install:ccimx8x () { @@ -70,10 +65,11 @@ do_install:ccimx8x () { } generate_symlinks() { - # imx-boot recipe in meta-freescale assumes only *one* build configuration - # (otherwise variable BOOT_CONFIG_MACHINE would expand to something incorrect) + # imx-boot recipe in meta-freescale supports *multiple* build configurations. + # We assume here only ONE build configuration for our platforms (otherwise + # UBOOT_CONFIG would be incorrectly expanded) for target in ${IMXBOOT_TARGETS}; do - mv ${DEPLOYDIR}/${BOOT_CONFIG_MACHINE}-${target} ${DEPLOYDIR}/${BOOT_NAME}-${MACHINE}.bin-${target} + mv ${DEPLOYDIR}/${BOOT_NAME}-${MACHINE}-${UBOOT_CONFIG}.bin-${target} ${DEPLOYDIR}/${BOOT_NAME}-${MACHINE}.bin-${target} done ln -sf ${BOOT_NAME}-${MACHINE}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/${BOOT_NAME}-${MACHINE}.bin ln -sf ${BOOT_NAME}-${MACHINE}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/${BOOT_NAME} From e2ee631832d3aab747a166a8f46f60d1df9244e9 Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Mon, 9 Oct 2023 17:34:57 +0200 Subject: [PATCH 019/118] meta-digi: [cosmetic] alphabetize compatible machine string Signed-off-by: Arturo Buzarra --- .../recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb | 2 +- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2020.04.bb | 4 ++-- meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb | 4 ++-- meta-digi-arm/recipes-digi/mca/mca-tool_1.25.bb | 4 ++-- .../kernel-module-qualcomm/kernel-module-qualcomm.bb | 2 +- meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb | 2 +- meta-digi-dey/recipes-connectivity/bluez/bluez5-init.bb | 2 +- meta-digi-dey/recipes-connectivity/xbee/xbee.bb | 4 ++-- meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb | 2 +- .../recipes-digi/dey-examples/dey-examples-adc-cmp.bb | 4 ++-- .../recipes-digi/dey-examples/dey-examples-cryptochip.bb | 4 ++-- .../recipes-digi/packagegroups/packagegroup-dey-examples.bb | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb index 58b65f655..fc3437f36 100644 --- a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb +++ b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb @@ -144,4 +144,4 @@ FILES:${PN}-${QCA_MODEL}-bt = "/lib/firmware/qca" FILES:${PN}-${QCA_MODEL}-wifi = "/lib/firmware" PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8x|ccimx8m)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x)" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2020.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2020.04.bb index ac3ca7119..c75695de1 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2020.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2020.04.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2020-2022 Digi International +# Copyright (C) 2020-2023 Digi International require u-boot-dey.inc LIC_FILES_CHKSUM = "file://Licenses/README;md5=30503fd321432fc713238f582193b78e" @@ -8,4 +8,4 @@ DEPENDS += "flex-native bison-native" SRCBRANCH = "v2020.04/master" SRCREV = "${AUTOREV}" -COMPATIBLE_MACHINE = "(ccimx8x|ccimx8m|ccimx6ul)" +COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8m|ccimx8x)" diff --git a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb index ba76662dd..d9114868c 100644 --- a/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb +++ b/meta-digi-arm/recipes-digi/cryptoauthlib/cryptoauthlib_git.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2021 Digi International Inc. +# Copyright (C) 2017-2023 Digi International Inc. SUMMARY = "Microchip CryptoAuthentication Library" SECTION = "libs" @@ -53,4 +53,4 @@ RDEPENDS:${PN}-test = "${PN}" RRECOMMENDS:${PN} = "${PN}-test" PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6qpsbc|ccimx6ul|ccimx8x|ccimx8m)" +COMPATIBLE_MACHINE = "(ccimx6qpsbc|ccimx6ul|ccimx8m|ccimx8x)" diff --git a/meta-digi-arm/recipes-digi/mca/mca-tool_1.25.bb b/meta-digi-arm/recipes-digi/mca/mca-tool_1.25.bb index cd326f853..49a956947 100644 --- a/meta-digi-arm/recipes-digi/mca/mca-tool_1.25.bb +++ b/meta-digi-arm/recipes-digi/mca/mca-tool_1.25.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2016-2022 Digi International. +# Copyright (C) 2016-2023 Digi International. SUMMARY = "MCA firmware management tool" SECTION = "console/tools" @@ -22,4 +22,4 @@ inherit bin_package INSANE_SKIP:${PN} = "already-stripped" -COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8x|ccimx8m|ccmp1)" +COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8m|ccimx8x|ccmp1)" diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb index 2f778854d..6f7e27844 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb @@ -100,4 +100,4 @@ FILES:${PN} += " \ ${base_libdir}/firmware/wlan/qcom_cfg.ini \ " -COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8x|ccimx8m)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x)" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb index f3c7c59ea..ecc10eef9 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb @@ -7,4 +7,4 @@ SRCBRANCH:stm32mpcommon = "v5.15.118/stm/master" SRCREV = "${AUTOREV}" SRCREV:stm32mpcommon = "${AUTOREV}" -COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8m|ccimx6|ccmp1|ccimx8x)" +COMPATIBLE_MACHINE = "(ccimx6|ccimx6ul|ccimx8m|ccimx8x|ccmp1)" diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-init.bb b/meta-digi-dey/recipes-connectivity/bluez/bluez5-init.bb index f5df5aa02..a9661b0fa 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-init.bb +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-init.bb @@ -62,4 +62,4 @@ RDEPENDS:${PN} = "initscripts-functions" RDEPENDS:${PN}:append:ccimx93 = " firmware-nxp-wifi-nxpiw612" PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8x|ccimx8mn|ccimx8mm|ccimx93)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x|ccimx93)" diff --git a/meta-digi-dey/recipes-connectivity/xbee/xbee.bb b/meta-digi-dey/recipes-connectivity/xbee/xbee.bb index 2b31f2531..6667c182b 100644 --- a/meta-digi-dey/recipes-connectivity/xbee/xbee.bb +++ b/meta-digi-dey/recipes-connectivity/xbee/xbee.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2019-2022, Digi International Inc. +# Copyright (C) 2019-2023, Digi International Inc. SUMMARY = "Digi XBee initialization" DESCRIPTION = "Initialization scripts for XBee hardware of Digi boards" @@ -42,4 +42,4 @@ SYSTEMD_PACKAGES = "${PN}-init" SYSTEMD_SERVICE:${PN}-init = "xbee-init.service" PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx8x|ccimx8m|ccimx93)" +COMPATIBLE_MACHINE = "(ccimx8m|ccimx8x|ccimx93)" diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb index 1162c099d..47afa79f7 100644 --- a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb @@ -27,4 +27,4 @@ RDEPENDS:${PN} = " \ " PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6|ccimx8x|ccimx8m|ccimx93)" +COMPATIBLE_MACHINE = "(ccimx6|ccimx8m|ccimx8x|ccimx93)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-adc-cmp.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-adc-cmp.bb index bf8275cb2..4822a3272 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-adc-cmp.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-adc-cmp.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2022, Digi International Inc. +# Copyright (C) 2017-2023, Digi International Inc. SUMMARY = "DEY examples: Analog Comparator test application" SECTION = "examples" @@ -15,4 +15,4 @@ do_install() { } PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8x|ccimx8m)" +COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8m|ccimx8x)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-cryptochip.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-cryptochip.bb index 83ee98caf..47b8d3218 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-cryptochip.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-cryptochip.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2022, Digi International Inc. +# Copyright (C) 2017-2023, Digi International Inc. require recipes-digi/dey-examples/dey-examples-src.inc @@ -18,4 +18,4 @@ do_install() { } PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6qpsbc|ccimx6ul|ccimx8x|ccimx8m)" +COMPATIBLE_MACHINE = "(ccimx6qpsbc|ccimx6ul|ccimx8m|ccimx8x)" diff --git a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb index 507429885..e3943fa24 100644 --- a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb +++ b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb @@ -27,4 +27,4 @@ RDEPENDS:${PN}:append:ccimx6 = "\ dey-examples-v4l2 \ " -COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8x|ccimx8m)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x)" From 5bd618479983a05315ec13fab0e91d03d035cb40 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 11 Oct 2023 11:17:20 +0200 Subject: [PATCH 020/118] firmware-sentinel: update to NXP's lf-6.1.36-2.1.0 release for ccimx93 Signed-off-by: Javier Viguera --- meta-digi-arm/conf/layer.conf | 2 ++ ...{firmware-sentinel_0.10.bb => firmware-sentinel_0.11.bb} | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) rename meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/{firmware-sentinel_0.10.bb => firmware-sentinel_0.11.bb} (78%) diff --git a/meta-digi-arm/conf/layer.conf b/meta-digi-arm/conf/layer.conf index 78f9e516b..5a96462af 100644 --- a/meta-digi-arm/conf/layer.conf +++ b/meta-digi-arm/conf/layer.conf @@ -28,9 +28,11 @@ LAYERSERIES_COMPAT_digi-arm = "kirkstone" # See fsl-eula-unpack.bbclass. FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V42 = "ea25d099982d035af85d193c88a1b479" FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V45 = "63a38e9f392d8813d6f1f4d0d6fbe657" +FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V48 = "db4762b09b6bda63da103963e6e081de" FSL_EULA_FILE_MD5SUMS:append = " \ ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V42} \ ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V45} \ + ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V48} \ " # STM EULA diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.10.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.11.bb similarity index 78% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.10.bb rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.11.bb index 7a71ee87b..e965e06e2 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.10.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.11.bb @@ -3,13 +3,13 @@ SUMMARY = "NXP i.MX Sentinel firmware" DESCRIPTION = "Firmware for i.MX Sentinel Security Controller" SECTION = "base" LICENSE = "Proprietary" -LIC_FILES_CHKSUM = "file://COPYING;md5=63a38e9f392d8813d6f1f4d0d6fbe657" +LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" inherit fsl-eula-unpack use-imx-security-controller-firmware deploy SRC_URI = "${FSL_MIRROR}/${BP}.bin;fsl-eula=true" -SRC_URI[md5sum] = "a92e272d665a3b3bb9281253d5eca69f" -SRC_URI[sha256sum] = "be862b62c849510cce08ec24c1ddf53d826458e326e5a7f09c4b35092d6f9950" +SRC_URI[md5sum] = "339011b6b199151d835c03089a3c2221" +SRC_URI[sha256sum] = "269480417a8ae9aa4cc4101ab947287fc33455a931021dbdc4d9badb5212bceb" do_compile[noexec] = "1" From eb2f8d786f6fae5ed8072723d982595156bc6506 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 11 Oct 2023 11:18:06 +0200 Subject: [PATCH 021/118] firmware-imx: update to NXP's lf-6.1.36-2.1.0 release for ccimx93 Signed-off-by: Javier Viguera --- .../{firmware-imx-9_8.20.bb => firmware-imx-9_8.21.bb} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/{firmware-imx-9_8.20.bb => firmware-imx-9_8.21.bb} (73%) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.20.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.21.bb similarity index 73% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.20.bb rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.21.bb index 5a96865d9..640979924 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.20.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.21.bb @@ -9,11 +9,11 @@ DESCRIPTION = "Freescale i.MX firmware for i.MX 9 family" # require recipes-bsp/firmware-imx/firmware-imx-${PV}.inc require recipes-bsp/firmware-imx/firmware-imx-8.18.inc -LIC_FILES_CHKSUM = "file://COPYING;md5=63a38e9f392d8813d6f1f4d0d6fbe657" -SRC_URI[md5sum] = "25c50f3371450b2324401ee06ff1bf6a" -SRC_URI[sha256sum] = "f6dc6a5c8fd9b913a15360d3ccd53d188db05a08a8594c518e57622478c72383" +LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" +SRC_URI[md5sum] = "48b9e116280d752f1696dc36b08b07da" +SRC_URI[sha256sum] = "c3447f0f813415ccea9dc2ef12080cb3ac8bbc0c67392a74fc7d59205eb5a672" -inherit deploy +inherit deploy nopackages do_install[noexec] = "1" From 4f453efd893c79607b6ff1b27d36bb399b166a69 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 11 Oct 2023 11:18:48 +0200 Subject: [PATCH 022/118] imx-atf: update to NXP's lf-6.1.36-2.1.0 release for ccimx93 New NXP's release is based on upstream v2.8. Use this only for ccimx93, and keep using the previous Kirkstone release (based on upstream v2.6) for the rest of the platforms. Signed-off-by: Javier Viguera --- .../0005-ccimx93-use-UART6-for-the-default-console.patch | 6 +++--- .../freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0005-ccimx93-use-UART6-for-the-default-console.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0005-ccimx93-use-UART6-for-the-default-console.patch index 49e60da78..fbbeb82ae 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0005-ccimx93-use-UART6-for-the-default-console.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0005-ccimx93-use-UART6-for-the-default-console.patch @@ -8,11 +8,11 @@ Signed-off-by: Javier Viguera 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plat/imx/imx93/include/platform_def.h b/plat/imx/imx93/include/platform_def.h -index 59ce1c267568..c4855d7f5e82 100644 +index 9bbee908fe80..8eba2f6d917a 100644 --- a/plat/imx/imx93/include/platform_def.h +++ b/plat/imx/imx93/include/platform_def.h -@@ -53,7 +53,7 @@ - #define MAX_MMAP_REGIONS 16 +@@ -61,7 +61,7 @@ + #define MAX_MMAP_REGIONS 17 #endif -#define IMX_LPUART_BASE 0x44380000 diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb index ef98ab91a..162111c5b 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb @@ -7,6 +7,7 @@ require recipes-bsp/imx-atf/imx-atf_2.6.bb SRC_URI = "git://github.com/nxp-imx/imx-atf.git;protocol=https;branch=${SRCBRANCH}" SRCBRANCH = "lf_v2.8" -SRCREV = "99195a23d3aef485fb8f10939583b1bdef18881c" +# Tag: lf-6.1.36-2.1.0 +SRCREV = "1a3beeab6484343a4bd0ee08e947d142db4a5ae6" COMPATIBLE_MACHINE = "(ccimx93)" From d55dbce7ae511ca5a918b3a40b812ad67ecb4691 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 11 Oct 2023 11:20:35 +0200 Subject: [PATCH 023/118] imx-boot, imx-mkimage: update to NXP's lf-6.1.36-2.1.0 release for ccimx93 Signed-off-by: Javier Viguera --- ...k-capture-commands-output-into-a-log-file.patch | 14 +++++++------- .../recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend | 6 +++--- .../imx-mkimage/imx-mkimage_git.bbappend | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch index 763f23979..9668a97fd 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch @@ -11,7 +11,7 @@ Signed-off-by: Javier Viguera 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iMX9/soc.mak b/iMX9/soc.mak -index 7c4086c153d0..7ec4bb5eaeb4 100644 +index 6d4613dd7d92..97e311059df8 100644 --- a/iMX9/soc.mak +++ b/iMX9/soc.mak @@ -1,4 +1,5 @@ @@ -20,17 +20,17 @@ index 7c4086c153d0..7ec4bb5eaeb4 100644 CC ?= gcc REV ?= A0 -@@ -71,7 +72,7 @@ u-boot-atf-container.img: bl31.bin u-boot-hash.bin +@@ -98,7 +99,7 @@ u-boot-atf-container.img: bl31.bin u-boot-hash.bin fi; \ else \ ./$(MKIMG) -soc IMX9 -c -ap bl31.bin a35 $(ATF_LOAD_ADDR) -ap u-boot-hash.bin a35 $(UBOOT_LOAD_ADDR) -out u-boot-atf-container.img; \ - fi + fi | tee $(MKIMAGE_LOG) - .PHONY: clean nightly - clean: -@@ -80,11 +81,11 @@ clean: - @echo "imx8ulp clean done" + u-boot-atf-container-spinand.img: bl31.bin u-boot-hash.bin + if [ -f tee.bin ]; then \ +@@ -125,11 +126,11 @@ clean: + @echo "imx9 clean done" flash_singleboot: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container.img - ./$(MKIMG) -soc IMX9 -append $(AHAB_IMG) -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin @@ -42,4 +42,4 @@ index 7c4086c153d0..7ec4bb5eaeb4 100644 + echo "append u-boot-atf-container.img at $$pad_cnt KB" | tee -a $(MKIMAGE_LOG); \ dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt; - flash_singleboot_flexspi: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container.img + flash_singleboot_spinand: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container-spinand.img flash_fw.bin diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index d54d26b15..19d80d9f9 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -11,10 +11,10 @@ SRC_URI:append:ccimx93 = " \ file://0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch \ " -# Use NXP's lf-6.1.22-2.0.0 release for ccimx93 +# Use NXP's lf-6.1.36-2.1.0 release for ccimx93 SRC_URI:ccimx93 = "git://github.com/nxp-imx/imx-mkimage.git;protocol=https;branch=${SRCBRANCH}" -SRCBRANCH:ccimx93 = "lf-6.1.22_2.0.0" -SRCREV:ccimx93 = "5cfd218012e080fb907d9cc301fbb4ece9bc17a9" +SRCBRANCH:ccimx93 = "lf-6.1.36_2.1.0" +SRCREV:ccimx93 = "5a0faefc223e51e088433663b6e7d6fbce89bf59" DEPENDS += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'trustfence-sign-tools-native', '', d)}" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.bbappend index 18a4a08c3..b40e5563b 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.bbappend @@ -6,10 +6,10 @@ SRC_URI:append:ccimx8m = " \ file://0001-imx8m-soc.mak-preserve-dtbs-after-build.patch \ " -# Use NXP's lf-6.1.22-2.0.0 release for ccimx93 +# Use NXP's lf-6.1.36-2.1.0 release for ccimx93 SRC_URI:ccimx93 = "git://github.com/nxp-imx/imx-mkimage.git;protocol=https;branch=${SRCBRANCH}" -SRCBRANCH:ccimx93 = "lf-6.1.22_2.0.0" -SRCREV:ccimx93 = "5cfd218012e080fb907d9cc301fbb4ece9bc17a9" +SRCBRANCH:ccimx93 = "lf-6.1.36_2.1.0" +SRCREV:ccimx93 = "5a0faefc223e51e088433663b6e7d6fbce89bf59" # "fmacro-prefix-map" is not supported on old versions of GCC DEBUG_PREFIX_MAP:remove:class-nativesdk = "-fmacro-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}" From 90e8d43115a993a6162b51ea8c3f995231204093 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 11 Oct 2023 11:22:00 +0200 Subject: [PATCH 024/118] optee: update to NXP's lf-6.1.36-2.1.0 release for ccimx93 Signed-off-by: Javier Viguera --- .../recipes-security/optee-imx/optee-os_3.21.0.imx.bb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_3.21.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_3.21.0.imx.bb index d837d877a..032a74b5e 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_3.21.0.imx.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_3.21.0.imx.bb @@ -10,8 +10,9 @@ SRC_URI = " \ file://0007-allow-setting-sysroot-for-clang.patch \ file://0001-core-imx-support-ccimx93-dvk.patch \ " -SRCBRANCH = "lf-6.1.22_2.0.0" -SRCREV = "1962aec9581760803b1485d455cd62cb11c14870" +SRCBRANCH = "lf-6.1.36_2.1.0" +# Tag: lf-6.1.36-2.1.0 +SRCREV = "4e32281904b15af9ddbdf00f73e1c08eae21c695" PLATFORM_FLAVOR:ccimx93 = "ccimx93dvk" From 165c56cc1d5b1fd64a3aa211657663f4d64b56b9 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 29 Sep 2023 10:35:05 +0200 Subject: [PATCH 025/118] linux-dey: update to NXP's lf-6.1.36-2.1.0 release for ccimx93 Signed-off-by: Isaac Hermida --- meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb index eac62ffb6..a59f73672 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb @@ -2,7 +2,7 @@ require recipes-kernel/linux/linux-dey.inc -SRCBRANCH = "v6.1.22/nxp/master" +SRCBRANCH = "v6.1.36/nxp/master" SRCREV = "${AUTOREV}" # Blacklist btnxpuart module. It will be managed by the bluetooth-init script From 2b18573007db35ec0a7a4d3f0eacacff0e9c4759 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 17 Oct 2023 12:56:23 +0200 Subject: [PATCH 026/118] kernel-module-nxp: update to NXP's lf-6.1.36-2.1.0 release for ccimx93 Signed-off-by: Isaac Hermida --- .../nxp-wlan-sdk/nxp-wlan-sdk_git.inc | 4 +- .../kernel-module-nxp-wlan.bbappend | 1 - .../0001-Fix-for-the-HE-Rate-Index.patch | 70 ------------------- 3 files changed, 2 insertions(+), 73 deletions(-) delete mode 100644 meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/0001-Fix-for-the-HE-Rate-Index.patch diff --git a/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc b/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc index 882507e4b..b4a2fa73c 100644 --- a/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc +++ b/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc @@ -3,10 +3,10 @@ LICENSE = "GPL-2.0-only" LIC_FILES_CHKSUM = "file://${WORKDIR}/git/LICENSE;md5=ab04ac0f249af12befccb94447c08b77" # For Kernel 5.4 and later -SRCBRANCH = "lf-6.1.22_2.0.0" +SRCBRANCH = "lf-6.1.36_2.1.0" MRVL_SRC ?= "git://github.com/nxp-imx/mwifiex.git;protocol=https" SRC_URI = "${MRVL_SRC};branch=${SRCBRANCH}" -SRCREV = "f1382ccbd34fc22daf504e798745f6cddb702b82" +SRCREV = "26246bf60afa613272156fa268e4ff99f5d810ae" S = "${WORKDIR}/git/mxm_wifiex/wlan_src" diff --git a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan.bbappend b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan.bbappend index df541be20..e1a0c245a 100644 --- a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan.bbappend +++ b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan.bbappend @@ -3,7 +3,6 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" SRC_URI:append = " \ - file://0001-Fix-for-the-HE-Rate-Index.patch \ file://81-iw612-wifi.rules \ file://load_iw612.sh \ " diff --git a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/0001-Fix-for-the-HE-Rate-Index.patch b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/0001-Fix-for-the-HE-Rate-Index.patch deleted file mode 100644 index c2f0c04ba..000000000 --- a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/0001-Fix-for-the-HE-Rate-Index.patch +++ /dev/null @@ -1,70 +0,0 @@ -From: Achyut Hegde -Date: Thu, 28 Apr 2022 17:51:45 +0000 -Subject: [PATCH] Fix for the HE Rate Index - ---- - .../mlinux/moal_sta_cfg80211.c | 37 ++++++++++++++++++- - 1 file changed, 35 insertions(+), 2 deletions(-) - -diff --git a/mxm_wifiex/mlinux/moal_sta_cfg80211.c b/mxm_wifiex/mlinux/moal_sta_cfg80211.c -index bf39f0e9b003..5f300288a6c8 100644 ---- a/mlinux/moal_sta_cfg80211.c -+++ b/mlinux/moal_sta_cfg80211.c -@@ -3393,6 +3393,37 @@ done: - return ret; - } - -+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 1, 18) -+/** -+ * @brief This function convert he_gi to nl80211_he_gi -+ * -+ * @param he_gi 0/1/2/3 -+ * -+ * -+ * @return 0: NL80211_RATE_INFO_HE_GI_0_8 -+ * 1: NL80211_RATE_INFO_HE_GI_1_6 -+ * 2: NL80211_RATE_INFO_HE_GI_3_2 -+ */ -+static t_u8 woal_he_gi_to_nl80211_he_gi(t_u8 he_gi) -+{ -+ t_u8 cfg_he_gi = 0; -+ switch(he_gi){ -+ case 3: -+ cfg_he_gi = NL80211_RATE_INFO_HE_GI_3_2; -+ break; -+ case 2: -+ cfg_he_gi = NL80211_RATE_INFO_HE_GI_1_6; -+ break; -+ case 0: -+ case 1: -+ default: -+ cfg_he_gi = NL80211_RATE_INFO_HE_GI_0_8; -+ break; -+ } -+ return cfg_he_gi; -+} -+#endif -+ - /** - * @brief Request the driver to fill the tx/rx rate info - * -@@ -3469,7 +3500,8 @@ static void woal_cfg80211_fill_rate_info(moal_private *priv, - sinfo->txrate.flags = RATE_INFO_FLAGS_HE_MCS; - sinfo->txrate.nss = rate->param.data_rate.tx_nss + 1; - sinfo->txrate.mcs = rate->param.data_rate.tx_mcs_index; -- sinfo->txrate.he_gi = rate->param.data_rate.tx_ht_gi; -+ sinfo->txrate.he_gi = woal_he_gi_to_nl80211_he_gi( -+ rate->param.data_rate.tx_ht_gi); - if (rate->param.data_rate.tx_ht_bw == MLAN_VHT_BW80) - sinfo->txrate.bw = RATE_INFO_BW_80; - else if (rate->param.data_rate.tx_ht_bw == MLAN_HT_BW40) -@@ -3516,7 +3548,8 @@ static void woal_cfg80211_fill_rate_info(moal_private *priv, - sinfo->rxrate.flags = RATE_INFO_FLAGS_HE_MCS; - sinfo->rxrate.nss = rate->param.data_rate.rx_nss + 1; - sinfo->rxrate.mcs = rate->param.data_rate.rx_mcs_index; -- sinfo->rxrate.he_gi = rate->param.data_rate.rx_ht_gi; -+ sinfo->rxrate.he_gi = woal_he_gi_to_nl80211_he_gi( -+ rate->param.data_rate.rx_ht_gi); - if (rate->param.data_rate.rx_ht_bw == MLAN_VHT_BW80) - sinfo->rxrate.bw = RATE_INFO_BW_80; - else if (rate->param.data_rate.rx_ht_bw == MLAN_HT_BW40) From db271b8c77ac77b80c376a5d53b36b7485edb0b3 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 17 Oct 2023 12:56:48 +0200 Subject: [PATCH 027/118] firmware-nxp-wifi: update to NXP's lf-6.1.36-2.1.0 release for ccimx93 Signed-off-by: Isaac Hermida --- .../ccimx93/sd_w61x_v1.bin.se | Bin 616964 -> 0 bytes .../ccimx93/uartspi_n61x_v1.bin.se | Bin 297468 -> 0 bytes .../firmware-imx/firmware-nxp-wifi_%.bbappend | 23 ++++++------------ 3 files changed, 8 insertions(+), 15 deletions(-) delete mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi/ccimx93/sd_w61x_v1.bin.se delete mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi/ccimx93/uartspi_n61x_v1.bin.se diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi/ccimx93/sd_w61x_v1.bin.se b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi/ccimx93/sd_w61x_v1.bin.se deleted file mode 100644 index 4416129c8986da78fd40d934d20fa6b3261661bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616964 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

pLqD=@DkgFe*Y&#%gtysH8coiyD;aC zwAGkB(k^qrRV2NXOgB8J0M}p#lfhV$tad=tXWk}d^w^s;o=K#(kCNtbUn|??zbb#D zGMQAN15lU9)!)RyCx1CrkZA7DT@~J1Q4ipMLKq3w9kIDt0$k;O=}P0g)xE&~*lb9qCltH5WbXyVmA*N&|^)Ezaj= z3swzVN7KwDuHcLlz=+9XUF8KQ4toX!jyV8w-97`xyZTB)%N*2j!7)VOW#4})5R`sEz|VnSDvj;teOPxwA7a(ggO_T2 zn_c-cBSmCzV&N0?6a#~AY#!VhDmvaa4ghxxyoT>3Fz!U81auTXW6Z;ce{fr54C!BC zuzT{2st;b6q0-rf%Hvnpl5q(A2i&$_!5+B|2~HJ?t;=5$jZL(DEas$Yb{x2*$$S)3 z)iF#%&`bysy;@6goF}@wvQ6b$7AN-NMqu+!XnqoGTD#h9JF7502Vir2dO?q;d8U(y zD4r$o@iX*9j{u{jMil@604D$d000O80I*VGruO3)RgNdu=Wa_{qY30{2L0B67>g*u z1y>rS~RxS`+;T> z*St@@8B`{-H%xwOm~!Nltj~f6?QI`eIk*d<^M(?BNYap{Svlqi4Xn;p6o~8sL!7L# z_QGlG1lKD)69>DT1(=q1(*BW%(h--rvTBI%RRlw#QvHt5KR0>fwE-)WZ~tDGAs zq7r&R8HF6TXknIP^JxkoWC~3esH(a18{e>Zo;C0}$(B^|NYq~I65k$t-YKWAJ#--) zJI5O>!9O$G>{aI2nhZ&DDgFMIaQ{m=7zK=$izs#`RDfVwW){J$6*hR$?_`94<3$`NGc&gY-8n|vrQCQ07BW}0g&44BylsLD0Hq-H$Hhywm+sNZ^7>( zM`?SWH!T{)O68h1-UcbXQGcQAfCQy{0%yy^IXo%kjQjRrs^B4U88-6zsMQtXXOu}y z72|?IwFTQ}Ol^X?yaJ=92N%0AeuNzrO1br6^0gv)Yg2q@pXl6-`WHI>!?ZXVRa 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%0AYGP}TLm3FN%$?bVa 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½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

nvIw&?J(X!4NPJkC_~^QmiwD!x6|U8%G~$wA3S} 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

}Jx4 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%0AALf!Vr)BJ$o)K7LH zX$jcnX_59i+i%DK_SAJ`+O~a3j@${xa1$(NvSr$-A$vR@mRWN~Bu0)OLQwXI;O?3$ zdA}D5Qf(lEe)M)n%U|uO_8x&p`E*)7FykVr6}lWU!+J7hBG0t8(|O@|Zzh4z(@WB!&@ z)^r{I=}e+;<~IHiO)Hy`ox5^#8Hn3}pvtvzXtiYj+%nuxGLJ;(5N?HMp?fwLL`~Rf zlUQ!lIgGO~++$y%*)(5zCB`sC$8LIjwx4oK-QN+bU!zfm_RknCt0pz;6ce&q^f=a& z%tY~Wwzs+gnvRYXJi{t~@;1;kq4p3}%ll$WBhz9+TV0F_t~gQ;v$fDyYJexklf5fv zs~zRK1DT~8dD~r)=>MvOW>;aBCs(J~)$d0rVJ3pLm%Vnexjf(Fysjo_;&1S0hHcu7 z&#n1N<9`oF$>GS15oa@W7}QcxL$L>F_8HPy;s8;sMr9-Vxe>V9=Do1!#iA3LQUPL78X{~2Tw?b^TT z#TVfQPB1TRoY1WmdKHsWNslHbzf;FDDL)B0wHW~r9=%1Q0J88)N2E6CK@TCBeiJFK zjt&L?DBWEKk8wxDmBVrnai{qdnYcG|iGml5_LkHo@n&r*Y*`N9PCjhPAJN)D65dbN zq3Go{lQpL=x1PPTtl7-S`NMJSQq)(4N|kl2^Ln?Yv000002mkm8K`uD8=zU$qh& zN&bqx=f%llmRs%cWT`PUjp1y d23D)j6m|s^sD~fH&nZ24xM~z&X)3uc*n>s%F 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νejaOK&v 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


|c^DAwL@>#rB;Pp{!5f<5hT#Zuv$JO7M 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 diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi/ccimx93/uartspi_n61x_v1.bin.se b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi/ccimx93/uartspi_n61x_v1.bin.se deleted file mode 100644 index 89d030f6b209763d1ee85fb8827b66e4587d5328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297468 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

U0DF{g6YygDXJtG{r+b#&j4O<=)}#y2heD# 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 h Date: Tue, 28 Nov 2023 13:07:05 +0100 Subject: [PATCH 058/118] uboot: ccmp1: disable LEGACY_IMAGE_FORMAT when FIT enabled The LEGACY_IMAGE_FORMAT defaults to 'y' if there is no FIT support, which happens after applying the default configuration. Then, the FIT support is added in a config fragment, but the LEGACY_IMAGE_FORMAT is not disabled. Disabling this is recommended to avoid the possibility to boot unsigned legacy images. Signed-off-by: Hector Palacios --- .../recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg index b4a52f46f..27c702af0 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg @@ -1 +1 @@ -CONFIG_LEGACY_IMAGE_FORMAT=y \ No newline at end of file +# CONFIG_LEGACY_IMAGE_FORMAT is not set From 0ae64227426d0d7789e974d20942d8db9942e916 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Tue, 28 Nov 2023 12:27:49 +0100 Subject: [PATCH 059/118] mp1: cmsis-svd: switch from master branch to main branch Otherwise, bitbake's git client won't be able to fetch the sources if there are no mirrors available. Signed-off-by: Gabriel Valcazar --- .../recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 meta-digi-dey/dynamic-layers/stm-st-stm32mp/recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend diff --git a/meta-digi-dey/dynamic-layers/stm-st-stm32mp/recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend b/meta-digi-dey/dynamic-layers/stm-st-stm32mp/recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend new file mode 100644 index 000000000..c8888b330 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/stm-st-stm32mp/recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend @@ -0,0 +1,4 @@ +# "master" branch was renamed to "main", which causes do_fetch() to fail. +# Reflect this in SRC_URI. +SRC_URI:remove = "git://github.com/posborne/cmsis-svd.git;protocol=https;branch=master" +SRC_URI:append = " git://github.com/posborne/cmsis-svd.git;protocol=https;branch=main" From b9b883d47cecc799794bedb50adb9848ca452585 Mon Sep 17 00:00:00 2001 From: fgilmar Date: Thu, 30 Nov 2023 09:58:36 +0100 Subject: [PATCH 060/118] trustfence: fix trustfence support in NXP platforms In commit df9b1cf329c, the UBOOT_SIGN_ENABLE is set for all platforms, and should be only added for FIT images. This is making the process failing in cc8mn/cc8mm platforms due to the UBOOT_SIGN_ENABLE is also used there to use a dtb patched with the signature node. https://onedigi.atlassian.net/browse/DEL-8764 Signed-off-by: Francisco Gil francisco.gilmartinez@digi.com --- meta-digi-dey/classes/trustfence.bbclass | 28 +++++++++++++----------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 1dac97cbb..5ed0eb8f4 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -192,19 +192,21 @@ python () { if d.getVar("TRUSTFENCE_SIGN_MODE"): d.appendVar("UBOOT_TF_CONF", 'CONFIG_SIGN_MODE="%s" ' % d.getVar("TRUSTFENCE_SIGN_MODE")) - # FIT-related variables - # Create keys if not defined - d.setVar("FIT_GENERATE_KEYS", "1") - # Sign individual images (prevents running unsigned images in FIT) - d.setVar("FIT_SIGN_INDIVIDUAL", "1") - # Set variables required by poky to sign FIT image - d.setVar("UBOOT_SIGN_KEYNAME", d.getVar("TRUSTFENCE_FIT_CFG_SIGN_KEYNAME")) - d.setVar("UBOOT_SIGN_IMG_KEYNAME", d.getVar("TRUSTFENCE_FIT_IMG_SIGN_KEYNAME")) - d.setVar("UBOOT_MKIMAGE_DTCOPTS", "-I dts -O dtb -p 2000") - # Enable FIT signing support - d.setVar("UBOOT_SIGN_ENABLE", d.getVar("TRUSTFENCE_SIGN")) - # Set path to FIT signing keys - d.setVar("UBOOT_SIGN_KEYDIR", "%s/fit" % d.getVar("TRUSTFENCE_SIGN_KEYS_PATH")) + + if (d.getVar("TRUSTFENCE_FIT_IMG") == "1"): + # FIT-related variables + # Create keys if not defined + d.setVar("FIT_GENERATE_KEYS", "1") + # Sign individual images (prevents running unsigned images in FIT) + d.setVar("FIT_SIGN_INDIVIDUAL", "1") + # Set variables required by poky to sign FIT image + d.setVar("UBOOT_SIGN_KEYNAME", d.getVar("TRUSTFENCE_FIT_CFG_SIGN_KEYNAME")) + d.setVar("UBOOT_SIGN_IMG_KEYNAME", d.getVar("TRUSTFENCE_FIT_IMG_SIGN_KEYNAME")) + d.setVar("UBOOT_MKIMAGE_DTCOPTS", "-I dts -O dtb -p 2000") + # Enable FIT signing support + d.setVar("UBOOT_SIGN_ENABLE", d.getVar("TRUSTFENCE_SIGN")) + # Set path to FIT signing keys + d.setVar("UBOOT_SIGN_KEYDIR", "%s/fit" % d.getVar("TRUSTFENCE_SIGN_KEYS_PATH")) else: # Disable signing artifacts if TRUSTFENCE_SIGN != 1 From 32dc939812906ffe6fd7e6fe5a2ec4f8716c5529 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Thu, 30 Nov 2023 11:23:24 +0100 Subject: [PATCH 061/118] trustfence: create a global variable TRUSTFENCE_ENABLED when the class is added meta-digi layers use many conditionals basing on TRUSTFENCE_SIGN, but this variable may be disabled when the signing process wants to be isolated from the image creation. There are cases when we still need to know if TrustFence is enabled even if the images are not going to be signed. Signed-off-by: Hector Palacios --- meta-digi-dey/classes/trustfence.bbclass | 2 ++ 1 file changed, 2 insertions(+) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 5ed0eb8f4..6d7834e2e 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -9,6 +9,8 @@ # * Disabled console # +TRUSTFENCE_ENABLED = "1" + # Default secure console configuration TRUSTFENCE_CONSOLE_DISABLE ?= "0" From e9aac1b4894fcfd144ebbcd9023ce98bcee7c94a Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Tue, 28 Nov 2023 18:59:09 +0100 Subject: [PATCH 062/118] swupdate: install a default config file with optional public-key-file The swupdate recipe installs by default a systemd service and a socket to listen for updates coming from a web server. DEY only makes use of such service during on-the-fly updates from Cloud Connector web service. The default swupdate service fails on images with TrustFence because it's called with no arguments and there doesn't exist a configuration file. This commit installs a default configuration file and, if TrustFence is enabled, sets the parameter 'public-key-file' to point to the public certificate to use to authenticate SWU packages. While on it, it removes the same file from the recovery-initramfs recipe that was the only recipe that was adding such config file for recovery images only. Signed-off-by: Hector Palacios --- .../recovery/recovery-initramfs.bb | 2 - .../recovery/recovery-initramfs/swupdate.cfg | 7 ---- .../swupdate/swupdate/swupdate.cfg | 38 +++++++++++++++++++ .../swupdate/swupdate_%.bbappend | 10 +++++ 4 files changed, 48 insertions(+), 9 deletions(-) delete mode 100644 meta-digi-dey/recipes-core/recovery/recovery-initramfs/swupdate.cfg create mode 100644 meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg diff --git a/meta-digi-dey/recipes-core/recovery/recovery-initramfs.bb b/meta-digi-dey/recipes-core/recovery/recovery-initramfs.bb index afb16da69..391e7ba61 100644 --- a/meta-digi-dey/recipes-core/recovery/recovery-initramfs.bb +++ b/meta-digi-dey/recipes-core/recovery/recovery-initramfs.bb @@ -14,7 +14,6 @@ DEPENDS += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', \ SRC_URI = " \ file://recovery-initramfs-init \ - file://swupdate.cfg \ file://automount_block.sh \ file://automount_mtd.sh \ file://automount_ubi.sh \ @@ -27,7 +26,6 @@ S = "${WORKDIR}" do_install() { install -d ${D}${sysconfdir} install -m 0755 ${WORKDIR}/recovery-initramfs-init ${D}/init - install -m 0644 ${WORKDIR}/swupdate.cfg ${D}${sysconfdir} if [ "${STORAGE_MEDIA}" = "mmc" ]; then install -m 0755 ${WORKDIR}/mount_cryptrootfs.sh ${D}${sysconfdir} fi diff --git a/meta-digi-dey/recipes-core/recovery/recovery-initramfs/swupdate.cfg b/meta-digi-dey/recipes-core/recovery/recovery-initramfs/swupdate.cfg deleted file mode 100644 index 2a63bee87..000000000 --- a/meta-digi-dey/recipes-core/recovery/recovery-initramfs/swupdate.cfg +++ /dev/null @@ -1,7 +0,0 @@ -globals : -{ - verbose = true; - loglevel = 5; - syslog = true; - mtd-blacklist = "0 1 2"; -}; diff --git a/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg b/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg new file mode 100644 index 000000000..2481ec914 --- /dev/null +++ b/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg @@ -0,0 +1,38 @@ +# SWUpdate configuration file +# +# SPDX-FileCopyrightText: 2014-2021 Stefano Babic +# SPDX-License-Identifier: CC0-1.0 +# +# This is responsible to pass configuration and parameters +# to SWUpdate. Most of configuration can be overwritten +# with command line parameters. +# + +globals : { + verbose = true; + loglevel = 5; + syslog = true; + mtd-blacklist = "0 1 2"; + #public-key-file +}; + +# logcolors : set colors for output to stdout / stderr +# color is set indivisually for each level +# each entry is in the format +# loglevel = color:attribute +# where loglevel is one of: +# "error","warning", "info", "debug", "trace" +# and color is one of: +# "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white" +# and attribute is one of: +# "normal", "bright", "dim", "underline", "blink", "reverse", "hidden" +# +# Example : +# error = "red"; +# +logcolors : { + error = "red:blink"; + trace = "green:normal"; + debug = "magenta:normal"; + warning = "yellow:underline"; +}; diff --git a/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend b/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend index de0feed77..94595b8b5 100644 --- a/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend +++ b/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend @@ -12,12 +12,22 @@ SRC_URI += " \ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'file://systemd.cfg', '', d)} \ ${@bb.utils.contains('STORAGE_MEDIA', 'mtd', 'file://mtd.cfg', '', d)} \ ${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'file://signed_images.cfg', '', d)} \ + file://swupdate.cfg \ " do_install:append() { # Copy the 'progress' binary. install -d ${D}${bindir}/ install -m 0755 tools/swupdate-progress ${D}${bindir}/progress + + # Copy config file + install -d ${D}${sysconfdir}/ + install -m 0755 ${WORKDIR}/swupdate.cfg ${D}${sysconfdir} + + # Add public-key-file setting to config file if TrustFence is enabled + if ${@oe.utils.conditional('TRUSTFENCE_ENABLED', '1', 'true', 'false', d)}; then + sed -i "s,\(^\s*\)#public-key-file,\1public-key-file = \"${sysconfdir}/ssl/certs/key.pub\",g" ${D}${sysconfdir}/swupdate.cfg + fi } pkg_postinst_ontarget:${PN}() { From fd70bf2fce2f4a96dc0ac289e81b5937b4d79b50 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Thu, 30 Nov 2023 12:34:19 +0100 Subject: [PATCH 063/118] swupdate: use dynamic mtd-blacklist for configuration file The 'mtd-blacklist' parameter prevents swupdate from acting upon those partitions that we consider sensitive. Make such list platform-dependent. Signed-off-by: Hector Palacios --- meta-digi-arm/conf/machine/include/ccimx6ul.inc | 4 ++++ meta-digi-arm/conf/machine/include/ccmp1.inc | 4 ++++ meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg | 2 +- meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend | 5 +++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index 1065b5fb7..d532eae21 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -69,3 +69,7 @@ UBOOT_ENV_SIZE ?= "0x20000" # the U-Boot environment can take up (if undefined, it will take up all the # available space in the environment partition) UBOOT_ENV_RANGE ?= "" + +# Partitions to blacklist for swupdate: +# bootloader, environment, safe +SWUPDATE_MTD_BLACKLIST = "0 1 2" diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index 7e8324486..0189ba36b 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -76,3 +76,7 @@ do_create_flashlayout_config[noexec] = "1" # Include boot script into the FIT image UBOOT_ENV = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'boot', '', d)}" + +# Partitions to blacklist for swupdate: +# fsbl1, fsbl2, metadata1, metadata2, fip-a, fip-b +SWUPDATE_MTD_BLACKLIST = "0 1 2 3 4 5" diff --git a/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg b/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg index 2481ec914..6b754a834 100644 --- a/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg +++ b/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg @@ -12,7 +12,7 @@ globals : { verbose = true; loglevel = 5; syslog = true; - mtd-blacklist = "0 1 2"; + #mtd-blacklist #public-key-file }; diff --git a/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend b/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend index 94595b8b5..acf5d6dd0 100644 --- a/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend +++ b/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend @@ -24,6 +24,11 @@ do_install:append() { install -d ${D}${sysconfdir}/ install -m 0755 ${WORKDIR}/swupdate.cfg ${D}${sysconfdir} + # Add MTD blacklist + if ${@oe.utils.conditional('STORAGE_MEDIA', 'mtd', 'true', 'false', d)}; then + sed -i "s,\(^\s*\)#mtd-blacklist,\1mtd-blacklist = \"${SWUPDATE_MTD_BLACKLIST}\",g" ${D}${sysconfdir}/swupdate.cfg + fi + # Add public-key-file setting to config file if TrustFence is enabled if ${@oe.utils.conditional('TRUSTFENCE_ENABLED', '1', 'true', 'false', d)}; then sed -i "s,\(^\s*\)#public-key-file,\1public-key-file = \"${sysconfdir}/ssl/certs/key.pub\",g" ${D}${sysconfdir}/swupdate.cfg From e4bb4d69afbb3352bc8ec19dc4d67c744461f6fc Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Mon, 6 Nov 2023 15:43:16 +0100 Subject: [PATCH 064/118] swupdate: add u-boot swupdate support This commit adds u-boot swupdate support for all platforms. Now u-boot can be updated with all our supported update options. Currently it will only update first partition u-boot partition. https://onedigi.atlassian.net/browse/DEL-8749 Signed-off-by: Mike Engel --- meta-digi-arm/conf/machine/include/ccmp1.inc | 3 + .../classes/dey-swupdate-common.bbclass | 23 ++++- .../ccimx6ul/sw-description-images_template | 6 ++ .../ccmp1/sw-description-images_template | 6 ++ .../swu-images/files/file_template_uboot | 5 ++ .../swu-images/files/script_template_uboot | 6 ++ .../files/sw-description-files_template | 4 + .../files/sw-description-images_template | 6 ++ .../files/sw-description-rdiff_template | 4 + .../swu-images/files/sw-description-uboot | 77 ---------------- .../swu-images/files/swupdate_uboot_nand.sh | 67 ++++++++++---- meta-digi-dey/recipes-digi/swu-images/swu.inc | 87 ++++++++++++++----- 12 files changed, 176 insertions(+), 118 deletions(-) create mode 100644 meta-digi-dey/recipes-digi/swu-images/files/file_template_uboot create mode 100644 meta-digi-dey/recipes-digi/swu-images/files/script_template_uboot delete mode 100644 meta-digi-dey/recipes-digi/swu-images/files/sw-description-uboot diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index 0189ba36b..484b798df 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -80,3 +80,6 @@ UBOOT_ENV = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'boot', '', d)}" # Partitions to blacklist for swupdate: # fsbl1, fsbl2, metadata1, metadata2, fip-a, fip-b SWUPDATE_MTD_BLACKLIST = "0 1 2 3 4 5" + +# Bootloader Flash offset +BOOTLOADER_SEEK_BOOT = "0" diff --git a/meta-digi-dey/classes/dey-swupdate-common.bbclass b/meta-digi-dey/classes/dey-swupdate-common.bbclass index 7e3031d3e..b06ddf026 100644 --- a/meta-digi-dey/classes/dey-swupdate-common.bbclass +++ b/meta-digi-dey/classes/dey-swupdate-common.bbclass @@ -88,10 +88,29 @@ SWUPDATE_IS_IMAGES_UPDATE = "${@update_based_on_images(d)}" # Determine the correct UBoot update script file to use depending on storage type. SWUPDATE_UBOOT_SCRIPT = "${@oe.utils.conditional('STORAGE_MEDIA', 'mmc', 'swupdate_uboot_mmc.sh', 'swupdate_uboot_nand.sh', d)}" +SWUPDATE_UBOOT_SCRIPT_NAME = "${@os.path.basename(d.getVar('SWUPDATE_UBOOT_SCRIPT'))}" -UBOOT_EXT ?= ".${UBOOT_SUFFIX}" +SWUPDATE_UBOOT_PREFIX ?= "${UBOOT_PREFIX}" +SWUPDATE_UBOOT_PREFIX:ccmp1 ?= "fip" +SWUPDATE_UBOOT_PREFIX_TFA ?= "tf-a" -UBOOTIMG_OFFSET ?= "${BOOTLOADER_SEEK_BOOT}" +SWUPDATE_UBOOT_EXT ?= ".${UBOOT_SUFFIX}" +SWUPDATE_UBOOT_EXT_TFA ?= ".stm32" + +SWUPDATE_UBOOT_NAME ?= "${SWUPDATE_UBOOT_PREFIX}-${MACHINE}${SWUPDATE_UBOOT_EXT}" +SWUPDATE_UBOOT_NAME:ccmp1 ?= "${SWUPDATE_UBOOT_PREFIX}-${MACHINE}-optee${SWUPDATE_UBOOT_EXT}" +SWUPDATE_UBOOT_NAME_TFA ?= "${@oe.utils.conditional('DEY_SOC_VENDOR', 'STM', '${SWUPDATE_UBOOT_PREFIX_TFA}-${MACHINE}-nand${SWUPDATE_UBOOT_EXT_TFA}', '', d)}" + +SWUPDATE_UBOOT_OFFSET ?= "0" +SWUPDATE_UBOOT_OFFSET:ccimx6 ?= "1" + +# Retrieve the correct encryption type. +def get_swupdate_uboot_enc(d): + if d.getVar('TRUSTFENCE_DEK_PATH') and d.getVar('TRUSTFENCE_DEK_PATH') != "0" : + return "enc" + return "normal" + +SWUPDATE_UBOOT_ENC ?= "${@get_swupdate_uboot_enc(d)}" ####################################### ########## SWU Update Script ########## diff --git a/meta-digi-dey/recipes-digi/swu-images/files/ccimx6ul/sw-description-images_template b/meta-digi-dey/recipes-digi/swu-images/files/ccimx6ul/sw-description-images_template index d617686f8..a7a30256e 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/ccimx6ul/sw-description-images_template +++ b/meta-digi-dey/recipes-digi/swu-images/files/ccimx6ul/sw-description-images_template @@ -8,11 +8,13 @@ software = images: ( ##IMAGES_PRIMARY## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { @@ -25,11 +27,13 @@ software = images: ( ##IMAGES_SECONDARY## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { @@ -42,11 +46,13 @@ software = images: ( ##IMAGES_SINGLE## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { diff --git a/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template b/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template index 0cc414a85..5f333df7b 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template +++ b/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template @@ -8,11 +8,13 @@ software = images: ( ##IMAGES_PRIMARY## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { @@ -29,11 +31,13 @@ software = images: ( ##IMAGES_SECONDARY## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { @@ -50,11 +54,13 @@ software = images: ( ##IMAGES_SINGLE## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { diff --git a/meta-digi-dey/recipes-digi/swu-images/files/file_template_uboot b/meta-digi-dey/recipes-digi/swu-images/files/file_template_uboot new file mode 100644 index 000000000..b50c47257 --- /dev/null +++ b/meta-digi-dey/recipes-digi/swu-images/files/file_template_uboot @@ -0,0 +1,5 @@ + { + filename = "##FILE_NAME##"; + path = "##FILE_PATH##"; + sha256 = "$swupdate_get_sha256(##FILE_NAME##)"; + } diff --git a/meta-digi-dey/recipes-digi/swu-images/files/script_template_uboot b/meta-digi-dey/recipes-digi/swu-images/files/script_template_uboot new file mode 100644 index 000000000..059bb2783 --- /dev/null +++ b/meta-digi-dey/recipes-digi/swu-images/files/script_template_uboot @@ -0,0 +1,6 @@ + { + filename = "@@SWUPDATE_UBOOT_SCRIPT_NAME@@"; + type = "preinstall"; + data = "@@SWUPDATE_UBOOT_NAME@@ @@SWUPDATE_UBOOT_ENC@@ @@SWUPDATE_UBOOT_OFFSET@@ @@SWUPDATE_UBOOT_NAME_TFA@@"; + sha256 = "$swupdate_get_sha256(@@SWUPDATE_UBOOT_SCRIPT_NAME@@)"; + } diff --git a/meta-digi-dey/recipes-digi/swu-images/files/sw-description-files_template b/meta-digi-dey/recipes-digi/swu-images/files/sw-description-files_template index d03492e00..c885c9b1e 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/sw-description-files_template +++ b/meta-digi-dey/recipes-digi/swu-images/files/sw-description-files_template @@ -13,6 +13,7 @@ software = path = "/"; sha256 = "$swupdate_get_sha256(@@SWUPDATE_FILES_TARGZ_FILE_NAME@@)"; } + ##FILES_UBOOT## ); scripts: ( { @@ -20,6 +21,7 @@ software = sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { @@ -40,6 +42,7 @@ software = path = "/system/"; sha256 = "$swupdate_get_sha256(@@SWUPDATE_FILES_TARGZ_FILE_NAME@@)"; } + ##FILES_UBOOT## ); scripts: ( { @@ -47,6 +50,7 @@ software = sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); } platform = { diff --git a/meta-digi-dey/recipes-digi/swu-images/files/sw-description-images_template b/meta-digi-dey/recipes-digi/swu-images/files/sw-description-images_template index dd0559912..bd681c61a 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/sw-description-images_template +++ b/meta-digi-dey/recipes-digi/swu-images/files/sw-description-images_template @@ -8,12 +8,14 @@ software = images: ( ##IMAGES_PRIMARY## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { @@ -26,12 +28,14 @@ software = images: ( ##IMAGES_SECONDARY## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); uboot: ( { @@ -44,12 +48,14 @@ software = images: ( ##IMAGES_SINGLE## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } + ##SCRIPT_UBOOT## ); } platform = { diff --git a/meta-digi-dey/recipes-digi/swu-images/files/sw-description-rdiff_template b/meta-digi-dey/recipes-digi/swu-images/files/sw-description-rdiff_template index 797095ed8..c2e73479a 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/sw-description-rdiff_template +++ b/meta-digi-dey/recipes-digi/swu-images/files/sw-description-rdiff_template @@ -8,6 +8,7 @@ software = images: ( ##IMAGES_PRIMARY## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; @@ -15,6 +16,7 @@ software = data = "$swupdate_get_sha256(@@SWUPDATE_RDIFF_ROOTFS_SOURCE_FILE@@)" sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; } + ##SCRIPT_UBOOT## ); uboot: ( { @@ -27,6 +29,7 @@ software = images: ( ##IMAGES_SECONDARY## ); + ##FILES_UBOOT## scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; @@ -34,6 +37,7 @@ software = data = "$swupdate_get_sha256(@@SWUPDATE_RDIFF_ROOTFS_SOURCE_FILE@@)" sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; } + ##SCRIPT_UBOOT## ); uboot: ( { diff --git a/meta-digi-dey/recipes-digi/swu-images/files/sw-description-uboot b/meta-digi-dey/recipes-digi/swu-images/files/sw-description-uboot deleted file mode 100644 index c72e564ba..000000000 --- a/meta-digi-dey/recipes-digi/swu-images/files/sw-description-uboot +++ /dev/null @@ -1,77 +0,0 @@ -software = -{ - version = "##FW_VERSION##"; - description = "##DESCRIPTION##"; - - mmc = { - platform: { - images: ( - { - filename = "##BOOTIMG_NAME##"; - device = "##BOOT_DEV##"; - type = "raw"; - sha256 = "$swupdate_get_sha256(##BOOTIMG_NAME##)"; - installed-directly = true; - }, - { - filename = "##ROOTIMG_NAME##"; - device = "##ROOTFS_DEV##"; - type = "raw"; - sha256 = "$swupdate_get_sha256(##ROOTIMG_NAME##)"; - compressed = "zlib"; - installed-directly = true; - } - ); - files: ( - { - filename = "##UBOOTIMG_NAME##"; - path = "##UBOOT_IMAGE_PATH##"; - sha256 = "$swupdate_get_sha256(##UBOOTIMG_NAME##)"; - } - ); - scripts: ( - { - filename = "##SWUPDATE_UBOOT_SCRIPT##"; - type = "preinstall"; - data = "##UBOOTIMG_NAME## ##UBOOTIMG_ENC## ##UBOOTIMG_OFFSET##; - sha256 = "$swupdate_get_sha256(##SWUPDATE_UBOOT_SCRIPT##)"; - } - ); - }; - }; - mtd = { - platform: { - images: ( - { - filename = "##BOOTIMG_NAME##"; - volume = "##BOOT_DEV##"; - type = "ubivol"; - sha256 = "$swupdate_get_sha256(##BOOTIMG_NAME##)"; - installed-directly = true; - }, - { - filename = "##ROOTIMG_NAME##"; - volume = "##ROOTFS_DEV##"; - type = "ubivol"; - sha256 = "$swupdate_get_sha256(##ROOTIMG_NAME##)"; - installed-directly = true; - } - ); - files: ( - { - filename = "##UBOOTIMG_NAME##"; - path = "##UBOOT_IMAGE_PATH##"; - sha256 = "$swupdate_get_sha256(##UBOOTIMG_NAME##)"; - } - ); - scripts: ( - { - filename = "##SWUPDATE_UBOOT_SCRIPT##"; - type = "postinstall"; - data = "##UBOOTIMG_NAME## ##UBOOTIMG_ENC##"; - sha256 = "$swupdate_get_sha256(##SWUPDATE_UBOOT_SCRIPT##)"; - } - ); - }; - }; -} diff --git a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh index 58f9b4de6..c92620ce7 100755 --- a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh +++ b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh @@ -1,7 +1,7 @@ #!/bin/sh #=============================================================================== # -# Copyright (C) 2022 by Digi International Inc. +# Copyright (C) 2022-2023 by Digi International Inc. # All rights reserved. # # This program is free software; you can redistribute it and/or modify it @@ -15,6 +15,7 @@ UBOOT_FILE="$1" UBOOT_ENC="$2" +TFA_FILE="$4" echo "**** Start U-Boot update process *****" @@ -70,24 +71,60 @@ dump_dek () return 0 } +install_fwu () +{ + FLASH_DEV="$1" + FW_FILE="$2" + + flash_eraseall ${FLASH_DEV} + rc=$? + if [ "$rc" -ne 0 ]; then + echo "U-Boot: erasing ${FLASH_DEV} failed" + exit $rc + fi + nandwrite -p ${FLASH_DEV} /tmp/${FW_FILE} + if [ "$rc" -ne 0 ]; then + echo "U-Boot: failed to write firmware to ${FLASH_DEV}" + exit $rc + fi +} + +COMP_CCMP1=$(cat /proc/device-tree/compatible | grep "\bdigi,ccmp1\b") + if [ "${UBOOT_ENC}" = "enc" ]; then - dump_dek - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: DEK dump failed" - exit $rc + if [ "${COMP_CCMP1}" = "digi,ccmp1" ]; then + # Currently not supported for these platforms + echo "*** Encrypted U-boot currently not support for CCMP1 ***" + else + dump_dek + rc=$? + if [ "$rc" -ne 0 ]; then + echo "u-boot: DEK dump failed" + exit $rc + fi + cat $UBOOT_FILE $OUTPUT_FILE > /tmp/$ENCRYPTED_UBOOT_DEK + rc=$? + if [ "$rc" -ne 0 ]; then + echo "u-boot: Merging DEK with U-Boot image failed (DEV/FILE = $UBOOT_FILE)" + exit $rc + fi + UBOOT_FILE="${ENCRYPTED_UBOOT_DEK}" fi - cat $UBOOT_FILE $OUTPUT_FILE > /tmp/$ENCRYPTED_UBOOT_DEK - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: Merging DEK with U-Boot image failed (DEV/FILE = $UBOOT_FILE)" - exit $rc - fi - UBOOT_FILE="${ENCRYPTED_UBOOT_DEK}" fi -# install U-Boot onto the Nand Flash -kobs-ng init -x -v /mnt/update/${UBOOT_FILE} +if [ "${COMP_CCMP1}" = "digi,ccmp1" ]; then + # install TF-A onto fsbl1 partition + mtd_num="$(sed -ne "/fsbl1/s,^mtd\([0-9]\+\).*,\1,g;T;p" /proc/mtd)" + TFA_DEV="/dev/mtd${mtd_num}" + install_fwu ${TFA_DEV} ${TFA_FILE} + # install U-Boot onto FIP-a partition + mtd_num="$(sed -ne "/fip-a/s,^mtd\([0-9]\+\).*,\1,g;T;p" /proc/mtd)" + FIP_DEV="/dev/mtd${mtd_num}" + install_fwu ${FIP_DEV} ${UBOOT_FILE} +else + # install U-Boot onto the Nand Flash + kobs-ng init -x -v /tmp/${UBOOT_FILE} +fi rc=$? if [ "$rc" -ne 0 ]; then echo "u-Boot: Updating U-Boot partition failed" diff --git a/meta-digi-dey/recipes-digi/swu-images/swu.inc b/meta-digi-dey/recipes-digi/swu-images/swu.inc index 6d6933350..9aff6d212 100644 --- a/meta-digi-dey/recipes-digi/swu-images/swu.inc +++ b/meta-digi-dey/recipes-digi/swu-images/swu.inc @@ -9,13 +9,14 @@ SRC_URI = " \ file://sw-description-images_template \ file://sw-description-files_template \ file://sw-description-rdiff_template \ - file://sw-description-uboot \ file://swupdate_uboot_nand.sh \ file://swupdate_uboot_mmc.sh \ file://image_template_mmc \ file://image_template_nand \ file://image_template_rdiff_mmc \ file://image_template_rdiff_nand \ + file://file_template_uboot \ + file://script_template_uboot\ file://update_images.sh \ file://update_files.sh \ file://update_rdiff.sh \ @@ -31,8 +32,7 @@ SWUPDATE_IMAGES = " \ ${@oe.utils.ifelse(d.getVar('SWUPDATE_IS_IMAGES_UPDATE') == 'true', '${IMG_NAME}', '')} \ ${@oe.utils.ifelse(d.getVar('SWUPDATE_IS_FILES_UPDATE') == 'true', '${SWUPDATE_FILES_TARGZ_FILE_NAME}', '')} \ ${@oe.utils.ifelse(d.getVar('SWUPDATE_IS_RDIFF_UPDATE') == 'true', '${IMG_NAME} ${SWUPDATE_RDIFF_ROOTFS_DELTA_FILE_NAME}', '')} \ - ${@oe.utils.ifelse(d.getVar('SWUPDATE_UBOOTIMG') == 'true', '${UBOOT_PREFIX}', '')} \ - ${@oe.utils.ifelse(d.getVar('SWUPDATE_UBOOTIMG') == 'true', '${SWUPDATE_UBOOT_SCRIPT}', '')} \ + ${@oe.utils.ifelse(d.getVar('SWUPDATE_UBOOTIMG') == 'true', '${SWUPDATE_UBOOT_NAME} ${SWUPDATE_UBOOT_NAME_TFA} ${SWUPDATE_UBOOT_SCRIPT_NAME}', '')} \ ${SWUPDATE_SCRIPT_NAME} \ " @@ -43,8 +43,11 @@ python () { img_fstypes = img_fstypes + " " + d.getVar('ROOTFS_EXT') d.setVarFlag("SWUPDATE_IMAGES_FSTYPES", d.getVar('IMG_NAME'), img_fstypes) if (d.getVar('SWUPDATE_UBOOTIMG') == "true"): - uboot_fstypes = d.getVar('UBOOT_EXT') - d.setVarFlag("SWUPDATE_IMAGES_FSTYPES", d.getVar('UBOOT_PREFIX'), uboot_fstypes) + uboot_fstypes = d.getVar('SWUPDATE_UBOOT_EXT') + d.setVarFlag("SWUPDATE_IMAGES_FSTYPES", d.getVar('SWUPDATE_UBOOT_PREFIX'), uboot_fstypes) + if (d.getVar('DEY_SOC_VENDOR') == "STM"): + uboot_tfa_fstypes = d.getVar('SWUPDATE_UBOOT_EXT_TFA') + d.setVarFlag("SWUPDATE_IMAGES_FSTYPES", d.getVar('SWUPDATE_UBOOT_PREFIX_TFA'), uboot_tfa_fstypes) } # Execute extra tasks before creating SWU update package. @@ -65,6 +68,15 @@ python do_swuimage:prepend() { updatescript = os.path.join(workdir, updatescript) if os.path.isfile(updatescript): shutil.copyfile(updatescript, os.path.join(imgdeploydir, os.path.basename(updatescript))) + + # Copy U-Boot script file. + if d.getVar('SWUPDATE_UBOOTIMG') == "true": + uboot_updatescript = d.getVar('SWUPDATE_UBOOT_SCRIPT_NAME', True) + if "/" not in uboot_updatescript: + workdir = d.getVar('WORKDIR', True) + uboot_updatescript = os.path.join(workdir, uboot_updatescript) + if os.path.isfile(uboot_updatescript): + shutil.copyfile(uboot_updatescript, os.path.join(imgdeploydir, os.path.basename(uboot_updatescript))) } # Upgrade available. @@ -73,18 +85,7 @@ UPGRADE_AVAILABLE:ccimx6 = "1" # Create and fill 'sw-description' file. fill_description() { - if [ "${SWUPDATE_UBOOTIMG}" = "true" ]; then - cp ${WORKDIR}/sw-description-uboot ${WORKDIR}/sw-description - cp ${WORKDIR}/${SWUPDATE_UBOOT_SCRIPT} ${DEPLOY_DIR_IMAGE}/${SWUPDATE_UBOOT_SCRIPT} - if [ "${TRUSTFENCE_DEK_PATH}" != "0" ] && [ "${TRUSTFENCE_DEK_PATH}" != "default" ]; then - sed -i -e "s,##UBOOTIMG_ENC##,enc,g" "${WORKDIR}/sw-description" - else - sed -i -e "s,##UBOOTIMG_ENC##,normal,g" "${WORKDIR}/sw-description" - fi - sed -i -e "s,##UBOOTIMG_NAME##,${UBOOT_PREFIX}-${MACHINE}${UBOOT_EXT},g" "${WORKDIR}/sw-description" - sed -i -e "s,##SWUPDATE_UBOOT_SCRIPT##,${SWUPDATE_UBOOT_SCRIPT},g" "${WORKDIR}/sw-description" - sed -i -e "s,##UBOOTIMG_OFFSET##,${UBOOTIMG_OFFSET},g" "${WORKDIR}/sw-description" - elif [ "${SWUPDATE_IS_FILES_UPDATE}" = "true" ]; then + if [ "${SWUPDATE_IS_FILES_UPDATE}" = "true" ]; then cp ${WORKDIR}/sw-description-files_template ${WORKDIR}/sw-description elif [ "${SWUPDATE_IS_RDIFF_UPDATE}" = "true" ]; then cp ${WORKDIR}/sw-description-rdiff_template ${WORKDIR}/sw-description @@ -92,7 +93,45 @@ fill_description() { cp ${WORKDIR}/sw-description-images_template ${WORKDIR}/sw-description fi + # Add U-Boot sections if required. + if [ "${SWUPDATE_UBOOTIMG}" = "true" ]; then + # Add U-Boot files section. + UBOOT_FILE_TEMPLATE="file_template_uboot" + FILES_TEMPLATE="%s\n" + if [ "${DEY_SOC_VENDOR}" = "STM" ]; then + FILES_TEMPLATE="%s,\n%s\n" + fi + if [ "${SWUPDATE_IS_FILES_UPDATE}" != "true" ]; then + FILES_TEMPLATE=" files: (\n${FILES_TEMPLATE} );\n" + else + FILES_TEMPLATE=" ,\n${FILES_TEMPLATE}" + fi + if [ "${DEY_SOC_VENDOR}" = "STM" ]; then + printf "${FILES_TEMPLATE}" \ + "$(sed -e "s,##FILE_NAME##,${SWUPDATE_UBOOT_NAME},g" -e "s,##FILE_PATH##,/tmp/${SWUPDATE_UBOOT_NAME},g" "${UBOOT_FILE_TEMPLATE}")" \ + "$(sed -e "s,##FILE_NAME##,${SWUPDATE_UBOOT_NAME_TFA},g" -e "s,##FILE_PATH##,/tmp/${SWUPDATE_UBOOT_NAME_TFA},g" "${UBOOT_FILE_TEMPLATE}")" \ + > template_out.txt + else + printf "${FILES_TEMPLATE}" \ + "$(sed -e "s,##FILE_NAME##,${SWUPDATE_UBOOT_NAME},g" -e "s,##FILE_PATH##,/tmp/${SWUPDATE_UBOOT_NAME},g" "${UBOOT_FILE_TEMPLATE}")" \ + > template_out.txt + fi + sed -i -e "/##FILES_UBOOT##/r template_out.txt" -e "/##FILES_UBOOT##/d" "${WORKDIR}/sw-description" + + # Add U-Boot script section. + UBOOT_SCRIPT_TEMPLATE="script_template_uboot" + printf " ,\n%s\n" \ + "$(cat "${UBOOT_SCRIPT_TEMPLATE}")" \ + > template_out.txt + sed -i -e "/##SCRIPT_UBOOT##/r template_out.txt" -e "/##SCRIPT_UBOOT##/d" "${WORKDIR}/sw-description" + else + # Remove U-Boot entries if U-Boot is not being updated. + sed -i -e "s,##FILES_UBOOT##,,g" "${WORKDIR}/sw-description" + sed -i -e "s,##SCRIPT_UBOOT##,,g" "${WORKDIR}/sw-description" + fi + if [ "${SWUPDATE_IS_FILES_UPDATE}" = "true" ]; then + rm -f template_out.txt return 0 fi @@ -111,23 +150,23 @@ fill_description() { printf "%s,\n%s\n" \ "$(sed -e "s,##IMG_NAME##,${BOOT_IMAGE_NAME},g" -e "s,##DEV##,${BOOT_DEV_NAME_A},g" -e "/compressed/d" "${BOOT_IMAGE_TEMPLATE}")" \ "$(sed -e "s,##IMG_NAME##,${ROOTFS_IMAGE_NAME},g" -e "s,##DEV##,${ROOTFS_DEV_NAME_A},g" "${ROOTFS_IMAGE_TEMPLATE}")" \ - > images_temp.txt - sed -i -e "/##IMAGES_PRIMARY##/r images_temp.txt" -e "/##IMAGES_PRIMARY##/d" "${WORKDIR}/sw-description" + > template_out.txt + sed -i -e "/##IMAGES_PRIMARY##/r template_out.txt" -e "/##IMAGES_PRIMARY##/d" "${WORKDIR}/sw-description" # Add secondary bank images section for dual boot systems. printf "%s,\n%s\n" \ "$(sed -e "s,##IMG_NAME##,${BOOT_IMAGE_NAME},g" -e "s,##DEV##,${BOOT_DEV_NAME_B},g" -e "/compressed/d" "${BOOT_IMAGE_TEMPLATE}")" \ "$(sed -e "s,##IMG_NAME##,${ROOTFS_IMAGE_NAME},g" -e "s,##DEV##,${ROOTFS_DEV_NAME_B},g" "${ROOTFS_IMAGE_TEMPLATE}")" \ - > images_temp.txt - sed -i -e "/##IMAGES_SECONDARY##/r images_temp.txt" -e "/##IMAGES_SECONDARY##/d" "${WORKDIR}/sw-description" + > template_out.txt + sed -i -e "/##IMAGES_SECONDARY##/r template_out.txt" -e "/##IMAGES_SECONDARY##/d" "${WORKDIR}/sw-description" # Add images section for single boot systems. if [ "${SWUPDATE_IS_RDIFF_UPDATE}" != "true" ]; then printf "%s,\n%s\n" \ "$(sed -e "s,##IMG_NAME##,${BOOT_IMAGE_NAME},g" -e "s,##DEV##,${BOOT_DEV_NAME},g" -e "/compressed/d" "${BOOT_IMAGE_TEMPLATE}")" \ "$(sed -e "s,##IMG_NAME##,${ROOTFS_IMAGE_NAME},g" -e "s,##DEV##,${ROOTFS_DEV_NAME_FINAL},g" "${ROOTFS_IMAGE_TEMPLATE}")" \ - > images_temp.txt - sed -i -e "/##IMAGES_SINGLE##/r images_temp.txt" -e "/##IMAGES_SINGLE##/d" "${WORKDIR}/sw-description" + > template_out.txt + sed -i -e "/##IMAGES_SINGLE##/r template_out.txt" -e "/##IMAGES_SINGLE##/d" "${WORKDIR}/sw-description" fi # Remove 'compressed' flag for read-only file systems as they use 'squashfs' images. @@ -136,7 +175,7 @@ fill_description() { fi # Clean dir. - rm -f images_temp.txt + rm -f template_out.txt } fill_description[dirs] = "${DEPLOY_DIR_IMAGE} ${WORKDIR}" do_unpack[postfuncs] += "fill_description" From 56219a7e59175983f4c8f185e3c150b60b214f18 Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Fri, 1 Dec 2023 12:11:36 +0100 Subject: [PATCH 065/118] conf: machine: remove BOOTLOADER_SEEK_OFFSET This commit removes the BOOTLOADER_SEEK_OFFSER, because it has been moved into the swupdate class and renamed into SWUPDATE_UBOOT_OFFSET. Signed-off-by: Mike Engel --- meta-digi-arm/conf/machine/ccimx6qpsbc.conf | 2 -- meta-digi-arm/conf/machine/ccimx6sbc.conf | 2 -- meta-digi-arm/conf/machine/ccimx8mm-dvk.conf | 1 - meta-digi-arm/conf/machine/ccimx8mn-dvk.conf | 1 - meta-digi-arm/conf/machine/ccimx93-dvk.conf | 1 - meta-digi-arm/conf/machine/include/ccimx8x.inc | 2 -- meta-digi-arm/conf/machine/include/ccmp1.inc | 3 --- 7 files changed, 12 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccimx6qpsbc.conf b/meta-digi-arm/conf/machine/ccimx6qpsbc.conf index 54cdcbd6e..d60abb183 100644 --- a/meta-digi-arm/conf/machine/ccimx6qpsbc.conf +++ b/meta-digi-arm/conf/machine/ccimx6qpsbc.conf @@ -26,8 +26,6 @@ UBOOT_CONFIG ??= "ccimx6qpsbc1GB ccimx6qpsbc2GB" UBOOT_CONFIG[ccimx6qpsbc1GB] = "ccimx6qpsbc1GB_defconfig,,u-boot-dtb.${UBOOT_SUFFIX}" UBOOT_CONFIG[ccimx6qpsbc2GB] = "ccimx6qpsbc2GB_defconfig,,u-boot-dtb.${UBOOT_SUFFIX}" -BOOTLOADER_SEEK_BOOT = "1" - KERNEL_DEVICETREE ?= " \ imx6qp-ccimx6qpsbc.dtb \ imx6qp-ccimx6qpsbc-id160.dtb \ diff --git a/meta-digi-arm/conf/machine/ccimx6sbc.conf b/meta-digi-arm/conf/machine/ccimx6sbc.conf index e116cf8b2..047e49770 100644 --- a/meta-digi-arm/conf/machine/ccimx6sbc.conf +++ b/meta-digi-arm/conf/machine/ccimx6sbc.conf @@ -24,8 +24,6 @@ UBOOT_CONFIG[ccimx6qsbc2GB] = "ccimx6qsbc2GB_defconfig,,u-boot-dtb.${UBOOT_SUFFI UBOOT_CONFIG[ccimx6qsbc512MB] = "ccimx6qsbc512MB_defconfig,,u-boot-dtb.${UBOOT_SUFFIX}" UBOOT_CONFIG[ccimx6qsbc] = "ccimx6qsbc_defconfig,,u-boot-dtb.${UBOOT_SUFFIX}" -BOOTLOADER_SEEK_BOOT = "1" - KERNEL_DEVICETREE ?= " \ imx6dl-ccimx6sbc.dtb \ imx6dl-ccimx6sbc-w.dtb \ diff --git a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf index b10dd1dd5..2e768c95f 100644 --- a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf @@ -9,7 +9,6 @@ MACHINEOVERRIDES =. "mx8:mx8m:mx8mm:${DIGI_FAMILY}:${DIGI_SOM}:" include conf/machine/include/ccimx8m.inc BOOTLOADER_SEEK_USERDATA = "33" -BOOTLOADER_SEEK_BOOT = "0" # U-Boot configurations # diff --git a/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf index d845609f0..8cadc00e3 100644 --- a/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf @@ -9,7 +9,6 @@ MACHINEOVERRIDES =. "mx8:mx8m:mx8mn:${DIGI_FAMILY}:${DIGI_SOM}:" include conf/machine/include/ccimx8m.inc BOOTLOADER_SEEK_USERDATA = "32" -BOOTLOADER_SEEK_BOOT = "0" # U-Boot configurations # diff --git a/meta-digi-arm/conf/machine/ccimx93-dvk.conf b/meta-digi-arm/conf/machine/ccimx93-dvk.conf index 858dc075e..018e08afb 100644 --- a/meta-digi-arm/conf/machine/ccimx93-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx93-dvk.conf @@ -13,7 +13,6 @@ UBOOT_CONFIG[ccimx93-dvk] = "ccimx93-dvk_defconfig" UBOOT_DTB_NAME = "ccimx93-dvk.dtb" BOOTLOADER_SEEK_USERDATA = "32" -BOOTLOADER_SEEK_BOOT = "0" KERNEL_DEVICETREE ?= " \ digi/ccimx93-dvk.dtb \ diff --git a/meta-digi-arm/conf/machine/include/ccimx8x.inc b/meta-digi-arm/conf/machine/include/ccimx8x.inc index 000cc3834..36f9c1bfb 100644 --- a/meta-digi-arm/conf/machine/include/ccimx8x.inc +++ b/meta-digi-arm/conf/machine/include/ccimx8x.inc @@ -18,8 +18,6 @@ EXTRA_IMAGEDEPENDS += "imx-boot" BOOTLOADER_IMAGE_RECIPE = "imx-boot" # BOOTLOADER_SEEK_USERDATA is 33 for step A of the silicon and 32 for step B BOOTLOADER_SEEK_USERDATA = "32" -# BOOTLOADER_SEEK_BOOT is 32 for step B of silicon and 0 for step C -BOOTLOADER_SEEK_BOOT ?= "0" BOOTABLE_FILENAME = "${UBOOT_PREFIX}-${MACHINE}.bin" SDIMG_BOOTLOADER = "${DEPLOY_DIR_IMAGE}/${BOOTABLE_FILENAME}" diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index 484b798df..0189ba36b 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -80,6 +80,3 @@ UBOOT_ENV = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'boot', '', d)}" # Partitions to blacklist for swupdate: # fsbl1, fsbl2, metadata1, metadata2, fip-a, fip-b SWUPDATE_MTD_BLACKLIST = "0 1 2 3 4 5" - -# Bootloader Flash offset -BOOTLOADER_SEEK_BOOT = "0" From aa2480d1de9c22d982f5a958b4cadf621ba5f9fb Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Fri, 1 Dec 2023 12:24:11 +0100 Subject: [PATCH 066/118] images: add imx-kobs support to recovery image Signed-off-by: Mike Engel --- .../recipes-core/images/dey-image-recovery-initramfs.bb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb b/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb index 32d04995a..dede00cc7 100644 --- a/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb +++ b/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2016-2020, Digi International Inc. +# Copyright (C) 2016-2023, Digi International Inc. DESCRIPTION = "Recovery initramfs image" LICENSE = "MIT" @@ -13,6 +13,7 @@ PACKAGE_INSTALL = " \ swupdate \ trustfence-tool \ wipe \ + ${@bb.utils.contains('DEY_SOC_VENDOR', 'NXP', bb.utils.contains('STORAGE_MEDIA', 'mtd', 'imx-kobs', '', d), '', d)} \ " # Do not pollute the initrd image with rootfs features From bfbe078a3fe038eb98bd1e1af4bfda28c9f6827e Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Wed, 13 Dec 2023 16:14:39 +0100 Subject: [PATCH 067/118] linux-dey: ccmp1: rework defconfig logic to avoid using defualt defconfig Commit d3f3cfdb6274f70146f351717b583990ea8bb1e0 removed the inclusion of STM's linux-stm32mp.inc from meta-st-stm32mp in our linux-dey recipe, but this inadvertently removed the logic in do_configure() necessary to use our custom ccmp1_defconfig. Since this commit, the kernel was being built with the default ARM defconfig, which is very different from our custom defconfig and doesn't even boot on MP1 platforms. Rework the logic used to copy our platform's defconfigs to prevent this. Signed-off-by: Gabriel Valcazar --- meta-digi-arm/conf/machine/ccmp13-dvk.conf | 3 +-- meta-digi-arm/conf/machine/ccmp15-dvk.conf | 3 +-- meta-digi-arm/recipes-kernel/linux/linux-dey.inc | 8 +++++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccmp13-dvk.conf b/meta-digi-arm/conf/machine/ccmp13-dvk.conf index 108ae839e..814f87227 100644 --- a/meta-digi-arm/conf/machine/ccmp13-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp13-dvk.conf @@ -112,8 +112,7 @@ OPTEE_CONF = "ccmp13-dvk" KERNEL_IMAGETYPE = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'fitImage', 'zImage', d)}" KERNEL_CLASSES = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'kernel-fitimage', 'kernel-uimage', d)}" KERNEL_ALT_IMAGETYPE = "Image vmlinux" -KERNEL_DEFCONFIG ?= "ccmp1_defconfig" -KERNEL_EXTERNAL_DEFCONFIG ?= "defconfig" +KERNEL_DEFCONFIG ?= "arch/arm/configs/ccmp1_defconfig" # ========================================================================= # DEY settings diff --git a/meta-digi-arm/conf/machine/ccmp15-dvk.conf b/meta-digi-arm/conf/machine/ccmp15-dvk.conf index fd5cba720..1dc9362cf 100644 --- a/meta-digi-arm/conf/machine/ccmp15-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp15-dvk.conf @@ -120,8 +120,7 @@ OPTEE_CONF = "ccmp15-dvk" KERNEL_IMAGETYPE = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'fitImage', 'zImage', d)}" KERNEL_CLASSES = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'kernel-fitimage', 'kernel-uimage', d)}" KERNEL_ALT_IMAGETYPE = "Image vmlinux" -KERNEL_DEFCONFIG ?= "ccmp1_defconfig" -KERNEL_EXTERNAL_DEFCONFIG ?= "defconfig" +KERNEL_DEFCONFIG ?= "arch/arm/configs/ccmp1_defconfig" # ========================================================================= # DEY settings diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc index 95f25cbfe..afda6fa1e 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc @@ -46,7 +46,13 @@ do_copy_defconfig () { cp -f ${KERNEL_DEFCONFIG} ${WORKDIR}/defconfig fi } -addtask copy_defconfig after do_patch before do_kernel_localversion + +python () { + if d.getVar('DEY_SOC_VENDOR') == "STM": + bb.build.addtask('copy_defconfig', 'do_configure', 'do_patch', d) + elif d.getVar('DEY_SOC_VENDOR') == "NXP": + bb.build.addtask('copy_defconfig', 'do_kernel_localversion', 'do_patch', d) +} # This is needed because kernel_localversion (in fsl-kernel-localversion.bbclass) # creates a basic ${B}/.config file and because that file exists, kernel_do_configure From 85a659dd11fa96a8762d638bc62245fbf0498fcf Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Fri, 15 Dec 2023 12:14:27 +0100 Subject: [PATCH 068/118] Revert "mp1: cmsis-svd: switch from master branch to main branch" Fixed via commit 311a492c21f0f3643f4b764f8b743c4c6908d31b in meta-st-stm32mp This reverts commit 09c46458948927e61aef27f87bbbb780c1f56db7. Signed-off-by: Gabriel Valcazar --- .../recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 meta-digi-dey/dynamic-layers/stm-st-stm32mp/recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend diff --git a/meta-digi-dey/dynamic-layers/stm-st-stm32mp/recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend b/meta-digi-dey/dynamic-layers/stm-st-stm32mp/recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend deleted file mode 100644 index c8888b330..000000000 --- a/meta-digi-dey/dynamic-layers/stm-st-stm32mp/recipes-devtools/cmsis-svd/cmsis-svd_git.bbappend +++ /dev/null @@ -1,4 +0,0 @@ -# "master" branch was renamed to "main", which causes do_fetch() to fail. -# Reflect this in SRC_URI. -SRC_URI:remove = "git://github.com/posborne/cmsis-svd.git;protocol=https;branch=master" -SRC_URI:append = " git://github.com/posborne/cmsis-svd.git;protocol=https;branch=main" From 90afd7025c041cfa3f689e8c0af58c72a4100d4b Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Wed, 20 Dec 2023 13:44:08 +0100 Subject: [PATCH 069/118] recovery-initramfs: fix multi-MTD detection when formatting NAND partitions Commit 7e81e706a19a9f7e222bbde2431f22275c83476c modified the logic used to determine if a NAND is using multi-MTD or single-MTD, but single quotes were used in the grep pattern, which prevents the variable inside from expanding. This makes the script always enter the single-MTD code path, even in multi-MTD systems, which breaks partition formatting in these cases. Replace the single quotes with double quotes so the variable can expand and the condition can be properly checked. https://onedigi.atlassian.net/browse/DEL-8773 Signed-off-by: Gabriel Valcazar --- .../recovery/recovery-initramfs/recovery-initramfs-init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-dey/recipes-core/recovery/recovery-initramfs/recovery-initramfs-init b/meta-digi-dey/recipes-core/recovery/recovery-initramfs/recovery-initramfs-init index 59d0e995d..0e64cf8c5 100644 --- a/meta-digi-dey/recipes-core/recovery/recovery-initramfs/recovery-initramfs-init +++ b/meta-digi-dey/recipes-core/recovery/recovery-initramfs/recovery-initramfs-init @@ -233,7 +233,7 @@ format_ubi_volume() { # If the system is a multi-MTD, there must be an MTD partition by the # same name as the UBI volume - result="$(grep '\"${1}\"$' /proc/mtd)" + result="$(grep "\"${1}\"$" /proc/mtd)" if [ -n "${result}" ]; then # Find the MTD partition. local mtd_num="$(sed -ne "s/mtd\([0-9]\+\):.*\<${1}\>.*/\1/g;T;p" /proc/mtd 2>/dev/null)" From f67294adfbd7bc4bfc1a5b6b8f085fc7c771c5a0 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 12 Dec 2023 17:37:16 +0100 Subject: [PATCH 070/118] ccimx93: iw61x: update package for NXP release 6.1.55-2.2.0 Signed-off-by: Isaac Hermida --- .../recipes-bsp/firmware-imx/firmware-nxp-wifi_%.bbappend | 6 +++--- .../recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi_%.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi_%.bbappend index 85f1a07b6..ec08272f9 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi_%.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-nxp-wifi_%.bbappend @@ -1,9 +1,9 @@ # Copyright (C) 2023 Digi International. -LIC_FILES_CHKSUM:ccimx93 = "file://LICENSE.txt;md5=db4762b09b6bda63da103963e6e081de" +LIC_FILES_CHKSUM:ccimx93 = "file://LICENSE.txt;md5=2827219e81f28aba7c6a569f7c437fa7" -SRCBRANCH:ccimx93 = "lf-6.1.36_2.1.0" -SRCREV:ccimx93 = "1fb80d0266e8044fb7eea695c7678cddcbbc77c5" +SRCBRANCH:ccimx93 = "lf-6.1.55_2.2.0" +SRCREV:ccimx93 = "7be5a936ce8677962dd7b41c6c9f41dd14350bec" do_install:append:ccimx93() { # Install NXP Connectivity IW612 firmware diff --git a/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc b/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc index b4a2fa73c..8396ae402 100644 --- a/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc +++ b/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/nxp-wlan-sdk_git.inc @@ -3,10 +3,10 @@ LICENSE = "GPL-2.0-only" LIC_FILES_CHKSUM = "file://${WORKDIR}/git/LICENSE;md5=ab04ac0f249af12befccb94447c08b77" # For Kernel 5.4 and later -SRCBRANCH = "lf-6.1.36_2.1.0" +SRCBRANCH = "lf-6.1.55_2.2.0" MRVL_SRC ?= "git://github.com/nxp-imx/mwifiex.git;protocol=https" SRC_URI = "${MRVL_SRC};branch=${SRCBRANCH}" -SRCREV = "26246bf60afa613272156fa268e4ff99f5d810ae" +SRCREV = "952d10f3349426f917636a4560974117eb6eef5b" S = "${WORKDIR}/git/mxm_wifiex/wlan_src" From 925b618e63af653152e1f6f949698a1834d7388b Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 20 Dec 2023 09:43:25 +0100 Subject: [PATCH 071/118] linux-dey: update to NXP's lf-6.1.55-2.2.0 release for ccimx93 Signed-off-by: Isaac Hermida --- meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb index a59f73672..794b7d441 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb @@ -2,7 +2,7 @@ require recipes-kernel/linux/linux-dey.inc -SRCBRANCH = "v6.1.36/nxp/master" +SRCBRANCH = "v6.1.55/nxp/master" SRCREV = "${AUTOREV}" # Blacklist btnxpuart module. It will be managed by the bluetooth-init script From a22d21ab843b35d398de5373f4f62c3252108ee6 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Tue, 26 Dec 2023 12:40:39 +0100 Subject: [PATCH 072/118] dey.conf: continue using stable versions of swupdate and libubootenv meta-swupdate recently added support for swupdate 2023.12 and libubootenv 0.3.5. This upgrade conflicts with our custom functionality in both packages, so keep using 2023.05 and 0.3.2 respectively so DEY 4.0 can be built without introducing possible functionality changes. Signed-off-by: Gabriel Valcazar --- meta-digi-dey/conf/distro/dey.conf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index c00ed9173..5f28ef0ce 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -57,6 +57,13 @@ FEATURE_PACKAGES_dey-wireless = "packagegroup-dey-wireless" # 5.65 version should be used, which is provided by the poky layer. PREFERRED_VERSION_bluez5 ?= "5.65" +# The latest available versions of swupdate and libubootenv are 2023.12 and +# 0.3.5, respectively. However, our custom patches haven't been ported or +# tested for these versions yet, so until then, continue using the versions +# we've been using in DEY 4.0 (2023.05 and 0.3.2) to guarantee stability. +PREFERRED_VERSION_swupdate ?= "2023.05" +PREFERRED_VERSION_libubootenv ?= "0.3.2" + # There's a generic opencl-headers recipe in the thud branch of # meta-openembedded, but we should use the package provided by the imx-gpu-viv # recipe in case there are NXP-specific changes in it From e02108dce5309154f215dcc45554951af639b832 Mon Sep 17 00:00:00 2001 From: Hector Bujanda Date: Fri, 29 Dec 2023 11:42:48 +0100 Subject: [PATCH 073/118] ccmp15: add DT overlay for Cortex-M4 RemoteProc https://onedigi.atlassian.net/browse/DEL-8823 Signed-off-by: Hector Bujanda --- meta-digi-arm/conf/machine/ccmp15-dvk.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-digi-arm/conf/machine/ccmp15-dvk.conf b/meta-digi-arm/conf/machine/ccmp15-dvk.conf index 1dc9362cf..53173a2a4 100644 --- a/meta-digi-arm/conf/machine/ccmp15-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp15-dvk.conf @@ -52,6 +52,7 @@ STM32MP_KERNEL_DEVICETREE:ccmp15-dvk += " \ _ov_board_v2_ccmp15-dvk.dtbo \ _ov_som_bt_ccmp15.dtbo \ _ov_som_bt_test_ccmp15.dtbo \ + _ov_som_m4_ccmp15.dtbo \ _ov_som_mca_ccmp15.dtbo \ _ov_som_wifi_ccmp15.dtbo \ " From 32e46e4f9b6ac10283b32e32ac11a5bf8081f075 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Wed, 27 Dec 2023 16:57:02 +0100 Subject: [PATCH 074/118] swupdate: change runtime config file suffix to avoid build-time config errors We were using the .cfg suffix for both the build-time config fragments and the runtime configuration file. During do_configure(), all files in SRC_URI ending in .cfg were being merged together to create the final build configuration, including said runtime file, which has a completely different syntax. In most cases, the contents of this file were being ignored, but when tweaking swupdate's configuration and re-building the package, sometimes strange errors would prevent the build from finishing. Change the runtime file's suffix entirely to separate it from the config fragments and prevent it from being treated as such, and reflect the name change in the defconfig and the recovery script. Signed-off-by: Gabriel Valcazar --- .../recovery/recovery-initramfs/recovery-initramfs-init | 2 +- meta-digi-dey/recipes-support/swupdate/swupdate/defconfig | 2 +- .../swupdate/swupdate/{swupdate.cfg => swupdate.config} | 0 .../recipes-support/swupdate/swupdate_%.bbappend | 8 ++++---- 4 files changed, 6 insertions(+), 6 deletions(-) rename meta-digi-dey/recipes-support/swupdate/swupdate/{swupdate.cfg => swupdate.config} (100%) diff --git a/meta-digi-dey/recipes-core/recovery/recovery-initramfs/recovery-initramfs-init b/meta-digi-dey/recipes-core/recovery/recovery-initramfs/recovery-initramfs-init index 0e64cf8c5..1bde325b3 100644 --- a/meta-digi-dey/recipes-core/recovery/recovery-initramfs/recovery-initramfs-init +++ b/meta-digi-dey/recipes-core/recovery/recovery-initramfs/recovery-initramfs-init @@ -20,7 +20,7 @@ ENV_BOOT_RECOVERY="boot_recovery" ENV_RECOVERY_COMMAND="recovery_command" -SW_CONFIG="/etc/swupdate.cfg" +SW_CONFIG="/etc/swupdate.config" PUBLIC_KEY="/etc/ssl/certs/key.pub" USB_MOUNT_DIR="/run/media" diff --git a/meta-digi-dey/recipes-support/swupdate/swupdate/defconfig b/meta-digi-dey/recipes-support/swupdate/swupdate/defconfig index 8b52b25d9..464fe703f 100644 --- a/meta-digi-dey/recipes-support/swupdate/swupdate/defconfig +++ b/meta-digi-dey/recipes-support/swupdate/swupdate/defconfig @@ -14,7 +14,7 @@ # CONFIG_CURL_SSL is not set # CONFIG_DISKFORMAT is not set # CONFIG_SYSTEMD is not set -CONFIG_DEFAULT_CONFIG_FILE="/etc/swupdate.cfg" +CONFIG_DEFAULT_CONFIG_FILE="/etc/swupdate.config" CONFIG_SCRIPTS=y # CONFIG_HW_COMPATIBILITY is not set CONFIG_SW_VERSIONS_FILE="/etc/sw-versions" diff --git a/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg b/meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.config similarity index 100% rename from meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.cfg rename to meta-digi-dey/recipes-support/swupdate/swupdate/swupdate.config diff --git a/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend b/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend index acf5d6dd0..2e3b33e6c 100644 --- a/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend +++ b/meta-digi-dey/recipes-support/swupdate/swupdate_%.bbappend @@ -12,7 +12,7 @@ SRC_URI += " \ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'file://systemd.cfg', '', d)} \ ${@bb.utils.contains('STORAGE_MEDIA', 'mtd', 'file://mtd.cfg', '', d)} \ ${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'file://signed_images.cfg', '', d)} \ - file://swupdate.cfg \ + file://swupdate.config \ " do_install:append() { @@ -22,16 +22,16 @@ do_install:append() { # Copy config file install -d ${D}${sysconfdir}/ - install -m 0755 ${WORKDIR}/swupdate.cfg ${D}${sysconfdir} + install -m 0755 ${WORKDIR}/swupdate.config ${D}${sysconfdir} # Add MTD blacklist if ${@oe.utils.conditional('STORAGE_MEDIA', 'mtd', 'true', 'false', d)}; then - sed -i "s,\(^\s*\)#mtd-blacklist,\1mtd-blacklist = \"${SWUPDATE_MTD_BLACKLIST}\",g" ${D}${sysconfdir}/swupdate.cfg + sed -i "s,\(^\s*\)#mtd-blacklist,\1mtd-blacklist = \"${SWUPDATE_MTD_BLACKLIST}\",g" ${D}${sysconfdir}/swupdate.config fi # Add public-key-file setting to config file if TrustFence is enabled if ${@oe.utils.conditional('TRUSTFENCE_ENABLED', '1', 'true', 'false', d)}; then - sed -i "s,\(^\s*\)#public-key-file,\1public-key-file = \"${sysconfdir}/ssl/certs/key.pub\",g" ${D}${sysconfdir}/swupdate.cfg + sed -i "s,\(^\s*\)#public-key-file,\1public-key-file = \"${sysconfdir}/ssl/certs/key.pub\",g" ${D}${sysconfdir}/swupdate.config fi } From 20809e6cbf84e3e5c1e9baba431e86b96687060a Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 2 Jan 2024 17:08:49 +0100 Subject: [PATCH 075/118] imx-boot-firmware: update to NXP's lf-6.1.55-2.2.0 release for ccimx93 This includes also an update and rename of the Edgelock Enclave firmware package (firmware-ele-imx). Signed-off-by: Javier Viguera --- meta-digi-arm/conf/layer.conf | 2 ++ meta-digi-arm/conf/machine/include/imx-digi-base.inc | 2 +- .../firmware-ele-imx_0.1.0.bb} | 10 +++++----- ...e-imx-9_8.21.bb => imx-boot-firmware-files_8.22.bb} | 6 +++--- 4 files changed, 11 insertions(+), 9 deletions(-) rename meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/{firmware-sentinel/firmware-sentinel_0.11.bb => firmware-imx/firmware-ele-imx_0.1.0.bb} (68%) rename meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/{firmware-imx-9_8.21.bb => imx-boot-firmware-files_8.22.bb} (76%) diff --git a/meta-digi-arm/conf/layer.conf b/meta-digi-arm/conf/layer.conf index 3815c3cf1..415dc41df 100644 --- a/meta-digi-arm/conf/layer.conf +++ b/meta-digi-arm/conf/layer.conf @@ -29,10 +29,12 @@ LAYERSERIES_COMPAT_digi-arm = "kirkstone" FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V42 = "ea25d099982d035af85d193c88a1b479" FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V45 = "63a38e9f392d8813d6f1f4d0d6fbe657" FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V48 = "db4762b09b6bda63da103963e6e081de" +FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V49 = "2827219e81f28aba7c6a569f7c437fa7" FSL_EULA_FILE_MD5SUMS:append = " \ ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V42} \ ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V45} \ ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V48} \ + ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V49} \ " # STM EULA diff --git a/meta-digi-arm/conf/machine/include/imx-digi-base.inc b/meta-digi-arm/conf/machine/include/imx-digi-base.inc index 5694fb36f..a887b222a 100644 --- a/meta-digi-arm/conf/machine/include/imx-digi-base.inc +++ b/meta-digi-arm/conf/machine/include/imx-digi-base.inc @@ -188,7 +188,7 @@ IMX_EXTRA_FIRMWARE ?= "" IMX_EXTRA_FIRMWARE:mx8-generic-bsp = "firmware-imx-8 imx-sc-firmware imx-seco" IMX_EXTRA_FIRMWARE:mx8m-generic-bsp = "firmware-imx-8m" IMX_EXTRA_FIRMWARE:mx8x-generic-bsp = "imx-sc-firmware imx-seco" -IMX_EXTRA_FIRMWARE:mx93-generic-bsp = "firmware-imx-9 firmware-sentinel" +IMX_EXTRA_FIRMWARE:mx93-generic-bsp = "imx-boot-firmware-files firmware-ele-imx" # Firmware MACHINE_FIRMWARE ?= "" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.11.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-ele-imx_0.1.0.bb similarity index 68% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.11.bb rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-ele-imx_0.1.0.bb index e965e06e2..52beb9e36 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-sentinel/firmware-sentinel_0.11.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-ele-imx_0.1.0.bb @@ -1,15 +1,15 @@ # Copyright 2021-2023 NXP -SUMMARY = "NXP i.MX Sentinel firmware" -DESCRIPTION = "Firmware for i.MX Sentinel Security Controller" +SUMMARY = "NXP i.MX ELE firmware" +DESCRIPTION = "EdgeLock Enclave firmware for i.MX series SoCs" SECTION = "base" LICENSE = "Proprietary" -LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" +LIC_FILES_CHKSUM = "file://COPYING;md5=2827219e81f28aba7c6a569f7c437fa7" inherit fsl-eula-unpack use-imx-security-controller-firmware deploy SRC_URI = "${FSL_MIRROR}/${BP}.bin;fsl-eula=true" -SRC_URI[md5sum] = "339011b6b199151d835c03089a3c2221" -SRC_URI[sha256sum] = "269480417a8ae9aa4cc4101ab947287fc33455a931021dbdc4d9badb5212bceb" +SRC_URI[md5sum] = "7532c2e356574c1c9255c01169d38427" +SRC_URI[sha256sum] = "4a0440168d8dfb95989a17be8fafb149589e110e7d4518e5e8a33463dfb5e5ca" do_compile[noexec] = "1" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.21.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/imx-boot-firmware-files_8.22.bb similarity index 76% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.21.bb rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/imx-boot-firmware-files_8.22.bb index 640979924..177bbe245 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-imx-9_8.21.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/imx-boot-firmware-files_8.22.bb @@ -9,9 +9,9 @@ DESCRIPTION = "Freescale i.MX firmware for i.MX 9 family" # require recipes-bsp/firmware-imx/firmware-imx-${PV}.inc require recipes-bsp/firmware-imx/firmware-imx-8.18.inc -LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" -SRC_URI[md5sum] = "48b9e116280d752f1696dc36b08b07da" -SRC_URI[sha256sum] = "c3447f0f813415ccea9dc2ef12080cb3ac8bbc0c67392a74fc7d59205eb5a672" +LIC_FILES_CHKSUM = "file://COPYING;md5=2827219e81f28aba7c6a569f7c437fa7" +SRC_URI[md5sum] = "c5cf3842569f0a7fd990fbc64979e84f" +SRC_URI[sha256sum] = "94c8bceac56ec503c232e614f77d6bbd8e17c7daa71d4e651ea8fd5034c30350" inherit deploy nopackages From 9eefe059793fbf08b0d25b6f96896f0985bb973b Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 2 Jan 2024 17:09:19 +0100 Subject: [PATCH 076/118] imx-atf: update to NXP's lf-6.1.55-2.2.0 release for ccimx93 Signed-off-by: Javier Viguera --- ...=> 0001-ccimx93-use-UART6-for-the-default-console.patch} | 0 ...93-bring-back-ELE-clock-workaround-for-soc-revisi.patch} | 6 +++--- .../freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend | 4 ++-- .../freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/{0005-ccimx93-use-UART6-for-the-default-console.patch => 0001-ccimx93-use-UART6-for-the-default-console.patch} (100%) rename meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/{0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch => 0002-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch} (91%) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0005-ccimx93-use-UART6-for-the-default-console.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-ccimx93-use-UART6-for-the-default-console.patch similarity index 100% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0005-ccimx93-use-UART6-for-the-default-console.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-ccimx93-use-UART6-for-the-default-console.patch diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch similarity index 91% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch index d3f1fc80c..31d1aa891 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch @@ -12,10 +12,10 @@ Signed-off-by: Javier Viguera 2 files changed, 14 insertions(+) diff --git a/plat/imx/imx93/imx93_psci.c b/plat/imx/imx93/imx93_psci.c -index 0fd2bb7802df..461801afb126 100644 +index 6a21ee970079..b9c4e0a1752b 100644 --- a/plat/imx/imx93/imx93_psci.c +++ b/plat/imx/imx93/imx93_psci.c -@@ -783,6 +783,11 @@ void imx_pwr_domain_suspend(const psci_power_state_t *target_state) +@@ -794,6 +794,11 @@ void imx_pwr_domain_suspend(const psci_power_state_t *target_state) } else { write_clusterpwrdn(DSU_CLUSTER_PWR_OFF); } @@ -27,7 +27,7 @@ index 0fd2bb7802df..461801afb126 100644 } if (is_local_state_retn(SYSTEM_PWR_STATE(target_state))) { -@@ -902,6 +907,11 @@ void imx_pwr_domain_suspend_finish(const psci_power_state_t *target_state) +@@ -924,6 +929,11 @@ void imx_pwr_domain_suspend_finish(const psci_power_state_t *target_state) mmio_write_32(IMX_GPC_BASE + A55C0_CMC_OFFSET + 0x800 * 2 + CM_MODE_CTRL, CM_MODE_RUN); /* clear L3 retention */ mmio_clrbits_32(IMX_SRC_BASE + A55C0_MEM + 0x400 * 3 + 0x4, MEM_LP_RETENTION); diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend index ced0c15a8..91dd55397 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend @@ -9,8 +9,8 @@ SRC_URI:append:ccimx8m = " \ file://0004-imx8mn-Disable-M7-debug-console.patch \ " SRC_URI:append:ccimx93 = " \ - file://0005-ccimx93-use-UART6-for-the-default-console.patch \ - file://0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch \ + file://0001-ccimx93-use-UART6-for-the-default-console.patch \ + file://0002-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch \ " BOOT_TOOLS = "imx-boot-tools" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb index 162111c5b..96ea44870 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_2.8.bb @@ -7,7 +7,7 @@ require recipes-bsp/imx-atf/imx-atf_2.6.bb SRC_URI = "git://github.com/nxp-imx/imx-atf.git;protocol=https;branch=${SRCBRANCH}" SRCBRANCH = "lf_v2.8" -# Tag: lf-6.1.36-2.1.0 -SRCREV = "1a3beeab6484343a4bd0ee08e947d142db4a5ae6" +# Tag: lf-6.1.55-2.2.0 +SRCREV = "08e9d4eef2262c0dd072b4325e8919e06d349e02" COMPATIBLE_MACHINE = "(ccimx93)" From 4566b1075187e158dc7942c06771642635069553 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 2 Jan 2024 17:09:49 +0100 Subject: [PATCH 077/118] imx-boot, imx-mkimage: update to NXP's lf-6.1.55-2.2.0 release for ccimx93 Signed-off-by: Javier Viguera --- ...ture-commands-output-into-a-log-file.patch | 40 ++++++++++--------- ...-makefile-target-to-build-A0-revisio.patch | 29 ++++++-------- .../imx-mkimage/imx-boot_1.0.bbappend | 6 +-- .../imx-mkimage/imx-mkimage_git.bbappend | 8 ++-- 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch index 9668a97fd..f8606fb4b 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch @@ -11,7 +11,7 @@ Signed-off-by: Javier Viguera 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iMX9/soc.mak b/iMX9/soc.mak -index 6d4613dd7d92..97e311059df8 100644 +index b17db6b7ca8c..c4bcac4e42cd 100644 --- a/iMX9/soc.mak +++ b/iMX9/soc.mak @@ -1,4 +1,5 @@ @@ -20,26 +20,30 @@ index 6d4613dd7d92..97e311059df8 100644 CC ?= gcc REV ?= A0 -@@ -98,7 +99,7 @@ u-boot-atf-container.img: bl31.bin u-boot-hash.bin - fi; \ - else \ - ./$(MKIMG) -soc IMX9 -c -ap bl31.bin a35 $(ATF_LOAD_ADDR) -ap u-boot-hash.bin a35 $(UBOOT_LOAD_ADDR) -out u-boot-atf-container.img; \ +@@ -110,7 +111,7 @@ define append_container + @flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \ + psize=$$((0x400 * $(2))); \ + pad_cnt=$$(((flashbin_size + psize - 1) / psize)); \ +- echo "append $(1) at $$((pad_cnt * $(2))) KB, psize=$$psize"; \ ++ echo "append $(1) at $$((pad_cnt * $(2))) KB, psize=$$psize" | tee -a $(MKIMAGE_LOG); \ + dd if=$(1) of=flash.bin bs=1K seek=$$((pad_cnt * $(2))); + endef + +@@ -209,7 +210,7 @@ u-boot-atf-container.img: bl31.bin u-boot-hash.bin + -ap bl31.bin a55 $(ATF_LOAD_ADDR) \ + -ap u-boot-hash.bin a55 $(UBOOT_LOAD_ADDR) \ + -out u-boot-atf-container.img; \ - fi + fi | tee $(MKIMAGE_LOG) u-boot-atf-container-spinand.img: bl31.bin u-boot-hash.bin - if [ -f tee.bin ]; then \ -@@ -125,11 +126,11 @@ clean: - @echo "imx9 clean done" + if [ -f $(TEE) ]; then \ +@@ -286,7 +287,7 @@ endif - flash_singleboot: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container.img -- ./$(MKIMG) -soc IMX9 -append $(AHAB_IMG) -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin -+ ./$(MKIMG) -soc IMX9 -append $(AHAB_IMG) -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin | tee -a $(MKIMAGE_LOG) - cp flash.bin boot-spl-container.img - @flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \ - pad_cnt=$$(((flashbin_size + 0x400 - 1) / 0x400)); \ -- echo "append u-boot-atf-container.img at $$pad_cnt KB"; \ -+ echo "append u-boot-atf-container.img at $$pad_cnt KB" | tee -a $(MKIMAGE_LOG); \ - dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt; + flash_singleboot: $(MKIMG) $(AHAB_IMG) $(SPL_A55_IMG) u-boot-atf-container.img $(OEI_A55_DDR) + ./$(MKIMG) -soc IMX9 -append $(AHAB_IMG) -c $(OEI_OPT_A55) \ +- -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR) -out flash.bin ++ -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR) -out flash.bin | tee -a $(MKIMAGE_LOG) + $(call append_container,u-boot-atf-container.img,1) - flash_singleboot_spinand: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container-spinand.img flash_fw.bin + flash_singleboot_no_ahabfw: $(MKIMG) $(SPL_A55_IMG) u-boot-atf-container.img $(OEI_A55_DDR) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch index f62c6dea4..3c835ca13 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch @@ -4,25 +4,22 @@ Subject: [PATCH] imx9: soc.mak: add makefile target to build A0 revision Signed-off-by: Javier Viguera --- - iMX9/soc.mak | 8 ++++++++ - 1 file changed, 8 insertions(+) + iMX9/soc.mak | 5 +++++ + 1 file changed, 5 insertions(+) diff --git a/iMX9/soc.mak b/iMX9/soc.mak -index 97e311059df8..59352f22deb1 100644 +index c4bcac4e42cd..4f741451d1d0 100644 --- a/iMX9/soc.mak +++ b/iMX9/soc.mak -@@ -133,6 +133,14 @@ flash_singleboot: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container.i - echo "append u-boot-atf-container.img at $$pad_cnt KB" | tee -a $(MKIMAGE_LOG); \ - dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt; +@@ -290,6 +290,11 @@ flash_singleboot: $(MKIMG) $(AHAB_IMG) $(SPL_A55_IMG) u-boot-atf-container.img $ + -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR) -out flash.bin | tee -a $(MKIMAGE_LOG) + $(call append_container,u-boot-atf-container.img,1) -+flash_singleboot_a0: $(MKIMG) mx93a0-ahab-container.img u-boot-spl-ddr.bin u-boot-atf-container.img -+ ./$(MKIMG) -soc IMX9 -append mx93a0-ahab-container.img -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin | tee -a $(MKIMAGE_LOG) -+ cp flash.bin boot-spl-container.img -+ @flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \ -+ pad_cnt=$$(((flashbin_size + 0x400 - 1) / 0x400)); \ -+ echo "append u-boot-atf-container.img at $$pad_cnt KB" | tee -a $(MKIMAGE_LOG); \ -+ dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt; ++flash_singleboot_a0: $(MKIMG) mx93a0-ahab-container.img $(SPL_A55_IMG) u-boot-atf-container.img $(OEI_A55_DDR) ++ ./$(MKIMG) -soc IMX9 -append mx93a0-ahab-container.img -c $(OEI_OPT_A55) \ ++ -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR) -out flash.bin | tee -a $(MKIMAGE_LOG) ++ $(call append_container,u-boot-atf-container.img,1) + - flash_singleboot_spinand: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container-spinand.img flash_fw.bin - ./$(MKIMG) -soc IMX9 -dev nand 4K -append $(AHAB_IMG) -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin - cp flash.bin boot-spl-container.img + flash_singleboot_no_ahabfw: $(MKIMG) $(SPL_A55_IMG) u-boot-atf-container.img $(OEI_A55_DDR) + ./$(MKIMG) -soc IMX9 -c $(OEI_OPT_A55) \ + -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR) -out flash.bin diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index 2060db12f..08a624d46 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -12,10 +12,10 @@ SRC_URI:append:ccimx93 = " \ file://0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch \ " -# Use NXP's lf-6.1.36-2.1.0 release for ccimx93 +# Use NXP's lf-6.1.55-2.2.0 release for ccimx93 SRC_URI:ccimx93 = "git://github.com/nxp-imx/imx-mkimage.git;protocol=https;branch=${SRCBRANCH}" -SRCBRANCH:ccimx93 = "lf-6.1.36_2.1.0" -SRCREV:ccimx93 = "5a0faefc223e51e088433663b6e7d6fbce89bf59" +SRCBRANCH:ccimx93 = "lf-6.1.55_2.2.0" +SRCREV:ccimx93 = "c4365450fb115d87f245df2864fee1604d97c06a" DEPENDS += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'trustfence-sign-tools-native', '', d)}" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.bbappend index b40e5563b..321037dc0 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.bbappend @@ -1,4 +1,4 @@ -# Copyright (C) 2022 Digi International +# Copyright (C) 2022-2024 Digi International Inc. FILESEXTRAPATHS:prepend := "${THISDIR}/files:" @@ -6,10 +6,10 @@ SRC_URI:append:ccimx8m = " \ file://0001-imx8m-soc.mak-preserve-dtbs-after-build.patch \ " -# Use NXP's lf-6.1.36-2.1.0 release for ccimx93 +# Use NXP's lf-6.1.55-2.2.0 release for ccimx93 SRC_URI:ccimx93 = "git://github.com/nxp-imx/imx-mkimage.git;protocol=https;branch=${SRCBRANCH}" -SRCBRANCH:ccimx93 = "lf-6.1.36_2.1.0" -SRCREV:ccimx93 = "5a0faefc223e51e088433663b6e7d6fbce89bf59" +SRCBRANCH:ccimx93 = "lf-6.1.55_2.2.0" +SRCREV:ccimx93 = "c4365450fb115d87f245df2864fee1604d97c06a" # "fmacro-prefix-map" is not supported on old versions of GCC DEBUG_PREFIX_MAP:remove:class-nativesdk = "-fmacro-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}" From e4d089a6ab18f89c049db4911e11bef7411e7a19 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 2 Jan 2024 17:10:19 +0100 Subject: [PATCH 078/118] optee: update to NXP's lf-6.1.55-2.2.0 release for ccimx93 Signed-off-by: Javier Viguera --- .../conf/machine/include/imx-digi-base.inc | 6 +++--- .../optee-imx/optee-client/tee-supplicant.service | 5 ++--- .../optee-imx/optee-client_3.21.0.imx.bb | 15 --------------- .../optee-imx/optee-client_4.0.0.imx.bb | 13 +++++++++++++ .../0001-core-imx-support-ccimx93-dvk.patch | 12 ++++++------ ...tee-os_3.21.0.imx.bb => optee-os_4.0.0.imx.bb} | 6 +++--- ...test_3.21.0.imx.bb => optee-test_4.0.0.imx.bb} | 6 ++++-- 7 files changed, 31 insertions(+), 32 deletions(-) delete mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_3.21.0.imx.bb create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.0.0.imx.bb rename meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/{optee-os_3.21.0.imx.bb => optee-os_4.0.0.imx.bb} (80%) rename meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/{optee-test_3.21.0.imx.bb => optee-test_4.0.0.imx.bb} (64%) diff --git a/meta-digi-arm/conf/machine/include/imx-digi-base.inc b/meta-digi-arm/conf/machine/include/imx-digi-base.inc index a887b222a..b3946d897 100644 --- a/meta-digi-arm/conf/machine/include/imx-digi-base.inc +++ b/meta-digi-arm/conf/machine/include/imx-digi-base.inc @@ -272,11 +272,11 @@ PREFERRED_VERSION_vulkan-tools:imxvulkan ??= "1.2.182.0" # Use i.MX optee Version PREFERRED_VERSION_optee-os:mx8-nxp-bsp ??= "3.19.0.imx" -PREFERRED_VERSION_optee-os:mx9-nxp-bsp ??= "3.21.0.imx" +PREFERRED_VERSION_optee-os:mx9-nxp-bsp ??= "4.0.0.imx" PREFERRED_VERSION_optee-client:mx8-nxp-bsp ??= "3.19.0.imx" -PREFERRED_VERSION_optee-client:mx9-nxp-bsp ??= "3.21.0.imx" +PREFERRED_VERSION_optee-client:mx9-nxp-bsp ??= "4.0.0.imx" PREFERRED_VERSION_optee-test:mx8-nxp-bsp ??= "3.19.0.imx" -PREFERRED_VERSION_optee-test:mx9-nxp-bsp ??= "3.21.0.imx" +PREFERRED_VERSION_optee-test:mx9-nxp-bsp ??= "4.0.0.imx" # Machine learning backports from NXP's lf-6.1.36-2.1.0 release PREFERRED_VERSION_ethos-u-vela:ccimx93 = "3.8.0" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client/tee-supplicant.service b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client/tee-supplicant.service index 0e2b4f6ba..c273832d7 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client/tee-supplicant.service +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client/tee-supplicant.service @@ -3,9 +3,8 @@ Description=TEE Supplicant [Service] User=root -EnvironmentFile=-/etc/default/tee-supplicant -ExecStart=/usr/bin/tee-supplicant $OPTARGS +EnvironmentFile=-@sysconfdir@/default/tee-supplicant +ExecStart=@sbindir@/tee-supplicant $OPTARGS [Install] WantedBy=basic.target - diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_3.21.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_3.21.0.imx.bb deleted file mode 100644 index 882b390cd..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_3.21.0.imx.bb +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2023 Digi International Inc. - -# -# Reuse meta-freescale's optee-client_3.19.0.imx.bb -# -require recipes-security/optee-imx/optee-client_3.19.0.imx.bb - -SRCBRANCH = "lf-6.1.22_2.0.0" -SRCREV = "8533e0e6329840ee96cf81b6453f257204227e6c" - -# Otherwise optee-client's makefile defaults to use $(CROSS_COMPILE)pkg-config -# which is not what Yocto provides. -export PKG_CONFIG='pkg-config' - -COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.0.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.0.0.imx.bb new file mode 100644 index 000000000..32d91245c --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.0.0.imx.bb @@ -0,0 +1,13 @@ +# Copyright 2023 Digi International Inc. + +# +# Reuse meta-freescale's optee-client_3.19.0.imx.bb +# +require recipes-security/optee-imx/optee-client_3.19.0.imx.bb + +SRCBRANCH = "lf-6.1.55_2.2.0" +SRCREV = "acb0885c117e73cb6c5c9b1dd9054cb3f93507ee" + +EXTRA_OEMAKE += "PKG_CONFIG=pkg-config" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch index ed58a2f7b..6a9056b00 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch @@ -9,7 +9,7 @@ Signed-off-by: Javier Viguera 2 files changed, 7 insertions(+) diff --git a/core/arch/arm/plat-imx/conf.mk b/core/arch/arm/plat-imx/conf.mk -index 1d5081f96afe..5e2d0733dd04 100644 +index 0bd9ccd6bef1..4fa61d5c2619 100644 --- a/core/arch/arm/plat-imx/conf.mk +++ b/core/arch/arm/plat-imx/conf.mk @@ -88,6 +88,7 @@ mx8ulp-flavorlist = \ @@ -20,7 +20,7 @@ index 1d5081f96afe..5e2d0733dd04 100644 mx93evk \ ifneq (,$(filter $(PLATFORM_FLAVOR),$(mx6ul-flavorlist))) -@@ -449,6 +450,11 @@ CFG_DDR_SIZE ?= 0x80000000 +@@ -451,6 +452,11 @@ CFG_DDR_SIZE ?= 0x80000000 CFG_UART_BASE ?= UART1_BASE endif @@ -33,7 +33,7 @@ index 1d5081f96afe..5e2d0733dd04 100644 ifeq ($(filter y, $(CFG_MX6QP) $(CFG_MX6Q) $(CFG_MX6D) $(CFG_MX6DL) $(CFG_MX6S) \ $(CFG_MX6SL) $(CFG_MX6SLL) $(CFG_MX6SX)), y) diff --git a/core/arch/arm/plat-imx/registers/imx93.h b/core/arch/arm/plat-imx/registers/imx93.h -index e91607537380..66a6408109c2 100644 +index 21080da82d04..17f4d8f5755e 100644 --- a/core/arch/arm/plat-imx/registers/imx93.h +++ b/core/arch/arm/plat-imx/registers/imx93.h @@ -9,6 +9,7 @@ @@ -41,6 +41,6 @@ index e91607537380..66a6408109c2 100644 #define UART1_BASE 0x44380000 +#define UART6_BASE 0x425a0000 - #define MU_BASE 0x47520000 - #define MU_SIZE 0x10000 - + /* + * For Normal MU - Use MU_BASE as 0x47520000 + * For Trust MU - Use MU_BASE as 0x47530000 diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_3.21.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.0.0.imx.bb similarity index 80% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_3.21.0.imx.bb rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.0.0.imx.bb index 032a74b5e..75d81e0d0 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_3.21.0.imx.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.0.0.imx.bb @@ -10,9 +10,9 @@ SRC_URI = " \ file://0007-allow-setting-sysroot-for-clang.patch \ file://0001-core-imx-support-ccimx93-dvk.patch \ " -SRCBRANCH = "lf-6.1.36_2.1.0" -# Tag: lf-6.1.36-2.1.0 -SRCREV = "4e32281904b15af9ddbdf00f73e1c08eae21c695" +SRCBRANCH = "lf-6.1.55_2.2.0" +# Tag: lf-6.1.55-2.2.0 +SRCREV = "a303fc80f7c4bd713315687a1fa1d6ed136e78ee" PLATFORM_FLAVOR:ccimx93 = "ccimx93dvk" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_3.21.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_4.0.0.imx.bb similarity index 64% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_3.21.0.imx.bb rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_4.0.0.imx.bb index 916da297c..515dc1743 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_3.21.0.imx.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_4.0.0.imx.bb @@ -5,7 +5,9 @@ # require recipes-security/optee-imx/optee-test_3.19.0.imx.bb -SRCBRANCH = "lf-6.1.22_2.0.0" -SRCREV = "c2c9f922044d2c8a7ab384812bb124c6da2b7888" +DEPENDS += "openssl" + +SRCBRANCH = "lf-6.1.55_2.2.0" +SRCREV = "38efacef3b14b32a6792ceaebe211b5718536fbb" COMPATIBLE_MACHINE = "(ccimx93)" From 161c66f5f6c9cb30520c44e15b5a74c9f561e676 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 2 Jan 2024 17:10:49 +0100 Subject: [PATCH 079/118] ccimx93: support building bootloader for soc revision A0 Starting with NXP release "lf-6.1.55-2.2.0" the IMX optee fork (based on version 4.0.0) does not support SOC revision A0. This commit recovers support to build a bootloader for A0, extending the optee patch for ccimx93 to support A0 with a build time option, and then extending the optee-os and imx-boot recipes to build two optee binaries and using them to generate bootloaders for both SOC revisions. Signed-off-by: Javier Viguera --- .../imx-mkimage/imx-boot_1.0.bbappend | 7 ++++ .../0001-core-imx-support-ccimx93-dvk.patch | 34 ++++++++++++++----- .../optee-imx/optee-os_4.0.0.imx.bb | 9 +++++ 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index 08a624d46..c8245c0b0 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -38,6 +38,8 @@ compile_mx93:append:ccimx93() { ATF_MACHINE_NAME_A0="$(echo ${ATF_MACHINE_NAME} | sed -e 's,.bin,-A0.bin,g')" bbnote "Copy ATF binary for SOC revision A0: ${ATF_MACHINE_NAME_A0}" \cp --remove-destination ${DEPLOY_DIR_IMAGE}/${ATF_MACHINE_NAME_A0} ${BOOT_STAGING}/bl31.bin + # Filename must match the deployed one in "optee-os" recipe for A0 SOC revision + \cp --remove-destination ${DEPLOY_DIR_IMAGE}/tee.ccimx93dvk_a0.bin ${BOOT_STAGING}/tee.bin unset ATF_MACHINE_NAME_A0 fi } @@ -107,6 +109,11 @@ do_deploy:append:ccimx93() { ln -sf ${BOOT_NAME}-${MACHINE}.bin-${target} ${DEPLOYDIR}/${BOOT_NAME}-${MACHINE}-A0.bin fi done + # Deploy A0 optee binary + if ${DEPLOY_OPTEE}; then + # Filename must match the deployed one in "optee-os" recipe for A0 SOC revision + install -m 0644 ${DEPLOY_DIR_IMAGE}/tee.ccimx93dvk_a0.bin ${DEPLOYDIR}/${BOOT_TOOLS} + fi } do_deploy:ccimx8x () { diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch index 6a9056b00..01e38dda9 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch @@ -2,25 +2,28 @@ From: Javier Viguera Date: Mon, 15 May 2023 17:59:54 +0200 Subject: [PATCH] core: imx: support ccimx93-dvk +SOC revision A0 requires a different build. + Signed-off-by: Javier Viguera --- - core/arch/arm/plat-imx/conf.mk | 6 ++++++ - core/arch/arm/plat-imx/registers/imx93.h | 1 + - 2 files changed, 7 insertions(+) + core/arch/arm/plat-imx/conf.mk | 13 +++++++++++++ + core/arch/arm/plat-imx/registers/imx93.h | 5 +++++ + 2 files changed, 18 insertions(+) diff --git a/core/arch/arm/plat-imx/conf.mk b/core/arch/arm/plat-imx/conf.mk -index 0bd9ccd6bef1..4fa61d5c2619 100644 +index 0bd9ccd6bef1..5e4c02e27d2e 100644 --- a/core/arch/arm/plat-imx/conf.mk +++ b/core/arch/arm/plat-imx/conf.mk -@@ -88,6 +88,7 @@ mx8ulp-flavorlist = \ +@@ -88,6 +88,8 @@ mx8ulp-flavorlist = \ mx8ulpevk \ mx93-flavorlist = \ + ccimx93dvk \ ++ ccimx93dvk_a0 \ mx93evk \ ifneq (,$(filter $(PLATFORM_FLAVOR),$(mx6ul-flavorlist))) -@@ -451,6 +452,11 @@ CFG_DDR_SIZE ?= 0x80000000 +@@ -451,6 +453,17 @@ CFG_DDR_SIZE ?= 0x80000000 CFG_UART_BASE ?= UART1_BASE endif @@ -28,15 +31,21 @@ index 0bd9ccd6bef1..4fa61d5c2619 100644 +CFG_DDR_SIZE ?= 0x40000000 +CFG_UART_BASE ?= UART6_BASE +endif ++ ++ifneq (,$(filter $(PLATFORM_FLAVOR),ccimx93dvk_a0)) ++CFG_DDR_SIZE ?= 0x40000000 ++CFG_UART_BASE ?= UART6_BASE ++$(call force,CFG_SOC_REV_A0,y) ++endif + # i.MX6 Solo/SL/SoloX/DualLite/Dual/Quad specific config ifeq ($(filter y, $(CFG_MX6QP) $(CFG_MX6Q) $(CFG_MX6D) $(CFG_MX6DL) $(CFG_MX6S) \ $(CFG_MX6SL) $(CFG_MX6SLL) $(CFG_MX6SX)), y) diff --git a/core/arch/arm/plat-imx/registers/imx93.h b/core/arch/arm/plat-imx/registers/imx93.h -index 21080da82d04..17f4d8f5755e 100644 +index 21080da82d04..29070eb917ac 100644 --- a/core/arch/arm/plat-imx/registers/imx93.h +++ b/core/arch/arm/plat-imx/registers/imx93.h -@@ -9,6 +9,7 @@ +@@ -9,11 +9,16 @@ #define GICR_BASE 0x48040000 #define UART1_BASE 0x44380000 @@ -44,3 +53,12 @@ index 21080da82d04..17f4d8f5755e 100644 /* * For Normal MU - Use MU_BASE as 0x47520000 * For Trust MU - Use MU_BASE as 0x47530000 + */ ++#ifdef CFG_SOC_REV_A0 ++#define MU_BASE 0x47520000 ++#else + #define MU_BASE 0x47530000 ++#endif + #define MU_SIZE 0x10000 + + #define MU_TRUST_BASE 0x47530000 diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.0.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.0.0.imx.bb index 75d81e0d0..c4f613481 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.0.0.imx.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.0.0.imx.bb @@ -16,4 +16,13 @@ SRCREV = "a303fc80f7c4bd713315687a1fa1d6ed136e78ee" PLATFORM_FLAVOR:ccimx93 = "ccimx93dvk" +do_compile:append:ccimx93 () { + oe_runmake PLATFORM=imx-${PLATFORM_FLAVOR}_a0 O=${B}-A0 all +} +do_compile[cleandirs] += "${B}-A0" + +do_deploy:append:ccimx93 () { + cp ${B}-A0/core/tee-raw.bin ${DEPLOYDIR}/tee.${PLATFORM_FLAVOR}_a0.bin +} + COMPATIBLE_MACHINE = "(ccimx93)" From 4f33afcbcf3f8823aeb2f34cd1e210d8dad2757a Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Fri, 22 Dec 2023 08:56:00 +0100 Subject: [PATCH 080/118] trustfence: split ccmp13 passwords in 8 files and set SWUPDATE keys For signing SWU files we need to set a couple of variables: - SWUPDATE_PRIVATE_KEY_TEMPLATE to the private key file - SWUPDATE_PASSWORD_FILE to the password of the private key The latter must only contain one password, whereas the current key_pass.txt file had (for the ccmp13) the eight keys separated by a white space. This commit: - If the file key_pass.txt exists, it extracts each key into a separate file key_pass0X.txt. - If the keys don't exist, generates separate files per key. - Changes the permissions of password files to 400. - Adapts the sign script to use the single password files. - Fixes a few quotes Signed-off-by: Hector Palacios --- .../trustfence-gen-pki-stm.sh | 36 +++++++++++++------ .../trustfence-sign-artifact-stm.sh | 6 ++-- meta-digi-dey/classes/trustfence.bbclass | 12 +++++-- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-gen-pki-stm.sh b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-gen-pki-stm.sh index ad0c4548d..cba7b6627 100755 --- a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-gen-pki-stm.sh +++ b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-gen-pki-stm.sh @@ -53,14 +53,16 @@ fi [ -d "${CONFIG_SIGN_KEYS_PATH}" ] || mkdir "${CONFIG_SIGN_KEYS_PATH}" # Default values -KEY_PASS_FILE="${CONFIG_SIGN_KEYS_PATH}/keys/key_pass.txt" +KEY_PASS_BASEFILE="${CONFIG_SIGN_KEYS_PATH}/keys/key_pass" +KEY_PASS_FILE="${KEY_PASS_BASEFILE}.txt" # Generate random keys if they don't exist -N_PUBK="$(ls -l "${CONFIG_SIGN_KEYS_PATH}"/keys/publicKey*.pem 2>/dev/null | wc -l)" -N_PRVK="$(ls -l "${CONFIG_SIGN_KEYS_PATH}"/keys/privateKey*.pem 2>/dev/null | wc -l)" +N_PUBK="$(ls -l ${CONFIG_SIGN_KEYS_PATH}/keys/publicKey*.pem 2>/dev/null | wc -l)" +N_PRVK="$(ls -l ${CONFIG_SIGN_KEYS_PATH}/keys/privateKey*.pem 2>/dev/null | wc -l)" +N_PASS="$(ls -l ${KEY_PASS_BASEFILE}*.txt 2>/dev/null | wc -l)" +install -d "${CONFIG_SIGN_KEYS_PATH}/keys/" if [ "${PLATFORM}" = "ccmp15" ]; then if [ "${N_PUBK}" != "1" ] && [ "${N_PRVK}" != 1 ] && [ ! -f "${KEY_PASS_FILE}" ]; then - install -d "${CONFIG_SIGN_KEYS_PATH}/keys/" # Random password password="$(openssl rand -base64 32)" echo "Generating random key" @@ -69,21 +71,33 @@ if [ "${PLATFORM}" = "ccmp15" ]; then exit 1 fi echo "${password}" > "${KEY_PASS_FILE}" + chmod 400 "${KEY_PASS_FILE}" fi elif [ "${PLATFORM}" = "ccmp13" ]; then - if [ "${N_PUBK}" != "8" ] && [ "${N_PRVK}" != 8 ] && [ ! -f "${KEY_PASS_FILE}" ]; then - install -d "${CONFIG_SIGN_KEYS_PATH}/keys/" - # 8 random passwords (separated by whitespaces) - passwords="$(openssl rand -base64 32)" - for i in $(seq 1 7); do - passwords="${passwords} $(openssl rand -base64 32)" + if [ "${N_PUBK}" = "8" ] && [ "${N_PRVK}" = "8" ] && [ "${N_PASS}" != "8" ] && [ -f "${KEY_PASS_FILE}" ]; then + # Backwards compatibility: if a single key_pass.txt file exists, + # split into 8 files with one password each + for i in $(seq 0 7); do + cat "${KEY_PASS_FILE}" | cut -f $((i+1)) -d " " > "${KEY_PASS_BASEFILE}0${i}.txt" + chmod 400 "${KEY_PASS_BASEFILE}0${i}.txt" + done + elif [ "${N_PUBK}" != "8" ] && [ "${N_PRVK}" != "8" ] && [ "${N_PASS}" != "8" ]; then + # Generate 8 random passwords + for i in $(seq 0 7); do + pass="$(openssl rand -base64 32)" + echo "${pass}" > "${KEY_PASS_BASEFILE}0${i}.txt" + chmod 400 "${KEY_PASS_BASEFILE}0${i}.txt" + # Combined string with 8 passwords separated by a white space + passwords="${passwords} ${pass}" done echo "Generating random keys" if ! STM32MP_KeyGen_CLI -abs "${CONFIG_SIGN_KEYS_PATH}/keys/" -pwd ${passwords} -n 8; then echo "[ERROR] Could not generate PKI tree" exit 1 fi - echo "${passwords}" > "${KEY_PASS_FILE}" + else + echo "[ERROR] Could not generate PKI tree. An incomplete PKI tree may already exist." + exit 1 fi else echo "Undefined platform" diff --git a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-sign-artifact-stm.sh b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-sign-artifact-stm.sh index 236033d95..52f853c78 100755 --- a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-sign-artifact-stm.sh +++ b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-sign-artifact-stm.sh @@ -62,7 +62,6 @@ fi # Default values [ -z "${CONFIG_KEY_INDEX}" ] && CONFIG_KEY_INDEX="0" -KEY_PASS_FILE="${CONFIG_SIGN_KEYS_PATH}/keys/key_pass.txt" # Generate random keys if they don't exist if ! trustfence-gen-pki.sh -p ${PLATFORM}; then @@ -70,9 +69,11 @@ if ! trustfence-gen-pki.sh -p ${PLATFORM}; then fi if [ "${PLATFORM}" = "ccmp15" ]; then + KEY_PASS_FILE="${CONFIG_SIGN_KEYS_PATH}/keys/key_pass.txt" PUBLIC_KEY="${CONFIG_SIGN_KEYS_PATH}/keys/publicKey.pem" PRIVATE_KEY="${CONFIG_SIGN_KEYS_PATH}/keys/privateKey.pem" elif [ "${PLATFORM}" = "ccmp13" ]; then + KEY_PASS_FILE="${CONFIG_SIGN_KEYS_PATH}/keys/key_pass0${CONFIG_KEY_INDEX}.txt" PUBLIC_KEY="${CONFIG_SIGN_KEYS_PATH}/keys/publicKey0*.pem" PRIVATE_KEY="${CONFIG_SIGN_KEYS_PATH}/keys/privateKey0${CONFIG_KEY_INDEX}.pem" else @@ -90,8 +91,7 @@ INPUT_FILE="$(readlink -e "${1}")" OUTPUT_FILE="$(readlink -m "${2}")" # Obtain password from key pass file -INDEX=$((CONFIG_KEY_INDEX + 1)) -PASS=$(cat "${KEY_PASS_FILE}" | cut -f "${INDEX}" -d " ") +PASS=$(cat "${KEY_PASS_FILE}") # Sign TF-A artifact if [ "${ARTIFACT_TFA}" = "y" ]; then diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 6d7834e2e..eb459726c 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -242,9 +242,15 @@ python () { else: d.setVar("SWUPDATE_PRIVATE_KEY_TEMPLATE", keys_path + "/keys/IMG" + str(key_index_1) + "*key.pem") d.setVar("CONFIG_SIGN_MODE", "HAB") - - # Set the key password. - d.setVar("SWUPDATE_PASSWORD_FILE", keys_path + "/keys/key_pass.txt") + # Set the key password. + d.setVar("SWUPDATE_PASSWORD_FILE", keys_path + "/keys/key_pass.txt") + elif (d.getVar("DEY_SOC_VENDOR") == "STM"): + d.setVar("SWUPDATE_PRIVATE_KEY_TEMPLATE", d.getVar("FIP_SIGN_KEY")) + # Set the key password. + if (d.getVar("DIGI_SOM") == "ccmp15"): + d.setVar("SWUPDATE_PASSWORD_FILE", keys_path + "/keys/key_pass.txt") + elif (d.getVar("DIGI_SOM") == "ccmp13"): + d.setVar("SWUPDATE_PASSWORD_FILE", keys_path + "/keys/key_pass0" + str(key_index) + ".txt") # Enable partition encryption if rootfs encryption is enabled if (d.getVar("TRUSTFENCE_ENCRYPT_ROOTFS") == "1"): From 0cd1c33a7b0c9bc698aecbd464d151a585d2ecce Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Wed, 13 Dec 2023 09:36:11 +0100 Subject: [PATCH 081/118] trustfence: use signed images suffixes for ccmp1 boot artifacts When TrustFence is enabled, the boot artifacts (TFA and FIP) have a 'signed' suffix. Handle this case so that the correct symlinks are created and the correct artifacts are put into the SWU file. Signed-off-by: Mike Engel Signed-off-by: Hector Palacios --- .../trusted-firmware-a/tf-a-stm32mp_%.bbappend | 8 +++++--- meta-digi-dey/classes/dey-swupdate-common.bbclass | 5 +++-- meta-digi-dey/classes/trustfence.bbclass | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_%.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_%.bbappend index 4aad85436..0241faded 100644 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_%.bbappend +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_%.bbappend @@ -74,7 +74,7 @@ do_deploy:append() { i="$(expr ${i} + 1)" dt_config="$(echo ${FIP_DEVICETREE} | cut -d',' -f${i})" for dt in ${dt_config}; do - FIP_FILENAME="${FIP_BASENAME}-${dt}-${config}.${FIP_SUFFIX}" + FIP_FILENAME="${FIP_BASENAME}-${dt}-${config}${FIP_SIGN_SUFFIX}.${FIP_SUFFIX}" echo "${FIP_FILENAME}" if [ -f "${DEPLOYDIR}/fip/${FIP_FILENAME}" ]; then cd "${DEPLOYDIR}" @@ -104,9 +104,11 @@ tfa_sign() { bl2) TF_A_FILENAME="${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" if [ -f "${DEPLOYDIR}/arm-trusted-firmware/${TF_A_FILENAME}" ]; then - trustfence-sign-artifact.sh -p "${DIGI_SOM}" -t "${DEPLOYDIR}/arm-trusted-firmware/${TF_A_FILENAME}" "${DEPLOYDIR}/arm-trusted-firmware/${TF_A_FILENAME}_signed" + trustfence-sign-artifact.sh -p "${DIGI_SOM}" -t "${DEPLOYDIR}/arm-trusted-firmware/${TF_A_FILENAME}" "${DEPLOYDIR}/arm-trusted-firmware/${TF_A_FILENAME}${TFA_SIGN_SUFFIX}" # the generated artifact lacks 'w' permission which prevents deletion by the build system - chmod u+w "${DEPLOYDIR}/arm-trusted-firmware/${TF_A_FILENAME}_signed" + chmod u+w "${DEPLOYDIR}/arm-trusted-firmware/${TF_A_FILENAME}${TFA_SIGN_SUFFIX}" + # symlink TF-A + ln -s "arm-trusted-firmware/${TF_A_FILENAME}${TFA_SIGN_SUFFIX}" "${DEPLOYDIR}/" fi esac done # for file_type in ${tfa_file_type} diff --git a/meta-digi-dey/classes/dey-swupdate-common.bbclass b/meta-digi-dey/classes/dey-swupdate-common.bbclass index b06ddf026..856948dd3 100644 --- a/meta-digi-dey/classes/dey-swupdate-common.bbclass +++ b/meta-digi-dey/classes/dey-swupdate-common.bbclass @@ -98,8 +98,9 @@ SWUPDATE_UBOOT_EXT ?= ".${UBOOT_SUFFIX}" SWUPDATE_UBOOT_EXT_TFA ?= ".stm32" SWUPDATE_UBOOT_NAME ?= "${SWUPDATE_UBOOT_PREFIX}-${MACHINE}${SWUPDATE_UBOOT_EXT}" -SWUPDATE_UBOOT_NAME:ccmp1 ?= "${SWUPDATE_UBOOT_PREFIX}-${MACHINE}-optee${SWUPDATE_UBOOT_EXT}" -SWUPDATE_UBOOT_NAME_TFA ?= "${@oe.utils.conditional('DEY_SOC_VENDOR', 'STM', '${SWUPDATE_UBOOT_PREFIX_TFA}-${MACHINE}-nand${SWUPDATE_UBOOT_EXT_TFA}', '', d)}" +SWUPDATE_UBOOT_NAME:ccmp1 ?= "${SWUPDATE_UBOOT_PREFIX}-${MACHINE}-optee${FIP_SIGN_SUFFIX}${SWUPDATE_UBOOT_EXT}" +SWUPDATE_UBOOT_NAME_TFA ?= "" +SWUPDATE_UBOOT_NAME_TFA:ccmp1 ?= "${SWUPDATE_UBOOT_PREFIX_TFA}-${MACHINE}-nand${SWUPDATE_UBOOT_EXT_TFA}${TFA_SIGN_SUFFIX}" SWUPDATE_UBOOT_OFFSET ?= "0" SWUPDATE_UBOOT_OFFSET:ccimx6 ?= "1" diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index eb459726c..c98059851 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -37,6 +37,9 @@ TRUSTFENCE_ENCRYPT_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-only- # Read-only rootfs TRUSTFENCE_READ_ONLY_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "1", "0", d)}" +FIP_SIGN_SUFFIX ?= "${@bb.utils.contains('TRUSTFENCE_SIGN', '1', '_Signed', '', d)}" +TFA_SIGN_SUFFIX ?= "${@bb.utils.contains('TRUSTFENCE_SIGN', '1', '_signed', '', d)}" + # # NOTHING TO CUSTOMIZE BELOW THIS LINE # From cef235f61dfb3f00b6e2ce50a5043511f8d03e14 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Fri, 22 Dec 2023 13:41:40 +0100 Subject: [PATCH 082/118] swu: add sha256 to SWUPDATE_SCRIPT_NAME These fields were added to default files, but not to the special sw-description files for ccmp1 and cc6ul platforms. Signed-off-by: Hector Palacios --- .../swu-images/files/ccimx6ul/sw-description-images_template | 3 +++ .../swu-images/files/ccmp1/sw-description-images_template | 3 +++ 2 files changed, 6 insertions(+) diff --git a/meta-digi-dey/recipes-digi/swu-images/files/ccimx6ul/sw-description-images_template b/meta-digi-dey/recipes-digi/swu-images/files/ccimx6ul/sw-description-images_template index a7a30256e..006595b9a 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/ccimx6ul/sw-description-images_template +++ b/meta-digi-dey/recipes-digi/swu-images/files/ccimx6ul/sw-description-images_template @@ -12,6 +12,7 @@ software = scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; + sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } ##SCRIPT_UBOOT## @@ -31,6 +32,7 @@ software = scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; + sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } ##SCRIPT_UBOOT## @@ -50,6 +52,7 @@ software = scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; + sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } ##SCRIPT_UBOOT## diff --git a/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template b/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template index 5f333df7b..893778dcb 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template +++ b/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template @@ -12,6 +12,7 @@ software = scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; + sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } ##SCRIPT_UBOOT## @@ -35,6 +36,7 @@ software = scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; + sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } ##SCRIPT_UBOOT## @@ -58,6 +60,7 @@ software = scripts: ( { filename = "@@SWUPDATE_SCRIPT_NAME@@"; + sha256 = "$swupdate_get_sha256(@@SWUPDATE_SCRIPT_NAME@@)"; type = "shellscript"; } ##SCRIPT_UBOOT## From 215ab5fedf78ca2d72408ddaaf264e46c37b22da Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Wed, 27 Dec 2023 17:55:49 +0100 Subject: [PATCH 083/118] libarchive: remove more unneeded packageconfigs to reduce recovery image size We depend on libarchive so that swupdate can perform updates with .tar.gz files, but by default, libarchive is configured to support a lot of additional features that pull in even more dependencies. This increases the size of the recovery image, which barely fits on platforms with limited internal storage like the ccimx6ul. We already removed zstd support to mitigate this, but the image size increased again after adding imx-kobs to it in commit aa2480d1de9c22d982f5a958b4cadf621ba5f9fb. Since libarchive isn't used by any other package in our system, remove the configurations that bloat the recovery image and are not needed at all for our file update use case. Note that removing the "lzo" packageconfig doesn't remove its respective library from the image because mtd-utils also depends on it, but it still reduces the size of libarchive. On the ccimx6ul, this removes 193 KiB worth of libraries and trims libarchive down by 20.5 KiB in the recovery image. https://onedigi.atlassian.net/browse/DEL-8819 Signed-off-by: Gabriel Valcazar --- meta-digi-dey/conf/distro/dey.conf | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index 5f28ef0ce..76e970d23 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -85,7 +85,9 @@ PACKAGECONFIG:append:class-target:pn-qtbase = " examples" PACKAGECONFIG:append:class-target:pn-qtdeclarative = " examples" PACKAGECONFIG:append:class-target:pn-qtquick3d = " examples" PACKAGECONFIG:append:class-target:pn-qtwebengine = " examples" -# libarchive is using "zstd" in its package config. -# This is not used in the swupdate that is the only consumer of the libarchive package. -# Remove it to reduce the size of the recovery image. -PACKAGECONFIG:remove:class-target:pn-libarchive = " zstd" + +# Remove unnecessary libarchive configurations to trim down the recovery image, +# while keeping the "zlib" one to make sure our file update mechanism still +# works (libarchive needs to be able to handle .tar.gz files, every other +# format can be omitted). +PACKAGECONFIG:remove:class-target:pn-libarchive = "bz2 xz lzo zstd acl xattr" From a0309c2a3940ba8691a8d51e179747fe2b505a73 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Thu, 28 Dec 2023 11:43:16 +0100 Subject: [PATCH 084/118] recovery-initramfs: remove openssl-ossl-module-legacy from recovery image This is added as a recommendation for libcrypto and only contains legacy ciphers which are deemed outdated or unsafe. If any of the packages in the image actually required this module, they would depend on it explicitly, but this isn't the case. This saves 66.8 KiB on the ccimx6ul recovery image. https://onedigi.atlassian.net/browse/DEL-8819 Signed-off-by: Gabriel Valcazar --- .../recipes-core/images/dey-image-recovery-initramfs.bb | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb b/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb index dede00cc7..8c5ea4b96 100644 --- a/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb +++ b/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb @@ -32,6 +32,7 @@ IMAGE_ROOTFS_SIZE = "8192" BAD_RECOMMENDATIONS += " \ openssl-bin \ openssl-conf \ + openssl-ossl-module-legacy \ " export IMAGE_BASENAME = "dey-image-recovery-initramfs" From 82a96801defbf9362419bc07b884166473076018 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Thu, 28 Dec 2023 12:20:20 +0100 Subject: [PATCH 085/118] Remove "wipe" from recovery and trustfence initramfs This package is purely vestigial and hasn't been used at all in any of our initramfs images for over 7 years. It was used in the first implementation of the trustfence initramfs (commit 4dd7d438af8c85837503780390751240567d30be) to securely erase the key used by cryptsetup, but two weeks later, that logic was moved to trustfence-tool (commit a8c50c16eab0a49c605121339e6efd872aa1a8ea) and "wipe" was no longer needed. However, the package remained in the dependencies of the trustfence initramfs, which were then used as reference for the recovery initramfs, even though this initramfs didn't even need "wipe" to begin with. Removing this package saves 30.8 KiB in the ccimx6ul recovery image. https://onedigi.atlassian.net/browse/DEL-8819 Signed-off-by: Gabriel Valcazar --- .../recipes-core/images/dey-image-recovery-initramfs.bb | 1 - meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb | 1 - 2 files changed, 2 deletions(-) diff --git a/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb b/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb index 8c5ea4b96..e8b06aeb9 100644 --- a/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb +++ b/meta-digi-dey/recipes-core/images/dey-image-recovery-initramfs.bb @@ -12,7 +12,6 @@ PACKAGE_INSTALL = " \ recovery-initramfs \ swupdate \ trustfence-tool \ - wipe \ ${@bb.utils.contains('DEY_SOC_VENDOR', 'NXP', bb.utils.contains('STORAGE_MEDIA', 'mtd', 'imx-kobs', '', d), '', d)} \ " diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb index 47afa79f7..d92412e64 100644 --- a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb @@ -23,7 +23,6 @@ RDEPENDS:${PN} = " \ cryptsetup \ trustfence-tool \ util-linux-findfs \ - wipe \ " PACKAGE_ARCH = "${MACHINE_ARCH}" From 604dcbc20f620fab1d2d5eaafa23a8cb654b0dc2 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Tue, 2 Jan 2024 13:44:09 +0100 Subject: [PATCH 086/118] ccimx6ul/ccmp1: compress recovery UBIFS image using zlib to reduce its size This compression method has a better compression ratio than the default (lzo), but the (de)compression speed is slower, leading to slower read/write speeds. However, the recovery partition only gets accessed in specific use cases such as software updates and partition encryption, and it contains an initramfs. The UBIFS will only be read at boot time to load its elements, but once the initramfs is loaded in RAM, there are no more read/write operations to the UBIFS during runtime, so the speed penalty is minimal. Take advantage of the improved compression ratio to reduce the size of the recovery image. On the ccimx6ul, the size is reduced by 248 KiB. https://onedigi.atlassian.net/browse/DEL-8819 https://onedigi.atlassian.net/browse/DEL-8825 Signed-off-by: Gabriel Valcazar --- meta-digi-arm/classes/image_types_digi.bbclass | 2 +- meta-digi-arm/conf/machine/ccmp13-dvk.conf | 4 ++++ meta-digi-arm/conf/machine/ccmp15-dvk.conf | 4 ++++ meta-digi-arm/conf/machine/include/ccimx6ul.inc | 4 ++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/classes/image_types_digi.bbclass b/meta-digi-arm/classes/image_types_digi.bbclass index 83212e2a8..db641ac69 100644 --- a/meta-digi-arm/classes/image_types_digi.bbclass +++ b/meta-digi-arm/classes/image_types_digi.bbclass @@ -204,7 +204,7 @@ IMAGE_CMD:recovery.ubifs() { fi # Build UBIFS recovery image out of temp folder - mkfs.ubifs -r ${TMP_RECOVERYDIR} -o ${IMGDEPLOYDIR}/${IMAGE_NAME}.recovery.ubifs ${MKUBIFS_BOOT_ARGS} + mkfs.ubifs -r ${TMP_RECOVERYDIR} -o ${IMGDEPLOYDIR}/${IMAGE_NAME}.recovery.ubifs ${MKUBIFS_RECOVERY_ARGS} # Remove the temporary folder rm -rf ${TMP_RECOVERYDIR} diff --git a/meta-digi-arm/conf/machine/ccmp13-dvk.conf b/meta-digi-arm/conf/machine/ccmp13-dvk.conf index 814f87227..a9ae07f8d 100644 --- a/meta-digi-arm/conf/machine/ccmp13-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp13-dvk.conf @@ -123,6 +123,10 @@ IMAGE_CLASSES = "image_types_digi image_types-stubi" # Max LEB count (-c 255) calculated for a partition of up to 32 MiB considering 128 KiB erase-block size. MKUBIFS_BOOT_ARGS ?= "-m 2048 -e 126976 -c 255" +# mkfs.ubifs parameters for recovery partition +# Same parameters as the boot partition, but using zlib compression to reduce image size. +MKUBIFS_RECOVERY_ARGS ?= "${MKUBIFS_BOOT_ARGS} -x zlib" + # mkfs.ubifs parameters for rootfs partition # Max LEB count (-c 8191) calculated for a partition of up to 1 GiB considering 128 KiB erase-block size. MKUBIFS_ARGS ?= "-m 2048 -e 126976 -c 8191" diff --git a/meta-digi-arm/conf/machine/ccmp15-dvk.conf b/meta-digi-arm/conf/machine/ccmp15-dvk.conf index 53173a2a4..1ea94b144 100644 --- a/meta-digi-arm/conf/machine/ccmp15-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp15-dvk.conf @@ -132,6 +132,10 @@ IMAGE_CLASSES = "image_types_digi image_types-stubi" # Max LEB count (-c 255) calculated for a partition of up to 32 MiB considering 128 KiB erase-block size. MKUBIFS_BOOT_ARGS ?= "-m 2048 -e 126976 -c 255" +# mkfs.ubifs parameters for recovery partition +# Same parameters as the boot partition, but using zlib compression to reduce image size. +MKUBIFS_RECOVERY_ARGS ?= "${MKUBIFS_BOOT_ARGS} -x zlib" + # mkfs.ubifs parameters for rootfs partition # Max LEB count (-c 8191) calculated for a partition of up to 1 GiB considering 128 KiB erase-block size. MKUBIFS_ARGS ?= "-m 2048 -e 126976 -c 8191" diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index d532eae21..f0e66256b 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -41,6 +41,10 @@ MACHINE_FEATURES:remove:use-mainline-bsp = "wifi" # Max LEB count (-c 255) calculated for a partition of up to 32 MiB considering 128 KiB erase-block size. MKUBIFS_BOOT_ARGS ?= "-m 2048 -e 126976 -c 255" +# mkfs.ubifs parameters for recovery partition +# Same parameters as the boot partition, but using zlib compression to reduce image size. +MKUBIFS_RECOVERY_ARGS ?= "${MKUBIFS_BOOT_ARGS} -x zlib" + # mkfs.ubifs parameters for rootfs partition # Max LEB count (-c 8191) calculated for a partition of up to 1 GiB considering 128 KiB erase-block size. MKUBIFS_ARGS ?= "-m 2048 -e 126976 -c 8191" From efd5f898d83cf2ccf585aa99fe9d63cdd661a501 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Thu, 4 Jan 2024 11:22:38 +0100 Subject: [PATCH 087/118] ccmp1: move definition of TF-A and OP-TEE suffixes to platform The TF-A and OP-TEE images have different suffixes depending on whether TrustFence is enabled or not, but the suffix variables themselves must exist independently of whether TF is enabled. Currently, they were defined on the trustfence.bbclass, and the variables did not exist when TF was disabled, which caused build problems, for example, building the SWU file. Signed-off-by: Hector Palacios --- meta-digi-arm/conf/machine/include/ccmp1.inc | 4 ++++ meta-digi-dey/classes/trustfence.bbclass | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index 0189ba36b..6945f333c 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -8,11 +8,15 @@ include conf/machine/include/digi-defaults.inc DIGI_FAMILY = "ccmp1" +# Platform T-FA settings +TFA_SIGN_SUFFIX ?= "${@bb.utils.contains('TRUSTFENCE_SIGN', '1', '_signed', '', d)}" + # Platform u-boot settings UBOOT_PREFIX = "u-boot" UBOOT_SUFFIX = "bin" # Set U-Boot FIP settings FIP_UBOOT_DTB = "u-boot" +FIP_SIGN_SUFFIX ?= "${@bb.utils.contains('TRUSTFENCE_SIGN', '1', '_Signed', '', d)}" STORAGE_MEDIA = "mtd" diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index c98059851..eb459726c 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -37,9 +37,6 @@ TRUSTFENCE_ENCRYPT_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-only- # Read-only rootfs TRUSTFENCE_READ_ONLY_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "1", "0", d)}" -FIP_SIGN_SUFFIX ?= "${@bb.utils.contains('TRUSTFENCE_SIGN', '1', '_Signed', '', d)}" -TFA_SIGN_SUFFIX ?= "${@bb.utils.contains('TRUSTFENCE_SIGN', '1', '_signed', '', d)}" - # # NOTHING TO CUSTOMIZE BELOW THIS LINE # From ba3f3481aa30311926e32f42e82735998ae577f1 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Wed, 3 Jan 2024 16:43:29 +0100 Subject: [PATCH 088/118] libcap: prevent linking against libpam In theory, libcap's pam_cap module should use libpam's dlopen runtime linking mechanism, but starting in libcap 2.53, this changed in order to support distros that can only link it at build-time. Then, in 2.54, a compile-time option was added (FORCELINKPAM) to allow users to force the link or not. In the poky recipe for libcap, this option isn't set, so the library was getting linked by default, dragging all of its dependencies with it. For more info: https://bugzilla.kernel.org/show_bug.cgi?id=214023 Set the flag to "no" to avoid linking against libpam, removing its dependency from the recovery image and saving some space. Signed-off-by: Gabriel Valcazar --- meta-digi-dey/recipes-support/libcap/libcap_%.bbappend | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 meta-digi-dey/recipes-support/libcap/libcap_%.bbappend diff --git a/meta-digi-dey/recipes-support/libcap/libcap_%.bbappend b/meta-digi-dey/recipes-support/libcap/libcap_%.bbappend new file mode 100644 index 000000000..d36eea536 --- /dev/null +++ b/meta-digi-dey/recipes-support/libcap/libcap_%.bbappend @@ -0,0 +1,7 @@ +# Copyright (C) 2024 Digi International Inc. + +# Don't link the pam_cap module against libpam at build-time to avoid +# a libpam dependency in the recovery initramfs- +EXTRA_OEMAKE += " \ + FORCELINKPAM=no \ +" From 4e86570976b2290e056535d74e2491b4ab4df2eb Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Thu, 4 Jan 2024 14:24:49 +0100 Subject: [PATCH 089/118] cryptsetup: remove udev packageconfig to prevent unwanted packages in intramfs We use cryptsetup in both the recovery and trustfence initramfs to handle block device encryption on platforms that use eMMC as the internal storage. In meta-openembedded commit 1ce71d6ec31195280073adec0e400dda7c0dd8a7 (between DEY 2.6 and 3.0), a lot of PACKAGECONFIG options were added to the cryptsetup recipe, all of them enabled by default. One of these options is "udev", which adds a runtime dependency with udev that in turn pulls in a lot of other dependencies with it. This is unnecessary because we already use mdev in our recovery image, and the other packages simply take up space as they aren't needed at all. Our eMMC partition encryption functionality, which is the reason why we need cryptsetup to begin with, is unaffected by this change and still works as expected. Keep in mind that it was working properly without udev in DEY 2.6 and older DEY releases, so removing udev isn't an issue. Remove this PACKAGECONFIG option to get rid of udev and its dependencies in the recovery and trustfence initramfs. Signed-off-by: Gabriel Valcazar --- meta-digi-dey/conf/distro/dey.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index 76e970d23..db39b4a30 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -91,3 +91,8 @@ PACKAGECONFIG:append:class-target:pn-qtwebengine = " examples" # works (libarchive needs to be able to handle .tar.gz files, every other # format can be omitted). PACKAGECONFIG:remove:class-target:pn-libarchive = "bz2 xz lzo zstd acl xattr" + +# cryptsetup still works as expected in our eMMC partition encryption use case +# when udev support is disabled, so remove it to avoid dragging a bunch of +# dependencies into the recovery and trustfence initramfs. +PACKAGECONFIG:remove:class-target:pn-cryptsetup = "udev" From 214acb335d98906f55f29aa0c9b22cef00f8fe24 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Fri, 5 Jan 2024 12:29:42 +0100 Subject: [PATCH 090/118] trustfence-initramfs: remove openssl-ossl-module-legacy We removed this package from the recovery initramfs, but it was getting added as a recommendation to the trustfence initramfs as well. Signed-off-by: Gabriel Valcazar --- .../recipes-core/images/dey-image-trustfence-initramfs.bb | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-digi-dey/recipes-core/images/dey-image-trustfence-initramfs.bb b/meta-digi-dey/recipes-core/images/dey-image-trustfence-initramfs.bb index 303b22728..7b06405f1 100644 --- a/meta-digi-dey/recipes-core/images/dey-image-trustfence-initramfs.bb +++ b/meta-digi-dey/recipes-core/images/dey-image-trustfence-initramfs.bb @@ -19,6 +19,7 @@ IMAGE_ROOTFS_SIZE = "8192" # Remove some packages added via recommendations BAD_RECOMMENDATIONS += " \ openssl-conf \ + openssl-ossl-module-legacy \ " export IMAGE_BASENAME = "dey-image-trustfence-initramfs" From 40802dff3d1f6247b45e77fe71adb47a447d376b Mon Sep 17 00:00:00 2001 From: Hector Bujanda Date: Fri, 5 Jan 2024 14:28:15 +0100 Subject: [PATCH 091/118] ccmp15: remove MCA entries as it will never be populated Signed-off-by: Hector Bujanda --- meta-digi-arm/conf/machine/ccmp15-dvk.conf | 1 - .../recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt | 6 ------ 2 files changed, 7 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccmp15-dvk.conf b/meta-digi-arm/conf/machine/ccmp15-dvk.conf index 1ea94b144..a4bf1d40b 100644 --- a/meta-digi-arm/conf/machine/ccmp15-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp15-dvk.conf @@ -53,7 +53,6 @@ STM32MP_KERNEL_DEVICETREE:ccmp15-dvk += " \ _ov_som_bt_ccmp15.dtbo \ _ov_som_bt_test_ccmp15.dtbo \ _ov_som_m4_ccmp15.dtbo \ - _ov_som_mca_ccmp15.dtbo \ _ov_som_wifi_ccmp15.dtbo \ " # Set DTB load address to U-Boot fdt_addr_r diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt index e51ef8d27..afe3de4c0 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt @@ -53,8 +53,6 @@ setenv ORIG_overlays ${overlays} # Determine overlays to apply depending on the hardware capabilities # described by the HWID, SOM version, and carrier board version. # -setexpr module_has_mca ${hwid_2} \& 10000 -setexpr module_has_mca ${module_has_mca} / 10000 setexpr module_has_wifi ${hwid_2} \& 20000 setexpr module_has_wifi ${module_has_wifi} / 20000 setexpr module_has_bt ${hwid_2} \& 40000 @@ -68,10 +66,6 @@ if test "${module_has_wifi}" = "1" && test -z "${disable_wifi}"; then setenv overlays _ov_som_wifi_ccmp15.dtbo,${overlays} fi -if test "${module_has_mca}" = "1" && test -z "${disable_mca}"; then - setenv overlays _ov_som_mca_ccmp15.dtbo,${overlays} -fi - # Apply DVKv1 overlay if the board_version is 1 if test -z "${board_version}" || test "${board_version}" -eq "1"; then setenv overlays _ov_board_v1_ccmp15-dvk.dtbo,${overlays} From 46550c51cf2791ea248de08cf93f3b021c9afae9 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 8 Jan 2024 12:36:14 +0100 Subject: [PATCH 092/118] ccimx93: remove MCA support as it's not populated Signed-off-by: Javier Viguera --- meta-digi-arm/conf/machine/ccimx93-dvk.conf | 1 - .../recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt | 6 ------ 2 files changed, 7 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccimx93-dvk.conf b/meta-digi-arm/conf/machine/ccimx93-dvk.conf index 018e08afb..080fb900c 100644 --- a/meta-digi-arm/conf/machine/ccimx93-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx93-dvk.conf @@ -23,7 +23,6 @@ KERNEL_DEVICETREE ?= " \ digi/_ov_board_mikroe-gyro-click_ccimx93-dvk.dtbo \ digi/_ov_som_bt_ccimx93.dtbo \ digi/_ov_som_cpu_a0_ccimx93.dtbo \ - digi/_ov_som_mca_ccimx93.dtbo \ digi/_ov_som_npu_ccimx93.dtbo \ digi/_ov_som_wifi_ccimx93.dtbo \ " diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt index 88337a716..b2780a765 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt @@ -60,8 +60,6 @@ setenv ORIG_overlays ${overlays} # Determine overlays to apply depending on the hardware capabilities # described by the HWID, SOM version, and carrier board version. # -setexpr module_has_mca ${hwid_2} \& 10000 -setexpr module_has_mca ${module_has_mca} / 10000 setexpr module_has_wifi ${hwid_2} \& 20000 setexpr module_has_wifi ${module_has_wifi} / 20000 setexpr module_has_bt ${hwid_2} \& 40000 @@ -75,10 +73,6 @@ if test "${module_has_wifi}" = "1" && test -z "${disable_wifi}"; then setenv overlays _ov_som_wifi_ccimx93.dtbo,${overlays} fi -if test "${module_has_mca}" = "1" && test -z "${disable_mca}"; then - setenv overlays _ov_som_mca_ccimx93.dtbo,${overlays} -fi - if test "${cpu_type}" = "imx9352" || \ test "${cpu_type}" = "imx9351" || \ test "${cpu_type}" = "imx9322" || \ From 4d8be061f0b9ea7663916a6cb3acae42e2829517 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 8 Jan 2024 16:39:01 +0100 Subject: [PATCH 093/118] ccimx93: update graphics package for NXP release lf-6.1.55-2.2.0 Backport of graphics package for ccimx93 from NXP's Mickledore-based lf-6.1.55-2.2.0 release. Mainly copies and appends of graphics recipes from the new release, and restricted to ccimx93 by changing the COMPATIBLE_MACHINE, so it does not affect other platforms. Signed-off-by: Javier Viguera --- meta-digi-arm/conf/machine/include/ccimx93.inc | 2 +- .../imx-g2d/imx-g2d-samples_git.bbappend | 4 +++- .../imx-g2d/imx-pxp-g2d_git.bbappend | 6 +++--- .../recipes-kernel/linux/linux-imx-headers_6.1.bb | 6 +++--- ...tocol-no-found-wayland-scanner-with-Yocto-.patch | 0 .../systemd-notify.weston-start | 0 .../weston.desktop | 0 .../weston.png | Bin .../xwayland.weston-start | 0 .../wayland/weston_10.0.1.imx.bbappend | 7 ------- .../{weston_11.0.2.imx.bb => weston_11.0.3.imx.bb} | 4 ++-- 11 files changed, 12 insertions(+), 17 deletions(-) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/{weston-11.0.2.imx => weston-11.0.3.imx}/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch (100%) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/{weston-11.0.2.imx => weston-11.0.3.imx}/systemd-notify.weston-start (100%) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/{weston-11.0.2.imx => weston-11.0.3.imx}/weston.desktop (100%) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/{weston-11.0.2.imx => weston-11.0.3.imx}/weston.png (100%) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/{weston-11.0.2.imx => weston-11.0.3.imx}/xwayland.weston-start (100%) delete mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_10.0.1.imx.bbappend rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/{weston_11.0.2.imx.bb => weston_11.0.3.imx.bb} (98%) diff --git a/meta-digi-arm/conf/machine/include/ccimx93.inc b/meta-digi-arm/conf/machine/include/ccimx93.inc index 3ebd5fbc9..124559061 100644 --- a/meta-digi-arm/conf/machine/include/ccimx93.inc +++ b/meta-digi-arm/conf/machine/include/ccimx93.inc @@ -88,5 +88,5 @@ PREFERRED_VERSION_nativesdk-wayland:ccimx93 ?= "1.22.0.imx" PREFERRED_VERSION_wayland:ccimx93 ?= "1.22.0.imx" PREFERRED_VERSION_wayland-native:ccimx93 ?= "1.22.0.imx" PREFERRED_VERSION_wayland-protocols:ccimx93 ?= "1.32.imx" -PREFERRED_VERSION_weston:ccimx93 ?= "11.0.2.imx" +PREFERRED_VERSION_weston:ccimx93 ?= "11.0.3.imx" PREFERRED_VERSION_xwayland:ccimx93 ?= "23.1.1.imx" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-g2d-samples_git.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-g2d-samples_git.bbappend index 980a6a4cf..9d9ee37f4 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-g2d-samples_git.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-g2d-samples_git.bbappend @@ -1,4 +1,6 @@ -# Copyright (c) 2023, Digi International Inc. +# Copyright 2023, 2024 Digi International Inc. + +SRCREV:mx93-nxp-bsp = "4391dcda499870418bb38fe395c3cba0664c5bab" PACKAGECONFIG_IMPLEMENTATION:mx93-nxp-bsp = "pxp" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-pxp-g2d_git.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-pxp-g2d_git.bbappend index 415c0e026..55a5c18fb 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-pxp-g2d_git.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-pxp-g2d_git.bbappend @@ -1,5 +1,5 @@ -# Copyright 2023 Digi International Inc. +# Copyright 2023, 2024 Digi International Inc. -LIC_FILES_CHKSUM:ccimx93 = "file://LICENSE.txt;md5=db4762b09b6bda63da103963e6e081de" +LIC_FILES_CHKSUM:ccimx93 = "file://LICENSE.txt;md5=2827219e81f28aba7c6a569f7c437fa7" -SRCREV:ccimx93 = "8d8b48c7c3d95b6c54093a09873ae796a0f09e8a" +SRCREV:ccimx93 = "f3adab05bd0cbb7c38578110d772e8ddf52b4e8e" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/linux/linux-imx-headers_6.1.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/linux/linux-imx-headers_6.1.bb index bec64d9b7..7da3e1d78 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/linux/linux-imx-headers_6.1.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/linux/linux-imx-headers_6.1.bb @@ -1,4 +1,4 @@ -# Copyright 2023 Digi International Inc. +# Copyright 2023, 2024 Digi International Inc. # # Reuse meta-freescale's linux-imx-headers_5.15.bb @@ -6,8 +6,8 @@ require recipes-kernel/linux/linux-imx-headers_5.15.bb SRCBRANCH = "lf-6.1.y" -LOCALVERSION = "-6.1.36-2.1.0" -SRCREV = "04b05c5527e9af8d81254638c307df07dc9a5dd3" +LOCALVERSION = "-lts-${SRCBRANCH}" +SRCREV = "770c5fe2c1d1529fae21b7043911cd50c6cf087e" IMX_UAPI_HEADERS:remove = "isl29023.h" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch similarity index 100% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/systemd-notify.weston-start b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/systemd-notify.weston-start similarity index 100% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/systemd-notify.weston-start rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/systemd-notify.weston-start diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.desktop b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/weston.desktop similarity index 100% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.desktop rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/weston.desktop diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.png b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/weston.png similarity index 100% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.png rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/weston.png diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/xwayland.weston-start b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/xwayland.weston-start similarity index 100% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/xwayland.weston-start rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/xwayland.weston-start diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_10.0.1.imx.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_10.0.1.imx.bbappend deleted file mode 100644 index 8774d4608..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_10.0.1.imx.bbappend +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (C) 2023 Digi International - -SRCREV = "b3ccf36b718d16f5fb38ccfc2cccaf45c79854d8" - -PACKAGECONFIG:append:mx93-nxp-bsp = " imxgpu imxg2d" - -COMPATIBLE_MACHINE = "(imx-nxp-bsp)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.2.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bb similarity index 98% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.2.imx.bb rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bb index 93e125563..812675c8f 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.2.imx.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bb @@ -163,8 +163,8 @@ SRC_URI:remove = "https://gitlab.freedesktop.org/wayland/weston/uploads/f5648c81 SRC_URI:prepend = "${WESTON_SRC};branch=${SRCBRANCH} " WESTON_SRC ?= "git://github.com/nxp-imx/weston-imx.git;protocol=https" SRC_URI += "file://0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch" -SRCBRANCH = "weston-imx-11.0.2" -SRCREV = "a3c5e63aa94f8d27b72780e333370be78c9a7653" +SRCBRANCH = "weston-imx-11.0.3" +SRCREV = "a509c319b7bfc72638c9b9d8f5e4b6259aba0ab7" S = "${WORKDIR}/git" PACKAGECONFIG_IMX_REMOVALS ?= "wayland x11" From 0cba27a016c8ddfa31c0f3e0ffce8c5b3916f201 Mon Sep 17 00:00:00 2001 From: Francisco Gil Date: Thu, 4 Jan 2024 12:23:58 +0100 Subject: [PATCH 094/118] udev: mount only media devices with filesystem on them With this new rule, only the medias that contain a filesystem on them are mounted, filtering several calls to mount.sh. I have checked that this change doesn't increase the boot time at all. https://onedigi.atlassian.net/browse/DEL-8826 Signed-off-by: Francisco Gil --- .../recipes-core/udev/udev-extraconf/automount.rules | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules b/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules index 13b52a676..b20cf9d05 100644 --- a/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules +++ b/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules @@ -23,8 +23,8 @@ SUBSYSTEM=="block", ENV{ID_PART_ENTRY_NAME}=="recovery*|rootfs*", ACTION=="add", SUBSYSTEM=="mtd", ATTRS{name}=="recovery*", ACTION=="add", GOTO="automount_rules_end" # Media automounting -SUBSYSTEM=="block", ATTRS{name}!="loop*|ram*", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" -SUBSYSTEM=="block", ATTRS{name}!="loop*|ram*", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" -SUBSYSTEM=="block", ATTRS{name}!="loop*|ram*", ACTION=="change", ENV{DISK_MEDIA_CHANGE}=="1" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ENV{ID_FS_USAGE}=="filesystem", ACTION=="add", RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ACTION=="change", ENV{DISK_MEDIA_CHANGE}=="1", RUN+="/etc/udev/scripts/mount.sh" LABEL="automount_rules_end" From 0aa50032674a33c502260d4a72cf3622c6c4d126 Mon Sep 17 00:00:00 2001 From: Francisco Gil Date: Wed, 3 Jan 2024 12:40:17 +0100 Subject: [PATCH 095/118] read only: fix problem when mounting external devices In commit a84d011 this was fixed for mount_digiparts.sh, but was missing the fix in the mount.sh script. In that commit there is a full explanation about why this solves the issue. https://onedigi.atlassian.net/browse/DEL-8721 Signed-off-by: Francisco Gil --- meta-digi-arm/recipes-core/udev/udev-extraconf_1.1.bbappend | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/meta-digi-arm/recipes-core/udev/udev-extraconf_1.1.bbappend b/meta-digi-arm/recipes-core/udev/udev-extraconf_1.1.bbappend index 48063b477..43e98f3f2 100644 --- a/meta-digi-arm/recipes-core/udev/udev-extraconf_1.1.bbappend +++ b/meta-digi-arm/recipes-core/udev/udev-extraconf_1.1.bbappend @@ -18,6 +18,12 @@ do_install:append() { install -d ${D}/mnt/linux install -d ${D}/mnt/update install -d ${D}/mnt/data + # Change mount.sh to check "/sbin/init.orig" additionally to determine if a system is using systemd. + sed -i '/^BASE_INIT=/a BASE_INIT_ORIG="$(readlink -f "@base_sbindir@/init.orig")"' \ + ${D}${sysconfdir}/udev/scripts/mount.sh + sed -i 's/if \[ "x$BASE_INIT" = "x$INIT_SYSTEMD" \];then/if \[ "x$BASE_INIT" = "x$INIT_SYSTEMD" \] || \[ "x$BASE_INIT_ORIG" = "x$INIT_SYSTEMD" \]; then/' \ + ${D}${sysconfdir}/udev/scripts/mount.sh + sed -i -e 's|@base_sbindir@|${base_sbindir}|g' ${D}${sysconfdir}/udev/scripts/mount.sh fi install -m 0755 ${WORKDIR}/mount_digiparts.sh ${D}${sysconfdir}/udev/scripts/ From 9248c9ab791ce26cb4fcd56ba4ab7280ccb3f6d5 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 10 Jan 2024 09:34:57 +0100 Subject: [PATCH 096/118] cc93 wlan: fix the check for Wi-Fi module correctly loaded The result of the modprobe operation doesn't guarantee the driver loaded correctly. The module may succeed and be loaded, but failures during the probe may not propagate and result in an error of modprobe. The valid condition is to check the existence of the interface in /sys/class/net/wlan0. Signed-off-by: Hector Palacios https://onedigi.atlassian.net/browse/DEL-8821 --- .../kernel-modules/kernel-module-nxp-wlan/load_iw612.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/load_iw612.sh b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/load_iw612.sh index e6acea5c5..678b8f292 100644 --- a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/load_iw612.sh +++ b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/load_iw612.sh @@ -35,7 +35,7 @@ fi WLANADDR=$(hexdump -ve '1/1 "%02X" ":"' /proc/device-tree/wireless/mac-address 2>/dev/null | sed 's/:$//g') modprobe mlan && \ modprobe moal ${MOAL_PARAMS} mac_addr=${WLANADDR} && \ -log "Wi-Fi activated" && exit 0 +[ -d "/sys/class/net/wlan0" ] && log "Wi-Fi activated" && exit 0 log "[ERROR] cannot load Wi-Fi driver" exit 1 From bf1eeabbf5ec359377b5e7b33577e83508766f54 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 10 Jan 2024 09:37:46 +0100 Subject: [PATCH 097/118] cc93: standby: add a small delay before resuming Wi-Fi When switching off the 3.3V supply from the Wi-Fi during suspend, around a 10% of the times, when resuming the Wi-Fi driver fails to load. It was verified that a rebind operation over the mmc interface (which eventually calls the script that loads the Wi-Fi module) makes it load successfully, which denotes a timing issue during resume. Adding a small delay on the resume operation before running the script makes the Wi-Fi driver load at the first try. Signed-off-by: Hector Palacios https://onedigi.atlassian.net/browse/DEL-8821 --- .../recipes-core/busybox/busybox/ccimx93/standby-actions | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions b/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions index b200c71a7..c6abb6f93 100644 --- a/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions +++ b/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions @@ -47,8 +47,9 @@ if [ "${1}" = "pre" ]; then fi elif [ "${1}" = "post" ]; then if actions_needed; then - /etc/udev/scripts/load_iw612.sh sleep 0.5 + /etc/udev/scripts/load_iw612.sh + sh "${RESUME_ACTIONS}" rm -f "${RESUME_ACTIONS}" fi From 70b65c121d6adf5bb5d70e7a387b32429e6c22c5 Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Thu, 4 Jan 2024 16:54:14 +0100 Subject: [PATCH 098/118] libubootenv: fix HWID dump on Linux console when using fw_printenv https://onedigi.atlassian.net/browse/DEL-8822 Signed-off-by: Mike Engel --- ...t-for-environment-encryption-for-CCM.patch | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/libubootenv/libubootenv/0005-Implement-support-for-environment-encryption-for-CCM.patch b/meta-digi-arm/recipes-bsp/libubootenv/libubootenv/0005-Implement-support-for-environment-encryption-for-CCM.patch index 04962f18a..023cb1d8c 100644 --- a/meta-digi-arm/recipes-bsp/libubootenv/libubootenv/0005-Implement-support-for-environment-encryption-for-CCM.patch +++ b/meta-digi-arm/recipes-bsp/libubootenv/libubootenv/0005-Implement-support-for-environment-encryption-for-CCM.patch @@ -1,4 +1,4 @@ -From 89b035959578fe0d7714748487dad875bc018ef5 Mon Sep 17 00:00:00 2001 +From 768cac09ee47729e3ef38b477c7a69e5b3d10c60 Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Fri, 26 May 2023 11:21:43 +0200 Subject: [PATCH] Implement support for environment encryption for CCMP1 @@ -19,8 +19,8 @@ Signed-off-by: Mike Engel src/teec_benchmark.h | 37 ++ src/teec_trace.c | 141 +++++ src/teec_trace.h | 148 +++++ - src/uboot_env.c | 181 +++++- - 11 files changed, 2655 insertions(+), 4 deletions(-) + src/uboot_env.c | 180 +++++- + 11 files changed, 2654 insertions(+), 4 deletions(-) create mode 100644 src/ta_ccmp1_aes.h create mode 100644 src/tee.h create mode 100644 src/tee_bench.h @@ -2576,7 +2576,7 @@ index 0000000..b1e37ec + +#endif diff --git a/src/uboot_env.c b/src/uboot_env.c -index 86f9b9e..f9aa985 100644 +index 86f9b9e..45b356f 100644 --- a/src/uboot_env.c +++ b/src/uboot_env.c @@ -41,6 +41,9 @@ @@ -2598,15 +2598,7 @@ index 86f9b9e..f9aa985 100644 { int i; int len; -@@ -993,6 +996,7 @@ static int env_caam_get_keymod(unsigned char output[16]) - return -1; - } - ocotp_hwid[i] = ntohl(*(uint32_t *)buf); -+ fprintf(stderr, "HWID_%d %x \n ",i,ocotp_hwid[i]); - close(fd); - } else if (machine_is_compatible("digi,ccimx6ul") || - machine_is_compatible("digi,ccimx6")) { -@@ -1040,7 +1044,7 @@ static int env_caam_crypt(char *data, unsigned int size, const int enc) +@@ -1040,7 +1043,7 @@ static int env_caam_crypt(char *data, unsigned int size, const int enc) char *buffer; unsigned char key_modifier[16]; @@ -2615,7 +2607,7 @@ index 86f9b9e..f9aa985 100644 if (ret) return ret; -@@ -1087,6 +1091,165 @@ free: +@@ -1087,6 +1090,165 @@ free: return ret; } @@ -2781,7 +2773,7 @@ index 86f9b9e..f9aa985 100644 int libuboot_env_store(struct uboot_ctx *ctx) { struct var_entry *entry; -@@ -1163,7 +1326,12 @@ int libuboot_env_store(struct uboot_ctx *ctx) +@@ -1163,7 +1325,12 @@ int libuboot_env_store(struct uboot_ctx *ctx) } if (ctx->encrypted) { @@ -2795,7 +2787,7 @@ index 86f9b9e..f9aa985 100644 if (ret) { fprintf(stderr, "Error: can't encrypt env for flash\n"); -@@ -1237,7 +1405,12 @@ static int libuboot_load(struct uboot_ctx *ctx) +@@ -1237,7 +1404,12 @@ static int libuboot_load(struct uboot_ctx *ctx) crc = *(uint32_t *)(buf[i] + offsetcrc); dev->crc = crc32(0, (uint8_t *)data, usable_envsize); if (ctx->encrypted) { From e954bd1e6d863aef2ddc2d5664fda1c908e6f46a Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Tue, 9 Jan 2024 12:58:48 +0100 Subject: [PATCH 099/118] lvgl-demo: build from our github fork instead of patching the original repo Our fork contains the same patches that were originally applied in this recipe. This makes it easier for customers to identify the modifications necessary to get LVGL working on our platforms. Signed-off-by: Gabriel Valcazar --- ...ake-demo-compatible-with-any-backend.patch | 204 ------------------ .../0002-Miscellaneous-improvements.patch | 87 -------- .../recipes-graphics/lvgl/lvgl-demo_8.3.0.bb | 10 +- 3 files changed, 5 insertions(+), 296 deletions(-) delete mode 100644 meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0001-Make-demo-compatible-with-any-backend.patch delete mode 100644 meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0002-Miscellaneous-improvements.patch diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0001-Make-demo-compatible-with-any-backend.patch b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0001-Make-demo-compatible-with-any-backend.patch deleted file mode 100644 index 985c79bc0..000000000 --- a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0001-Make-demo-compatible-with-any-backend.patch +++ /dev/null @@ -1,204 +0,0 @@ -From: Gabriel Valcazar -Date: Mon, 6 Nov 2023 13:45:27 +0100 -Subject: [PATCH] Make demo compatible with any backend - -Apply changes so the demo builds and runs with any of the 4 major backends -(wayland, sdl, drm and fbdev) - -Signed-off-by: Gabriel Valcazar ---- - main.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 128 insertions(+), 14 deletions(-) - -diff --git a/main.c b/main.c -index 33cd734..bb0248a 100644 ---- a/main.c -+++ b/main.c -@@ -1,12 +1,23 @@ - #include "lvgl/lvgl.h" - #include "lvgl/demos/lv_demos.h" - #include "lv_drivers/display/fbdev.h" -+#include "lv_drivers/display/drm.h" - #include "lv_drivers/indev/evdev.h" -+#include "lv_drivers/sdl/sdl.h" -+#include "lv_drivers/wayland/wayland.h" -+ -+#if USE_SDL -+#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ -+#include -+#endif -+ - #include - #include - #include - #include - -+static void backend_init(void); -+ - #define DISP_BUF_SIZE (128 * 1024) - - int main(void) -@@ -14,8 +25,78 @@ int main(void) - /*LittlevGL init*/ - lv_init(); - -- /*Linux frame buffer device init*/ -- fbdev_init(); -+ backend_init(); -+ -+ /*Create a Demo*/ -+ lv_demo_widgets(); -+ -+ /*Handle LitlevGL tasks (tickless mode)*/ -+ while(1) { -+ lv_timer_handler(); -+ usleep(5000); -+ } -+ -+ return 0; -+} -+ -+static void backend_init(void) -+{ -+#if USE_WAYLAND -+ lv_wayland_init(); -+ -+ /* Create a display */ -+ lv_disp_t * disp = lv_wayland_create_window(800, 480, "lvgl wayland demo", NULL /*close_cb*/); -+#elif USE_SDL -+ sdl_init(); -+ -+ /*A small buffer for LittlevGL to draw the screen's content*/ -+ static lv_color_t buf[SDL_HOR_RES * 100]; -+ -+ /*Initialize a descriptor for the buffer*/ -+ static lv_disp_draw_buf_t disp_buf; -+ lv_disp_draw_buf_init(&disp_buf, buf, NULL, SDL_HOR_RES * 100); -+ -+ /*Initialize and register a display driver*/ -+ static lv_disp_drv_t disp_drv; -+ lv_disp_drv_init(&disp_drv); -+ disp_drv.draw_buf = &disp_buf; -+ disp_drv.flush_cb = sdl_display_flush; -+ disp_drv.hor_res = SDL_HOR_RES; -+ disp_drv.ver_res = SDL_VER_RES; -+ lv_disp_drv_register(&disp_drv); -+ -+ lv_group_t * g = lv_group_create(); -+ lv_group_set_default(g); -+ -+ static lv_indev_drv_t indev_drv_1; -+ lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/ -+ indev_drv_1.type = LV_INDEV_TYPE_POINTER; -+ -+ /*This function will be called periodically (by the library) to get the mouse position and state*/ -+ indev_drv_1.read_cb = sdl_mouse_read; -+ lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); -+ -+ /*Set a cursor for the mouse*/ -+ LV_IMG_DECLARE(mouse_cursor_icon) -+ lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */ -+ lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/ -+ lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/ -+ -+ static lv_indev_drv_t indev_drv_2; -+ lv_indev_drv_init(&indev_drv_2); /*Basic initialization*/ -+ indev_drv_2.type = LV_INDEV_TYPE_KEYPAD; -+ indev_drv_2.read_cb = sdl_keyboard_read; -+ lv_indev_t *kb_indev = lv_indev_drv_register(&indev_drv_2); -+ lv_indev_set_group(kb_indev, g); -+ -+ static lv_indev_drv_t indev_drv_3; -+ lv_indev_drv_init(&indev_drv_3); /*Basic initialization*/ -+ indev_drv_3.type = LV_INDEV_TYPE_ENCODER; -+ indev_drv_3.read_cb = sdl_mousewheel_read; -+ lv_indev_t * enc_indev = lv_indev_drv_register(&indev_drv_3); -+ lv_indev_set_group(enc_indev, g); -+#elif USE_DRM -+ drm_init(); - - /*A small buffer for LittlevGL to draw the screen's content*/ - static lv_color_t buf[DISP_BUF_SIZE]; -@@ -28,12 +109,20 @@ int main(void) - static lv_disp_drv_t disp_drv; - lv_disp_drv_init(&disp_drv); - disp_drv.draw_buf = &disp_buf; -- disp_drv.flush_cb = fbdev_flush; -- disp_drv.hor_res = 800; -- disp_drv.ver_res = 480; -+ disp_drv.flush_cb = drm_flush; -+ lv_coord_t drm_width, drm_height; -+ /* get size from DRM/KMS backend */ -+ uint32_t drm_dpi; -+ drm_get_sizes(&drm_width, &drm_height, &drm_dpi); -+ disp_drv.hor_res = drm_width; -+ disp_drv.ver_res = drm_height; - lv_disp_drv_register(&disp_drv); - - evdev_init(); -+ -+ lv_group_t * g = lv_group_create(); -+ lv_group_set_default(g); -+ - static lv_indev_drv_t indev_drv_1; - lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/ - indev_drv_1.type = LV_INDEV_TYPE_POINTER; -@@ -42,24 +131,49 @@ int main(void) - indev_drv_1.read_cb = evdev_read; - lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); - -- - /*Set a cursor for the mouse*/ - LV_IMG_DECLARE(mouse_cursor_icon) - lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */ - lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/ - lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/ -+#elif USE_FBDEV -+ fbdev_init(); - -+ /*A small buffer for LittlevGL to draw the screen's content*/ -+ static lv_color_t buf[DISP_BUF_SIZE]; - -- /*Create a Demo*/ -- lv_demo_widgets(); -+ /*Initialize a descriptor for the buffer*/ -+ static lv_disp_draw_buf_t disp_buf; -+ lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE); - -- /*Handle LitlevGL tasks (tickless mode)*/ -- while(1) { -- lv_timer_handler(); -- usleep(5000); -- } -+ /*Initialize and register a display driver*/ -+ static lv_disp_drv_t disp_drv; -+ lv_disp_drv_init(&disp_drv); -+ disp_drv.draw_buf = &disp_buf; -+ disp_drv.flush_cb = fbdev_flush; -+ disp_drv.hor_res = 800; -+ disp_drv.ver_res = 480; -+ lv_disp_drv_register(&disp_drv); - -- return 0; -+ evdev_init(); -+ -+ lv_group_t * g = lv_group_create(); -+ lv_group_set_default(g); -+ -+ static lv_indev_drv_t indev_drv_1; -+ lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/ -+ indev_drv_1.type = LV_INDEV_TYPE_POINTER; -+ -+ /*This function will be called periodically (by the library) to get the mouse position and state*/ -+ indev_drv_1.read_cb = evdev_read; -+ lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); -+ -+ /*Set a cursor for the mouse*/ -+ LV_IMG_DECLARE(mouse_cursor_icon) -+ lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */ -+ lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/ -+ lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/ -+#endif - } - - /*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/ diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0002-Miscellaneous-improvements.patch b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0002-Miscellaneous-improvements.patch deleted file mode 100644 index 5f11761cf..000000000 --- a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0002-Miscellaneous-improvements.patch +++ /dev/null @@ -1,87 +0,0 @@ -From: Gabriel Valcazar -Date: Wed, 8 Nov 2023 13:25:25 +0100 -Subject: [PATCH] Miscellaneous improvements: - - * Change LV_COLOR_DEPTH from 32 to 16 to fix output on fbdev backend - * Increase DISP_BUF_SIZE to 8 MiB to improve performance on fbdev and drm - backends - * Create common macros for app dimensions - -Signed-off-by: Gabriel Valcazar ---- - lv_conf.h | 2 +- - lv_drv_conf.h | 6 ++++-- - main.c | 9 +++++---- - 3 files changed, 10 insertions(+), 7 deletions(-) - -diff --git a/lv_conf.h b/lv_conf.h -index 3137b1a..3f36997 100644 ---- a/lv_conf.h -+++ b/lv_conf.h -@@ -30,7 +30,7 @@ extern uint32_t custom_tick_get(void); - *====================*/ - - /*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ --#define LV_COLOR_DEPTH 32 -+#define LV_COLOR_DEPTH 16 - - /*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ - #define LV_COLOR_16_SWAP 0 -diff --git a/lv_drv_conf.h b/lv_drv_conf.h -index d40e703..554eba9 100644 ---- a/lv_drv_conf.h -+++ b/lv_drv_conf.h -@@ -32,6 +32,8 @@ - #define LV_DRV_DISP_INCLUDE /*Dummy include by default*/ - #define LV_DRV_DISP_CMD_DATA(val) /*pin_x_set(val)*/ /*Set the command/data pin to 'val'*/ - #define LV_DRV_DISP_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/ -+#define LV_DRV_DISP_HOR_RES 800 -+#define LV_DRV_DISP_VER_RES 480 - - /*--------- - * SPI -@@ -95,8 +97,8 @@ - #endif - - #if USE_SDL || USE_SDL_GPU --# define SDL_HOR_RES 480 --# define SDL_VER_RES 320 -+# define SDL_HOR_RES LV_DRV_DISP_HOR_RES -+# define SDL_VER_RES LV_DRV_DISP_VER_RES - - /* Scale window by this factor (useful when simulating small screens) */ - # define SDL_ZOOM 1 -diff --git a/main.c b/main.c -index bb0248a..f3fb69e 100644 ---- a/main.c -+++ b/main.c -@@ -18,7 +18,8 @@ - - static void backend_init(void); - --#define DISP_BUF_SIZE (128 * 1024) -+/* Originally 128 KiB, increase to 8 MiB to improve performance */ -+#define DISP_BUF_SIZE (8 * 1024 * 1024) - - int main(void) - { -@@ -45,7 +46,7 @@ static void backend_init(void) - lv_wayland_init(); - - /* Create a display */ -- lv_disp_t * disp = lv_wayland_create_window(800, 480, "lvgl wayland demo", NULL /*close_cb*/); -+ lv_disp_t * disp = lv_wayland_create_window(LV_DRV_DISP_HOR_RES, LV_DRV_DISP_VER_RES, "lvgl wayland demo", NULL /*close_cb*/); - #elif USE_SDL - sdl_init(); - -@@ -151,8 +152,8 @@ static void backend_init(void) - lv_disp_drv_init(&disp_drv); - disp_drv.draw_buf = &disp_buf; - disp_drv.flush_cb = fbdev_flush; -- disp_drv.hor_res = 800; -- disp_drv.ver_res = 480; -+ disp_drv.hor_res = LV_DRV_DISP_HOR_RES; -+ disp_drv.ver_res = LV_DRV_DISP_VER_RES; - lv_disp_drv_register(&disp_drv); - - evdev_init(); diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb index eea723884..ebe8355f8 100644 --- a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb +++ b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb @@ -1,16 +1,16 @@ SUMMARY = "LVGL Demo Application" -HOMEPAGE = "https://github.com/lvgl/lv_port_linux_frame_buffer" +HOMEPAGE = "https://github.com/digi-embedded/lv_port_linux_frame_buffer" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=802d3d83ae80ef5f343050bf96cce3a4 \ file://lv_drivers/LICENSE;md5=d6fc0df890c5270ef045981b516bb8f2 \ file://lvgl/LICENCE.txt;md5=bf1198c89ae87f043108cea62460b03a" +SRCBRANCH ?= "dey/master" + SRC_URI = " \ - gitsm://github.com/lvgl/lv_port_linux_frame_buffer.git;branch=master;protocol=https \ - file://0001-Make-demo-compatible-with-any-backend.patch \ - file://0002-Miscellaneous-improvements.patch \ + gitsm://github.com/digi-embedded/lv_port_linux_frame_buffer.git;branch=${SRCBRANCH};protocol=https \ " -SRCREV = "adf2c4490e17a1b9ec1902cc412a24b3b8235c8e" +SRCREV = "f9426988a70f485ba7895bb1c26493f2fffcd957" EXTRA_OEMAKE = "DESTDIR=${D}" From 3305d78ec16e24ee4421a7379c04729f42ca3cdd Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Thu, 11 Jan 2024 11:43:46 +0100 Subject: [PATCH 100/118] python3-xbee: update to most recent available version Set the PV variable to keep track of the currently used version. Signed-off-by: Gabriel Valcazar --- .../recipes-devtools/python3-xbee/python3-xbee_git.bb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/recipes-devtools/python3-xbee/python3-xbee_git.bb b/meta-digi-dey/recipes-devtools/python3-xbee/python3-xbee_git.bb index 9fa6381c4..fda6a4d8a 100644 --- a/meta-digi-dey/recipes-devtools/python3-xbee/python3-xbee_git.bb +++ b/meta-digi-dey/recipes-devtools/python3-xbee/python3-xbee_git.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2022, 2023 Digi International Inc. +# Copyright (C) 2022-2024 Digi International Inc. SUMMARY = "Python library to interact with Digi International's XBee radio frequency modules." DESCRIPTION = "The XBee Python Library provides the ability to communicate with remote nodes in the network, IoT devices and other interfaces of the local device." @@ -8,7 +8,8 @@ LICENSE = "MPL-2.0" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f74526e982749d58a537b3fcdb5d3318" SRCBRANCH ?= "master" -SRCREV = "1024d8954e1b445fe6aacd7f0880de65978c351b" +SRCREV = "36a5b637821e6941aa489d3235867b4f44e33eca" +PV = "1.4.1+git${SRCPV}" SRC_URI = " \ git://github.com/digidotcom/xbee-python.git;protocol=https;branch=${SRCBRANCH} \ From fdd8026d30410c472c611b2ef3e4d63b7f62a94d Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Thu, 11 Jan 2024 11:46:17 +0100 Subject: [PATCH 101/118] python3-connectcore-ble: update to v1.0.6 Set the PV variable to keep track of the currently used version. Signed-off-by: Gabriel Valcazar --- .../python3-connectcore-ble/python3-connectcore-ble_git.bb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/recipes-devtools/python3-connectcore-ble/python3-connectcore-ble_git.bb b/meta-digi-dey/recipes-devtools/python3-connectcore-ble/python3-connectcore-ble_git.bb index db73c96b4..6910899d4 100644 --- a/meta-digi-dey/recipes-devtools/python3-connectcore-ble/python3-connectcore-ble_git.bb +++ b/meta-digi-dey/recipes-devtools/python3-connectcore-ble/python3-connectcore-ble_git.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2022, 2023, Digi International Inc. +# Copyright (C) 2022-2024, Digi International Inc. SUMMARY = "Bluetooth Low Energy Python library for ConnetCore devices" DESCRIPTION = "The ConnectCore BLE Python library allows your Digi International's ConnectCore modules to interact with mobile applications." @@ -8,7 +8,8 @@ LICENSE = "MPL-2.0" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MPL-2.0;md5=815ca599c9df247a0c7f619bab123dad" SRCBRANCH ?= "master" -SRCREV = "eeeb705ded84cfb4ba1a4b50a41a98e3bfe59700" +SRCREV = "72cc9eb39088ae6b16d32ca03c74e8885323279a" +PV = "1.0.6" SRC_URI = " \ ${DIGI_GITHUB_GIT}/connectcore-ble-python.git;protocol=https;branch=${SRCBRANCH} \ From 952edde975712fce965564cb4f224712f593bb6b Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 11 Jan 2024 14:40:22 +0100 Subject: [PATCH 102/118] meta-digi: update cmake-native to version 3.25 Backport a new version of cmake-native from Poky's mickledore release. This is required by the new version of the onnxruntime package (updated in the following commit). Signed-off-by: Javier Viguera --- .../cmake/cmake-native_3.25.2.bb | 67 +++++++++++++++++++ .../meta-ml/recipes-devtools/cmake/cmake.inc | 28 ++++++++ ...stem-use-oe-environment-vars-to-load.patch | 44 ++++++++++++ ...1-CMakeLists.txt-disable-USE_NGHTTP2.patch | 31 +++++++++ ...xt2fs-ext2_fs.h-by-cmake-s-internal-.patch | 39 +++++++++++ .../cmake/cmake/OEToolchainConfig.cmake | 20 ++++++ .../cmake/cmake/environment.d-cmake.sh | 2 + 7 files changed, 231 insertions(+) create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake-native_3.25.2.bb create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake.inc create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0001-CMakeDetermineSystem-use-oe-environment-vars-to-load.patch create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0001-CMakeLists.txt-disable-USE_NGHTTP2.patch create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0005-Disable-use-of-ext2fs-ext2_fs.h-by-cmake-s-internal-.patch create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/OEToolchainConfig.cmake create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/environment.d-cmake.sh diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake-native_3.25.2.bb b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake-native_3.25.2.bb new file mode 100644 index 000000000..c150aef5e --- /dev/null +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake-native_3.25.2.bb @@ -0,0 +1,67 @@ +require cmake.inc +inherit native + +DEPENDS += "bzip2-replacement-native xz-native zlib-native ncurses-native zstd-native openssl-native" + +SRC_URI += "file://OEToolchainConfig.cmake \ + file://environment.d-cmake.sh \ + file://0001-CMakeDetermineSystem-use-oe-environment-vars-to-load.patch \ + file://0005-Disable-use-of-ext2fs-ext2_fs.h-by-cmake-s-internal-.patch \ + file://0001-CMakeLists.txt-disable-USE_NGHTTP2.patch \ + " + +LICENSE:append = " & BSD-1-Clause & MIT & BSD-2-Clause & curl" +LIC_FILES_CHKSUM:append = " \ + file://Utilities/cmjsoncpp/LICENSE;md5=5d73c165a0f9e86a1342f32d19ec5926 \ + file://Utilities/cmlibarchive/COPYING;md5=d499814247adaee08d88080841cb5665 \ + file://Utilities/cmexpat/COPYING;md5=9e2ce3b3c4c0f2670883a23bbd7c37a9 \ + file://Utilities/cmlibrhash/COPYING;md5=a8c2a557a5c53b1c12cddbee98c099af \ + file://Utilities/cmlibuv/LICENSE;md5=ad93ca1fffe931537fcf64f6fcce084d \ + file://Utilities/cmcurl/COPYING;md5=190c514872597083303371684954f238 \ +" + +B = "${WORKDIR}/build" +do_configure[cleandirs] = "${B}" + +CMAKE_EXTRACONF = "\ + -DCMAKE_LIBRARY_PATH=${STAGING_LIBDIR_NATIVE} \ + -DBUILD_CursesDialog=1 \ + -DCMAKE_USE_SYSTEM_LIBRARIES=1 \ + -DCMAKE_USE_SYSTEM_LIBRARY_JSONCPP=0 \ + -DCMAKE_USE_SYSTEM_LIBRARY_LIBARCHIVE=0 \ + -DCMAKE_USE_SYSTEM_LIBRARY_LIBUV=0 \ + -DCMAKE_USE_SYSTEM_LIBRARY_LIBRHASH=0 \ + -DCMAKE_USE_SYSTEM_LIBRARY_EXPAT=0 \ + -DCMAKE_USE_SYSTEM_LIBRARY_CURL=0 \ + -DENABLE_ACL=0 -DHAVE_ACL_LIBACL_H=0 \ + -DHAVE_SYS_ACL_H=0 \ +" + +do_configure () { + ${S}/configure --verbose --prefix=${prefix} \ + ${@oe.utils.parallel_make_argument(d, '--parallel=%d')} \ + ${@bb.utils.contains('CCACHE', 'ccache ', '--enable-ccache', '', d)} \ + -- ${CMAKE_EXTRACONF} +} + +do_compile() { + oe_runmake +} + +do_install() { + oe_runmake 'DESTDIR=${D}' install + + # The following codes are here because eSDK needs to provide compatibilty + # for SDK. That is, eSDK could also be used like traditional SDK. + mkdir -p ${D}${datadir}/cmake + install -m 644 ${WORKDIR}/OEToolchainConfig.cmake ${D}${datadir}/cmake/ + mkdir -p ${D}${base_prefix}/environment-setup.d + install -m 644 ${WORKDIR}/environment.d-cmake.sh ${D}${base_prefix}/environment-setup.d/cmake.sh + + # Help docs create tons of files in the native sysroot and aren't needed there + rm -rf ${D}${datadir}/cmake-*/Help +} + +do_compile[progress] = "percent" + +SYSROOT_DIRS_NATIVE += "${datadir}/cmake ${base_prefix}/environment-setup.d" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake.inc b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake.inc new file mode 100644 index 000000000..b7e674c4c --- /dev/null +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake.inc @@ -0,0 +1,28 @@ +# Copyright (C) 2005, Koninklijke Philips Electronics NV. All Rights Reserved +# Released under the MIT license (see packages/COPYING) + +SUMMARY = "Cross-platform, open-source make system" +DESCRIPTION = "CMake is used to control the software compilation process \ +using simple platform and compiler independent configuration files. CMake \ +generates native makefiles and workspaces that can be used in the compiler \ +environment of your choice." +HOMEPAGE = "http://www.cmake.org/" +BUGTRACKER = "http://public.kitware.com/Bug/my_view_page.php" +SECTION = "console/utils" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://Copyright.txt;md5=09069e0fffe4e5eaf6dde04c3b1932e5 \ + file://Source/cmake.h;beginline=1;endline=2;md5=a5f70e1fef8614734eae0d62b4f5891b \ + " + +CMAKE_MAJOR_VERSION = "${@'.'.join(d.getVar('PV').split('.')[0:2])}" + +SRC_URI = "https://cmake.org/files/v${CMAKE_MAJOR_VERSION}/cmake-${PV}.tar.gz \ +" + +SRC_URI[sha256sum] = "c026f22cb931dd532f648f087d587f07a1843c6e66a3dfca4fb0ea21944ed33c" + +UPSTREAM_CHECK_REGEX = "cmake-(?P\d+(\.\d+)+)\.tar" + +# This is specific to the npm package that installs cmake, so isn't +# relevant to OpenEmbedded +CVE_CHECK_IGNORE += "CVE-2016-10642" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0001-CMakeDetermineSystem-use-oe-environment-vars-to-load.patch b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0001-CMakeDetermineSystem-use-oe-environment-vars-to-load.patch new file mode 100644 index 000000000..d13c367e7 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0001-CMakeDetermineSystem-use-oe-environment-vars-to-load.patch @@ -0,0 +1,44 @@ +From 5acfcb2aba1a5641d390558fdf288373f5e39cb5 Mon Sep 17 00:00:00 2001 +From: Cody P Schafer +Date: Thu, 27 Apr 2017 11:35:05 -0400 +Subject: [PATCH] CMakeDetermineSystem: use oe environment vars to load default + toolchain file in sdk + +Passing the toolchain by: + + - shell aliases does not work if cmake is called by a script + - unconditionally by a wrapper script causes cmake to believe it is + configuring things when it is not (for example, `cmake --build` breaks). + +The OE_CMAKE_TOOLCHAIN_FILE variable is only used as a default if no +toolchain is explicitly specified. + +Setting the CMAKE_TOOLCHAIN_FILE cmake variable is marked as cached +because '-D' options are cache entries themselves. + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Cody P Schafer +Signed-off-by: Otavio Salvador + +--- + Modules/CMakeDetermineSystem.cmake | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/Modules/CMakeDetermineSystem.cmake b/Modules/CMakeDetermineSystem.cmake +index 2c2c2ac3..fae4f97f 100644 +--- a/Modules/CMakeDetermineSystem.cmake ++++ b/Modules/CMakeDetermineSystem.cmake +@@ -112,6 +112,13 @@ else() + endif() + endif() + ++if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) ++ if(DEFINED ENV{OE_CMAKE_TOOLCHAIN_FILE}) ++ set(CMAKE_TOOLCHAIN_FILE "$ENV{OE_CMAKE_TOOLCHAIN_FILE}" CACHE FILEPATH "toolchain file") ++ message(STATUS "Toolchain file defaulted to '${CMAKE_TOOLCHAIN_FILE}'") ++ endif() ++endif() ++ + # if a toolchain file is used, the user wants to cross compile. + # in this case read the toolchain file and keep the CMAKE_HOST_SYSTEM_* + # variables around so they can be used in CMakeLists.txt. diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0001-CMakeLists.txt-disable-USE_NGHTTP2.patch b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0001-CMakeLists.txt-disable-USE_NGHTTP2.patch new file mode 100644 index 000000000..d6486cb45 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0001-CMakeLists.txt-disable-USE_NGHTTP2.patch @@ -0,0 +1,31 @@ +From 3fd6082c52a8140db5995afb59fb391f7d5c19d7 Mon Sep 17 00:00:00 2001 +From: Changqing Li +Date: Wed, 28 Dec 2022 17:51:27 +0800 +Subject: [PATCH] CMakeLists.txt: disable USE_NGHTTP2 + +nghttp2 depends on cmake-native to build, to break circular +dependency, disable nghttp2. + +Upstream-Status: Inappropriate [oe specific] + +Signed-off-by: Changqing Li +--- + Utilities/cmcurl/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Utilities/cmcurl/CMakeLists.txt b/Utilities/cmcurl/CMakeLists.txt +index f842270b..17b1ce19 100644 +--- a/Utilities/cmcurl/CMakeLists.txt ++++ b/Utilities/cmcurl/CMakeLists.txt +@@ -68,7 +68,7 @@ set(ENABLE_UNIX_SOCKETS OFF CACHE INTERNAL "No curl Unix domain sockets support" + set(HTTP_ONLY OFF CACHE INTERNAL "Curl is not http-only") + set(PICKY_COMPILER OFF CACHE INTERNAL "Enable picky compiler options") + set(USE_LIBIDN2 ON) +-set(USE_NGHTTP2 ON) ++set(USE_NGHTTP2 OFF) + set(USE_NGTCP2 OFF) + set(USE_QUICHE OFF) + set(USE_WIN32_IDN OFF) +-- +2.25.1 + diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0005-Disable-use-of-ext2fs-ext2_fs.h-by-cmake-s-internal-.patch b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0005-Disable-use-of-ext2fs-ext2_fs.h-by-cmake-s-internal-.patch new file mode 100644 index 000000000..d6f7308fe --- /dev/null +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/0005-Disable-use-of-ext2fs-ext2_fs.h-by-cmake-s-internal-.patch @@ -0,0 +1,39 @@ +From fd9a04c1434e12f21c043385e306e0b52d38d749 Mon Sep 17 00:00:00 2001 +From: Otavio Salvador +Date: Thu, 5 Jul 2018 10:28:04 -0300 +Subject: [PATCH] Disable use of ext2fs/ext2_fs.h by cmake's internal + + libarchive copy +Organization: O.S. Systems Software LTDA. + +We don't want to add a dependency on e2fsprogs-native for cmake-native, +and we don't use CPack so just disable this functionality. + +Upstream-Status: Inappropriate [config] + +Signed-off-by: Paul Eggleton +Signed-off-by: Otavio Salvador + +--- + Utilities/cmlibarchive/CMakeLists.txt | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/Utilities/cmlibarchive/CMakeLists.txt b/Utilities/cmlibarchive/CMakeLists.txt +index bfcaf30..2960683 100644 +--- a/Utilities/cmlibarchive/CMakeLists.txt ++++ b/Utilities/cmlibarchive/CMakeLists.txt +@@ -682,12 +682,8 @@ LA_CHECK_INCLUDE_FILE("copyfile.h" HAVE_COPYFILE_H) + LA_CHECK_INCLUDE_FILE("direct.h" HAVE_DIRECT_H) + LA_CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H) + LA_CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H) +-LA_CHECK_INCLUDE_FILE("ext2fs/ext2_fs.h" HAVE_EXT2FS_EXT2_FS_H) +- +-CHECK_C_SOURCE_COMPILES("#include +-#include +-int main(void) { return EXT2_IOC_GETFLAGS; }" HAVE_WORKING_EXT2_IOC_GETFLAGS) +- ++SET(HAVE_EXT2FS_EXT2_FS_H 0) ++SET(HAVE_WORKING_EXT2_IOC_GETFLAGS 0) + LA_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H) + LA_CHECK_INCLUDE_FILE("grp.h" HAVE_GRP_H) + LA_CHECK_INCLUDE_FILE("io.h" HAVE_IO_H) diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/OEToolchainConfig.cmake b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/OEToolchainConfig.cmake new file mode 100644 index 000000000..d6a1e0464 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/OEToolchainConfig.cmake @@ -0,0 +1,20 @@ +set( CMAKE_SYSTEM_NAME Linux ) +set( CMAKE_C_FLAGS $ENV{CFLAGS} CACHE STRING "" FORCE ) +set( CMAKE_CXX_FLAGS $ENV{CXXFLAGS} CACHE STRING "" FORCE ) +set( CMAKE_SYSROOT $ENV{OECORE_TARGET_SYSROOT} ) + +set( CMAKE_FIND_ROOT_PATH $ENV{OECORE_TARGET_SYSROOT} ) +set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) +set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) +set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) +set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY ) + +set(CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX "$ENV{OE_CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX}") + +set( CMAKE_SYSTEM_PROCESSOR $ENV{OECORE_TARGET_ARCH} ) + +# Include the toolchain configuration subscripts +file( GLOB toolchain_config_files "${CMAKE_CURRENT_LIST_FILE}.d/*.cmake" ) +foreach(config ${toolchain_config_files}) + include(${config}) +endforeach() diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/environment.d-cmake.sh b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/environment.d-cmake.sh new file mode 100644 index 000000000..7bdb19fb6 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-devtools/cmake/cmake/environment.d-cmake.sh @@ -0,0 +1,2 @@ +export OE_CMAKE_TOOLCHAIN_FILE="$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake" +export OE_CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX="`echo $OECORE_BASELIB | sed -e s/lib//`" From 02d15235919f9047b934d49e8dc3a5b1a75a0643 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 11 Jan 2024 14:40:52 +0100 Subject: [PATCH 103/118] ccimx93: update ML/AI packages for NXP release 6.1.55-2.2.0 As part of the integration of the new ML package, also update the ethos-u-firmware binary built from Stash: Repo: emp/ethos_u_firmware.git Revision: bd5506ddba364ad04602d5009b77077f78450b97 Source: NXP's MCUXpresso SDK_2.14.2_MIMX9352xxxxM Co-authored-by: Javier Viguera Signed-off-by: Isaac Hermida Signed-off-by: Javier Viguera --- .../conf/machine/include/imx-digi-base.inc | 17 +- ...dparty-ippicv-Use-pre-downloaded-ipp.patch | 36 ++++ ...maller-version-of-download_models.py.patch | 179 ++++++++++++++++++ .../opencv/opencv/0001-Dont-use-isystem.patch | 28 +++ .../opencv/0001-Make-ts-module-external.patch | 42 ++++ ...-around-deprecated-ffmpeg-RAW-functi.patch | 31 +++ .../0003-To-fix-errors-as-following.patch | 70 +++++++ .../opencv/opencv/OpenCV_DNN_examples.patch | 141 ++++++++++++++ .../opencv/opencv/download.patch | 41 ++++ .../opencv/opencv_4.7.0.imx.bb | 23 +++ .../packagegroup/packagegroup-imx-ml.bbappend | 3 +- .../arm-compute-library_22.05.bbappend | 6 +- .../eiq-examples/eiq-examples_git.bb | 4 +- .../ethos-u-driver-stack_22.08.bbappend | 6 - .../ethos-u-driver-stack_23.08.bb | 11 ++ .../ethos-u-firmware/ccimx93/ethosu_firmware | Bin 242376 -> 242440 bytes .../ethos-u-firmware_22.08.bbappend | 17 -- .../ethos-u-firmware_23.08.bb | 21 ++ ...-u-vela_3.8.0.bb => ethos-u-vela_3.9.0.bb} | 4 +- .../modelrunner/modelrunner_2.3.0.bb | 44 ----- .../onnxruntime/onnxruntime-native_1.13.1.bb | 34 ---- ...untime_1.13.1.bb => onnxruntime_1.16.1.bb} | 23 +-- ...-2.11.1.inc => tensorflow-lite-2.12.1.inc} | 4 +- ...tensorflow-lite-ethosu-delegate_2.12.1.bb} | 4 +- ...b => tensorflow-lite-host-tools_2.12.1.bb} | 0 .../tensorflow-lite_2.%.bbappend | 12 -- ...te_2.11.1.bb => tensorflow-lite_2.12.1.bb} | 6 - 27 files changed, 649 insertions(+), 158 deletions(-) create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-3rdparty-ippicv-Use-pre-downloaded-ipp.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Add-smaller-version-of-download_models.py.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Dont-use-isystem.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Make-ts-module-external.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Temporarliy-work-around-deprecated-ffmpeg-RAW-functi.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0003-To-fix-errors-as-following.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/OpenCV_DNN_examples.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/download.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv_4.7.0.imx.bb delete mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bbappend create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_23.08.bb delete mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-firmware_22.08.bbappend create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-firmware_23.08.bb rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-vela/{ethos-u-vela_3.8.0.bb => ethos-u-vela_3.9.0.bb} (91%) delete mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/modelrunner/modelrunner_2.3.0.bb delete mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/onnxruntime/onnxruntime-native_1.13.1.bb rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/onnxruntime/{onnxruntime_1.13.1.bb => onnxruntime_1.16.1.bb} (89%) rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/{tensorflow-lite-2.11.1.inc => tensorflow-lite-2.12.1.inc} (55%) rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/{tensorflow-lite-ethosu-delegate_2.11.1.bb => tensorflow-lite-ethosu-delegate_2.12.1.bb} (94%) rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/{tensorflow-lite-host-tools_2.11.1.bb => tensorflow-lite-host-tools_2.12.1.bb} (100%) delete mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/tensorflow-lite_2.%.bbappend rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/{tensorflow-lite_2.11.1.bb => tensorflow-lite_2.12.1.bb} (95%) diff --git a/meta-digi-arm/conf/machine/include/imx-digi-base.inc b/meta-digi-arm/conf/machine/include/imx-digi-base.inc index b3946d897..d04222f3c 100644 --- a/meta-digi-arm/conf/machine/include/imx-digi-base.inc +++ b/meta-digi-arm/conf/machine/include/imx-digi-base.inc @@ -278,22 +278,23 @@ PREFERRED_VERSION_optee-client:mx9-nxp-bsp ??= "4.0.0.imx" PREFERRED_VERSION_optee-test:mx8-nxp-bsp ??= "3.19.0.imx" PREFERRED_VERSION_optee-test:mx9-nxp-bsp ??= "4.0.0.imx" -# Machine learning backports from NXP's lf-6.1.36-2.1.0 release -PREFERRED_VERSION_ethos-u-vela:ccimx93 = "3.8.0" +# Machine learning backports from NXP's lf-6.1.55-2.2.0 release +PREFERRED_VERSION_ethos-u-driver-stack:ccimx93 = "23.08" +PREFERRED_VERSION_ethos-u-firmware:ccimx93 = "23.08" +PREFERRED_VERSION_ethos-u-vela:ccimx93 = "3.9.0" PREFERRED_VERSION_flatbuffers:ccimx93 = "2.0.7" PREFERRED_VERSION_flatbuffers-native:ccimx93 = "2.0.7" -PREFERRED_VERSION_onnxruntime:ccimx93 = "1.13.1" -PREFERRED_VERSION_onnxruntime-native:ccimx93 = "1.13.1" -PREFERRED_VERSION_tensorflow-lite:ccimx93 = "2.11.1" -PREFERRED_VERSION_tensorflow-lite-host-tools:ccimx93 = "2.11.1" -PREFERRED_VERSION_tensorflow-lite-host-tools-native:ccimx93 = "2.11.1" +PREFERRED_VERSION_onnxruntime:ccimx93 = "1.16.1" +PREFERRED_VERSION_tensorflow-lite:ccimx93 = "2.12.1" +PREFERRED_VERSION_tensorflow-lite-host-tools:ccimx93 = "2.12.1" +PREFERRED_VERSION_tensorflow-lite-host-tools-native:ccimx93 = "2.12.1" # Optee runtime packages to install OPTEE_PKGS ??= "optee-client optee-os" # Use i.MX opencv Version PREFERRED_VERSION_opencv:mx8-nxp-bsp ??= "4.6.0.imx" -PREFERRED_VERSION_opencv:mx9-nxp-bsp ??= "4.6.0.imx" +PREFERRED_VERSION_opencv:mx9-nxp-bsp ??= "4.7.0.imx" EXTRA_IMAGEDEPENDS += "u-boot" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-3rdparty-ippicv-Use-pre-downloaded-ipp.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-3rdparty-ippicv-Use-pre-downloaded-ipp.patch new file mode 100644 index 000000000..9e6a61371 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-3rdparty-ippicv-Use-pre-downloaded-ipp.patch @@ -0,0 +1,36 @@ +From 9b4959b97d2e95d4b49cf6ca2a3fce3cdb484f2d Mon Sep 17 00:00:00 2001 +From: Ricardo Ribalda Delgado +Date: Thu, 31 Mar 2016 00:20:15 +0200 +Subject: [PATCH] 3rdparty/ippicv: Use pre-downloaded ipp + +Signed-off-by: Ricardo Ribalda Delgado +Signed-off-by: Ismo Puustinen + +--- + 3rdparty/ippicv/ippicv.cmake | 15 +-------------- + 1 file changed, 1 insertion(+), 14 deletions(-) + +diff --git a/3rdparty/ippicv/ippicv.cmake b/3rdparty/ippicv/ippicv.cmake +index 257af6fcc6..f88460450f 100644 +--- a/3rdparty/ippicv/ippicv.cmake ++++ b/3rdparty/ippicv/ippicv.cmake +@@ -34,18 +34,5 @@ function(download_ippicv root_var) + endif() + + set(THE_ROOT "${OpenCV_BINARY_DIR}/3rdparty/ippicv") +- ocv_download(FILENAME ${OPENCV_ICV_NAME} +- HASH ${OPENCV_ICV_HASH} +- URL +- "${OPENCV_IPPICV_URL}" +- "$ENV{OPENCV_IPPICV_URL}" +- "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/" +- DESTINATION_DIR "${THE_ROOT}" +- ID IPPICV +- STATUS res +- UNPACK RELATIVE_URL) +- +- if(res) +- set(${root_var} "${THE_ROOT}/${OPENCV_ICV_PACKAGE_SUBDIR}" PARENT_SCOPE) +- endif() ++ set(${root_var} "${THE_ROOT}/${OPENCV_ICV_PACKAGE_SUBDIR}" PARENT_SCOPE) + endfunction() diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Add-smaller-version-of-download_models.py.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Add-smaller-version-of-download_models.py.patch new file mode 100644 index 000000000..0aabee29f --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Add-smaller-version-of-download_models.py.patch @@ -0,0 +1,179 @@ +From fca4d9eec289f22c081daa2c61a1110e3f268f92 Mon Sep 17 00:00:00 2001 +From: Tom Hochstein +Date: Tue, 1 Sep 2020 14:57:07 -0500 +Subject: [PATCH] Add smaller version of download_models.py + +Signed-off-by: Tom Hochstein +--- + testdata/dnn/download_models_basic.py | 159 ++++++++++++++++++++++++++ + 1 file changed, 159 insertions(+) + create mode 100644 testdata/dnn/download_models_basic.py + +diff --git a/testdata/dnn/download_models_basic.py b/testdata/dnn/download_models_basic.py +new file mode 100644 +index 0000000..5c8a616 +--- /dev/null ++++ b/testdata/dnn/download_models_basic.py +@@ -0,0 +1,159 @@ ++#!/usr/bin/env python ++ ++from __future__ import print_function ++import hashlib ++import sys ++import tarfile ++if sys.version_info[0] < 3: ++ from urllib2 import urlopen ++else: ++ from urllib.request import urlopen ++ ++ ++class Model: ++ MB = 1024*1024 ++ BUFSIZE = 10*MB ++ ++ def __init__(self, **kwargs): ++ self.name = kwargs.pop('name') ++ self.url = kwargs.pop('url', None) ++ self.filename = kwargs.pop('filename') ++ self.sha = kwargs.pop('sha', None) ++ self.archive = kwargs.pop('archive', None) ++ self.member = kwargs.pop('member', None) ++ ++ def __str__(self): ++ return 'Model <{}>'.format(self.name) ++ ++ def printRequest(self, r): ++ def getMB(r): ++ d = dict(r.info()) ++ for c in ['content-length', 'Content-Length']: ++ if c in d: ++ return int(d[c]) / self.MB ++ return '' ++ print(' {} {} [{} Mb]'.format(r.getcode(), r.msg, getMB(r))) ++ ++ def verify(self): ++ if not self.sha: ++ return False ++ print(' expect {}'.format(self.sha)) ++ sha = hashlib.sha1() ++ try: ++ with open(self.filename, 'rb') as f: ++ while True: ++ buf = f.read(self.BUFSIZE) ++ if not buf: ++ break ++ sha.update(buf) ++ print(' actual {}'.format(sha.hexdigest())) ++ return self.sha == sha.hexdigest() ++ except Exception as e: ++ print(' catch {}'.format(e)) ++ ++ def get(self): ++ if self.verify(): ++ print(' hash match - skipping') ++ return True ++ ++ if self.archive or self.member: ++ assert(self.archive and self.member) ++ print(' hash check failed - extracting') ++ print(' get {}'.format(self.member)) ++ self.extract() ++ else: ++ assert(self.url) ++ print(' hash check failed - downloading') ++ print(' get {}'.format(self.url)) ++ self.download() ++ ++ print(' done') ++ print(' file {}'.format(self.filename)) ++ return self.verify() ++ ++ def download(self): ++ try: ++ r = urlopen(self.url, timeout=60) ++ self.printRequest(r) ++ self.save(r) ++ except Exception as e: ++ print(' catch {}'.format(e)) ++ ++ def extract(self): ++ try: ++ with tarfile.open(self.archive) as f: ++ assert self.member in f.getnames() ++ self.save(f.extractfile(self.member)) ++ except Exception as e: ++ print(' catch {}'.format(e)) ++ ++ def save(self, r): ++ with open(self.filename, 'wb') as f: ++ print(' progress ', end='') ++ sys.stdout.flush() ++ while True: ++ buf = r.read(self.BUFSIZE) ++ if not buf: ++ break ++ f.write(buf) ++ print('>', end='') ++ sys.stdout.flush() ++ ++models = [ ++ Model( ++ name='Fcn', ++ url='http://dl.caffe.berkeleyvision.org/fcn8s-heavy-pascal.caffemodel', ++ sha='c449ea74dd7d83751d1357d6a8c323fcf4038962', ++ filename='fcn8s-heavy-pascal.caffemodel'), ++ Model( ++ name='SqueezeNet_v1.1', ++ url='https://raw.githubusercontent.com/DeepScale/SqueezeNet/b5c3f1a23713c8b3fd7b801d229f6b04c64374a5/SqueezeNet_v1.1/squeezenet_v1.1.caffemodel', ++ sha='3397f026368a45ae236403ccc81cfcbe8ebe1bd0', ++ filename='squeezenet_v1.1.caffemodel'), ++ Model( ++ name='Colorization', ++ url='https://raw.githubusercontent.com/richzhang/colorization/master/models/colorization_deploy_v2.prototxt', ++ sha='f528334e386a69cbaaf237a7611d833bef8e5219', ++ filename='colorization_deploy_v2.prototxt'), ++ Model( ++ name='Colorization', ++ url='http://eecs.berkeley.edu/~rich.zhang/projects/2016_colorization/files/demo_v2/colorization_release_v2.caffemodel', ++ sha='21e61293a3fa6747308171c11b6dd18a68a26e7f', ++ filename='colorization_release_v2.caffemodel'), ++ Model( ++ name='OpenPose/pose/coco', # https://github.com/CMU-Perceptual-Computing-Lab/openpose ++ url='http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/coco/pose_iter_440000.caffemodel', ++ sha='ac7e97da66f3ab8169af2e601384c144e23a95c1', ++ filename='openpose_pose_coco.caffemodel'), ++ Model( ++ name='YOLOv3', # https://pjreddie.com/darknet/yolo/ ++ url='https://pjreddie.com/media/files/yolov3.weights', ++ sha='520878f12e97cf820529daea502acca380f1cb8e', ++ filename='yolov3.weights'), ++ Model( ++ name='EAST', # https://github.com/argman/EAST (a TensorFlow model), https://arxiv.org/abs/1704.03155v2 (a paper) ++ url='https://www.dropbox.com/s/r2ingd0l3zt8hxs/frozen_east_text_detection.tar.gz?dl=1', ++ sha='3ca8233d6edd748f7ed23246c8ca24cbf696bb94', ++ filename='frozen_east_text_detection.tar.gz'), ++ Model( ++ name='EAST', ++ archive='frozen_east_text_detection.tar.gz', ++ member='frozen_east_text_detection.pb', ++ sha='fffabf5ac36f37bddf68e34e84b45f5c4247ed06', ++ filename='frozen_east_text_detection.pb'), ++] ++ ++# Note: models will be downloaded to current working directory ++# expected working directory is opencv_extra/testdata/dnn ++if __name__ == '__main__': ++ failedModels = [] ++ for m in models: ++ print(m) ++ if not m.get(): ++ failedModels.append(m.filename) ++ ++ if failedModels: ++ print("Following models have not been downloaded:") ++ for f in failedModels: ++ print("* {}".format(f)) ++ exit(15) +-- +2.17.1 + diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Dont-use-isystem.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Dont-use-isystem.patch new file mode 100644 index 000000000..948a80faf --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Dont-use-isystem.patch @@ -0,0 +1,28 @@ +From 66e50ee69fa9ee2469d349100e70d8b296c4b4dc Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Tue, 11 Sep 2018 00:21:18 -0700 +Subject: [PATCH] Dont use isystem + +clang really does not like it + +Upstream-Status: Pending + +Signed-off-by: Khem Raj + +--- + cmake/OpenCVPCHSupport.cmake | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/cmake/OpenCVPCHSupport.cmake b/cmake/OpenCVPCHSupport.cmake +index 08cd06def4..46c9c02da3 100644 +--- a/cmake/OpenCVPCHSupport.cmake ++++ b/cmake/OpenCVPCHSupport.cmake +@@ -18,6 +18,8 @@ IF(CV_GCC) + SET(PCHSupport_FOUND TRUE) + ENDIF() + ++ SET(CMAKE_INCLUDE_SYSTEM_FLAG_C "-I") ++ SET(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-I") + SET(_PCH_include_prefix "-I") + SET(_PCH_isystem_prefix "-isystem") + SET(_PCH_define_prefix "-D") diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Make-ts-module-external.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Make-ts-module-external.patch new file mode 100644 index 000000000..d56b8ae67 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Make-ts-module-external.patch @@ -0,0 +1,42 @@ +From 11bbf909e08594628bd757d989ae34cf1bfe200b Mon Sep 17 00:00:00 2001 +From: Mingli Yu +Date: Thu, 18 Jun 2020 05:51:38 +0000 +Subject: [PATCH] Make ts module external + +Make ts module external + +Reference: https://github.com/qbonnard/opencv/commit/6b229c5834cb9a0930425e762a6c7b03244d7abb + +Upstream-Status: Submitted [https://github.com/opencv/opencv/issues/8408] + +Signed-off-by: Mingli Yu +--- + modules/ts/CMakeLists.txt | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/modules/ts/CMakeLists.txt b/modules/ts/CMakeLists.txt +index f95bed0793..66f315bcca 100644 +--- a/modules/ts/CMakeLists.txt ++++ b/modules/ts/CMakeLists.txt +@@ -4,9 +4,6 @@ if(NOT BUILD_opencv_ts AND NOT BUILD_TESTS AND NOT BUILD_PERF_TESTS) + ocv_module_disable(ts) + endif() + +-set(OPENCV_MODULE_TYPE STATIC) +-set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE) +- + if(WINRT) + # WINRT doesn't have access to environment variables + # so adding corresponding macros during CMake run +@@ -16,7 +13,7 @@ endif() + + ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef) + +-ocv_add_module(ts INTERNAL opencv_core opencv_imgproc opencv_imgcodecs opencv_videoio opencv_highgui) ++ocv_add_module(ts opencv_core opencv_imgproc opencv_imgcodecs opencv_videoio opencv_highgui) + + ocv_glob_module_sources() + ocv_module_include_directories() +-- +2.24.1 + diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Temporarliy-work-around-deprecated-ffmpeg-RAW-functi.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Temporarliy-work-around-deprecated-ffmpeg-RAW-functi.patch new file mode 100644 index 000000000..1e47f8b16 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0001-Temporarliy-work-around-deprecated-ffmpeg-RAW-functi.patch @@ -0,0 +1,31 @@ +From e4ec6cea72da9e9ae5ba57140fa2f5c63f1f8295 Mon Sep 17 00:00:00 2001 +From: Jason Wessel +Date: Wed, 9 May 2018 13:33:59 -0700 +Subject: [PATCH] Temporarliy work around deprecated ffmpeg RAW function + compile failure until next uprev + +Signed-off-by: Jason Wessel + +--- + modules/videoio/src/cap_ffmpeg_impl.hpp | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/modules/videoio/src/cap_ffmpeg_impl.hpp b/modules/videoio/src/cap_ffmpeg_impl.hpp +index 6dca724a89..ae55dd4555 100644 +--- a/modules/videoio/src/cap_ffmpeg_impl.hpp ++++ b/modules/videoio/src/cap_ffmpeg_impl.hpp +@@ -774,6 +774,14 @@ struct ImplMutex::Impl + + #endif + ++/* NOTE This is deprecated in ffmpeg and the code should be removed */ ++#ifndef AVFMT_RAWPICTURE ++#define AVFMT_RAWPICTURE 0x0020 ++#endif /* AVFMT_RAWPICTURE */ ++#ifndef CODEC_FLAG_GLOBAL_HEADER ++#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER ++#endif ++ + void ImplMutex::init() + { + impl = new Impl(); diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0003-To-fix-errors-as-following.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0003-To-fix-errors-as-following.patch new file mode 100644 index 000000000..bb47ef2ba --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0003-To-fix-errors-as-following.patch @@ -0,0 +1,70 @@ +From f42c9b8c7bafcadc7e95fb25a391707f970eb426 Mon Sep 17 00:00:00 2001 +From: Huang Qiyu +Date: Fri, 19 May 2017 04:27:50 +0900 +Subject: [PATCH] To fix errors as following: + +"test_main.cpp:45: undefined reference to `parseCustomOptions(int, char**)'" +"perf_abs.cpp:13: undefined reference to `cvtest::param_seed'" +"test_superres.cpp:270: undefined reference to `checkIppStatus()'" + +Signed-off-by: Huang Qiyu + +Also add the visibility changes for certain OpenCL-related functions in +ts module. + +Signed-off-by: Ismo Puustinen + +--- + modules/ts/include/opencv2/ts.hpp | 4 ++-- + modules/ts/include/opencv2/ts/ocl_test.hpp | 2 +- + modules/ts/include/opencv2/ts/ts_ext.hpp | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/modules/ts/include/opencv2/ts.hpp b/modules/ts/include/opencv2/ts.hpp +index ed7491a89a..80919d13ee 100644 +--- a/modules/ts/include/opencv2/ts.hpp ++++ b/modules/ts/include/opencv2/ts.hpp +@@ -728,7 +728,7 @@ protected: + } + }; + +-extern uint64 param_seed; ++CV_EXPORTS extern uint64 param_seed; + + struct DefaultRngAuto + { +@@ -791,7 +791,7 @@ private: + #endif + #endif + +-void parseCustomOptions(int argc, char **argv); ++CV_EXPORTS void parseCustomOptions(int argc, char **argv); + + #define CV_TEST_INIT0_NOOP (void)0 + +diff --git a/modules/ts/include/opencv2/ts/ocl_test.hpp b/modules/ts/include/opencv2/ts/ocl_test.hpp +index 11572e9f48..438112e2aa 100644 +--- a/modules/ts/include/opencv2/ts/ocl_test.hpp ++++ b/modules/ts/include/opencv2/ts/ocl_test.hpp +@@ -82,7 +82,7 @@ inline UMat ToUMat(InputArray src) + return dst; + } + +-extern int test_loop_times; ++CV_EXPORTS extern int test_loop_times; + + #define MAX_VALUE 357 + +diff --git a/modules/ts/include/opencv2/ts/ts_ext.hpp b/modules/ts/include/opencv2/ts/ts_ext.hpp +index b2a4cac241..b94c681c0c 100644 +--- a/modules/ts/include/opencv2/ts/ts_ext.hpp ++++ b/modules/ts/include/opencv2/ts/ts_ext.hpp +@@ -9,7 +9,7 @@ + #define OPENCV_TS_EXT_HPP + + namespace cvtest { +-void checkIppStatus(); ++CV_EXPORTS void checkIppStatus(); + extern bool skipUnstableTests; + extern bool runBigDataTests; + extern int testThreads; diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/OpenCV_DNN_examples.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/OpenCV_DNN_examples.patch new file mode 100644 index 000000000..ef7831a5f --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/OpenCV_DNN_examples.patch @@ -0,0 +1,141 @@ +From 3c4daafb54f961e376104a461ca7ec114ff0331a Mon Sep 17 00:00:00 2001 +From: Ludek Slosarcik +Date: Fri, 14 Feb 2020 15:46:50 +0100 +Subject: [PATCH] opencv_dnn: added video device for 2 examples, and change text labels + +Signed-off-by: Ludek Slosarcik + +Upstream-Status: Pending +--- + samples/cpp/logistic_regression.cpp | 2 +- + samples/dnn/classification.cpp | 7 ++++--- + samples/dnn/object_detection.cpp | 10 +++++----- + samples/dnn/segmentation.cpp | 2 +- + samples/dnn/text_detection.cpp | 5 +++-- + 5 files changed, 14 insertions(+), 12 deletions(-) + +Index: git/samples/cpp/logistic_regression.cpp +=================================================================== +--- git.orig/samples/cpp/logistic_regression.cpp ++++ git/samples/cpp/logistic_regression.cpp +@@ -28,7 +28,7 @@ static float calculateAccuracyPercent(co + + int main() + { +- const String filename = samples::findFile("data01.xml"); ++ const String filename = samples::findFile("../data/data01.xml"); + cout << "**********************************************************************" << endl; + cout << filename + << " contains digits 0 and 1 of 20 samples each, collected on an Android device" << endl; +Index: git/samples/dnn/classification.cpp +=================================================================== +--- git.orig/samples/dnn/classification.cpp ++++ git/samples/dnn/classification.cpp +@@ -12,6 +12,7 @@ std::string keys = + "{ help h | | Print help message. }" + "{ @alias | | An alias name of model to extract preprocessing parameters from models.yml file. }" + "{ zoo | models.yml | An optional path to file with preprocessing parameters }" ++ "{ device | 0 | camera device number. }" + "{ input i | | Path to input image or video file. Skip this argument to capture frames from a camera.}" + "{ initial_width | 0 | Preprocess input image by initial resizing to a specific width.}" + "{ initial_height | 0 | Preprocess input image by initial resizing to a specific height.}" +@@ -113,7 +114,7 @@ int main(int argc, char** argv) + if (parser.has("input")) + cap.open(parser.get("input")); + else +- cap.open(0); ++ cap.open(parser.get("device")); + //! [Open a video file or an image file or a camera stream] + + // Process frames. +@@ -195,14 +196,14 @@ int main(int argc, char** argv) + } + std::string label = format("Inference time of 1 round: %.2f ms", t1); + std::string label2 = format("Average time of 200 rounds: %.2f ms", timeRecorder.getTimeMilli()/200); +- putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0)); +- putText(frame, label2, Point(0, 35), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0)); ++ putText(frame, label, Point(0, 20), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8, false); ++ putText(frame, label2, Point(0, 45), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8, false); + + // Print predicted class. + label = format("%s: %.4f", (classes.empty() ? format("Class #%d", classId).c_str() : + classes[classId].c_str()), + confidence); +- putText(frame, label, Point(0, 55), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0)); ++ putText(frame, label, Point(0, 70), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8, false); + + imshow(kWinName, frame); + } +Index: git/samples/dnn/object_detection.cpp +=================================================================== +--- git.orig/samples/dnn/object_detection.cpp ++++ git/samples/dnn/object_detection.cpp +@@ -260,13 +260,13 @@ int main(int argc, char** argv) + if (predictionsQueue.counter > 1) + { + std::string label = format("Camera: %.2f FPS", framesQueue.getFPS()); +- putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0)); ++ putText(frame, label, Point(0, 20), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8, false); + + label = format("Network: %.2f FPS", predictionsQueue.getFPS()); +- putText(frame, label, Point(0, 30), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0)); ++ putText(frame, label, Point(0, 45), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8, false); + + label = format("Skipped frames: %d", framesQueue.counter - predictionsQueue.counter); +- putText(frame, label, Point(0, 45), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0)); ++ putText(frame, label, Point(0, 70), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8, false); + } + imshow(kWinName, frame); + } +@@ -302,7 +302,7 @@ int main(int argc, char** argv) + double freq = getTickFrequency() / 1000; + double t = net.getPerfProfile(layersTimes) / freq; + std::string label = format("Inference time: %.2f ms", t); +- putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0)); ++ putText(frame, label, Point(0, 20), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8, false); + + imshow(kWinName, frame); + } +@@ -471,7 +471,7 @@ void drawPred(int classId, float conf, i + top = max(top, labelSize.height); + rectangle(frame, Point(left, top - labelSize.height), + Point(left + labelSize.width, top + baseLine), Scalar::all(255), FILLED); +- putText(frame, label, Point(left, top), FONT_HERSHEY_SIMPLEX, 0.5, Scalar()); ++ putText(frame, label, Point(left, top), FONT_HERSHEY_SIMPLEX, 0.8, Scalar()); + } + + void callback(int pos, void*) +Index: git/samples/dnn/segmentation.cpp +=================================================================== +--- git.orig/samples/dnn/segmentation.cpp ++++ git/samples/dnn/segmentation.cpp +@@ -162,7 +162,7 @@ int main(int argc, char** argv) + double freq = getTickFrequency() / 1000; + double t = net.getPerfProfile(layersTimes) / freq; + std::string label = format("Inference time: %.2f ms", t); +- putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0)); ++ putText(frame, label, Point(0, 20), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8, false); + + imshow(kWinName, frame); + if (!classes.empty()) +Index: git/samples/dnn/text_detection.cpp +=================================================================== +--- git.orig/samples/dnn/text_detection.cpp ++++ git/samples/dnn/text_detection.cpp +@@ -30,6 +30,7 @@ using namespace cv::dnn; + const char* keys = + "{ help h | | Print help message. }" + "{ input i | | Path to input image or video file. Skip this argument to capture frames from a camera.}" ++ "{ device | 0 | camera device number. }" + "{ detModel dmp | | Path to a binary .pb file contains trained detector network.}" + "{ width | 320 | Preprocess input image by resizing to a specific width. It should be multiple by 32. }" + "{ height | 320 | Preprocess input image by resizing to a specific height. It should be multiple by 32. }" +@@ -106,7 +107,7 @@ int main(int argc, char** argv) + + // Open a video file or an image file or a camera stream. + VideoCapture cap; +- bool openSuccess = parser.has("input") ? cap.open(parser.get("input")) : cap.open(0); ++ bool openSuccess = parser.has("input") ? cap.open(parser.get("input")) : cap.open(parser.get("device")); + CV_Assert(openSuccess); + + static const std::string kWinName = "EAST: An Efficient and Accurate Scene Text Detector"; diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/download.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/download.patch new file mode 100644 index 000000000..33ac48312 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/download.patch @@ -0,0 +1,41 @@ +From b18a280fab06a680d9f831bf8b462647f3cb6214 Mon Sep 17 00:00:00 2001 +From: Ross Burton +Date: Thu, 9 Jan 2020 16:24:24 +0000 +Subject: [PATCH] opencv: abort configure if we need to download + +This CMake module will download files during do_configure. This is bad as it +means we can't do offline builds. + +Add an option to disallow downloads by emitting a fatal error. + +Upstream-Status: Pending +Signed-off-by: Ross Burton + +--- + cmake/OpenCVDownload.cmake | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/cmake/OpenCVDownload.cmake b/cmake/OpenCVDownload.cmake +index 63cf6d3238..4acf477f70 100644 +--- a/cmake/OpenCVDownload.cmake ++++ b/cmake/OpenCVDownload.cmake +@@ -14,6 +14,7 @@ + # RELATIVE_URL - if set, then URL is treated as a base, and FILENAME will be appended to it + # Note: uses OPENCV_DOWNLOAD_PATH folder as cache, default is /.cache + ++set(OPENCV_ALLOW_DOWNLOADS ON CACHE BOOL "Allow downloads") + set(HELP_OPENCV_DOWNLOAD_PATH "Cache directory for downloaded files") + if(DEFINED ENV{OPENCV_DOWNLOAD_PATH}) + set(OPENCV_DOWNLOAD_PATH "$ENV{OPENCV_DOWNLOAD_PATH}" CACHE PATH "${HELP_OPENCV_DOWNLOAD_PATH}") +@@ -156,6 +157,11 @@ function(ocv_download) + + # Download + if(NOT EXISTS "${CACHE_CANDIDATE}") ++ if(NOT OPENCV_ALLOW_DOWNLOADS) ++ message(FATAL_ERROR "Not going to download ${DL_FILENAME}") ++ return() ++ endif() ++ + ocv_download_log("#cmake_download \"${CACHE_CANDIDATE}\" \"${DL_URL}\"") + foreach(try ${OPENCV_DOWNLOAD_TRIES_LIST}) + ocv_download_log("#try ${try}") diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv_4.7.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv_4.7.0.imx.bb new file mode 100644 index 000000000..7f95691a1 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv_4.7.0.imx.bb @@ -0,0 +1,23 @@ +# Copyright 2024 Digi International Inc. + +# +# Reuse meta-freescale's opencv_4.6.0.imx.bb +# +require recipes-support/opencv/opencv_4.6.0.imx.bb + +SRC_URI:remove = "file://0001-Add-missing-header-for-LIBAVCODEC_VERSION_INT.patch" + +SRCBRANCH = "4.7.0_imx" +SRCREV_opencv = "3acf6a50fcb4f774728d2338553ad646ccc14b14" + +# Update opencv_contrib +SRC_URI:remove = "git://github.com/opencv/opencv_contrib.git;destsuffix=git/contrib;name=contrib;branch=master;protocol=https" +SRC_URI += "git://github.com/opencv/opencv_contrib.git;destsuffix=git/contrib;name=contrib;branch=4.x;protocol=https" +SRCREV_contrib = "e247b680a6bd396f110274b6c214406a93171350" + +SRC_URI:remove = "git://github.com/opencv/opencv_extra.git;destsuffix=extra;name=extra;branch=master;protocol=https" +SRC_URI =+ "git://github.com/opencv/opencv_extra.git;destsuffix=extra;name=extra;branch=4.x;protocol=https" + +SRCREV_extra = "5abbd7e0546bbb34ae7487170383d3e571fb1dd1" + +COMPATIBLE_MACHINE = "(mx9-nxp-bsp)" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-fsl/packagegroup/packagegroup-imx-ml.bbappend b/meta-digi-dey/dynamic-layers/meta-ml/recipes-fsl/packagegroup/packagegroup-imx-ml.bbappend index fdb3bab58..b9b63a1e7 100644 --- a/meta-digi-dey/dynamic-layers/meta-ml/recipes-fsl/packagegroup/packagegroup-imx-ml.bbappend +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-fsl/packagegroup/packagegroup-imx-ml.bbappend @@ -1,9 +1,8 @@ -# Copyright 2023 Digi International Inc. +# Copyright 2023,2024 Digi International Inc. ML_NNSTREAMER_PKGS_LIST:remove = "nnstreamer-deepview-rt" ML_PKGS:mx9-nxp-bsp:remove = "deepview-rt-examples" -ML_PKGS:mx9-nxp-bsp:append = " modelrunner" # ARM ethos-u package ETHOS_U_PKGS:append:mx93-nxp-bsp = " \ diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/arm-compute-library/arm-compute-library_22.05.bbappend b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/arm-compute-library/arm-compute-library_22.05.bbappend index 33acf4538..f816bd719 100644 --- a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/arm-compute-library/arm-compute-library_22.05.bbappend +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/arm-compute-library/arm-compute-library_22.05.bbappend @@ -1,6 +1,6 @@ -# Copyright 2023 Digi International Inc. +# Copyright 2023,2024 Digi International Inc. -SRCBRANCH = "lf-6.1.36_2.1.0" -SRCREV = "b956e65221fca7dadfd8bdfd13279beacce17bc9" +SRCBRANCH:ccimx93 = "imx_22.05" +SRCREV:ccimx93 = "37fc035060646db5048648da01db3738f08e3bfa" SCONS_MAXLINELENGTH = "" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/eiq-examples/eiq-examples_git.bb b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/eiq-examples/eiq-examples_git.bb index fd523e780..43ad704a4 100644 --- a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/eiq-examples/eiq-examples_git.bb +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/eiq-examples/eiq-examples_git.bb @@ -5,8 +5,8 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" SRC_URI = "${EIQ_EXAMPLES_SRC};branch=${SRCBRANCH}" EIQ_EXAMPLES_SRC ?= "git://github.com/nxp-imx/eiq-example.git;protocol=https" -SRCBRANCH = "lf-6.1.36_2.1.0" -SRCREV = "47da4f9c4d568704f8835dde62cfc61f16e89ba6" +SRCBRANCH = "lf-6.1.55_2.2.0" +SRCREV = "4a21f2919e7e16ca1847672b6ed1ecfa60f1a86f" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bbappend b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bbappend deleted file mode 100644 index dacfab396..000000000 --- a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bbappend +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (C) 2023 Digi International - -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e3fc50a88d0a364313df4b21ef20c29e" - -SRCBRANCH = "lf-6.1.36_2.1.0" -SRCREV = "98759f579297726474d6b32927694502c66ce15a" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_23.08.bb b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_23.08.bb new file mode 100644 index 000000000..3696f747f --- /dev/null +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_23.08.bb @@ -0,0 +1,11 @@ +# Copyright 2024 Digi International Inc. + +# +# Reuse meta-imx/meta-ml ethos-u-driver-stack_22.08.bb +# +require recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bb + +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e3fc50a88d0a364313df4b21ef20c29e" + +SRCBRANCH = "lf-6.1.55_2.2.0" +SRCREV = "f8975c4d44e7893dcf106d4afaff55e30470b463" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-firmware/ccimx93/ethosu_firmware b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-firmware/ccimx93/ethosu_firmware index 46306553d1be60ad2239684ccaee8324205a7230..6299689f854dcd3631a83f26aab7b089ce5727f1 100755 GIT binary patch delta 7471 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 delta 7457 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 Date: Thu, 11 Jan 2024 12:11:26 +0100 Subject: [PATCH 105/118] cccs: dualboot: set by default on the fly to true To work in a dualboot memory layout out of the box, the most common use case of the firmware update through the cloud should be on the fly because in nand platforms there is not enough memory to keep the update file in the system. https://onedigi.atlassian.net/browse/DEL-8305 Signed-off-by: Francisco Gil --- meta-digi-dey/recipes-digi/cccs/cccs_git.bb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/recipes-digi/cccs/cccs_git.bb b/meta-digi-dey/recipes-digi/cccs/cccs_git.bb index d35847eca..10d5e5b34 100644 --- a/meta-digi-dey/recipes-digi/cccs/cccs_git.bb +++ b/meta-digi-dey/recipes-digi/cccs/cccs_git.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2023, Digi International Inc. +# Copyright (C) 2017-2024, Digi International Inc. SUMMARY = "Digi's ConnectCore Cloud services" SECTION = "libs" @@ -57,9 +57,10 @@ do_install:append:ccimx6ul() { } pkg_postinst_ontarget:${PN}() { - # If dualboot is enabled, change the CCCSD download path on the first boot + # If dualboot is enabled, change the CCCSD download path and set on the fly to yes on the first boot if [ "$(fw_printenv -n dualboot 2>/dev/null)" = "yes" ]; then sed -i "/firmware_download_path = \/mnt\/update/c\firmware_download_path = \/home\/root" /etc/cccs.conf + sed -i "/on_the_fly = false/c\on_the_fly = true" /etc/cccs.conf fi } From ba1e3b83284c083f568e67e9f8c5934817460f10 Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Fri, 12 Jan 2024 11:10:57 +0100 Subject: [PATCH 106/118] qt5: ccmp1: add support for EGLFS backend EGLFS is a platform plugin for running single Qt applications in full-screen mode, without a windowing system like X11 or Wayland. https://onedigi.atlassian.net/browse/DEL-8802 Signed-off-by: Arturo Buzarra --- .../STM/recipes-qt/qt5/qtbase/cursor.json | 8 +++++ .../STM/recipes-qt/qt5/qtbase/qt5-eglfs.sh | 20 ++++++++++++ .../STM/recipes-qt/qt5/qtbase/qt5-wayland.sh | 3 ++ .../STM/recipes-qt/qt5/qtbase/qt5.sh | 7 ---- .../STM/recipes-qt/qt5/qtbase_git.bbappend | 32 ++++++++++++++++--- .../packagegroups/packagegroup-qt5-dey.bb | 21 ++++++++++-- 6 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/cursor.json create mode 100644 meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5-eglfs.sh create mode 100644 meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5-wayland.sh delete mode 100644 meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh diff --git a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/cursor.json b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/cursor.json new file mode 100644 index 000000000..17563c866 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/cursor.json @@ -0,0 +1,8 @@ +{ + "device": "/dev/dri/card0", + "outputs": [ + { "name": "HDMI1", "mode": "1280x720", "size": "1280x720" } + ], + "hwcursor": false +} + diff --git a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5-eglfs.sh b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5-eglfs.sh new file mode 100644 index 000000000..54500ffb6 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5-eglfs.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +export QT_QPA_PLATFORM=eglfs + +# Use the KMS/DRM backend +export QT_QPA_EGLFS_INTEGRATION=eglfs_kms + +if [ -e /usr/share/qt5/cursor.json ]; +then + export QT_QPA_EGLFS_KMS_CONFIG=/usr/share/qt5/cursor.json +fi + +# Force to keep the MODE SETTING set +export QT_QPA_EGLFS_ALWAYS_SET_MODE=1 + +# Force to use KMS ATOMIC +export QT_QPA_EGLFS_KMS_ATOMIC=1 + +# EGLFS environment variables accessible for qt 5.12 +# Documentation: https://doc.qt.io/qt-5/embedded-linux.html diff --git a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5-wayland.sh b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5-wayland.sh new file mode 100644 index 000000000..91f62aa25 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5-wayland.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +export QT_QPA_PLATFORM="wayland" diff --git a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh deleted file mode 100644 index 4052b0a13..000000000 --- a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -export QT_QPA_PLATFORM="wayland" - -[ -f "/etc/profile.d/weston_profile.sh" ] && return - -# Use EGLFS platform plugin for images without Wayland -export QT_QPA_PLATFORM="eglfs" QT_QPA_EGLFS_INTEGRATION="eglfs_viv" diff --git a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend index 1744da523..0b2fcb3a2 100644 --- a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend +++ b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend @@ -1,15 +1,37 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" -PACKAGECONFIG_GL = " ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2', '', d)} " -PACKAGECONFIG:append = " eglfs examples accessibility " +PACKAGECONFIG_GL = " ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', \ + bb.utils.contains('DISTRO_FEATURES', 'wayland', 'gles2', \ + 'gles2 eglfs', d), '', d)}" +PACKAGECONFIG:append = " \ + eglfs \ + examples \ + accessibility \ + ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '', 'gbm kms', d)} \ +" QT_CONFIG_FLAGS += " -no-sse2 -no-opengles3" SRC_URI:append = " \ - file://qt5.sh \ + ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', \ + 'file://qt5-wayland.sh', \ + 'file://qt5-eglfs.sh \ + file://cursor.json ', d)} \ " do_install:append () { install -d ${D}${sysconfdir}/profile.d/ - install -m 0755 ${WORKDIR}/qt5.sh ${D}${sysconfdir}/profile.d/qt5.sh + + if ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'true', 'false', d)}; then + # Wayland backend + install -m 0755 ${WORKDIR}/qt5-wayland.sh ${D}${sysconfdir}/profile.d/qt5.sh + else + # EGLFS backend + install -d ${D}${datadir}/qt5 + install -m 0755 ${WORKDIR}/qt5-eglfs.sh ${D}/${sysconfdir}/profile.d/qt5.sh + install -m 0664 ${WORKDIR}/cursor.json ${D}${datadir}/qt5/ + fi } -FILES:${PN} += "${sysconfdir}/profile.d/qt5.sh" +FILES:${PN} += " \ + ${sysconfdir}/profile.d/qt5.sh \ + ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '', '${datadir}/qt5', d)} \ +" diff --git a/meta-digi-dey/dynamic-layers/qt5-layer/recipes-qt/packagegroups/packagegroup-qt5-dey.bb b/meta-digi-dey/dynamic-layers/qt5-layer/recipes-qt/packagegroups/packagegroup-qt5-dey.bb index 94293de24..b16f30d14 100644 --- a/meta-digi-dey/dynamic-layers/qt5-layer/recipes-qt/packagegroups/packagegroup-qt5-dey.bb +++ b/meta-digi-dey/dynamic-layers/qt5-layer/recipes-qt/packagegroups/packagegroup-qt5-dey.bb @@ -1,5 +1,5 @@ # -# Copyright (C) 2013-2023, Digi International Inc. +# Copyright (C) 2013-2024, Digi International Inc. # SUMMARY = "QT packagegroup for DEY image" @@ -35,7 +35,24 @@ QT5_RDEPENDS:imxgpu3d = " \ gstreamer1.0-plugins-good-qt \ " -QT5_RDEPENDS:ccmp15 = "${QT5_RDEPENDS_common}" +QT5_RDEPENDS_eglfs = " \ + qtbase \ + qtbase-plugins \ + qtbase-tools \ + qtdeclarative \ + qtdeclarative-qmlplugins \ + qtdeclarative-tools \ + qtgraphicaleffects-qmlplugins \ + qtmultimedia \ + qtmultimedia-plugins \ + qtmultimedia-qmlplugins \ + qtscript \ +" + +QT5_RDEPENDS:ccmp15 = " \ + ${QT5_RDEPENDS_common} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '', '${QT5_RDEPENDS_eglfs}', d)} \ +" # Add packagegroup-qt5-webengine to QT5_RDEPENDS and comment out the line below to install qtwebengine to the rootfs. QT5_RDEPENDS:remove = " packagegroup-qt5-webengine" From bf365df07a9b05727be186ea39fe2d6b070c8322 Mon Sep 17 00:00:00 2001 From: David Escalona Date: Tue, 5 Dec 2023 13:44:37 +0100 Subject: [PATCH 107/118] imx-boot: generate symlinks for trustfence artifacts Signed-off-by: David Escalona --- .../imx-mkimage/imx-boot_1.0.bbappend | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index c8245c0b0..dc26c104f 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -1,4 +1,4 @@ -# Copyright (C) 2022-2023 Digi International Inc. +# Copyright (C) 2022-2024 Digi International Inc. FILESEXTRAPATHS:prepend := "${THISDIR}/files:" @@ -157,6 +157,11 @@ trustfence_sign_imxboot() { # Sign/encrypt boot image for target in ${IMXBOOT_TARGETS}; do + # Use first "target" as IMAGE_IMXBOOT_TARGET + if [ "$IMAGE_IMXBOOT_TARGET" = "" ]; then + IMAGE_IMXBOOT_TARGET="$target" + echo "Set boot target as $IMAGE_IMXBOOT_TARGET" + fi TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_MKIMAGE_LOG_PATH=${DEPLOYDIR}/${BOOT_TOOLS}/mkimage-${target}.log" env $TF_SIGN_ENV trustfence-sign-uboot.sh ${BOOT_NAME}-${MACHINE}.bin-${target} ${BOOT_NAME}-signed-${MACHINE}.bin-${target} if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then @@ -164,6 +169,12 @@ trustfence_sign_imxboot() { env $TF_SIGN_ENV $TF_ENC_ENV trustfence-sign-uboot.sh ${BOOT_NAME}-${MACHINE}.bin-${target} ${BOOT_NAME}-encrypted-${MACHINE}.bin-${target} fi done + + # Generate symlinks for trustfence artifacts. + ln -sf ${BOOT_NAME}-signed-${MACHINE}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/${BOOT_NAME}-signed-${MACHINE}.bin + if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + ln -sf ${BOOT_NAME}-encrypted-${MACHINE}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/${BOOT_NAME}-encrypted-${MACHINE}.bin + fi } trustfence_sign_imxboot:ccimx8x() { @@ -174,6 +185,11 @@ trustfence_sign_imxboot:ccimx8x() { # Sign/encrypt boot image for target in ${IMXBOOT_TARGETS}; do + # Use first "target" as IMAGE_IMXBOOT_TARGET + if [ "$IMAGE_IMXBOOT_TARGET" = "" ]; then + IMAGE_IMXBOOT_TARGET="$target" + echo "Set boot target as $IMAGE_IMXBOOT_TARGET" + fi for rev in ${SOC_REVISIONS}; do TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_MKIMAGE_LOG_PATH=${DEPLOYDIR}/${BOOT_TOOLS}/mkimage-${rev}-${target}.log" env $TF_SIGN_ENV trustfence-sign-uboot.sh ${BOOT_NAME}-${MACHINE}-${rev}.bin-${target} ${BOOT_NAME}-signed-${MACHINE}-${rev}.bin-${target} @@ -183,6 +199,12 @@ trustfence_sign_imxboot:ccimx8x() { fi done done + + # Generate symlinks for trustfence artifacts. + ln -sf ${UBOOT_PREFIX}-signed-${MACHINE}-${rev}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/${UBOOT_PREFIX}-signed-${MACHINE}.bin + if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + ln -sf ${UBOOT_PREFIX}-encrypted-${MACHINE}-${rev}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/${UBOOT_PREFIX}-encrypted-${MACHINE}.bin + fi } trustfence_sign_imxboot[dirs] = "${DEPLOYDIR}" From a0bc831353b4e60aeaa0a5716c1ebfa464d58deb Mon Sep 17 00:00:00 2001 From: David Escalona Date: Thu, 21 Dec 2023 14:27:27 +0100 Subject: [PATCH 108/118] meta-digi-arm: machine: add new 'BOOTLOADER_SEEK_BOOTPART' variable to platform configurations This new variable establishes the number of 1Kb blocks to skip before writing U-Boot in the bootloader partition. Signed-off-by: David Escalona --- meta-digi-arm/conf/machine/ccimx8mm-dvk.conf | 1 + meta-digi-arm/conf/machine/include/ccimx6.inc | 2 ++ meta-digi-arm/conf/machine/include/digi-defaults.inc | 3 +++ meta-digi-dey/classes/dey-swupdate-common.bbclass | 3 +-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf index 2e768c95f..33d6cbff0 100644 --- a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf @@ -9,6 +9,7 @@ MACHINEOVERRIDES =. "mx8:mx8m:mx8mm:${DIGI_FAMILY}:${DIGI_SOM}:" include conf/machine/include/ccimx8m.inc BOOTLOADER_SEEK_USERDATA = "33" +BOOTLOADER_SEEK_BOOTPART = "33" # U-Boot configurations # diff --git a/meta-digi-arm/conf/machine/include/ccimx6.inc b/meta-digi-arm/conf/machine/include/ccimx6.inc index f90064980..4f5161631 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6.inc @@ -8,6 +8,8 @@ MACHINEOVERRIDES =. "mx6:mx6dl:mx6q:${DIGI_FAMILY}:${DIGI_SOM}:" include conf/machine/include/imx-digi-base.inc include conf/machine/include/arm/armv7a/tune-cortexa9.inc +BOOTLOADER_SEEK_BOOTPART = "1" + # Platform u-boot settings UBOOT_PREFIX = "u-boot" UBOOT_SUFFIX = "imx" diff --git a/meta-digi-arm/conf/machine/include/digi-defaults.inc b/meta-digi-arm/conf/machine/include/digi-defaults.inc index 05cc96252..72d2068a9 100644 --- a/meta-digi-arm/conf/machine/include/digi-defaults.inc +++ b/meta-digi-arm/conf/machine/include/digi-defaults.inc @@ -92,3 +92,6 @@ SWUPDATE_UBOOTIMG ?= "false" # ConnectCore Cloud Services packages to install CCCS_PKGS ?= "cccs-gs-demo dey-examples-cccs" + +# Default 1k-bloks seek in boot partition. +BOOTLOADER_SEEK_BOOTPART ?= "0" diff --git a/meta-digi-dey/classes/dey-swupdate-common.bbclass b/meta-digi-dey/classes/dey-swupdate-common.bbclass index 856948dd3..8b3178bd1 100644 --- a/meta-digi-dey/classes/dey-swupdate-common.bbclass +++ b/meta-digi-dey/classes/dey-swupdate-common.bbclass @@ -102,8 +102,7 @@ SWUPDATE_UBOOT_NAME:ccmp1 ?= "${SWUPDATE_UBOOT_PREFIX}-${MACHINE}-optee${FIP_SIG SWUPDATE_UBOOT_NAME_TFA ?= "" SWUPDATE_UBOOT_NAME_TFA:ccmp1 ?= "${SWUPDATE_UBOOT_PREFIX_TFA}-${MACHINE}-nand${SWUPDATE_UBOOT_EXT_TFA}${TFA_SIGN_SUFFIX}" -SWUPDATE_UBOOT_OFFSET ?= "0" -SWUPDATE_UBOOT_OFFSET:ccimx6 ?= "1" +SWUPDATE_UBOOT_OFFSET ?= "${BOOTLOADER_SEEK_BOOTPART}" # Retrieve the correct encryption type. def get_swupdate_uboot_enc(d): From 76e2672b2248086a6a386bad06b23c42fb28cfb8 Mon Sep 17 00:00:00 2001 From: David Escalona Date: Mon, 8 Jan 2024 14:24:45 +0100 Subject: [PATCH 109/118] ccmp1: fix platform 'UBOOT_PREFIX' variable Signed-off-by: David Escalona --- meta-digi-arm/conf/machine/include/ccmp1.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index 6945f333c..89a433978 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -12,7 +12,7 @@ DIGI_FAMILY = "ccmp1" TFA_SIGN_SUFFIX ?= "${@bb.utils.contains('TRUSTFENCE_SIGN', '1', '_signed', '', d)}" # Platform u-boot settings -UBOOT_PREFIX = "u-boot" +UBOOT_PREFIX = "fip" UBOOT_SUFFIX = "bin" # Set U-Boot FIP settings FIP_UBOOT_DTB = "u-boot" From 10b22aea64006897357ce68ef1eb0c2dcc0bb3c0 Mon Sep 17 00:00:00 2001 From: David Escalona Date: Mon, 11 Dec 2023 09:46:27 +0100 Subject: [PATCH 110/118] swupdate: add support to update U-Boot to boot1 partition in mmc devices While on it, enable support to update encrypted U-Boot for all mmc platforms supporting it. The install script extracts the DEK blob from the installed U-Boot and appends it to the new U-Boot before flashing it. Signed-off-by: David Escalona --- .../classes/dey-swupdate-common.bbclass | 18 +- .../swu-images/files/swupdate_uboot_mmc.sh | 409 ++++++++++-------- 2 files changed, 246 insertions(+), 181 deletions(-) diff --git a/meta-digi-dey/classes/dey-swupdate-common.bbclass b/meta-digi-dey/classes/dey-swupdate-common.bbclass index 8b3178bd1..aa707fc55 100644 --- a/meta-digi-dey/classes/dey-swupdate-common.bbclass +++ b/meta-digi-dey/classes/dey-swupdate-common.bbclass @@ -1,4 +1,4 @@ -# Copyright (C) 2023 Digi International. +# Copyright (C) 2023-2024 Digi International. # ####################################### @@ -90,14 +90,26 @@ SWUPDATE_IS_IMAGES_UPDATE = "${@update_based_on_images(d)}" SWUPDATE_UBOOT_SCRIPT = "${@oe.utils.conditional('STORAGE_MEDIA', 'mmc', 'swupdate_uboot_mmc.sh', 'swupdate_uboot_nand.sh', d)}" SWUPDATE_UBOOT_SCRIPT_NAME = "${@os.path.basename(d.getVar('SWUPDATE_UBOOT_SCRIPT'))}" -SWUPDATE_UBOOT_PREFIX ?= "${UBOOT_PREFIX}" -SWUPDATE_UBOOT_PREFIX:ccmp1 ?= "fip" +# Retrieve the correct U-Boot prefix. +def get_uboot_prefix(d): + prefix = d.getVar('UBOOT_PREFIX') + if d.getVar('DEY_SOC_VENDOR') == "NXP" and d.getVar('TRUSTFENCE_SIGN') == "1": + if "ccimx6" in d.getVar('MACHINE'): + prefix = f"{prefix}-dtb" + if d.getVar('TRUSTFENCE_DEK_PATH') and d.getVar('TRUSTFENCE_DEK_PATH') != "0": + prefix = f"{prefix}-encrypted" + else: + prefix = f"{prefix}-signed" + return prefix + +SWUPDATE_UBOOT_PREFIX ?= "${@get_uboot_prefix(d)}" SWUPDATE_UBOOT_PREFIX_TFA ?= "tf-a" SWUPDATE_UBOOT_EXT ?= ".${UBOOT_SUFFIX}" SWUPDATE_UBOOT_EXT_TFA ?= ".stm32" SWUPDATE_UBOOT_NAME ?= "${SWUPDATE_UBOOT_PREFIX}-${MACHINE}${SWUPDATE_UBOOT_EXT}" +SWUPDATE_UBOOT_NAME:ccimx6sbc ?= "${SWUPDATE_UBOOT_PREFIX}-ccimx6qsbc${SWUPDATE_UBOOT_EXT}" SWUPDATE_UBOOT_NAME:ccmp1 ?= "${SWUPDATE_UBOOT_PREFIX}-${MACHINE}-optee${FIP_SIGN_SUFFIX}${SWUPDATE_UBOOT_EXT}" SWUPDATE_UBOOT_NAME_TFA ?= "" SWUPDATE_UBOOT_NAME_TFA:ccmp1 ?= "${SWUPDATE_UBOOT_PREFIX_TFA}-${MACHINE}-nand${SWUPDATE_UBOOT_EXT_TFA}${TFA_SIGN_SUFFIX}" diff --git a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_mmc.sh b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_mmc.sh index b1e569875..fa0d26520 100755 --- a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_mmc.sh +++ b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_mmc.sh @@ -1,7 +1,7 @@ #!/bin/sh #=============================================================================== # -# Copyright (C) 2022 by Digi International Inc. +# Copyright (C) 2022-2024 by Digi International Inc. # All rights reserved. # # This program is free software; you can redistribute it and/or modify it @@ -13,199 +13,252 @@ # Script will be called by swupdate to install a new u-boot within linux. #=============================================================================== -UBOOT_FILE="$1" +UBOOT_NAME="$1" UBOOT_ENC="$2" -uboot_seek_kb="$3" +UBOOT_SEEK_KB="$3" +UBOOT_FILE="/tmp/${UBOOT_NAME}" +UBOOT_BLOCK_MAIN="mmcblk0boot0" +UBOOT_MMC_DEV_MAIN="/dev/${UBOOT_BLOCK_MAIN}" +UBOOT_MMC_DUMP="/tmp/u-boot-dump.hex" +UBOOT_ENCRYPTED_DEK="/tmp/u-boot-encrypted-with-dek.imx" -echo "**** Start U-Boot update process *****" +DEK_FILE="/tmp/dek.bin" +DEK_KEY_SIZE="32" +DEK_BLOB_SIZE="$((DEK_KEY_SIZE + 56))" # DEK blob has an overhead of 56 bytes: header (8 bytes) + random AES-256 key (32 bytes)+ MAC (16 bytes). +DEK_BLOB_HEADER_CCIMX6="8100584" +DEK_BLOB_HEADER_CCIMX8M="8100484" +DEK_BLOB_HEADER_CCIMX8X="00580081" -PLATFORM="$(cat /proc/device-tree/digi,machine,name)" -UBOOT_MMC_DEV="/dev/mmcblk0boot0" +PLATFORM="$(tr -d '\0' /dev/null; then + # CCIMX8M platforms have a hardcoded DEK blob size of 96 bytes. + DEK_BLOB_SIZE="96" +fi +if expr "${PLATFORM}" : "ccimx8x.*" >/dev/null; then + # The U-Boot seek variable depends on the hardware variant of the i.MX8X module. + SOC_REV="$(fw_printenv -n soc_rev)" + if [ -n "${SOC_REV}" ]; then + case "${SOC_REV}" in + A0) + UBOOT_SEEK_KB="33" + ;; + B0) + UBOOT_SEEK_KB="32" + ;; + *) + UBOOT_SEEK_KB="0" + ;; + esac + fi +fi -dump_dek () +clean_artifacts () { - OUTPUT_FILE="/tmp/dek.bin" - KEY_SIZE_BYTES="32" - ENCRYPTED_UBOOT_DEK="u-boot-encrypted-with-dek.imx" - UBOOT_MMC_DUMP="/tmp/u-boot-dump.hex" + rm -f "${DEK_FILE}" "${UBOOT_MMC_DUMP}" "${UBOOT_ENCRYPTED_DEK}" +} - # ConnectCore 8X - if [ "${PLATFORM}" = "ccimx8x-sbc-pro" ] || [ "${PLATFORM}" = "ccimx8x-sbc-express" ]; then - AHAB_AUTH_CONTAINER_TAG="87" - AHAB_AUTH_SIG_BLOCK_TAG="90" - AHAB_AUTH_BLOB_TAG="00 58 00 81" - AHAB_VERSION="00" - CONT_HEADER_OFFSET="0x400" +exit_error () +{ + local ERROR_MESSAGE="$1" + local ERROR_CODE="$2" - dd if=${UBOOT_MMC_DEV} of=${UBOOT_MMC_DUMP} count=100 bs=1K skip=${uboot_seek_kb} 2>/dev/null - auth_container_tag=$(hexdump -C "${UBOOT_MMC_DUMP}" | grep -m 1 "${AHAB_AUTH_CONTAINER_TAG}" | awk '{print $2 $5}') - echo "auth_container_tag ${auth_container_tag}" - if [ "${auth_container_tag}" = "${AHAB_VERSION}${AHAB_AUTH_CONTAINER_TAG}" ]; then - sig_block_offset="0x$(hexdump -C "${UBOOT_MMC_DUMP}" | grep -m 1 "${AHAB_AUTH_CONTAINER_TAG}" | awk '{print $13 $14}')" - echo " ++++ signature block offset ${sig_block_offset} " + echo "${ERROR_MESSAGE}" + clean_artifacts + [ -z "${ERROR_CODE}" ] && exit 1 || exit "${ERROR_CODE}" +} - nd_sig_block="$((CONT_HEADER_OFFSET + sig_block_offset))" - printf '++++ header offset 0x%x\n' ${nd_sig_block} - auth_sig_block_tag=$(hexdump -C -s "${nd_sig_block}" "${UBOOT_MMC_DUMP}" | grep -m 1 "${AHAB_AUTH_SIG_BLOCK_TAG}" | awk '{print $2 $5}') - echo "auth_sig_block_tag ${auth_sig_block_tag}" - if [ "${auth_sig_block_tag}" = "${AHAB_VERSION}${AHAB_AUTH_SIG_BLOCK_TAG}" ]; then - blob_offset="0x$(hexdump -C -s "${nd_sig_block}" "${UBOOT_MMC_DUMP}" -n 16 | awk '{print $13 $12}')" - printf " ++++ blob offset 0x%x\n" ${blob_offset} - dek_blob="$((nd_sig_block + blob_offset))" - printf " ++++ dek_blob offset 0x%x\n" ${dek_blob} +dump_dek_ccimx8x () +{ + local AHAB_AUTH_CONTAINER_TAG="87" + local AHAB_AUTH_SIG_BLOCK_TAG="90" + local AHAB_VERSION="00" + local CONT_HEADER_OFFSET="0x400" - # DEK blobs have an overhead of 56 bytes. - dek_blob_size=$((KEY_SIZE_BYTES + 56)) - - # Dump dek blob into to a file - dd of=${OUTPUT_FILE} if=${UBOOT_MMC_DUMP} count=${dek_blob_size} bs=1 skip=${dek_blob} 2>/dev/null - rc=$? - if [ $rc -ne 0 ]; then - echo "DEK dump to the output file failed." - return $rc - fi - echo "dump_dek: output file has been created." - # Validate DEK blob - if [ -z "$(dd if=${OUTPUT_FILE} bs=1 count=4 2>/dev/null | hexdump -C | grep "${AHAB_AUTH_BLOB_TAG}")" ]; then - echo "Could not find DEK blob" - rm -rf ${OUTPUT_FILE} - return 1 - fi - echo "DEK blob correctly dumped" - else - echo "## ERROR: AHAB authentication signature block tag not found." + # Dump U-Boot first 100Kb to file. The second AHAB container, which contains the DEK blob is there. + dd if="${UBOOT_MMC_DEV_MAIN}" of="${UBOOT_MMC_DUMP}" count=100 bs=1K skip="${UBOOT_SEEK_KB}" 2>/dev/null + # Look for second AHAB authentication container. Second Container Header is set with a 1KB padding (0x400) + local AUTH_CONTAINER_TAG="$(hexdump -C "${UBOOT_MMC_DUMP}" -s "${CONT_HEADER_OFFSET}" | grep -m 1 "${AHAB_AUTH_CONTAINER_TAG}" | awk '{print $2 $5}')" + if [ "${AUTH_CONTAINER_TAG}" = "${AHAB_VERSION}${AHAB_AUTH_CONTAINER_TAG}" ]; then + # Determine second signature block relative and final offset. + local SECOND_SIG_BLOCK_OFFSET="0x$(hexdump -C -s "${CONT_HEADER_OFFSET}" "${UBOOT_MMC_DUMP}" | grep -m 1 "${AHAB_AUTH_CONTAINER_TAG}" | awk '{print $15 $14}')" + local SECOND_SIG_BLOCK="$((CONT_HEADER_OFFSET + SECOND_SIG_BLOCK_OFFSET))" + # Validate second signature block. + local AUTH_SIG_BLOCK_TAG="$(hexdump -C -s "${SECOND_SIG_BLOCK}" "${UBOOT_MMC_DUMP}" | grep -m 1 "${AHAB_AUTH_SIG_BLOCK_TAG}" | awk '{print $2 $5}')" + if [ "${AUTH_SIG_BLOCK_TAG}" = "${AHAB_VERSION}${AHAB_AUTH_SIG_BLOCK_TAG}" ]; then + # Determine DEK blob relative and final offset. + local DEK_BLOB_RELATIVE_OFFSET="0x$(hexdump -C -s "${SECOND_SIG_BLOCK}" "${UBOOT_MMC_DUMP}" | grep -m 1 "${AHAB_AUTH_SIG_BLOCK_TAG}" | awk '{print $13 $12}')" + DEK_AHAB_OFFSET="$((SECOND_SIG_BLOCK + DEK_BLOB_RELATIVE_OFFSET))" + # Dump DEK blob into to a file. + dd if="${UBOOT_MMC_DUMP}" of="${DEK_FILE}" count="${DEK_BLOB_SIZE}" bs=1 skip="${DEK_AHAB_OFFSET}" 2>/dev/null + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: DEK dump to file failed." "${rc}" + fi + # Validate DEK blob. + if ! dd if="${DEK_FILE}" bs=1 count=4 2>/dev/null | hexdump -ve '1/1 "%.2X"' | grep -q "${DEK_BLOB_HEADER_CCIMX8X}"; then + exit_error "## ERROR: Could not find DEK blob." fi else - echo "## ERROR: AHAB authentication container tag not found." - return 1 + exit_error "## ERROR: AHAB authentication signature block tag not found." fi else - #(The last byte lacks one digit on purpose, to match 40, 41 and 42; all HAB versions) - UBOOT_HEADER="d1 00 20 4" - if [ "${PLATFORM}" = "ccimx8mn-dvk" ] || [ "${PLATFORM}" = "ccimx8mm-dvk" ]; then - SKIP_BLOCKS="0" - DEK_BLOB_HEADER="81 00 48 4" - else - SKIP_BLOCKS="2" - DEK_BLOB_HEADER="81 00 58 4" - fi - - dd if=${UBOOT_MMC_DEV} of=${UBOOT_MMC_DUMP} count=1 skip=${SKIP_BLOCKS} 2>/dev/null - uboot_start="0x$(hexdump -C ${UBOOT_MMC_DUMP} | grep -m 1 "${UBOOT_HEADER}" | head -1 | cut -c -8)" - echo "++++ ${uboot_start} +++" - if [ "${uboot_start}" = "0x" ]; then - echo "Could not find U-Boot on MMC" - return 1 - fi - - uboot_size_offset="$((uboot_start + 36))" - uboot_size=$(hexdump -n 4 -s ${uboot_size_offset} -e '/4 "%d\t" "\n"' ${UBOOT_MMC_DUMP}) - - # DEK blobs have an overhead of 56 bytes. - dek_blob_size="$((KEY_SIZE_BYTES + 56))" - - # remove the output DEK file before creating it. - # Since this function is called twice. - # For the actual upgrade and then for the validation after the upgrade. - rm -f ${OUTPUT_FILE} - dump_size="$((uboot_size / 512))" - echo "++++ ${dump_size} +++" - dd if=${UBOOT_MMC_DEV} of=${UBOOT_MMC_DUMP} count=${dump_size} skip=${SKIP_BLOCKS} conv=fsync 2>/dev/null - dek_start=$(hexdump -C ${UBOOT_MMC_DUMP} | grep -m 1 "${DEK_BLOB_HEADER}" | head -1 | cut -c -8) - echo "++++ dek_start ${dek_start} +++" - dek_start="$((16#${dek_start} + 8))" - echo "++++ dek_start ${dek_start} +++" - dd of=${OUTPUT_FILE} if=${UBOOT_MMC_DUMP} count=${dek_blob_size} bs=1 skip=${dek_start} 2>/dev/null - rc=$? - if [ $rc -ne 0 ]; then - echo "DEK dump to the output file failed." - return $rc - fi - echo "dump_dek: output file has been created." - # Validate DEK blob - if [ -z "$(dd if=${OUTPUT_FILE} bs=1 count=4 2>/dev/null | hexdump -C | grep "${DEK_BLOB_HEADER}")" ]; then - echo "Could not find DEK blob" - rm -rf ${OUTPUT_FILE} - return 1 - fi - echo "DEK blob correctly dumped" - rm -f ${UBOOT_MMC_DUMP} - return 0 + exit_error "## ERROR: AHAB authentication container tag not found." fi } -if [ "${UBOOT_ENC}" = "enc" ]; then +dump_dek_ccimx8m_ccimx6 () +{ + local IVT_HEADER="d1 00 20 4" # The last byte lacks one digit on purpose, to match 40, 41 and 42; all HAB versions. + local DEK_BLOB_HEADER="$1" + + # Look for U-Boot in the eMMC. It starts with the IVT table header. + dd if="${UBOOT_MMC_DEV_MAIN}" of="${UBOOT_MMC_DUMP}" bs=1k skip="${UBOOT_SEEK_KB}" 2>/dev/null + local UBOOT_START="0x$(hexdump -C "${UBOOT_MMC_DUMP}" | grep -m 1 "${IVT_HEADER}" | head -1 | cut -c -8)" + if [ "${UBOOT_START}" = "0x" ]; then + exit_error "## ERROR: Could not find U-Boot on MMC." + fi + # DEK blob must be extracted from the SPL image. First determine SPL image size. + local SPL_SIZE_OFFSET="$((UBOOT_START + 36))" # Size information is at offset 36. + local SPL_SIZE="$(hexdump -n 4 -s "${SPL_SIZE_OFFSET}" -e '/4 "%d\t" "\n"' "${UBOOT_MMC_DUMP}")" + # Determine SPL size in blocks of 1Kb. Round up division if it is not exact. + local DUMP_SIZE="$(( (SPL_SIZE + 1023) / 1024 ))" + # Dump SPL image to file. + dd if="${UBOOT_MMC_DEV_MAIN}" of="${UBOOT_MMC_DUMP}" bs=1k count="${DUMP_SIZE}" skip="${UBOOT_SEEK_KB}" conv=fsync 2>/dev/null + # Look for the DEK blob in SPL image. + DEK_SPL_OFFSET="$(hexdump -ve '1/1 "%.2X"' ${UBOOT_MMC_DUMP} | awk -v pattern="${DEK_BLOB_HEADER}" 'BEGIN{IGNORECASE=1} {pos=index($0, pattern)} pos {print (pos-1)/2}')" + # Dump the DEK blob to file. + dd if="${UBOOT_MMC_DUMP}" of="${DEK_FILE}" count="${DEK_BLOB_SIZE}" bs=1 skip="${DEK_SPL_OFFSET}" 2>/dev/null + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: DEK dump to file failed." "${rc}" + fi + # Validate DEK blob. + if ! dd if="${DEK_FILE}" bs=1 count=4 2>/dev/null | hexdump -ve '1/1 "%.2X"' | grep -q "${DEK_BLOB_HEADER}"; then + exit_error "## ERROR: Could not find DEK blob." + fi +} + +dump_dek_ccimx93 () +{ + exit_error "## ERROR: DEK support not implemented yet for CCIMX93." +} + +dump_dek () +{ + case "${PLATFORM}" in + ccimx8x*) + dump_dek_ccimx8x + ;; + ccimx8m*) + dump_dek_ccimx8m_ccimx6 "${DEK_BLOB_HEADER_CCIMX8M}" + ;; + ccimx6*) + dump_dek_ccimx8m_ccimx6 "${DEK_BLOB_HEADER_CCIMX6}" + ;; + ccimx93*) + dump_dek_ccimx93 + ;; + *) + exit_error "## ERROR: Device not supported ${PLATFORM}." + ;; + esac +} + +append_dek_ccimx8x () +{ + cp "${UBOOT_FILE}" "${UBOOT_ENCRYPTED_DEK}" + # Insert the DEK blob into the AHAB container. + dd if="${DEK_FILE}" of="${UBOOT_ENCRYPTED_DEK}" bs=1 seek="${DEK_AHAB_OFFSET}" conv=notrunc 2>/dev/null + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: Merging DEK with AHAB container failed." "${rc}" + fi +} + +append_dek_ccimx8m () +{ + cp "${UBOOT_FILE}" "${UBOOT_ENCRYPTED_DEK}" + # Insert the DEK blob into the SPL image. + dd if="${DEK_FILE}" of="${UBOOT_ENCRYPTED_DEK}" bs=1 seek="${DEK_SPL_OFFSET}" conv=notrunc 2>/dev/null + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: Merging DEK with SPL image failed." "${rc}" + fi + # Get total iMX-Boot file size. + local UBOOT_FILE_SIZE="$(stat -L -c %s "${UBOOT_FILE}")" + # Determine FIT DEK blob offset. + local DEK_FIT_OFFSET="$((UBOOT_FILE_SIZE - DEK_BLOB_SIZE))" + # Insert the DEK blob into the FIT image. + dd if="${DEK_FILE}" of="${UBOOT_ENCRYPTED_DEK}" bs=1 seek="${DEK_FIT_OFFSET}" conv=notrunc 2>/dev/null + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: Merging DEK with FIT image failed." "${rc}" + fi +} + +append_dek_ccimx6 () +{ + cat "${UBOOT_FILE}" "${DEK_FILE}" > "${UBOOT_ENCRYPTED_DEK}" + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: Merging DEK with U-Boot image failed." "${rc}" + fi +} + +append_dek_ccimx93 () +{ + exit_error "## ERROR: DEK support not implemented yet for CCIMX93." +} + +append_dek () +{ dump_dek - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: DEK dump failed" - exit $rc + case "${PLATFORM}" in + ccimx8x*) + append_dek_ccimx8x + ;; + ccimx8m*) + append_dek_ccimx8m + ;; + ccimx6*) + append_dek_ccimx6 + ;; + ccimx93*) + append_dek_ccimx93 + ;; + *) + exit_error "## ERROR: Device not supported: ${PLATFORM}." + ;; + esac + UBOOT_FILE="${UBOOT_ENCRYPTED_DEK}" +} + +write_uboot_emmc () +{ + local UBOOT_BLOCK="$1" + + # Enable write access in the U-Boot partition. + echo 0 > "/sys/block/${UBOOT_BLOCK}/force_ro" + # Write the U-Boot into the eMMC. + dd if="${UBOOT_FILE}" of="/dev/${UBOOT_BLOCK}" seek="${UBOOT_SEEK_KB}" bs=1K 2>/dev/null + local rc=$? + # Disable write access in U-Boot partition. + echo 1 > "/sys/block/${UBOOT_BLOCK}/force_ro" + # Check update operation result. + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: failed to write file ${UBOOT_FILE} to /dev/${UBOOT_BLOCK}" "${rc}" fi - if [ "${PLATFORM}" = "ccimx8x-sbc-pro" ] || [ "${PLATFORM}" = "ccimx8x-sbc-express" ]; then - cp /tmp/${UBOOT_FILE} /tmp/${ENCRYPTED_UBOOT_DEK} - # insert the dek_blob into the AHAB container - dd if=${OUTPUT_FILE} of=/tmp/${ENCRYPTED_UBOOT_DEK} bs=1 seek=${dek_blob} conv=notrunc 2>/dev/null - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: Merging DEK with U-Boot image failed (DEV/FILE = /tmp/$UBOOT_FILE)" - exit $rc - fi - elif [ "${PLATFORM}" = "ccimx8mn-dvk" ] || [ "${PLATFORM}" = "ccimx8mm-dvk" ]; then - FIT_DEK_BLOB_SIZE="96"; - cp /tmp/${UBOOT_FILE} /tmp/${ENCRYPTED_UBOOT_DEK} - # insert the dek_blob into the SPL - dd if=${OUTPUT_FILE} of=/tmp/${ENCRYPTED_UBOOT_DEK} bs=1 seek=${dek_start} conv=notrunc 2>/dev/null - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: Merging DEK with SPL image failed (DEV/FILE = /tmp/$UBOOT_FILE)" - exit $rc - fi - # get u-boot image file size - uboot_file_size="$(stat -L -c %s /tmp/${UBOOT_FILE})" - echo " ++++ uboot_file_size ${uboot_file_size} ***" - uboot_dek_blob_offset="$((uboot_file_size - FIT_DEK_BLOB_SIZE))" - echo " ----- uboot_dek_blob_offset ${uboot_dek_blob_offset} **" - # insert the dek_blob at the end of the bootloader - dd of=/tmp/${ENCRYPTED_UBOOT_DEK} if=${OUTPUT_FILE} bs=1 seek=${uboot_dek_blob_offset} conv=notrunc 2>/dev/null - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: Merging DEK with U-Boot image failed (DEV/FILE = /tmp/$UBOOT_FILE)" - exit $rc - fi - else - cat /tmp/${UBOOT_FILE} ${OUTPUT_FILE} > /tmp/${ENCRYPTED_UBOOT_DEK} - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: Merging DEK with U-Boot image failed (DEV/FILE = /tmp/$UBOOT_FILE)" - exit $rc - fi - fi - # enable write access - echo 0 > /sys/block/mmcblk0boot0/force_ro - UBOOT_FILE="/tmp/${ENCRYPTED_UBOOT_DEK}" - # write the encrypted u-boot into the MMC - dd if=${UBOOT_FILE} of=${UBOOT_MMC_DEV} seek=${uboot_seek_kb} bs=1K - rc=$? 2>/dev/null - if [ "$rc" -ne 0 ]; then - echo "u-boot: failed to write file ${UBOOT_FILE}" - else - echo "u-boot: successfully written file ${UBOOT_FILE}" - fi - # disable write access - echo 1 > /sys/block/mmcblk0boot0/force_ro - rm -f ${UBOOT_FILE} ${OUTPUT_FILE} -else - # enable write access - echo 0 > /sys/block/mmcblk0boot0/force_ro - # write the u-boot into the MMC - dd if=${UBOOT_FILE} of=${UBOOT_MMC_DEV} seek=${uboot_seek_kb} bs=1K 2>/dev/null - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: failed to write file ${UBOOT_FILE}" - else - echo "u-boot: successfully written file ${UBOOT_FILE}" - fi - # disable write access - echo 1 > /sys/block/mmcblk0boot0/force_ro - rm -f ${UBOOT_FILE} ${OUTPUT_FILE} + echo "U-Boot successfully writen to /dev/${UBOOT_BLOCK}" +} + +# If U-Boot is encrypted, the DEK key blob needs to be extracted from existing U-Boot +# and appended to the new U-Boot before writing it. +if [ "${UBOOT_ENC}" = "enc" ]; then + append_dek fi +# Write U-Boot +write_uboot_emmc ${UBOOT_BLOCK_MAIN} +# Clean intermediate artifacts. +clean_artifacts + +exit 0 From e25f3e4f5f45999cfdeca46d140977515b80f752 Mon Sep 17 00:00:00 2001 From: David Escalona Date: Tue, 9 Jan 2024 18:28:47 +0100 Subject: [PATCH 111/118] swupdate: ccmp1: remove not required 'upgrade_available' U-Boot variable from tempalte This variable is only required to enable the bootcount feature after an update when the bootcount value is stored in the environment. This only happens in the CCIMX6 products, so it makes no sense to use it for the CCMP1 devices. Signed-off-by: David Escalona --- .../swu-images/files/ccmp1/sw-description-images_template | 8 -------- 1 file changed, 8 deletions(-) diff --git a/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template b/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template index 893778dcb..006595b9a 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template +++ b/meta-digi-dey/recipes-digi/swu-images/files/ccmp1/sw-description-images_template @@ -18,10 +18,6 @@ software = ##SCRIPT_UBOOT## ); uboot: ( - { - name = "upgrade_available"; - value = "1"; - }, { name = "rootfstype" value = "@@SWUPDATE_ROOTFS_TYPE@@" @@ -42,10 +38,6 @@ software = ##SCRIPT_UBOOT## ); uboot: ( - { - name = "upgrade_available"; - value = "1"; - }, { name = "rootfstype" value = "@@SWUPDATE_ROOTFS_TYPE@@" From 6d898e51f99b47d1a863502cd65089284871d437 Mon Sep 17 00:00:00 2001 From: David Escalona Date: Tue, 9 Jan 2024 17:03:57 +0100 Subject: [PATCH 112/118] swupdate: rework script to update U-Boot in NAND devices Rework the script so that it has a similar structure as the MMC leaving it ready to integrate new platforms. Signed-off-by: David Escalona --- .../swu-images/files/swupdate_uboot_nand.sh | 237 ++++++++++-------- 1 file changed, 135 insertions(+), 102 deletions(-) diff --git a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh index c92620ce7..d7884570f 100755 --- a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh +++ b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh @@ -1,7 +1,7 @@ #!/bin/sh #=============================================================================== # -# Copyright (C) 2022-2023 by Digi International Inc. +# Copyright (C) 2022-2024 by Digi International Inc. # All rights reserved. # # This program is free software; you can redistribute it and/or modify it @@ -13,121 +13,154 @@ # Script will be called by swupdate to install a new u-boot within linux. #=============================================================================== -UBOOT_FILE="$1" +UBOOT_NAME="$1" UBOOT_ENC="$2" -TFA_FILE="$4" +UBOOT_SEEK_KB="$3" +UBOOT_TFA_NAME="$4" +UBOOT_TFA_FILE="/tmp/${UBOOT_TFA_NAME}" +UBOOT_FILE="/tmp/${UBOOT_NAME}" +UBOOT_NAND_DUMP="/tmp/u-boot-dump.hex" +UBOOT_ENCRYPTED_DEK="/tmp/u-boot-encrypted-with-dek.imx" -echo "**** Start U-Boot update process *****" +DEK_FILE="/tmp/dek.bin" +DEK_KEY_SIZE="32" +DEK_BLOB_SIZE="$((DEK_KEY_SIZE + 56))" # DEK blob has an overhead of 56 bytes: header (8 bytes) + random AES-256 key (32 bytes) + MAC (16 bytes). +DEK_BLOB_HEADER="8100584" # The last byte lacks one digit on purpose, to match 40, 41 and 42; all HAB versions. -# need to mount debufs to remove some kobs-ng warnings -if ! grep -qs debugfs /proc/mounts; then - mount -t debugfs debugfs /sys/kernel/debug/ -fi +PLATFORM="$(tr -d '\0' "${DEK_FILE}" + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: DEK dump to file failed." "${rc}" + fi + # Validate the DEK blob. + if ! dd if="${DEK_FILE}" bs=1 count=4 2>/dev/null | hexdump -ve '1/1 "%.2X"' | grep -q "${DEK_BLOB_HEADER}"; then + exit_error "## ERROR: Could not find DEK blob." + fi +} dump_dek () { - echo "**** Get DEK and append to the new u-boot *****" - UBOOT_MTD_DEV="/dev/mtd0" - OUTPUT_FILE="/tmp/dek.bin" - KEY_SIZE_BYTES="32" - ENCRYPTED_UBOOT_DEK="u-boot-encrypted-with-dek.imx" - - #(The last byte lacks one digit on purpose, to match 40, 41 and 42; all HAB versions) - UBOOT_HEADER="d1 00 20 4" - DEK_BLOB_HEADER="81 00 58 4" - - uboot_start="0x$(nanddump ${UBOOT_MTD_DEV} | hexdump -C | grep -m 1 "${UBOOT_HEADER}" | head -1 | cut -c -8)" - if [ "${uboot_start}" = "0x" ]; then - echo "Could not find U-Boot on NAND" - return 78 - fi - - uboot_size_offset=$((uboot_start + 36)) - uboot_size=$(hexdump -n 4 -s ${uboot_size_offset} -e '/4 "0x%08x\t" "\n"' ${UBOOT_MTD_DEV}) - # dump start needs to be aligned (U-Boot always leaves 0x400 for DOS table) - dump_start=$((uboot_start - 0x400)) - # DEK blobs have an overhead of 56 bytes. - dek_blob_size=$((KEY_SIZE_BYTES + 56)) - - # remove the output DEK file before creating it. - # Since this function is called twice. - # For the actual upgrade and then for the validation after the upgrade. - rm -f ${OUTPUT_FILE} - # read the complete U-Boot (to skip alignment issues) and keep the dek_blob (which is at the end) - nanddump -s ${dump_start} -l ${uboot_size} ${UBOOT_MTD_DEV} | tail -c ${dek_blob_size} > ${OUTPUT_FILE} - rc=$? - if [ $rc -ne 0 ]; then - echo "DEK dump to the output file failed." - return $rc - fi - echo "dump_dek: output file has been created." - # Validate DEK blob - if [ -z "$(dd if=${OUTPUT_FILE} bs=1 count=4 2>/dev/null | hexdump -C | grep "${DEK_BLOB_HEADER}")" ]; then - echo "Could not find DEK blob" - rm -rf ${OUTPUT_FILE} - return 60 - fi - echo "DEK blob correctly dumped" - return 0 + case "${PLATFORM}" in + ccimx6ul*) + dump_dek_ccimx6ul + ;; + *) + exit_error "## ERROR: Device not supported ${PLATFORM}." + ;; + esac } -install_fwu () +append_dek_ccimx6ul () { - FLASH_DEV="$1" - FW_FILE="$2" - - flash_eraseall ${FLASH_DEV} - rc=$? - if [ "$rc" -ne 0 ]; then - echo "U-Boot: erasing ${FLASH_DEV} failed" - exit $rc - fi - nandwrite -p ${FLASH_DEV} /tmp/${FW_FILE} - if [ "$rc" -ne 0 ]; then - echo "U-Boot: failed to write firmware to ${FLASH_DEV}" - exit $rc + cat "${UBOOT_FILE}" "${DEK_FILE}" > "${UBOOT_ENCRYPTED_DEK}" + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: Merging DEK with U-Boot image failed." "${rc}" fi } -COMP_CCMP1=$(cat /proc/device-tree/compatible | grep "\bdigi,ccmp1\b") +append_dek () +{ + dump_dek + case "${PLATFORM}" in + ccimx6ul*) + append_dek_ccimx6ul + ;; + *) + exit_error "## ERROR: Device not supported: ${PLATFORM}." + ;; + esac + UBOOT_FILE="${UBOOT_ENCRYPTED_DEK}" +} +write_file_to_nand () +{ + local FLASH_DEV="$1" + local FW_FILE="$2" + + # Sanity check. + if [ ! -c "${FLASH_DEV}" ]; then + exit_error "## ERROR: Invalid MTD partition: ${FLASH_DEV}." + fi + # Clean MTD partition. + flash_eraseall "${FLASH_DEV}" + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: Could not erase ${FLASH_DEV} partition." "${rc}" + fi + # Write file to NAND. + nandwrite -p "${FLASH_DEV}" "${FW_FILE}" + local rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: Could not write file to NAND." "${rc}" + fi +} + +get_mtd_number_from_partition () +{ + local PARTITION_NAME="$1" + local MTD_NUM="$(sed -ne "/${PARTITION_NAME}/s,^mtd\([0-9]\+\).*,\1,g;T;p" /proc/mtd)" + + echo "${MTD_NUM}" +} + +# If U-Boot is encrypted, the DEK key blob needs to be extracted from existing U-Boot +# and appended to the new U-Boot before writing it. if [ "${UBOOT_ENC}" = "enc" ]; then - if [ "${COMP_CCMP1}" = "digi,ccmp1" ]; then - # Currently not supported for these platforms - echo "*** Encrypted U-boot currently not support for CCMP1 ***" - else - dump_dek - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: DEK dump failed" - exit $rc - fi - cat $UBOOT_FILE $OUTPUT_FILE > /tmp/$ENCRYPTED_UBOOT_DEK - rc=$? - if [ "$rc" -ne 0 ]; then - echo "u-boot: Merging DEK with U-Boot image failed (DEV/FILE = $UBOOT_FILE)" - exit $rc - fi - UBOOT_FILE="${ENCRYPTED_UBOOT_DEK}" + append_dek +fi +# Write U-Boot +if expr "${PLATFORM}" : "ccmp1.*" >/dev/null; then + # Install TFA file in fsbl1 partition. + write_file_to_nand "/dev/mtd$(get_mtd_number_from_partition fsbl1)" "${UBOOT_TFA_FILE}" + # Install U-Boot FIP file in fip-a partition. + write_file_to_nand "/dev/mtd$(get_mtd_number_from_partition fip-a)" "${UBOOT_FILE}" +else + # Mount debug file system to remove some kobs-ng warnings. + if ! grep -qs debugfs /proc/mounts; then + mount -t debugfs debugfs /sys/kernel/debug/ + fi + # Install U-Boot onto the Nand Flash using kobs-ng. + kobs-ng init -x -v "${UBOOT_FILE}" + rc=$? + if [ "${rc}" -ne 0 ]; then + exit_error "## ERROR: Could not write file to NAND." "${rc}" fi fi +# Clean intermediate artifacts. +clean_artifacts -if [ "${COMP_CCMP1}" = "digi,ccmp1" ]; then - # install TF-A onto fsbl1 partition - mtd_num="$(sed -ne "/fsbl1/s,^mtd\([0-9]\+\).*,\1,g;T;p" /proc/mtd)" - TFA_DEV="/dev/mtd${mtd_num}" - install_fwu ${TFA_DEV} ${TFA_FILE} - # install U-Boot onto FIP-a partition - mtd_num="$(sed -ne "/fip-a/s,^mtd\([0-9]\+\).*,\1,g;T;p" /proc/mtd)" - FIP_DEV="/dev/mtd${mtd_num}" - install_fwu ${FIP_DEV} ${UBOOT_FILE} -else - # install U-Boot onto the Nand Flash - kobs-ng init -x -v /tmp/${UBOOT_FILE} -fi -rc=$? -if [ "$rc" -ne 0 ]; then - echo "u-Boot: Updating U-Boot partition failed" -else - echo "u-Boot: Updating U-Boot partition successful" -fi +exit 0 From 65750ce196c36aac5257235e4736a8ce4481a4c9 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 15 Jan 2024 18:26:56 +0100 Subject: [PATCH 113/118] ccimx93: move environment to the end of the bootX partitions libubootenv treats negative offsets as backwards offset from the end of the block device, so use that to move the environment to the last 16KiB of the hardware boot partitions. https://onedigi.atlassian.net/browse/DUB-1064 Signed-off-by: Javier Viguera --- .../libubootenv/libubootenv/ccimx93/mmc/fw_env.config | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 meta-digi-arm/recipes-bsp/libubootenv/libubootenv/ccimx93/mmc/fw_env.config diff --git a/meta-digi-arm/recipes-bsp/libubootenv/libubootenv/ccimx93/mmc/fw_env.config b/meta-digi-arm/recipes-bsp/libubootenv/libubootenv/ccimx93/mmc/fw_env.config new file mode 100644 index 000000000..5e4566345 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/libubootenv/libubootenv/ccimx93/mmc/fw_env.config @@ -0,0 +1,7 @@ +# Configuration file for fw_(printenv/setenv) utility. +# Up to two entries are valid, in this case the redundant +# environment sector is assumed present. + +# Device name Offset Size +/dev/mmcblk0boot0 -0x4000 0x4000 +/dev/mmcblk0boot1 -0x4000 0x4000 From efb80f380659722f86fec0af2ac2541088999b54 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 15 Jan 2024 09:10:28 +0100 Subject: [PATCH 114/118] cc93: standby: decople bluetooth from WiFi actions Do not make conditional the bluetooth actions on WiFi, as they can be treated independently. Signed-off-by: Isaac Hermida --- .../busybox/busybox/ccimx93/standby-actions | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions b/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions index c6abb6f93..432602888 100644 --- a/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions +++ b/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions @@ -3,7 +3,7 @@ # # standby-actions # -# Copyright (C) 2023 by Digi International Inc. +# Copyright (C) 2023, 2024 by Digi International Inc. # All rights reserved. # # This program is free software; you can redistribute it and/or modify it @@ -18,39 +18,47 @@ RESUME_ACTIONS="/tmp/resume_actions" -actions_needed() { +wifi_actions_needed() { [ -d "/proc/device-tree/wireless" ] && [ ! -e "/sys/firmware/devicetree/base/soc@0/bus@42800000/mmc@428b0000/keep-power-in-suspend" ] } +bt_actions_needed() { + systemctl -q is-active bluetooth-init +} + if [ "${1}" = "pre" ]; then + rm -f "${RESUME_ACTIONS}" + # Stop NetworkManager before suspend systemctl stop NetworkManager - if actions_needed; then - rm -f "${RESUME_ACTIONS}" + if wifi_actions_needed; then for iface in wlan0 uap0 wfd0; do if grep -qs ${iface} /var/run/ifstate; then ifdown ${iface} && echo "ifup ${iface}" >> "${RESUME_ACTIONS}" fi done - rmmod moal - rmmod mlan + { + echo "sleep 0.5" + echo "/etc/udev/scripts/load_iw612.sh" + } >> "${RESUME_ACTIONS}" + modprobe -r moal + fi - if systemctl is-active bluetooth-init; then - # bluetooth service relies on bluetooth-init service, so stop/start it unconditionally - echo "systemctl start bluetooth-init" >> "${RESUME_ACTIONS}" - echo "systemctl start bluetooth" >> "${RESUME_ACTIONS}" - systemctl stop bluetooth-init - systemctl stop bluetooth - fi + if bt_actions_needed; then + # bluetooth service relies on bluetooth-init service, so stop/start it unconditionally + { + echo "systemctl start bluetooth-init" + echo "systemctl start bluetooth" + } >> "${RESUME_ACTIONS}" + systemctl stop bluetooth-init + systemctl stop bluetooth fi elif [ "${1}" = "post" ]; then - if actions_needed; then - sleep 0.5 - /etc/udev/scripts/load_iw612.sh - - sh "${RESUME_ACTIONS}" + if [ -f ${RESUME_ACTIONS} ]; then + chmod +x "${RESUME_ACTIONS}" + eval "${RESUME_ACTIONS}" rm -f "${RESUME_ACTIONS}" fi From 721039df6bef986fc82c31fd133782ec10c25a52 Mon Sep 17 00:00:00 2001 From: Tatiana Leon Date: Fri, 12 Jan 2024 16:10:52 +0100 Subject: [PATCH 115/118] cccs: add CCCS_CONF_PATH variable to define custom cccs configuration file If 'CCCS_CONF_PATH' is defined, the specified file is installed as CCCS configuration file without any modification. It it is not defined or it is empty, the configuration file in cc_dey ('cc_dey/cccs-daemon/cfg_files/cccs.conf') is installed and modified if required. Signed-off-by: Tatiana Leon --- meta-digi-dey/recipes-digi/cccs/cccs_git.bb | 47 ++++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/meta-digi-dey/recipes-digi/cccs/cccs_git.bb b/meta-digi-dey/recipes-digi/cccs/cccs_git.bb index 10d5e5b34..a929409b3 100644 --- a/meta-digi-dey/recipes-digi/cccs/cccs_git.bb +++ b/meta-digi-dey/recipes-digi/cccs/cccs_git.bb @@ -16,6 +16,7 @@ CC_GITHUB = "gitsm://github.com/digi-embedded/cc_dey.git;protocol=https" CC_GIT_URI ?= "${@oe.utils.conditional('DIGI_INTERNAL_GIT', '1' , '${CC_STASH}', '${CC_GITHUB}', d)}" CCCS_DEVICE_TYPE ?= "${MACHINE}" +CCCS_CONF_PATH ?= "" SRC_URI = " \ ${CC_GIT_URI};branch=${SRCBRANCH} \ @@ -24,9 +25,26 @@ SRC_URI = " \ file://cccs-gs-demo-init \ file://cccs-gs-demo.service \ " +SRC_URI:append = "${@oe.utils.ifelse(d.getVar('CCCS_CONF_PATH'), \ + oe.utils.ifelse(d.getVar('CCCS_CONF_PATH').startswith('/'), "file://%s" % d.getVar('CCCS_CONF_PATH'), d.getVar('CCCS_CONF_PATH')), '')}" S = "${WORKDIR}/git" +# The configuration file can be provided by the user, so provide a PREMIRROR to +# a local directory that can be configured in the project's local.conf file +# using CCCS_CONF_PATH variable. +python() { + cccs_conf_path = d.getVar('CCCS_CONF_PATH') + if cccs_conf_path: + premirrors = d.getVar('PREMIRRORS') + if cccs_conf_path.startswith('/'): + cccs_conf_path = "file://%s" % cccs_conf_path + d.setVar('PREMIRRORS', "%s %s \\n %s" % (cccs_conf_path, cccs_conf_path, premirrors)) + cccs_conf_sha256 = d.getVar('CCCS_CONF_SHA256') + if cccs_conf_sha256: + d.setVarFlag("SRC_URI", "sha256sum", cccs_conf_sha256) +} + inherit pkgconfig systemd update-rc.d do_install() { @@ -45,15 +63,29 @@ do_install() { install -m 755 ${WORKDIR}/cccs-gs-demo-init ${D}${sysconfdir}/cccs-gs-demo ln -sf /etc/cccs-gs-demo ${D}${sysconfdir}/init.d/cccs-gs-demo - # Set the device type. Its maximum length is 255 characters - [ -z "${CCCS_DEVICE_TYPE}" ] && device_type="${MACHINE}" || device_type="${CCCS_DEVICE_TYPE}" - device_type="$(echo "${device_type}" | cut -c1-255)" - sed -i "/device_type = .*/c\device_type = \"${device_type}\"" ${D}${sysconfdir}/cccs.conf + if [ -n "${CCCS_CONF_PATH}" ]; then + CONF="${CCCS_CONF_PATH}" + if [ "${CONF#file://}" != "${CONF}" ]; then + CONF="${CONF#file://}" + elif [ "${CONF#/}" != "${CONF}" ]; then + CONF="${CONF}" + else + CONF="${WORKDIR}/$(basename ${CONF})" + fi + install -m 0644 "${CONF}" ${D}${sysconfdir}/cccs.conf + else + # Set the device type. Its maximum length is 255 characters + [ -z "${CCCS_DEVICE_TYPE}" ] && device_type="${MACHINE}" || device_type="${CCCS_DEVICE_TYPE}" + device_type="$(echo "${device_type}" | cut -c1-255)" + sed -i "/device_type = .*/c\device_type = \"${device_type}\"" ${D}${sysconfdir}/cccs.conf + fi } do_install:append:ccimx6ul() { - sed -i "/url = \"edp12.devicecloud.com\"/c\url = \"remotemanager.digi.com\"" ${D}${sysconfdir}/cccs.conf - sed -i "/client_cert_path = \"\/mnt\/data\/drm_cert.pem\"/c\client_cert_path = \"\/etc\/ssl\/certs\/drm_cert.pem\"" ${D}${sysconfdir}/cccs.conf + if [ -z "${CCCS_CONF_PATH}" ]; then + sed -i "/url = \"edp12.devicecloud.com\"/c\url = \"remotemanager.digi.com\"" ${D}${sysconfdir}/cccs.conf + sed -i "/client_cert_path = \"\/mnt\/data\/drm_cert.pem\"/c\client_cert_path = \"\/etc\/ssl\/certs\/drm_cert.pem\"" ${D}${sysconfdir}/cccs.conf + fi } pkg_postinst_ontarget:${PN}() { @@ -64,7 +96,8 @@ pkg_postinst_ontarget:${PN}() { fi } -inherit ${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "remove-pkg-postinst-ontarget", "", d)} +inherit ${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "remove-pkg-postinst-ontarget", \ + oe.utils.ifelse(d.getVar("CCCS_CONF_PATH"), "remove-pkg-postinst-ontarget", ""), d)} INITSCRIPT_PACKAGES = "${PN}-daemon ${PN}-gs-demo" INITSCRIPT_NAME:${PN}-daemon = "cccsd" From 5d74f18c2e71df8df53df7dde79d0534fe759906 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 17 Jan 2024 17:14:36 +0100 Subject: [PATCH 116/118] imx-gst1.0-plugin: restrict patches to ccimx6ul The JIRA in the patch description describes a problem in the CC6UL, so do not use the patches on other platforms. Signed-off-by: Javier Viguera --- .../recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend index 7fe9b3acc..01718e916 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend @@ -1,8 +1,8 @@ -# Copyright (C) 2016-2023 Digi International Inc. +# Copyright (C) 2016-2024 Digi International Inc. FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" -SRC_URI += " \ +SRC_URI:append:ccimx6ul = " \ file://0001-gstimxv4l2-map-dev-video1-to-dev-fb0.patch \ file://0002-imx-gst1.0-plugin-fix-build-using-MUSL-C-library.patch \ " From 9348d94d223bb3e236cea8bd9222da4de3608370 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 17 Jan 2024 18:45:06 +0100 Subject: [PATCH 117/118] ccimx93: update multimedia package for NXP release lf-6.1.55-2.2.0 Backport of multimedia package for ccimx93 from NXP's Mickledore-based lf-6.1.55-2.2.0 release. Mainly copies and appends of multimedia recipes from the new release, and restricted to ccimx93 by changing the COMPATIBLE_MACHINE, so it does not affect other platforms. https://onedigi.atlassian.net/browse/DEL-8840 Signed-off-by: Javier Viguera --- .../conf/machine/include/ccimx93.inc | 10 ++-- .../alsa/imx-alsa-plugins_git.bbappend | 4 +- ...=> gstreamer1.0-plugins-bad_1.22.5.imx.bb} | 12 ++--- ...> gstreamer1.0-plugins-base_1.22.5.imx.bb} | 16 +++--- ...> gstreamer1.0-plugins-good_1.22.5.imx.bb} | 13 ++--- ...bb => gstreamer1.0-plugins-ugly_1.22.6.bb} | 4 +- ...22.0.imx.bb => gstreamer1.0_1.22.5.imx.bb} | 10 ++-- .../gstreamer/imx-gst1.0-plugin_%.bbappend | 6 +-- .../imx-codec/imx-codec_4.8.1.bb | 13 ----- .../imx-codec/imx-codec_4.8.2.bb | 13 +++++ .../imx-dsp/imx-dsp-codec-ext_2.1.5.bb | 13 ----- .../imx-dsp/imx-dsp_2.1.5.bb | 13 ----- .../imx-parser/imx-parser_4.8.1.bb | 13 ----- .../imx-parser/imx-parser_4.8.2.bb | 13 +++++ .../nxp-afe/nxp-afe-voiceseeker_git.bb | 50 +++++++++++++++++++ .../recipes-multimedia/nxp-afe/nxp-afe_git.bb | 5 +- 16 files changed, 119 insertions(+), 89 deletions(-) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/{gstreamer1.0-plugins-bad_1.22.0.imx.bb => gstreamer1.0-plugins-bad_1.22.5.imx.bb} (96%) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/{gstreamer1.0-plugins-base_1.22.0.imx.bb => gstreamer1.0-plugins-base_1.22.5.imx.bb} (92%) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/{gstreamer1.0-plugins-good_1.22.0.imx.bb => gstreamer1.0-plugins-good_1.22.5.imx.bb} (92%) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/{gstreamer1.0-plugins-ugly_1.22.0.bb => gstreamer1.0-plugins-ugly_1.22.6.bb} (64%) rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/{gstreamer1.0_1.22.0.imx.bb => gstreamer1.0_1.22.5.imx.bb} (93%) delete mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.1.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.2.bb delete mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.1.5.bb delete mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp_2.1.5.bb delete mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.1.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.2.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe-voiceseeker_git.bb diff --git a/meta-digi-arm/conf/machine/include/ccimx93.inc b/meta-digi-arm/conf/machine/include/ccimx93.inc index 124559061..60193819f 100644 --- a/meta-digi-arm/conf/machine/include/ccimx93.inc +++ b/meta-digi-arm/conf/machine/include/ccimx93.inc @@ -77,11 +77,11 @@ ROOTFS_DEV_NAME ?= "/dev/mmcblk0p3" ROOTFS_ENC_DEV = "/dev/mapper/cryptrootfs" ROOTFS_DEV_NAME_FINAL = "${@oe.utils.ifelse(d.getVar('TRUSTFENCE_ENCRYPT_ROOTFS') == '1', '${ROOTFS_ENC_DEV}', '${ROOTFS_DEV_NAME}')}" -PREFERRED_VERSION_gstreamer1.0:ccimx93 ?= "1.22.0.imx" -PREFERRED_VERSION_gstreamer1.0-plugins-bad:ccimx93 ?= "1.22.0.imx" -PREFERRED_VERSION_gstreamer1.0-plugins-base:ccimx93 ?= "1.22.0.imx" -PREFERRED_VERSION_gstreamer1.0-plugins-good:ccimx93 ?= "1.22.0.imx" -PREFERRED_VERSION_gstreamer1.0-plugins-ugly:ccimx93 ?= "1.22.0" +PREFERRED_VERSION_gstreamer1.0:ccimx93 ?= "1.22.5.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-bad:ccimx93 ?= "1.22.5.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-base:ccimx93 ?= "1.22.5.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-good:ccimx93 ?= "1.22.5.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-ugly:ccimx93 ?= "1.22.6" PREFERRED_VERSION_libdrm:ccimx93 ?= "2.4.115.imx" PREFERRED_VERSION_nativesdk-wayland:ccimx93 ?= "1.22.0.imx" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/alsa/imx-alsa-plugins_git.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/alsa/imx-alsa-plugins_git.bbappend index 676539754..d1623a172 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/alsa/imx-alsa-plugins_git.bbappend +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/alsa/imx-alsa-plugins_git.bbappend @@ -1,4 +1,4 @@ -# Copyright 2023 Digi International Inc. +# Copyright 2023,2024 Digi International Inc. -SRCBRANCH:ccimx93 = "MM_04.08.01_2308_L6.1.y" +SRCBRANCH:ccimx93 = "MM_04.08.02_2310_L6.1.y" SRCREV:ccimx93 = "b2ba082e70333f187972ee4e85f63f9d2f608331" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.0.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.5.imx.bb similarity index 96% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.0.imx.bb rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.5.imx.bb index 4548a34a5..d770502ad 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.0.imx.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.5.imx.bb @@ -3,12 +3,12 @@ # recipe. The second section customizes the recipe for i.MX. ########### OE-core copy ################## -# Upstream hash: fb2d28e0315ece6180c87c7047587673024a09f7 +# Upstream hash: 937817e5164f8af8452aec03ae3c45cb23d63df9 require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc require recipes-multimedia/gstreamer/gstreamer1.0-plugins-license.inc -DESCRIPTION = "'Bad' GStreamer plugins and helper libraries " +SUMMARY = "'Bad' GStreamer plugins and helper libraries " HOMEPAGE = "https://gstreamer.freedesktop.org/" BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues" @@ -17,7 +17,7 @@ SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad file://0002-avoid-including-sys-poll.h-directly.patch \ file://0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch \ " -SRC_URI[sha256sum] = "3c9d9300f5f4fb3e3d36009379d1fb6d9ecd79c1a135df742b8a68417dd663a1" +SRC_URI[sha256sum] = "e64e75cdafd7ff2fc7fc34e855b06b1e3ed227cc06fa378d17bbcd76780c338c" S = "${WORKDIR}/gst-plugins-bad-${PV}" @@ -67,7 +67,7 @@ PACKAGECONFIG[libde265] = "-Dlibde265=enabled,-Dlibde265=disabled,libde26 PACKAGECONFIG[libssh2] = "-Dcurl-ssh2=enabled,-Dcurl-ssh2=disabled,libssh2" PACKAGECONFIG[lcms2] = "-Dcolormanagement=enabled,-Dcolormanagement=disabled,lcms" PACKAGECONFIG[modplug] = "-Dmodplug=enabled,-Dmodplug=disabled,libmodplug" -PACKAGECONFIG[msdk] = "-Dmsdk=enabled,-Dmsdk=disabled,intel-mediasdk" +PACKAGECONFIG[msdk] = "-Dmsdk=enabled -Dmfx_api=oneVPL,-Dmsdk=disabled,onevpl-intel-gpu" PACKAGECONFIG[neon] = "-Dneon=enabled,-Dneon=disabled,neon" PACKAGECONFIG[openal] = "-Dopenal=enabled,-Dopenal=disabled,openal-soft" PACKAGECONFIG[opencv] = "-Dopencv=enabled,-Dopencv=disabled,opencv" @@ -188,8 +188,8 @@ SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plug " SRC_URI:prepend = "${GST1.0-PLUGINS-BAD_SRC};branch=${SRCBRANCH} " GST1.0-PLUGINS-BAD_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-bad.git;protocol=https" -SRCBRANCH = "MM_04.08.01_2308_L6.1.y" -SRCREV = "fd7a399c3a9c43b5675bc2497ad8a23540bf720e" +SRCBRANCH = "MM_04.08.02_2310_L6.1.y" +SRCREV = "e4edcda6b110f42eca1f2cc20bc935edf7e66d6d" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.0.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.5.imx.bb similarity index 92% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.0.imx.bb rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.5.imx.bb index 3a7bfa9e4..c4391f3c8 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.0.imx.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.5.imx.bb @@ -3,11 +3,11 @@ # recipe. The second section customizes the recipe for i.MX. ########### OE-core copy ################## -# Upstream hash: fb2d28e0315ece6180c87c7047587673024a09f7 +# Upstream hash: 937817e5164f8af8452aec03ae3c45cb23d63df9 require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc -DESCRIPTION = "'Base' GStreamer plugins and helper libraries" +SUMMARY = "'Base' GStreamer plugins and helper libraries" HOMEPAGE = "https://gstreamer.freedesktop.org/" BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues" LICENSE = "LGPL-2.1-or-later" @@ -18,7 +18,7 @@ SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-ba file://0003-viv-fb-Make-sure-config.h-is-included.patch \ file://0002-ssaparse-enhance-SSA-text-lines-parsing.patch \ " -SRC_URI[sha256sum] = "f53672294f3985d56355c8b1df8f6b49c8c8721106563e19f53be3507ff2229d" +SRC_URI[sha256sum] = "edd4338b45c26a9af28c0d35aab964a024c3884ba6f520d8428df04212c8c93a" S = "${WORKDIR}/gst-plugins-base-${PV}" @@ -28,7 +28,8 @@ inherit gobject-introspection # opengl packageconfig factored out to make it easy for distros # and BSP layers to choose OpenGL APIs/platforms/window systems -PACKAGECONFIG_GL ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl', '', d)}" +PACKAGECONFIG_X11 = "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'opengl glx', '', d)}" +PACKAGECONFIG_GL ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl ${PACKAGECONFIG_X11}', '', d)}" PACKAGECONFIG ??= " \ ${GSTREAMER_ORC} \ @@ -39,7 +40,7 @@ PACKAGECONFIG ??= " \ " OPENGL_APIS = 'opengl gles2' -OPENGL_PLATFORMS = 'egl' +OPENGL_PLATFORMS = 'egl glx' X11DEPENDS = "virtual/libx11 libsm libxrender libxv" X11ENABLEOPTS = "-Dx11=enabled -Dxvideo=enabled -Dxshm=enabled" @@ -68,6 +69,7 @@ PACKAGECONFIG[gles2] = ",,virtual/libgles2" # OpenGL platform packageconfigs PACKAGECONFIG[egl] = ",,virtual/egl" +PACKAGECONFIG[glx] = ",,virtual/libgl" # OpenGL window systems (except for X11) PACKAGECONFIG[gbm] = ",,virtual/libgbm libgudev libdrm" @@ -116,8 +118,8 @@ SRC_URI:remove = " \ SRC_URI:prepend = "${GST1.0-PLUGINS-BASE_SRC};branch=${SRCBRANCH} " GST1.0-PLUGINS-BASE_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-base.git;protocol=https" -SRCBRANCH = "MM_04.08.01_2308_L6.1.y" -SRCREV = "f7c109c3b09645266ad41139253f32cf70a7d692" +SRCBRANCH = "MM_04.08.02_2310_L6.1.y" +SRCREV = "53a12f4e39773ca5b052eccbf0476d4ebd3ac08e" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.0.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.5.imx.bb similarity index 92% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.0.imx.bb rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.5.imx.bb index 7e017c9fa..4fdf4408d 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.0.imx.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.5.imx.bb @@ -3,19 +3,19 @@ # recipe. The second section customizes the recipe for i.MX. ########### OE-core copy ################## -# Upstream hash: fb2d28e0315ece6180c87c7047587673024a09f7 +# Upstream hash: 937817e5164f8af8452aec03ae3c45cb23d63df9 require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc -DESCRIPTION = "'Good' GStreamer plugins" +SUMMARY = "'Good' GStreamer plugins" HOMEPAGE = "https://gstreamer.freedesktop.org/" BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues" SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${PV}.tar.xz \ file://0001-qt-include-ext-qt-gstqtgl.h-instead-of-gst-gl-gstglf.patch \ - " + file://0001-v4l2-Define-ioctl_req_t-for-posix-linux-case.patch" -SRC_URI[sha256sum] = "582e617271e7f314d1a2211e3e3856ae2e4303c8c0d6114e9c4a5ea5719294b0" +SRC_URI[sha256sum] = "b67b31313a54c6929b82969d41d3cfdf2f58db573fb5f491e6bba5d84aea0778" S = "${WORKDIR}/gst-plugins-good-${PV}" @@ -104,12 +104,13 @@ DEPENDS_V4L2 = "${@bb.utils.contains_any('DISTRO_FEATURES', 'wayland x11', '', ' SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${PV}.tar.xz \ file://0001-qt-include-ext-qt-gstqtgl.h-instead-of-gst-gl-gstglf.patch \ + file://0001-v4l2-Define-ioctl_req_t-for-posix-linux-case.patch \ " SRC_URI:prepend = "${GST1.0-PLUGINS-GOOD_SRC};branch=${SRCBRANCH} " GST1.0-PLUGINS-GOOD_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-good.git;protocol=https" -SRCBRANCH = "MM_04.08.01_2308_L6.1.y" -SRCREV = "ca3ef27dd4020393bfda546a25a3fa28314276e1" +SRCBRANCH = "MM_04.08.02_2310_L6.1.y" +SRCREV = "a4631334ad32abc513bde8f73491ef345f865a48" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.0.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.6.bb similarity index 64% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.0.bb rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.6.bb index 17af53d30..b457a05f7 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.0.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.6.bb @@ -1,4 +1,4 @@ -# Copyright 2023 Digi International Inc. +# Copyright 2024 Digi International Inc. # # Reuse poky's gstreamer1.0-plugins-ugly_1.20.7.bb @@ -7,6 +7,6 @@ require recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.20.7.bb LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" -SRC_URI[sha256sum] = "a644dc981afa2d8d3a913f763ab9523c0620ee4e65a7ec73c7721c29da3c5a0c" +SRC_URI[sha256sum] = "3e31454c98cb2f7f6d2d355eceb933a892fa0f1dc09bc36c9abc930d8e29ca48" COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.0.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.5.imx.bb similarity index 93% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.0.imx.bb rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.5.imx.bb index 90d0ed55d..a4a0213e6 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.0.imx.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.5.imx.bb @@ -3,7 +3,7 @@ # recipe. The second section customizes the recipe for i.MX. ########### OE-core copy ################## -# Upstream hash: fb2d28e0315ece6180c87c7047587673024a09f7 +# Upstream hash: 937817e5164f8af8452aec03ae3c45cb23d63df9 SUMMARY = "GStreamer 1.0 multimedia framework" DESCRIPTION = "GStreamer is a multimedia framework for encoding and decoding video and sound. \ @@ -29,7 +29,7 @@ SRC_URI = "https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.x file://0003-tests-use-a-dictionaries-for-environment.patch;striplevel=3 \ file://0004-tests-add-helper-script-to-run-the-installed_tests.patch;striplevel=3 \ " -SRC_URI[sha256sum] = "78d21b5469ac93edafc6d8ceb63bc82f6cbbee94d2f866cca6b9252157ee0a09" +SRC_URI[sha256sum] = "4408d7930f381809e85917acc19712f173261ba85bdf20c5567b2a21b1193b61" PACKAGECONFIG ??= "${@bb.utils.contains('PTEST_ENABLED', '1', 'tests', '', d)} \ check \ @@ -74,6 +74,8 @@ FILES:${PN}-dev += "${libdir}/gstreamer-1.0/*.a ${libdir}/gstreamer-1.0/include" FILES:${PN}-bash-completion += "${datadir}/bash-completion/completions/ ${datadir}/bash-completion/helpers/gst*" FILES:${PN}-dbg += "${datadir}/gdb ${datadir}/gstreamer-1.0/gdb" +RDEPENDS:${PN}-ptest:append:libc-glibc = " glibc-gconv-iso8859-5" + CVE_PRODUCT = "gstreamer" PTEST_BUILD_HOST_FILES = "" @@ -98,8 +100,8 @@ SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV " SRC_URI:prepend = "${GST1.0_SRC};branch=${SRCBRANCH} " GST1.0_SRC ?= "gitsm://github.com/nxp-imx/gstreamer.git;protocol=https" -SRCBRANCH = "MM_04.08.01_2308_L6.1.y" -SRCREV = "95112902507718085231a933cdfe54e3997d1b28" +SRCBRANCH = "MM_04.08.02_2310_L6.1.y" +SRCREV = "e51e577a730191911b7050216814bede1b9545ae" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend index 01718e916..00076e274 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend @@ -8,6 +8,6 @@ SRC_URI:append:ccimx6ul = " \ " LIC_FILES_CHKSUM:ccimx93 = "file://LICENSE.txt;md5=fbc093901857fcd118f065f900982c24" -PV:ccimx93 = "4.8.1+git${SRCPV}" -SRCBRANCH:ccimx93 = "MM_04.08.01_2308_L6.1.y" -SRCREV:ccimx93 = "903c03e8611a107508b1f60e4736df208e72247d" +PV:ccimx93 = "4.8.2+git${SRCPV}" +SRCBRANCH:ccimx93 = "MM_04.08.02_2310_L6.1.y" +SRCREV:ccimx93 = "a72df52acfec5f849ec93906e33cb50da01b0b2e" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.1.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.1.bb deleted file mode 100644 index 88544b5a9..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.1.bb +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2023 Digi International Inc. - -# -# Reuse meta-freescale's imx-codec_4.7.2.bb -# -require recipes-multimedia/imx-codec/imx-codec_4.7.2.bb - -LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" - -SRC_URI[md5sum] = "a47f6407459ab4889e1bd9651b9dd40b" -SRC_URI[sha256sum] = "0d0668dadbd69c40c1d0e29cbf4082df008a7cb7ec7e5cfe7d8f228395bdaf58" - -COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.2.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.2.bb new file mode 100644 index 000000000..5f821d078 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.2.bb @@ -0,0 +1,13 @@ +# Copyright 2024 Digi International Inc. + +# +# Reuse meta-freescale's imx-codec_4.7.2.bb +# +require recipes-multimedia/imx-codec/imx-codec_4.7.2.bb + +LIC_FILES_CHKSUM = "file://COPYING;md5=2827219e81f28aba7c6a569f7c437fa7" + +SRC_URI[md5sum] = "1977bab8d89972f08d9eee0122a64603" +SRC_URI[sha256sum] = "b0744a91c265202a79a019c72f17cae01fd5b63a3ba451592b6c8349d95719e0" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.1.5.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.1.5.bb deleted file mode 100644 index 453ed5db9..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.1.5.bb +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2023 Digi International Inc. - -# -# Reuse meta-freescale's imx-dsp-codec-ext_2.0.2.bb -# -require recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.0.2.bb - -LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" - -SRC_URI[md5sum] = "4619cebbad2f312b950a9ad2b2e30e24" -SRC_URI[sha256sum] = "89ac92b348aa70c81dcbf6a9ee4bc99bec56a491a89f5ba9854eab77e5fd4298" - -COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp_2.1.5.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp_2.1.5.bb deleted file mode 100644 index cc3159c56..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp_2.1.5.bb +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2023 Digi International Inc. - -# -# Reuse meta-freescale's imx-dsp_2.0.2.bb -# -require recipes-multimedia/imx-dsp/imx-dsp_2.0.2.bb - -LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" - -SRC_URI[md5sum] = "2b2581a4b24735f4e449a161a334e04d" -SRC_URI[sha256sum] = "11f4e89c0d3c61ac591aa3e00e345d7cc8d0d2627a915253f920cdcf4492a7d5" - -COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.1.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.1.bb deleted file mode 100644 index f308ece19..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.1.bb +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2023 Digi International Inc. - -# -# Reuse meta-freescale's imx-parser_4.7.2.bb -# -require recipes-multimedia/imx-parser/imx-parser_4.7.2.bb - -LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" - -SRC_URI[md5sum] = "c7a8aae8114d0756ed858000b78e9d8e" -SRC_URI[sha256sum] = "73b8ce76507f25d72192862a939405625086a6631fba6f58e4e6bef2614fd202" - -COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.2.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.2.bb new file mode 100644 index 000000000..ae755bcb1 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.2.bb @@ -0,0 +1,13 @@ +# Copyright 2024 Digi International Inc. + +# +# Reuse meta-freescale's imx-parser_4.7.2.bb +# +require recipes-multimedia/imx-parser/imx-parser_4.7.2.bb + +LIC_FILES_CHKSUM = "file://COPYING;md5=2827219e81f28aba7c6a569f7c437fa7" + +SRC_URI[md5sum] = "2e862fce70bc82649057ed552473d982" +SRC_URI[sha256sum] = "20f326821ced5d6855f81794b66ec1f0c334e9ec7a9be1368a9b4dc501b666c6" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe-voiceseeker_git.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe-voiceseeker_git.bb new file mode 100644 index 000000000..54fd3f29a --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe-voiceseeker_git.bb @@ -0,0 +1,50 @@ +# Copyright 2021-2023 NXP + +DESCRIPTION = "NXP RetuneDSP Voice Seeker Libraries" +SECTION = "multimedia" +LICENSE = "Proprietary" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=db4762b09b6bda63da103963e6e081de" + +inherit autotools pkgconfig + +DEPENDS += "alsa-lib nxp-afe" + +SRCBRANCH = "MM_04.08.02_2310_L6.1.y" +PV = "2.0+${SRCPV}" + +NXPAFE_VOICESEEKER_SRC ?= "git://github.com/nxp-imx/imx-voiceui.git;protocol=https" +SRC_URI = "${NXPAFE_VOICESEEKER_SRC};branch=${SRCBRANCH}" + +SRCREV = "5eac64dc0f93c755941770c46d5e315aec523b3d" +S = "${WORKDIR}/git" + +EXTRA_CONF = "--enable-armv8 --bindir=/unit_tests/ --libdir=${libdir}" + +EXTRA_OEMAKE:mx8-nxp-bsp = "BUILD_ARCH=CortexA53" +EXTRA_OEMAKE:mx93-nxp-bsp = "BUILD_ARCH=CortexA55" + +do_compile () { + echo "====Enter into ${WORKDIR}/git====" + cd ${WORKDIR}/git + echo "====make all===" + oe_runmake all +} + +do_install() { + install -d ${D}${libdir}/nxp-afe + install -d ${D}/unit_tests/nxp-afe + install -m 0644 ${WORKDIR}/git/release/*.so.2.0 ${D}${libdir}/nxp-afe/ + ln -sf -r ${D}${libdir}/nxp-afe/libvoiceseekerlight.so.2.0 ${D}${libdir}/nxp-afe/libvoiceseekerlight.so + install -m 0755 ${WORKDIR}/git/release/voice_ui_app ${D}/unit_tests/nxp-afe + install -m 0644 ${WORKDIR}/git/release/*.bin ${D}/unit_tests/nxp-afe + install -m 0644 ${WORKDIR}/git/release/Config.ini ${D}/unit_tests/nxp-afe +} + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +FILES:${PN} += "${libdir}/nxp-afe/* \ + /unit_tests/* \ +" +INSANE_SKIP:${PN} += "dev-so" + +COMPATIBLE_MACHINE = "(mx8-nxp-bsp|mx9-nxp-bsp)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe_git.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe_git.bb index 5125f8465..d8dc25472 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe_git.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe_git.bb @@ -6,13 +6,13 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=7bdef19938f3503cfc4c586461f99012" PV = "1.0+git${SRCPV}" -SRCBRANCH = "MM_04.06.03_2110_L5.10.y" +SRCBRANCH = "MM_04.08.02_2310_L6.1.y" NXPAFE_SRC ?= "git://github.com/nxp-imx/nxp-afe.git;protocol=https" SRC_URI = " \ ${NXPAFE_SRC};branch=${SRCBRANCH} \ " -SRCREV = "7d3295d250fe34325123cc9df94902a083308a46" +SRCREV = "77343e302fb079e3d50f6c6d0eef565c09256e56" S = "${WORKDIR}/git" @@ -33,6 +33,7 @@ do_install() { install -m 0755 ${WORKDIR}/deploy_afe/afe ${D}/unit_tests/nxp-afe install -m 0644 ${WORKDIR}/deploy_afe/asound.conf* ${D}/unit_tests/nxp-afe install -m 0644 ${WORKDIR}/deploy_afe/TODO.md ${D}/unit_tests/nxp-afe + install -m 0755 ${WORKDIR}/deploy_afe/UAC_VCOM_composite.sh ${D}/unit_tests/nxp-afe } FILES:${PN} += "/unit_tests" From 2ecaf1ca55a18d79c9714c2336790b8acc041bbe Mon Sep 17 00:00:00 2001 From: David Escalona Date: Thu, 11 Jan 2024 17:13:30 +0100 Subject: [PATCH 118/118] swupdate: add support to update U-Boot in the redundant partition The support to update U-Boot in the redundant partition must be enabled in the project configuration file by setting the variable "SWUPDATE_UBOOTIMG_REDUNDANT" to "true": SWUPDATE_UBOOTIMG_REDUNDANT = "true" This feature is only available for the newer platforms: ccmp13, ccmp15 and ccimx93. Trying to enable it in older platforms will display a warning and fallback to non-redundant update. Signed-off-by: David Escalona --- meta-digi-arm/conf/machine/include/digi-defaults.inc | 1 + meta-digi-dey/classes/dey-swupdate-common.bbclass | 12 ++++++++++++ .../swu-images/files/script_template_uboot | 2 +- .../swu-images/files/swupdate_uboot_mmc.sh | 6 ++++++ .../swu-images/files/swupdate_uboot_nand.sh | 10 +++++++++- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/conf/machine/include/digi-defaults.inc b/meta-digi-arm/conf/machine/include/digi-defaults.inc index 72d2068a9..1aa4cc4e8 100644 --- a/meta-digi-arm/conf/machine/include/digi-defaults.inc +++ b/meta-digi-arm/conf/machine/include/digi-defaults.inc @@ -89,6 +89,7 @@ BOOT_SCRIPTS += "boot.scr:boot.scr" # This can be used to enable U-Boot update through swupdate SWUPDATE_UBOOTIMG ?= "false" +SWUPDATE_UBOOTIMG_REDUNDANT ?= "false" # ConnectCore Cloud Services packages to install CCCS_PKGS ?= "cccs-gs-demo dey-examples-cccs" diff --git a/meta-digi-dey/classes/dey-swupdate-common.bbclass b/meta-digi-dey/classes/dey-swupdate-common.bbclass index aa707fc55..bad51a542 100644 --- a/meta-digi-dey/classes/dey-swupdate-common.bbclass +++ b/meta-digi-dey/classes/dey-swupdate-common.bbclass @@ -124,6 +124,18 @@ def get_swupdate_uboot_enc(d): SWUPDATE_UBOOT_ENC ?= "${@get_swupdate_uboot_enc(d)}" +# Retrieve the redundant U-Boot value. +def get_uboot_redundant(d): + if d.getVar("SWUPDATE_UBOOTIMG") == "true" and d.getVar("SWUPDATE_UBOOTIMG_REDUNDANT") == "true": + if any(d.getVar("MACHINE").startswith(platform) for platform in ("ccimx6", "ccimx8")): + bb.warn("Target does not support updating redundant U-Boot. Continuing with single SWU U-Boot update.") + return "single" + return "redundant" + + return "single" + +SWUPDATE_UBOOT_REDUNDANT = "${@get_uboot_redundant(d)}" + ####################################### ########## SWU Update Script ########## ####################################### diff --git a/meta-digi-dey/recipes-digi/swu-images/files/script_template_uboot b/meta-digi-dey/recipes-digi/swu-images/files/script_template_uboot index 059bb2783..061b3e493 100644 --- a/meta-digi-dey/recipes-digi/swu-images/files/script_template_uboot +++ b/meta-digi-dey/recipes-digi/swu-images/files/script_template_uboot @@ -1,6 +1,6 @@ { filename = "@@SWUPDATE_UBOOT_SCRIPT_NAME@@"; type = "preinstall"; - data = "@@SWUPDATE_UBOOT_NAME@@ @@SWUPDATE_UBOOT_ENC@@ @@SWUPDATE_UBOOT_OFFSET@@ @@SWUPDATE_UBOOT_NAME_TFA@@"; + data = "@@SWUPDATE_UBOOT_NAME@@ @@SWUPDATE_UBOOT_ENC@@ @@SWUPDATE_UBOOT_OFFSET@@ @@SWUPDATE_UBOOT_REDUNDANT@@ @@SWUPDATE_UBOOT_NAME_TFA@@"; sha256 = "$swupdate_get_sha256(@@SWUPDATE_UBOOT_SCRIPT_NAME@@)"; } diff --git a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_mmc.sh b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_mmc.sh index fa0d26520..fa76b176a 100755 --- a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_mmc.sh +++ b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_mmc.sh @@ -16,8 +16,10 @@ UBOOT_NAME="$1" UBOOT_ENC="$2" UBOOT_SEEK_KB="$3" +UBOOT_REDUNDANT="$4" UBOOT_FILE="/tmp/${UBOOT_NAME}" UBOOT_BLOCK_MAIN="mmcblk0boot0" +UBOOT_BLOCK_REDUNDANT="mmcblk0boot1" UBOOT_MMC_DEV_MAIN="/dev/${UBOOT_BLOCK_MAIN}" UBOOT_MMC_DUMP="/tmp/u-boot-dump.hex" UBOOT_ENCRYPTED_DEK="/tmp/u-boot-encrypted-with-dek.imx" @@ -258,6 +260,10 @@ if [ "${UBOOT_ENC}" = "enc" ]; then fi # Write U-Boot write_uboot_emmc ${UBOOT_BLOCK_MAIN} +# Check if redundant U-Boot update is requested. +if [ "${UBOOT_REDUNDANT}" = "redundant" ]; then + write_uboot_emmc ${UBOOT_BLOCK_REDUNDANT} +fi # Clean intermediate artifacts. clean_artifacts diff --git a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh index d7884570f..c94d29cc4 100755 --- a/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh +++ b/meta-digi-dey/recipes-digi/swu-images/files/swupdate_uboot_nand.sh @@ -16,7 +16,8 @@ UBOOT_NAME="$1" UBOOT_ENC="$2" UBOOT_SEEK_KB="$3" -UBOOT_TFA_NAME="$4" +UBOOT_REDUNDANT="$4" +UBOOT_TFA_NAME="$5" UBOOT_TFA_FILE="/tmp/${UBOOT_TFA_NAME}" UBOOT_FILE="/tmp/${UBOOT_NAME}" UBOOT_NAND_DUMP="/tmp/u-boot-dump.hex" @@ -148,6 +149,13 @@ if expr "${PLATFORM}" : "ccmp1.*" >/dev/null; then write_file_to_nand "/dev/mtd$(get_mtd_number_from_partition fsbl1)" "${UBOOT_TFA_FILE}" # Install U-Boot FIP file in fip-a partition. write_file_to_nand "/dev/mtd$(get_mtd_number_from_partition fip-a)" "${UBOOT_FILE}" + # Check if redundant U-Boot update is requested. + if [ "${UBOOT_REDUNDANT}" = "redundant" ]; then + # Install TFA file in fsbl2 partition (redundant). + write_file_to_nand "/dev/mtd$(get_mtd_number_from_partition fsbl2)" "${UBOOT_TFA_FILE}" + # Install U-Boot FIP file in fip-b partition (redundant). + write_file_to_nand "/dev/mtd$(get_mtd_number_from_partition fip-b)" "${UBOOT_FILE}" + fi else # Mount debug file system to remove some kobs-ng warnings. if ! grep -qs debugfs /proc/mounts; then

~?95Sw@^UUtX166_yUTJ9Il|%F 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%0AZ;UKE&QyEF}x=75g&RW$cc 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 Date: Tue, 10 Oct 2023 09:43:04 +0200 Subject: [PATCH 028/118] boot scripts: print boot attempts only when bootcount mechanism active Improve boot attempts message showing not only the current boot attempt but also the limit: (boot attempt 1/3) Print the message only when the bootcount mechanism is active, i.e. when the bootlimit is defined (not zero), and when bootcount is > 0. Signed-off-by: Hector Palacios https://onedigi.atlassian.net/browse/DUB-1056 --- .../u-boot/u-boot-dey/ccimx6qpsbc/boot.txt | 14 +++++++++++--- .../u-boot/u-boot-dey/ccimx6sbc/boot.txt | 14 +++++++++++--- .../u-boot/u-boot-dey/ccimx6ulsbc/boot.txt | 11 ++++++++--- .../u-boot/u-boot-dey/ccimx6ulstarter/boot.txt | 11 ++++++++--- .../u-boot/u-boot-dey/ccimx8mm-dvk/boot.txt | 11 ++++++++--- .../u-boot/u-boot-dey/ccimx8mn-dvk/boot.txt | 11 ++++++++--- .../u-boot/u-boot-dey/ccimx8x-sbc-express/boot.txt | 11 ++++++++--- .../u-boot/u-boot-dey/ccimx8x-sbc-pro/boot.txt | 11 ++++++++--- .../u-boot/u-boot-dey/ccimx93-dvk/boot.txt | 11 ++++++++--- .../u-boot/u-boot-dey/ccmp13-dvk/boot.txt | 11 ++++++++--- .../u-boot/u-boot-dey/ccmp15-dvk/boot.txt | 11 ++++++++--- 11 files changed, 94 insertions(+), 33 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/boot.txt index 660614a7e..cef688b71 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/boot.txt @@ -7,17 +7,22 @@ # and save them, while the rest of the script changes variables only temporarily # without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot update verification if test "${dualboot}" = "yes"; then if test "${upgrade_available}" = "1"; then - echo "Update detected; Booting new system in ${active_system} (try ${bootcount})" + echo "Update detected; Booting new system in ${active_system} ${bootattempt}" else if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A" part number mmc ${mmcbootdev} linux_a tmp_mmcpart part number mmc ${mmcbootdev} rootfs_a tmp_rootfs_index else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B" part number mmc ${mmcbootdev} linux_b tmp_mmcpart part number mmc ${mmcbootdev} rootfs_b tmp_rootfs_index fi @@ -50,6 +55,9 @@ else # We are booting from the SD card. setenv mmcroot /dev/mmcblk${mmcbootdev}p2 fi + if test "${upgrade_available}" = "1"; then + echo "Update detected; Booting new system ${bootattempt}" + fi fi diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/boot.txt index 46cff15a2..4248d9327 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/boot.txt @@ -7,17 +7,22 @@ # and save them, while the rest of the script changes variables only temporarily # without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot update verification if test "${dualboot}" = "yes"; then if test "${upgrade_available}" = "1"; then - echo "Update detected; Booting new system in ${active_system} (try ${bootcount})" + echo "Update detected; Booting new system in ${active_system} ${bootattempt}" else if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A" part number mmc ${mmcbootdev} linux_a tmp_mmcpart part number mmc ${mmcbootdev} rootfs_a tmp_rootfs_index else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B" part number mmc ${mmcbootdev} linux_b tmp_mmcpart part number mmc ${mmcbootdev} rootfs_b tmp_rootfs_index fi @@ -50,6 +55,9 @@ else # We are booting from the SD card. setenv mmcroot /dev/mmcblk${mmcbootdev}p2 fi + if test "${upgrade_available}" = "1"; then + echo "Update detected; Booting new system ${bootattempt}" + fi fi diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ulsbc/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ulsbc/boot.txt index 65be2bf99..3947f0276 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ulsbc/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ulsbc/boot.txt @@ -6,14 +6,19 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot verification if test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" setenv tmp_mtdrootfspart ${rootfsvol_a} setenv tmp_rootfsvol ${rootfsvol_a} else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" setenv tmp_mtdrootfspart ${rootfsvol_b} setenv tmp_rootfsvol ${rootfsvol_b} fi @@ -34,7 +39,7 @@ if test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" if test "${mtdbootpart}" = "recovery"; then setenv boot_initrd true setenv initrd_file uramdisk-recovery.img diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ulstarter/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ulstarter/boot.txt index 6a9926838..ab78eba4c 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ulstarter/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ulstarter/boot.txt @@ -6,14 +6,19 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot verification if test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" setenv tmp_mtdrootfspart ${rootfsvol_a} setenv tmp_rootfsvol ${rootfsvol_a} else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" setenv tmp_mtdrootfspart ${rootfsvol_b} setenv tmp_rootfsvol ${rootfsvol_b} fi @@ -34,7 +39,7 @@ if test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" if test "${mtdbootpart}" = "recovery"; then setenv boot_initrd true setenv initrd_file uramdisk-recovery.img diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8mm-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8mm-dvk/boot.txt index c42e51422..da6947ac1 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8mm-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8mm-dvk/boot.txt @@ -6,14 +6,19 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot verification if test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" part number mmc ${mmcbootdev} linux_a tmp_mmcpart part number mmc ${mmcbootdev} rootfs_a tmp_rootfs_index else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" part number mmc ${mmcbootdev} linux_b tmp_mmcpart part number mmc ${mmcbootdev} rootfs_b tmp_rootfs_index fi @@ -31,7 +36,7 @@ if test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" # Get the UUID of the configured boot partition. part uuid mmc ${mmcbootdev}:${mmcpart} bootpart # Check the boot source. diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8mn-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8mn-dvk/boot.txt index 62fbaf495..6d155ca7f 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8mn-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8mn-dvk/boot.txt @@ -6,14 +6,19 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot verification if test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" part number mmc ${mmcbootdev} linux_a tmp_mmcpart part number mmc ${mmcbootdev} rootfs_a tmp_rootfs_index else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" part number mmc ${mmcbootdev} linux_b tmp_mmcpart part number mmc ${mmcbootdev} rootfs_b tmp_rootfs_index fi @@ -31,7 +36,7 @@ if test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" # Get the UUID of the configured boot partition. part uuid mmc ${mmcbootdev}:${mmcpart} bootpart # Check the boot source. diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x-sbc-express/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x-sbc-express/boot.txt index ba60afc40..f2fa935f9 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x-sbc-express/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x-sbc-express/boot.txt @@ -6,14 +6,19 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot verification if test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" part number mmc ${mmcbootdev} linux_a tmp_mmcpart part number mmc ${mmcbootdev} rootfs_a tmp_rootfs_index else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" part number mmc ${mmcbootdev} linux_b tmp_mmcpart part number mmc ${mmcbootdev} rootfs_b tmp_rootfs_index fi @@ -31,7 +36,7 @@ if test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" # Get the UUID of the configured boot partition. part uuid mmc ${mmcbootdev}:${mmcpart} bootpart # Check the boot source. diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x-sbc-pro/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x-sbc-pro/boot.txt index 4ee3d440f..c39102e2b 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x-sbc-pro/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x-sbc-pro/boot.txt @@ -6,14 +6,19 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot verification if test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" part number mmc ${mmcbootdev} linux_a tmp_mmcpart part number mmc ${mmcbootdev} rootfs_a tmp_rootfs_index else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" part number mmc ${mmcbootdev} linux_b tmp_mmcpart part number mmc ${mmcbootdev} rootfs_b tmp_rootfs_index fi @@ -31,7 +36,7 @@ if test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" # Get the UUID of the configured boot partition. part uuid mmc ${mmcbootdev}:${mmcpart} bootpart # Check the boot source. diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt index 9b169085c..4fd2fae26 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt @@ -6,17 +6,22 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Pre step: check if we boot from uSD. if test "${mmcbootdev}" = "1"; then # We are booting from the SD card. setenv mmcroot /dev/mmcblk${mmcbootdev}p2 elif test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" part number mmc ${mmcbootdev} linux_a tmp_mmcpart part number mmc ${mmcbootdev} rootfs_a tmp_rootfs_index else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" part number mmc ${mmcbootdev} linux_b tmp_mmcpart part number mmc ${mmcbootdev} rootfs_b tmp_rootfs_index fi @@ -34,7 +39,7 @@ elif test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" # Get the UUID of the configured boot partition. part uuid mmc ${mmcbootdev}:${mmcpart} bootpart # Check the boot source. diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt index f960f2118..f73432685 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt @@ -6,13 +6,18 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot verification if test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" setenv tmp_rootfsvol ${rootfsvol_a} else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" setenv tmp_rootfsvol ${rootfsvol_b} fi if test "${mtdbootpart}" != "${active_system}"; then @@ -28,7 +33,7 @@ if test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" # Check the boot source. if test "${mtdbootpart}" = "linux"; then # We are booting from the NAND using 'linux'. diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt index 05216ff2d..f881120c3 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt @@ -6,13 +6,18 @@ # requires the script to change some variables and save them, while the rest # of the script changes variables only temporarily without saving them. +# Build boot attempt message string +if test "${bootlimit}" -gt 0 && test "${bootcount}" -gt 0; then + bootattempt="(boot attempt ${bootcount}/${bootlimit})" +fi + # Dual boot verification if test "${dualboot}" = "yes"; then if test "${active_system}" = "linux_a"; then - echo "Booting from system A (try ${bootcount})" + echo "Booting from system A ${bootattempt}" setenv tmp_rootfsvol ${rootfsvol_a} else - echo "Booting from system B (try ${bootcount})" + echo "Booting from system B ${bootattempt}" setenv tmp_rootfsvol ${rootfsvol_b} fi if test "${mtdbootpart}" != "${active_system}"; then @@ -28,7 +33,7 @@ if test "${dualboot}" = "yes"; then env save fi else - echo "Booting system (try ${bootcount})" + echo "Booting system ${bootattempt}" # Check the boot source. if test "${mtdbootpart}" = "linux"; then # We are booting from the NAND using 'linux'. From 019deb63139d079b35fd3769d5061c6089461294 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 11 Oct 2023 12:41:20 +0200 Subject: [PATCH 029/118] tf-a-stm32mp: create symlinks on deploydir to TF-A and FIP binaries These binaries are installed in subdirectories by default. The uuu installer expects to find all binaries on the same folder where the script is. By creating symlinks, the uuu installer can find all the binaries it needs directly on the deploy folder. NOTE: variables in 'for' clauses are intentionally without quotes to skip whitespaces in them. Signed-off-by: Hector Palacios --- .../tf-a-stm32mp_%.bbappend | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_%.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_%.bbappend index 31a8c57c4..4aad85436 100644 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_%.bbappend +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_%.bbappend @@ -52,6 +52,39 @@ python set_fip_sign_key() { d.setVar('FIP_SIGN_KEY_PASS', p[i]) } +do_deploy:append() { + unset i + for config in ${TF_A_CONFIG}; do + i=$(expr $i + 1) + # Initialize devicetree list and tf-a basename + dt_config=$(echo ${TF_A_DEVICETREE} | cut -d',' -f${i}) + tfa_basename=$(echo ${TF_A_BINARIES} | cut -d',' -f${i}) + for dt in ${dt_config}; do + TF_A_FILENAME="${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" + if [ -f "${DEPLOYDIR}/arm-trusted-firmware/${TF_A_FILENAME}" ]; then + cd "${DEPLOYDIR}" + # symlink TF-A + ln -s "arm-trusted-firmware/${TF_A_FILENAME}" "${DEPLOYDIR}/" + fi + done + done + + unset i + for config in ${FIP_CONFIG}; do + i="$(expr ${i} + 1)" + dt_config="$(echo ${FIP_DEVICETREE} | cut -d',' -f${i})" + for dt in ${dt_config}; do + FIP_FILENAME="${FIP_BASENAME}-${dt}-${config}.${FIP_SUFFIX}" + echo "${FIP_FILENAME}" + if [ -f "${DEPLOYDIR}/fip/${FIP_FILENAME}" ]; then + cd "${DEPLOYDIR}" + # symlink FIP + ln -s "fip/${FIP_FILENAME}" "${DEPLOYDIR}/" + fi + done + done +} + # Sign TF-A image do_deploy[postfuncs] += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'tfa_sign', '', d)}" tfa_sign() { From fb349b10f7356831f73fd77d2ec2523c53a1bddd Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Tue, 10 Oct 2023 09:45:21 +0200 Subject: [PATCH 030/118] install_fw: [cosmetic] alphabetize script options Signed-off-by: Hector Palacios --- .../u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh | 2 +- .../u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh | 2 +- .../u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh | 2 +- .../u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh | 2 +- .../u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh | 2 +- .../u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh | 2 +- .../recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh index aa53810e1..67116969b 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh @@ -32,6 +32,7 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -d Install firmware on dualboot partitions (system A and system B)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -39,7 +40,6 @@ show_usage() echo " -n No wait. Skips 10 seconds delay to stop script." echo " -u U-Boot filename." echo " Auto-determined by variant if not provided." - echo " -d Install firmware on dualboot partitions (system A and system B)." exit 2 } diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh index f5d66d49b..d215a6b5f 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh @@ -32,6 +32,7 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -d Install firmware on dualboot partitions (system A and system B)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -39,7 +40,6 @@ show_usage() echo " -n No wait. Skips 10 seconds delay to stop script." echo " -u U-Boot filename." echo " Auto-determined by variant if not provided." - echo " -d Install firmware on dualboot partitions (system A and system B)." exit 2 } diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh index 4eeac769d..af1d48880 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh @@ -32,6 +32,7 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -d Install firmware on dualboot partitions (system A and system B)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -39,7 +40,6 @@ show_usage() echo " -n No wait. Skips 10 seconds delay to stop script." echo " -u U-Boot filename." echo " Auto-determined by variant if not provided." - echo " -d Install firmware on dualboot partitions (system A and system B)." exit 2 } diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh index e548c0c21..760268ff6 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh @@ -32,6 +32,7 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -d Install firmware on dualboot partitions (system A and system B)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -39,7 +40,6 @@ show_usage() echo " -n No wait. Skips 10 seconds delay to stop script." echo " -u U-Boot filename." echo " Auto-determined by variant if not provided." - echo " -d Install firmware on dualboot partitions (system A and system B)." exit 2 } diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh index e6ded19d5..a5147e364 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh @@ -32,6 +32,7 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -d Install firmware on dualboot partitions (system A and system B)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -39,7 +40,6 @@ show_usage() echo " -n No wait. Skips 10 seconds delay to stop script." echo " -u U-Boot filename." echo " Auto-determined by variant if not provided." - echo " -d Install firmware on dualboot partitions (system A and system B)." exit 2 } diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh index e548c0c21..760268ff6 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh @@ -32,6 +32,7 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -d Install firmware on dualboot partitions (system A and system B)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -39,7 +40,6 @@ show_usage() echo " -n No wait. Skips 10 seconds delay to stop script." echo " -u U-Boot filename." echo " Auto-determined by variant if not provided." - echo " -d Install firmware on dualboot partitions (system A and system B)." exit 2 } diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh index 43922c07d..1b140d621 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh @@ -40,6 +40,7 @@ show_usage() echo " Options:" echo " -a Arm-trusted-firmware filename." echo " Auto-determined by variant if not provided." + echo " -d Install firmware on dualboot partitions (system A and system B)." echo " -f FIP filename." echo " Auto-determined by variant if not provided." echo " -h Show this help." @@ -47,7 +48,6 @@ show_usage() echo " 'dey-image-webkit', 'core-image-base'..." echo " Defaults to '##DEFAULT_IMAGE_NAME##' if not provided." echo " -n No wait. Skips 10 seconds delay to stop script." - echo " -d Install firmware on dualboot partitions (system A and system B)." exit 2 } From 961acf48dee99b9d5e70689301f977939f4c7d79 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 11 Oct 2023 17:56:35 +0200 Subject: [PATCH 031/118] install_linux_fw: reset bootcount before resetting target During firmware install, the target may be reset several times. We don't want the bootcount to count these as boot attempts. This was done in a791bb446396ef3c4868a1cf01b30a6c2bd2bc40 for the ccmp1 but not for the rest of platforms. Signed-off-by: Hector Palacios --- .../u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt | 2 ++ .../u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt | 2 ++ .../u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh | 4 ++++ .../u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt | 2 ++ .../u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt | 2 ++ .../u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh | 4 ++++ .../u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt | 2 ++ .../u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt | 2 ++ .../u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh | 4 ++++ .../u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt | 2 ++ .../u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt | 2 ++ .../u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh | 4 ++++ .../u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt | 2 ++ .../u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt | 2 ++ .../u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh | 4 ++++ .../u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt | 2 ++ .../u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt | 2 ++ .../u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh | 4 ++++ .../u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh | 3 ++- 19 files changed, 50 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt index 13e499f6a..aaefeff57 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt @@ -260,6 +260,7 @@ setenv bootcmd " setenv boot_recovery yes; setenv recovery_command wipe_update; fi; + setenv bootcount 0; saveenv; echo \"\"; echo \"\"; @@ -273,5 +274,6 @@ setenv bootcmd " reset; " +setenv bootcount 0 saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt index 1cf816465..b752e0aac 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt @@ -263,6 +263,7 @@ setenv bootcmd " setenv boot_recovery yes; setenv recovery_command wipe_update; fi; + setenv bootcount 0; saveenv; echo \"\"; echo \"\"; @@ -276,5 +277,6 @@ setenv bootcmd " reset; " +setenv bootcount 0 saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh index 67116969b..5cf3788bb 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh @@ -240,6 +240,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults +# - Reset the bootcount # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -248,6 +249,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; + setenv bootcount 0 saveenv; echo \"\"; echo \"\"; @@ -315,6 +317,8 @@ if [ "${DUALBOOT}" != true ]; then uuu fb: ucmd setenv boot_recovery yes uuu fb: ucmd setenv recovery_command wipe_update fi +# Reset the bootcount +uuu fb: ucmd setenv bootcount 0 uuu fb: ucmd saveenv # Reset the target diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt index a7d67813b..b4c819221 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt @@ -271,6 +271,7 @@ setenv bootcmd " setenv boot_recovery yes; setenv recovery_command wipe_update; fi; + setenv bootcount 0; saveenv; echo \"\"; echo \"\"; @@ -284,5 +285,6 @@ setenv bootcmd " reset; " +setenv bootcount 0 saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt index 3e93d5fb5..689669278 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt @@ -274,6 +274,7 @@ setenv bootcmd " setenv boot_recovery yes; setenv recovery_command wipe_update; fi; + setenv bootcount 0; saveenv; echo \"\"; echo \"\"; @@ -287,5 +288,6 @@ setenv bootcmd " reset; " +setenv bootcount 0 saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh index d215a6b5f..655604812 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh @@ -258,6 +258,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults +# - Reset the bootcount # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -266,6 +267,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; + setenv bootcount 0 saveenv; echo \"\"; echo \"\"; @@ -333,6 +335,8 @@ if [ "${DUALBOOT}" != true ]; then uuu fb: ucmd setenv boot_recovery yes uuu fb: ucmd setenv recovery_command wipe_update fi +# Reset the bootcount +uuu fb: ucmd setenv bootcount 0 uuu fb: ucmd saveenv # Reset the target diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt index acc2e5fd4..35bceb6df 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt @@ -276,8 +276,10 @@ setenv bootcmd " echo \"\"; echo \"\"; sleep 1; + bootcount reset; reset; " +bootcount reset saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt index bdad2f6da..36fdd73b4 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt @@ -279,8 +279,10 @@ setenv bootcmd " echo \"\"; echo \"\"; sleep 1; + bootcount reset; reset; " +bootcount reset saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh index af1d48880..6ae7ed748 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh @@ -249,6 +249,7 @@ part_update "uboot" "${INSTALL_UBOOT_FILENAME}" 5000 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults +# - Reset the bootcount # - Save the environment # - Update the 'linux' partition # - Update the 'recovery' partition @@ -257,6 +258,7 @@ part_update "uboot" "${INSTALL_UBOOT_FILENAME}" 5000 uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; + bootcount reset; setenv singlemtdsys \${singlemtdsys}; saveenv; echo \"\"; @@ -324,6 +326,8 @@ fi uuu fb: ucmd saveenv +# Reset the bootcount +uuu fb: ucmd bootcount reset # Reset the target uuu fb: acmd reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt index d4824c6ee..418d833c2 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt @@ -248,8 +248,10 @@ setenv bootcmd " echo \"\"; echo \"\"; sleep 1; + bootcount reset; reset; " +bootcount reset saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt index 896eaf1e6..c870409fa 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt @@ -249,8 +249,10 @@ setenv bootcmd " echo \"\"; echo \"\"; sleep 1; + bootcount reset; reset; " +bootcount reset saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh index 760268ff6..a20af2bf3 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh @@ -209,6 +209,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults +# - Reset the bootcount # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -217,6 +218,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; + bootcount reset; saveenv; echo \"\"; echo \"\"; @@ -286,6 +288,8 @@ if [ "${DUALBOOT}" != true ]; then fi uuu fb: ucmd saveenv +# Reset the bootcount +uuu fb: ucmd bootcount reset # Reset the target uuu fb: acmd reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt index 8322ffa99..9c75c13cf 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt @@ -260,8 +260,10 @@ setenv bootcmd " echo \"\"; echo \"\"; sleep 1; + bootcount reset; reset; " +bootcount reset saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt index 46dfbe340..f8b12076a 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt @@ -263,8 +263,10 @@ setenv bootcmd " echo \"\"; echo \"\"; sleep 1; + bootcount reset; reset; " +bootcount reset saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh index a5147e364..6d7ad5a4d 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh @@ -213,6 +213,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults +# - Reset the bootcount # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -221,6 +222,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; + bootcount reset; saveenv; echo \"\"; echo \"\"; @@ -290,6 +292,8 @@ if [ "${DUALBOOT}" != true ]; then fi uuu fb: ucmd saveenv +# Reset the bootcount +uuu fb: ucmd bootcount reset # Reset the target uuu fb: acmd reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt index a5c969145..f43d6a2e5 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt @@ -246,8 +246,10 @@ setenv bootcmd " echo \"\"; echo \"\"; sleep 1; + bootcount reset; reset; " +bootcount reset saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt index 90e7e1f3d..256accf40 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt @@ -247,8 +247,10 @@ setenv bootcmd " echo \"\"; echo \"\"; sleep 1; + bootcount reset; reset; " +bootcount reset saveenv reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh index 760268ff6..a20af2bf3 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh @@ -209,6 +209,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults +# - Reset the bootcount # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -217,6 +218,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; + bootcount reset; saveenv; echo \"\"; echo \"\"; @@ -286,6 +288,8 @@ if [ "${DUALBOOT}" != true ]; then fi uuu fb: ucmd saveenv +# Reset the bootcount +uuu fb: ucmd bootcount reset # Reset the target uuu fb: acmd reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh index 1b140d621..2538fe4c8 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh @@ -297,8 +297,9 @@ if [ "${SQUASHFS}" = true ]; then uuu fb: ucmd saveenv fi -# Reset the target +# Reset the bootcount uuu fb: ucmd bootcount reset +# Reset the target uuu fb: acmd reset echo "\033[32m" From bb36b04777a5446f3bd0b10f13644edc5c04035b Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Mon, 16 Oct 2023 14:11:00 +0200 Subject: [PATCH 032/118] install_linux_fw: enable bootcount by setting bootlimit if dualboot enabled Use the intention of installing dual boot firmware as a condition to set bootlimit=3 so that the bootcount mechanism is enabled. Signed-off-by: Hector Palacios https://onedigi.atlassian.net/browse/DUB-1058 --- .../u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt | 2 ++ .../ccimx6qpsbc/install_linux_fw_usb.txt | 2 ++ .../u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh | 14 ++++++++++++-- .../u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt | 2 ++ .../u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt | 2 ++ .../u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh | 14 ++++++++++++-- .../u-boot-dey/ccimx6ul/install_linux_fw_sd.txt | 2 ++ .../u-boot-dey/ccimx6ul/install_linux_fw_usb.txt | 2 ++ .../u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh | 14 ++++++++++++-- .../u-boot-dey/ccimx8m/install_linux_fw_sd.txt | 2 ++ .../u-boot-dey/ccimx8m/install_linux_fw_usb.txt | 2 ++ .../u-boot-dey/ccimx8m/install_linux_fw_uuu.sh | 14 ++++++++++++-- .../u-boot-dey/ccimx8x/install_linux_fw_sd.txt | 2 ++ .../u-boot-dey/ccimx8x/install_linux_fw_usb.txt | 2 ++ .../u-boot-dey/ccimx8x/install_linux_fw_uuu.sh | 14 ++++++++++++-- .../u-boot-dey/ccimx93/install_linux_fw_sd.txt | 2 ++ .../u-boot-dey/ccimx93/install_linux_fw_usb.txt | 2 ++ .../u-boot-dey/ccimx93/install_linux_fw_uuu.sh | 14 ++++++++++++-- .../u-boot-dey/ccmp1/install_linux_fw_sd.txt | 4 +++- .../u-boot-dey/ccmp1/install_linux_fw_usb.txt | 4 +++- .../u-boot-dey/ccmp1/install_linux_fw_uuu.sh | 14 ++++++++++++-- 21 files changed, 114 insertions(+), 16 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt index aaefeff57..503e9ceaf 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_sd.txt @@ -144,6 +144,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -219,6 +220,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt index b752e0aac..d4f491057 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_usb.txt @@ -144,6 +144,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -222,6 +223,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh index 5cf3788bb..f4bed37e0 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh @@ -32,7 +32,9 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -b Activate bootcount mechanism (3 boot attempts)." echo " -d Install firmware on dualboot partitions (system A and system B)." + echo " (Implies -b)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -70,10 +72,11 @@ echo "############################################################" # Command line admits the following parameters: # -u # -i -while getopts 'dhi:nu:' c +while getopts 'bdhi:nu:' c do case $c in - d) INSTALL_DUALBOOT=true ;; + b) BOOTCOUNT=true ;; + d) INSTALL_DUALBOOT=true && BOOTCOUNT=true ;; h) show_usage ;; i) IMAGE_NAME=${OPTARG} ;; n) NOWAIT=true ;; @@ -184,6 +187,11 @@ if [ ! -f ${INSTALL_ROOTFS_FILENAME} ]; then fi fi +# Enable bootcount mechanism by setting a bootlimit +if [ "${BOOTCOUNT}" = true ]; then + bootlimit_cmd="setenv bootlimit 3" +fi + [ "${ABORT}" = true ] && exit 1 # parts names @@ -241,6 +249,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults # - Reset the bootcount +# - Set bootlimit (if required) # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -250,6 +259,7 @@ uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; setenv bootcount 0 + ${bootlimit_cmd}; saveenv; echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt index b4c819221..0f038724b 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_sd.txt @@ -155,6 +155,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -230,6 +231,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt index 689669278..b7e65f7ad 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_usb.txt @@ -155,6 +155,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -233,6 +234,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh index 655604812..d09fd528a 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh @@ -32,7 +32,9 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -b Activate bootcount mechanism (3 boot attempts)." echo " -d Install firmware on dualboot partitions (system A and system B)." + echo " (Implies -b)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -70,10 +72,11 @@ echo "############################################################" # Command line admits the following parameters: # -u # -i -while getopts 'dhi:nu:' c +while getopts 'bdhi:nu:' c do case $c in - d) INSTALL_DUALBOOT=true ;; + b) BOOTCOUNT=true ;; + d) INSTALL_DUALBOOT=true && BOOTCOUNT=true ;; h) show_usage ;; i) IMAGE_NAME=${OPTARG} ;; n) NOWAIT=true ;; @@ -202,6 +205,11 @@ if [ ! -f ${INSTALL_ROOTFS_FILENAME} ]; then fi fi +# Enable bootcount mechanism by setting a bootlimit +if [ "${BOOTCOUNT}" = true ]; then + bootlimit_cmd="setenv bootlimit 3" +fi + [ "${ABORT}" = true ] && exit 1 # parts names @@ -259,6 +267,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults # - Reset the bootcount +# - Set bootlimit (if required) # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -268,6 +277,7 @@ uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; setenv bootcount 0 + ${bootlimit_cmd}; saveenv; echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt index 35bceb6df..c01c01e2d 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_sd.txt @@ -151,6 +151,7 @@ fi # - Save the environment # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -222,6 +223,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt index 36fdd73b4..45517feba 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_usb.txt @@ -153,6 +153,7 @@ fi # - Save the environment # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -225,6 +226,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh index 6ae7ed748..c6bab372e 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6ul/install_linux_fw_uuu.sh @@ -32,7 +32,9 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -b Activate bootcount mechanism (3 boot attempts)." echo " -d Install firmware on dualboot partitions (system A and system B)." + echo " (Implies -b)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -79,10 +81,11 @@ echo "############################################################" # Command line admits the following parameters: # -u # -i -while getopts 'dhi:nu:' c +while getopts 'bdhi:nu:' c do case $c in - d) INSTALL_DUALBOOT=true ;; + b) BOOTCOUNT=true ;; + d) INSTALL_DUALBOOT=true && BOOTCOUNT=true ;; h) show_usage ;; i) IMAGE_NAME=${OPTARG} ;; n) NOWAIT=true ;; @@ -193,6 +196,11 @@ if [ ! -f ${INSTALL_ROOTFS_FILENAME} ]; then fi fi +# Enable bootcount mechanism by setting a bootlimit +if [ "${BOOTCOUNT}" = true ]; then + bootlimit_cmd="setenv bootlimit 3" +fi + [ "${ABORT}" = true ] && exit 1 # parts names @@ -250,6 +258,7 @@ part_update "uboot" "${INSTALL_UBOOT_FILENAME}" 5000 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults # - Reset the bootcount +# - Set bootlimit (if required) # - Save the environment # - Update the 'linux' partition # - Update the 'recovery' partition @@ -260,6 +269,7 @@ uuu fb: ucmd setenv bootcmd " setenv dualboot \${dualboot}; bootcount reset; setenv singlemtdsys \${singlemtdsys}; + ${bootlimit_cmd}; saveenv; echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt index 418d833c2..0d2d263bd 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_sd.txt @@ -120,6 +120,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -196,6 +197,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt index c870409fa..5b67a563e 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_usb.txt @@ -120,6 +120,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -197,6 +198,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh index a20af2bf3..1ee6c2f79 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8m/install_linux_fw_uuu.sh @@ -32,7 +32,9 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -b Activate bootcount mechanism (3 boot attempts)." echo " -d Install firmware on dualboot partitions (system A and system B)." + echo " (Implies -b)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -70,10 +72,11 @@ echo "############################################################" # Command line admits the following parameters: # -u # -i -while getopts 'dhi:nu:' c +while getopts 'bdhi:nu:' c do case $c in - d) INSTALL_DUALBOOT=true ;; + b) BOOTCOUNT=true ;; + d) INSTALL_DUALBOOT=true && BOOTCOUNT=true ;; h) show_usage ;; i) IMAGE_NAME=${OPTARG} ;; n) NOWAIT=true ;; @@ -150,6 +153,11 @@ if [ ! -f ${INSTALL_ROOTFS_FILENAME} ]; then fi fi +# Enable bootcount mechanism by setting a bootlimit +if [ "${BOOTCOUNT}" = true ]; then + bootlimit_cmd="setenv bootlimit 3" +fi + [ "${ABORT}" = true ] && exit 1 # parts names @@ -210,6 +218,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults # - Reset the bootcount +# - Set bootlimit (if required) # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -219,6 +228,7 @@ uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; bootcount reset; + ${bootlimit_cmd}; saveenv; echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt index 9c75c13cf..852de0445 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_sd.txt @@ -132,6 +132,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -208,6 +209,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt index f8b12076a..963b0c50e 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_usb.txt @@ -132,6 +132,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -211,6 +212,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh index 6d7ad5a4d..068e09ac0 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx8x/install_linux_fw_uuu.sh @@ -32,7 +32,9 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -b Activate bootcount mechanism (3 boot attempts)." echo " -d Install firmware on dualboot partitions (system A and system B)." + echo " (Implies -b)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -70,10 +72,11 @@ echo "############################################################" # Command line admits the following parameters: # -u # -i -while getopts 'dhi:nu:' c +while getopts 'bdhi:nu:' c do case $c in - d) INSTALL_DUALBOOT=true ;; + b) BOOTCOUNT=true ;; + d) INSTALL_DUALBOOT=true && BOOTCOUNT=true ;; h) show_usage ;; i) IMAGE_NAME=${OPTARG} ;; n) NOWAIT=true ;; @@ -157,6 +160,11 @@ if [ ! -f ${INSTALL_ROOTFS_FILENAME} ]; then fi fi +# Enable bootcount mechanism by setting a bootlimit +if [ "${BOOTCOUNT}" = true ]; then + bootlimit_cmd="setenv bootlimit 3" +fi + [ "${ABORT}" = true ] && exit 1 # parts names @@ -214,6 +222,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults # - Reset the bootcount +# - Set bootlimit (if required) # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -223,6 +232,7 @@ uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; bootcount reset; + ${bootlimit_cmd}; saveenv; echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt index f43d6a2e5..eaba3add2 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt @@ -118,6 +118,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -194,6 +195,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt index 256accf40..a31bd122e 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt @@ -118,6 +118,7 @@ fi # - Partition the eMMC user data area for Linux # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition @@ -195,6 +196,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh index a20af2bf3..1ee6c2f79 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh @@ -32,7 +32,9 @@ show_usage() echo "Usage: $0 [options]" echo "" echo " Options:" + echo " -b Activate bootcount mechanism (3 boot attempts)." echo " -d Install firmware on dualboot partitions (system A and system B)." + echo " (Implies -b)." echo " -h Show this help." echo " -i Image name that prefixes the image filenames, such as 'dey-image-qt', " echo " 'dey-image-webkit', 'core-image-base'..." @@ -70,10 +72,11 @@ echo "############################################################" # Command line admits the following parameters: # -u # -i -while getopts 'dhi:nu:' c +while getopts 'bdhi:nu:' c do case $c in - d) INSTALL_DUALBOOT=true ;; + b) BOOTCOUNT=true ;; + d) INSTALL_DUALBOOT=true && BOOTCOUNT=true ;; h) show_usage ;; i) IMAGE_NAME=${OPTARG} ;; n) NOWAIT=true ;; @@ -150,6 +153,11 @@ if [ ! -f ${INSTALL_ROOTFS_FILENAME} ]; then fi fi +# Enable bootcount mechanism by setting a bootlimit +if [ "${BOOTCOUNT}" = true ]; then + bootlimit_cmd="setenv bootlimit 3" +fi + [ "${ABORT}" = true ] && exit 1 # parts names @@ -210,6 +218,7 @@ uuu fb: ucmd mmc partconf 0 1 1 1 # Set 'bootcmd' for the second part of the script that will # - Reset environment to defaults # - Reset the bootcount +# - Set bootlimit (if required) # - Save the environment # - Partition the eMMC user data area for Linux # - Update the 'linux' partition @@ -219,6 +228,7 @@ uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; bootcount reset; + ${bootlimit_cmd}; saveenv; echo \"\"; echo \"\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_sd.txt index b2990ab35..cb0238c34 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_sd.txt @@ -152,6 +152,7 @@ fi # environment # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Configure recovery to wipe 'update' partition @@ -215,6 +216,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; @@ -255,8 +257,8 @@ setenv bootcmd " echo \"\"; setenv boot_recovery yes; setenv recovery_command wipe_update; - saveenv; fi; + saveenv; echo \"\"; echo \"\"; echo \">> Firmware installation complete.\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_usb.txt index de7c1d6ae..304dc9f1a 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_usb.txt @@ -154,6 +154,7 @@ fi # environment # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b + - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Configure recovery to wipe 'update' partition @@ -218,6 +219,7 @@ setenv bootcmd " exit; fi; fi; + setenv bootlimit 3; else echo \"\"; echo \"\"; @@ -258,8 +260,8 @@ setenv bootcmd " echo \"\"; setenv boot_recovery yes; setenv recovery_command wipe_update; - saveenv; fi; + saveenv; echo \"\"; echo \"\"; echo \">> Firmware installation complete.\"; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh index 2538fe4c8..f08aaf979 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/install_linux_fw_uuu.sh @@ -40,7 +40,9 @@ show_usage() echo " Options:" echo " -a Arm-trusted-firmware filename." echo " Auto-determined by variant if not provided." + echo " -b Activate bootcount mechanism (3 boot attempts)." echo " -d Install firmware on dualboot partitions (system A and system B)." + echo " (Implies -b)." echo " -f FIP filename." echo " Auto-determined by variant if not provided." echo " -h Show this help." @@ -80,11 +82,12 @@ echo "############################################################" # -a # -f # -i -while getopts 'a:df:hi:n' c +while getopts 'a:bdf:hi:n' c do case $c in a) INSTALL_ATF_FILENAME=${OPTARG} ;; - d) INSTALL_DUALBOOT=true ;; + b) BOOTCOUNT=true ;; + d) INSTALL_DUALBOOT=true && BOOTCOUNT=true ;; f) INSTALL_FIP_FILENAME=${OPTARG} ;; h) show_usage ;; i) IMAGE_NAME=${OPTARG} ;; @@ -163,6 +166,11 @@ if [ ! -f ${INSTALL_ROOTFS_FILENAME} ]; then fi fi +# Enable bootcount mechanism by setting a bootlimit +if [ "${BOOTCOUNT}" = true ]; then + bootlimit_cmd="setenv bootlimit 3" +fi + [ "${ABORT}" = true ] && exit 1 # parts names @@ -235,6 +243,7 @@ fi # - Reset environment to defaults # - Keep the 'dualboot' status # - Reset the bootcount +# - Set bootlimit (if required) # - Save the environment # - Update the 'linux' partition(s) # - Update the 'rootfs' partition(s) @@ -242,6 +251,7 @@ uuu fb: ucmd setenv bootcmd " env default -a; setenv dualboot \${dualboot}; bootcount reset; + ${bootlimit_cmd}; saveenv; saveenv; echo \"\"; From 4c8bde2bc372ba090a142a70dbe01c55f96f5d9c Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 24 Oct 2023 16:38:15 +0200 Subject: [PATCH 033/118] u-boot: ccimx93: add bootscript support for cpu rev A0 Add support to the bootscript to load the CPU overlay for the A0 rev. https://onedigi.atlassian.net/browse/DEL-8743 Signed-off-by: Isaac Hermida --- meta-digi-arm/conf/machine/ccimx93-dvk.conf | 1 + .../recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/meta-digi-arm/conf/machine/ccimx93-dvk.conf b/meta-digi-arm/conf/machine/ccimx93-dvk.conf index 30f5ba12c..ea0007aa8 100644 --- a/meta-digi-arm/conf/machine/ccimx93-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx93-dvk.conf @@ -23,6 +23,7 @@ KERNEL_DEVICETREE ?= " \ digi/_ov_board_mikroe-accel2-click_ccimx93-dvk.dtbo \ digi/_ov_board_mikroe-gyro-click_ccimx93-dvk.dtbo \ digi/_ov_som_bt_ccimx93.dtbo \ + digi/_ov_som_cpu_a0_ccimx93.dtbo \ digi/_ov_som_mca_ccimx93.dtbo \ digi/_ov_som_npu_ccimx93.dtbo \ digi/_ov_som_wifi_ccimx93.dtbo \ diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt index 4fd2fae26..88337a716 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93-dvk/boot.txt @@ -90,6 +90,10 @@ if test "${module_has_npu}" = "1" && test -z "${disable_npu}"; then setenv overlays _ov_som_npu_ccimx93.dtbo,${overlays} fi +if test "${soc_rev}" = "0x10"; then + setenv overlays _ov_som_cpu_a0_ccimx93.dtbo,${overlays} +fi + dboot linux mmc ${mmcbootdev}:${mmcpart} # From df9b1cf329c46b038c66c85a44d8084dd2681e58 Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Tue, 26 Sep 2023 14:29:49 +0200 Subject: [PATCH 034/118] ccmp1: add signed FIT image support This commit adds signed FIT image support for the CCMP1 platforms when using Trustfence. https://onedigi.atlassian.net/browse/DEL-8591 Signed-off-by: Mike Engel --- .../classes/image_types_digi.bbclass | 115 +++++++++++------- meta-digi-arm/conf/machine/ccmp13-dvk.conf | 5 +- meta-digi-arm/conf/machine/ccmp15-dvk.conf | 5 +- meta-digi-arm/conf/machine/include/ccmp1.inc | 3 + .../recipes-bsp/u-boot/u-boot-dey.inc | 14 ++- .../u-boot/u-boot-dey/ccmp1/fit_legacy.cfg | 1 + .../u-boot/u-boot-dey/ccmp1/fit_signature.cfg | 4 + .../recipes-bsp/u-boot/u-boot-dey_2021.10.bb | 29 ++++- .../recipes-kernel/linux/linux-dey_5.15.bb | 6 + meta-digi-dey/classes/trustfence.bbclass | 19 +++ 10 files changed, 150 insertions(+), 51 deletions(-) create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_signature.cfg diff --git a/meta-digi-arm/classes/image_types_digi.bbclass b/meta-digi-arm/classes/image_types_digi.bbclass index 5cabc03cd..83212e2a8 100644 --- a/meta-digi-arm/classes/image_types_digi.bbclass +++ b/meta-digi-arm/classes/image_types_digi.bbclass @@ -21,15 +21,18 @@ do_image_boot_vfat[depends] += " \ IMAGE_CMD:boot.vfat() { BOOTIMG_FILES="$(readlink -e ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin)" BOOTIMG_FILES_SYMLINK="${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin" - if [ -n "${KERNEL_DEVICETREE}" ]; then - for DTB in ${KERNEL_DEVICETREE}; do - # Remove potential sub-folders - DTB="$(basename ${DTB})" - if [ -e "${DEPLOY_DIR_IMAGE}/${DTB}" ]; then - BOOTIMG_FILES="${BOOTIMG_FILES} $(readlink -e ${DEPLOY_DIR_IMAGE}/${DTB})" - BOOTIMG_FILES_SYMLINK="${BOOTIMG_FILES_SYMLINK} ${DEPLOY_DIR_IMAGE}/${DTB}" - fi - done + # Exclude DTB and DTBO from VFAT image when creating a FIT image + if [ "${TRUSTFENCE_FIT_IMG}" != "1" ]; then + if [ -n "${KERNEL_DEVICETREE}" ]; then + for DTB in ${KERNEL_DEVICETREE}; do + # Remove potential sub-folders + DTB="$(basename ${DTB})" + if [ -e "${DEPLOY_DIR_IMAGE}/${DTB}" ]; then + BOOTIMG_FILES="${BOOTIMG_FILES} $(readlink -e ${DEPLOY_DIR_IMAGE}/${DTB})" + BOOTIMG_FILES_SYMLINK="${BOOTIMG_FILES_SYMLINK} ${DEPLOY_DIR_IMAGE}/${DTB}" + fi + done + fi fi # Add Trustfence initramfs if enabled @@ -57,12 +60,15 @@ IMAGE_CMD:boot.vfat() { mkfs.vfat -n "Boot DEY" -S 512 -C ${IMGDEPLOYDIR}/${IMAGE_NAME}.boot.vfat ${BOOTIMG_BLOCKS} mcopy -i ${IMGDEPLOYDIR}/${IMAGE_NAME}.boot.vfat ${BOOTIMG_FILES_SYMLINK} ::/ - # Copy boot scripts into the VFAT image - for item in ${BOOT_SCRIPTS}; do - src=`echo $item | awk -F':' '{ print $1 }'` - dst=`echo $item | awk -F':' '{ print $2 }'` - mcopy -i ${IMGDEPLOYDIR}/${IMAGE_NAME}.boot.vfat -s ${DEPLOY_DIR_IMAGE}/$src ::/$dst - done + # Exclude boot scripts from VFAT image when creating a FIT image + if [ "${TRUSTFENCE_FIT_IMG}" != "1" ]; then + # Copy boot scripts into the VFAT image + for item in ${BOOT_SCRIPTS}; do + src=`echo $item | awk -F':' '{ print $1 }'` + dst=`echo $item | awk -F':' '{ print $2 }'` + mcopy -i ${IMGDEPLOYDIR}/${IMAGE_NAME}.boot.vfat -s ${DEPLOY_DIR_IMAGE}/$src ::/$dst + done + fi # Truncate the image to speed up the downloading/writing to the EMMC if [ -n "${BOARD_BOOTIMAGE_PARTITION_SIZE}" ]; then @@ -83,14 +89,17 @@ do_image_boot_ubifs[depends] += " \ IMAGE_CMD:boot.ubifs() { BOOTIMG_FILES_SYMLINK="${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin" - if [ -n "${KERNEL_DEVICETREE}" ]; then - for DTB in ${KERNEL_DEVICETREE}; do - # Remove potential sub-folders - DTB="$(basename ${DTB})" - if [ -e "${DEPLOY_DIR_IMAGE}/${DTB}" ]; then - BOOTIMG_FILES_SYMLINK="${BOOTIMG_FILES_SYMLINK} ${DEPLOY_DIR_IMAGE}/${DTB}" - fi - done + # Exclude DTB and DTBO from UBIFS image when creating a FIT image + if [ "${TRUSTFENCE_FIT_IMG}" != "1" ]; then + if [ -n "${KERNEL_DEVICETREE}" ]; then + for DTB in ${KERNEL_DEVICETREE}; do + # Remove potential sub-folders + DTB="$(basename ${DTB})" + if [ -e "${DEPLOY_DIR_IMAGE}/${DTB}" ]; then + BOOTIMG_FILES_SYMLINK="${BOOTIMG_FILES_SYMLINK} ${DEPLOY_DIR_IMAGE}/${DTB}" + fi + done + fi fi # Add Trustfence initramfs if enabled @@ -107,12 +116,15 @@ IMAGE_CMD:boot.ubifs() { ln ${orig} ${TMP_BOOTDIR}/$(basename ${item}) done - # Hard-link boot scripts into the temporary folder - for item in ${BOOT_SCRIPTS}; do - src="$(echo ${item} | awk -F':' '{ print $1 }')" - dst="$(echo ${item} | awk -F':' '{ print $2 }')" - ln ${DEPLOY_DIR_IMAGE}/${src} ${TMP_BOOTDIR}/${dst} - done + # Exclude boot scripts from UBIFS image when creating a FIT image + if [ "${TRUSTFENCE_FIT_IMG}" != "1" ]; then + # Hard-link boot scripts into the temporary folder + for item in ${BOOT_SCRIPTS}; do + src="$(echo ${item} | awk -F':' '{ print $1 }')" + dst="$(echo ${item} | awk -F':' '{ print $2 }')" + ln ${DEPLOY_DIR_IMAGE}/${src} ${TMP_BOOTDIR}/${dst} + done + fi # Build UBIFS boot image out of temp folder mkfs.ubifs -r ${TMP_BOOTDIR} -o ${IMGDEPLOYDIR}/${IMAGE_NAME}.boot.ubifs ${MKUBIFS_BOOT_ARGS} @@ -135,8 +147,11 @@ IMAGE_CMD:recovery.vfat() { # Use 'boot.vfat' image as base cp --remove-destination ${IMGDEPLOYDIR}/${IMAGE_NAME}.boot.vfat ${IMGDEPLOYDIR}/${IMAGE_NAME}.recovery.vfat - # Copy the recovery initramfs into the VFAT image - mcopy -i ${IMGDEPLOYDIR}/${IMAGE_NAME}.recovery.vfat -s ${DEPLOY_DIR_IMAGE}/${RECOVERY_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz.u-boot.tf ::/uramdisk-recovery.img + # Exclude initRAMFS from VFAT image when creating a FIT image + if [ "${TRUSTFENCE_FIT_IMG}" != "1" ]; then + # Copy the recovery initramfs into the VFAT image + mcopy -i ${IMGDEPLOYDIR}/${IMAGE_NAME}.recovery.vfat -s ${DEPLOY_DIR_IMAGE}/${RECOVERY_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz.u-boot.tf ::/uramdisk-recovery.img + fi } # Remove the default ".rootfs." suffix for 'recovery.vfat' images @@ -153,14 +168,17 @@ do_image_recovery_ubifs[depends] += " \ IMAGE_CMD:recovery.ubifs() { RECOVERYIMG_FILES_SYMLINK="${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin" - if [ -n "${KERNEL_DEVICETREE}" ]; then - for DTB in ${KERNEL_DEVICETREE}; do - # Remove potential sub-folders - DTB="$(basename ${DTB})" - if [ -e "${DEPLOY_DIR_IMAGE}/${DTB}" ]; then - RECOVERYIMG_FILES_SYMLINK="${RECOVERYIMG_FILES_SYMLINK} ${DEPLOY_DIR_IMAGE}/${DTB}" - fi - done + # Exclude DTB and DTBO from VFAT image when creating a FIT image + if [ "${TRUSTFENCE_FIT_IMG}" != "1" ]; then + if [ -n "${KERNEL_DEVICETREE}" ]; then + for DTB in ${KERNEL_DEVICETREE}; do + # Remove potential sub-folders + DTB="$(basename ${DTB})" + if [ -e "${DEPLOY_DIR_IMAGE}/${DTB}" ]; then + RECOVERYIMG_FILES_SYMLINK="${RECOVERYIMG_FILES_SYMLINK} ${DEPLOY_DIR_IMAGE}/${DTB}" + fi + done + fi fi # Create temporary folder @@ -172,15 +190,18 @@ IMAGE_CMD:recovery.ubifs() { ln ${orig} ${TMP_RECOVERYDIR}/$(basename ${item}) done - # Hard-link boot scripts into the temporary folder - for item in ${BOOT_SCRIPTS}; do - src="$(echo ${item} | awk -F':' '{ print $1 }')" - dst="$(echo ${item} | awk -F':' '{ print $2 }')" - ln ${DEPLOY_DIR_IMAGE}/${src} ${TMP_RECOVERYDIR}/${dst} - done + # Exclude bootscript from VFAT image when creating a FIT image + if [ "${TRUSTFENCE_FIT_IMG}" != "1" ]; then + # Hard-link boot scripts into the temporary folder + for item in ${BOOT_SCRIPTS}; do + src="$(echo ${item} | awk -F':' '{ print $1 }')" + dst="$(echo ${item} | awk -F':' '{ print $2 }')" + ln ${DEPLOY_DIR_IMAGE}/${src} ${TMP_RECOVERYDIR}/${dst} + done - # Copy the recovery initramfs into the temporary folder - cp ${DEPLOY_DIR_IMAGE}/${RECOVERY_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz.u-boot.tf ${TMP_RECOVERYDIR}/uramdisk-recovery.img + # Copy the recovery initramfs into the temporary folder + cp ${DEPLOY_DIR_IMAGE}/${RECOVERY_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz.u-boot.tf ${TMP_RECOVERYDIR}/uramdisk-recovery.img + fi # Build UBIFS recovery image out of temp folder mkfs.ubifs -r ${TMP_RECOVERYDIR} -o ${IMGDEPLOYDIR}/${IMAGE_NAME}.recovery.ubifs ${MKUBIFS_BOOT_ARGS} diff --git a/meta-digi-arm/conf/machine/ccmp13-dvk.conf b/meta-digi-arm/conf/machine/ccmp13-dvk.conf index ffe3de0fa..bda7d0664 100644 --- a/meta-digi-arm/conf/machine/ccmp13-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp13-dvk.conf @@ -47,6 +47,8 @@ STM32MP_KERNEL_DEVICETREE:ccmp13-dvk += " \ _ov_som_bt_test_ccmp13.dtbo \ _ov_som_wifi_ccmp13.dtbo \ " +# Set DTB load address to U-Boot fdt_addr_r +UBOOT_DTB_LOADADDRESS = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', '0xc4000000', '', d)}" # ========================================================================= # Machine features @@ -106,7 +108,8 @@ OPTEE_CONF = "ccmp13-dvk" # ========================================================================= # Kernel # ========================================================================= -KERNEL_IMAGETYPE = "zImage" +KERNEL_IMAGETYPE = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'fitImage', 'zImage', d)}" +KERNEL_CLASSES = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'kernel-fitimage', 'kernel-uimage', d)}" KERNEL_ALT_IMAGETYPE = "Image uImage vmlinux" KERNEL_DEFCONFIG ?= "ccmp1_defconfig" KERNEL_EXTERNAL_DEFCONFIG ?= "defconfig" diff --git a/meta-digi-arm/conf/machine/ccmp15-dvk.conf b/meta-digi-arm/conf/machine/ccmp15-dvk.conf index bf45951ff..c2631c2b1 100644 --- a/meta-digi-arm/conf/machine/ccmp15-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp15-dvk.conf @@ -54,6 +54,8 @@ STM32MP_KERNEL_DEVICETREE:ccmp15-dvk += " \ _ov_som_mca_ccmp15.dtbo \ _ov_som_wifi_ccmp15.dtbo \ " +# Set DTB load address to U-Boot fdt_addr_r +UBOOT_DTB_LOADADDRESS = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', '0xc4000000', '', d)}" # ========================================================================= # Machine features @@ -114,7 +116,8 @@ OPTEE_CONF = "ccmp15-dvk" # ========================================================================= # Kernel # ========================================================================= -KERNEL_IMAGETYPE = "zImage" +KERNEL_IMAGETYPE = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'fitImage', 'zImage', d)}" +KERNEL_CLASSES = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'kernel-fitimage', 'kernel-uimage', d)}" KERNEL_ALT_IMAGETYPE = "Image uImage vmlinux" KERNEL_DEFCONFIG ?= "ccmp1_defconfig" KERNEL_EXTERNAL_DEFCONFIG ?= "defconfig" diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index fd74a2ad8..049c14332 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -72,3 +72,6 @@ TRUSTFENCE_CONSOLE_DISABLE ?= "0" # Disable the generation of flashlayout files do_create_flashlayout_config[noexec] = "1" + +# Include boot script into the FIT image +UBOOT_ENV = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'boot', '', d)}" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc index 81c1418ba..75199b0b0 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc @@ -198,6 +198,18 @@ do_deploy:append:ccmp1() { # Deploy u-boot-nodtb.bin and ccmp1x-dvk.dtb, to be packaged in fip binary by tf-a install -d ${DEPLOYDIR}/${BOOT_TOOLS} install -m 0777 ${B}/${config}/arch/arm/dts/${UBOOT_DTB_NAME} ${DEPLOYDIR}/${BOOT_TOOLS}/${FIP_UBOOT_DTB}-${FIP_UBOOT_HEADER}.dtb - install -m 0777 ${B}/${config}/u-boot-nodtb.bin ${DEPLOYDIR}/${BOOT_TOOLS}/u-boot-nodtb.bin + + # Append signature to u-boot DT + if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then + # get name of u-boot devicetree without signature + ubootdevicetree="${DEPLOYDIR}/${BOOT_TOOLS}/u-boot-${UBOOT_DTB_NAME}" + namewithoutsignature=`echo $ubootdevicetree | sed "s/\.dtb/-without-signature.dtb/g"` + namewithsignature=`echo $ubootdevicetree | sed "s/\.dtb/-with-signature.dtb/g"` + mv $ubootdevicetree $namewithoutsignature + # get name of U-Boot device tree from DEPLOY_DIR + nameonkernel="${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}*.dtb" + cp $nameonkernel $namewithsignature + cp $nameonkernel $ubootdevicetree + fi } diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg new file mode 100644 index 000000000..b4a52f46f --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_legacy.cfg @@ -0,0 +1 @@ +CONFIG_LEGACY_IMAGE_FORMAT=y \ No newline at end of file diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_signature.cfg b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_signature.cfg new file mode 100644 index 000000000..eb5d7d683 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp1/fit_signature.cfg @@ -0,0 +1,4 @@ +CONFIG_FIT_SIGNATURE=y +CONFIG_RSA=y +CONFIG_ECDSA=y +CONFIG_ECDSA_VERIFY=y diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2021.10.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2021.10.bb index 2bd448264..8f0dca3e6 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2021.10.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2021.10.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2022 Digi International +# Copyright (C) 2022,2023 Digi International require u-boot-dey.inc LIC_FILES_CHKSUM = "file://Licenses/README;md5=5a7450c57ffe5ae63fd732446b988025" @@ -9,4 +9,31 @@ DEPENDS += "python3-setuptools-native" SRCBRANCH = "v2021.10/master" SRCREV = "${AUTOREV}" +UBOOT_FIT_CFG_FRAGMENTS = " \ + file://fit_legacy.cfg \ + file://fit_signature.cfg \ +" + +SRC_URI += " \ + ${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', '${UBOOT_FIT_CFG_FRAGMENTS}', '', d)} \ +" +# Install UBOOT_ENV_BINARY to datadir, so that kernel can use it +# to include it into the FIT image. +install_helper_bootscr() { + if [ -f "${D}/boot/${UBOOT_ENV_BINARY}" ]; then + # Install UBOOT_ENV_BINARY into datadir to share it with the kernel + install -Dm 0644 ${D}/boot/${UBOOT_ENV_BINARY} ${D}${datadir}/${UBOOT_ENV_IMAGE} + ln -sf ${UBOOT_ENV_IMAGE} ${D}${datadir}/${UBOOT_ENV_BINARY} + else + bbwarn "${D}/boot/${UBOOT_ENV_BINARY} not found" + fi +} + +do_install:append() { + # Copy boot script, so kernel can include it when creating the FIT image + if [ "${TRUSTFENCE_FIT_IMG}" = "1" ] && [ -n "${UBOOT_ENV_BINARY}" ]; then + install_helper_bootscr + fi +} + COMPATIBLE_MACHINE = "(ccmp1)" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb index ecc10eef9..1f6141a39 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb @@ -7,4 +7,10 @@ SRCBRANCH:stm32mpcommon = "v5.15.118/stm/master" SRCREV = "${AUTOREV}" SRCREV:stm32mpcommon = "${AUTOREV}" +do_assemble_fitimage:prepend:ccmp1() { + # Deploy u-boot script to be included into the FIT image + install -d ${STAGING_DIR_HOST}/boot + install -m 0644 ${RECIPE_SYSROOT}/${datadir}/${UBOOT_ENV_BINARY} ${STAGING_DIR_HOST}/boot/ +} + COMPATIBLE_MACHINE = "(ccimx6|ccimx6ul|ccimx8m|ccimx8x|ccmp1)" diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index d559e9a29..5a210809b 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -26,6 +26,7 @@ TRUSTFENCE_DEK_PATH:ccmp1 ?= "0" TRUSTFENCE_ENCRYPT_ENVIRONMENT ?= "1" TRUSTFENCE_SRK_REVOKE_MASK ?= "0x0" TRUSTFENCE_KEY_INDEX ?= "0" +TRUSTFENCE_FIT_IMG:ccmp1 ?= "1" # Partition encryption configuration TRUSTFENCE_ENCRYPT_PARTITIONS ?= "1" @@ -45,6 +46,24 @@ TRUSTFENCE_SIGN_ARTIFACTS:ccimx93 = "0" IMAGE_FEATURES += "dey-trustfence" +# --------------------------------- +# Usage of FIT Image signed +# --------------------------------- + +# Enable FIT image build when Trustfence is enabled +MACHINE_FEATURES += "${@oe.utils.conditional('TRUSTFENCE_FIT_IMG', '1', 'fit', '', d)}" +# keys name in keydir (eg. "ubootfit.crt", "ubootfit.key") +TRUSTFENCE_SIGN_KEYNAME ?= "" +# Set variables required by poky to sign FIT image +UBOOT_SIGN_KEYNAME ?= "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', '${TRUSTFENCE_SIGN_KEYNAME}', '', d)}" +UBOOT_MKIMAGE_DTCOPTS ?= "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', '-I dts -O dtb -p 2000', '', d)}" +# Enable FIT signing support +UBOOT_SIGN_ENABLE ?= "${TRUSTFENCE_SIGN}" +# Set path to FIT signing keys +UBOOT_SIGN_KEYDIR ?= "${TRUSTFENCE_SIGN_KEYS_PATH}" +# Create keys if not defined +FIT_GENERATE_KEYS ?= "${@oe.utils.conditional('TRUSTFENCE_SIGN_KEYNAME', '', '1', '', d)}" + # Function to generate a PKI tree (with lock dir protection) GENPKI_LOCK_DIR = "${TRUSTFENCE_SIGN_KEYS_PATH}/.genpki.lock" gen_pki_tree() { From 014667b41c1e3ae7494a197749396c49a6351302 Mon Sep 17 00:00:00 2001 From: Francisco Gil Date: Tue, 17 Oct 2023 16:16:35 +0200 Subject: [PATCH 035/118] udev: automount: add exception to mount loop and ram block devices The nodes "/dev/ramX" and "/dev/loopX" are mounted on boot. Each node calls the mount.sh script, but they are not mounted because these nodes are blacklisted in the "blacklist.conf" file. In the ccmp13 adding this modification in the rule saves around 4 seconds per boot. In the ccmp15 and ccimx6ul around 2 seconds are saved. https://onedigi.atlassian.net/browse/DEL-8725 Signed-off-by: Francisco Gil --- .../recipes-core/udev/udev-extraconf/automount.rules | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules b/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules index df3fb866a..8b3e3384f 100644 --- a/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules +++ b/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules @@ -23,8 +23,8 @@ SUBSYSTEM=="block", ENV{ID_PART_ENTRY_NAME}=="recovery*", ACTION=="add", GOTO="a SUBSYSTEM=="mtd", ATTRS{name}=="recovery*", ACTION=="add", GOTO="automount_rules_end" # Media automounting -SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" -SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" -SUBSYSTEM=="block", ACTION=="change", ENV{DISK_MEDIA_CHANGE}=="1" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ATTRS{name}!="loop*|ram*", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ATTRS{name}!="loop*|ram*", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ATTRS{name}!="loop*|ram*", ACTION=="change", ENV{DISK_MEDIA_CHANGE}=="1" RUN+="/etc/udev/scripts/mount.sh" LABEL="automount_rules_end" From a96d4fdc1d44b93484795a04cf04aac8debba9c2 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 2 Nov 2023 18:58:36 +0100 Subject: [PATCH 036/118] imx-atf: add support for imx93 A0 soc revision Signed-off-by: Javier Viguera --- ...-ELE-clock-workaround-for-soc-revisi.patch | 53 +++++++++++++++++++ .../recipes-bsp/imx-atf/imx-atf_%.bbappend | 21 ++++++++ 2 files changed, 74 insertions(+) create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch new file mode 100644 index 000000000..d3f1fc80c --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch @@ -0,0 +1,53 @@ +From: Javier Viguera +Date: Tue, 31 Oct 2023 11:25:46 +0100 +Subject: [PATCH] imx93: bring back ELE clock workaround for soc revision A0 + +Revert commit 7411561db535a20f61ff6621fec5b374130d34f9 to allow building +for soc revision A0 using a compilation flag. + +Signed-off-by: Javier Viguera +--- + plat/imx/imx93/imx93_psci.c | 10 ++++++++++ + plat/imx/imx93/platform.mk | 4 ++++ + 2 files changed, 14 insertions(+) + +diff --git a/plat/imx/imx93/imx93_psci.c b/plat/imx/imx93/imx93_psci.c +index 0fd2bb7802df..461801afb126 100644 +--- a/plat/imx/imx93/imx93_psci.c ++++ b/plat/imx/imx93/imx93_psci.c +@@ -783,6 +783,11 @@ void imx_pwr_domain_suspend(const psci_power_state_t *target_state) + } else { + write_clusterpwrdn(DSU_CLUSTER_PWR_OFF); + } ++ ++#ifdef SOC_REV_A0 ++ /* FIXME: slow down S401 clock: 24M OSC */ ++ mmio_clrbits_32(0x44450200, GENMASK_32(9, 8)); ++#endif + } + + if (is_local_state_retn(SYSTEM_PWR_STATE(target_state))) { +@@ -902,6 +907,11 @@ void imx_pwr_domain_suspend_finish(const psci_power_state_t *target_state) + mmio_write_32(IMX_GPC_BASE + A55C0_CMC_OFFSET + 0x800 * 2 + CM_MODE_CTRL, CM_MODE_RUN); + /* clear L3 retention */ + mmio_clrbits_32(IMX_SRC_BASE + A55C0_MEM + 0x400 * 3 + 0x4, MEM_LP_RETENTION); ++ ++#ifdef SOC_REV_A0 ++ /* FIXME: set S401 clock back */ ++ mmio_setbits_32(0x44450200, BIT(9)); ++#endif + } + /* do core level */ + if (is_local_state_off(CORE_PWR_STATE(target_state))) { +diff --git a/plat/imx/imx93/platform.mk b/plat/imx/imx93/platform.mk +index be09b9f0be7a..440c13c1dbe1 100644 +--- a/plat/imx/imx93/platform.mk ++++ b/plat/imx/imx93/platform.mk +@@ -57,3 +57,7 @@ BL32_BASE ?= 0x96000000 + BL32_SIZE ?= 0x02000000 + $(eval $(call add_define,BL32_BASE)) + $(eval $(call add_define,BL32_SIZE)) ++ ++ifeq (${SOC_REV_A0},1) ++$(eval $(call add_define,SOC_REV_A0)) ++endif diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend index 9d804184b..ced0c15a8 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend @@ -10,13 +10,34 @@ SRC_URI:append:ccimx8m = " \ " SRC_URI:append:ccimx93 = " \ file://0005-ccimx93-use-UART6-for-the-default-console.patch \ + file://0006-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch \ " BOOT_TOOLS = "imx-boot-tools" +# Build ATF for imx93 SOC revision A0 +do_compile:append:ccimx93() { + oe_runmake SOC_REV_A0=1 BUILD_BASE=build-A0 clean + oe_runmake SOC_REV_A0=1 BUILD_BASE=build-A0 bl31 + if ${BUILD_OPTEE}; then + oe_runmake SOC_REV_A0=1 BUILD_BASE=build-A0-optee clean + oe_runmake SOC_REV_A0=1 BUILD_BASE=build-A0-optee SPD=opteed bl31 + fi +} + do_deploy:append() { install -Dm 0644 ${S}/build/${ATF_PLATFORM}/release/bl31.bin ${DEPLOYDIR}/${BOOT_TOOLS}/bl31-${ATF_PLATFORM}.bin if ${BUILD_OPTEE}; then install -m 0644 ${S}/build-optee/${ATF_PLATFORM}/release/bl31.bin ${DEPLOYDIR}/${BOOT_TOOLS}/bl31-${ATF_PLATFORM}.bin-optee fi } + +# Deploy ATF for imx93 SOC revision A0 +do_deploy:append:ccimx93() { + install -Dm 0644 ${S}/build-A0/${ATF_PLATFORM}/release/bl31.bin ${DEPLOYDIR}/bl31-${ATF_PLATFORM}-A0.bin + install -Dm 0644 ${S}/build-A0/${ATF_PLATFORM}/release/bl31.bin ${DEPLOYDIR}/${BOOT_TOOLS}/bl31-${ATF_PLATFORM}-A0.bin + if ${BUILD_OPTEE}; then + install -m 0644 ${S}/build-A0-optee/${ATF_PLATFORM}/release/bl31.bin ${DEPLOYDIR}/bl31-${ATF_PLATFORM}-A0.bin-optee + install -m 0644 ${S}/build-A0-optee/${ATF_PLATFORM}/release/bl31.bin ${DEPLOYDIR}/${BOOT_TOOLS}/bl31-${ATF_PLATFORM}-A0.bin-optee + fi +} From 77755ac73c481602e0be372ee78cd7d09bf20a1f Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 2 Nov 2023 18:59:06 +0100 Subject: [PATCH 037/118] imx-boot: add makefile target to build imx93 A0 SOC revision Also, set the build of A1 SOC revision by default for ccimx93. Signed-off-by: Javier Viguera --- ...-makefile-target-to-build-A0-revisio.patch | 28 +++++++++++++++++++ .../imx-mkimage/imx-boot_1.0.bbappend | 17 +++++++++++ 2 files changed, 45 insertions(+) create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch new file mode 100644 index 000000000..f62c6dea4 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch @@ -0,0 +1,28 @@ +From: Javier Viguera +Date: Thu, 2 Nov 2023 15:03:13 +0100 +Subject: [PATCH] imx9: soc.mak: add makefile target to build A0 revision + +Signed-off-by: Javier Viguera +--- + iMX9/soc.mak | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/iMX9/soc.mak b/iMX9/soc.mak +index 97e311059df8..59352f22deb1 100644 +--- a/iMX9/soc.mak ++++ b/iMX9/soc.mak +@@ -133,6 +133,14 @@ flash_singleboot: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container.i + echo "append u-boot-atf-container.img at $$pad_cnt KB" | tee -a $(MKIMAGE_LOG); \ + dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt; + ++flash_singleboot_a0: $(MKIMG) mx93a0-ahab-container.img u-boot-spl-ddr.bin u-boot-atf-container.img ++ ./$(MKIMG) -soc IMX9 -append mx93a0-ahab-container.img -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin | tee -a $(MKIMAGE_LOG) ++ cp flash.bin boot-spl-container.img ++ @flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \ ++ pad_cnt=$$(((flashbin_size + 0x400 - 1) / 0x400)); \ ++ echo "append u-boot-atf-container.img at $$pad_cnt KB" | tee -a $(MKIMAGE_LOG); \ ++ dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt; ++ + flash_singleboot_spinand: $(MKIMG) $(AHAB_IMG) u-boot-spl-ddr.bin u-boot-atf-container-spinand.img flash_fw.bin + ./$(MKIMG) -soc IMX9 -dev nand 4K -append $(AHAB_IMG) -c -ap u-boot-spl-ddr.bin a35 $(SPL_LOAD_ADDR) -out flash.bin + cp flash.bin boot-spl-container.img diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index 19d80d9f9..056159d50 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -9,6 +9,7 @@ SRC_URI:append:ccimx8m = " \ SRC_URI:append:ccimx93 = " \ file://0001-imx9-soc.mak-capture-commands-output-into-a-log-file.patch \ + file://0002-imx9-soc.mak-add-makefile-target-to-build-A0-revisio.patch \ " # Use NXP's lf-6.1.36-2.1.0 release for ccimx93 @@ -22,6 +23,8 @@ DEPENDS += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'trustfence-sign-too UUU_BOOTLOADER = "" UUU_BOOTLOADER_TAGGED = "" +REV_OPTION:ccimx93 = "REV=A1" + compile_mx8m:append:ccimx8m() { # Create dummy DEK blob to support building with encrypted u-boot if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then @@ -29,6 +32,16 @@ compile_mx8m:append:ccimx8m() { fi } +# For SOC revision A0 we need a different ATF binary +compile_mx93:append:ccimx93() { + if [ "$target" = "flash_singleboot_a0" ]; then + ATF_MACHINE_NAME_A0="$(echo ${ATF_MACHINE_NAME} | sed -e 's,.bin,-A0.bin,g')" + bbnote "Copy ATF binary for SOC revision A0: ${ATF_MACHINE_NAME_A0}" + \cp --remove-destination ${DEPLOY_DIR_IMAGE}/${ATF_MACHINE_NAME_A0} ${BOOT_STAGING}/bl31.bin + unset ATF_MACHINE_NAME_A0 + fi +} + do_compile:append:ccimx8m() { bbnote "building ${IMX_BOOT_SOC_TARGET} - print_fit_hab" make SOC=${IMX_BOOT_SOC_TARGET} dtbs=${UBOOT_DTB_NAME} print_fit_hab @@ -87,6 +100,10 @@ do_deploy:append:ccimx93() { generate_symlinks for target in ${IMXBOOT_TARGETS}; do install -m 0644 ${BOOT_STAGING}/mkimage-${target}.log ${DEPLOYDIR}/${BOOT_TOOLS} + # Generate symlink for SOC revision A0 + if [ "$target" = "flash_singleboot_a0" ]; then + ln -sf ${BOOT_NAME}-${MACHINE}.bin-${target} ${DEPLOYDIR}/${BOOT_NAME}-${MACHINE}-A0.bin + fi done } From e9aeb051cfc5c7fbeabc188723aec0cb2b2eff00 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 2 Nov 2023 18:59:37 +0100 Subject: [PATCH 038/118] ccimx93: enable the build of A0 SOC revision bootloader Implement support to program the correct bootloader on the different installation scripts. Signed-off-by: Javier Viguera --- meta-digi-arm/conf/machine/ccimx93-dvk.conf | 5 ++++- .../conf/machine/include/ccimx93.inc | 6 +++++- .../ccimx93/install_linux_fw_sd.txt | 15 +++++++++++++- .../ccimx93/install_linux_fw_usb.txt | 15 +++++++++++++- .../ccimx93/install_linux_fw_uuu.sh | 20 ++++++++++++++----- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccimx93-dvk.conf b/meta-digi-arm/conf/machine/ccimx93-dvk.conf index ea0007aa8..858dc075e 100644 --- a/meta-digi-arm/conf/machine/ccimx93-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx93-dvk.conf @@ -56,7 +56,10 @@ IMAGE_FSTYPES ?= '${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", \ "boot.vfat recovery.vfat ext4.gz tar.bz2 sdcard.gz", d)}' # Boot artifacts to be copied from the deploy dir to the installer ZIP -BOOTABLE_ARTIFACTS = "imx-boot-ccimx93-dvk.bin" +BOOTABLE_ARTIFACTS = " \ + imx-boot-ccimx93-dvk.bin \ + imx-boot-ccimx93-dvk-A0.bin \ +" # Default overlayfs_etc mount point and type OVERLAYFS_ETC_MOUNT_POINT ?= "/mnt/data" diff --git a/meta-digi-arm/conf/machine/include/ccimx93.inc b/meta-digi-arm/conf/machine/include/ccimx93.inc index 743645367..ca450fff6 100644 --- a/meta-digi-arm/conf/machine/include/ccimx93.inc +++ b/meta-digi-arm/conf/machine/include/ccimx93.inc @@ -17,6 +17,10 @@ BOOTLOADER_IMAGE_RECIPE = "imx-boot" BOOTABLE_FILENAME = "${UBOOT_PREFIX}-${MACHINE}.bin" SDIMG_BOOTLOADER = "${DEPLOY_DIR_IMAGE}/${BOOTABLE_FILENAME}" +# Generate images for all SOC revisions (keep the override as otherwise the +# one in "use-imx-security-controller-firmware.bbclass" takes precedence) +SECO_FIRMWARE_NAME:ccimx93 = "mx93??-ahab-container.img" + DDR_FIRMWARE_NAME = " \ lpddr4_dmem_1d_v202201.bin \ lpddr4_dmem_2d_v202201.bin \ @@ -48,7 +52,7 @@ MACHINE_EXTRA_RDEPENDS += " \ # TrustFence TRUSTFENCE_SIGN_MODE = "AHAB" -IMXBOOT_TARGETS = "flash_singleboot" +IMXBOOT_TARGETS = "flash_singleboot flash_singleboot_a0" IMX_BOOT_SOC_TARGET = "iMX9" IMX_BOOT_SEEK = "32" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt index eaba3add2..baa7d2a84 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_sd.txt @@ -7,7 +7,20 @@ install_abort=0 BASEFILENAME=0 -setenv INSTALL_UBOOT_FILENAME imx-boot-##MACHINE##.bin; +# Determine U-Boot file to program basing on SOM's SOC revision +if test -z "${soc_rev}"; then + # Fallback to hardware version if soc_rev is empty + setexpr som_hv ${hwid_2} \& 78 + setexpr som_hv ${som_hv} / 8 + if test "${som_hv}" -lt "2"; then + SOCREV="-A0" + fi +else + if test "${soc_rev}" = "0x10"; then + SOCREV="-A0" + fi +fi +setenv INSTALL_UBOOT_FILENAME imx-boot-##MACHINE##${SOCREV}.bin setenv INSTALL_MMCDEV 1 if test -z "${image-name}"; then diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt index a31bd122e..e438d274e 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_usb.txt @@ -7,7 +7,20 @@ install_abort=0 BASEFILENAME=0 -setenv INSTALL_UBOOT_FILENAME imx-boot-##MACHINE##.bin; +# Determine U-Boot file to program basing on SOM's SOC revision +if test -z "${soc_rev}"; then + # Fallback to hardware version if soc_rev is empty + setexpr som_hv ${hwid_2} \& 78 + setexpr som_hv ${som_hv} / 8 + if test "${som_hv}" -lt "2"; then + SOCREV="-A0" + fi +else + if test "${soc_rev}" = "0x10"; then + SOCREV="-A0" + fi +fi +setenv INSTALL_UBOOT_FILENAME imx-boot-##MACHINE##${SOCREV}.bin setenv INSTALL_USBDEV 0 if test -z "${image-name}"; then diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh index 1ee6c2f79..fcf342151 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx93/install_linux_fw_uuu.sh @@ -93,17 +93,27 @@ if [ "${dualboot}" = "yes" ]; then DUALBOOT=true; fi -# remove redirect -uuu fb: ucmd setenv stdout serial - echo "" echo "Determining image files to use..." -# Determine U-Boot file to program basing on SOM's SOC type (linked to bus width) +# Determine U-Boot file to program basing on SOM's SOC revision if [ -z "${INSTALL_UBOOT_FILENAME}" ]; then - INSTALL_UBOOT_FILENAME="imx-boot-##MACHINE##.bin" + soc_rev="$(getenv soc_rev)" + if [ -n "${soc_rev}" ]; then + [ "${soc_rev}" = "0x10" ] && SOCREV="-A0" + else + # Fallback to hardware version if soc_rev is empty + hwid_2="$(getenv hwid_2)" + hwid_2="0x${hwid_2#0x}" + som_hv="$(((hwid_2 & 0x78) >> 3))" + [ "${som_hv}" -lt "2" ] && SOCREV="-A0" + fi + INSTALL_UBOOT_FILENAME="imx-boot-##MACHINE##${SOCREV}.bin" fi +# remove redirect +uuu fb: ucmd setenv stdout serial + # Determine linux, recovery, and rootfs image filenames to update if [ -z "${IMAGE_NAME}" ]; then IMAGE_NAME="##DEFAULT_IMAGE_NAME##" From f80b70bb72082f711775e6fb2f99d999e5520cfa Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Mon, 6 Nov 2023 15:55:59 +0100 Subject: [PATCH 039/118] ccmp1: add DT overlay for the DVK v2 This commit adds several overlays for DVK v2 and modifies the boot script to apply it based on the board_version variable. https://onedigi.atlassian.net/browse/DEL-8746 Signed-off-by: Arturo Buzarra --- meta-digi-arm/conf/machine/ccmp13-dvk.conf | 1 + meta-digi-arm/conf/machine/ccmp15-dvk.conf | 1 + .../recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt | 5 +++++ .../recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt | 5 +++++ 4 files changed, 12 insertions(+) diff --git a/meta-digi-arm/conf/machine/ccmp13-dvk.conf b/meta-digi-arm/conf/machine/ccmp13-dvk.conf index bda7d0664..27e5699df 100644 --- a/meta-digi-arm/conf/machine/ccmp13-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp13-dvk.conf @@ -43,6 +43,7 @@ STM32MP_KERNEL_DEVICETREE:ccmp13-dvk += " \ _ov_board_mikroe-gyro-click_ccmp13-dvk.dtbo \ _ov_board_mikroe-i2c-to-spi-click_ccmp13-dvk.dtbo \ _ov_board_pwm8_ccmp13-dvk.dtbo \ + _ov_board_v2_ccmp13-dvk.dtbo \ _ov_som_bt_ccmp13.dtbo \ _ov_som_bt_test_ccmp13.dtbo \ _ov_som_wifi_ccmp13.dtbo \ diff --git a/meta-digi-arm/conf/machine/ccmp15-dvk.conf b/meta-digi-arm/conf/machine/ccmp15-dvk.conf index c2631c2b1..bd6ce385f 100644 --- a/meta-digi-arm/conf/machine/ccmp15-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp15-dvk.conf @@ -49,6 +49,7 @@ STM32MP_KERNEL_DEVICETREE:ccmp15-dvk += " \ _ov_board_mikroe-gyro-click_ccmp15-dvk.dtbo \ _ov_board_mikroe-i2c-to-spi-click_ccmp15-dvk.dtbo \ _ov_board_v1_ccmp15-dvk.dtbo \ + _ov_board_v2_ccmp15-dvk.dtbo \ _ov_som_bt_ccmp15.dtbo \ _ov_som_bt_test_ccmp15.dtbo \ _ov_som_mca_ccmp15.dtbo \ diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt index f73432685..de798cf2f 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt @@ -66,6 +66,11 @@ if test "${module_has_wifi}" = "1" && test -z "${disable_wifi}"; then setenv overlays _ov_som_wifi_ccmp13.dtbo,${overlays} fi +# Apply DVKv2 overlay if the board_version is 2 +if test "${board_version}" -eq "2"; then + setenv overlays _ov_board_v2_ccmp13-dvk.dtbo,${overlays} +fi + if test "${boot_device}" = "mmc"; then dboot linux mmc else diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt index f881120c3..fad34695e 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt @@ -77,6 +77,11 @@ if test -z "${board_version}" || test "${board_version}" -eq "1"; then setenv overlays _ov_board_v1_ccmp15-dvk.dtbo,${overlays} fi +# Apply DVKv2 overlay if the board_version is 2 +if test "${board_version}" -eq "2"; then + setenv overlays _ov_board_v2_ccmp15-dvk.dtbo,${overlays} +fi + if test "${boot_device}" = "mmc"; then dboot linux mmc else From 01c5b1f329665279471778bb6aaa2a40b9fb4777 Mon Sep 17 00:00:00 2001 From: Francisco Gil Date: Tue, 7 Nov 2023 12:58:45 +0100 Subject: [PATCH 040/118] mount: remove dependencies from fw_getenv in mount script https://onedigi.atlassian.net/browse/DEL-8582 Signed-off-by: Francisco Gil --- .../udev/udev-extraconf/mount_digiparts.sh | 59 ++++++++++++++++--- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/meta-digi-arm/recipes-core/udev/udev-extraconf/mount_digiparts.sh b/meta-digi-arm/recipes-core/udev/udev-extraconf/mount_digiparts.sh index f72b6da8c..e13cf8593 100644 --- a/meta-digi-arm/recipes-core/udev/udev-extraconf/mount_digiparts.sh +++ b/meta-digi-arm/recipes-core/udev/udev-extraconf/mount_digiparts.sh @@ -17,6 +17,47 @@ BASE_INIT="$(readlink -f "@base_sbindir@/init")" BASE_INIT_ORIG="$(readlink -f "@base_sbindir@/init.orig")" INIT_SYSTEMD="@systemd_unitdir@/systemd" +EMMCROOTFS="$(grep -qs 'root=PARTUUID.*' /proc/cmdline 2>/dev/null && echo 1)" + +get_active_system() { + if [ -z "${EMMCROOTFS}" ]; then + # For a read-only filesystem this will be /dev/ubiblock0_X + # For an ubifs filesystem this will be ubiX:rootfs_X + ACTIVE_SYSTEM="$(sed -e 's/^.*root=\([^ ]*\) .*$/\1/' /proc/cmdline 2>/dev/null)" + if ! echo "${ACTIVE_SYSTEM}" | grep -qs rootfs; then + # From /dev/ubiblock0_X to /dev/ubi0_X + ACTIVE_SYSTEM="/dev/ubi${ACTIVE_SYSTEM#/dev/ubiblock}" + #Volume ID: 5 (on ubi0) + #Type: dynamic + #Alignment: 1 + #Size: 1817 LEBs (230715392 bytes, 220.0 MiB) + #State: OK + #Name: rootfs_b + #Character device major/minor: 242:6 + ACTIVE_SYSTEM="$(ubinfo "${ACTIVE_SYSTEM}" | sed -ne '/^Name/s,.* \([^[:blank:]]\+\)$,\1,g;T;p')" + fi + else + local MMCROOT_DEV + + MMCROOT_DEV="$(stat -c%D /)" + + for label in /dev/disk/by-partlabel/*; do + if [ "$(stat -c"%02t%02T" "$(realpath "${label}")")" = "${MMCROOT_DEV}" ]; then + ACTIVE_SYSTEM="$(basename "${label}")" + break + fi + done + fi + + if [ -z "${ACTIVE_SYSTEM}" ]; then + echo "[ERROR] Unable to get active system." + return 1 + fi + + ACTIVE_SYSTEM="${ACTIVE_SYSTEM##*_}" + + return 0 +} if [ "${SUBSYSTEM}" = "block" ]; then PARTNAME="${ID_PART_ENTRY_NAME}" @@ -29,7 +70,7 @@ elif [ "${SUBSYSTEM}" = "ubi" ]; then # called the same as the MTD partition. Do nothing for UBI events if the # MTD partition is called the same, as they are already handled by the # "mtd" subsystem rule - result="$(grep '\"${PARTNAME}\"$' /proc/mtd)" + result="$(grep \"${PARTNAME}\"$ /proc/mtd)" [ -n "${result}" ] && exit 0 fi @@ -48,14 +89,14 @@ if grep -qs "${MOUNTPOINT}" /proc/mounts; then exit 0 fi -DUALBOOT_MODE="$(fw_printenv -n dualboot 2>/dev/null)" -if [ "${DUALBOOT_MODE}" = "yes" ]; then - if [ "${PARTNAME}" = "linux_a" ] || [ "${PARTNAME}" = "linux_b" ]; then - ACTIVE_SYSTEM="$(fw_printenv -n active_system 2>/dev/null)" - if [ "${ACTIVE_SYSTEM}" != "${PARTNAME}" ]; then - logger "Skip mount partition '${PARTNAME}', because it is not the active system" - exit 0 - fi +# Get from proc/cmdline the active system "a" or "b" +get_active_system || exit + +if [ "${PARTNAME}" = "linux_a" ] || [ "${PARTNAME}" = "linux_b" ]; then + PARTINDEX="${PARTNAME#linux_}" + if [ "${ACTIVE_SYSTEM}" != "${PARTINDEX}" ]; then + logger "Skip mount partition '${PARTNAME}', because it is not the active system" + exit 0 fi fi From 7c6967d5d66caa979ed894fd46fbb2f36587cd13 Mon Sep 17 00:00:00 2001 From: Francisco Gil Date: Tue, 7 Nov 2023 12:59:52 +0100 Subject: [PATCH 041/118] dualboot: avoid the mount of alternative rootfs partition In a dualboot system the alternative rootfs was mounted by default. Signed-off-by: Francisco Gil --- .../recipes-core/udev/udev-extraconf/automount.rules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules b/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules index 8b3e3384f..13b52a676 100644 --- a/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules +++ b/meta-digi-arm/recipes-core/udev/udev-extraconf/automount.rules @@ -18,8 +18,8 @@ SUBSYSTEM=="block", ENV{ID_PART_ENTRY_NAME}=="linux*|update*|data*", ACTION=="ad SUBSYSTEM=="mtd", ATTRS{name}=="linux*|update*|data*", ACTION=="add", RUN+="/etc/udev/scripts/mount_digiparts.sh", GOTO="automount_rules_end" SUBSYSTEM=="ubi", KERNEL=="ubi*", ATTRS{name}=="linux*|update*|data*", ACTION=="add", RUN+="/etc/udev/scripts/mount_digiparts.sh", GOTO="automount_rules_end" -# Avoid mounting recovery partition -SUBSYSTEM=="block", ENV{ID_PART_ENTRY_NAME}=="recovery*", ACTION=="add", GOTO="automount_rules_end" +# Avoid mounting recovery partition & alternative rootfs partition +SUBSYSTEM=="block", ENV{ID_PART_ENTRY_NAME}=="recovery*|rootfs*", ACTION=="add", GOTO="automount_rules_end" SUBSYSTEM=="mtd", ATTRS{name}=="recovery*", ACTION=="add", GOTO="automount_rules_end" # Media automounting From 66af49ef9e4d9c3639d342df2dfa7bbd938e7529 Mon Sep 17 00:00:00 2001 From: Francisco Gil Date: Fri, 10 Nov 2023 12:55:41 +0100 Subject: [PATCH 042/118] update firmware: some improvements in update firmware script Signed-off-by: Francisco Gil --- .../recipes-digi/dualboot/dualboot/update-firmware | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meta-digi-dey/recipes-digi/dualboot/dualboot/update-firmware b/meta-digi-dey/recipes-digi/dualboot/dualboot/update-firmware index 4fbabc52a..136109d65 100755 --- a/meta-digi-dey/recipes-digi/dualboot/dualboot/update-firmware +++ b/meta-digi-dey/recipes-digi/dualboot/dualboot/update-firmware @@ -77,8 +77,8 @@ get_active_system() { MMCROOT_DEV="$(stat -c%D /)" for label in /dev/disk/by-partlabel/*; do - if [ "$(stat -c"%02t%02T" $(realpath ${label}))" = "${MMCROOT_DEV}" ]; then - ACTIVE_SYSTEM="$(basename ${label})" + if [ "$(stat -c"%02t%02T" "$(realpath "${label}")")" = "${MMCROOT_DEV}" ]; then + ACTIVE_SYSTEM="$(basename "${label}")" break fi done @@ -89,7 +89,7 @@ get_active_system() { return 1 fi - ACTIVE_SYSTEM="$(echo ${ACTIVE_SYSTEM} | cut -d_ -f2)" + ACTIVE_SYSTEM="${ACTIVE_SYSTEM##*_}" return 0 } From 33a93ccae436cc818adcc22a34fd57554f657d68 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Tue, 24 Oct 2023 14:29:35 +0200 Subject: [PATCH 043/118] Copy lvgl-demo-fb recipe from meta-openebedded master branch https://onedigi.atlassian.net/browse/DEL-8740 Signed-off-by: Gabriel Valcazar --- .../recipes-graphics/lvgl/lv-drivers.inc | 48 +++++++++++++++++++ .../lvgl/lvgl-demo-fb_8.3.0.bb | 46 ++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc create mode 100644 meta-digi-dey/recipes-graphics/lvgl/lvgl-demo-fb_8.3.0.bb diff --git a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc new file mode 100644 index 000000000..6cfb7fa07 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc @@ -0,0 +1,48 @@ +PACKAGECONFIG[drm] = ",,libdrm" +PACKAGECONFIG[fbdev] = ",," +PACKAGECONFIG[sdl] = ",,virtual/libsdl2" +PACKAGECONFIG[wayland] = ",,libxkbcommon wayland" + +LVGL_CONFIG_USE_DRM = "${@bb.utils.contains('PACKAGECONFIG', 'drm', '1', '0', d)}" +LVGL_CONFIG_DRM_CARD ?= "/dev/dri/card0" + +LVGL_CONFIG_USE_EVDEV = "${@bb.utils.contains_any('PACKAGECONFIG', 'drm fbdev', '1', '0', d)}" +LVGL_CONFIG_EVDEV_INPUT ?= "/dev/input/touchscreen" + +LVGL_CONFIG_USE_FBDEV = "${@bb.utils.contains('PACKAGECONFIG', 'fbdev', '1', '0', d)}" + +LVGL_CONFIG_USE_SDL = "${@bb.utils.contains('PACKAGECONFIG', 'sdl', '1', '0', d)}" + +LVGL_CONFIG_USE_WAYLAND = "${@bb.utils.contains('PACKAGECONFIG', 'wayland', '1', '0', d)}" +LVGL_CONFIG_WAYLAND_HOR_RES ?= "480" +LVGL_CONFIG_WAYLAND_VER_RES ?= "320" + +ALLOW_EMPTY:${PN} = "1" + +EXTRA_OECMAKE += "-Dinstall:BOOL=ON -DLIB_INSTALL_DIR=${baselib}" + +do_configure:append() { + # If there is a configuration template, start from that + [ -r "${S}/lv_drv_conf_template.h" ] && cp -Lv "${S}/lv_drv_conf_template.h" "${S}/lv_drv_conf.h" + + # Configure the software using sed + sed -e "s|#if 0 .*Set it to \"1\" to enable the content.*|#if 1 // Enabled by ${PN}|g" \ + \ + -e "s|\(^# define USE_DRM \).*|# define USE_DRM ${LVGL_CONFIG_USE_DRM}|g" \ + -e "s|\(^# define DRM_CARD \).*|# define DRM_CARD \"${LVGL_CONFIG_DRM_CARD}\"|g" \ + \ + -e "s|\(^# define USE_EVDEV \).*|# define USE_EVDEV ${LVGL_CONFIG_USE_EVDEV}|g" \ + -e "s|\(^# define EVDEV_NAME \).*|# define EVDEV_NAME \"${LVGL_CONFIG_EVDEV_INPUT}\"|g" \ + \ + -e "s|\(^# define USE_FBDEV \).*|# define USE_FBDEV ${LVGL_CONFIG_USE_FBDEV}|g" \ + \ + -e "s|\(^# define USE_SDL \).*|# define USE_SDL ${LVGL_CONFIG_USE_SDL}|g" \ + -e "s|\(^# define USE_SDL_GPU \).*|# define USE_SDL_GPU 1|g" \ + -e "s|\(^# define SDL_DOUBLE_BUFFERED \).*|# define SDL_DOUBLE_BUFFERED 1|g" \ + \ + -e "s|\(^# define USE_WAYLAND \).*|# define USE_WAYLAND ${LVGL_CONFIG_USE_WAYLAND}|g" \ + -e "s|\(^ *# *define *WAYLAND_HOR_RES *\).*|\1${LVGL_CONFIG_WAYLAND_HOR_RES}|g" \ + -e "s|\(^ *# *define *WAYLAND_VER_RES *\).*|\1${LVGL_CONFIG_WAYLAND_VER_RES}|g" \ + \ + -i "${S}/lv_drv_conf.h" +} diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo-fb_8.3.0.bb b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo-fb_8.3.0.bb new file mode 100644 index 000000000..32f833a02 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo-fb_8.3.0.bb @@ -0,0 +1,46 @@ +SUMMARY = "LVGL Demo Application for Framebuffer" +HOMEPAGE = "https://github.com/lvgl/lv_port_linux_frame_buffer" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=802d3d83ae80ef5f343050bf96cce3a4 \ + file://lv_drivers/LICENSE;md5=d6fc0df890c5270ef045981b516bb8f2 \ + file://lvgl/LICENCE.txt;md5=bf1198c89ae87f043108cea62460b03a" + +SRC_URI = "gitsm://github.com/lvgl/lv_port_linux_frame_buffer.git;branch=master;protocol=https" +SRCREV = "adf2c4490e17a1b9ec1902cc412a24b3b8235c8e" + +EXTRA_OEMAKE = "DESTDIR=${D}" + +PACKAGECONFIG ??= "drm" +require lv-drivers.inc + +inherit cmake + +S = "${WORKDIR}/git" + +TARGET_CFLAGS += "-I${STAGING_INCDIR}/libdrm" + +do_configure:prepend() { + if [ "${LVGL_CONFIG_USE_DRM}" -eq 1 ] ; then + # Add libdrm build dependency + sed -i '/^target_link_libraries/ s@lvgl::drivers@& drm@' "${S}/CMakeLists.txt" + # Switch from fbdev to drm usage + sed -i 's@fbdev@drm@g' "${S}/main.c" + # Pull resolution from DRM instead of hardcoding it + sed -i '/disp_drv.hor_res/ d' "${S}/main.c" + sed -i '/disp_drv.ver_res/ s@disp_drv.ver_res.*@drm_get_sizes(\&disp_drv.hor_res, \&disp_drv.ver_res, NULL);@' "${S}/main.c" + fi + + if [ "${LVGL_CONFIG_USE_SDL}" -eq 1 ] ; then + # Add libsdl build dependency + sed -i '/^target_link_libraries/ s@lvgl::drivers@& SDL2@' "${S}/CMakeLists.txt" + # Switch from fbdev to sdl usage + sed -i 's@fbdev_flush@sdl_display_flush@g' "${S}/main.c" + sed -i 's@lv_drivers/display/fbdev.h@lv_drivers/sdl/sdl.h@g' "${S}/main.c" + sed -i 's@fbdev@sdl@g' "${S}/main.c" + fi +} + +do_install:append() { + install -d ${D}${bindir} + install -m 0755 ${B}/lvgl_fb ${D}${bindir}/ +} From c0789c416bf1e014161f22bfc1f94b2bdecb6ce7 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Mon, 6 Nov 2023 14:25:00 +0100 Subject: [PATCH 044/118] lvgl-demo-fb: generalize for any backend and add improvements Rename the recipe to lvgl-demo to reflect the generalization and select the most appropriate backend for each platform. Aside from making sure each backend builds and runs fine, add some usability improvements: * Specify the mouse as the default evdev device instead of the touchscreen * Use common resolution variables to be able to configure the app's dimensions easily https://onedigi.atlassian.net/browse/DEL-8740 Signed-off-by: Gabriel Valcazar --- .../recipes-graphics/lvgl/lv-drivers.inc | 12 +- .../lvgl/lvgl-demo-fb_8.3.0.bb | 46 ---- ...ake-demo-compatible-with-any-backend.patch | 204 ++++++++++++++++++ .../0002-Miscellaneous-improvements.patch | 87 ++++++++ .../recipes-graphics/lvgl/lvgl-demo_8.3.0.bb | 57 +++++ 5 files changed, 353 insertions(+), 53 deletions(-) delete mode 100644 meta-digi-dey/recipes-graphics/lvgl/lvgl-demo-fb_8.3.0.bb create mode 100644 meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0001-Make-demo-compatible-with-any-backend.patch create mode 100644 meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0002-Miscellaneous-improvements.patch create mode 100644 meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb diff --git a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc index 6cfb7fa07..c10856d0a 100644 --- a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc +++ b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc @@ -7,15 +7,15 @@ LVGL_CONFIG_USE_DRM = "${@bb.utils.contains('PACKAGECONFIG', 'drm', '1', '0', d) LVGL_CONFIG_DRM_CARD ?= "/dev/dri/card0" LVGL_CONFIG_USE_EVDEV = "${@bb.utils.contains_any('PACKAGECONFIG', 'drm fbdev', '1', '0', d)}" -LVGL_CONFIG_EVDEV_INPUT ?= "/dev/input/touchscreen" +LVGL_CONFIG_EVDEV_INPUT ?= "/dev/input/mouse0" LVGL_CONFIG_USE_FBDEV = "${@bb.utils.contains('PACKAGECONFIG', 'fbdev', '1', '0', d)}" LVGL_CONFIG_USE_SDL = "${@bb.utils.contains('PACKAGECONFIG', 'sdl', '1', '0', d)}" LVGL_CONFIG_USE_WAYLAND = "${@bb.utils.contains('PACKAGECONFIG', 'wayland', '1', '0', d)}" -LVGL_CONFIG_WAYLAND_HOR_RES ?= "480" -LVGL_CONFIG_WAYLAND_VER_RES ?= "320" +LVGL_CONFIG_HOR_RES ?= "800" +LVGL_CONFIG_VER_RES ?= "480" ALLOW_EMPTY:${PN} = "1" @@ -37,12 +37,10 @@ do_configure:append() { -e "s|\(^# define USE_FBDEV \).*|# define USE_FBDEV ${LVGL_CONFIG_USE_FBDEV}|g" \ \ -e "s|\(^# define USE_SDL \).*|# define USE_SDL ${LVGL_CONFIG_USE_SDL}|g" \ - -e "s|\(^# define USE_SDL_GPU \).*|# define USE_SDL_GPU 1|g" \ - -e "s|\(^# define SDL_DOUBLE_BUFFERED \).*|# define SDL_DOUBLE_BUFFERED 1|g" \ \ -e "s|\(^# define USE_WAYLAND \).*|# define USE_WAYLAND ${LVGL_CONFIG_USE_WAYLAND}|g" \ - -e "s|\(^ *# *define *WAYLAND_HOR_RES *\).*|\1${LVGL_CONFIG_WAYLAND_HOR_RES}|g" \ - -e "s|\(^ *# *define *WAYLAND_VER_RES *\).*|\1${LVGL_CONFIG_WAYLAND_VER_RES}|g" \ + -e "s|\(^#define *LV_DRV_DISP_HOR_RES *\).*|\1${LVGL_CONFIG_HOR_RES}|g" \ + -e "s|\(^#define *LV_DRV_DISP_VER_RES *\).*|\1${LVGL_CONFIG_VER_RES}|g" \ \ -i "${S}/lv_drv_conf.h" } diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo-fb_8.3.0.bb b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo-fb_8.3.0.bb deleted file mode 100644 index 32f833a02..000000000 --- a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo-fb_8.3.0.bb +++ /dev/null @@ -1,46 +0,0 @@ -SUMMARY = "LVGL Demo Application for Framebuffer" -HOMEPAGE = "https://github.com/lvgl/lv_port_linux_frame_buffer" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=802d3d83ae80ef5f343050bf96cce3a4 \ - file://lv_drivers/LICENSE;md5=d6fc0df890c5270ef045981b516bb8f2 \ - file://lvgl/LICENCE.txt;md5=bf1198c89ae87f043108cea62460b03a" - -SRC_URI = "gitsm://github.com/lvgl/lv_port_linux_frame_buffer.git;branch=master;protocol=https" -SRCREV = "adf2c4490e17a1b9ec1902cc412a24b3b8235c8e" - -EXTRA_OEMAKE = "DESTDIR=${D}" - -PACKAGECONFIG ??= "drm" -require lv-drivers.inc - -inherit cmake - -S = "${WORKDIR}/git" - -TARGET_CFLAGS += "-I${STAGING_INCDIR}/libdrm" - -do_configure:prepend() { - if [ "${LVGL_CONFIG_USE_DRM}" -eq 1 ] ; then - # Add libdrm build dependency - sed -i '/^target_link_libraries/ s@lvgl::drivers@& drm@' "${S}/CMakeLists.txt" - # Switch from fbdev to drm usage - sed -i 's@fbdev@drm@g' "${S}/main.c" - # Pull resolution from DRM instead of hardcoding it - sed -i '/disp_drv.hor_res/ d' "${S}/main.c" - sed -i '/disp_drv.ver_res/ s@disp_drv.ver_res.*@drm_get_sizes(\&disp_drv.hor_res, \&disp_drv.ver_res, NULL);@' "${S}/main.c" - fi - - if [ "${LVGL_CONFIG_USE_SDL}" -eq 1 ] ; then - # Add libsdl build dependency - sed -i '/^target_link_libraries/ s@lvgl::drivers@& SDL2@' "${S}/CMakeLists.txt" - # Switch from fbdev to sdl usage - sed -i 's@fbdev_flush@sdl_display_flush@g' "${S}/main.c" - sed -i 's@lv_drivers/display/fbdev.h@lv_drivers/sdl/sdl.h@g' "${S}/main.c" - sed -i 's@fbdev@sdl@g' "${S}/main.c" - fi -} - -do_install:append() { - install -d ${D}${bindir} - install -m 0755 ${B}/lvgl_fb ${D}${bindir}/ -} diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0001-Make-demo-compatible-with-any-backend.patch b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0001-Make-demo-compatible-with-any-backend.patch new file mode 100644 index 000000000..985c79bc0 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0001-Make-demo-compatible-with-any-backend.patch @@ -0,0 +1,204 @@ +From: Gabriel Valcazar +Date: Mon, 6 Nov 2023 13:45:27 +0100 +Subject: [PATCH] Make demo compatible with any backend + +Apply changes so the demo builds and runs with any of the 4 major backends +(wayland, sdl, drm and fbdev) + +Signed-off-by: Gabriel Valcazar +--- + main.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 128 insertions(+), 14 deletions(-) + +diff --git a/main.c b/main.c +index 33cd734..bb0248a 100644 +--- a/main.c ++++ b/main.c +@@ -1,12 +1,23 @@ + #include "lvgl/lvgl.h" + #include "lvgl/demos/lv_demos.h" + #include "lv_drivers/display/fbdev.h" ++#include "lv_drivers/display/drm.h" + #include "lv_drivers/indev/evdev.h" ++#include "lv_drivers/sdl/sdl.h" ++#include "lv_drivers/wayland/wayland.h" ++ ++#if USE_SDL ++#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ ++#include ++#endif ++ + #include + #include + #include + #include + ++static void backend_init(void); ++ + #define DISP_BUF_SIZE (128 * 1024) + + int main(void) +@@ -14,8 +25,78 @@ int main(void) + /*LittlevGL init*/ + lv_init(); + +- /*Linux frame buffer device init*/ +- fbdev_init(); ++ backend_init(); ++ ++ /*Create a Demo*/ ++ lv_demo_widgets(); ++ ++ /*Handle LitlevGL tasks (tickless mode)*/ ++ while(1) { ++ lv_timer_handler(); ++ usleep(5000); ++ } ++ ++ return 0; ++} ++ ++static void backend_init(void) ++{ ++#if USE_WAYLAND ++ lv_wayland_init(); ++ ++ /* Create a display */ ++ lv_disp_t * disp = lv_wayland_create_window(800, 480, "lvgl wayland demo", NULL /*close_cb*/); ++#elif USE_SDL ++ sdl_init(); ++ ++ /*A small buffer for LittlevGL to draw the screen's content*/ ++ static lv_color_t buf[SDL_HOR_RES * 100]; ++ ++ /*Initialize a descriptor for the buffer*/ ++ static lv_disp_draw_buf_t disp_buf; ++ lv_disp_draw_buf_init(&disp_buf, buf, NULL, SDL_HOR_RES * 100); ++ ++ /*Initialize and register a display driver*/ ++ static lv_disp_drv_t disp_drv; ++ lv_disp_drv_init(&disp_drv); ++ disp_drv.draw_buf = &disp_buf; ++ disp_drv.flush_cb = sdl_display_flush; ++ disp_drv.hor_res = SDL_HOR_RES; ++ disp_drv.ver_res = SDL_VER_RES; ++ lv_disp_drv_register(&disp_drv); ++ ++ lv_group_t * g = lv_group_create(); ++ lv_group_set_default(g); ++ ++ static lv_indev_drv_t indev_drv_1; ++ lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/ ++ indev_drv_1.type = LV_INDEV_TYPE_POINTER; ++ ++ /*This function will be called periodically (by the library) to get the mouse position and state*/ ++ indev_drv_1.read_cb = sdl_mouse_read; ++ lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); ++ ++ /*Set a cursor for the mouse*/ ++ LV_IMG_DECLARE(mouse_cursor_icon) ++ lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */ ++ lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/ ++ lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/ ++ ++ static lv_indev_drv_t indev_drv_2; ++ lv_indev_drv_init(&indev_drv_2); /*Basic initialization*/ ++ indev_drv_2.type = LV_INDEV_TYPE_KEYPAD; ++ indev_drv_2.read_cb = sdl_keyboard_read; ++ lv_indev_t *kb_indev = lv_indev_drv_register(&indev_drv_2); ++ lv_indev_set_group(kb_indev, g); ++ ++ static lv_indev_drv_t indev_drv_3; ++ lv_indev_drv_init(&indev_drv_3); /*Basic initialization*/ ++ indev_drv_3.type = LV_INDEV_TYPE_ENCODER; ++ indev_drv_3.read_cb = sdl_mousewheel_read; ++ lv_indev_t * enc_indev = lv_indev_drv_register(&indev_drv_3); ++ lv_indev_set_group(enc_indev, g); ++#elif USE_DRM ++ drm_init(); + + /*A small buffer for LittlevGL to draw the screen's content*/ + static lv_color_t buf[DISP_BUF_SIZE]; +@@ -28,12 +109,20 @@ int main(void) + static lv_disp_drv_t disp_drv; + lv_disp_drv_init(&disp_drv); + disp_drv.draw_buf = &disp_buf; +- disp_drv.flush_cb = fbdev_flush; +- disp_drv.hor_res = 800; +- disp_drv.ver_res = 480; ++ disp_drv.flush_cb = drm_flush; ++ lv_coord_t drm_width, drm_height; ++ /* get size from DRM/KMS backend */ ++ uint32_t drm_dpi; ++ drm_get_sizes(&drm_width, &drm_height, &drm_dpi); ++ disp_drv.hor_res = drm_width; ++ disp_drv.ver_res = drm_height; + lv_disp_drv_register(&disp_drv); + + evdev_init(); ++ ++ lv_group_t * g = lv_group_create(); ++ lv_group_set_default(g); ++ + static lv_indev_drv_t indev_drv_1; + lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/ + indev_drv_1.type = LV_INDEV_TYPE_POINTER; +@@ -42,24 +131,49 @@ int main(void) + indev_drv_1.read_cb = evdev_read; + lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); + +- + /*Set a cursor for the mouse*/ + LV_IMG_DECLARE(mouse_cursor_icon) + lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */ + lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/ + lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/ ++#elif USE_FBDEV ++ fbdev_init(); + ++ /*A small buffer for LittlevGL to draw the screen's content*/ ++ static lv_color_t buf[DISP_BUF_SIZE]; + +- /*Create a Demo*/ +- lv_demo_widgets(); ++ /*Initialize a descriptor for the buffer*/ ++ static lv_disp_draw_buf_t disp_buf; ++ lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE); + +- /*Handle LitlevGL tasks (tickless mode)*/ +- while(1) { +- lv_timer_handler(); +- usleep(5000); +- } ++ /*Initialize and register a display driver*/ ++ static lv_disp_drv_t disp_drv; ++ lv_disp_drv_init(&disp_drv); ++ disp_drv.draw_buf = &disp_buf; ++ disp_drv.flush_cb = fbdev_flush; ++ disp_drv.hor_res = 800; ++ disp_drv.ver_res = 480; ++ lv_disp_drv_register(&disp_drv); + +- return 0; ++ evdev_init(); ++ ++ lv_group_t * g = lv_group_create(); ++ lv_group_set_default(g); ++ ++ static lv_indev_drv_t indev_drv_1; ++ lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/ ++ indev_drv_1.type = LV_INDEV_TYPE_POINTER; ++ ++ /*This function will be called periodically (by the library) to get the mouse position and state*/ ++ indev_drv_1.read_cb = evdev_read; ++ lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); ++ ++ /*Set a cursor for the mouse*/ ++ LV_IMG_DECLARE(mouse_cursor_icon) ++ lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */ ++ lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/ ++ lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/ ++#endif + } + + /*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/ diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0002-Miscellaneous-improvements.patch b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0002-Miscellaneous-improvements.patch new file mode 100644 index 000000000..5f11761cf --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo/0002-Miscellaneous-improvements.patch @@ -0,0 +1,87 @@ +From: Gabriel Valcazar +Date: Wed, 8 Nov 2023 13:25:25 +0100 +Subject: [PATCH] Miscellaneous improvements: + + * Change LV_COLOR_DEPTH from 32 to 16 to fix output on fbdev backend + * Increase DISP_BUF_SIZE to 8 MiB to improve performance on fbdev and drm + backends + * Create common macros for app dimensions + +Signed-off-by: Gabriel Valcazar +--- + lv_conf.h | 2 +- + lv_drv_conf.h | 6 ++++-- + main.c | 9 +++++---- + 3 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/lv_conf.h b/lv_conf.h +index 3137b1a..3f36997 100644 +--- a/lv_conf.h ++++ b/lv_conf.h +@@ -30,7 +30,7 @@ extern uint32_t custom_tick_get(void); + *====================*/ + + /*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +-#define LV_COLOR_DEPTH 32 ++#define LV_COLOR_DEPTH 16 + + /*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ + #define LV_COLOR_16_SWAP 0 +diff --git a/lv_drv_conf.h b/lv_drv_conf.h +index d40e703..554eba9 100644 +--- a/lv_drv_conf.h ++++ b/lv_drv_conf.h +@@ -32,6 +32,8 @@ + #define LV_DRV_DISP_INCLUDE /*Dummy include by default*/ + #define LV_DRV_DISP_CMD_DATA(val) /*pin_x_set(val)*/ /*Set the command/data pin to 'val'*/ + #define LV_DRV_DISP_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/ ++#define LV_DRV_DISP_HOR_RES 800 ++#define LV_DRV_DISP_VER_RES 480 + + /*--------- + * SPI +@@ -95,8 +97,8 @@ + #endif + + #if USE_SDL || USE_SDL_GPU +-# define SDL_HOR_RES 480 +-# define SDL_VER_RES 320 ++# define SDL_HOR_RES LV_DRV_DISP_HOR_RES ++# define SDL_VER_RES LV_DRV_DISP_VER_RES + + /* Scale window by this factor (useful when simulating small screens) */ + # define SDL_ZOOM 1 +diff --git a/main.c b/main.c +index bb0248a..f3fb69e 100644 +--- a/main.c ++++ b/main.c +@@ -18,7 +18,8 @@ + + static void backend_init(void); + +-#define DISP_BUF_SIZE (128 * 1024) ++/* Originally 128 KiB, increase to 8 MiB to improve performance */ ++#define DISP_BUF_SIZE (8 * 1024 * 1024) + + int main(void) + { +@@ -45,7 +46,7 @@ static void backend_init(void) + lv_wayland_init(); + + /* Create a display */ +- lv_disp_t * disp = lv_wayland_create_window(800, 480, "lvgl wayland demo", NULL /*close_cb*/); ++ lv_disp_t * disp = lv_wayland_create_window(LV_DRV_DISP_HOR_RES, LV_DRV_DISP_VER_RES, "lvgl wayland demo", NULL /*close_cb*/); + #elif USE_SDL + sdl_init(); + +@@ -151,8 +152,8 @@ static void backend_init(void) + lv_disp_drv_init(&disp_drv); + disp_drv.draw_buf = &disp_buf; + disp_drv.flush_cb = fbdev_flush; +- disp_drv.hor_res = 800; +- disp_drv.ver_res = 480; ++ disp_drv.hor_res = LV_DRV_DISP_HOR_RES; ++ disp_drv.ver_res = LV_DRV_DISP_VER_RES; + lv_disp_drv_register(&disp_drv); + + evdev_init(); diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb new file mode 100644 index 000000000..73224d4dd --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb @@ -0,0 +1,57 @@ +SUMMARY = "LVGL Demo Application" +HOMEPAGE = "https://github.com/lvgl/lv_port_linux_frame_buffer" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=802d3d83ae80ef5f343050bf96cce3a4 \ + file://lv_drivers/LICENSE;md5=d6fc0df890c5270ef045981b516bb8f2 \ + file://lvgl/LICENCE.txt;md5=bf1198c89ae87f043108cea62460b03a" + +SRC_URI = " \ + gitsm://github.com/lvgl/lv_port_linux_frame_buffer.git;branch=master;protocol=https \ + file://0001-Make-demo-compatible-with-any-backend.patch \ + file://0002-Miscellaneous-improvements.patch \ +" +SRCREV = "adf2c4490e17a1b9ec1902cc412a24b3b8235c8e" + +EXTRA_OEMAKE = "DESTDIR=${D}" + +# By default, use wayland backend if possible. +# If unavailable, fall back to a secondary backend +MINIMAL_BACKEND ?= "fbdev" +MINIMAL_BACKEND:imxdrm = "drm" +MINIMAL_BACKEND:ccmp15 = "sdl" +PACKAGECONFIG = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '${MINIMAL_BACKEND}', d)}" + +require lv-drivers.inc + +inherit cmake + +S = "${WORKDIR}/git" + +TARGET_CFLAGS += "-I${STAGING_INCDIR}/libdrm" + +# Change DRM card used for i.MX8-based platforms +LVGL_CONFIG_DRM_CARD:mx8-generic-bsp = "/dev/dri/card1" + +do_configure:prepend() { + if [ "${LVGL_CONFIG_USE_DRM}" -eq 1 ] ; then + # Add libdrm build dependency + sed -i '/^target_link_libraries/ s@lvgl::drivers@& drm@' "${S}/CMakeLists.txt" + fi + + if [ "${LVGL_CONFIG_USE_SDL}" -eq 1 ] ; then + # Add libsdl build dependency + sed -i '/^target_link_libraries/ s@lvgl::drivers@& SDL2@' "${S}/CMakeLists.txt" + fi + + if [ "${LVGL_CONFIG_USE_WAYLAND}" -eq 1 ] ; then + # Add wayland build dependencies + sed -i '/^target_link_libraries/ s@lvgl::drivers@& wayland-client wayland-cursor xkbcommon@' "${S}/CMakeLists.txt" + fi +} + +do_install:append() { + install -d ${D}${bindir} + install -m 0755 ${B}/lvgl_fb ${D}${bindir}/lvgl_demo +} + +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x|ccimx93|ccmp15)" From 2a015f3f8744ce43a2b3d3aaa9ae059776a177f8 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Wed, 25 Oct 2023 13:19:52 +0200 Subject: [PATCH 045/118] Add support for dey-image-lvgl images LVGL is a free and open-source embedded graphics library that is able to run in environments with limited resources. This image includes a desktop environment and an LVGL widget demo (lvgl_demo) https://onedigi.atlassian.net/browse/DEL-8740 Signed-off-by: Gabriel Valcazar --- meta-digi-arm/conf/machine/include/digi-defaults.inc | 2 +- meta-digi-dey/conf/distro/dey.conf | 1 + .../recipes-core/images/dey-image-lvgl.bbappend | 1 + meta-digi-dey/recipes-core/images/dey-image-lvgl.bb | 8 ++++++++ .../recipes-digi/swu-images/dey-image-lvgl-swu.bb | 5 +++++ .../packagegroups/packagegroup-dey-lvgl.bb | 11 +++++++++++ sdk/config/ccimx6qpsbc/conf-notes.txt | 5 +++++ sdk/config/ccimx6sbc/conf-notes.txt | 5 +++++ sdk/config/ccimx6ulsbc/conf-notes.txt | 5 +++++ sdk/config/ccimx8mm-dvk/conf-notes.txt | 5 +++++ sdk/config/ccimx8mn-dvk/conf-notes.txt | 5 +++++ sdk/config/ccimx8x-sbc-express/conf-notes.txt | 5 +++++ sdk/config/ccimx8x-sbc-pro/conf-notes.txt | 5 +++++ sdk/config/ccimx93-dvk/conf-notes.txt | 5 +++++ sdk/config/ccmp15-dvk/conf-notes.txt | 5 +++++ 15 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 meta-digi-dey/dynamic-layers/selinux/recipes-core/images/dey-image-lvgl.bbappend create mode 100644 meta-digi-dey/recipes-core/images/dey-image-lvgl.bb create mode 100644 meta-digi-dey/recipes-digi/swu-images/dey-image-lvgl-swu.bb create mode 100644 meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-lvgl.bb diff --git a/meta-digi-arm/conf/machine/include/digi-defaults.inc b/meta-digi-arm/conf/machine/include/digi-defaults.inc index 8abd7f5c5..05cc96252 100644 --- a/meta-digi-arm/conf/machine/include/digi-defaults.inc +++ b/meta-digi-arm/conf/machine/include/digi-defaults.inc @@ -78,7 +78,7 @@ MACHINE_EXTRA_RRECOMMENDS += "${@bb.utils.contains_any('VIRTUAL-RUNTIME_dev_mana DEFAULT_IMAGE_NAME ??= "dey-image-qt" # List of graphical images names (for install scripts) -GRAPHICAL_IMAGES ?= "dey-image-crank dey-image-qt dey-image-webkit" +GRAPHICAL_IMAGES ?= "dey-image-crank dey-image-qt dey-image-webkit dey-image-lvgl" # Include DEY SELinux policy modifications by default DEY_SELINUX_POLICY ?= "1" diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index 77960fad1..c00ed9173 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -45,6 +45,7 @@ FEATURE_PACKAGES_dey-crank = "packagegroup-dey-crank" FEATURE_PACKAGES_dey-debug = "packagegroup-dey-debug" FEATURE_PACKAGES_dey-examples = "packagegroup-dey-examples" FEATURE_PACKAGES_dey-gstreamer = "packagegroup-dey-gstreamer" +FEATURE_PACKAGES_dey-lvgl = "packagegroup-dey-lvgl" FEATURE_PACKAGES_dey-network = "packagegroup-dey-network" FEATURE_PACKAGES_dey-qt = "packagegroup-dey-qt" FEATURE_PACKAGES_dey-trustfence = "packagegroup-dey-trustfence" diff --git a/meta-digi-dey/dynamic-layers/selinux/recipes-core/images/dey-image-lvgl.bbappend b/meta-digi-dey/dynamic-layers/selinux/recipes-core/images/dey-image-lvgl.bbappend new file mode 100644 index 000000000..072993cd7 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/selinux/recipes-core/images/dey-image-lvgl.bbappend @@ -0,0 +1 @@ +include selinux_dey.inc diff --git a/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb b/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb new file mode 100644 index 000000000..7d0fc83e9 --- /dev/null +++ b/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb @@ -0,0 +1,8 @@ +# +# Copyright (C) 2023 Digi International. +# +require dey-image-graphical.inc + +DESCRIPTION = "DEY image with LVGL graphical libraries" + +GRAPHICAL_CORE = "lvgl" diff --git a/meta-digi-dey/recipes-digi/swu-images/dey-image-lvgl-swu.bb b/meta-digi-dey/recipes-digi/swu-images/dey-image-lvgl-swu.bb new file mode 100644 index 000000000..e402e85ad --- /dev/null +++ b/meta-digi-dey/recipes-digi/swu-images/dey-image-lvgl-swu.bb @@ -0,0 +1,5 @@ +# Copyright (C) 2023 Digi International Inc. + +require swu.inc + +IMG_NAME = "${@get_baseimg_pn(d)}-${GRAPHICAL_BACKEND}" diff --git a/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-lvgl.bb b/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-lvgl.bb new file mode 100644 index 000000000..f00ea6a1e --- /dev/null +++ b/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-lvgl.bb @@ -0,0 +1,11 @@ +# +# Copyright (C) 2023 Digi International Inc. +# +SUMMARY = "LVGL packagegroup for DEY image" + +PACKAGE_ARCH = "${MACHINE_ARCH}" +inherit packagegroup + +RDEPENDS:${PN} += " \ + lvgl-demo \ +" diff --git a/sdk/config/ccimx6qpsbc/conf-notes.txt b/sdk/config/ccimx6qpsbc/conf-notes.txt index b49f5e14b..7c10edbcf 100644 --- a/sdk/config/ccimx6qpsbc/conf-notes.txt +++ b/sdk/config/ccimx6qpsbc/conf-notes.txt @@ -9,3 +9,8 @@ Digi Embedded Yocto provides the following image recipes: By default the image is XWayland-based so it provides a full Weston desktop environment. + + * dey-image-lvgl: graphical LVGL image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. diff --git a/sdk/config/ccimx6sbc/conf-notes.txt b/sdk/config/ccimx6sbc/conf-notes.txt index b49f5e14b..7c10edbcf 100644 --- a/sdk/config/ccimx6sbc/conf-notes.txt +++ b/sdk/config/ccimx6sbc/conf-notes.txt @@ -9,3 +9,8 @@ Digi Embedded Yocto provides the following image recipes: By default the image is XWayland-based so it provides a full Weston desktop environment. + + * dey-image-lvgl: graphical LVGL image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. diff --git a/sdk/config/ccimx6ulsbc/conf-notes.txt b/sdk/config/ccimx6ulsbc/conf-notes.txt index 8a9a68710..44fd937f9 100644 --- a/sdk/config/ccimx6ulsbc/conf-notes.txt +++ b/sdk/config/ccimx6ulsbc/conf-notes.txt @@ -5,6 +5,11 @@ Digi Embedded Yocto provides the following image recipes: By default the image is X11-based so it provides a full SATO theme desktop environment. + * dey-image-lvgl: graphical LVGL image + + By default the image is X11-based so it provides a full SATO theme + desktop environment. + * core-image-base: a console-only image Expansion of native core-image-base by including all the support for the diff --git a/sdk/config/ccimx8mm-dvk/conf-notes.txt b/sdk/config/ccimx8mm-dvk/conf-notes.txt index b49f5e14b..7c10edbcf 100644 --- a/sdk/config/ccimx8mm-dvk/conf-notes.txt +++ b/sdk/config/ccimx8mm-dvk/conf-notes.txt @@ -9,3 +9,8 @@ Digi Embedded Yocto provides the following image recipes: By default the image is XWayland-based so it provides a full Weston desktop environment. + + * dey-image-lvgl: graphical LVGL image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. diff --git a/sdk/config/ccimx8mn-dvk/conf-notes.txt b/sdk/config/ccimx8mn-dvk/conf-notes.txt index b49f5e14b..7c10edbcf 100644 --- a/sdk/config/ccimx8mn-dvk/conf-notes.txt +++ b/sdk/config/ccimx8mn-dvk/conf-notes.txt @@ -9,3 +9,8 @@ Digi Embedded Yocto provides the following image recipes: By default the image is XWayland-based so it provides a full Weston desktop environment. + + * dey-image-lvgl: graphical LVGL image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. diff --git a/sdk/config/ccimx8x-sbc-express/conf-notes.txt b/sdk/config/ccimx8x-sbc-express/conf-notes.txt index b49f5e14b..7c10edbcf 100644 --- a/sdk/config/ccimx8x-sbc-express/conf-notes.txt +++ b/sdk/config/ccimx8x-sbc-express/conf-notes.txt @@ -9,3 +9,8 @@ Digi Embedded Yocto provides the following image recipes: By default the image is XWayland-based so it provides a full Weston desktop environment. + + * dey-image-lvgl: graphical LVGL image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. diff --git a/sdk/config/ccimx8x-sbc-pro/conf-notes.txt b/sdk/config/ccimx8x-sbc-pro/conf-notes.txt index b49f5e14b..7c10edbcf 100644 --- a/sdk/config/ccimx8x-sbc-pro/conf-notes.txt +++ b/sdk/config/ccimx8x-sbc-pro/conf-notes.txt @@ -9,3 +9,8 @@ Digi Embedded Yocto provides the following image recipes: By default the image is XWayland-based so it provides a full Weston desktop environment. + + * dey-image-lvgl: graphical LVGL image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. diff --git a/sdk/config/ccimx93-dvk/conf-notes.txt b/sdk/config/ccimx93-dvk/conf-notes.txt index d9cb627a2..4d03f59dd 100644 --- a/sdk/config/ccimx93-dvk/conf-notes.txt +++ b/sdk/config/ccimx93-dvk/conf-notes.txt @@ -5,3 +5,8 @@ Digi Embedded Yocto provides the following image recipes: By default the image is XWayland-based so it provides a full Weston desktop environment. + * dey-image-lvgl: graphical LVGL image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. + diff --git a/sdk/config/ccmp15-dvk/conf-notes.txt b/sdk/config/ccmp15-dvk/conf-notes.txt index 61380b8fe..a0a98b6e5 100644 --- a/sdk/config/ccmp15-dvk/conf-notes.txt +++ b/sdk/config/ccmp15-dvk/conf-notes.txt @@ -10,6 +10,11 @@ Digi Embedded Yocto provides the following image recipes: By default the image is Wayland-based so it provides a full Weston desktop environment. + * dey-image-lvgl: graphical LVGL image + + By default the image is Wayland-based so it provides a full Weston + desktop environment. + * core-image-base: a console-only image Expansion of native core-image-base by including all the support for the From fea7e623d75e621f8963afc08479673f9db51d01 Mon Sep 17 00:00:00 2001 From: Francisco Gil Date: Mon, 20 Nov 2023 13:15:48 +0100 Subject: [PATCH 046/118] trustfence: fix building issue with trustfence enabled in cc8x In commit 2fd1dbfed7c, we accidentally removed some changes needed to build imx-boot with Trustfence enabled, which were added in commit 1ce17da8646. This partially reverts commit 2fd1dbfed7c Signed-off-by: Francisco Gil --- .../recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend | 2 ++ 1 file changed, 2 insertions(+) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index 056159d50..2060db12f 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -62,6 +62,8 @@ do_compile:ccimx8x() { if [ -e "${BOOT_STAGING}/flash.bin" ]; then cp ${BOOT_STAGING}/flash.bin ${S}/${BOOT_NAME}-${MACHINE}-${rev}.bin-${target} fi + # Remove u-boot-atf-container.img so it gets generated in the next iteration + rm ${BOOT_STAGING}/u-boot-atf-container.img done done unset UBOOT_CONFIG_EXTRA From 5794b18cd22bd0f51ed17731abc1a55dedaa73d8 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 15 Nov 2023 18:54:35 +0100 Subject: [PATCH 047/118] meson: backport version 1.0.1 from yocto 4.2 This is required to build the new version of gstreamer used by NXP for the ccimx93 and integrated in following commits. Signed-off-by: Javier Viguera --- ...for-clang-before-guessing-gcc-or-lcc.patch | 56 +++++++ .../0001-Make-CPU-family-warnings-fatal.patch | 45 +++++ ...-not-manipulate-the-environment-when.patch | 37 +++++ ...pport-building-allarch-recipes-again.patch | 28 ++++ .../meson/meson/meson-setup.py | 43 +++++ .../meson/meson/meson-wrapper | 31 ++++ .../recipes-devtools/meson/meson_1.0.1.bb | 157 ++++++++++++++++++ 7 files changed, 397 insertions(+) create mode 100644 meta-digi-dey/recipes-devtools/meson/meson/0001-Check-for-clang-before-guessing-gcc-or-lcc.patch create mode 100644 meta-digi-dey/recipes-devtools/meson/meson/0001-Make-CPU-family-warnings-fatal.patch create mode 100644 meta-digi-dey/recipes-devtools/meson/meson/0001-python-module-do-not-manipulate-the-environment-when.patch create mode 100644 meta-digi-dey/recipes-devtools/meson/meson/0002-Support-building-allarch-recipes-again.patch create mode 100755 meta-digi-dey/recipes-devtools/meson/meson/meson-setup.py create mode 100755 meta-digi-dey/recipes-devtools/meson/meson/meson-wrapper create mode 100644 meta-digi-dey/recipes-devtools/meson/meson_1.0.1.bb diff --git a/meta-digi-dey/recipes-devtools/meson/meson/0001-Check-for-clang-before-guessing-gcc-or-lcc.patch b/meta-digi-dey/recipes-devtools/meson/meson/0001-Check-for-clang-before-guessing-gcc-or-lcc.patch new file mode 100644 index 000000000..58fa11943 --- /dev/null +++ b/meta-digi-dey/recipes-devtools/meson/meson/0001-Check-for-clang-before-guessing-gcc-or-lcc.patch @@ -0,0 +1,56 @@ +From 8739e1c3bef653415ad4b9b9c318ccfa76c43da6 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 31 Mar 2022 15:00:24 -0700 +Subject: [PATCH] Check for clang before guessing gcc or lcc + +clang --version can yield a string like below when its installed into +such a directory + +clang version 14.0.0 (https://github.com/llvm/llvm-project 3f43d803382d57e3fc010ca19833077d1023e9c9) +Target: aarch64-yoe-linux +Thread model: posix +InstalledDir: /mnt/b/yoe/master/build/tmp/work/cortexa72-yoe-linux/gnome-text-editor/42.0-r0/recipe-sysroot-native/usr/bin/aarch64-yoe-linux + +as you can see InstallDir has 'xt-' subtring and this trips the check to +guess gcc + +if 'Free Software Foundation' in out or 'xt-' in out: + +Therefore, check if compiler is clang then there is no point of running +this check anyway. + +Upstream-Status: Submitted [https://github.com/mesonbuild/meson/pull/10218] +Signed-off-by: Khem Raj +--- + mesonbuild/compilers/detect.py | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py +index 53948b01a..ba335cf39 100644 +--- a/mesonbuild/compilers/detect.py ++++ b/mesonbuild/compilers/detect.py +@@ -427,13 +427,14 @@ def _detect_c_or_cpp_compiler(env: 'Environment', lang: str, for_machine: Machin + version = search_version(out) + + guess_gcc_or_lcc: T.Optional[str] = None +- if 'Free Software Foundation' in out or 'xt-' in out: +- guess_gcc_or_lcc = 'gcc' +- if 'e2k' in out and 'lcc' in out: +- guess_gcc_or_lcc = 'lcc' +- if 'Microchip Technology' in out: +- # this output has "Free Software Foundation" in its version +- guess_gcc_or_lcc = None ++ if not 'clang' in compiler_name: ++ if 'Free Software Foundation' in out or 'xt-' in out: ++ guess_gcc_or_lcc = 'gcc' ++ if 'e2k' in out and 'lcc' in out: ++ guess_gcc_or_lcc = 'lcc' ++ if 'Microchip Technology' in out: ++ # this output has "Free Software Foundation" in its version ++ guess_gcc_or_lcc = None + + if guess_gcc_or_lcc: + defines = _get_gnu_compiler_defines(compiler) +-- +2.35.1 + diff --git a/meta-digi-dey/recipes-devtools/meson/meson/0001-Make-CPU-family-warnings-fatal.patch b/meta-digi-dey/recipes-devtools/meson/meson/0001-Make-CPU-family-warnings-fatal.patch new file mode 100644 index 000000000..848dccfbe --- /dev/null +++ b/meta-digi-dey/recipes-devtools/meson/meson/0001-Make-CPU-family-warnings-fatal.patch @@ -0,0 +1,45 @@ +From 6c4eef1d92e9e42fdbc888365cab3c95fb33c605 Mon Sep 17 00:00:00 2001 +From: Ross Burton +Date: Tue, 3 Jul 2018 13:59:09 +0100 +Subject: [PATCH] Make CPU family warnings fatal + +Upstream-Status: Inappropriate [OE specific] +Signed-off-by: Ross Burton + +--- + mesonbuild/envconfig.py | 2 +- + mesonbuild/environment.py | 4 +--- + 2 files changed, 2 insertions(+), 4 deletions(-) + +Index: meson-0.60.2/mesonbuild/envconfig.py +=================================================================== +--- meson-0.60.2.orig/mesonbuild/envconfig.py ++++ meson-0.60.2/mesonbuild/envconfig.py +@@ -266,8 +266,8 @@ class MachineInfo(HoldableObject): + 'but is missing {}.'.format(minimum_literal - set(literal))) + + cpu_family = literal['cpu_family'] +- if cpu_family not in known_cpu_families: +- mlog.warning(f'Unknown CPU family {cpu_family}, please report this at https://github.com/mesonbuild/meson/issues/new') ++ if cpu_family not in known_cpu_families and cpu_family != "riscv": ++ raise EnvironmentException('Unknown CPU family {}, see https://wiki.yoctoproject.org/wiki/Meson/UnknownCPU for directions.'.format(cpu_family)) + + endian = literal['endian'] + if endian not in ('little', 'big'): +Index: meson-0.60.2/mesonbuild/environment.py +=================================================================== +--- meson-0.60.2.orig/mesonbuild/environment.py ++++ meson-0.60.2/mesonbuild/environment.py +@@ -354,10 +354,8 @@ def detect_cpu_family(compilers: Compile + if any_compiler_has_define(compilers, '__64BIT__'): + trial = 'ppc64' + +- if trial not in known_cpu_families: +- mlog.warning(f'Unknown CPU family {trial!r}, please report this at ' +- 'https://github.com/mesonbuild/meson/issues/new with the ' +- 'output of `uname -a` and `cat /proc/cpuinfo`') ++ if trial not in known_cpu_families and trail != "riscv": ++ raise EnvironmentException('Unknown CPU family %s, see https://wiki.yoctoproject.org/wiki/Meson/UnknownCPU for directions.' % trial) + + return trial + diff --git a/meta-digi-dey/recipes-devtools/meson/meson/0001-python-module-do-not-manipulate-the-environment-when.patch b/meta-digi-dey/recipes-devtools/meson/meson/0001-python-module-do-not-manipulate-the-environment-when.patch new file mode 100644 index 000000000..f01a66781 --- /dev/null +++ b/meta-digi-dey/recipes-devtools/meson/meson/0001-python-module-do-not-manipulate-the-environment-when.patch @@ -0,0 +1,37 @@ +From 2e9582167bf9d3273004edb2637310531f0155ab Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Mon, 19 Nov 2018 14:24:26 +0100 +Subject: [PATCH] python module: do not manipulate the environment when calling + pkg-config + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin + +--- + mesonbuild/modules/python.py | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py +index 3bbccd1..fda7a25 100644 +--- a/mesonbuild/modules/python.py ++++ b/mesonbuild/modules/python.py +@@ -277,9 +277,6 @@ def python_factory(env: 'Environment', for_machine: 'MachineChoice', + # there is no LIBPC, so we can't search in it + return NotFoundDependency('python', env) + +- old_pkg_libdir = os.environ.pop('PKG_CONFIG_LIBDIR', None) +- old_pkg_path = os.environ.pop('PKG_CONFIG_PATH', None) +- os.environ['PKG_CONFIG_LIBDIR'] = pkg_libdir + try: + return PythonPkgConfigDependency(name, env, kwargs, installation, True) + finally: +@@ -288,8 +285,7 @@ def python_factory(env: 'Environment', for_machine: 'MachineChoice', + os.environ[name] = value + elif name in os.environ: + del os.environ[name] +- set_env('PKG_CONFIG_LIBDIR', old_pkg_libdir) +- set_env('PKG_CONFIG_PATH', old_pkg_path) ++ pass + + candidates.append(functools.partial(wrap_in_pythons_pc_dir, pkg_name, env, kwargs, installation)) + # We only need to check both, if a python install has a LIBPC. It might point to the wrong location, diff --git a/meta-digi-dey/recipes-devtools/meson/meson/0002-Support-building-allarch-recipes-again.patch b/meta-digi-dey/recipes-devtools/meson/meson/0002-Support-building-allarch-recipes-again.patch new file mode 100644 index 000000000..dcc1ce9c2 --- /dev/null +++ b/meta-digi-dey/recipes-devtools/meson/meson/0002-Support-building-allarch-recipes-again.patch @@ -0,0 +1,28 @@ +From 656bf55fed01df2d2e2ad6d9d9887173cb16b85c Mon Sep 17 00:00:00 2001 +From: Peter Kjellerstedt +Date: Thu, 26 Jul 2018 16:32:49 +0200 +Subject: [PATCH 2/2] Support building allarch recipes again + +This registers "allarch" as a known CPU family. + +Upstream-Status: Inappropriate [OE specific] +Signed-off-by: Peter Kjellerstedt +--- + mesonbuild/envconfig.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/mesonbuild/envconfig.py b/mesonbuild/envconfig.py +index 4d58c91..ff01ad1 100644 +--- a/mesonbuild/envconfig.py ++++ b/mesonbuild/envconfig.py +@@ -36,6 +36,7 @@ from pathlib import Path + + + known_cpu_families = ( ++ 'allarch', + 'aarch64', + 'alpha', + 'arc', +-- +2.24.0 + diff --git a/meta-digi-dey/recipes-devtools/meson/meson/meson-setup.py b/meta-digi-dey/recipes-devtools/meson/meson/meson-setup.py new file mode 100755 index 000000000..daaa551de --- /dev/null +++ b/meta-digi-dey/recipes-devtools/meson/meson/meson-setup.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import os +import string +import sys + +class Template(string.Template): + delimiter = "@" + +class Environ(): + def __getitem__(self, name): + val = os.environ[name] + val = val.split() + if len(val) > 1: + val = ["'%s'" % x for x in val] + val = ', '.join(val) + val = '[%s]' % val + elif val: + val = "'%s'" % val.pop() + return val + +try: + sysroot = os.environ['OECORE_NATIVE_SYSROOT'] +except KeyError: + print("Not in environment setup, bailing") + sys.exit(1) + +template_file = os.path.join(sysroot, 'usr/share/meson/meson.cross.template') +cross_file = os.path.join(sysroot, 'usr/share/meson/%smeson.cross' % os.environ["TARGET_PREFIX"]) +native_template_file = os.path.join(sysroot, 'usr/share/meson/meson.native.template') +native_file = os.path.join(sysroot, 'usr/share/meson/meson.native') + +with open(template_file) as in_file: + template = in_file.read() + output = Template(template).substitute(Environ()) + with open(cross_file, "w") as out_file: + out_file.write(output) + +with open(native_template_file) as in_file: + template = in_file.read() + output = Template(template).substitute({'OECORE_NATIVE_SYSROOT': os.environ['OECORE_NATIVE_SYSROOT']}) + with open(native_file, "w") as out_file: + out_file.write(output) diff --git a/meta-digi-dey/recipes-devtools/meson/meson/meson-wrapper b/meta-digi-dey/recipes-devtools/meson/meson/meson-wrapper new file mode 100755 index 000000000..745598529 --- /dev/null +++ b/meta-digi-dey/recipes-devtools/meson/meson/meson-wrapper @@ -0,0 +1,31 @@ +#!/bin/sh + +if [ -z "$OECORE_NATIVE_SYSROOT" ]; then + exec "meson.real" "$@" +fi + +if [ -z "$SSL_CERT_DIR" ]; then + export SSL_CERT_DIR="$OECORE_NATIVE_SYSROOT/etc/ssl/certs/" +fi + +# If these are set to a cross-compile path, meson will get confused and try to +# use them as native tools. Unset them to prevent this, as all the cross-compile +# config is already in meson.cross. +unset CC CXX CPP LD AR NM STRIP + +case "$1" in +setup|configure|dist|install|introspect|init|test|wrap|subprojects|rewrite|compile|devenv|env2mfile|help) MESON_CMD="$1" ;; +*) echo meson-wrapper: Implicit setup command assumed; MESON_CMD=setup ;; +esac + +if [ "$MESON_CMD" = "setup" ]; then + MESON_SETUP_OPTS=" \ + --cross-file="$OECORE_NATIVE_SYSROOT/usr/share/meson/${TARGET_PREFIX}meson.cross" \ + --native-file="$OECORE_NATIVE_SYSROOT/usr/share/meson/meson.native" \ + " + echo meson-wrapper: Running meson with setup options: \"$MESON_SETUP_OPTS\" +fi + +exec "$OECORE_NATIVE_SYSROOT/usr/bin/meson.real" \ + "$@" \ + $MESON_SETUP_OPTS diff --git a/meta-digi-dey/recipes-devtools/meson/meson_1.0.1.bb b/meta-digi-dey/recipes-devtools/meson/meson_1.0.1.bb new file mode 100644 index 000000000..6ff0b0745 --- /dev/null +++ b/meta-digi-dey/recipes-devtools/meson/meson_1.0.1.bb @@ -0,0 +1,157 @@ +HOMEPAGE = "http://mesonbuild.com" +SUMMARY = "A high performance build system" +DESCRIPTION = "Meson is a build system designed to increase programmer \ +productivity. It does this by providing a fast, simple and easy to use \ +interface for modern software development tools and practices." + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://COPYING;md5=3b83ef96387f14655fc854ddc3c6bd57" + +GITHUB_BASE_URI = "https://github.com/mesonbuild/meson/releases/" +SRC_URI = "${GITHUB_BASE_URI}/download/${PV}/meson-${PV}.tar.gz \ + file://meson-setup.py \ + file://meson-wrapper \ + file://0001-python-module-do-not-manipulate-the-environment-when.patch \ + file://0001-Make-CPU-family-warnings-fatal.patch \ + file://0002-Support-building-allarch-recipes-again.patch \ + file://0001-Check-for-clang-before-guessing-gcc-or-lcc.patch \ + " +SRC_URI[sha256sum] = "d926b730de6f518728cc7c57bc5e701667bae0c3522f9e369427b2cc7839d3c1" + +# Removed 'github-releases' as it does not exist on Kirkstone +inherit python_setuptools_build_meta + +RDEPENDS:${PN} = "ninja python3-modules python3-pkg-resources" + +FILES:${PN} += "${datadir}/polkit-1" + +do_install:append () { + # As per the same issue in the python recipe itself: + # Unfortunately the following pyc files are non-deterministc due to 'frozenset' + # being written without strict ordering, even with PYTHONHASHSEED = 0 + # Upstream is discussing ways to solve the issue properly, until then let's + # just not install the problematic files. + # More info: http://benno.id.au/blog/2013/01/15/python-determinism + rm ${D}${libdir}/python*/site-packages/mesonbuild/dependencies/__pycache__/mpi.cpython* +} + +BBCLASSEXTEND = "native nativesdk" + +inherit meson-routines + +# The cross file logic is similar but not identical to that in meson.bbclass, +# since it's generating for an SDK rather than a cross-compile. Important +# differences are: +# - We can't set vars like CC, CXX, etc. yet because they will be filled in with +# real paths by meson-setup.sh when the SDK is extracted. +# - Some overrides aren't needed, since the SDK injects paths that take care of +# them. +def var_list2str(var, d): + items = d.getVar(var).split() + return items[0] if len(items) == 1 else ', '.join(repr(s) for s in items) + +def generate_native_link_template(d): + val = ['-L@{OECORE_NATIVE_SYSROOT}${libdir_native}', + '-L@{OECORE_NATIVE_SYSROOT}${base_libdir_native}', + '-Wl,-rpath-link,@{OECORE_NATIVE_SYSROOT}${libdir_native}', + '-Wl,-rpath-link,@{OECORE_NATIVE_SYSROOT}${base_libdir_native}', + '-Wl,--allow-shlib-undefined' + ] + build_arch = d.getVar('BUILD_ARCH') + if 'x86_64' in build_arch: + loader = 'ld-linux-x86-64.so.2' + elif 'i686' in build_arch: + loader = 'ld-linux.so.2' + elif 'aarch64' in build_arch: + loader = 'ld-linux-aarch64.so.1' + elif 'ppc64le' in build_arch: + loader = 'ld64.so.2' + elif 'loongarch64' in build_arch: + loader = 'ld-linux-loongarch-lp64d.so.1' + + if loader: + val += ['-Wl,--dynamic-linker=@{OECORE_NATIVE_SYSROOT}${base_libdir_native}/' + loader] + + return repr(val) + +install_templates() { + install -d ${D}${datadir}/meson + + cat >${D}${datadir}/meson/meson.native.template <${D}${datadir}/meson/meson.cross.template < Date: Wed, 15 Nov 2023 18:54:55 +0100 Subject: [PATCH 048/118] ccimx93: update multimedia package for NXP release 6.1.36-2.1.0 Backport of multimedia package for ccimx93 from NXP's Mickledore-based 6.1.36-2.1.0 release. Mainly copies and appends of multimedia recipes from the new release, and restricted to ccimx93 by changing the COMPATIBLE_MACHINE, so it does not affect other platforms. Signed-off-by: Javier Viguera --- .../conf/machine/include/ccimx93.inc | 6 + .../alsa/imx-alsa-plugins_git.bbappend | 4 + .../gstreamer/gstreamer1.0-meta-base.bbappend | 9 + ...issing-opencv-data-dir-in-yocto-buil.patch | 33 +++ .../gstreamer1.0-plugins-bad_1.22.0.imx.bb | 216 ++++++++++++++++++ .../gstreamer1.0-plugins-base_1.22.0.imx.bb | 148 ++++++++++++ .../gstreamer1.0-plugins-good_1.22.0.imx.bb | 118 ++++++++++ .../gstreamer1.0-plugins-ugly_1.22.0.bb | 12 + .../gstreamer/gstreamer1.0/run-ptest | 2 + .../gstreamer/gstreamer1.0_1.22.0.imx.bb | 110 +++++++++ .../gstreamer/imx-gst1.0-plugin_%.bbappend | 7 +- .../imx-codec/imx-codec_4.8.1.bb | 13 ++ .../imx-dsp/imx-dsp-codec-ext_2.1.5.bb | 13 ++ .../imx-dsp/imx-dsp_2.1.5.bb | 13 ++ .../imx-parser/imx-parser_4.8.1.bb | 13 ++ 15 files changed, 716 insertions(+), 1 deletion(-) create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/alsa/imx-alsa-plugins_git.bbappend create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-meta-base.bbappend create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.0.imx.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.0.imx.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.0.imx.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.0.bb create mode 100755 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0/run-ptest create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.0.imx.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.1.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.1.5.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp_2.1.5.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.1.bb diff --git a/meta-digi-arm/conf/machine/include/ccimx93.inc b/meta-digi-arm/conf/machine/include/ccimx93.inc index ca450fff6..cbafa67ef 100644 --- a/meta-digi-arm/conf/machine/include/ccimx93.inc +++ b/meta-digi-arm/conf/machine/include/ccimx93.inc @@ -76,3 +76,9 @@ BOOT_DEV_NAME ?= "/dev/mmcblk0p1" ROOTFS_DEV_NAME ?= "/dev/mmcblk0p3" ROOTFS_ENC_DEV = "/dev/mapper/cryptrootfs" ROOTFS_DEV_NAME_FINAL = "${@oe.utils.ifelse(d.getVar('TRUSTFENCE_ENCRYPT_ROOTFS') == '1', '${ROOTFS_ENC_DEV}', '${ROOTFS_DEV_NAME}')}" + +PREFERRED_VERSION_gstreamer1.0:ccimx93 ?= "1.22.0.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-bad:ccimx93 ?= "1.22.0.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-base:ccimx93 ?= "1.22.0.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-good:ccimx93 ?= "1.22.0.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-ugly:ccimx93 ?= "1.22.0" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/alsa/imx-alsa-plugins_git.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/alsa/imx-alsa-plugins_git.bbappend new file mode 100644 index 000000000..676539754 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/alsa/imx-alsa-plugins_git.bbappend @@ -0,0 +1,4 @@ +# Copyright 2023 Digi International Inc. + +SRCBRANCH:ccimx93 = "MM_04.08.01_2308_L6.1.y" +SRCREV:ccimx93 = "b2ba082e70333f187972ee4e85f63f9d2f608331" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-meta-base.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-meta-base.bbappend new file mode 100644 index 000000000..fbc297880 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-meta-base.bbappend @@ -0,0 +1,9 @@ +# Copyright 2023 Digi International Inc. + +RDEPENDS:gstreamer1.0-meta-base:remove:ccimx93 = " \ + gstreamer1.0-plugins-base-videoscale \ + gstreamer1.0-plugins-base-videoconvert \ +" +RDEPENDS:gstreamer1.0-meta-base:append:ccimx93 = " \ + gstreamer1.0-plugins-base-videoconvertscale \ +" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch new file mode 100644 index 000000000..029b80e17 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch @@ -0,0 +1,33 @@ +From 3bc5d48257032b6bbee532aad15062fbbcc43bfe Mon Sep 17 00:00:00 2001 +From: Andrey Zhizhikin +Date: Mon, 27 Jan 2020 10:22:35 +0000 +Subject: [PATCH] opencv: resolve missing opencv data dir in yocto build + +When Yocto build is performed, opencv searches for data dir using simple +'test' command, this fails because pkg-config provides an absolute +path on the target which needs to be prepended by PKG_CONFIG_SYSROOT_DIR +in order for the 'test' utility to pick up the absolute path. + +Upstream-Status: Inappropriate [OE-specific] + +Signed-off-by: Andrey Zhizhikin +Signed-off-by: Jose Quaresma + +--- + ext/opencv/meson.build | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/ext/opencv/meson.build b/ext/opencv/meson.build +index 1d86b90..b5c8b95 100644 +--- a/ext/opencv/meson.build ++++ b/ext/opencv/meson.build +@@ -87,6 +87,9 @@ if opencv_found + opencv_prefix = opencv_dep.get_variable('prefix') + gstopencv_cargs += ['-DOPENCV_PREFIX="' + opencv_prefix + '"'] + ++ pkgconf_sysroot = run_command(python3, '-c', 'import os; print(os.environ.get("PKG_CONFIG_SYSROOT_DIR"))').stdout().strip() ++ opencv_prefix = pkgconf_sysroot + opencv_prefix ++ + # Check the data dir used by opencv for its xml data files + # Use prefix from pkg-config to be compatible with cross-compilation + r = run_command('test', '-d', opencv_prefix + '/share/opencv', check: false) diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.0.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.0.imx.bb new file mode 100644 index 000000000..4548a34a5 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.0.imx.bb @@ -0,0 +1,216 @@ +# This recipe is for the i.MX fork of gstreamer1.0-plugins-bad. For ease of +# maintenance, the top section is a verbatim copy of an OE-core +# recipe. The second section customizes the recipe for i.MX. + +########### OE-core copy ################## +# Upstream hash: fb2d28e0315ece6180c87c7047587673024a09f7 + +require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc +require recipes-multimedia/gstreamer/gstreamer1.0-plugins-license.inc + +DESCRIPTION = "'Bad' GStreamer plugins and helper libraries " +HOMEPAGE = "https://gstreamer.freedesktop.org/" +BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues" + +SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-${PV}.tar.xz \ + file://0001-fix-maybe-uninitialized-warnings-when-compiling-with.patch \ + file://0002-avoid-including-sys-poll.h-directly.patch \ + file://0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch \ + " +SRC_URI[sha256sum] = "3c9d9300f5f4fb3e3d36009379d1fb6d9ecd79c1a135df742b8a68417dd663a1" + +S = "${WORKDIR}/gst-plugins-bad-${PV}" + +LICENSE = "LGPL-2.1-or-later & GPL-2.0-or-later" +LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c" + +DEPENDS += "gstreamer1.0-plugins-base" + +inherit gobject-introspection + +PACKAGECONFIG ??= " \ + ${GSTREAMER_ORC} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'directfb vulkan x11', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gl', '', d)} \ + bz2 closedcaption curl dash dtls hls openssl sbc smoothstreaming \ + sndfile ttml uvch264 webp \ + ${@bb.utils.contains('TUNE_FEATURES', 'mx32', '', 'rsvg', d)} \ +" + +PACKAGECONFIG[aom] = "-Daom=enabled,-Daom=disabled,aom" +PACKAGECONFIG[assrender] = "-Dassrender=enabled,-Dassrender=disabled,libass" +PACKAGECONFIG[avtp] = "-Davtp=enabled,-Davtp=disabled,libavtp" +PACKAGECONFIG[bluez] = "-Dbluez=enabled,-Dbluez=disabled,bluez5" +PACKAGECONFIG[bz2] = "-Dbz2=enabled,-Dbz2=disabled,bzip2" +PACKAGECONFIG[closedcaption] = "-Dclosedcaption=enabled,-Dclosedcaption=disabled,pango cairo" +PACKAGECONFIG[curl] = "-Dcurl=enabled,-Dcurl=disabled,curl" +PACKAGECONFIG[dash] = "-Ddash=enabled,-Ddash=disabled,libxml2" +PACKAGECONFIG[dc1394] = "-Ddc1394=enabled,-Ddc1394=disabled,libdc1394" +PACKAGECONFIG[directfb] = "-Ddirectfb=enabled,-Ddirectfb=disabled,directfb" +PACKAGECONFIG[dtls] = "-Ddtls=enabled,-Ddtls=disabled,openssl" +PACKAGECONFIG[faac] = "-Dfaac=enabled,-Dfaac=disabled,faac" +PACKAGECONFIG[faad] = "-Dfaad=enabled,-Dfaad=disabled,faad2" +PACKAGECONFIG[fluidsynth] = "-Dfluidsynth=enabled,-Dfluidsynth=disabled,fluidsynth" +PACKAGECONFIG[hls] = "-Dhls=enabled,-Dhls=disabled," +# Pick atleast one crypto backend below when enabling hls +PACKAGECONFIG[nettle] = "-Dhls-crypto=nettle,,nettle" +PACKAGECONFIG[openssl] = "-Dhls-crypto=openssl,,openssl" +PACKAGECONFIG[gcrypt] = "-Dhls-crypto=libgcrypt,,libgcrypt" +# the gl packageconfig enables OpenGL elements that haven't been ported +# to -base yet. They depend on the gstgl library in -base, so we do +# not add GL dependencies here, since these are taken care of in -base. +PACKAGECONFIG[gl] = "-Dgl=enabled,-Dgl=disabled," +PACKAGECONFIG[kms] = "-Dkms=enabled,-Dkms=disabled,libdrm" +PACKAGECONFIG[libde265] = "-Dlibde265=enabled,-Dlibde265=disabled,libde265" +PACKAGECONFIG[libssh2] = "-Dcurl-ssh2=enabled,-Dcurl-ssh2=disabled,libssh2" +PACKAGECONFIG[lcms2] = "-Dcolormanagement=enabled,-Dcolormanagement=disabled,lcms" +PACKAGECONFIG[modplug] = "-Dmodplug=enabled,-Dmodplug=disabled,libmodplug" +PACKAGECONFIG[msdk] = "-Dmsdk=enabled,-Dmsdk=disabled,intel-mediasdk" +PACKAGECONFIG[neon] = "-Dneon=enabled,-Dneon=disabled,neon" +PACKAGECONFIG[openal] = "-Dopenal=enabled,-Dopenal=disabled,openal-soft" +PACKAGECONFIG[opencv] = "-Dopencv=enabled,-Dopencv=disabled,opencv" +PACKAGECONFIG[openh264] = "-Dopenh264=enabled,-Dopenh264=disabled,openh264" +PACKAGECONFIG[openjpeg] = "-Dopenjpeg=enabled,-Dopenjpeg=disabled,openjpeg" +PACKAGECONFIG[openmpt] = "-Dopenmpt=enabled,-Dopenmpt=disabled,libopenmpt" +# the opus encoder/decoder elements are now in the -base package, +# but the opus parser remains in -bad +PACKAGECONFIG[opusparse] = "-Dopus=enabled,-Dopus=disabled,libopus" +PACKAGECONFIG[resindvd] = "-Dresindvd=enabled,-Dresindvd=disabled,libdvdread libdvdnav" +PACKAGECONFIG[rsvg] = "-Drsvg=enabled,-Drsvg=disabled,librsvg" +PACKAGECONFIG[rtmp] = "-Drtmp=enabled,-Drtmp=disabled,rtmpdump" +PACKAGECONFIG[sbc] = "-Dsbc=enabled,-Dsbc=disabled,sbc" +PACKAGECONFIG[sctp] = "-Dsctp=enabled,-Dsctp=disabled" +PACKAGECONFIG[smoothstreaming] = "-Dsmoothstreaming=enabled,-Dsmoothstreaming=disabled,libxml2" +PACKAGECONFIG[sndfile] = "-Dsndfile=enabled,-Dsndfile=disabled,libsndfile1" +PACKAGECONFIG[srt] = "-Dsrt=enabled,-Dsrt=disabled,srt" +PACKAGECONFIG[srtp] = "-Dsrtp=enabled,-Dsrtp=disabled,libsrtp" +PACKAGECONFIG[tinyalsa] = "-Dtinyalsa=enabled,-Dtinyalsa=disabled,tinyalsa" +PACKAGECONFIG[ttml] = "-Dttml=enabled,-Dttml=disabled,libxml2 pango cairo" +PACKAGECONFIG[uvch264] = "-Duvch264=enabled,-Duvch264=disabled,libusb1 libgudev" +# this enables support for stateless V4L2 mem2mem codecs, which is a newer form of +# V4L2 codec; the V4L2 code in -base supports the older stateful V4L2 mem2mem codecs +PACKAGECONFIG[v4l2codecs] = "-Dv4l2codecs=enabled,-Dv4l2codecs=disabled,libgudev" +PACKAGECONFIG[va] = "-Dva=enabled,-Dva=disabled,libva" +PACKAGECONFIG[voaacenc] = "-Dvoaacenc=enabled,-Dvoaacenc=disabled,vo-aacenc" +PACKAGECONFIG[voamrwbenc] = "-Dvoamrwbenc=enabled,-Dvoamrwbenc=disabled,vo-amrwbenc" +PACKAGECONFIG[vulkan] = "-Dvulkan=enabled,-Dvulkan=disabled,vulkan-loader shaderc-native" +PACKAGECONFIG[wayland] = "-Dwayland=enabled,-Dwayland=disabled,wayland-native wayland wayland-protocols libdrm" +PACKAGECONFIG[webp] = "-Dwebp=enabled,-Dwebp=disabled,libwebp" +PACKAGECONFIG[webrtc] = "-Dwebrtc=enabled,-Dwebrtc=disabled,libnice" +PACKAGECONFIG[webrtcdsp] = "-Dwebrtcdsp=enabled,-Dwebrtcdsp=disabled,webrtc-audio-processing" +PACKAGECONFIG[zbar] = "-Dzbar=enabled,-Dzbar=disabled,zbar" +PACKAGECONFIG[x11] = "-Dx11=enabled,-Dx11=disabled,libxcb libxkbcommon" +PACKAGECONFIG[x265] = "-Dx265=enabled,-Dx265=disabled,x265" + +GSTREAMER_GPL = "${@bb.utils.filter('PACKAGECONFIG', 'faad resindvd x265', d)}" + +EXTRA_OEMESON += " \ + -Ddoc=disabled \ + -Daes=enabled \ + -Dcodecalpha=enabled \ + -Ddecklink=enabled \ + -Ddvb=enabled \ + -Dfbdev=enabled \ + -Dipcpipeline=enabled \ + -Dshm=enabled \ + -Dtranscode=enabled \ + -Dandroidmedia=disabled \ + -Dapplemedia=disabled \ + -Dasio=disabled \ + -Dbs2b=disabled \ + -Dchromaprint=disabled \ + -Dd3dvideosink=disabled \ + -Dd3d11=disabled \ + -Ddirectsound=disabled \ + -Ddts=disabled \ + -Dfdkaac=disabled \ + -Dflite=disabled \ + -Dgme=disabled \ + -Dgs=disabled \ + -Dgsm=disabled \ + -Diqa=disabled \ + -Dkate=disabled \ + -Dladspa=disabled \ + -Dldac=disabled \ + -Dlv2=disabled \ + -Dmagicleap=disabled \ + -Dmediafoundation=disabled \ + -Dmicrodns=disabled \ + -Dmpeg2enc=disabled \ + -Dmplex=disabled \ + -Dmusepack=disabled \ + -Dnvcodec=disabled \ + -Dopenexr=disabled \ + -Dopenni2=disabled \ + -Dopenaptx=disabled \ + -Dopensles=disabled \ + -Donnx=disabled \ + -Dqroverlay=disabled \ + -Dsoundtouch=disabled \ + -Dspandsp=disabled \ + -Dsvthevcenc=disabled \ + -Dteletext=disabled \ + -Dwasapi=disabled \ + -Dwasapi2=disabled \ + -Dwildmidi=disabled \ + -Dwinks=disabled \ + -Dwinscreencap=disabled \ + -Dwpe=disabled \ + -Dzxing=disabled \ +" + +export OPENCV_PREFIX = "${STAGING_DIR_TARGET}${prefix}" + +ARM_INSTRUCTION_SET:armv4 = "arm" +ARM_INSTRUCTION_SET:armv5 = "arm" + +FILES:${PN}-freeverb += "${datadir}/gstreamer-1.0/presets/GstFreeverb.prs" +FILES:${PN}-opencv += "${datadir}/gst-plugins-bad/1.0/opencv*" +FILES:${PN}-transcode += "${datadir}/gstreamer-1.0/encoding-profiles" +FILES:${PN}-voamrwbenc += "${datadir}/gstreamer-1.0/presets/GstVoAmrwbEnc.prs" + + +########### End of OE-core copy ########### + +########### i.MX overrides ################ + +DEFAULT_PREFERENCE = "-1" + +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fbd65380cdd255951079008b364516c" + +DEPENDS:append:imxgpu2d = " virtual/libg2d" + +SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-${PV}.tar.xz \ + file://0001-fix-maybe-uninitialized-warnings-when-compiling-with.patch \ + file://0002-avoid-including-sys-poll.h-directly.patch \ + " +SRC_URI:prepend = "${GST1.0-PLUGINS-BAD_SRC};branch=${SRCBRANCH} " +GST1.0-PLUGINS-BAD_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-bad.git;protocol=https" +SRCBRANCH = "MM_04.08.01_2308_L6.1.y" +SRCREV = "fd7a399c3a9c43b5675bc2497ad8a23540bf720e" + +S = "${WORKDIR}/git" + +inherit use-imx-headers + +PACKAGE_ARCH:imxpxp = "${MACHINE_SOCARCH}" +PACKAGE_ARCH:mx8-nxp-bsp = "${MACHINE_SOCARCH}" + +PACKAGECONFIG_REMOVE ?= " \ + dtls vulkan \ + ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '', 'gl', d)} \ +" +PACKAGECONFIG:remove = "${PACKAGECONFIG_REMOVE}" +PACKAGECONFIG:append:mx8-nxp-bsp = " kms tinycompress" + +PACKAGECONFIG[tinycompress] = "-Dtinycompress=enabled,-Dtinycompress=disabled,tinycompress" + +EXTRA_OEMESON += " \ + -Dc_args="${CFLAGS} -I${STAGING_INCDIR_IMX}" \ +" + +COMPATIBLE_MACHINE = "(ccimx93)" + +########### End of i.MX overrides ######### diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.0.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.0.imx.bb new file mode 100644 index 000000000..3a7bfa9e4 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.0.imx.bb @@ -0,0 +1,148 @@ +# This recipe is for the i.MX fork of gstreamer1.0-plugins-base. For ease of +# maintenance, the top section is a verbatim copy of an OE-core +# recipe. The second section customizes the recipe for i.MX. + +########### OE-core copy ################## +# Upstream hash: fb2d28e0315ece6180c87c7047587673024a09f7 + +require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc + +DESCRIPTION = "'Base' GStreamer plugins and helper libraries" +HOMEPAGE = "https://gstreamer.freedesktop.org/" +BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues" +LICENSE = "LGPL-2.1-or-later" +LIC_FILES_CHKSUM = "file://COPYING;md5=69333daa044cb77e486cc36129f7a770" + +SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-${PV}.tar.xz \ + file://0001-ENGR00312515-get-caps-from-src-pad-when-query-caps.patch \ + file://0003-viv-fb-Make-sure-config.h-is-included.patch \ + file://0002-ssaparse-enhance-SSA-text-lines-parsing.patch \ + " +SRC_URI[sha256sum] = "f53672294f3985d56355c8b1df8f6b49c8c8721106563e19f53be3507ff2229d" + +S = "${WORKDIR}/gst-plugins-base-${PV}" + +DEPENDS += "iso-codes util-linux zlib" + +inherit gobject-introspection + +# opengl packageconfig factored out to make it easy for distros +# and BSP layers to choose OpenGL APIs/platforms/window systems +PACKAGECONFIG_GL ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl', '', d)}" + +PACKAGECONFIG ??= " \ + ${GSTREAMER_ORC} \ + ${PACKAGECONFIG_GL} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'alsa x11', d)} \ + jpeg ogg pango png theora vorbis \ + ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland egl', '', d)} \ +" + +OPENGL_APIS = 'opengl gles2' +OPENGL_PLATFORMS = 'egl' + +X11DEPENDS = "virtual/libx11 libsm libxrender libxv" +X11ENABLEOPTS = "-Dx11=enabled -Dxvideo=enabled -Dxshm=enabled" +X11DISABLEOPTS = "-Dx11=disabled -Dxvideo=disabled -Dxshm=disabled" + +PACKAGECONFIG[alsa] = "-Dalsa=enabled,-Dalsa=disabled,alsa-lib" +PACKAGECONFIG[cdparanoia] = "-Dcdparanoia=enabled,-Dcdparanoia=disabled,cdparanoia" +PACKAGECONFIG[graphene] = "-Dgl-graphene=enabled,-Dgl-graphene=disabled,graphene" +PACKAGECONFIG[jpeg] = "-Dgl-jpeg=enabled,-Dgl-jpeg=disabled,jpeg" +PACKAGECONFIG[ogg] = "-Dogg=enabled,-Dogg=disabled,libogg" +PACKAGECONFIG[opus] = "-Dopus=enabled,-Dopus=disabled,libopus" +PACKAGECONFIG[pango] = "-Dpango=enabled,-Dpango=disabled,pango" +PACKAGECONFIG[png] = "-Dgl-png=enabled,-Dgl-png=disabled,libpng" +# This enables Qt5 QML examples in -base. The Qt5 GStreamer +# qmlglsink and qmlglsrc plugins still exist in -good. +PACKAGECONFIG[qt5] = "-Dqt5=enabled,-Dqt5=disabled,qtbase qtdeclarative qtbase-native" +PACKAGECONFIG[theora] = "-Dtheora=enabled,-Dtheora=disabled,libtheora" +PACKAGECONFIG[tremor] = "-Dtremor=enabled,-Dtremor=disabled,tremor" +PACKAGECONFIG[visual] = "-Dlibvisual=enabled,-Dlibvisual=disabled,libvisual" +PACKAGECONFIG[vorbis] = "-Dvorbis=enabled,-Dvorbis=disabled,libvorbis" +PACKAGECONFIG[x11] = "${X11ENABLEOPTS},${X11DISABLEOPTS},${X11DEPENDS}" + +# OpenGL API packageconfigs +PACKAGECONFIG[opengl] = ",,virtual/libgl libglu" +PACKAGECONFIG[gles2] = ",,virtual/libgles2" + +# OpenGL platform packageconfigs +PACKAGECONFIG[egl] = ",,virtual/egl" + +# OpenGL window systems (except for X11) +PACKAGECONFIG[gbm] = ",,virtual/libgbm libgudev libdrm" +PACKAGECONFIG[wayland] = ",,wayland-native wayland wayland-protocols libdrm" +PACKAGECONFIG[dispmanx] = ",,virtual/libomxil" +PACKAGECONFIG[viv-fb] = ",,virtual/libgles2 virtual/libg2d" + +OPENGL_WINSYS = "${@bb.utils.filter('PACKAGECONFIG', 'x11 gbm wayland dispmanx egl viv-fb', d)}" + +EXTRA_OEMESON += " \ + -Ddoc=disabled \ + ${@get_opengl_cmdline_list('gl_api', d.getVar('OPENGL_APIS'), d)} \ + ${@get_opengl_cmdline_list('gl_platform', d.getVar('OPENGL_PLATFORMS'), d)} \ + ${@get_opengl_cmdline_list('gl_winsys', d.getVar('OPENGL_WINSYS'), d)} \ +" + +FILES:${PN}-dev += "${libdir}/gstreamer-1.0/include/gst/gl/gstglconfig.h" +FILES:${MLPREFIX}libgsttag-1.0 += "${datadir}/gst-plugins-base/1.0/license-translations.dict" + +def get_opengl_cmdline_list(switch_name, options, d): + selected_options = [] + if bb.utils.contains('DISTRO_FEATURES', 'opengl', True, False, d): + for option in options.split(): + if bb.utils.contains('PACKAGECONFIG', option, True, False, d): + selected_options += [option] + if selected_options: + return '-D' + switch_name + '=' + ','.join(selected_options) + else: + return '' + +CVE_PRODUCT += "gst-plugins-base" + +########### End of OE-core copy ########### + +########### i.MX overrides ################ + +DEFAULT_PREFERENCE = "-1" + +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=69333daa044cb77e486cc36129f7a770" + +SRC_URI:remove = " \ + https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-${PV}.tar.xz \ + file://0001-ENGR00312515-get-caps-from-src-pad-when-query-caps.patch \ + file://0003-viv-fb-Make-sure-config.h-is-included.patch \ + file://0002-ssaparse-enhance-SSA-text-lines-parsing.patch" +SRC_URI:prepend = "${GST1.0-PLUGINS-BASE_SRC};branch=${SRCBRANCH} " + +GST1.0-PLUGINS-BASE_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-base.git;protocol=https" +SRCBRANCH = "MM_04.08.01_2308_L6.1.y" +SRCREV = "f7c109c3b09645266ad41139253f32cf70a7d692" + +S = "${WORKDIR}/git" + +inherit use-imx-headers + +PACKAGECONFIG_GL:imxgpu2d = \ + "${@bb.utils.contains('DISTRO_FEATURES', 'opengl x11', 'opengl viv-fb', '', d)}" +PACKAGECONFIG_GL:imxgpu3d = \ + "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl viv-fb', '', d)}" +PACKAGECONFIG_GL:use-mainline-bsp = \ + "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl gbm', '', d)}" + +PACKAGECONFIG_REMOVE ?= "jpeg" +PACKAGECONFIG:remove = "${PACKAGECONFIG_REMOVE}" +PACKAGECONFIG:append:imxgpu2d = " g2d" + +PACKAGECONFIG[g2d] = ",,virtual/libg2d" +PACKAGECONFIG[viv-fb] = ",,virtual/libgles2" + +EXTRA_OEMESON += "-Dc_args="${CFLAGS} -I${STAGING_INCDIR_IMX}"" + +# links with imx-gpu libs which are pre-built for glibc +# gcompat will address it during runtime +LDFLAGS:append:imxgpu:libc-musl = " -Wl,--allow-shlib-undefined" + +COMPATIBLE_MACHINE = "(ccimx93)" + +########### End of i.MX overrides ######### diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.0.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.0.imx.bb new file mode 100644 index 000000000..7e017c9fa --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.0.imx.bb @@ -0,0 +1,118 @@ +# This recipe is for the i.MX fork of gstreamer1.0-plugins-good. For ease of +# maintenance, the top section is a verbatim copy of an OE-core +# recipe. The second section customizes the recipe for i.MX. + +########### OE-core copy ################## +# Upstream hash: fb2d28e0315ece6180c87c7047587673024a09f7 + +require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc + +DESCRIPTION = "'Good' GStreamer plugins" +HOMEPAGE = "https://gstreamer.freedesktop.org/" +BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues" + +SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${PV}.tar.xz \ + file://0001-qt-include-ext-qt-gstqtgl.h-instead-of-gst-gl-gstglf.patch \ + " + +SRC_URI[sha256sum] = "582e617271e7f314d1a2211e3e3856ae2e4303c8c0d6114e9c4a5ea5719294b0" + +S = "${WORKDIR}/gst-plugins-good-${PV}" + +LICENSE = "LGPL-2.1-or-later" +LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ + file://gst/replaygain/rganalysis.c;beginline=1;endline=23;md5=b60ebefd5b2f5a8e0cab6bfee391a5fe" + +DEPENDS += "gstreamer1.0-plugins-base libcap zlib" +RPROVIDES:${PN}-pulseaudio += "${PN}-pulse" +RPROVIDES:${PN}-soup += "${PN}-souphttpsrc" +RDEPENDS:${PN}-soup += "${MLPREFIX}${@bb.utils.contains('PACKAGECONFIG', 'soup2', 'libsoup-2.4', 'libsoup', d)}" + +PACKAGECONFIG_SOUP ?= "soup3" + +PACKAGECONFIG ??= " \ + ${GSTREAMER_ORC} \ + ${PACKAGECONFIG_SOUP} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'pulseaudio x11', d)} \ + ${@bb.utils.contains('TUNE_FEATURES', 'm64', 'asm', '', d)} \ + bz2 cairo flac gdk-pixbuf gudev jpeg lame libpng mpg123 speex taglib v4l2 \ +" + +X11DEPENDS = "virtual/libx11 libsm libxrender libxfixes libxdamage" +X11ENABLEOPTS = "-Dximagesrc=enabled -Dximagesrc-xshm=enabled -Dximagesrc-xfixes=enabled -Dximagesrc-xdamage=enabled" +X11DISABLEOPTS = "-Dximagesrc=disabled -Dximagesrc-xshm=disabled -Dximagesrc-xfixes=disabled -Dximagesrc-xdamage=disabled" + +QT5WAYLANDDEPENDS = "${@bb.utils.contains("DISTRO_FEATURES", "wayland", "qtwayland", "", d)}" + +PACKAGECONFIG[asm] = "-Dasm=enabled,-Dasm=disabled,nasm-native" +PACKAGECONFIG[bz2] = "-Dbz2=enabled,-Dbz2=disabled,bzip2" +PACKAGECONFIG[cairo] = "-Dcairo=enabled,-Dcairo=disabled,cairo" +PACKAGECONFIG[dv1394] = "-Ddv1394=enabled,-Ddv1394=disabled,libiec61883 libavc1394 libraw1394" +PACKAGECONFIG[flac] = "-Dflac=enabled,-Dflac=disabled,flac" +PACKAGECONFIG[gdk-pixbuf] = "-Dgdk-pixbuf=enabled,-Dgdk-pixbuf=disabled,gdk-pixbuf" +PACKAGECONFIG[gtk] = "-Dgtk3=enabled,-Dgtk3=disabled,gtk+3" +PACKAGECONFIG[gudev] = "-Dv4l2-gudev=enabled,-Dv4l2-gudev=disabled,libgudev" +PACKAGECONFIG[jack] = "-Djack=enabled,-Djack=disabled,jack" +PACKAGECONFIG[jpeg] = "-Djpeg=enabled,-Djpeg=disabled,jpeg" +PACKAGECONFIG[lame] = "-Dlame=enabled,-Dlame=disabled,lame" +PACKAGECONFIG[libpng] = "-Dpng=enabled,-Dpng=disabled,libpng" +PACKAGECONFIG[libv4l2] = "-Dv4l2-libv4l2=enabled,-Dv4l2-libv4l2=disabled,v4l-utils" +PACKAGECONFIG[mpg123] = "-Dmpg123=enabled,-Dmpg123=disabled,mpg123" +PACKAGECONFIG[pulseaudio] = "-Dpulse=enabled,-Dpulse=disabled,pulseaudio" +PACKAGECONFIG[qt5] = "-Dqt5=enabled,-Dqt5=disabled,qtbase qtdeclarative qtbase-native ${QT5WAYLANDDEPENDS}" +PACKAGECONFIG[soup2] = "-Dsoup=enabled,,libsoup-2.4,,,soup3" +PACKAGECONFIG[soup3] = "-Dsoup=enabled,,libsoup,,,soup2" +PACKAGECONFIG[speex] = "-Dspeex=enabled,-Dspeex=disabled,speex" +PACKAGECONFIG[rpi] = "-Drpicamsrc=enabled,-Drpicamsrc=disabled,userland" +PACKAGECONFIG[taglib] = "-Dtaglib=enabled,-Dtaglib=disabled,taglib" +PACKAGECONFIG[v4l2] = "-Dv4l2=enabled -Dv4l2-probe=true,-Dv4l2=disabled -Dv4l2-probe=false" +PACKAGECONFIG[vpx] = "-Dvpx=enabled,-Dvpx=disabled,libvpx" +PACKAGECONFIG[wavpack] = "-Dwavpack=enabled,-Dwavpack=disabled,wavpack" +PACKAGECONFIG[x11] = "${X11ENABLEOPTS},${X11DISABLEOPTS},${X11DEPENDS}" + +EXTRA_OEMESON += " \ + -Ddoc=disabled \ + -Daalib=disabled \ + -Ddirectsound=disabled \ + -Ddv=disabled \ + -Dlibcaca=disabled \ + -Doss=enabled \ + -Doss4=disabled \ + -Dosxaudio=disabled \ + -Dosxvideo=disabled \ + -Dshout2=disabled \ + -Dtwolame=disabled \ + -Dwaveform=disabled \ +" + +FILES:${PN}-equalizer += "${datadir}/gstreamer-1.0/presets/*.prs" + +########### End of OE-core copy ########### + +########### i.MX overrides ################ + +DEFAULT_PREFERENCE = "-1" + +LIC_FILES_CHKSUM = " \ + file://LICENSE.txt;md5=a6f89e2100d9b6cdffcea4f398e37343 \ + file://gst/replaygain/rganalysis.c;beginline=1;endline=23;md5=b60ebefd5b2f5a8e0cab6bfee391a5fe \ +" + +# fb implementation of v4l2 uses libdrm +DEPENDS += "${@bb.utils.contains('PACKAGECONFIG', 'v4l2', '${DEPENDS_V4L2}', '', d)}" +DEPENDS_V4L2 = "${@bb.utils.contains_any('DISTRO_FEATURES', 'wayland x11', '', 'libdrm', d)}" + +SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${PV}.tar.xz \ + file://0001-qt-include-ext-qt-gstqtgl.h-instead-of-gst-gl-gstglf.patch \ +" + +SRC_URI:prepend = "${GST1.0-PLUGINS-GOOD_SRC};branch=${SRCBRANCH} " +GST1.0-PLUGINS-GOOD_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-good.git;protocol=https" +SRCBRANCH = "MM_04.08.01_2308_L6.1.y" +SRCREV = "ca3ef27dd4020393bfda546a25a3fa28314276e1" + +S = "${WORKDIR}/git" + +COMPATIBLE_MACHINE = "(ccimx93)" + +########### End of i.MX overrides ######### diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.0.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.0.bb new file mode 100644 index 000000000..17af53d30 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.0.bb @@ -0,0 +1,12 @@ +# Copyright 2023 Digi International Inc. + +# +# Reuse poky's gstreamer1.0-plugins-ugly_1.20.7.bb +# +require recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.20.7.bb + +LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" + +SRC_URI[sha256sum] = "a644dc981afa2d8d3a913f763ab9523c0620ee4e65a7ec73c7721c29da3c5a0c" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0/run-ptest b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0/run-ptest new file mode 100755 index 000000000..0cfa955f0 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0/run-ptest @@ -0,0 +1,2 @@ +#!/usr/bin/env sh +gnome-desktop-testing-runner gstreamer diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.0.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.0.imx.bb new file mode 100644 index 000000000..90d0ed55d --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.22.0.imx.bb @@ -0,0 +1,110 @@ +# This recipe is for the i.MX fork of gstreamer1.0. For ease of +# maintenance, the top section is a verbatim copy of an OE-core +# recipe. The second section customizes the recipe for i.MX. + +########### OE-core copy ################## +# Upstream hash: fb2d28e0315ece6180c87c7047587673024a09f7 + +SUMMARY = "GStreamer 1.0 multimedia framework" +DESCRIPTION = "GStreamer is a multimedia framework for encoding and decoding video and sound. \ +It supports a wide range of formats including mp3, ogg, avi, mpeg and quicktime." +HOMEPAGE = "http://gstreamer.freedesktop.org/" +BUGTRACKER = "https://bugzilla.gnome.org/enter_bug.cgi?product=Gstreamer" +SECTION = "multimedia" +LICENSE = "LGPL-2.1-or-later" + +DEPENDS = "glib-2.0 glib-2.0-native libxml2 bison-native flex-native" + +inherit meson pkgconfig gettext upstream-version-is-even gobject-introspection ptest-gnome + +LIC_FILES_CHKSUM = "file://COPYING;md5=69333daa044cb77e486cc36129f7a770 \ + file://gst/gst.h;beginline=1;endline=21;md5=e059138481205ee2c6fc1c079c016d0d" + +S = "${WORKDIR}/gstreamer-${PV}" + +SRC_URI = "https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.xz \ + file://run-ptest \ + file://0001-tests-respect-the-idententaion-used-in-meson.patch \ + file://0002-tests-add-support-for-install-the-tests.patch \ + file://0003-tests-use-a-dictionaries-for-environment.patch;striplevel=3 \ + file://0004-tests-add-helper-script-to-run-the-installed_tests.patch;striplevel=3 \ + " +SRC_URI[sha256sum] = "78d21b5469ac93edafc6d8ceb63bc82f6cbbee94d2f866cca6b9252157ee0a09" + +PACKAGECONFIG ??= "${@bb.utils.contains('PTEST_ENABLED', '1', 'tests', '', d)} \ + check \ + debug \ + tools" + +PACKAGECONFIG[debug] = "-Dgst_debug=true,-Dgst_debug=false" +PACKAGECONFIG[tracer-hooks] = "-Dtracer_hooks=true,-Dtracer_hooks=false" +PACKAGECONFIG[coretracers] = "-Dcoretracers=enabled,-Dcoretracers=disabled" +PACKAGECONFIG[check] = "-Dcheck=enabled,-Dcheck=disabled" +PACKAGECONFIG[tests] = "-Dtests=enabled -Dinstalled_tests=true,-Dtests=disabled -Dinstalled_tests=false" +PACKAGECONFIG[unwind] = "-Dlibunwind=enabled,-Dlibunwind=disabled,libunwind" +PACKAGECONFIG[dw] = "-Dlibdw=enabled,-Dlibdw=disabled,elfutils" +PACKAGECONFIG[bash-completion] = "-Dbash-completion=enabled,-Dbash-completion=disabled,bash-completion" +PACKAGECONFIG[tools] = "-Dtools=enabled,-Dtools=disabled" +PACKAGECONFIG[setcap] = "-Dptp-helper-permissions=capabilities,,libcap libcap-native" + +# TODO: put this in a gettext.bbclass patch +def gettext_oemeson(d): + if d.getVar('USE_NLS') == 'no': + return '-Dnls=disabled' + # Remove the NLS bits if USE_NLS is no or INHIBIT_DEFAULT_DEPS is set + if d.getVar('INHIBIT_DEFAULT_DEPS') and not oe.utils.inherits(d, 'cross-canadian'): + return '-Dnls=disabled' + return '-Dnls=enabled' + +EXTRA_OEMESON += " \ + -Ddoc=disabled \ + -Dexamples=disabled \ + -Ddbghelp=disabled \ + ${@gettext_oemeson(d)} \ +" + +GIR_MESON_ENABLE_FLAG = "enabled" +GIR_MESON_DISABLE_FLAG = "disabled" + +PACKAGES += "${PN}-bash-completion" + +# Add the core element plugins to the main package +FILES:${PN} += "${libdir}/gstreamer-1.0/*.so" +FILES:${PN}-dev += "${libdir}/gstreamer-1.0/*.a ${libdir}/gstreamer-1.0/include" +FILES:${PN}-bash-completion += "${datadir}/bash-completion/completions/ ${datadir}/bash-completion/helpers/gst*" +FILES:${PN}-dbg += "${datadir}/gdb ${datadir}/gstreamer-1.0/gdb" + +CVE_PRODUCT = "gstreamer" + +PTEST_BUILD_HOST_FILES = "" + +########### End of OE-core copy ########### + +########### i.MX overrides ################ + +DEFAULT_PREFERENCE = "-1" + +LIC_FILES_CHKSUM = " \ + file://LICENSE.txt;md5=69333daa044cb77e486cc36129f7a770 \ + file://gst/gst.h;beginline=1;endline=21;md5=e059138481205ee2c6fc1c079c016d0d \ +" + +# Use i.MX fork of GST for customizations +SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.xz \ + file://0001-tests-respect-the-idententaion-used-in-meson.patch \ + file://0002-tests-add-support-for-install-the-tests.patch \ + file://0003-tests-use-a-dictionaries-for-environment.patch;striplevel=3 \ + file://0004-tests-add-helper-script-to-run-the-installed_tests.patch;striplevel=3 \ +" +SRC_URI:prepend = "${GST1.0_SRC};branch=${SRCBRANCH} " +GST1.0_SRC ?= "gitsm://github.com/nxp-imx/gstreamer.git;protocol=https" +SRCBRANCH = "MM_04.08.01_2308_L6.1.y" +SRCREV = "95112902507718085231a933cdfe54e3997d1b28" + +S = "${WORKDIR}/git" + +PACKAGECONFIG[tests] = "-Dtests=enabled,-Dtests=disabled" + +COMPATIBLE_MACHINE = "(ccimx93)" + +########### End of i.MX overrides ######### diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend index 26165cb13..7fe9b3acc 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend @@ -1,4 +1,4 @@ -# Copyright (C) 2016-2022 Digi International Inc. +# Copyright (C) 2016-2023 Digi International Inc. FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" @@ -6,3 +6,8 @@ SRC_URI += " \ file://0001-gstimxv4l2-map-dev-video1-to-dev-fb0.patch \ file://0002-imx-gst1.0-plugin-fix-build-using-MUSL-C-library.patch \ " + +LIC_FILES_CHKSUM:ccimx93 = "file://LICENSE.txt;md5=fbc093901857fcd118f065f900982c24" +PV:ccimx93 = "4.8.1+git${SRCPV}" +SRCBRANCH:ccimx93 = "MM_04.08.01_2308_L6.1.y" +SRCREV:ccimx93 = "903c03e8611a107508b1f60e4736df208e72247d" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.1.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.1.bb new file mode 100644 index 000000000..88544b5a9 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-codec/imx-codec_4.8.1.bb @@ -0,0 +1,13 @@ +# Copyright 2023 Digi International Inc. + +# +# Reuse meta-freescale's imx-codec_4.7.2.bb +# +require recipes-multimedia/imx-codec/imx-codec_4.7.2.bb + +LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" + +SRC_URI[md5sum] = "a47f6407459ab4889e1bd9651b9dd40b" +SRC_URI[sha256sum] = "0d0668dadbd69c40c1d0e29cbf4082df008a7cb7ec7e5cfe7d8f228395bdaf58" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.1.5.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.1.5.bb new file mode 100644 index 000000000..453ed5db9 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.1.5.bb @@ -0,0 +1,13 @@ +# Copyright 2023 Digi International Inc. + +# +# Reuse meta-freescale's imx-dsp-codec-ext_2.0.2.bb +# +require recipes-multimedia/imx-dsp/imx-dsp-codec-ext_2.0.2.bb + +LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" + +SRC_URI[md5sum] = "4619cebbad2f312b950a9ad2b2e30e24" +SRC_URI[sha256sum] = "89ac92b348aa70c81dcbf6a9ee4bc99bec56a491a89f5ba9854eab77e5fd4298" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp_2.1.5.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp_2.1.5.bb new file mode 100644 index 000000000..cc3159c56 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-dsp/imx-dsp_2.1.5.bb @@ -0,0 +1,13 @@ +# Copyright 2023 Digi International Inc. + +# +# Reuse meta-freescale's imx-dsp_2.0.2.bb +# +require recipes-multimedia/imx-dsp/imx-dsp_2.0.2.bb + +LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" + +SRC_URI[md5sum] = "2b2581a4b24735f4e449a161a334e04d" +SRC_URI[sha256sum] = "11f4e89c0d3c61ac591aa3e00e345d7cc8d0d2627a915253f920cdcf4492a7d5" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.1.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.1.bb new file mode 100644 index 000000000..f308ece19 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/imx-parser/imx-parser_4.8.1.bb @@ -0,0 +1,13 @@ +# Copyright 2023 Digi International Inc. + +# +# Reuse meta-freescale's imx-parser_4.7.2.bb +# +require recipes-multimedia/imx-parser/imx-parser_4.7.2.bb + +LIC_FILES_CHKSUM = "file://COPYING;md5=db4762b09b6bda63da103963e6e081de" + +SRC_URI[md5sum] = "c7a8aae8114d0756ed858000b78e9d8e" +SRC_URI[sha256sum] = "73b8ce76507f25d72192862a939405625086a6631fba6f58e4e6bef2614fd202" + +COMPATIBLE_MACHINE = "(ccimx93)" From b48f2806eb94af0e90e136acb6dcb47045a42bfc Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 15 Nov 2023 18:55:15 +0100 Subject: [PATCH 049/118] ccimx93: update graphics package for NXP release 6.1.36-2.1.0 Backport of graphics package for ccimx93 from NXP's Mickledore-based 6.1.36-2.1.0 release. Mainly copies and appends of graphics recipes from the new release, and restricted to ccimx93 by changing the COMPATIBLE_MACHINE, so it does not affect other platforms. Notice, that the new version of weston used now by the ccimx93 requires a different profile file (weston-socket.sh). This profile supercedes the old 'weston.sh'. Signed-off-by: Javier Viguera --- .../conf/machine/include/ccimx93.inc | 8 + .../drm/libdrm_2.4.115.imx.bb | 74 +++++++ .../imx-g2d/imx-pxp-g2d_git.bbappend | 5 + ...build-Fix-strndup-detection-on-MinGW.patch | 41 ++++ .../wayland/wayland/run-ptest | 17 ++ .../wayland/wayland_1.22.0.imx.bb | 67 +++++++ .../xwayland/xwayland_23.1.1.imx.bb | 53 +++++ .../linux/linux-imx-headers_6.1.bb | 14 ++ .../wayland/required-distro-features.inc | 8 + .../wayland/wayland-protocols_1.32.imx.bb | 16 ++ ...and_%.bbappend => wayland_1.20.0.bbappend} | 0 ...no-found-wayland-scanner-with-Yocto-.patch | 40 ++++ .../systemd-notify.weston-start | 9 + .../wayland/weston-11.0.2.imx/weston.desktop | 9 + .../wayland/weston-11.0.2.imx/weston.png | Bin 0 -> 2383 bytes .../weston-11.0.2.imx/xwayland.weston-start | 6 + .../wayland/weston-init.bbappend | 8 +- .../weston-init/ccimx93/weston-socket.sh | 20 ++ .../wayland/weston-init/ccimx93/weston.ini | 36 ++++ .../wayland/weston_11.0.2.imx.bb | 189 ++++++++++++++++++ 20 files changed, 619 insertions(+), 1 deletion(-) create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/drm/libdrm_2.4.115.imx.bb create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-pxp-g2d_git.bbappend create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland/0001-build-Fix-strndup-detection-on-MinGW.patch create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland/run-ptest create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland_1.22.0.imx.bb create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/xwayland/xwayland_23.1.1.imx.bb create mode 100644 meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/linux/linux-imx-headers_6.1.bb create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/required-distro-features.inc create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland-protocols_1.32.imx.bb rename meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/{wayland_%.bbappend => wayland_1.20.0.bbappend} (100%) create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/systemd-notify.weston-start create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.desktop create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.png create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/xwayland.weston-start create mode 100755 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init/ccimx93/weston-socket.sh create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init/ccimx93/weston.ini create mode 100644 meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.2.imx.bb diff --git a/meta-digi-arm/conf/machine/include/ccimx93.inc b/meta-digi-arm/conf/machine/include/ccimx93.inc index cbafa67ef..3ebd5fbc9 100644 --- a/meta-digi-arm/conf/machine/include/ccimx93.inc +++ b/meta-digi-arm/conf/machine/include/ccimx93.inc @@ -82,3 +82,11 @@ PREFERRED_VERSION_gstreamer1.0-plugins-bad:ccimx93 ?= "1.22.0.imx" PREFERRED_VERSION_gstreamer1.0-plugins-base:ccimx93 ?= "1.22.0.imx" PREFERRED_VERSION_gstreamer1.0-plugins-good:ccimx93 ?= "1.22.0.imx" PREFERRED_VERSION_gstreamer1.0-plugins-ugly:ccimx93 ?= "1.22.0" + +PREFERRED_VERSION_libdrm:ccimx93 ?= "2.4.115.imx" +PREFERRED_VERSION_nativesdk-wayland:ccimx93 ?= "1.22.0.imx" +PREFERRED_VERSION_wayland:ccimx93 ?= "1.22.0.imx" +PREFERRED_VERSION_wayland-native:ccimx93 ?= "1.22.0.imx" +PREFERRED_VERSION_wayland-protocols:ccimx93 ?= "1.32.imx" +PREFERRED_VERSION_weston:ccimx93 ?= "11.0.2.imx" +PREFERRED_VERSION_xwayland:ccimx93 ?= "23.1.1.imx" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/drm/libdrm_2.4.115.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/drm/libdrm_2.4.115.imx.bb new file mode 100644 index 000000000..19e42613d --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/drm/libdrm_2.4.115.imx.bb @@ -0,0 +1,74 @@ +SUMMARY = "Userspace interface to the kernel DRM services" +DESCRIPTION = "The runtime library for accessing the kernel DRM services. DRM \ +stands for \"Direct Rendering Manager\", which is the kernel portion of the \ +\"Direct Rendering Infrastructure\" (DRI). DRI is required for many hardware \ +accelerated OpenGL drivers." +HOMEPAGE = "http://dri.freedesktop.org" +SECTION = "x11/base" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=9eb1f4831351ab42d762c40b3ebb7add \ + file://xf86drm.c;beginline=9;endline=32;md5=c8a3b961af7667c530816761e949dc71" +PROVIDES = "drm" +DEPENDS = "libpthread-stubs" + +SRC_URI = "${IMX_LIBDRM_SRC};branch=${SRCBRANCH}" +IMX_LIBDRM_SRC ?= "git://github.com/nxp-imx/libdrm-imx.git;protocol=https;nobranch=1" +SRCBRANCH ?= "libdrm-imx-2.4.115" +SRCREV = "0f889a1f9640f6210132dd565141eb19005245fb" + +S = "${WORKDIR}/git" + +DEFAULT_PREFERENCE = "-1" +COMPATIBLE_MACHINE = "(ccimx93)" + +inherit meson pkgconfig manpages + +PACKAGECONFIG ??= "intel radeon amdgpu nouveau vmwgfx omap freedreno vc4 etnaviv tests install-test-programs" +PACKAGECONFIG[intel] = "-Dintel=enabled,-Dintel=disabled,libpciaccess" +PACKAGECONFIG[radeon] = "-Dradeon=enabled,-Dradeon=disabled" +PACKAGECONFIG[amdgpu] = "-Damdgpu=enabled,-Damdgpu=disabled" +PACKAGECONFIG[nouveau] = "-Dnouveau=enabled,-Dnouveau=disabled" +PACKAGECONFIG[vmwgfx] = "-Dvmwgfx=enabled,-Dvmwgfx=disabled" +PACKAGECONFIG[omap] = "-Domap=enabled,-Domap=disabled" +PACKAGECONFIG[exynos] = "-Dexynos=enabled,-Dexynos=disabled" +PACKAGECONFIG[freedreno] = "-Dfreedreno=enabled,-Dfreedreno=disabled" +PACKAGECONFIG[tegra] = "-Dtegra=enabled,-Dtegra=disabled" +PACKAGECONFIG[vc4] = "-Dvc4=enabled,-Dvc4=disabled" +PACKAGECONFIG[etnaviv] = "-Detnaviv=enabled,-Detnaviv=disabled" +PACKAGECONFIG[freedreno-kgsl] = "-Dfreedreno-kgsl=true,-Dfreedreno-kgsl=false" +PACKAGECONFIG[valgrind] = "-Dvalgrind=enabled,-Dvalgrind=disabled,valgrind" +PACKAGECONFIG[install-test-programs] = "-Dinstall-test-programs=true,-Dinstall-test-programs=false" +PACKAGECONFIG[cairo-tests] = "-Dcairo-tests=enabled,-Dcairo-tests=disabled" +PACKAGECONFIG[tests] = "-Dtests=true,-Dtests=false" +PACKAGECONFIG[udev] = "-Dudev=true,-Dudev=false,udev" +PACKAGECONFIG[manpages] = "-Dman-pages=enabled,-Dman-pages=disabled,libxslt-native xmlto-native python3-docutils-native" + +ALLOW_EMPTY:${PN}-drivers = "1" +PACKAGES =+ "${PN}-tests ${PN}-drivers ${PN}-radeon ${PN}-nouveau ${PN}-omap \ + ${PN}-intel ${PN}-exynos ${PN}-kms ${PN}-freedreno ${PN}-amdgpu \ + ${PN}-etnaviv" + +RRECOMMENDS:${PN}-drivers = "${PN}-radeon ${PN}-nouveau ${PN}-omap ${PN}-intel \ + ${PN}-exynos ${PN}-freedreno ${PN}-amdgpu \ + ${PN}-etnaviv" + +FILES:${PN}-tests = "${bindir}/*" +FILES:${PN}-radeon = "${libdir}/libdrm_radeon.so.*" +FILES:${PN}-nouveau = "${libdir}/libdrm_nouveau.so.*" +FILES:${PN}-omap = "${libdir}/libdrm_omap.so.*" +FILES:${PN}-intel = "${libdir}/libdrm_intel.so.*" +FILES:${PN}-exynos = "${libdir}/libdrm_exynos.so.*" +FILES:${PN}-kms = "${libdir}/libkms*.so.*" +FILES:${PN}-freedreno = "${libdir}/libdrm_freedreno.so.*" +FILES:${PN}-amdgpu = "${libdir}/libdrm_amdgpu.so.* ${datadir}/${PN}/amdgpu.ids" +FILES:${PN}-etnaviv = "${libdir}/libdrm_etnaviv.so.*" + +BBCLASSEXTEND = "native nativesdk" + +PACKAGES:prepend:imxgpu = "${PN}-vivante " +RRECOMMENDS:${PN}-drivers:append:imxgpu = " ${PN}-vivante" +FILES:${PN}-vivante = "${libdir}/libdrm_vivante.so.*" +PACKAGECONFIG:append:imxgpu = " vivante" +PACKAGECONFIG[vivante] = "-Dvivante=true,-Dvivante=false" + +PACKAGE_ARCH = "${MACHINE_SOCARCH}" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-pxp-g2d_git.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-pxp-g2d_git.bbappend new file mode 100644 index 000000000..415c0e026 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/imx-g2d/imx-pxp-g2d_git.bbappend @@ -0,0 +1,5 @@ +# Copyright 2023 Digi International Inc. + +LIC_FILES_CHKSUM:ccimx93 = "file://LICENSE.txt;md5=db4762b09b6bda63da103963e6e081de" + +SRCREV:ccimx93 = "8d8b48c7c3d95b6c54093a09873ae796a0f09e8a" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland/0001-build-Fix-strndup-detection-on-MinGW.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland/0001-build-Fix-strndup-detection-on-MinGW.patch new file mode 100644 index 000000000..bc753de11 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland/0001-build-Fix-strndup-detection-on-MinGW.patch @@ -0,0 +1,41 @@ +From b4c64b6f07743e3fb63ce52359bc664ab7d60df0 Mon Sep 17 00:00:00 2001 +From: Joshua Watt +Date: Thu, 20 Feb 2020 15:20:45 -0600 +Subject: [PATCH] build: Fix strndup detection on MinGW + +GCC and meson conspire together to incorrectly detect that strndup() +exists on MinGW as __builtin_strndup, when no such function exists. As a +work around, meson will skip looking for __builtin functions if an +'#include' is in the prefix, so add '#include ' when looking +for strndup(). + +See: https://github.com/mesonbuild/meson/issues/3672 + +Upstream-Status: Submitted [https://gitlab.freedesktop.org/wayland/wayland/merge_requests/63] + +Signed-off-by: Joshua Watt +Signed-off-by: Denys Dmytriyenko +--- + meson.build | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/meson.build b/meson.build +index 3bc25c9..adde7b9 100644 +--- a/meson.build ++++ b/meson.build +@@ -38,11 +38,11 @@ have_funcs = [ + 'prctl', + 'memfd_create', + 'mremap', +- 'strndup', + ] + foreach f: have_funcs + config_h.set('HAVE_' + f.underscorify().to_upper(), cc.has_function(f)) + endforeach ++config_h.set('HAVE_STRNDUP', cc.has_function('strndup') and cc.has_header_symbol('string.h', 'strndup')) + config_h.set10('HAVE_XUCRED_CR_PID', cc.has_member('struct xucred', 'cr_pid', prefix : '#include ')) + have_broken_msg_cmsg_cloexec = false + if host_machine.system() == 'freebsd' +-- +2.7.4 + diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland/run-ptest b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland/run-ptest new file mode 100644 index 000000000..7e8d9de04 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland/run-ptest @@ -0,0 +1,17 @@ +#!/bin/sh + +export WAYLAND_SCANNER=wayland-scanner +export TEST_DATA_DIR=tests/data +export TEST_OUTPUT_DIR=tests/output +export SED=sed +export WAYLAND_EGL_LIB=/usr/lib/libwayland-egl.so.1 +export NM=nm + +for i in `ls tests/*-test tests/wayland-egl-symbols-check tests/scanner-test.sh`; do + $i + if [ $? -eq 0 ]; then + echo "PASS: $i" + else + echo "FAIL: $i" + fi +done diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland_1.22.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland_1.22.0.imx.bb new file mode 100644 index 000000000..eb1066c82 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland_1.22.0.imx.bb @@ -0,0 +1,67 @@ +SUMMARY = "Wayland, a protocol between a compositor and clients" +DESCRIPTION = "Wayland is a protocol for a compositor to talk to its clients \ +as well as a C library implementation of that protocol. The compositor can be \ +a standalone display server running on Linux kernel modesetting and evdev \ +input devices, an X application, or a wayland client itself. The clients can \ +be traditional applications, X servers (rootless or fullscreen) or other \ +display servers." +HOMEPAGE = "http://wayland.freedesktop.org" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING;md5=b31d8f53b6aaf2b4985d7dd7810a70d1 \ + file://src/wayland-server.c;endline=24;md5=b8e046164a766bb1ede8ba38e9dcd7ce" + +DEPENDS = "expat libffi wayland-native" + +SRC_URI = "https://gitlab.freedesktop.org/wayland/wayland/-/releases/1.22.0/downloads/${BP_ORIGINAL}.tar.xz \ + file://run-ptest \ + file://0001-build-Fix-strndup-detection-on-MinGW.patch \ + " +SRC_URI[sha256sum] = "1540af1ea698a471c2d8e9d288332c7e0fd360c8f1d12936ebb7e7cbc2425842" +BP_ORIGINAL = "${BPN}-1.22.0" +S = "${WORKDIR}/${BP_ORIGINAL}" + +UPSTREAM_CHECK_URI = "https://wayland.freedesktop.org/releases.html" +UPSTREAM_CHECK_REGEX = "wayland-(?P\d+\.\d+\.(?!9\d+)\d+)" + +inherit meson pkgconfig ptest + +PACKAGECONFIG ??= "dtd-validation" +PACKAGECONFIG[dtd-validation] = "-Ddtd_validation=true,-Ddtd_validation=false,libxml2,," + +EXTRA_OEMESON = "-Ddocumentation=false" +EXTRA_OEMESON:class-native = "-Ddocumentation=false" + +# Wayland installs a M4 macro for other projects to use, which uses the target +# pkg-config to find files. Replace pkg-config with pkg-config-native. +do_install:append:class-native() { + sed -e 's,PKG_CHECK_MODULES(.*),,g' \ + -e 's,$PKG_CONFIG,pkg-config-native,g' \ + -i ${D}/${datadir}/aclocal/wayland-scanner.m4 +} + +do_install_ptest() { + mkdir -p ${D}${PTEST_PATH}/tests/data + cp -rf ${B}/tests/*-test ${B}/tests/*-checker ${D}${PTEST_PATH}/tests + cp -rf ${B}/tests/*-checker ${D}${PTEST_PATH} + cp -rf ${S}/tests/scanner-test.sh ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/data/* ${D}${PTEST_PATH}/tests/data/ + cp -rf ${S}/egl/wayland-egl-symbols-check ${D}${PTEST_PATH}/tests/ +} + +sysroot_stage_all:append:class-target () { + rm ${SYSROOT_DESTDIR}/${datadir}/aclocal/wayland-scanner.m4 + cp ${STAGING_DATADIR_NATIVE}/aclocal/wayland-scanner.m4 ${SYSROOT_DESTDIR}/${datadir}/aclocal/ +} + +PACKAGES =+ "${PN}-tools" + +FILES:${PN}-tools = "${bindir}/wayland-scanner" +FILES:${PN}-dev += "${datadir}/${BPN}/wayland-scanner.mk" + +BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN}-ptest += "binutils sed ${PN}-tools" + +PACKAGE_ARCH = "${MACHINE_SOCARCH}" + +DEFAULT_PREFERENCE = "-1" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/xwayland/xwayland_23.1.1.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/xwayland/xwayland_23.1.1.imx.bb new file mode 100644 index 000000000..a9705a233 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/xwayland/xwayland_23.1.1.imx.bb @@ -0,0 +1,53 @@ +# This recipe copy helps keep meta-freescale master branch compatible +# with Yocto langdale. +# (From OE-Core rev: 35fdbd0ea81650a0421d50fb53989d96c5956331) + +SUMMARY = "XWayland is an X Server that runs under Wayland." +DESCRIPTION = "XWayland is an X Server running as a Wayland client, \ +and thus is capable of displaying native X11 client applications in a \ +Wayland compositor environment. The goal of XWayland is to facilitate \ +the transition from X Window System to Wayland environments, providing \ +a way to run unported applications in the meantime." +HOMEPAGE = "https://fedoraproject.org/wiki/Changes/XwaylandStandalone" + +DEFAULT_PREFERENCE = "-1" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING;md5=5df87950af51ac2c5822094553ea1880" + +SRC_URI = "https://www.x.org/archive/individual/xserver/${BP_ORIGINAL}.tar.xz" +BP_ORIGINAL = "${BPN}-23.1.1" +SRC_URI[sha256sum] = "fb9461f5cb9fea5e07e91882311b0c88b43e8843b017ebac05eb5af69aa34c15" +S = "${WORKDIR}/${BP_ORIGINAL}" + +UPSTREAM_CHECK_REGEX = "xwayland-(?P\d+(\.(?!90\d)\d+)+)\.tar" + +inherit meson features_check pkgconfig +REQUIRED_DISTRO_FEATURES = "x11 opengl" + +DEPENDS += "xorgproto xtrans pixman libxkbfile libxfont2 wayland wayland-native wayland-protocols libdrm libepoxy libxcvt" + +OPENGL_PKGCONFIGS = "glx glamor dri3" +PACKAGECONFIG ??= "${XORG_CRYPTO} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', '${OPENGL_PKGCONFIGS}', '', d)} \ +" +PACKAGECONFIG[dri3] = "-Ddri3=true,-Ddri3=false,libxshmfence" +PACKAGECONFIG[glx] = "-Dglx=true,-Dglx=false,virtual/libgl virtual/libx11" +PACKAGECONFIG[glamor] = "-Dglamor=true,-Dglamor=false,libepoxy virtual/libgbm,libegl" +PACKAGECONFIG[unwind] = "-Dlibunwind=true,-Dlibunwind=false,libunwind" +PACKAGECONFIG[xinerama] = "-Dxinerama=true,-Dxinerama=false" + +# Xorg requires a SHA1 implementation, pick one +XORG_CRYPTO ??= "openssl" +PACKAGECONFIG[openssl] = "-Dsha1=libcrypto,,openssl" +PACKAGECONFIG[nettle] = "-Dsha1=libnettle,,nettle" +PACKAGECONFIG[gcrypt] = "-Dsha1=libgcrypt,,libgcrypt" + +do_install:append() { + # remove files not needed and clashing with xserver-xorg + rm -rf ${D}/${libdir}/xorg/ +} + +FILES:${PN} += "${libdir}/xorg/protocol.txt" + +RDEPENDS:${PN} += "xkbcomp" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/linux/linux-imx-headers_6.1.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/linux/linux-imx-headers_6.1.bb new file mode 100644 index 000000000..bec64d9b7 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/linux/linux-imx-headers_6.1.bb @@ -0,0 +1,14 @@ +# Copyright 2023 Digi International Inc. + +# +# Reuse meta-freescale's linux-imx-headers_5.15.bb +# +require recipes-kernel/linux/linux-imx-headers_5.15.bb + +SRCBRANCH = "lf-6.1.y" +LOCALVERSION = "-6.1.36-2.1.0" +SRCREV = "04b05c5527e9af8d81254638c307df07dc9a5dd3" + +IMX_UAPI_HEADERS:remove = "isl29023.h" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/required-distro-features.inc b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/required-distro-features.inc new file mode 100644 index 000000000..bb4a0e8eb --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/required-distro-features.inc @@ -0,0 +1,8 @@ +# distro features required by weston recipes + +inherit features_check + +# requires pam enabled if started via systemd +# +REQUIRED_DISTRO_FEATURES = "wayland opengl ${@oe.utils.conditional('VIRTUAL-RUNTIME_init_manager', 'systemd', 'pam', '', d)}" + diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland-protocols_1.32.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland-protocols_1.32.imx.bb new file mode 100644 index 000000000..753f901ab --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland-protocols_1.32.imx.bb @@ -0,0 +1,16 @@ +# Copyright 2023 Digi International Inc. + +# +# Reuse meta-freescale's wayland-protocols_1.25.imx.bb +# +require recipes-graphics/wayland/wayland-protocols_1.25.imx.bb + +LIC_FILES_CHKSUM = "file://LICENSE;md5=c7b12b6702da38ca028ace54aae3d484 \ + file://stable/presentation-time/presentation-time.xml;endline=26;md5=4646cd7d9edc9fa55db941f2d3a7dc53" + +SRC_URI = "git://github.com/nxp-imx/wayland-protocols-imx.git;protocol=https;branch=wayland-protocols-imx-1.32" +SRCREV = "7ece577d467f8afb2f5a2f7fff3761a1e0ee9dad" + +BBCLASSEXTEND = "native nativesdk" + +COMPATIBLE_MACHINE = "(ccimx93)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland_%.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland_1.20.0.bbappend similarity index 100% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland_%.bbappend rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/wayland_1.20.0.bbappend diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch new file mode 100644 index 000000000..39439ce16 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch @@ -0,0 +1,40 @@ +From 3aa4024ac4107e68552be4dfe5fce511900629c9 Mon Sep 17 00:00:00 2001 +From: Max Krummenacher +Date: Mon, 11 Jul 2022 19:38:19 +0000 +Subject: [PATCH] Revert "protocol: no found wayland-scanner with Yocto + toolchain" + +This reverts commit 7859a762617682bd804e210ad3bda6bdcd3ea24a. + +With openembedded commit e525db4eb9 ("wayland: update 1.20.0 -> 1.21.0") +package config seems no longer to provide the path to the native +weston scanner. + +Thus the build fails with: + +| Run-time dependency wayland-scanner found: YES 1.21.0 +| Program /usr/bin/wayland-scanner found: NO +| +| ../git/protocol/meson.build:2:0: ERROR: Program '/usr/bin/wayland-scanner' not found or not executable + +Dropping weston 9.0.0-imx commit 7859a762 (protocol: no found +wayland-scanner with Yocto toolchain") fixes the issue. + +Signed-off-by: Max Krummenacher +--- + protocol/meson.build | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/protocol/meson.build b/protocol/meson.build +index e8698530..ba52089b 100644 +--- a/protocol/meson.build ++++ b/protocol/meson.build +@@ -1,4 +1,4 @@ +-dep_scanner = dependency('wayland-scanner', native: false) ++dep_scanner = dependency('wayland-scanner', native: true) + prog_scanner = find_program(dep_scanner.get_pkgconfig_variable('wayland_scanner')) + + dep_wp = dependency('wayland-protocols', version: '>= 1.26', +-- +2.25.1 + diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/systemd-notify.weston-start b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/systemd-notify.weston-start new file mode 100644 index 000000000..a97e7b38d --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/systemd-notify.weston-start @@ -0,0 +1,9 @@ +#!/bin/sh + +# SPDX-FileCopyrightText: Huawei Inc. +# SPDX-License-Identifier: Apache-2.0 + + +if [[ -x "/usr/lib/weston/systemd-notify.so" ]]; then + add_weston_module "systemd-notify.so" +fi diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.desktop b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.desktop new file mode 100644 index 000000000..1086ae8bf --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=Application +Name=Weston +Comment=Wayland Compostitor +Exec=weston +Icon=weston +Terminal=false +Categories=Utility; diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.png b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.2.imx/weston.png new file mode 100644 index 0000000000000000000000000000000000000000..ea8b7e0e233c86301a88e5bc925f09b3de2f9dec GIT binary patch literal 2383 zcmV-V39$BwP)Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L00vqB00vqCV0pn~000Od zNklxQqBu<>r2)6lHU)*YGzD6ustAQm;suEZ zhy*;Kma`z8lfl}Zs zt(P8+CIeqHN%sZD!;$E}D=->`wJ4A{*-ZKJL!lV-N%25gfT6XP%v!n#FS3o9;k$el zEw@6~y|s39h@#XAXucVg0ZW%aSL#DjK(fo5S{d|YSh)e1F0G!WRlt)hzVZG*NdkI5 z15N8gicM(04cdm>n3{&%QE--6R?H@77?5XY$sl)Z6)5!lt3D_jSY$*2q=0V$cTzkZ zbwTT`kn9Y_lnM4C*!e(lq7zo`f|f1r49k!^0hMem6S^$f=)Y@ltl+)tUPyMy^Xv%B zzBojZFQY3;9}=c~E`YBhg%g%8L=7qvdLD*Eb8QCtFK&aj!6{1pY8wJ09mH6&4LU#O z_OoDSKRA{Gz61;c7@=ijJ8*}u-Bp=3hxMW$`r+! zjnKSFK9{dT?sc#8YTywsra*%IA;JM~=b|oWlBP{-2sUX7u0202?EA<0ylV|`hAvyK#*9d29WHCbRpF%B?F|=_k9k`2FX+- zCF~dt0@7@Tj-b*|7=y|}*un{?r4zhnEMz(sO*4BP=#OKx0xL%eajTmqLu-m;X*{V{|`$$li(87AM z6WVTzx~?!5cgS09$n@!suwgVxWsa*sO&fyQc6}TY?eaXc4=(&vo;&V_)@?!Q&_LUV z#EqWhPe5fpj;T%$RN%ViO|pj7TTh$TLHb5W_dwTu(q=Eh#51sPRBBJM6Z$?2h8c`& z{h$QAC&kmXiR1==;m#u{x0MAbjJq?mYlkFzgo*A?2K6TU56F%}aa^`60NoD=s~RxV z(0of&Pu;y2mbdE+{8Ty@d@f(99ij|a`>6Zu2Ke-TsN|t|O2G9zEE(9n6Bgfs^bL?1 z40KeokbkQlsGP^t`Pk2;v+=8bs!x6%vkR}eZd`(^e{`1=1uMS@P49!2ZQ^p@?7ty* zyxvX5gjc6dBAfX{n=3QPG?l-=AhaZRdEmXr-oO9eMlQMOZEP+W-9_@-A9 zP5@V6djYZ)|`OK z9lZv%3aLU)+{c%JF+=U}8}dOBK{D{W zNWcX$b5JrYEOxPeW@^NEcx`ivaBdIePgVzb3HT9mC`RoFfeNwp3h)?Sl~+jMp80-s zLuO5j>*7QqZV!K-ABE|C)qrf^7f9In7$Qtnx$!$bFf>d)2jjbgLYX@v?A5#MwdSGV zUQgILnE085LLe33IpBLhA!NJ8eIBq1@HDU+_ehPl1laKh;p`IM;*?=-ME);6 zEA9*?kOzJOd=r=p1M-ND759{*kWevaII={P{KphDM+LD?Pgu2mQSKH>guL3XT(c-1&a zK^y}P0DFNqfJ!|u%Yjlr7cd9d{uSdP-&}^)&6_Bm*?_&c205a&x)WIht^lWzg?`-C zqn88oZkY0~$Z9TQrB4E|smyC$?(h~gMd+&X-GW#aR1B~%z*x0&tFCOWlNI>MZcDkiHCXvpcpM70000bbVXQnWMOn=I&E)cX=Zr/dev/null 2>/dev/null; then + mkdir -m 775 -p /tmp/.X11-unix + chown root:video /tmp/.X11-unix +fi diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init.bbappend index 5e3c1bb6e..1636278eb 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init.bbappend +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init.bbappend @@ -6,12 +6,14 @@ SRC_URI += " \ file://digi_background.png \ file://profile \ " +SRC_URI:append:ccimx93 = " file://weston-socket.sh" INI_UNCOMMENT_ASSIGNMENTS:append:mx9-nxp-bsp = " \ repaint-window=16 \ " INI_UNCOMMENT_ASSIGNMENTS:append:mx93-nxp-bsp = " \ - use-g2d=1 \ + gbm-format=argb8888 \ + use-g2d=true \ " update_file() { @@ -39,6 +41,10 @@ do_install:append() { } do_install:append:ccimx93() { + # The ccimx93 uses a new version of weston where 'weston-socket.sh' supercedes 'weston.sh' + \rm -f ${D}${sysconfdir}/profile.d/weston.sh + install -Dm0644 ${WORKDIR}/weston-socket.sh ${D}${sysconfdir}/profile.d/weston-socket.sh + install -d ${D}${sysconfdir}/default/ echo "QMLSCENE_DEVICE=softwarecontext" >> ${D}${sysconfdir}/default/weston } diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init/ccimx93/weston-socket.sh b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init/ccimx93/weston-socket.sh new file mode 100755 index 000000000..86389d63a --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init/ccimx93/weston-socket.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# set weston variables for use with global weston socket +global_socket="/run/wayland-0" +if [ -e "$global_socket" ]; then + weston_group=$(stat -c "%G" "$global_socket") + if [ "$(id -u)" = "0" ]; then + export WAYLAND_DISPLAY="$global_socket" + else + case "$(groups "$USER")" in + *"$weston_group"*) + export WAYLAND_DISPLAY="$global_socket" + ;; + *) + ;; + esac + fi + unset weston_group +fi +unset global_socket diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init/ccimx93/weston.ini b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init/ccimx93/weston.ini new file mode 100644 index 000000000..164ee4f86 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-init/ccimx93/weston.ini @@ -0,0 +1,36 @@ +[core] +#gbm-format=argb8888 +idle-time=0 +#use-g2d=true +#xwayland=true +#repaint-window=16 +#enable-overlay-view=1 + +#[shell] +#size=1920x1080 + +[libinput] +touchscreen_calibrator=true + +#[output] +#name=HDMI-A-1 +#mode=1920x1080@60 +#transform=rotate-90 + +#[output] +#name=HDMI-A-2 +#mode=off +# WIDTHxHEIGHT Resolution size width and height in pixels +# off Disables the output +# preferred Uses the preferred mode +# current Uses the current crt controller mode +#transform=rotate-90 + +[screen-share] +command=@bindir@/weston --backend=rdp-backend.so --shell=fullscreen-shell.so --no-clients-resize +#start-on-startup=true + +# Digi: Set custom background +[shell] +background-image=/usr/share/weston/digi_background.png +background-type=scale-crop diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.2.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.2.imx.bb new file mode 100644 index 000000000..93e125563 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.2.imx.bb @@ -0,0 +1,189 @@ +# This recipe is for the i.MX fork of weston. For ease of +# maintenance, the top section is a verbatim copy of an OE-core +# recipe. The second section customizes the recipe for i.MX. + +########### OE-core copy ################## +# Upstream hash: 7f1932cb5a408320a5b542e20ba2807718349e8f + +SUMMARY = "Weston, a Wayland compositor" +DESCRIPTION = "Weston is the reference implementation of a Wayland compositor" +HOMEPAGE = "http://wayland.freedesktop.org" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING;md5=d79ee9e66bb0f95d3386a7acae780b70 \ + file://libweston/compositor.c;endline=27;md5=eb6d5297798cabe2ddc65e2af519bcf0 \ + " + +SRC_URI = "https://gitlab.freedesktop.org/wayland/weston/uploads/f5648c818fba5432edc3ea63c4db4813/${BPN}-${PV}.tar.xz \ + file://weston.png \ + file://weston.desktop \ + file://xwayland.weston-start \ + file://systemd-notify.weston-start \ + " + +SRC_URI[sha256sum] = "a413f68c252957fc3191c3650823ec356ae8c124ccc0cb440da5cdc4e2cb9e57" + +UPSTREAM_CHECK_URI = "https://wayland.freedesktop.org/releases.html" +UPSTREAM_CHECK_REGEX = "weston-(?P\d+\.\d+\.(?!9\d+)\d+)" + +inherit meson pkgconfig useradd + +# depends on virtual/egl +# +require ${THISDIR}/required-distro-features.inc + +DEPENDS = "libxkbcommon gdk-pixbuf pixman cairo glib-2.0" +DEPENDS += "wayland wayland-protocols libinput virtual/egl pango wayland-native" + +LDFLAGS += "${@bb.utils.contains('DISTRO_FEATURES', 'lto', '-Wl,-z,undefs', '', d)}" + +WESTON_MAJOR_VERSION = "${@'.'.join(d.getVar('PV').split('.')[0:1])}" + +EXTRA_OEMESON += "-Dpipewire=false" + +PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'kms wayland egl clients', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'x11 wayland', 'xwayland', '', d)} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'systemd x11', d)} \ + ${@bb.utils.contains_any('DISTRO_FEATURES', 'wayland x11', '', 'headless', d)} \ + ${@oe.utils.conditional('VIRTUAL-RUNTIME_init_manager', 'sysvinit', 'launcher-libseat', '', d)} \ + image-jpeg \ + screenshare \ + shell-desktop \ + shell-fullscreen \ + shell-ivi \ + shell-kiosk \ + " + +# Can be 'damage', 'im', 'egl', 'shm', 'touch', 'dmabuf-feedback', 'dmabuf-v4l', 'dmabuf-egl' or 'all' +SIMPLECLIENTS ?= "all" + +# +# Compositor choices +# +# Weston on KMS +PACKAGECONFIG[kms] = "-Dbackend-drm=true,-Dbackend-drm=false,drm udev virtual/egl virtual/libgles2 virtual/libgbm mtdev" +# Weston on Wayland (nested Weston) +PACKAGECONFIG[wayland] = "-Dbackend-wayland=true,-Dbackend-wayland=false,virtual/egl virtual/libgles2" +# Weston on X11 +PACKAGECONFIG[x11] = "-Dbackend-x11=true,-Dbackend-x11=false,virtual/libx11 libxcb libxcb libxcursor cairo" +# Headless Weston +PACKAGECONFIG[headless] = "-Dbackend-headless=true,-Dbackend-headless=false" +# Weston on RDP +PACKAGECONFIG[rdp] = "-Dbackend-rdp=true,-Dbackend-rdp=false,freerdp" +# VA-API desktop recorder +PACKAGECONFIG[vaapi] = "-Dbackend-drm-screencast-vaapi=true,-Dbackend-drm-screencast-vaapi=false,libva" +# Weston with EGL support +PACKAGECONFIG[egl] = "-Drenderer-gl=true,-Drenderer-gl=false,virtual/egl" +# Weston with lcms support +PACKAGECONFIG[lcms] = "-Dcolor-management-lcms=true,-Dcolor-management-lcms=false,lcms" +# Weston with webp support +PACKAGECONFIG[webp] = "-Dimage-webp=true,-Dimage-webp=false,libwebp" +# Weston with systemd-login support +PACKAGECONFIG[systemd] = "-Dsystemd=true -Dlauncher-logind=true,-Dsystemd=false -Dlauncher-logind=false,systemd dbus" +# Weston with Xwayland support (requires X11 and Wayland) +PACKAGECONFIG[xwayland] = "-Dxwayland=true,-Dxwayland=false,xwayland" +# colord CMS support +PACKAGECONFIG[colord] = "-Ddeprecated-color-management-colord=true,-Ddeprecated-color-management-colord=false,colord" +# Clients support +PACKAGECONFIG[clients] = "-Dsimple-clients=${SIMPLECLIENTS} -Ddemo-clients=true,-Dsimple-clients= -Ddemo-clients=false" +# Virtual remote output with GStreamer on DRM backend +PACKAGECONFIG[remoting] = "-Dremoting=true,-Dremoting=false,gstreamer1.0 gstreamer1.0-plugins-base" +# Weston with screen-share support +PACKAGECONFIG[screenshare] = "-Dscreenshare=true,-Dscreenshare=false" +# Traditional desktop shell +PACKAGECONFIG[shell-desktop] = "-Dshell-desktop=true,-Dshell-desktop=false" +# Fullscreen shell +PACKAGECONFIG[shell-fullscreen] = "-Dshell-fullscreen=true,-Dshell-fullscreen=false" +# In-Vehicle Infotainment (IVI) shell +PACKAGECONFIG[shell-ivi] = "-Dshell-ivi=true,-Dshell-ivi=false" +# Kiosk shell +PACKAGECONFIG[shell-kiosk] = "-Dshell-kiosk=true,-Dshell-kiosk=false" +# JPEG image loading support +PACKAGECONFIG[image-jpeg] = "-Dimage-jpeg=true,-Dimage-jpeg=false, jpeg" +# support libseat based launch +PACKAGECONFIG[launcher-libseat] = "-Dlauncher-libseat=true,-Dlauncher-libseat=false,seatd" + +do_install:append() { + # Weston doesn't need the .la files to load modules, so wipe them + rm -f ${D}/${libdir}/libweston-${WESTON_MAJOR_VERSION}/*.la + + # If X11, ship a desktop file to launch it + if [ "${@bb.utils.filter('DISTRO_FEATURES', 'x11', d)}" ]; then + install -d ${D}${datadir}/applications + install ${WORKDIR}/weston.desktop ${D}${datadir}/applications + + install -d ${D}${datadir}/icons/hicolor/48x48/apps + install ${WORKDIR}/weston.png ${D}${datadir}/icons/hicolor/48x48/apps + fi + + if [ "${@bb.utils.contains('PACKAGECONFIG', 'xwayland', 'yes', 'no', d)}" = "yes" ]; then + install -Dm 644 ${WORKDIR}/xwayland.weston-start ${D}${datadir}/weston-start/xwayland + fi + + if [ "${@bb.utils.contains('PACKAGECONFIG', 'systemd', 'yes', 'no', d)}" = "yes" ]; then + install -Dm 644 ${WORKDIR}/systemd-notify.weston-start ${D}${datadir}/weston-start/systemd-notify + fi + + if [ "${@bb.utils.contains('PACKAGECONFIG', 'launch', 'yes', 'no', d)}" = "yes" ]; then + chmod u+s ${D}${bindir}/weston-launch + fi +} + +PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'xwayland', '${PN}-xwayland', '', d)} \ + libweston-${WESTON_MAJOR_VERSION} ${PN}-examples" + +FILES:${PN}-dev += "${libdir}/${BPN}/libexec_weston.so" +FILES:${PN} = "${bindir}/weston ${bindir}/weston-terminal ${bindir}/weston-info ${bindir}/weston-launch ${bindir}/wcap-decode ${libexecdir} ${libdir}/${BPN}/*.so* ${datadir}" + +FILES:libweston-${WESTON_MAJOR_VERSION} = "${libdir}/lib*${SOLIBS} ${libdir}/libweston-${WESTON_MAJOR_VERSION}/*.so" +SUMMARY:libweston-${WESTON_MAJOR_VERSION} = "Helper library for implementing 'wayland window managers'." + +FILES:${PN}-examples = "${bindir}/*" + +FILES:${PN}-xwayland = "${libdir}/libweston-${WESTON_MAJOR_VERSION}/xwayland.so" +RDEPENDS:${PN}-xwayland += "xwayland" + +RDEPENDS:${PN} += "xkeyboard-config" +RRECOMMENDS:${PN} = "weston-init liberation-fonts" +RRECOMMENDS:${PN}-dev += "wayland-protocols" + +USERADD_PACKAGES = "${PN}" +GROUPADD_PARAM:${PN} = "--system weston-launch" + +########### End of OE-core copy ########### + +########### i.MX overrides ################ + +SUMMARY = "Weston, a Wayland compositor, i.MX fork" +LIC_FILES_CHKSUM:remove = "file://COPYING;md5=d79ee9e66bb0f95d3386a7acae780b70" +LIC_FILES_CHKSUM += "file://LICENSE;md5=d79ee9e66bb0f95d3386a7acae780b70" + +DEFAULT_PREFERENCE = "-1" + +SRC_URI:remove = "https://gitlab.freedesktop.org/wayland/weston/uploads/f5648c818fba5432edc3ea63c4db4813/${BPN}-${PV}.tar.xz" +SRC_URI:prepend = "${WESTON_SRC};branch=${SRCBRANCH} " +WESTON_SRC ?= "git://github.com/nxp-imx/weston-imx.git;protocol=https" +SRC_URI += "file://0001-Revert-protocol-no-found-wayland-scanner-with-Yocto-.patch" +SRCBRANCH = "weston-imx-11.0.2" +SRCREV = "a3c5e63aa94f8d27b72780e333370be78c9a7653" +S = "${WORKDIR}/git" + +PACKAGECONFIG_IMX_REMOVALS ?= "wayland x11" +PACKAGECONFIG:remove = "${PACKAGECONFIG_IMX_REMOVALS}" + +PACKAGECONFIG:append:imxgpu2d = " imxg2d" +PACKAGECONFIG:append:mx93-nxp-bsp = " imxg2d" + +# Override +PACKAGECONFIG[xwayland] = "-Dxwayland=true,-Dxwayland=false,libxcursor xwayland" + +# Weston with i.MX G2D renderer +PACKAGECONFIG[imxg2d] = "-Drenderer-g2d=true,-Drenderer-g2d=false,virtual/libg2d" + +# links with imx-gpu libs which are pre-built for glibc +# gcompat will address it during runtime +LDFLAGS:append:imxgpu:libc-musl = " -Wl,--allow-shlib-undefined" + +PACKAGE_ARCH = "${MACHINE_SOCARCH}" +COMPATIBLE_MACHINE = "(ccimx93)" + +########### End of i.MX overrides ######### From d1c59192982cc34e67ba96f7786a2c520f01e5da Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Wed, 22 Nov 2023 14:36:11 +0100 Subject: [PATCH 050/118] qt5: set default QT_QPA_PLATFORM values for mp1 platforms Otherwise, launching a Qt5 app will result in errors and the QPA platform will need to be set manually to get it to work. Signed-off-by: Gabriel Valcazar --- .../qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh | 7 +++++++ .../qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend | 9 +++++++++ 2 files changed, 16 insertions(+) create mode 100644 meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh diff --git a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh new file mode 100644 index 000000000..4052b0a13 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase/qt5.sh @@ -0,0 +1,7 @@ +#!/bin/sh +export QT_QPA_PLATFORM="wayland" + +[ -f "/etc/profile.d/weston_profile.sh" ] && return + +# Use EGLFS platform plugin for images without Wayland +export QT_QPA_PLATFORM="eglfs" QT_QPA_EGLFS_INTEGRATION="eglfs_viv" diff --git a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend index 24a1f2d40..1744da523 100644 --- a/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend +++ b/meta-digi-dey/dynamic-layers/qt5-layer/STM/recipes-qt/qt5/qtbase_git.bbappend @@ -4,3 +4,12 @@ PACKAGECONFIG_GL = " ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2', PACKAGECONFIG:append = " eglfs examples accessibility " QT_CONFIG_FLAGS += " -no-sse2 -no-opengles3" +SRC_URI:append = " \ + file://qt5.sh \ +" +do_install:append () { + install -d ${D}${sysconfdir}/profile.d/ + install -m 0755 ${WORKDIR}/qt5.sh ${D}${sysconfdir}/profile.d/qt5.sh +} + +FILES:${PN} += "${sysconfdir}/profile.d/qt5.sh" From b7ce8d4997ded516e0aed9ce026e258754e85c28 Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Thu, 23 Nov 2023 13:20:31 +0100 Subject: [PATCH 051/118] build.sh: add support to build dey-image-lvgl images daily Signed-off-by: Gabriel Valcazar --- sdk/build-github.sh | 1 + sdk/build.sh | 17 +++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/sdk/build-github.sh b/sdk/build-github.sh index 106e41c8d..fea24b791 100755 --- a/sdk/build-github.sh +++ b/sdk/build-github.sh @@ -97,6 +97,7 @@ purge_sstate() { packagegroup-dey-debug \ packagegroup-dey-examples \ packagegroup-dey-gstreamer \ + packagegroup-dey-lvgl \ packagegroup-dey-network \ packagegroup-dey-qt \ packagegroup-dey-webkit \ diff --git a/sdk/build.sh b/sdk/build.sh index 311d6f435..80f189f4d 100755 --- a/sdk/build.sh +++ b/sdk/build.sh @@ -119,6 +119,7 @@ purge_sstate() { packagegroup-dey-debug \ packagegroup-dey-examples \ packagegroup-dey-gstreamer \ + packagegroup-dey-lvgl \ packagegroup-dey-network \ packagegroup-dey-qt \ packagegroup-dey-webkit \ @@ -171,19 +172,19 @@ while read -r _pl _tgt; do # the fly with underscores. eval "${_pl//-/_}_tgt=\"${_tgt//,/ }\"" done<<-_EOF_ - ccimx8mm-dvk dey-image-qt,dey-image-crank,dey-image-webkit - ccimx8mn-dvk dey-image-qt,dey-image-crank,dey-image-webkit - ccimx8x-sbc-pro dey-image-qt,dey-image-crank,dey-image-webkit + ccimx8mm-dvk dey-image-qt,dey-image-crank,dey-image-webkit,dey-image-lvgl + ccimx8mn-dvk dey-image-qt,dey-image-crank,dey-image-webkit,dey-image-lvgl + ccimx8x-sbc-pro dey-image-qt,dey-image-crank,dey-image-webkit,dey-image-lvgl ccimx8x-sbc-express dey-image-qt - ccimx6qpsbc dey-image-qt,dey-image-crank,dey-image-webkit - ccimx6sbc dey-image-qt,dey-image-crank,dey-image-webkit - ccimx6ulsbc core-image-base,dey-image-qt,dey-image-crank + ccimx6qpsbc dey-image-qt,dey-image-crank,dey-image-webkit,dey-image-lvgl + ccimx6sbc dey-image-qt,dey-image-crank,dey-image-webkit,dey-image-lvgl + ccimx6ulsbc core-image-base,dey-image-qt,dey-image-crank,dey-image-lvgl ccimx6ulstarter core-image-base ccimx6ulsom dey-image-mft-module-min ccimx6ulrftest dey-image-mft-module-rf - ccmp15-dvk dey-image-qt,dey-image-crank,dey-image-webkit + ccmp15-dvk dey-image-qt,dey-image-crank,dey-image-webkit,dey-image-lvgl ccmp13-dvk core-image-base - ccimx93-dvk dey-image-qt + ccimx93-dvk dey-image-qt,dey-image-lvgl _EOF_ # Set default values if not provided by Jenkins From c497caca66b746b50711c70dfbd8a4d9b81987bf Mon Sep 17 00:00:00 2001 From: Gabriel Valcazar Date: Thu, 23 Nov 2023 13:28:58 +0100 Subject: [PATCH 052/118] lvgl: configure app dimensions in main recipe file instead of lv-drivers.inc This change isn't functional, but necessary if we want to be able to separate the logic in the include file and the demo recipe. This way the include file is agnostic and can be included into other recipes if needed. Signed-off-by: Gabriel Valcazar --- meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc | 4 ---- meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb | 9 +++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc index c10856d0a..aca56b15c 100644 --- a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc +++ b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc @@ -14,8 +14,6 @@ LVGL_CONFIG_USE_FBDEV = "${@bb.utils.contains('PACKAGECONFIG', 'fbdev', '1', '0' LVGL_CONFIG_USE_SDL = "${@bb.utils.contains('PACKAGECONFIG', 'sdl', '1', '0', d)}" LVGL_CONFIG_USE_WAYLAND = "${@bb.utils.contains('PACKAGECONFIG', 'wayland', '1', '0', d)}" -LVGL_CONFIG_HOR_RES ?= "800" -LVGL_CONFIG_VER_RES ?= "480" ALLOW_EMPTY:${PN} = "1" @@ -39,8 +37,6 @@ do_configure:append() { -e "s|\(^# define USE_SDL \).*|# define USE_SDL ${LVGL_CONFIG_USE_SDL}|g" \ \ -e "s|\(^# define USE_WAYLAND \).*|# define USE_WAYLAND ${LVGL_CONFIG_USE_WAYLAND}|g" \ - -e "s|\(^#define *LV_DRV_DISP_HOR_RES *\).*|\1${LVGL_CONFIG_HOR_RES}|g" \ - -e "s|\(^#define *LV_DRV_DISP_VER_RES *\).*|\1${LVGL_CONFIG_VER_RES}|g" \ \ -i "${S}/lv_drv_conf.h" } diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb index 73224d4dd..eea723884 100644 --- a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb +++ b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb @@ -32,6 +32,9 @@ TARGET_CFLAGS += "-I${STAGING_INCDIR}/libdrm" # Change DRM card used for i.MX8-based platforms LVGL_CONFIG_DRM_CARD:mx8-generic-bsp = "/dev/dri/card1" +LVGL_CONFIG_HOR_RES ?= "800" +LVGL_CONFIG_VER_RES ?= "480" + do_configure:prepend() { if [ "${LVGL_CONFIG_USE_DRM}" -eq 1 ] ; then # Add libdrm build dependency @@ -47,6 +50,12 @@ do_configure:prepend() { # Add wayland build dependencies sed -i '/^target_link_libraries/ s@lvgl::drivers@& wayland-client wayland-cursor xkbcommon@' "${S}/CMakeLists.txt" fi + + # Configure the app's dimensions + sed -e "s|\(^#define *LV_DRV_DISP_HOR_RES *\).*|\1${LVGL_CONFIG_HOR_RES}|g" \ + -e "s|\(^#define *LV_DRV_DISP_VER_RES *\).*|\1${LVGL_CONFIG_VER_RES}|g" \ + \ + -i "${S}/lv_drv_conf.h" } do_install:append() { From d3f3cfdb6274f70146f351717b583990ea8bb1e0 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Fri, 10 Nov 2023 13:19:23 +0100 Subject: [PATCH 053/118] ccmp1: remove dependencies from kernel include file from meta-st-stm32mp An anonymous function in linux-stm32mp.inc produces a bbfatal error when KERNEL_DEVICETREE variable contains more than one device tree. This is our case since we build the main DT plus a number of DT overlays. This commit removes the dependency to this include file since we have our own recipe to build the kernel and it is not needed at all. It also removes the build of a uImage and the need to provide a LOADADDR. Signed-off-by: Hector Palacios --- meta-digi-arm/conf/layer.conf | 1 + meta-digi-arm/conf/machine/ccmp13-dvk.conf | 3 +-- meta-digi-arm/conf/machine/ccmp15-dvk.conf | 3 +-- meta-digi-arm/conf/machine/include/ccmp1.inc | 1 + meta-digi-arm/recipes-kernel/linux/linux-dey.inc | 3 --- 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/meta-digi-arm/conf/layer.conf b/meta-digi-arm/conf/layer.conf index 5a96462af..3815c3cf1 100644 --- a/meta-digi-arm/conf/layer.conf +++ b/meta-digi-arm/conf/layer.conf @@ -45,6 +45,7 @@ BBMASK += " \ meta-st-stm32mp/recipes-core/base-files/base-files_%.bbappend \ meta-st-stm32mp/recipes-core/busybox/busybox_%.bbappend \ meta-st-stm32mp/recipes-core/systemd/systemd-conf_%.bbappend \ + meta-st-stm32mp/recipes-kernel/linux/linux-stm32mp_5.15.bb \ " # Tweak stm32mpu-ai dependencies to use ST's machine learning packages diff --git a/meta-digi-arm/conf/machine/ccmp13-dvk.conf b/meta-digi-arm/conf/machine/ccmp13-dvk.conf index 27e5699df..108ae839e 100644 --- a/meta-digi-arm/conf/machine/ccmp13-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp13-dvk.conf @@ -111,10 +111,9 @@ OPTEE_CONF = "ccmp13-dvk" # ========================================================================= KERNEL_IMAGETYPE = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'fitImage', 'zImage', d)}" KERNEL_CLASSES = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'kernel-fitimage', 'kernel-uimage', d)}" -KERNEL_ALT_IMAGETYPE = "Image uImage vmlinux" +KERNEL_ALT_IMAGETYPE = "Image vmlinux" KERNEL_DEFCONFIG ?= "ccmp1_defconfig" KERNEL_EXTERNAL_DEFCONFIG ?= "defconfig" -ST_KERNEL_LOADADDR ?= "0xC0008000" # ========================================================================= # DEY settings diff --git a/meta-digi-arm/conf/machine/ccmp15-dvk.conf b/meta-digi-arm/conf/machine/ccmp15-dvk.conf index bd6ce385f..fd5cba720 100644 --- a/meta-digi-arm/conf/machine/ccmp15-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp15-dvk.conf @@ -119,10 +119,9 @@ OPTEE_CONF = "ccmp15-dvk" # ========================================================================= KERNEL_IMAGETYPE = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'fitImage', 'zImage', d)}" KERNEL_CLASSES = "${@bb.utils.contains('TRUSTFENCE_FIT_IMG', '1', 'kernel-fitimage', 'kernel-uimage', d)}" -KERNEL_ALT_IMAGETYPE = "Image uImage vmlinux" +KERNEL_ALT_IMAGETYPE = "Image vmlinux" KERNEL_DEFCONFIG ?= "ccmp1_defconfig" KERNEL_EXTERNAL_DEFCONFIG ?= "defconfig" -ST_KERNEL_LOADADDR ?= "0xC0008000" # ========================================================================= # DEY settings diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index 049c14332..7e8324486 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -41,6 +41,7 @@ UBOOT_ENV_RANGE ?= "" MACHINE_EXTRA_RDEPENDS += " \ mtd-utils-ubifs \ " +MACHINE_EXTRA_RRECOMMENDS:remove = "kernel-imagebootfs" # Image FS types IMAGE_FSTYPES:remove = "ext4 tar.xz" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc index de58e8115..95f25cbfe 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc @@ -5,7 +5,6 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46" inherit kernel inherit ${@oe.utils.conditional('DEY_SOC_VENDOR', 'NXP', 'fsl-kernel-localversion', '', d)} -require ${@oe.utils.conditional('DEY_SOC_VENDOR', 'STM', 'recipes-kernel/linux/linux-stm32mp.inc', '', d)} require ${@bb.utils.contains('DISTRO_FEATURES', 'virtualization', 'linux-virtualization.inc', '', d)} require ${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'recipes-kernel/linux/linux-trustfence.inc', '', d)} @@ -30,8 +29,6 @@ OVERLAYS_DTC_FLAGS:ccimx6ul = "" OVERLAYS_DTC_FLAGS:ccimx6 = "" KERNEL_DTC_FLAGS = "${OVERLAYS_DTC_FLAGS}" -KERNEL_EXTRA_ARGS:stm32mpcommon += "LOADADDR=${ST_KERNEL_LOADADDR}" - # A user can provide his own kernel 'defconfig' file by: # - setting the variable KERNEL_DEFCONFIG to a custom kernel configuration file # inside the kernel repository. From 8f40cddfc60265bb51063b48ce00e2cc5e5d5e90 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Tue, 7 Nov 2023 13:24:22 +0100 Subject: [PATCH 054/118] trustfence: rework configuration for signing FIT images - Set variables required for FIT signing inside python function, under the condition of having TRUSTFENCE_SIGN="1". - Define two sign keys using TRUSTFENCE_ wrapper constants. Default values: - 'fitcfg' for configuration nodes inside the FIT - 'fitimg' for image nodes inside the FIT - Enable FIT_SIGN_INDIVIDUAL to also sign individual images inside the FIT - Set FIT_GENERATE_KEYS by default (kernel-fitimage.bbclass already checks if the keys exist before generating new ones) Signed-off-by: Hector Palacios --- meta-digi-dey/classes/trustfence.bbclass | 30 +++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 5a210809b..1dac97cbb 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -52,17 +52,10 @@ IMAGE_FEATURES += "dey-trustfence" # Enable FIT image build when Trustfence is enabled MACHINE_FEATURES += "${@oe.utils.conditional('TRUSTFENCE_FIT_IMG', '1', 'fit', '', d)}" -# keys name in keydir (eg. "ubootfit.crt", "ubootfit.key") -TRUSTFENCE_SIGN_KEYNAME ?= "" -# Set variables required by poky to sign FIT image -UBOOT_SIGN_KEYNAME ?= "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', '${TRUSTFENCE_SIGN_KEYNAME}', '', d)}" -UBOOT_MKIMAGE_DTCOPTS ?= "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', '-I dts -O dtb -p 2000', '', d)}" -# Enable FIT signing support -UBOOT_SIGN_ENABLE ?= "${TRUSTFENCE_SIGN}" -# Set path to FIT signing keys -UBOOT_SIGN_KEYDIR ?= "${TRUSTFENCE_SIGN_KEYS_PATH}" -# Create keys if not defined -FIT_GENERATE_KEYS ?= "${@oe.utils.conditional('TRUSTFENCE_SIGN_KEYNAME', '', '1', '', d)}" +# key to sign FIT config nodes +TRUSTFENCE_FIT_CFG_SIGN_KEYNAME ?= "fitcfg" +# key to sign FIT image nodes +TRUSTFENCE_FIT_IMG_SIGN_KEYNAME ?= "fitimg" # Function to generate a PKI tree (with lock dir protection) GENPKI_LOCK_DIR = "${TRUSTFENCE_SIGN_KEYS_PATH}/.genpki.lock" @@ -198,6 +191,21 @@ python () { d.appendVar("UBOOT_TF_CONF", 'CONFIG_DEK_PATH="%s" ' % d.getVar("TRUSTFENCE_DEK_PATH")) if d.getVar("TRUSTFENCE_SIGN_MODE"): d.appendVar("UBOOT_TF_CONF", 'CONFIG_SIGN_MODE="%s" ' % d.getVar("TRUSTFENCE_SIGN_MODE")) + + # FIT-related variables + # Create keys if not defined + d.setVar("FIT_GENERATE_KEYS", "1") + # Sign individual images (prevents running unsigned images in FIT) + d.setVar("FIT_SIGN_INDIVIDUAL", "1") + # Set variables required by poky to sign FIT image + d.setVar("UBOOT_SIGN_KEYNAME", d.getVar("TRUSTFENCE_FIT_CFG_SIGN_KEYNAME")) + d.setVar("UBOOT_SIGN_IMG_KEYNAME", d.getVar("TRUSTFENCE_FIT_IMG_SIGN_KEYNAME")) + d.setVar("UBOOT_MKIMAGE_DTCOPTS", "-I dts -O dtb -p 2000") + # Enable FIT signing support + d.setVar("UBOOT_SIGN_ENABLE", d.getVar("TRUSTFENCE_SIGN")) + # Set path to FIT signing keys + d.setVar("UBOOT_SIGN_KEYDIR", "%s/fit" % d.getVar("TRUSTFENCE_SIGN_KEYS_PATH")) + else: # Disable signing artifacts if TRUSTFENCE_SIGN != 1 d.setVar("TRUSTFENCE_SIGN_ARTIFACTS", "0") From dbdd9890182a3a8897184bcdee6ff4239219ed3c Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Thu, 23 Nov 2023 14:10:45 +0100 Subject: [PATCH 055/118] ccmp1: boot script: set temp variable to skip fit re-loading The U-Boot bootscript loads the fitImage into RAM memory to run this bootscript. This bootscript ends up calling 'dboot' command to run the FIT default configuration. To avoid 'dboot' re-loading again the fitImage into RAM memory, set this temporary variable that will be immediately reset by 'dboot'. Signed-off-by: Hector Palacios --- .../recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt | 4 ++++ .../recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt index de798cf2f..34d09e9cd 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp13-dvk/boot.txt @@ -74,6 +74,10 @@ fi if test "${boot_device}" = "mmc"; then dboot linux mmc else + if test "${dboot_kernel_var}" = "fitimage"; then + # Set temp var to avoid re-loading fitimage + setenv temp-fitimg-loaded yes + fi dboot linux nand ${mtdbootpart} fi diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt index fad34695e..e51ef8d27 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp15-dvk/boot.txt @@ -85,6 +85,10 @@ fi if test "${boot_device}" = "mmc"; then dboot linux mmc else + if test "${dboot_kernel_var}" = "fitimage"; then + # Set temp var to avoid re-loading fitimage + setenv temp-fitimg-loaded yes + fi dboot linux nand ${mtdbootpart} fi From 8552421e5557d766169a2df0463a5a8f4edfd655 Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Mon, 27 Nov 2023 16:14:34 +0100 Subject: [PATCH 056/118] conf: machine: add new Cortex-M overlays https://onedigi.atlassian.net/browse/DEL-8581 Signed-off-by: Mike Engel --- meta-digi-arm/conf/machine/ccimx8mm-dvk.conf | 1 + meta-digi-arm/conf/machine/ccimx8mn-dvk.conf | 1 + meta-digi-arm/conf/machine/ccimx8x-sbc-pro.conf | 1 + 3 files changed, 3 insertions(+) diff --git a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf index 742405f79..b10dd1dd5 100644 --- a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf @@ -33,6 +33,7 @@ KERNEL_DEVICETREE ?= " \ digi/_ov_board_lvds_ccimx8m-dvk.dtbo \ digi/_ov_board_user-leds_ccimx8m-dvk.dtbo \ digi/_ov_som_bt_ccimx8m.dtbo \ + digi/_ov_som_cm4_ccimx8mm.dtbo \ digi/_ov_som_mca-keypad_ccimx8m.dtbo \ digi/_ov_som_wifi_ccimx8m.dtbo \ " diff --git a/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf index e3fbc2f46..d845609f0 100644 --- a/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf @@ -34,6 +34,7 @@ KERNEL_DEVICETREE ?= " \ digi/_ov_board_user-leds_ccimx8m-dvk.dtbo \ digi/_ov_board_v1-v2_ccimx8mn-dvk.dtbo \ digi/_ov_som_bt_ccimx8m.dtbo \ + digi/_ov_som_cm7_ccimx8mn.dtbo \ digi/_ov_som_mca-keypad_ccimx8m.dtbo \ digi/_ov_som_v1_ccimx8mn.dtbo \ digi/_ov_som_wifi_ccimx8m.dtbo \ diff --git a/meta-digi-arm/conf/machine/ccimx8x-sbc-pro.conf b/meta-digi-arm/conf/machine/ccimx8x-sbc-pro.conf index bb3db876b..62e1001b6 100644 --- a/meta-digi-arm/conf/machine/ccimx8x-sbc-pro.conf +++ b/meta-digi-arm/conf/machine/ccimx8x-sbc-pro.conf @@ -26,6 +26,7 @@ KERNEL_DEVICETREE ?= " \ digi/_ov_board_user-leds_ccimx8x-sbc-pro.dtbo \ digi/_ov_board_v1-v3_ccimx8x-sbc-pro.dtbo \ digi/_ov_som_bt_ccimx8x.dtbo \ + digi/_ov_som_cm4_ccimx8x.dtbo \ digi/_ov_som_mca-keypad_ccimx8x.dtbo \ digi/_ov_som_quad_ccimx8x.dtbo \ digi/_ov_som_wifi_ccimx8x.dtbo \ From 3cfce77c0f202ff8a452af71518b083080e897b3 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 28 Nov 2023 15:51:38 +0100 Subject: [PATCH 057/118] ccimx93: update ML package for NXP release 6.1.36-2.1.0 As part of the integration of the new ML package, also update the ethos-u-firmware binary built from Stash: Repo: emp/ethos_u_firmware.git Revision: a0352b0cf7267c896b55980dedd08daddc780733 Source: NXP's MCUXpresso SDK_2.14.0_MIMX9352xxxxK And, drop deepview-rt support for ccimx93, as NXP has done the same in 6.1.36-2.1.0 release. Signed-off-by: Javier Viguera --- .../conf/machine/include/imx-digi-base.inc | 13 +- .../packagegroup/packagegroup-imx-ml.bbappend | 5 + .../arm-compute-library_22.05.bbappend | 7 +- .../eiq-examples/eiq-examples_git.bb | 4 +- .../ethos-u-driver-stack_22.08.bbappend | 4 +- .../ethos-u-firmware/ccimx93/ethosu_firmware | Bin 242356 -> 242376 bytes .../ethos-u-firmware_22.08.bbappend | 11 +- ...-u-vela_3.6.0.bb => ethos-u-vela_3.8.0.bb} | 10 +- .../modelrunner_2.3.0.bb} | 21 +- .../onnxruntime/onnxruntime-native_1.13.1.bb | 34 +++ .../onnxruntime/onnxruntime_1.10.0.bbappend | 8 - .../onnxruntime/onnxruntime_1.13.1.bb | 197 ++++++++++++++++++ ...-2.10.0.inc => tensorflow-lite-2.11.1.inc} | 4 +- ...tensorflow-lite-ethosu-delegate_2.11.1.bb} | 6 +- ...b => tensorflow-lite-host-tools_2.11.1.bb} | 0 ...te_2.10.0.bb => tensorflow-lite_2.11.1.bb} | 0 .../nnstreamer/nnstreamer_2.2.0.bbappend | 3 + 17 files changed, 276 insertions(+), 51 deletions(-) rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-vela/{ethos-u-vela_3.6.0.bb => ethos-u-vela_3.8.0.bb} (77%) rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/{deepview-rt/deepview-rt_2.4.46.1-aarch64.bb => modelrunner/modelrunner_2.3.0.bb} (55%) create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/onnxruntime/onnxruntime-native_1.13.1.bb delete mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/onnxruntime/onnxruntime_1.10.0.bbappend create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/onnxruntime/onnxruntime_1.13.1.bb rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/{tensorflow-lite-2.10.0.inc => tensorflow-lite-2.11.1.inc} (55%) rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/{tensorflow-lite-ethosu-delegate_2.10.0.bb => tensorflow-lite-ethosu-delegate_2.11.1.bb} (89%) rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/{tensorflow-lite-host-tools_2.10.0.bb => tensorflow-lite-host-tools_2.11.1.bb} (100%) rename meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/tensorflow-lite/{tensorflow-lite_2.10.0.bb => tensorflow-lite_2.11.1.bb} (100%) create mode 100644 meta-digi-dey/dynamic-layers/meta-ml/recipes-nnstreamer/nnstreamer/nnstreamer_2.2.0.bbappend diff --git a/meta-digi-arm/conf/machine/include/imx-digi-base.inc b/meta-digi-arm/conf/machine/include/imx-digi-base.inc index 55eb59536..5694fb36f 100644 --- a/meta-digi-arm/conf/machine/include/imx-digi-base.inc +++ b/meta-digi-arm/conf/machine/include/imx-digi-base.inc @@ -278,14 +278,15 @@ PREFERRED_VERSION_optee-client:mx9-nxp-bsp ??= "3.21.0.imx" PREFERRED_VERSION_optee-test:mx8-nxp-bsp ??= "3.19.0.imx" PREFERRED_VERSION_optee-test:mx9-nxp-bsp ??= "3.21.0.imx" -# Machine learning backports from NXP's lf-6.1.1_1.0.0 release -PREFERRED_VERSION_deepview-rt:ccimx93 = "2.4.46.1-aarch64" -PREFERRED_VERSION_ethos-u-vela:ccimx93 = "3.6.0" +# Machine learning backports from NXP's lf-6.1.36-2.1.0 release +PREFERRED_VERSION_ethos-u-vela:ccimx93 = "3.8.0" PREFERRED_VERSION_flatbuffers:ccimx93 = "2.0.7" PREFERRED_VERSION_flatbuffers-native:ccimx93 = "2.0.7" -PREFERRED_VERSION_tensorflow-lite:ccimx93 = "2.10.0" -PREFERRED_VERSION_tensorflow-lite-host-tools:ccimx93 = "2.10.0" -PREFERRED_VERSION_tensorflow-lite-host-tools-native:ccimx93 = "2.10.0" +PREFERRED_VERSION_onnxruntime:ccimx93 = "1.13.1" +PREFERRED_VERSION_onnxruntime-native:ccimx93 = "1.13.1" +PREFERRED_VERSION_tensorflow-lite:ccimx93 = "2.11.1" +PREFERRED_VERSION_tensorflow-lite-host-tools:ccimx93 = "2.11.1" +PREFERRED_VERSION_tensorflow-lite-host-tools-native:ccimx93 = "2.11.1" # Optee runtime packages to install OPTEE_PKGS ??= "optee-client optee-os" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-fsl/packagegroup/packagegroup-imx-ml.bbappend b/meta-digi-dey/dynamic-layers/meta-ml/recipes-fsl/packagegroup/packagegroup-imx-ml.bbappend index 115c1e62a..fdb3bab58 100644 --- a/meta-digi-dey/dynamic-layers/meta-ml/recipes-fsl/packagegroup/packagegroup-imx-ml.bbappend +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-fsl/packagegroup/packagegroup-imx-ml.bbappend @@ -1,5 +1,10 @@ # Copyright 2023 Digi International Inc. +ML_NNSTREAMER_PKGS_LIST:remove = "nnstreamer-deepview-rt" + +ML_PKGS:mx9-nxp-bsp:remove = "deepview-rt-examples" +ML_PKGS:mx9-nxp-bsp:append = " modelrunner" + # ARM ethos-u package ETHOS_U_PKGS:append:mx93-nxp-bsp = " \ eiq-examples \ diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/arm-compute-library/arm-compute-library_22.05.bbappend b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/arm-compute-library/arm-compute-library_22.05.bbappend index c7e0fe2b6..33acf4538 100644 --- a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/arm-compute-library/arm-compute-library_22.05.bbappend +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/arm-compute-library/arm-compute-library_22.05.bbappend @@ -1,5 +1,6 @@ # Copyright 2023 Digi International Inc. -# The package's SConscript doesn't recognize the MAXLINELENGTH variable -# injected by scons.bbclass, so remove it -EXTRA_OESCONS:remove = "${SCONS_MAXLINELENGTH}" +SRCBRANCH = "lf-6.1.36_2.1.0" +SRCREV = "b956e65221fca7dadfd8bdfd13279beacce17bc9" + +SCONS_MAXLINELENGTH = "" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/eiq-examples/eiq-examples_git.bb b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/eiq-examples/eiq-examples_git.bb index 127a68575..fd523e780 100644 --- a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/eiq-examples/eiq-examples_git.bb +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/eiq-examples/eiq-examples_git.bb @@ -5,8 +5,8 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" SRC_URI = "${EIQ_EXAMPLES_SRC};branch=${SRCBRANCH}" EIQ_EXAMPLES_SRC ?= "git://github.com/nxp-imx/eiq-example.git;protocol=https" -SRCBRANCH = "lf-6.1.1_1.0.0" -SRCREV = "798519ee033fb7a5aef989a793afe16f400d6479" +SRCBRANCH = "lf-6.1.36_2.1.0" +SRCREV = "47da4f9c4d568704f8835dde62cfc61f16e89ba6" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bbappend b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bbappend index 7056e97c0..dacfab396 100644 --- a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bbappend +++ b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-driver-stack_22.08.bbappend @@ -2,5 +2,5 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e3fc50a88d0a364313df4b21ef20c29e" -SRCBRANCH = "lf-6.1.1_1.0.0" -SRCREV = "ca1a424bcd00758e0b50043ac7f8a3ff214e9ed8" +SRCBRANCH = "lf-6.1.36_2.1.0" +SRCREV = "98759f579297726474d6b32927694502c66ce15a" diff --git a/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-firmware/ccimx93/ethosu_firmware b/meta-digi-dey/dynamic-layers/meta-ml/recipes-libraries/ethos-u-driver-stack/ethos-u-firmware/ccimx93/ethosu_firmware index cac0eee6a8486b5401ada74d568f733f3839c6bb..46306553d1be60ad2239684ccaee8324205a7230 100755 GIT binary patch delta 72680 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%0AuqkiEEvsdDSXi|pmGw@G1eHY=;HNNdA* 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 z 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�<|ED3?$r{l{i-*17 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 -^ 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