Merge tag 'dey-4.0-r5.2' into dey-4.0/master

Digi Embedded Yocto 4.0-r5.2

Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
This commit is contained in:
Arturo Buzarra 2024-02-16 12:40:18 +01:00
commit 52eb698999
56 changed files with 1533 additions and 71 deletions

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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
#

View File

@ -0,0 +1,90 @@
From: Haihua Hu <jared.hu@nxp.com>
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) {

View File

@ -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"

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,6 @@
# Copyright (C) 2024, Digi International Inc.
require nativesdk-trustfence-sign-tools_git.bb
SRCBRANCH = "v2023.04/maint"
SRCREV = "d27aefc1691a14c6edaadf35ab147ac8afe5c98a"

View File

@ -0,0 +1,6 @@
# Copyright (C) 2024, Digi International Inc.
require trustfence-sign-tools-native_git.bb
SRCBRANCH = "v2023.04/maint"
SRCREV = "d27aefc1691a14c6edaadf35ab147ac8afe5c98a"

View File

@ -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)}"

View File

@ -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}"

View File

@ -0,0 +1,933 @@
From: Gabriel Valcazar <gabriel.valcazar@digi.com>
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 <gabriel.valcazar@digi.com>
---
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 <assert.h>
+
+#include <wayland-server.h>
+
+#include <libweston/libweston.h>
+#include <libweston/zalloc.h>
+
+#include <libweston-desktop/libweston-desktop.h>
+#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',

View File

@ -0,0 +1,90 @@
From: Haihua Hu <jared.hu@nxp.com>
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) {

View File

@ -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"

View File

@ -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:"

View File

@ -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

View File

@ -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)} \

View File

@ -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}"

View File

@ -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"

View File

@ -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} \

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)"

View File

@ -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)}"

View File

@ -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";

View File

@ -57,6 +57,12 @@ software =
}
##SCRIPT_UBOOT##
);
uboot: (
{
name = "upgrade_available";
value = "@@UPGRADE_AVAILABLE@@";
}
);
}
platform = {
ref = "#./single";

View File

@ -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

View File

@ -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

View File

@ -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)}"

View File

@ -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)"

View File

@ -8,4 +8,5 @@ inherit packagegroup
RDEPENDS:${PN} += " \
lvgl-demo \
lvgl-demo-init \
"

View File

@ -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

View File

@ -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

View File

@ -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