diff --git a/README.md b/README.md index bb471b700..8f37a301a 100644 --- a/README.md +++ b/README.md @@ -125,11 +125,40 @@ Documentation is available online at https://www.digi.com/resources/documentatio # Downloads -* Demo images: https://ftp1.digi.com/support/digiembeddedyocto/4.0/r4/images/ -* Software Development Kit (SDK): https://ftp1.digi.com/support/digiembeddedyocto/4.0/r4/sdk/ +* Demo images: https://ftp1.digi.com/support/digiembeddedyocto/4.0/r5/images/ +* Software Development Kit (SDK): https://ftp1.digi.com/support/digiembeddedyocto/4.0/r5/sdk/ # Release Changelog +## 4.0-r5 + +* ST-based platforms + * Add support to boot signed FIT images. + * Add support to EGLFS backend for CCMP15 platform + * Add overlay to enable Cortex-M coprocessor +* NXP-based platforms + * Updated BSP for ConnectCore 93 + * U-Boot v2023.04 (based on tag 'lf-6.1.55-2.2.0' by NXP) + * Linux kernel v6.1.55 (based on tag 'lf-6.1.55-2.2.0' by NXP) + * Add overlay to enable Cortex-M coprocessor + * Added preliminary TrustFence support for ConnectCore 93 +* Add support to LVGL based images +* Improved ConnectCore Cloud Services (CCCS): + * Data backlog support to locally store samples when it is not possible to upload them + * CCCS API to set the device maintenance state of devices + * CCCS API to upload binary data points + * Report to Remote Manager when a device is using a Wi-Fi connection + * Improve firmware download speed + * Configuration file: + * Use default values if configuration file is not provided + * Allow to disable firmware update service +* Improved SWU package generation and support: + * Generalized and simplified recipes to generate the SWU packages using a custom class + * Added support to update bootloader using software update (SWU) +* Update Python XBee library +* Bootcount feature is now disabled by default. +* General bug fixing and improvements + ## 4.0-r4 * ST-based platforms diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index f0e66256b..8bdbb3efe 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -77,3 +77,7 @@ UBOOT_ENV_RANGE ?= "" # Partitions to blacklist for swupdate: # bootloader, environment, safe SWUPDATE_MTD_BLACKLIST = "0 1 2" + +# ccimx6ul LVGL images don't have a desktop backend, so we don't need to append +# "-x11" to the image name in the install scripts. +GRAPHICAL_IMAGES:remove = "dey-image-lvgl" diff --git a/meta-digi-arm/conf/machine/include/ccimx93.inc b/meta-digi-arm/conf/machine/include/ccimx93.inc index 60193819f..4360a96ee 100644 --- a/meta-digi-arm/conf/machine/include/ccimx93.inc +++ b/meta-digi-arm/conf/machine/include/ccimx93.inc @@ -90,3 +90,6 @@ PREFERRED_VERSION_wayland-native:ccimx93 ?= "1.22.0.imx" PREFERRED_VERSION_wayland-protocols:ccimx93 ?= "1.32.imx" PREFERRED_VERSION_weston:ccimx93 ?= "11.0.3.imx" PREFERRED_VERSION_xwayland:ccimx93 ?= "23.1.1.imx" + +PREFERRED_VERSION_nativesdk-trustfence-sign-tools:ccimx93 ?= "2023.04" +PREFERRED_VERSION_trustfence-sign-tools-native:ccimx93 ?= "2023.04" diff --git a/meta-digi-arm/conf/machine/include/digi-defaults.inc b/meta-digi-arm/conf/machine/include/digi-defaults.inc index 1aa4cc4e8..078ee176a 100644 --- a/meta-digi-arm/conf/machine/include/digi-defaults.inc +++ b/meta-digi-arm/conf/machine/include/digi-defaults.inc @@ -10,13 +10,13 @@ PREFERRED_PROVIDER_virtual/xserver = "xserver-xorg" # # Platform Linux U-Boot # ------------------------------------------------- -# ccimx6 5.4 2017.03 -# ccimx6qp 5.4 2017.03 +# ccimx6 5.15 2017.03 +# ccimx6qp 5.15 2017.03 # ccimx6ul 5.15 2020.04 -# ccimx8x 5.4 2020.04 (packaged in imx-boot) -# ccimx8mn 5.4 2020.04 (packaged in imx-boot) -# ccimx8mm 5.4 2020.04 (packaged in imx-boot) -# ccimx93 5.15 2022.04 (packaged in imx-boot) +# ccimx8x 5.15 2020.04 (packaged in imx-boot) +# ccimx8mn 5.15 2020.04 (packaged in imx-boot) +# ccimx8mm 5.15 2020.04 (packaged in imx-boot) +# ccimx93 6.1 2023.04 (packaged in imx-boot) # ccmp15 5.15 2021.10 # ccmp13 5.15 2021.10 # diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0006-Revert-libweston-libinput-device-Enable-Set-pointer-.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0006-Revert-libweston-libinput-device-Enable-Set-pointer-.patch new file mode 100644 index 000000000..805c8243e --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0006-Revert-libweston-libinput-device-Enable-Set-pointer-.patch @@ -0,0 +1,90 @@ +From: Haihua Hu +Date: Wed, 3 Aug 2022 16:34:47 +0800 +Subject: [PATCH] Revert "libweston/libinput-device: Enable/Set pointer + capabilities only on pointer movement" + +This reverts commit e825fe389ebd63470028abd828019840c1170a03. + +This commit will cause waylandsink cannot register pointer seat. +As a result, mouse cannot move waylandsink window + +(cherry picked from commit 3f8f336b5d2cf7ea7aa4e047d669d093fc46dfe6) +--- + libweston/libinput-device.c | 29 +++++------------------------ + 1 file changed, 5 insertions(+), 24 deletions(-) + +diff --git a/libweston/libinput-device.c b/libweston/libinput-device.c +index 4ea89de0..2d7a7d5f 100644 +--- a/libweston/libinput-device.c ++++ b/libweston/libinput-device.c +@@ -60,21 +60,6 @@ evdev_led_update(struct evdev_device *device, enum weston_led weston_leds) + libinput_device_led_update(device->device, leds); + } + +-static void +-ensure_pointer_capability(struct libinput_device *libinput_device) +-{ +- struct evdev_device *device = libinput_device_get_user_data(libinput_device); +- struct weston_seat *seat = device->seat; +- +- if (!libinput_device_has_capability(libinput_device, LIBINPUT_DEVICE_CAP_POINTER)) +- return; +- +- if (!(device->seat_caps & EVDEV_SEAT_POINTER)) { +- weston_seat_init_pointer(seat); +- device->seat_caps |= EVDEV_SEAT_POINTER; +- } +-} +- + static void + handle_keyboard_key(struct libinput_device *libinput_device, + struct libinput_event_keyboard *keyboard_event) +@@ -112,8 +97,6 @@ handle_pointer_motion(struct libinput_device *libinput_device, + struct timespec time; + double dx_unaccel, dy_unaccel; + +- ensure_pointer_capability(libinput_device); +- + timespec_from_usec(&time, + libinput_event_pointer_get_time_usec(pointer_event)); + dx_unaccel = libinput_event_pointer_get_dx_unaccelerated(pointer_event); +@@ -146,8 +129,6 @@ handle_pointer_motion_absolute( + double x, y; + uint32_t width, height; + +- ensure_pointer_capability(libinput_device); +- + if (!output) + return false; + +@@ -179,8 +160,6 @@ handle_pointer_button(struct libinput_device *libinput_device, + libinput_event_pointer_get_seat_button_count(pointer_event); + struct timespec time; + +- ensure_pointer_capability(libinput_device); +- + /* Ignore button events that are not seat wide state changes. */ + if ((button_state == LIBINPUT_BUTTON_STATE_PRESSED && + seat_button_count != 1) || +@@ -260,8 +239,6 @@ handle_pointer_axis(struct libinput_device *libinput_device, + bool has_vert, has_horiz; + struct timespec time; + +- ensure_pointer_capability(libinput_device); +- + has_vert = libinput_event_pointer_has_axis(pointer_event, + LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL); + has_horiz = libinput_event_pointer_has_axis(pointer_event, +@@ -738,7 +715,11 @@ evdev_device_create(struct libinput_device *libinput_device, + + device->seat_caps |= EVDEV_SEAT_KEYBOARD; + } +- ++ if (libinput_device_has_capability(libinput_device, ++ LIBINPUT_DEVICE_CAP_POINTER)) { ++ weston_seat_init_pointer(seat); ++ device->seat_caps |= EVDEV_SEAT_POINTER; ++ } + if (libinput_device_has_capability(libinput_device, + LIBINPUT_DEVICE_CAP_TOUCH)) { + if (weston_seat_init_touch(seat) < 0) { diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_10.0.2.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_10.0.2.bbappend index 9de6ca79c..316c894ca 100644 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_10.0.2.bbappend +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_10.0.2.bbappend @@ -5,6 +5,7 @@ SRC_URI:append:stm32mpcommon = " \ file://0002-Force-to-close-all-output.patch \ file://0004-Disable-request-to-EGL_DRM_RENDER_NODE_FILE_EXT.patch \ file://0005-clients-simple-egl-call-eglSwapInterval-after-eglMak.patch \ + file://0006-Revert-libweston-libinput-device-Enable-Set-pointer-.patch \ " SIMPLECLIENTS="egl,touch,dmabuf-v4l,dmabuf-egl" diff --git a/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb index a9a837e3e..d548bb640 100644 --- a/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb +++ b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb @@ -9,9 +9,13 @@ FW_ATH6KL = " \ file://athtcmd_ram.bin \ file://athwlan.bin \ file://Digi_6203_2_ANT-US.bin \ + file://Digi_6203_2_ANT-US_b.bin \ file://Digi_6203_2_ANT-World.bin \ + file://Digi_6203_2_ANT-World_b.bin \ file://Digi_6203-6233-US.bin \ + file://Digi_6203-6233-US_b.bin \ file://Digi_6203-6233-World.bin \ + file://Digi_6203-6233-World_b.bin \ file://fw-4.bin \ file://nullTestFlow.bin \ file://utf.bin \ @@ -47,9 +51,13 @@ do_install() { athtcmd_ram.bin \ athwlan.bin \ Digi_6203_2_ANT-US.bin \ + Digi_6203_2_ANT-US_b.bin \ Digi_6203_2_ANT-World.bin \ + Digi_6203_2_ANT-World_b.bin \ Digi_6203-6233-US.bin \ + Digi_6203-6233-US_b.bin \ Digi_6203-6233-World.bin \ + Digi_6203-6233-World_b.bin \ fw-4.bin \ nullTestFlow.bin \ utf.bin \ @@ -67,6 +75,19 @@ do_install() { ln -sf Digi_6203_2_ANT-World.bin ${D}${base_libdir}/firmware/ath6k/AR6003/hw2.1.1/bdata.ANT-0x2.bin } +# Point to BDF with optimized TxPower for new AR6233 (HV=>6)" +pkg_postinst_ontarget:${PN}-ath6kl() { + MOD_VERSION="$(($(cat /proc/device-tree/digi,hwid,hv 2>/dev/null | tr -d '\0' || true)))" + if [ "${MOD_VERSION}" -ge "6" ]; then + ln -sf Digi_6203-6233-US_b.bin $D${base_libdir}/firmware/ath6k/AR6003/hw2.1.1/bdata.0x0.bin + ln -sf Digi_6203-6233-World_b.bin $D${base_libdir}/firmware/ath6k/AR6003/hw2.1.1/bdata.0x1.bin + ln -sf Digi_6203-6233-World_b.bin $D${base_libdir}/firmware/ath6k/AR6003/hw2.1.1/bdata.0x2.bin + ln -sf Digi_6203_2_ANT-US_b.bin $D${base_libdir}/firmware/ath6k/AR6003/hw2.1.1/bdata.ANT-0x0.bin + ln -sf Digi_6203_2_ANT-World_b.bin $D${base_libdir}/firmware/ath6k/AR6003/hw2.1.1/bdata.ANT-0x1.bin + ln -sf Digi_6203_2_ANT-World_b.bin $D${base_libdir}/firmware/ath6k/AR6003/hw2.1.1/bdata.ANT-0x2.bin + fi +} + # Do not create empty debug and development packages (PN-dbg PN-dev PN-staticdev) PACKAGES = "${PN}-ar3k ${PN}-ath6kl" diff --git a/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203-6233-US_b.bin b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203-6233-US_b.bin new file mode 100644 index 000000000..df13def2b Binary files /dev/null and b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203-6233-US_b.bin differ diff --git a/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203-6233-World_b.bin b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203-6233-World_b.bin new file mode 100644 index 000000000..f0d1bd408 Binary files /dev/null and b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203-6233-World_b.bin differ diff --git a/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203_2_ANT-US_b.bin b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203_2_ANT-US_b.bin new file mode 100644 index 000000000..b5993a9a2 Binary files /dev/null and b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203_2_ANT-US_b.bin differ diff --git a/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203_2_ANT-World_b.bin b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203_2_ANT-World_b.bin new file mode 100644 index 000000000..83288710f Binary files /dev/null and b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros/Digi_6203_2_ANT-World_b.bin differ 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 503e9ceaf..b72f6d685 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 d4f491057..9cb620a30 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 f4bed37e0..eb59fb5ee 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 @@ -100,14 +100,13 @@ echo "Determining image files to use..." if [ -z ${INSTALL_UBOOT_FILENAME} ]; then module_variant=$(getenv "module_variant") # Determine U-Boot file to program basing on SOM's variant - if [ -n "$module_variant" ] || [ "$module_variant" = "0x00" ]; then + if [ -n "$module_variant" ]; then if [ "$module_variant" = "0x01" ] || \ [ "$module_variant" = "0x02" ]; then - module_ram="2GB" - else - module_ram="1GB" + INSTALL_UBOOT_FILENAME="u-boot-##MACHINE##2GB.imx" + elif [ "$module_variant" = "0x03" ]; then + INSTALL_UBOOT_FILENAME="u-boot-##MACHINE##1GB.imx" fi - INSTALL_UBOOT_FILENAME="u-boot-##MACHINE##${module_ram}.imx" fi # U-Boot when the checked value is empty. 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 0f038724b..aeddcf636 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 b7e65f7ad..7edd7e4a5 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 d09fd528a..c7feaf45d 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 @@ -102,7 +102,7 @@ if [ -z ${INSTALL_UBOOT_FILENAME} ]; then if [ -n "$soc_family" ]; then module_variant=$(getenv "module_variant") # Determine U-Boot file to program basing on SOM's variant - if [ -n "$module_variant" ] || [ "$module_variant" = "0x00" ]; then + if [ -n "$module_variant" ]; then if [ "$module_variant" = "0x12" ]; then INSTALL_UBOOT_FILENAME="u-boot-cc${soc_family}sbc2GB.imx" elif [ "$module_variant" = "0x01" ] || \ @@ -117,7 +117,11 @@ if [ -z ${INSTALL_UBOOT_FILENAME} ]; then [ "$module_variant" = "0x15" ] || \ [ "$module_variant" = "0x16" ]; then INSTALL_UBOOT_FILENAME="u-boot-cc${soc_family}sbc.imx" - else + elif [ "$module_variant" = "0x03" ] || \ + [ "$module_variant" = "0x0c" ] || \ + [ "$module_variant" = "0x0e" ] || \ + [ "$module_variant" = "0x0f" ] || \ + [ "$module_variant" = "0x13" ]; then INSTALL_UBOOT_FILENAME="u-boot-cc${soc_family}sbc512MB.imx" fi fi 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 c01c01e2d..b1f792351 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 45517feba..1e5350fad 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 c6bab372e..390e9c713 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 @@ -115,7 +115,7 @@ echo "Determining image files to use..." if [ -z "${INSTALL_UBOOT_FILENAME}" ]; then module_variant=$(getenv "module_variant") # Determine U-Boot file to program basing on SOM's variant - if [ -n "$module_variant" ] || [ "$module_variant" = "0x00" ]; then + if [ -n "$module_variant" ]; then if [ "$module_variant" = "0x08" ] || \ [ "$module_variant" = "0x0a" ]; then INSTALL_UBOOT_FILENAME="u-boot-##MACHINE##512MB.imx" @@ -123,7 +123,10 @@ if [ -z "${INSTALL_UBOOT_FILENAME}" ]; then [ "$module_variant" = "0x05" ] || \ [ "$module_variant" = "0x07" ]; then INSTALL_UBOOT_FILENAME="u-boot-##MACHINE##1GB.imx" - else + elif [ "$module_variant" = "0x02" ] || \ + [ "$module_variant" = "0x03" ] || \ + [ "$module_variant" = "0x06" ] || \ + [ "$module_variant" = "0x09" ]; then INSTALL_UBOOT_FILENAME="u-boot-##MACHINE##.imx" fi fi 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 0d2d263bd..01bd2a074 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 5b67a563e..41e894c18 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 852de0445..3f621311a 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 963b0c50e..1438c0739 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,7 +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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 baa7d2a84..153f27aa3 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 @@ -57,6 +57,8 @@ if test ! -e mmc ${INSTALL_MMCDEV} ${INSTALL_ROOTFS_FILENAME}; then fi fi if test "${install_abort}" = "1"; then + echo "To install a different image, set variable 'image-name', e.g.:" + echo " => setenv image-name core-image-base" echo "Aborted."; exit; fi @@ -131,7 +133,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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 e438d274e..5e536006b 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 @@ -57,6 +57,8 @@ if test ! -e usb ${INSTALL_USBDEV} ${INSTALL_ROOTFS_FILENAME}; then fi fi if test "${install_abort}" = "1"; then + echo "To install a different image, set variable 'image-name', e.g.:" + echo " => setenv image-name core-image-base" echo "Aborted."; exit; fi @@ -131,7 +133,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 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Erase the 'update' partition 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 cb0238c34..798a42ea1 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,7 +152,7 @@ fi # environment # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b - - Set bootlimit to 3 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Configure recovery to wipe 'update' partition 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 304dc9f1a..03415add1 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,7 +154,7 @@ fi # environment # - If Dual Boot # - Update the system partitions: linux_a, linux_b, rootfs_a, rootfs_b - - Set bootlimit to 3 +# - Set bootlimit to 3 # - If Normal Boot: # - Update the system partitions: linux, recovery, rootfs # - Configure recovery to wipe 'update' partition diff --git a/meta-digi-arm/recipes-digi/trustfence/nativesdk-trustfence-sign-tools_2023.04.bb b/meta-digi-arm/recipes-digi/trustfence/nativesdk-trustfence-sign-tools_2023.04.bb new file mode 100644 index 000000000..19a36e532 --- /dev/null +++ b/meta-digi-arm/recipes-digi/trustfence/nativesdk-trustfence-sign-tools_2023.04.bb @@ -0,0 +1,6 @@ +# Copyright (C) 2024, Digi International Inc. + +require nativesdk-trustfence-sign-tools_git.bb + +SRCBRANCH = "v2023.04/maint" +SRCREV = "d27aefc1691a14c6edaadf35ab147ac8afe5c98a" diff --git a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools-native_2023.04.bb b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools-native_2023.04.bb new file mode 100644 index 000000000..a3d99728e --- /dev/null +++ b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools-native_2023.04.bb @@ -0,0 +1,6 @@ +# Copyright (C) 2024, Digi International Inc. + +require trustfence-sign-tools-native_git.bb + +SRCBRANCH = "v2023.04/maint" +SRCREV = "d27aefc1691a14c6edaadf35ab147ac8afe5c98a" diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index eb459726c..0db6afa1d 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -24,15 +24,19 @@ TRUSTFENCE_CONSOLE_DISABLE ?= "0" TRUSTFENCE_SIGN ?= "1" TRUSTFENCE_SIGN_KEYS_PATH ?= "default" TRUSTFENCE_DEK_PATH ?= "default" +TRUSTFENCE_DEK_PATH:ccimx93 ?= "0" TRUSTFENCE_DEK_PATH:ccmp1 ?= "0" TRUSTFENCE_ENCRYPT_ENVIRONMENT ?= "1" +TRUSTFENCE_ENCRYPT_ENVIRONMENT:ccimx93 ?= "0" TRUSTFENCE_SRK_REVOKE_MASK ?= "0x0" TRUSTFENCE_KEY_INDEX ?= "0" TRUSTFENCE_FIT_IMG:ccmp1 ?= "1" # Partition encryption configuration TRUSTFENCE_ENCRYPT_PARTITIONS ?= "1" +TRUSTFENCE_ENCRYPT_PARTITIONS:ccimx93 ?= "0" TRUSTFENCE_ENCRYPT_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "0", "1", d)}" +TRUSTFENCE_ENCRYPT_ROOTFS:ccimx93 ?= "0" # Read-only rootfs TRUSTFENCE_READ_ONLY_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "1", "0", d)}" diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index db39b4a30..b808a8ef5 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -4,7 +4,7 @@ require conf/distro/poky.conf YOCTO_MAJOR = "4" YOCTO_MINOR = "0" DEY_RELEASE = "5" -DEY_BUILD = "1" +DEY_BUILD = "2" # Firmware version of the system. DEY_FIRMWARE_VERSION ?= "${YOCTO_MAJOR}.${YOCTO_MINOR}.${DEY_RELEASE}.${DEY_BUILD}" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/0001-Restore-wl_shell-to-weston-11.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/0001-Restore-wl_shell-to-weston-11.patch new file mode 100644 index 000000000..0bc86f5ec --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/0001-Restore-wl_shell-to-weston-11.patch @@ -0,0 +1,933 @@ +From: Gabriel Valcazar +Date: Fri, 19 Jan 2024 09:45:19 +0100 +Subject: [PATCH] Restore wl_shell to weston 11 + +This shell was deprecated some time ago and removed in weston 11, but it's the +default shell used by LVGL's wayland backend. Until we migrate said backend to +use xdg_shell, restore wl_shell in weston 11. + +This reverts the following commits: + + * d40cedc8af9a42e1f6746fb58f4556080c6ff133 + * 7cae2a1fb0aeec24ca33ac4c7cbb268f77095cb5 + * e6b8f5a5e40cd6c0b934e8ae079c86d5193efa96 + +Signed-off-by: Gabriel Valcazar +--- + desktop-shell/shell.c | 26 +- + libweston/backend-wayland/wayland.c | 87 ++++- + libweston/desktop/internal.h | 4 + + libweston/desktop/libweston-desktop.c | 19 + + libweston/desktop/meson.build | 1 + + libweston/desktop/wl-shell.c | 497 ++++++++++++++++++++++++++ + meson.build | 6 + + meson_options.txt | 7 + + 8 files changed, 630 insertions(+), 17 deletions(-) + create mode 100644 libweston/desktop/wl-shell.c + +diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c +index 91fadd0b..fced4d76 100644 +--- a/desktop-shell/shell.c ++++ b/desktop-shell/shell.c +@@ -1163,16 +1163,16 @@ resize_grab_motion(struct weston_pointer_grab *grab, + pointer->x, pointer->y, &to_x, &to_y); + + width = resize->width; +- if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_LEFT) { ++ if (resize->edges & WL_SHELL_SURFACE_RESIZE_LEFT) { + width += wl_fixed_to_int(from_x - to_x); +- } else if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_RIGHT) { ++ } else if (resize->edges & WL_SHELL_SURFACE_RESIZE_RIGHT) { + width += wl_fixed_to_int(to_x - from_x); + } + + height = resize->height; +- if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_TOP) { ++ if (resize->edges & WL_SHELL_SURFACE_RESIZE_TOP) { + height += wl_fixed_to_int(from_y - to_y); +- } else if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_BOTTOM) { ++ } else if (resize->edges & WL_SHELL_SURFACE_RESIZE_BOTTOM) { + height += wl_fixed_to_int(to_y - from_y); + } + +@@ -1250,9 +1250,9 @@ surface_resize(struct shell_surface *shsurf, + { + struct weston_resize_grab *resize; + const unsigned resize_topbottom = +- WESTON_DESKTOP_SURFACE_EDGE_TOP | WESTON_DESKTOP_SURFACE_EDGE_BOTTOM; ++ WL_SHELL_SURFACE_RESIZE_TOP | WL_SHELL_SURFACE_RESIZE_BOTTOM; + const unsigned resize_leftright = +- WESTON_DESKTOP_SURFACE_EDGE_LEFT | WESTON_DESKTOP_SURFACE_EDGE_RIGHT; ++ WL_SHELL_SURFACE_RESIZE_LEFT | WL_SHELL_SURFACE_RESIZE_RIGHT; + const unsigned resize_any = resize_topbottom | resize_leftright; + struct weston_geometry geometry; + +@@ -1262,7 +1262,7 @@ surface_resize(struct shell_surface *shsurf, + return 0; + + /* Check for invalid edge combinations. */ +- if (edges == WESTON_DESKTOP_SURFACE_EDGE_NONE || edges > resize_any || ++ if (edges == WL_SHELL_SURFACE_RESIZE_NONE || edges > resize_any || + (edges & resize_topbottom) == resize_topbottom || + (edges & resize_leftright) == resize_leftright) + return 0; +@@ -2123,9 +2123,9 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface, + sy = 0; + } + +- if (shsurf->resize_edges & WESTON_DESKTOP_SURFACE_EDGE_LEFT) ++ if (shsurf->resize_edges & WL_SHELL_SURFACE_RESIZE_LEFT) + sx = shsurf->last_width - surface->width; +- if (shsurf->resize_edges & WESTON_DESKTOP_SURFACE_EDGE_TOP) ++ if (shsurf->resize_edges & WL_SHELL_SURFACE_RESIZE_TOP) + sy = shsurf->last_height - surface->height; + + weston_view_to_global_float(shsurf->view, 0, 0, &from_x, &from_y); +@@ -3084,18 +3084,18 @@ resize_binding(struct weston_pointer *pointer, const struct timespec *time, + &x, &y); + + if (x < surface->width / 3) +- edges |= WESTON_DESKTOP_SURFACE_EDGE_LEFT; ++ edges |= WL_SHELL_SURFACE_RESIZE_LEFT; + else if (x < 2 * surface->width / 3) + edges |= 0; + else +- edges |= WESTON_DESKTOP_SURFACE_EDGE_RIGHT; ++ edges |= WL_SHELL_SURFACE_RESIZE_RIGHT; + + if (y < surface->height / 3) +- edges |= WESTON_DESKTOP_SURFACE_EDGE_TOP; ++ edges |= WL_SHELL_SURFACE_RESIZE_TOP; + else if (y < 2 * surface->height / 3) + edges |= 0; + else +- edges |= WESTON_DESKTOP_SURFACE_EDGE_BOTTOM; ++ edges |= WL_SHELL_SURFACE_RESIZE_BOTTOM; + + surface_resize(shsurf, pointer, edges); + } +diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c +index bb5648d5..3ba20ff7 100644 +--- a/libweston/backend-wayland/wayland.c ++++ b/libweston/backend-wayland/wayland.c +@@ -76,6 +76,7 @@ struct wayland_backend { + struct wl_display *wl_display; + struct wl_registry *registry; + struct wl_compositor *compositor; ++ struct wl_shell *shell; + struct xdg_wm_base *xdg_wm_base; + struct zwp_fullscreen_shell_v1 *fshell; + struct wl_shm *shm; +@@ -111,6 +112,7 @@ struct wayland_output { + struct wl_output *output; + uint32_t global_id; + ++ struct wl_shell_surface *shell_surface; + struct xdg_surface *xdg_surface; + struct xdg_toplevel *xdg_toplevel; + int configure_width, configure_height; +@@ -715,6 +717,11 @@ wayland_backend_destroy_output_surface(struct wayland_output *output) + output->parent.xdg_surface = NULL; + } + ++ if (output->parent.shell_surface) { ++ wl_shell_surface_destroy(output->parent.shell_surface); ++ output->parent.shell_surface = NULL; ++ } ++ + wl_surface_destroy(output->parent.surface); + output->parent.surface = NULL; + } +@@ -787,6 +794,8 @@ wayland_output_destroy(struct weston_output *base) + free(output); + } + ++static const struct wl_shell_surface_listener shell_surface_listener; ++ + #ifdef ENABLE_EGL + static int + wayland_output_init_gl_renderer(struct wayland_output *output) +@@ -940,6 +949,8 @@ wayland_output_set_windowed(struct wayland_output *output) + + if (output->parent.xdg_toplevel) { + xdg_toplevel_unset_fullscreen(output->parent.xdg_toplevel); ++ } else if (output->parent.shell_surface) { ++ wl_shell_surface_set_toplevel(output->parent.shell_surface); + } else { + abort(); + } +@@ -949,6 +960,7 @@ wayland_output_set_windowed(struct wayland_output *output) + + static void + wayland_output_set_fullscreen(struct wayland_output *output, ++ enum wl_shell_surface_fullscreen_method method, + uint32_t framerate, struct wl_output *target) + { + if (output->frame) { +@@ -960,6 +972,9 @@ wayland_output_set_fullscreen(struct wayland_output *output, + + if (output->parent.xdg_toplevel) { + xdg_toplevel_set_fullscreen(output->parent.xdg_toplevel, target); ++ } else if (output->parent.shell_surface) { ++ wl_shell_surface_set_fullscreen(output->parent.shell_surface, ++ method, framerate, target); + } else { + abort(); + } +@@ -1089,7 +1104,7 @@ wayland_output_switch_mode(struct weston_output *output_base, + + b = to_wayland_backend(output_base->compositor); + +- if (output->parent.xdg_surface || !b->parent.fshell) ++ if (output->parent.xdg_surface || output->parent.shell_surface || !b->parent.fshell) + return -1; + + mode = wayland_output_choose_mode(output, mode); +@@ -1230,6 +1245,20 @@ wayland_backend_create_output_surface(struct wayland_output *output) + + weston_log("wayland-backend: Using xdg_wm_base\n"); + } ++ else if (b->parent.shell) { ++ output->parent.shell_surface = ++ wl_shell_get_shell_surface(b->parent.shell, ++ output->parent.surface); ++ if (!output->parent.shell_surface) { ++ wl_surface_destroy(output->parent.surface); ++ return -1; ++ } ++ ++ wl_shell_surface_add_listener(output->parent.shell_surface, ++ &shell_surface_listener, output); ++ ++ weston_log("wayland-backend: Using wl_shell\n"); ++ } + + return 0; + } +@@ -1294,9 +1323,13 @@ wayland_output_enable(struct weston_output *base) + + output->parent.draw_initial_frame = true; + } ++ } else { ++ wayland_output_set_fullscreen(output, ++ WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER, ++ output->mode.refresh, output->parent.output); + } + } else if (b->fullscreen) { +- wayland_output_set_fullscreen(output, 0, NULL); ++ wayland_output_set_fullscreen(output, 0, 0, NULL); + } else { + wayland_output_set_windowed(output); + } +@@ -1578,10 +1611,13 @@ wayland_output_setup_fullscreen(struct wayland_output *output, + return -1; + + /* What should size be set if conditional is false? */ +- if (b->parent.xdg_wm_base) { ++ if (b->parent.xdg_wm_base || b->parent.shell) { + if (output->parent.xdg_toplevel) + xdg_toplevel_set_fullscreen(output->parent.xdg_toplevel, + output->parent.output); ++ else if (output->parent.shell_surface) ++ wl_shell_surface_set_fullscreen(output->parent.shell_surface, ++ 0, 0, NULL); + + wl_display_roundtrip(b->parent.wl_display); + +@@ -1605,6 +1641,36 @@ err_set_size: + return -1; + } + ++static void ++shell_surface_ping(void *data, struct wl_shell_surface *shell_surface, ++ uint32_t serial) ++{ ++ wl_shell_surface_pong(shell_surface, serial); ++} ++ ++static void ++shell_surface_configure(void *data, struct wl_shell_surface *shell_surface, ++ uint32_t edges, int32_t width, int32_t height) ++{ ++ struct wayland_output *output = data; ++ ++ output->parent.configure_width = width; ++ output->parent.configure_height = height; ++ ++ /* FIXME: implement resizing */ ++} ++ ++static void ++shell_surface_popup_done(void *data, struct wl_shell_surface *shell_surface) ++{ ++} ++ ++static const struct wl_shell_surface_listener shell_surface_listener = { ++ shell_surface_ping, ++ shell_surface_configure, ++ shell_surface_popup_done ++}; ++ + /* Events received from the wayland-server this compositor is client of: */ + + /* parent input interface */ +@@ -1782,6 +1848,9 @@ input_handle_button(void *data, struct wl_pointer *pointer, + if (input->output->parent.xdg_toplevel) + xdg_toplevel_move(input->output->parent.xdg_toplevel, + input->parent.seat, serial); ++ else if (input->output->parent.shell_surface) ++ wl_shell_surface_move(input->output->parent.shell_surface, ++ input->parent.seat, serial); + frame_status_clear(input->output->frame, + FRAME_STATUS_MOVE); + return; +@@ -2135,6 +2204,9 @@ input_handle_touch_down(void *data, struct wl_touch *wl_touch, + if (output->parent.xdg_toplevel) + xdg_toplevel_move(output->parent.xdg_toplevel, + input->parent.seat, serial); ++ else if (output->parent.shell_surface) ++ wl_shell_surface_move(output->parent.shell_surface, ++ input->parent.seat, serial); + frame_status_clear(output->frame, + FRAME_STATUS_MOVE); + return; +@@ -2647,6 +2719,10 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, + &xdg_wm_base_interface, 1); + xdg_wm_base_add_listener(b->parent.xdg_wm_base, + &wm_base_listener, b); ++ } else if (strcmp(interface, "wl_shell") == 0) { ++ b->parent.shell = ++ wl_registry_bind(registry, name, ++ &wl_shell_interface, 1); + } else if (strcmp(interface, "zwp_fullscreen_shell_v1") == 0) { + b->parent.fshell = + wl_registry_bind(registry, name, +@@ -2741,6 +2817,9 @@ wayland_destroy(struct weston_compositor *ec) + if (b->parent.xdg_wm_base) + xdg_wm_base_destroy(b->parent.xdg_wm_base); + ++ if (b->parent.shell) ++ wl_shell_destroy(b->parent.shell); ++ + if (b->parent.fshell) + zwp_fullscreen_shell_v1_release(b->parent.fshell); + +@@ -2808,7 +2887,7 @@ fullscreen_binding(struct weston_keyboard *keyboard, + return; + + if (input->output->frame) +- wayland_output_set_fullscreen(input->output, 0, NULL); ++ wayland_output_set_fullscreen(input->output, 0, 0, NULL); + else + wayland_output_set_windowed(input->output); + +diff --git a/libweston/desktop/internal.h b/libweston/desktop/internal.h +index 1d035d5c..93b15919 100644 +--- a/libweston/desktop/internal.h ++++ b/libweston/desktop/internal.h +@@ -241,6 +241,10 @@ weston_desktop_xdg_wm_base_create(struct weston_desktop *desktop, + struct wl_global * + weston_desktop_xdg_shell_v6_create(struct weston_desktop *desktop, + struct wl_display *display); ++struct wl_global * ++weston_desktop_wl_shell_create(struct weston_desktop *desktop, ++ struct wl_display *display); ++ + void + weston_desktop_xwayland_init(struct weston_desktop *desktop); + void +diff --git a/libweston/desktop/libweston-desktop.c b/libweston/desktop/libweston-desktop.c +index 0be9d717..cbe69942 100644 +--- a/libweston/desktop/libweston-desktop.c ++++ b/libweston/desktop/libweston-desktop.c +@@ -42,6 +42,7 @@ struct weston_desktop { + void *user_data; + struct wl_global *xdg_wm_base; /* Stable protocol xdg_shell replaces xdg_shell_unstable_v6 */ + struct wl_global *xdg_shell_v6; /* Unstable xdg_shell_unstable_v6 protocol. */ ++ struct wl_global *wl_shell; + }; + + void +@@ -76,6 +77,22 @@ weston_desktop_create(struct weston_compositor *compositor, + return NULL; + } + ++#ifdef HAVE_DEPRECATED_WL_SHELL ++ weston_log("Warning: support for deprecated wl_shell interface is " ++ "enabled. Please migrate legacy clients to xdg-shell.\n"); ++ desktop->wl_shell = ++ weston_desktop_wl_shell_create(desktop, display); ++ if (desktop->wl_shell == NULL) { ++ weston_desktop_destroy(desktop); ++ return NULL; ++ } ++#else ++ weston_log("Note: support for the deprecated wl_shell interface is " ++ "disabled. If a legacy client still needs it, it can be " ++ "re-enabled by passing -Ddeprecated-wl-shell=true to Meson " ++ "when building Weston.\n"); ++#endif ++ + weston_desktop_xwayland_init(desktop); + + return desktop; +@@ -89,6 +106,8 @@ weston_desktop_destroy(struct weston_desktop *desktop) + + weston_desktop_xwayland_fini(desktop); + ++ if (desktop->wl_shell != NULL) ++ wl_global_destroy(desktop->wl_shell); + if (desktop->xdg_shell_v6 != NULL) + wl_global_destroy(desktop->xdg_shell_v6); + if (desktop->xdg_wm_base != NULL) +diff --git a/libweston/desktop/meson.build b/libweston/desktop/meson.build +index 4588ad10..d8e1a709 100644 +--- a/libweston/desktop/meson.build ++++ b/libweston/desktop/meson.build +@@ -4,6 +4,7 @@ srcs_libweston += files([ + 'seat.c', + 'surface.c', + 'xwayland.c', ++ 'wl-shell.c', + 'xdg-shell.c', + 'xdg-shell-v6.c', + ]) +diff --git a/libweston/desktop/wl-shell.c b/libweston/desktop/wl-shell.c +new file mode 100644 +index 00000000..9efec89b +--- /dev/null ++++ b/libweston/desktop/wl-shell.c +@@ -0,0 +1,497 @@ ++/* ++ * Copyright © 2010-2012 Intel Corporation ++ * Copyright © 2011-2012 Collabora, Ltd. ++ * Copyright © 2013 Raspberry Pi Foundation ++ * Copyright © 2016 Quentin "Sardem FF7" Glidic ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#include "config.h" ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++#include "internal.h" ++ ++#define WD_WL_SHELL_PROTOCOL_VERSION 1 ++ ++enum weston_desktop_wl_shell_surface_state { ++ NONE, ++ TOPLEVEL, ++ MAXIMIZED, ++ FULLSCREEN, ++ TRANSIENT, ++ POPUP, ++}; ++ ++struct weston_desktop_wl_shell_surface { ++ struct wl_resource *resource; ++ struct weston_desktop *desktop; ++ struct wl_display *display; ++ struct weston_desktop_surface *surface; ++ struct weston_desktop_surface *parent; ++ bool added; ++ struct weston_desktop_seat *popup_seat; ++ enum weston_desktop_wl_shell_surface_state state; ++ struct wl_listener wl_surface_resource_destroy_listener; ++}; ++ ++static void ++weston_desktop_wl_shell_surface_set_size(struct weston_desktop_surface *dsurface, ++ void *user_data, ++ int32_t width, int32_t height) ++{ ++ struct weston_desktop_wl_shell_surface *surface = user_data; ++ struct weston_surface *wsurface = ++ weston_desktop_surface_get_surface(surface->surface); ++ ++ if ((wsurface->width == width && wsurface->height == height) || ++ (width == 0 && height == 0)) ++ return; ++ ++ wl_shell_surface_send_configure(surface->resource, ++ WL_SHELL_SURFACE_RESIZE_NONE, ++ width, height); ++} ++ ++static void ++weston_desktop_wl_shell_surface_maybe_ungrab(struct weston_desktop_wl_shell_surface *surface) ++{ ++ if (surface->state != POPUP || ++ !weston_desktop_surface_get_grab(surface->surface)) ++ return; ++ ++ weston_desktop_surface_popup_ungrab(surface->surface, ++ surface->popup_seat); ++ surface->popup_seat = NULL; ++} ++ ++static void ++weston_desktop_wl_shell_surface_committed(struct weston_desktop_surface *dsurface, ++ void *user_data, ++ int32_t sx, int32_t sy) ++{ ++ struct weston_desktop_wl_shell_surface *surface = user_data; ++ struct weston_surface *wsurface = ++ weston_desktop_surface_get_surface(dsurface); ++ ++ if (wsurface->buffer_ref.buffer == NULL) ++ weston_desktop_wl_shell_surface_maybe_ungrab(surface); ++ ++ if (surface->added) ++ weston_desktop_api_committed(surface->desktop, surface->surface, ++ sx, sy); ++} ++ ++static void ++weston_desktop_wl_shell_surface_ping(struct weston_desktop_surface *dsurface, ++ uint32_t serial, void *user_data) ++{ ++ struct weston_desktop_wl_shell_surface *surface = user_data; ++ ++ wl_shell_surface_send_ping(surface->resource, serial); ++} ++ ++static void ++weston_desktop_wl_shell_surface_close(struct weston_desktop_surface *dsurface, ++ void *user_data) ++{ ++ struct weston_desktop_wl_shell_surface *surface = user_data; ++ ++ if (surface->state == POPUP) ++ wl_shell_surface_send_popup_done(surface->resource); ++} ++ ++static bool ++weston_desktop_wl_shell_surface_get_maximized(struct weston_desktop_surface *dsurface, ++ void *user_data) ++{ ++ struct weston_desktop_wl_shell_surface *surface = user_data; ++ ++ return surface->state == MAXIMIZED; ++} ++ ++static bool ++weston_desktop_wl_shell_surface_get_fullscreen(struct weston_desktop_surface *dsurface, ++ void *user_data) ++{ ++ struct weston_desktop_wl_shell_surface *surface = user_data; ++ ++ return surface->state == FULLSCREEN; ++} ++ ++static void ++weston_desktop_wl_shell_change_state(struct weston_desktop_wl_shell_surface *surface, ++ enum weston_desktop_wl_shell_surface_state state, ++ struct weston_desktop_surface *parent, ++ int32_t x, int32_t y) ++{ ++ bool to_add = (parent == NULL); ++ ++ assert(state != NONE); ++ ++ if (to_add && surface->added) { ++ surface->state = state; ++ return; ++ } ++ ++ if (surface->state != state) { ++ if (surface->state == POPUP) ++ weston_desktop_wl_shell_surface_maybe_ungrab(surface); ++ ++ if (to_add) { ++ weston_desktop_surface_unset_relative_to(surface->surface); ++ weston_desktop_api_surface_added(surface->desktop, ++ surface->surface); ++ } else if (surface->added) { ++ weston_desktop_api_surface_removed(surface->desktop, ++ surface->surface); ++ } ++ ++ surface->state = state; ++ surface->added = to_add; ++ } ++ ++ if (parent != NULL) ++ weston_desktop_surface_set_relative_to(surface->surface, parent, ++ x, y, false); ++} ++ ++static void ++weston_desktop_wl_shell_surface_destroy(struct weston_desktop_surface *dsurface, ++ void *user_data) ++{ ++ struct weston_desktop_wl_shell_surface *surface = user_data; ++ ++ wl_list_remove(&surface->wl_surface_resource_destroy_listener.link); ++ ++ weston_desktop_wl_shell_surface_maybe_ungrab(surface); ++ weston_desktop_surface_unset_relative_to(surface->surface); ++ if (surface->added) ++ weston_desktop_api_surface_removed(surface->desktop, ++ surface->surface); ++ ++ free(surface); ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_pong(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ uint32_t serial) ++{ ++ struct weston_desktop_surface *surface = wl_resource_get_user_data(resource); ++ ++ weston_desktop_client_pong(weston_desktop_surface_get_client(surface), serial); ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_move(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ struct wl_resource *seat_resource, ++ uint32_t serial) ++{ ++ struct weston_desktop_surface *dsurface = ++ wl_resource_get_user_data(resource); ++ struct weston_seat *seat = ++ wl_resource_get_user_data(seat_resource); ++ struct weston_desktop_wl_shell_surface *surface = ++ weston_desktop_surface_get_implementation_data(dsurface); ++ ++ if (seat == NULL) ++ return; ++ ++ weston_desktop_api_move(surface->desktop, dsurface, seat, serial); ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_resize(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ struct wl_resource *seat_resource, ++ uint32_t serial, ++ enum wl_shell_surface_resize edges) ++{ ++ struct weston_desktop_surface *dsurface = ++ wl_resource_get_user_data(resource); ++ struct weston_seat *seat = wl_resource_get_user_data(seat_resource); ++ struct weston_desktop_wl_shell_surface *surface = ++ weston_desktop_surface_get_implementation_data(dsurface); ++ enum weston_desktop_surface_edge surf_edges = ++ (enum weston_desktop_surface_edge) edges; ++ ++ if (seat == NULL) ++ return; ++ ++ weston_desktop_api_resize(surface->desktop, dsurface, seat, serial, surf_edges); ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_set_toplevel(struct wl_client *wl_client, ++ struct wl_resource *resource) ++{ ++ struct weston_desktop_surface *dsurface = ++ wl_resource_get_user_data(resource); ++ struct weston_desktop_wl_shell_surface *surface = ++ weston_desktop_surface_get_implementation_data(dsurface); ++ ++ weston_desktop_wl_shell_change_state(surface, TOPLEVEL, NULL, 0, 0); ++ if (surface->parent == NULL) ++ return; ++ surface->parent = NULL; ++ weston_desktop_api_set_parent(surface->desktop, surface->surface, NULL); ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_set_transient(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ struct wl_resource *parent_resource, ++ int32_t x, int32_t y, ++ enum wl_shell_surface_transient flags) ++{ ++ struct weston_desktop_surface *dsurface = ++ wl_resource_get_user_data(resource); ++ struct weston_surface *wparent = ++ wl_resource_get_user_data(parent_resource); ++ struct weston_desktop_surface *parent; ++ struct weston_desktop_wl_shell_surface *surface = ++ weston_desktop_surface_get_implementation_data(dsurface); ++ ++ if (!weston_surface_is_desktop_surface(wparent)) ++ return; ++ ++ parent = weston_surface_get_desktop_surface(wparent); ++ if (flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE) { ++ weston_desktop_wl_shell_change_state(surface, TRANSIENT, parent, ++ x, y); ++ } else { ++ weston_desktop_wl_shell_change_state(surface, TOPLEVEL, NULL, ++ 0, 0); ++ surface->parent = parent; ++ weston_desktop_api_set_parent(surface->desktop, ++ surface->surface, parent); ++ } ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_set_fullscreen(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ enum wl_shell_surface_fullscreen_method method, ++ uint32_t framerate, ++ struct wl_resource *output_resource) ++{ ++ struct weston_desktop_surface *dsurface = ++ wl_resource_get_user_data(resource); ++ struct weston_desktop_wl_shell_surface *surface = ++ weston_desktop_surface_get_implementation_data(dsurface); ++ struct weston_output *output = NULL; ++ ++ if (output_resource != NULL) ++ output = weston_head_from_resource(output_resource)->output; ++ ++ weston_desktop_wl_shell_change_state(surface, FULLSCREEN, NULL, 0, 0); ++ weston_desktop_api_fullscreen_requested(surface->desktop, dsurface, ++ true, output); ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_set_popup(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ struct wl_resource *seat_resource, ++ uint32_t serial, ++ struct wl_resource *parent_resource, ++ int32_t x, int32_t y, ++ enum wl_shell_surface_transient flags) ++{ ++ struct weston_desktop_surface *dsurface = ++ wl_resource_get_user_data(resource); ++ struct weston_seat *wseat = wl_resource_get_user_data(seat_resource); ++ struct weston_desktop_seat *seat = weston_desktop_seat_from_seat(wseat); ++ struct weston_surface *parent = ++ wl_resource_get_user_data(parent_resource); ++ struct weston_desktop_surface *parent_surface; ++ struct weston_desktop_wl_shell_surface *surface = ++ weston_desktop_surface_get_implementation_data(dsurface); ++ ++ /* Check that if we have a valid wseat we also got a valid desktop seat */ ++ if (wseat != NULL && seat == NULL) { ++ wl_client_post_no_memory(wl_client); ++ return; ++ } ++ ++ if (!weston_surface_is_desktop_surface(parent)) ++ return; ++ ++ parent_surface = weston_surface_get_desktop_surface(parent); ++ ++ weston_desktop_wl_shell_change_state(surface, POPUP, ++ parent_surface, x, y); ++ weston_desktop_surface_popup_grab(surface->surface, seat, serial); ++ surface->popup_seat = seat; ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_set_maximized(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ struct wl_resource *output_resource) ++{ ++ struct weston_desktop_surface *dsurface = ++ wl_resource_get_user_data(resource); ++ struct weston_desktop_wl_shell_surface *surface = ++ weston_desktop_surface_get_implementation_data(dsurface); ++ ++ weston_desktop_wl_shell_change_state(surface, MAXIMIZED, NULL, 0, 0); ++ weston_desktop_api_maximized_requested(surface->desktop, dsurface, true); ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_set_title(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ const char *title) ++{ ++ struct weston_desktop_surface *surface = ++ wl_resource_get_user_data(resource); ++ ++ weston_desktop_surface_set_title(surface, title); ++} ++ ++static void ++weston_desktop_wl_shell_surface_protocol_set_class(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ const char *class_) ++{ ++ struct weston_desktop_surface *surface = ++ wl_resource_get_user_data(resource); ++ ++ weston_desktop_surface_set_app_id(surface, class_); ++} ++ ++ ++static const struct wl_shell_surface_interface weston_desktop_wl_shell_surface_implementation = { ++ .pong = weston_desktop_wl_shell_surface_protocol_pong, ++ .move = weston_desktop_wl_shell_surface_protocol_move, ++ .resize = weston_desktop_wl_shell_surface_protocol_resize, ++ .set_toplevel = weston_desktop_wl_shell_surface_protocol_set_toplevel, ++ .set_transient = weston_desktop_wl_shell_surface_protocol_set_transient, ++ .set_fullscreen = weston_desktop_wl_shell_surface_protocol_set_fullscreen, ++ .set_popup = weston_desktop_wl_shell_surface_protocol_set_popup, ++ .set_maximized = weston_desktop_wl_shell_surface_protocol_set_maximized, ++ .set_title = weston_desktop_wl_shell_surface_protocol_set_title, ++ .set_class = weston_desktop_wl_shell_surface_protocol_set_class, ++}; ++ ++static const struct weston_desktop_surface_implementation weston_desktop_wl_shell_surface_internal_implementation = { ++ .set_size = weston_desktop_wl_shell_surface_set_size, ++ .committed = weston_desktop_wl_shell_surface_committed, ++ .ping = weston_desktop_wl_shell_surface_ping, ++ .close = weston_desktop_wl_shell_surface_close, ++ ++ .get_maximized = weston_desktop_wl_shell_surface_get_maximized, ++ .get_fullscreen = weston_desktop_wl_shell_surface_get_fullscreen, ++ ++ .destroy = weston_desktop_wl_shell_surface_destroy, ++}; ++ ++static void ++wl_surface_resource_destroyed(struct wl_listener *listener, ++ void *data) ++{ ++ struct weston_desktop_wl_shell_surface *surface = ++ wl_container_of(listener, surface, ++ wl_surface_resource_destroy_listener); ++ ++ /* the wl_shell_surface spec says that wl_shell_surfaces are to be ++ * destroyed automatically when the wl_surface is destroyed. */ ++ weston_desktop_surface_destroy(surface->surface); ++} ++ ++static void ++weston_desktop_wl_shell_protocol_get_shell_surface(struct wl_client *wl_client, ++ struct wl_resource *resource, ++ uint32_t id, ++ struct wl_resource *surface_resource) ++{ ++ struct weston_desktop_client *client = wl_resource_get_user_data(resource); ++ struct weston_surface *wsurface = wl_resource_get_user_data(surface_resource); ++ struct weston_desktop_wl_shell_surface *surface; ++ ++ ++ if (weston_surface_set_role(wsurface, "wl_shell_surface", resource, WL_SHELL_ERROR_ROLE) < 0) ++ return; ++ ++ surface = zalloc(sizeof(struct weston_desktop_wl_shell_surface)); ++ if (surface == NULL) { ++ wl_client_post_no_memory(wl_client); ++ return; ++ } ++ ++ surface->desktop = weston_desktop_client_get_desktop(client); ++ surface->display = weston_desktop_get_display(surface->desktop); ++ ++ surface->surface = ++ weston_desktop_surface_create(surface->desktop, client, wsurface, ++ &weston_desktop_wl_shell_surface_internal_implementation, ++ surface); ++ if (surface->surface == NULL) { ++ free(surface); ++ return; ++ } ++ ++ surface->wl_surface_resource_destroy_listener.notify = ++ wl_surface_resource_destroyed; ++ wl_resource_add_destroy_listener(wsurface->resource, ++ &surface->wl_surface_resource_destroy_listener); ++ ++ surface->resource = ++ weston_desktop_surface_add_resource(surface->surface, ++ &wl_shell_surface_interface, ++ &weston_desktop_wl_shell_surface_implementation, ++ id, NULL); ++} ++ ++ ++static const struct wl_shell_interface weston_desktop_wl_shell_implementation = { ++ .get_shell_surface = weston_desktop_wl_shell_protocol_get_shell_surface, ++}; ++ ++static void ++weston_desktop_wl_shell_bind(struct wl_client *client, void *data, ++ uint32_t version, uint32_t id) ++{ ++ struct weston_desktop *desktop = data; ++ ++ weston_desktop_client_create(desktop, client, NULL, &wl_shell_interface, ++ &weston_desktop_wl_shell_implementation, ++ version, id); ++} ++ ++struct wl_global * ++weston_desktop_wl_shell_create(struct weston_desktop *desktop, ++ struct wl_display *display) ++{ ++ return wl_global_create(display, ++ &wl_shell_interface, ++ WD_WL_SHELL_PROTOCOL_VERSION, desktop, ++ weston_desktop_wl_shell_bind); ++} +diff --git a/meson.build b/meson.build +index 6452ca05..64575226 100644 +--- a/meson.build ++++ b/meson.build +@@ -141,6 +141,12 @@ if dep_xkbcommon.version().version_compare('>= 0.5.0') + config_h.set('HAVE_XKBCOMMON_COMPOSE', '1') + endif + ++if get_option('deprecated-wl-shell') ++ warning('Support for the deprecated wl_shell interface is enabled.') ++ warning('This feature will be removed in a future version.') ++ config_h.set('HAVE_DEPRECATED_WL_SHELL', '1') ++endif ++ + dep_wayland_server = dependency('wayland-server', version: '>= 1.20.0') + dep_wayland_client = dependency('wayland-client', version: '>= 1.20.0') + dep_pixman = dependency('pixman-1', version: '>= 0.25.2') +diff --git a/meson_options.txt b/meson_options.txt +index 695eb780..203fa12d 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -132,6 +132,13 @@ option( + description: 'Weston desktop shell: default helper client selection' + ) + ++option( ++ 'deprecated-wl-shell', ++ type: 'boolean', ++ value: false, ++ description: 'Enable the deprecated wl_shell protocol' ++) ++ + option( + 'color-management-lcms', + type: 'boolean', + diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/0002-Revert-libweston-libinput-device-Enable-Set-pointer-.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/0002-Revert-libweston-libinput-device-Enable-Set-pointer-.patch new file mode 100644 index 000000000..805c8243e --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-11.0.3.imx/0002-Revert-libweston-libinput-device-Enable-Set-pointer-.patch @@ -0,0 +1,90 @@ +From: Haihua Hu +Date: Wed, 3 Aug 2022 16:34:47 +0800 +Subject: [PATCH] Revert "libweston/libinput-device: Enable/Set pointer + capabilities only on pointer movement" + +This reverts commit e825fe389ebd63470028abd828019840c1170a03. + +This commit will cause waylandsink cannot register pointer seat. +As a result, mouse cannot move waylandsink window + +(cherry picked from commit 3f8f336b5d2cf7ea7aa4e047d669d093fc46dfe6) +--- + libweston/libinput-device.c | 29 +++++------------------------ + 1 file changed, 5 insertions(+), 24 deletions(-) + +diff --git a/libweston/libinput-device.c b/libweston/libinput-device.c +index 4ea89de0..2d7a7d5f 100644 +--- a/libweston/libinput-device.c ++++ b/libweston/libinput-device.c +@@ -60,21 +60,6 @@ evdev_led_update(struct evdev_device *device, enum weston_led weston_leds) + libinput_device_led_update(device->device, leds); + } + +-static void +-ensure_pointer_capability(struct libinput_device *libinput_device) +-{ +- struct evdev_device *device = libinput_device_get_user_data(libinput_device); +- struct weston_seat *seat = device->seat; +- +- if (!libinput_device_has_capability(libinput_device, LIBINPUT_DEVICE_CAP_POINTER)) +- return; +- +- if (!(device->seat_caps & EVDEV_SEAT_POINTER)) { +- weston_seat_init_pointer(seat); +- device->seat_caps |= EVDEV_SEAT_POINTER; +- } +-} +- + static void + handle_keyboard_key(struct libinput_device *libinput_device, + struct libinput_event_keyboard *keyboard_event) +@@ -112,8 +97,6 @@ handle_pointer_motion(struct libinput_device *libinput_device, + struct timespec time; + double dx_unaccel, dy_unaccel; + +- ensure_pointer_capability(libinput_device); +- + timespec_from_usec(&time, + libinput_event_pointer_get_time_usec(pointer_event)); + dx_unaccel = libinput_event_pointer_get_dx_unaccelerated(pointer_event); +@@ -146,8 +129,6 @@ handle_pointer_motion_absolute( + double x, y; + uint32_t width, height; + +- ensure_pointer_capability(libinput_device); +- + if (!output) + return false; + +@@ -179,8 +160,6 @@ handle_pointer_button(struct libinput_device *libinput_device, + libinput_event_pointer_get_seat_button_count(pointer_event); + struct timespec time; + +- ensure_pointer_capability(libinput_device); +- + /* Ignore button events that are not seat wide state changes. */ + if ((button_state == LIBINPUT_BUTTON_STATE_PRESSED && + seat_button_count != 1) || +@@ -260,8 +239,6 @@ handle_pointer_axis(struct libinput_device *libinput_device, + bool has_vert, has_horiz; + struct timespec time; + +- ensure_pointer_capability(libinput_device); +- + has_vert = libinput_event_pointer_has_axis(pointer_event, + LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL); + has_horiz = libinput_event_pointer_has_axis(pointer_event, +@@ -738,7 +715,11 @@ evdev_device_create(struct libinput_device *libinput_device, + + device->seat_caps |= EVDEV_SEAT_KEYBOARD; + } +- ++ if (libinput_device_has_capability(libinput_device, ++ LIBINPUT_DEVICE_CAP_POINTER)) { ++ weston_seat_init_pointer(seat); ++ device->seat_caps |= EVDEV_SEAT_POINTER; ++ } + if (libinput_device_has_capability(libinput_device, + LIBINPUT_DEVICE_CAP_TOUCH)) { + if (weston_seat_init_touch(seat) < 0) { diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend new file mode 100644 index 000000000..15b715f66 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend @@ -0,0 +1,8 @@ +# Copyright (C) 2024 Digi International Inc. + +SRC_URI += " \ + file://0001-Restore-wl_shell-to-weston-11.patch \ + file://0002-Revert-libweston-libinput-device-Enable-Set-pointer-.patch \ +" + +EXTRA_OEMESON += "-Ddeprecated-wl-shell=true" diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit.bb b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit.bb index 41c370e59..e1188e5fb 100644 --- a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit.bb +++ b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2022, 2023 Digi International. +# Copyright (C) 2022-2024 Digi International. require recipes-digi/dey-examples/connectcore-demo-example.inc @@ -7,7 +7,8 @@ WESTON_SERVICE:ccmp15 ?= "weston-launch.service" CC_DEMO_DISPLAY ?= "wayland-0" CC_DEMO_DISPLAY:ccmp15 ?= "wayland-1" -CC_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\${DEMO_DISPLAY}" +CC_DEMO_DISPLAY:ccimx93 ?= "wayland-1" +CC_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\$\{DEMO_DISPLAY\}" CC_DEMO_ENV:ccimx6ul ?= "" FILESEXTRAPATHS:prepend := "${THISDIR}/../../../../recipes-digi/dey-examples/connectcore-demo-example:" 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 432602888..4f4af7e15 100644 --- a/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions +++ b/meta-digi-dey/recipes-core/busybox/busybox/ccimx93/standby-actions @@ -16,7 +16,8 @@ # #=============================================================================== -RESUME_ACTIONS="/tmp/resume_actions" +RESUME_FILE="/tmp/resume_actions" +RESUME_ACTIONS="" wifi_actions_needed() { [ -d "/proc/device-tree/wireless" ] && [ ! -e "/sys/firmware/devicetree/base/soc@0/bus@42800000/mmc@428b0000/keep-power-in-suspend" ] @@ -27,39 +28,61 @@ bt_actions_needed() { } if [ "${1}" = "pre" ]; then - rm -f "${RESUME_ACTIONS}" + rm -f "${RESUME_FILE}" # Stop NetworkManager before suspend systemctl stop NetworkManager + if bt_actions_needed; then + # bluetooth service relies on bluetooth-init service so + # stop it unconditionally + systemctl stop bluetooth-init + systemctl stop bluetooth + # Program the resume actions to start the services + RESUME_ACTIONS_BT="systemctl start bluetooth-init; systemctl start bluetooth;" + fi + if wifi_actions_needed; then + RESUME_ACTIONS_WIFI="" for iface in wlan0 uap0 wfd0; do if grep -qs ${iface} /var/run/ifstate; then - ifdown ${iface} && echo "ifup ${iface}" >> "${RESUME_ACTIONS}" + # Bring the interface down + ifdown ${iface} + # Program the resume action to bring it up + # (prepend to use reverse order) + RESUME_ACTIONS_WIFI="ifup ${iface};${RESUME_ACTIONS_WIFI}" fi done - { - echo "sleep 0.5" - echo "/etc/udev/scripts/load_iw612.sh" - } >> "${RESUME_ACTIONS}" + # Unload Wi-Fi modules modprobe -r moal + # Program the resume action to reload the modules + # (prepend to use reverse order) + RESUME_ACTIONS_WIFI="/etc/udev/scripts/load_iw612.sh;${RESUME_ACTIONS_WIFI}" 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 + # Compound resume actions (enable BT first, or else add a sleep, to give + # some time to the system to be ready to load the Wi-Fi) + if [ -n "${RESUME_ACTIONS_BT}" ]; then + RESUME_ACTIONS="${RESUME_ACTIONS_BT}" + fi + if [ -n "${RESUME_ACTIONS_WIFI}" ]; then + if [ ! -n "${RESUME_ACTIONS_BT}" ]; then + RESUME_ACTIONS="sleep 0.5;" + fi + RESUME_ACTIONS="${RESUME_ACTIONS}${RESUME_ACTIONS_WIFI}" + fi + + if [ -n "${RESUME_ACTIONS}" ]; then + # Create temp file with resume actions + echo "${RESUME_ACTIONS}" > "${RESUME_FILE}" + chmod +x "${RESUME_FILE}" fi elif [ "${1}" = "post" ]; then - if [ -f ${RESUME_ACTIONS} ]; then - chmod +x "${RESUME_ACTIONS}" - eval "${RESUME_ACTIONS}" - rm -f "${RESUME_ACTIONS}" + if [ -f "${RESUME_FILE}" ]; then + eval "${RESUME_FILE}" + # Clean-up + rm -f "${RESUME_FILE}" fi # Resume NetworkManager after suspend diff --git a/meta-digi-dey/recipes-core/images/dey-image-graphical.inc b/meta-digi-dey/recipes-core/images/dey-image-graphical.inc index 2856563ec..dde9d64de 100644 --- a/meta-digi-dey/recipes-core/images/dey-image-graphical.inc +++ b/meta-digi-dey/recipes-core/images/dey-image-graphical.inc @@ -1,5 +1,5 @@ # -# Copyright (C) 2016-2023 Digi International. +# Copyright (C) 2016-2024 Digi International. # DESCRIPTION = "DEY image with graphical libraries" LICENSE = "MIT" @@ -44,7 +44,8 @@ IMAGE_ROOTFS_SIZE = "8192" BAD_RECOMMENDATIONS += "eudev-hwdb" -export IMAGE_BASENAME = "dey-image-${GRAPHICAL_CORE}-${GRAPHICAL_BACKEND}" +DEFAULT_IMAGE_BASENAME ??= "dey-image-${GRAPHICAL_CORE}-${GRAPHICAL_BACKEND}" +export IMAGE_BASENAME = "${DEFAULT_IMAGE_BASENAME}" CORE_IMAGE_EXTRA_INSTALL += " \ ${@bb.utils.contains('DISTRO_FEATURES', 'x11 wayland', 'weston-xwayland', '', d)} \ diff --git a/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb b/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb index 7d0fc83e9..170ac4c5d 100644 --- a/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb +++ b/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb @@ -1,8 +1,15 @@ # -# Copyright (C) 2023 Digi International. +# Copyright (C) 2023,2024 Digi International. # require dey-image-graphical.inc DESCRIPTION = "DEY image with LVGL graphical libraries" GRAPHICAL_CORE = "lvgl" + +# On the ccimx6ul, the only supported LVGL backend is fbdev, so there is no +# need for a X11 desktop environment. +IMAGE_FEATURES:remove:ccimx6ul = " x11-base x11-sato " + +# Remove GRAPHICAL_BACKEND suffix (-x11) from ccimx6ul image names +DEFAULT_IMAGE_BASENAME:ccimx6ul = "dey-image-${GRAPHICAL_CORE}" diff --git a/meta-digi-dey/recipes-crank/crank-demos/crank-demos_7.2.bb b/meta-digi-dey/recipes-crank/crank-demos/crank-demos_7.2.bb index 152f7a253..c1f410960 100644 --- a/meta-digi-dey/recipes-crank/crank-demos/crank-demos_7.2.bb +++ b/meta-digi-dey/recipes-crank/crank-demos/crank-demos_7.2.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2022, Digi International Inc. +# Copyright (C) 2022-2024 Digi International Inc. SUMMARY = "Crank Demo" HOMEPAGE = "https://www.cranksoftware.com/" @@ -19,7 +19,8 @@ WESTON_SERVICE:ccmp15 ?= "weston-launch.service" CRANK_DEMOS_TARBALL_PATH ?= "" CRANK_DEMO_DISPLAY ?= "wayland-0" CRANK_DEMO_DISPLAY:ccmp15 ?= "wayland-1" -CRANK_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\${DEMO_DISPLAY}" +CRANK_DEMO_DISPLAY:ccimx93 ?= "wayland-1" +CRANK_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\$\{DEMO_DISPLAY\}" CRANK_DEMO_ENV:ccimx6ul ?= "" CRANK_DEMO_OPTIONS ?= "-orender_mgr,multisample=0" CRANK_DEMO_OPTIONS:ccimx6ul ?= "-orender_mgr,multisample=0 -odev-input,mouse=/dev/input/mouse0 -oscreen_mgr,swcursor" 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 6910899d4..b1446e9ce 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 @@ -8,8 +8,8 @@ LICENSE = "MPL-2.0" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MPL-2.0;md5=815ca599c9df247a0c7f619bab123dad" SRCBRANCH ?= "master" -SRCREV = "72cc9eb39088ae6b16d32ca03c74e8885323279a" -PV = "1.0.6" +SRCREV = "70245c4f4de7f2ffae899fd7cf267d9ad6db7ae0" +PV = "1.0.7" SRC_URI = " \ ${DIGI_GITHUB_GIT}/connectcore-ble-python.git;protocol=https;branch=${SRCBRANCH} \ diff --git a/meta-digi-dey/recipes-digi/cccs/files/cccs-gs-demo.service b/meta-digi-dey/recipes-digi/cccs/files/cccs-gs-demo.service index 02e94f52d..fbab6a8b1 100644 --- a/meta-digi-dey/recipes-digi/cccs/files/cccs-gs-demo.service +++ b/meta-digi-dey/recipes-digi/cccs/files/cccs-gs-demo.service @@ -3,6 +3,8 @@ Description=CCCS get start demo After=cccsd.service BindsTo=cccsd.service Upholds=cccsd.service +# Do not limit the number of restarting times +StartLimitIntervalSec=0 [Service] Type=forking @@ -10,7 +12,9 @@ ExecStart=/etc/cccs-gs-demo start ExecStop=/etc/cccs-gs-demo stop # SIGTERM signal is a valid status value SuccessExitStatus=143 +# Restart the service every 30 seconds if it fails Restart=on-failure +RestartSec=30s [Install] WantedBy=multi-user.target diff --git a/meta-digi-dey/recipes-digi/cccs/files/cccsd.service b/meta-digi-dey/recipes-digi/cccs/files/cccsd.service index f63515d85..b6fe11cf1 100644 --- a/meta-digi-dey/recipes-digi/cccs/files/cccsd.service +++ b/meta-digi-dey/recipes-digi/cccs/files/cccsd.service @@ -1,13 +1,17 @@ [Unit] Description=CCCS daemon After=network.target +# Do not limit the number of restarting times +StartLimitIntervalSec=0 [Service] Type=forking ExecStart=/etc/cccsd start ExecStop=/etc/cccsd stop PIDFile=/run/cccsd.pid +# Restart the service every 30 seconds if it fails Restart=on-failure +RestartSec=30s [Install] WantedBy=multi-user.target 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 707d26ae8..ff2034e72 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 @@ -30,12 +30,17 @@ S = "${WORKDIR}/connectcore-demo-example" inherit systemd update-rc.d +BOARD_IMAGE_FILE ?= "${MACHINE}_board.png" + +# The ccimx6qpsbc re-uses the ccimx6sbc board image +BOARD_IMAGE_FILE:ccimx6qpsbc = "ccimx6sbc_board.png" + do_install() { install -d ${D}/srv/www cp -r ${WORKDIR}/git/connectcore-demo-example/* ${D}/srv/www/ # Remove unused images - find ${D}/srv/www/static/images/ -type f -name '*_board.png' -not -name '${MACHINE}_board.png' -delete + find ${D}/srv/www/static/images/ -type f -name '*_board.png' -not -name '${BOARD_IMAGE_FILE}' -delete # Install systemd service if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then 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 e3943fa24..b5a24018b 100644 --- a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb +++ b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb @@ -1,4 +1,4 @@ -# Copyright (C) 2013-2023, Digi International Inc. +# Copyright (C) 2013-2024, Digi International Inc. SUMMARY = "DEY examples packagegroup" @@ -27,4 +27,4 @@ RDEPENDS:${PN}:append:ccimx6 = "\ dey-examples-v4l2 \ " -COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x|ccimx93)" 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 index e402e85ad..a72daf561 100644 --- 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 @@ -1,5 +1,8 @@ -# Copyright (C) 2023 Digi International Inc. +# Copyright (C) 2023,2024 Digi International Inc. require swu.inc IMG_NAME = "${@get_baseimg_pn(d)}-${GRAPHICAL_BACKEND}" + +# Remove GRAPHICAL_BACKEND suffix (-x11) from ccimx6ul image names +IMG_NAME:ccimx6ul = "${@get_baseimg_pn(d)}" 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 c885c9b1e..29130b4b6 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 @@ -24,6 +24,10 @@ software = ##SCRIPT_UBOOT## ); uboot: ( + { + name = "upgrade_available"; + value = "@@UPGRADE_AVAILABLE@@"; + }, { name = "swap_bank"; value = "false"; @@ -52,6 +56,12 @@ software = } ##SCRIPT_UBOOT## ); + uboot: ( + { + name = "upgrade_available"; + value = "@@UPGRADE_AVAILABLE@@"; + } + ); } platform = { ref = "#./single"; 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 bd681c61a..921826bb5 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 @@ -57,6 +57,12 @@ software = } ##SCRIPT_UBOOT## ); + uboot: ( + { + name = "upgrade_available"; + value = "@@UPGRADE_AVAILABLE@@"; + } + ); } platform = { ref = "#./single"; diff --git a/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init b/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init new file mode 100644 index 000000000..f0b3f5b41 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init @@ -0,0 +1,133 @@ +#!/bin/sh +#=============================================================================== +# +# Copyright (C) 2024 by Digi International Inc. +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# +# !Description: Initialize LVGL demo +# +#=============================================================================== + +readonly DEMO_NAME="lvgl_demo" +readonly DEMO_PATH="/usr/bin/${DEMO_NAME}" +readonly DEMO_TITLE="LVGL Demo Application" +readonly DEMO_DISPLAY="##LVGL_DEMO_DISPLAY##" +readonly DEMO_ENV="##LVGL_DEMO_ENV##" +readonly PID_FILE="/run/${DEMO_NAME}.pid" + +log() { + if type "systemd-cat" >/dev/null 2>/dev/null; then + systemd-cat -p "${1}" -t "${DEMO_NAME}" printf "%s" "${2}" + fi + logger -p "${1}" -t "${DEMO_NAME}" "${2}" +} + +get_demo_pid() { + local pid="$(pgrep -f ${DEMO_PATH})" + + [ -n "${pid}" ] && { echo "${pid}"; return 0; } + + return 1 +} + +check_is_running() { + local pid + + if [ -s "${PID_FILE}" ]; then + pid="$(cat ${PID_FILE})" + else + pid="$(get_demo_pid)" + echo "${pid}" > ${PID_FILE} + fi + + if [ "${pid}" ]; then + kill -0 "${pid}" >/dev/null 2>&1 && return 0 + fi + + rm -f "${PID_FILE}" + + return 1 +} + +wait_for_wayland() { + local count=20 + local wayland_socket="/run/user/0/${DEMO_DISPLAY}" + + while [ ! -S "${wayland_socket}" ]; do + sleep 1 + count=$((count-1)) + if [ "${count}" = 0 ]; then + return 1 + fi + done + sleep 1 + return 0 +} + +stop() { + check_is_running || return + + local pid="$(cat ${PID_FILE})" + kill -TERM "${pid}" >/dev/null 2>&1 + + local STOP_TIMEOUT="5" + for i in $(seq ${STOP_TIMEOUT}); do + check_is_running || { log info "stopped"; break; } + if [ "${i}" -eq ${STOP_TIMEOUT} ]; then + log warning "stop: ${DEMO_NAME} did not stop gracefully" + kill -KILL "${pid}" >/dev/null 2>&1 + fi + sleep 1 + done +} + +start() { + check_is_running && { log warning "start: ${DEMO_NAME} ALREADY running"; exit 0; } + + if [ -d "/usr/share/wayland" ]; then + wait_for_wayland + else + # Disable the cursor when displaying at full screen on fbdev + echo "0" > /sys/class/graphics/fbcon/cursor_blink + fi + + # Launch demo + env ${DEMO_ENV} ${DEMO_PATH} >/dev/null 2>&1 & + + if [ $? -eq 0 ]; then + echo $! > ${PID_FILE} + log info "$(cat ${PID_FILE})" + log info "started" + fi +} + +case "$1" in + start) + echo -n "Starting ${DEMO_TITLE}: " + start + echo "done." + ;; + stop) + stop + echo -n "Stopping ${DEMO_TITLE}: " + if [ -n "`/bin/pidof ${DEMO_PATH}`" ] ; then + echo "FAIL" + else + echo "OK" + fi + ;; + restart) + stop + sleep 1 + start + ;; + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 + ;; +esac diff --git a/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init.service b/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init.service new file mode 100644 index 000000000..cdf5369d8 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init.service @@ -0,0 +1,15 @@ +[Unit] +Description=LVGL Demo Application + +# Make sure we are started after graphic service is available +After=##WESTON_SERVICE## +Requires=##WESTON_SERVICE## + +[Service] +Type=forking +PIDFile=/run/lvgl_demo.pid +ExecStart=/etc/lvgl-demo-init start +ExecStop=/etc/lvgl-demo-init stop + +[Install] +WantedBy=multi-user.target diff --git a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc index aca56b15c..a66614d60 100644 --- a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc +++ b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc @@ -8,6 +8,7 @@ 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/mouse0" +LVGL_CONFIG_EVDEV_INPUT:ccimx6ul ?= "/dev/input/touchscreen0" LVGL_CONFIG_USE_FBDEV = "${@bb.utils.contains('PACKAGECONFIG', 'fbdev', '1', '0', d)}" 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 ebe8355f8..1da8e2b23 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 @@ -9,8 +9,10 @@ SRCBRANCH ?= "dey/master" SRC_URI = " \ gitsm://github.com/digi-embedded/lv_port_linux_frame_buffer.git;branch=${SRCBRANCH};protocol=https \ + file://lvgl-demo-init \ + file://lvgl-demo-init.service \ " -SRCREV = "f9426988a70f485ba7895bb1c26493f2fffcd957" +SRCREV = "0a799d22a5aaf9de18aca428579945a0a9c2c270" EXTRA_OEMAKE = "DESTDIR=${D}" @@ -23,7 +25,7 @@ PACKAGECONFIG = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', ' require lv-drivers.inc -inherit cmake +inherit cmake systemd update-rc.d S = "${WORKDIR}/git" @@ -34,6 +36,8 @@ LVGL_CONFIG_DRM_CARD:mx8-generic-bsp = "/dev/dri/card1" LVGL_CONFIG_HOR_RES ?= "800" LVGL_CONFIG_VER_RES ?= "480" +LVGL_CONFIG_HOR_RES:ccimx6ul ?= "1280" +LVGL_CONFIG_VER_RES:ccimx6ul ?= "800" do_configure:prepend() { if [ "${LVGL_CONFIG_USE_DRM}" -eq 1 ] ; then @@ -58,9 +62,49 @@ do_configure:prepend() { -i "${S}/lv_drv_conf.h" } +WESTON_SERVICE ?= "weston.service" +WESTON_SERVICE:ccmp15 ?= "weston-launch.service" + +LVGL_DEMO_DISPLAY ?= "wayland-0" +LVGL_DEMO_DISPLAY:ccmp15 ?= "wayland-1" +LVGL_DEMO_DISPLAY:ccimx93 ?= "wayland-1" +LVGL_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\$\{DEMO_DISPLAY\}" +LVGL_DEMO_ENV:ccimx6ul ?= "" + do_install:append() { install -d ${D}${bindir} install -m 0755 ${B}/lvgl_fb ${D}${bindir}/lvgl_demo + + # Install systemd service + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + # Install systemd unit files + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/lvgl-demo-init.service ${D}${systemd_unitdir}/system/ + sed -i -e "s,##WESTON_SERVICE##,${WESTON_SERVICE},g" \ + "${D}${systemd_unitdir}/system/lvgl-demo-init.service" + fi + + # Install wrapper bootscript to launch LVGL demo on boot + install -d ${D}${sysconfdir}/init.d + install -m 0755 ${WORKDIR}/lvgl-demo-init ${D}${sysconfdir}/lvgl-demo-init + sed -i -e "s@##LVGL_DEMO_DISPLAY##@${LVGL_DEMO_DISPLAY}@g" \ + -e "s@##LVGL_DEMO_ENV##@${LVGL_DEMO_ENV}@g" \ + "${D}${sysconfdir}/lvgl-demo-init" + ln -sf ${sysconfdir}/lvgl-demo-init ${D}${sysconfdir}/init.d/lvgl-demo-init } +PACKAGES =+ "${PN}-init" +FILES:${PN}-init = " \ + ${sysconfdir}/lvgl-demo-init \ + ${sysconfdir}/init.d/lvgl-demo-init \ + ${systemd_unitdir}/system/lvgl-demo-init.service \ +" + +INITSCRIPT_PACKAGES += "${PN}-init" +INITSCRIPT_NAME:${PN}-init = "lvgl-demo-init" +INITSCRIPT_PARAMS:${PN}-init = "start 99 3 5 . stop 20 0 1 2 6 ." + +SYSTEMD_PACKAGES = "${PN}-init" +SYSTEMD_SERVICE:${PN}-init = "lvgl-demo-init.service" + COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x|ccimx93|ccmp15)" diff --git a/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-lvgl.bb b/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-lvgl.bb index f00ea6a1e..3ea3bbbc0 100644 --- a/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-lvgl.bb +++ b/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-lvgl.bb @@ -8,4 +8,5 @@ inherit packagegroup RDEPENDS:${PN} += " \ lvgl-demo \ + lvgl-demo-init \ " diff --git a/sdk/build-github.sh b/sdk/build-github.sh index fea24b791..9f1e07031 100755 --- a/sdk/build-github.sh +++ b/sdk/build-github.sh @@ -139,7 +139,6 @@ done<<-_EOF_ ccimx8mm-dvk dey-image-qt ccimx8mn-dvk dey-image-qt ccimx8x-sbc-pro dey-image-qt - ccimx8x-sbc-express dey-image-qt ccimx6qpsbc dey-image-qt ccimx6sbc dey-image-qt ccimx6ulsbc dey-image-qt diff --git a/sdk/build.sh b/sdk/build.sh index 80f189f4d..649ecfa99 100755 --- a/sdk/build.sh +++ b/sdk/build.sh @@ -176,8 +176,8 @@ done<<-_EOF_ 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,dey-image-lvgl - ccimx6sbc dey-image-qt,dey-image-crank,dey-image-webkit,dey-image-lvgl + ccimx6qpsbc dey-image-qt,dey-image-webkit,dey-image-lvgl + ccimx6sbc dey-image-qt,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 diff --git a/sdk/config/ccimx6ulsbc/conf-notes.txt b/sdk/config/ccimx6ulsbc/conf-notes.txt index 44fd937f9..0e46ca7af 100644 --- a/sdk/config/ccimx6ulsbc/conf-notes.txt +++ b/sdk/config/ccimx6ulsbc/conf-notes.txt @@ -7,8 +7,7 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is X11-based so it provides a full SATO theme - desktop environment. + A framebuffer-based image including an LVGL demo application. * core-image-base: a console-only image