From 02fa0d89bdf96d3473c162ebe9c3acd8198e9402 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Tue, 7 Jun 2022 10:38:03 +1000 Subject: [PATCH 01/29] initial commit. --- packages/sx05re/emuelec/bin/joy_common.sh | 58 +++++------------------ 1 file changed, 12 insertions(+), 46 deletions(-) diff --git a/packages/sx05re/emuelec/bin/joy_common.sh b/packages/sx05re/emuelec/bin/joy_common.sh index b4431271d1e..ac68c9e1ba6 100644 --- a/packages/sx05re/emuelec/bin/joy_common.sh +++ b/packages/sx05re/emuelec/bin/joy_common.sh @@ -23,27 +23,26 @@ jc_get_players() { # Dump gamepad information cat /proc/bus/input/devices \ - | grep -E -B 5 -A 3 "H\: Handlers=(js[0-9] event[0-9])|(event[0-9] js[0-9])" \ + | grep -E -B 5 -A 3 "H\: Handlers=(js[0-9] event[0-9]+)|(event[0-9]+ js[0-9])" \ | grep -Ew -B 8 "B: KEY\=[0-9a-f ]+" > /tmp/input_devices # Determine how many gamepads/players are connected - JOYS=$(ls -A1 /dev/input/js*| sort ) - + JOYS=$(cat /tmp/input_devices | grep -A2 "S: Sysfs=" \ + | awk '/^S:/ {s=$0} /^H:/ {print s "\t" $0}' | sort -t $'\t' -k2 \ + | sed 's,.*\(.\{4\}\)$,\1,' | sed 's/ //g') declare -a PLAYER_CFGS=() - + for dev in $(echo $JOYS); do - - JOY_INDEX=$(basename $dev) - - PROC_GUID=$(cat /tmp/input_devices | grep ${JOY_INDEX} -B 5 | grep I: | sed "s|I:\ Bus=||" | sed "s|\ Vendor=||" | sed "s|\ Product=||" | sed "s|\ Version=||") + local JSI=$dev + local DETAILS=$(cat /tmp/input_devices \ + | grep -E "H\: Handlers=(${JSI} event[0-9]+)|(event[0-9]+ ${JSI})" -B 5) + + local PROC_GUID=$(echo "${DETAILS}" | grep I: | sed "s|I:\ Bus=||" | sed "s|\ Vendor=||" | sed "s|\ Product=||" | sed "s|\ Version=||") local DEVICE_GUID=$(jc_generate_guid ${PROC_GUID}) - [[ -z "${DEVICE_GUID}" ]] && continue - local JOY_DETAIL=$(jc_get_device_detail "${DEVICE_GUID}") - [[ "$JOY_DETAIL" == 0 ]] && continue - local JSI=$(echo "$JOY_DETAIL" | cut -d' ' -f1) - local JOY_NAME=$(echo "$JOY_DETAIL" | cut -d' ' -f2-) + local JOY_NAME=$(echo "${DETAILS}" | grep -E "^N\: Name.*[\= ]?.*$" | cut -d "=" -f 2 | tr -d '"') + [[ -z "$JOY_NAME" ]] && continue # Add the joy config to array if guid and joyname set. if [[ ! -z "${DEVICE_GUID}" && ! -z "$JOY_NAME" ]]; then @@ -116,36 +115,3 @@ jc_generate_guid() { echo "$v" } -jc_get_device_detail() { - local GUID="${1}" - - v=${DEVICE_GUID:0:8} - local p1=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) # Bus, generally not needed - local v=${GUID:8:8} - local p2=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) # Vendor - v=${GUID:16:8} - local p3=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) # Product - v=${GUID:24:8} - local p4=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) # Version - - local vendor=$(echo ${p2:4}) - local product=$(echo ${p3:4}) - local version=$(echo ${p4:4}) - - local I_REGEX="^I\: .* Vendor\=${vendor} Product\=${product} Version\=${version}$" - local EE_DEV=$(cat /tmp/input_devices | grep -Ew -A 8 "$I_REGEX" | head -n8) - - declare -i REC_INDEX=$(cat /tmp/input_devices | grep -n -E "$I_REGEX" | cut -d':' -f1 | head -n1 ) - declare -i REC_LENGTH=$(( REC_INDEX + 9 )) - sed -i "${REC_INDEX},${REC_LENGTH}d" /tmp/input_devices - - local JSI=$(echo -e "${EE_DEV}" | grep "H: Handlers" | sed -E 's/.*H: Handlers=.*(js[0-9]).*/\1/' | head -n1 ) - - if [[ ! -z "${EE_DEV}" ]]; then - local JOY_NAME=$(echo "${EE_DEV}" | grep -E "^N\: Name.*[\= ]?.*$" \ - | cut -d "=" -f 2 | tr -d '"') - echo "${JSI} ${JOY_NAME}" - return - fi - echo "0" -} From 80f88379e85f33b709f9f434502a1ae6d2cc8367 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Wed, 8 Jun 2022 09:49:36 +1000 Subject: [PATCH 02/29] add gamecontroller valid check. --- packages/sx05re/emuelec/bin/joy_common.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/sx05re/emuelec/bin/joy_common.sh b/packages/sx05re/emuelec/bin/joy_common.sh index ac68c9e1ba6..956980b1f64 100644 --- a/packages/sx05re/emuelec/bin/joy_common.sh +++ b/packages/sx05re/emuelec/bin/joy_common.sh @@ -41,6 +41,10 @@ jc_get_players() { local DEVICE_GUID=$(jc_generate_guid ${PROC_GUID}) [[ -z "${DEVICE_GUID}" ]] && continue + local GC_CONFIG=$(cat "$GCDB" | grep "$DEVICE_GUID" | grep "platform:Linux" | head -1) + echo "GC_CONFIG=$GC_CONFIG" + [[ -z $GC_CONFIG ]] && continue + local JOY_NAME=$(echo "${DETAILS}" | grep -E "^N\: Name.*[\= ]?.*$" | cut -d "=" -f 2 | tr -d '"') [[ -z "$JOY_NAME" ]] && continue From e80195a0f74e4ccd35c421395f0da411186c515d Mon Sep 17 00:00:00 2001 From: Joshua L Date: Thu, 14 Jul 2022 10:04:30 +1000 Subject: [PATCH 03/29] initial commit. --- packages/sx05re/emuelec/bin/emuelec-utils | 59 +++++++--- .../sx05re/emuelec/bin/emuelec_autostart.sh | 29 +---- packages/sx05re/emuelec/bin/emustation-config | 27 +++++ packages/sx05re/emuelec/bin/setres.sh | 102 +++++++++--------- 4 files changed, 121 insertions(+), 96 deletions(-) diff --git a/packages/sx05re/emuelec/bin/emuelec-utils b/packages/sx05re/emuelec/bin/emuelec-utils index ab0a165533c..f5b7fd4d4bd 100755 --- a/packages/sx05re/emuelec/bin/emuelec-utils +++ b/packages/sx05re/emuelec/bin/emuelec-utils @@ -190,22 +190,49 @@ function resolutions() { RESOLUTIONS=() - # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode - N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" - - # Screen supported resolutions - SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/amhdmitx/amhdmitx0/rawedid | /usr/bin/edid-decode |/usr/bin/grep "@" | sed -E "s| {0,9}VIC {0,9}[0-9]{1,2}||" | /usr/bin/awk '{print $1}' | /usr/bin/sed 's/@/p/g'|/usr/bin/tr '[:upper:]' '[:lower:]'` - - for N2SP in $N2_SUPPORTED_RESOLUTIONS - do - for SSR in $SCREEN_SUPPORTED_RESOLUTIONS - do - if [ "$N2SP" = "$SSR" ] - then - RESOLUTIONS+=($N2SP) - fi - done - done + if [ -f "/storage/LEGACY_RESOLUTIONS" ]; then + # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode + N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" + + # Screen supported resolutions + SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/amhdmitx/amhdmitx0/rawedid | /usr/bin/edid-decode |/usr/bin/grep "@" | sed -E "s| {0,9}VIC {0,9}[0-9]{1,2}||" | /usr/bin/awk '{print $1}' | /usr/bin/sed 's/@/p/g'|/usr/bin/tr '[:upper:]' '[:lower:]'` + + for N2SP in $N2_SUPPORTED_RESOLUTIONS + do + for SSR in $SCREEN_SUPPORTED_RESOLUTIONS + do + if [ "$N2SP" = "$SSR" ] + then + RESOLUTIONS+=($N2SP) + fi + done + done + fi + + if [[ "$EE_PROJECT" == "Rockchip" ]]; then + SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/display0.HDMI/modes | sort -u` + for SSR in $SCREEN_SUPPORTED_RESOLUTIONS + do + RESOLUTIONS+=($SSR) + done + else + # Screen supported resolutions + SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/cap | sed '/smpte/d' | sed '/pal/d' | sed '/ntsc/d' | sed 's/\*//' | grep -E '[0-9x]+[pi][56]0hz|cvbs'` + for SSR in $SCREEN_SUPPORTED_RESOLUTIONS + do + RESOLUTIONS+=($SSR) + done + fi + + if [ "$EE_DEVICE" == "OdroidGoAdvance" ]; then + RESOLUTIONS+="480x320p60hz" + fi + + if [ "$EE_DEVICE" == "GameForce" ]; then + RESOLUTIONS+="640x480p60hz" + fi + + RESOLUTIONS=($(printf "%s\n" "${RESOLUTIONS[@]}" | sort -u)) IFS="," echo "${RESOLUTIONS[*]}" diff --git a/packages/sx05re/emuelec/bin/emuelec_autostart.sh b/packages/sx05re/emuelec/bin/emuelec_autostart.sh index b6bdeeda8f7..6094baf4608 100755 --- a/packages/sx05re/emuelec/bin/emuelec_autostart.sh +++ b/packages/sx05re/emuelec/bin/emuelec_autostart.sh @@ -95,32 +95,6 @@ if [ -f "${BACKUPFILE}" ]; then emuelec-utils ee_backup restore no > /emuelec/logs/last-restore.log 2>&1 fi -DEFE="" - -# If the video-mode is contained in flash config. -if [ -s "${CONFIG_FLASH}" ]; then - CFG_VAL=$(get_config_value "$CONFIG_FLASH" "hdmimode") - [ ! -z "$CFG_VAL" ] && DEFE="$CFG_VAL" && set_ee_setting ee_videomode $DEFE -fi - -# Otherwise retrieve via normal methods. -if [ -z "$DEFE" ]; then - if [ -s "/storage/.config/EE_VIDEO_MODE" ]; then - DEFE=$(cat /storage/.config/EE_VIDEO_MODE) && set_ee_setting ee_videomode $DEFE - fi -fi - -if [ -z "$DEFE" ]; then - # Set video mode, this has to be done before starting ES - DEFE=$(get_ee_setting ee_videomode) - if [ "${DEFE}" == "Custom" ]; then - DEFE=$(cat /sys/class/display/mode) - fi -fi - -# finally we correct the FB according to video mode -setres.sh ${DEFE} - # Clean cache garbage when boot up. rm -rf /storage/.cache/cores/* & @@ -139,6 +113,9 @@ case "$DEFE" in ;; esac +FILE_MODE="/sys/class/display/mode" +[[ -f "$FILE_MODE" ]] && setres.sh + # Show splash creen show_splash.sh intro diff --git a/packages/sx05re/emuelec/bin/emustation-config b/packages/sx05re/emuelec/bin/emustation-config index 777820d4597..1ee65ceaf2a 100755 --- a/packages/sx05re/emuelec/bin/emustation-config +++ b/packages/sx05re/emuelec/bin/emustation-config @@ -11,6 +11,7 @@ function check_pwd() { +CONFIG_FLASH="/flash/config.ini" EE_CONF="${EE_DIR}/configs/emuelec.conf" ESSETTINGS="/storage/.config/emulationstation/es_settings.cfg" @@ -288,4 +289,30 @@ fi emuelec-utils setauddev +DEFE="" + +# If the video-mode is contained in flash config. +if [ -s "${CONFIG_FLASH}" ]; then + CFG_VAL=$(get_config_value "$CONFIG_FLASH" "vout") + [ ! -z "$CFG_VAL" ] && DEFE="$CFG_VAL" && set_ee_setting ee_videomode $DEFE +fi + +# Otherwise retrieve via normal methods. +if [ -z "$DEFE" ]; then + if [ -s "/storage/.config/EE_VIDEO_MODE" ]; then + DEFE=$(cat /storage/.config/EE_VIDEO_MODE) && \ + set_ee_setting ee_videomode $DEFE && \ + mv /storage/.config/EE_VIDEO_MODE /storage/.config/EE_VIDEO_MODE_2 + fi +fi + +if [ -z "$DEFE" ]; then + # Set video mode, this has to be done before starting ES + DEFE=$(get_ee_setting ee_videomode) +fi + +# finally we correct the FB according to video mode +[[ ! -z "$DEFE" ]] && setres.sh ${DEFE} + + exit 0 diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index d30d08867e7..db4dc9d0d7f 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) +# Copyright (C) 2022-present Joshua L (https://github.com/Langerz82) # Read the video output mode and set it for emuelec to avoid video flicking. @@ -10,16 +11,8 @@ # set -x #echo on -# 1080p60hz -# 1080i60hz -# 720p60hz -# 720p50hz -# 480p60hz -# 480cvbs -# 576p50hz -# 1080p50hz -# 1080i50hz -# 576cvbs +# Source predefined functions and variables +. /etc/profile # arg1, 1 = Hides, 0 = Show. show_buffer () @@ -31,57 +24,35 @@ show_buffer () blank_buffer() { # Blank the buffer. - dd if=/dev/zero of=/dev/fb0 bs=12M > /dev/null 2>&1 + dd if=/dev/zero of=/dev/fb0 bs=10M > /dev/null 2>&1 } + +FILE_MODE="/sys/class/display/mode" +[[ ! -f "$FILE_MODE" ]] && FILE_MODE="/sys/class/display/display0.HDMI/mode" +[[ ! -f "$FILE_MODE" ]] && exit 0; + BPP=32 -HZ=60 MODE=$1 -CUR_MODE=`cat /sys/class/display/mode`; +[[ -z "$MODE" ]] && MODE=$(cat $FILE_MODE) # If the current display is the same as the change just exit. [ -z "$MODE" ] && exit 0; [[ $MODE == "auto" ]] && exit 0; -# Removed because if try to set invalid video mode it becomes a valid MODE -# in display/mode and then when trying to revert back this becomes true exiting. -#[[ "$MODE" == "$CUR_MODE" ]] && exit 0; if [[ ! "$MODE" == *"x"* ]]; then case $MODE in - *p*) H=$(echo $MODE | cut -d'p' -f 1) ;; - *i*) H=$(echo $MODE | cut -d'i' -f 1) ;; - *cvbs*) H=$(echo $MODE | cut -d'c' -f 1) ;; + *p*) H=$(echo $MODE | cut -d'p' -f 1) ;; + *i*) H=$(echo $MODE | cut -d'i' -f 1) ;; esac fi -HZ=${MODE:(-4):2} -if [[ ! -n "$HZ" ]] || [[ $HZ -eq 50 ]]; then - HZ=60 -fi - - # hides buffer show_buffer 1 case $MODE in - 480p*hz|480i*hz|576p*hz|720p*hz|1080p*hz|1440p*hz|2160p*hz|576i*hz|720i*hz|1080i*hz|1440i*hz|2160i*hz) - W=$(($H*16/9)) - [[ "$MODE" == "480"* ]] && W=854 - DH=$(($H*2)) - W1=$(($W-1)) - H1=$(($H-1)) - fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo $MODE > /sys/class/display/mode - echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb1/free_scale - ;; - 480cvbs) - echo 480cvbs > /sys/class/display/mode + 480cvbs) fbset -fb /dev/fb0 -g 640 480 640 960 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis @@ -91,7 +62,6 @@ case $MODE in echo 0 > /sys/class/graphics/fb1/free_scale ;; 576cvbs) - echo 576cvbs > /sys/class/display/mode fbset -fb /dev/fb0 -g 720 576 720 1152 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 719 575 > /sys/class/graphics/fb0/free_scale_axis @@ -100,23 +70,46 @@ case $MODE in echo 1 > /sys/class/graphics/fb0/freescale_mode echo 0 > /sys/class/graphics/fb1/free_scale ;; + 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) + echo $MODE > "${FILE_MODE}" + NEW_MODE=$(cat "${FILE_MODE}") + [[ "$MODE" != *"$NEW_MODE" ]] && exit + W=$(( $H*16/9 )) + [[ "$MODE" == "480"* ]] && W=640 + DH=$(($H*2)) + W1=$(($W-1)) + H1=$(($H-1)) + fbset -fb /dev/fb0 -g $W $H $W $DH $BPP + fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP + echo 0 > /sys/class/graphics/fb0/free_scale + echo 1 > /sys/class/graphics/fb0/freescale_mode + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis + echo 0 > /sys/class/graphics/fb1/free_scale + ;; *x*) + echo $MODE > "${FILE_MODE}" + NEW_MODE=$(cat "${FILE_MODE}") + if [[ "$MODE" != "$NEW_MODE" ]]; then + MODE=$(echo $MODE | cut -d'x' -f 2) + echo $MODE > "${FILE_MODE}" + NEW_MODE=$(cat "${FILE_MODE}") + fi + [[ "$MODE" != "$NEW_MODE" ]] && exit W=$(echo $MODE | cut -d'x' -f 1) H=$(echo $MODE | cut -d'x' -f 2 | cut -d'p' -f 1) [ ! -n "$H" ] && H=$(echo $MODE | cut -d'x' -f 2 | cut -d'i' -f 1) if [ -n "$W" ] && [ -n "$H" ]; then DH=$(($H*2)) - W1=$(($W-1)) - H1=$(($H-1)) - fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP -# [[ "$MODE" = "720x480p"* ]] && MODE=$(echo "${H}p${HZ}hz") - echo $MODE > /sys/class/display/mode - echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb1/free_scale + W1=$(($W-1)) + H1=$(($H-1)) + fbset -fb /dev/fb0 -g $W $H $W $DH $BPP + fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP + echo 0 > /sys/class/graphics/fb0/free_scale + echo 1 > /sys/class/graphics/fb0/freescale_mode + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis + echo 0 > /sys/class/graphics/fb1/free_scale fi ;; esac @@ -126,6 +119,7 @@ blank_buffer # shows buffer show_buffer 0 +[[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix # End of reading the video output mode and setting it for emuelec to avoid video flicking. # The codes can be simplified with "elseif" sentences. From 1c18d0e79a73505a4bec5a271067c294d7defc5a Mon Sep 17 00:00:00 2001 From: Joshua L Date: Tue, 19 Jul 2022 01:17:02 +1000 Subject: [PATCH 04/29] Update setres.sh added defaults should fix res switching problem. --- packages/sx05re/emuelec/bin/setres.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index db4dc9d0d7f..c826c9d1e5a 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -27,9 +27,9 @@ blank_buffer() dd if=/dev/zero of=/dev/fb0 bs=10M > /dev/null 2>&1 } - +DEFAULT_MODE="720p60hz" FILE_MODE="/sys/class/display/mode" -[[ ! -f "$FILE_MODE" ]] && FILE_MODE="/sys/class/display/display0.HDMI/mode" +[[ ! -f "$FILE_MODE" ]] && FILE_MODE="/sys/class/display/display0.HDMI/mode" && DEFAULT_MODE="720p-60" [[ ! -f "$FILE_MODE" ]] && exit 0; BPP=32 @@ -88,6 +88,7 @@ case $MODE in echo 0 > /sys/class/graphics/fb1/free_scale ;; *x*) + echo $DEFAULT_MODE > "${FILE_MODE}" echo $MODE > "${FILE_MODE}" NEW_MODE=$(cat "${FILE_MODE}") if [[ "$MODE" != "$NEW_MODE" ]]; then @@ -95,7 +96,7 @@ case $MODE in echo $MODE > "${FILE_MODE}" NEW_MODE=$(cat "${FILE_MODE}") fi - [[ "$MODE" != "$NEW_MODE" ]] && exit + [[ "$MODE" != "$NEW_MODE" ]] && exit W=$(echo $MODE | cut -d'x' -f 1) H=$(echo $MODE | cut -d'x' -f 2 | cut -d'p' -f 1) [ ! -n "$H" ] && H=$(echo $MODE | cut -d'x' -f 2 | cut -d'i' -f 1) From 15ce1f2745f3a4c6cf66db4787460b7a2bccc073 Mon Sep 17 00:00:00 2001 From: Joshua L Date: Tue, 19 Jul 2022 01:25:02 +1000 Subject: [PATCH 05/29] Update setres.sh ws fix --- packages/sx05re/emuelec/bin/setres.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index c826c9d1e5a..24bc6112b18 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -58,7 +58,7 @@ case $MODE in echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 639 479 > /sys/class/graphics/fb0/window_axis echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode + echo 1 > /sys/class/graphics/fb0/freescale_mode echo 0 > /sys/class/graphics/fb1/free_scale ;; 576cvbs) @@ -67,7 +67,7 @@ case $MODE in echo 0 0 719 575 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 719 575 > /sys/class/graphics/fb0/window_axis echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode + echo 1 > /sys/class/graphics/fb0/freescale_mode echo 0 > /sys/class/graphics/fb1/free_scale ;; 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) @@ -110,7 +110,7 @@ case $MODE in echo 1 > /sys/class/graphics/fb0/freescale_mode echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb1/free_scale + echo 0 > /sys/class/graphics/fb1/free_scale fi ;; esac @@ -125,4 +125,4 @@ show_buffer 0 # End of reading the video output mode and setting it for emuelec to avoid video flicking. # The codes can be simplified with "elseif" sentences. # The codes for 480I and 576I are adjusted to avoid overscan. -# Forece 720p50hz to 720p60hz and 1080i/p60hz to 1080i/p60hz since 50hz would make video very choppy. +# Force 720p50hz to 720p60hz and 1080i/p60hz to 1080i/p60hz since 50hz would make video very choppy. From 73dc9a1971c87892f0152e456fea6190f6b6ff35 Mon Sep 17 00:00:00 2001 From: Joshua L Date: Tue, 19 Jul 2022 01:27:19 +1000 Subject: [PATCH 06/29] Update setres.sh --- packages/sx05re/emuelec/bin/setres.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index 24bc6112b18..fa91c1a6fe4 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -53,6 +53,7 @@ show_buffer 1 case $MODE in 480cvbs) + echo 480cvbs > "${FILE_MODE}" fbset -fb /dev/fb0 -g 640 480 640 960 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis @@ -62,6 +63,7 @@ case $MODE in echo 0 > /sys/class/graphics/fb1/free_scale ;; 576cvbs) + echo 576cvbs > "${FILE_MODE}" fbset -fb /dev/fb0 -g 720 576 720 1152 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 719 575 > /sys/class/graphics/fb0/free_scale_axis From 374c8e1fe149d1e6c1ea7fba9a786aaf4c14b9e2 Mon Sep 17 00:00:00 2001 From: Joshua L Date: Tue, 19 Jul 2022 01:55:56 +1000 Subject: [PATCH 07/29] Update setres.sh preset display/mode with dummy initial values so when the correct value is updated, this ensures the mode refreshes properly. --- packages/sx05re/emuelec/bin/setres.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index fa91c1a6fe4..5cfea951297 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -27,9 +27,11 @@ blank_buffer() dd if=/dev/zero of=/dev/fb0 bs=10M > /dev/null 2>&1 } -DEFAULT_MODE="720p60hz" +# By initially setting with these values we can garuntee the file changes, and the mode corrects itself. +HACK1_MODE="640x480p60hz" +HACK2_MODE="480p60hz" FILE_MODE="/sys/class/display/mode" -[[ ! -f "$FILE_MODE" ]] && FILE_MODE="/sys/class/display/display0.HDMI/mode" && DEFAULT_MODE="720p-60" +[[ ! -f "$FILE_MODE" ]] && FILE_MODE="/sys/class/display/display0.HDMI/mode" && HACK1_MODE="640x480p-60" && HACK2_MODE="480p-60" [[ ! -f "$FILE_MODE" ]] && exit 0; BPP=32 @@ -73,6 +75,7 @@ case $MODE in echo 0 > /sys/class/graphics/fb1/free_scale ;; 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) + echo $HACK1_MODE > "${FILE_MODE}" echo $MODE > "${FILE_MODE}" NEW_MODE=$(cat "${FILE_MODE}") [[ "$MODE" != *"$NEW_MODE" ]] && exit @@ -90,7 +93,7 @@ case $MODE in echo 0 > /sys/class/graphics/fb1/free_scale ;; *x*) - echo $DEFAULT_MODE > "${FILE_MODE}" + echo $HACK2_MODE > "${FILE_MODE}" echo $MODE > "${FILE_MODE}" NEW_MODE=$(cat "${FILE_MODE}") if [[ "$MODE" != "$NEW_MODE" ]]; then From a657cfe39becba252c7b5f395e6726d9a6ab8797 Mon Sep 17 00:00:00 2001 From: Joshua L Date: Sat, 23 Jul 2022 15:32:13 +1000 Subject: [PATCH 08/29] Update setres.sh --- packages/sx05re/emuelec/bin/setres.sh | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index 5cfea951297..e3a916b2b20 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -59,10 +59,10 @@ case $MODE in fbset -fb /dev/fb0 -g 640 480 640 960 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 639 479 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode - echo 0 > /sys/class/graphics/fb1/free_scale + echo 30 10 669 469 > /sys/class/graphics/fb0/window_axis + echo 640 > /sys/class/graphics/fb0/scale_width + echo 480 > /sys/class/graphics/fb0/scale_height + echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; 576cvbs) echo 576cvbs > "${FILE_MODE}" @@ -70,9 +70,10 @@ case $MODE in fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 719 575 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 719 575 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode - echo 0 > /sys/class/graphics/fb1/free_scale + #echo 0 > /sys/class/graphics/fb0/free_scale + #echo 1 > /sys/class/graphics/fb0/freescale_mode + #echo 0 > /sys/class/graphics/fb1/free_scale + echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) echo $HACK1_MODE > "${FILE_MODE}" From 896ce746c847a2cfa519d0e957cc3082f02e73f0 Mon Sep 17 00:00:00 2001 From: Joshua L Date: Sun, 24 Jul 2022 01:50:15 +1000 Subject: [PATCH 09/29] 576cvbs fixes --- packages/sx05re/emuelec/bin/setres.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index e3a916b2b20..e064f1d20d8 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -69,10 +69,9 @@ case $MODE in fbset -fb /dev/fb0 -g 720 576 720 1152 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 719 575 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 719 575 > /sys/class/graphics/fb0/window_axis - #echo 0 > /sys/class/graphics/fb0/free_scale - #echo 1 > /sys/class/graphics/fb0/freescale_mode - #echo 0 > /sys/class/graphics/fb1/free_scale + echo 35 20 680 565 > /sys/class/graphics/fb0/window_axis + echo 720 > /sys/class/graphics/fb0/scale_width + echo 576 > /sys/class/graphics/fb0/scale_height echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) @@ -86,7 +85,7 @@ case $MODE in W1=$(($W-1)) H1=$(($H-1)) fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP + fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 > /sys/class/graphics/fb0/free_scale echo 1 > /sys/class/graphics/fb0/freescale_mode echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis From 8621d021f8eea711c8e28268b00c1022732452ad Mon Sep 17 00:00:00 2001 From: Joshua L Date: Mon, 25 Jul 2022 19:36:03 +1000 Subject: [PATCH 10/29] Update setres.sh removed changing of mode for cvbs --- packages/sx05re/emuelec/bin/setres.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index e064f1d20d8..6ce566535cc 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -55,7 +55,6 @@ show_buffer 1 case $MODE in 480cvbs) - echo 480cvbs > "${FILE_MODE}" fbset -fb /dev/fb0 -g 640 480 640 960 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis @@ -65,7 +64,6 @@ case $MODE in echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; 576cvbs) - echo 576cvbs > "${FILE_MODE}" fbset -fb /dev/fb0 -g 720 576 720 1152 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 719 575 > /sys/class/graphics/fb0/free_scale_axis From b5f11b0712216cdc656b7794328f27f96e514183 Mon Sep 17 00:00:00 2001 From: Joshua L Date: Wed, 27 Jul 2022 21:13:45 +1000 Subject: [PATCH 11/29] Update setres.sh test fixes 576cvbs, 1280x1024 too. --- packages/sx05re/emuelec/bin/setres.sh | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index 6ce566535cc..be1f425adde 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -55,6 +55,7 @@ show_buffer 1 case $MODE in 480cvbs) + echo $MODE > "${FILE_MODE}" fbset -fb /dev/fb0 -g 640 480 640 960 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis @@ -64,14 +65,15 @@ case $MODE in echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; 576cvbs) - fbset -fb /dev/fb0 -g 720 576 720 1152 $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo 0 0 719 575 > /sys/class/graphics/fb0/free_scale_axis - echo 35 20 680 565 > /sys/class/graphics/fb0/window_axis - echo 720 > /sys/class/graphics/fb0/scale_width - echo 576 > /sys/class/graphics/fb0/scale_height + echo $MODE > "${FILE_MODE}" + fbset -fb /dev/fb0 -g 1280 960 1280 1920 $BPP + fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP + echo 0 0 1279 959 > /sys/class/graphics/fb0/free_scale_axis + echo 35 20 680 565 > /sys/class/graphics/fb0/window_axis + echo 720 > /sys/class/graphics/fb0/scale_width + echo 576 > /sys/class/graphics/fb0/scale_height echo 0x10001 > /sys/class/graphics/fb0/free_scale - ;; + ;; 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) echo $HACK1_MODE > "${FILE_MODE}" echo $MODE > "${FILE_MODE}" @@ -109,7 +111,7 @@ case $MODE in H1=$(($H-1)) fbset -fb /dev/fb0 -g $W $H $W $DH $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo 0 > /sys/class/graphics/fb0/free_scale + echo 0x10001 > /sys/class/graphics/fb0/free_scale echo 1 > /sys/class/graphics/fb0/freescale_mode echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis From 381f5c17dcbd80cb98ccc3df93fd91750d959b1a Mon Sep 17 00:00:00 2001 From: Joshua L Date: Wed, 27 Jul 2022 21:15:14 +1000 Subject: [PATCH 12/29] Update setres.sh rm mode set checks. --- packages/sx05re/emuelec/bin/setres.sh | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index be1f425adde..890b772b323 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -77,8 +77,6 @@ case $MODE in 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) echo $HACK1_MODE > "${FILE_MODE}" echo $MODE > "${FILE_MODE}" - NEW_MODE=$(cat "${FILE_MODE}") - [[ "$MODE" != *"$NEW_MODE" ]] && exit W=$(( $H*16/9 )) [[ "$MODE" == "480"* ]] && W=640 DH=$(($H*2)) @@ -95,13 +93,6 @@ case $MODE in *x*) echo $HACK2_MODE > "${FILE_MODE}" echo $MODE > "${FILE_MODE}" - NEW_MODE=$(cat "${FILE_MODE}") - if [[ "$MODE" != "$NEW_MODE" ]]; then - MODE=$(echo $MODE | cut -d'x' -f 2) - echo $MODE > "${FILE_MODE}" - NEW_MODE=$(cat "${FILE_MODE}") - fi - [[ "$MODE" != "$NEW_MODE" ]] && exit W=$(echo $MODE | cut -d'x' -f 1) H=$(echo $MODE | cut -d'x' -f 2 | cut -d'p' -f 1) [ ! -n "$H" ] && H=$(echo $MODE | cut -d'x' -f 2 | cut -d'i' -f 1) From 975ccf7e094da5e2ea974fd209be220ca79b438d Mon Sep 17 00:00:00 2001 From: Joshua L Date: Thu, 11 Aug 2022 22:13:19 +1000 Subject: [PATCH 13/29] Update joy_common.sh config option to enable new joy sort ordering. --- packages/sx05re/emuelec/bin/joy_common.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/sx05re/emuelec/bin/joy_common.sh b/packages/sx05re/emuelec/bin/joy_common.sh index 956980b1f64..190fc35c18f 100644 --- a/packages/sx05re/emuelec/bin/joy_common.sh +++ b/packages/sx05re/emuelec/bin/joy_common.sh @@ -27,9 +27,13 @@ jc_get_players() { | grep -Ew -B 8 "B: KEY\=[0-9a-f ]+" > /tmp/input_devices # Determine how many gamepads/players are connected - JOYS=$(cat /tmp/input_devices | grep -A2 "S: Sysfs=" \ - | awk '/^S:/ {s=$0} /^H:/ {print s "\t" $0}' | sort -t $'\t' -k2 \ - | sed 's,.*\(.\{4\}\)$,\1,' | sed 's/ //g') + JOYS=$(ls -A1 /dev/input/js* | sort ) + if [[ -f "/storage/.config/EE_JOY_ORDER_NEW" ]]; then + JOYS=$(cat /tmp/input_devices | grep -A2 "S: Sysfs=" \ + | awk '/^S:/ {s=$0} /^H:/ {print s "\t" $0}' | sort -t $'\t' -k2 \ + | sed 's,.*\(.\{4\}\)$,\1,' | sed 's/ //g') + fi + declare -a PLAYER_CFGS=() for dev in $(echo $JOYS); do From fb0e3b9a8a62ed3e77cabd7d5df2b6c5d3d6225f Mon Sep 17 00:00:00 2001 From: Joshua L Date: Mon, 22 Aug 2022 00:50:55 +1000 Subject: [PATCH 14/29] Update setres.sh updated setres.sh. --- packages/sx05re/emuelec/bin/setres.sh | 72 ++++++++++++++++----------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index 890b772b323..9e310c7f92a 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -28,19 +28,19 @@ blank_buffer() } # By initially setting with these values we can garuntee the file changes, and the mode corrects itself. -HACK1_MODE="640x480p60hz" -HACK2_MODE="480p60hz" +HACK_480_MODE="640x480p60hz" +HACK_576_MODE="1024x768p60hz" +HACK2_MODE="720p60hz" + FILE_MODE="/sys/class/display/mode" -[[ ! -f "$FILE_MODE" ]] && FILE_MODE="/sys/class/display/display0.HDMI/mode" && HACK1_MODE="640x480p-60" && HACK2_MODE="480p-60" [[ ! -f "$FILE_MODE" ]] && exit 0; BPP=32 MODE=$1 -[[ -z "$MODE" ]] && MODE=$(cat $FILE_MODE) +DEF_MODE=$(cat $FILE_MODE) # If the current display is the same as the change just exit. -[ -z "$MODE" ] && exit 0; [[ $MODE == "auto" ]] && exit 0; if [[ ! "$MODE" == *"x"* ]]; then @@ -53,46 +53,60 @@ fi # hides buffer show_buffer 1 +if [[ ! "$MODE" == "$DEF_MODE" ]]; then + case $MODE in + 480cvbs) + echo $HACK_480_MODE > "${FILE_MODE}" + echo 480cvbs > "${FILE_MODE}" + ;; + 576cvbs) + echo $HACK_576_MODE > "${FILE_MODE}" + echo 576cvbs > "${FILE_MODE}" + ;; + 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) + echo $MODE > "${FILE_MODE}" + ;; + *x*) + echo $HACK2_MODE > "${FILE_MODE}" + echo $MODE > "${FILE_MODE}" + ;; + esac +fi + case $MODE in 480cvbs) - echo $MODE > "${FILE_MODE}" - fbset -fb /dev/fb0 -g 640 480 640 960 $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis - echo 30 10 669 469 > /sys/class/graphics/fb0/window_axis - echo 640 > /sys/class/graphics/fb0/scale_width - echo 480 > /sys/class/graphics/fb0/scale_height - echo 0x10001 > /sys/class/graphics/fb0/free_scale - ;; - 576cvbs) - echo $MODE > "${FILE_MODE}" - fbset -fb /dev/fb0 -g 1280 960 1280 1920 $BPP + fbset -fb /dev/fb0 -g 640 480 640 960 $BPP fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo 0 0 1279 959 > /sys/class/graphics/fb0/free_scale_axis + echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis + echo 30 10 669 469 > /sys/class/graphics/fb0/window_axis + echo 640 > /sys/class/graphics/fb0/scale_width + echo 480 > /sys/class/graphics/fb0/scale_height + echo 0x10001 > /sys/class/graphics/fb0/free_scale + ;; + 576cvbs) + fbset -fb /dev/fb0 -g 1024 768 1024 1536 $BPP + fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP + echo 0 0 1023 767 > /sys/class/graphics/fb0/free_scale_axis echo 35 20 680 565 > /sys/class/graphics/fb0/window_axis echo 720 > /sys/class/graphics/fb0/scale_width echo 576 > /sys/class/graphics/fb0/scale_height echo 0x10001 > /sys/class/graphics/fb0/free_scale ;; - 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) - echo $HACK1_MODE > "${FILE_MODE}" - echo $MODE > "${FILE_MODE}" + 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) W=$(( $H*16/9 )) [[ "$MODE" == "480"* ]] && W=640 DH=$(($H*2)) W1=$(($W-1)) H1=$(($H-1)) fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP + fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode + echo 0 > /sys/class/graphics/fb0/freescale_mode echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis echo 0 > /sys/class/graphics/fb1/free_scale ;; *x*) - echo $HACK2_MODE > "${FILE_MODE}" - echo $MODE > "${FILE_MODE}" W=$(echo $MODE | cut -d'x' -f 1) H=$(echo $MODE | cut -d'x' -f 2 | cut -d'p' -f 1) [ ! -n "$H" ] && H=$(echo $MODE | cut -d'x' -f 2 | cut -d'i' -f 1) @@ -101,12 +115,10 @@ case $MODE in W1=$(($W-1)) H1=$(($H-1)) fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo 0x10001 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode + echo 0 > /sys/class/graphics/fb0/free_scale + echo 0 > /sys/class/graphics/fb0/freescale_mode echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb1/free_scale + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis fi ;; esac From 4288af994e2d6aa253dee2a92eecc2f37ac4b234 Mon Sep 17 00:00:00 2001 From: Joshua L Date: Tue, 13 Sep 2022 01:27:21 +1000 Subject: [PATCH 15/29] Update setres.sh Removed fbset to fb1 as corrupting screen, and making ES font disappear. --- packages/sx05re/emuelec/bin/setres.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index 9e310c7f92a..55d0cf6774f 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -76,7 +76,6 @@ fi case $MODE in 480cvbs) fbset -fb /dev/fb0 -g 640 480 640 960 $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis echo 30 10 669 469 > /sys/class/graphics/fb0/window_axis echo 640 > /sys/class/graphics/fb0/scale_width @@ -85,7 +84,6 @@ case $MODE in ;; 576cvbs) fbset -fb /dev/fb0 -g 1024 768 1024 1536 $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 0 1023 767 > /sys/class/graphics/fb0/free_scale_axis echo 35 20 680 565 > /sys/class/graphics/fb0/window_axis echo 720 > /sys/class/graphics/fb0/scale_width @@ -99,7 +97,6 @@ case $MODE in W1=$(($W-1)) H1=$(($H-1)) fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP echo 0 > /sys/class/graphics/fb0/free_scale echo 0 > /sys/class/graphics/fb0/freescale_mode echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis From d88383de4f8fb2ebb96e8c4d7828c1e6a18912d7 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Thu, 15 Sep 2022 01:58:48 +1000 Subject: [PATCH 16/29] Undo test pulls. --- packages/sx05re/emuelec/bin/emuelec-utils | 59 +++++-- .../sx05re/emuelec/bin/emuelec_autostart.sh | 29 +--- packages/sx05re/emuelec/bin/emustation-config | 27 ++++ packages/sx05re/emuelec/bin/joy_common.sh | 66 +++----- packages/sx05re/emuelec/bin/setres.sh | 144 +++++++++--------- 5 files changed, 165 insertions(+), 160 deletions(-) diff --git a/packages/sx05re/emuelec/bin/emuelec-utils b/packages/sx05re/emuelec/bin/emuelec-utils index ab0a165533c..f5b7fd4d4bd 100755 --- a/packages/sx05re/emuelec/bin/emuelec-utils +++ b/packages/sx05re/emuelec/bin/emuelec-utils @@ -190,22 +190,49 @@ function resolutions() { RESOLUTIONS=() - # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode - N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" - - # Screen supported resolutions - SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/amhdmitx/amhdmitx0/rawedid | /usr/bin/edid-decode |/usr/bin/grep "@" | sed -E "s| {0,9}VIC {0,9}[0-9]{1,2}||" | /usr/bin/awk '{print $1}' | /usr/bin/sed 's/@/p/g'|/usr/bin/tr '[:upper:]' '[:lower:]'` - - for N2SP in $N2_SUPPORTED_RESOLUTIONS - do - for SSR in $SCREEN_SUPPORTED_RESOLUTIONS - do - if [ "$N2SP" = "$SSR" ] - then - RESOLUTIONS+=($N2SP) - fi - done - done + if [ -f "/storage/LEGACY_RESOLUTIONS" ]; then + # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode + N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" + + # Screen supported resolutions + SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/amhdmitx/amhdmitx0/rawedid | /usr/bin/edid-decode |/usr/bin/grep "@" | sed -E "s| {0,9}VIC {0,9}[0-9]{1,2}||" | /usr/bin/awk '{print $1}' | /usr/bin/sed 's/@/p/g'|/usr/bin/tr '[:upper:]' '[:lower:]'` + + for N2SP in $N2_SUPPORTED_RESOLUTIONS + do + for SSR in $SCREEN_SUPPORTED_RESOLUTIONS + do + if [ "$N2SP" = "$SSR" ] + then + RESOLUTIONS+=($N2SP) + fi + done + done + fi + + if [[ "$EE_PROJECT" == "Rockchip" ]]; then + SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/display0.HDMI/modes | sort -u` + for SSR in $SCREEN_SUPPORTED_RESOLUTIONS + do + RESOLUTIONS+=($SSR) + done + else + # Screen supported resolutions + SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/cap | sed '/smpte/d' | sed '/pal/d' | sed '/ntsc/d' | sed 's/\*//' | grep -E '[0-9x]+[pi][56]0hz|cvbs'` + for SSR in $SCREEN_SUPPORTED_RESOLUTIONS + do + RESOLUTIONS+=($SSR) + done + fi + + if [ "$EE_DEVICE" == "OdroidGoAdvance" ]; then + RESOLUTIONS+="480x320p60hz" + fi + + if [ "$EE_DEVICE" == "GameForce" ]; then + RESOLUTIONS+="640x480p60hz" + fi + + RESOLUTIONS=($(printf "%s\n" "${RESOLUTIONS[@]}" | sort -u)) IFS="," echo "${RESOLUTIONS[*]}" diff --git a/packages/sx05re/emuelec/bin/emuelec_autostart.sh b/packages/sx05re/emuelec/bin/emuelec_autostart.sh index 7522dcb1bc5..5e350cb97c2 100755 --- a/packages/sx05re/emuelec/bin/emuelec_autostart.sh +++ b/packages/sx05re/emuelec/bin/emuelec_autostart.sh @@ -99,32 +99,6 @@ if [ -f "${BACKUPFILE}" ]; then emuelec-utils ee_backup restore no > /emuelec/logs/last-restore.log 2>&1 fi -DEFE="" - -# If the video-mode is contained in flash config. -if [ -s "${CONFIG_FLASH}" ]; then - CFG_VAL=$(get_config_value "$CONFIG_FLASH" "hdmimode") - [ ! -z "$CFG_VAL" ] && DEFE="$CFG_VAL" && set_ee_setting ee_videomode $DEFE -fi - -# Otherwise retrieve via normal methods. -if [ -z "$DEFE" ]; then - if [ -s "/storage/.config/EE_VIDEO_MODE" ]; then - DEFE=$(cat /storage/.config/EE_VIDEO_MODE) && set_ee_setting ee_videomode $DEFE - fi -fi - -if [ -z "$DEFE" ]; then - # Set video mode, this has to be done before starting ES - DEFE=$(get_ee_setting ee_videomode) - if [ "${DEFE}" == "Custom" ]; then - DEFE=$(cat /sys/class/display/mode) - fi -fi - -# finally we correct the FB according to video mode -setres.sh ${DEFE} - # Clean cache garbage when boot up. rm -rf /storage/.cache/cores/* & @@ -143,6 +117,9 @@ case "$DEFE" in ;; esac +FILE_MODE="/sys/class/display/mode" +[[ -f "$FILE_MODE" ]] && setres.sh + # Show splash creen show_splash.sh intro diff --git a/packages/sx05re/emuelec/bin/emustation-config b/packages/sx05re/emuelec/bin/emustation-config index 251b1470482..17aa6ec67b2 100755 --- a/packages/sx05re/emuelec/bin/emustation-config +++ b/packages/sx05re/emuelec/bin/emustation-config @@ -11,6 +11,7 @@ function check_pwd() { +CONFIG_FLASH="/flash/config.ini" EE_CONF="${EE_DIR}/configs/emuelec.conf" ESSETTINGS="/storage/.config/emulationstation/es_settings.cfg" @@ -285,4 +286,30 @@ fi emuelec-utils setauddev +DEFE="" + +# If the video-mode is contained in flash config. +if [ -s "${CONFIG_FLASH}" ]; then + CFG_VAL=$(get_config_value "$CONFIG_FLASH" "vout") + [ ! -z "$CFG_VAL" ] && DEFE="$CFG_VAL" && set_ee_setting ee_videomode $DEFE +fi + +# Otherwise retrieve via normal methods. +if [ -z "$DEFE" ]; then + if [ -s "/storage/.config/EE_VIDEO_MODE" ]; then + DEFE=$(cat /storage/.config/EE_VIDEO_MODE) && \ + set_ee_setting ee_videomode $DEFE && \ + mv /storage/.config/EE_VIDEO_MODE /storage/.config/EE_VIDEO_MODE_2 + fi +fi + +if [ -z "$DEFE" ]; then + # Set video mode, this has to be done before starting ES + DEFE=$(get_ee_setting ee_videomode) +fi + +# finally we correct the FB according to video mode +[[ ! -z "$DEFE" ]] && setres.sh ${DEFE} + + exit 0 diff --git a/packages/sx05re/emuelec/bin/joy_common.sh b/packages/sx05re/emuelec/bin/joy_common.sh index b4431271d1e..190fc35c18f 100644 --- a/packages/sx05re/emuelec/bin/joy_common.sh +++ b/packages/sx05re/emuelec/bin/joy_common.sh @@ -23,27 +23,34 @@ jc_get_players() { # Dump gamepad information cat /proc/bus/input/devices \ - | grep -E -B 5 -A 3 "H\: Handlers=(js[0-9] event[0-9])|(event[0-9] js[0-9])" \ + | grep -E -B 5 -A 3 "H\: Handlers=(js[0-9] event[0-9]+)|(event[0-9]+ js[0-9])" \ | grep -Ew -B 8 "B: KEY\=[0-9a-f ]+" > /tmp/input_devices # Determine how many gamepads/players are connected - JOYS=$(ls -A1 /dev/input/js*| sort ) - + JOYS=$(ls -A1 /dev/input/js* | sort ) + if [[ -f "/storage/.config/EE_JOY_ORDER_NEW" ]]; then + JOYS=$(cat /tmp/input_devices | grep -A2 "S: Sysfs=" \ + | awk '/^S:/ {s=$0} /^H:/ {print s "\t" $0}' | sort -t $'\t' -k2 \ + | sed 's,.*\(.\{4\}\)$,\1,' | sed 's/ //g') + fi + declare -a PLAYER_CFGS=() - + for dev in $(echo $JOYS); do - - JOY_INDEX=$(basename $dev) - - PROC_GUID=$(cat /tmp/input_devices | grep ${JOY_INDEX} -B 5 | grep I: | sed "s|I:\ Bus=||" | sed "s|\ Vendor=||" | sed "s|\ Product=||" | sed "s|\ Version=||") + local JSI=$dev + local DETAILS=$(cat /tmp/input_devices \ + | grep -E "H\: Handlers=(${JSI} event[0-9]+)|(event[0-9]+ ${JSI})" -B 5) + + local PROC_GUID=$(echo "${DETAILS}" | grep I: | sed "s|I:\ Bus=||" | sed "s|\ Vendor=||" | sed "s|\ Product=||" | sed "s|\ Version=||") local DEVICE_GUID=$(jc_generate_guid ${PROC_GUID}) - [[ -z "${DEVICE_GUID}" ]] && continue - local JOY_DETAIL=$(jc_get_device_detail "${DEVICE_GUID}") - [[ "$JOY_DETAIL" == 0 ]] && continue - local JSI=$(echo "$JOY_DETAIL" | cut -d' ' -f1) - local JOY_NAME=$(echo "$JOY_DETAIL" | cut -d' ' -f2-) + local GC_CONFIG=$(cat "$GCDB" | grep "$DEVICE_GUID" | grep "platform:Linux" | head -1) + echo "GC_CONFIG=$GC_CONFIG" + [[ -z $GC_CONFIG ]] && continue + + local JOY_NAME=$(echo "${DETAILS}" | grep -E "^N\: Name.*[\= ]?.*$" | cut -d "=" -f 2 | tr -d '"') + [[ -z "$JOY_NAME" ]] && continue # Add the joy config to array if guid and joyname set. if [[ ! -z "${DEVICE_GUID}" && ! -z "$JOY_NAME" ]]; then @@ -116,36 +123,3 @@ jc_generate_guid() { echo "$v" } -jc_get_device_detail() { - local GUID="${1}" - - v=${DEVICE_GUID:0:8} - local p1=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) # Bus, generally not needed - local v=${GUID:8:8} - local p2=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) # Vendor - v=${GUID:16:8} - local p3=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) # Product - v=${GUID:24:8} - local p4=$(echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}) # Version - - local vendor=$(echo ${p2:4}) - local product=$(echo ${p3:4}) - local version=$(echo ${p4:4}) - - local I_REGEX="^I\: .* Vendor\=${vendor} Product\=${product} Version\=${version}$" - local EE_DEV=$(cat /tmp/input_devices | grep -Ew -A 8 "$I_REGEX" | head -n8) - - declare -i REC_INDEX=$(cat /tmp/input_devices | grep -n -E "$I_REGEX" | cut -d':' -f1 | head -n1 ) - declare -i REC_LENGTH=$(( REC_INDEX + 9 )) - sed -i "${REC_INDEX},${REC_LENGTH}d" /tmp/input_devices - - local JSI=$(echo -e "${EE_DEV}" | grep "H: Handlers" | sed -E 's/.*H: Handlers=.*(js[0-9]).*/\1/' | head -n1 ) - - if [[ ! -z "${EE_DEV}" ]]; then - local JOY_NAME=$(echo "${EE_DEV}" | grep -E "^N\: Name.*[\= ]?.*$" \ - | cut -d "=" -f 2 | tr -d '"') - echo "${JSI} ${JOY_NAME}" - return - fi - echo "0" -} diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index 03f33f49bc1..ec44e28ac22 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) +# Copyright (C) 2022-present Joshua L (https://github.com/Langerz82) # Read the video output mode and set it for emuelec to avoid video flicking. @@ -10,16 +11,8 @@ # set -x #echo on -# 1080p60hz -# 1080i60hz -# 720p60hz -# 720p50hz -# 480p60hz -# 480cvbs -# 576p50hz -# 1080p50hz -# 1080i50hz -# 576cvbs +# Source predefined functions and variables +. /etc/profile # arg1, 1 = Hides, 0 = Show. show_buffer () @@ -31,92 +24,98 @@ show_buffer () blank_buffer() { # Blank the buffer. - dd if=/dev/zero of=/dev/fb0 bs=12M > /dev/null 2>&1 + dd if=/dev/zero of=/dev/fb0 bs=10M > /dev/null 2>&1 } +# By initially setting with these values we can garuntee the file changes, and the mode corrects itself. +HACK_480_MODE="640x480p60hz" +HACK_576_MODE="1024x768p60hz" +HACK2_MODE="720p60hz" + +FILE_MODE="/sys/class/display/mode" +[[ ! -f "$FILE_MODE" ]] && exit 0; + BPP=32 -HZ=60 MODE=$1 -CUR_MODE=`cat /sys/class/display/mode`; +DEF_MODE=$(cat $FILE_MODE) # If the current display is the same as the change just exit. -[ -z "$MODE" ] && exit 0; [[ $MODE == "auto" ]] && exit 0; -# Removed because if try to set invalid video mode it becomes a valid MODE -# in display/mode and then when trying to revert back this becomes true exiting. -#[[ "$MODE" == "$CUR_MODE" ]] && exit 0; if [[ ! "$MODE" == *"x"* ]]; then case $MODE in - *p*) H=$(echo $MODE | cut -d'p' -f 1) ;; - *i*) H=$(echo $MODE | cut -d'i' -f 1) ;; - *cvbs*) H=$(echo $MODE | cut -d'c' -f 1) ;; + *p*) H=$(echo $MODE | cut -d'p' -f 1) ;; + *i*) H=$(echo $MODE | cut -d'i' -f 1) ;; esac fi -HZ=${MODE:(-4):2} -if [[ ! -n "$HZ" ]] || [[ $HZ -eq 50 ]]; then - HZ=60 -fi - - # hides buffer show_buffer 1 +if [[ ! "$MODE" == "$DEF_MODE" ]]; then + case $MODE in + 480cvbs) + echo $HACK_480_MODE > "${FILE_MODE}" + echo 480cvbs > "${FILE_MODE}" + ;; + 576cvbs) + echo $HACK_576_MODE > "${FILE_MODE}" + echo 576cvbs > "${FILE_MODE}" + ;; + 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) + echo $MODE > "${FILE_MODE}" + ;; + *x*) + echo $HACK2_MODE > "${FILE_MODE}" + echo $MODE > "${FILE_MODE}" + ;; + esac +fi + case $MODE in - 480p*hz|480i*hz|576p*hz|720p*hz|1080p*hz|1440p*hz|2160p*hz|576i*hz|720i*hz|1080i*hz|1440i*hz|2160i*hz) - W=$(($H*16/9)) - [[ "$MODE" == "480"* ]] && W=854 - DH=$(($H*2)) - W1=$(($W-1)) - H1=$(($H-1)) - fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo $MODE > /sys/class/display/mode - echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb1/free_scale - ;; - 480cvbs) - echo 480cvbs > /sys/class/display/mode - fbset -fb /dev/fb0 -g 640 480 640 960 $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 639 479 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode - echo 0 > /sys/class/graphics/fb1/free_scale - ;; - 576cvbs) - echo 576cvbs > /sys/class/display/mode - fbset -fb /dev/fb0 -g 720 576 720 1152 $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP - echo 0 0 719 575 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 719 575 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode + 480cvbs) + fbset -fb /dev/fb0 -g 640 480 640 960 $BPP + echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis + echo 30 10 669 469 > /sys/class/graphics/fb0/window_axis + echo 640 > /sys/class/graphics/fb0/scale_width + echo 480 > /sys/class/graphics/fb0/scale_height + echo 0x10001 > /sys/class/graphics/fb0/free_scale + ;; + 576cvbs) + fbset -fb /dev/fb0 -g 1024 768 1024 1536 $BPP + echo 0 0 1023 767 > /sys/class/graphics/fb0/free_scale_axis + echo 35 20 680 565 > /sys/class/graphics/fb0/window_axis + echo 720 > /sys/class/graphics/fb0/scale_width + echo 576 > /sys/class/graphics/fb0/scale_height + echo 0x10001 > /sys/class/graphics/fb0/free_scale + ;; + 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) + W=$(( $H*16/9 )) + [[ "$MODE" == "480"* ]] && W=640 + DH=$(($H*2)) + W1=$(($W-1)) + H1=$(($H-1)) + fbset -fb /dev/fb0 -g $W $H $W $DH $BPP + echo 0 > /sys/class/graphics/fb0/free_scale + echo 0 > /sys/class/graphics/fb0/freescale_mode + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis echo 0 > /sys/class/graphics/fb1/free_scale - ;; + ;; *x*) W=$(echo $MODE | cut -d'x' -f 1) H=$(echo $MODE | cut -d'x' -f 2 | cut -d'p' -f 1) [ ! -n "$H" ] && H=$(echo $MODE | cut -d'x' -f 2 | cut -d'i' -f 1) if [ -n "$W" ] && [ -n "$H" ]; then DH=$(($H*2)) - W1=$(($W-1)) - H1=$(($H-1)) - fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - fbset -fb /dev/fb1 -g $BPP $BPP $BPP $BPP $BPP -# [[ "$MODE" = "720x480p"* ]] && MODE=$(echo "${H}p${HZ}hz") - echo $MODE > /sys/class/display/mode - echo 0 > /sys/class/graphics/fb0/free_scale - echo 1 > /sys/class/graphics/fb0/freescale_mode - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb1/free_scale + W1=$(($W-1)) + H1=$(($H-1)) + fbset -fb /dev/fb0 -g $W $H $W $DH $BPP + echo 0 > /sys/class/graphics/fb0/free_scale + echo 0 > /sys/class/graphics/fb0/freescale_mode + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis + echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis fi ;; esac @@ -126,8 +125,9 @@ blank_buffer # shows buffer show_buffer 0 +[[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix # End of reading the video output mode and setting it for emuelec to avoid video flicking. # The codes can be simplified with "elseif" sentences. # The codes for 480I and 576I are adjusted to avoid overscan. -# Forece 720p50hz to 720p60hz and 1080i/p60hz to 1080i/p60hz since 50hz would make video very choppy. +# Force 720p50hz to 720p60hz and 1080i/p60hz to 1080i/p60hz since 50hz would make video very choppy. From 1a704ad762a526662500c35b41da38e5316f94f6 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Mon, 10 Oct 2022 08:08:55 +1100 Subject: [PATCH 17/29] undo --- config/arch.aarch64 | 2 +- config/arch.arm | 2 +- config/arch.x86_64 | 2 +- config/options | 2 +- config/options32 | 10 +- config/show_config | 9 +- distributions/CoreELEC/version | 2 +- .../chrome-depends/gtk3/package.mk | 1 - .../docker/containerd/package.mk | 4 +- .../docker/libnetwork/package.mk | 33 - .../addon-depends/docker/moby/package.mk | 1 + .../addon-depends/docker/runc/package.mk | 4 +- .../aspnet6-runtime/package.mk | 14 +- .../addons/addon-depends/ffmpegx/package.mk | 7 +- .../ffmpegx/patches/ffmpeg-openssl3.patch | 44 + packages/addons/addon-depends/go/package.mk | 4 +- .../addons/addon-depends/libiconv/package.mk | 6 +- .../addons/addon-depends/mpd-mpc/package.mk | 1 - packages/addons/service/docker/changelog.txt | 6 + packages/addons/service/docker/package.mk | 8 +- .../addons/service/jellyfin/changelog.txt | 3 + packages/addons/service/jellyfin/package.mk | 4 +- packages/addons/service/locale/changelog.txt | 3 + packages/addons/service/locale/package.mk | 7 +- .../service/locale/resources/settings.xml | 40 +- .../addons/service/locale/source/default.py | 16 +- .../strings.po | 4 + .../locale/source/settings-default.xml | 6 +- .../addons/service/minidlna/changelog.txt | 3 + packages/addons/service/minidlna/package.mk | 8 +- .../minidlna-02-fix-autoconf-271.patch | 31 - .../minidlna-03-allow-gettext-0.20.patch | 14 - .../addons/service/syncthing/changelog.txt | 3 + packages/addons/service/syncthing/package.mk | 6 +- packages/addons/skin/estouchy/package.mk | 11 +- .../addons/tools/btrfs-progs/changelog.txt | 3 + packages/addons/tools/btrfs-progs/package.mk | 6 +- ...rfs-progs-01-compile-with-glibc-2.36.patch | 32 - .../addons/tools/dotnet-runtime/changelog.txt | 5 +- .../addons/tools/dotnet-runtime/package.mk | 2 +- .../addons/tools/ffmpeg-tools/changelog.txt | 6 + packages/addons/tools/ffmpeg-tools/package.mk | 2 +- .../addons/tools/network-tools/changelog.txt | 3 + .../addons/tools/network-tools/package.mk | 2 +- packages/audio/flac/package.mk | 4 +- packages/audio/fluidsynth/package.mk | 4 +- packages/audio/libopenmpt/package.mk | 4 +- packages/audio/pipewire/package.mk | 5 +- packages/compress/lz4/package.mk | 5 +- packages/compress/xz/package.mk | 8 +- packages/compress/zip/package.mk | 1 + packages/compress/zstd/package.mk | 1 - .../databases/mariadb-connector-c/package.mk | 14 +- packages/debug/libva-utils/package.mk | 1 - packages/debug/vadumpcaps/package.mk | 1 - .../debug/xorg-intel-gpu-tools/package.mk | 1 - packages/devel/asn1c/package.mk | 11 + packages/devel/autoconf-archive/package.mk | 4 +- ...ive-0001-AX_CC_MAXOPT-Fix-nvhpc-case.patch | 30 - packages/devel/boost/package.mk | 44 +- packages/devel/cmake/package.mk | 4 +- packages/devel/flatbuffers/package.mk | 4 +- packages/devel/fribidi/package.mk | 1 - packages/devel/glib/package.mk | 1 - packages/devel/heimdal/package.mk | 8 +- ...-upstream-check-libtinfo-for-tgetent.patch | 52 -- .../0002-upstream-fix-configure-err-msg.patch | 24 - ...2b90e78e2d162b98b5ef6c84672c397be40a.patch | 29 - ...f6859d183a40fb35a76e2bc1ce084b3a6d67.patch | 22 - ...3f337bac0411d0bb1c924fd857603a258d2f.patch | 22 - .../yyerror-match-posix-standard.patch | 83 -- .../ttyd-depends => devel}/json-c/package.mk | 0 packages/devel/libfmt/package.mk | 4 +- packages/devel/pcre2/package.mk | 11 +- packages/devel/spdlog/package.mk | 7 +- packages/emulation/libretro-vecx/package.mk | 8 + packages/graphics/assimp/package.mk | 4 +- packages/graphics/bcm2835-driver/package.mk | 4 +- packages/graphics/glm/package.mk | 10 + packages/graphics/harfbuzz/package.mk | 5 +- packages/graphics/lcms2/package.mk | 4 +- packages/graphics/libde265/package.mk | 18 +- ...0001-275-Add-CMake-option-ENABLE-SDL.patch | 53 ++ ...0002-Add-CMake-option-ENABLE-ENCODER.patch | 26 + packages/graphics/libdrm/package.mk | 48 +- packages/graphics/libglvnd/package.mk | 4 +- packages/graphics/libheif/package.mk | 14 +- packages/graphics/libjpeg-turbo/package.mk | 4 +- packages/graphics/mesa/package.mk | 5 +- packages/graphics/tiff/package.mk | 30 +- .../tiff-0001-only-build-library.patch | 70 ++ packages/graphics/vulkan/glslang/package.mk | 8 +- .../graphics/vulkan/spirv-headers/package.mk | 10 +- .../graphics/vulkan/spirv-tools/package.mk | 10 +- packages/graphics/vulkan/vkmark/package.mk | 4 +- ...e-vkCreateDmaBufImageINTEL-extension.patch | 542 ++++++++++++ ...pendency-on-vkCreateDmaBufImageINTEL.patch | 273 ------ .../graphics/vulkan/vulkan-headers/package.mk | 4 +- .../graphics/vulkan/vulkan-loader/package.mk | 4 +- .../graphics/vulkan/vulkan-tools/package.mk | 4 +- packages/lang/Python3/package.mk | 4 +- packages/lang/gcc/package.mk | 26 +- ...-mount_attr-conflict-with-glibc-2.36.patch | 39 - .../lib32/graphics/lib32-libdrm/package.mk | 14 +- packages/lib32/lang/lib32-gcc/package.mk | 22 + .../lib32/multimedia/lib32-ffmpeg/package.mk | 8 +- .../lib32/textproc/lib32-libxml2/package.mk | 1 - packages/linux-drivers/RTL8192DU/package.mk | 4 +- packages/linux-drivers/RTL8812AU/package.mk | 4 +- .../patches/RTL8812AU-0001-fix-5-18.patch | 25 - .../patches/bcm_sta-0600-kernel-6.0-fix.patch | 17 + .../linux-firmware/firmware-imx/package.mk | 4 +- .../linux-firmware/kernel-firmware/package.mk | 4 +- ...01-WHENCE--Correct-dangling-symlinks.patch | 37 - packages/linux/package.mk | 10 +- .../mediacenter/LibreELEC-settings/package.mk | 4 +- .../inputstream.adaptive/package.mk | 6 +- .../inputstream.ffmpegdirect/package.mk | 8 +- .../inputstream.rtmp/package.mk | 6 +- .../peripheral.joystick/package.mk | 2 +- .../kodi-binary-addons/pvr.argustv/package.mk | 6 +- .../kodi-binary-addons/pvr.demo/package.mk | 6 +- .../kodi-binary-addons/pvr.dvblink/package.mk | 6 +- .../pvr.dvbviewer/package.mk | 4 +- .../kodi-binary-addons/pvr.filmon/package.mk | 6 +- .../kodi-binary-addons/pvr.freebox/package.mk | 6 +- .../pvr.hdhomerun/package.mk | 6 +- .../kodi-binary-addons/pvr.hts/package.mk | 6 +- .../pvr.iptvsimple/package.mk | 4 +- .../pvr.mediaportal.tvserver/package.mk | 6 +- .../kodi-binary-addons/pvr.nextpvr/package.mk | 6 +- .../kodi-binary-addons/pvr.njoy/package.mk | 6 +- .../kodi-binary-addons/pvr.octonet/package.mk | 6 +- .../kodi-binary-addons/pvr.pctv/package.mk | 6 +- .../kodi-binary-addons/pvr.plutotv/package.mk | 6 +- .../pvr.sledovanitv.cz/package.mk | 6 +- .../kodi-binary-addons/pvr.stalker/package.mk | 6 +- .../kodi-binary-addons/pvr.teleboy/package.mk | 6 +- .../kodi-binary-addons/pvr.vbox/package.mk | 6 +- .../pvr.vdr.vnsi/package.mk | 14 +- .../kodi-binary-addons/pvr.vuplus/package.mk | 6 +- .../kodi-binary-addons/pvr.waipu/package.mk | 6 +- .../kodi-binary-addons/pvr.wmc/package.mk | 6 +- .../kodi-binary-addons/pvr.zattoo/package.mk | 6 +- .../visualization.goom/package.mk | 6 +- .../visualization.matrix/package.mk | 6 +- .../visualization.shadertoy/package.mk | 6 +- .../visualization.spectrum/package.mk | 6 +- .../visualization.starburst/package.mk | 6 +- .../visualization.waveform/package.mk | 6 +- packages/mediacenter/kodi-platform/package.mk | 2 +- packages/mediacenter/kodi/package.mk | 35 +- .../patches/kodi-999.20-headers-only.patch | 48 + packages/multimedia/ffmpeg/package.mk | 28 +- .../ffmpeg-support-dav1d-1-0-0.patch | 0 .../ffmpeg/patches/ffmpeg-openssl3.patch | 44 + .../ffmpeg/patches/rpi/ffmpeg-001-rpi.patch | 818 +++++++++++++----- .../ffmpeg-001-v4l2-drmprime.patch | 22 +- .../ffmpeg-001-v4l2-request.patch | 145 ++-- packages/multimedia/gmmlib/package.mk | 4 +- .../multimedia/intel-vaapi-driver/package.mk | 1 - packages/multimedia/libva/package.mk | 1 - packages/multimedia/media-driver/package.mk | 4 +- .../multimedia/nv-codec-headers/package.mk | 1 - packages/network/ethtool/package.mk | 4 +- packages/network/iwd/package.mk | 4 +- packages/network/libnfs/package.mk | 4 +- packages/network/libnftnl/package.mk | 4 +- packages/network/libssh/package.mk | 5 +- packages/network/libtirpc/package.mk | 4 +- packages/network/rsync/package.mk | 4 +- .../rsync/patches/rsync-schar-fix-3.2.4.patch | 13 - .../network/samba/config/samba4-cache.txt | 2 + packages/network/samba/package.mk | 13 +- .../samba-100-4-16-build-from-4-17.patch | 733 ---------------- .../samba-200-4.11-fix-ASN1-bso14164.patch | 10 +- ...4.13.patch => samba-951-no-man-4.16.patch} | 10 +- packages/python/devel/Mako/package.mk | 4 +- packages/python/devel/meson/package.mk | 4 +- packages/python/devel/ninja/package.mk | 4 +- packages/python/system/dbussy/package.mk | 4 +- packages/security/nspr/package.mk | 2 +- packages/security/nss/package.mk | 4 +- .../emuelec-emulationstation/package.mk | 2 +- .../sx05re/emuelec-ports/bstone/package.mk | 2 +- .../emuelec-ports/sonicmania/package.mk | 2 +- .../sx05re/emuelec-ports/sources/ports.yaml | 32 +- .../sx05re/emuelec-ports/xash3d/package.mk | 2 +- packages/sx05re/emuelec/bin/check_res.sh | 46 + packages/sx05re/emuelec/bin/emuelec-utils | 23 + packages/sx05re/emuelec/bin/emuelecRunEmu.sh | 40 +- .../sx05re/emuelec/bin/emuelec_autostart.sh | 6 +- packages/sx05re/emuelec/bin/emustation-config | 9 +- packages/sx05re/emuelec/bin/joy_common.sh | 92 +- packages/sx05re/emuelec/bin/setres.sh | 277 +++++- packages/sx05re/emuelec/bin/show_splash.sh | 96 +- .../config/emuelec/configs/emuelec.conf | 7 +- .../config/splash/loading-game-std.png | Bin 0 -> 291849 bytes .../emuelec/config/splash/splash-std.png | Bin 0 -> 282561 bytes .../sx05re/emuelec/profile.d/99-emuelec.conf | 26 + .../config/scripts/emuelecRunEmu.sh | 4 +- .../sx05re/emulators/PPSSPPSDL/package.mk | 2 +- .../PPSSPPSDL/patches/max-fps-setting.patch | 41 +- .../emulators/advancemame/bin/advmame.sh | 16 +- .../advancemame}/bin/set_advmame_joy.sh | 3 +- .../patches/advancemame-fix-vfb-fps.patch | 150 ++++ .../sx05re/emulators/dolphinSA/package.mk | 2 +- .../dolphinSA/scripts/set_dolphin_joy.sh | 2 +- .../duckstation/scripts/duckstation.sh | 5 + .../scripts/set_duckstation_joy.sh | 160 ++++ packages/sx05re/emulators/fbneoSA/package.mk | 2 +- .../sx05re/emulators/flycastsa/package.mk | 2 +- .../flycastsa/scripts/set_flycast_joy.sh | 7 +- .../emulators/mupen64plus-nx-alt/package.mk | 4 +- .../emulators/mupen64plus-nx/package.mk | 4 +- .../mupen64plussa/mupen64plussa-core/m64p.sh | 2 +- .../mupen64plussa-core/set_mupen64_joy.sh | 5 +- .../sx05re/emulators/scummvmsa/package.mk | 4 +- .../sx05re/libretro/beetle-pce/package.mk | 4 +- packages/sx05re/libretro/fbneo/package.mk | 4 +- packages/sx05re/libretro/flycast/package.mk | 3 +- .../libretro/genesis-plus-gx-wide/package.mk | 4 +- .../libretro/genesis-plus-gx/package.mk | 4 +- .../sx05re/libretro/mame2003-plus/package.mk | 4 +- packages/sx05re/libretro/mesen/package.mk | 4 +- packages/sx05re/libretro/mgba/package.mk | 4 +- packages/sx05re/libretro/nestopia/package.mk | 4 +- .../sx05re/libretro/parallel-n64/package.mk | 4 +- .../sx05re/libretro/pcsx_rearmed/package.mk | 4 +- packages/sx05re/libretro/picodrive/package.mk | 2 +- packages/sx05re/libretro/ppsspp/package.mk | 3 +- .../ppsspp/patches/max-fps-setting.patch | 41 +- packages/sx05re/libretro/px68k/package.mk | 4 +- packages/sx05re/libretro/sameboy/package.mk | 4 +- .../sx05re/tools/sysutils/gptokeyb/package.mk | 2 +- .../tools/sysutils/rclone/bin/ra_rclone.sh | 83 ++ .../sx05re/tools/sysutils/rclone/package.mk | 1 + .../tools/unused/boost_locale/package.mk | 59 -- packages/sysutils/libevdev/package.mk | 5 +- packages/sysutils/tz/package.mk | 4 +- packages/textproc/jsoncpp/package.mk | 8 +- packages/textproc/libidn2/package.mk | 6 +- packages/textproc/libxml2/package.mk | 4 +- packages/textproc/libxslt/package.mk | 4 +- packages/textproc/nlohmann-json/package.mk | 4 +- packages/tools/bcm2835-bootloader/package.mk | 4 +- packages/tools/hdparm/package.mk | 4 +- .../hdparm/patches/hdparm-glibc-2.36.patch | 10 - packages/tools/nano/package.mk | 4 +- packages/tools/qemu/package.mk | 4 +- packages/tools/rpi-eeprom/package.mk | 4 +- packages/tools/splash-image/package.mk | 4 +- packages/wayland/lib/fcft/package.mk | 4 +- packages/wayland/lib/tllist/package.mk | 4 +- packages/wayland/util/foot/package.mk | 4 +- packages/wayland/weston/package.mk | 4 +- packages/web/nghttp2/package.mk | 11 +- packages/x11/data/xkeyboard-config/package.mk | 25 +- ...config-0001-dont-require-util-macros.patch | 39 - ...config-995.01-2.36-fix-xkb-base-path.patch | 15 + packages/x11/lib/libXau/package.mk | 8 +- packages/x11/lib/libXfont2/package.mk | 8 +- packages/x11/lib/libfontenc/package.mk | 8 +- packages/x11/lib/libxcvt/package.mk | 4 +- packages/x11/proto/xorgproto/package.mk | 9 +- projects/Allwinner/linux/linux.aarch64.conf | 19 +- projects/Allwinner/linux/linux.arm.conf | 10 +- ...i-Support-unidirectional-mailbox-cha.patch | 6 +- .../patches/linux/0036-wip-h3-h5-cvbs.patch | 238 ++++- ...-hantro-sunxi-Enable-10-bit-decoding.patch | 41 +- .../devices/Amlogic-ng/bootloader/dtb.conf | 4 + .../lib/udev/hwdb.d/99-buzztv-bt-400-rf.hwdb | 11 + .../Amlogic-ng/linux/linux.aarch64.conf | 1 + .../Amlogic-ce/devices/Amlogic-ng/options | 2 +- .../amlogic/RTL8852BS-aml/package.mk | 33 + .../amlogic/ap6xxx-aml/package.mk | 4 +- .../system.d/sprd_sdio-firmware-aml.service | 2 + .../uwe5631-aml/udev.d/80-unisoc_sdio.rules | 3 +- .../linux-drivers/openvfd-driver/package.mk | 4 +- .../openvfd-driver/scripts/openvfd-start | 8 +- .../openvfd-driver/system.d/openvfd.service | 2 +- .../amlogic/rtkbt-firmware-aml/package.mk | 4 +- .../udev.d/80-rtkbt-firmware-aml.rules | 1 + projects/Amlogic-ce/packages/linux/package.mk | 4 +- .../packages/mediacenter/kodi/package.mk | 36 +- .../scripts/trusted-application-setup | 2 +- .../packages/tools/rtk_hciattach/package.mk | 4 +- ...ch-02-change-location-of-btaddr-file.patch | 25 + ...02-dont-read-mac-from-vendor-storage.patch | 13 - projects/Generic/linux/linux.x86_64.conf | 16 +- .../NXP/devices/iMX6/linux/linux.arm.conf | 9 +- .../NXP/devices/iMX8/linux/linux.aarch64.conf | 18 +- ...dd-component-framework-functionality.patch | 12 +- .../Dragonboard/linux/linux.aarch64.conf | 19 +- projects/RPi/devices/RPi/linux/linux.arm.conf | 11 +- .../RPi/devices/RPi2/linux/linux.arm.conf | 11 +- .../RPi/devices/RPi4/linux/linux.aarch64.conf | 12 +- ...06-gbm-colorspace-and-bits-per-pixel.patch | 352 -------- ...et-max-bpc-for-high-bit-depth-videos.patch | 46 + ...3-add-colourspace-connector-property.patch | 86 ++ .../kmscon/patches/kmscon-fixbuild.patch | 20 - .../packages/kmscon/libtsm/package.mk | 19 - .../packages/kmscon/package.mk | 15 - .../kmscon/patches/kmscon-fixbuild.patch | 20 - .../packages/kmscon/libtsm/package.mk | 19 - .../OdroidM1/packages/kmscon/package.mk | 15 - .../kmscon/patches/kmscon-fixbuild.patch | 20 - .../RK3288/linux/default/linux.arm.conf | 14 +- .../RK3328/linux/default/linux.aarch64.conf | 21 +- .../RK3399/linux/default/linux.aarch64.conf | 21 +- .../RK356x/packages/kmscon/libtsm/package.mk | 19 - .../devices/RK356x/packages/kmscon/package.mk | 15 - .../kmscon/patches/kmscon-fixbuild.patch | 20 - .../packages/kmscon/libtsm/package.mk | 0 .../GameForce => }/packages/kmscon/package.mk | 0 .../kmscon/patches/kmscon-fixbuild.patch | 32 + .../linux-2000-v4l2-wip-rkvdec-hevc.patch | 10 +- projects/Samsung/bootloader/release | 2 +- projects/Samsung/devices/Exynos/options | 4 +- projects/Samsung/filesystem/usr/bin/gputemp | 1 + projects/Samsung/linux/linux.arm.conf | 127 ++- projects/Samsung/options | 2 +- ...GbmGLESContext-wait-longer-for-vsync.patch | 28 + ...atform_gbm-not-EGL_MESA_platform_gbm.patch | 47 - ...002-LOCAL-changes-for-Odroid-XU3-XU4.patch | 264 ++++++ ..._RENDER_ALLOW-flag-on-DRM_IOCTL_MODE.patch | 34 + ...uf2-always-enable-V4L2_MEMORY_FLAG_N.patch | 29 + ...able-arm-Fix-coherency-support-for-M.patch | 37 + ...-jpeg-Enable-decoding-with-multiple-.patch | 112 --- ...pm_domains-Bring-back-old-driver-imp.patch | 169 ++++ ...s5422-HC1-XU3-XU4-model-name-is-ODR.patch} | 61 +- ...-dc-Move-vb2_dc_get_base_sgt-above-m.patch | 87 -- ...s5p-mfc-Allow-cache-hints-for-queues.patch | 36 + ...c-use-EAGAIN-not-EIO-for-MFCINST_ERR.patch | 38 + ...apping-implement-alloc_noncontiguous.patch | 93 ++ ...pping-increase-DMA-coherent-pool-si.patch} | 8 +- ...os-mixer-never-blend-the-base-layer.patch} | 6 +- ...a-exynos-gsc-fix-v4l2-SELECTION-api.patch} | 16 +- ...mfc-copy-timestamp-and-timecode-in-.patch} | 20 +- ...mfc-stop-streaming-before-releasing.patch} | 16 +- ...xynos-add-support-for-8-trip-points-.patch | 50 -- ...dts-exynos5422-enable-Exynos5422-TMU.patch | 45 - ...dd-irq-mode-configuration-for-trip-p.patch | 143 --- ...rmal-add-new-sysfs-file-for-irq-mode.patch | 130 --- ...xynos-bus-workaround-dev_pm_opp_set_.patch | 68 -- ...-s2mps11-call-shutdown-function-to-p.patch | 75 -- ...-s2mps11-add-ethernet-power-reset-in.patch | 92 -- ...4-arm-Set-the-system-revision-inform.patch | 31 - ...fix-ODROID-XU3-headphone-jack-volume.patch | 25 - ...01-panfrost-enable-Mali-T628-support.patch | 27 + ...ch => u-boot-0001-add-xu4-defconfig.patch} | 11 +- scripts/checkdeps | 6 +- scripts/extract | 2 +- scripts/image | 2 +- scripts/mkimage | 16 +- scripts/uboot_helper | 4 + tools/ffmpeg/gen-patches.sh | 6 +- 357 files changed, 4847 insertions(+), 4375 deletions(-) delete mode 100644 packages/addons/addon-depends/docker/libnetwork/package.mk create mode 100644 packages/addons/addon-depends/ffmpegx/patches/ffmpeg-openssl3.patch rename packages/addons/service/locale/source/resources/language/{English => resource.language.en_gb}/strings.po (79%) delete mode 100644 packages/addons/service/minidlna/patches/minidlna-02-fix-autoconf-271.patch delete mode 100644 packages/addons/service/minidlna/patches/minidlna-03-allow-gettext-0.20.patch delete mode 100644 packages/addons/tools/btrfs-progs/patches/btrfs-progs-01-compile-with-glibc-2.36.patch create mode 100644 packages/devel/asn1c/package.mk delete mode 100644 packages/devel/autoconf-archive/patches/autoconf-archive-0001-AX_CC_MAXOPT-Fix-nvhpc-case.patch delete mode 100644 packages/devel/heimdal/patches/0001-upstream-check-libtinfo-for-tgetent.patch delete mode 100644 packages/devel/heimdal/patches/0002-upstream-fix-configure-err-msg.patch delete mode 100644 packages/devel/heimdal/patches/22352b90e78e2d162b98b5ef6c84672c397be40a.patch delete mode 100644 packages/devel/heimdal/patches/c4cff6859d183a40fb35a76e2bc1ce084b3a6d67.patch delete mode 100644 packages/devel/heimdal/patches/cc6a3f337bac0411d0bb1c924fd857603a258d2f.patch delete mode 100644 packages/devel/heimdal/patches/yyerror-match-posix-standard.patch rename packages/{addons/addon-depends/ttyd-depends => devel}/json-c/package.mk (100%) create mode 100644 packages/graphics/libde265/patches/libde265-0001-275-Add-CMake-option-ENABLE-SDL.patch create mode 100644 packages/graphics/libde265/patches/libde265-0002-Add-CMake-option-ENABLE-ENCODER.patch create mode 100644 packages/graphics/tiff/patches/tiff-0001-only-build-library.patch create mode 100644 packages/graphics/vulkan/vkmark/patches/vkmark-999.01-PR47-drop-the-vkCreateDmaBufImageINTEL-extension.patch delete mode 100644 packages/graphics/vulkan/vkmark/patches/vkmark-999.01-drop-dependency-on-vkCreateDmaBufImageINTEL.patch delete mode 100644 packages/lang/gcc/patches/gcc-12.1.0-resolve-fsconfig_command-mount_attr-conflict-with-glibc-2.36.patch delete mode 100644 packages/linux-drivers/RTL8812AU/patches/RTL8812AU-0001-fix-5-18.patch create mode 100644 packages/linux-drivers/bcm_sta/patches/bcm_sta-0600-kernel-6.0-fix.patch delete mode 100644 packages/linux-firmware/kernel-firmware/patches/kernel-firmware-20220708-0001-WHENCE--Correct-dangling-symlinks.patch create mode 100644 packages/mediacenter/kodi/patches/kodi-999.20-headers-only.patch rename packages/multimedia/ffmpeg/patches/{ => dav1d}/ffmpeg-support-dav1d-1-0-0.patch (100%) create mode 100644 packages/multimedia/ffmpeg/patches/ffmpeg-openssl3.patch delete mode 100644 packages/network/rsync/patches/rsync-schar-fix-3.2.4.patch delete mode 100644 packages/network/samba/patches/samba-100-4-16-build-from-4-17.patch rename packages/network/samba/patches/{samba-951-no-man-4.13.patch => samba-951-no-man-4.16.patch} (84%) create mode 100644 packages/sx05re/emuelec/bin/check_res.sh create mode 100644 packages/sx05re/emuelec/config/splash/loading-game-std.png create mode 100644 packages/sx05re/emuelec/config/splash/splash-std.png rename packages/sx05re/{emuelec => emulators/advancemame}/bin/set_advmame_joy.sh (98%) create mode 100644 packages/sx05re/emulators/advancemame/patches/advancemame-fix-vfb-fps.patch create mode 100755 packages/sx05re/emulators/duckstation/scripts/set_duckstation_joy.sh create mode 100755 packages/sx05re/tools/sysutils/rclone/bin/ra_rclone.sh delete mode 100644 packages/sx05re/tools/unused/boost_locale/package.mk delete mode 100644 packages/tools/hdparm/patches/hdparm-glibc-2.36.patch delete mode 100644 packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0001-dont-require-util-macros.patch create mode 100644 packages/x11/data/xkeyboard-config/patches/xkeyboard-config-995.01-2.36-fix-xkb-base-path.patch create mode 100644 projects/Amlogic-ce/devices/Amlogic-ng/filesystem/usr/lib/udev/hwdb.d/99-buzztv-bt-400-rf.hwdb create mode 100644 projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8852BS-aml/package.mk create mode 100644 projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-change-location-of-btaddr-file.patch delete mode 100644 projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-dont-read-mac-from-vendor-storage.patch delete mode 100644 projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch create mode 100644 projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch create mode 100644 projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch delete mode 100644 projects/Rockchip/devices/GameForce/packages/kmscon/patches/kmscon-fixbuild.patch delete mode 100644 projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/libtsm/package.mk delete mode 100644 projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/package.mk delete mode 100644 projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/patches/kmscon-fixbuild.patch delete mode 100644 projects/Rockchip/devices/OdroidM1/packages/kmscon/libtsm/package.mk delete mode 100644 projects/Rockchip/devices/OdroidM1/packages/kmscon/package.mk delete mode 100644 projects/Rockchip/devices/OdroidM1/packages/kmscon/patches/kmscon-fixbuild.patch delete mode 100644 projects/Rockchip/devices/RK356x/packages/kmscon/libtsm/package.mk delete mode 100644 projects/Rockchip/devices/RK356x/packages/kmscon/package.mk delete mode 100644 projects/Rockchip/devices/RK356x/packages/kmscon/patches/kmscon-fixbuild.patch rename projects/Rockchip/{devices/GameForce => }/packages/kmscon/libtsm/package.mk (100%) rename projects/Rockchip/{devices/GameForce => }/packages/kmscon/package.mk (100%) create mode 100644 projects/Rockchip/packages/kmscon/patches/kmscon-fixbuild.patch create mode 120000 projects/Samsung/filesystem/usr/bin/gputemp create mode 100644 projects/Samsung/patches/kodi/kodi-0001-LOCAL-WinSystemGbmGLESContext-wait-longer-for-vsync.patch delete mode 100644 projects/Samsung/patches/kodi/kodi-0001-use-EGL_KHR_platform_gbm-not-EGL_MESA_platform_gbm.patch create mode 100644 projects/Samsung/patches/kodi/kodi-0002-LOCAL-changes-for-Odroid-XU3-XU4.patch create mode 100644 projects/Samsung/patches/linux/samsung-0001-HACK-drm-set-DRM_RENDER_ALLOW-flag-on-DRM_IOCTL_MODE.patch create mode 100644 projects/Samsung/patches/linux/samsung-0002-WIP-media-videobuf2-always-enable-V4L2_MEMORY_FLAG_N.patch create mode 100644 projects/Samsung/patches/linux/samsung-0003-WIP-iommu-io-pgtable-arm-Fix-coherency-support-for-M.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0004-MEMEKA-media-s5p-jpeg-Enable-decoding-with-multiple-.patch create mode 100644 projects/Samsung/patches/linux/samsung-0004-WIP-soc-samsung-pm_domains-Bring-back-old-driver-imp.patch rename projects/Samsung/patches/linux/{samsung-0025-WIP-ARM-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch => samsung-0005-WIP-arm-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch} (63%) delete mode 100644 projects/Samsung/patches/linux/samsung-0006-MEMEKA-videobuf2-dc-Move-vb2_dc_get_base_sgt-above-m.patch create mode 100644 projects/Samsung/patches/linux/samsung-0006-WIP-media-s5p-mfc-Allow-cache-hints-for-queues.patch create mode 100644 projects/Samsung/patches/linux/samsung-0007-WIP-media-s5p-mfc-use-EAGAIN-not-EIO-for-MFCINST_ERR.patch create mode 100644 projects/Samsung/patches/linux/samsung-0008-WIP-ARM-dma-mapping-implement-alloc_noncontiguous.patch rename projects/Samsung/patches/linux/{samsung-0002-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch => samsung-0009-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch} (74%) rename projects/Samsung/patches/linux/{samsung-0003-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch => samsung-0010-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch} (91%) rename projects/Samsung/patches/linux/{samsung-0005-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch => samsung-0011-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch} (64%) rename projects/Samsung/patches/linux/{samsung-0010-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch => samsung-0012-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch} (73%) rename projects/Samsung/patches/linux/{samsung-0011-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch => samsung-0013-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch} (61%) delete mode 100644 projects/Samsung/patches/linux/samsung-0014-MEMEKA-thermal-exynos-add-support-for-8-trip-points-.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0015-MEMEKA-arm-dts-exynos5422-enable-Exynos5422-TMU.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0016-MEMEKA-thermal-add-irq-mode-configuration-for-trip-p.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0017-MEMEKA-thermal-add-new-sysfs-file-for-irq-mode.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0018-MEMEKA-devfreq-exynos-bus-workaround-dev_pm_opp_set_.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0019-MEMEKA-regulator-s2mps11-call-shutdown-function-to-p.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0020-MEMEKA-regulator-s2mps11-add-ethernet-power-reset-in.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0022-MEMEKA-ODROID-XU4-arm-Set-the-system-revision-inform.patch delete mode 100644 projects/Samsung/patches/linux/samsung-0023-MEMEKA-fix-ODROID-XU3-headphone-jack-volume.patch create mode 100644 projects/Samsung/patches/mesa/panfrost-0001-panfrost-enable-Mali-T628-support.patch rename projects/Samsung/patches/u-boot/{0001-add-xu4-defconfig.patch => u-boot-0001-add-xu4-defconfig.patch} (90%) diff --git a/config/arch.aarch64 b/config/arch.aarch64 index 00fa89e2bc5..b771baab397 100644 --- a/config/arch.aarch64 +++ b/config/arch.aarch64 @@ -39,5 +39,5 @@ TARGET_CFLAGS="-march=${TARGET_VARIANT}${TARGET_CPU_FLAGS} -mabi=lp64 -Wno-psabi -mtune=$TARGET_CPU" # Disable runtime checking support of ARMv8.0's optional LSE feature. Breaks gdb and mesa compile. TARGET_CFLAGS="${TARGET_CFLAGS} -mno-outline-atomics" - TARGET_LDFLAGS="-march=${TARGET_VARIANT}${TARGET_CPU_FLAGS} -mtune=$TARGET_CPU" + TARGET_LDFLAGS="" TARGET_ARCH_GCC_OPTS="--with-abi=lp64 --with-arch=$TARGET_VARIANT" diff --git a/config/arch.arm b/config/arch.arm index b0f5ed958ee..8fbf2daeef8 100644 --- a/config/arch.arm +++ b/config/arch.arm @@ -71,5 +71,5 @@ # setup ARCH specific *FLAGS TARGET_CFLAGS="-march=$TARGET_VARIANT -mtune=$TARGET_CPU -mabi=aapcs-linux -Wno-psabi -Wa,-mno-warn-deprecated" [ -n "$TARGET_FPU" ] && TARGET_CFLAGS="$TARGET_CFLAGS $TARGET_FPU_FLAGS" - TARGET_LDFLAGS="-march=$TARGET_VARIANT -mtune=$TARGET_CPU" + TARGET_LDFLAGS="" TARGET_ARCH_GCC_OPTS="--with-abi=aapcs-linux --with-arch=$TARGET_SUBARCH --with-float=$TARGET_FLOAT --with-fpu=$TARGET_FPU" diff --git a/config/arch.x86_64 b/config/arch.x86_64 index 531c4c25a06..d57d795e060 100644 --- a/config/arch.x86_64 +++ b/config/arch.x86_64 @@ -11,7 +11,7 @@ # setup ARCH specific *FLAGS TARGET_CFLAGS="-march=${TARGET_CPU}" - TARGET_LDFLAGS="-march=${TARGET_CPU}" + TARGET_LDFLAGS="" # build with microarchitecture feature support defined by the TARGET_CPU value # see https://gitlab.com/x86-psABIs/x86-64-ABI/-/wikis/home for further details diff --git a/config/options b/config/options index b5bac8ab6e5..3b3738beea8 100644 --- a/config/options +++ b/config/options @@ -104,7 +104,7 @@ VERBOSE="${VERBOSE:-yes}" # value. The default is gigabytes. The actual value stored is rounded down to # the nearest multiple of 16 kilobytes. Keep in mind this per project .ccache # directory. -CCACHE_CACHE_SIZE="10G" +CCACHE_CACHE_SIZE="20G" # set addon paths if [ -z "$ADDON_PATH" ]; then diff --git a/config/options32 b/config/options32 index 15949a8c4a8..d625c7a0ece 100644 --- a/config/options32 +++ b/config/options32 @@ -1,4 +1,6 @@ -OPTIONS32=$( +# This command requires BASH >= v4.0, since we're using Ubuntu 20 as a baseline, this should not be a problem +# This reads those options into an array, one element per line, and keep empty line as is, also removing trailing \n +readarray -t OPTIONS32 < <( ARCH=arm TARGET_ARCH=arm # read DEVICE options @@ -19,12 +21,6 @@ OPTIONS32=$( echo $TARGET_SUBARCH ) -SAVED_IFS=$IFS -IFS=$'\n' -OPTIONS32=( $OPTIONS32 ) -IFS=$SAVED_IFS -unset SAVED_IFS - LIB32_TARGET_ABI="${OPTIONS32[0]}" LIB32_TARGET_GCC_ARCH="${OPTIONS32[1]}" LIB32_TARGET_CFLAGS="${OPTIONS32[2]}" diff --git a/config/show_config b/config/show_config index f64378bc537..3aa8b1c7716 100644 --- a/config/show_config +++ b/config/show_config @@ -99,9 +99,12 @@ show_config() { config_message+="\n - X.Org Composite support:\t\t ${COMPOSITE_SUPPORT}" fi config_message+="\n - Window Manager / Compositor:\t\t ${WINDOWMANAGER}" - config_message+="\n - OpenGL (GLX) support (provider):\t ${OPENGL_SUPPORT} (${OPENGL})" - config_message+="\n - OpenGL ES support (provider):\t ${OPENGLES_SUPPORT} (${OPENGLES})" - config_message+="\n - Vulkan API support (provider):\t ${VULKAN_SUPPORT} (${VULKAN})" + config_message+="\n - OpenGL (GLX) support (provider):\t ${OPENGL_SUPPORT}" + [ "${OPENGL}" != "no" ] && config_message+=" (${OPENGL})" + config_message+="\n - OpenGL ES support (provider):\t ${OPENGLES_SUPPORT}" + [ "${OPENGLES}" != "no" ] && config_message+=" (${OPENGLES})" + config_message+="\n - Vulkan API support (provider):\t ${VULKAN_SUPPORT}" + [ "${VULKAN}" != "no" ] && config_message+=" (${VULKAN})" if [ "${VULKAN_SUPPORT}" = "yes" ]; then config_message+="\n - Vulkan Graphic Drivers:\t\t ${VULKAN_DRIVERS_CONFIG}" fi diff --git a/distributions/CoreELEC/version b/distributions/CoreELEC/version index 093e82d039b..307b0aac145 100644 --- a/distributions/CoreELEC/version +++ b/distributions/CoreELEC/version @@ -14,7 +14,7 @@ OS_STAGE="alpha" # BUILD_NUM: Build number - BUILD_NUM="2" + BUILD_NUM="3" # ADDON_VERSION: Addon version ADDON_VERSION=${OS_VERSION} diff --git a/packages/addons/addon-depends/chrome-depends/gtk3/package.mk b/packages/addons/addon-depends/chrome-depends/gtk3/package.mk index 305a4c2cccf..ecf633003ab 100644 --- a/packages/addons/addon-depends/chrome-depends/gtk3/package.mk +++ b/packages/addons/addon-depends/chrome-depends/gtk3/package.mk @@ -11,7 +11,6 @@ PKG_URL="https://ftp.gnome.org/pub/gnome/sources/gtk+/${PKG_VERSION:0:4}/gtk+-${ PKG_DEPENDS_TARGET="toolchain at-spi2-atk atk cairo gdk-pixbuf glib libX11 libXi libXrandr libepoxy pango libxkbcommon" PKG_DEPENDS_CONFIG="libXft pango gdk-pixbuf shared-mime-info" PKG_LONGDESC="A library for creating graphical user interfaces for the X Window System." -PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="-sysroot" PKG_MESON_OPTS_TARGET="-Dbroadway_backend=false \ diff --git a/packages/addons/addon-depends/docker/containerd/package.mk b/packages/addons/addon-depends/docker/containerd/package.mk index 3d6a833cd33..40f4ed21cdc 100644 --- a/packages/addons/addon-depends/docker/containerd/package.mk +++ b/packages/addons/addon-depends/docker/containerd/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="containerd" -PKG_VERSION="1.6.6" -PKG_SHA256="27afb673c20d53aa5c31aec07b38eb7e4dc911e7e1f0c76fac9513bbf070bd24" +PKG_VERSION="1.6.8" +PKG_SHA256="f5f938513c28377f64f85e84f2750d39f26b01262f3a062b7e8ce35b560ca407" PKG_LICENSE="APL" PKG_SITE="https://containerd.io" PKG_URL="https://github.com/containerd/containerd/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/addons/addon-depends/docker/libnetwork/package.mk b/packages/addons/addon-depends/docker/libnetwork/package.mk deleted file mode 100644 index 3668baea5a0..00000000000 --- a/packages/addons/addon-depends/docker/libnetwork/package.mk +++ /dev/null @@ -1,33 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2009-2016 Lukas Rusak (lrusak@libreelec.tv) -# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="libnetwork" -PKG_VERSION="339b972b464ee3d401b5788b2af9e31d09d6b7da" # 2022-03-16 -PKG_SHA256="335851e924078a8e274f0c27cb80aaba32d0c1059068740496f1eb31b55a6ec4" -PKG_LICENSE="APL" -PKG_SITE="https://github.com/docker/libnetwork" -PKG_URL="https://github.com/docker/libnetwork/archive/${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain go:host" -PKG_LONGDESC="A native Go implementation for connecting containers." -PKG_TOOLCHAIN="manual" - -pre_make_target() { - go_configure - - export CGO_ENABLED=0 - export LDFLAGS="-extld ${CC}" - export GO111MODULE=off - - mkdir -p ${GOPATH} - if [ -d ${PKG_BUILD}/vendor ]; then - mv ${PKG_BUILD}/vendor ${GOPATH}/src - fi - - ln -fs ${PKG_BUILD} ${GOPATH}/src/github.com/docker/libnetwork -} - -make_target() { - mkdir -p bin - ${GOLANG} build -v -o bin/docker-proxy -a -ldflags "${LDFLAGS}" ./cmd/proxy -} diff --git a/packages/addons/addon-depends/docker/moby/package.mk b/packages/addons/addon-depends/docker/moby/package.mk index 388283eb239..66d037c7490 100644 --- a/packages/addons/addon-depends/docker/moby/package.mk +++ b/packages/addons/addon-depends/docker/moby/package.mk @@ -45,6 +45,7 @@ EOF make_target() { mkdir -p bin + ${GOLANG} build -mod=mod -modfile=vendor.mod -v -o bin/docker-proxy -a -ldflags "${LDFLAGS}" ./cmd/docker-proxy ${GOLANG} build -mod=mod -modfile=vendor.mod -v -o bin/dockerd -a -tags "${PKG_MOBY_BUILDTAGS}" -ldflags "${LDFLAGS}" ./cmd/dockerd } diff --git a/packages/addons/addon-depends/docker/runc/package.mk b/packages/addons/addon-depends/docker/runc/package.mk index 2984d956d32..56e75e505fc 100644 --- a/packages/addons/addon-depends/docker/runc/package.mk +++ b/packages/addons/addon-depends/docker/runc/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="runc" -PKG_VERSION="1.1.3" -PKG_SHA256="fc1c70e095d662e38a5889bc6de41857762ce022caaf8be2852663198c533a63" +PKG_VERSION="1.1.4" +PKG_SHA256="4f02077432642eebd768fc857318ae7929290b3a3511eb1be338005e360cfa34" PKG_LICENSE="APL" PKG_SITE="https://github.com/opencontainers/runc" PKG_URL="https://github.com/opencontainers/runc/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/addons/addon-depends/dotnet-runtime-depends/aspnet6-runtime/package.mk b/packages/addons/addon-depends/dotnet-runtime-depends/aspnet6-runtime/package.mk index 6b6d27e8f7f..f32fc826bc9 100644 --- a/packages/addons/addon-depends/dotnet-runtime-depends/aspnet6-runtime/package.mk +++ b/packages/addons/addon-depends/dotnet-runtime-depends/aspnet6-runtime/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="aspnet6-runtime" -PKG_VERSION="6.0.7" +PKG_VERSION="6.0.8" PKG_LICENSE="MIT" PKG_SITE="https://dotnet.microsoft.com/" PKG_DEPENDS_TARGET="toolchain" @@ -11,16 +11,16 @@ PKG_TOOLCHAIN="manual" case "${ARCH}" in "aarch64") - PKG_SHA256="b0f7908e4eb7819ff08fc3a4670c52a73035bbea11bebf7d2ef0c39e829cfdc8" - PKG_URL="https://download.visualstudio.microsoft.com/download/pr/b79c5fa9-a08d-4534-9424-4bacfc3cdc3d/449179d6fe8cda05f52b7be0f6828eb0/aspnetcore-runtime-6.0.7-linux-arm64.tar.gz" + PKG_SHA256="8a8d7ebfd2a6a806e57b6bfa1fd71b99a789c947c66c30c081824b1a00123c78" + PKG_URL="https://download.visualstudio.microsoft.com/download/pr/83695c9b-c954-459e-b9bf-2f1ac269e34e/1316ff4a6fe4c6916e7ecb3623d67cee/aspnetcore-runtime-6.0.8-linux-arm64.tar.gz" ;; "arm") - PKG_SHA256="66d49dfb0022645ff3f64cdcc733647d6d02578d1cee95a29d3845cd173deb88" - PKG_URL="https://download.visualstudio.microsoft.com/download/pr/228e3f86-84fa-4109-9655-2a381acbd6c1/eb174b5083bb639d8b219b7cb11fa50f/aspnetcore-runtime-6.0.7-linux-arm.tar.gz" + PKG_SHA256="8e53a2bf2d145c8983b85db1e1010bdf257f0d30beedaaa34a602e69ca4d74bf" + PKG_URL="https://download.visualstudio.microsoft.com/download/pr/cf567026-a29a-41aa-bc3a-e4e1ad0df480/0925d411e8e09e31ba7a39a3eb0e29af/aspnetcore-runtime-6.0.8-linux-arm.tar.gz" ;; "x86_64") - PKG_SHA256="61c2b79cc31e1d5df9a398766044177cecb7b9c2baad4ef9d011723ba21fd0ee" - PKG_URL="https://download.visualstudio.microsoft.com/download/pr/98271725-1784-407c-841a-64d87c674512/b433af33506c816e3b5838f5c65d990a/aspnetcore-runtime-6.0.7-linux-x64.tar.gz" + PKG_SHA256="2bd3c32aacacbb6963df523e1022bc1989f7f1efc0de87d458cd3721dfafc42b" + PKG_URL="https://download.visualstudio.microsoft.com/download/pr/5cc06c3a-4d8a-4fb2-8f7a-ecd23cd8c4e0/dd386c0e3a41ea54f459907c834acedf/aspnetcore-runtime-6.0.8-linux-x64.tar.gz" ;; esac PKG_SOURCE_NAME="aspnetcore-runtime_${PKG_VERSION}_${ARCH}.tar.gz" diff --git a/packages/addons/addon-depends/ffmpegx/package.mk b/packages/addons/addon-depends/ffmpegx/package.mk index 3bebe1bfcb7..4b52070fc21 100644 --- a/packages/addons/addon-depends/ffmpegx/package.mk +++ b/packages/addons/addon-depends/ffmpegx/package.mk @@ -7,7 +7,7 @@ PKG_SHA256="06b10a183ce5371f915c6bb15b7b1fffbe046e8275099c96affc29e17645d909" PKG_LICENSE="LGPLv2.1+" PKG_SITE="https://ffmpeg.org" PKG_URL="https://ffmpeg.org/releases/ffmpeg-${PKG_VERSION}.tar.xz" -PKG_DEPENDS_TARGET="toolchain aom bzip2 gnutls lame libvorbis opus x264 zlib" +PKG_DEPENDS_TARGET="toolchain aom bzip2 openssl lame libvorbis opus x264 zlib" PKG_LONGDESC="FFmpegx is an complete FFmpeg build to support encoding and decoding." PKG_BUILD_FLAGS="-gold -sysroot" @@ -123,6 +123,7 @@ configure_target() { \ `#Licensing options` \ --enable-gpl \ + --enable-version3 \ \ `#Documentation options` \ --disable-doc \ @@ -160,8 +161,8 @@ configure_target() { --extra-ldflags="${LDFLAGS}" \ --extra-libs="${PKG_FFMPEG_LIBS}" \ --enable-pic \ - --enable-gnutls \ - --disable-openssl \ + --disable-gnutls \ + --enable-openssl \ \ `#Advanced options` \ --disable-hardcoded-tables \ diff --git a/packages/addons/addon-depends/ffmpegx/patches/ffmpeg-openssl3.patch b/packages/addons/addon-depends/ffmpegx/patches/ffmpeg-openssl3.patch new file mode 100644 index 00000000000..59e78ab3699 --- /dev/null +++ b/packages/addons/addon-depends/ffmpegx/patches/ffmpeg-openssl3.patch @@ -0,0 +1,44 @@ +From 1d23e125b6f76e74b754560c3b6931507cacddce Mon Sep 17 00:00:00 2001 +From: Timo Rothenpieler +Date: Tue, 7 Sep 2021 19:35:31 +0200 +Subject: [PATCH] configure: account for openssl3 license change + +--- + configure | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/configure b/configure +index c87a010387..ed7345b2c1 100755 +--- a/configure ++++ b/configure +@@ -1765,7 +1765,6 @@ EXTERNAL_LIBRARY_GPL_LIST=" + EXTERNAL_LIBRARY_NONFREE_LIST=" + decklink + libfdk_aac +- openssl + libtls + " + +@@ -1857,6 +1856,7 @@ EXTERNAL_LIBRARY_LIST=" + mediacodec + openal + opengl ++ openssl + pocketsphinx + vapoursynth + " +@@ -6572,7 +6572,10 @@ enabled omx_rpi && { test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoR + die "ERROR: OpenMAX IL headers from raspberrypi/firmware not found"; } && + enable omx + enabled omx && require_headers OMX_Core.h +-enabled openssl && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || ++enabled openssl && { { check_pkg_config openssl "openssl >= 3.0.0" openssl/ssl.h OPENSSL_init_ssl && ++ { enabled gplv3 || ! enabled gpl || enabled nonfree || die "ERROR: OpenSSL >=3.0.0 requires --enable-version3"; }; } || ++ { enabled gpl && ! enabled nonfree && die "ERROR: OpenSSL <3.0.0 is incompatible with the gpl"; } || ++ check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || + check_pkg_config openssl openssl openssl/ssl.h SSL_library_init || + check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto || + check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto || +-- +2.34.1 + diff --git a/packages/addons/addon-depends/go/package.mk b/packages/addons/addon-depends/go/package.mk index 16ae91b4b77..d2506d1b118 100644 --- a/packages/addons/addon-depends/go/package.mk +++ b/packages/addons/addon-depends/go/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="go" -PKG_VERSION="1.18.5" -PKG_SHA256="30c07c08c9b9a79d652272ac3298c249a810a4c908e8937cf5e58d2414af1cc3" +PKG_VERSION="1.19.1" +PKG_SHA256="884439c3de751c705e47a120af6b92b65770a952a7b8788244bc6d73b2548c3e" PKG_LICENSE="BSD" PKG_SITE="https://golang.org" PKG_URL="https://github.com/golang/go/archive/${PKG_NAME}${PKG_VERSION}.tar.gz" diff --git a/packages/addons/addon-depends/libiconv/package.mk b/packages/addons/addon-depends/libiconv/package.mk index 3bf7ad81e2e..4bfd397dd2c 100644 --- a/packages/addons/addon-depends/libiconv/package.mk +++ b/packages/addons/addon-depends/libiconv/package.mk @@ -2,11 +2,11 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libiconv" -PKG_VERSION="1.16" -PKG_SHA256="e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04" +PKG_VERSION="1.17" +PKG_SHA256="8f74213b56238c85a50a5329f77e06198771e70dd9a739779f4c02f65d971313" PKG_LICENSE="GPL" PKG_SITE="https://savannah.gnu.org/projects/libiconv/" -PKG_URL="http://ftp.gnu.org/pub/gnu/libiconv/${PKG_NAME}-${PKG_VERSION}.tar.gz" +PKG_URL="https://ftp.gnu.org/pub/gnu/libiconv/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A tool that converts from one character encoding to another through Unicode conversion." PKG_BUILD_FLAGS="+pic" diff --git a/packages/addons/addon-depends/mpd-mpc/package.mk b/packages/addons/addon-depends/mpd-mpc/package.mk index d97d1cc8271..44b0d5d716b 100644 --- a/packages/addons/addon-depends/mpd-mpc/package.mk +++ b/packages/addons/addon-depends/mpd-mpc/package.mk @@ -9,5 +9,4 @@ PKG_SITE="https://www.musicpd.org" PKG_URL="https://www.musicpd.org/download/mpc/0/mpc-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libiconv libmpdclient" PKG_LONGDESC="Command-line client for MPD." -PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="-sysroot" diff --git a/packages/addons/service/docker/changelog.txt b/packages/addons/service/docker/changelog.txt index 40999a4ed5f..883fad734bc 100644 --- a/packages/addons/service/docker/changelog.txt +++ b/packages/addons/service/docker/changelog.txt @@ -1,3 +1,9 @@ +138 +- libnetwork: drop package + docker-proxy is now included in moby +- containerd: update to 1.6.8 +- runc: update to 1.1.4 + 137 - containerd: update to 1.6.6 - runc: update to 1.1.3 diff --git a/packages/addons/service/docker/package.mk b/packages/addons/service/docker/package.mk index 5744af221c4..89b2676cc64 100644 --- a/packages/addons/service/docker/package.mk +++ b/packages/addons/service/docker/package.mk @@ -3,11 +3,11 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="docker" -PKG_REV="137" +PKG_REV="138" PKG_ARCH="any" PKG_LICENSE="ASL" PKG_SITE="http://www.docker.com/" -PKG_DEPENDS_TARGET="containerd runc libnetwork tini moby cli" +PKG_DEPENDS_TARGET="cli containerd moby runc tini" PKG_SECTION="service/system" PKG_SHORTDESC="Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere." PKG_LONGDESC="Docker containers can encapsulate any payload, and will run consistently on and between virtually any server. The same container that a developer builds and tests on a laptop will run at scale, in production*, on VMs, bare-metal servers, OpenStack clusters, public instances, or combinations of the above." @@ -25,15 +25,13 @@ addon() { # moby cp -P $(get_build_dir moby)/bin/dockerd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin + cp -P $(get_build_dir moby)/bin/docker-proxy ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/docker-proxy # containerd cp -P $(get_build_dir containerd)/bin/containerd ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/containerd cp -P $(get_build_dir containerd)/bin/containerd-shim ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/containerd-shim cp -P $(get_build_dir containerd)/bin/containerd-shim-runc-v2 ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/containerd-shim-runc-v2 - # libnetwork - cp -P $(get_build_dir libnetwork)/bin/docker-proxy ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/docker-proxy - # runc cp -P $(get_build_dir runc)/bin/runc ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/runc diff --git a/packages/addons/service/jellyfin/changelog.txt b/packages/addons/service/jellyfin/changelog.txt index 0b7b57c46c3..582c7ccc30b 100644 --- a/packages/addons/service/jellyfin/changelog.txt +++ b/packages/addons/service/jellyfin/changelog.txt @@ -1,3 +1,6 @@ +107 +- Update to Jellyfin 10.8.4 + 106 - Update to Jellyfin 10.8.3 diff --git a/packages/addons/service/jellyfin/package.mk b/packages/addons/service/jellyfin/package.mk index 9764ff9ad74..c5855275f2b 100644 --- a/packages/addons/service/jellyfin/package.mk +++ b/packages/addons/service/jellyfin/package.mk @@ -3,8 +3,8 @@ PKG_NAME="jellyfin" PKG_VERSION="1.0" -PKG_VERSION_NUMBER="10.8.3" -PKG_REV="106" +PKG_VERSION_NUMBER="10.8.4" +PKG_REV="107" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://jellyfin.org/" diff --git a/packages/addons/service/locale/changelog.txt b/packages/addons/service/locale/changelog.txt index e447f8e84fd..986bcb88945 100644 --- a/packages/addons/service/locale/changelog.txt +++ b/packages/addons/service/locale/changelog.txt @@ -1,3 +1,6 @@ +103: +- Fix localedef call, add error detection + 102: - Include localedef diff --git a/packages/addons/service/locale/package.mk b/packages/addons/service/locale/package.mk index e4afc309f82..7ad064fa30f 100644 --- a/packages/addons/service/locale/package.mk +++ b/packages/addons/service/locale/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="locale" -PKG_REV="102" +PKG_REV="103" PKG_ARCH="any" PKG_DEPENDS_TARGET="toolchain glibc" PKG_SECTION="service" @@ -34,10 +34,9 @@ addon() { if [ "${l}" = "POSIX" ]; then continue fi - locales+="|${l}" + locales+="$(echo -e '\\\n ')" done - locales="${locales:1}" - sed -e "s/@LOCALES@/${locales}/" \ + sed -e "s|@LOCALES@|${locales}|" \ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/resources/settings.xml } diff --git a/packages/addons/service/locale/resources/settings.xml b/packages/addons/service/locale/resources/settings.xml index 5157d70e484..4fa663090d7 100644 --- a/packages/addons/service/locale/resources/settings.xml +++ b/packages/addons/service/locale/resources/settings.xml @@ -1,7 +1,37 @@ - - - - - + + +
+ + + + 0 + UTF-8 + + + + + + + + false + + + + 30001 + + + + 0 + en_GB + + @LOCALES@ + + + + 30002 + + + +
diff --git a/packages/addons/service/locale/source/default.py b/packages/addons/service/locale/source/default.py index d34da59446d..0124daa08e8 100644 --- a/packages/addons/service/locale/source/default.py +++ b/packages/addons/service/locale/source/default.py @@ -38,8 +38,20 @@ def setLocale(self): if os.path.isdir(localepath) == False: os.environ['I18NPATH'] = i18npath - subprocess.call([os.path.join(path, 'bin/localedef'), '-f', charmap, - '-i', locale, localepath]) + rc = subprocess.run([os.path.join(path, 'bin/localedef'), '-v', '-f', charmap, + '-i', locale, localepath], capture_output=True, + stdin=subprocess.DEVNULL) + + if rc.returncode not in [0, 1]: + xbmc.log(repr(rc), xbmc.LOGERROR) + try: + os.rmdir(localepath) + except OSError as e: + pass + if os.path.isfile(profile): + os.unlink(profile) + xbmcgui.Dialog().ok('Locale', strings(30004).format(lang)) + return if os.path.isdir(profiled) == False: os.makedirs(profiled) diff --git a/packages/addons/service/locale/source/resources/language/English/strings.po b/packages/addons/service/locale/source/resources/language/resource.language.en_gb/strings.po similarity index 79% rename from packages/addons/service/locale/source/resources/language/English/strings.po rename to packages/addons/service/locale/source/resources/language/resource.language.en_gb/strings.po index 0538888a415..5bb8e37165b 100644 --- a/packages/addons/service/locale/source/resources/language/English/strings.po +++ b/packages/addons/service/locale/source/resources/language/resource.language.en_gb/strings.po @@ -17,3 +17,7 @@ msgstr "" msgctxt "#30003" msgid "Locale changed to {}. Please reboot to apply globally." msgstr "" + +msgctxt "#30004" +msgid "Creating locale {} failed. Aborting." +msgstr "" diff --git a/packages/addons/service/locale/source/settings-default.xml b/packages/addons/service/locale/source/settings-default.xml index 5db70160c92..e5018a4d900 100644 --- a/packages/addons/service/locale/source/settings-default.xml +++ b/packages/addons/service/locale/source/settings-default.xml @@ -1,4 +1,4 @@ - - - + + UTF-8 + =0.18 - -diff --git a/configure.ac b/configure.ac -index cb596b9..2eaf0a4 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -29,6 +29,7 @@ m4_ifdef([AC_USE_SYSTEM_EXTENSIONS], [AC_USE_SYSTEM_EXTENSIONS]) - AM_ICONV - AM_GNU_GETTEXT([external]) - AM_GNU_GETTEXT_VERSION(0.18) -+AM_GNU_GETTEXT_REQUIRE_VERSION(0.18) - - # Checks for programs. - AC_PROG_AWK diff --git a/packages/addons/service/syncthing/changelog.txt b/packages/addons/service/syncthing/changelog.txt index 8f5f243fdb5..b96aee7022b 100644 --- a/packages/addons/service/syncthing/changelog.txt +++ b/packages/addons/service/syncthing/changelog.txt @@ -1,3 +1,6 @@ +121 +- update to 1.21.0 + 120 - update to 1.20.1 diff --git a/packages/addons/service/syncthing/package.mk b/packages/addons/service/syncthing/package.mk index dff74b5530e..c42fda69b84 100644 --- a/packages/addons/service/syncthing/package.mk +++ b/packages/addons/service/syncthing/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="syncthing" -PKG_VERSION="1.20.1" -PKG_SHA256="a88fabaea11a8df5cc134075c37dc87f1fb33b48d3d8afb1dc8ea11b3c0925bc" -PKG_REV="120" +PKG_VERSION="1.21.0" +PKG_SHA256="e70d70c7962383973acdbc2eb184548ae87de22ac6854045982c7960b8260450" +PKG_REV="121" PKG_ARCH="any" PKG_LICENSE="MPLv2" PKG_SITE="https://syncthing.net/" diff --git a/packages/addons/skin/estouchy/package.mk b/packages/addons/skin/estouchy/package.mk index b506e2c686b..5cae9ccaede 100644 --- a/packages/addons/skin/estouchy/package.mk +++ b/packages/addons/skin/estouchy/package.mk @@ -8,7 +8,8 @@ PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="" -PKG_DEPENDS_TARGET="kodi" +PKG_DEPENDS_TARGET="TexturePacker:host" +PKG_DEPENDS_UNPACK="kodi" PKG_SECTION="skin" PKG_SHORTDESC="Kodi skin Estouchy" PKG_LONGDESC="Kodi skin Estouchy" @@ -18,7 +19,13 @@ PKG_IS_ADDON="yes" PKG_ADDON_NAME="Estouchy" PKG_ADDON_TYPE="xbmc.gui.skin" +make_target() { + TexturePacker -dupecheck -input $(get_build_dir kodi)/addons/skin.estouchy/media/ -output Textures.xbt +} + addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID} - cp -a $(get_install_dir kodi)/.noinstall/skin.estouchy/* ${ADDON_BUILD}/${PKG_ADDON_ID} + cp -a $(get_build_dir kodi)/addons/skin.estouchy/* ${ADDON_BUILD}/${PKG_ADDON_ID} + rm -rf ${ADDON_BUILD}/${PKG_ADDON_ID}/media/* + cp ${PKG_BUILD}/Textures.xbt ${ADDON_BUILD}/${PKG_ADDON_ID}/media } diff --git a/packages/addons/tools/btrfs-progs/changelog.txt b/packages/addons/tools/btrfs-progs/changelog.txt index 4f35638977d..d38d0062185 100644 --- a/packages/addons/tools/btrfs-progs/changelog.txt +++ b/packages/addons/tools/btrfs-progs/changelog.txt @@ -1,3 +1,6 @@ +109 +- update to 5.19 + 108 - update to 5.18.1 diff --git a/packages/addons/tools/btrfs-progs/package.mk b/packages/addons/tools/btrfs-progs/package.mk index e14c6f49684..5ee172afae7 100644 --- a/packages/addons/tools/btrfs-progs/package.mk +++ b/packages/addons/tools/btrfs-progs/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="btrfs-progs" -PKG_VERSION="5.18.1" -PKG_SHA256="8a8ad6bc2b5ccd870fa2b18a822ef354222c8d06b1ca98bf81d9da68bd9df2b3" -PKG_REV="108" +PKG_VERSION="5.19" +PKG_SHA256="4454483dae038efabe1251eb395d195ab6f1e91e1d722d1f99eb3b9e2c4b2c4a" +PKG_REV="109" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://btrfs.wiki.kernel.org/index.php/Main_Page" diff --git a/packages/addons/tools/btrfs-progs/patches/btrfs-progs-01-compile-with-glibc-2.36.patch b/packages/addons/tools/btrfs-progs/patches/btrfs-progs-01-compile-with-glibc-2.36.patch deleted file mode 100644 index 7fb9f256984..00000000000 --- a/packages/addons/tools/btrfs-progs/patches/btrfs-progs-01-compile-with-glibc-2.36.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 46eb32a019834b0a49ae9744db1a921aaa6a3d63 Mon Sep 17 00:00:00 2001 -From: Khem Raj -Date: Mon, 25 Jul 2022 11:58:35 -0700 -Subject: [PATCH] btrfs-progs: use linux mount.h instead of sys/mount.h - -This file includes linux/fs.h which includes linux/mount.h and with -glibc 2.36 linux/mount.h and glibc mount.h are not compatible [1] -therefore try to avoid including both headers - -[1] https://sourceware.org/glibc/wiki/Release/2.36 - -Signed-off-by: Khem Raj -Signed-off-by: David Sterba ---- - common/device-utils.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/common/device-utils.c b/common/device-utils.c -index 617b6746..25a4fb8c 100644 ---- a/common/device-utils.c -+++ b/common/device-utils.c -@@ -15,7 +15,6 @@ - */ - - #include --#include - #include - #include - #include --- -GitLab - diff --git a/packages/addons/tools/dotnet-runtime/changelog.txt b/packages/addons/tools/dotnet-runtime/changelog.txt index 519a2724946..079573665fd 100644 --- a/packages/addons/tools/dotnet-runtime/changelog.txt +++ b/packages/addons/tools/dotnet-runtime/changelog.txt @@ -1,4 +1,7 @@ -129 +121 +- Update ASP.NET Core Runtime 6.0.8 + +120 - Update ASP.NET Core Runtime 6.0.7 119 diff --git a/packages/addons/tools/dotnet-runtime/package.mk b/packages/addons/tools/dotnet-runtime/package.mk index 6b4b60dda9a..50bd7485df6 100644 --- a/packages/addons/tools/dotnet-runtime/package.mk +++ b/packages/addons/tools/dotnet-runtime/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dotnet-runtime" -PKG_REV="120" +PKG_REV="121" PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://dotnet.microsoft.com/" diff --git a/packages/addons/tools/ffmpeg-tools/changelog.txt b/packages/addons/tools/ffmpeg-tools/changelog.txt index ae68e267e1f..c88d5a6dccf 100644 --- a/packages/addons/tools/ffmpeg-tools/changelog.txt +++ b/packages/addons/tools/ffmpeg-tools/changelog.txt @@ -1,3 +1,9 @@ +119 +- Switch FFmpeg to openssl3 + +118 +- Add missing libraries + 117 - Update aom (AV1) to 3.2.0 - Update VPX to 1.11.0 diff --git a/packages/addons/tools/ffmpeg-tools/package.mk b/packages/addons/tools/ffmpeg-tools/package.mk index d4bf3427883..d8190ef1aac 100644 --- a/packages/addons/tools/ffmpeg-tools/package.mk +++ b/packages/addons/tools/ffmpeg-tools/package.mk @@ -3,7 +3,7 @@ PKG_NAME="ffmpeg-tools" PKG_VERSION="1.0" -PKG_REV="118" +PKG_REV="119" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" diff --git a/packages/addons/tools/network-tools/changelog.txt b/packages/addons/tools/network-tools/changelog.txt index 7bcc9a87dd4..9b57bc7879e 100644 --- a/packages/addons/tools/network-tools/changelog.txt +++ b/packages/addons/tools/network-tools/changelog.txt @@ -1,3 +1,6 @@ +116 +- rsync: update to 3.2.5 + 115 - irssi: update to 1.4.2 and meson build - ngrep: update to using pcre2 diff --git a/packages/addons/tools/network-tools/package.mk b/packages/addons/tools/network-tools/package.mk index 9729aa8fc83..16e1a50e999 100644 --- a/packages/addons/tools/network-tools/package.mk +++ b/packages/addons/tools/network-tools/package.mk @@ -3,7 +3,7 @@ PKG_NAME="network-tools" PKG_VERSION="1.0" -PKG_REV="115" +PKG_REV="116" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" diff --git a/packages/audio/flac/package.mk b/packages/audio/flac/package.mk index 5fdc7b9be84..ba8613c07db 100644 --- a/packages/audio/flac/package.mk +++ b/packages/audio/flac/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="flac" -PKG_VERSION="1.3.4" -PKG_SHA256="8ff0607e75a322dd7cd6ec48f4f225471404ae2730d0ea945127b1355155e737" +PKG_VERSION="1.4.0" +PKG_SHA256="af41c0733c93c237c3e52f64dd87e3b0d9af38259f1c7d11e8cbf583c48c2506" PKG_LICENSE="GPLv2" PKG_SITE="https://xiph.org/flac/" PKG_URL="https://downloads.xiph.org/releases/flac/${PKG_NAME}-${PKG_VERSION}.tar.xz" diff --git a/packages/audio/fluidsynth/package.mk b/packages/audio/fluidsynth/package.mk index c280c51d490..a73735f1b49 100644 --- a/packages/audio/fluidsynth/package.mk +++ b/packages/audio/fluidsynth/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="fluidsynth" -PKG_VERSION="2.2.8" -PKG_SHA256="7c29a5cb7a2755c8012d941d1335da7bda957bbb0a86b7c59215d26773bb51fe" +PKG_VERSION="2.2.9" +PKG_SHA256="bc62494ec2554fdcfc01512a2580f12fc1e1b01ce37a18b370dd7902af7a8159" PKG_LICENSE="GPL" PKG_SITE="http://fluidsynth.org/" PKG_URL="https://github.com/FluidSynth/fluidsynth/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/audio/libopenmpt/package.mk b/packages/audio/libopenmpt/package.mk index cbc2e247249..d1c8c0a8eec 100644 --- a/packages/audio/libopenmpt/package.mk +++ b/packages/audio/libopenmpt/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libopenmpt" -PKG_VERSION="0.6.4" -PKG_SHA256="e09fb845c3292700a7ac13c3b31d669ecd3bdbebcbfe1328eba2376cebe40162" +PKG_VERSION="0.6.5" +PKG_SHA256="f22abe977cdae405f685b75150e7fb155b2c7896b4700fd54abe68840f66e9c0" PKG_LICENSE="BSD" PKG_SITE="https://lib.openmpt.org/libopenmpt/" PKG_URL="https://lib.openmpt.org/files/libopenmpt/src/${PKG_NAME}-${PKG_VERSION}+release.autotools.tar.gz" diff --git a/packages/audio/pipewire/package.mk b/packages/audio/pipewire/package.mk index d5c20f6aab1..615f9905610 100644 --- a/packages/audio/pipewire/package.mk +++ b/packages/audio/pipewire/package.mk @@ -2,14 +2,13 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pipewire" -PKG_VERSION="0.3.55" -PKG_SHA256="666260961a242239a940b7f6130e5e9cb51ad76f9ebf6b5403198ee5efa69344" +PKG_VERSION="0.3.58" +PKG_SHA256="5cb73bf27b8b80e37804d7829c5ad8fa5510835f449bbb7e4773f188584771ad" PKG_LICENSE="LGPL" PKG_SITE="https://pipewire.org" PKG_URL="https://github.com/PipeWire/pipewire/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libpthread-stubs dbus ncurses alsa-lib systemd libsndfile libusb" PKG_LONGDESC="PipeWire is a server and user space API to deal with multimedia pipeline" -PKG_TOOLCHAIN="meson" if [ "${BLUETOOTH_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" bluez sbc ldacBT libfreeaptx" diff --git a/packages/compress/lz4/package.mk b/packages/compress/lz4/package.mk index bcc4b79aa2b..03537b276f7 100644 --- a/packages/compress/lz4/package.mk +++ b/packages/compress/lz4/package.mk @@ -2,15 +2,14 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="lz4" -PKG_VERSION="1.9.3" -PKG_SHA256="030644df4611007ff7dc962d981f390361e6c97a34e5cbc393ddfbe019ffe2c1" +PKG_VERSION="1.9.4" +PKG_SHA256="0b0e3aa07c8c063ddf40b082bdf7e37a1562bda40a0ff5272957f3e987e0e54b" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lz4/lz4" PKG_URL="https://github.com/lz4/lz4/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="lz4 data compressor/decompressor" -PKG_TOOLCHAIN="cmake" configure_package() { PKG_CMAKE_SCRIPT="${PKG_BUILD}/build/cmake/CMakeLists.txt" diff --git a/packages/compress/xz/package.mk b/packages/compress/xz/package.mk index 41b48c1acde..fa885b136bc 100644 --- a/packages/compress/xz/package.mk +++ b/packages/compress/xz/package.mk @@ -3,11 +3,11 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xz" -PKG_VERSION="5.2.5" -PKG_SHA256="5117f930900b341493827d63aa910ff5e011e0b994197c3b71c08a20228a42df" +PKG_VERSION="5.2.6" +PKG_SHA256="e076ba3439cb7cfc45b908c869f51a8c89f3c9ee9ee982fde28849c015e723a7" PKG_LICENSE="GPL" -PKG_SITE="http://tukaani.org/xz/" -PKG_URL="http://tukaani.org/xz/${PKG_NAME}-${PKG_VERSION}.tar.bz2" +PKG_SITE="https://tukaani.org/xz/" +PKG_URL="https://tukaani.org/xz/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A free general-purpose data compression software with high compression ratio." diff --git a/packages/compress/zip/package.mk b/packages/compress/zip/package.mk index 7f2204afd5d..d5148e33172 100644 --- a/packages/compress/zip/package.mk +++ b/packages/compress/zip/package.mk @@ -12,6 +12,7 @@ PKG_LONGDESC="A compression and file packaging utility." PKG_TOOLCHAIN="manual" make_target() { + CFLAGS+=" -DLARGE_FILE_SUPPORT" make CC=${CC} CPP=${CPP} RANLIB=${RANLIB} AR=${AR} STRIP=${STRIP} LOCAL_ZIP="${CFLAGS}" \ -f unix/Makefile generic } diff --git a/packages/compress/zstd/package.mk b/packages/compress/zstd/package.mk index 7adfcc06be4..1c583d6d365 100644 --- a/packages/compress/zstd/package.mk +++ b/packages/compress/zstd/package.mk @@ -10,7 +10,6 @@ PKG_URL="https://github.com/facebook/zstd/releases/download/v${PKG_VERSION}/${PK PKG_DEPENDS_HOST="ccache:host meson:host ninja:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A fast real-time compression algorithm." -PKG_TOOLCHAIN="meson" configure_package() { PKG_MESON_SCRIPT="${PKG_BUILD}/build/meson/meson.build" diff --git a/packages/databases/mariadb-connector-c/package.mk b/packages/databases/mariadb-connector-c/package.mk index 6774d9efb47..95aaa35afaa 100644 --- a/packages/databases/mariadb-connector-c/package.mk +++ b/packages/databases/mariadb-connector-c/package.mk @@ -2,20 +2,20 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mariadb-connector-c" -PKG_VERSION="3.2.5" -PKG_SHA256="edf1e1035c020c23874561cab3f97fd1d8ed11221c47177a1bc178eb971fd351" +PKG_VERSION="3.3.2" +PKG_SHA256="fb1a37a5bfeccc3e95bb455f5a5523c57d2c4337a204e28d1e23af5cbbe848a9" PKG_LICENSE="LGPL" PKG_SITE="https://mariadb.org/" -PKG_URL="https://github.com/MariaDB/mariadb-connector-c/archive/v${PKG_VERSION}.tar.gz" +PKG_URL="https://github.com/mariadb-corporation/mariadb-connector-c/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain zlib openssl" PKG_LONGDESC="mariadb-connector: library to conntect to mariadb/mysql database server" PKG_BUILD_FLAGS="-gold" PKG_CMAKE_OPTS_TARGET="-DWITH_EXTERNAL_ZLIB=ON - -DAUTH_CLEARTEXT=STATIC - -DAUTH_DIALOG=STATIC - -DAUTH_OLDPASSWORD=STATIC - -DREMOTEIO=OFF + -DCLIENT_PLUGIN_DIALOG=STATIC + -DCLIENT_PLUGIN_MYSQL_CLEAR_PASSWORD=STATIC + -DCLIENT_PLUGIN_MYSQL_OLD_PASSWORD=STATIC + -DCLIENT_PLUGIN_REMOTE_IO=OFF " post_makeinstall_target() { diff --git a/packages/debug/libva-utils/package.mk b/packages/debug/libva-utils/package.mk index f2102025454..45a25f607c1 100644 --- a/packages/debug/libva-utils/package.mk +++ b/packages/debug/libva-utils/package.mk @@ -8,7 +8,6 @@ PKG_LICENSE="GPL" PKG_SITE="https://github.com/01org/libva-utils" PKG_URL="https://github.com/intel/libva-utils/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Libva-utils is a collection of tests for VA-API (VIdeo Acceleration API)" -PKG_TOOLCHAIN="meson" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET="toolchain libva libdrm libX11" diff --git a/packages/debug/vadumpcaps/package.mk b/packages/debug/vadumpcaps/package.mk index 26751f70752..8d7596510d1 100644 --- a/packages/debug/vadumpcaps/package.mk +++ b/packages/debug/vadumpcaps/package.mk @@ -9,7 +9,6 @@ PKG_SITE="https://github.com/fhvwy/vadumpcaps" PKG_URL="https://github.com/fhvwy/vadumpcaps/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="This is a utility to show all capabilities of a VAAPI device/driver." PKG_DEPENDS_TARGET="toolchain libva" -PKG_TOOLCHAIN="make" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin diff --git a/packages/debug/xorg-intel-gpu-tools/package.mk b/packages/debug/xorg-intel-gpu-tools/package.mk index bafd429fa65..1f68b31e0c4 100644 --- a/packages/debug/xorg-intel-gpu-tools/package.mk +++ b/packages/debug/xorg-intel-gpu-tools/package.mk @@ -9,7 +9,6 @@ PKG_DEPENDS_TARGET="toolchain cairo procps-ng" PKG_SITE="https://gitlab.freedesktop.org/drm/igt-gpu-tools" PKG_URL="https://www.x.org/releases/individual/app/igt-gpu-tools-${PKG_VERSION}.tar.xz" PKG_LONGDESC="Test suite and tools for DRM/KMS drivers" -PKG_TOOLCHAIN="meson" PKG_MESON_OPTS_TARGET="-Dchamelium=disabled \ -Ddocs=disabled \ diff --git a/packages/devel/asn1c/package.mk b/packages/devel/asn1c/package.mk new file mode 100644 index 00000000000..1aed298d426 --- /dev/null +++ b/packages/devel/asn1c/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="asn1c" +PKG_VERSION="0.9.28" +PKG_SHA256="8007440b647ef2dd9fb73d931c33ac11764e6afb2437dbe638bb4e5fc82386b9" +PKG_LICENSE="BSD" +PKG_SITE="http://lionet.info/asn1c/blog/" +PKG_URL="https://github.com/vlm/asn1c/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" +PKG_DEPENDS_HOST="ccache:host" +PKG_LONGDESC="The ASN.1 Compiler" diff --git a/packages/devel/autoconf-archive/package.mk b/packages/devel/autoconf-archive/package.mk index 2439fab44de..34a9df8837c 100644 --- a/packages/devel/autoconf-archive/package.mk +++ b/packages/devel/autoconf-archive/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="autoconf-archive" -PKG_VERSION="2022.02.11" -PKG_SHA256="78a61b611e2eeb55a89e0398e0ce387bcaf57fe2dd53c6fe427130f777ad1e8c" +PKG_VERSION="2022.09.03" +PKG_SHA256="e07454f00d8cae7907bed42d0747798927809947684d94c37207a4d63a32f423" PKG_LICENSE="GPL" PKG_SITE="https://www.gnu.org/software/autoconf-archive/" PKG_URL="http://ftpmirror.gnu.org/autoconf-archive/${PKG_NAME}-${PKG_VERSION}.tar.xz" diff --git a/packages/devel/autoconf-archive/patches/autoconf-archive-0001-AX_CC_MAXOPT-Fix-nvhpc-case.patch b/packages/devel/autoconf-archive/patches/autoconf-archive-0001-AX_CC_MAXOPT-Fix-nvhpc-case.patch deleted file mode 100644 index 2f37723af3a..00000000000 --- a/packages/devel/autoconf-archive/patches/autoconf-archive-0001-AX_CC_MAXOPT-Fix-nvhpc-case.patch +++ /dev/null @@ -1,30 +0,0 @@ -From ecbf509871f16438d69ae157c690b7d9bedd62f0 Mon Sep 17 00:00:00 2001 -From: Rudi Heitbaum -Date: Sun, 27 Feb 2022 03:07:58 +0000 -Subject: [PATCH] AX_CC_MAXOPT: Fix nvhpc case - -Missing ;; in the ax_cv_c_compiler_vendor case statement causing -syntax error with libffi configure: - line y: syntax error near unexpected token `)' - line y: ` gnu)' - -Signed-off-by: Rudi Heitbaum ---- - m4/ax_cc_maxopt.m4 | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/m4/ax_cc_maxopt.m4 b/m4/ax_cc_maxopt.m4 -index 05218e3..58e267b 100644 ---- a/m4/ax_cc_maxopt.m4 -+++ b/m4/ax_cc_maxopt.m4 -@@ -146,6 +146,7 @@ if test "x$ac_test_CFLAGS" = "x"; then - nvhpc) - # default optimization flags for nvhpc - CFLAGS="$CFLAGS -O3" -+ ;; - - gnu) - # default optimization flags for gcc on all systems --- -2.25.1 - diff --git a/packages/devel/boost/package.mk b/packages/devel/boost/package.mk index 6838d3bc9e3..8c238f8fb9b 100644 --- a/packages/devel/boost/package.mk +++ b/packages/devel/boost/package.mk @@ -3,10 +3,10 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="boost" -PKG_VERSION="1.79.0" -PKG_SHA256="475d589d51a7f8b3ba2ba4eda022b170e562ca3b760ee922c146b6c65856ef39" +PKG_VERSION="1.80.0" +PKG_SHA256="1e19565d82e43bc59209a168f5ac899d3ba471d55c7610c677d4ccf2c9c500c0" PKG_LICENSE="OSS" -PKG_SITE="http://www.boost.org/" +PKG_SITE="https://www.boost.org/" PKG_URL="https://boostorg.jfrog.io/artifactory/main/release/${PKG_VERSION}/source/${PKG_NAME}_${PKG_VERSION//./_}.tar.bz2" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain boost:host Python3 zlib bzip2" @@ -21,7 +21,7 @@ make_host() { makeinstall_host() { mkdir -p ${TOOLCHAIN}/bin - cp bjam ${TOOLCHAIN}/bin + cp b2 ${TOOLCHAIN}/bin } pre_configure_target() { @@ -31,7 +31,7 @@ pre_configure_target() { configure_target() { sh bootstrap.sh --prefix=/usr \ - --with-bjam=${TOOLCHAIN}/bin/bjam \ + --with-bjam=${TOOLCHAIN}/bin/b2 \ --with-python=${TOOLCHAIN}/bin/python \ --with-python-root=${SYSROOT_PREFIX}/usr @@ -42,21 +42,21 @@ configure_target() { } makeinstall_target() { - ${TOOLCHAIN}/bin/bjam -d2 --ignore-site-config \ - --layout=system \ - --prefix=${SYSROOT_PREFIX}/usr \ - --toolset=gcc link=static \ - --with-chrono \ - --with-date_time \ - --with-filesystem \ - --with-iostreams \ - --with-program_options \ - --with-python \ - --with-locale \ - --with-random \ - --with-regex -sICU_PATH="${SYSROOT_PREFIX}/usr" \ - --with-serialization \ - --with-system \ - --with-thread \ - install + ${TOOLCHAIN}/bin/b2 -d2 --ignore-site-config \ + --layout=system \ + --prefix=${SYSROOT_PREFIX}/usr \ + --toolset=gcc link=static \ + --with-chrono \ + --with-date_time \ + --with-filesystem \ + --with-iostreams \ + --with-program_options \ + --with-python \ + --with-locale \ + --with-random \ + --with-regex -sICU_PATH="${SYSROOT_PREFIX}/usr" \ + --with-serialization \ + --with-system \ + --with-thread \ + install } diff --git a/packages/devel/cmake/package.mk b/packages/devel/cmake/package.mk index 03e1775a590..6e0bcf409ec 100644 --- a/packages/devel/cmake/package.mk +++ b/packages/devel/cmake/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="cmake" -PKG_VERSION="3.24.0" -PKG_SHA256="c2b61f7cdecb1576cad25f918a8f42b8685d88a832fd4b62b9e0fa32e915a658" +PKG_VERSION="3.24.2" +PKG_SHA256="0d9020f06f3ddf17fb537dc228e1a56c927ee506b486f55fe2dc19f69bf0c8db" PKG_LICENSE="BSD" PKG_SITE="https://cmake.org/" PKG_URL="https://cmake.org/files/v$(get_pkg_version_maj_min)/cmake-${PKG_VERSION}.tar.gz" diff --git a/packages/devel/flatbuffers/package.mk b/packages/devel/flatbuffers/package.mk index c4a9a95074a..4f4099df5a4 100644 --- a/packages/devel/flatbuffers/package.mk +++ b/packages/devel/flatbuffers/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="flatbuffers" -PKG_VERSION="2.0.6" -PKG_SHA256="e2dc24985a85b278dd06313481a9ca051d048f9474e0f199e372fea3ea4248c9" +PKG_VERSION="2.0.8" +PKG_SHA256="f97965a727d26386afaefff950badef2db3ab6af9afe23ed6d94bfb65f95f37e" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/google/flatbuffers" PKG_URL="https://github.com/google/flatbuffers/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/devel/fribidi/package.mk b/packages/devel/fribidi/package.mk index 00fc4ca52a6..7c858cc3fa2 100644 --- a/packages/devel/fribidi/package.mk +++ b/packages/devel/fribidi/package.mk @@ -10,7 +10,6 @@ PKG_SITE="http://fribidi.freedesktop.org/" PKG_URL="https://github.com/fribidi/fribidi/releases/download/v${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A bidirectional algorithm library." -PKG_TOOLCHAIN="meson" PKG_BUILD_FLAGS="+pic" PKG_MESON_OPTS_TARGET="-Ddeprecated=false \ diff --git a/packages/devel/glib/package.mk b/packages/devel/glib/package.mk index ad76b28c638..3e20f387051 100644 --- a/packages/devel/glib/package.mk +++ b/packages/devel/glib/package.mk @@ -11,7 +11,6 @@ PKG_URL="https://download.gnome.org/sources/glib/$(get_pkg_version_maj_min)/${PK PKG_DEPENDS_HOST="libffi:host pcre2:host Python3:host meson:host ninja:host" PKG_DEPENDS_TARGET="toolchain pcre2 zlib libffi Python3:host util-linux" PKG_LONGDESC="A library which includes support routines for C such as lists, trees, hashes, memory allocation." -PKG_TOOLCHAIN="meson" PKG_MESON_OPTS_HOST="-Ddefault_library=shared \ -Dinstalled_tests=false \ diff --git a/packages/devel/heimdal/package.mk b/packages/devel/heimdal/package.mk index bff71ff3e25..636f0aad9ed 100644 --- a/packages/devel/heimdal/package.mk +++ b/packages/devel/heimdal/package.mk @@ -3,12 +3,12 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="heimdal" -PKG_VERSION="7.7.0" -PKG_SHA256="f7d414d0914abb0e151a276b4de22cf4977fd6c28bd9ecdd990407b1138a945c" +PKG_VERSION="c0bc8beb07d9733d4c8c17d120916552fe172f50" +PKG_SHA256="601e9a772063c72b391d593df8ae5e05ec779fefdf1502b7d88fbbe016ceb4dd" PKG_LICENSE="BSD-3c" PKG_SITE="http://www.h5l.org/" -PKG_URL="https://github.com/heimdal/heimdal/archive/${PKG_NAME}-${PKG_VERSION}.tar.gz" -PKG_DEPENDS_HOST="toolchain:host Python3:host ncurses:host" +PKG_URL="https://github.com/heimdal/heimdal/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_HOST="toolchain:host Python3:host ncurses:host asn1c:host" PKG_LONGDESC="Kerberos 5, PKIX, CMS, GSS-API, SPNEGO, NTLM, Digest-MD5 and, SASL implementation." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="-parallel" diff --git a/packages/devel/heimdal/patches/0001-upstream-check-libtinfo-for-tgetent.patch b/packages/devel/heimdal/patches/0001-upstream-check-libtinfo-for-tgetent.patch deleted file mode 100644 index df80a4a8e90..00000000000 --- a/packages/devel/heimdal/patches/0001-upstream-check-libtinfo-for-tgetent.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 872222db35384f343a8a566a56a28c4eb73d38ed Mon Sep 17 00:00:00 2001 -From: Damir Franusic -Date: Sun, 9 Dec 2018 19:50:47 +0100 -Subject: [PATCH] AC_FIND_FUNC_NO_LIBS should check libtinfo for tgetent - ---- - configure.ac | 2 +- - lib/libedit/config.h.in | 3 +++ - lib/libedit/configure.ac | 3 ++- - 3 files changed, 6 insertions(+), 2 deletions(-) - -diff --git a/configure.ac b/configure.ac -index f1e8d7b15e..f98a3c555e 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -456,7 +456,7 @@ AC_FIND_FUNC_NO_LIBS(openpty, util,[ - #endif - ],[0,0,0,0,0]) - --AC_FIND_FUNC_NO_LIBS(tgetent, termcap ncurses curses,[ -+AC_FIND_FUNC_NO_LIBS(tgetent, termcap ncurses curses tinfo,[ - #ifdef HAVE_TERMCAP_H - #include - #endif -diff --git a/lib/libedit/config.h.in b/lib/libedit/config.h.in -index ba283cc39f..059e5abc6a 100644 ---- a/lib/libedit/config.h.in -+++ b/lib/libedit/config.h.in -@@ -42,6 +42,9 @@ - /* Define to 1 if you have the `ncurses' library (-lncurses). */ - #undef HAVE_LIBNCURSES - -+/* Define to 1 if you have the `tinfo' library (-ltinfo). */ -+#undef HAVE_LIBTINFO -+ - /* Define to 1 if you have the header file. */ - #undef HAVE_LIMITS_H - -diff --git a/lib/libedit/configure.ac b/lib/libedit/configure.ac -index 90c8ca57d7..89a9376b06 100644 ---- a/lib/libedit/configure.ac -+++ b/lib/libedit/configure.ac -@@ -36,7 +36,8 @@ EL_MANTYPE - - AC_CHECK_LIB(curses, tgetent,, - [AC_CHECK_LIB(ncurses, tgetent,, -- [AC_MSG_ERROR([libcurses or libncurses are required!])] )] ) -+ [AC_CHECK_LIB(tinfo, tgetent,, -+ [AC_MSG_ERROR([libcurses or libncurses are required!])] )] )] ) - - - # Checks for header files. diff --git a/packages/devel/heimdal/patches/0002-upstream-fix-configure-err-msg.patch b/packages/devel/heimdal/patches/0002-upstream-fix-configure-err-msg.patch deleted file mode 100644 index 64b203f06d6..00000000000 --- a/packages/devel/heimdal/patches/0002-upstream-fix-configure-err-msg.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 5e7bc8d8811fa401fa14adb9787504c0b460c7df Mon Sep 17 00:00:00 2001 -From: Earl Chew -Date: Wed, 20 May 2020 09:46:28 -0700 -Subject: [PATCH] [libedit/configure.ac] Refactor tgetent message to reflect - libraries searched - -Signed-off-by: Earl Chew ---- - lib/libedit/configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/libedit/configure.ac b/lib/libedit/configure.ac -index 89a9376b06..b94bafc6b9 100644 ---- a/lib/libedit/configure.ac -+++ b/lib/libedit/configure.ac -@@ -37,7 +37,7 @@ EL_MANTYPE - AC_CHECK_LIB(curses, tgetent,, - [AC_CHECK_LIB(ncurses, tgetent,, - [AC_CHECK_LIB(tinfo, tgetent,, -- [AC_MSG_ERROR([libcurses or libncurses are required!])] )] )] ) -+ [AC_MSG_ERROR([libcurses, libncurses, or tinfo are required!])] )] )] ) - - - # Checks for header files. diff --git a/packages/devel/heimdal/patches/22352b90e78e2d162b98b5ef6c84672c397be40a.patch b/packages/devel/heimdal/patches/22352b90e78e2d162b98b5ef6c84672c397be40a.patch deleted file mode 100644 index 0dcc3102620..00000000000 --- a/packages/devel/heimdal/patches/22352b90e78e2d162b98b5ef6c84672c397be40a.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 22352b90e78e2d162b98b5ef6c84672c397be40a Mon Sep 17 00:00:00 2001 -From: Lars Wendler -Date: Wed, 17 Mar 2021 17:49:18 +0100 -Subject: [PATCH] autoconf-2.70 fix - -autoconf-2.70 and newer are more strict with quoting etc. and thus generate -a broken configure file: - - configure: 20855: Syntax error: ")" unexpected (expecting "fi") - -Gentoo-bug: https://bugs.gentoo.org/776241 -Signed-off-by: Lars Wendler ---- - cf/check-var.m4 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/cf/check-var.m4 b/cf/check-var.m4 -index 2fd7bca6f0..71d6f70ca8 100644 ---- a/cf/check-var.m4 -+++ b/cf/check-var.m4 -@@ -20,7 +20,7 @@ AC_MSG_RESULT($ac_foo) - if test "$ac_foo" = yes; then - AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_[]$1), 1, - [Define if you have the `]$1[' variable.]) -- m4_ifval([$2], AC_CHECK_DECLS([$1],[],[],[$2])) -+ m4_ifval([$2], [AC_CHECK_DECLS([$1],[],[],[$2])]) - fi - ]) - diff --git a/packages/devel/heimdal/patches/c4cff6859d183a40fb35a76e2bc1ce084b3a6d67.patch b/packages/devel/heimdal/patches/c4cff6859d183a40fb35a76e2bc1ce084b3a6d67.patch deleted file mode 100644 index 826c7fb517c..00000000000 --- a/packages/devel/heimdal/patches/c4cff6859d183a40fb35a76e2bc1ce084b3a6d67.patch +++ /dev/null @@ -1,22 +0,0 @@ -From c4cff6859d183a40fb35a76e2bc1ce084b3a6d67 Mon Sep 17 00:00:00 2001 -From: Luke Howard -Date: Mon, 24 Dec 2018 02:21:32 +0000 -Subject: [PATCH] hx509: fix dependency, hxtool requires ASN.1 headers - ---- - lib/hx509/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/hx509/Makefile.am b/lib/hx509/Makefile.am -index c7ef53182d..b21d85202c 100644 ---- a/lib/hx509/Makefile.am -+++ b/lib/hx509/Makefile.am -@@ -164,7 +164,7 @@ hxtool-commands.c hxtool-commands.h: hxtool-commands.in $(SLC) - dist_hxtool_SOURCES = hxtool.c - nodist_hxtool_SOURCES = hxtool-commands.c hxtool-commands.h - --$(hxtool_OBJECTS): hxtool-commands.h hx509_err.h -+$(hxtool_OBJECTS): hxtool-commands.h $(nodist_include_HEADERS) - - hxtool_LDADD = \ - libhx509.la \ diff --git a/packages/devel/heimdal/patches/cc6a3f337bac0411d0bb1c924fd857603a258d2f.patch b/packages/devel/heimdal/patches/cc6a3f337bac0411d0bb1c924fd857603a258d2f.patch deleted file mode 100644 index 15a6161fece..00000000000 --- a/packages/devel/heimdal/patches/cc6a3f337bac0411d0bb1c924fd857603a258d2f.patch +++ /dev/null @@ -1,22 +0,0 @@ -From cc6a3f337bac0411d0bb1c924fd857603a258d2f Mon Sep 17 00:00:00 2001 -From: Nicolas Williams -Date: Tue, 17 Mar 2020 19:46:37 -0500 -Subject: [PATCH] hcrypto: Fix Makefile build race - ---- - lib/hcrypto/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/hcrypto/Makefile.am b/lib/hcrypto/Makefile.am -index 195117d174..3c6ee3ca84 100644 ---- a/lib/hcrypto/Makefile.am -+++ b/lib/hcrypto/Makefile.am -@@ -298,7 +298,7 @@ ltmsources = \ - libtommath/bn_mp_to_unsigned_bin_n.c - - --$(libhcrypto_la_OBJECTS): hcrypto-link -+$(libhcrypto_la_OBJECTS) $(test_rand_OBJECTS): hcrypto-link - - libhcrypto_la_CPPFLAGS = -DBUILD_HCRYPTO_LIB $(AM_CPPFLAGS) - diff --git a/packages/devel/heimdal/patches/yyerror-match-posix-standard.patch b/packages/devel/heimdal/patches/yyerror-match-posix-standard.patch deleted file mode 100644 index 07b84c3555a..00000000000 --- a/packages/devel/heimdal/patches/yyerror-match-posix-standard.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 79b8337d54b2d85f73eff2d033ca592447ac5fce Mon Sep 17 00:00:00 2001 -From: heitbaum -Date: Fri, 10 Sep 2021 00:28:16 +1000 -Subject: [PATCH] yyerror: update to POSIX standard - -To comply with the latest POSIX standard, in Yacc compatibility mode -(options `-y`/`--yacc`) Bison now generates prototypes for yyerror and -yylex. In some situations, this is breaking compatibility: if the user -has already declared these functions but with some differences (e.g., to -declare them as static, or to use specific attributes), the generated -parser will fail to compile. To disable these prototypes, #define yyerror -(to `yyerror`), and likewise for yylex. - -refer: https://git.savannah.gnu.org/cgit/bison.git/tree/NEWS - -GNU Bison 3.8 ---- - lib/asn1/asn1parse.y | 1 + - lib/com_err/parse.y | 5 +++-- - lib/sl/slc-lex.l | 2 +- - lib/sl/slc.h | 3 ++- - 4 files changed, 7 insertions(+), 4 deletions(-) - -diff --git a/lib/asn1/asn1parse.y b/lib/asn1/asn1parse.y -index 9d8b76f582..91b163a28b 100644 ---- a/lib/asn1/asn1parse.y -+++ b/lib/asn1/asn1parse.y -@@ -65,6 +65,7 @@ static void validate_object_set(IOSObjectSet *); - static struct constraint_spec *new_constraint_spec(enum ctype); - static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype); - void yyerror (const char *); -+#define yyerror yyerror - static struct objid *new_objid(const char *label, int value); - static void add_oid_to_tail(struct objid *, struct objid *); - static void fix_labels(Symbol *s); -diff --git a/lib/com_err/parse.y b/lib/com_err/parse.y -index 0c2e5084b5..bcb9b05204 100644 ---- a/lib/com_err/parse.y -+++ b/lib/com_err/parse.y -@@ -35,7 +35,8 @@ - #include "compile_et.h" - #include "lex.h" - --void yyerror (char *s); -+void yyerror (const char *s); -+#define yyerror yyerror - static long name2number(const char *str); - - extern char *yytext; -@@ -168,7 +169,7 @@ name2number(const char *str) - } - - void --yyerror (char *s) -+yyerror (const char *s) - { - _lex_error_message ("%s\n", s); - } -diff --git a/lib/sl/slc-lex.l b/lib/sl/slc-lex.l -index 50965bccd7..3a37302336 100644 ---- a/lib/sl/slc-lex.l -+++ b/lib/sl/slc-lex.l -@@ -78,7 +78,7 @@ error_message (const char *format, ...) - } - - void --yyerror (char *s) -+yyerror (const char *s) - { - error_message("%s\n", s); - } -diff --git a/lib/sl/slc.h b/lib/sl/slc.h -index 6e45ed2f15..e4dc2cba6b 100644 ---- a/lib/sl/slc.h -+++ b/lib/sl/slc.h -@@ -51,5 +51,6 @@ extern char *filename; - extern int error_flag; - void error_message (const char *format, ...); - int yylex(void); --void yyerror (char *s); -+void yyerror (const char *s); -+#define yyerror yyerror - extern unsigned lineno; diff --git a/packages/addons/addon-depends/ttyd-depends/json-c/package.mk b/packages/devel/json-c/package.mk similarity index 100% rename from packages/addons/addon-depends/ttyd-depends/json-c/package.mk rename to packages/devel/json-c/package.mk diff --git a/packages/devel/libfmt/package.mk b/packages/devel/libfmt/package.mk index 2cfbaa77410..aa44a352a10 100644 --- a/packages/devel/libfmt/package.mk +++ b/packages/devel/libfmt/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libfmt" -PKG_VERSION="9.0.0" -PKG_SHA256="9a1e0e9e843a356d65c7604e2c8bf9402b50fe294c355de0095ebd42fb9bd2c5" +PKG_VERSION="9.1.0" +PKG_SHA256="5dea48d1fcddc3ec571ce2058e13910a0d4a6bab4cc09a809d8b1dd1c88ae6f2" PKG_LICENSE="BSD" PKG_SITE="https://github.com/fmtlib/fmt" PKG_URL="https://github.com/fmtlib/fmt/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/devel/pcre2/package.mk b/packages/devel/pcre2/package.mk index 46521b8ec17..e8d4818413a 100644 --- a/packages/devel/pcre2/package.mk +++ b/packages/devel/pcre2/package.mk @@ -10,9 +10,18 @@ PKG_URL="https://github.com/PCRE2Project/pcre2/releases/download/pcre2-${PKG_VER PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A set of functions that implement regular expression pattern matching using the same syntax." -PKG_TOOLCHAIN="cmake" PKG_BUILD_FLAGS="+pic" +PKG_CMAKE_OPTS_HOST="-DBUILD_SHARED_LIBS=OFF \ + -DBUILD_STATIC_LIBS=ON \ + -DPCRE2_BUILD_PCRE2_8=ON \ + -DPCRE2_BUILD_PCRE2_16=ON \ + -DPCRE2_BUILD_PCRE2_32=ON \ + -DPCRE2_SUPPORT_JIT=ON \ + -DPCRE2_BUILD_TESTS=OFF \ + -DPCRE2_SUPPORT_LIBEDIT=OFF \ + -DPCRE2_SUPPORT_LIBREADLINE=OFF" + PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ -DPCRE2_BUILD_PCRE2_16=ON \ -DPCRE2_SUPPORT_LIBREADLINE=OFF \ diff --git a/packages/devel/spdlog/package.mk b/packages/devel/spdlog/package.mk index 046b3a314ce..2acc277a3ec 100644 --- a/packages/devel/spdlog/package.mk +++ b/packages/devel/spdlog/package.mk @@ -9,6 +9,9 @@ PKG_SITE="https://github.com/gabime/spdlog" PKG_URL="https://github.com/gabime/spdlog/archive/v${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libfmt" PKG_LONGDESC="Very fast, header only, C++ logging library." -PKG_TOOLCHAIN="cmake" -PKG_CMAKE_OPTS_TARGET="-DCMAKE_CXX_STANDARD=14 -DCMAKE_CXX_EXTENSIONS:BOOL=OFF -DSPDLOG_FMT_EXTERNAL=ON -DSPDLOG_BUILD_EXAMPLE=OFF -DSPDLOG_BUILD_TESTS=OFF" +PKG_CMAKE_OPTS_TARGET="-DCMAKE_CXX_STANDARD=14 \ + -DCMAKE_CXX_EXTENSIONS:BOOL=OFF \ + -DSPDLOG_FMT_EXTERNAL=ON \ + -DSPDLOG_BUILD_EXAMPLE=OFF \ + -DSPDLOG_BUILD_TESTS=OFF" diff --git a/packages/emulation/libretro-vecx/package.mk b/packages/emulation/libretro-vecx/package.mk index 4dab0a63712..97c06d876b3 100644 --- a/packages/emulation/libretro-vecx/package.mk +++ b/packages/emulation/libretro-vecx/package.mk @@ -14,6 +14,14 @@ PKG_LIBNAME="vecx_libretro.so" PKG_LIBPATH="${PKG_LIBNAME}" PKG_LIBVAR="VECX_LIB" +if [ "${OPENGLES_SUPPORT}" = "yes" ]; then + PKG_DEPENDS_TARGET+=" ${OPENGLES}" +fi + +if [ "${OPENGL_SUPPORT}" = "yes" ]; then + PKG_DEPENDS_TARGET+=" ${OPENGL}" +fi + make_target() { if [ "${OPENGL_SUPPORT}" = no ]; then HAS_GLES=1 make diff --git a/packages/graphics/assimp/package.mk b/packages/graphics/assimp/package.mk index d675181fc97..3fc59492806 100644 --- a/packages/graphics/assimp/package.mk +++ b/packages/graphics/assimp/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="assimp" -PKG_VERSION="5.2.4" -PKG_SHA256="6a4ff75dc727821f75ef529cea1c4fc0a7b5fc2e0a0b2ff2f6b7993fe6cb54ba" +PKG_VERSION="5.2.5" +PKG_SHA256="b5219e63ae31d895d60d98001ee5bb809fb2c7b2de1e7f78ceeb600063641e1a" PKG_LICENSE="BSD" PKG_SITE="https://github.com/assimp/assimp" PKG_URL="https://github.com/assimp/assimp/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/bcm2835-driver/package.mk b/packages/graphics/bcm2835-driver/package.mk index 3de558bede4..5329ba3351c 100644 --- a/packages/graphics/bcm2835-driver/package.mk +++ b/packages/graphics/bcm2835-driver/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bcm2835-driver" -PKG_VERSION="a75a129d59320b5828791ecc4c1b422fc110d3f1" -PKG_SHA256="3f6650f470613d9921c7a9c7f5f9825baa930016b905ba3f6cde920a0c256022" +PKG_VERSION="ecc243c52789f4d8e837c7300b6effb059dc18c0" +PKG_SHA256="a9c9792837e4a958681a1fb8ca54d5f4bfe4f7374a354d120177df9e379e4606" PKG_LICENSE="nonfree" PKG_SITE="http://www.broadcom.com" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.xz" diff --git a/packages/graphics/glm/package.mk b/packages/graphics/glm/package.mk index 8ec1526d34b..10db567350c 100644 --- a/packages/graphics/glm/package.mk +++ b/packages/graphics/glm/package.mk @@ -11,6 +11,16 @@ PKG_SOURCE_DIR="glm" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="OpenGL Mathematics (GLM)" +# Not needed by GLM itself, but users will need it. So instead of adding this +# to every user, put it here once. +if [ "${OPENGLES_SUPPORT}" = "yes" ]; then + PKG_DEPENDS_TARGET+=" ${OPENGLES}" +fi + +if [ "${OPENGL_SUPPORT}" = "yes" ]; then + PKG_DEPENDS_TARGET+=" ${OPENGL}" +fi + # Hack install solution until cmake install restored in upstream package makeinstall_target() { target_has_feature 32bit && PKG_VOID_SIZE=4 || PKG_VOID_SIZE=8 diff --git a/packages/graphics/harfbuzz/package.mk b/packages/graphics/harfbuzz/package.mk index 9990895c05b..69155719003 100644 --- a/packages/graphics/harfbuzz/package.mk +++ b/packages/graphics/harfbuzz/package.mk @@ -3,14 +3,13 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="harfbuzz" -PKG_VERSION="5.0.1" -PKG_SHA256="d0094299a36346b9f5540aa159b358425c022b19fcdf72165eaf94046a179166" +PKG_VERSION="5.1.0" +PKG_SHA256="2edb95db668781aaa8d60959d21be2ff80085f31b12053cdd660d9a50ce84f05" PKG_LICENSE="GPL" PKG_SITE="http://www.freedesktop.org/wiki/Software/HarfBuzz" PKG_URL="https://github.com/harfbuzz/harfbuzz/releases/download/${PKG_VERSION}/harfbuzz-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain cairo freetype glib" PKG_LONGDESC="HarfBuzz is an OpenType text shaping engine." -PKG_TOOLCHAIN="meson" PKG_MESON_OPTS_TARGET="-Dbenchmark=disabled \ -Dcairo=enabled \ diff --git a/packages/graphics/lcms2/package.mk b/packages/graphics/lcms2/package.mk index a61cbdba98e..ad1a2af4db1 100644 --- a/packages/graphics/lcms2/package.mk +++ b/packages/graphics/lcms2/package.mk @@ -10,7 +10,5 @@ PKG_URL="https://github.com/mm2/Little-CMS/releases/download/lcms${PKG_VERSION}/ PKG_DEPENDS_TARGET="toolchain tiff" PKG_LONGDESC="An small-footprint color management engine, with special focus on accuracy and performance." PKG_BUILD_FLAGS="+pic" -PKG_TOOLCHAIN="autotools" -PKG_CONFIGURE_OPTS_TARGET="--disable-shared \ - --enable-static" +PKG_MESON_OPTS_TARGET="--default-library static" diff --git a/packages/graphics/libde265/package.mk b/packages/graphics/libde265/package.mk index fc16e069161..1cefc3e079a 100644 --- a/packages/graphics/libde265/package.mk +++ b/packages/graphics/libde265/package.mk @@ -10,18 +10,8 @@ PKG_URL="https://github.com/strukturag/libde265/releases/download/v${PKG_VERSION PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Open h.265 video codec implementation." PKG_BUILD_FLAGS="+pic" -PKG_TOOLCHAIN="configure" -PKG_CONFIGURE_OPTS_TARGET="--enable-static \ - --disable-shared \ - --disable-encoder \ - --disable-sherlock265" - -pre_configure_target() { - cd .. - ./autogen.sh -} - -post_configure_target() { - libtool_remove_rpath libtool -} +PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ + -DENABLE_SDL=OFF \ + -DENABLE_DECODER=OFF \ + -DENABLE_ENCODER=OFF" diff --git a/packages/graphics/libde265/patches/libde265-0001-275-Add-CMake-option-ENABLE-SDL.patch b/packages/graphics/libde265/patches/libde265-0001-275-Add-CMake-option-ENABLE-SDL.patch new file mode 100644 index 00000000000..eca55131d03 --- /dev/null +++ b/packages/graphics/libde265/patches/libde265-0001-275-Add-CMake-option-ENABLE-SDL.patch @@ -0,0 +1,53 @@ +From 48056f2eb5ed03be0589bbe335dcdaa676604b28 Mon Sep 17 00:00:00 2001 +From: theirix +Date: Sat, 31 Oct 2020 11:57:33 +0300 +Subject: [PATCH 1/2] Add CMake option DISABLE_SDL + +--- + CMakeLists.txt | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index e9f64fe6..c836a9a9 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -20,7 +20,12 @@ include (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake) + include(GNUInstallDirs) + include(CheckFunctionExists) + +-find_package(SDL) ++option(DISABLE_SDL "Disable SDL" OFF) ++ ++if (NOT DISABLE_SDL) ++ find_package(SDL) ++endif() ++ + find_package(Threads REQUIRED) + + CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H) + +From c754a0342fe9bbd74bbb90d7244777cb6370804a Mon Sep 17 00:00:00 2001 +From: theirix +Date: Mon, 2 Nov 2020 19:03:05 +0300 +Subject: [PATCH 2/2] Use ENABLE_SDL instead of DISABLE_SDL + +--- + CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index c836a9a9..ac9d3ce8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -20,9 +20,9 @@ include (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake) + include(GNUInstallDirs) + include(CheckFunctionExists) + +-option(DISABLE_SDL "Disable SDL" OFF) ++option(ENABLE_SDL "Enable SDL" ON) + +-if (NOT DISABLE_SDL) ++if (ENABLE_SDL) + find_package(SDL) + endif() + diff --git a/packages/graphics/libde265/patches/libde265-0002-Add-CMake-option-ENABLE-ENCODER.patch b/packages/graphics/libde265/patches/libde265-0002-Add-CMake-option-ENABLE-ENCODER.patch new file mode 100644 index 00000000000..5af6f9edb8b --- /dev/null +++ b/packages/graphics/libde265/patches/libde265-0002-Add-CMake-option-ENABLE-ENCODER.patch @@ -0,0 +1,26 @@ +commit 657a6ea9161d1afe780bb46c4df0e95473353e6b +Author: Rudi Heitbaum +Date: Sun Sep 4 00:45:25 2022 +0000 + + Add CMake options ENABLE_DECODER and ENABLE_ENCODER + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ff93c52..160dbb1 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -68,6 +68,13 @@ if(MSVC) + add_definitions(-DHAVE_STDBOOL_H) + endif() + ++option(ENABLE_DECODER "Enable Decoder" ON) ++option(ENABLE_ENCODER "Enable Encoder" ON) ++ + add_subdirectory (libde265) +-add_subdirectory (dec265) +-add_subdirectory (enc265) ++if (ENABLE_DECODER) ++ add_subdirectory (dec265) ++endif() ++if (ENABLE_ENCODER) ++ add_subdirectory (enc265) ++endif() diff --git a/packages/graphics/libdrm/package.mk b/packages/graphics/libdrm/package.mk index 2ab9e86975f..c6a8bc23965 100644 --- a/packages/graphics/libdrm/package.mk +++ b/packages/graphics/libdrm/package.mk @@ -3,55 +3,57 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libdrm" -PKG_VERSION="2.4.112" -PKG_SHA256="00b07710bd09b35cd8d80eaf4f4497fe27f4becf467a9830f1f5e8324f8420ff" +PKG_VERSION="2.4.113" +PKG_SHA256="7fd7eb2967f63beb4606f22d50e277d993480d05ef75dd88a9bd8e677323e5e1" PKG_LICENSE="GPL" PKG_SITE="https://dri.freedesktop.org" PKG_URL="https://dri.freedesktop.org/libdrm/libdrm-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain libpciaccess" PKG_LONGDESC="The userspace interface library to kernel DRM services." -PKG_TOOLCHAIN="meson" get_graphicdrivers -PKG_MESON_OPTS_TARGET="-Dnouveau=false \ - -Domap=false \ - -Dexynos=false \ - -Dtegra=false \ - -Dcairo-tests=false \ - -Dman-pages=false \ - -Dvalgrind=false \ +PKG_MESON_OPTS_TARGET="-Dnouveau=disabled \ + -Domap=disabled \ + -Dexynos=disabled \ + -Dtegra=disabled \ + -Dcairo-tests=disabled \ + -Dman-pages=disabled \ + -Dvalgrind=disabled \ -Dfreedreno-kgsl=false \ -Dinstall-test-programs=true \ -Dudev=false" listcontains "${GRAPHIC_DRIVERS}" "(crocus|i915|iris)" && - PKG_MESON_OPTS_TARGET+=" -Dintel=true" || PKG_MESON_OPTS_TARGET+=" -Dintel=false" + PKG_MESON_OPTS_TARGET+=" -Dintel=enabled" || PKG_MESON_OPTS_TARGET+=" -Dintel=disabled" listcontains "${GRAPHIC_DRIVERS}" "(r300|r600|radeonsi)" && - PKG_MESON_OPTS_TARGET+=" -Dradeon=true" || PKG_MESON_OPTS_TARGET+=" -Dradeon=false" + PKG_MESON_OPTS_TARGET+=" -Dradeon=enabled" || PKG_MESON_OPTS_TARGET+=" -Dradeon=disabled" listcontains "${GRAPHIC_DRIVERS}" "radeonsi" && - PKG_MESON_OPTS_TARGET+=" -Damdgpu=true" || PKG_MESON_OPTS_TARGET+=" -Damdgpu=false" + PKG_MESON_OPTS_TARGET+=" -Damdgpu=enabled" || PKG_MESON_OPTS_TARGET+=" -Damdgpu=disabled" listcontains "${GRAPHIC_DRIVERS}" "vmware" && - PKG_MESON_OPTS_TARGET+=" -Dvmwgfx=true" || PKG_MESON_OPTS_TARGET+=" -Dvmwgfx=false" + PKG_MESON_OPTS_TARGET+=" -Dvmwgfx=enabled" || PKG_MESON_OPTS_TARGET+=" -Dvmwgfx=disabled" listcontains "${GRAPHIC_DRIVERS}" "vc4" && - PKG_MESON_OPTS_TARGET+=" -Dvc4=true" || PKG_MESON_OPTS_TARGET+=" -Dvc4=false" + PKG_MESON_OPTS_TARGET+=" -Dvc4=enabled" || PKG_MESON_OPTS_TARGET+=" -Dvc4=disabled" listcontains "${GRAPHIC_DRIVERS}" "freedreno" && - PKG_MESON_OPTS_TARGET+=" -Dfreedreno=true" || PKG_MESON_OPTS_TARGET+=" -Dfreedreno=false" + PKG_MESON_OPTS_TARGET+=" -Dfreedreno=enabled" || PKG_MESON_OPTS_TARGET+=" -Dfreedreno=disabled" listcontains "${GRAPHIC_DRIVERS}" "etnaviv" && - PKG_MESON_OPTS_TARGET+=" -Detnaviv=true" || PKG_MESON_OPTS_TARGET+=" -Detnaviv=false" + PKG_MESON_OPTS_TARGET+=" -Detnaviv=enabled" || PKG_MESON_OPTS_TARGET+=" -Detnaviv=disabled" post_makeinstall_target() { # Remove all test programs installed by install-test-programs=true except modetest - # Do not "not use" the ninja install and replace this with a simple "cp modetest" - # as ninja strips the unnecessary build rpath during the install. - safe_remove ${INSTALL}/usr/bin/drmdevice - safe_remove ${INSTALL}/usr/bin/modeprint - safe_remove ${INSTALL}/usr/bin/proptest - safe_remove ${INSTALL}/usr/bin/vbltest + for PKG_LIBDRM_TEST in \ + drmdevice modeprint proptest vbltest + do + safe_remove ${INSTALL}/usr/bin/${PKG_LIBDRM_TEST} + done + + if listcontains "${GRAPHIC_DRIVERS}" "radeonsi"; then + safe_remove ${INSTALL}/usr/bin/amdgpu_stress + fi } diff --git a/packages/graphics/libglvnd/package.mk b/packages/graphics/libglvnd/package.mk index f329a0bf5ba..96479e6a49d 100644 --- a/packages/graphics/libglvnd/package.mk +++ b/packages/graphics/libglvnd/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libglvnd" -PKG_VERSION="1.4.0" -PKG_SHA256="1eb5c2be8d213ad5d31cfb4efbb331d42f3d9f5617c885ce7e89f572ec2bb4b8" +PKG_VERSION="1.5.0" +PKG_SHA256="abdf8229c86358f651e35bdc7cfced0fdf67d0a2acdf9197d08a9732ef7b53bc" PKG_LICENSE="GPL" PKG_SITE="https://github.com/NVIDIA/libglvnd" PKG_URL="https://github.com/NVIDIA/libglvnd/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/libheif/package.mk b/packages/graphics/libheif/package.mk index c65d7ad9754..d8328e88076 100644 --- a/packages/graphics/libheif/package.mk +++ b/packages/graphics/libheif/package.mk @@ -2,21 +2,17 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libheif" -PKG_VERSION="1.12.0" -PKG_SHA256="e1ac2abb354fdc8ccdca71363ebad7503ad731c84022cf460837f0839e171718" +PKG_VERSION="1.13.0" +PKG_SHA256="c20ae01bace39e89298f6352f1ff4a54b415b33b9743902da798e8a1e51d7ca1" PKG_LICENSE="LGPLv3" -PKG_SITE="http://www.libde265.org" +PKG_SITE="https://www.libde265.org" PKG_URL="https://github.com/strukturag/libheif/releases/download/v${PKG_VERSION}/libheif-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libde265 libjpeg-turbo libpng" PKG_LONGDESC="A HEIF file format decoder and encoder." PKG_BUILD_FLAGS="+pic" -PKG_TOOLCHAIN="configure" -PKG_CONFIGURE_OPTS_TARGET="--enable-static \ - --disable-shared \ - --disable-go \ - --disable-examples \ - --disable-tests" +PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ + -DWITH_EXAMPLES=OFF" pre_configure_target() { export CXXFLAGS="${CXXFLAGS} -Wno-unused-variable" diff --git a/packages/graphics/libjpeg-turbo/package.mk b/packages/graphics/libjpeg-turbo/package.mk index 49a3a6e6421..642882ebed9 100644 --- a/packages/graphics/libjpeg-turbo/package.mk +++ b/packages/graphics/libjpeg-turbo/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libjpeg-turbo" -PKG_VERSION="2.1.3" -PKG_SHA256="dbda0c685942aa3ea908496592491e5ec8160d2cf1ec9d5fd5470e50768e7859" +PKG_VERSION="2.1.4" +PKG_SHA256="a78b05c0d8427a90eb5b4eb08af25309770c8379592bb0b8a863373128e6143f" PKG_LICENSE="GPL" PKG_SITE="https://libjpeg-turbo.org/" PKG_URL="https://github.com/libjpeg-turbo/libjpeg-turbo/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/mesa/package.mk b/packages/graphics/mesa/package.mk index 9d08cce2421..81a79449eb9 100644 --- a/packages/graphics/mesa/package.mk +++ b/packages/graphics/mesa/package.mk @@ -3,14 +3,13 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mesa" -PKG_VERSION="22.1.6" -PKG_SHA256="22ced061eb9adab8ea35368246c1995c09723f3f71653cd5050c5cec376e671a" +PKG_VERSION="22.1.7" +PKG_SHA256="da838eb2cf11d0e08d0e9944f6bd4d96987fdc59ea2856f8c70a31a82b355d89" PKG_LICENSE="OSS" PKG_SITE="http://www.mesa3d.org/" PKG_URL="https://mesa.freedesktop.org/archive/mesa-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain expat libdrm Mako:host" PKG_LONGDESC="Mesa is a 3-D graphics library with an API." -PKG_TOOLCHAIN="meson" get_graphicdrivers diff --git a/packages/graphics/tiff/package.mk b/packages/graphics/tiff/package.mk index 20022e25170..914b1f45cd9 100644 --- a/packages/graphics/tiff/package.mk +++ b/packages/graphics/tiff/package.mk @@ -10,21 +10,17 @@ PKG_SITE="http://www.remotesensing.org/libtiff/" PKG_URL="http://download.osgeo.org/libtiff/${PKG_NAME}-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libjpeg-turbo zlib" PKG_LONGDESC="libtiff is a library for reading and writing TIFF files." -PKG_BUILD_FLAGS="+pic" -PKG_TOOLCHAIN="configure" +PKG_BUILD_FLAGS="+pic -gold" -PKG_CONFIGURE_OPTS_TARGET="--enable-static \ - --disable-shared \ - --disable-mdi \ - --disable-jbig \ - --disable-lzma \ - --disable-zstd \ - --disable-webp \ - --enable-cxx \ - --with-jpeg-lib-dir=${SYSROOT_PREFIX}/usr/lib \ - --with-jpeg-include-dir=${SYSROOT_PREFIX}/usr/include \ - --without-x" - -post_makeinstall_target() { - rm -rf ${INSTALL}/usr/bin -} +PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ + -Dtiff-tools=OFF \ + -Dtiff-tests=OFF \ + -Dtiff-contrib=OFF \ + -Dtiff-docs=OFF \ + -Dmdi=OFF \ + -Djbig=OFF \ + -Dlzma=OFF \ + -Dzstd=OFF \ + -Dwebp=OFF \ + -Dcxx=ON \ + -Djpeg=ON" diff --git a/packages/graphics/tiff/patches/tiff-0001-only-build-library.patch b/packages/graphics/tiff/patches/tiff-0001-only-build-library.patch new file mode 100644 index 00000000000..688a913aeec --- /dev/null +++ b/packages/graphics/tiff/patches/tiff-0001-only-build-library.patch @@ -0,0 +1,70 @@ +From 1ab0e2696a368a556b793a0941b5365e4d9f56ef Mon Sep 17 00:00:00 2001 +From: Roger Leigh +Date: Sun, 29 May 2022 11:18:42 +0100 +Subject: [PATCH] Add options for disabling tools, tests, contrib and docs + +--- + CMakeLists.txt | 33 +++++++++++++++++++++------ + 1 files changed + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 770b0fac..d1dd275e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -42,10 +42,16 @@ message(STATUS "libtiff build date: ${BUILD_DATE}") + + set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries") + ++option(tiff-tools "build TIFF tools" ON) ++option(tiff-tests "build TIFF tests" ON) ++option(tiff-contrib "build TIFF contrib" ON) ++option(tiff-docs "build TIFF documentation" ON) ++option(tiff-deprecated "build TIFF deprecated features" OFF) + + # Disable deprecated features to ensure clean build +-add_definitions(-DTIFF_DISABLE_DEPRECATED) +- ++if (tiff-deprecated) ++ add_definitions(-DTIFF_DISABLE_DEPRECATED) ++endif() + + # Project definition + set(CMAKE_C_STANDARD 99) +@@ -135,12 +141,20 @@ include(Release) + # Process subdirectories + add_subdirectory(port) + add_subdirectory(libtiff) +-add_subdirectory(tools) +-add_subdirectory(test) +-add_subdirectory(contrib) ++if(tiff-tools) ++ add_subdirectory(tools) ++endif() ++if(tiff-tests) ++ add_subdirectory(test) ++endif() ++if(tiff-contrib) ++ add_subdirectory(contrib) ++endif() + add_subdirectory(build) +-add_subdirectory(man) +-add_subdirectory(html) ++if(tiff-docs) ++ add_subdirectory(man) ++ add_subdirectory(html) ++endif() + + # pkg-config support + include(PkgConfig) +@@ -153,6 +167,11 @@ message(STATUS " Documentation directory: ${LIBTIFF_DOCDIR}") + message(STATUS " C compiler: ${CMAKE_C_COMPILER}") + message(STATUS " C++ compiler: ${CMAKE_CXX_COMPILER}") + message(STATUS " Build shared libraries: ${BUILD_SHARED_LIBS}") ++message(STATUS " Build tools: ${tiff-tools}") ++message(STATUS " Build tests: ${tiff-tests}") ++message(STATUS " Build contrib: ${tiff-contrib}") ++message(STATUS " Build docs: ${tiff-docs}") ++message(STATUS " Build deprecated features: ${tiff-deprecated}") + message(STATUS " Enable linker symbol versioning: ${HAVE_LD_VERSION_SCRIPT}") + message(STATUS " Support Microsoft Document Imaging: ${mdi}") + message(STATUS " Use win32 IO: ${USE_WIN32_FILEIO}") diff --git a/packages/graphics/vulkan/glslang/package.mk b/packages/graphics/vulkan/glslang/package.mk index fa4e1bff0b5..d8c5cc139af 100644 --- a/packages/graphics/vulkan/glslang/package.mk +++ b/packages/graphics/vulkan/glslang/package.mk @@ -3,11 +3,11 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="glslang" -# The SPIRV-Tools & SPIRV-Headers have to be specific versions matching the pkg version +# The SPIRV-Tools & SPIRV-Headers pkg_version/s need to match the compatible (known_good) glslang pkg_version. # https://raw.githubusercontent.com/KhronosGroup/glslang/${PKG_VERSION}/known_good.json -# if you update glslang make sure spirv-tools & spirv-headers versions a known good -PKG_VERSION="11.10.0" -PKG_SHA256="8ffc19c435232d09299dd2c91e247292b3508c1b826a3497c60682e4bbf2d602" +# When updating glslang pkg_version please update to the known_good spirv-tools & spirv-headers pkg_version/s. +PKG_VERSION="11.11.0" +PKG_SHA256="26c216c3062512c018cbdd752224b8dad703b7e5bb90bf338ba2dbb5d4f11438" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/glslang" PKG_URL="https://github.com/KhronosGroup/glslang/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/vulkan/spirv-headers/package.mk b/packages/graphics/vulkan/spirv-headers/package.mk index 86c52ba35c0..dbe000a0ad1 100644 --- a/packages/graphics/vulkan/spirv-headers/package.mk +++ b/packages/graphics/vulkan/spirv-headers/package.mk @@ -3,11 +3,11 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="spirv-headers" -# The SPIRV-Headers have to be specific versions matching the glslang pkg version -# https://github.com/KhronosGroup/glslang/blob/11.10.0/known_good.json -# if you update glslang make sure spirv-tools & spirv-headers versions a known good -PKG_VERSION="5a121866927a16ab9d49bed4788b532c7fcea766" -PKG_SHA256="ec8ecb471a62672697846c436501638ab25447ae9d4a6761e0bfe8a9a839502a" +# The SPIRV-Headers pkg_version needs to match the compatible (known_good) glslang pkg_version. +# https://raw.githubusercontent.com/KhronosGroup/glslang/${PKG_VERSION}/known_good.json +# When updating glslang pkg_version please update to the known_good spirv-headers pkg_version. +PKG_VERSION="b2a156e1c0434bc8c99aaebba1c7be98be7ac580" +PKG_SHA256="b200990e1c07894906e298368e7e56d5ab9d728d851f9292587ec740c2b4d409" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/SPIRV-headers" PKG_URL="https://github.com/KhronosGroup/SPIRV-headers/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/vulkan/spirv-tools/package.mk b/packages/graphics/vulkan/spirv-tools/package.mk index 91dd65e6217..9040f57075d 100644 --- a/packages/graphics/vulkan/spirv-tools/package.mk +++ b/packages/graphics/vulkan/spirv-tools/package.mk @@ -3,11 +3,11 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="spirv-tools" -# The SPIRV-Tools have to be specific versions matching the glslang pkg version -# https://github.com/KhronosGroup/glslang/blob/11.10.0/known_good.json -# if you update glslang make sure spirv-tools & spirv-headers versions a known good -PKG_VERSION="b930e734ea198b7aabbbf04ee1562cf6f57962f0" -PKG_SHA256="9cddc845f99d7daa65940ff9deb6754cd71b67987ec9860bb0ef2af8a8732c84" +# The SPIRV-Tools pkg_version needs to match the compatible (known_good) glslang pkg_version. +# https://raw.githubusercontent.com/KhronosGroup/glslang/${PKG_VERSION}/known_good.json +# When updating glslang pkg_version please update to the known_good spirv-tools pkg_version. +PKG_VERSION="5e61ea2098220059e89523f1f47b0bcd8c33b89a" +PKG_SHA256="527f51a40396a283a4fbff1af22e17ce7457f9af17e9d738b9e559c1a7e5c6de" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/SPIRV-Tools" PKG_URL="https://github.com/KhronosGroup/SPIRV-Tools/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/vulkan/vkmark/package.mk b/packages/graphics/vulkan/vkmark/package.mk index b744de8ee25..884a9d8eded 100644 --- a/packages/graphics/vulkan/vkmark/package.mk +++ b/packages/graphics/vulkan/vkmark/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2022-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vkmark" -PKG_VERSION="d872846e2e7c47010c11227eb713d00ccfdd35c6" -PKG_SHA256="3b03785c9952d5f1ebad6c08349d8697814ad6724f81c05891afabb59f54bf22" +PKG_VERSION="30d2cd37f0566589d90914501fc7c51a4e51f559" +PKG_SHA256="6a2ab6a9c58b4bd11eb0235a8e31b10b3d0cbcd5c64b799d342572936a717745" PKG_LICENSE="LGPL-2.1-or-later" PKG_SITE="https://github.com/vkmark/vkmark" PKG_URL="https://github.com/vkmark/vkmark/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/vulkan/vkmark/patches/vkmark-999.01-PR47-drop-the-vkCreateDmaBufImageINTEL-extension.patch b/packages/graphics/vulkan/vkmark/patches/vkmark-999.01-PR47-drop-the-vkCreateDmaBufImageINTEL-extension.patch new file mode 100644 index 00000000000..ab1f7890633 --- /dev/null +++ b/packages/graphics/vulkan/vkmark/patches/vkmark-999.01-PR47-drop-the-vkCreateDmaBufImageINTEL-extension.patch @@ -0,0 +1,542 @@ +From 51c7eb0c8c1cd4872eec176775276cca3565a0a6 Mon Sep 17 00:00:00 2001 +From: Alexandros Frantzis +Date: Fri, 9 Sep 2022 18:32:03 +0300 +Subject: [PATCH 1/4] github: Build with both ubuntu-20.04 and ubuntu-22.04 in + CI + +--- + .github/workflows/build.yml | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml +index fbb5682..b60ad80 100644 +--- a/.github/workflows/build.yml ++++ b/.github/workflows/build.yml +@@ -10,7 +10,10 @@ on: + + jobs: + build: +- runs-on: ubuntu-latest ++ strategy: ++ matrix: ++ os: [ubuntu-20.04, ubuntu-22.04] ++ runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v1 + - name: Install dependencies + +From 7bbe275e49045237f2cdbc2f441a394b562b0aa5 Mon Sep 17 00:00:00 2001 +From: Alexandros Frantzis +Date: Fri, 9 Sep 2022 18:08:12 +0300 +Subject: [PATCH 2/4] core: Improve log message consistency + +--- + src/vulkan_state.cpp | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/src/vulkan_state.cpp b/src/vulkan_state.cpp +index 6f50673..fbd789c 100644 +--- a/src/vulkan_state.cpp ++++ b/src/vulkan_state.cpp +@@ -44,7 +44,7 @@ std::vector VulkanState::available_devices(VulkanWSI& vulkan + { + if (!vulkan_wsi.is_physical_device_supported(*it_device)) + { +- Log::debug("device with uuid %s is not supported by window system integration layer", ++ Log::debug("Device with uuid %s is not supported by window system integration layer\n", + static_cast(it_device->getProperties().pipelineCacheUUID).representation().data()); + it_device = available_devices.erase(it_device); + } +@@ -193,17 +193,17 @@ void VulkanState::create_command_pool() + + vk::PhysicalDevice ChooseFirstSupportedStrategy::operator()(const std::vector& available_devices) + { +- Log::debug("Trying to use first supported device.\n"); ++ Log::debug("Trying to use first supported device\n"); + + for (auto const& physical_device : available_devices) + { + if (find_queue_family_index(physical_device, vk::QueueFlagBits::eGraphics).second) + { +- Log::debug("First supported device choosen!\n"); ++ Log::debug("First supported device chosen\n"); + return physical_device; + } + +- Log::debug("device with uuid %s skipped!\n", ++ Log::debug("Device with uuid %s skipped\n", + static_cast(physical_device.getProperties().pipelineCacheUUID).representation().data() + ); + } +@@ -213,7 +213,7 @@ vk::PhysicalDevice ChooseFirstSupportedStrategy::operator()(const std::vector& available_devices) + { +- Log::debug("Trying to use device with specified UUID %s.\n", ++ Log::debug("Trying to use device with specified UUID %s\n", + m_selected_device_uuid.representation().data()); + + for (auto const& physical_device: available_devices) +@@ -227,5 +227,5 @@ vk::PhysicalDevice ChooseByUUIDStrategy::operator()(const std::vector +Date: Fri, 9 Sep 2022 17:48:44 +0300 +Subject: [PATCH 3/4] core,ws: Allow WSI backends to request device extensions + +The backends were able to request instance extensions, support +requesting device extensions, too. +--- + src/vulkan_state.cpp | 5 ++--- + src/vulkan_wsi.h | 8 +++++++- + src/ws/kms_window_system.cpp | 2 +- + src/ws/kms_window_system.h | 2 +- + src/ws/native_system.h | 2 +- + src/ws/swapchain_window_system.cpp | 4 ++-- + src/ws/swapchain_window_system.h | 2 +- + src/ws/wayland_native_system.cpp | 2 +- + src/ws/wayland_native_system.h | 2 +- + src/ws/xcb_native_system.cpp | 2 +- + src/ws/xcb_native_system.h | 2 +- + tests/null_window_system.h | 2 +- + tests/test_window_system_plugin.cpp | 2 +- + tests/window_system_loader_test.cpp | 2 +- + 14 files changed, 22 insertions(+), 17 deletions(-) + +diff --git a/src/vulkan_state.cpp b/src/vulkan_state.cpp +index fbd789c..b1973ed 100644 +--- a/src/vulkan_state.cpp ++++ b/src/vulkan_state.cpp +@@ -87,7 +87,7 @@ void VulkanState::create_instance(VulkanWSI& vulkan_wsi) + auto const app_info = vk::ApplicationInfo{} + .setPApplicationName("vkmark"); + +- std::vector enabled_extensions{vulkan_wsi.vulkan_extensions()}; ++ std::vector enabled_extensions{vulkan_wsi.required_extensions().instance}; + enabled_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); + + auto const create_info = vk::InstanceCreateInfo{} +@@ -159,8 +159,7 @@ void VulkanState::create_logical_device(VulkanWSI& vulkan_wsi) + Log::debug("VulkanState: Using queue family index %d for rendering\n", + graphics_queue_family_index()); + +- std::array enabled_extensions{ +- {VK_KHR_SWAPCHAIN_EXTENSION_NAME}}; ++ std::vector enabled_extensions{vulkan_wsi.required_extensions().device}; + + auto const device_features = vk::PhysicalDeviceFeatures{} + .setSamplerAnisotropy(true); +diff --git a/src/vulkan_wsi.h b/src/vulkan_wsi.h +index f8c50eb..22e87f1 100644 +--- a/src/vulkan_wsi.h ++++ b/src/vulkan_wsi.h +@@ -32,7 +32,13 @@ class VulkanWSI + public: + virtual ~VulkanWSI() = default; + +- virtual std::vector vulkan_extensions() = 0; ++ struct Extensions ++ { ++ std::vector instance; ++ std::vector device; ++ }; ++ ++ virtual Extensions required_extensions() = 0; + virtual bool is_physical_device_supported(vk::PhysicalDevice const& pd) = 0; + virtual std::vector physical_device_queue_family_indices( + vk::PhysicalDevice const& pd) = 0; +diff --git a/src/ws/kms_window_system.cpp b/src/ws/kms_window_system.cpp +index ca8220f..6132e64 100644 +--- a/src/ws/kms_window_system.cpp ++++ b/src/ws/kms_window_system.cpp +@@ -533,7 +533,7 @@ void KMSWindowSystem::wait_for_drm_page_flip_event() + } + } + +-std::vector KMSWindowSystem::vulkan_extensions() ++VulkanWSI::Extensions KMSWindowSystem::required_extensions() + { + return {}; + } +diff --git a/src/ws/kms_window_system.h b/src/ws/kms_window_system.h +index 4389ef7..20a067f 100644 +--- a/src/ws/kms_window_system.h ++++ b/src/ws/kms_window_system.h +@@ -61,7 +61,7 @@ class KMSWindowSystem : public WindowSystem, public VulkanWSI + bool should_quit() override; + + // VulkanWSI +- std::vector vulkan_extensions() override; ++ Extensions required_extensions() override; + bool is_physical_device_supported(vk::PhysicalDevice const& pd) override; + std::vector physical_device_queue_family_indices( + vk::PhysicalDevice const& pd) override; +diff --git a/src/ws/native_system.h b/src/ws/native_system.h +index 076948e..cbe073a 100644 +--- a/src/ws/native_system.h ++++ b/src/ws/native_system.h +@@ -34,7 +34,7 @@ class NativeSystem + public: + virtual ~NativeSystem() = default; + +- virtual std::vector vulkan_extensions() = 0; ++ virtual std::vector instance_extensions() = 0; + virtual uint32_t get_presentation_queue_family_index(vk::PhysicalDevice const& pd) = 0; + virtual bool should_quit() = 0; + virtual vk::Extent2D get_vk_extent() = 0; +diff --git a/src/ws/swapchain_window_system.cpp b/src/ws/swapchain_window_system.cpp +index d38fa6b..9f9fba3 100644 +--- a/src/ws/swapchain_window_system.cpp ++++ b/src/ws/swapchain_window_system.cpp +@@ -251,9 +251,9 @@ ManagedResource SwapchainWindowSystem::create_vk_swapchain() + [this] (auto& s) { vulkan->device().destroySwapchainKHR(s); }}; + } + +-std::vector SwapchainWindowSystem::vulkan_extensions() ++VulkanWSI::Extensions SwapchainWindowSystem::required_extensions() + { +- return native->vulkan_extensions(); ++ return {native->instance_extensions(), {VK_KHR_SWAPCHAIN_EXTENSION_NAME}}; + } + + bool SwapchainWindowSystem::is_physical_device_supported(vk::PhysicalDevice const& pd) +diff --git a/src/ws/swapchain_window_system.h b/src/ws/swapchain_window_system.h +index c3b2780..412b924 100644 +--- a/src/ws/swapchain_window_system.h ++++ b/src/ws/swapchain_window_system.h +@@ -51,7 +51,7 @@ class SwapchainWindowSystem : public WindowSystem, public VulkanWSI + bool should_quit() override; + + // VulkanWSI +- std::vector vulkan_extensions() override; ++ Extensions required_extensions() override; + bool is_physical_device_supported(vk::PhysicalDevice const& pd) override; + std::vector physical_device_queue_family_indices( + vk::PhysicalDevice const& pd) override; +diff --git a/src/ws/wayland_native_system.cpp b/src/ws/wayland_native_system.cpp +index 642d8fe..816a7b9 100644 +--- a/src/ws/wayland_native_system.cpp ++++ b/src/ws/wayland_native_system.cpp +@@ -145,7 +145,7 @@ WaylandNativeSystem::WaylandNativeSystem(int width, int height) + create_native_window(); + } + +-std::vector WaylandNativeSystem::vulkan_extensions() ++std::vector WaylandNativeSystem::instance_extensions() + { + return {VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME}; + } +diff --git a/src/ws/wayland_native_system.h b/src/ws/wayland_native_system.h +index 400c358..01cdbaa 100644 +--- a/src/ws/wayland_native_system.h ++++ b/src/ws/wayland_native_system.h +@@ -35,7 +35,7 @@ class WaylandNativeSystem : public NativeSystem + public: + WaylandNativeSystem(int width, int height); + +- std::vector vulkan_extensions() override; ++ std::vector instance_extensions() override; + uint32_t get_presentation_queue_family_index(vk::PhysicalDevice const& pd) override; + bool should_quit() override; + vk::Extent2D get_vk_extent() override; +diff --git a/src/ws/xcb_native_system.cpp b/src/ws/xcb_native_system.cpp +index 59c84f0..b683772 100644 +--- a/src/ws/xcb_native_system.cpp ++++ b/src/ws/xcb_native_system.cpp +@@ -47,7 +47,7 @@ XcbNativeSystem::~XcbNativeSystem() + xcb_disconnect(connection); + } + +-std::vector XcbNativeSystem::vulkan_extensions() ++std::vector XcbNativeSystem::instance_extensions() + { + return {VK_KHR_XCB_SURFACE_EXTENSION_NAME}; + } +diff --git a/src/ws/xcb_native_system.h b/src/ws/xcb_native_system.h +index 7fcc44a..dadc32f 100644 +--- a/src/ws/xcb_native_system.h ++++ b/src/ws/xcb_native_system.h +@@ -35,7 +35,7 @@ class XcbNativeSystem : public NativeSystem + XcbNativeSystem(int width, int height, xcb_visualid_t visual_id); + ~XcbNativeSystem(); + +- std::vector vulkan_extensions() override; ++ std::vector instance_extensions() override; + uint32_t get_presentation_queue_family_index(vk::PhysicalDevice const& pd) override; + bool should_quit() override; + vk::Extent2D get_vk_extent() override; +diff --git a/tests/null_window_system.h b/tests/null_window_system.h +index bc01276..b7cc9ba 100644 +--- a/tests/null_window_system.h ++++ b/tests/null_window_system.h +@@ -39,7 +39,7 @@ class NullWindowSystem : public WindowSystem, public VulkanWSI + + bool should_quit() override { return false; } + +- std::vector vulkan_extensions() override { return {}; } ++ Extensions required_extensions() override { return {}; } + bool is_physical_device_supported(vk::PhysicalDevice const&) override { return true; } + std::vector physical_device_queue_family_indices( + vk::PhysicalDevice const&) override +diff --git a/tests/test_window_system_plugin.cpp b/tests/test_window_system_plugin.cpp +index 7877c8e..a562958 100644 +--- a/tests/test_window_system_plugin.cpp ++++ b/tests/test_window_system_plugin.cpp +@@ -32,7 +32,7 @@ class TestWindowSystem : public NullWindowSystem + { + public: + TestWindowSystem(std::string const& id) : id{id} {} +- std::vector vulkan_extensions() override { return {id.c_str()}; } ++ Extensions required_extensions() override { return {{id.c_str()}, {}}; } + + private: + std::string const id; +diff --git a/tests/window_system_loader_test.cpp b/tests/window_system_loader_test.cpp +index 8aed335..c458e61 100644 +--- a/tests/window_system_loader_test.cpp ++++ b/tests/window_system_loader_test.cpp +@@ -84,7 +84,7 @@ class TestWindowSystems + + int window_system_id(WindowSystem& ws) + { +- return std::stoi(ws.vulkan_wsi().vulkan_extensions()[0]); ++ return std::stoi(ws.vulkan_wsi().required_extensions().instance[0]); + } + + } + +From dd75130a7ddf747eb7fd755946e84baf98a6e05f Mon Sep 17 00:00:00 2001 +From: Alexandros Frantzis +Date: Fri, 9 Sep 2022 16:23:40 +0300 +Subject: [PATCH 4/4] kms: Use VK_EXT_external_memory_dmabuf to create + dmabuf-backed Vulkan images + +Drop the vkCreateDmaBufImageINTEL extension function and use the +functionality provided by the official VK_EXT_external_memory_dmabuf +extension to create dmabuf-backed Vulkan images. + +Fixes #33 + +Co-authored-by: Jeffy Chen +--- + meson.build | 7 +- + src/ws/kms_window_system.cpp | 132 +++++++++++++++++++++++------------ + 2 files changed, 89 insertions(+), 50 deletions(-) + +diff --git a/meson.build b/meson.build +index 7d305dc..0d83918 100644 +--- a/meson.build ++++ b/meson.build +@@ -32,16 +32,11 @@ wayland_protocols_dep = dependency('wayland-protocols', version : '>= 1.12', + wayland_scanner_dep = dependency('wayland-scanner', required : get_option('wayland') == 'true') + libdrm_dep = dependency('libdrm', required : get_option('kms') == 'true') + gbm_dep = dependency('gbm', required : get_option('kms') == 'true') +-has_vulkan_intel_header = cpp.has_header('vulkan/vulkan_intel.h', dependencies: vulkan_dep) +- +-if get_option('kms') == 'true' and not has_vulkan_intel_header +- error('KMS plugin needs the vulkan_intel.h header, but it couldn\'t be found') +-endif + + build_xcb_ws = xcb_dep.found() and xcb_icccm_dep.found() and get_option('xcb') != 'false' + build_wayland_ws = (wayland_client_dep.found() and wayland_protocols_dep.found() and + wayland_scanner_dep.found() and get_option('wayland') != 'false') +-build_kms_ws = libdrm_dep.found() and gbm_dep.found() and has_vulkan_intel_header and get_option('kms') != 'false' ++build_kms_ws = libdrm_dep.found() and gbm_dep.found() and get_option('kms') != 'false' + + if not build_xcb_ws and not build_wayland_ws and not build_kms_ws + error('vkmark needs at least one winsys to work - xcb, wayland or kms') +diff --git a/src/ws/kms_window_system.cpp b/src/ws/kms_window_system.cpp +index 6132e64..fc02eae 100644 +--- a/src/ws/kms_window_system.cpp ++++ b/src/ws/kms_window_system.cpp +@@ -29,8 +29,8 @@ + + #include + #include +-#include + ++#include + #include + #include + #include +@@ -270,6 +270,24 @@ void restore_vt(int) + global_vt_state->restore(); + } + ++uint32_t find_memory_type_index(vk::PhysicalDevice const& physical_device, ++ vk::MemoryRequirements const& requirements, ++ vk::MemoryPropertyFlags flags) ++{ ++ auto const properties = physical_device.getMemoryProperties(); ++ ++ for (uint32_t i = 0; i < properties.memoryTypeCount; i++) ++ { ++ if ((requirements.memoryTypeBits & (1 << i)) && ++ (properties.memoryTypes[i].propertyFlags & flags) == flags) ++ { ++ return i; ++ } ++ } ++ ++ throw std::runtime_error{"Coudn't find matching memory type"}; ++} ++ + } + + VTState::VTState() +@@ -433,14 +451,20 @@ void KMSWindowSystem::create_drm_fbs() + for (auto const& gbm_bo : gbm_bos) + { + uint32_t fb = 0; ++ uint32_t handles[4] = {0}; ++ uint32_t strides[4] = {0}; ++ uint32_t offsets[4] = {0}; + +- uint32_t handles[4] = {gbm_bo_get_handle(gbm_bo).u32, 0, 0, 0}; +- uint32_t strides[4] = {gbm_bo_get_stride(gbm_bo), 0, 0, 0}; +- uint32_t offsets[4] = {0, 0, 0, 0}; ++ for (auto i = 0; i < gbm_bo_get_plane_count(gbm_bo); i++) ++ { ++ handles[i] = gbm_bo_get_handle_for_plane(gbm_bo, i).u32; ++ offsets[i] = gbm_bo_get_offset(gbm_bo, i); ++ strides[i] = gbm_bo_get_stride_for_plane(gbm_bo, i); ++ } + + auto const ret = drmModeAddFB2( + drm_fd, vk_extent.width, vk_extent.height, +- DRM_FORMAT_XRGB8888, ++ gbm_bo_get_format(gbm_bo), + handles, strides, offsets, &fb, 0); + + if (ret < 0) +@@ -453,52 +477,65 @@ void KMSWindowSystem::create_drm_fbs() + } + } + +-// TODO: Use an official extension to create the VkImages when it becomes +-// available (e.g. VK_MESAX_external_image_dma_buf) + void KMSWindowSystem::create_vk_images() + { +- auto const create_dma_buf_image = +- reinterpret_cast( +- vulkan->device().getProcAddr("vkCreateDmaBufImageINTEL")); +- +- if (!create_dma_buf_image) +- throw std::runtime_error{"Failed to get vkCreateDmaBufImageINTEL function pointer"}; +- + for (auto const& gbm_bo : gbm_bos) + { + auto const fd = ManagedResource{gbm_bo_get_fd(gbm_bo), close}; +- auto const stride = gbm_bo_get_stride(gbm_bo); +- +- VkDmaBufImageCreateInfo create_info{}; +- create_info.sType = static_cast(VK_STRUCTURE_TYPE_DMA_BUF_IMAGE_CREATE_INFO_INTEL); +- create_info.fd = fd; +- create_info.format = static_cast(vk_image_format); +- create_info.extent = {vk_extent.width, vk_extent.height, 1}; +- create_info.strideInBytes = stride; +- +- VkImage image; +- VkDeviceMemory device_memory; +- +- VkResult result = create_dma_buf_image( +- vulkan->device(), +- &create_info, +- nullptr, +- &device_memory, +- &image); +- +- if (result != VK_SUCCESS) +- { +- vk::throwResultException(static_cast(result), +- "vkCreateDmbBufImageINTEL"); +- } ++ uint64_t modifier = gbm_bo_get_modifier(gbm_bo); ++ ++ auto const modifier_info = vk::ImageDrmFormatModifierListCreateInfoEXT{} ++ .setDrmFormatModifierCount(1) ++ .setPDrmFormatModifiers(&modifier); ++ auto const external_memory_create_info = vk::ExternalMemoryImageCreateInfoKHR{} ++ .setHandleTypes(vk::ExternalMemoryHandleTypeFlagBitsKHR::eDmaBufEXT) ++ .setPNext(&modifier_info); ++ auto const image_create_info = vk::ImageCreateInfo{} ++ .setPNext(&external_memory_create_info) ++ .setImageType(vk::ImageType::e2D) ++ .setFormat(vk_image_format) ++ .setExtent({vk_extent.width, vk_extent.height, 1}) ++ .setMipLevels(1) ++ .setArrayLayers(1) ++ .setSamples(vk::SampleCountFlagBits::e1) ++ .setTiling(vk::ImageTiling::eDrmFormatModifierEXT) ++ .setUsage(vk::ImageUsageFlagBits::eColorAttachment) ++ .setSharingMode(vk::SharingMode::eExclusive) ++ .setInitialLayout(vk::ImageLayout::eUndefined); ++ ++ auto vk_image = ManagedResource{ ++ vulkan->device().createImage(image_create_info), ++ [vptr=vulkan] (auto const& i) { vptr->device().destroyImage(i); }}; ++ ++ auto const requirements = vulkan->device().getImageMemoryRequirements(vk_image); ++ uint32_t index = find_memory_type_index(vulkan->physical_device(), ++ requirements, ++ vk::MemoryPropertyFlagBits::eDeviceLocal); ++ ++ auto const import_memory_fd_info = vk::ImportMemoryFdInfoKHR{} ++ .setHandleType(vk::ExternalMemoryHandleTypeFlagBitsKHR::eDmaBufEXT) ++ .setFd(fd); ++ auto const dedicated_allocate_info = vk::MemoryDedicatedAllocateInfoKHR{} ++ .setPNext(&import_memory_fd_info) ++ .setImage(vk_image); ++ auto const memory_allocate_info = vk::MemoryAllocateInfo{} ++ .setPNext(&dedicated_allocate_info) ++ .setAllocationSize(requirements.size) ++ .setMemoryTypeIndex((uint32_t)index); ++ ++ auto device_memory = ManagedResource{ ++ vulkan->device().allocateMemory(memory_allocate_info), ++ [vptr=vulkan] (auto const& m) { vptr->device().freeMemory(m); }}; ++ ++ vulkan->device().bindImageMemory(vk_image, device_memory, 0); + + vk_images.push_back( + ManagedResource{ +- vk::Image{image}, +- [vptr=vulkan, device_memory] (auto& image) ++ vk_image.steal(), ++ [vptr=vulkan, mem=device_memory.steal()] (auto const& image) + { + vptr->device().destroyImage(image); +- vptr->device().freeMemory(device_memory); ++ vptr->device().freeMemory(mem); + }}); + } + } +@@ -535,12 +572,19 @@ void KMSWindowSystem::wait_for_drm_page_flip_event() + + VulkanWSI::Extensions KMSWindowSystem::required_extensions() + { +- return {}; ++ return {{}, {VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME}}; + } + +-bool KMSWindowSystem::is_physical_device_supported(vk::PhysicalDevice const&) ++bool KMSWindowSystem::is_physical_device_supported(vk::PhysicalDevice const& physdev) + { +- return true; ++ auto const props = physdev.enumerateDeviceExtensionProperties(); ++ auto const iter = std::find_if( ++ props.begin(), props.end(), ++ [](vk::ExtensionProperties prop) ++ { ++ return std::string{VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME} == prop.extensionName; ++ }); ++ return iter != props.end(); + } + + std::vector KMSWindowSystem::physical_device_queue_family_indices( diff --git a/packages/graphics/vulkan/vkmark/patches/vkmark-999.01-drop-dependency-on-vkCreateDmaBufImageINTEL.patch b/packages/graphics/vulkan/vkmark/patches/vkmark-999.01-drop-dependency-on-vkCreateDmaBufImageINTEL.patch deleted file mode 100644 index a0c5ac5fb90..00000000000 --- a/packages/graphics/vulkan/vkmark/patches/vkmark-999.01-drop-dependency-on-vkCreateDmaBufImageINTEL.patch +++ /dev/null @@ -1,273 +0,0 @@ -From 0dd62e9adff82d51ed67c625a4f456a8e5f1a2e2 Mon Sep 17 00:00:00 2001 -From: Jeffy Chen -Date: Mon, 23 May 2022 10:57:27 +0800 -Subject: [PATCH] kms: Drop dependency on vkCreateDmaBufImageINTEL - -Based on chromium's gpu/vulkan/vulkan_image{_linux,}.cc - -Signed-off-by: Jeffy Chen ---- - meson.build | 7 +- - src/ws/kms_window_system.cpp | 172 ++++++++++++++++++++++++++--------- - src/ws/kms_window_system.h | 1 - - 3 files changed, 130 insertions(+), 50 deletions(-) - -diff --git a/meson.build b/meson.build -index 7d305dc..0d83918 100644 ---- a/meson.build -+++ b/meson.build -@@ -32,16 +32,11 @@ wayland_protocols_dep = dependency('wayland-protocols', version : '>= 1.12', - wayland_scanner_dep = dependency('wayland-scanner', required : get_option('wayland') == 'true') - libdrm_dep = dependency('libdrm', required : get_option('kms') == 'true') - gbm_dep = dependency('gbm', required : get_option('kms') == 'true') --has_vulkan_intel_header = cpp.has_header('vulkan/vulkan_intel.h', dependencies: vulkan_dep) -- --if get_option('kms') == 'true' and not has_vulkan_intel_header -- error('KMS plugin needs the vulkan_intel.h header, but it couldn\'t be found') --endif - - build_xcb_ws = xcb_dep.found() and xcb_icccm_dep.found() and get_option('xcb') != 'false' - build_wayland_ws = (wayland_client_dep.found() and wayland_protocols_dep.found() and - wayland_scanner_dep.found() and get_option('wayland') != 'false') --build_kms_ws = libdrm_dep.found() and gbm_dep.found() and has_vulkan_intel_header and get_option('kms') != 'false' -+build_kms_ws = libdrm_dep.found() and gbm_dep.found() and get_option('kms') != 'false' - - if not build_xcb_ws and not build_wayland_ws and not build_kms_ws - error('vkmark needs at least one winsys to work - xcb, wayland or kms') -diff --git a/src/ws/kms_window_system.cpp b/src/ws/kms_window_system.cpp -index ca8220f..18c5384 100644 ---- a/src/ws/kms_window_system.cpp -+++ b/src/ws/kms_window_system.cpp -@@ -29,7 +29,6 @@ - - #include - #include --#include - - #include - #include -@@ -352,7 +351,6 @@ void KMSWindowSystem::init_vulkan(VulkanState& vulkan_) - - vk_image_format = vk::Format::eB8G8R8A8Srgb; - create_gbm_bos(); -- create_drm_fbs(); - create_vk_images(); - } - -@@ -428,68 +426,122 @@ void KMSWindowSystem::create_gbm_bos() - } - } - --void KMSWindowSystem::create_drm_fbs() --{ -- for (auto const& gbm_bo : gbm_bos) -- { -- uint32_t fb = 0; -- -- uint32_t handles[4] = {gbm_bo_get_handle(gbm_bo).u32, 0, 0, 0}; -- uint32_t strides[4] = {gbm_bo_get_stride(gbm_bo), 0, 0, 0}; -- uint32_t offsets[4] = {0, 0, 0, 0}; -- -- auto const ret = drmModeAddFB2( -- drm_fd, vk_extent.width, vk_extent.height, -- DRM_FORMAT_XRGB8888, -- handles, strides, offsets, &fb, 0); -- -- if (ret < 0) -- throw std::system_error{-ret, std::system_category(), "Failed to add drm fb"}; -+// TODO: Use an official extension to create the VkImages when it becomes -+// available (e.g. VK_MESAX_external_image_dma_buf) - -- drm_fbs.push_back( -- ManagedResource{ -- std::move(fb), -- [this] (auto& fb) { drmModeRmFB(drm_fd, fb); }}); -+static int find_memory_type_index(VkPhysicalDevice physical_device, -+ const VkMemoryRequirements* requirements, -+ VkMemoryPropertyFlags flags) { -+ VkPhysicalDeviceMemoryProperties properties; -+ vkGetPhysicalDeviceMemoryProperties(physical_device, &properties); -+ for (int i = 0; i <= 31; i++) { -+ if (((1u << i) & requirements->memoryTypeBits) == 0) -+ continue; -+ if ((properties.memoryTypes[i].propertyFlags & flags) != flags) -+ continue; -+ return i; - } -+ return -1; - } - --// TODO: Use an official extension to create the VkImages when it becomes --// available (e.g. VK_MESAX_external_image_dma_buf) - void KMSWindowSystem::create_vk_images() - { -- auto const create_dma_buf_image = -- reinterpret_cast( -- vulkan->device().getProcAddr("vkCreateDmaBufImageINTEL")); -- -- if (!create_dma_buf_image) -- throw std::runtime_error{"Failed to get vkCreateDmaBufImageINTEL function pointer"}; -- - for (auto const& gbm_bo : gbm_bos) - { - auto const fd = ManagedResource{gbm_bo_get_fd(gbm_bo), close}; -- auto const stride = gbm_bo_get_stride(gbm_bo); - -- VkDmaBufImageCreateInfo create_info{}; -- create_info.sType = static_cast(VK_STRUCTURE_TYPE_DMA_BUF_IMAGE_CREATE_INFO_INTEL); -- create_info.fd = fd; -- create_info.format = static_cast(vk_image_format); -- create_info.extent = {vk_extent.width, vk_extent.height, 1}; -- create_info.strideInBytes = stride; -+ VkExternalMemoryImageCreateInfoKHR external_image_create_info = { -+ .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR, -+ .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, -+ }; -+ -+ uint64_t modifier = DRM_FORMAT_MOD_LINEAR; -+ VkImageDrmFormatModifierListCreateInfoEXT modifier_info = { -+ .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT, -+ .drmFormatModifierCount = 1, -+ .pDrmFormatModifiers = &modifier, -+ }; -+ external_image_create_info.pNext = &modifier_info; -+ -+ VkImportMemoryFdInfoKHR import_memory_fd_info = { -+ .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, -+ .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, -+ .fd = fd, -+ }; -+ -+ VkImageCreateInfo create_info{}; -+ create_info = { -+ .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, -+ .pNext = &external_image_create_info, -+ .flags = 0, -+ .imageType = VK_IMAGE_TYPE_2D, -+ .format = static_cast(vk_image_format), -+ .extent = {vk_extent.width, vk_extent.height, 1}, -+ .mipLevels = 1, -+ .arrayLayers = 1, -+ .samples = VK_SAMPLE_COUNT_1_BIT, -+ .tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, -+ .usage = 0, -+ .sharingMode = VK_SHARING_MODE_EXCLUSIVE, -+ .queueFamilyIndexCount = 0, -+ .pQueueFamilyIndices = nullptr, -+ .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, -+ }; - - VkImage image; -- VkDeviceMemory device_memory; - -- VkResult result = create_dma_buf_image( -+ VkResult result = vkCreateImage( - vulkan->device(), - &create_info, - nullptr, -- &device_memory, - &image); -+ if (result != VK_SUCCESS) -+ { -+ vk::throwResultException(static_cast(result), -+ "vkCreateImage"); -+ } -+ -+ VkMemoryDedicatedAllocateInfoKHR dedicated_memory_info = { -+ .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, -+ .pNext = &import_memory_fd_info, -+ .image = image, -+ }; -+ -+ VkMemoryRequirements requirements; -+ vkGetImageMemoryRequirements(vulkan->device(), image, &requirements); -+ if (!requirements.memoryTypeBits) { -+ throw std::runtime_error{"Failed in vkGetImageMemoryRequirements"}; -+ } -+ -+ int index = find_memory_type_index(vulkan->physical_device(), -+ &requirements, -+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); -+ if (index < 0) { -+ throw std::runtime_error{"Failed to get memoryTypeIndex"}; -+ } -+ -+ VkMemoryAllocateInfo memory_allocate_info = { -+ .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, -+ .pNext = &dedicated_memory_info, -+ .allocationSize = requirements.size, -+ .memoryTypeIndex = (uint32_t)index, -+ }; -+ -+ VkDeviceMemory device_memory = VK_NULL_HANDLE; -+ result = vkAllocateMemory(vulkan->device(), &memory_allocate_info, -+ nullptr /* pAllocator */, &device_memory); - - if (result != VK_SUCCESS) - { - vk::throwResultException(static_cast(result), -- "vkCreateDmbBufImageINTEL"); -+ "vkAllocateMemory"); -+ } -+ -+ result = vkBindImageMemory(vulkan->device(), image, device_memory, -+ 0 /* memoryOffset */); -+ if (result != VK_SUCCESS) { -+ vk::throwResultException(static_cast(result), -+ "vkBindImageMemory"); - } - - vk_images.push_back( -@@ -500,6 +552,40 @@ void KMSWindowSystem::create_vk_images() - vptr->device().destroyImage(image); - vptr->device().freeMemory(device_memory); - }}); -+ -+ std::array layouts = {}; -+ const VkImageSubresource image_subresource = { -+ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, -+ .mipLevel = 0, -+ .arrayLayer = 0, -+ }; -+ vkGetImageSubresourceLayout(vulkan->device(), image, -+ &image_subresource, &layouts[0]); -+ -+ uint32_t fb = 0; -+ -+ uint32_t handles[4] = {0,}; -+ uint32_t strides[4] = {0,}; -+ uint32_t offsets[4] = {0,}; -+ -+ for (auto i = 0; i < gbm_bo_get_plane_count(gbm_bo); i++) { -+ handles[i] = gbm_bo_get_handle(gbm_bo).u32; -+ offsets[i] = layouts[i].offset; -+ strides[i] = layouts[i].rowPitch; -+ } -+ -+ auto const ret = drmModeAddFB2( -+ drm_fd, vk_extent.width, vk_extent.height, -+ DRM_FORMAT_XRGB8888, -+ handles, strides, offsets, &fb, 0); -+ -+ if (ret < 0) -+ throw std::system_error{-ret, std::system_category(), "Failed to add drm fb"}; -+ -+ drm_fbs.push_back( -+ ManagedResource{ -+ std::move(fb), -+ [this] (auto& fb) { drmModeRmFB(drm_fd, fb); }}); - } - } - -diff --git a/src/ws/kms_window_system.h b/src/ws/kms_window_system.h -index 4389ef7..ca304c0 100644 ---- a/src/ws/kms_window_system.h -+++ b/src/ws/kms_window_system.h -@@ -68,7 +68,6 @@ class KMSWindowSystem : public WindowSystem, public VulkanWSI - - protected: - void create_gbm_bos(); -- void create_drm_fbs(); - void create_vk_images(); - void wait_for_drm_page_flip_event(); - diff --git a/packages/graphics/vulkan/vulkan-headers/package.mk b/packages/graphics/vulkan/vulkan-headers/package.mk index 3a43774a2cf..079f8e42ac9 100644 --- a/packages/graphics/vulkan/vulkan-headers/package.mk +++ b/packages/graphics/vulkan/vulkan-headers/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vulkan-headers" -PKG_VERSION="1.3.224" -PKG_SHA256="8829272058455c6ba393df66b9fac3ae3617eb0df48c860e225ceb1622fa7700" +PKG_VERSION="1.3.228" +PKG_SHA256="e5a4dcdfb9361ee8d1b9401ed337b65e7c34a54224b99a9cde303a650a9cb350" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/Vulkan-Headers" PKG_URL="https://github.com/KhronosGroup/Vulkan-Headers/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/vulkan/vulkan-loader/package.mk b/packages/graphics/vulkan/vulkan-loader/package.mk index 0680024d946..8ae23e37376 100644 --- a/packages/graphics/vulkan/vulkan-loader/package.mk +++ b/packages/graphics/vulkan/vulkan-loader/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vulkan-loader" -PKG_VERSION="1.3.224" -PKG_SHA256="702a974c460c668a9469a4614aed0b06602e5031154a67bc195429f4604bf51e" +PKG_VERSION="1.3.228" +PKG_SHA256="d553a17d058016ae959f71fb0964a3424bc5344a874026caabec0eecd74281b8" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/Vulkan-Loader" PKG_URL="https://github.com/KhronosGroup/Vulkan-Loader/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/graphics/vulkan/vulkan-tools/package.mk b/packages/graphics/vulkan/vulkan-tools/package.mk index c6e20b876cd..6f8c7062d28 100644 --- a/packages/graphics/vulkan/vulkan-tools/package.mk +++ b/packages/graphics/vulkan/vulkan-tools/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="vulkan-tools" -PKG_VERSION="1.3.224" -PKG_SHA256="ba984b6777364dadf9dd995efa3f0e38781184a95cef940e4169a37597d28d51" +PKG_VERSION="1.3.228" +PKG_SHA256="76d74706f78f5d20db6dedece82eb5e00acdb03e5b9b91f04782e9d3447695ad" PKG_LICENSE="Apache-2.0" PKG_SITE="https://github.com/KhronosGroup/Vulkan-Tools" PKG_URL="https://github.com/KhronosGroup/Vulkan-tools/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/lang/Python3/package.mk b/packages/lang/Python3/package.mk index ddfac07988b..470034e9ecc 100644 --- a/packages/lang/Python3/package.mk +++ b/packages/lang/Python3/package.mk @@ -3,8 +3,8 @@ PKG_NAME="Python3" # When changing PKG_VERSION remember to sync PKG_PYTHON_VERSION! -PKG_VERSION="3.9.13" -PKG_SHA256="125b0c598f1e15d2aa65406e83f792df7d171cdf38c16803b149994316a3080f" +PKG_VERSION="3.9.14" +PKG_SHA256="651304d216c8203fe0adf1a80af472d8e92c3b0e0a7892222ae4d9f3ae4debcf" PKG_LICENSE="OSS" PKG_SITE="https://www.python.org/" PKG_URL="https://www.python.org/ftp/python/${PKG_VERSION}/${PKG_NAME::-1}-${PKG_VERSION}.tar.xz" diff --git a/packages/lang/gcc/package.mk b/packages/lang/gcc/package.mk index c3f633a0f4d..71d5d04da5f 100644 --- a/packages/lang/gcc/package.mk +++ b/packages/lang/gcc/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gcc" -PKG_VERSION="12.1.0" -PKG_SHA256="62fd634889f31c02b64af2c468f064b47ad1ca78411c45abe6ac4b5f8dd19c7b" +PKG_VERSION="12.2.0" +PKG_SHA256="e549cf9cf3594a00e27b6589d4322d70e0720cdd213f39beb4181e06926230ff" PKG_LICENSE="GPL-2.0-or-later" PKG_SITE="https://gcc.gnu.org/" PKG_URL="https://ftpmirror.gnu.org/gcc/${PKG_NAME}-${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.xz" @@ -78,6 +78,28 @@ PKG_CONFIGURE_OPTS_HOST="${GCC_COMMON_CONFIGURE_OPTS} \ --enable-clocale=gnu \ ${TARGET_ARCH_GCC_OPTS}" +post_makeinstall_bootstrap() { + GCC_VERSION=$(${TOOLCHAIN}/bin/${TARGET_NAME}-gcc -dumpversion) + DATE="0401$(echo ${GCC_VERSION} | sed 's/\./0/g')" + CROSS_CC=${TARGET_PREFIX}gcc-${GCC_VERSION} + + rm -f ${TARGET_PREFIX}gcc + +cat > ${TARGET_PREFIX}gcc < -Date: Mon, 11 Jul 2022 22:03:14 +0200 -Subject: [PATCH] libsanitizer: cherry-pick 9cf13067cb5088626ba7 from upstream - -9cf13067cb5088626ba7ee1ec4c42ec59c7995a0 [sanitizer] Remove #include to resolve fsconfig_command/mount_attr conflict with glibc 2.36 ---- - .../sanitizer_platform_limits_posix.cpp | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp -index 8ed3e92d2704..97fd07acf9d4 100644 ---- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp -+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp -@@ -73,7 +73,9 @@ - #include - #include - #include -+#if SANITIZER_ANDROID - #include -+#endif - #include - #include - #include -@@ -869,10 +871,10 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); - unsigned IOCTL_EVIOCGPROP = IOCTL_NOT_PRESENT; - unsigned IOCTL_EVIOCSKEYCODE_V2 = IOCTL_NOT_PRESENT; - #endif -- unsigned IOCTL_FS_IOC_GETFLAGS = FS_IOC_GETFLAGS; -- unsigned IOCTL_FS_IOC_GETVERSION = FS_IOC_GETVERSION; -- unsigned IOCTL_FS_IOC_SETFLAGS = FS_IOC_SETFLAGS; -- unsigned IOCTL_FS_IOC_SETVERSION = FS_IOC_SETVERSION; -+ unsigned IOCTL_FS_IOC_GETFLAGS = _IOR('f', 1, long); -+ unsigned IOCTL_FS_IOC_GETVERSION = _IOR('v', 1, long); -+ unsigned IOCTL_FS_IOC_SETFLAGS = _IOW('f', 2, long); -+ unsigned IOCTL_FS_IOC_SETVERSION = _IOW('v', 2, long); - unsigned IOCTL_GIO_CMAP = GIO_CMAP; - unsigned IOCTL_GIO_FONT = GIO_FONT; - unsigned IOCTL_GIO_UNIMAP = GIO_UNIMAP; diff --git a/packages/lib32/graphics/lib32-libdrm/package.mk b/packages/lib32/graphics/lib32-libdrm/package.mk index 405cee78502..5cb5b955033 100644 --- a/packages/lib32/graphics/lib32-libdrm/package.mk +++ b/packages/lib32/graphics/lib32-libdrm/package.mk @@ -18,13 +18,13 @@ PKG_BUILD_FLAGS="lib32" get_graphicdrivers -PKG_MESON_OPTS_TARGET="-Dnouveau=false \ - -Domap=false \ - -Dexynos=false \ - -Dtegra=false \ - -Dcairo-tests=false \ - -Dman-pages=false \ - -Dvalgrind=false \ +PKG_MESON_OPTS_TARGET="-Dnouveau=disabled \ + -Domap=disabled \ + -Dexynos=disabled \ + -Dtegra=disabled \ + -Dcairo-tests=disabled \ + -Dman-pages=disabled \ + -Dvalgrind=disabled \ -Dfreedreno-kgsl=false \ -Dinstall-test-programs=true \ -Dudev=false" diff --git a/packages/lib32/lang/lib32-gcc/package.mk b/packages/lib32/lang/lib32-gcc/package.mk index 3dd7658a0a4..d40f2f1814f 100644 --- a/packages/lib32/lang/lib32-gcc/package.mk +++ b/packages/lib32/lang/lib32-gcc/package.mk @@ -75,6 +75,28 @@ unpack() { tar --strip-components=1 -xf ${SOURCES}/gcc/gcc-${PKG_VERSION}.tar.xz -C ${PKG_BUILD} } +post_makeinstall_bootstrap() { + GCC_VERSION=$(${TOOLCHAIN}/bin/${LIB32_TARGET_NAME}-gcc -dumpversion) + DATE="0401$(echo ${GCC_VERSION} | sed 's/\./0/g')" + CROSS_CC=${LIB32_TARGET_PREFIX}gcc-${GCC_VERSION} + + rm -f ${LIB32_TARGET_PREFIX}gcc + +cat > ${LIB32_TARGET_PREFIX}gcc <= KERNEL_VERSION(4, 12, 0) + { + struct cfg80211_roam_info roam_info = { ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) ++ .links[0].channel = &wl->conf->channel, ++ .links[0].bssid = (u8 *)&wl->bssid, ++#else + .channel = &wl->conf->channel, + .bssid = (u8 *)&wl->bssid, ++#endif + .req_ie = conn_info->req_ie, + .req_ie_len = conn_info->req_ie_len, + .resp_ie = conn_info->resp_ie, diff --git a/packages/linux-firmware/firmware-imx/package.mk b/packages/linux-firmware/firmware-imx/package.mk index b71713608e3..333571bea0d 100644 --- a/packages/linux-firmware/firmware-imx/package.mk +++ b/packages/linux-firmware/firmware-imx/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="firmware-imx" -PKG_VERSION="8.14" -PKG_SHA256="bfe9c57857e8442e7eb26ba3e1020733b09a7c9b83952ad4822980546c58a7f4" +PKG_VERSION="8.17" +PKG_SHA256="289a021aa6b7ec56fa02e2d21710179dc33cd59c65cce88b7d9119efafea7a65" PKG_ARCH="arm" PKG_LICENSE="other" PKG_SITE="http://www.freescale.com" diff --git a/packages/linux-firmware/kernel-firmware/package.mk b/packages/linux-firmware/kernel-firmware/package.mk index 6b09f1fd47a..86225e83030 100644 --- a/packages/linux-firmware/kernel-firmware/package.mk +++ b/packages/linux-firmware/kernel-firmware/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="kernel-firmware" -PKG_VERSION="20220708" -PKG_SHA256="0abec827a035c82bdcabdf82aa37ded247bc682ef05861bd409ea6f477bab81d" +PKG_VERSION="20220913" +PKG_SHA256="26fd00f2d8e96c4af6f44269a6b893eb857253044f75ad28ef6706a2250cd8e9" PKG_LICENSE="other" PKG_SITE="https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/" PKG_URL="https://cdn.kernel.org/pub/linux/kernel/firmware/linux-firmware-${PKG_VERSION}.tar.xz" diff --git a/packages/linux-firmware/kernel-firmware/patches/kernel-firmware-20220708-0001-WHENCE--Correct-dangling-symlinks.patch b/packages/linux-firmware/kernel-firmware/patches/kernel-firmware-20220708-0001-WHENCE--Correct-dangling-symlinks.patch deleted file mode 100644 index 2df3fe53f55..00000000000 --- a/packages/linux-firmware/kernel-firmware/patches/kernel-firmware-20220708-0001-WHENCE--Correct-dangling-symlinks.patch +++ /dev/null @@ -1,37 +0,0 @@ -From dfa29317dd78f3a18f37ef8063efe9d2659e6387 Mon Sep 17 00:00:00 2001 -From: Mario Limonciello -Date: Fri, 8 Jul 2022 11:09:51 -0500 -Subject: WHENCE: Correct dangling symlinks - -The symlink direction was wrong for some brcm firmware. - -Fixes: f8a2651a ("Link some devices that ship with the AW-CM256SM") -Signed-off-by: Mario Limonciello -Reviewed-by: Peter Robinson -Signed-off-by: Josh Boyer ---- - WHENCE | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/WHENCE b/WHENCE -index 14f3472..14d0a87 100644 ---- a/WHENCE -+++ b/WHENCE -@@ -2820,10 +2820,10 @@ Link: brcm/brcmfmac4356-sdio.firefly,firefly-rk3399.txt -> brcmfmac4356-sdio.AP6 - Link: brcm/brcmfmac4356-sdio.khadas,vim2.txt -> brcmfmac4356-sdio.AP6356S.txt - Link: brcm/brcmfmac4356-sdio.vamrs,rock960.txt -> brcmfmac4356-sdio.AP6356S.txt - File: brcm/brcmfmac43455-sdio.AW-CM256SM.txt --Link: brcm/brcmfmac43455-sdio.AW-CM256SM.txt -> brcmfmac43455-sdio.beagle,am5729-beagleboneai.txt --Link: brcm/brcmfmac43455-sdio.AW-CM256SM.txt -> brcmfmac43455-sdio.pine64,pinebook-pro.txt --Link: brcm/brcmfmac43455-sdio.AW-CM256SM.txt -> brcmfmac43455-sdio.pine64,pinephone-pro.txt --Link: brcm/brcmfmac43455-sdio.AW-CM256SM.txt -> brcmfmac43455-sdio.pine64,quartz64-b.txt -+Link: brcmfmac43455-sdio.beagle,am5729-beagleboneai.txt -> brcm/brcmfmac43455-sdio.AW-CM256SM.txt -+Link: brcmfmac43455-sdio.pine64,pinebook-pro.txt -> brcm/brcmfmac43455-sdio.AW-CM256SM.txt -+Link: brcmfmac43455-sdio.pine64,pinephone-pro.txt -> brcm/brcmfmac43455-sdio.AW-CM256SM.txt -+Link: brcmfmac43455-sdio.pine64,quartz64-b.txt -> brcm/brcmfmac43455-sdio.AW-CM256SM.txt - - Licence: GPLv2. See GPL-2 for details. - --- -cgit 1.2.3-1.el7 - diff --git a/packages/linux/package.mk b/packages/linux/package.mk index 0627ef2f955..d7ca62662e4 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -6,7 +6,7 @@ PKG_NAME="linux" PKG_LICENSE="GPL" PKG_SITE="http://www.kernel.org" PKG_DEPENDS_HOST="ccache:host rsync:host" -PKG_DEPENDS_TARGET="linux:host kmod:host xz:host keyutils openssl:host ${KERNEL_EXTRA_DEPENDS_TARGET}" +PKG_DEPENDS_TARGET="linux:host kmod:host xz:host keyutils ncurses openssl:host ${KERNEL_EXTRA_DEPENDS_TARGET}" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)" PKG_LONGDESC="This package contains a precompiled kernel image and the modules." PKG_IS_KERNEL_PKG="yes" @@ -22,14 +22,14 @@ case "${LINUX}" in PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz" ;; raspberrypi) - PKG_VERSION="a90998a3e549911234f9f707050858b98b71360f" # 5.15.56 - PKG_SHA256="bf0198a1f8122af1fa1c40367fd10a85cd53e32840649f49ce1b23be30fa3f82" + PKG_VERSION="4710bf680f806a4ff50a1278015de2577e9a44e4" # 5.15.61 + PKG_SHA256="2cde145b11025042b4078b137d88a2cf60ba2de39a89e4756b7e401e3c04505d" PKG_URL="https://github.com/raspberrypi/linux/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz" ;; *) - PKG_VERSION="5.19" - PKG_SHA256="ff240c579b9ee1affc318917de07394fc1c3bb49dac25ec1287370c2e15005a8" + PKG_VERSION="5.19.7" + PKG_SHA256="b8bb6019d4255f39196726f9d0f82f76179d1c3d7c6b603431ef04b38201199f" PKG_URL="https://www.kernel.org/pub/linux/kernel/v5.x/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_PATCH_DIRS="default" ;; diff --git a/packages/mediacenter/LibreELEC-settings/package.mk b/packages/mediacenter/LibreELEC-settings/package.mk index 44d0e689758..c1c73d8eb44 100644 --- a/packages/mediacenter/LibreELEC-settings/package.mk +++ b/packages/mediacenter/LibreELEC-settings/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="LibreELEC-settings" -PKG_VERSION="1bc83885ec089273e448006dc6ab16c0bb0bda91" -PKG_SHA256="b711bfaf2556dec4b368b0b8360c7c32cd161db8bca78c2326530abd6cb256aa" +PKG_VERSION="d6c41d41b4090d3d6a3cf1c4913b4e68ede316a4" +PKG_SHA256="ea89930f9d0e67738339d09faf6161da844d612840b3d425cb29c5a036ef1e03" PKG_LICENSE="GPL" PKG_SITE="https://libreelec.tv" PKG_URL="https://github.com/LibreELEC/service.libreelec.settings/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk b/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk index f897a26094a..55d06ae3555 100644 --- a/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk +++ b/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="inputstream.adaptive" -PKG_VERSION="20.2.3-Nexus" -PKG_SHA256="31a9dc1f403e362535e5b2751bf08f09239daa27860912ce79f2bd6b1c97dd1a" -PKG_REV="2" +PKG_VERSION="v20.3.0-Nexus" +PKG_SHA256="a6d4b3cd477c0048273fc69e9733c8a224f376417dac0d600d9643f2f1679f9c" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/inputstream.adaptive" diff --git a/packages/mediacenter/kodi-binary-addons/inputstream.ffmpegdirect/package.mk b/packages/mediacenter/kodi-binary-addons/inputstream.ffmpegdirect/package.mk index f30a3f07dc7..9c4e95c9314 100644 --- a/packages/mediacenter/kodi-binary-addons/inputstream.ffmpegdirect/package.mk +++ b/packages/mediacenter/kodi-binary-addons/inputstream.ffmpegdirect/package.mk @@ -2,14 +2,14 @@ # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="inputstream.ffmpegdirect" -PKG_VERSION="20.4.0-Nexus" -PKG_SHA256="361fb0a617fa8184ecc8d51885a9306597bacc9eef2c6578a061811e78b0d3e6" -PKG_REV="2" +PKG_VERSION="20.5.0-Nexus" +PKG_SHA256="a849b6b4d5ce740ec3552d244acc4c7a4d64792358428f5154236052473d5734" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL2+" PKG_SITE="https://github.com/xbmc/inputstream.ffmpegdirect" PKG_URL="https://github.com/xbmc/inputstream.ffmpegdirect/archive/${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain kodi-platform bzip2 ffmpeg gmp gnutls libpng libxml2 nettle xz zlib zvbi" +PKG_DEPENDS_TARGET="toolchain kodi-platform bzip2 ffmpeg gmp libpng libxml2 xz zlib zvbi" PKG_SECTION="" PKG_SHORTDESC="inputstream.ffmpegdirect" PKG_LONGDESC="InputStream Client for streams that can be opened by FFmpeg's libavformat such as plain TS, HLS and DASH (without DRM) streams." diff --git a/packages/mediacenter/kodi-binary-addons/inputstream.rtmp/package.mk b/packages/mediacenter/kodi-binary-addons/inputstream.rtmp/package.mk index a50b454b729..3f6ddb004bd 100644 --- a/packages/mediacenter/kodi-binary-addons/inputstream.rtmp/package.mk +++ b/packages/mediacenter/kodi-binary-addons/inputstream.rtmp/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="inputstream.rtmp" -PKG_VERSION="20.2.1-Nexus" -PKG_SHA256="fbc17b93f284cf6efcb16ef5d735201a42b336bad3c491c460b3c2a45374a7bd" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="6a6129dca822e1447c0945ddf9cc6dbff1203dab313395d27efb4669a0ef3370" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/inputstream.rtmp" diff --git a/packages/mediacenter/kodi-binary-addons/peripheral.joystick/package.mk b/packages/mediacenter/kodi-binary-addons/peripheral.joystick/package.mk index b6691fe30fe..43589eff789 100644 --- a/packages/mediacenter/kodi-binary-addons/peripheral.joystick/package.mk +++ b/packages/mediacenter/kodi-binary-addons/peripheral.joystick/package.mk @@ -10,7 +10,7 @@ PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/peripheral.joystick" PKG_URL="https://github.com/xbmc/peripheral.joystick/archive/${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain kodi-platform p8-platform" +PKG_DEPENDS_TARGET="toolchain kodi-platform p8-platform systemd" PKG_SECTION="" PKG_SHORTDESC="peripheral.joystick: Joystick support in Kodi" PKG_LONGDESC="peripheral.joystick provides joystick support and button mapping" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.argustv/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.argustv/package.mk index 6d10d72f15a..885f2fd62e0 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.argustv/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.argustv/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.argustv" -PKG_VERSION="20.4.1-Nexus" -PKG_SHA256="0f7217b41af41b47a24064357e077179c4e18a1a5016cfcf06968911cbb6f6bd" -PKG_REV="2" +PKG_VERSION="20.5.0-Nexus" +PKG_SHA256="c4b18a0abf4ba0a797509d79c4291c4e69589a6482c6ec85f5d9bdae63ea3f35" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.argustv" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.demo/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.demo/package.mk index eed7bcde779..011bd5b411b 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.demo/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.demo/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.demo" -PKG_VERSION="20.4.2-Nexus" -PKG_SHA256="669765b108fd5caa4132657b1469ca8a42a8f8d0ad1e8a65b4966bde3cfaa99d" -PKG_REV="2" +PKG_VERSION="20.5.0-Nexus" +PKG_SHA256="8f4d8f06e7dbeefdf6148abb06347c4d92b9edd4a818c7efd1e204a65a9556d2" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.demo" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.dvblink/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.dvblink/package.mk index fd0c5c87f16..14f54abb633 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.dvblink/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.dvblink/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.dvblink" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="1d42ae678e4062365ac76a360ff54aab81104467c7d4c7f0ed8f6743fd0114fb" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="71a9fa64bdf7d784afc28f8b686fcdc00d9fea536c2aad1464e76e3b7648ed41" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.dvblink" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.dvbviewer/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.dvbviewer/package.mk index fee437a6e2b..0c145c6cb15 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.dvbviewer/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.dvbviewer/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.dvbviewer" -PKG_VERSION="20.3.0-Nexus" -PKG_SHA256="d54e633bb9bae015e9a43b322c45467b62649542446cb805c0d1b8920ed6a851" +PKG_VERSION="20.4.0-Nexus" +PKG_SHA256="dc79db0486c7ef75b4b23c4dfe94115cb12e1903c3700ef4eef04fc517fcd039" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.filmon/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.filmon/package.mk index 4521cee35e9..10aa0480def 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.filmon/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.filmon/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.filmon" -PKG_VERSION="20.2.1-Nexus" -PKG_SHA256="8669023799f8ba243a6b2eba3f8e97eb59b389de7ce2e58ea5056b7b7b12c8d2" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="dfd2a7b64d2b647ba3f7bfba05676a593c3284e2298becfed68b82e441a69b33" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.filmon" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.freebox/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.freebox/package.mk index aa205cb7a94..3f62c279e6f 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.freebox/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.freebox/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.freebox" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="e01d331fa50606a592353fe291f396a0e95a4e685781fb9824bc9e6684b6f8b8" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="0483f4e9e12160bb2d014e2f74f858ec4038dbb6b9e22815c1e5a46361d0f022" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/aassif/pvr.freebox" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.hdhomerun/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.hdhomerun/package.mk index 47d48715397..50406c8615e 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.hdhomerun/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.hdhomerun/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.hdhomerun" -PKG_VERSION="20.3.0-Nexus" -PKG_SHA256="8e1e9d29873a7319a99a221fea77f7c9aa3383a4f317e407e08c53b53054addd" -PKG_REV="2" +PKG_VERSION="20.4.0-Nexus" +PKG_SHA256="3872265e00fc748ba327aaa91beece747936f55d16356051cdd04b0b70a353c0" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.hdhomerun" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.hts/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.hts/package.mk index 8d27f6ab021..7e2078f4c11 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.hts/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.hts/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.hts" -PKG_VERSION="20.3.0-Nexus" -PKG_SHA256="f4ea7801cc44b546b08c115e32b03c68e6ef0e86c96269b8eaadc2055171bb5a" -PKG_REV="2" +PKG_VERSION="20.5.0-Nexus" +PKG_SHA256="236a73535633736ab15040a8018ad1aa2617165d41fee6417d07976d472cd03c" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.hts" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.iptvsimple/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.iptvsimple/package.mk index 0f5b3ed139a..6b2fc53ec3a 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.iptvsimple/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.iptvsimple/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.iptvsimple" -PKG_VERSION="20.5.0-Nexus" -PKG_SHA256="55456760c56f1212c182d4e8595d14521e4a32ee176f16b19c5cce9b593fb0bb" +PKG_VERSION="20.6.0-Nexus" +PKG_SHA256="e760543065fb9fc29d35f20bc6ff617b4a24e337a5d276ab05476a6bb6a95f0d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.mediaportal.tvserver/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.mediaportal.tvserver/package.mk index a694c898c2f..d0fed130d66 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.mediaportal.tvserver/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.mediaportal.tvserver/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.mediaportal.tvserver" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="f92d1b6ddb1f6a4bbe78df7d8e8f0c56b1f842126455d28e80b0ec74b06e444f" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="a61efdadb56c65e081f8b2e99f2d5b32b3c932ca1954243548710be57c8b70b8" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.mediaportal.tvserver" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.nextpvr/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.nextpvr/package.mk index a4690cd8621..ee9f442f705 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.nextpvr/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.nextpvr/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.nextpvr" -PKG_VERSION="20.2.3-Nexus" -PKG_SHA256="935bd0e930306b81ae5cb045b8fa29748de2e4927c8cc5cf330943d7dff4e209" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="1e36d0eb8c974290b4869d9d65142599803a0eb5457be35c2b1f9b14c2956361" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.nextpvr" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.njoy/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.njoy/package.mk index 8891c6e4036..3f5cf0e2cd4 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.njoy/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.njoy/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.njoy" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="a0c90254b56770519585983f055b73083ee723a7719b1337d43f3399ed69310e" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="0e8dc8ddce7830878c816da0836bdf5558c0dd388c48019012735a518eeefb04" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.njoy" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.octonet/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.octonet/package.mk index c67131e9016..67919538e00 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.octonet/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.octonet/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.octonet" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="99222d5ee4fe204b4df4afae9bc26cdc05f4604bb3c1f846692a8adf7a48caea" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="cc83ada3b3d1dbf3d42fa41f2b221c640cdc9fd505a1c76e7b479f99fe1ec8c5" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/DigitalDevices/pvr.octonet" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.pctv/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.pctv/package.mk index 6b69484f362..01009b7c826 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.pctv/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.pctv/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.pctv" -PKG_VERSION="20.3.0-Nexus" -PKG_SHA256="34c064f91295477ecdab680c4fd8baa2b82597be6dc9fe4896a1d977679f4537" -PKG_REV="2" +PKG_VERSION="20.4.0-Nexus" +PKG_SHA256="c99d3ef085c4900e0c03e5e37047dc136efced78ed245d07bc286468a31e8a65" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.pctv" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.plutotv/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.plutotv/package.mk index 297a2f27fd9..ece75362920 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.plutotv/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.plutotv/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.plutotv" -PKG_VERSION="20.1.0-Nexus" -PKG_SHA256="7ac4d86cf6b9d40fb4e96ba50a9f11a3b9bfd62af05971cef79d063645423c99" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="d38a6bf4debc442849d01faedadcccb1b07debe850cd3c9a5789508233d22256" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.plutotv" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.sledovanitv.cz/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.sledovanitv.cz/package.mk index 1374b296fd8..37a6e225e57 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.sledovanitv.cz/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.sledovanitv.cz/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.sledovanitv.cz" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="2fc78107724aa88f04e54fc52972e2f1daaa279a418d10297fb74f4e7da6131a" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="e32bd9e82963fa7d3a3edf0c286931a80134c89eab34f15a14098183f33f8253" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/palinek/pvr.sledovanitv.cz" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.stalker/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.stalker/package.mk index 8edaf2a0eb8..3b4200a3010 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.stalker/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.stalker/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.stalker" -PKG_VERSION="20.2.2-Nexus" -PKG_SHA256="3f8d9d640b1697e41033634214a64aec37ffa4e70bbf65f1f8cf2f368e09ee63" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="59ef612a7178cdff0a6322d8559ff9f1c8937ef121fa25c9660638b8374b8f8b" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.stalker" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.teleboy/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.teleboy/package.mk index 558e3f95729..cbbdd31c58c 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.teleboy/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.teleboy/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.teleboy" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="396a48df3ec934ff65c3621e167b029d5ffcff3d8e1aed65c449757ae4925206" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="4e622b4a270105e82651f96a95dfe5e2749ac05fa19ed8fbb4525fba9f08fb8d" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/rbuehlma/pvr.teleboy" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.vbox/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.vbox/package.mk index e33d299fdc0..95feb7d9552 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.vbox/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.vbox/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.vbox" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="27e67ef955ddf0ef5eaa3f08677e395545569c517e6ca0b2f956f34edacae501" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="7f03ace22ee4a822998155fdc4c3fb64d769eccf32baf6943c771db18567a7ef" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.vbox" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.vdr.vnsi/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.vdr.vnsi/package.mk index 3c3a543ff51..676d4c30851 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.vdr.vnsi/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.vdr.vnsi/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.vdr.vnsi" -PKG_VERSION="20.3.1-Nexus" -PKG_SHA256="527a9327eea5568c63c4fab620f650aece0af641cb4a6637358b49c30bb88bd0" -PKG_REV="2" +PKG_VERSION="20.4.0-Nexus" +PKG_SHA256="a781cfdf3a9d5d592eed5152200e69acf1214712f06c6b99573a1a01dadd62f5" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.vdr.vnsi" @@ -17,3 +17,11 @@ PKG_LONGDESC="pvr.vdr.vnsi" PKG_IS_ADDON="yes" PKG_ADDON_TYPE="xbmc.pvrclient" + +if [ "${OPENGLES_SUPPORT}" = "yes" ]; then + PKG_DEPENDS_TARGET+=" ${OPENGLES}" +fi + +if [ "${OPENGL_SUPPORT}" = "yes" ]; then + PKG_DEPENDS_TARGET+=" ${OPENGL}" +fi diff --git a/packages/mediacenter/kodi-binary-addons/pvr.vuplus/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.vuplus/package.mk index 510b3dba536..311807b36b3 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.vuplus/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.vuplus/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.vuplus" -PKG_VERSION="20.3.1-Nexus" -PKG_SHA256="587b3763dd37e4b35e2bac66201e25da6021977379daeaf5aaed6398dd161b3c" -PKG_REV="2" +PKG_VERSION="20.4.0-Nexus" +PKG_SHA256="af51b32b85294ce19e92b59a9bab8d7710beeea99f8593816544f9188365ab83" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.vuplus" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.waipu/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.waipu/package.mk index 06d94b5e056..adf319b1a89 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.waipu/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.waipu/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.waipu" -PKG_VERSION="20.4.2-Nexus" -PKG_SHA256="c054ec398cb3449bbc7ddc0a22ed95573b030d5badc07a34ae7c908eb28f7bdf" -PKG_REV="2" +PKG_VERSION="20.6.0-Nexus" +PKG_SHA256="64d348040dcf523d5ef7dad2cc6efa05b2186d99b116f353d97d2cbd5f4093b8" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/flubshi/pvr.waipu" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.wmc/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.wmc/package.mk index c183a71cec7..263ffec6de3 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.wmc/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.wmc/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.wmc" -PKG_VERSION="20.2.1-Nexus" -PKG_SHA256="14b6b37fdd7ed8887a3317caf2d173084fa6bed6473bc31ee845296eea7d5de5" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="f045d871789ef3d36e1a7c7361ea35be4e14a395e75446519e937be70d2433b4" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/kodi-pvr/pvr.wmc" diff --git a/packages/mediacenter/kodi-binary-addons/pvr.zattoo/package.mk b/packages/mediacenter/kodi-binary-addons/pvr.zattoo/package.mk index 81054780913..6530cb7e466 100644 --- a/packages/mediacenter/kodi-binary-addons/pvr.zattoo/package.mk +++ b/packages/mediacenter/kodi-binary-addons/pvr.zattoo/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pvr.zattoo" -PKG_VERSION="20.2.1-Nexus" -PKG_SHA256="4c3d44b9dd659e6ffe563ba7705f0a820d50c9c087f945c7e0c2bb8c77a21c8e" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="ecd82d47bf0c3092699c46bba18c3f6d388f16c81f9a0426dfa5850b70b155c8" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/rbuehlma/pvr.zattoo" diff --git a/packages/mediacenter/kodi-binary-addons/visualization.goom/package.mk b/packages/mediacenter/kodi-binary-addons/visualization.goom/package.mk index e6c4960f22c..20f9cce5fe6 100644 --- a/packages/mediacenter/kodi-binary-addons/visualization.goom/package.mk +++ b/packages/mediacenter/kodi-binary-addons/visualization.goom/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.goom" -PKG_VERSION="20.1.0-Nexus" -PKG_SHA256="85e56e19ab4ad80472059a16800c02b451d8d7ab86a92da495d507065bf4ba76" -PKG_REV="2" +PKG_VERSION="20.1.1-Nexus" +PKG_SHA256="75102a8c3f066a889493b77fbe26070be78c6dff8e7d44ebda89295ddb2da3b0" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.goom" diff --git a/packages/mediacenter/kodi-binary-addons/visualization.matrix/package.mk b/packages/mediacenter/kodi-binary-addons/visualization.matrix/package.mk index 0155b177965..f8d1ae89cc8 100644 --- a/packages/mediacenter/kodi-binary-addons/visualization.matrix/package.mk +++ b/packages/mediacenter/kodi-binary-addons/visualization.matrix/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.matrix" -PKG_VERSION="20.1.0-Nexus" -PKG_SHA256="ffba588c1b02ac0b18f6b243073ba7fe78486d21ba6b1f02277d7f8966663e8f" -PKG_REV="2" +PKG_VERSION="20.2.0-Nexus" +PKG_SHA256="f0b76edf45df7161d8525fa2ba623dee64ca66d515342e942100dc46c8220553" +PKG_REV="1" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.matrix" PKG_URL="https://github.com/xbmc/visualization.matrix/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/mediacenter/kodi-binary-addons/visualization.shadertoy/package.mk b/packages/mediacenter/kodi-binary-addons/visualization.shadertoy/package.mk index 6df90e7e999..460addf89c2 100644 --- a/packages/mediacenter/kodi-binary-addons/visualization.shadertoy/package.mk +++ b/packages/mediacenter/kodi-binary-addons/visualization.shadertoy/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.shadertoy" -PKG_VERSION="20.2.0-Nexus" -PKG_SHA256="3c64fa1e5918f7b7b39a1d3f8586226b60adf1e4342a9cde2d7274f84f65b52b" -PKG_REV="2" +PKG_VERSION="20.3.0-Nexus" +PKG_SHA256="2f97a34f74ee3e3e1d9fe8cfd37796564f8f88eb4c07d60b27ff635d64a5a724" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.shadertoy" diff --git a/packages/mediacenter/kodi-binary-addons/visualization.spectrum/package.mk b/packages/mediacenter/kodi-binary-addons/visualization.spectrum/package.mk index 49de43b1dea..7a59a447663 100644 --- a/packages/mediacenter/kodi-binary-addons/visualization.spectrum/package.mk +++ b/packages/mediacenter/kodi-binary-addons/visualization.spectrum/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.spectrum" -PKG_VERSION="20.1.0-Nexus" -PKG_SHA256="45b8bbaad2f794917e0e88a8a538a3f8188c5f0aa5c6e830f0549d2adfaeff24" -PKG_REV="2" +PKG_VERSION="20.2.0-Nexus" +PKG_SHA256="1c405ea9b6f43ba5f24df13ebce12cb428369279336deb97790917aa675c809f" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.spectrum" diff --git a/packages/mediacenter/kodi-binary-addons/visualization.starburst/package.mk b/packages/mediacenter/kodi-binary-addons/visualization.starburst/package.mk index e81178ba24d..e8705fd2258 100644 --- a/packages/mediacenter/kodi-binary-addons/visualization.starburst/package.mk +++ b/packages/mediacenter/kodi-binary-addons/visualization.starburst/package.mk @@ -2,9 +2,9 @@ # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.starburst" -PKG_VERSION="20.1.0-Nexus" -PKG_SHA256="9581ab32f74b517f3b178214a38b6cadfad92a268d9cabae98b6b309e7e66cda" -PKG_REV="2" +PKG_VERSION="20.2.0-Nexus" +PKG_SHA256="0d63b38ba8d5b3bac542546b1ecfb7d722b79652da485d75b22086e26ef4f825" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.starburst" diff --git a/packages/mediacenter/kodi-binary-addons/visualization.waveform/package.mk b/packages/mediacenter/kodi-binary-addons/visualization.waveform/package.mk index d99ae1a0818..f63be6a07df 100644 --- a/packages/mediacenter/kodi-binary-addons/visualization.waveform/package.mk +++ b/packages/mediacenter/kodi-binary-addons/visualization.waveform/package.mk @@ -3,9 +3,9 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="visualization.waveform" -PKG_VERSION="20.1.0-Nexus" -PKG_SHA256="27583183341f789572b4420195cfa3931dd81433314638c5b08821cd499202d9" -PKG_REV="2" +PKG_VERSION="20.2.1-Nexus" +PKG_SHA256="865e72a5f2ed8fd53469518280cbe26f9516467d091009fe5e012ea0d85d5edd" +PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/visualization.waveform" diff --git a/packages/mediacenter/kodi-platform/package.mk b/packages/mediacenter/kodi-platform/package.mk index be6b145c761..3fb87ddc3ac 100644 --- a/packages/mediacenter/kodi-platform/package.mk +++ b/packages/mediacenter/kodi-platform/package.mk @@ -8,7 +8,7 @@ PKG_SHA256="159165ae641da5eb273885ce53b8a4b84e62a595c4974f9d12c1b5d1428ef25c" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/xbmc/kodi-platform/archive/${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain tinyxml ${MEDIACENTER} p8-platform" +PKG_DEPENDS_TARGET="toolchain tinyxml ${MEDIACENTER}:host p8-platform" PKG_LONGDESC="kodi-platform:" PKG_CMAKE_OPTS_TARGET="-DCMAKE_INSTALL_LIBDIR:STRING=lib \ diff --git a/packages/mediacenter/kodi/package.mk b/packages/mediacenter/kodi/package.mk index 90051555fb4..d4e674b0a13 100644 --- a/packages/mediacenter/kodi/package.mk +++ b/packages/mediacenter/kodi/package.mk @@ -3,12 +3,13 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="kodi" -PKG_VERSION="80f18db9500c0738d3522f4efdf789aa012e9930" -PKG_SHA256="9ccb6d041cea12f7c571dae4456a01ebda83c6430c99f180052e44c346658579" +PKG_VERSION="9f7e9e02313cd935f93ee47b30758de051c09d91" +PKG_SHA256="3f68f4871d3aa3ade7b2738d7dd904709ead6cd5b156539de74124457d350d81" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/xbmc/xbmc/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain JsonSchemaBuilder:host TexturePacker:host Python3 zlib systemd lzo pcre swig:host libass curl fontconfig fribidi tinyxml libjpeg-turbo freetype libcdio taglib libxml2 libxslt rapidjson sqlite ffmpeg crossguid libdvdnav libfmt lirc libfstrcmp flatbuffers:host flatbuffers libudfread spdlog" +PKG_DEPENDS_HOST="toolchain" PKG_LONGDESC="A free and open source cross-platform media player." PKG_BUILD_FLAGS="+speed" @@ -192,7 +193,7 @@ configure_package() { if [ ! "${KODIPLAYER_DRIVER}" = "default" -a "${DISPLAYSERVER}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${KODIPLAYER_DRIVER} libinput libxkbcommon" if [ "${OPENGLES_SUPPORT}" = yes -a "${KODIPLAYER_DRIVER}" = "${OPENGLES}" ]; then - KODI_PLAYER="-DCORE_PLATFORM_NAME=gbm -DAPP_RENDER_SYSTEM=gles" + KODI_PLATFORM="-DCORE_PLATFORM_NAME=gbm -DAPP_RENDER_SYSTEM=gles" CFLAGS+=" -DEGL_NO_X11" CXXFLAGS+=" -DEGL_NO_X11" if [ "${PROJECT}" = "Generic" ]; then @@ -228,7 +229,7 @@ configure_package() { -DENABLE_UDEV=ON \ -DENABLE_DBUS=ON \ -DENABLE_XSLT=ON \ - -DENABLE_CCACHE=ON \ + -DENABLE_CCACHE=OFF \ -DENABLE_LIRCCLIENT=ON \ -DENABLE_EVENTCLIENTS=ON \ -DENABLE_LDGOLD=ON \ @@ -255,12 +256,36 @@ configure_package() { ${KODI_AIRTUNES} \ ${KODI_OPTICAL} \ ${KODI_BLURAY} \ - ${KODI_PLAYER} \ ${KODI_ALSA} \ ${KODI_PULSEAUDIO} \ ${KODI_PIPEWIRE}" } +configure_host() { + setup_toolchain target:cmake + cmake ${CMAKE_GENERATOR_NINJA} \ + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ + -DHEADERS_ONLY=ON \ + ${KODI_ARCH} \ + ${KODI_NEON} \ + ${KODI_PLATFORM} .. +} + +make_host() { + : +} + +makeinstall_host() { + DESTDIR=${SYSROOT_PREFIX} cmake -DCMAKE_INSTALL_COMPONENT="kodi-addon-dev" -P cmake_install.cmake + + # more binaddons cross compile badness meh + sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR ${SYSROOT_PREFIX}/usr/include/kodi:g" \ + -e "s:CMAKE_MODULE_PATH /usr/lib/kodi /usr/share/kodi/cmake:CMAKE_MODULE_PATH ${SYSROOT_PREFIX}/usr/share/kodi/cmake:g" \ + -i ${SYSROOT_PREFIX}/usr/lib/kodi/cmake/KodiConfig.cmake +} + pre_configure_target() { export LIBS="${LIBS} -lncurses" } diff --git a/packages/mediacenter/kodi/patches/kodi-999.20-headers-only.patch b/packages/mediacenter/kodi/patches/kodi-999.20-headers-only.patch new file mode 100644 index 00000000000..6ea97a4797e --- /dev/null +++ b/packages/mediacenter/kodi/patches/kodi-999.20-headers-only.patch @@ -0,0 +1,48 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index e5824f0d20b7..cf17e1563a7f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -45,6 +45,7 @@ include(ExternalProject) + + + # general ++option(HEADERS_ONLY "Skip building" OFF) + option(VERBOSE "Enable verbose output?" OFF) + option(ENABLE_CLANGTIDY "Enable clang-tidy support?" OFF) + option(ENABLE_CPPCHECK "Enable cppcheck support?" OFF) +@@ -95,6 +96,7 @@ endif() + + core_find_git_rev(APP_SCMID FULL) + ++if(NOT HEADERS_ONLY) + # Dynamically loaded libraries built with the project + add_custom_target(${APP_NAME_LC}-libraries) + set(LIBRARY_FILES "" CACHE STRING "" FORCE) +@@ -458,6 +460,7 @@ endif() + if(FFMPEG_CREATE_SHARED_LIBRARY) + set(CMAKE_CXX_CREATE_SHARED_LIBRARY "${FFMPEG_CREATE_SHARED_LIBRARY}") + endif() ++endif() + + # Platform specific additional extra targets + if(EXISTS ${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/ExtraTargets.cmake) +diff --git a/cmake/scripts/linux/Install.cmake b/cmake/scripts/linux/Install.cmake +index 331722cb5616..cc00c55fa27c 100644 +--- a/cmake/scripts/linux/Install.cmake ++++ b/cmake/scripts/linux/Install.cmake +@@ -51,6 +51,7 @@ configure_file(${CMAKE_SOURCE_DIR}/tools/Linux/kodi.desktop.in + configure_file(${CMAKE_SOURCE_DIR}/tools/Linux/kodi.metainfo.xml.in + ${CORE_BUILD_DIR}/${APP_PACKAGE}.metainfo.xml @ONLY) + ++if(NOT HEADERS_ONLY) + # Install app + install(TARGETS ${APP_NAME_LC} + DESTINATION ${libdir}/${APP_NAME_LC} +@@ -160,6 +161,7 @@ if(INTERNAL_TEXTUREPACKER_INSTALLABLE) + RENAME "${APP_NAME_LC}-TexturePacker" + COMPONENT kodi-tools-texturepacker) + endif() ++endif() + + # Install kodi-addon-dev headers + include(${CMAKE_SOURCE_DIR}/xbmc/addons/AddonBindings.cmake) diff --git a/packages/multimedia/ffmpeg/package.mk b/packages/multimedia/ffmpeg/package.mk index 1e1cda3fb46..196b17d2a5e 100644 --- a/packages/multimedia/ffmpeg/package.mk +++ b/packages/multimedia/ffmpeg/package.mk @@ -5,32 +5,42 @@ PKG_NAME="ffmpeg" PKG_LICENSE="LGPLv2.1+" PKG_SITE="https://ffmpeg.org" -PKG_DEPENDS_TARGET="toolchain zlib bzip2 gnutls speex SDL2 lame x264" +PKG_DEPENDS_TARGET="toolchain zlib bzip2 openssl speex SDL2 lame x264" PKG_LONGDESC="FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video." PKG_BUILD_FLAGS="-gold" case "${PROJECT}" in Amlogic) - PKG_VERSION="0e5290bcac015e52f6a65dafaf41ea125816257f" # dev/4.4/rpi_import_1 + PKG_VERSION="0e5290bcac015e52f6a65dafaf41ea125816257f" + PKG_FFMPEG_BRANCH="dev/4.4/rpi_import_1" PKG_SHA256="4bd6e56920b90429bc09e43cda554f5bb9125c4ac090b4331fc459bb709eea68" PKG_URL="https://github.com/jc-kynesim/rpi-ffmpeg/archive/${PKG_VERSION}.tar.gz" - PKG_PATCH_DIRS="libreelec" + PKG_PATCH_DIRS="libreelec dav1d" ;; RPi) - PKG_VERSION="4.4-N-Alpha1" - PKG_SHA256="eb396f46ef7c5ac01b67818d0f2c0516fd4ab32aa9065a9ffa71eebede67ff20" + PKG_VERSION="4.4.1-Nexus-Alpha1" + PKG_SHA256="abbce62231baffe237e412689c71ffe01bfc83135afd375f1e538caae87729ed" PKG_URL="https://github.com/xbmc/FFmpeg/archive/${PKG_VERSION}.tar.gz" PKG_FFMPEG_RPI="--disable-mmal --disable-rpi --enable-sand" PKG_PATCH_DIRS="libreelec rpi" ;; *) - PKG_VERSION="4.4-N-Alpha1" - PKG_SHA256="eb396f46ef7c5ac01b67818d0f2c0516fd4ab32aa9065a9ffa71eebede67ff20" + PKG_VERSION="4.4.1-Nexus-Alpha1" + PKG_SHA256="abbce62231baffe237e412689c71ffe01bfc83135afd375f1e538caae87729ed" PKG_URL="https://github.com/xbmc/FFmpeg/archive/${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="libreelec v4l2-request v4l2-drmprime" ;; esac +post_unpack() { + # Fix FFmpeg version + if [ "${PROJECT}" = "Amlogic" ]; then + echo "${PKG_FFMPEG_BRANCH}-${PKG_VERSION:0:7}" > ${PKG_BUILD}/VERSION + else + echo "${PKG_VERSION}" > ${PKG_BUILD}/RELEASE + fi +} + # Dependencies get_graphicdrivers @@ -152,7 +162,7 @@ fi --disable-static \ --enable-shared \ --enable-gpl \ - --disable-version3 \ + --enable-version3 \ --enable-logging \ --disable-doc \ ${PKG_FFMPEG_DEBUG} \ @@ -168,7 +178,7 @@ fi --enable-avfilter \ --enable-pthreads \ --enable-network \ - --enable-gnutls --disable-openssl \ + --disable-gnutls --enable-openssl \ --disable-gray \ --enable-swscale-alpha \ --disable-small \ diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-support-dav1d-1-0-0.patch b/packages/multimedia/ffmpeg/patches/dav1d/ffmpeg-support-dav1d-1-0-0.patch similarity index 100% rename from packages/multimedia/ffmpeg/patches/ffmpeg-support-dav1d-1-0-0.patch rename to packages/multimedia/ffmpeg/patches/dav1d/ffmpeg-support-dav1d-1-0-0.patch diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-openssl3.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-openssl3.patch new file mode 100644 index 00000000000..59e78ab3699 --- /dev/null +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-openssl3.patch @@ -0,0 +1,44 @@ +From 1d23e125b6f76e74b754560c3b6931507cacddce Mon Sep 17 00:00:00 2001 +From: Timo Rothenpieler +Date: Tue, 7 Sep 2021 19:35:31 +0200 +Subject: [PATCH] configure: account for openssl3 license change + +--- + configure | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/configure b/configure +index c87a010387..ed7345b2c1 100755 +--- a/configure ++++ b/configure +@@ -1765,7 +1765,6 @@ EXTERNAL_LIBRARY_GPL_LIST=" + EXTERNAL_LIBRARY_NONFREE_LIST=" + decklink + libfdk_aac +- openssl + libtls + " + +@@ -1857,6 +1856,7 @@ EXTERNAL_LIBRARY_LIST=" + mediacodec + openal + opengl ++ openssl + pocketsphinx + vapoursynth + " +@@ -6572,7 +6572,10 @@ enabled omx_rpi && { test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoR + die "ERROR: OpenMAX IL headers from raspberrypi/firmware not found"; } && + enable omx + enabled omx && require_headers OMX_Core.h +-enabled openssl && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || ++enabled openssl && { { check_pkg_config openssl "openssl >= 3.0.0" openssl/ssl.h OPENSSL_init_ssl && ++ { enabled gplv3 || ! enabled gpl || enabled nonfree || die "ERROR: OpenSSL >=3.0.0 requires --enable-version3"; }; } || ++ { enabled gpl && ! enabled nonfree && die "ERROR: OpenSSL <3.0.0 is incompatible with the gpl"; } || ++ check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || + check_pkg_config openssl openssl openssl/ssl.h SSL_library_init || + check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto || + check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto || +-- +2.34.1 + diff --git a/packages/multimedia/ffmpeg/patches/rpi/ffmpeg-001-rpi.patch b/packages/multimedia/ffmpeg/patches/rpi/ffmpeg-001-rpi.patch index ca1830666f5..b4d95efd333 100644 --- a/packages/multimedia/ffmpeg/patches/rpi/ffmpeg-001-rpi.patch +++ b/packages/multimedia/ffmpeg/patches/rpi/ffmpeg-001-rpi.patch @@ -1,5 +1,5 @@ diff --git a/configure b/configure -index d7a3f507e8..9b7435ec79 100755 +index d7a3f507e8..7c2dd7161c 100755 --- a/configure +++ b/configure @@ -207,6 +207,7 @@ External library support: @@ -57,7 +57,7 @@ index d7a3f507e8..9b7435ec79 100755 " DOCUMENT_LIST=" -@@ -1884,12 +1896,16 @@ FEATURE_LIST=" +@@ -1884,12 +1896,17 @@ FEATURE_LIST=" gray hardcoded_tables omx_rpi @@ -71,10 +71,11 @@ index d7a3f507e8..9b7435ec79 100755 swscale_alpha + vout_drm + vout_egl ++ v4l2_req_hevc_vx " # this list should be kept in linking order -@@ -1930,6 +1946,7 @@ SUBSYSTEM_LIST=" +@@ -1930,6 +1947,7 @@ SUBSYSTEM_LIST=" pixelutils network rdft @@ -82,7 +83,7 @@ index d7a3f507e8..9b7435ec79 100755 " # COMPONENT_LIST needs to come last to ensure correct dependency checking -@@ -2416,9 +2433,11 @@ CONFIG_EXTRA=" +@@ -2416,9 +2434,11 @@ CONFIG_EXTRA=" rangecoder riffdec riffenc @@ -94,7 +95,7 @@ index d7a3f507e8..9b7435ec79 100755 scene_sad sinewin snappy -@@ -2750,6 +2769,8 @@ hap_decoder_select="snappy texturedsp" +@@ -2750,6 +2770,8 @@ hap_decoder_select="snappy texturedsp" hap_encoder_deps="libsnappy" hap_encoder_select="texturedspenc" hevc_decoder_select="atsc_a53 bswapdsp cabac golomb hevcparse videodsp" @@ -103,7 +104,7 @@ index d7a3f507e8..9b7435ec79 100755 huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp" huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp" hymt_decoder_select="huffyuv_decoder" -@@ -2919,6 +2940,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext" +@@ -2919,6 +2941,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext" dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32" ffnvcodec_deps_any="libdl LoadLibrary" nvdec_deps="ffnvcodec" @@ -111,7 +112,7 @@ index d7a3f507e8..9b7435ec79 100755 vaapi_x11_deps="xlib" videotoolbox_hwaccel_deps="videotoolbox pthreads" videotoolbox_hwaccel_extralibs="-framework QuartzCore" -@@ -2960,6 +2982,12 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" +@@ -2960,6 +2983,12 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" hevc_dxva2_hwaccel_select="hevc_decoder" hevc_nvdec_hwaccel_deps="nvdec" hevc_nvdec_hwaccel_select="hevc_decoder" @@ -124,7 +125,7 @@ index d7a3f507e8..9b7435ec79 100755 hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC" hevc_vaapi_hwaccel_select="hevc_decoder" hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC" -@@ -3437,8 +3465,13 @@ sndio_indev_deps="sndio" +@@ -3437,8 +3466,13 @@ sndio_indev_deps="sndio" sndio_outdev_deps="sndio" v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" v4l2_indev_suggest="libv4l2" @@ -138,7 +139,7 @@ index d7a3f507e8..9b7435ec79 100755 vfwcap_indev_deps="vfw32 vfwcap_defines" xcbgrab_indev_deps="libxcb" xcbgrab_indev_suggest="libxcb_shm libxcb_shape libxcb_xfixes" -@@ -3657,6 +3690,7 @@ tonemap_vaapi_filter_deps="vaapi VAProcFilterParameterBufferHDRToneMapping" +@@ -3657,6 +3691,7 @@ tonemap_vaapi_filter_deps="vaapi VAProcFilterParameterBufferHDRToneMapping" tonemap_opencl_filter_deps="opencl const_nan" transpose_opencl_filter_deps="opencl" transpose_vaapi_filter_deps="vaapi VAProcPipelineCaps_rotation_flags" @@ -146,7 +147,7 @@ index d7a3f507e8..9b7435ec79 100755 unsharp_opencl_filter_deps="opencl" uspp_filter_deps="gpl avcodec" vaguedenoiser_filter_deps="gpl" -@@ -6154,6 +6188,12 @@ check_func_headers glob.h glob +@@ -6154,6 +6189,12 @@ check_func_headers glob.h glob enabled xlib && check_lib xlib "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext @@ -159,7 +160,7 @@ index d7a3f507e8..9b7435ec79 100755 check_headers direct.h check_headers dirent.h check_headers dxgidebug.h -@@ -6491,11 +6531,12 @@ enabled mbedtls && { check_pkg_config mbedtls mbedtls mbedtls/x509_crt +@@ -6491,11 +6532,12 @@ enabled mbedtls && { check_pkg_config mbedtls mbedtls mbedtls/x509_crt check_lib mbedtls mbedtls/ssl.h mbedtls_ssl_init -lmbedtls -lmbedx509 -lmbedcrypto || die "ERROR: mbedTLS not found"; } enabled mediacodec && { enabled jni || die "ERROR: mediacodec requires --enable-jni"; } @@ -174,7 +175,7 @@ index d7a3f507e8..9b7435ec79 100755 die "ERROR: mmal not found" && check_func_headers interface/mmal/mmal.h "MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS"; } enabled openal && { { for al_extralibs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do -@@ -6536,8 +6577,16 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r +@@ -6536,8 +6578,16 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r { enabled libdrm || die "ERROR: rkmpp requires --enable-libdrm"; } } @@ -191,12 +192,20 @@ index d7a3f507e8..9b7435ec79 100755 if enabled gcrypt; then GCRYPT_CONFIG="${cross_prefix}libgcrypt-config" -@@ -6617,6 +6666,8 @@ if enabled v4l2_m2m; then +@@ -6617,6 +6667,16 @@ if enabled v4l2_m2m; then check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" fi +check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns +check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;" ++disable v4l2_req_hevc_vx ++if enabled hevc_v4l2request_hwaccel; then ++ enable v4l2_req_hevc_vx ++fi ++if enabled hevc_v4l2_request; then ++ disable v4l2_req_hevc_vx ++fi ++ check_headers sys/videoio.h test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete @@ -375,7 +384,7 @@ index 807e783422..456d4f349b 100644 "write program-readable progress information", "url" }, { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction }, diff --git a/libavcodec/Makefile b/libavcodec/Makefile -index 33a280cf69..a403dc41d6 100644 +index 33a280cf69..1372d3981d 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -19,6 +19,7 @@ HEADERS = ac3_parser.h \ @@ -427,8 +436,8 @@ index 33a280cf69..a403dc41d6 100644 OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o +OBJS-$(CONFIG_HEVC_RPI4_8_HWACCEL) += rpivid_hevc.o +OBJS-$(CONFIG_HEVC_RPI4_10_HWACCEL) += rpivid_hevc.o -+OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o v4l2_req_decode_q.o\ -+ v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o v4l2_req_hevc_v3.o v4l2_req_hevc_v4.o ++OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o v4l2_req_decode_q.o v4l2_req_hevc_v4.o ++OBJS-$(CONFIG_V4L2_REQ_HEVC_VX) += v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o v4l2_req_hevc_v3.o OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o @@ -18880,10 +18889,10 @@ index 0000000000..4e35bd583d +#endif diff --git a/libavcodec/hevc-ctrls-v4.h b/libavcodec/hevc-ctrls-v4.h new file mode 100644 -index 0000000000..7e05f6e7c3 +index 0000000000..7829d82084 --- /dev/null +++ b/libavcodec/hevc-ctrls-v4.h -@@ -0,0 +1,515 @@ +@@ -0,0 +1,517 @@ +/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* + * Video for Linux Two controls header file @@ -18939,6 +18948,8 @@ index 0000000000..7e05f6e7c3 +#include +#include + ++#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ ++ +#define V4L2_CID_STATELESS_HEVC_SPS (V4L2_CID_CODEC_STATELESS_BASE + 400) +#define V4L2_CID_STATELESS_HEVC_PPS (V4L2_CID_CODEC_STATELESS_BASE + 401) +#define V4L2_CID_STATELESS_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 402) @@ -52820,7 +52831,7 @@ index b67b216331..ee72beb052 100644 + #endif /* AVCODEC_V4L2_M2M_H */ diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index ab07c0a24a..545651e560 100644 +index ab07c0a24a..9312afdf56 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -23,6 +23,10 @@ @@ -52834,7 +52845,7 @@ index ab07c0a24a..545651e560 100644 #include "libavutil/pixfmt.h" #include "libavutil/pixdesc.h" #include "libavutil/opt.h" -@@ -30,75 +34,107 @@ +@@ -30,75 +34,111 @@ #include "libavcodec/decode.h" #include "libavcodec/internal.h" @@ -52847,23 +52858,15 @@ index ab07c0a24a..545651e560 100644 #include "v4l2_fmt.h" -static int v4l2_try_start(AVCodecContext *avctx) -+// Pick 64 for max last count - that is >1sec at 60fps -+#define STATS_LAST_COUNT_MAX 64 -+#define STATS_INTERVAL_MAX (1 << 30) -+ -+static int64_t pts_stats_guess(const pts_stats_t * const stats) - { +-{ - V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; - V4L2Context *const capture = &s->capture; - V4L2Context *const output = &s->output; - struct v4l2_selection selection = { 0 }; - int ret; -+ if (stats->last_pts == AV_NOPTS_VALUE || -+ stats->last_interval == 0 || -+ stats->last_count >= STATS_LAST_COUNT_MAX) -+ return AV_NOPTS_VALUE; -+ return stats->last_pts + (int64_t)(stats->last_count - 1) * (int64_t)stats->last_interval; -+} ++// Pick 64 for max last count - that is >1sec at 60fps ++#define STATS_LAST_COUNT_MAX 64 ++#define STATS_INTERVAL_MAX (1 << 30) - /* 1. start the output process */ - if (!output->streamon) { @@ -52871,27 +52874,74 @@ index ab07c0a24a..545651e560 100644 - if (ret < 0) { - av_log(avctx, AV_LOG_DEBUG, "VIDIOC_STREAMON on output context\n"); - return ret; +- } +- } ++#ifndef FF_API_BUFFER_SIZE_T ++#define FF_API_BUFFER_SIZE_T 1 ++#endif + +- if (capture->streamon) +- return 0; ++static int64_t pts_stats_guess(const pts_stats_t * const stats) ++{ ++ if (stats->last_pts == AV_NOPTS_VALUE || ++ stats->last_interval == 0 || ++ stats->last_count >= STATS_LAST_COUNT_MAX) ++ return AV_NOPTS_VALUE; ++ return stats->last_pts + (int64_t)(stats->last_count - 1) * (int64_t)stats->last_interval; ++} + +- /* 2. get the capture format */ +- capture->format.type = capture->type; +- ret = ioctl(s->fd, VIDIOC_G_FMT, &capture->format); +- if (ret) { +- av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_FMT ioctl\n"); +- return ret; +static void pts_stats_add(pts_stats_t * const stats, int64_t pts) +{ + if (pts == AV_NOPTS_VALUE || pts == stats->last_pts) { + if (stats->last_count < STATS_LAST_COUNT_MAX) + ++stats->last_count; + return; -+ } -+ + } + +- /* 2.1 update the AVCodecContext */ +- avctx->pix_fmt = ff_v4l2_format_v4l2_to_avfmt(capture->format.fmt.pix_mp.pixelformat, AV_CODEC_ID_RAWVIDEO); +- capture->av_pix_fmt = avctx->pix_fmt; + if (stats->last_pts != AV_NOPTS_VALUE) { + const int64_t interval = pts - stats->last_pts; -+ + +- /* 3. set the crop parameters */ +- selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; +- selection.r.height = avctx->coded_height; +- selection.r.width = avctx->coded_width; +- ret = ioctl(s->fd, VIDIOC_S_SELECTION, &selection); +- if (!ret) { +- ret = ioctl(s->fd, VIDIOC_G_SELECTION, &selection); +- if (ret) { +- av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_SELECTION ioctl\n"); +- } else { +- av_log(avctx, AV_LOG_DEBUG, "crop output %dx%d\n", selection.r.width, selection.r.height); +- /* update the size of the resulting frame */ +- capture->height = selection.r.height; +- capture->width = selection.r.width; + if (interval < 0 || interval >= STATS_INTERVAL_MAX || + stats->last_count >= STATS_LAST_COUNT_MAX) { + if (stats->last_interval != 0) + av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: Bad interval: %" PRId64 "/%d\n", + __func__, stats->name, interval, stats->last_count); + stats->last_interval = 0; -+ } + } +- } + else { + const int64_t frame_time = interval / (int64_t)stats->last_count; -+ + +- /* 4. init the capture context now that we have the capture format */ +- if (!capture->buffers) { +- ret = ff_v4l2_context_init(capture); +- if (ret) { +- av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n"); +- return AVERROR(ENOMEM); + if (frame_time != stats->last_interval) + av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: New interval: %u->%" PRId64 "/%d=%" PRId64 "\n", + __func__, stats->name, stats->last_interval, interval, stats->last_count, frame_time); @@ -52899,7 +52949,10 @@ index ab07c0a24a..545651e560 100644 } } -- if (capture->streamon) +- /* 5. start the capture process */ +- ret = ff_v4l2_context_set_status(capture, VIDIOC_STREAMON); +- if (ret) { +- av_log(avctx, AV_LOG_DEBUG, "VIDIOC_STREAMON, on capture context\n"); + stats->last_pts = pts; + stats->last_count = 1; +} @@ -52924,76 +52977,38 @@ index ab07c0a24a..545651e560 100644 + }; + + if (s->output.streamon) - return 0; - -- /* 2. get the capture format */ -- capture->format.type = capture->type; -- ret = ioctl(s->fd, VIDIOC_G_FMT, &capture->format); -- if (ret) { -- av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_FMT ioctl\n"); ++ return 0; ++ + ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMON); + if (ret != 0) { + av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON on output context: %s\n", av_err2str(ret)); return ret; } -- /* 2.1 update the AVCodecContext */ -- avctx->pix_fmt = ff_v4l2_format_v4l2_to_avfmt(capture->format.fmt.pix_mp.pixelformat, AV_CODEC_ID_RAWVIDEO); -- capture->av_pix_fmt = avctx->pix_fmt; -- -- /* 3. set the crop parameters */ -- selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; -- selection.r.height = avctx->coded_height; -- selection.r.width = avctx->coded_width; -- ret = ioctl(s->fd, VIDIOC_S_SELECTION, &selection); -- if (!ret) { -- ret = ioctl(s->fd, VIDIOC_G_SELECTION, &selection); -- if (ret) { -- av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_SELECTION ioctl\n"); -- } else { -- av_log(avctx, AV_LOG_DEBUG, "crop output %dx%d\n", selection.r.width, selection.r.height); -- /* update the size of the resulting frame */ -- capture->height = selection.r.height; -- capture->width = selection.r.width; -- } + // STREAMON should do implicit START so this just for those that don't. + // It is optional so don't worry if it fails + if (ioctl(s->fd, VIDIOC_DECODER_CMD, &cmd) < 0) { + ret = AVERROR(errno); + av_log(avctx, AV_LOG_WARNING, "VIDIOC_DECODER_CMD start error: %s\n", av_err2str(ret)); - } -- -- /* 4. init the capture context now that we have the capture format */ -- if (!capture->buffers) { -- ret = ff_v4l2_context_init(capture); -- if (ret) { -- av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n"); -- return AVERROR(ENOMEM); -- } ++ } + else { + av_log(avctx, AV_LOG_TRACE, "VIDIOC_DECODER_CMD start OK\n"); - } ++ } + return 0; +} - -- /* 5. start the capture process */ -- ret = ff_v4l2_context_set_status(capture, VIDIOC_STREAMON); -- if (ret) { -- av_log(avctx, AV_LOG_DEBUG, "VIDIOC_STREAMON, on capture context\n"); -- return ret; -- } ++ +static int v4l2_try_start(AVCodecContext *avctx) +{ + V4L2m2mContext * const s = ((V4L2m2mPriv*)avctx->priv_data)->context; + int ret; - ++ + /* 1. start the output process */ + if ((ret = check_output_streamon(avctx, s)) != 0) + return ret; return 0; } -@@ -133,58 +169,552 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) +@@ -133,58 +173,555 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) return 0; } @@ -53107,8 +53122,11 @@ index ab07c0a24a..545651e560 100644 + + for (i = 0; i < 256; ++i) { + uint8_t * side_data; ++#if FF_API_BUFFER_SIZE_T ++ int side_size; ++#else + size_t side_size; -+ ++#endif + ret = ff_decode_get_packet(avctx, &s->buf_pkt); + if (ret != 0) + break; @@ -53119,7 +53137,7 @@ index ab07c0a24a..545651e560 100644 + av_log(avctx, AV_LOG_DEBUG, "New extradata\n"); + av_freep(&s->extdata_data); + if ((s->extdata_data = av_malloc(side_size ? side_size : 1)) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to alloc %zd bytes of extra data\n", side_size); ++ av_log(avctx, AV_LOG_ERROR, "Failed to alloc %d bytes of extra data\n", (int)side_size); + return AVERROR(ENOMEM); + } + memcpy(s->extdata_data, side_data, side_size); @@ -53193,22 +53211,22 @@ index ab07c0a24a..545651e560 100644 + + if (!s->buf_pkt.size) + return NQ_NONE; ++ ++ if ((ret = check_output_streamon(avctx, s)) != 0) ++ return ret; - ret = ff_v4l2_context_enqueue_packet(output, &s->buf_pkt); - if (ret < 0 && ret != AVERROR(EAGAIN)) - goto fail; -+ if ((ret = check_output_streamon(avctx, s)) != 0) -+ return ret; - -- /* if EAGAIN don't unref packet and try to enqueue in the next iteration */ -- if (ret != AVERROR(EAGAIN)) + if (s->extdata_sent) + ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0); + else if (s->extdata_data) + ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, s->extdata_data, s->extdata_size); + else + ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, avctx->extradata, avctx->extradata_size); -+ + +- /* if EAGAIN don't unref packet and try to enqueue in the next iteration */ +- if (ret != AVERROR(EAGAIN)) + if (ret == AVERROR(EAGAIN)) { + // Out of input buffers - keep packet + ret = NQ_Q_FULL; @@ -53227,15 +53245,6 @@ index ab07c0a24a..545651e560 100644 - goto fail; + av_log(avctx, AV_LOG_ERROR, "Packet enqueue failure: err=%d\n", ret); + return ret; -+ } -+ } -+ -+ // Start if we haven't -+ { -+ const int ret2 = v4l2_try_start(avctx); -+ if (ret2) { -+ av_log(avctx, AV_LOG_DEBUG, "Start failure: err=%d\n", ret2); -+ ret = (ret2 == AVERROR(ENOMEM)) ? ret2 : NQ_DEAD; } } @@ -53243,9 +53252,18 @@ index ab07c0a24a..545651e560 100644 - return ff_v4l2_context_dequeue_frame(capture, frame, -1); -fail: - av_packet_unref(&s->buf_pkt); - return ret; - } - ++ // Start if we haven't ++ { ++ const int ret2 = v4l2_try_start(avctx); ++ if (ret2) { ++ av_log(avctx, AV_LOG_DEBUG, "Start failure: err=%d\n", ret2); ++ ret = (ret2 == AVERROR(ENOMEM)) ? ret2 : NQ_DEAD; ++ } ++ } ++ ++ return ret; ++} ++ +static int qbuf_wait(AVCodecContext * const avctx, V4L2Context * const ctx) +{ + int rv = 0; @@ -53415,8 +53433,8 @@ index ab07c0a24a..545651e560 100644 + ret = v4l2_receive_frame2(avctx, frame); + done = us_time(); + av_log(avctx, AV_LOG_TRACE, ">>> %s: rx time=%" PRId64 ", rv=%d\n", __func__, done - now, ret); -+ return ret; -+} + return ret; + } +#endif + +static int @@ -53538,7 +53556,7 @@ index ab07c0a24a..545651e560 100644 + // with small WxH + return size + (1 << 16); +} -+ + static av_cold int v4l2_decode_init(AVCodecContext *avctx) { V4L2Context *capture, *output; @@ -53570,7 +53588,7 @@ index ab07c0a24a..545651e560 100644 capture = &s->capture; output = &s->output; -@@ -192,14 +722,51 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) +@@ -192,14 +729,51 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) * by the v4l2 driver; this event will trigger a full pipeline reconfig and * the proper values will be retrieved from the kernel driver. */ @@ -53624,7 +53642,7 @@ index ab07c0a24a..545651e560 100644 s->avctx = avctx; ret = ff_v4l2_m2m_codec_init(priv); -@@ -208,12 +775,74 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) +@@ -208,12 +782,74 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) return ret; } @@ -53701,7 +53719,7 @@ index ab07c0a24a..545651e560 100644 } #define OFFSET(x) offsetof(V4L2m2mPriv, x) -@@ -222,10 +851,16 @@ static av_cold int v4l2_decode_close(AVCodecContext *avctx) +@@ -222,10 +858,16 @@ static av_cold int v4l2_decode_close(AVCodecContext *avctx) static const AVOption options[] = { V4L_M2M_DEFAULT_OPTS, { "num_capture_buffers", "Number of buffers in the capture context", @@ -53719,7 +53737,7 @@ index ab07c0a24a..545651e560 100644 #define M2MDEC_CLASS(NAME) \ static const AVClass v4l2_m2m_ ## NAME ## _dec_class = { \ .class_name = #NAME "_v4l2m2m_decoder", \ -@@ -246,9 +881,15 @@ static const AVOption options[] = { +@@ -246,9 +888,15 @@ static const AVOption options[] = { .init = v4l2_decode_init, \ .receive_frame = v4l2_receive_frame, \ .close = v4l2_decode_close, \ @@ -54701,10 +54719,10 @@ index 0000000000..0baef36535 +#endif diff --git a/libavcodec/v4l2_req_dmabufs.c b/libavcodec/v4l2_req_dmabufs.c new file mode 100644 -index 0000000000..ae6c648369 +index 0000000000..c4bbed18c6 --- /dev/null +++ b/libavcodec/v4l2_req_dmabufs.c -@@ -0,0 +1,266 @@ +@@ -0,0 +1,288 @@ +#include +#include +#include @@ -54743,6 +54761,26 @@ index 0000000000..ae6c648369 +static size_t total_size = 0; +#endif + ++struct dmabuf_h * dmabuf_import_mmap(void * mapptr, size_t size) ++{ ++ struct dmabuf_h *dh; ++ ++ if (mapptr == MAP_FAILED) ++ return NULL; ++ ++ dh = malloc(sizeof(*dh)); ++ if (!dh) ++ return NULL; ++ ++ *dh = (struct dmabuf_h) { ++ .fd = -1, ++ .size = size, ++ .mapptr = mapptr ++ }; ++ ++ return dh; ++} ++ +struct dmabuf_h * dmabuf_import(int fd, size_t size) +{ + struct dmabuf_h *dh; @@ -54829,6 +54867,8 @@ index 0000000000..ae6c648369 + struct dma_buf_sync sync = { + .flags = flags + }; ++ if (dh->fd == -1) ++ return 0; + while (ioctl(dh->fd, DMA_BUF_IOCTL_SYNC, &sync) == -1) { + const int err = errno; + if (errno == EINTR) @@ -54973,10 +55013,10 @@ index 0000000000..ae6c648369 + diff --git a/libavcodec/v4l2_req_dmabufs.h b/libavcodec/v4l2_req_dmabufs.h new file mode 100644 -index 0000000000..8d909c4297 +index 0000000000..e36aa0a712 --- /dev/null +++ b/libavcodec/v4l2_req_dmabufs.h -@@ -0,0 +1,38 @@ +@@ -0,0 +1,41 @@ +#ifndef DMABUFS_H +#define DMABUFS_H + @@ -54995,6 +55035,9 @@ index 0000000000..8d909c4297 +} +/* Create from existing fd - dups(fd) */ +struct dmabuf_h * dmabuf_import(int fd, size_t size); ++/* Import an MMAP - return NULL if mapptr = MAP_FAIL */ ++struct dmabuf_h * dmabuf_import_mmap(void * mapptr, size_t size); ++ +void * dmabuf_map(struct dmabuf_h * const dh); + +/* flags from linux/dmabuf.h DMA_BUF_SYNC_xxx */ @@ -55053,10 +55096,10 @@ index 0000000000..c35579d8e0 + diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c new file mode 100644 -index 0000000000..9ff5592e61 +index 0000000000..b98d8464ca --- /dev/null +++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -0,0 +1,1365 @@ +@@ -0,0 +1,1360 @@ +// File included by v4l2_req_hevc_v* - not compiled on its own + +#include "decode.h" @@ -55097,11 +55140,6 @@ index 0000000000..9ff5592e61 +#define V4L2_STATELESS_HEVC_START_CODE_ANNEX_B V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B +#endif + -+// Should be in videodev2 but we might not have a good enough one -+#ifndef V4L2_PIX_FMT_HEVC_SLICE -+#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ -+#endif -+ +#include "v4l2_request_hevc.h" + +#include "libavutil/hwcontext_drm.h" @@ -56424,10 +56462,10 @@ index 0000000000..9ff5592e61 + diff --git a/libavcodec/v4l2_req_media.c b/libavcodec/v4l2_req_media.c new file mode 100644 -index 0000000000..980b306b8a +index 0000000000..1a9944774a --- /dev/null +++ b/libavcodec/v4l2_req_media.c -@@ -0,0 +1,1601 @@ +@@ -0,0 +1,1802 @@ +/* + * Copyright (C) 2018 Paul Kocialkowski + * @@ -56463,9 +56501,11 @@ index 0000000000..980b306b8a +#include +#include +#include ++#include +#include +#include +#include ++#include + +#include + @@ -56525,6 +56565,32 @@ index 0000000000..980b306b8a + struct polltask * pt; +}; + ++static inline enum v4l2_memory ++mediabufs_memory_to_v4l2(const enum mediabufs_memory m) ++{ ++ return (enum v4l2_memory)m; ++} ++ ++const char * ++mediabufs_memory_name(const enum mediabufs_memory m) ++{ ++ switch (m) { ++ case MEDIABUFS_MEMORY_UNSET: ++ return "Unset"; ++ case MEDIABUFS_MEMORY_MMAP: ++ return "MMap"; ++ case MEDIABUFS_MEMORY_USERPTR: ++ return "UserPtr"; ++ case MEDIABUFS_MEMORY_OVERLAY: ++ return "Overlay"; ++ case MEDIABUFS_MEMORY_DMABUF: ++ return "DMABuf"; ++ default: ++ break; ++ } ++ return "Unknown"; ++} ++ + +static inline int do_trywait(sem_t *const sem) +{ @@ -56545,14 +56611,14 @@ index 0000000000..980b306b8a +} + +static int request_buffers(int video_fd, unsigned int type, -+ enum v4l2_memory memory, unsigned int buffers_count) ++ enum mediabufs_memory memory, unsigned int buffers_count) +{ + struct v4l2_requestbuffers buffers; + int rc; + + memset(&buffers, 0, sizeof(buffers)); + buffers.type = type; -+ buffers.memory = memory; ++ buffers.memory = mediabufs_memory_to_v4l2(memory); + buffers.count = buffers_count; + + rc = ioctl(video_fd, VIDIOC_REQBUFS, &buffers); @@ -56754,6 +56820,7 @@ index 0000000000..980b306b8a + struct qent_base *next; + struct qent_base *prev; + enum qent_status status; ++ enum mediabufs_memory memtype; + uint32_t index; + struct dmabuf_h *dh[VIDEO_MAX_PLANES]; + struct timeval timestamp; @@ -56778,9 +56845,9 @@ index 0000000000..980b306b8a +}; + +struct buf_pool { ++ enum mediabufs_memory memtype; + pthread_mutex_t lock; + sem_t free_sem; -+ enum v4l2_buf_type buf_type; + struct qe_list_head free; + struct qe_list_head inuse; +}; @@ -56797,9 +56864,10 @@ index 0000000000..980b306b8a +} + + -+#define QENT_BASE_INITIALIZER {\ ++#define QENT_BASE_INITIALIZER(mtype) {\ + .ref_count = ATOMIC_VAR_INIT(0),\ + .status = QENT_NEW,\ ++ .memtype = (mtype),\ + .index = INDEX_UNSET\ +} + @@ -56820,13 +56888,13 @@ index 0000000000..980b306b8a + free(be_src); +} + -+static struct qent_src * qe_src_new(void) ++static struct qent_src * qe_src_new(enum mediabufs_memory mtype) +{ + struct qent_src *const be_src = malloc(sizeof(*be_src)); + if (!be_src) + return NULL; + *be_src = (struct qent_src){ -+ .base = QENT_BASE_INITIALIZER ++ .base = QENT_BASE_INITIALIZER(mtype) + }; + return be_src; +} @@ -56843,13 +56911,13 @@ index 0000000000..980b306b8a + free(be_dst); +} + -+static struct qent_dst* qe_dst_new(struct ff_weak_link_master * const wl) ++static struct qent_dst* qe_dst_new(struct ff_weak_link_master * const wl, const enum mediabufs_memory memtype) +{ + struct qent_dst *const be_dst = malloc(sizeof(*be_dst)); + if (!be_dst) + return NULL; + *be_dst = (struct qent_dst){ -+ .base = QENT_BASE_INITIALIZER, ++ .base = QENT_BASE_INITIALIZER(memtype), + .lock = PTHREAD_MUTEX_INITIALIZER, + .cond = PTHREAD_COND_INITIALIZER, + .mbc_wl = ff_weak_link_ref(wl) @@ -56983,14 +57051,14 @@ index 0000000000..980b306b8a + return buf; +} + -+static struct qent_base * queue_find_extract_fd(struct buf_pool *const bp, const int fd) ++static struct qent_base * queue_find_extract_index(struct buf_pool *const bp, const unsigned int index) +{ + struct qent_base *be; + + pthread_mutex_lock(&bp->lock); + /* Expect 1st in Q, but allow anywhere */ + for (be = bp->inuse.head; be; be = be->next) { -+ if (dmabuf_fd(be->dh[0]) == fd) { ++ if (be->index == index) { + bq_extract_inuse(bp, be); + break; + } @@ -57032,6 +57100,8 @@ index 0000000000..980b306b8a + struct pollqueue * pq; + struct ff_weak_link_master * this_wlm; + ++ enum mediabufs_memory src_memtype; ++ enum mediabufs_memory dst_memtype; + struct v4l2_format src_fmt; + struct v4l2_format dst_fmt; + struct v4l2_capability capability; @@ -57044,7 +57114,7 @@ index 0000000000..980b306b8a +{ + struct v4l2_buffer buffer = { + .type = fmt->type, -+ .memory = V4L2_MEMORY_DMABUF, ++ .memory = mediabufs_memory_to_v4l2(be->memtype), + .index = be->index + }; + struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; @@ -57058,7 +57128,10 @@ index 0000000000..980b306b8a + /* *** Really need a pixdesc rather than a format so we can fill in data_offset */ + planes[i].length = dmabuf_size(be->dh[i]); + planes[i].bytesused = dmabuf_len(be->dh[i]); -+ planes[i].m.fd = dmabuf_fd(be->dh[i]); ++ if (be->memtype == MEDIABUFS_MEMORY_DMABUF) ++ planes[i].m.fd = dmabuf_fd(be->dh[i]); ++ else ++ planes[i].m.mem_offset = 0; + } + buffer.m.planes = planes; + buffer.length = i; @@ -57069,7 +57142,10 @@ index 0000000000..980b306b8a + + buffer.bytesused = dmabuf_len(be->dh[0]); + buffer.length = dmabuf_size(be->dh[0]); -+ buffer.m.fd = dmabuf_fd(be->dh[0]); ++ if (be->memtype == MEDIABUFS_MEMORY_DMABUF) ++ buffer.m.fd = dmabuf_fd(be->dh[0]); ++ else ++ buffer.m.offset = 0; + } + + if (!is_dst && mreq) { @@ -57098,14 +57174,13 @@ index 0000000000..980b306b8a + const int vfd, + const struct v4l2_format * const f) +{ -+ int fd; + struct qent_base *be; + int rc; + const bool mp = V4L2_TYPE_IS_MULTIPLANAR(f->type); + struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; + struct v4l2_buffer buffer = { + .type = f->type, -+ .memory = V4L2_MEMORY_DMABUF ++ .memory = mediabufs_memory_to_v4l2(bp->memtype) + }; + if (mp) { + buffer.length = f->fmt.pix_mp.num_planes; @@ -57120,13 +57195,20 @@ index 0000000000..980b306b8a + return NULL; + } + -+ fd = mp ? planes[0].m.fd : buffer.m.fd; -+ be = queue_find_extract_fd(bp, fd); ++ be = queue_find_extract_index(bp, buffer.index); + if (!be) { -+ request_log("Failed to find fd %d in Q\n", fd); ++ request_log("Failed to find index %d in Q\n", buffer.index); + return NULL; + } + ++ if (mp) { ++ unsigned int i; ++ for (i = 0; i != buffer.length; ++i) ++ dmabuf_len_set(be->dh[i], V4L2_TYPE_IS_CAPTURE(f->type) ? planes[i].bytesused : 0); ++ } ++ else ++ dmabuf_len_set(be->dh[0], V4L2_TYPE_IS_CAPTURE(f->type) ? buffer.length : 0); ++ + be->timestamp = buffer.timestamp; + be->status = (buffer.flags & V4L2_BUF_FLAG_ERROR) ? QENT_ERROR : QENT_DONE; + return be; @@ -57534,7 +57616,7 @@ index 0000000000..980b306b8a + + struct v4l2_create_buffers cbuf = { + .count = n, -+ .memory = V4L2_MEMORY_DMABUF, ++ .memory = mediabufs_memory_to_v4l2(mbc->dst->memtype), + .format = mbc->dst_fmt, + }; + @@ -57555,12 +57637,97 @@ index 0000000000..980b306b8a + return cbuf.count; +} + ++static MediaBufsStatus ++qe_import_from_buf(struct mediabufs_ctl *const mbc, struct qent_base * const be, const struct v4l2_format *const fmt, ++ const unsigned int n, const bool x_dmabuf) ++{ ++ struct v4l2_buffer buf = { ++ .index = n, ++ .type = fmt->type, ++ }; ++ struct v4l2_plane planes[VIDEO_MAX_PLANES]; ++ int ret; ++ ++ if (be->dh[0]) ++ return 0; ++ ++ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { ++ memset(planes, 0, sizeof(planes)); ++ buf.m.planes = planes; ++ buf.length = VIDEO_MAX_PLANES; ++ } ++ ++ if ((ret = ioctl(mbc->vfd, VIDIOC_QUERYBUF, &buf)) != 0) { ++ request_err(mbc->dc, "VIDIOC_QUERYBUF failed"); ++ return MEDIABUFS_ERROR_OPERATION_FAILED; ++ } ++ ++ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) ++ { ++ unsigned int i; ++ for (i = 0; i != buf.length; ++i) { ++ if (x_dmabuf) { ++ struct v4l2_exportbuffer xbuf = { ++ .type = buf.type, ++ .index = buf.index, ++ .plane = i, ++ .flags = O_RDWR, // *** Arguably O_RDONLY would be fine ++ }; ++ if (ioctl(mbc->vfd, VIDIOC_EXPBUF, &xbuf) == 0) ++ be->dh[i] = dmabuf_import(xbuf.fd, planes[i].length); ++ } ++ else { ++ be->dh[i] = dmabuf_import_mmap( ++ mmap(NULL, planes[i].length, ++ PROT_READ | PROT_WRITE, ++ MAP_SHARED | MAP_POPULATE, ++ mbc->vfd, planes[i].m.mem_offset), ++ planes[i].length); ++ } ++ /* On failure tidy up and die */ ++ if (!be->dh[i]) { ++ while (i--) { ++ dmabuf_free(be->dh[i]); ++ be->dh[i] = NULL; ++ } ++ return MEDIABUFS_ERROR_OPERATION_FAILED; ++ } ++ } ++ } ++ else ++ { ++ if (x_dmabuf) { ++ struct v4l2_exportbuffer xbuf = { ++ .type = buf.type, ++ .index = buf.index, ++ .flags = O_RDWR, // *** Arguably O_RDONLY would be fine ++ }; ++ if (ioctl(mbc->vfd, VIDIOC_EXPBUF, &xbuf) == 0) ++ be->dh[0] = dmabuf_import(xbuf.fd, buf.length); ++ } ++ else { ++ be->dh[0] = dmabuf_import_mmap( ++ mmap(NULL, buf.length, ++ PROT_READ | PROT_WRITE, ++ MAP_SHARED | MAP_POPULATE, ++ mbc->vfd, buf.m.offset), ++ buf.length); ++ } ++ /* On failure tidy up and die */ ++ if (!be->dh[0]) { ++ return MEDIABUFS_ERROR_OPERATION_FAILED; ++ } ++ } ++ ++ return 0; ++} ++ +struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, struct dmabufs_ctl *const dbsc) +{ + struct qent_dst * be_dst; + + if (mbc == NULL) { -+ be_dst = qe_dst_new(NULL); ++ be_dst = qe_dst_new(NULL, MEDIABUFS_MEMORY_DMABUF); + if (be_dst) + be_dst->base.status = QENT_IMPORT; + return be_dst; @@ -57574,7 +57741,7 @@ index 0000000000..980b306b8a + else { + be_dst = base_to_dst(queue_tryget_free(mbc->dst)); + if (!be_dst) { -+ be_dst = qe_dst_new(mbc->this_wlm); ++ be_dst = qe_dst_new(mbc->this_wlm, mbc->dst->memtype); + if (!be_dst) + return NULL; + @@ -57585,12 +57752,21 @@ index 0000000000..980b306b8a + } + } + -+ if (qe_alloc_from_fmt(&be_dst->base, dbsc, &mbc->dst_fmt)) { -+ /* Given how create buf works we can't uncreate it on alloc failure -+ * all we can do is put it on the free Q -+ */ -+ queue_put_free(mbc->dst, &be_dst->base); -+ return NULL; ++ if (mbc->dst->memtype == MEDIABUFS_MEMORY_MMAP) { ++ if (qe_import_from_buf(mbc, &be_dst->base, &mbc->dst_fmt, be_dst->base.index, true)) { ++ request_err(mbc->dc, "Failed to export as dmabuf\n"); ++ queue_put_free(mbc->dst, &be_dst->base); ++ return NULL; ++ } ++ } ++ else { ++ if (qe_alloc_from_fmt(&be_dst->base, dbsc, &mbc->dst_fmt)) { ++ /* Given how create buf works we can't uncreate it on alloc failure ++ * all we can do is put it on the free Q ++ */ ++ queue_put_free(mbc->dst, &be_dst->base); ++ return NULL; ++ } + } + + be_dst->base.status = QENT_PENDING; @@ -57638,7 +57814,7 @@ index 0000000000..980b306b8a + +// ** This is a mess if we get partial alloc but without any way to remove +// individual V4L2 Q members we are somewhat stuffed -+MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed) ++MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed, const enum mediabufs_memory memtype) +{ + unsigned int i; + int a = 0; @@ -57648,10 +57824,12 @@ index 0000000000..980b306b8a + if (n > 32) + return MEDIABUFS_ERROR_ALLOCATION_FAILED; + ++ mbc->dst->memtype = memtype; ++ + // Create qents first as it is hard to get rid of the V4L2 buffers on error + for (qc = 0; qc != n; ++qc) + { -+ if ((qes[qc] = qe_dst_new(mbc->this_wlm)) == NULL) ++ if ((qes[qc] = qe_dst_new(mbc->this_wlm, mbc->dst->memtype)) == NULL) + goto fail; + } + @@ -57690,19 +57868,61 @@ index 0000000000..980b306b8a + queue_put_free(mbc->src, &qe_src->base); +} + ++static MediaBufsStatus ++chk_memory_type(struct mediabufs_ctl *const mbc, ++ const struct v4l2_format * const f, ++ const enum mediabufs_memory m) ++{ ++ struct v4l2_create_buffers cbuf = { ++ .count = 0, ++ .memory = V4L2_MEMORY_MMAP, ++ .format = *f ++ }; ++ ++ if (ioctl(mbc->vfd, VIDIOC_CREATE_BUFS, &cbuf) != 0) ++ return MEDIABUFS_ERROR_OPERATION_FAILED; ++ ++ switch (m) { ++ case MEDIABUFS_MEMORY_DMABUF: ++ // 0 = Unknown but assume not in that case ++ if ((cbuf.capabilities & V4L2_BUF_CAP_SUPPORTS_DMABUF) == 0) ++ return MEDIABUFS_ERROR_UNSUPPORTED_MEMORY; ++ break; ++ case MEDIABUFS_MEMORY_MMAP: ++ break; ++ default: ++ return MEDIABUFS_ERROR_UNSUPPORTED_MEMORY; ++ } ++ ++ return MEDIABUFS_STATUS_SUCCESS; ++} ++ ++MediaBufsStatus ++mediabufs_src_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype) ++{ ++ return chk_memory_type(mbc, &mbc->src_fmt, memtype); ++} ++ ++MediaBufsStatus ++mediabufs_dst_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype) ++{ ++ return chk_memory_type(mbc, &mbc->dst_fmt, memtype); ++} ++ +/* src format must have been set up before this */ +MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const mbc, + struct dmabufs_ctl * const dbsc, -+ unsigned int n) ++ unsigned int n, const enum mediabufs_memory memtype) +{ + unsigned int i; + struct v4l2_requestbuffers req = { + .count = n, + .type = mbc->src_fmt.type, -+ .memory = V4L2_MEMORY_DMABUF ++ .memory = mediabufs_memory_to_v4l2(memtype) + }; + + bq_free_all_free_src(mbc->src); ++ + while (ioctl(mbc->vfd, VIDIOC_REQBUFS, &req) == -1) { + if (errno != EINTR) { + request_err(mbc->dc, "%s: Failed to request src bufs\n", __func__); @@ -57716,21 +57936,36 @@ index 0000000000..980b306b8a + } + + for (i = 0; i != n; ++i) { -+ struct qent_src *const be_src = qe_src_new(); ++ struct qent_src *const be_src = qe_src_new(memtype); + if (!be_src) { + request_err(mbc->dc, "Failed to create src be %d\n", i); + goto fail; + } -+ if (qe_alloc_from_fmt(&be_src->base, dbsc, &mbc->src_fmt)) { -+ qe_src_free(be_src); ++ switch (memtype) { ++ case MEDIABUFS_MEMORY_MMAP: ++ if (qe_import_from_buf(mbc, &be_src->base, &mbc->src_fmt, i, false)) { ++ qe_src_free(be_src); ++ goto fail; ++ } ++ be_src->fixed_size = 1; ++ break; ++ case MEDIABUFS_MEMORY_DMABUF: ++ if (qe_alloc_from_fmt(&be_src->base, dbsc, &mbc->src_fmt)) { ++ qe_src_free(be_src); ++ goto fail; ++ } ++ be_src->fixed_size = !mediabufs_src_resizable(mbc); ++ break; ++ default: ++ request_err(mbc->dc, "Unexpected memorty type\n"); + goto fail; + } + be_src->base.index = i; -+ be_src->fixed_size = !mediabufs_src_resizable(mbc); + + queue_put_free(mbc->src, &be_src->base); + } + ++ mbc->src->memtype = memtype; + return MEDIABUFS_STATUS_SUCCESS; + +fail: @@ -57867,9 +58102,13 @@ index 0000000000..980b306b8a + +int mediabufs_src_resizable(const struct mediabufs_ctl *const mbc) +{ ++#if 1 ++ return 0; ++#else + // Single planar OUTPUT can only take exact size buffers + // Multiplanar will take larger than negotiated + return V4L2_TYPE_IS_MULTIPLANAR(mbc->src_fmt.type); ++#endif +} + +static void mediabufs_ctl_delete(struct mediabufs_ctl *const mbc) @@ -58031,10 +58270,10 @@ index 0000000000..980b306b8a + diff --git a/libavcodec/v4l2_req_media.h b/libavcodec/v4l2_req_media.h new file mode 100644 -index 0000000000..0307a831de +index 0000000000..890947b2e2 --- /dev/null +++ b/libavcodec/v4l2_req_media.h -@@ -0,0 +1,154 @@ +@@ -0,0 +1,171 @@ +/* +e.h +* @@ -58080,6 +58319,7 @@ index 0000000000..0307a831de + MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE, + MEDIABUFS_ERROR_UNSUPPORTED_RT_FORMAT, + MEDIABUFS_ERROR_ALLOCATION_FAILED, ++ MEDIABUFS_ERROR_UNSUPPORTED_MEMORY, +} MediaBufsStatus; + +struct media_pool * media_pool_new(const char * const media_path, @@ -58107,6 +58347,15 @@ index 0000000000..0307a831de +struct dmabuf_h; +struct dmabufs_ctl; + ++// 1-1 mammping to V4L2 type - just defined separetely to avoid some include versioning difficulties ++enum mediabufs_memory { ++ MEDIABUFS_MEMORY_UNSET = 0, ++ MEDIABUFS_MEMORY_MMAP = 1, ++ MEDIABUFS_MEMORY_USERPTR = 2, ++ MEDIABUFS_MEMORY_OVERLAY = 3, ++ MEDIABUFS_MEMORY_DMABUF = 4, ++}; ++ +int qent_src_params_set(struct qent_src *const be, const struct timeval * timestamp); +struct timeval qent_dst_timestamp_get(const struct qent_dst *const be_dst); + @@ -58130,6 +58379,8 @@ index 0000000000..0307a831de + unsigned int plane, + int fd, size_t size); + ++const char * mediabufs_memory_name(const enum mediabufs_memory m); ++ +MediaBufsStatus mediabufs_start_request(struct mediabufs_ctl *const mbc, + struct media_request **const pmreq, + struct qent_src **const psrc_be, @@ -58143,7 +58394,7 @@ index 0000000000..0307a831de +// Create dst slots without alloc +// If fixed true then qent_alloc will only get slots from this pool and will +// block until a qent has been unrefed -+MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed); ++MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed, const enum mediabufs_memory memtype); + +MediaBufsStatus mediabufs_stream_on(struct mediabufs_ctl *const mbc); +MediaBufsStatus mediabufs_stream_off(struct mediabufs_ctl *const mbc); @@ -58177,7 +58428,12 @@ index 0000000000..0307a831de + +MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const rw, + struct dmabufs_ctl * const dbsc, -+ unsigned int n); ++ unsigned int n, ++ const enum mediabufs_memory memtype); ++ ++// Want to have appropriate formats set first ++MediaBufsStatus mediabufs_src_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype); ++MediaBufsStatus mediabufs_dst_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype); + +#define MEDIABUFS_DRIVER_VERSION(a, b, c) (((a) << 16) | ((b) << 8) | (c)) +unsigned int mediabufs_ctl_driver_version(struct mediabufs_ctl *const mbc); @@ -58610,10 +58866,10 @@ index 0000000000..cb4bd164b4 + diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c new file mode 100644 -index 0000000000..27b1b8dd6d +index 0000000000..ebeb7bc6f6 --- /dev/null +++ b/libavcodec/v4l2_request_hevc.c -@@ -0,0 +1,315 @@ +@@ -0,0 +1,345 @@ +/* + * This file is part of FFmpeg. + * @@ -58633,7 +58889,7 @@ index 0000000000..27b1b8dd6d + */ + + -+ ++#include "config.h" +#include "decode.h" +#include "hevcdec.h" +#include "hwconfig.h" @@ -58757,8 +59013,10 @@ index 0000000000..27b1b8dd6d + const HEVCSPS * const sps = h->ps.sps; + int ret; + const struct decdev * decdev; -+ const uint32_t src_pix_fmt = V2(ff_v4l2_req_hevc, 1).src_pix_fmt_v4l2; // Assuming constant for all APIs but avoiding V4L2 includes ++ const uint32_t src_pix_fmt = V2(ff_v4l2_req_hevc, 4).src_pix_fmt_v4l2; // Assuming constant for all APIs but avoiding V4L2 includes + size_t src_size; ++ enum mediabufs_memory src_memtype; ++ enum mediabufs_memory dst_memtype; + + av_log(avctx, AV_LOG_DEBUG, "<<< %s\n", __func__); + @@ -58789,8 +59047,14 @@ index 0000000000..27b1b8dd6d + decdev_media_path(decdev), decdev_video_path(decdev)); + + if ((ctx->dbufs = dmabufs_ctl_new()) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "Unable to open dmabufs\n"); -+ goto fail0; ++ av_log(avctx, AV_LOG_DEBUG, "Unable to open dmabufs - try mmap buffers\n"); ++ src_memtype = MEDIABUFS_MEMORY_MMAP; ++ dst_memtype = MEDIABUFS_MEMORY_MMAP; ++ } ++ else { ++ av_log(avctx, AV_LOG_DEBUG, "Dmabufs opened - try dmabuf buffers\n"); ++ src_memtype = MEDIABUFS_MEMORY_DMABUF; ++ dst_memtype = MEDIABUFS_MEMORY_DMABUF; + } + + if ((ctx->pq = pollqueue_new()) == NULL) { @@ -58811,8 +59075,9 @@ index 0000000000..27b1b8dd6d + // Ask for an initial bitbuf size of max size / 4 + // We will realloc if we need more + // Must use sps->h/w as avctx contains cropped size ++retry_src_memtype: + src_size = bit_buf_size(sps->width, sps->height, sps->bit_depth - 8); -+ if (mediabufs_src_resizable(ctx->mbufs)) ++ if (src_memtype == MEDIABUFS_MEMORY_DMABUF && mediabufs_src_resizable(ctx->mbufs)) + src_size /= 4; + // Kludge for conformance tests which break Annex A limits + else if (src_size < 0x40000) @@ -58825,10 +59090,20 @@ index 0000000000..27b1b8dd6d + goto fail4; + } + ++ if (mediabufs_src_chk_memtype(ctx->mbufs, src_memtype)) { ++ if (src_memtype == MEDIABUFS_MEMORY_DMABUF) { ++ src_memtype = MEDIABUFS_MEMORY_MMAP; ++ goto retry_src_memtype; ++ } ++ av_log(avctx, AV_LOG_ERROR, "Failed to get src memory type\n"); ++ goto fail4; ++ } ++ + if (V2(ff_v4l2_req_hevc, 4).probe(avctx, ctx) == 0) { + av_log(avctx, AV_LOG_DEBUG, "HEVC API version 4 probed successfully\n"); + ctx->fns = &V2(ff_v4l2_req_hevc, 4); + } ++#if CONFIG_V4L2_REQ_HEVC_VX + else if (V2(ff_v4l2_req_hevc, 3).probe(avctx, ctx) == 0) { + av_log(avctx, AV_LOG_DEBUG, "HEVC API version 3 probed successfully\n"); + ctx->fns = &V2(ff_v4l2_req_hevc, 3); @@ -58841,6 +59116,7 @@ index 0000000000..27b1b8dd6d + av_log(avctx, AV_LOG_DEBUG, "HEVC API version 1 probed successfully\n"); + ctx->fns = &V2(ff_v4l2_req_hevc, 1); + } ++#endif + else { + av_log(avctx, AV_LOG_ERROR, "No HEVC version probed successfully\n"); + ret = AVERROR(EINVAL); @@ -58853,7 +59129,7 @@ index 0000000000..27b1b8dd6d + goto fail4; + } + -+ if (mediabufs_src_pool_create(ctx->mbufs, ctx->dbufs, 6)) { ++ if (mediabufs_src_pool_create(ctx->mbufs, ctx->dbufs, 6, src_memtype)) { + av_log(avctx, AV_LOG_ERROR, "Failed to create source pool\n"); + goto fail4; + } @@ -58865,8 +59141,17 @@ index 0000000000..27b1b8dd6d + sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering, + avctx->thread_count, avctx->extra_hw_frames); + ++ if (mediabufs_dst_chk_memtype(ctx->mbufs, dst_memtype)) { ++ if (dst_memtype != MEDIABUFS_MEMORY_DMABUF) { ++ av_log(avctx, AV_LOG_ERROR, "Failed to get dst memory type\n"); ++ goto fail4; ++ } ++ av_log(avctx, AV_LOG_DEBUG, "Dst DMABUF not supported - trying mmap\n"); ++ dst_memtype = MEDIABUFS_MEMORY_MMAP; ++ } ++ + // extra_hw_frames is -1 if unset -+ if (mediabufs_dst_slots_create(ctx->mbufs, dst_slots, (avctx->extra_hw_frames > 0))) { ++ if (mediabufs_dst_slots_create(ctx->mbufs, dst_slots, (avctx->extra_hw_frames > 0), dst_memtype)) { + av_log(avctx, AV_LOG_ERROR, "Failed to create destination slots\n"); + goto fail4; + } @@ -58892,9 +59177,10 @@ index 0000000000..27b1b8dd6d + // Set our s/w format + avctx->sw_pix_fmt = ((AVHWFramesContext *)avctx->hw_frames_ctx->data)->sw_format; + -+ av_log(avctx, AV_LOG_INFO, "Hwaccel %s; devices: %s,%s\n", ++ av_log(avctx, AV_LOG_INFO, "Hwaccel %s; devices: %s,%s; buffers: src %s, dst %s\n", + ctx->fns->name, -+ decdev_media_path(decdev), decdev_video_path(decdev)); ++ decdev_media_path(decdev), decdev_video_path(decdev), ++ mediabufs_memory_name(src_memtype), mediabufs_memory_name(dst_memtype)); + + return 0; + @@ -61505,10 +61791,10 @@ index da1cf9941e..c588ed23cb 100644 case AVMEDIA_TYPE_AUDIO: diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c new file mode 100644 -index 0000000000..d1c714b805 +index 0000000000..49fab3158d --- /dev/null +++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -0,0 +1,1282 @@ +@@ -0,0 +1,1336 @@ +/* + * This file is part of FFmpeg. + * @@ -61884,14 +62170,16 @@ index 0000000000..d1c714b805 + fmt->fmt.pix_mp.plane_fmt[0].sizeimage, fmt->fmt.pix_mp.plane_fmt[0].bytesperline); + + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ if (fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_YUV420 || ++ if ((fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_YUV420 && ++ fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_NV12) || + fmt->fmt.pix_mp.field != field) { + av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); + + return AVERROR(EINVAL); + } + } else { -+ if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_YUV420 || ++ if ((fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_YUV420 && ++ fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_NV12) || + fmt->fmt.pix.field != field) { + av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); + @@ -61902,7 +62190,7 @@ index 0000000000..d1c714b805 + return 0; +} + -+static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t field, int width, int height, int pitch, int ysize) ++static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t pixelformat, uint32_t field, int width, int height, int pitch, int ysize) +{ + struct v4l2_format *fmt = &queue->format; + DeintV4L2M2MContextShared *ctx = queue->ctx; @@ -61913,13 +62201,16 @@ index 0000000000..d1c714b805 + .target = V4L2_TYPE_IS_OUTPUT(fmt->type) ? V4L2_SEL_TGT_CROP_BOUNDS : V4L2_SEL_TGT_COMPOSE_BOUNDS, + }; + ++ // This works for most single object 4:2:0 types + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { ++ fmt->fmt.pix_mp.pixelformat = pixelformat; + fmt->fmt.pix_mp.field = field; + fmt->fmt.pix_mp.width = width; + fmt->fmt.pix_mp.height = ysize / pitch; + fmt->fmt.pix_mp.plane_fmt[0].bytesperline = pitch; + fmt->fmt.pix_mp.plane_fmt[0].sizeimage = ysize + (ysize >> 1); + } else { ++ fmt->fmt.pix.pixelformat = pixelformat; + fmt->fmt.pix.field = field; + fmt->fmt.pix.width = width; + fmt->fmt.pix.height = height; @@ -61928,12 +62219,22 @@ index 0000000000..d1c714b805 + } + + ret = ioctl(ctx->fd, VIDIOC_S_FMT, fmt); -+ if (ret) ++ if (ret) { ++ ret = AVERROR(errno); + av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_FMT failed: %d\n", ret); ++ return ret; ++ } ++ ++ if (pixelformat != fmt->fmt.pix.pixelformat) { ++ av_log(ctx->logctx, AV_LOG_ERROR, "Format not supported: %s; S_FMT returned %s\n", av_fourcc2str(pixelformat), av_fourcc2str(fmt->fmt.pix.pixelformat)); ++ return AVERROR(EINVAL); ++ } + + ret = ioctl(ctx->fd, VIDIOC_G_SELECTION, &sel); -+ if (ret) -+ av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_G_SELECTION failed: %d\n", ret); ++ if (ret) { ++ ret = AVERROR(errno); ++ av_log(ctx->logctx, AV_LOG_WARNING, "VIDIOC_G_SELECTION failed: %d\n", ret); ++ } + + sel.r.width = width; + sel.r.height = height; @@ -61943,10 +62244,12 @@ index 0000000000..d1c714b805 + sel.flags = V4L2_SEL_FLAG_LE; + + ret = ioctl(ctx->fd, VIDIOC_S_SELECTION, &sel); -+ if (ret) -+ av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_SELECTION failed: %d\n", ret); ++ if (ret) { ++ ret = AVERROR(errno); ++ av_log(ctx->logctx, AV_LOG_WARNING, "VIDIOC_S_SELECTION failed: %d\n", ret); ++ } + -+ return ret; ++ return 0; +} + +static int deint_v4l2m2m_probe_device(DeintV4L2M2MContextShared *ctx, char *node) @@ -62028,10 +62331,25 @@ index 0000000000..d1c714b805 + return 0; +} + -+static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) ++static int v4l2_buffer_export_drm(V4L2Buffer* avbuf, const uint32_t pixelformat) +{ + struct v4l2_exportbuffer expbuf; + int i, ret; ++ uint64_t mod = DRM_FORMAT_MOD_LINEAR; ++ uint32_t fmt = 0; ++ ++ switch (pixelformat) { ++ case V4L2_PIX_FMT_NV12: ++ fmt = DRM_FORMAT_NV12; ++ break; ++ case V4L2_PIX_FMT_YUV420: ++ fmt = DRM_FORMAT_YUV420; ++ break; ++ default: ++ return AVERROR(EINVAL); ++ } ++ ++ avbuf->drm_frame.layers[0].format = fmt; + + for (i = 0; i < avbuf->num_planes; i++) { + memset(&expbuf, 0, sizeof(expbuf)); @@ -62050,12 +62368,12 @@ index 0000000000..d1c714b805 + /* drm frame */ + avbuf->drm_frame.objects[i].size = avbuf->buffer.m.planes[i].length; + avbuf->drm_frame.objects[i].fd = expbuf.fd; -+ avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; ++ avbuf->drm_frame.objects[i].format_modifier = mod; + } else { + /* drm frame */ + avbuf->drm_frame.objects[0].size = avbuf->buffer.length; + avbuf->drm_frame.objects[0].fd = expbuf.fd; -+ avbuf->drm_frame.objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; ++ avbuf->drm_frame.objects[0].format_modifier = mod; + } + } + @@ -62140,7 +62458,7 @@ index 0000000000..d1c714b805 + if (ret) + goto fail; + -+ ret = v4l2_buffer_export_drm(buf); ++ ret = v4l2_buffer_export_drm(buf, multiplanar ? fmt->fmt.pix_mp.pixelformat : fmt->fmt.pix.pixelformat); + if (ret) + goto fail; + } @@ -62389,7 +62707,6 @@ index 0000000000..d1c714b805 + +static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf, int height) +{ -+ int av_pix_fmt = AV_PIX_FMT_YUV420P; + AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; + AVDRMLayerDescriptor *layer; + @@ -62406,20 +62723,13 @@ index 0000000000..d1c714b805 + layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; + } + -+ switch (av_pix_fmt) { -+ case AV_PIX_FMT_YUYV422: -+ -+ layer->format = DRM_FORMAT_YUYV; ++ switch (layer->format) { ++ case DRM_FORMAT_YUYV: + layer->nb_planes = 1; -+ + break; + -+ case AV_PIX_FMT_NV12: -+ case AV_PIX_FMT_NV21: -+ -+ layer->format = av_pix_fmt == AV_PIX_FMT_NV12 ? -+ DRM_FORMAT_NV12 : DRM_FORMAT_NV21; -+ ++ case DRM_FORMAT_NV12: ++ case DRM_FORMAT_NV21: + if (avbuf->num_planes > 1) + break; + @@ -62431,10 +62741,7 @@ index 0000000000..d1c714b805 + layer->planes[1].pitch = avbuf->plane_info[0].bytesperline; + break; + -+ case AV_PIX_FMT_YUV420P: -+ -+ layer->format = DRM_FORMAT_YUV420; -+ ++ case DRM_FORMAT_YUV420: + if (avbuf->num_planes > 1) + break; + @@ -62554,6 +62861,26 @@ index 0000000000..d1c714b805 + return ff_set_common_formats(avctx, ff_make_format_list(pixel_formats)); +} + ++static uint32_t desc_pixelformat(const AVDRMFrameDescriptor * const drm_desc) ++{ ++ const int is_linear = (drm_desc->objects[0].format_modifier == DRM_FORMAT_MOD_LINEAR || ++ drm_desc->objects[0].format_modifier == DRM_FORMAT_MOD_INVALID); ++ ++ switch (drm_desc->layers[0].format) { ++ case DRM_FORMAT_YUV420: ++ if (is_linear) ++ return drm_desc->nb_objects == 1 ? V4L2_PIX_FMT_YUV420 : 0; ++ break; ++ case DRM_FORMAT_NV12: ++ if (is_linear) ++ return drm_desc->nb_objects == 1 ? V4L2_PIX_FMT_NV12 : 0; ++ break; ++ default: ++ break; ++ } ++ return 0; ++} ++ +static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) +{ + AVFilterContext *avctx = link->dst; @@ -62569,23 +62896,27 @@ index 0000000000..d1c714b805 + avctx->inputs[0]->status_in, avctx->inputs[0]->status_out, avctx->outputs[0]->status_in, avctx->outputs[0]->status_out); + + if (ctx->field_order == V4L2_FIELD_ANY) { -+ AVDRMFrameDescriptor *drm_desc = (AVDRMFrameDescriptor *)in->data[0]; ++ const AVDRMFrameDescriptor * const drm_desc = (AVDRMFrameDescriptor *)in->data[0]; ++ const uint32_t pixelformat = desc_pixelformat(drm_desc); ++ ++ if (pixelformat == 0) { ++ av_log(avctx, AV_LOG_ERROR, "Unsupported DRM format %s in %d objects, modifier %#" PRIx64 "\n", ++ av_fourcc2str(drm_desc->layers[0].format), ++ drm_desc->nb_objects, drm_desc->objects[0].format_modifier); ++ return AVERROR(EINVAL); ++ } ++ + ctx->orig_width = drm_desc->layers[0].planes[0].pitch; + ctx->orig_height = drm_desc->layers[0].planes[1].offset / ctx->orig_width; + -+ av_log(priv, AV_LOG_DEBUG, "%s: %dx%d (%d,%d)\n", __func__, ctx->width, ctx->height, ++ av_log(priv, AV_LOG_DEBUG, "%s: %dx%d (%td,%td)\n", __func__, ctx->width, ctx->height, + drm_desc->layers[0].planes[0].pitch, drm_desc->layers[0].planes[1].offset); + -+ if (in->top_field_first) -+ ctx->field_order = V4L2_FIELD_INTERLACED_TB; -+ else -+ ctx->field_order = V4L2_FIELD_INTERLACED_BT; -+ -+ ret = deint_v4l2m2m_set_format(output, ctx->field_order, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); ++ ret = deint_v4l2m2m_set_format(output, pixelformat, ctx->field_order, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); + if (ret) + return ret; + -+ ret = deint_v4l2m2m_set_format(capture, V4L2_FIELD_NONE, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); ++ ret = deint_v4l2m2m_set_format(capture, pixelformat, V4L2_FIELD_NONE, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); + if (ret) + return ret; + @@ -62604,6 +62935,12 @@ index 0000000000..d1c714b805 + ret = deint_v4l2m2m_streamon(output); + if (ret) + return ret; ++ ++ if (in->top_field_first) ++ ctx->field_order = V4L2_FIELD_INTERLACED_TB; ++ else ++ ctx->field_order = V4L2_FIELD_INTERLACED_BT; ++ + } + + ret = deint_v4l2m2m_enqueue_frame(output, in); @@ -62679,28 +63016,31 @@ index 0000000000..d1c714b805 + return 0; + } + -+ { ++ recycle_q(&s->output); ++ n = count_enqueued(&s->output); ++ ++ while (n < 6) { + AVFrame * frame; + int rv; + -+ recycle_q(&s->output); -+ n = count_enqueued(&s->output); ++ if ((rv = ff_inlink_consume_frame(inlink, &frame)) < 0) { ++ av_log(priv, AV_LOG_ERROR, "%s: consume in failed: %s\n", __func__, av_err2str(rv)); ++ return rv; ++ } + -+ while (n < 6) { -+ if ((rv = ff_inlink_consume_frame(inlink, &frame)) < 0) { -+ av_log(priv, AV_LOG_ERROR, "%s: consume in failed: %s\n", __func__, av_err2str(rv)); -+ return rv; -+ } ++ if (frame == NULL) { ++ av_log(priv, AV_LOG_TRACE, "%s: No frame\n", __func__); ++ break; ++ } + -+ if (frame == NULL) { -+ av_log(priv, AV_LOG_TRACE, "%s: No frame\n", __func__); -+ break; -+ } ++ rv = deint_v4l2m2m_filter_frame(inlink, frame); ++ av_frame_free(&frame); + -+ deint_v4l2m2m_filter_frame(inlink, frame); -+ av_log(priv, AV_LOG_TRACE, "%s: Q frame\n", __func__); -+ ++n; -+ } ++ if (rv != 0) ++ return rv; ++ ++ av_log(priv, AV_LOG_TRACE, "%s: Q frame\n", __func__); ++ ++n; + } + + if (n < 6) { @@ -65320,10 +65660,10 @@ index 7a9fdbd263..2f825b7e16 100644 map = av_frame_alloc(); if (!map) diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c -index 18c7a0efc8..cada39e92f 100644 +index 18c7a0efc8..bab13a4d50 100644 --- a/libavutil/pixdesc.c +++ b/libavutil/pixdesc.c -@@ -2395,6 +2395,38 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { +@@ -2395,6 +2395,50 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { .name = "vulkan", .flags = AV_PIX_FMT_FLAG_HWACCEL, }, @@ -65351,12 +65691,24 @@ index 18c7a0efc8..cada39e92f 100644 + }, + .flags = 0, + }, ++ [AV_PIX_FMT_SAND64_16] = { ++ .name = "sand64_16", ++ .nb_components = 3, ++ .log2_chroma_w = 1, ++ .log2_chroma_h = 1, ++ .comp = { ++ { 0, 2, 0, 0, 16, 0, 15, 1 }, /* Y */ ++ { 1, 4, 0, 0, 16, 3, 15, 1 }, /* U */ ++ { 1, 4, 2, 0, 16, 3, 15, 3 }, /* V */ ++ }, ++ .flags = 0, ++ }, + [AV_PIX_FMT_RPI4_8] = { -+ .name = "rpi", ++ .name = "rpi4_8", + .flags = AV_PIX_FMT_FLAG_HWACCEL, + }, + [AV_PIX_FMT_RPI4_10] = { -+ .name = "rpi", ++ .name = "rpi4_10", + .flags = AV_PIX_FMT_FLAG_HWACCEL, + }, }; diff --git a/packages/multimedia/ffmpeg/patches/v4l2-drmprime/ffmpeg-001-v4l2-drmprime.patch b/packages/multimedia/ffmpeg/patches/v4l2-drmprime/ffmpeg-001-v4l2-drmprime.patch index d6acd23c782..403b073b68c 100644 --- a/packages/multimedia/ffmpeg/patches/v4l2-drmprime/ffmpeg-001-v4l2-drmprime.patch +++ b/packages/multimedia/ffmpeg/patches/v4l2-drmprime/ffmpeg-001-v4l2-drmprime.patch @@ -1,4 +1,4 @@ -From 40a990827399c05ad3ce3f8242321bd8a67aa0bd Mon Sep 17 00:00:00 2001 +From 1e73397d52d69378ebac5a390da508cd16d7d97e Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Tue, 24 Apr 2018 23:00:23 -0700 Subject: [PATCH 1/9] libavcodec: v4l2m2m: output AVDRMFrameDescriptor @@ -421,7 +421,7 @@ index ab07c0a24a..6bc7442702 100644 } -From 9a2a361c2c84c8da54cd3a74b0d0bb966df8fe69 Mon Sep 17 00:00:00 2001 +From deb0ba531401f069dc6e4dcf235dfc08bca6577c Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Thu, 16 Aug 2018 21:09:40 -0700 Subject: [PATCH 2/9] libavcodec: v4l2m2m: depends on libdrm @@ -432,10 +432,10 @@ Subject: [PATCH 2/9] libavcodec: v4l2m2m: depends on libdrm 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure -index d7a3f507e8..d203f6f7da 100755 +index 4ba72bf84b..efb065905c 100755 --- a/configure +++ b/configure -@@ -3437,6 +3437,7 @@ sndio_indev_deps="sndio" +@@ -3438,6 +3438,7 @@ sndio_indev_deps="sndio" sndio_outdev_deps="sndio" v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" v4l2_indev_suggest="libv4l2" @@ -457,7 +457,7 @@ index cbd3e5680d..bebe2c1796 100644 #include #include -From 7b0fa2d859c12a8a129c884d16673ca731336c06 Mon Sep 17 00:00:00 2001 +From f89fad11f53110cd6968c83e89bafb0c449f34ec Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Thu, 16 Aug 2018 21:10:13 -0700 Subject: [PATCH 3/9] libavcodec: v4l2m2m: set format_modifier to @@ -485,7 +485,7 @@ index bebe2c1796..12037d5d66 100644 } -From e1857456c8f24e40d5c898886f2f51014e59ee9d Mon Sep 17 00:00:00 2001 +From d5a37af1a8fe1ed70428e55286126d241986dd0c Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Thu, 16 Aug 2018 21:10:53 -0700 Subject: [PATCH 4/9] libavcodec: v4l2m2m: only mmap the buffer when it is @@ -529,7 +529,7 @@ index 12037d5d66..1adf518ab9 100644 if (avbuf->plane_info[i].mm_addr == MAP_FAILED) -From c8fc3ea1b5777546f7ec72a54b053a2d4fa9fd59 Mon Sep 17 00:00:00 2001 +From d0be699166cdc413a5dc3e1c087433ac7cf142e7 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Thu, 16 Aug 2018 21:11:38 -0700 Subject: [PATCH 5/9] libavcodec: v4l2m2m: allow using software pixel formats @@ -569,7 +569,7 @@ index 6bc7442702..4b9baf833c 100644 .hw_configs = v4l2_m2m_hw_configs, \ .wrapper_name = "v4l2m2m", \ -From 13f02e940f083f19dbe8b9ac8fc7df45700dd36e Mon Sep 17 00:00:00 2001 +From c4736742883eb2a1965ac65a5c75d5409e3c85a0 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Mon, 24 Sep 2018 13:39:31 -0700 Subject: [PATCH 6/9] libavcodec: v4l2m2m: implement hwcontext @@ -677,7 +677,7 @@ index 4b9baf833c..6c23693137 100644 ret = ff_v4l2_m2m_codec_init(priv); if (ret) { -From 34be198b8039c9df434792f19f0985e45419407e Mon Sep 17 00:00:00 2001 +From 0b15c77718900bf60c91217ed1492390022ad6db Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Mon, 4 May 2020 13:01:29 -0700 Subject: [PATCH 7/9] libavcodec: v4l2m2m: allow lower minimum buffer values @@ -718,7 +718,7 @@ index 6c23693137..e323c37052 100644 }; -From 2956fd1881d28abf6bf77bd9a57866c4ba81d199 Mon Sep 17 00:00:00 2001 +From acc86933e5fe3a13aae44cf84c48bab6c717e49b Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Wed, 6 May 2020 11:12:58 -0700 Subject: [PATCH 8/9] libavcodec: v4l2m2m: add option to specify pixel format @@ -790,7 +790,7 @@ index e323c37052..363e998142 100644 }; -From 2bb6d0cb244590f0c70dd111ed978cd87fa3bee1 Mon Sep 17 00:00:00 2001 +From 909ca6380d9112cc0111266da02a4a8e1e5abc1e Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Mon, 24 Sep 2018 13:39:56 -0700 Subject: [PATCH 9/9] libavcodec: v4l2m2m: implement flush diff --git a/packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch b/packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch index 5062d475f2a..657eae7f63f 100644 --- a/packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch +++ b/packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch @@ -1,4 +1,4 @@ -From 904af26693095364851bbc6c6557fca9b3437b69 Mon Sep 17 00:00:00 2001 +From b7afcc4052e9d70408adc97ee2eb3ce91d8e1baf Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 3 Dec 2018 23:48:04 +0100 Subject: [PATCH 01/17] avutil: add av_buffer_pool_flush() @@ -52,7 +52,7 @@ index 241a80ed67..f41363faf1 100644 * Mark the pool as being available for freeing. It will actually be freed only * once all the allocated buffers associated with the pool are released. Thus it -From ec84dc22e99f544e4de7c43e7f8ef9ab7ee8e19b Mon Sep 17 00:00:00 2001 +From 08aeda51103a1382d5d55fa205c1795eb783217a Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 02/17] Add common V4L2 request API code @@ -69,7 +69,7 @@ Signed-off-by: Jonas Karlman create mode 100644 libavcodec/v4l2_request.h diff --git a/configure b/configure -index d7a3f507e8..f2e203d134 100755 +index 4ba72bf84b..4a3a5ae9e0 100755 --- a/configure +++ b/configure @@ -279,6 +279,7 @@ External library support: @@ -104,7 +104,7 @@ index d7a3f507e8..f2e203d134 100755 vulkan " -@@ -2919,6 +2923,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext" +@@ -2920,6 +2924,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext" dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32" ffnvcodec_deps_any="libdl LoadLibrary" nvdec_deps="ffnvcodec" @@ -112,7 +112,7 @@ index d7a3f507e8..f2e203d134 100755 vaapi_x11_deps="xlib" videotoolbox_hwaccel_deps="videotoolbox pthreads" videotoolbox_hwaccel_extralibs="-framework QuartzCore" -@@ -6438,6 +6443,7 @@ enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame +@@ -6439,6 +6444,7 @@ enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame { check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame || die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; } enabled libuavs3d && require_pkg_config libuavs3d "uavs3d >= 1.1.41" uavs3d.h uavs3d_decode @@ -120,7 +120,7 @@ index d7a3f507e8..f2e203d134 100755 enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 1.5.2" libvmaf.h compute_vmaf -@@ -6536,6 +6542,10 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r +@@ -6537,6 +6543,10 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r { enabled libdrm || die "ERROR: rkmpp requires --enable-libdrm"; } } @@ -131,7 +131,7 @@ index d7a3f507e8..f2e203d134 100755 enabled vapoursynth && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init -@@ -6617,6 +6627,8 @@ if enabled v4l2_m2m; then +@@ -6618,6 +6628,8 @@ if enabled v4l2_m2m; then check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" fi @@ -1239,7 +1239,7 @@ index 0000000000..58d2aa70af + +#endif /* AVCODEC_V4L2_REQUEST_H */ -From e432d3151f4c5507e40fb1fe8b3c3fb7c7a0a08c Mon Sep 17 00:00:00 2001 +From ae79312604208dd0cceaf4c48963579056ccafee Mon Sep 17 00:00:00 2001 From: Ezequiel Garcia Date: Wed, 20 Feb 2019 11:18:00 -0300 Subject: [PATCH 03/17] h264dec: add idr_pic_id to slice context @@ -1254,7 +1254,7 @@ Signed-off-by: Jonas Karlman 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c -index 2d0605c7f4..c3a7338a70 100644 +index 0b415ada6f..b3e3ef6183 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1830,7 +1830,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, @@ -1264,8 +1264,8 @@ index 2d0605c7f4..c3a7338a70 100644 - get_ue_golomb_long(&sl->gb); /* idr_pic_id */ + sl->idr_pic_id = get_ue_golomb_long(&sl->gb); - if (sps->poc_type == 0) { - sl->poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb); + sl->poc_lsb = 0; + sl->delta_poc_bottom = 0; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index b7b19ba4f1..0698ab95ba 100644 --- a/libavcodec/h264dec.h @@ -1279,7 +1279,7 @@ index b7b19ba4f1..0698ab95ba 100644 /** -From 84564d13ec0ec40f408622ff6b0d900723bbab5b Mon Sep 17 00:00:00 2001 +From 5257b2741d7cfb88233ebd00a6ba3b6bda1f3cf2 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 22 May 2019 14:44:22 +0200 Subject: [PATCH 04/17] h264dec: add ref_pic_marking and pic_order_cnt bit_size @@ -1295,7 +1295,7 @@ Signed-off-by: Jonas Karlman 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c -index c3a7338a70..c28b58cd5d 100644 +index b3e3ef6183..bcb9f70c0e 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1748,7 +1748,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, @@ -1307,15 +1307,15 @@ index c3a7338a70..c28b58cd5d 100644 if (first_slice) av_assert0(!h->setup_finished); -@@ -1832,6 +1832,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, - if (nal->type == H264_NAL_IDR_SLICE) - sl->idr_pic_id = get_ue_golomb_long(&sl->gb); +@@ -1834,6 +1834,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, + sl->poc_lsb = 0; + sl->delta_poc_bottom = 0; + pos = sl->gb.index; if (sps->poc_type == 0) { sl->poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb); -@@ -1845,6 +1846,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, +@@ -1848,6 +1849,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME) sl->delta_poc[1] = get_se_golomb(&sl->gb); } @@ -1323,7 +1323,7 @@ index c3a7338a70..c28b58cd5d 100644 sl->redundant_pic_count = 0; if (pps->redundant_pic_cnt_present) -@@ -1884,9 +1886,11 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, +@@ -1887,9 +1889,11 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, sl->explicit_ref_marking = 0; if (nal->ref_idc) { @@ -1356,7 +1356,7 @@ index 0698ab95ba..2b39e82c3b 100644 /** -From 68883e0cd0c7e4ef6bcccaa1af2e7becf59f8556 Mon Sep 17 00:00:00 2001 +From bfd0f2970a9e84d049fb6a3f60051f307b4e9d69 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 05/17] Add V4L2 request API h264 hwaccel @@ -1374,10 +1374,10 @@ Signed-off-by: Jonas Karlman create mode 100644 libavcodec/v4l2_request_h264.c diff --git a/configure b/configure -index f2e203d134..b17e4108c1 100755 +index 4a3a5ae9e0..efd12f1b52 100755 --- a/configure +++ b/configure -@@ -2951,6 +2951,8 @@ h264_dxva2_hwaccel_deps="dxva2" +@@ -2952,6 +2952,8 @@ h264_dxva2_hwaccel_deps="dxva2" h264_dxva2_hwaccel_select="h264_decoder" h264_nvdec_hwaccel_deps="nvdec" h264_nvdec_hwaccel_select="h264_decoder" @@ -1386,7 +1386,7 @@ index f2e203d134..b17e4108c1 100755 h264_vaapi_hwaccel_deps="vaapi" h264_vaapi_hwaccel_select="h264_decoder" h264_vdpau_hwaccel_deps="vdpau" -@@ -6628,6 +6630,7 @@ if enabled v4l2_m2m; then +@@ -6629,6 +6631,7 @@ if enabled v4l2_m2m; then fi check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns @@ -1407,7 +1407,7 @@ index 90dfffcb20..426c7528e9 100644 OBJS-$(CONFIG_H264_VDPAU_HWACCEL) += vdpau_h264.o OBJS-$(CONFIG_H264_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c -index c28b58cd5d..0a10d00aad 100644 +index bcb9f70c0e..6b7f569da4 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -768,6 +768,7 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback) @@ -1429,7 +1429,7 @@ index c28b58cd5d..0a10d00aad 100644 if (h->avctx->codec->pix_fmts) choices = h->avctx->codec->pix_fmts; diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c -index 0a999bef43..d78e3eaee3 100644 +index 1705046e29..55046031b2 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -1076,6 +1076,9 @@ AVCodec ff_h264_decoder = { @@ -1917,7 +1917,7 @@ index 0000000000..394bae0550 + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; -From 694f0e61125d4d6b2d5b950023e7f8623bfc58f2 Mon Sep 17 00:00:00 2001 +From fb84a34c8e4465d47946abecbf3f5df8f8920cbe Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 06/17] Add V4L2 request API mpeg2 hwaccel @@ -1933,10 +1933,10 @@ Signed-off-by: Jonas Karlman create mode 100644 libavcodec/v4l2_request_mpeg2.c diff --git a/configure b/configure -index b17e4108c1..ec141fabbd 100755 +index efd12f1b52..1b70ea65e4 100755 --- a/configure +++ b/configure -@@ -2995,6 +2995,8 @@ mpeg2_dxva2_hwaccel_deps="dxva2" +@@ -2996,6 +2996,8 @@ mpeg2_dxva2_hwaccel_deps="dxva2" mpeg2_dxva2_hwaccel_select="mpeg2video_decoder" mpeg2_nvdec_hwaccel_deps="nvdec" mpeg2_nvdec_hwaccel_select="mpeg2video_decoder" @@ -1945,7 +1945,7 @@ index b17e4108c1..ec141fabbd 100755 mpeg2_vaapi_hwaccel_deps="vaapi" mpeg2_vaapi_hwaccel_select="mpeg2video_decoder" mpeg2_vdpau_hwaccel_deps="vdpau" -@@ -6631,6 +6633,7 @@ fi +@@ -6632,6 +6634,7 @@ fi check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;" @@ -1978,7 +1978,7 @@ index 969a1da0f4..a8ae1483d8 100644 extern const AVHWAccel ff_mpeg2_vdpau_hwaccel; extern const AVHWAccel ff_mpeg2_videotoolbox_hwaccel; diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c -index 94221da2c1..4b0176f6cb 100644 +index 09bf01247d..bcdf26680a 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1147,6 +1147,9 @@ static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = { @@ -2167,7 +2167,7 @@ index 0000000000..84d53209c7 + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; -From fdacf119ed7ed75197dbc2003cdd9bad6e74764f Mon Sep 17 00:00:00 2001 +From bd1adf7ea2a3592eef7b2524fe0fed06a56a1771 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 22 May 2019 14:46:58 +0200 Subject: [PATCH 07/17] Add V4L2 request API vp8 hwaccel @@ -2185,10 +2185,10 @@ Signed-off-by: Jonas Karlman create mode 100644 libavcodec/v4l2_request_vp8.c diff --git a/configure b/configure -index ec141fabbd..f16bed65a3 100755 +index 1b70ea65e4..3f8f7b195a 100755 --- a/configure +++ b/configure -@@ -3027,6 +3027,8 @@ vc1_vdpau_hwaccel_deps="vdpau" +@@ -3028,6 +3028,8 @@ vc1_vdpau_hwaccel_deps="vdpau" vc1_vdpau_hwaccel_select="vc1_decoder" vp8_nvdec_hwaccel_deps="nvdec" vp8_nvdec_hwaccel_select="vp8_decoder" @@ -2197,7 +2197,7 @@ index ec141fabbd..f16bed65a3 100755 vp8_vaapi_hwaccel_deps="vaapi" vp8_vaapi_hwaccel_select="vp8_decoder" vp9_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_VP9" -@@ -6634,6 +6636,7 @@ fi +@@ -6635,6 +6637,7 @@ fi check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;" check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;" @@ -2440,7 +2440,7 @@ index d16e7b6aa3..8ee768d875 100644 NULL }, -From 8d663e7b4c006f9e0a775dce2a69c8b6c4f7d4fa Mon Sep 17 00:00:00 2001 +From fd0b19baa147bad74b2481a53972fec1988fb9e4 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 08/17] Add V4L2 request API hevc hwaccel @@ -2453,15 +2453,15 @@ Signed-off-by: Benjamin Gaignard libavcodec/Makefile | 1 + libavcodec/hevcdec.c | 10 + libavcodec/hwaccels.h | 1 + - libavcodec/v4l2_request_hevc.c | 579 +++++++++++++++++++++++++++++++++ - 5 files changed, 594 insertions(+) + libavcodec/v4l2_request_hevc.c | 578 +++++++++++++++++++++++++++++++++ + 5 files changed, 593 insertions(+) create mode 100644 libavcodec/v4l2_request_hevc.c diff --git a/configure b/configure -index f16bed65a3..02a80cf27f 100755 +index 3f8f7b195a..6192a6c144 100755 --- a/configure +++ b/configure -@@ -2967,6 +2967,8 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" +@@ -2968,6 +2968,8 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" hevc_dxva2_hwaccel_select="hevc_decoder" hevc_nvdec_hwaccel_deps="nvdec" hevc_nvdec_hwaccel_select="hevc_decoder" @@ -2470,7 +2470,7 @@ index f16bed65a3..02a80cf27f 100755 hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC" hevc_vaapi_hwaccel_select="hevc_decoder" hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC" -@@ -6635,6 +6637,7 @@ fi +@@ -6636,6 +6638,7 @@ fi check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;" @@ -2546,10 +2546,10 @@ index 9f8d41e367..ffb9fa5087 100644 extern const AVHWAccel ff_hevc_videotoolbox_hwaccel; diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c new file mode 100644 -index 0000000000..6caf36f1a9 +index 0000000000..eaedde0d86 --- /dev/null +++ b/libavcodec/v4l2_request_hevc.c -@@ -0,0 +1,579 @@ +@@ -0,0 +1,578 @@ +/* + * This file is part of FFmpeg. + * @@ -2677,8 +2677,7 @@ index 0000000000..6caf36f1a9 + entry->flags |= V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE; + + /* TODO: Interleaved: Get the POC for each field. */ -+ entry->pic_order_cnt[0] = frame->poc; -+ entry->pic_order_cnt[1] = frame->poc; ++ entry->pic_order_cnt_val = frame->poc; + } + } + @@ -3130,7 +3129,7 @@ index 0000000000..6caf36f1a9 + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; -From 9a3b291671c06ae4b23d890c1820b8d061aa00df Mon Sep 17 00:00:00 2001 +From 9c2eaf2e2d5ee78d311ef90fc58987b528afe437 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Thu, 12 Dec 2019 16:13:55 +0100 Subject: [PATCH 09/17] Add V4L2 request API VP9 hwaccel @@ -3149,10 +3148,10 @@ Signed-off-by: Jernej Skrabec create mode 100644 libavcodec/v4l2_request_vp9.c diff --git a/configure b/configure -index 02a80cf27f..0b238c051d 100755 +index 6192a6c144..36a1271a6c 100755 --- a/configure +++ b/configure -@@ -3041,6 +3041,8 @@ vp9_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_VP9" +@@ -3042,6 +3042,8 @@ vp9_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_VP9" vp9_dxva2_hwaccel_select="vp9_decoder" vp9_nvdec_hwaccel_deps="nvdec" vp9_nvdec_hwaccel_select="vp9_decoder" @@ -3161,7 +3160,7 @@ index 02a80cf27f..0b238c051d 100755 vp9_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferVP9_bit_depth" vp9_vaapi_hwaccel_select="vp9_decoder" vp9_vdpau_hwaccel_deps="vdpau VdpPictureInfoVP9" -@@ -6640,6 +6642,7 @@ check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;" +@@ -6641,6 +6643,7 @@ check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;" check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;" check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;" check_cc vp8_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_VP8_FRAME;" @@ -3858,10 +3857,10 @@ index 54726df742..fee3568736 100644 uint8_t pred_prob[3]; struct { -From 96052082ce698560e5b3f85e58089d794e6f1330 Mon Sep 17 00:00:00 2001 +From 7b0931f709e16f6f950475f6a0c52df6e14d38d8 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 14 Feb 2019 23:20:05 +0100 -Subject: [PATCH 10/17] Add and use private linux v5.18 headers for V4L2 +Subject: [PATCH 10/17] Add and use private linux v5.19.2 headers for V4L2 request API ctrls Signed-off-by: Jernej Skrabec @@ -3874,10 +3873,10 @@ Signed-off-by: Jonas Karlman create mode 100644 libavcodec/hevc-ctrls.h diff --git a/configure b/configure -index 0b238c051d..1c1929d2c2 100755 +index 36a1271a6c..1b5121d972 100755 --- a/configure +++ b/configure -@@ -2967,7 +2967,7 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" +@@ -2968,7 +2968,7 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" hevc_dxva2_hwaccel_select="hevc_decoder" hevc_nvdec_hwaccel_deps="nvdec" hevc_nvdec_hwaccel_select="hevc_decoder" @@ -3888,7 +3887,7 @@ index 0b238c051d..1c1929d2c2 100755 hevc_vaapi_hwaccel_select="hevc_decoder" diff --git a/libavcodec/hevc-ctrls.h b/libavcodec/hevc-ctrls.h new file mode 100644 -index 0000000000..01ccda48d8 +index 0000000000..88e804578c --- /dev/null +++ b/libavcodec/hevc-ctrls.h @@ -0,0 +1,250 @@ @@ -4029,7 +4028,7 @@ index 0000000000..01ccda48d8 + __u64 timestamp; + __u8 flags; + __u8 field_pic; -+ __u16 pic_order_cnt[2]; ++ __s32 pic_order_cnt_val; + __u8 padding[2]; +}; + @@ -4072,7 +4071,7 @@ index 0000000000..01ccda48d8 + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 slice_type; + __u8 colour_plane_id; -+ __u16 slice_pic_order_cnt; ++ __s32 slice_pic_order_cnt; + __u8 num_ref_idx_l0_active_minus1; + __u8 num_ref_idx_l1_active_minus1; + __u8 collocated_ref_idx; @@ -4143,7 +4142,7 @@ index 0000000000..01ccda48d8 + +#endif diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index 6caf36f1a9..eee33ca8bf 100644 +index eaedde0d86..3a4b2493b2 100644 --- a/libavcodec/v4l2_request_hevc.c +++ b/libavcodec/v4l2_request_hevc.c @@ -19,6 +19,7 @@ @@ -4155,7 +4154,7 @@ index 6caf36f1a9..eee33ca8bf 100644 #define MAX_SLICES 16 -From 6cb39c865d85e66bc2d82504046a7e7829288b99 Mon Sep 17 00:00:00 2001 +From 4abf972abac8a7cf1f81a544fc8b7ad82aff89e9 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 29 Apr 2019 22:08:59 +0000 Subject: [PATCH 11/17] HACK: hwcontext_drm: do not require drm device @@ -4182,7 +4181,7 @@ index 7a9fdbd263..6297d1f9b6 100644 if (hwctx->fd < 0) return AVERROR(errno); -From c06fd04826b5a2bc90700896672f04efa9151ffe Mon Sep 17 00:00:00 2001 +From 2bf038b3f3b77eeaef2b0c08e265e080c267c0a8 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 12/17] WIP: hevc entry point offsets @@ -4194,7 +4193,7 @@ Signed-off-by: Jernej Skrabec 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/libavcodec/hevc-ctrls.h b/libavcodec/hevc-ctrls.h -index 01ccda48d8..00bae349d3 100644 +index 88e804578c..edf3c10080 100644 --- a/libavcodec/hevc-ctrls.h +++ b/libavcodec/hevc-ctrls.h @@ -200,7 +200,9 @@ struct v4l2_ctrl_hevc_slice_params { @@ -4209,10 +4208,10 @@ index 01ccda48d8..00bae349d3 100644 /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ struct v4l2_hevc_pred_weight_table pred_weight_table; diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index eee33ca8bf..ac9a72b6b1 100644 +index 3a4b2493b2..59f3192c92 100644 --- a/libavcodec/v4l2_request_hevc.c +++ b/libavcodec/v4l2_request_hevc.c -@@ -231,6 +231,15 @@ static void v4l2_request_hevc_fill_slice_params(const HEVCContext *h, +@@ -230,6 +230,15 @@ static void v4l2_request_hevc_fill_slice_params(const HEVCContext *h, } v4l2_request_hevc_fill_pred_table(h, &slice_params->pred_weight_table); @@ -4229,7 +4228,7 @@ index eee33ca8bf..ac9a72b6b1 100644 static void fill_sps(struct v4l2_ctrl_hevc_sps *ctrl, const HEVCContext *h) -From a65269d7347654905aa81fec87f0b7de2389d679 Mon Sep 17 00:00:00 2001 +From 36f2b7c0c5245471a16563e078307088fe38c00c Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Fri, 15 May 2020 16:54:05 +0000 Subject: [PATCH 13/17] WIP: add NV15 and NV20 support @@ -4241,7 +4240,7 @@ Signed-off-by: Jonas Karlman 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c -index 0a10d00aad..45057fd049 100644 +index 6b7f569da4..ee4c76cf41 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -794,10 +794,17 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback) @@ -4316,7 +4315,7 @@ index 5234b5049b..0b294feff2 100644 default: return -1; -From 46639ec9e31055e49086a141f715f748605800e1 Mon Sep 17 00:00:00 2001 +From 2416dbe0c4b9d93546f88244d9fa543250daca24 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 27 Jul 2020 23:15:45 +0000 Subject: [PATCH 14/17] HACK: define drm NV15 and NV20 format @@ -4345,7 +4344,7 @@ index 0b294feff2..a8f0ee79ee 100644 { V4L2RequestDescriptor *req = (V4L2RequestDescriptor*)frame->data[0]; -From aaf15ef32d3adf01139c795ae8c1f253a74124a1 Mon Sep 17 00:00:00 2001 +From a288c02f498b1c223a81d3f9f174e3f879d75047 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Wed, 13 May 2020 22:51:21 +0000 Subject: [PATCH 15/17] WIP: hevc rkvdec fields @@ -4357,7 +4356,7 @@ Signed-off-by: Jonas Karlman 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libavcodec/hevc-ctrls.h b/libavcodec/hevc-ctrls.h -index 00bae349d3..2ecec61866 100644 +index edf3c10080..9610266f3f 100644 --- a/libavcodec/hevc-ctrls.h +++ b/libavcodec/hevc-ctrls.h @@ -58,6 +58,8 @@ enum v4l2_mpeg_video_hevc_start_code { @@ -4407,10 +4406,10 @@ index 00bae349d3..2ecec61866 100644 __u32 entry_point_offset_minus1[256]; __u8 padding[8]; diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index ac9a72b6b1..109943d015 100644 +index 59f3192c92..bf20b9a849 100644 --- a/libavcodec/v4l2_request_hevc.c +++ b/libavcodec/v4l2_request_hevc.c -@@ -189,6 +189,9 @@ static void v4l2_request_hevc_fill_slice_params(const HEVCContext *h, +@@ -188,6 +188,9 @@ static void v4l2_request_hevc_fill_slice_params(const HEVCContext *h, /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ .pic_struct = h->sei.picture_timing.picture_struct, @@ -4420,7 +4419,7 @@ index ac9a72b6b1..109943d015 100644 }; if (sh->slice_sample_adaptive_offset_flag[0]) -@@ -245,9 +248,12 @@ static void v4l2_request_hevc_fill_slice_params(const HEVCContext *h, +@@ -244,9 +247,12 @@ static void v4l2_request_hevc_fill_slice_params(const HEVCContext *h, static void fill_sps(struct v4l2_ctrl_hevc_sps *ctrl, const HEVCContext *h) { const HEVCSPS *sps = h->ps.sps; @@ -4433,7 +4432,7 @@ index ac9a72b6b1..109943d015 100644 .pic_width_in_luma_samples = sps->width, .pic_height_in_luma_samples = sps->height, .bit_depth_luma_minus8 = sps->bit_depth - 8, -@@ -311,6 +317,7 @@ static int v4l2_request_hevc_start_frame(AVCodecContext *avctx, +@@ -310,6 +316,7 @@ static int v4l2_request_hevc_start_frame(AVCodecContext *avctx, &pps->scaling_list : sps->scaling_list_enable_flag ? &sps->scaling_list : NULL; @@ -4441,7 +4440,7 @@ index ac9a72b6b1..109943d015 100644 V4L2RequestControlsHEVC *controls = h->ref->hwaccel_picture_private; fill_sps(&controls->sps, h); -@@ -334,6 +341,9 @@ static int v4l2_request_hevc_start_frame(AVCodecContext *avctx, +@@ -333,6 +340,9 @@ static int v4l2_request_hevc_start_frame(AVCodecContext *avctx, /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ controls->pps = (struct v4l2_ctrl_hevc_pps) { @@ -4451,7 +4450,7 @@ index ac9a72b6b1..109943d015 100644 .num_extra_slice_header_bits = pps->num_extra_slice_header_bits, .num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active - 1, .num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active - 1, -@@ -463,6 +473,8 @@ static int v4l2_request_hevc_queue_decode(AVCodecContext *avctx, int last_slice) +@@ -462,6 +472,8 @@ static int v4l2_request_hevc_queue_decode(AVCodecContext *avctx, int last_slice) if (ctx->decode_mode == V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED) return ff_v4l2_request_decode_slice(avctx, h->ref->frame, control, FF_ARRAY_ELEMS(control), controls->first_slice, last_slice); @@ -4461,7 +4460,7 @@ index ac9a72b6b1..109943d015 100644 } -From 326d9cddaef1505b6c662dcf89148e29ee0b32f1 Mon Sep 17 00:00:00 2001 +From 69ca076a72c32c687bddb611d3a70e4f1c13184a Mon Sep 17 00:00:00 2001 From: Alex Bee Date: Sun, 19 Sep 2021 13:10:55 +0200 Subject: [PATCH 16/17] v4l2_request: validate supported framesizes @@ -4533,7 +4532,7 @@ index a8f0ee79ee..824dcaa8e9 100644 if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "%s: set output format failed, %s (%d)\n", __func__, strerror(errno), errno); -From ab65af8bee5ff6cb6b886223f3e7d9a2fedfe972 Mon Sep 17 00:00:00 2001 +From 237847d27938132c5bb9d137a2829bc34aab50d6 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sun, 27 Feb 2022 18:54:21 +0100 Subject: [PATCH 17/17] Improve VP9 decoding diff --git a/packages/multimedia/gmmlib/package.mk b/packages/multimedia/gmmlib/package.mk index 003a35feca3..afa8ee733bd 100644 --- a/packages/multimedia/gmmlib/package.mk +++ b/packages/multimedia/gmmlib/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="gmmlib" -PKG_VERSION="22.1.7" -PKG_SHA256="08a378671971a1777ca60f87e39fd7d7cbba94e485a1f5f64fe4840ff9d2ac2d" +PKG_VERSION="22.1.8" +PKG_SHA256="bf23e9a3742b4fb98c7666c9e9b29f3219e4b2fb4d831aaf4eed71f5e2d17368" PKG_ARCH="x86_64" PKG_LICENSE="MIT" PKG_SITE="https://01.org/linuxmedia" diff --git a/packages/multimedia/intel-vaapi-driver/package.mk b/packages/multimedia/intel-vaapi-driver/package.mk index 3bfe5e1d75c..290bc07ddb9 100644 --- a/packages/multimedia/intel-vaapi-driver/package.mk +++ b/packages/multimedia/intel-vaapi-driver/package.mk @@ -11,7 +11,6 @@ PKG_SITE="https://01.org/linuxmedia" PKG_URL="https://github.com/intel/intel-vaapi-driver/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain libva libdrm" PKG_LONGDESC="intel-vaapi-driver: VA-API user mode driver for Intel GEN Graphics family" -PKG_TOOLCHAIN="meson" if [ "${DISPLAYSERVER}" = "x11" ]; then DISPLAYSERVER_LIBVA="-Dwith_x11=yes -Dwith_wayland=no" diff --git a/packages/multimedia/libva/package.mk b/packages/multimedia/libva/package.mk index 66496da69e2..109e65a7f77 100644 --- a/packages/multimedia/libva/package.mk +++ b/packages/multimedia/libva/package.mk @@ -10,7 +10,6 @@ PKG_LICENSE="GPL" PKG_SITE="https://01.org/linuxmedia" PKG_URL="https://github.com/intel/libva/archive/${PKG_VERSION}.tar.gz" PKG_LONGDESC="Libva is an implementation for VA-API (VIdeo Acceleration API)." -PKG_TOOLCHAIN="meson" if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET="toolchain libX11 libXext libXfixes libdrm" diff --git a/packages/multimedia/media-driver/package.mk b/packages/multimedia/media-driver/package.mk index 4a9f2108424..0456f91a8ec 100644 --- a/packages/multimedia/media-driver/package.mk +++ b/packages/multimedia/media-driver/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media-driver" -PKG_VERSION="22.5.2" -PKG_SHA256="3b53bb6fb7793ef6c498ff086327ceefeef0a72d1f41b1fcaeae552a694fbcd8" +PKG_VERSION="22.5.3" +PKG_SHA256="65652b365d48be3c9f0b3c561502952b92ee5fcc587520b88d0d752cf2a6a3b5" PKG_ARCH="x86_64" PKG_LICENSE="MIT" PKG_SITE="https://01.org/linuxmedia" diff --git a/packages/multimedia/nv-codec-headers/package.mk b/packages/multimedia/nv-codec-headers/package.mk index 5ef9f37546f..f8d349f2eb0 100644 --- a/packages/multimedia/nv-codec-headers/package.mk +++ b/packages/multimedia/nv-codec-headers/package.mk @@ -9,7 +9,6 @@ PKG_SITE="https://github.com/FFmpeg/nv-codec-headers" PKG_URL="https://github.com/FFmpeg/nv-codec-headers/archive/n${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="FFmpeg version of headers required to interface with Nvidias codec APIs." -PKG_TOOLCHAIN="make" makeinstall_target(){ make DESTDIR=${SYSROOT_PREFIX} PREFIX=/usr install diff --git a/packages/network/ethtool/package.mk b/packages/network/ethtool/package.mk index 47e46e29488..cbb8c266753 100644 --- a/packages/network/ethtool/package.mk +++ b/packages/network/ethtool/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ethtool" -PKG_VERSION="5.18" -PKG_SHA256="9577b2ffbce710b659fb239598ec92bced1ca400ca0f1286762bfa44e4784270" +PKG_VERSION="5.19" +PKG_SHA256="3b752a3329827907ac3812f2831dfecf51c8c41c55d2d69cfb9c53ca06449fc6" PKG_LICENSE="GPL" PKG_SITE="https://www.kernel.org/pub/software/network/ethtool/" PKG_URL="https://www.kernel.org/pub/software/network/ethtool/${PKG_NAME}-${PKG_VERSION}.tar.xz" diff --git a/packages/network/iwd/package.mk b/packages/network/iwd/package.mk index 1659f289472..92ac72cdce5 100644 --- a/packages/network/iwd/package.mk +++ b/packages/network/iwd/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="iwd" -PKG_VERSION="1.29" -PKG_SHA256="71533fe3b8f6381f24832198ba11d00f04a361454770c173b3b66bc3cdf272bd" +PKG_VERSION="1.30" +PKG_SHA256="9fd13512dc27d83efb8d341f7df98f5488f70131686021fcd0d93fc97af013b8" PKG_LICENSE="GPL" PKG_SITE="https://git.kernel.org/cgit/network/wireless/iwd.git/about/" PKG_URL="https://www.kernel.org/pub/linux/network/wireless/iwd-${PKG_VERSION}.tar.xz" diff --git a/packages/network/libnfs/package.mk b/packages/network/libnfs/package.mk index 31cdb36ab19..ad9f2481c72 100644 --- a/packages/network/libnfs/package.mk +++ b/packages/network/libnfs/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libnfs" -PKG_VERSION="5.0.1" -PKG_SHA256="7ef445410b42f36b9bad426608b53ccb9ccca4101e545c383f564c11db672ca8" +PKG_VERSION="5.0.2" +PKG_SHA256="637e56643b19da9fba98f06847788c4dad308b723156a64748041035dcdf9bd3" PKG_LICENSE="LGPL2.1+" PKG_SITE="https://github.com/sahlberg/libnfs" PKG_URL="https://github.com/sahlberg/libnfs/archive/libnfs-${PKG_VERSION}.tar.gz" diff --git a/packages/network/libnftnl/package.mk b/packages/network/libnftnl/package.mk index ed67393ae4c..272d9002072 100644 --- a/packages/network/libnftnl/package.mk +++ b/packages/network/libnftnl/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libnftnl" -PKG_VERSION="1.2.2" -PKG_SHA256="9efc004f9d15918d68f9e98e194d55e030168f33bb67c3e7a545b740c9ed6d0a" +PKG_VERSION="1.2.3" +PKG_SHA256="e916ea9b79f9518560b9a187251a7c042442a9ecbce7f36be7908888605d0255" PKG_LICENSE="GPL" PKG_SITE="https://netfilter.org/projects/libnftnl" PKG_URL="https://netfilter.org/projects/libnftnl/files/${PKG_NAME}-${PKG_VERSION}.tar.bz2" diff --git a/packages/network/libssh/package.mk b/packages/network/libssh/package.mk index 8b6d16c131d..25c8cc148ce 100644 --- a/packages/network/libssh/package.mk +++ b/packages/network/libssh/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libssh" -PKG_VERSION="0.9.6" -PKG_SHA256="86bcf885bd9b80466fe0e05453c58b877df61afa8ba947a58c356d7f0fab829b" +PKG_VERSION="0.10.4" +PKG_SHA256="07392c54ab61476288d1c1f0a7c557b50211797ad00c34c3af2bbc4dbc4bd97d" PKG_LICENSE="LGPL" PKG_SITE="http://www.libssh.org/" PKG_URL="https://www.libssh.org/files/$(get_pkg_version_maj_min)/${PKG_NAME}-${PKG_VERSION}.tar.xz" @@ -14,6 +14,7 @@ PKG_LONGDESC="Library for accessing ssh client services through C libraries." PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ -DWITH_SERVER=OFF \ -DWITH_GCRYPT=OFF \ + -DWITH_EXAMPLES=OFF \ -DWITH_GSSAPI=OFF \ -DWITH_GEX=OFF \ -DWITH_INTERNAL_DOC=OFF" diff --git a/packages/network/libtirpc/package.mk b/packages/network/libtirpc/package.mk index fb48f438dc9..fabc7014ded 100644 --- a/packages/network/libtirpc/package.mk +++ b/packages/network/libtirpc/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libtirpc" -PKG_VERSION="1.3.2" -PKG_SHA256="e24eb88b8ce7db3b7ca6eb80115dd1284abc5ec32a8deccfed2224fc2532b9fd" +PKG_VERSION="1.3.3" +PKG_SHA256="6474e98851d9f6f33871957ddee9714fdcd9d8a5ee9abb5a98d63ea2e60e12f3" PKG_LICENSE="GPL" PKG_SITE="https://sourceforge.net/projects/libtirpc/" PKG_URL="https://downloads.sourceforge.net/project/libtirpc/libtirpc/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" diff --git a/packages/network/rsync/package.mk b/packages/network/rsync/package.mk index c8e42afc2cf..06355d93dfe 100644 --- a/packages/network/rsync/package.mk +++ b/packages/network/rsync/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rsync" -PKG_VERSION="3.2.4" -PKG_SHA256="6f761838d08052b0b6579cf7f6737d93e47f01f4da04c5d24d3447b7f2a5fad1" +PKG_VERSION="3.2.6" +PKG_SHA256="fb3365bab27837d41feaf42e967c57bd3a47bc8f10765a3671efd6a3835454d3" PKG_LICENSE="GPLv3" PKG_SITE="https://rsync.samba.org" PKG_URL="https://download.samba.org/pub/rsync/src/${PKG_NAME}-${PKG_VERSION}.tar.gz" diff --git a/packages/network/rsync/patches/rsync-schar-fix-3.2.4.patch b/packages/network/rsync/patches/rsync-schar-fix-3.2.4.patch deleted file mode 100644 index 08dd9c78dd6..00000000000 --- a/packages/network/rsync/patches/rsync-schar-fix-3.2.4.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index 24e383a9..5a53d339 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1117,7 +1117,7 @@ else - fi - - AC_CACHE_CHECK([for unsigned char],rsync_cv_SIGNED_CHAR_OK,[ --AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[signed char *s = ""]])],[rsync_cv_SIGNED_CHAR_OK=yes],[rsync_cv_SIGNED_CHAR_OK=no])]) -+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[signed char *s = (signed char *)""]])],[rsync_cv_SIGNED_CHAR_OK=yes],[rsync_cv_SIGNED_CHAR_OK=no])]) - if test x"$rsync_cv_SIGNED_CHAR_OK" = x"yes"; then - AC_DEFINE(SIGNED_CHAR_OK, 1, [Define to 1 if "signed char" is a valid type]) - fi diff --git a/packages/network/samba/config/samba4-cache.txt b/packages/network/samba/config/samba4-cache.txt index 1989baa2854..bd1cd5cefdc 100644 --- a/packages/network/samba/config/samba4-cache.txt +++ b/packages/network/samba/config/samba4-cache.txt @@ -43,4 +43,6 @@ Checking value of GNUTLS_CIPHER_AES_128_CFB8: OK Checking value of GNUTLS_MAC_AES_CMAC_128: OK Checking whether fcntl supports flags to send direct I/O availability signals: OK Checking whether fcntl supports setting/geting hints: OK +Checking for gnutls fips mode support: NO +Checking for readlink breakage: NO diff --git a/packages/network/samba/package.mk b/packages/network/samba/package.mk index 041e386829c..5cbf0b008bb 100644 --- a/packages/network/samba/package.mk +++ b/packages/network/samba/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="samba" -PKG_VERSION="4.13.17" -PKG_SHA256="17bdb9ea60d30af22851c8e134d67b43a22fb1e20f159152a647c69dc2a58a68" +PKG_VERSION="4.17.0" +PKG_SHA256="04868ecda82fcbeda7b8bf519a2461a64d55c6e70efc6f6053b2fbba55f1823a" PKG_LICENSE="GPLv3+" PKG_SITE="https://www.samba.org" PKG_URL="https://download.samba.org/pub/samba/stable/${PKG_NAME}-${PKG_VERSION}.tar.gz" @@ -64,7 +64,6 @@ configure_package() { --without-ad-dc \ --without-automount \ --without-cluster-support \ - --without-dnsupdate \ --without-fam \ --without-gettext \ --without-gpgme \ @@ -88,7 +87,7 @@ configure_package() { PKG_SAMBA_TARGET="smbclient,client/smbclient,smbtree,nmblookup,testparm" if [ "${SAMBA_SERVER}" = "yes" ]; then - PKG_SAMBA_TARGET+=",smbd/smbd,nmbd,smbpasswd" + PKG_SAMBA_TARGET+=",nmbd,rpcd_classic,rpcd_epmapper,rpcd_winreg,samba-dcerpcd,smbpasswd,smbd/smbd" fi } @@ -159,6 +158,12 @@ perform_manual_install() { mkdir -p ${INSTALL}/usr/sbin cp -L ${PKG_BUILD}/bin/smbd ${INSTALL}/usr/sbin cp -L ${PKG_BUILD}/bin/nmbd ${INSTALL}/usr/sbin + + mkdir -p ${INSTALL}/usr/libexec/samba + cp -PR bin/default/source3/rpc_server/samba-dcerpcd ${INSTALL}/usr/libexec/samba + cp -PR bin/default/source3/rpc_server/rpcd_classic ${INSTALL}/usr/libexec/samba + cp -PR bin/default/source3/rpc_server/rpcd_epmapper ${INSTALL}/usr/libexec/samba + cp -PR bin/default/source3/rpc_server/rpcd_winreg ${INSTALL}/usr/libexec/samba fi } diff --git a/packages/network/samba/patches/samba-100-4-16-build-from-4-17.patch b/packages/network/samba/patches/samba-100-4-16-build-from-4-17.patch deleted file mode 100644 index 6e3be88bb44..00000000000 --- a/packages/network/samba/patches/samba-100-4-16-build-from-4-17.patch +++ /dev/null @@ -1,733 +0,0 @@ -From cf43283d9dac9116e178364b1005a32756fffa75 Mon Sep 17 00:00:00 2001 -From: Andreas Schneider -Date: Sat, 19 Feb 2022 08:52:17 +0100 -Subject: [PATCH 1/8] buildtools: Reformat shell scripts - -shfmt -f buildtools | xargs shfmt -w -p -i 0 -fn - -Signed-off-by: Andreas Schneider -Reviewed-by: Andrew Bartlett -(cherry picked from commit 2d5d88ff34532ba2d78997467e5720bba480f07e) ---- - buildtools/compare_config_h4.sh | 4 +- - buildtools/compare_generated.sh | 59 ++++++++++++++------------- - buildtools/compare_install.sh | 4 +- - buildtools/scripts/abi_gen.sh | 22 +++++------ - buildtools/scripts/autogen-waf.sh | 6 +-- - buildtools/testwaf.sh | 66 +++++++++++++++---------------- - 6 files changed, 80 insertions(+), 81 deletions(-) - -diff --git a/buildtools/compare_config_h4.sh b/buildtools/compare_config_h4.sh -index b78b36fdd0fa..fee8abfbd503 100755 ---- a/buildtools/compare_config_h4.sh -+++ b/buildtools/compare_config_h4.sh -@@ -3,8 +3,8 @@ - # compare the generated config.h from a waf build with existing samba - # build - --grep "^.define" bin/default/source4/include/config.h | sort > waf-config.h --grep "^.define" $HOME/samba_old/source4/include/config.h | sort > old-config.h -+grep "^.define" bin/default/source4/include/config.h | sort >waf-config.h -+grep "^.define" $HOME/samba_old/source4/include/config.h | sort >old-config.h - - comm -23 old-config.h waf-config.h - -diff --git a/buildtools/compare_generated.sh b/buildtools/compare_generated.sh -index ebef8a979bde..e62657958139 100755 ---- a/buildtools/compare_generated.sh -+++ b/buildtools/compare_generated.sh -@@ -10,41 +10,40 @@ gen_files=$(cd bin/default && find . -type f -name '*.[ch]') - - strip_file() - { -- in_file=$1 -- out_file=$2 -- cat $in_file | -- grep -v 'The following definitions come from' | -- grep -v 'Automatically generated at' | -- grep -v 'Generated from' | -- sed 's|/home/tnagy/samba/source4||g' | -- sed 's|/home/tnagy/samba/|../|g' | -- sed 's|bin/default/source4/||g' | -- sed 's|bin/default/|../|g' | -- sed 's/define _____/define ___/g' | -- sed 's/define __*/define _/g' | -- sed 's/define _DEFAULT_/define _/g' | -- sed 's/define _SOURCE4_/define ___/g' | -- sed 's/define ___/define _/g' | -- sed 's/ifndef ___/ifndef _/g' | -- sed 's|endif /* ____|endif /* __|g' | -- sed s/__DEFAULT_SOURCE4/__/ | -- sed s/__DEFAULT_SOURCE4/__/ | -- sed s/__DEFAULT/____/ > $out_file -+ in_file=$1 -+ out_file=$2 -+ cat $in_file | -+ grep -v 'The following definitions come from' | -+ grep -v 'Automatically generated at' | -+ grep -v 'Generated from' | -+ sed 's|/home/tnagy/samba/source4||g' | -+ sed 's|/home/tnagy/samba/|../|g' | -+ sed 's|bin/default/source4/||g' | -+ sed 's|bin/default/|../|g' | -+ sed 's/define _____/define ___/g' | -+ sed 's/define __*/define _/g' | -+ sed 's/define _DEFAULT_/define _/g' | -+ sed 's/define _SOURCE4_/define ___/g' | -+ sed 's/define ___/define _/g' | -+ sed 's/ifndef ___/ifndef _/g' | -+ sed 's|endif /* ____|endif /* __|g' | -+ sed s/__DEFAULT_SOURCE4/__/ | -+ sed s/__DEFAULT_SOURCE4/__/ | -+ sed s/__DEFAULT/____/ >$out_file - } - - compare_file() - { -- f=$f -- bname=$(basename $f) -- t1=/tmp/$bname.old.$$ -- t2=/tmp/$bname.new.$$ -- strip_file $old_build/$f $t1 -- strip_file bin/default/$f $t2 -- diff -u -b $t1 $t2 2>&1 -- rm -f $t1 $t2 -+ f=$f -+ bname=$(basename $f) -+ t1=/tmp/$bname.old.$$ -+ t2=/tmp/$bname.new.$$ -+ strip_file $old_build/$f $t1 -+ strip_file bin/default/$f $t2 -+ diff -u -b $t1 $t2 2>&1 -+ rm -f $t1 $t2 - } - - for f in $gen_files; do -- compare_file $f -+ compare_file $f - done -- -diff --git a/buildtools/compare_install.sh b/buildtools/compare_install.sh -index b964117550b6..37772a46a4ca 100755 ---- a/buildtools/compare_install.sh -+++ b/buildtools/compare_install.sh -@@ -3,6 +3,6 @@ - prefix1="$1" - prefix2="$2" - --(cd $prefix1 && find . ) | sort > p1.txt --(cd $prefix2 && find . ) | sort > p2.txt -+(cd $prefix1 && find .) | sort >p1.txt -+(cd $prefix2 && find .) | sort >p2.txt - diff -u p[12].txt -diff --git a/buildtools/scripts/autogen-waf.sh b/buildtools/scripts/autogen-waf.sh -index 7a6e94c5ec4d..a0ed80c33fa6 100755 ---- a/buildtools/scripts/autogen-waf.sh -+++ b/buildtools/scripts/autogen-waf.sh -@@ -1,6 +1,6 @@ - #!/bin/sh - --p=`dirname $0` -+p=$(dirname $0) - - echo "Setting up for waf build" - -@@ -13,12 +13,12 @@ echo "Found buildtools in $p/$d" - - echo "Setting up configure" - rm -f $p/configure $p/include/config*.h* --sed "s|BUILDTOOLS|$d|g;s|BUILDPATH|$p|g" < "$p/$d/scripts/configure.waf" > $p/configure -+sed "s|BUILDTOOLS|$d|g;s|BUILDPATH|$p|g" <"$p/$d/scripts/configure.waf" >$p/configure - chmod +x $p/configure - - echo "Setting up Makefile" - rm -f $p/makefile $p/Makefile --sed "s|BUILDTOOLS|$d|g" < "$p/$d/scripts/Makefile.waf" > $p/Makefile -+sed "s|BUILDTOOLS|$d|g" <"$p/$d/scripts/Makefile.waf" >$p/Makefile - - echo "done. Now run $p/configure or $p/configure.developer then make." - if [ $p != "." ]; then -diff --git a/buildtools/testwaf.sh b/buildtools/testwaf.sh -index 127e52589103..3e8e6431c783 100755 ---- a/buildtools/testwaf.sh -+++ b/buildtools/testwaf.sh -@@ -9,52 +9,52 @@ cd $d/.. - PREFIX=$HOME/testprefix - - if [ $# -gt 0 ]; then -- tests="$*" -+ tests="$*" - else -- tests="lib/replace lib/talloc lib/tevent lib/tdb lib/ldb" -+ tests="lib/replace lib/talloc lib/tevent lib/tdb lib/ldb" - fi - - echo "testing in dirs $tests" - - for d in $tests; do -- echo "`date`: testing $d" -- pushd $d -- rm -rf bin -- type waf -- waf dist -- ./configure -C --enable-developer --prefix=$PREFIX -- time make -- make install -- make distcheck -- case $d in -+ echo "$(date): testing $d" -+ pushd $d -+ rm -rf bin -+ type waf -+ waf dist -+ ./configure -C --enable-developer --prefix=$PREFIX -+ time make -+ make install -+ make distcheck -+ case $d in - "lib/ldb") -- ldd bin/ldbadd -- ;; -+ ldd bin/ldbadd -+ ;; - "lib/replace") -- ldd bin/replace_testsuite -- ;; -+ ldd bin/replace_testsuite -+ ;; - "lib/talloc") -- ldd bin/talloc_testsuite -- ;; -+ ldd bin/talloc_testsuite -+ ;; - "lib/tdb") -- ldd bin/tdbtool -- ;; -- esac -- popd -+ ldd bin/tdbtool -+ ;; -+ esac -+ popd - done - - echo "testing python portability" - pushd lib/talloc - versions="python2.4 python2.5 python2.6 python3.0 python3.1" - for p in $versions; do -- ret=$(which $p || echo "failed") -- if [ $ret = "failed" ]; then -- echo "$p not found, skipping" -- continue -- fi -- echo "Testing $p" -- $p ../../buildtools/bin/waf configure -C --enable-developer --prefix=$PREFIX -- $p ../../buildtools/bin/waf build install -+ ret=$(which $p || echo "failed") -+ if [ $ret = "failed" ]; then -+ echo "$p not found, skipping" -+ continue -+ fi -+ echo "Testing $p" -+ $p ../../buildtools/bin/waf configure -C --enable-developer --prefix=$PREFIX -+ $p ../../buildtools/bin/waf build install - done - popd - -@@ -62,9 +62,9 @@ echo "testing cross compiling" - pushd lib/talloc - ret=$(which arm-linux-gnueabi-gcc || echo "failed") - if [ $ret != "failed" ]; then -- CC=arm-linux-gnueabi-gcc ./configure -C --prefix=$PREFIX --cross-compile --cross-execute='runarm' -- make && make install -+ CC=arm-linux-gnueabi-gcc ./configure -C --prefix=$PREFIX --cross-compile --cross-execute='runarm' -+ make && make install - else -- echo "Cross-compiler not installed, skipping test" -+ echo "Cross-compiler not installed, skipping test" - fi - popd --- -2.25.1 - - -From bccb8b807bb1c00ffc2cd95cadfee253eb0d0cff Mon Sep 17 00:00:00 2001 -From: Stefan Metzmacher -Date: Mon, 28 Mar 2022 12:38:02 +0200 -Subject: [PATCH 2/8] buildtools: remove unused testwaf.sh - -Signed-off-by: Stefan Metzmacher -Reviewed-by: Andrew Bartlett -(cherry picked from commit 42eeed05f1aed10b48f7008a18e47cf15ac2c010) ---- - buildtools/testwaf.sh | 70 ------------------------------------------- - 1 file changed, 70 deletions(-) - delete mode 100755 buildtools/testwaf.sh - -diff --git a/buildtools/testwaf.sh b/buildtools/testwaf.sh -deleted file mode 100755 -index 3e8e6431c783..000000000000 ---- a/buildtools/testwaf.sh -+++ /dev/null -@@ -1,70 +0,0 @@ --#!/bin/bash -- --set -e --set -x -- --d=$(dirname $0) -- --cd $d/.. --PREFIX=$HOME/testprefix -- --if [ $# -gt 0 ]; then -- tests="$*" --else -- tests="lib/replace lib/talloc lib/tevent lib/tdb lib/ldb" --fi -- --echo "testing in dirs $tests" -- --for d in $tests; do -- echo "$(date): testing $d" -- pushd $d -- rm -rf bin -- type waf -- waf dist -- ./configure -C --enable-developer --prefix=$PREFIX -- time make -- make install -- make distcheck -- case $d in -- "lib/ldb") -- ldd bin/ldbadd -- ;; -- "lib/replace") -- ldd bin/replace_testsuite -- ;; -- "lib/talloc") -- ldd bin/talloc_testsuite -- ;; -- "lib/tdb") -- ldd bin/tdbtool -- ;; -- esac -- popd --done -- --echo "testing python portability" --pushd lib/talloc --versions="python2.4 python2.5 python2.6 python3.0 python3.1" --for p in $versions; do -- ret=$(which $p || echo "failed") -- if [ $ret = "failed" ]; then -- echo "$p not found, skipping" -- continue -- fi -- echo "Testing $p" -- $p ../../buildtools/bin/waf configure -C --enable-developer --prefix=$PREFIX -- $p ../../buildtools/bin/waf build install --done --popd -- --echo "testing cross compiling" --pushd lib/talloc --ret=$(which arm-linux-gnueabi-gcc || echo "failed") --if [ $ret != "failed" ]; then -- CC=arm-linux-gnueabi-gcc ./configure -C --prefix=$PREFIX --cross-compile --cross-execute='runarm' -- make && make install --else -- echo "Cross-compiler not installed, skipping test" --fi --popd --- -2.25.1 - - -From 8b609eb416bd737578a79beabb3bd736d341e326 Mon Sep 17 00:00:00 2001 -From: Stefan Metzmacher -Date: Mon, 28 Mar 2022 12:49:24 +0200 -Subject: [PATCH 3/8] lib/fuzzing/README.md: don't use waf directly - -Signed-off-by: Stefan Metzmacher -Reviewed-by: Andrew Bartlett -(cherry picked from commit 10d69da1d34b2b11920d9bf051f5a26dbbcadf02) ---- - lib/fuzzing/README.md | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/lib/fuzzing/README.md b/lib/fuzzing/README.md -index 33d33b923905..d3e34bd79a36 100644 ---- a/lib/fuzzing/README.md -+++ b/lib/fuzzing/README.md -@@ -17,9 +17,9 @@ Example command line to build binaries for use with - [honggfuzz](https://github.com/google/honggfuzz/): - - ```sh --buildtools/bin/waf -C --without-gettext --enable-debug --enable-developer \ -+./configure -C --without-gettext --enable-debug --enable-developer \ - --address-sanitizer --enable-libfuzzer --abi-check-disable \ -- CC=.../honggfuzz/hfuzz_cc/hfuzz-clang configure \ -+ CC=.../honggfuzz/hfuzz_cc/hfuzz-clang \ - LINK_CC=.../honggfuzz/hfuzz_cc/hfuzz-clang - ``` - -@@ -30,7 +30,7 @@ Example for fuzzing `tiniparser` using `honggfuzz` (see `--help` for more - options): - - ```sh --buildtools/bin/waf --targets=fuzz_tiniparser build && \ -+make bin/fuzz_tiniparser && \ - .../honggfuzz/honggfuzz --sanitizers --timeout 3 --max_file_size 256 \ - --rlimit_rss 100 -f .../tiniparser-corpus -- bin/fuzz_tiniparser - ``` -@@ -43,9 +43,9 @@ Example command line to build binaries for use with - [afl](http://lcamtuf.coredump.cx/afl/) - - ```sh --buildtools/bin/waf -C --without-gettext --enable-debug --enable-developer \ -+./configure -C --without-gettext --enable-debug --enable-developer \ - --enable-afl-fuzzer --abi-check-disable \ -- CC=afl-gcc configure -+ CC=afl-gcc - ``` - - ## Fuzzing tiniparser -@@ -54,7 +54,7 @@ Example for fuzzing `tiniparser` using `afl-fuzz` (see `--help` for more - options): - - ```sh --buildtools/bin/waf --targets=fuzz_tiniparser build && \ -+make bin/fuzz_tiniparser build && \ - afl-fuzz -m 200 -i inputdir -o outputdir -- bin/fuzz_tiniparser - ``` - --- -2.25.1 - - -From 16d566b1139f56686fac969d3bc362be162bad28 Mon Sep 17 00:00:00 2001 -From: Stefan Metzmacher -Date: Mon, 28 Mar 2022 12:50:55 +0200 -Subject: [PATCH 5/8] wafsamba: let test_duplicate_symbol.sh export - PYTHONHASHSEED=1 - -Signed-off-by: Stefan Metzmacher -Reviewed-by: Andrew Bartlett -(cherry picked from commit a6b1e4b5766205b7337e0e4b00944184289bfc36) ---- - buildtools/wafsamba/test_duplicate_symbol.sh | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/buildtools/wafsamba/test_duplicate_symbol.sh b/buildtools/wafsamba/test_duplicate_symbol.sh -index 46f44a67dcf8..dffac7570022 100755 ---- a/buildtools/wafsamba/test_duplicate_symbol.sh -+++ b/buildtools/wafsamba/test_duplicate_symbol.sh -@@ -5,6 +5,9 @@ - - subunit_start_test duplicate_symbols - -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - if $PYTHON ./buildtools/bin/waf build --dup-symbol-check; then - subunit_pass_test duplicate_symbols - else --- -2.25.1 - - -From 73295e83a14b1ed662ca842b531c1f84143301ca Mon Sep 17 00:00:00 2001 -From: Stefan Metzmacher -Date: Mon, 28 Mar 2022 12:59:12 +0200 -Subject: [PATCH 6/8] configure/Makefile: export PYTHONHASHSEED=1 in all - 'configure/Makefile' scripts - -Signed-off-by: Stefan Metzmacher -Reviewed-by: Andrew Bartlett -(cherry picked from commit 22c46d9f41876d9ec7187148e658d1692bf37cdd) ---- - buildtools/scripts/Makefile.waf | 4 ++-- - buildtools/scripts/configure.waf | 11 +++++++++-- - configure | 4 ++++ - ctdb/Makefile | 2 +- - ctdb/configure | 7 +++++++ - lib/ldb/configure | 7 +++++++ - lib/replace/configure | 7 +++++++ - lib/talloc/configure | 7 +++++++ - lib/tdb/configure | 7 +++++++ - lib/tevent/configure | 7 +++++++ - 10 files changed, 58 insertions(+), 5 deletions(-) - -diff --git a/buildtools/scripts/Makefile.waf b/buildtools/scripts/Makefile.waf -index 5fc939c99e03..a15a5f87607e 100644 ---- a/buildtools/scripts/Makefile.waf -+++ b/buildtools/scripts/Makefile.waf -@@ -1,7 +1,7 @@ - # simple makefile wrapper to run waf - --WAF_BINARY=BUILDTOOLS/bin/waf --WAF=WAF_MAKE=1 $(WAF_BINARY) -+WAF_BINARY=$(PYTHON) BUILDTOOLS/bin/waf -+WAF=PYTHONHASHSEED=1 WAF_MAKE=1 $(WAF_BINARY) - - all: - $(WAF) build -diff --git a/buildtools/scripts/configure.waf b/buildtools/scripts/configure.waf -index a7d8d1dbd641..ccb62849a54f 100755 ---- a/buildtools/scripts/configure.waf -+++ b/buildtools/scripts/configure.waf -@@ -1,6 +1,6 @@ - #!/bin/sh - --PREVPATH=`dirname $0` -+PREVPATH=$(dirname $0) - - WAF=BUILDTOOLS/bin/waf - -@@ -9,6 +9,13 @@ WAF=BUILDTOOLS/bin/waf - JOBS=1 - export JOBS - -+# Make sure we don't have any library preloaded. -+unset LD_PRELOAD -+ -+# Make sure we get stable hashes -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - cd BUILDPATH || exit 1 --$WAF configure "$@" || exit 1 -+$PYTHON $WAF configure "$@" || exit 1 - cd $PREVPATH -diff --git a/configure b/configure -index a6ca50feb470..9153c0e5f784 100755 ---- a/configure -+++ b/configure -@@ -12,6 +12,10 @@ export JOBS - # Make sure we don't have any library preloaded. - unset LD_PRELOAD - -+# Make sure we get stable hashes -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - cd . || exit 1 - $PYTHON $WAF configure "$@" || exit 1 - cd $PREVPATH -diff --git a/ctdb/Makefile b/ctdb/Makefile -index ec362e294082..5dbc7acdc54e 100644 ---- a/ctdb/Makefile -+++ b/ctdb/Makefile -@@ -1,7 +1,7 @@ - # simple makefile wrapper to run waf - - WAF_BINARY=$(PYTHON) ../buildtools/bin/waf --WAF=WAF_MAKE=1 $(WAF_BINARY) -+WAF=PYTHONHASHSEED=1 WAF_MAKE=1 $(WAF_BINARY) - - all: - $(WAF) build -diff --git a/ctdb/configure b/ctdb/configure -index dbb0c1446b51..48b786b1612d 100755 ---- a/ctdb/configure -+++ b/ctdb/configure -@@ -10,6 +10,13 @@ WAF=buildtools/bin/waf - JOBS=1 - export JOBS - -+# Make sure we don't have any library preloaded. -+unset LD_PRELOAD -+ -+# Make sure we get stable hashes -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - cd . || exit 1 - $PYTHON $WAF configure "$@" || exit 1 - cd $PREVPATH -diff --git a/lib/ldb/configure b/lib/ldb/configure -index 6c931bfbf5e2..28d62ab27ae2 100755 ---- a/lib/ldb/configure -+++ b/lib/ldb/configure -@@ -16,6 +16,13 @@ fi - JOBS=1 - export JOBS - -+# Make sure we don't have any library preloaded. -+unset LD_PRELOAD -+ -+# Make sure we get stable hashes -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - cd . || exit 1 - $PYTHON $WAF configure "$@" || exit 1 - cd $PREVPATH -diff --git a/lib/replace/configure b/lib/replace/configure -index d8a8d2ac2f39..091f814e5f2c 100755 ---- a/lib/replace/configure -+++ b/lib/replace/configure -@@ -16,6 +16,13 @@ fi - JOBS=1 - export JOBS - -+# Make sure we don't have any library preloaded. -+unset LD_PRELOAD -+ -+# Make sure we get stable hashes -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - cd . || exit 1 - $PYTHON $WAF configure "$@" || exit 1 - cd $PREVPATH -diff --git a/lib/talloc/configure b/lib/talloc/configure -index d8a8d2ac2f39..091f814e5f2c 100755 ---- a/lib/talloc/configure -+++ b/lib/talloc/configure -@@ -16,6 +16,13 @@ fi - JOBS=1 - export JOBS - -+# Make sure we don't have any library preloaded. -+unset LD_PRELOAD -+ -+# Make sure we get stable hashes -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - cd . || exit 1 - $PYTHON $WAF configure "$@" || exit 1 - cd $PREVPATH -diff --git a/lib/tdb/configure b/lib/tdb/configure -index d8a8d2ac2f39..091f814e5f2c 100755 ---- a/lib/tdb/configure -+++ b/lib/tdb/configure -@@ -16,6 +16,13 @@ fi - JOBS=1 - export JOBS - -+# Make sure we don't have any library preloaded. -+unset LD_PRELOAD -+ -+# Make sure we get stable hashes -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - cd . || exit 1 - $PYTHON $WAF configure "$@" || exit 1 - cd $PREVPATH -diff --git a/lib/tevent/configure b/lib/tevent/configure -index c3c444754e3d..0dc9bace4356 100755 ---- a/lib/tevent/configure -+++ b/lib/tevent/configure -@@ -16,6 +16,13 @@ fi - JOBS=1 - export JOBS - -+# Make sure we don't have any library preloaded. -+unset LD_PRELOAD -+ -+# Make sure we get stable hashes -+PYTHONHASHSEED=1 -+export PYTHONHASHSEED -+ - cd . || exit 1 - $PYTHON $WAF configure "$@" || exit 1 - cd $PREVPATH --- -2.25.1 - - -From 2cd1e53284c0c212c62d909028c5bd9872493934 Mon Sep 17 00:00:00 2001 -From: Stefan Metzmacher -Date: Mon, 28 Mar 2022 12:38:36 +0200 -Subject: [PATCH 7/8] ctdb/packaging/RPM: don't use waf directly - -./configure && make && make install is will always work. - -Signed-off-by: Stefan Metzmacher -Reviewed-by: Andrew Bartlett -(cherry picked from commit aa02cf3c4449cb0a22da8f359f0b3edc4f1d9bb7) ---- - ctdb/packaging/RPM/ctdb.spec.in | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/ctdb/packaging/RPM/ctdb.spec.in b/ctdb/packaging/RPM/ctdb.spec.in -index 80eb2945e419..ea5c5a256ec9 100644 ---- a/ctdb/packaging/RPM/ctdb.spec.in -+++ b/ctdb/packaging/RPM/ctdb.spec.in -@@ -88,7 +88,7 @@ fi - export CC - - CFLAGS="$RPM_OPT_FLAGS $EXTRA -D_GNU_SOURCE" \ --$PYTHON ./buildtools/bin/waf configure \ -+./configure \ - --builtin-libraries=replace,popt \ - --bundled-libraries=!talloc,!tevent,!tdb \ - --minimum-library-version=talloc:%libtalloc_version,tdb:%libtdb_version,tevent:%libtevent_version \ -@@ -103,7 +103,7 @@ $PYTHON ./buildtools/bin/waf configure \ - --mandir=%{_mandir} \ - --localstatedir=%{_localstatedir} - --$PYTHON ./buildtools/bin/waf build -+make -j - - %install - # Clean up in case there is trash left from a previous build -@@ -112,7 +112,7 @@ rm -rf $RPM_BUILD_ROOT - # Create the target build directory hierarchy - mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sudoers.d - --DESTDIR=$RPM_BUILD_ROOT $PYTHON ./buildtools/bin/waf install -+DESTDIR=$RPM_BUILD_ROOT make -j install - - install -m644 config/ctdb.conf $RPM_BUILD_ROOT%{_sysconfdir}/ctdb - install -m644 config/ctdb.tunables $RPM_BUILD_ROOT%{_sysconfdir}/ctdb --- -2.25.1 - - -From 5a6029aa55d806647fe1e2e0c3a6ca58aaf79ca0 Mon Sep 17 00:00:00 2001 -From: Stefan Metzmacher -Date: Mon, 28 Mar 2022 13:00:03 +0200 -Subject: [PATCH 8/8] wafsamba: require PYTHONHASHSEED=1 to be exported - -This avoids a lot of trouble with random build failures, -if people try to use waf directly. - -Signed-off-by: Stefan Metzmacher -Reviewed-by: Andrew Bartlett - -Autobuild-User(master): Andrew Bartlett -Autobuild-Date(master): Tue Mar 29 23:31:38 UTC 2022 on sn-devel-184 - -(cherry picked from commit 420bbb1d92fd2a28725b53f425ba3d214831b660) - -The last 8 patches are backported to avoid people running into: -https://bugzilla.samba.org/show_bug.cgi?id=15033 -and -https://bugzilla.samba.org/show_bug.cgi?id=15037 ---- - buildtools/wafsamba/wscript | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/buildtools/wafsamba/wscript b/buildtools/wafsamba/wscript -index a4d6f3e5c49e..8729b0829daa 100644 ---- a/buildtools/wafsamba/wscript -+++ b/buildtools/wafsamba/wscript -@@ -8,6 +8,10 @@ import wafsamba - from samba_utils import symlink - from optparse import SUPPRESS_HELP - -+phs = os.environ.get("PYTHONHASHSEED", None) -+if phs != "1": -+ raise Errors.WafError('''PYTHONHASHSEED=1 missing! Don't use waf directly, use ./configure and make!''') -+ - # this forces configure to be re-run if any of the configure - # sections of the build scripts change. We have to check - # for this in sys.argv as options have not yet been parsed when --- -2.25.1 - diff --git a/packages/network/samba/patches/samba-200-4.11-fix-ASN1-bso14164.patch b/packages/network/samba/patches/samba-200-4.11-fix-ASN1-bso14164.patch index 03b2f31d66a..5d3cb17e40a 100644 --- a/packages/network/samba/patches/samba-200-4.11-fix-ASN1-bso14164.patch +++ b/packages/network/samba/patches/samba-200-4.11-fix-ASN1-bso14164.patch @@ -41,8 +41,10 @@ diff --git a/wscript_configure_embedded_heimdal b/wscript_configure_embedded_hei index 8c55ae2..4fdae80 100644 --- a/wscript_configure_embedded_heimdal +++ b/wscript_configure_embedded_heimdal -@@ -1 +1,12 @@ - conf.RECURSE('source4/heimdal_build') +@@ -6,3 +6,14 @@ + + conf.define('USING_EMBEDDED_HEIMDAL', 1) + conf.RECURSE('third_party/heimdal_build') + +def check_system_heimdal_binary(name): + if conf.LIB_MAY_BE_BUNDLED(name): @@ -73,14 +75,14 @@ index 235fa19..4f4a83cd 100644 check_system_heimdal_lib("com_err", "com_right_r com_err", "com_err.h") if check_system_heimdal_lib("roken", "rk_socket_set_reuseaddr", "roken.h"): -@@ -96,7 +88,4 @@ finally: +@@ -86,7 +78,4 @@ finally: #if conf.CHECK_BUNDLED_SYSTEM('tommath', checkfunctions='mp_init', headers='tommath.h'): # conf.define('USING_SYSTEM_TOMMATH', 1) -check_system_heimdal_binary("compile_et") -check_system_heimdal_binary("asn1_compile") - - conf.define('USING_SYSTEM_KRB5', 1) + conf.env.KRB5_VENDOR = 'heimdal' -- 2.20.1 diff --git a/packages/network/samba/patches/samba-951-no-man-4.13.patch b/packages/network/samba/patches/samba-951-no-man-4.16.patch similarity index 84% rename from packages/network/samba/patches/samba-951-no-man-4.13.patch rename to packages/network/samba/patches/samba-951-no-man-4.16.patch index 1db3f9f4ccb..0a20aef158e 100644 --- a/packages/network/samba/patches/samba-951-no-man-4.13.patch +++ b/packages/network/samba/patches/samba-951-no-man-4.16.patch @@ -1,11 +1,12 @@ diff --git a/docs-xml/wscript_build b/docs-xml/wscript_build --- a/docs-xml/wscript_build 2020-12-05 09:01:19.652459634 +0000 +++ b/docs-xml/wscript_build 2020-12-05 09:10:10.639446971 +0000 -@@ -153,28 +153,3 @@ - target=parameter_all, - rule=smbdotconf_generate_parameter_list, +@@ -175,32 +175,3 @@ + target=path_entities, + rule=generate_path_entity_file, dep_vars=bld.dynconfig_varnames()) - +- -def SMBDOTCONF_MANPAGE(bld, target): - ''' assemble and build smb.conf.5 manual page''' - bld.SAMBAMANPAGES(target, parameter_all) @@ -27,6 +28,9 @@ diff --git a/docs-xml/wscript_build b/docs-xml/wscript_build - if conf.env.build_winexe == True: - bld.SAMBAMANPAGES(winexe_manpages) - +- if bld.CONFIG_SET('ENABLE_SELFTEST'): +- bld.SAMBAMANPAGES('manpages/vfstest.1') +- - for manpage in vfs_module_manpages: - if bld.SAMBA3_IS_ENABLED_MODULE(manpage): - bld.SAMBAMANPAGES('manpages/%s.8' % manpage) diff --git a/packages/python/devel/Mako/package.mk b/packages/python/devel/Mako/package.mk index e46d4a74f22..4c618a2e178 100644 --- a/packages/python/devel/Mako/package.mk +++ b/packages/python/devel/Mako/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Mako" -PKG_VERSION="1.2.1" -PKG_SHA256="f054a5ff4743492f1aa9ecc47172cb33b42b9d993cffcc146c9de17e717b0307" +PKG_VERSION="1.2.2" +PKG_SHA256="3724869b363ba630a272a5f89f68c070352137b8fd1757650017b7e06fda163f" PKG_LICENSE="GPL" PKG_SITE="https://pypi.org/project/Mako" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" diff --git a/packages/python/devel/meson/package.mk b/packages/python/devel/meson/package.mk index 1b340e95918..92ecf9976bd 100644 --- a/packages/python/devel/meson/package.mk +++ b/packages/python/devel/meson/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="meson" -PKG_VERSION="0.63.0" -PKG_SHA256="3b51d451744c2bc71838524ec8d96cd4f8c4793d5b8d5d0d0a9c8a4f7c94cd6f" +PKG_VERSION="0.63.2" +PKG_SHA256="16222f17ef76be0542c91c07994f9676ae879f46fc21c0c786a21ef2cb518bbf" PKG_LICENSE="Apache" PKG_SITE="http://mesonbuild.com" PKG_URL="https://github.com/mesonbuild/meson/releases/download/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" diff --git a/packages/python/devel/ninja/package.mk b/packages/python/devel/ninja/package.mk index 0d6aad3c5f1..a116508a2ca 100644 --- a/packages/python/devel/ninja/package.mk +++ b/packages/python/devel/ninja/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="ninja" -PKG_VERSION="1.11.0" -PKG_SHA256="3c6ba2e66400fe3f1ae83deb4b235faf3137ec20bd5b08c29bfc368db143e4c6" +PKG_VERSION="1.11.1" +PKG_SHA256="31747ae633213f1eda3842686f83c2aa1412e0f5691d1c14dbbcc67fe7400cea" PKG_LICENSE="Apache" PKG_SITE="https://ninja-build.org/" PKG_URL="https://github.com/ninja-build/ninja/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/python/system/dbussy/package.mk b/packages/python/system/dbussy/package.mk index 7f12d722cd4..05266000ba4 100644 --- a/packages/python/system/dbussy/package.mk +++ b/packages/python/system/dbussy/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dbussy" -PKG_VERSION="60d3c155d07ce11bdf89a201ae0026525ac65aca" # 2022-01-28 -PKG_SHA256="0e9fd148e2d85404edb801d65236c78c1029edc413cdd40fdd31e4edc2c5647b" +PKG_VERSION="71616a370d3f59ef1681d26f5df77c1545d5bc04" # 2022-09-03 +PKG_SHA256="8ddae13387315c00bc316db1a2db8044073ad0d47f18d9840b3ba7f148b525ff" PKG_LICENSE="LGPLv2.1+" PKG_SITE="https://gitlab.com/ldo/dbussy" PKG_URL="https://github.com/ldo/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/security/nspr/package.mk b/packages/security/nspr/package.mk index a42d1acf7c5..328b9421820 100644 --- a/packages/security/nspr/package.mk +++ b/packages/security/nspr/package.mk @@ -3,7 +3,7 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nspr" -PKG_VERSION="4.34" +PKG_VERSION="4.34.1" PKG_LICENSE="Mozilla Public License" PKG_SITE="http://www.linuxfromscratch.org/blfs/view/svn/general/nspr.html" PKG_DEPENDS_HOST="ccache:host" diff --git a/packages/security/nss/package.mk b/packages/security/nss/package.mk index 4bebed98e0a..95c55c5d69f 100644 --- a/packages/security/nss/package.mk +++ b/packages/security/nss/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nss" -PKG_VERSION="3.81" -PKG_SHA256="12f9678a3000f54f16240bb20c76cb71dc098b2942661ac94237e07fa47ca443" +PKG_VERSION="3.83" +PKG_SHA256="b1e1198fa7ee4e0fe4fa6937245c94820fd3c3c6897779493858af1bf6310b30" PKG_LICENSE="Mozilla Public License" PKG_SITE="http://ftp.mozilla.org/" PKG_URL="https://ftp.mozilla.org/pub/security/nss/releases/NSS_${PKG_VERSION//./_}_RTM/src/nss-${PKG_VERSION}-with-nspr-$(get_pkg_version nspr).tar.gz" diff --git a/packages/sx05re/emuelec-emulationstation/package.mk b/packages/sx05re/emuelec-emulationstation/package.mk index e4f64bb0418..c6d8287cd7e 100644 --- a/packages/sx05re/emuelec-emulationstation/package.mk +++ b/packages/sx05re/emuelec-emulationstation/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="emuelec-emulationstation" -PKG_VERSION="6c5b34d2603106c2978f22be048483efbb9dd5f4" +PKG_VERSION="ff43aff90762f6f07e4a5af76f4cbcc5ea78e2fc" PKG_GIT_CLONE_BRANCH="EmuELEC" PKG_REV="1" PKG_ARCH="any" diff --git a/packages/sx05re/emuelec-ports/bstone/package.mk b/packages/sx05re/emuelec-ports/bstone/package.mk index 5e9ce5f24fe..97e39d9579f 100644 --- a/packages/sx05re/emuelec-ports/bstone/package.mk +++ b/packages/sx05re/emuelec-ports/bstone/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="bstone" -PKG_VERSION="68b4193d7c90d817d8282080841c6540ba8623e6" +PKG_VERSION="66863a93615b783b6573b9442358e22bc7e21fba" PKG_ARCH="any" PKG_SITE="https://github.com/bibendovsky/bstone" PKG_URL="$PKG_SITE.git" diff --git a/packages/sx05re/emuelec-ports/sonicmania/package.mk b/packages/sx05re/emuelec-ports/sonicmania/package.mk index 69f0cfbbc31..cbf1e73563e 100644 --- a/packages/sx05re/emuelec-ports/sonicmania/package.mk +++ b/packages/sx05re/emuelec-ports/sonicmania/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="sonicmania" -PKG_VERSION="75c87c70e1a735a3aa3b98068ba033cf5a688628" +PKG_VERSION="ff1183befba3d58dd8c5b3ab79b712f86c01d826" PKG_ARCH="any" PKG_SITE="https://github.com/Rubberduckycooly/Sonic-Mania-Decompilation" PKG_URL="$PKG_SITE.git" diff --git a/packages/sx05re/emuelec-ports/sources/ports.yaml b/packages/sx05re/emuelec-ports/sources/ports.yaml index 76b673d9e9f..94b0f4d3cca 100644 --- a/packages/sx05re/emuelec-ports/sources/ports.yaml +++ b/packages/sx05re/emuelec-ports/sources/ports.yaml @@ -298,7 +298,7 @@ Sonic 1: audio: "alsa" check_bios: sonic1 commands: - - /usr/bin/show_splash.sh "ports" "sonic1" + - /usr/bin/show_splash.sh gameloading "ports" "sonic1" - '[ ! -e "/storage/roms/ports/sonic1/settings.ini" ] && cp "/emuelec/configs/sonic/settings.ini" "/storage/roms/ports/sonic1/settings.ini"' - cd /storage/roms/ports/sonic1/ - ${PORT} >> $EE_LOG 2>&1 @@ -315,7 +315,7 @@ Sonic 2: audio: "alsa" check_bios: sonic2 commands: - - /usr/bin/show_splash.sh "ports" "sonic2" + - /usr/bin/show_splash.sh gameloading "ports" "sonic2" - '[ ! -e "/storage/roms/ports/sonic2/settings.ini" ] && cp "/emuelec/configs/sonic/settings.ini" "/storage/roms/ports/sonic2/settings.ini"' - cd /storage/roms/ports/sonic2/ - ${PORT} >> $EE_LOG 2>&1 @@ -332,7 +332,7 @@ Sonic CD: audio: "alsa" check_bios: soniccd commands: - - /usr/bin/show_splash.sh "ports" "soniccd" + - /usr/bin/show_splash.sh gameloading "ports" "soniccd" - '[ ! -e "/storage/roms/ports/soniccd/settings.ini" ] && cp "/emuelec/configs/sonic/settings.ini" "/storage/roms/ports/soniccd/settings.ini"' - cd /storage/roms/ports/soniccd/ - ${PORT} >> $EE_LOG 2>&1 @@ -349,7 +349,7 @@ Sonic Mania: audio: "alsa" check_bios: sonicmania commands: - - /usr/bin/show_splash.sh "ports" "sonicmania" + - /usr/bin/show_splash.sh gameloading "ports" "sonicmania" - '[ ! -e "/storage/roms/ports/sonicmania/Settings.ini" ] && cp "/emuelec/configs/sonicmania/Settings.ini" "/storage/roms/ports/sonicmania/Settings.ini"' - '[ ! -e "/storage/roms/ports/sonicmania/Game.so" ] && cp "/usr/bin/sonic_mania/Game.so" "/storage/roms/ports/sonicmania/Game.so"' - cd /storage/roms/ports/sonicmania/ @@ -366,7 +366,7 @@ SuperTux: port_exe: "supertux2" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "supertux" + - /usr/bin/show_splash.sh gameloading "ports" "supertux" - run_supertux.sh >> $EE_LOG 2>&1 SuperTuxKart: @@ -380,7 +380,7 @@ SuperTuxKart: port_exe: "supertuxkart" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "supertuxkart" + - /usr/bin/show_splash.sh gameloading "ports" "supertuxkart" - run_supertuxkart.sh >> $EE_LOG 2>&1 Supermariowar: @@ -394,7 +394,7 @@ Supermariowar: port_exe: "smw" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "supermariowar" + - /usr/bin/show_splash.sh gameloading "ports" "supermariowar" - run_smw.sh >> $EE_LOG 2>&1 Hurrican: @@ -408,7 +408,7 @@ Hurrican: port_exe: "hurrican" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "hurrican" + - /usr/bin/show_splash.sh gameloading "ports" "hurrican" - hurrican.sh >> $EE_LOG 2>&1 Cdogs-sdl: @@ -422,7 +422,7 @@ Cdogs-sdl: port_exe: "cdogs-sdl" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "cdogs-sdl" + - /usr/bin/show_splash.sh gameloading "ports" "cdogs-sdl" - cdogs-sdl.sh >> $EE_LOG 2>&1 Abuse: @@ -436,7 +436,7 @@ Abuse: port_exe: "abuse" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "abuse" + - /usr/bin/show_splash.sh gameloading "ports" "abuse" - abuse.sh >> $EE_LOG 2>&1 Sorr: @@ -450,7 +450,7 @@ Sorr: port_exe: "bgdi" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "sorr" + - /usr/bin/show_splash.sh gameloading "ports" "sorr" - '[[ "${EE_DEVICE}" != "Amlogic"* ]] && gptokeyb -c /emuelec/configs/gptokeyb/sorr.gptk &' - cd /storage/roms/ports/sorr - '[[ ! -e "/storage/roms/ports/sorr/SorR.dat" ]] && exit 21' @@ -467,7 +467,7 @@ Heroes of Might and Magic II: port_exe: "fheroes2" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "fheroes2" + - /usr/bin/show_splash.sh gameloading "ports" "fheroes2" - fheroes2.sh >> $EE_LOG 2>&1 Blake Stone: @@ -481,7 +481,7 @@ Blake Stone: port_exe: "bstone" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "bstone" + - /usr/bin/show_splash.sh gameloading "ports" "bstone" - bstone.sh >> $EE_LOG 2>&1 Blake Stone Planet Strike: @@ -495,7 +495,7 @@ Blake Stone Planet Strike: port_exe: "bstone" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "bstone" + - /usr/bin/show_splash.sh gameloading "ports" "bstone" - bstone.sh ps >> $EE_LOG 2>&1 Shovel Knight: @@ -509,7 +509,7 @@ Shovel Knight: port_exe: "ShovelKnight" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "shovelknight" + - /usr/bin/show_splash.sh gameloading "ports" "shovelknight" - shovelknight.sh >> $EE_LOG 2>&1 TMNTSR: @@ -523,5 +523,5 @@ TMNTSR: port_exe: "mono" audio: "alsa" commands: - - /usr/bin/show_splash.sh "ports" "tmntsr" + - /usr/bin/show_splash.sh gameloading "ports" "tmntsr" - tmntsr.sh >> $EE_LOG 2>&1 diff --git a/packages/sx05re/emuelec-ports/xash3d/package.mk b/packages/sx05re/emuelec-ports/xash3d/package.mk index 84bcf8d03d6..97051c66282 100644 --- a/packages/sx05re/emuelec-ports/xash3d/package.mk +++ b/packages/sx05re/emuelec-ports/xash3d/package.mk @@ -3,7 +3,7 @@ # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="xash3d" -PKG_VERSION="5b97c2135adfd6716ba84ff736682b44cc41c10f" +PKG_VERSION="360dc4f7ed664e1c10beb799fe6070d6a5bc36c4" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/FWGS/xash3d-fwgs" PKG_URL="https://github.com/FWGS/xash3d-fwgs.git" diff --git a/packages/sx05re/emuelec/bin/check_res.sh b/packages/sx05re/emuelec/bin/check_res.sh new file mode 100644 index 00000000000..09627d16a36 --- /dev/null +++ b/packages/sx05re/emuelec/bin/check_res.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) +# Copyright (C) 2022-present Langerz82 (https://github.com/Langerz82) + +# Source predefined functions and variables +. /etc/profile + +# DO NOT modify this file. + +# It seems some slow SDcards have a problem creating the symlink on time :/ +CONFIG_FLASH="/flash/config.ini" +VIDEO_FILE="/storage/.config/EE_VIDEO_MODE" +VIDEO_MODE="/sys/class/display/mode" + + + +# If the video-mode is contained in flash config. +DEFE="" + +# FLASH CONFIG hdmimode takes priority 1. +if [ -z "$DEFE" ]; then + CFG_VAL=$(get_config_value "$CONFIG_FLASH" "vout") + if [[ ! -z "$CFG_VAL" ]]; then + DEFE="$CFG_VAL" + fi +fi + +# Check for EE_VIDEO_MODE override 2nd. +if [[ -z "$DEFE" && -f "$VIDEO_FILE" ]]; then + DEFE=$(cat $VIDEO_FILE) +fi + +# 3rd check ES for it's preferred resolution. +if [ -z "$DEFE" ]; then + DEFE=$(get_ee_setting ee_videomode) + if [ "${DEFE}" == "Custom" ]; then + DEFE=$(cat $VIDEO_MODE) + fi +fi + +# Set video mode, this has to be done before starting ES +# finally we correct the FB according to video mode +[[ ! -z "$DEFE" ]] && [[ -f "$VIDEO_MODE" ]] && setres.sh ${DEFE} + diff --git a/packages/sx05re/emuelec/bin/emuelec-utils b/packages/sx05re/emuelec/bin/emuelec-utils index f5b7fd4d4bd..b098e92c7bb 100755 --- a/packages/sx05re/emuelec/bin/emuelec-utils +++ b/packages/sx05re/emuelec/bin/emuelec-utils @@ -191,6 +191,7 @@ function resolutions() { RESOLUTIONS=() if [ -f "/storage/LEGACY_RESOLUTIONS" ]; then +<<<<<<< HEAD # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" @@ -207,6 +208,24 @@ function resolutions() { fi done done +======= + # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode + N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" + + # Screen supported resolutions + SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/amhdmitx/amhdmitx0/rawedid | /usr/bin/edid-decode |/usr/bin/grep "@" | sed -E "s| {0,9}VIC {0,9}[0-9]{1,2}||" | /usr/bin/awk '{print $1}' | /usr/bin/sed 's/@/p/g'|/usr/bin/tr '[:upper:]' '[:lower:]'` + + for N2SP in $N2_SUPPORTED_RESOLUTIONS + do + for SSR in $SCREEN_SUPPORTED_RESOLUTIONS + do + if [ "$N2SP" = "$SSR" ] + then + RESOLUTIONS+=($N2SP) + fi + done + done +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 fi if [[ "$EE_PROJECT" == "Rockchip" ]]; then @@ -217,7 +236,11 @@ function resolutions() { done else # Screen supported resolutions +<<<<<<< HEAD SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/cap | sed '/smpte/d' | sed '/pal/d' | sed '/ntsc/d' | sed 's/\*//' | grep -E '[0-9x]+[pi][56]0hz|cvbs'` +======= + SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/cap | sed '/smpte/d' | sed '/pal/d' | sed '/ntsc/d' | sed 's/\*//' | grep -E '[0-9x]+[pi][56]0hz|cvbs'` +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 for SSR in $SCREEN_SUPPORTED_RESOLUTIONS do RESOLUTIONS+=($SSR) diff --git a/packages/sx05re/emuelec/bin/emuelecRunEmu.sh b/packages/sx05re/emuelec/bin/emuelecRunEmu.sh index c332a1204c8..9efda6edfff 100644 --- a/packages/sx05re/emuelec/bin/emuelecRunEmu.sh +++ b/packages/sx05re/emuelec/bin/emuelecRunEmu.sh @@ -8,6 +8,8 @@ # This whole file has become very hacky, I am sure there is a better way to do all of this, but for now, this works. +blank_buffer + if [ -f "/usr/bin/odroidgoa_utils.sh" ]; then DEFBRIGHT=$(get_ee_setting brightness.level) RACONF=/storage/.config/retroarch/retroarch.cfg @@ -78,7 +80,7 @@ ROMNAME="$1" BASEROMNAME=${ROMNAME##*/} GAMEFOLDER="${ROMNAME//${BASEROMNAME}}" -[ -f "/emuelec/bin/setres.sh" ] && SET_DISPLAY_SH="/emuelec/bin/setres.sh" || SET_DISPLAY_SH="/usr/bin/setres.sh" +SET_DISPLAY_SH="setres.sh" VIDEO="$(cat /sys/class/display/mode)" VIDEO_EMU=$(get_ee_setting nativevideo "${PLATFORM}" "${BASEROMNAME}") @@ -129,12 +131,21 @@ fi # Set the display video to that of the emulator setting. [ ! -z "$VIDEO_EMU" ] && $TBASH $SET_DISPLAY_SH $VIDEO_EMU # set display +# Get the latest save files if there is any +CLOUD_SYNC=$(get_ee_setting "${PLATFORM}.cloudsave") +[[ "$CLOUD_SYNC" == "1" ]] && ra_rclone.sh get "${PLATFORM}" "${ROMNAME}" & +CLOUD_PID=$! + # Show splash screen if enabled SPL=$(get_ee_setting ee_splash.enabled) -[ "$SPL" -eq "1" ] && ${TBASH} show_splash.sh "$PLATFORM" "${ROMNAME}" +[ "$SPL" -eq "1" ] && ${TBASH} show_splash.sh gameloading "$PLATFORM" "${ROMNAME}" && sleep 3 -# Only run fbfix on Amlogic-ng (Mali g31 and g52 in Amlogic SOC) -[[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix +# Set the display video to that of the emulator setting. +[ ! -z "$VIDEO_EMU" ] && $TBASH $SET_DISPLAY_SH $VIDEO_EMU # set display + + +CONTROLLERCONFIG="${arguments#*--controllers=*}" +echo "${CONTROLLERCONFIG}" | tr -d '"' > "/tmp/controllerconfig.txt" if [ -z ${LIBRETRO} ] && [ -z ${RETRORUN} ]; then @@ -431,10 +442,14 @@ if [ "$(get_es_setting string LogLevel)" != "minimal" ]; then # No need to do al eval echo ${RUNTHIS} >> $EMUELECLOG fi -if [[ "${KILLTHIS}" != "none" ]]; then +if [[ "${KILLTHIS}" == "advmame" ]]; then + gptokeyb 1 ${KILLTHIS} -killsignal 3 & +else gptokeyb 1 ${KILLTHIS} & fi +[[ "$CLOUD_SYNC" == "1" ]] && wait $CLOUD_PID + # Execute the command and try to output the results to the log file if it was not disabled. if [[ $LOGEMU == "Yes" ]]; then echo "Emulator Output is:" >> $EMUELECLOG @@ -444,7 +459,11 @@ else echo "Emulator log was dissabled" >> $EMUELECLOG eval ${RUNTHIS} > /dev/null 2>&1 ret_error=$? -fi +fi + +blank_buffer + +[[ "$CLOUD_SYNC" == "1" ]] && ra_rclone.sh set "${PLATFORM}" "${ROMNAME}" & # clear terminal window reset > /dev/tty < /dev/null 2>&1 @@ -455,11 +474,12 @@ fi # Return to default mode $TBASH $SET_DISPLAY_SH $VIDEO -# Only run fbfix on Amlogic-ng (Mali g31 and g52 in Amlogic SOC) -[[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix +sleep 3 && check_hard_kill "${KILL_THIS}" & # Show exit splash ${TBASH} show_splash.sh exit +sleep 4 + # Just in case kill_video_controls @@ -519,6 +539,8 @@ fi # Temp fix for libretro scummvm always erroing out on exit [[ "${EMU}" == *"scummvm_libretro"* ]] && ret_error=0 +[[ "$CLOUD_SYNC" == "1" ]] && wait $CLOUD_PID + if [[ "$ret_error" != "0" ]]; then echo "exit $ret_error" >> $EMUELECLOG ret_bios=0 @@ -539,8 +561,10 @@ if [[ "$ret_error" != "0" ]]; then # Since the error was not because of missing BIOS but we did get an error, display the log to find out [[ "$ret_bios" == "0" ]] && text_viewer -e -w -t "Error! ${PLATFORM}-${EMULATOR}-${CORE}-${ROMNAME}" -f 24 ${EMUELECLOG} + blank_buffer exit 1 else echo "exit 0" >> $EMUELECLOG + blank_buffer exit 0 fi diff --git a/packages/sx05re/emuelec/bin/emuelec_autostart.sh b/packages/sx05re/emuelec/bin/emuelec_autostart.sh index 5e350cb97c2..689f426d378 100755 --- a/packages/sx05re/emuelec/bin/emuelec_autostart.sh +++ b/packages/sx05re/emuelec/bin/emuelec_autostart.sh @@ -9,7 +9,6 @@ # DO NOT modify this file, if you need to use autostart please use /storage/.config/custom_start.sh # It seems some slow SDcards have a problem creating the symlink on time :/ -CONFIG_FLASH="/flash/config.ini" CONFIG_DIR="/storage/.emulationstation" CONFIG_DIR2="/storage/.config/emulationstation" @@ -117,8 +116,13 @@ case "$DEFE" in ;; esac +<<<<<<< HEAD FILE_MODE="/sys/class/display/mode" [[ -f "$FILE_MODE" ]] && setres.sh +======= +# Checks and sets the resolution for starting ES. +check_res.sh +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 # Show splash creen show_splash.sh intro diff --git a/packages/sx05re/emuelec/bin/emustation-config b/packages/sx05re/emuelec/bin/emustation-config index 17aa6ec67b2..17f01c59a83 100755 --- a/packages/sx05re/emuelec/bin/emustation-config +++ b/packages/sx05re/emuelec/bin/emustation-config @@ -8,11 +8,13 @@ # odroidgoa - function check_pwd() { +<<<<<<< HEAD CONFIG_FLASH="/flash/config.ini" EE_CONF="${EE_DIR}/configs/emuelec.conf" +======= +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 ESSETTINGS="/storage/.config/emulationstation/es_settings.cfg" PWDFILE="${1}" @@ -286,6 +288,7 @@ fi emuelec-utils setauddev +<<<<<<< HEAD DEFE="" # If the video-mode is contained in flash config. @@ -311,5 +314,9 @@ fi # finally we correct the FB according to video mode [[ ! -z "$DEFE" ]] && setres.sh ${DEFE} +======= +# Checks and sets the resolution for starting ES. +check_res.sh +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 exit 0 diff --git a/packages/sx05re/emuelec/bin/joy_common.sh b/packages/sx05re/emuelec/bin/joy_common.sh index 190fc35c18f..975b111f180 100644 --- a/packages/sx05re/emuelec/bin/joy_common.sh +++ b/packages/sx05re/emuelec/bin/joy_common.sh @@ -27,11 +27,18 @@ jc_get_players() { | grep -Ew -B 8 "B: KEY\=[0-9a-f ]+" > /tmp/input_devices # Determine how many gamepads/players are connected +<<<<<<< HEAD JOYS=$(ls -A1 /dev/input/js* | sort ) if [[ -f "/storage/.config/EE_JOY_ORDER_NEW" ]]; then JOYS=$(cat /tmp/input_devices | grep -A2 "S: Sysfs=" \ | awk '/^S:/ {s=$0} /^H:/ {print s "\t" $0}' | sort -t $'\t' -k2 \ | sed 's,.*\(.\{4\}\)$,\1,' | sed 's/ //g') +======= + JOYS=$(ls -ltr /dev/input/js* | awk '{print $8"\t"$9"\t"$10}' | sort \ + | awk '{print $3}' | cut -d'/' -f4) + if [[ -f "/storage/.config/JOY_LEGACY_ORDER" ]]; then + JOYS=$(ls -A1 /dev/input/js*| sort | sed "s|/dev/input/||g") +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 fi declare -a PLAYER_CFGS=() @@ -54,9 +61,8 @@ jc_get_players() { # Add the joy config to array if guid and joyname set. if [[ ! -z "${DEVICE_GUID}" && ! -z "$JOY_NAME" ]]; then - local PLAYER_CFG="${PLAYER} ${JSI} ${DEVICE_GUID} ${JOY_NAME}" - - PLAYER_CFGS+=("${PLAYER_CFG}") + local PLAYER_CFG="${JSI} ${DEVICE_GUID} \"${JOY_NAME}\"" + PLAYER_CFGS[$((PLAYER-1))]="${PLAYER_CFG}" ((PLAYER++)) fi done @@ -68,43 +74,50 @@ jc_get_players() { return fi - declare -i PLAYERS=${#PLAYER_CFGS[@]} - local PLAYER_CFG=0 - for PLAYER in {1..4}; do - local PINDEX=$(( PLAYER - 1 )) - PLAYER_CFG=$PLAYER - if [[ "$PINDEX" -lt "$PLAYERS" ]]; then - PLAYER_CFG="${PLAYER_CFGS[$PINDEX]}" - jc_setup_gamecontroller "${PLAYER_CFG}" - else - clean_pad ${PLAYER_CFG} - fi - done -} - -jc_setup_gamecontroller() { - local PLAYER_CFG="$1" - local JOY_INFO=$(echo "$1" | cut -d' ' -f1-3) - local JOY_NAME=$(echo "$1" | cut -d' ' -f4-) - - [[ -z "${CACHE_FILE}" ]] && return - - local USE_CACHE=$(get_ee_setting ${EMULATOR}_joy_cache) - if [[ "${USE_CACHE}" == "1" ]]; then - local CACHE="" - [[ -f "${CACHE_FILE}" ]] && CACHE=$(cat $CACHE_FILE | grep "$PLAYER_CFG") - - if [[ ! -z "$CACHE" || "$CACHE" == "${PLAYER_CFG}" ]]; then - return - fi + local cfgCount=${#PLAYER_CFGS[@]} + MANUAL_CONFIG=$(cat "/tmp/controllerconfig.txt") + echo "MANUAL_CONFIG=${MANUAL_CONFIG}" + if [[ ! -z "${MANUAL_CONFIG}" && ! -f "/storage/.config/EE_CONTROLLER_OVERIDE_OFF" ]]; then + declare -a GUID_ORDER=($MANUAL_CONFIG) + declare -a GUIDS=() + + local index=0 + local row=0 + local i=0 + local pl=0 + for i in ${GUID_ORDER[@]}; do + row=$(( index % 4 )) + [[ $row == 0 ]] && pl=${i:2:1} + [[ $row == 3 ]] && GUIDS[$pl]=${GUID_ORDER[$(( index+0 ))]} + (( index++ )) + done + echo "GUID_ORDER=${GUIDS[@]}" + local si=0 + for (( i=1; i<=$cfgCount; i++ )); do + local tGUID=${GUIDS[i]} + [[ "$tGUID" == "" ]] && continue + for (( j=$si; j<$cfgCount; j++ )); do + local cfgGUID=$(echo "${PLAYER_CFGS[$j]}" | cut -d' ' -f2) + if [[ $tGUID == $cfgGUID ]]; then + local tmp="${PLAYER_CFGS[$j]}" + PLAYER_CFGS[$j]="${PLAYER_CFGS[$si]}" + PLAYER_CFGS[$si]="$tmp" + (( si++ )) + break + fi + done + done fi - echo "CONTROLLER: ${PLAYER_CFG}" - clean_pad ${JOY_INFO} "${JOY_NAME}" - set_pad ${JOY_INFO} "${JOY_NAME}" - - [[ -f "${CACHE_FILE}" ]] && sed -i "/^${PLAYER_CFG:0:1} js.*$/d" ${CACHE_FILE} - echo "${PLAYER_CFG}" >> "${CACHE_FILE}" + local PLAYER_CFG= + for p in {1..4}; do + local CFG="${p} ${PLAYER_CFGS[$(( p-1 ))]}" + if [[ $p -le $cfgCount ]]; then + echo "PLAYER_CFG=${CFG}" + fi + eval clean_pad ${CFG} + [[ "${CFG}" != "${p} " ]] && eval set_pad ${CFG} + done } jc_generate_guid() { @@ -122,4 +135,7 @@ jc_generate_guid() { echo "$v" } +<<<<<<< HEAD +======= +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index ec44e28ac22..311c85f09c2 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -14,16 +14,20 @@ # Source predefined functions and variables . /etc/profile +<<<<<<< HEAD # arg1, 1 = Hides, 0 = Show. show_buffer () { echo $1 > /sys/class/graphics/fb0/blank echo $1 > /sys/class/graphics/fb1/blank } +======= +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 blank_buffer() { # Blank the buffer. +<<<<<<< HEAD dd if=/dev/zero of=/dev/fb0 bs=10M > /dev/null 2>&1 } @@ -36,15 +40,201 @@ FILE_MODE="/sys/class/display/mode" [[ ! -f "$FILE_MODE" ]] && exit 0; BPP=32 +======= + echo 1 > /sys/class/graphics/fb1/blank + dd if=/dev/zero of=/dev/fb1 bs=8M > /dev/null 2>&1 + echo 0 > /sys/class/graphics/fb1/blank + echo 1 > /sys/class/graphics/fb0/blank + dd if=/dev/zero of=/dev/fb0 bs=32M > /dev/null 2>&1 + echo 0 > /sys/class/graphics/fb0/blank + [[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix +} + +switch_resolution() +{ + local OLD_MODE=$1 + local MODE=$2 + + # This first checks that if you need to change the resolution and if so update + # the file that switches the mode automatically if the value is valid if not exit. + if [[ "$OLD_MODE" != "$MODE" ]]; then + # Here we first clear the primary display buffer of leftover artifacts then set + # the secondary small buffers flag to stop copying across. + blank_buffer >> /dev/null + + case $MODE in + 480cvbs) + echo 480cvbs > "${FILE_MODE}" + ;; + 576cvbs) + echo 576cvbs > "${FILE_MODE}" + ;; + 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) + echo $MODE > "${FILE_MODE}" + ;; + *x*) + echo $MODE > "${FILE_MODE}" + ;; + esac + local NEW_MODE=$(cat $FILE_MODE) + if [[ "$NEW_MODE" == "$MODE" ]]; then + echo "1" + return + fi + fi + echo "0" +} + +get_resolution_size() +{ + local MODE=$1 + # Here we set the Height and Width of the particular resolution, RH and RW stands + # for Real Width and Real Height respectively. + local RW=0 + local RH=0 + case $MODE in + 480cvbs) + RW=640 + RH=480 + [[ -z "$SW" ]] && SW=1024 + [[ -z "$SH" ]] && SH=768 + ;; + 576cvbs) + RW=720 + RH=576 + [[ -z "$SW" ]] && SW=1024 + [[ -z "$SH" ]] && SH=768 + ;; + 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) + SW=$(( $SH*16/9 )) + [[ "$MODE" == "480"* ]] && SW=640 + RW=$SW + RH=$SH + ;; + *x*) + SW=$(echo $MODE | cut -d'x' -f 1) + SH=$(echo $MODE | cut -d'x' -f 2 | cut -d'p' -f 1) + [ ! -n "$SH" ] && H=$(echo $MODE | cut -d'x' -f 2 | cut -d'i' -f 1) + RW=$SW + RH=$SH + ;; + esac + echo "$SW $SH $RW $RH" +} + +set_main_framebuffer() { + local SW=$1 + local SH=$2 + local BPP=32 + + if [[ -n "$SW" && "$SW" > 0 && -n "$SH" && "$SH" > 0 ]]; then + MSH=$(( SH*2 )) + fbset -fb /dev/fb0 -g $SW $SH $SW $MSH $BPP + echo 0 0 $(( SW-1 )) $(( SH-1 )) > /sys/class/graphics/fb0/free_scale_axis + echo 0 > /sys/class/graphics/fb0/free_scale + echo 0 > /sys/class/graphics/fb0/freescale_mode + fi +} + +set_display_borders() { + local PX=$1 + local PY=$2 + local PW=$3 + local PH=$4 + local RW=$5 + local RH=$6 + + if [[ -z "$PX" || -z "$PY" || -z "$PW" || -z "$PH" ]]; then + return 1 + elif [[ ! -n "$PX" || ! -n "$PY" || ! -n "$PW" || ! -n "$PH" ]]; then + return 2 + elif [[ "$PW" == "0" || "$PH" == "0" ]]; then + return 3 + fi + echo "PX:$PX PY:$PY PW:$PW PH:$PH" + + # Sets the default 2nd point of the display which should always be slightly + # smaller then the acual size of the screen display. + PX2=$(( RW-PX-1 )) + PY2=$(( RH-PY-1 )) +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 + + # If the real width and height are defined particularly for cvbs then use + # the real values of the screen resolution not the display buffers resolution + # which may differ and generally be allot bigger so all the gui objects are + # kept in perspective. + [[ ${RW} != ${PW} ]] && PX2=$(( PW+PX-1 )) + [[ ${RH} != ${PH} ]] && PY2=$(( PH+PY-1 )) + + echo "PX:${PX} PY:${PY} PX2:${PX2} PY2:${PY2}" + echo 1 > /sys/class/graphics/fb0/freescale_mode + echo "${PX} ${PY} ${PX2} ${PY2}" > /sys/class/graphics/fb0/window_axis + echo 0x10001 > /sys/class/graphics/fb0/free_scale + return 0 +} + +# Here we initialize any arguments and variables to be used in the script. +# The Mode we want the display to change too. MODE=$1 +<<<<<<< HEAD DEF_MODE=$(cat $FILE_MODE) # If the current display is the same as the change just exit. [[ $MODE == "auto" ]] && exit 0; +======= +FORCE_RUN=$2 +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 + +[[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix + +# File location of the file that when written to switches the display to match +# that screen resolution. Note - You do not have to alter anything else, if it's +# a valid screen value ti will auto-change, if not it will just keep it's +# original value. +FILE_MODE="/sys/class/display/mode" + +# SH=Height in pixels, SW=Width in pixels, BPP=Bits Per Pixel. +BPP=32 +SH=0 +SW=0 + +# The current display mode before it may get changed below. +OLD_MODE=$( cat ${FILE_MODE} ) + +BORDER_VALS=$(get_ee_setting ee_videowindow) + + +# Legacy code, we use to set the buffer that is used for small parts of graphics +# like Cursors and Fonts but setting default 32 made ES Fonts dissappear. +BUFF=$(get_ee_setting ee_video_fb1_size) +[[ -z "$BUFF" ]] && BUFF=32 + +if [[ -n "$BUFF" ]] && [[ $BUFF > 0 ]]; then + fbset -fb /dev/fb1 -g $BUFF $BUFF $BUFF $BUFF $BPP +fi + + +# If the current display is the same as the change just exit. First we hide the +# primary display buffer by setting the fb1 blank flag so it stops copying chunks +# of data on to the image, then we blank the buffer by setting all the bits to 0. +if [[ ! -f "$FILE_MODE" ]] || [[ $MODE == "auto" ]]; then + exit 0 +fi + +if [[ "$FORCE_RUN" == "" ]] && [[ "$MODE" == "$OLD_MODE" ]]; then + if [[ -z "${BORDER_VALS}" ]]; then + exit 0 + fi +fi + + +# For resolution with 2 width and height resolution numbers extract the Height. +# *p* stand for progressive and *i* stand for interlaced. if [[ ! "$MODE" == *"x"* ]]; then case $MODE in +<<<<<<< HEAD *p*) H=$(echo $MODE | cut -d'p' -f 1) ;; *i*) H=$(echo $MODE | cut -d'i' -f 1) ;; esac @@ -119,15 +309,96 @@ case $MODE in fi ;; esac +======= + *p*) SH=$(echo $MODE | cut -d'p' -f 1) ;; + *i*) SH=$(echo $MODE | cut -d'i' -f 1) ;; + esac +fi -blank_buffer +# Option too Custom set the CVBS Resolution by creating a cvbs_resolution.txt file. +# File contents must just 2 different integers seperated by a space. e.g. 800 600. +CVBS_RES_FILE="/storage/.config/cvbs_resolution.txt" +if [[ "$MODE" == *"cvbs" ]]; then + if [[ -f "${CVBS_RES_FILE}" ]]; then + declare -a CVBS_RES=($(cat "${CVBS_RES_FILE}")) + if [[ ! -z "${CVBS_RES[@]}" ]]; then + SW=${CVBS_RES[0]} + SH=${CVBS_RES[1]} + fi + fi +fi + +# This is needed to reset scaling. +echo 0 > /sys/class/ppmgr/ppscaler + +SWITCHED_MODES=$(switch_resolution $OLD_MODE $MODE) + +declare -a SIZE=($( get_resolution_size $MODE )) + +SW=${SIZE[0]} +SH=${SIZE[1]} +RW=${SIZE[2]} +RH=${SIZE[3]} + +echo "SWITCHED_MODES=$SWITCHED_MODES" + +# Once we know the Width and Height is valid numbers we set the primary display +# buffer, and we multiply the 2nd height by a factor of 2 I assume for interlaced +# support. +if [[ "$SWITCHED_MODES" == "1" ]]; then + echo "SET MAIN FRAME BUFFER" + set_main_framebuffer $RW $RH + blank_buffer +fi -# shows buffer -show_buffer 0 +# Now that the primary buffer has been acquired we blank it again because the new +# memory allocated, may contain garbage artifact data. +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 +# Gets the default X, and Y position offsets for cvbs so the display can fit +# inside the actual analog diplay resolution which is a bit smaller than the +# resolution it's usually transmitted as. +if [[ "${MODE}" == "480cvbs" ]]; then + BORDERS=(4 0) +fi +if [[ "${MODE}" == "576cvbs" ]]; then + BORDERS=(12 0) +fi + +# This monolith slab of code basically gets the users preference of if they want +# to resize there screen display to make it smaller so it can fit into a screen +# properly. If the user suppllies values its coded to restrict the user into not +# letting the user set a width greater than the screen display size. +BORDER_VALS=$(get_ee_setting ee_videowindow) +if [[ ! -z "${BORDER_VALS}" ]]; then + declare -a BORDERS=(${BORDER_VALS}) + COUNT_ARGS=${#BORDERS[@]} + if [[ ${COUNT_ARGS} != 4 && ${COUNT_ARGS} != 2 ]]; then + exit 0 + fi +fi + +<<<<<<< HEAD [[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix # End of reading the video output mode and setting it for emuelec to avoid video flicking. # The codes can be simplified with "elseif" sentences. # The codes for 480I and 576I are adjusted to avoid overscan. # Force 720p50hz to 720p60hz and 1080i/p60hz to 1080i/p60hz since 50hz would make video very choppy. +======= +# If border values have been supplied then we can check the offsets and the +# width and height and make sure they are all valid and will not cause issues for +# when we set the borders, and allow the primary display buffer to resize the screen. +if [[ ! -z "${BORDERS}" ]]; then + PW=${BORDERS[2]} + [[ -z "$PW" ]] && PW=$RW + PH=${BORDERS[3]} + [[ -z "$PH" ]] && PH=$RH + set_display_borders ${BORDERS[0]} ${BORDERS[1]} $PW $PH $RW $RH +fi + +# Lastly we call fbfix to reset its known memory offsets so when the primary +# buffer display is used, it's got the correct starting memory address. Note - +# This only need appply to new generation devices. +[[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix +>>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 diff --git a/packages/sx05re/emuelec/bin/show_splash.sh b/packages/sx05re/emuelec/bin/show_splash.sh index cc624e8e7db..a2a244a00c2 100755 --- a/packages/sx05re/emuelec/bin/show_splash.sh +++ b/packages/sx05re/emuelec/bin/show_splash.sh @@ -10,7 +10,9 @@ . /etc/profile -PLATFORM="$1" +ACTION_TYPE="$1" +PLATFORM="$2" + GAMELOADINGSPLASH="/storage/.config/splash/loading-game.png" BLANKSPLASH="/storage/.config/splash/blank.png" DEFAULTSPLASH="/storage/.config/splash/splash-1080.png" @@ -36,13 +38,22 @@ case $PLATFORM in ;; esac -if [ "$PLATFORM" == "intro" ] || [ "$PLATFORM" == "exit" ]; then +MODE=`cat /sys/class/display/mode`; +SPLASHDIR="/storage/roms/splash" + +if [ "$ACTION_TYPE" == "intro" ] || [ "$ACTION_TYPE" == "exit" ]; then SPLASH=${DEFAULTSPLASH} -elif [ "$PLATFORM" == "blank" ]; then + if [[ "$MODE" == *"x"* ]]; then + SPLASH="${SPLASHDIR}/splash-std.png" + fi +elif [ "$ACTION_TYPE" == "blank" ]; then SPLASH=${BLANKSPLASH} -else - SPLASHDIR="/storage/roms/splash" - ROMNAME=$(basename "${2%.*}") +elif [ "$ACTION_TYPE" == "gameloading" ]; then + if [[ "$MODE" == *"x"* ]]; then + GAMELOADINGSPLASH="${SPLASHDIR}/loading-game-std.png" + fi + + ROMNAME=$(basename "${3%.*}") SPLMAP="/emuelec/bezels/arcademap.cfg" SPLNAME=$(sed -n "/`echo ""$PLATFORM"_"${ROMNAME}" = "`/p" "$SPLMAP") REALSPL="${SPLNAME#*\"}" @@ -82,57 +93,66 @@ SPLASHVID5="$SPLASHDIR/launching.mp4" elif [ -f "$SPLASH5" ]; then SPLASH="$SPLASH5" else - SPLASH=${GAMELOADINGSPLASH} + SPLASH="${GAMELOADINGSPLASH}" fi fi # Odroid Go Advance still does not support splash screens SS_DEVICE=0 -if [ "$EE_DEVICE" == "OdroidGoAdvance" ] || [ "$EE_DEVICE" == "GameForce" ]; then +if [[ "$EE_DEVICE" == "OdroidGoAdvance" ]] || [[ "$EE_DEVICE" == "GameForce" ]]; then SS_DEVICE=1 clear > /dev/console echo "Loading ..." > /dev/console PLAYER="mpv" fi -MODE=`cat /sys/class/display/mode`; -case "$MODE" in - 480*) - SIZE=" -x 720 -y 480" - ;; - 576*) - SIZE=" -x 768 -y 576" - ;; - 720*) - SIZE=" -x 1280 -y 720" - ;; - 1080*) - SIZE=" -x 1920 -y 1080" - ;; - 1280x1024*) - SIZE=" -x 1280 -y 1024" - ;; - 1024x768*) - SIZE=" -x 1024 -y 768" - ;; - 640x480*) - SIZE=" -x 640 -y 480" - ;; - *) - SIZE=" -x 1920 -y 1080" - ;; -esac +if [[ "$SIZE" != "NONE" ]]; then + case "$MODE" in + 480*) + SIZE=" -x 720 -y 480" + ;; + 576*) + SIZE=" -x 768 -y 576" + ;; + 720*) + SIZE=" -x 1280 -y 720" + ;; + 1080*) + SIZE=" -x 1920 -y 1080" + ;; + 2160*) + SIZE=" -x 3840 -y 2160" + ;; + 1280x1024*) + SIZE=" -x 1280 -y 1024" + ;; + 1024x768*) + SIZE=" -x 1024 -y 768" + ;; + 800x600*) + SIZE=" -x 800 -y 600" + ;; + 640x480*) + SIZE=" -x 640 -y 480" + ;; + *) + SIZE=" -x 1920 -y 1080" + ;; + esac +else + SIZE="" +fi # Blank screen needs to fill entire screen. -if [ "$PLATFORM" == "blank" ]; then +if [ "$ACTION_TYPE" == "blank" ]; then SIZE=" -x 3840 -y 2160" fi -[[ "${PLATFORM}" != "intro" ]] && VIDEO=0 || VIDEO=$(get_ee_setting ee_bootvideo.enabled) +[[ "${ACTION_TYPE}" != "intro" ]] && VIDEO=0 || VIDEO=$(get_ee_setting ee_bootvideo.enabled) if [[ -f "/storage/.config/emuelec/configs/novideo" ]] && [[ ${VIDEO} != "1" ]]; then - if [ "$PLATFORM" != "intro" ]; then + if [ "$ACTION_TYPE" != "intro" ]; then if [ "$SS_DEVICE" == 1 ]; then $PLAYER "$SPLASH" > /dev/null 2>&1 else diff --git a/packages/sx05re/emuelec/config/emuelec/configs/emuelec.conf b/packages/sx05re/emuelec/config/emuelec/configs/emuelec.conf index a991f8bf8d9..043540f9245 100644 --- a/packages/sx05re/emuelec/config/emuelec/configs/emuelec.conf +++ b/packages/sx05re/emuelec/config/emuelec/configs/emuelec.conf @@ -49,14 +49,13 @@ ee_mount.retry=1 # Enable Advance mame auto gamepad configuration 1,0 (default 1) advmame_auto_gamepad=1 +dolphin_auto_gamepad=1 +flycast_auto_gamepad=1 +mupen64plus_auto_gamepad=1 # Enable Advance mame config buttom remapping 1,0 (default 0) advmame_joy_remap=1 -flycast_joy_remap=1 - -dolphin_joy_remap=1 - AdvanceMame.joy_btns=input a button,input b button,input x button,input y button,input r button,input l button,input r2 button,input l2 button AdvanceMame.joy_btn_indexes=1,2 diff --git a/packages/sx05re/emuelec/config/splash/loading-game-std.png b/packages/sx05re/emuelec/config/splash/loading-game-std.png new file mode 100644 index 0000000000000000000000000000000000000000..1b876b75a64720d87974a2b293ec41a37d828f9b GIT binary patch literal 291849 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
    MOEYzk2!QmjMK_n8Y4><)MclG3NQ4GD39^O`eS^ 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 f*wJXvJUpjeY+uQT)I z*fAvIw8J3E$k85Z_?jM>gG9;(?f~(GHwcsfB%LENH*6SH!hZbcoyRr(;~&TWas2q1 z6Ibq>6&v^EU-azcKYynV*PQpncyF0J!0NbRjRqxK&JK^NwEpRDljY)bf6?(AxpU$S z9Xj%7!Q+ch@a@fk(T&6E`=2|3bsfFwE8sZ+@Z2X_-y?t1dR#k(1R{X2Id%a0X5-OO zT`<}FXRXKCze)*xH%E069X`^}%C%w9%^$0o9UVEN^7$T$E9AWU%!umVuug`OKGQ@^ zH%IO+0@yYFa<~(iT{dpwk00MaQD1rzW9X%@4 z-ACY2%76gE%lY%?-#qW~*R{8p5G+y|Jxc1w2yQ*P^{A7KTyHokN`3UGL5~yk!vRq% zoZ}!Z8_?TX<2H7U!=SMW8+c=OU~uDo@RDzD4xKp@fBMMX{+*(B-|g&|V*8JOX*5A& zn~1dK$nblLMX=Ow`pt#sMmf{b6E_w0Bf|<{R62C%ib;gvx&!Mr^ndfG0u{My^!Cue zMkB#GPp*w>3^ug$&Xv9^#~@>4gumN)XZVxYAgts!-}G?TXVUre@1H*gK*1BiLI@)go~r`(y3TiM;YKnJj%!Y3ST_*rW{v;f7FJGuDx#8%KA3 z8{2=shOs&H>nEc+cnf$#LnHkIWf((XOlS$zjKUO6~CeCCs=b{rZWU9@pn=Ft}L5ha}v zKd&bQf44>NUER5iXOKPoj8I4qf{%BY%*=UBRhQ47FD||e>Q@Cah-t0(fN0EF0FgG@ zXXb=F#Ez%M0W~Jptl&OQZ2I6vQb8G^jl>nRNT6-pAVkUmLXjduKjnbW+C$8+4v}gDGh~Vxk{n(8M7A*p;-yBgDlqfhQt9{=cnj>ZP zkB9{R`sQ6-Y$98NdMNp1y2C* zz=1bKf8R7a20pF|J+CiKo#49Uh^}NkXH4(2OS9@GB>WN8I$^W-~H!?QTB+ zc%XlD;Mzza4d0!!2vh%Ex)F8_RYbEL9X1~s9S&S6IS-!%{;urii@kI$aODY`G3MQW z_u9w+ADVM_ICS;EYr6@+JN$QNH@(H4LIf7|4~H58ZDic|l;04p-oR*ozqAQX_xJZ- z>Bll&8y@-ZGv9pk-`BoAiTm2PUL;Mx3t8)nlF#6u5E|=i8+h<=U{jB_hXK`0g*fKJc((y-yE#UqJHkS0|?$6=I_9w zIdkS*;C{TY=mH#pH_YAvs9wKdc;Wi{yD?wj?c}@BiGTtYnYRn{$D7NV9Q5|WqjB%$ zx7Z0RLfFnF+^5h*EwSG-=3g!~b(t8V)q5+??$Z5?>zo-+A^Y%-ihYH$M6L= z2QM&#*H50jF35eR$td7w$l+Vp-+Jp^gb;xw6a`35wD;Cqm){DcA{Dv|=P!5(!6W$4 z0eF{{Lbft+2MNFnyUhgC9x@#m-;sVlayp0|X?pUcJCE_~GVZ=*bGR2FE$fGuWuwb9 zjiW5QW*HCIK_0Jn@8F=(fMG!grIc}I7tGy7gPOw)!h&AABXn?^5R7Gj0etcvOMnO0 zk$}Q{PTE4SMe=-2`;p7SqLv-h#sOXYdSRJO7x*2%9K?^}g@_=41le5w=%bVGe)O8K z2T$5DIKIVd2wPzA`djZ_XWXv8b)7ZwErAiKQw-Md5g4C$~9)D>3(F{*gd^=6Hn>=>q!KL^-z#dFdA{`sY~OmyIu(&mHX7 z2908aEQ7CY`x=@it%5%Wp7Em=9-Ogk#*7)HbJT@1@Ez`5pgsJ+j2YMQ^*Ua8{iA~? zKceIi7nMK=aSK|A5MBpSyiP)RolLY~NBF4?E&|xD6XTH3TXE zmw970M>^Bdk3i?m2@Ii3H0-A61m|`@pB!{LiXZ%L2EWFRmV0K#425rpjMKJlwxAt5 z`0R{>L9#c3W>Py1hvIXMzO;-ZQ{bde&g$HZ+Okygb8XR(`?BO zr*H$^4s+Cg2noal9BzUa$o~cs_}Pscp9+1HzQ)IYeM(0@`|OV&e)^&6;fEi7_7(z& zyb*f>AZ-5l;U7ON^2kQ?KL+JvJ)(-hMi z+niC7URw^G44<7r*U-ac5|x|+ypJglGD>f}@dgZ(U*3*Q%dy`L+DqIl7=gec`({S4 z3QpUwG$`v0E>jtV;&$xtFLL^5#*D)4oPi~9Cqf5p+9BPwYa6!dYblR5+uqoY4b`=j2 zq+P@$_12P20>wX(;Cik6Hiw9>rNlR+amzO?S+acj@+JRt!b!8k7RZHs{i!x`mz0O_ ze9r=wFImp*+Cepjsv~~8c4>61=dF3Av}x1Im7DI`5qkY~7$O;@T{Jwqa8#CW(z3LGB~+}f0H5KOIAtwa z?$wF2+O^9q5Q==AO58>5+q9B7a5Gr$Hq<$^#BWR>ZCbe;8b_sRVO*fRnr_{NgQx%! zvs8(dn`nZrv`4~e*A4jFbYqiH_{LXX-T3M&0x+29$baDur{CT{9Py$LZ_vwcfjz_WXrjLvg^%^$;r=E0k z-D`8)x68R{Q2kxIw!_Qz?b~1H@?L*~+xZ6Wz~Nn*`161oR)89fvk!Kt&+!e9^e*Ie z7s7{+U9$ZO9zY)^0OO4ifxmm)rSa200DnN$SDym2Hwe2M$RoboDB_F&JlMeF(@$U5 z{G_K|e;rTnk`cm6FW?rBsTYscZc5Pu%k5`YI_0l) zYbecpLmC)N4)eRhooPBaD&KHopq|t6wwn@fQ#<9&_Sd(+u^rFu+Wy>jZ0vI@cj>gF z##5c2<9^yj8S0+khva?52fot8wA_~G<4!Ul{sA6rnDK%?;PVe({r1KmfWjhp^C=() zTcOV4hgE+=`U;EO?oJ=9bf6asc9GjvE1_A~1=|6%(7}&3{7<;q!km zsR%f`jo{vf>FFe>D&+d{+t7C(Z{N3lpB)~otlwp0rf22(oKUb`U}N&2WBv~PbCG&$ z-##d8AAgEIj8{Huv*Dd*@vuDkojnsyI4JP4Z=V^Fix)4xeh~@0D2Et%`WP1^S4!QT z!}^XZ_H3|Fw;s6Nj-3Y$;)02JC|ru&hY8D-44pOxGjw}X58CF@%XV7}%6K2Q6&q{P z+fKn;_P%}3at)}m&q~MRK{~S!2OBo zyZzwbZ$JLd;}7C493u!n{OQ;A z)(Ica@{XH;IM~Q5ANc%p0`PPAyZw&9^bXJm;Jx$U-yeVcLE3xAwaOpEA7ID;UcC6& zZJL-D@eNZ5>2vt|*!I%1`}R34efC~Q3VY|-=OLe~Z@Wrl$K-<#KEN)6!9pIMhXhx_ zlV1GGZzS zE6Rk@@VuX>%~z>s-sY}2bxOMAA_9mAUe#nTa|hm%<)3~wT$(A>Dfa_2Ag8cs*nDu& zE%*6*Nzck(pq@5?>|)^`C=6Pti{RT_>{UPG_|}Y(O!r}nq{XM4CUX_Ivu$5f!>?i` zh(<f^CG^~LD03ZNKL_t))_4()fu73VGyoZD=VR{D` zd=U9V1nKqmWA8`;{(kt*43MU$bQ#uqtfuyU_EpP>1`3zl4x$ptWR8#yBy4IdEqw&E9rvgb1YX(=P)aQeF zKOa$sR_htlPWu_!UVR4sv~i~{p1Nquy=Yqe4EL|p*(>Im=fjPBUSFhx<;e54hR}ce zKiI!ti`6DSNDqP#pwx!bu;573r7+&N@cOGf_Bi~6z%Ab8eT0s#K`7znbNHi#0%+5N z4?afX_aLg^I}GB3!rN3B=FV;Tsrb_^%>oJ-f60K zhv|*y-I036=@I;cv|ktqaX|gCfB)61`=2SCo{!m&PXrg_y!TjZ{Zoi(oM=9?+5^NK#RY7k34cpA&gFJb02%>^CD#L!3UvEaO~70a3!Q$#KH&r zZ{6CzA0JfkGq0hxX%x(*tmk zn=qRqJP0q4=!{eC;bc==3!<6w1 z?m!ul#Y=^yVEn8W{*X^U7yeMN)wb83k%!4tAN(P%B7f)sdrFci6q4=jQ-OxVIaB<8 z9wkgLr~S%E{p{{egl%4k1!3%P(#83rHGS7h*W00;?uKn0L_1R0`&rHPffst zC*c!Cu%!VFB|KV$Fg#Es@9A?yTM?ZmCW@l!fWuLQo&6BfK4HR-G@%&a0j$|WMc5$8 zH?j)%o?!4GFUS`$pmtN?4?oOhPv8lGEr$;k?f<9CE3!R>#XckiB7@k;LLU@90sH@9 zJc<-*;*OHxF4`ZTZmC)ji3AG+h`Wy{fSevIm;gYrMff6@JoL~bI3V)aj~yr!QJ)s! z6OTUN4HZ*>uSM>TBlN1viwcZ@*jE>ihuOch#c;v%m?D%KQuv#e^|(u3TVq8qArTf$##RYSGaI4_Wt|t z$EHcsCzyh{5~l093iQMhU;}eTXok6gvzJIFO(pUk5u1T0fR_CP4xCd03B89OVX9E! zV27TeRK$`@m3ib5sLUhqCrP*|ddTUUhfGI3H1?3(e?LBftotWScohDaIqrMY6>#)X zIQ8iLn0R}?y%=}z*WB(mXXP_`&OKEW_%tTzX_r0+K`31db`oUmzAL(4>Lgj)G9t^r zzsNg2!PFp>p!JVp=?{5%*ao`C%qf0QDfeqnNv-d9>isAJi0H{|k1AgJAEzM=m5x4M zFMCQsFg+67L;0cyq=)$tO62je-L(J$r&NVUCio>_6&}U1?=Qj!w(KDtb-%xz_J@+` z{ZJ3c2^fG!C*1$9OA~02e-z?Rs_-M^@6r4JmFdy@Rf8gGa6i=TUsJ4*cmISRJ^G{Q zM3vG3@&~~Xa6eBEAu$TVNBl#N2#FKmPZ503L(ocLQL&d^scNi+m&V2gYuDEP;0MKP z*REaA*a$~z8>?O^{vS_`Kftth?GM)S&JPy+U@aB4plU(!zbGwu1+r2V+UA0vRU0q#QrYo1p)ti(|Coy#pfF6RFi;U4L zg5TP`3uufWTSbtv--}EkeE3pT+lagH*I2bzJM%L9(eB=2>aM-Dm$|cW%f%VyURmn_ zxPXDEjq02XB^`Ei(0!ZHhv~2?=`Sf#X`n*)(#T+GIHB~KF8IR-?R7bCGr=-40TQ`a zkq_xor$Eb}%*^kBUI4^mUqPsOSl<6t3Z+Ypf{>jnzD%mY#m6F;u>@9`xm7F^Y_H(g z*to#(XH*Kut_w2;{xX?74w=9Q4^2hkCJ=&9U&RlG2OfJF%)KOkwfGNg)skthF}|>Q;7o2UMd(Vv<1}ieD11)zRF~BIee=8C7Vh95WqSi+lrv+uf0Z^bpDt* zMDTG9JP|J*Z;y%UN@-RG*S_NRR;`FcWbb4$bxK~9GxC`XAIJ!ubxK5lz_t2#g=|x! zQNS)!N|$P=kv+yP<7luczRK3ZEwIr_;47}aD}Rk+c9|{6SA2&D$HA~(4Vz!5NGi3K z#g7HLYHR?h^o-|R6xWLVHJ%g@$j%#!Fg0y2mr{k+7XftaZ&K`UGMP;l!7vJgPL2zl zNz2|DkCJv=qjn#v_+DwtW!LtM({MD_y2LAhdz~Swb!90-VqRsmEn{huo)XJ!UT9ZZ zSX>oB#M%H5LVI16BW*$*^4Mj{($X_pvdV6TJy0LOX#OJRmeF+1+qR`}R~83bMh=u~ z^4&sfL3hUuKxA24GjqN&O! zZ~=OLYt10JUIdp8o2s!buj$8-lU`iw1F^s}!4^Obg6k}6Rcd7|fDUzDaz(Jp2}~EL zbKwBUu0$PbZB>;gc2x>C?Q~@dCy|P#5btg*Ah>rK;p;Ng*~-U7U=EV(0r?K@D-M2U z=+!h}UX~KkBJ^17NbgIcWgwumDzxL=-pq zp5WdEdl$T7j3WE$ek3)P3!8C6g+QNbC}m8C876D)rKOBtoprYEHNi!74ibim1^${y zadDI3ysFC6I(&AGNuI$qSXvZ+h6E$$u7bNJSRIZak{Nd<8;{yVJbsZ>m*5&xCW38K zi09{4xnXb!K%-21DLg^>nNa+h~g$c9F|Cgt?^z4(3VwP zD+^i0F)gyoCB9WO1lIZlz9JE^tF|<^9g}$P@VO22n9#DEMUg5S$Ovx^a$QyTP+Ao3 zzAxspka1lK>*7|qcHW%!jBv4aEgC)FV(nTd`k+P5+R#whC4?$(Ub~`SSEp_*A!0@? z2w<%WMpIK0i}~ph;N*u%pQ9vpQpir8#?Ll#D7Z@K=-6i!SyBFcX+kYCmjXRaaN% z>bVnpF9p5YPP9`UaTguTB@A^SOM0KaGA9 zS&f2o+<%6^st|z-%mm)+#=*L7M%9Xm;WHU$$1^5%2EnGW2xNzX{8V?abmVhU{N>>MN@IW?R1SI^d1#cH-64#Q}68CvI4X(aF>^=v|ZRHTCdF1b&Y?DWvp2YMRQ?8 zA_Z0zJK?tL@C8wKCqkW-3(H?n0VOPjHZ`HQj-3deA3o~qoAn0B%jOP978NkjkxUf9 ziClodDpz8q=k_{S*ig8U?d6tD35s6u|S`@rU#(2np73#%ZgGM{u(_9#UZ2+uC}VFOS>=+-2=~NvjCk=HmBA8W+e(K zs+VreX}1MMFlaywfwhh5RyYPYQ`?KZ`RyvY{iy4W&*no zyLe~5?`J%rDsK@pJV3PkDfmHSoD~=gpP{iBhe=FG9{Vd_@1%6IasN7)z+^Vj(E$Kv zoDs7GdiO<~!IE1ou3zC0C>Ao#m5B*WT>>2}e7}N5tInEWD?+yZ=1r~u@dk^=#vp)A z(tYCL(ZtMIt6tA<^^jYxSE-1Seim$!(;_i*-#f1N7qcQ~urow;fu$vLXR#_wA1Pp+ z;jhW#&&0tzLWo}%wWuyn?q8nn{eu2AH_Ht;ih_*|#z#j&6fjp`?-0o0j&JB41#~7> zt$(YcN(S#3HRdjf@gNl{fs=3lg&Ot}=;ib>AC6_e&{N&N`M8@{TDKRnh#}_}8*$hbWIjRF5N*1NcP#(#e0Et;V{eELID&!L-UU$o zG4{rk0SinnCedYeOrTp5SjV3k0F3}rpRjR|JJ)Z9&50<~cx*z&}UD}>HZHVjry$sTqep$Z+*nz=s zM}j@T1VzDYsdDw6BWRYfV(z)PfcO9g>C^SNTw!OXDHMzNKA>Z=@u8Z zf7>`K2q0tv{is>7l#W$^IT> zC;FI$ko`saW|{D#%UEB=&*u+Buf7>KFS8Ta(P4uT*tZIpa~viSr79P~So~Z!FoM6F zF)-FpW&BXpxa?*w&k8SYS^)ET{eI&;CMB@RAtShistc&NfDq8u@g@qK>zs0&?h5f| z8k2EFRr}0y2Xis=)&o$#kmm#kE`IlC+3|`6?UFOy;fD_++B=GawA8r zgg8;Ge^o4i4hAOdD0V^*T6z)uoV6Dx_N_O%XTOc50McZyS3{Ne>~NI%k0sCnFz>J7 zx+^B0%an@}K`v>Q<7s$N$oGLSocmYZ+Ah#=Vr<`- zD+^}d<zAI>>2%Uf!d`*} zP!-Uf+V1V7aWGg=0wuf92)Vm?CO#m7wN8{B3WK9Yy}m$-CD7i|bijztzd%Xj*axp44SWkUK{wd2LlzoV1Mc?WZzB3S-h0E=lsut}zD2){I@B>V|@ z&ARilk02i^is;JlB=8uF2QYZQ%)Jk0Em;siQ4H&zv22)IJhMCi>p}q5k1NFyILpXv zB!E#_r8yPk+>b(tj#)nDfo9a} zLRo_csD?y5&H6xx8^1m8`ZeM_&6+jK4qQ_hz;UwYA?U+VD|Y?`Ex~4={yxc+ zk(V-Fz($~roFxXhu7I7#LCECPCD*0(`dr>DhnLA$cGMvB?Tx@)@(d3^AYjae z!%$Pm3swP}YUAWD4ByK^_ByOVZf-6@`Wyy*SHxp5dOh3+&~LT5V^*JY*LAs|`dl!m zRO=}H`oarhzOd!d0Df;exRlx^F2W0QO!gstOB=76-g(kz>~h*H#aPM-Jx|EpTP-0w z?)l^9PK-c;3q<*R2tY|xQmqLMGXCOuy?kY(KBto4-cPEJaK2prynAl3);EejyXR^j z(AS){04jq4Ec}(hfG=p|!VKsToewN)7=3CgRKq%=p(>C`HKWE zSsx%!=)h?`ODMM%IBzn?e?elbgh(=gyor!m2Cy+E(2nvYtuZpQHB&D)p!3lH+J#|f zU07FoB9;v>H_qHz<5>Qj!6>HNZgmcSb}XW8Z}`y5{LPrO17N+2puf)G_`G#ZRiS7k zFf$wg^MQB+3K0acz67QCO|FCH5@^4G(d67}^Z^{d5w2GP^G2UE^A|z@hB>pqC6lfe zI+MUc9(Dp}*+y9Y>cehiy_u=?_4$ldDI2{NP{5G<X$+o^6~Lw@JH)}2zg&DzWh0L^!$1Ll z0$_9xMBGM=GmjpBP8^cYORObxy*^%;d=Jelr?^%l1ZTxPIDW}weL4~mUJ&4u9)aqj zy&zxZctO8RI@jg77*_XJvQt^ zUmNWly5G5UV9`f{5?5xz{7L3bW)NIc;i+CW%ilN6#?q(w0f6;kC5nO2S)dHZMt1&r z66nNwrhjd9)9EPt817+TT=O9dCcm{x^HbjPYJ4Pu4uK1s{GpS6y;uJ9yGEuJE`V%( zgNSn>Nw1(Vf;mfKCT6vu$?5yB{K>^oskFU8i^7+#_cV|r#=NeQ#_;D1K{S7fB!AaF zn~07>M03OeY|iD1TtiSFBZhuB5*eR|E15B%P?$jkCY_knbJXfXtHt?P0)vxJ1aI6@ zWeCYQMmPe%!*9gCWjQmdln2Z1r|2zY%M!w#Z zg1=d`p$#uACSw>xNMZmC-YZJi=j@1jJ6KEo7K#zT!u-|MIr5i_F~5LcB7yps&1SO! zSDEmmCz{|KDxd(E3tHYNEws}w+CGK>%mIQh#8e`tcE`o#tx1YzDPU^pPFH&wR_)t)anHiG=aynN2BY<;r6 z05PG};(Vw#7A`Eb`cx?Lj~1zX-9oR{`3L~Xpd=VR>{#exLJ>BJ*xWr6EH`$%5X8B) z;$G~>HEDloEMS4_3iB6QFL&H-8QGk(CP>1n{Ds+Wik837G);vkUB@*ZRBrr6-rmI-3&6UjK!m2Aq`Np!Z*B2MnDR#gNIjm2SbxBjZ^lQiIY$8Ii}Jbg-B_*n)=3H@sJ{-a^8u_6ba@nu zAp*5a5R^Jnz}Q%oy?%xz_Hm6-6hNiV3IC#u z562!Hg>Zjc?=P+4M+?@gxur!GVGzLlcoB?q1>=@Wynt1`z_DZ2z+##q5PLi@51n3M z7fm6{npv5(0A_8UxRA6G+{|AjfMQlm!cquCqkvKR>Hrw@}0Lx0>c6$QZ@|m<+CeW>pJGtNea3kifJ@_ULJhyN5NoeCPyb zd69vlysU}xoaiJ7V4nM=%MIf7S7X5e6ormly-gPe(C`roPxw&pg$j|*+isRROz0-)OUC<4P)+;c}Vu5JfNiCeQ9 zU!ZD5P$}me7q)r?`r${`1POL-3X2I*vLJzZ>~*J`tpLir7SpRio=JSlcD`qW(Z2+7 zty;LyyN6(Ywdi@7>N!Y`$-okZvwqI&m#tJ=((F3%O5!GaI%c+q)?G8Ei<<;M)9Lw4 zA?J^yv4l*2vtA&jw2Ap`Q2^5|D1NdQV*$(yfMEjJh2Vc&KOG21L_=I#EG?*W=1o3u zbKmQcgq4qM6oQp~_F2C~%$Fe^@FLJ;H^ zMKCFQNwxEdY%<6;ajgo7|74>Bpg(Jz>Wf87W+Mqy1*EJO2Ev2jT(`dravh(vU1p;( z&-0B|88j2{8iP|P_HdkSF+m=H=Dx30KwXOF#h9c4(70+5D>CH1);kL&c+k5`Y^L)@H z$~@}6uWh--FYC)}bGju2U`tCIU*wc7m{07(X0Y2vhoEaFP%sdfY}Zgz_i>qOZx=IE*%FMv^ljJ4P2Os15j2slE(S5 zLgvY!jYb5))+hkQiWxJ@V=mxy001BWNklWhW4fX=mUu5Ye)^iSMAKOa5rVB-LY+_h4Sqg9Xl61UnIX4}s#u+Wf4Yc2pT zBp&lI{!_r?wad>AerZpmtoXIj!$H@Hf&li{c3|`Z z&W|DpS+r6(Y#as)ATJjuoluojC9rJbj;|rm45`W20g$dPgXA$+RxXF5_!IB4h2xu6 zXQiY|Zo@TO0nBD&WjcU#NCDl+SO7maMzCweQ2>f$WYCkRn%2ePCo7hE<2NDRyzl>c z0f$FZo3V8r9oa-t&J@#<&(i{RcttwAbexS~&_S>jzc576aV7>pQ6asO`VQz-i8>Td*}b4n?AV@MEeUy-aF+TE`j8c#||8xOGNK zl(bG1GsvdY?|kEelM03a)W#G_WeGz}nbj6Wn@2L=k|SfGYcR&{mMdxH^oB?*r;N&N z#;#&HOFVh=HM%aG;mBXJQIe4H4O6K7oemR-)*x5#duds7FDGkdKO1qs({bMOF^f8m z(K7Ov2$vv(2{TApg~GVlfRH0cfi0(#wOJeNHxc~$7Yk_HJ;Xv-&bxu zz%qTGAPO;g(rUvSLkUK|q$%_zbca8ezEan}EOR9_5r~+qTJxkS=qF`mxl#d4W}^g9 z>}_VDbJxwx@PGuFh$CU|Njmq*vq=xU77JjTA1g}(i|`})T#IpL(=@U$7!d@z_gWI! z!19tJm{&`=Fd}620E~2f^!`X9X}*QR{V$r{;+xCy09cCBCBj$AK3#x7UH}CFlzy`r z@?~@tV~3JgRx0^O0p;aU02=2C{(wQ&Km2EtO>YKki59*z(yufC<``*~zLt0|J)zE8 z$et&&5ddbyaay?0#$qA6E-t&tFe`UBof~lJwC|R+anRe=MzcEE7N8GWTx4xD+6yC7 z0AiFIm`yrS1K-35Eqn(;;(RMA6=vMxJAt+y$teFP=?#GCHJ%xPJ0S%CEKg`4fqSK; zgkqVs!dZ1z@^<~n&96)VF2`$1OG{Dm;3ZLt*&v9e%LSHSy&Y$@*hII~-CLqxp;%x!j+lGHx zTJy`c`BH(S;`}U=sBdLtT2K%I1g71uI*AoeW}P`2fgsFPL^&^wbyi~3jUCHwW^Mji znJ3Wkx@bvli~!IH4a!SVu{e}~Q5Gc&5(u_8XO>JI7m(nPmvY0;Fw2 z@??cEM|M3O1~4%;fX*1O!^ey1|hDI$x?=sC@%{JH+E5=HBaAwqaPz$kur58w#5XKN|%)x{(K*VoZwb;SX*1- z)Q^7$nUG~htF!L+L?aY1pD(ngW4~s_cdb+xJU<;It}UGmP=kkz_+Ehf({ktduGIH}giEI~7Q zs1M0(jQlZxS${E)o7WuvZkAaM%({_GHjoU0L`j~48gMQ{EN92mz_LhZJjBE zU=&hjBMv8rBG zU`7D5ZvF^fxecmCq09WGMV@@k(Dqh4k&{*rlKQ);1phRgSF-}XbR2*=^YgLLs!rBj zcHvw2?zgU-@1nMm$<1=qA!{!1NVmn|2LL)>Txd~WT%tjZGkxV!Gwcgk6oO*c$h-G% z@FmmH1eVESn_c29EAwv(WRpsZQr;E@(8~=xEV7$!tINvDJPjn<(ZW7GE>?L0NU2m- zqD$cgt#4VW9&vIDEimSrTTuD{nr8mT09=>KnH^X^aw;if-U|mIZT@Wq|Ng%d49fR% zv;G>R<4mgsZV~YE!JkfeUmCH$HFwH!7hat2IN&91apD3VKirsNhKw9ze zt+_VZuEqpRXas}OU9H|7zP4mC!U~s3q);v%SGlo%ftwd;|GQ-rUpdPrWfGB=8z>A$ z+y?yLvu4DoO82LSZqQgPVm0RMJR@0W=!w?ERL8wa^OISVb(S(_s4>aX()homd0 z#E{IdHZMNOCZh2Z0FxXFwz>CC=s}S~i_PAAT_sAsvLOTwgf0FZLFax>_?CaUS&2v} zOu_pM$u@T|M6!bZEgE99xUxiIoVU^lUeJ1Ev7T*#RX|ZB+M{>_@hHOwyy3j)eYwb2 zPy+SGV4nJkGIgj(+X|H%FV(sU42?)2SCE5C*AGHN+ks$om~TIZz34>1nN*2k)ywCa zBk^-%`=tIlM(@rfW$C#MtC*G{$Mp(48YO-~{!{_EVp(rwTLZW9xKEw0-ZQ$k8#mCBQG+~Fh4b5;H^jZKwUWP$g zqA#Ny_fzc2N9W7kb;$;tal{SQ*4zk3a@@)iK7}1(#d7TgU>2zB}CSm+M0JDC_ zwS>M(ljH(j?aF!x27bSYHAxFBJb8s~Dkcmd(ULH?8+1h?Bv)zf!nQUUkEFA1VvR7b zV@Pa(ZWXQGk#IRO=>XWq@o!t38-tYTVjn#OJj^D6#+Ndr1({MmKV1&v@4!J{ibsV1 zO%Tw6|4W};<>r+|cKys^w|B=7yAe8HdNLa=Er||#PyYn!f67h8v->mb^ zQuEVXXVE{zlO68_Vsc=_jk9a)u^0s$7z`aYxcNsfG;<=W5Yo(OS;%FyOHJZ!R z*z8zKSR}Bt(CCO?!VO!~*41ME+Q@K*zbfF0Vb=W88kx&F|7bRa5H#o9RiW_hsaOCL zUQlgr;$@?yP?T4`PL(aRbewfnpK5Iu0g@ph<(mzvc;#$C%fn%-F5a0n&u~msW*1M` z<eW2_)>w)e;lQrJ{`?KcS72U8;2NXqh!=43bQw zQ(9&xOTv5!R?QtoNse0|l$M0XH63!7PkycuTCFw99c?B&4A3LtN+RnmvY8)|nMD|l z31s@S`EE0GM69vJ0~ppUx$&9~+}lgbO<8v#y727_oxkiew9#?`x-;330-C!HWID?! z9xgABSh~ZU+w51rLrUte`SGoaQdT^}PNGZ^G*w0P(q2{qAX6d6SA9Wqgcb(PJP813 z7G&G-23Z#Wt5SLpEAl-7l6}A@6Nvr0EQ&#wsiKM@Us90mXht-y7!GjQ&aPmb!P!?EC#da!iWUY z+Fe8#qBf5=N?&Pdd3l5xPSe1KTWs00H!J8KFyo^he|f-fYtv@6&2|N_oLw|BkisA7 zApuh=heDZoajW~2D|G!jI-Iphog`F9*yZq-nG3AxY9OKnny*v_4KM;|bcI%rv*~0u z4xHd1I{)HH(zz#r+UGfciShC002r3RwsdeMCFuttLI2I(vyW~7-m39x-xdx-On;i2 z4|X*$gkZMK^@@Uxm9H+-oip+VIbOigruQB+v$G)w+`wUjV44dIUKvN$_6~Cpnlyg_ z*u=k}fAU4w4n)wlsa$X8QQf=%U9{O~U|Yn3r+XWwL&Crg179NRL(IK~UYq_?I>{Jp zvNp2OYm?SVONx-vax(?y1t2af8y|rFzX6q2&n-^@O{Kg%;JD592E*!Kp_Gtdq&&)Q>itmU4gu_d_@je7 zKu4qHHj1p3N37}0j*2~^yM$FRsb4|}{>yU4NVcW3fxB(dV`h!GI2FzcQ<7Yt-qsSPN{vI5Li?!~-yHt(?fQcFIJX9@A|GohSfp7#v7t<@W0YUhQU! z$~XX)6=aZ^DGx@~>=+4u9i)JSADLf8(D85iyNXeF3TJ17OaEmN->lGH>A>$}q4MdC z5Wm}H*|=>C`rKJ=m%fs+tj6DQ7L*B+wtK}7Y)%Y-Q452P#5!TNT@18KcnSB5A>+(B zX0?*yOa-UB-1{bhd>Dsjwv5m0*%5j0_XX&i^I-tXqX`rfT&AlqV!nW{*gsY7tShCRyKzI z#Q_+OUv--fmFfo}Vd}?*Fp&tYDwrN-^Td|3yey1hHb6}<4ra!p$tkyAsY1z{JzG(R zce7{P9L4~Ut$Q4RSp`sUkKx{nWgQ5h1lUe|V_m>7fQfLBB>p*#dzikg{U?0N3dwGvyb~b>v>B9^D*$%+Br+WK z0Zf?qmxnkKL5VEN!*T-vmKgyYTLNWK&>=9Z%Q*;QM^^dk=ui~Pya>Bo1+cu--q>S> zpRMtEB5Zxj`4)^_gEV&7{G*00J+oaO1KJqr_BqzPED`?MrBTARY>85sfqA z6#I%k35sQ9FWTJ8*$S7tje`ozHX=0Jn$@zhPzPB*!tG?aOOTCZD3-m@KYo*qhoIoP z%b2zotMK#!R6^704-;~>@?VmVSjFglCz0a(s|2bJ` z<4EY|j1Axz7zQGzva&JDAEP9@`cf`N$*z-?io0dy#^g5p|7Y**Lfc64y?@WubMF_) zmOXZ&$jHH9YsbROKK8{-A_tM|o;fDY#j+O(#23CvNPLlHSDduRw#dNfaW>A&{_9t7T~%HEB3pi$-BcV)ZgrQs zt3Unyy;OCz?m8I5L+l*L8B@DiBnj=+!aE?GycZ{6B)C*aI@i=#vf% z>BFEkCu6){XN+Xlg|8mek+QuydXu+hN z86InqLD9vb{q$y!Yf$L@QtG<%p=`kw=^D`JAgk*RxLu@i?wA1_5Z(-EE1|Veith*{ zQtTl00wM4NW_|}n|3L2UxnnJVgS1DH3-F+rKQxi6jxHFq(y9;1&_|Ouc?9}w74VMW z2X?f9Kl#uU0LOUez2;~g{5Q)y+@NfSP3Fqv0vhZLU<#qA1pWs>@D9nq+@bu92^$Wu z%{2@TN~WCZAI|PPqvc=G|hj^YcO12{+x@8E+6V+ga&oyXWgjfuK0<+Y?s z%488}6C1&B3nyrBOp?!Daucr|7VJitt_UITH{+!i8hcObBI63j4rzW;B9+HO5#XC$Uv`%kU&!o9R4Jr(a{6=&WCZ?1uYRk`*mR9(Dja1OxU#tZ}vJ z>^+~rhc>X3^0y?%?s6Z{i=eJ1a{$uILlDCc9MITvdODTwr}AlRH((J6-;rIQu`wYY zVxtmu!wc=MCXJk{sYrQKeqQb<eqAV*yaPO8>u7%<-?%#5ZzfK@RQJT~|r$in=`m~^G_wb&kA9T0VN zOzmg1J{FS)IwlRU)tqdlB5|NDA7wPA%(gUmLgWpK=c~iLSho5tMsA;sT_2P3c$$-L z-a)&LSUrMcW0n2h?zR}pJ)5icDb6W+mtz+6SUhlvS3PYL|A#;Mzq&VKDFXe2C=kQeUYXv~V z!50QATNN(+R)%+Az`+_@TVMACT5UIEHlqWUJESm3x5O9@sU}#1ka%yC;R*B(==)Qg zePKz_#g-g2hIpGU0sB$4W5%#9I^*WxSPQyz4EhLwu4tFo>UDrm9>=5~(`nJ4WnV-) zs*q?ti#mQ7enUD>&Ivx)j%}#c&^sU=Exq^#Km7dj&;R!aAN=pnKX~}?!C3FWRhE40 zm7Gt9Fh;vC=1X|Y=udXeAxPWF5j@Svj17)i#0@Q=Ip$b8Tq&-4P2oPWv0ej3p%K_9 z5HEa#_<}LDo&hdhnGLl0c}VI@%&9A7+POPHl}Z zmp8Vj@=?-WBDIH8FMfjKEsQg9l0Lh12n$XuHLO<%Arw6uvgO$PMMFadf|eVjmU{U4 z2VZ>m?T!TuL z4#(I?>oIa(8G2*A4zxJOQv66e=={ev406>QS>Y4^eTKf(U~k7dmPtPySoKIcg3he+a);;Y9>Z%v_h8q?Gn8w)2q6N(P{vgmekvbP$4zk}ToZPBI5 zWY4VYgT1Yn0by93J|AqMLS{8$0jVQJrj4wLGV95Jkh&QX%YX)8F`qa1@ZY}p4vF9E zH~*+tYwz9xgFpTV2!8&MsNj%AHd}l7S@gv8I=LSPc(U_2pu1EFfP9LEG5J&*w`W^K z$}Q4IO9#mWjj=dhA65(wYDNJK9tA(qm=5S1A~QtB-{KZSb^+~xC4dq)S}AnWKkPs< z293?RcERxHhk)O=fL}cuk42;VjlFko-cT7t2%0UiHAPp=7ek85wB7_w)gPq90&`t~5o!QN)ku@CSM|i4nOq1!F1=V3t#IL)KLcXzVYi z*3JftXLO*q*JSO72222w^+EFg?o8e@WOJ}aF{8y~$c^*%d=;~mBqj#=hcjJdv#R|LQY zj#-9=xJNgj6G3J4s1*AeL4;9*DZw$IiGOJZhyUQU$HpE!K%Vdxsh^}d82NYJh+G`bc8TVLeb=w@b^%~xHYe@)-C?%Ap;^dyOF`oN%p8}!) z3jNfUVRP?s2{d1}4#hAS8iTFI0(N>fAmw0;Y~IiiQ#9wTStrPl@y*CMB6ADqeF5lU z>S%d|Vvjd(s!iZ8mM)i~SO<&6%x;ay;P)B^EgWXMQ54o4+?Fn*?9=oPw3v!DX7b`t zjPaW;#*TnUM{lnzyJMQ}EFR-J!ZjdYyJn(vVcdYdIkr~7p#j;X4!Nt9rC;RYvh1z3;#0*a3Ov@@qujyK3zK_bg1^U;L)WLpGK0ewvE%y8xAngvX2 z8_iu~M=-%86Wj_$Y93}t-rin4jWw?R_Q6BU9@4z;e|!bj7L{@tQTOJ}n|z^Atv71B zPL=>YfQ%*Am-ET12@vL*lY>eUAyBKW}IQcDYJ z_vYO@3>_|wdc9h$W-_`_TOzV8ZtE&d)IltIMoFNtp*8fM>>wo9=Ef-twj{(;U$7$bZbGy7^DRPhqUVtNqrlZ z1fWYBE8lmtdjqrg?%lg;qqc{z%jC1PVB9L8cl!o^guzsic!P_<@fwXte#A2PU~Ej^ zjv{u(u?<Z-jaRisK{j5ZfKoG(j*BTxHIt6eErqlF+uvEZw;|mL+s^) z>1Wfh$H|8f0Nr&aN_UeD9KQ@19+^m$(d>?G>O#qeS_Y6M_pahX>3i@1X`di{ zAbhn#R?i+rY#$L8t5|&;EX-RzHQA8VqswJ&$hMz@=U;{#k>ch{IxTYfbm)SD z-_@%mv-~;CUVzGjhaZqpEttN-J7jgMI{1(kE~m>`xl4Ppa@C^3vIS27x)=JUD1J-$JZg zv>-2S$Ygq-nBrJ5Sbu{F{QN<$m(c^L$4S>3146z4bwG;0y*0;CkxAAW*lRJ2 zL1$f^Y_9>J+-IoC$R8a(E63hJmaGDUA=g`|w%GN$S08*%BaLsrMZp1b`yk8ws{H0n zrctY9vT2pQWTvr;z-ub8kmd=?HyqY2G5LVRVdt~gS(Zj|_64jk{fyYs}b1KC0Ubvv> z--FM;`0jfgX+VbL75sbky8N!ts5SCsk-luYoUGP%5qjfN!QCHGP57HlL?VgVS;bon zMq=O&RvOq0!+61~)<>%}=zw#}2%e7cPJ^WE^O)}a>y>`wadT$gWTNbCXos4}lm?9U z9vMC>gE}xEc_!zjU=BYXxccw|GKlZZyL|G^n=lsE_`6Q$%iy9xcGlauY|gcqb3s3D4&3& zjS=lQesFOvcrv8yf}(0JHX(06zB&f{!6=qwVn3DLYh*I-GS&LtUZE_wed%<5PtV@? zcykZ;brjV2goq!Mv@T{wl9`3h5fTl%B(NnX#4yLU*FSeU?JRb$FuBw5(djsjZ#OhB za1Pib(8&NgGk8I@#2^3S>gSlh{N7p=r|D9A2Yb8ChL~ecXY1p7_Aq}nrTYzwUxkSu zDw@RxS z3{gNEW%Il5-n_;HJ{Vv-_i5WO98g`N0aJ=c$uG)A*)r{IKVZiiKk}U&md4)_+w%$_ z{eR)Y1!pUKfw9Nn{TRZJZ^8WHL45JUrv$?o>&`{=9oW%__{&Gt?hjG?^cENoSzu9f zx>m>0@COgU3gd%-LuwC!mgd#~(}-#M7<1ZmQKBaxHv{Ty+e%GWD&c)6R;&3nu>Pt7M{wj8n_j z8@T%5gYUlm@pZmY2O{Q(>g8973`UE2NBqVQaQ9nU6u-o*T2vP>3n`eFsko=u3=&T> zxko|~Akd{Zdy-`G1h_nGTnL(3|EUWTOG`-8)nyf?8)iiWwN-A{9Q1% zmDVRqgv~zw81wh)^}9V#r1(CMVhid0Vw~R4abU~e+a9s|EgjL}rz&7F2j8|*S%Wmp zL5=jVr1u~n^W6sze(|vpsGlx{1De0hv8ORn*pMp`v`8Fv3ACIr64v!ZYnCq>Ic>g9>fegng#Kz%sTUzfS6@J z5dj4}fEXrC9Kq@vVue4ZLM`a_(5V3_;4&b0Ov}0?;c00-tusFzqSUJ2+%^R>Ejor_ z6`VUkE4%(&$sf@HEpM>6l%-&%El#3+9iEBxdb7!TQsmJoj&KqRC|Lg2gC)C#+6BICN| zP2QqY(+YqCyeE2SNK6;1>$)?Y9Vcp3B|_Q;VEf9aA0z&7_>rtPtOpU`gdQ2m9POS} zEwP+_&dyo`C}gw?Pl4G8E(U<(%?3bPt|0=y{qFMzTmpwQO=KH;4cT=G9ZxA)zFHk6 zrVXa;0XYQ#WpjCYXt|TWPk#aY{fNSk8VN}Ac4PPsNzNqpvLRaHW(HijHG$l8#nA%e z^m8o10gNUX)z}PY_X@9n{Pu%CU;X$U1VB%ATqF<&BHw=S;N#P4F$us6ssTSXh!$GZArhra@9Mxhx1y#4(1OBG zS@`j$Q6pnW-SGzkmOdnd>5DsfOY05OItx4t>E}a(zeovJRuaPNG$f=!0zd!l$EV(M zLlz_+6GMw{Gfc1zU2I3r6JKudBkbu`{q)n1fBR=L_-`+dfykS4FTyP!X;gB#w2+>T zu`x3-TXK;%Sdo%2JpIf|WzHijAc;hh_42E4pFQ~a>{@xX9(6v)GmK zWsjbLAYT`~euCe9g5>Xan7?wq88L3*<$_hIY!huNmB?>+NhBg7o@o*k$McSgnIm;# zPV+qd%=x=aI2MyT%|;gIVvra3+fUC)n=24l#{e)Ow z%pb`{%j#&Q+5N#Jl{7Tf4KUK5a>0p*f;4eP8z^@{HnO(4l z@l;^7$++o1KA!-}S9Xi?=8Po#+<-Tqu=+pwnhm3HFayIx?+{P$&dBnJo ze#ZRm(;0jtrg086w0`}~tMC4TY_QN&T4P|AM>BwCCff(-(Q+W<>(3Ivi!A|o#PSJ! zxpCtLR=`g_W&GvGvH3eJ2$u3h`NO!!h48oXlEyK4^EjJ>ERw+F>+ipK@b8=!dN7~Z zT$?&y#SMU`YTQ|R0!qhmAhQ1g-6nPbo%+2l0seyyeoFa6?jH_6L@R13ftBOq zM@K)4{5>W76>HkzuGwHF^ZFIoV8Yym3pX%pH@LH*^+KEgwDw&jy*w=u>Np~H&Mt`F zSe!g_+V=hA6ZX}g{QK|z0^u*oJ{Ogl4y+`w4g96?SZjg51a<$4yITI5N!%g#?O%TT z3A>j1sMy_T_3#}UT|QHig0zjqi?ScVb-Tk^dR4Wu7kp9fKDqG8nE+>$z8mD%jf+S= zZh#s7_uu^)_^Vgxy&txn7wzLOX-YpQ$OKuQxYaP%W;R>Pzxw|F``xFirqh=j?P?_* zfc#9i2}4P0h0<}+A*pNHRn4wzE;sc5#swvOI}`fgL?P~OU_bDa&p!LzpP&8LtJn2( zOq+eyN?^JT{E6vjxKlGxBK*bo-&zi{4hF05az8$M@bBz+P*FgWzVHXgepd09l`0ST|e)c~#kdilri{`|{NGyw8z?1sYK4TH^gJ2Kq2x_IHDK9Ig> z;dOT676rdV{}*2I z87*+59gWdvQUJ2Rf^FzdLyozz{++Ai{)^G3K;@jnYC0(Jo>pv zv=2i#%fjDr`@200*;;V>zy9*ePxS3zGzfXe>@mLZm<8&i(aQ;zW8eo-@Cgt|t-y^7 z*zz5Xuf9I@ikJTEGm5Dax|sZ@t&ccF{NVsNSl?ZR5ugP}SuF&4M z;(^1x#=Ggpn^*t!m*0KDh-0GPC$o2v9AzIp(i`}2$)yMU!IG0f&@6^$t$;{pP;=lm zxInrfZrmWIq0fmq9d24A`xMeFHY30B6+l8^2tW{j+3Ie(LWb67^G*_Ir+qHtl_Vd1 zno!a&Zyj%T&(-s<{_7b6@FKpJ_+@2v2@{mwv4~&Xp3d!{PofQ zObGk9Ppq?(R+`qQ#jAAyv1m~9gbXkQz}v4gd+A_>PCgXd$=gYwP55hd>yb$Wv*bpS zl?0PO+WQ+{bL4NlnMDBpNC50(M{-d#yM0Un4PB(mF@+2}3NBMo%WM1;&|?6yFYh=; zJ@oxW!4d1Dxq4!F`-lf}(dd!jO&}kApKWm@RJV;{i*MZc?Dv0u_G0yQ0r7_cjMIm= z<*g*Jl6I+n;%FMk<&IXMQ-#!UhMD{cM+nUI39fP9#l90E z&6z+r6~FlmCt&h5P^er1ZiGZ?MDOkxolPdC$kvuWo~*7!q>``-o0IwU8W}(xkJ|SB znlphMK#?wexnZ%0n;%8-tgVglR?@=0BM4QWVQ?+JvcuWV3jPDPXcxsOQ+&bi_*HoE z2J>4^l|AJ&pz@o~e)pGee#|9n09vk@!2m*7@RH7dRT5>eV(0!b{uKN;f%-=$CFwLr zxOBP04{UJ8WP)2h{1&gGbK?uBE)Vf)E8+-Ar;X~!tjo%;#Ftz$70|qz^ z=amD9yJd+p7=4;3IQME$^UF3iUK3<8RJ+V|GPxb2k1Bkb9e2ZEwXlddwZplZb3ln&YGUvyMtkutN=^{H}uru2E~D;VJa{xOXMkn$b}FkvvrLe;gT1AkeG zKf(M)BF+F}2vbEGlDtg5bu`8GvAO*k)H3qRBJ5w%25>jfW@-j+u;cL5AQ&2bSuUG&3 z>(6e9mlHW}?2k~03t!0aImqjM;as0P_L%lL26;kF-Px zTVOBo{=9IQA$qxKO~ARr&+8RVmDhV-0MtO{6+bhtt#4~}2~xn%{`BRG?JOAJ92S~` zlt;NcjTuyoQE5?^8dPGCgjoXHb4h&=qHaX(uhodaWP&^}B%(3U`Cw!O->zBJ^@JpMQeQ$A#>;G$m;4IR zS7d^Prt}K>B8Dek%VxB0S$9UK#nWMYB|DTeGQrM9m3cc}xoGw7mbu}K4IlzZ?Yx2e zybDbMK+j>MVs_(LcDh8L5E56B$%!^N!9x)H1Po14&sKCd0l+LsFhXYkK;r_wS$*;K zFK=;m>yyl+MEXA6K{K16wW5qhQ4+wptyS)Qfw92tN!g= zObp)g-jZyP@XmYd@von}SS@Gj*BJSBw==w9LK_#~gSxBJl1y<~b?w2BL z@Iu7GM(5W&o~N3`bOyPAC-O52_B-?vca7IJQj$2 z@5!%Q^gBZx$HJ{e0QqOf0}!^kb^pE$pi(D$_xM+TdbYWf+)Lvg5IV{(Zaj^!R54O2 z;(t79KDwH;9tu-Q2%}(ZhHhme5o55HRsw^0xMxWN;BFpw#NCpwI_?U3z2d3u!w7~5 zmH0Kp#D=y9`ry9Nh$ide?bAbP0?-abuijx7sv`SIt{+rR3P7(;>e~e%TtT<)3s(3R zZgTDz319j6_fKAIlrvSD0VGc~dg(Drbibmp!g$gSi&Fr=(v>WHBD>avzL4NWF{2Xu^PmCHUOA=nDp)9@&`iEN zS|N|_hR(X1ZL3L++6EvuC-CdO_x}A`efLA;(h{x*e9-rQ^G7CtLaOcUPEkbAQ!)j$ zG5+8WeKt@S5jbmm+h$IAUZF+;^D9`9H42C=@UL!px&IW>2o`I+ki;7{#Mm)pts#7R zKg0qUVnA4HN#UEfPqM)p5N!Zd93i%sG&JG}gk1W768T=Q+0>f+h?4{mmHU0%0*CJ7 zt^iYQqzxbc`fDP9*@iOp&(o;L;Iilql2OYqZAT{HIaAY)(@Iy==Vh8DFi$UrmnHyf zc^HZC_`YHv``E$BZ4wGGACUWkp^&gqD5SGgAsai>$4<9a9JK%%pNKgjdFOcm@Adi& z0BvIj1wijH0X$}5UeGPXVITAa(5pGb+u1lNkN@~(YWoeOVAQ^bx3x$yD#;)-#R*WP zXv+1}e>NpzdS0tZ0x^HlLj<521vjhZ)&G8iEim()d|t1V8xUGF#2Pyk@=6WS=QZB; zSzYpd7W_${GkYz6)QKY<-V-ZuN!`DN;$Hk0d-d{H>0<7~Ihbst9L(x_x(;^J#h56AsYE1d^~AWg z@P{N&S_k-hT1jXCL?OuPi!Xow*j>B$L@f+4>_UpERCP!ahmc?!v3(4wP1x_F9rn=7JjEVRATO0jMAP?eFlqOAM=kpCy3zS+onIjKKEZr|H)ab2@0b1{OG7 zEd2Dt?0L2cuQkcHF$*Z=|iBeK8(4t_sv1)A6kiIS)I zS406rs^v3GGUk`mXp$xwW-72k)<^7_5naVTp6#PfAl}Ci7gd5C*#y4{b$E5@J2QW` zZk-bV>D7%BFkZsnV>rzFp^$KeGYkBe7puWqIaqVJ_vc{Okil4_9r~BBvBu=;TSks%ch-g z!fn0{5(JAlvvN!ZlaYwcjQb=I&M)IB+vsHF=*3GofB51%9-`chOi?6$83 z0HK_{2Wa>gxZn)x<32Lth`HPnfXD)GrZd%G#?>8Y2gYNkgNTcYO9%@|9e*~{?a$(Y zsrjhK7?z#D&uSNRx>?Jk5cq4z!T6cgf-~k9O(pr|3;BF(amY{8e=P82+9$P4NVL^b zllgsKW-Ed9KAiUvfC$-~nUKU>h`B@5Iiev4`i77XA&+YJF#t_|r53>Z_s;`>Ugp){ z1R&)3sMKRqOl$>nH@v?42*A~HBbjz{8*URG7#yeB=UEg$L`o4CQv(*B7EMpt%$5}X z=tFPP>2xqFrT;1s0YGWCtPB%CKp{j?qdz{5AjS&=iV;NXG64!1iD-iYX2r3P`g~kG zecUqgUq14&k1H5_iy!ZbVM0U9zJ_#sGXDH@duo7*ki%u=0|o9lA6&UFxXmH&2ZKG} zr4K{bN85t=%+PZ8fBki8HP|pGp*7_#Hi(-v{2&Gt$&=G9Mx+~~IG+~APbU$7)BvZ; z7M&$z#(bj(5Ca(HLjs$PH`|-fAOvRNqL=ER&u0)o&#BKV9=4B4Akjkjn<)wjaIp;e z8Lxgn#~Z01VUqw8^5eLhsFvTS7+=*d7jny?KEq0R`Jf1Varg{12jK<`e_{ZJ#6!l+ z-6#Bo`a+V`!A@>`>NlVv`f*D^q5p1G==&OHH0Q!WMVy=#H z0UFn1h#aK%@gJXU<_cA33*00R3^sajjSL<_FfyA>T7HGH`$BeE1f1MSJ)=2j+GE8{mlxE|CzTL)6#11J3VAt>em{{MiYZY=DxzSc5d~Nb zu{=@J?j!2RztTq|2%nEI6e65^h5f=}$NV77Zir&*!^+B3kMA{k|I-36L=nXBv7o^Lymi z>5TdOPAK-ouF?UIfH&4r1bmH%3wGYHUijfGhD0x(TQx#uh%JI9!ArbACb7_7iXnxJ z1_2laKiSU66Z-r<#1SSg!Leq!|EsSd2+lfWq2J;u#Kl2Sh@l^An@{kISO-jqML|R`eDpFQ=!N(d^pj9PAGbl|h_E9>dw7Wb<^196 zlRCMf(67E;U(GhsyDq{H$#7b9;wB;`5Rj~a|2ubQ{Gh!4v< zIsgD507*naR4uc$q(+9cpC-ofMMAZaAn5nfb+91flp{dl8j{EA>}j!%!Go7qE$+*yWKG%Q}mU7^J;u(2KiOk?s$M>9G>@0U%a0 zpa-S&A1;)?!?%1sqV3c&F~DA*L5U${KEL7w!U^`V7y~^EWo#jo@; z(e?R6$Z3swaV4P!cK)b55{D7*F$f~{9>m@Dx4{HkA=Em695-ccsj-Qd7xH>T0((3v z_6fI!g+jmn8hV2506eGwNc*x}RU&qet;RBj&1gz@M`xt6@sd6RxR^3UBv?0}iZkZZ zCnm*a4_F2;zq7Ia1oIc-w$e|2NPG`*L&#_xzmJ|{MhOu=uV3Yqo^={bhe+t+BSzWh zC+*Cl58hiL*m=KC)x?m`01$u9EEM|+Bj^bE*?WpRkL>E&FK;fHpSRW{K(Q z6xQ(B7JOhN^UC=Qu?!j6Jj4MkH0|9#Q-;Mt0C|^2R(S5ObT^YQO-Evl-g8oX$va7C z+Qyho%Xnb$F7E;^Kn4&TKzt^BhWz<_RQE#Sb;;z6COM2y#UEno#;FsT3n>jMyJiGH zLS={{Ne3=4B@78hSv1{*J3kG=Lw+9a`nm5YFz9awfc7rn5sKr+G`mDE&Jcmmppb4) zgOIA#%v0ke{7};?dJD|g$|vBtt1Fd=;qq+Bq%nnLb@Lmz>Ece(EAae z&YRQ36}#sj<@ePra>BwA!=iaQ`ERt8O_Q;Py6{8hZ+V_%0OfFz$%sM=TW&_tEKht* zo?=k~Qu&Qv-4gdD`-t%ojj3O-=ze0DNT)K3uDS9N@_OK<$Jc}2pnn}Qakd_tvX+l# z7kTvHbs=8uEVSz~WOOfL$)_oJU+D2y%NyxN)!P0>Q<{E@h~oE23YjO*9ZU$^?MEuY zbd|DIPOv9Ic%m$A$fsXmPfRMk75GB|@X}p{Kc6;z!QT4Kfu*uUMvuvq->joPzx0Pn zub*|Lk+@G-O*E}60ps_FjO&0aF$f<5u!qWEPmcrrF7LI54{`n#C1ddW+RsL1+&?h^xVNjq=E!7?pdoul*v*B$FM@@+A>BTkTK9S zPBCtm+N)+6e|~%J43(0K&nG6VS-eTX(j{<&Pnb)l{U(ky9Z-V@_3^y7;sOYgC%p6Z zVCX>edi{2he8@O%3nND>}el8jN`*E9^Zr^oah2m^<#10Q}>Zo4JBT9y$~E z#56q?h6S#eI^U8wXDnt>$RGk3kr1g!L5QJ;2{Q94Dq`BELUT1me!qNkFT?o@S>VSQ zqn&7iD=%uBPXUn150^|;@_ICKD6Ycc3i+t8g;=D_^O6Q=eoX<`2!Iqky0k|FpuI!q zHH@wB&a1J#Cybz62#3t77@z_73T4vJ!ufjQ{zsi zIGbZeJK_m=R8tH7 zgs-7#zYy(63rPtdEq8oRdO-JjNZ5h7>*=8&G83%eW*f$yzLB*D(B!J{w!3!k$&1xw zLl0n{PSAWPXNxPAQ{Cq;<7Zq}%+LMhQ*8;e?#l*QvdzeF)9@p9;KZLD8Gac+3W85G z$Ueg|8>PqZwvnZ;G5#h)wfrs$fsBQ`Ju-l#beuRVC*l|SEv{w181-MfxwO8Twn)Qd z;`D);QSnJ}$wa)XEFE`Vk~g0l*UxK)+9DZ=dLIi*0oCt7S_k zu!^FG)KrwtQ}1*eTrww*p$AJ!AGDB~mFAdvT1rR)sQiN2SILI4gmE8cBcFDyf5s{G z(Oepag?ahR>JigN<4(VXpd0>tGCMs!pKHZ4-g8T955e(vwVK{YB(uCN@bSmmgV-rr)rCkB2LKtD}zQ1SEoWF{ztq5}5liy~n?wl1D-1+%%8yuV|c;GQ;v)LwaH z<=VZa^^I)3X$c?}BsQFR-|`trIQth%B@9)o&@4)^et>UmAK#W_a4MBh#>p6i?^*bJ z!0!jBCU-X0w!XS|dlK`cijyH%rcXk7PX2A2Jkg4#KX(Kv(qpxKBi zQ*BjrV`W(HZ?kEHAK9Ia7he+oh?Mmx-kK#KDtKC7OpzSJ{P~^h7f`g2LAX* zzrTmsU#0&3e&M|f0DCxgJwCJLl!z17BX5|*_wWn4N8HGb57Gwy{C;GE*H9d+lfXI# zFu}Ves6~BQDQL5Qapu+~gfYy;19_gKoG62kpH?%|l}n}#>nQx#Tz`W2yJjO$emnmB z=G9C9`gL5n09@L{F5n;x`uqFo5)n6soL_S&9rj|^;}e8Se8GaoWlm2erc8v>M`1iQ z0I>}&XLJ(S;0j1%1Nzh=PgK6aGQSolGgz6U*rI7p(}S8vn*8_aMn!rSj=EuU54nG< zsdWfHCV60}Iro0IQs{5l(7Lt8wjnP95QxJsJoa`~I;`=N4XZ410#X7>Jw2k-^$5S2 zp6bN3CEwE#UAbv)FK(eQL??lJGJqgYo9v;jLVmh1g`d_Sj!(R(qOM>u3_k4;O5KTlrep zs6*@7X@p9kOq4Y)d&Yap9fg?x_;e7STp`Ufc@s;ZIS_`yF!6+W2ume$ND?#AVkt>x zK8PoTt_(Japjd6%O|_MmXT3ax8#md82Ym2BGKbv1rA5wPJ7kKG;3md6CWlZ0)N4Tc z*Y9U8p5NtOlF}iGkpQ5fXw(=RQYJzu3u6ygKn=h>0-C1G(*mgU z(il;O0g)hqjIthuG66Q<8M4PEaA|!rm#>KgHZg!v`e=}ZX50WgwY5}|`!i_oTRe9# z?zS`!_MUPXq|XFy?lv;P+-holW&ZliWZ)-HU;oj_(*vk5roh83tHhb|mZ7nS#{C;}; zsRSJXItu`MBo+-%PyT@UgD&_xA0;sP2t~rH<%~dJ^N?G`sZ_=Eh3w8oYJF>d;nB=-<*)yAOM7>sif;0uZ@@l)!=*3m=S^r3b}D z*O>0{?zsdV!%X{#E63mug}%w$HsFV>FA6@|<3s&~$@^CVkQ10LNFhY?pq46%rg)Ct zMk%?0i8b1ZRya61e)S9reK*#S^LPExJ17>Od9=8) zzKP6meYdF&;wuz2kFM6wVAX2mQO##@=&?0F_h@D~a4zg#mm3PZPNj5^m!7VF`e+O? z(sN7L3~T0#IcTQDkppoLNz9mU;ce0OW|HNd4K?&QeVu86#jevW9sm4M7%zdziM#V# z>l@qUe09%kQQuah;$wrOhl$FX-QZ{ExEF~ZcKuqyuj^l{AOMm0b)6X$ZFfj)H4vNO z<$aqE1BX}dw=&D)dHe#dxMDI0*yT0qhbOr14^;74y4`=}R;E=I5p-Cd1+P_}KxdA;`4I{n_o; zV9A%9k0VA11~7u_$QMip^VP;~(|pfTv-+}FEMCvRP}BkRrGUQ0>51V0 z!tXs~tty}h&_ClbGX%HRQ>E3NbP_SRH$L7p4dO%po9@^{%7@@XhPSdxwGYJ|9}U0P zzGDIS&wSYZ;o+I-g?S`{n;YApgPD5G451tLK=`VKe6S4CS4yox&IMWCOYiAB9)SP! zr9T{)c?2?uyupptom@Fs$kZFPz1{JqYuT$I-76sBOXqf034B{i^9$26!|&;HES;U5 z76AUsGyy_z63HN#;x%N8w*kUrAydT|qVTxcR8b^Lb}@PNYNn730(;xY>|*$^;hh-{ zzt8wNlIgHo$C8VEbY z9f)2sn@y*8wi6(HskLPc-vSCc-qZIUz!o74hlhtRPa|85Axr^9 zmXyo6^iE}Gbrqopx(C9yw77VEdg3E&c;C|{f<_^G51>7RC?c7hoI()JFRg3=hKR$> z(&olS1aY>_%j#-m15t;#ORXV`yS#zJF=@5NsygI&A>#dJmvf!u`X; zA6=f9o?BR4T3P`Pm)F-3icnHO9AXaX9pVmwhsZV&c+Alsmn_C44xX z$D;w*DK0t+!212rW9USt=F6NJ738n88^iY=K)WlSrKQ58(7!sZxO1r~cpYeX;RJOW zi%ctNHtWJply2ot>+jG*)Xn!<-QM9K%)75UMx}|mb>&|VK-xG`gIf{R-PuK&P0$Z| z-b6uRON@^!pccPhI)fHVx;r&{O>mLc?slxvq8++es4C;`44~=Dl)6c)bvu{$0NMiB ztpl)I17LRx0Co!~SuHs(fNG8I0PH+EfJZIo9YC{~pFMz`Z2_>eH2^Kopa8&$0oZ+V z$9YtlAv`fC!T;H zgp(%5I<3CSdS(4b?yCMLE$0b9OUcvl(o*ncCt@=9mLN!PEiut97Z%xwqxJUh0X!7| zyG8HYWFEUa1wXN~RRFtfJU*V=l^iuw-ciat#A`R1b$QALN@OuDH9l&l0z;1IM zfLTfr#r6P5u~AUyasseR3t*Q6fSRPqdjQWt={5n_=>#BzA?}W`ONX=$KsiSz*I|>a zYY9N-MD%+Ae;NQ9>$u_XJ%H~4Y`+P1H3YyBKpqDxNop0qP8R@nxd%|&6Y|~!AEU6L zBf}0QtQpNDcXy18upuZTY7o*z6M$@xN>{%ffOuq8*!WW6qmh2Pr=#%UDA^&4tatxN z|ESGjUAhFn1L%uJM@L3RI<4^=85td=UyHtTWCZuMC_bR`IfHs|3*kef2T0piekI>w zTP6BRR2z&6mya+^YDV7zRdk+z0D->Y;h9I%)7NoXpyfI*Y{|kj+(2PDWdLehbWSHG zrluzFY9mx_1jvA$%M(-6Qxlhm1xii31oceO{Xr{#WPB&=Ecy=e*);m>68=m-h7Q#; zJTbuz%(_fZPhZ9drX4R#cKgz0wAK~8?gZi%&MuQqmq8T*COnGjnR2s36PGXH7PPGm z8gp7(+ZD2#P(|nY2N2(2hHtAlgkkGOIb1&6Iu!n1S(=}_K821;Ur~7YqiHf8d2wzU zrWa7xz_$_2k@3mb0iCdNt}#Q1<4bU#2aK;r-wF3jPG24#?x$6JB!0HUKGXD(jL@&c z>mHKhI3)iM$pZR<>zSK|YeJ?^+3gkH2-BBwBXml|QU69phd-L)J5QS!irnajQbTul z>I>9%dHOort3#!t6|$Sdx^vZ@d}aFp49rZ;&Eq@EP}$r}v9ieu{WC>w;9k6bSxX?| zZ|eFy+@iL=43i8@m(>nC#q}(a1A~L02eK*t(Ep^K=}YD-g6%eMAh@py?ff)t1gp*(g%-L)m+{m#YxukE z3fwyd4Rk4N7G&eHfaYFiO<}46pDWOTE_3Il>+uz*03hP#(cB82WdPsQs4wV)ot>TS z2uv8i1ZZ0;byCENw(eNg<2cMN%J4@p-TLN6#AxUp{7>B-e9Jt1$JFqs<#`*PfTq}tz>WDiT@|HG z)W&+XfFT&2$8-?e2jI;0rRBAa?Q|Ay>$WLyS9fk_BelG=Fro1S!^6|4c}u7{V8RP@ z@QYLOvG<237GR1=v;tmZd22yOa{urY%t^kQO9zwrd_EaW=Mts0t@-Imxc6upvALO0 zK0~Yz%aJy&2XV8Wip-{ijt3Sj=kQa2uYZIsy^K)!(lnl&m3(JDSx#3r0Q)Jh{969H zwWEOgFQJ`B4U{Vf^R_#L4-7Zq+|(tjo2SBvW^~#rxvZwPJU&<38}MM`3C;aic=!T| z3eO%ubiTLNR@X|2%Is{~w#?2}B8Bw!COWE*G!EXx;>y}aYBQ2ZBue?64aCfppn=Gd zpMdt?No~MGWyWLI`tLW0w)YCP585#(wF0Ka}A&44b9W=1Ns|5hVAI)u{214~z zoEtik&Z0|VOZOcl+3?YIIJ%V8(eZP&a$Q590ASZqA#59fljxjoq>CGF%C@Ii%kGrc zm#$wjIe16_ms7d<6k2UHUdrbp5`kf`(7<1^dmF8=600L}&`F#z5g7hxaVxbQ*;-{^ zx*1L6(}<46iD9@{Qro3<{#h!T%Oi5O=FB9AFClI=(%sL#bW=Q@YC1tEHvxDZL7y)2 zdY)Y_)`OMO`pR{)JlO$=c7Azt=jD>C{aGw#f^dlSn_or}F+xSG80KAR_FgX7YwAv4`SQRq^1cr%y9tQo}*a_A@ z`a4=-)l=L{=1RH~9-f{@=X>@w|I&ZNqJ?~V1D%YSkERg|<%sdwyJ)nYOe2!7e-t)@ zj3gr2_1B-dDN#=(lO`ma0o+QhCW}Tr)1G1@h{VO*2=)L@qXtSJ{vTKS1Na0nK4u9- z{2~8ueRDh8cxrug|Lc+`UQ6yk+nD@7O8{F)sJ9P5xGporpSuLmv)(ALuC2_OA`Ap_ zYCFF|0QAJhfk0#%XCRGCoj1f^b(aE&2n=qgwiZp&h0jwq{r`S207NGPXkD6~SXfz0 z1S=wdm}CTlsh;p<06F6tz-Xa>NM4%0q+VHvUm^JFI4h?y{MrTr-nk;L-g0M!Df0 zKue9YFnc z1YoX^mI3s5;Il>5c7_qitHFi>;B#vLJ;gdY;Rq@fK+-@GfSzbFm_UtisU-lHOS#O7 zdjR7l+&~{`yzMP?jaGM?Z|Cd*L>Fg`5-43N?2ZRX_9%J`LstsudUAW42XFv@*;)$# zA_8|b;2;1?={fD4@u(%t1^z-EV|ymg%zfYmHqn9cxtip@fHXJa!}f+t;$n*b~$TfQq@u&uSJt+ZS=Ru1V)>*lytfC?Q3E^r+f&Q{{=>Tb zoC2sbomv26je4Vy48kL28nvf-04LokV2uH2_5o7>=fb3u0{+dW5CC_Ps<{Uc!SU!g z06w?go#zz5LJoy{Du4@+CP)eZnm3mK^u(&^jpe0@mH_N>(!dh~@b539*2QB0IITQI zR|W9ruVH%J7qP^6qn?bf!x$_RfEnc1Ewll^n#Obr0Mhdji(3~@%K+8^z+)-kcTW4G z2XOK_yTf%)Eapson0f{bQUMgEe9P=wAq(q0T|rbT%Nz_8o+3#dO83~$tMv&;snMV z0fervg_8uZ+!}z9oThKk1%TiDm6iWX0W5E}3}7dHCdkOhNVhV}69%xSJ;ikpBAh1} z=dv(E0PN{Pm7xC?0RFv*HZ8t<`NL@e$jk5*)da_E+a;_p zos_vN&IN!|#yySr@28NbY85~nj^Mk*y1S$)PEHs=i!{vZxMz6_?&o@W_;P!5ed+FG zpufwgrmIH}Agk@?rw`zD6~O1(GUs`@f(~qD>+t2%9nDC`lLOFVhvMjkT@0 z8J7U!XQJR6;pS+F}D>4^Bj9jt^kqy1Sl`IZts99oKH7kljhGFU`#aP7OePiF*#;!sCpq$s8U{ zr1oG;-qiwFJU|Bl4`$rkZ5E;`fXD}&YaPIDnvfA^IO!faX$7I@VNtko?>%%x1Ps$P-yPuJAD8>k>>7RCb$E4yDX>|gp~rKgQ#cV zv5fgleLNz&mro(%e*^%*{vrcB($!5IK}sOJA2|a6;TWqh$a`!4?#;=77}20#x6iu* zKDPuAsmC6=uu98Yi_Ojjg05Dn@Z{+daRtx6at1STp4Nt7DZl{x(T{)6`n#4nP zT{AZ_A^?U!dB41;S~z0BcUB4r2bqDP==1k(i~J!G?C%MjdjPE!(BoO#Mdy2M1^5f7 ziK;UI&{M2IvLD7$4x8>MvIG#Wp*47h_f9#vCmG?VS#)q$hFf_uW9JAiI1__&GVqou z;F$sFSu4Qk#=D5W0L$jEdVbOXMhkgJEls22>OT(vdWsEl8#5aTuv(18$hhEGEb7_8x13@mU}wGX$^%&cxzOz~9s3 zSL!)BfO18X?FaC=of}92Ol~8bW&)a2y=_9zQ$2UM&RE+i(Z0{a}PnW_U-`DWf`xO-BDZsVrhUe0BgXFHHJr@Zm>q0{F*& zo&mHf&m{nn;7sBg$&0Uk!Q=(Ie;c<91%-5eLW)p;f^>Jnf5B+nV8^MCXWveM8ms#ufnBj}0%izu*v>0Q}+g zI^GUIdWYX0o-}~+fnDEH03x+-!80ubI0f>zw6eU8 zZO$4@1-i5_bs6~UmjM)kgSTb?#e86E0Q!7B@vk-ln1XcKq8fx?m+)m0RKY@}c&(1j_O)0zV~LID(L>bF$Dk>dksUnW}v zFu0o9x+?$(+DA?BDFC>2QYJVWEN>hs4KsN{0LC*rsUrZmv~UGxh27ZBrL$1dxowzC zb7AUIc!Zl^%p3o2sGzdM0mycl;1&TaZ@hS-Bu@N(TLt`~Jpk_SA&pwzLf>&D1#}n@ z9W6r-&!g4=#B(%FN+kfL9RPZgcx-G-00yC#6sGOnE+;e9My=Lp)HBKS>L#AfHB5z0 zgv<~{Ljn7brGQ-eTx*~efN|ZR)c86&(@#hunxMyv6@VVx8|1MDaM7g#?k0CO*VbTC zyr2buJthEmLKHC>6#?qHgF+ymIi;JKIPi~^6gc=Tvya#)Yx%)AyrZ9_-nKvQb~ zLIa_&cdfKjDhef&#dFbKhUbP@>YAaA{PX_f0_Y>Zh0+Ru(R|fhGQl)D#-%w5pufij zfKQFf{CEI1(Fxz!SWV|^tpg|w$&c1F2bRyKq3i#VDD92_)|0u?+Pd_J1$f@W0zxp* z0)VBurlFJR^u`)$nql_<7RL+e?GkeSc9IoiNdEIUndoxq%H^;{tf2?6|M&o!N{z!VQkH93jh!5`E+h4oviL=kD!3u1V<0d z2Ue@+%LqUi<*l@*9e}k=Ft@r<+T7eM;Q|k|fX6G$BLoBP0j%g6nhZu=e54aoD*&75 zD0X&s%E@}xxGCv*)Dx@0z#3|V?Es|pk65qf7C@iA^vGgJ-d$?}K;%)tRNnJNwh2J={q@@J?hybKO|V7*_i9y`>KsmZpkF=XxU*af zAnZ>yQ^>#%ekmk_ofaANn#bW{pJM=P-z8@9z zyQBqhaVB7+fX_LAN!@{^x5=dH*UjKq0XPfW1+(RH5SKD4*>o^Dal{nSM~Du6yW#SMTzys|E@u}i!0 z;>lNpK(W{WSS@yU!|+HQfXf&_zXG6iSDa}#-su%E;9!EEee>*_Z=UH(u?7?IZ_S&f z%M9Q*s65kG^o^%j&%#YxnxTaz0Kb1`SNAK|b#V+Y{#pE=yC#~#ywAGKlza3>#hF+bpQV{RC@G5zwW02dLu z@MxG3iQa^Pz|mF!^ee%wkz;YqVaou*V;V}!OZVIYh-}-=POe;N95@4r>seH0$v+-| z-J$~80mvR)@(6M<#{n>2A&+pFbfbVa0D7L*pnq_|1mKmGwH;%EN}1*7$`Up=4D>8t z9_1-!gj+vGZ&d0JZY>A_#Q^$_E`mn_&=X4rw_iNDds_kUrUig?Y-g)YmjK>H zJCw}6{yP-wUHJ$8yx|r=X9a}FKL^j{m<&jX=#~NWM1xsfH--Sxj`_>7-5nJizt;I1>7b623SiHP0|<|4*hDt?n#4`O62RMQ}@iZw>n_Y<+6RBu}5GfJ;+zo&pPhm9$wo~fQZ5=>Q z6z-f^v;mNc)pG{`J+t`1C3I)Pqod??3hhw2LK?_yblLyEUNRc!DIVZ|c{Dr{CQe{K zvBu$kV=zps7Jhkcjb~iH_ZAxm|*1kjZ(_OBQ0kBvh!ewgMnHfvd@CtOWq;D17(|gB*Dl zP>qfGG#=BCLQWu8KwO3|!&CXPn84^?%}?Ob0+=fqJ|LnHk%u)<9stvSGyqXK27sY^ z2%K!A)midiJTU<{zrK;v0=T*UzP~t zSE<(eV;UZ504%o#AUsB3MGxT0|8d~~O0(oM02zVd$tz3C8@WP0CMlpQff9fP#XWbTkj;`0 zKEWk|A9CLafJg#YQs~esaRETp0?Pox+%OB57+ugMGTMLC=tK4ak1K!(z^?$D;y>QG zDF3hn@T=w2PUi3pUza|PtC}mVKfzBpnltLzv;q*~9=Yo8 zpI^oRHj` z%sTQVxx5LvKEeEs9tl9-F-z$7AHPg(7mDy`JLlrD1dygr4vl)qa7%c&>-rMXwC(&; z^|LH$-z^h>!19yz&0KOXX17-!KHRnV5}hU^F-eEYA^?%EUMNblkHSz-rH~~a2|y_k z4G%)z$rR%b72zc$n5F;@gKCKhp>(z?r;B5wAI1Dwx?=Y3XCEP&qV%+M0 zSQWT|qPf)a{FPxy|BV8Cqa!>gZLm1%-UdgzqXa0Nx|E zT)DRaKV5j~EA40H0v?RuHxYPqaRoVz$;Pi)ps zNl9x@R0W)bN5Pk?Ei@4LfT=BrUPS@}Q%mb5QzO_G@BsxA45?#6;1quRZL+cJ*g$)@ zfuK)sYS=&y)zPZrsR(wo1wRDfwR>NotErH6f1)4?HU%MmR1cEUpxVGFklS3IUqE(# zC#ie}4=YS9FWfc*IC*bz>jfgPUUQgOyg0rG&AYaR$0*W_Brg5{ib8<;NDBbg%J{jj ztN=9#z(?TS<_qo{D4GF~O#nWE$8852Ef5G%@D^1-05CiP1M5e_n7}neV7(D@1Q3th z-kQHcf?$Ln5Ev%?z8ahClD}w&&(|gZZ~hV4&U8KDx>;iRv^fpqzlLlulC45PZjuDF z;a7LzvveUToy7QT5P_@!*b_hqP2Oe%Chbo<3yjWgZxH%axlH&dTKu=)u-aMo$ zYERt*SkJL2SU_+Xfddja8+Tn#0md~<4?_qeN-4S`kW5I?5D3?Py~L~^wv ztsE&MF<7{F4}~bJ*{UQ*@dP}@QS8$Tlgv_p6Bul)*|%>4HE#;|gDDGDLry%Un(GrD z%|P$}Oh73!SKtA?S>*G(1rQnt=K&Fb+@K>VMI^75t3lT!N76WW0Q^P(zy2`j7N7_O zu3!R}?Hj1d_`5Vb%0-X(fC6-*u9GlP@*kPtwgGqzd4cPjJJ~(AHYS>0eW7;6h5VD( zaP+!eu1hB>1-CKXy-hyL)i$t%!6wQjcn!gDO^L z!RZr5U}-04-$1eCEIOv8E0-?~4^x@rV-QA<<^;A~0Yi^}1ySdAx_Y?3zvfW(_xJH* z8lK!$y5g=~yLS5~si%(W*{ACsreOH$z1uT47tEiPHrAA(tzlw=If01h>dSroZsA=a z_V@PWq+jI^4Ef!83~}1+fx%-M?wSFdLDGc?OlJ=F9V=oD1jGBoazVx%k(}DjRrmMZ z><~2G8os3$vxkQ))85-KCU6lExa!bAv&8=+^pVJeo8Qr+q@XE(BW(om+T(kOoYd-0 zkWQ*;Q>ukzd1n((6CF~|I2d76&jzcfn#l*@Rts>@CgHPX&1ZMbW2?D%Lam}a<3o&WdxBie}v~P zz>QFKswbb#Vez`eQ!o%YV21kpAr!te1+}g2WRnG5WmVV}Vt;`@o`fEy!~aHQ$8Xfe z=IR!9v(djm;NZ$o^U& z3~u0EAg8pto#R!=HSy!i!5wWdk>ku{AYj(O>+>t5fpW_BO2G{T6Ot}G8b52)s+`*(B?(Ay&U4B8LcEz@MeW z&+dWsr1;Taj6ihSVT*NIn{HPS-Ai-#W+t`z2bq|en~0pP^|jQd!*OkFq64G%^lHlR z%oUjPam`{^)V z#s)iq_(o+oq(3a+_(QZ{I`+u8?|Qdb%fHE!?|F7@I`jvB*AKhnW+}X92$~f$R+k&&|7E z%|H24+ACh5_NB$U5dZoGR{WB50mO@Vvb=TsLS}Nj`$#8%#1Fi_s5X$c8eGryM>E5i zy+D|z0=X5QKq%wcBbS}`XMSO7W_XzM3*3!h2C)~2P`NZUMdkurNB{QGX6XMue#5Hx zPaOY_ilgxb{zgUx_SD>r$p}Zq_Z_V$oO8K$?eWcfzrOnwDoarCWS#KWS9sP=T)xIj z?%ut7^Csd?1aLA$|3slMAb5B2D^eEk-a~*;0FfhzK3k-pEz-}J_K}wWVK7W6oCFEG zyRbM<_ev=9OJ9ApuyFU@j6#gxuaYzK2z@C#2;=v>T;2Tq;^LJ@GZy?|5qva#eGykA zO=t=~#y_a%I@B|a1(0eNO(Y`>p`MxPD+>#Y^1P_<=O6w+YW~9?;Md~f!WF=e2;eCB zfo_lyk_;S$`#FY(FI}Fxa%JH^(I$U*iT?dze(?{e%;SImdF9HLsmqu@S@%Z7J`tLb z85QDVnyDc;Mn{ztj7tDRtrm!55k9CqMuooMw~ue$HkP1u06*CPQ~Ut3Yu6@8EvTSX zCrN-Bz;wa{QuI5}%M5%r$)PiJkU&HcL?W=N{mk5+nc*{1Sr<|Rs$yp5 zCfWAp4F3lU$nM;Pm27Jp#`Qp%pszO{-DE%XgPWw9VT50RQ77=%k3|qcH7r-8FT=x3 z{V;W-^gX_n2qX|_glKs9(xuDVatW1Tliii2kn5fV;3(!UikC;D0)nGacP2P=gaRDF z3;iLluo$695yhy5bnZU>j0hc3!q6mGWC1E3TLjotW{T>8@X=)f!4^}Sib*x$;SZe0 z5*D;i1hA)vEk^;ey1re(?2QO8j*xewZp(=Dhh&RI{J13I-#{CB8$%qD+zWFM(O*$J z0FMSA;g3K_Ks4y$YlW=h%@AnWBvC=a8W>mpLxBni*}6c0FX3TFK!`<{3gT!Y;OEBG zZ(!$d0YJYXt47^^f6EAmF){cxOyUgsMxm+40>H4ardt4s131F$Fs>D6QbrhqVg5^a zrR0s+0%#(TeTIY&{n?Gzff?iQ!Wi=etpN-jqZk^9vE$a2tD|MXz8qD-Ntr(oE-H-y z@y7(9$eZxS0MO3>WDvH5PuSx9QTQ_eWDCOqM*z7)2zyUnO_=ptN#H2?luF-7KOvDr z6{eh#5QX@4kgypstgID)3W0)T#)t{VZ=+I2oF#yvV-_xW8pQA?j4xFH11uDoBqE5J zWh)2#!d6VzIDLW)=>Zg36!`PI1JK`YTP@HA5c$ah3KUO12l^GF0!BVM;D=W~S=rA& z>36ciBh(C!VilBSZIpz?BN#?9;$RftZEiNi=5UyOBm)?w>WMfU?MAglsUfyD!Ne@983Bi(fT zYWJuR4tKPhJ|2IBEcw$TNn_bb?gi4~7wzsO<7<-pc}&43nR6$yC%hvc@nL>8s>jz6 z-pRrhZig0fsOTHN;TMLr9v#CLR58GpDZ=OopBA4H+rUFvX~dSo5ut}HrM2qX-d4Kp$%ux;II*E=0u-4~QY$(I3L*BvmWs;!XNV$1VDR#=$}!Sz*us&=5jd z1f_-Q$3n2u?kHDq`54?`<_;R%g;_3|;YoNCnG0AWXAhu8#=_JS9981u5!=m1OxBqY zH_C=>jgA@=jv76~9VfuwHNpGSOJL|4v%ml#wXN6qqDjgn`2`s`4ACUfIX^*dk|g*r zc-+?u1XTadFu?rtNuB2Tjm`WDc&_+kiV6w3);R2^EHX3fr6omfsaqUO!#N*YOJ?sZwVccuA=w&#y)F!h-Wi-%~@Z zm|$dd`vd*<;e{SRoeh?0Bwcf1HpJN~D>!0F;Ryd@MClpEDVHeIJ;=v^{}-i+!Kh|5 z%yA7b{Js`4y3|NYMS~wD?wS#3(1Lq8LX^On8R`%EXRxuQgA17B$HSOOvp`YPi*X}A ze)3B%f`TCq=#8%54Nk*HfG{i=VD?Snu*oP@TN$f!6zVHDHG)~4^G zF&vgK=kWh$?tMez$n*VQ^W;9OSNC@OG5iw*pDxL0}hjR zM&RJ}_Gxp+?CjfBY=E=bEGs0;YqQ>swse)MrkdfjPe{7Th-2D(@V>MrHce7^+H(;j zC9q7wu(s-r;HxsZXeYv{jZnZh1TbFf_<+aR-eUoLt0b93*SXRGam_i|TQf44h^d+K z0mR2#ewyh$O9;~RY?@PjXZc|R4QFNgwp!S?0lu?*A68=vE^nvlcZyD@v%F~)*=!0FnwbJJ@jm7`;+;rJt9i3m@#k=LytekV+Es!p9hFTH`3v9tO=m9|w=(Tp?eKDmG))QTFD-P&xj37I)S zCw~U~;wI5|ToCd`#mT9Zx7$u?8Y2?T3^IV4GCBQ*)>nN$Tq4tJd^$3&X-@#tlD#{7 z+K)E4yLm;n>a=dpc@|}}N@zNruFaBck`OYsRbhooN4k5&>*-7Bs-SH?EqOveboLW> zCE-!7;_b>s33_mEzg_jVJ{}tNka3lp1*CvOGbvjj#mZ!#wsuQ_d1C`sjC*EcEBwiw=oG(7`GHU`w(++vEuS{ z%TFVaWe?u;+iUog6~Y*owKac14&REh({FhxLbHkU_d6>52UT7t?BJ&jB=i8o3oMxj z{1~ja)8_G&w3m6d=GA?sg}^`tt8}B&fgWQp&6B59j-MA0KuOZbca9>)xth~e@ze6y zp6-7-ebTg_Z=KyXLWkGl^RK`k(3PgoAlJ3DKBRwSl3~NR?C3-!Z%kipoZmH6InJ0r zTvMxd`OhnWZyk^3TW8jT*aXW_|PvdV<#!+1HIRVtccou4{{X3vB=mg?pps0)VG^h|+Tl=87L}@}{xK>y)XW7MkA`(Py@5Do#gP-?L7MGQIZksNAZq5`6I^#J5W`~@R2xg>&oGx)?Iu>O`u+~P!fimo5Ahvdbb zfFxS_{$jRyDhQ#8LTc=d;R@HLhUtrj5J2Nt149rX?=)uf&X=L4`UO0|1f2SS@K_?61UK`KWm+ z;3!sT{A-?#PYNnLceErZ-|(Wp(ew z0Agqwr+NW_ET*~Re}~IyCnp$xy+mHzQ0O{!RY05o$Z;({D0RBl&BMqNF&Jmb<8UP| zvyiN}OZ`7-9C_?JL(Dx`yNxf51EG{VBz*)k<$paC`# zztd+qmW={1vV;`TxctG5+%-n@ssdT&lM_SxW5=cGsiwF@#PKLQeNuxSx6!T4(#!)I z-*i^Di5Z1*=$YQljW32=-$MRRhkRmngOG>y~tC2@6RwIFkxObQljKyOV zlth3M`^ymM&~Ewjf|d$Oo}7JKZlfJj{4MBV6-xfOX7$Yg)W-$5pl3$@nWvm@7$wM# zajG~T=c(1ADg`iZB`|(0dvOzYxSMmG81&XKLs_+^jE438Bmj;h6{uTTgb=x^a=p7~ z+2i&L%gcY&4aTs|arrgE;5+;|9fny;aFO@#5ID1-6 z>gyN0)pnMHjknXUQ6d2pHA+jag~J10tcw4X*r1AOCe9E*3jp0y@$BibD(FH~75AM& zlUGTL5sjybC0gfj$6M7(6oLz}+8Ehulb0zO>DJcNdIa)u7(mgsT4Q+QEO$sE=_N~` zhn*T@qkyqLzXHa}8TbmxqN-{n$4sA$7RJ3^ zrUW3`V*a&WW-%^ntzx*FpRw(PnI8)O4tJYYyq1Yy9dqvRf-L=kOTxZ_{?)(|6H;QJVE zU}39`-b(k^{uL8A$i%aXEXTd%5>H|nj(_J#Ik(SdIKISKW(nvU{V-E4P8pg&Y z%Uqi@p{=?1LA%wWI3Rq=T#YrY99NL7<-IuYK-+4_BZ=cr*3pXb$9OE}s*r;~twqYF zsAF-PDpc1k9{1eCSRiJJ#4cv@jodUkLkx?wLH=Xf6>q=&#@6?Z01QZ1bckWZOjgFz zrQ;6=Kp(iYCxou+$63F$apdCh*Gj+$a-8+6stxFxe5j38#pqA6WMj243u=`@8Mnz6 z-dt>Bt;kf3nAj46SYtzFig{zT0bL}7bk4B{&*LT;Be)7Lyf)?oNb5cD0v0;vn|<{6 zEcZ3ST`V56x*hOqE6$$%tML~wxKRKKHsNUHxD<2H@6(#%X~*;P+d|qJKmIAHNcgIv z&8f;E#1t`%ER45U8@+KYLs5&H*Eps&Zk#nQX08dEWdT?mJrTs1as6VJM5~S-ExxEp z6e0iylrLsnIwn!07)iCn+>9b_MBw2D+B7?&{zd>g#06qu!bnpv4lHCj(LmkhxRZrgJQjD; zZwjF2{l|GbSET}Zn3(e8g~+0%HGYjTjdZOP#uPJ>=2}Vv#k{fO0az*k#y?*5XJsz} zz_bfpJQ~0gh?5vt7r^W>jL4??2tg=d{wbwO-s-AV*|kRAj2joPB5-QOQ8GSzt#t-9 zo)!IKTSl&-1>1g^G!2dG@;3Y194f?|B7vaYRF)XWU!6JVl?{86J zF*B|4V+l30j6f`2YXCH%Se*?>r_A-pQ=f0aeC9F&aV&cqw3e4S@8h!CwHrc!)Rs9L$}Bh)kC; ztI_NKb^ykG(-U(wO_!4~6E^TRvA7#d7?5iM_0+^9!K(G{< zRV;V3)F@Ew?70I$%{vKgoDDqR+lxCK`a_KJ0Dv6KV`6gB0X?a>6yf}tlD_01_>(lQ zjM)`yn2x7QK~y%l`2TGQbxO?kRLrF-7SVqZAjfQ4Ef#lNIYX0)L*zSVSai$CYK?e{ zie%iem~r(V``4nMSqYlaKvDVf|%VQGN;DZl( zJ~hs;OTsJ}PiJHCDnuj}&tlisrnBj)pcYkl;qE2B;Gb!}lm!6Kx&U4Z09ckn)m)Fi zBxZrrNoZdZAr$U3HT=^{HfvE%{;dEsL9Dodk|c>){R8|c|Kem(VsY2n+CU+uajNt8 znvslJ_T6HVcGK*MP-pbY-#zX-gY;2C4s&NlS7|bj28b`!u~@8xdPCP{W9+IYtKclt zs0dknP!j*xyH8++%UdLX2;NzjzibqM$z&<@vjFOcET}P-xZG-E`T&(=yqqaAkE6uX z<($DRa%~CZ109=}`E#3J^|8e3su2{8ni=a=%jngpcV^uAxP6*H6CyF=f8iZDMy*B? zB{k}xnY4*WYs{o*m@0v*rbblP@$C#zF%!iSb~O%j@t8v&-sOoUJ>|~EN%BznYBBz( zlE0J=AMwu&;4kD5IZ*(HivmbXhB>eJ0A|a0e_}I}X`sV=kW4cPl@&wd7^;GKDVdn_ zMFf9Y^mt^~5Qoy7X2SB;sn?>f5Y;<8WKqHH8U^1OdCzBq1Dt(wq zOUCgpnT7n_2;UzsTvEi(12Fm5gV4qp(%ITDYZWC=A`5!M$~-)$J&j#V`o8OaSA4^Kykh_UXbo5ZZ0<>uB%cx`_@>h?o#M7A%HMi4tU! zns{Jiqh>~JW7f}$E3Pq()Qx8sbJ|L2WlF7}-A!hRL0*w%>yy^_FU>>-%B8G0aD-GE z{~uAsrIVEOCBm$f0;bXHi~!KH%HWTp{RJ({Dx2g5Dkrcx0T@rm10k_vN)43Bpt*KU zFkF>nRus?^!IJ`*d}HWho`bI9ryW~kh;yP2!$ggk>zF!UHOiysoyEfxdRkaxH#Xe4 z`*>*9SPgc*lrdp^J{-|(ZgF&@%EfSqvk1mD)hv!Tm@`tttYb1k`7pr9s#zrfDd-3R zn3c`U63)`JP^Kia!K@6LQ-%vZ#6;GT7!}3i4i_=xE>7!WX`CU5NwNw`i$N%HAY z++Pm!8uz@u@YZoPv49;NQQzyv%gI4=Rg-hpLCOG`35`h$WC>r8tHMX=<>&pO$3XsPS+T&ze@pk}+o! zI(g!jthh02>1YV>0>$GY2$RR~gW$$axP57O9kueZyT-^GH_Dy354Xe}gBZx7U`gOB zQI^4Y1ht8n9}|1eFPJq+BX6jB$wZPiq9F`+C7H$VQ?Vq|mrWV~m_47qtU<})%1O2W zfR{cABbfCUgkw^|bZHHw#-z!%^NXwE0406Q^3*`6f|E7GM3zrb`*gYD z6Z*G;B{t0(0?(EgKa$S1X>P2$N+3Cc>8$BRk}nE+<*sj5?#4;bk>uZ0ixYTBarcr*NhO0a62D}j=@3!w zSy;&MHc&Ddj|fSk=}Sb&U^u>|$y9mq3tC0KjTT@FFi0drki?^jVg=*P6Ul_p!e}Dn zF1eabA$s{^bURVz5)yL6N!w^CX)PUv9`OV&WlEvvf|I3xBr5;;6sV(@;0FNWIv2o3 z55RDMQo;a>cHqm+!C+{SWT8rnlgODCTp4q8O_1V`RTOuz*_N-tLj zHz7+V*Ng_#IV+qABXY1LN~kLmVd29hU)EDCl{Wo%w)o$A;e-AoUz}H5)U`nbUFnPB zJQ_d>LO2FavcM^GXPThV@4vRsMAkGd&ImWBO>5_`m* zcTG)HJ+a^spc+lZ&K) zjpiRX2SqUJq-EqEBd3VJR5XDB03G8?4_hTQh6pnuDj6dO@b6dvJ;NF0%EbZz#@-Y_ zvV$O9yh?JlKs$#APtOnH0~n*+y0+`DfkwAI1?Q{lDOs z$n+XB%>Tl?@#4i#SOG7R7byQpyfNSgrn30DWb!%D|DBuJa{;uR#9WMYDQ%4_o_1F6 zfFzSuM)gei8_l0^8y$zfE`Ov$2^OUkY?Q*1Eg^w6;a3wYanLBM7>@{M6J!}#0~2LZ zD+zy&yIJ81$)j?pU&WK6lL#3a=d&PMv1iB_OFJMMvrq7C;suM6WxW>h3oG zubp`#x#E9KPb&;_tamWG*w}dSlZ*JGLI8eZeMD=p;g!l7lIbW2Wr}QlD!`!_t*p8E z>j%O%9=2Xq+9gm{#wA%S{KZSb7ZD(oaOqCy0w$A5_kYx2TyQ7VXXj!eEU>h>}>$k-=CZ;U;NVERFMr9$g9#lf;3Br%bBPegowf$nGRemn1mL zm*5OrGRYwa^t~)}XS*94Ntqg1`C!6{6G5nvr0o-B5Ht^I`-GHF0K5nQh6<}G(uk63 z{lJt7bF!&aln)r_=t!qtqfJeaWL?za>gUB=&yPxw39T$T4t-tzBH(k67R;=a3uDY4 z2`2|4yHxT*!gcx*$(SG!(=1Dwc!GgV@R*TcIEj;lM#PDjZ;BJfVhiSEY7?;(1}54g zUi-5qpiD?ynQ|2;#V#L{(49r>8krW6F`8atSC8>S>PYA=hDt@FOW-9DLK0D4kwq9& zsjQ!i@!dckAW;;iV`@oDFp)Nt>7BW#;v$g>!W0F>Yla{ezf30M9xIZ-*i?i~4IU?9 z^1gtbK5`N!D@!|a{DUARVo_<8gy$nB_+ZAR!`0bXA`t>s?QSBW^kqo_G24_R61C3~ zM)>Rrm>4+4x|briFWU_;bfXq^Uux`bw8j&cvgYF@4sJ~4r8cq^maI`+w&T@vzkge;oFM9glVFd!!7zHP!ifSTx}@|UnW=(vlOP15WR8&cnk-)M?44Kaw4JfQq?)VDFLxZ=4XIPNwV7-Q6voUw3z7H}V1O!K~Yml6B$@HoWZh z(Gs!O_({P2zVi+$;KiT^NRw`I{!$c1JT*Gb2HeL$Ez{dfYwSz1j8A&*H_&5Ng zV}q0Nmn!L{ z7+~YG*<(y_$^kGH0x%wFj061D)tyWNkMl!I380D}&`0I?V@*XI)#+__ms09yb`3$4 z^kvU~jH(QPPFpoN3HgDER0#l6+)vi<>S_eATO_bNe*uy%c3i|)wEn^5{5#DAU`Jzw z8(6YX+R?Sa$!szr6X;NvinP9N1Z5X0ZhIofKIn~{M7{|@I)>k0l*5a zdnLk&*80& z2lNHdgFSIV0J(EHnoii=5(->g!K;i#0O%Y~5lr~LUy0Otn88HZuM=)GmpWPLc1pu~w&kboDZPqQz<&{qOrEaxjaI*bjzc(DxI_P{hMvVo{Hf-5=0q-eZ)9?26IPyGmr zI@?DPIGw1{QVIwjU@8*8)JXxPzO`L!2uy_SZ>1Z9E4g|&PeGlnowQ7%EMUi!)N7P( zV}Z%>Did=wq8$a68atqru)9>6-+8CGnF+jj{yYQNSOV#8GfAZyjRtmir)+*G!lx6= zm_Gk5MhOFaGW@V)8~|fJ7SXO}Xk-NQ8YKiUtbmDQ2(BrB1kf;O(;H<X*w}3(&;WSpQW*k)9MHXv4hO)X@Bx6$5Oq-Y5Ba-%{vA}n zW|U0Ajwc;Tb2nODH|XxxR!IcX$P$TFNVrw_H}3oc zmJdP70azM7gHd$4C=v4eD#K~;@SYBX-d&MIELMi9Kc@}u4wtYICSDMm4yQQWHH-M+ z&*h630Xo3%GT7nEsDGD10Xu|Qt`29-DuCT41Q7%s0L2N+mT+dRD5jEuyi+;)5>Cis z)sI796hOL9kx&JU%!7nma)K-j0a)h&n36lgK{+aCfqjTV0Sv{zm8Aeoltj=`!9*m0 zW%hj?0K3be=fuB30A2EkzUJnR=4L}+Glsm)81e#t=P$l;SSnrr8UPx{s=H)y;!y{{koEz3 z0HAgJnyFCafdMe+AK73j6_P6S4KRH`_m3v%5?}~I*%dcIBmF}KG0pRDxVF?}QUt#U1&nTcl=#}G zuuh_CCl)|Y6f6XG0 z$_t%nOe2w?0J?eTWBDoP1s-$pkKeNU1jR`UcSHgR2wLKry=9q$*LM+O;AX+^qmRG` z1ifVAt*&IVsg91(-6#=>G{e>F*8vb2OlYz;e0v<}Lv{2aOrRM=?<|G%x%w&3Ejf>d zq>cg5yPJ9v6CAR^0-O~wUyaK2d`z@2kdjFxLp!6ZQAg+Oo-7@*xrD9svW~(Oj~eM>9-e$N6T8Kd@Xr|4{{@$(m{GxOD`(1wi565ct}KV$)JLkNECT zzzwfsZ0ou+;{Ad6WfB>0M}0IdS+)!Ov~Hv?k53|Kv=ht(1|m`r!K4acz?U>mLn`Iw z%w=1W&dQRv0_p5=6lCZ=Ae=dzbs~7pBA@az$L1)B@Bp>@fqrzhbJsJ(Rmnpo`+&5+?y)NoS>_^1N_wqd{F8DIb2}@>?l)+qCmM!6F}`U zFEw8V=q?)wF%eDnS*$LwhlIDb5`>L31UkAK+4yo=@OT9@ymmn@`PDQHMLYmSI+;P6G;-Zf zHsD%|*Md~Srk(h-aU^C=mfFh@!gUF_atR9B>QX1N%oaX`3?_9Aux|rR0l|g_m$L4% z{B`*3F?ICeGI0oEc=<9X0578hc)phbY{b1Ajoa7S+G>v1E#|n9lG5xelspZO0a;yX zl2mB7ybg`D3w3sC3?V2~ow$IzHaR1D4{MGpYCISlPJX#Vmz?n>4 z$}_?#@5W0AKqRO#tmV+!O842t@Sv&mlZifn==o*p%+QnPFEZuFo}L7aaXGvr#3vTO zhK^RC4+`iWsUIwMceJVkHk8!9i>iPD{P3QyywLE9_0{+JUQj>VAOJ~3K~&=drqCq;Ta>6ICo4mSMz5&(6$~;x zDPy{Dg0Tm32Q#(2sWSK_to5}QKNEFdH9`U9S?IdDx~NQyV|*()4?{8*-3qH+(uhnb zkAgXzN>1kl-GBsMEsQ{XCC>QOlp2AgfC&qquYS=ic4w^fSH}RN)kOds!3cMt9x{6k zB@yH-UI0KP&+4F*kHGfA^rK!>!1G1{0X)D?00c*%k?p;3Cn!dQ=5?rhfT4TM$&*dk zbLQ-cdFEKK0Nb2V_t`vX#aFD7qy*-)u_j+K$C+Pyku5+c12DmXW558f)@6maVp43DjbR81UTl`dzdY(esZ8zfUTh$2&7jl zd19@t&9s0&poY;370{oSFT17~N-xldi@m*L5jtE~dHhJA@r865Fo z?LZJ!2#8;X^p7LoIyS$p{3hN|3|qP2LI+PfPLzK!0A6+!@FRYs^!0wkPT)r#fb0o^ z7B;KL$+35LM`L41`NR^}@iLxocglF~XbeQVQYmBP5_RS`FUS*gdp#w#Muu>PtyhZh zI?fG;Jt%y1J-7@fu}|c_)9)i0_}Bo+(_hj3URfdylIae~S0?Ia3Z`QciA3;u2+js+ z6%DJ@j@8xGx&(PKWf9b0=W~HGrCa!;oQheQVf?xs{zUp35H~Ij%@#qD!qzDK!U@33 zLDP%inZ@%T_4f9X8Lqh8uke8d1}ofQK(q{Yhjg&c2JSN9@#O{(0044E09Qb$zv7kQ z>njE&V{Y%7jDrat5*W;Mi}q!XasH&+QmKrmJ=%=A%!&BJpHxWx41%f5iK<}*4&)N) zo`$I)mhk^zbNF0Rsf^PM9138)WtC^FLBLPTdU7gVZ z==D{jV0!yG<4Ip8(5eiYz*JPPM@6v=V9*J)zZ5`OxYY(Gu)%3d>1%-vNT_pTk1i2K zcLalV*8gj0@Cao741-!anq`VF|JECz>4JE<*$qE>d5Q|y%K%s_PcT=ne*LBuVTU3x=7DcqbX{T#KLMtE_SY)<{#LoaG_gsoAce?W6Bb z#vkj>DmSOW5yDKy!KV^h!;u562_a}(L5AEsRY+&=nc&KjZ82BH^03-qu9bQ)C1Mc9 z&%X}T4z#RZCn<@vP~Q;XPqoj-ubJWzP(hs0q@#nl>ri^!w6mjtz4}JU<0)ETn11+C zZ-s$RwXfAA9J{+60rbs2MC^EK-Nwi04vhI!Mq^*AGOK(MK?W^+(&;JdtWe@6!S?q%#*hz@3qFw59VIC-1~@g!MB01YH?nLoGO~h@OE^ zE|+PIm&vkYf*-3@6GJD0lU9*+8}T~sVWt&A-wqEyV~SfNizt>ZqG1l)eRHD_qOVu& zFq6js_I~)$hc*Zi$UB+?_g#2`_Epp4&^A7~?tsgr9A-4|m5YVyppU#0aWHA%Nk9iV z{=iFFY3*KVaM)!^h2vLwnDhij*nJY(SDjS{Kv5Wd@x-i>@WJ%EEskuJJsBfmby5eh z*F;6DawX6m6lR2rpY627G^JG->_C4>6%f9zClki_1zf+T*48GUx>n1b$6~7|e`r$s zFJJC=@at9Zdad?B0RTU=08%Z!6WBrF2SbPVrTG*v9fV1vM!qVjg&o}rV5-hMIG^&Y zZ$^U;>+iBikY23T*;`ob_hI&;@|e&eld|+RXcFH(zj~q&IFqrRUbpI^<11js0Wjkz zmiaPZ{`^`pWz#6Sd%}@o;cwMpFwh=1{paXnU0vjeBE~qcZ0n-<5iggEbd>7GC15E)m!>$`0!d70=HOWIrVKECHc2EK~t)gPP<` z)n)>YzXP2`m~C)fL_n$M=BTK5N{&b8{B;`f0-zO5z8&_wQf~zKby%0gWS6a5C%1Q7 z1N|TXB8er!kbVRY-iR4YnsK4o2C@CYyKq7v$Gz4Je?+zy-UMOA<$lpW3ZujN$G4#y zxZQZChJtkKv^LaPw<3UF!lf_6`b7F?b!Jt&DXIobp39Lj=}{eSI?0gZx%l3SOd=#) z)GW{M@&|)TPiS!27^ESxJ$3HZ=7ch~9iEKxRYChJ_%$`zA>oN~;8a2q*x&*P)wJTN zwMwp!xoc=Q^w|JY+dpE)yn?V^=umWq`4z!7^AM?G^+t zj&n_P#WQ=BmZ}SpCm)!{) zogTNQH>5bFPAH;?(OYe>XXY>%bcwyV*!SS*G@1egvM{guCcRu!Q_Pn`*qgLVyMh1jRw7Dn&T&4(<`?@dV2!^_P&P-*zZQrtv-0>F0{Eb*a|^!tJQB- z!0wU;*prw#76v)@)h5GZmWu;3V%y*`AWrxp%>#_OuDk8Vxi zb3Ij5AE+i$N;7Wg;8$M{@@7Re0zisbPe!0Iz)f;@L*O$6QinD*iQbiyzkc5l?03s$ zg-`jj!H07jPVRqrCiuM%4S*EUuo-S;^jrX2L$SH>Ejr37ped{MqJK>ds}UD9vI1*5 z11yF0FJL*N>TzwZ@A*gfH{!fnACf>}rru(c@BnNGYH5Sbq1YYjd3&xZTs4%2hG+)$ z9E}wY?rs4zl{A=O8WDtdzooCeg#1NlV80g*hs))DQ9L4YjPiv|3l~G3lO}n^P>mAXOo|ZR%y;@IaSs!q_0sz+I)(L0s0>~BB*C~Nv{49e$ zx%HMl9vv>l?PmX0odF?M2-};wF!SQdU~8lm?k`oY_KU&2N(lD%gV(1D*c*sIgg$it zJ{)2I`xU=do92!Ju*ns{1~-zb*W5>xEx^I3@)x+Et11_`dwo<46J_k`Je%1NA|?oO zeZACWIxXQ46gIyB^C=r9Rb)7Ah4~esjJEN zo9jLN9SW_81_uL{{(hc1D%jNpO4x-3NDTOa?G`@Oz#w_LblF+oOD4FN-NJs){X^T^ zd$rdPSYd*hvF3<7Ev?Nye@*Ph`c8IzeK`ZHJ-piFik}(KO?=-AYRQB{m?;0NF06l! z2>K4cqf_pZG3(shCCpt@JNI*)a26DtjEfSDwEDoP@LA?c=%-!)X00-^Dorw;WV_)G zN>`gdGAwF#IH_9K*I6}2l&Gqvu70YntG^98y$viWLf6meHQ}_q%crlM-wuN40JeGn z_VT>tO{b zAIMxkNMI|m*M!s7e!`E+82lLiyn7;JVIzDMS-UDzm|vASr(Ld!?S)VMe*A0igABc2 zfykoug*ara9~G~k-AszN=`ief8u&Z_TP09L6Iv=5tK+P`S6+p@>X0+!-SV>Elu<0V zU&0PLR~hp8ow~Y0MAtWX8spn_Q7_Z+b)M@+vSO-qhK8tVeUL)yyJ0<8ldFKliftfe zkAouUn0Kzj0LUtcwV~j(jUjWu^BCaQ%GiM&Zf);kH*l<7*dqySbtyzzgZSa3mtI_O zft)__1#zq1PzL5b3_*t88+z}<3d~$nDjUIL#p{<)+gg4BP~dBF6i_aFbhaW|tfXVQ zq+eF+!%lU{5)hdv0zGl6537y(VcJ((n;Iggw)O@GKtqgBC*o7@f@6LDE+(c+5o!-e zme&j~fRNIpmXn<`zG_`2Za_xr%>Z#o^Z~55HdPqr>e>K9(7rL4wzaVp?rK#xP&sVv z5(>u%LY#&jKovf*!Bfs1D1ZTG_TX zOvH=UkB8zV20$Wya>)z!bN0RkQN@Qvu< z6he^qAqW{`FA(o9w>CR~gG%?K&p^xQKA;LVsrt3cuMX4)M8YfHor)$I#%O-KY^V6l zxJEb;;b&2J*zT%cn-W8+(BSuIMs1U0prkIXQiuUqkQV5SHgyC2?k!g`9yQhg3yEF9 z+A^hh@v5n(Q(|T$QfM+77DZq*fbBkjAb0%;U_VxhAa#uagV4)uY>CHO8NjhIFvTc^ z0|R7_0Y5-+tQGMS>5C|2ihIQ(_wt)(Fn#Ym1Q5vUl{rY@dlgVIRB7($^{f5m33`3J zin2#6gfuo9g6Ccrx~O`$yQ!h6-N=>Nl2t;cfg~s#(5d5}$aro)>6OQyj!YuUxFA1BG_xiOKOj<6r1^odW-`2^R6;SL&L zPsa78o%;jznFysY-n3|eSWH}KZ)!glnG(RXD=}y?+t{Xeok(CxLqkM2G1H`iipvQq z;dgueK)Y2u0nk`uMX)4+1MM=g3Md+gZDN=m0C{1I0c_H2^caE&Wq<+fZzUOID~$HH z&F61ODIB^wG<3BWmf!0gV)BT(_tX$0gy;dj4+_Ys>&yLaA`!Uj>K6g*=h(Lk_%nH; zhISFaQrDB&)9$sv7*D!Ooh+)UG%A^3$0&cs5{Z>lTwaeD?mwxijlfZv(dq_XA3)PG z5miaDl^}YceqcZr>S+N#0)2e0YJ<5VZk$rtZmVn$)M%FnXbYGPw2PmIXD8@kx!N{% zl{15FV?%nr|#qs7{I1>FO!7>n1=8`Q)F+1 zRBCf!3Ce7)E$mEVmrUlCHkQ1yu;~&r0Q=8!S(wx>1|}C~{hc;8HkM{LsXI1j@snRE z?mI9ERfOuMw)N4c+-$JI9MK{=Xn3J3Hn16JfmS07_SxDNHrx1Y>145$U0NXuLf7O1 zp7X#+@SL2s`zDxNJ+s=nC+MozONpdr-ZzO+{vND;tyU{xh^cez9e~n4CG>b_(seGq<&e z1a9ta(GEL1JI*F6h0V>v%G^p}k_C!hxtVoo8%h^^G8OX9D>FIU!$ROdJ89d%=AO1o z%ldv!bP!8!=1`ge2i;@^Y+ER-&#mm|Tt~30ePrX^x%K^pzS)`T?WltLvlrLiH86no zl`=2N-BmUqlK#))b_~_?7 zgCGNlH%zXITX~hUJ7ee;j3I;l6f_}zz-U zV4VspQ&e8;b$R@evH*ZvFQx+J(}NuLAuGwi-huhz9DKo*EKb8y%`||BK3qa&B&Ra%5y_ZYt`_TeBPMQy0|UyR@y^799uQNsx1&^Tdfp$Z-{#W6%B?Ui)!(daY*L-M!dCUy zUz#uWzCA3EpEc=F>6F~p>-)2ldn=Iu?kwz81Eb$=AM8zP;}pQX{mIY#P+vf-ZrkG#lk3@nZ{& z1P)D450M126%H`?KD<93QtF1@2LRtE`Vhe1RJiijX5yMQAQBW1JW@rlm6MVjRY4E8 z52(ii04hrw?nmM0I4+`q1NE-_4FvUYVDs>Q=W95(*JtIA%jCxTi`k`+09MYzF)%?;X@$EzQ1~nM5$>R-^g}zW;H5AwtMVfx-X6%9mcuZuAk}0|Q@dDS)~CA7^KO zjI42Mq0P6$u;W7E#nNo}7)whpmI{630RHHn*%W-SR{&f_2zhA3(!P3^3rk$p7hAdg zLMaJcnHjctpbSl8yiqPRk8sXFyz)l4g7HqkQ-Tg&O3fN z_YygQHM3%PznoiGx>c&yPq!D~z{d8@E&|^l7>)bx`e=iE@ONxegh_fW!6ltyihM_asYR8 z69=<9r7)VhHQP6tn>`3?+1~o>X5YZkda0iJac*`c(mYol<_?~@b)ciRZxnE0yA*)u z<~C5e+L)KFK2pHh?UJa>VbeEuLf=n4pP60Q%&D2bwYBsz2W01r6TDqmSpTx51a1s7 z`+a@Tm3;^x=^)A-h~HJvJVbD0da&*4;56Ce5yWq7WQ;kSCh9^QPHP^9wh8JUQg@2v z?-YP|3YXCqvq6TR_X$W)KnhbNgu%+NQH-HV-p&yfv~-W+tc7c;?&fttAw}k$pw-*@6<43066^UYML59GqkT+xnpE zy9O4vS4*_uT=mA}(pE&%E33cTUMVabNFx@$-kIB9055p%TM_2mN^WK+RI8T4@BoA# z17o0neKa8#Z-gu^us1zD2#tiUA0&GU1;Y|hLDWD6&|=3cWQi3J(3zf=mj|E)?_*wv z)Zu#w-=KgWS1@%$gNWbYv}$0R6K%Ik9L~74wu=`yU`!~|hG4mrL>5s26kTX?0dGD9{?{ZR zILXcxU4p*NxgT{vNUm=CPfO~q<+k7m!t<+txb^kB=CGe0ZWO+;X9AXg{}s$Db&$?( ziv)iA9kpRwE)1p^5kTgT0UYTQ?~m*)062JcaBvW2gJ_e1!!}%vUju|9f{LC@$EKB5 zRzI@7o)B94^aB*+53Mn2pi#h~tM@ryV;sS0gP$-shH(@`;says?m5y2(S6rITOY&M zR~|sXw7t*cZ@^@BY1tyUAS3$R_Qr_eZ$yf^L+5T47IIWJo^xMJ?QG;6YxL#wjTt9H zQJ69Pv^_)nEi7zoPfGU}CI{g&tl8-jNcU-*$-eQ!Nn2(00s?sOMF_z48LV$1w=g>= zM7_H|2mnrw7y#i4S=ZvQn9Jp{4O>#znU#e@Cq%-wTXX#G!P1;PvDKZWnP*P)Ka*Qg zkzSdFM&$GPh5Q0toXuf`j%_eQIMz2}uO*mXM2`yiazh9pz%@NWc#X7yB{uj?8w}kw zL#liN;C<3RR|QXfjFb1xgi$>8@&7~xMDc?I58fXdaAU z*tLx+BPI#aXJU|nzJL*SIJ9L%-TqhW3w=I)BO{yYfW11*@x|@i*f#$7tmBi-uH*`i zU$?!nq%p|OEH!&%#AGn$HU_zRXN|OGu)50v_|3u5!tk&{vvjZ^hn`y5qifOEHh3Ta z7WT1QK?Mf|L6o0^Givh3i3w=DoNEI(0Zwbzmu8*#=F@7|MLoB3xc;@Jb9H^8Agx~g z=Aht|r5yK=svikppRz|1sPqwt)3iXcNDiS`VIppD zU3~*5D!J`fDl3yzx70icKR}4|OZEOp8(q^$^^cZ**qm8c@B7^|Un~u7EPbJ{RNk5` zh#tP0%VDFT#tlXC){+2dAl+W#z8lCnD*EMI_14Vn=GGYl;9P?MSQsJx`X)EdoOuT2 zOkr;m0UR9Ep@ZFDkkPYRofB08?{5Fuvx6@-3b}$beroI8!qUR#{@xc`&(zFr%-pig zII}%>>y;CFEzQo=$Z1y}+Oo2Lkn7XJ1P)Uxtp1HKc+8=qH#E&04l01t)5Gu+T>zh< z`$*w^EDWK?odV}9{L?@E)2V;{=YOt1;iMPZV3OWxj%(aZ(7=Gq1{@0eDBK_!an5JN zKq&f0mz}c^T{;$d|8o3|6eL;k<@Rh}o0GD_-kjXf1kKLU2w&O-$?i?f6>^%P*}Jth zvozkfxv_ss&3U!4cC#y+>NPZE`ux}{dQ zPw*3mBm^O?q8^`0ANBD703ZNKL_t)j7HjkF)~2ZzF2*G4Np4Fl+>1jQ-6Lv&Ki!@! z8bzDgoE(NSnOl+VXAc%M$@ay}BsY3+|4_3q3xY{O1a@^N-$yDxFk9_sefGABD+=J& z!kj44yE7ww=<;nsS)h^|9UL8^E|sd${4L$mtjkd!v~C;<>;k^p=H~dY$?0tG=O(GL z1$FLTth`+BDwS(l-JW%C;JL}2>YPI!4uRoe>@fgvn$0g@M!W$&Fdc<*AKtLUvUq=* z=F@A_@LIzuOkhT=5rp^ezb7BLAX$i@N8i7lx^jh=t~hHgfP?BrVj7&&KGS_P>q7uJ zjRY^8sXN=oM$EwvEhJv+L6=7oNH)_0eaf5|H?yLT(G#Pj7xUBYC9R%q86r5V>94t& zLAk7YgLm>UcO)^vxqqlW;Ii_~r|PN~)sL?(h$l3<@`d&<%hkx>jHC)*&ED$t>vT`u9G&)FOFb^H<^pU>VTNzdB;ap*#nz%(TkiguE9BJv+ z58V2#9i#Uf2P>rjtlZg~-HyD+1F;N9;4pEAbJ9athM_sa>L=dceGCH>z@foWAZZj= z-xseCzV`(1{(Yj57k|Uj2Q1zH_!Kh8KT6ycgzw+4{QJNC8&UY{D_4H~kFap%O2z1? zc#Px*4!L?O_LtL_gxy%5AJ3ER?KAqsQwtVW#Di>r{U?UJ_hBH;(%#^`amZx#?jL<{*GT)V%<4C2Dt zeGkU_Y=4K02Hrnq0lad>s2(j}p#mKK9~Gx4WTCw&jxk|200w^NaNmfA?wrRQKnb+j zq&^FWu{FZ5J(VKQ`tg%#0aQ&lOMiVW7rEYd0fYk!v7YDh6z#YQ5rBSe~Y|n7~ z;JM^9nB7~+&CCYwg%k_7N{ZYU2TLU%dcnNR#;s^PpC6Il4G)_c&0#EHRI#>3jZ^Cj z<<5Nq@Xipti9xTR?4cAUve~M;myRcMR@=MOJU!rZsgcjx|{J3!v(DIk#+R1EL0ksK0x_jv+hNB~Z20CL}xLB|A>3gYzN z!4&^H;D;psTg4p^K&Tu5BqJ=PZx}N@M4v!6W^$P1LQMB@6g3=_CnJQ+AR8UncG#nE zz{bM?Bg`?aLUC}g=~ha8IJ&=L1Wm?sUNz|1*2GL{k$84c)CU319BfLv3(D5>4TNNL zaC}yumw}FBt2L}SHVQCH0tkw>ra?=9^ZHa|Abij%`e*Q?g8U7l0Ag9Av%f!jibW6+ynhERFv;N^A`tmx0BHh7 zm;jviu=^M%H{s{LQ9njdDEt*N_^V&>!j%g28u3lhwz29XNZ+t%;4lRuB!zv`^LBIE#ogE!i&o`EKs)@7#8=SlWg9bmyp`Pnz7?AOJ^4b1Nc8t8)w71#700 zs|(Uo<0`tV-|TM%tnn-WXnfLz{TZM6^?mG3W5&jTz`^m2Z%j~Bocl6BtZ`E#O73vh z9P68db-Yph-Qm`A@t0Tj7gjcOpzIem3WW_W#r$}Xy)}9budNLeeQS7q*Azi{-@GH` zCcTlvoA}L5D2Uyf$DS;s^xec47hv!v$G|rBxbllDH-7PpU-2^dfOqbn(h!CT9G3TV zA4}mh$-uC2BM?4(c5GP5Kxx`!2#uj6W20rnXul=`R1S5W)J*Sji^<-o1NZ3YB+PPK zLR(^|D3#`_XH^qB3p*vdZ>qYeA?6fVZ*Kj<`lfn?3v`^p(LI&Poec%>;9ZSfiowUZ z5I{{cuIFd`=l!Qv4jz(#2!a@nj1SN1AX%TuANp-PckAeA=UnMPqqwhl-r6Xjw|nMb zsahm+cJ8HW>$#mHU~YW4Q~~N}vNkw8f)Y3g^sTM26L^Q)drI*;WiZ6A04hL`WNwYc zj{q{pS;eXQBC3Ou*j|&nF2mvs4&xmd6GTmeQ5_b) zbp9u$ zNN>g-&UETsSbSnci=whp{9!?Qa(w~XKR!M>YV0jU5ON~s34mKl__)T!t8@8{16!li zssO&I?%X)zAM@QU?7Q5Z+$g;GDh-Yo^#FTY`I$X`hq;-e$vK8kVW*%m6KLyF^{aE| zR<~a6iw!;p5sY4(Gb{Npfbe+@*R74OjjIk4hHD7l8c86@-sl~-TzP!w3ITWuCpT~2 zA(4ak+S*O>1lQE?;_N1W5CTuJ2;RJM(_29UmTacI$JKQ3HLF8C5$h;s}@N=+-&y47`(I;ARym z*bL1$mErNiq4vO1UUO`-U++ly=3ApT#^CM!kdwhQhiWxM#jTsnCXKT%%CB# zhUsGf(G0I4g9_jknmz^qiNGs&)GUJx8i~8f5r-|b;$y<^3d0u!@W#K~xN-#nym6!A zj=+l^C95Caa3KcC6#L3O4YId}@R8fP=1J426~XaA2wv%oK>){1?rB`@tQucf9OspK zd7$KfIHPuC$)I;f9r=Y7y_J7UF7a^Z;f4axvZ2;(d*!G|-&pqFj(dsUqu&liv8Uibh?um3pLiQj_PRd}v($@=^q)jlgdK{|(t;+lUmX_pF7xVl`+5%BOL~N&-tk@C-dK3Kv9a{>;mdV%{FmxpR#w9q zqTa2E_@Nr0?xFbMRRbGL^bI49qJg7pi!h^$&GZ3!FoA_D59uR(x_6VzFcpSy%^^{o zzxy};2hIP-6@)NEAdv^te}PxUsXL;YlvbP;K}InI;lo>gD%I*d43g^*#Lwe!9Hw}Z zgLtaLlYI6z1==@0EMhmT8pbICUUj6J^zPxt!oo|ZEIhn3YVOCMsV>sp*4)C8x{S{b z^84bfeYt%kbx-Ki^iGm@>iK?gAwQ3mAE^1hwfFGh{L6)f`J(pc>aC-EF5lTXG2U{h zj$$=fw&95%q5*t$Ybnq7fQ#F+IwtNq#*7tqbWvlPbI*_PnZ0~IU;M#5^HMaamYofa zvi8?a@T6%Y2(VFGf$WExefe~|@KUY&tL-CdOWqbZ5hQP%Oz_&;ICBWgqrx82=AD~PStEiF#QQe--~#CVJrH+~@ViIwK>%{&#xHOD@|Oaj zG2a~4a3*Gr1aO!p4Bs@nt?an2jRssZX{<6hI8F%%j6%i@V&j^K;t@D*`BUxVdFO$+ z+2{V@R`oiU|ArU55BFa_G`;iuxqP|4qtBww?d3Hk2hQ3syW#mmv#NNouT}5JzSZC9 zs#{AhXAWuA*J1)!zn#O+TSuLFHOenmI-$ym{Z}4)y?q><=y)3SAu}2k?LJcEI43 zzh~tG0w3HE0b~Pw<9}7C_10EQ%WIfDK=Dy|HaNUCI=JRY9}but6NndLGdDUR@`oBJ zSC7CF%#7^uf}?;2$fDi}Sgl-r6(|dZm+STyCUotpjS-9570i3JrcSHb@hl9E2->q5z3&C0~pxX){GMHltT-$gaYKQst4<`y) z;-le7=)LZxbrbR=plSdGYJI65!k0Tsdul(XLRatA-a(#`(83^F$b3MDcR$&y~re z6bd^f?-Nw+t>pEN1?C8)X3b1YLC=;>a8$lH+&GNBk%iehgTxPu)X02sMj4ttES9-H z_UXHE}<+ zGxJg%;;3@#XaWn%-nh&s)+WI9TU-P7)>r`-i9Z-Is(hk>@_x*|;k|ng!4@yxEK%+` zQ<&WY41dm6m;sbhp=O+w?*5uvY>=+8(i-P07b#RH%e$H5ISm^Yae$Dn+Mr{9g|%S^ z$v}XnV|{zITqb$Hy0XlDf=>0{Z4fx2sXy=vkG?Ct^O=>6xwdEkpIZR;7(gg_yqe7 zUU=oZ2Oz0rhQ|>^qHk@2C2$b|Tm%(dTx1DEd;9nyz8*gI3$O<=Xv$5;5*z8eM-z1g z5x;)~0Ixi_a_`0i4naHsnZnX#f&%nK5kPbjMoIk_X$YbME`kWcN>;!Lc5uUZ*^k4~ zUoFm*P9#@8TPYsA^0RQ2Hf1)oU0l{!^2MChjwQonsoTU;u=m#f#&-0#=Wba5&m6$1 zk%;7fnBtbquIKlcq8o+3LU*`Pc2^zm!@X8(i4fF8MG6W)48_CWyKTnJ+HFe33X@T(tBpB3e@Y<6r^)9t(o#2`=7K z1cgUk!08p7xIOJxo;x=vcQ+$ZO?5L@*B6l^oRNcxPaDs`e8P@;;nDC54S$w zC}G_pE~1#}G?Hp-sC z9h#ZIju`~}a>^&1+4!hjwv&|!Q5C!xWuAtste-1B%pc7>k1%-8<_d*kzQv?B<_g*X z^91V3L9zN(G}t@qGc!x`g%VHGfpnU?V=Dq6G&Ns5`T>6}?ZtY&vv{=sJPN?MnWLBU z*o!acAI~d*Sn|cf{!YYsd~pj-V`5o;%c=6m?V?h!Bz(E_&sm@b~cHF0=ON(c?!rgM|l=AFvEs1ev^h?Cjx!!uR(&0srsb z&wu^^3xKB@_}kxBfOalg26=vyd{We9@eNp+2{*L751By5Fvp7+JdG~qCYV40N&%Y~ zk0eqy;%`wn7xQJ@smi&7{NiF~lmkCCSLj40sx^$*DNZ2Qux{qiI8VVxpNzz9&&)$l z?w1HrzN{|lQ~s5Q`x9&wsqW%)@&WU>c=#$RDuQa~=fVCi%+Ff{d91cR6B0qgzxK{e%Sx`unK%{Sxq)%Do&qfR%?n14* z577pT);*eM2z4Ts*mVWLYA*&A(f#lMU!Z{C1ODO{4_NAuGJtDL+79j`V!Ol{af|CmaRz3S1Vr9QkWA2U`Bin;jg0 zca#SJ!3#VHl>MV3cIiZCk$=Z*=Ex57{Kmf7B)I2)aosaV1jtMI1+_q#fjwJf&zYkZ z7r@S=!omJV9#^3o7}~XPcb@1V_~swu0xDKM{}4t}XTCTS-lItMcNX<{=0srRnRCs{ zv7q5l+dLxp@@W6Re)wVQzYYr5=IO5q|P{*ai{oYzdUk zmQDsRTqf*FTEflq+-F=pA3;mLSX>6oxmGDHUd6!*g9nx-@pz5dI$M1bK?XddavlLB_i)nuV+=?s%t zs3w=jnnG6K_~OQ$&ZLM$?JBlry;-Jfq$GE}a)% zF%mm~ZkKd=cUK1g?k@30A87ksn27{Z;qu*i zKCk5-DvTn8Bt6JokAvVYA&4t`&;#6sje)-9rIa#xx-kitaH}M3e)2DlQ9~e zeG0K6h6JvqwO6DU#k)nq58gd$9%XO3jy-1iM1=&f2m1`#kAm?CI_!~126SWqjM5r= z%u%SHvDNc;mqnTGT5Vc3tcR+9jYIU{iS+a=YcUFVSB^syY=a;Oa?wM(;C0(Yzz{?D zxZ9$uU`3BDfFD43m#cpA1n6@BMDV_18T<-G@T=PlAX;L4q4EifxWx3`zWo5T@4*As zK;ZAU20*{eqw#+Nz9$`M?OHUCmoz~OSQyxUvgH%BK>zdlEyT)e08PO&!uUmR#5KzPTNHnVWTtt^F zfGC1JtVXYUAWEpfJkKYCoZmHP6exG)D=k9SuFiJNhh0`ZS=VDgFmOM43SIw{{J?8W zpUNLgAb$X;9zD7J1SVvOQT&8D105w`^uz7j6}yoI``u^}>)xYB)|pn5Mb~&2u67H% zXc3ZOtzoGP+Cz>E0eDy86BBZcuHQT|)58Gfb$Gf%l|HlxnI#UQ+b`#rz3zH+EhtTP zV-IP2u)rE#aN5ImOvFh~=i0UJAIY(n@knsaGKxscBWesB&BdGEc~+_AWi%2Fd*8$B zdpW0T_N+VvefnGgcQ0JHz+dl@0>bpk@)HuGYp8%zo9)p{UT}w;EMO?mSeHd%9c!=Y5vzT4DAeYYLF5F)|J&_%DS9Y2Xn1>*IqijXcv0?i$#}A!ZDPY6Y8<2?VM~6osoM&Ksg`p8c%^g zIN)_S;Pnsa-L*)i}kvE|R(67kV7_0t@sqlb~4g zp_Z@7!H@~xE$(RJ#e9_?UDb|e`g-PNWn(*!WHSa^1Ed6@yUClCOv^o8T?d(3g@ zl&;$Y=}8HOa(36QGfCXC3q8x`NWj~L>r#4XQ9fRHf=gIA(?|GSBNa3VGJ#a!1HS&? za0rDs#K}{i!QYu61hKmg;9X||pQ5$rgCTk$QF+0 zPKtEh(09#VHN*nD>N;L$54IB*yT`Iz=xYq%=PFB%rMiwsDpg5Ou+ko9RZsY9KG=0J zhu;$te4Nkpyzrcg?*87S$FLdMD8mpP=KA%|uws|J@A(8jrvqM7$b>J`LSDXp-T8nY z;r#>~36m%M1>r|{1AV_I`o1Fi;Qjp{{~vZ+a}Wr?fLQ z8utG*JK_rs2?{_?b@&{2sw7%C#_?{AgPwBdSMX=L3Ac@F7e081siPd7+ zvj~m>iIAY6j_9SM&i~vi`0=yP;fj4mgZqMBqz||#b06qu`arL!Lfh!jCpq9w`rhfL z&!l^>TdtoBX{}va^MSU9;rQSJ!v2|wKp6G!1qpMwlOIJ-L=Qz*@WKbz1wVLw#;5Wh zdQSiGAOB%5s5zvggRTZ%2uLIm`1JZySxNjMfY(0%>i56@obdac0sPNDvi@=TgWBWY zi3Z;0IS}{MV~;fOcNK7mr`O5sVz7gN!Q^ulJ}O@kh+pxA0C7N$zkB+bC_Z6m9hm@j zhO`n!6Rz6_7xdckmGc>-K9Va g=O$&%sEhwuYO9PK({@B=&;0}&7lW2S8Vp2}L- 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 f{@))vcBKCgv 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

    PTTeNJK`&)ZLVY_%jKspop`fT-MTNS# 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

    0@cSay22`O?E0+Cqm+^0nNq}DZer~%lC@yb;| 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

    _TcG^*)R0;ds=-aDC{)lb6q6 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

    &c`Agv9RNv~ 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 N002ovPDHLkV1kYOz54(F literal 0 HcmV?d00001 diff --git a/packages/sx05re/emuelec/profile.d/99-emuelec.conf b/packages/sx05re/emuelec/profile.d/99-emuelec.conf index 0134e5a1871..c30e9fa6926 100644 --- a/packages/sx05re/emuelec/profile.d/99-emuelec.conf +++ b/packages/sx05re/emuelec/profile.d/99-emuelec.conf @@ -14,6 +14,32 @@ ES_CONF="/storage/.emulationstation/es_settings.cfg" EE_DEVICE=$(cat /ee_arch) EE_LOG="/emuelec/logs/emuelec.log" + +check_hard_kill() { + PNAME="$1" + if [[ ! -z "$PNAME" ]] && [[ ! -z $(pgrep "$PNAME") ]]; then + killall -9 "$PNAME" + fi +} + +# arg1, 1 = Hides, 0 = Show. +hide_buffer () +{ + echo $1 > /sys/class/graphics/fb1/blank +} + +blank_buffer() +{ + # Blank the buffer. + echo 1 > /sys/class/graphics/fb1/blank + dd if=/dev/zero of=/dev/fb1 bs=8M > /dev/null 2>&1 + echo 0 > /sys/class/graphics/fb1/blank + echo 1 > /sys/class/graphics/fb0/blank + dd if=/dev/zero of=/dev/fb0 bs=32M > /dev/null 2>&1 + echo 0 > /sys/class/graphics/fb0/blank + [[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix +} + aml_ver() { if grep -q "g12b" /proc/device-tree/compatible; then echo "Amlogic-ng" diff --git a/packages/sx05re/emulationstation-addon/config/scripts/emuelecRunEmu.sh b/packages/sx05re/emulationstation-addon/config/scripts/emuelecRunEmu.sh index a95e7f9053b..61a66ee4de5 100755 --- a/packages/sx05re/emulationstation-addon/config/scripts/emuelecRunEmu.sh +++ b/packages/sx05re/emulationstation-addon/config/scripts/emuelecRunEmu.sh @@ -74,9 +74,9 @@ RUNTHIS='/usr/bin/retroarch $VERBOSE -L /tmp/cores/${EMU}_libretro.so --config $ # very WIP { BEZ=$(get_ee_setting bezels.enabled) -[ "$BEZ" == "1" ] && ${TBASH} /usr/bin/bezels.sh "$PLATFORM" "${ROMNAME}" || ${TBASH} /usr/bin/bezels.sh "default" +[ "$BEZ" == "1" ] && ${TBASH} /usr/bin/bezels.sh gameloading "$PLATFORM" "${ROMNAME}" || ${TBASH} gameloading /usr/bin/bezels.sh "default" SPL=$(get_ee_setting splash.enabled) -[ "$SPL" == "1" ] && ${TBASH} /usr/bin/show_splash.sh "$PLATFORM" "${ROMNAME}" || ${TBASH} /usr/bin/show_splash.sh "default" +[ "$SPL" == "1" ] && ${TBASH} /usr/bin/show_splash.sh gameloading "$PLATFORM" "${ROMNAME}" || ${TBASH} gameloading /usr/bin/show_splash.sh "default" # } very WIP diff --git a/packages/sx05re/emulators/PPSSPPSDL/package.mk b/packages/sx05re/emulators/PPSSPPSDL/package.mk index bb3b2da162d..2817ebfa4fb 100644 --- a/packages/sx05re/emulators/PPSSPPSDL/package.mk +++ b/packages/sx05re/emulators/PPSSPPSDL/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="PPSSPPSDL" -PKG_VERSION="3edaeae812ae0e34a51032fb28327e572efcc577" +PKG_VERSION="c8c6b945bc0c24fa9219a341076aca1d52776fda" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" diff --git a/packages/sx05re/emulators/PPSSPPSDL/patches/max-fps-setting.patch b/packages/sx05re/emulators/PPSSPPSDL/patches/max-fps-setting.patch index 3e53563f2d8..b9e6cea3744 100644 --- a/packages/sx05re/emulators/PPSSPPSDL/patches/max-fps-setting.patch +++ b/packages/sx05re/emulators/PPSSPPSDL/patches/max-fps-setting.patch @@ -24,27 +24,6 @@ diff --git a/Core/Config.h b/Core/Config.h int iAnalogFpsLimit; int iAnalogFpsMode; // 0 = auto, 1 = single direction, 2 = mapped to opposite int iMaxRecent; -diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp ---- b/Core/HLE/sceDisplay.cpp -+++ a/Core/HLE/sceDisplay.cpp -@@ -928,7 +928,7 @@ u32 sceDisplaySetFramebuf(u32 topaddr, int linesize, int pixelformat, int sync) - - s64 delayCycles = 0; - // Don't count transitions between display off and display on. -+ if (topaddr != 0 && topaddr != framebuf.topaddr && framebuf.topaddr != 0 && g_Config.iForceMaxEmulatedFPS > 0) { -- if (topaddr != 0 && topaddr != framebuf.topaddr && framebuf.topaddr != 0 && PSP_CoreParameter().compat.flags().ForceMax60FPS) { - // sceDisplaySetFramebuf() isn't supposed to delay threads at all. This is a hack. - // So let's only delay when it's more than 1ms. - const s64 FLIP_DELAY_CYCLES_MIN = usToCycles(1000); -@@ -952,7 +952,7 @@ u32 sceDisplaySetFramebuf(u32 topaddr, int linesize, int pixelformat, int sync) - } - - // 1001 to account for NTSC timing (59.94 fps.) -+ u64 expected = msToCycles(1001) / g_Config.iForceMaxEmulatedFPS - LEEWAY_CYCLES_PER_FLIP; -- u64 expected = msToCycles(1001) / 60 - LEEWAY_CYCLES_PER_FLIP; - lastFlipCycles = now; - nextFlipCycles = std::max(lastFlipCycles, nextFlipCycles) + expected; - } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp --- b/UI/GameSettingsScreen.cpp +++ a/UI/GameSettingsScreen.cpp @@ -183,27 +162,31 @@ diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp MRFIXIT: Add logic for "Auto" (default PSP behavior - pull value from compat.ini) --- b/Core/HLE/sceDisplay.cpp +++ a/Core/HLE/sceDisplay.cpp -@@ -998,8 +998,13 @@ +@@ -821,12 +821,16 @@ + hleEatCycles(290); - s64 delayCycles = 0; -+ + int MaxFPS = g_Config.iForceMaxEmulatedFPS; + if (MaxFPS == 0 && PSP_CoreParameter().compat.flags().ForceMax60FPS) { + MaxFPS = 60; + } + s64 delayCycles = 0; // Don't count transitions between display off and display on. -- if (topaddr != 0 && topaddr != framebuf.topaddr && framebuf.topaddr != 0 && g_Config.iForceMaxEmulatedFPS > 0) { -+ if (topaddr != 0 && topaddr != framebuf.topaddr && framebuf.topaddr != 0 && MaxFPS > 0) { + if (topaddr != 0 && + (topaddr != framebuf.topaddr || PSP_CoreParameter().compat.flags().SplitFramebufferMargin) && + framebuf.topaddr != 0 && +- PSP_CoreParameter().compat.flags().ForceMax60FPS) { ++ MaxFPS > 0) { // sceDisplaySetFramebuf() isn't supposed to delay threads at all. This is a hack. // So let's only delay when it's more than 1ms. const s64 FLIP_DELAY_CYCLES_MIN = usToCycles(1000); -@@ -1023,7 +1028,7 @@ +@@ -850,7 +854,7 @@ } // 1001 to account for NTSC timing (59.94 fps.) -- u64 expected = msToCycles(1001) / g_Config.iForceMaxEmulatedFPS - LEEWAY_CYCLES_PER_FLIP; -+ u64 expected = msToCycles(1001) / MaxFPS - LEEWAY_CYCLES_PER_FLIP; +- u64 expected = msToCycles(1001) / framerate - LEEWAY_CYCLES_PER_FLIP; ++ u64 expected = msToCycles(1001) / g_Config.iForceMaxEmulatedFPS - LEEWAY_CYCLES_PER_FLIP; lastFlipCycles = now; nextFlipCycles = std::max(lastFlipCycles, nextFlipCycles) + expected; } + diff --git a/packages/sx05re/emulators/advancemame/bin/advmame.sh b/packages/sx05re/emulators/advancemame/bin/advmame.sh index e85ce51afe0..bc4b6491dfc 100644 --- a/packages/sx05re/emulators/advancemame/bin/advmame.sh +++ b/packages/sx05re/emulators/advancemame/bin/advmame.sh @@ -48,13 +48,16 @@ if [ "$EE_DEVICE" != "OdroidGoAdvance" ] && [ "$EE_DEVICE" != "GameForce" ]; the "1080p"*) echo "device_video_modeline 1920x1080_60.00 153.234 1920 1968 2121 2168 1080 1127 1130 1178 +hsync +vsync" >> $CONFIG_DIR/advmame.rc ;; - "1280x1024p60hz"*) + "1280x1024p60hz") echo "device_video_modeline 1280x1024_60.00 108.88 1280 1360 1496 1712 1024 1025 1028 1060 +hsync +vsync" >> $CONFIG_DIR/advmame.rc ;; - "1024x768p60hz"*) + "1024x768p60hz") echo "device_video_modeline 1024x768_60.00 64.11 1024 1080 1184 1344 768 769 772 795 +hsync +vsync" >> $CONFIG_DIR/advmame.rc ;; - "640x480p60hz"*) + "800x600p60hz") + echo "device_video_modeline 800x600_60.00 38.22 800 832 912 1024 600 601 604 622 +hsync +vsync" >> $CONFIG_DIR/advmame.rc + ;; + "640x480p60hz") echo "device_video_modeline 640x480_60.00 23.86 640 656 720 800 480 481 484 497 +hsync +vsync" >> $CONFIG_DIR/advmame.rc ;; esac @@ -62,8 +65,15 @@ fi ROMNAME=$(basename $1) AUTOGP=$(get_ee_setting advmame_auto_gamepad) + +# Hack - Set the crash stack size to 0 to prevent program doing a large dump of poo. +CRASH_STACK_SIZE=$( ulimit -c ) + [[ "${AUTOGP}" != "0" ]] && set_advmame_joy.sh "$ROMNAME" +# Hack - Revert crash stack size so it can poo nicely. +ulimit -c $CRASH_STACK_SIZE + ARG=$(echo basename $1 | sed 's/\.[^.]*$//') ARG="$(echo $1 | sed 's=.*/==;s/\.[^.]*$//')" SDL_AUDIODRIVER=alsa advmame $ARG -quiet diff --git a/packages/sx05re/emuelec/bin/set_advmame_joy.sh b/packages/sx05re/emulators/advancemame/bin/set_advmame_joy.sh similarity index 98% rename from packages/sx05re/emuelec/bin/set_advmame_joy.sh rename to packages/sx05re/emulators/advancemame/bin/set_advmame_joy.sh index 0026b8b2db6..55e64eaf0d2 100755 --- a/packages/sx05re/emuelec/bin/set_advmame_joy.sh +++ b/packages/sx05re/emulators/advancemame/bin/set_advmame_joy.sh @@ -12,8 +12,7 @@ CONFIG_DIR="/storage/.advance" CONFIG="${CONFIG_DIR}/advmame.rc" ES_FEATURES="/storage/.config/emulationstation/es_features.cfg" -#source /storage/common.sh "advmame" -source /usr/bin/joy_common.sh "advmame" +source joy_common.sh "advmame" ROMNAME=$1 diff --git a/packages/sx05re/emulators/advancemame/patches/advancemame-fix-vfb-fps.patch b/packages/sx05re/emulators/advancemame/patches/advancemame-fix-vfb-fps.patch new file mode 100644 index 00000000000..fa45908f00b --- /dev/null +++ b/packages/sx05re/emulators/advancemame/patches/advancemame-fix-vfb-fps.patch @@ -0,0 +1,150 @@ +diff --git a/advance/linux/vfb.c b/advance/linux/vfb.c +index c25bca05..7886f78c 100644 +--- a/advance/linux/vfb.c ++++ b/advance/linux/vfb.c +@@ -1707,7 +1707,7 @@ static adv_error fb_wait_vsync_ext(void) + if (ioctl(fb_state.fd, FBIO_WAITFORVSYNC, 0) != 0) { + log_std(("WARNING:video:fb: ioctl(FBIO_WAITFORVSYNC) failed\n")); + /* it may be not supported, it isn't an error */ +- return -1; ++ return -2; + } + + return 0; +@@ -1727,7 +1727,7 @@ static adv_error fb_wait_vsync_api(void) + if (ioctl(fb_state.fd, FBIOGET_VBLANK, &blank) != 0) { + log_std(("WARNING:video:fb: ioctl(FBIOGET_VBLANK) failed\n")); + /* it may be not supported, it isn't an error */ +- return -1; ++ return -2; + } + + if ((blank.flags & FB_VBLANK_HAVE_COUNT) != 0) { +@@ -1803,9 +1803,13 @@ static adv_error fb_wait_vsync_vga(void) + + void fb_wait_vsync(void) + { ++ adv_error res = 0; + switch (fb_state.wait) { +- case fb_wait_ext: +- if (fb_wait_vsync_ext() != 0) { ++ case fb_wait_ext: ++ res = fb_wait_vsync_ext(); ++ if (res != 0) { ++ if (res == -2) ++ break; + ++fb_state.wait_error; + if (fb_state.wait_error > WAIT_ERROR_MAX) + fb_state.wait = fb_wait_none; +@@ -1814,7 +1818,10 @@ void fb_wait_vsync(void) + } + break; + case fb_wait_api: +- if (fb_wait_vsync_api() != 0) { ++ res = fb_wait_vsync_api(); ++ if (res != 0) { ++ if (res == -2) ++ break; + ++fb_state.wait_error; + if (fb_state.wait_error > WAIT_ERROR_MAX) + fb_state.wait = fb_wait_none; +@@ -1834,18 +1841,21 @@ void fb_wait_vsync(void) + break; + #endif + case fb_wait_detect: +- if (fb_wait_vsync_ext() == 0) { ++ res = fb_wait_vsync_ext(); ++ if (res == 0) { + fb_state.wait = fb_wait_ext; + fb_state.wait_error = 0; +- } else if (fb_wait_vsync_api() == 0) { ++ } else if ((res = fb_wait_vsync_api()) && res == 0) { + fb_state.wait = fb_wait_api; + fb_state.wait_error = 0; + #ifdef __i386__ +- } else if (fb_wait_vsync_vga() == 0) { ++ } else if ((res = fb_wait_vsync_vga()) && res == 0) { + fb_state.wait = fb_wait_vga; + fb_state.wait_error = 0; + #endif + } else { ++ if (res==-2) ++ break; + ++fb_state.wait_error; + if (fb_state.wait_error > WAIT_ERROR_MAX) + fb_state.wait = fb_wait_none; +diff --git a/advance/osd/glue.c b/advance/osd/glue.c +index f6990e46..2871270d 100644 +--- a/advance/osd/glue.c ++++ b/advance/osd/glue.c +@@ -110,6 +110,11 @@ static struct advance_glue_context GLUE; + /* MAME internal variables */ + extern char* cheatfile; + extern const char *db_filename; ++ ++#ifndef MESS ++ extern _globals globals; ++#endif ++ + #ifdef MESS + const char* crcfile; + const char* pcrcfile; +@@ -782,6 +787,13 @@ int mame_game_run(struct advance_context* context, const struct mame_option* adv + GLUE.sound_speed = context->video.config.fps_speed_factor; + GLUE.sound_fps = context->video.config.fps_fixed; + ++#ifndef MESS ++ globals.sound_speed = &(GLUE.sound_speed); ++ globals.sound_fps = &(GLUE.sound_fps); ++ globals.fps_speed_factor = &(context->video.config.fps_speed_factor); ++ globals.fps_fixed = context->video.config.fps_fixed; ++#endif ++ + hardware_script_info(mame_game_description(context->game), mame_game_manufacturer(context->game), mame_game_year(context->game), "Loading"); + + r = run_game(game_index); +diff --git a/src/mame.c b/src/mame.c +index 2d7eb97a..b37f5924 100644 +--- a/src/mame.c ++++ b/src/mame.c +@@ -229,6 +229,7 @@ const char *memory_region_names[REGION_MAX] = + "REGION_PLDS" + }; + ++_globals globals; + + /*************************************************************************** + PROTOTYPES +@@ -303,6 +304,14 @@ int run_game(int game) + /* then finish setting up our local machine */ + init_machine(); + ++ printf("globals.fps_fixed: %f",globals.fps_fixed); ++ if (globals.fps_fixed > 0.0 && Machine->refresh_rate != globals.fps_fixed) { ++ *(globals.sound_fps) = globals.fps_fixed; ++ *(globals.fps_speed_factor) *= Machine->refresh_rate / globals.fps_fixed; ++ *(globals.sound_speed) = globals.fps_fixed / Machine->refresh_rate; ++ Machine->refresh_rate = globals.fps_fixed; ++ } ++ + /* load the configuration settings and NVRAM */ + settingsloaded = config_load_settings(); + nvram_load(); +diff --git a/src/mame.h b/src/mame.h +index 2b920a1b..a47751a8 100644 +--- a/src/mame.h ++++ b/src/mame.h +@@ -182,6 +182,13 @@ struct ImageFile + }; + #endif /* MESS */ + ++typedef struct __globals _globals; ++struct __globals { ++ double fps_fixed; ++ double* fps_speed_factor; ++ double* sound_speed; ++ double* sound_fps; ++}; + + /* The host platform should fill these fields with the preferences specified in the GUI */ + /* or on the commandline. */ \ No newline at end of file diff --git a/packages/sx05re/emulators/dolphinSA/package.mk b/packages/sx05re/emulators/dolphinSA/package.mk index 534b420c6f1..3016a598918 100644 --- a/packages/sx05re/emulators/dolphinSA/package.mk +++ b/packages/sx05re/emulators/dolphinSA/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="dolphinSA" -PKG_VERSION="4c2d707538e83c4f0663018f0df17a68f4b433f1" +PKG_VERSION="c297474d87ff8fda965ebc33a3fb1d50b1ecb2af" PKG_ARCH="aarch64" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/dolphin-emu/dolphin" diff --git a/packages/sx05re/emulators/dolphinSA/scripts/set_dolphin_joy.sh b/packages/sx05re/emulators/dolphinSA/scripts/set_dolphin_joy.sh index 0725001190f..40c4634cc3a 100644 --- a/packages/sx05re/emulators/dolphinSA/scripts/set_dolphin_joy.sh +++ b/packages/sx05re/emulators/dolphinSA/scripts/set_dolphin_joy.sh @@ -13,7 +13,7 @@ MAIN_CONFIG=${CONFIG_DIR}/Dolphin.ini CONFIG_TMP=/tmp/jc/GCPadNew.tmp -source /usr/bin/joy_common.sh "dolphin" +source joy_common.sh "dolphin" BTN_H0=$(get_ee_setting dolphin_btn_h0) [[ -z "$BTN_H0" ]] && BTN_H0=6 diff --git a/packages/sx05re/emulators/duckstation/scripts/duckstation.sh b/packages/sx05re/emulators/duckstation/scripts/duckstation.sh index 25f525451a7..3b10da0001d 100755 --- a/packages/sx05re/emulators/duckstation/scripts/duckstation.sh +++ b/packages/sx05re/emulators/duckstation/scripts/duckstation.sh @@ -35,6 +35,11 @@ if [ ! -L "${LOCAL_CONFIG}/duckstation" ]; then ln -sf "${CONFIG_DIR}" "${LOCAL_CONFIG}/duckstation" fi +AUTOGP=$(get_ee_setting duckstation_auto_gamepad) +if [[ "${AUTOGP}" == "1" ]]; then + set_duckstation_joy.sh +fi + if [[ "${1}" == *"duckstation_gui.pbp"* ]]; then duckstation-nogui -fullscreen else diff --git a/packages/sx05re/emulators/duckstation/scripts/set_duckstation_joy.sh b/packages/sx05re/emulators/duckstation/scripts/set_duckstation_joy.sh new file mode 100755 index 00000000000..49c1387a265 --- /dev/null +++ b/packages/sx05re/emulators/duckstation/scripts/set_duckstation_joy.sh @@ -0,0 +1,160 @@ +#!/bin/bash + +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2022-present Langerz82 (https://github.com/Langerz82) + +# Source predefined functions and variables +. /etc/profile + +# Configure ADVMAME players based on ES settings +CONFIG_DIR="/storage/.config/emuelec/configs/duckstation" +CONFIG=${CONFIG_DIR}/settings.ini + +CONFIG_TMP=/tmp/jc/duckstation.tmp + +source /usr/bin/joy_common.sh "duckstation" + +declare -A GC_VALUES=( +[h0.1]="Button11" +[h0.4]="Button12" +[h0.8]="Button13" +[h0.2]="Button14" +[b0]="Button0" +[b1]="Button1" +[b2]="Button2" +[b3]="Button3" +[b4]="Button9" +[b5]="Button10" +[b6]="Button4" +[b7]="Button6" +[b8]="Button5" +[b9]="Button7" +[b10]="Button8" +[b11]="Button11" +[b12]="Button12" +[b13]="Button13" +[b14]="Button14" +[a0]="Axis0" +[a1]="Axis1" +[a2]="+Axis4" +[a3]="Axis2" +[a4]="Axis3" +[a5]="+Axis5" +) + +declare -A GC_BUTTONS=( + [dpleft]="ButtonLeft" + [dpright]="ButtonRight" + [dpup]="ButtonUp" + [dpdown]="ButtonDown" + [x]="ButtonTriangle" + [y]="ButtonSquare" + [a]="ButtonCircle" + [b]="ButtonCross" + [leftshoulder]="ButtonL1" + [rightshoulder]="ButtonR1" + [lefttrigger]="ButtonL2" + [righttrigger]="ButtonR2" + [leftstick]="ButtonL3" + [rightstick]="ButtonR3" + [back]="ButtonSelect" + [start]="ButtonStart" + [guide]="OpenQuickMenu" + [leftx]="AxisLeftX" + [lefty]="AxisLeftY" + [rightx]="AxisRightX" + [righty]="AxisRightY" +) + +declare -A GC_STICKS=( +) + +# Cleans all the inputs for the gamepad with name $GAMEPAD and player $1 +clean_pad() { + [[ -f "${CONFIG_TMP}" ]] && rm "${CONFIG_TMP}" + + local START_DELETING=0 + local GC_REGEX="\[Controller${1}\]" + local LN=1 + [[ ! -f "${CONFIG}" ]] && return + while read -r line; do + if [[ "$line" =~ \[.+\] ]]; then + START_DELETING=0 + fi + local header=$(echo "$line" | grep -E "$GC_REGEX" ) + if [[ ! -z "$header" ]]; then + START_DELETING=1 + fi + if [[ "$START_DELETING" == "1" ]]; then + sed -i "$LN d" "$CONFIG" + else + LN=$(( $LN + 1 )) + fi + done < ${CONFIG} +} + +# Sets pad depending on parameters. +# $1 = Player Number +# $2 = js[0-7] +# $3 = Device GUID +# $4 = Device Name + +set_pad() { + local DEVICE_GUID=$3 + local JOY_NAME="$4" + + echo "DEVICE_GUID=$DEVICE_GUID" + + local GC_CONFIG=$(cat "$GCDB" | grep "$DEVICE_GUID" | grep "platform:Linux" | head -1) + echo "GC_CONFIG=$GC_CONFIG" + [[ -z $GC_CONFIG ]] && return + + touch "${CONFIG_TMP}" + + local GC_MAP=$(echo $GC_CONFIG | cut -d',' -f3-) + + echo -en "\n[Controller${1}]\n" >> ${CONFIG} + declare -i JOY_INDEX=$(( $1 - 1 )) + echo "Type = AnalogController" >> ${CONFIG} + + local LINE_INSERT= + set -f + local GC_ARRAY=(${GC_MAP//,/ }) + for index in "${!GC_ARRAY[@]}" + do + local REC=${GC_ARRAY[$index]} + local BUTTON_INDEX=$(echo $REC | cut -d ":" -f 1) + local TVAL=$(echo $REC | cut -d ":" -f 2) + local BUTTON_VAL=${TVAL:1} + local GC_INDEX="${GC_BUTTONS[$BUTTON_INDEX]}" + local BTN_TYPE=${TVAL:0:1} + local VAL="${GC_VALUES[$TVAL]}" + + # CREATE BUTTON MAPS (inlcuding hats). + if [[ ! -z "$GC_INDEX" ]]; then + if [[ "$BUTTON_INDEX" == "guide" ]]; then + LINE_INSERT="${GC_INDEX} = Controller${JOY_INDEX}/${VAL}" + else + if [[ "$BTN_TYPE" == "b" || "$BTN_TYPE" == "h" ]]; then + [[ ! -z "$VAL" ]] && echo "${GC_INDEX} = Controller${JOY_INDEX}/${VAL}" >> ${CONFIG_TMP} + fi + if [[ "$BTN_TYPE" == "a" ]]; then + [[ ! -z "$VAL" ]] && echo "${GC_INDEX} = Controller${JOY_INDEX}/${VAL}" >> ${CONFIG_TMP} + fi + fi + fi + done + + cat "${CONFIG_TMP}" | sort >> ${CONFIG} + + if [[ ! -z "${LINE_INSERT}" ]]; then + sed -i "/\[Hotkeys\]/c" ${CONFIG} + sed -i "/OpenQuickMenu/c" ${CONFIG} + echo -en "\n[Hotkeys]\n" >> ${CONFIG} + echo "${LINE_INSERT}" >> ${CONFIG} + fi + + rm "${CONFIG_TMP}" +} + +jc_get_players diff --git a/packages/sx05re/emulators/fbneoSA/package.mk b/packages/sx05re/emulators/fbneoSA/package.mk index 03a9336940d..0c4591d2a7a 100644 --- a/packages/sx05re/emulators/fbneoSA/package.mk +++ b/packages/sx05re/emulators/fbneoSA/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2022-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbneoSA" -PKG_VERSION="05f405ef7e9387ad1618bab25ba4af9fbc5ac4e6" +PKG_VERSION="46c5540e68b4c49bf053761ec6c41a5894e95fa3" PKG_ARCH="aarch64" PKG_LICENSE="Custom" PKG_SITE="https://github.com/finalburnneo/FBNeo" diff --git a/packages/sx05re/emulators/flycastsa/package.mk b/packages/sx05re/emulators/flycastsa/package.mk index 20f0ea65d17..b2db6e0e814 100644 --- a/packages/sx05re/emulators/flycastsa/package.mk +++ b/packages/sx05re/emulators/flycastsa/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="flycastsa" -PKG_VERSION="7457db8bba3277dcc9b4ec0c3556847f5082a455" +PKG_VERSION="2b8f5a7b9d55f4d74120196c77eaaf48b8e8d89a" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/flyinghead/flycast" PKG_URL="$PKG_SITE.git" diff --git a/packages/sx05re/emulators/flycastsa/scripts/set_flycast_joy.sh b/packages/sx05re/emulators/flycastsa/scripts/set_flycast_joy.sh index f3dd231931b..b786ef935bb 100644 --- a/packages/sx05re/emulators/flycastsa/scripts/set_flycast_joy.sh +++ b/packages/sx05re/emulators/flycastsa/scripts/set_flycast_joy.sh @@ -11,8 +11,7 @@ CONFIG_DIR="/storage/.config/flycast" EMU_FILE="${CONFIG_DIR}/emu.cfg" MAPPING_DIR="${CONFIG_DIR}/mappings" - -source /usr/bin/joy_common.sh "flycast" +source joy_common.sh "flycast" CONFIG_TMP_A="/tmp/jc/SDLflycastA.tmp" CONFIG_TMP_D="/tmp/jc/SDLflycastD.tmp" @@ -101,6 +100,8 @@ clean_pad() { # $4 = Device Name set_pad() { + echo "set_pad params: $1 $2 $3 $4" + local JSI="$2" local DEVICE_GUID=$3 local JOY_NAME="$4" @@ -111,7 +112,7 @@ set_pad() { sed -i "/device${1}/d" "$EMU_FILE" sed -i "/maple_sdl_joystick_${index}/d" "$EMU_FILE" - local DEVICE="maple_sdl_joystick_${index} = ${index}\ndevice${1} = 0\ndevice${1}.1 = 1\ndevice${1}.2 = 1\n" + local DEVICE="maple_sdl_joystick_${index} = ${JSI:2}\ndevice${1} = 0\ndevice${1}.1 = 1\ndevice${1}.2 = 1\n" [[ "$LN" -gt "0" ]] && LN=$(( LN+1 )) && sed -i "${LN} i ${DEVICE}" "$EMU_FILE" diff --git a/packages/sx05re/emulators/mupen64plus-nx-alt/package.mk b/packages/sx05re/emulators/mupen64plus-nx-alt/package.mk index 7ea90e445b6..d8df43dcd22 100644 --- a/packages/sx05re/emulators/mupen64plus-nx-alt/package.mk +++ b/packages/sx05re/emulators/mupen64plus-nx-alt/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plus-nx-alt" -PKG_VERSION="de17151b4dc53767c71f0739d6248e217d615fb8" -PKG_SHA256="eab353fe5834d256af96f1fdac328b0656bdeeebde111860067a88bf5442bfe2" +PKG_VERSION="c10546e333d57eb2e5a6ccef1e84cb6f9274c526" +PKG_SHA256="df117844881887a07069e54db28af34668d515fa1b707e00837455ffc2f7bd37" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" diff --git a/packages/sx05re/emulators/mupen64plus-nx/package.mk b/packages/sx05re/emulators/mupen64plus-nx/package.mk index 7ea31aaf982..c1c76b3bd26 100644 --- a/packages/sx05re/emulators/mupen64plus-nx/package.mk +++ b/packages/sx05re/emulators/mupen64plus-nx/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="mupen64plus-nx" -PKG_VERSION="9beacb26c543cc88c57ed96ca0a72c1925827870" -PKG_SHA256="a4c39df3c0350d93471e00e9b82bc7284d956e302a94bde64c5e0a1aba653314" +PKG_VERSION="c10546e333d57eb2e5a6ccef1e84cb6f9274c526" +PKG_SHA256="df117844881887a07069e54db28af34668d515fa1b707e00837455ffc2f7bd37" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" diff --git a/packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/m64p.sh b/packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/m64p.sh index 621fcdf98e0..95c2132c472 100755 --- a/packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/m64p.sh +++ b/packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/m64p.sh @@ -67,7 +67,7 @@ fi AUTOGP=$(get_ee_setting mupen64plus_auto_gamepad) if [[ "${AUTOGP}" != "0" ]]; then - /usr/bin/set_mupen64_joy.sh + set_mupen64_joy.sh fi diff --git a/packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/set_mupen64_joy.sh b/packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/set_mupen64_joy.sh index 7537cd5a478..369eda741e9 100644 --- a/packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/set_mupen64_joy.sh +++ b/packages/sx05re/emulators/mupen64plussa/mupen64plussa-core/set_mupen64_joy.sh @@ -11,7 +11,7 @@ CONFIG_DIR="/storage/.config/emuelec/configs/mupen64plussa" CONFIG="${CONFIG_DIR}/mupen64plus.cfg" CONFIG_TMP="/tmp/jc/mupen64.tmp" -source /usr/bin/joy_common.sh "mupen64plus" +source joy_common.sh "mupen64plus" BTN_H0=$(get_ee_setting mupen_btn_h0) [[ -z "$BTN_H0" ]] && BTN_H0=0 @@ -115,6 +115,7 @@ clean_pad() { # $4 = Device Name set_pad() { + local JSI=$2 local DEVICE_GUID=$3 local JOY_NAME="$4" @@ -174,7 +175,7 @@ set_pad() { echo "version = 2.000000" >> ${CONFIG} echo "mode = 0" >> ${CONFIG} local index=$(( $1 - 1 )) - echo "device = $index" >> ${CONFIG} + echo "device = ${JSI:2:1}" >> ${CONFIG} echo "name = \"$JOY_NAME\"" >> ${CONFIG} echo "plugged = True" >> ${CONFIG} echo "plugin = 2" >> ${CONFIG} diff --git a/packages/sx05re/emulators/scummvmsa/package.mk b/packages/sx05re/emulators/scummvmsa/package.mk index 6c297681455..c010ad1db16 100644 --- a/packages/sx05re/emulators/scummvmsa/package.mk +++ b/packages/sx05re/emulators/scummvmsa/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="scummvmsa" -PKG_VERSION="c1482136c6bb6ce5dd76aa7deffd791134d1b125" -PKG_SHA256="f5d4797072219c47b4ac36dafbbff399d4f5f7f464915219666d057b6bd6b089" +PKG_VERSION="aea6f5348a1f7a28ac9cb6c7b16d2612c13d9120" +PKG_SHA256="67c0059686ed110248ff2c7e62c61de92e54234d503fa916ea7cd73907635e02" PKG_REV="1" PKG_LICENSE="GPL2" PKG_SITE="https://github.com/scummvm/scummvm" diff --git a/packages/sx05re/libretro/beetle-pce/package.mk b/packages/sx05re/libretro/beetle-pce/package.mk index 7533f214b5e..74920bb2547 100644 --- a/packages/sx05re/libretro/beetle-pce/package.mk +++ b/packages/sx05re/libretro/beetle-pce/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="beetle-pce" -PKG_VERSION="f2115bd53a87242064fbd722dfeacbc85c80f9ef" -PKG_SHA256="710d8814c87631f45fd29944e18b6d1fc0b5a49664e42d24a023a12d8bc0171d" +PKG_VERSION="cc248db4d2f47d0f255fbc1a3c651df4beb3d835" +PKG_SHA256="35ec999649e4211f97e95390e0329292bd31019984717b9a44f9acc737e96d96" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" diff --git a/packages/sx05re/libretro/fbneo/package.mk b/packages/sx05re/libretro/fbneo/package.mk index 015b5e8e7e6..2739a8ad7d4 100644 --- a/packages/sx05re/libretro/fbneo/package.mk +++ b/packages/sx05re/libretro/fbneo/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="fbneo" -PKG_VERSION="5e3082296110a5e6046c2573482e5313b499c01e" -PKG_SHA256="38fff0d5880879d5594a6f55abaff42208b0dae263fd76573693d2ac6510029f" +PKG_VERSION="80af6d776543b79454d67de6a7e644e798f17da5" +PKG_SHA256="46782ae6322afd59263d7cfadde26ef8d402fb340ae621f8dc7d10d38fe0c9cc" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" diff --git a/packages/sx05re/libretro/flycast/package.mk b/packages/sx05re/libretro/flycast/package.mk index 5657a7c99f4..61ead2fd45d 100644 --- a/packages/sx05re/libretro/flycast/package.mk +++ b/packages/sx05re/libretro/flycast/package.mk @@ -19,7 +19,8 @@ ################################################################################ PKG_NAME="flycast" -PKG_VERSION="7457db8bba3277dcc9b4ec0c3556847f5082a455" +PKG_VERSION="$(get_pkg_version flycastsa)" +PKG_NEED_UNPACK="$(get_pkg_directory flycastsa)" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/flyinghead/flycast" diff --git a/packages/sx05re/libretro/genesis-plus-gx-wide/package.mk b/packages/sx05re/libretro/genesis-plus-gx-wide/package.mk index f1c4fc3fff8..7d5c727ea68 100644 --- a/packages/sx05re/libretro/genesis-plus-gx-wide/package.mk +++ b/packages/sx05re/libretro/genesis-plus-gx-wide/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="genesis-plus-gx-wide" -PKG_VERSION="85c258f1d5656795071ddcb18c46fa01511998be" -PKG_SHA256="1f46f7913141d06b76f5183250f9f918b84720232c4451b4447ed447aabc85a7" +PKG_VERSION="f634cc53fd8dd8c09a24aac5314d147635857e62" +PKG_SHA256="93ae52d407df51908f0b9cae28d29a9652e7a6b0ac4577b8051a5c262dba012a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" diff --git a/packages/sx05re/libretro/genesis-plus-gx/package.mk b/packages/sx05re/libretro/genesis-plus-gx/package.mk index ef400a5d50b..52c09d379a2 100644 --- a/packages/sx05re/libretro/genesis-plus-gx/package.mk +++ b/packages/sx05re/libretro/genesis-plus-gx/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="genesis-plus-gx" -PKG_VERSION="ad92df802d02ffba132c77ea573439b8614ae408" -PKG_SHA256="be8f23cb054d6fbc98007f64b7032d3e84258626bd149fedb915a72c7a00caa9" +PKG_VERSION="5cdb31854074de1662266a0a675866ea7b787b42" +PKG_SHA256="0c146c9861238b361086321eb8564bb2a18181bf13383722dc9fe08ddb872dd7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Non-commercial" diff --git a/packages/sx05re/libretro/mame2003-plus/package.mk b/packages/sx05re/libretro/mame2003-plus/package.mk index 7d5245f6fa1..89e3406e0db 100644 --- a/packages/sx05re/libretro/mame2003-plus/package.mk +++ b/packages/sx05re/libretro/mame2003-plus/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="mame2003-plus" -PKG_VERSION="a05c01bb7e020547e007f79d5e8c399431e0fc0f" -PKG_SHA256="eff1c8913c18d7d9b3706ad2d49035c8b594c7bbc0b2f522ce5cf2c25b0c72a2" +PKG_VERSION="7b2607e05971feae920e9275038413b82820c8dd" +PKG_SHA256="d4dd425cadbbd2affcb809cfdc5722b2de8864d520b94ca566306f9814c6f1a2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MAME" diff --git a/packages/sx05re/libretro/mesen/package.mk b/packages/sx05re/libretro/mesen/package.mk index acb0a1c64a4..7eddb7a3408 100644 --- a/packages/sx05re/libretro/mesen/package.mk +++ b/packages/sx05re/libretro/mesen/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="mesen" -PKG_VERSION="b7278942e0a20f2856c594226f146115d02fab20" -PKG_SHA256="249e731488dbe7823f707c256fe60eb6b75f45cff54adeead193263520ce0d0a" +PKG_VERSION="9b412c1533a6d7eec7b2904775cbd26c21f02119" +PKG_SHA256="9a321c90c82c15158511b3df7a1b6ee8269b42083afa3de33f9947cceb925e7c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv3" diff --git a/packages/sx05re/libretro/mgba/package.mk b/packages/sx05re/libretro/mgba/package.mk index a58f840363f..1768c249ff4 100644 --- a/packages/sx05re/libretro/mgba/package.mk +++ b/packages/sx05re/libretro/mgba/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="mgba" -PKG_VERSION="3990558efec2db4c38dd8607ee79de16584cef7a" -PKG_SHA256="8681fe9aa014be2cfab51c87ffd84612ace55d69811245c1f3db0be0c9f5d278" +PKG_VERSION="db7ace387cdc87d9f2bd4f9f5211c26ce0b07867" +PKG_SHA256="1d782b3c23fbc7395f900527db1591d4e3ba27530c53304a279a3ac9dddbbe4f" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MPLv2.0" diff --git a/packages/sx05re/libretro/nestopia/package.mk b/packages/sx05re/libretro/nestopia/package.mk index 312778caefa..353f651404f 100644 --- a/packages/sx05re/libretro/nestopia/package.mk +++ b/packages/sx05re/libretro/nestopia/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="nestopia" -PKG_VERSION="73702a47f937a5ddca984b6adf827a2cffe778ab" -PKG_SHA256="af4dafbdea9388fe64011596f277d954c91a290c8552a68f37b926cad6525aa9" +PKG_VERSION="a9ee6ca84f04990e209880fe47144e62b14253db" +PKG_SHA256="5d2ce2c19ad5b0e6618a669926a3615ecb0688715cbf268439692cc254eb5d4c" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" diff --git a/packages/sx05re/libretro/parallel-n64/package.mk b/packages/sx05re/libretro/parallel-n64/package.mk index 575ed4803fb..6faebecf36d 100644 --- a/packages/sx05re/libretro/parallel-n64/package.mk +++ b/packages/sx05re/libretro/parallel-n64/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="parallel-n64" -PKG_VERSION="28ef8ff960efef4fc3c462ddc52707e140fee3be" -PKG_SHA256="25689b7c30a8706979eadbeb971107ea3159d4763f50870d79b4e84548b5ee66" +PKG_VERSION="a03fdcba6b2e9993f050b50112f597ce2f44fa2c" +PKG_SHA256="8ac94a0515bac7aeda51ef5cbb5c042d69d4f73960ca0ae8961e7ecbe3d182fa" PKG_REV="2" PKG_LICENSE="GPLv2" PKG_ARCH="arm" diff --git a/packages/sx05re/libretro/pcsx_rearmed/package.mk b/packages/sx05re/libretro/pcsx_rearmed/package.mk index 5b33cf7764f..52f20e5e4be 100644 --- a/packages/sx05re/libretro/pcsx_rearmed/package.mk +++ b/packages/sx05re/libretro/pcsx_rearmed/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="pcsx_rearmed" -PKG_VERSION="c92e039ede56bd75a99fa21f362f8fa1a93e5707" -PKG_SHA256="03b6fe7683c14e21305093494cecccf5c2eb1d3661e63c5f65ba06f644fbd9e9" +PKG_VERSION="c4e6218028f70a1289895eba7d6cc37086c20d5c" +PKG_SHA256="6e31debef73c1c05082af4f108a5577df64f0638713c3200a67076b29c90e85e" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPLv2" diff --git a/packages/sx05re/libretro/picodrive/package.mk b/packages/sx05re/libretro/picodrive/package.mk index 3709a7bf7f3..57053401ec8 100644 --- a/packages/sx05re/libretro/picodrive/package.mk +++ b/packages/sx05re/libretro/picodrive/package.mk @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="picodrive" -PKG_VERSION="2ec448a8ce6b0d929ba43748462109e46ca0bed4" +PKG_VERSION="23e4719638c679033b0f6fba77104b1dc55c6072" PKG_LICENSE="MAME" PKG_SITE="https://github.com/irixxxx/picodrive" PKG_URL="$PKG_SITE.git" diff --git a/packages/sx05re/libretro/ppsspp/package.mk b/packages/sx05re/libretro/ppsspp/package.mk index 469126b9cf9..37bd9591080 100644 --- a/packages/sx05re/libretro/ppsspp/package.mk +++ b/packages/sx05re/libretro/ppsspp/package.mk @@ -19,7 +19,8 @@ ################################################################################ PKG_NAME="ppsspp" -PKG_VERSION="3edaeae812ae0e34a51032fb28327e572efcc577" +PKG_VERSION="$(get_pkg_version PPSSPPSDL)" +PKG_NEED_UNPACK="$(get_pkg_directory PPSSPPSDL)" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/hrydgard/ppsspp" PKG_URL="https://github.com/hrydgard/ppsspp.git" diff --git a/packages/sx05re/libretro/ppsspp/patches/max-fps-setting.patch b/packages/sx05re/libretro/ppsspp/patches/max-fps-setting.patch index 3e53563f2d8..b9e6cea3744 100644 --- a/packages/sx05re/libretro/ppsspp/patches/max-fps-setting.patch +++ b/packages/sx05re/libretro/ppsspp/patches/max-fps-setting.patch @@ -24,27 +24,6 @@ diff --git a/Core/Config.h b/Core/Config.h int iAnalogFpsLimit; int iAnalogFpsMode; // 0 = auto, 1 = single direction, 2 = mapped to opposite int iMaxRecent; -diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp ---- b/Core/HLE/sceDisplay.cpp -+++ a/Core/HLE/sceDisplay.cpp -@@ -928,7 +928,7 @@ u32 sceDisplaySetFramebuf(u32 topaddr, int linesize, int pixelformat, int sync) - - s64 delayCycles = 0; - // Don't count transitions between display off and display on. -+ if (topaddr != 0 && topaddr != framebuf.topaddr && framebuf.topaddr != 0 && g_Config.iForceMaxEmulatedFPS > 0) { -- if (topaddr != 0 && topaddr != framebuf.topaddr && framebuf.topaddr != 0 && PSP_CoreParameter().compat.flags().ForceMax60FPS) { - // sceDisplaySetFramebuf() isn't supposed to delay threads at all. This is a hack. - // So let's only delay when it's more than 1ms. - const s64 FLIP_DELAY_CYCLES_MIN = usToCycles(1000); -@@ -952,7 +952,7 @@ u32 sceDisplaySetFramebuf(u32 topaddr, int linesize, int pixelformat, int sync) - } - - // 1001 to account for NTSC timing (59.94 fps.) -+ u64 expected = msToCycles(1001) / g_Config.iForceMaxEmulatedFPS - LEEWAY_CYCLES_PER_FLIP; -- u64 expected = msToCycles(1001) / 60 - LEEWAY_CYCLES_PER_FLIP; - lastFlipCycles = now; - nextFlipCycles = std::max(lastFlipCycles, nextFlipCycles) + expected; - } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp --- b/UI/GameSettingsScreen.cpp +++ a/UI/GameSettingsScreen.cpp @@ -183,27 +162,31 @@ diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp MRFIXIT: Add logic for "Auto" (default PSP behavior - pull value from compat.ini) --- b/Core/HLE/sceDisplay.cpp +++ a/Core/HLE/sceDisplay.cpp -@@ -998,8 +998,13 @@ +@@ -821,12 +821,16 @@ + hleEatCycles(290); - s64 delayCycles = 0; -+ + int MaxFPS = g_Config.iForceMaxEmulatedFPS; + if (MaxFPS == 0 && PSP_CoreParameter().compat.flags().ForceMax60FPS) { + MaxFPS = 60; + } + s64 delayCycles = 0; // Don't count transitions between display off and display on. -- if (topaddr != 0 && topaddr != framebuf.topaddr && framebuf.topaddr != 0 && g_Config.iForceMaxEmulatedFPS > 0) { -+ if (topaddr != 0 && topaddr != framebuf.topaddr && framebuf.topaddr != 0 && MaxFPS > 0) { + if (topaddr != 0 && + (topaddr != framebuf.topaddr || PSP_CoreParameter().compat.flags().SplitFramebufferMargin) && + framebuf.topaddr != 0 && +- PSP_CoreParameter().compat.flags().ForceMax60FPS) { ++ MaxFPS > 0) { // sceDisplaySetFramebuf() isn't supposed to delay threads at all. This is a hack. // So let's only delay when it's more than 1ms. const s64 FLIP_DELAY_CYCLES_MIN = usToCycles(1000); -@@ -1023,7 +1028,7 @@ +@@ -850,7 +854,7 @@ } // 1001 to account for NTSC timing (59.94 fps.) -- u64 expected = msToCycles(1001) / g_Config.iForceMaxEmulatedFPS - LEEWAY_CYCLES_PER_FLIP; -+ u64 expected = msToCycles(1001) / MaxFPS - LEEWAY_CYCLES_PER_FLIP; +- u64 expected = msToCycles(1001) / framerate - LEEWAY_CYCLES_PER_FLIP; ++ u64 expected = msToCycles(1001) / g_Config.iForceMaxEmulatedFPS - LEEWAY_CYCLES_PER_FLIP; lastFlipCycles = now; nextFlipCycles = std::max(lastFlipCycles, nextFlipCycles) + expected; } + diff --git a/packages/sx05re/libretro/px68k/package.mk b/packages/sx05re/libretro/px68k/package.mk index d2e9dccadd6..9fc1fbb2160 100644 --- a/packages/sx05re/libretro/px68k/package.mk +++ b/packages/sx05re/libretro/px68k/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="px68k" -PKG_VERSION="0183381d655be213d9c27207e1a29ad372a7a16d" -PKG_SHA256="9f26706569d8c9711565cf23a6f5f5683e262f48d8a8e8820514bda0e9680cd9" +PKG_VERSION="4713fcd1753546f7cddf53d216759b9316a3e0b4" +PKG_SHA256="6e554ce429e53024c1da32e4de32b51b7266ae4ea8cfcde7ccffd4ddc19540a7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="Unknown" diff --git a/packages/sx05re/libretro/sameboy/package.mk b/packages/sx05re/libretro/sameboy/package.mk index 2ea4605a100..88265e76988 100644 --- a/packages/sx05re/libretro/sameboy/package.mk +++ b/packages/sx05re/libretro/sameboy/package.mk @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="sameboy" -PKG_VERSION="5dea0784b60b93272333a8b65b9ce0ba8bd576f4" -PKG_SHA256="dc9c34a7253c5234f6c7df23c57ff21ce77df3a64fc5d2445279ccd4773f2957" +PKG_VERSION="09138330990da32362246c7034cf4de2ea0a2a2b" +PKG_SHA256="9ef470c7c6bee83bbeb1e861a1c76b722d78de5e5a3849e7132d03d40fa8828d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="MIT" diff --git a/packages/sx05re/tools/sysutils/gptokeyb/package.mk b/packages/sx05re/tools/sysutils/gptokeyb/package.mk index beb48e04182..06491cd1064 100644 --- a/packages/sx05re/tools/sysutils/gptokeyb/package.mk +++ b/packages/sx05re/tools/sysutils/gptokeyb/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert) PKG_NAME="gptokeyb" -PKG_VERSION="0a9005074b6355bab8bc10a72a8302204e692862" +PKG_VERSION="30b65b0e54e520adfc0b3ce8d13a1ccfaf944595" PKG_ARCH="any" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/EmuELEC/gptokeyb" diff --git a/packages/sx05re/tools/sysutils/rclone/bin/ra_rclone.sh b/packages/sx05re/tools/sysutils/rclone/bin/ra_rclone.sh new file mode 100755 index 00000000000..3feb5b9b0a8 --- /dev/null +++ b/packages/sx05re/tools/sysutils/rclone/bin/ra_rclone.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2019-present Joshua L. (https://github.com/Langerz82) + +# Source predefined functions and variables +. /etc/profile + +ACTION=$1 +PLATFORM=$2 +ROMNAME="$3" + +RA_CONFIG="/storage/.config/retroarch/retroarch.cfg" +RA_RBASE="emuelec:/retroarch-saves" +RC_LOG="/emuelec/logs/rclone.log" +RCLONE_ARGS=" --log-file=${RC_LOG} --log-level DEBUG --transfers 2 --checkers 2 --contimeout 30s --timeout 120s --retries 3 --low-level-retries 10 --stats 1s" + +DEBUG=1 + +rm "$RC_LOG" +touch "${RC_LOG}" + +[[ ! -f "${ROMNAME}" ]] && exit 1 + +[[ $DEBUG == 1 ]] && echo "ROMNAME=${ROMNAME}" >> "$RC_LOG" +BASENAME="${ROMNAME##*/}" +[[ $DEBUG == 1 ]] && echo "BASENAME=${BASENAME}" >> "$RC_LOG" +ROMSTEM="${BASENAME%.*}" +[[ $DEBUG == 1 ]] && echo "ROMSTEM=${ROMSTEM}" >> "$RC_LOG" + +if [[ "$ACTION" == "get" || "$ACTION" == "set" ]]; then + SRM_CONTENT=$(cat "${RA_CONFIG}" | grep savefiles_in_content_dir | cut -d'"' -f2) + if [[ "$SRM_CONTENT" == "true" ]]; then + RA_LSAVES="${ROMNAME%/*}" + else + SAVEFILE_PATH=$(cat "${RA_CONFIG}" | grep savefile_directory | cut -d'"' -f2 | sed -e "s/\/${PLATFORM}$//g" | sed -e "s/^~/\/storage/g" ) + [[ $DEBUG == 1 ]] && echo "SAVEFILE_PATH=${SAVEFILE_PATH}" >> "$RC_LOG" + RA_LSAVES="${SAVEFILE_PATH}" + fi + [[ $DEBUG == 1 ]] && echo "RA_LSAVES=${RA_LSAVES}" >> "$RC_LOG" + SAVESTATE_PATH=$(cat "${RA_CONFIG}" | grep savestate_directory | cut -d'"' -f2 | sed -e "s/\/${PLATFORM}$//g" | sed -e "s/^~/\/storage/g" ) + [[ $DEBUG == 1 ]] && echo "SAVESTATE_PATH=${SAVESTATE_PATH}" >> "$RC_LOG" + + RA_LSTATES="${SAVESTATE_PATH}/${PLATFORM}/" + [[ $DEBUG == 1 ]] && echo "RA_LSTATES=\"${RA_LSTATES}\"" >> "$RC_LOG" + + RA_RSAVES=${RA_RBASE}/saves/${PLATFORM} + [[ $DEBUG == 1 ]] && echo "RA_RSAVES=${RA_RBASE}/saves/${PLATFORM}" >> "$RC_LOG" + + RA_RSTATES=${RA_RBASE}/states/${PLATFORM} + [[ $DEBUG == 1 ]] && echo "RA_RSTATES=${RA_RBASE}/states/${PLATFORM}" >> "$RC_LOG" + +fi + +RUNSYNC=$(get_ee_setting cloudsave "$PLATFORM" "${ROMNAME}") +if [[ "${RUNSYNC}" == "1" ]]; then + rclone mkdir "${RA_RBASE}" + wait + if [[ "$ACTION" == "get" ]]; then + rclone copy ${RCLONE_ARGS} "${RA_RSAVES}/" --include "/${ROMSTEM}.srm" "${RA_LSAVES}" & + rclone copy ${RCLONE_ARGS} "${RA_RSTATES}/" --include "/${ROMSTEM}.state*" "${RA_LSTATES}" & + fi + if [[ "$ACTION" == "set" ]]; then + + SRM="${RA_LSAVES}/${ROMSTEM}.srm" + if [[ -f "$SRM" ]]; then + rclone copy ${RCLONE_ARGS} "${SRM}" "${RA_RSAVES}" & + fc -ln -1 >> "$RC_LOG" + fi + SF_FILES="${RA_LSTATES}${ROMSTEM}.state" + SF_OK=$(ls "$SF_FILES"*) + if [[ ! -z "$SF_OK" ]]; then + rclone copy ${RCLONE_ARGS} "${RA_LSTATES}" --include "/${ROMSTEM}.state*" "${RA_RSTATES}" & + fc -ln -1 >> "$RC_LOG" + fi + fi + wait + LOG_ERROR_TEXT=$(cat ${RC_LOG} \ + | grep -e "ERROR :" -e "Failed to create file system" \ + | grep -v "directory not found") + [[ ! -z "$LOG_ERROR_TEXT" ]] || [[ ! -f "${RC_LOG}" ]] && exit 1 + exit 0 +fi diff --git a/packages/sx05re/tools/sysutils/rclone/package.mk b/packages/sx05re/tools/sysutils/rclone/package.mk index b467c201d18..d5cdcc33b56 100644 --- a/packages/sx05re/tools/sysutils/rclone/package.mk +++ b/packages/sx05re/tools/sysutils/rclone/package.mk @@ -48,6 +48,7 @@ makeinstall_target() { mkdir -p ${INSTALL}/usr/bin/ mkdir -p ${INSTALL}/usr/config/emuelec/configs/rclone cp ${PKG_BUILD}/rclone $INSTALL/usr/bin/ + cp ${PKG_DIR}/bin/ra_rclone.sh $INSTALL/usr/bin cp ${PKG_DIR}/config/emuelec-cloud-filter.cfg ${INSTALL}/usr/config/emuelec/configs/rclone/ ln -sf /emuelec/configs/rclone ${INSTALL}/usr/config/rclone } diff --git a/packages/sx05re/tools/unused/boost_locale/package.mk b/packages/sx05re/tools/unused/boost_locale/package.mk deleted file mode 100644 index 986c1d44e87..00000000000 --- a/packages/sx05re/tools/unused/boost_locale/package.mk +++ /dev/null @@ -1,59 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) - -PKG_NAME="boost_locale" -PKG_VERSION="1_65_1" -PKG_SHA256="9807a5d16566c57fd74fb522764e0b134a8bbe6b6e8967b83afefd30dcd3be81" -PKG_LICENSE="OSS" -PKG_SITE="http://www.boost.org/" -PKG_URL="$SOURCEFORGE_SRC/boost/boost/1.65.1/boost_${PKG_VERSION}.tar.bz2" -PKG_DEPENDS_TARGET="toolchain boost_locale:host Python3 zlib bzip2" -PKG_LONGDESC="boost: Peer-reviewed STL style libraries for C++" -PKG_TOOLCHAIN="manual" -PKG_BUILD_FLAGS="+pic" - -make_host() { - cd tools/build/src/engine - sh build.sh -} - -makeinstall_host() { - mkdir -p $TOOLCHAIN/bin - cp bin.*/bjam $TOOLCHAIN/bin -} - -pre_configure_target() { - export CFLAGS="$CFLAGS -I$SYSROOT_PREFIX/usr/include/$PKG_PYTHON_VERSION" - export CXXFLAGS="$CXXFLAGS -I$SYSROOT_PREFIX/usr/include/$PKG_PYTHON_VERSION" -} - -configure_target() { - sh bootstrap.sh --prefix=/usr \ - --with-bjam=$TOOLCHAIN/bin/bjam \ - --with-python=$TOOLCHAIN/bin/python \ - --with-python-root=$SYSROOT_PREFIX/usr - - echo "using gcc : `$CC -v 2>&1 | tail -n 1 |awk '{print $3}'` : $CC : \"$CFLAGS\" \"$LDFLAGS\" ;" \ - > tools/build/src/user-config.jam - echo "using python : ${PKG_PYTHON_VERSION/#python} : $TOOLCHAIN : $SYSROOT_PREFIX/usr/include : $SYSROOT_PREFIX/usr/lib ;" \ - >> tools/build/src/user-config.jam -} - -makeinstall_target() { - $TOOLCHAIN/bin/bjam -d2 --ignore-site-config \ - --layout=system \ - --prefix=$SYSROOT_PREFIX/usr \ - --toolset=gcc link=static \ - --with-chrono \ - --with-date_time \ - --with-filesystem \ - --with-iostreams \ - --with-python \ - --with-random \ - --with-regex -sICU_PATH="$SYSROOT_PREFIX/usr" \ - --with-locale \ - --with-serialization \ - --with-system \ - --with-thread \ - install -} diff --git a/packages/sysutils/libevdev/package.mk b/packages/sysutils/libevdev/package.mk index 1258d316ed0..8e17765fab7 100644 --- a/packages/sysutils/libevdev/package.mk +++ b/packages/sysutils/libevdev/package.mk @@ -3,15 +3,14 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libevdev" -PKG_VERSION="1.12.1" -PKG_SHA256="1dbba41bc516d3ca7abc0da5b862efe3ea8a7018fa6e9b97ce9d39401b22426c" +PKG_VERSION="1.13.0" +PKG_SHA256="9edf2006cc86a5055279647c38ec923d11a821ee4dc2c3033e8d20e8ee237cd9" PKG_LICENSE="MIT" PKG_SITE="http://www.freedesktop.org/wiki/Software/libevdev/" PKG_URL="http://www.freedesktop.org/software/libevdev/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="libevdev is a wrapper library for evdev devices." PKG_BUILD_FLAGS="+pic" -PKG_TOOLCHAIN="meson" PKG_MESON_OPTS_TARGET=" \ -Ddefault_library=shared \ diff --git a/packages/sysutils/tz/package.mk b/packages/sysutils/tz/package.mk index a420c2bb117..256045baeae 100644 --- a/packages/sysutils/tz/package.mk +++ b/packages/sysutils/tz/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tz" -PKG_VERSION="2022b" -PKG_SHA256="5da3fd3eb51d51d2aa4c599db8a1dd8dff453d79f4881131e35d40707ae1f838" +PKG_VERSION="2022c" +PKG_SHA256="067f0f4bee8e509b3eca502c5bd7c8f98073ab49b6c05654a157cbffd07aa3a4" PKG_LICENSE="Public Domain" PKG_SITE="http://www.iana.org/time-zones" PKG_URL="https://github.com/eggert/tz/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/textproc/jsoncpp/package.mk b/packages/textproc/jsoncpp/package.mk index 062518fedb7..10767d7968f 100644 --- a/packages/textproc/jsoncpp/package.mk +++ b/packages/textproc/jsoncpp/package.mk @@ -10,11 +10,7 @@ PKG_SITE="https://github.com/open-source-parsers/jsoncpp/" PKG_URL="https://github.com/open-source-parsers/jsoncpp/archive/${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A C++ library for interacting with JSON." -PKG_TOOLCHAIN="cmake" PKG_BUILD_FLAGS="+pic" -PKG_CMAKE_OPTS_TARGET="-DJSONCPP_WITH_TESTS=OFF \ - -DJSONCPP_WITH_EXAMPLE=OFF \ - -DBUILD_SHARED_LIBS=OFF \ - -DBUILD_STATIC_LIBS=ON \ - -DBUILD_OBJECT_LIBS=OFF" +PKG_MESON_OPTS_TARGET="-Dtests=false \ + --default-library static" diff --git a/packages/textproc/libidn2/package.mk b/packages/textproc/libidn2/package.mk index b19d52b55af..034b2af8069 100644 --- a/packages/textproc/libidn2/package.mk +++ b/packages/textproc/libidn2/package.mk @@ -2,11 +2,11 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libidn2" -PKG_VERSION="2.3.2" -PKG_SHA256="76940cd4e778e8093579a9d195b25fff5e936e9dc6242068528b437a76764f91" +PKG_VERSION="2.3.3" +PKG_SHA256="f3ac987522c00d33d44b323cae424e2cffcb4c63c6aa6cd1376edacbf1c36eb0" PKG_LICENSE="LGPL3" PKG_SITE="https://www.gnu.org/software/libidn/" -PKG_URL="http://ftpmirror.gnu.org/gnu/libidn/libidn2-${PKG_VERSION}.tar.gz" +PKG_URL="https://ftpmirror.gnu.org/gnu/libidn/libidn2-${PKG_VERSION}.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Free software implementation of IDNA2008, Punycode and TR46." diff --git a/packages/textproc/libxml2/package.mk b/packages/textproc/libxml2/package.mk index 442f27f917b..2c8235b5479 100644 --- a/packages/textproc/libxml2/package.mk +++ b/packages/textproc/libxml2/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libxml2" -PKG_VERSION="2.9.14" -PKG_SHA256="9bd7dae7690b2112033ddb6ad4f454e036fff2d38505c3a5b80427669484c0a4" +PKG_VERSION="2.10.2" +PKG_SHA256="d50e8a55b2797501929d3411b81d5d37ec44e9a4aa58eae9052572977c632d7a" PKG_LICENSE="MIT" PKG_SITE="http://xmlsoft.org" PKG_URL="https://gitlab.gnome.org/GNOME/${PKG_NAME}/-/archive/v${PKG_VERSION}/${PKG_NAME}-v${PKG_VERSION}.tar.bz2" diff --git a/packages/textproc/libxslt/package.mk b/packages/textproc/libxslt/package.mk index dc956382a77..f6bc726fa56 100644 --- a/packages/textproc/libxslt/package.mk +++ b/packages/textproc/libxslt/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libxslt" -PKG_VERSION="1.1.35" -PKG_SHA256="2da1c2954f8a4e844f9d4e9110d1b31d45e7a5f8e9edc61823984861505e6e5d" +PKG_VERSION="1.1.37" +PKG_SHA256="6dbeb21aa8c938e6a39010901c0e84122bb87225b4af31f76feb4e3a5b138a5c" PKG_LICENSE="MIT" PKG_SITE="http://xmlsoft.org/xslt/" PKG_URL="https://gitlab.gnome.org/GNOME/${PKG_NAME}/-/archive/v${PKG_VERSION}/${PKG_NAME}-v${PKG_VERSION}.tar.bz2" diff --git a/packages/textproc/nlohmann-json/package.mk b/packages/textproc/nlohmann-json/package.mk index db311cab17a..dfcb08de496 100644 --- a/packages/textproc/nlohmann-json/package.mk +++ b/packages/textproc/nlohmann-json/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nlohmann-json" -PKG_VERSION="3.10.5" -PKG_SHA256="5daca6ca216495edf89d167f808d1d03c4a4d929cef7da5e10f135ae1540c7e4" +PKG_VERSION="3.11.2" +PKG_SHA256="d69f9deb6a75e2580465c6c4c5111b89c4dc2fa94e3a85fcd2ffcd9a143d9273" PKG_LICENSE="MIT" PKG_SITE="https://nlohmann.github.io/json/" PKG_URL="https://github.com/nlohmann/json/archive/v${PKG_VERSION}.tar.gz" diff --git a/packages/tools/bcm2835-bootloader/package.mk b/packages/tools/bcm2835-bootloader/package.mk index cb7d468a80c..915b5836124 100644 --- a/packages/tools/bcm2835-bootloader/package.mk +++ b/packages/tools/bcm2835-bootloader/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="bcm2835-bootloader" -PKG_VERSION="a75a129d59320b5828791ecc4c1b422fc110d3f1" -PKG_SHA256="6a18c5452697d7995567ca58af9c5332a1012f3e7a575dbc65c1c18878d4f6f6" +PKG_VERSION="ecc243c52789f4d8e837c7300b6effb059dc18c0" +PKG_SHA256="e49c53c8ebc29d1d2c8f0b869cd8f9bf3c3e4076cefdf0b86e0f7b2ce9c37d4b" PKG_ARCH="arm aarch64" PKG_LICENSE="nonfree" PKG_SITE="http://www.broadcom.com" diff --git a/packages/tools/hdparm/package.mk b/packages/tools/hdparm/package.mk index 5cb5169f4be..36d2a0b3fc2 100644 --- a/packages/tools/hdparm/package.mk +++ b/packages/tools/hdparm/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="hdparm" -PKG_VERSION="9.63" -PKG_SHA256="70785deaebba5877a89c123568b41dee990da55fc51420f13f609a1072899691" +PKG_VERSION="9.65" +PKG_SHA256="d14929f910d060932e717e9382425d47c2e7144235a53713d55a94f7de535a4b" PKG_LICENSE="BSD" PKG_SITE="http://sourceforge.net/projects/hdparm/" PKG_URL="${SOURCEFORGE_SRC}/${PKG_NAME}/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.gz" diff --git a/packages/tools/hdparm/patches/hdparm-glibc-2.36.patch b/packages/tools/hdparm/patches/hdparm-glibc-2.36.patch deleted file mode 100644 index d481ead4319..00000000000 --- a/packages/tools/hdparm/patches/hdparm-glibc-2.36.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/hdparm.c 2022-07-13 16:15:50.363620844 +0000 -+++ b/hdparm.c 2022-07-13 16:15:55.453615920 +0000 -@@ -25,7 +25,6 @@ - #include - #include - #include --#include - #include - #include - #include diff --git a/packages/tools/nano/package.mk b/packages/tools/nano/package.mk index b70f7664301..88accdc5a46 100644 --- a/packages/tools/nano/package.mk +++ b/packages/tools/nano/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nano" -PKG_VERSION="6.3" -PKG_SHA256="eb532da4985672730b500f685dbaab885a466d08fbbf7415832b95805e6f8687" +PKG_VERSION="6.4" +PKG_SHA256="4199ae8ca78a7796de56de1a41b821dc47912c0307e9816b56cc317df34661c0" PKG_LICENSE="GPL" PKG_SITE="https://www.nano-editor.org/" PKG_URL="https://www.nano-editor.org/dist/v6/${PKG_NAME}-${PKG_VERSION}.tar.xz" diff --git a/packages/tools/qemu/package.mk b/packages/tools/qemu/package.mk index a980f0ea40f..c2b7807837a 100644 --- a/packages/tools/qemu/package.mk +++ b/packages/tools/qemu/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="qemu" -PKG_VERSION="7.0.0" -PKG_SHA256="f6b375c7951f728402798b0baabb2d86478ca53d44cedbefabbe1c46bf46f839" +PKG_VERSION="7.1.0" +PKG_SHA256="a0634e536bded57cf38ec8a751adb124b89c776fe0846f21ab6c6728f1cbbbe6" PKG_LICENSE="GPL" PKG_SITE="https://www.qemu.org" PKG_URL="https://download.qemu.org/qemu-${PKG_VERSION}.tar.xz" diff --git a/packages/tools/rpi-eeprom/package.mk b/packages/tools/rpi-eeprom/package.mk index d27df6b3b9c..8f20b282989 100644 --- a/packages/tools/rpi-eeprom/package.mk +++ b/packages/tools/rpi-eeprom/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="rpi-eeprom" -PKG_VERSION="4703b71a95738a81592a78463c67c2b1291f9bf9" -PKG_SHA256="a73b65376b7389e71003abdd40a7a196d613ce21dce9d8b8629339005167fd82" +PKG_VERSION="e4f90a89e62051ff658c40c57150d13c7e67553b" +PKG_SHA256="74ec1bd58da1436c2cc61f49724261825fc0f8c15b35f2929fdfb2de1db3211a" PKG_ARCH="arm" PKG_LICENSE="BSD-3/custom" PKG_SITE="https://github.com/raspberrypi/rpi-eeprom" diff --git a/packages/tools/splash-image/package.mk b/packages/tools/splash-image/package.mk index 86eccc55ad5..1f0829280c2 100644 --- a/packages/tools/splash-image/package.mk +++ b/packages/tools/splash-image/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2020 present Team CoreELEC (https://coreelec.org) PKG_NAME="splash-image" -PKG_VERSION="8cd52bd7d422ee31f1a6d1d48ae0b89ca179abdb" -PKG_SHA256="533f9dbf984d8f68ce38740027cba55a9e91241e3dac224e084dfea8b33b6644" +PKG_VERSION="918f0cf9f35ef67e4d340c7ad28d4bba7e442d7d" +PKG_SHA256="bf32728be517584cfeeb59877d4366978878c67c2f582d6dc2e4a788cd6d24cd" PKG_LICENSE="GPL" PKG_SITE="https://coreelec.org" PKG_URL="https://github.com/CoreELEC/splash-image/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/wayland/lib/fcft/package.mk b/packages/wayland/lib/fcft/package.mk index ba10cd691ae..f845357bea0 100644 --- a/packages/wayland/lib/fcft/package.mk +++ b/packages/wayland/lib/fcft/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="fcft" -PKG_VERSION="3.1.2" -PKG_SHA256="f571afe693d3fa11fe36e97c7a2ecbbf9313755ee31c1ec3dcc648796b8e6db0" +PKG_VERSION="3.1.4" +PKG_SHA256="37363f7af0430161902b8d194016366b0fbca3b8353ee26b70c5b7ad8e9602c8" PKG_LICENSE="MIT" PKG_SITE="https://codeberg.org/dnkl/fcft" PKG_URL="https://codeberg.org/dnkl/fcft/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/wayland/lib/tllist/package.mk b/packages/wayland/lib/tllist/package.mk index e99e04174d5..8405d6c0a44 100644 --- a/packages/wayland/lib/tllist/package.mk +++ b/packages/wayland/lib/tllist/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="tllist" -PKG_VERSION="1.0.5" -PKG_SHA256="b0f32c9b2c2015c8d8dd068fd4e8b586aa91ca1670badc274ec962559ee0aadd" +PKG_VERSION="1.1.0" +PKG_SHA256="0e7b7094a02550dd80b7243bcffc3671550b0f1d8ba625e4dff52517827d5d23" PKG_LICENSE="MIT" PKG_SITE="https://codeberg.org/dnkl/tllist" PKG_URL="https://codeberg.org/dnkl/tllist/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/wayland/util/foot/package.mk b/packages/wayland/util/foot/package.mk index a7ef30fc7dc..fce8f89063c 100644 --- a/packages/wayland/util/foot/package.mk +++ b/packages/wayland/util/foot/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="foot" -PKG_VERSION="1.12.1" -PKG_SHA256="14e307ac89454b682bb9f1bc644043779f4462df656034fcc4c1e72b18fbffdd" +PKG_VERSION="1.13.1" +PKG_SHA256="604f777fdaccfc1ee2d20376cc5688a819dcd6b7113725880cc973194fd6c737" PKG_LICENSE="MIT" PKG_SITE="https://codeberg.org/dnkl/foot/" PKG_URL="https://codeberg.org/dnkl/foot/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/wayland/weston/package.mk b/packages/wayland/weston/package.mk index 3ddec39343a..9999639de8e 100644 --- a/packages/wayland/weston/package.mk +++ b/packages/wayland/weston/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="weston" -PKG_VERSION="10.0.1" -PKG_SHA256="8a9e52506a865a7410981b04f8341b89b84106db8531ab1f9fdd37b5dc034115" +PKG_VERSION="10.0.2" +PKG_SHA256="89646ca0d9f8d413c2767e5c3828eaa3fa149c2a105b3729a6894fa7cf1549e7" PKG_LICENSE="MIT" PKG_SITE="https://wayland.freedesktop.org/" PKG_URL="https://gitlab.freedesktop.org/wayland/weston/-/releases/${PKG_VERSION}/downloads/${PKG_NAME}-${PKG_VERSION}.tar.xz" diff --git a/packages/web/nghttp2/package.mk b/packages/web/nghttp2/package.mk index ea8108fa225..532004a96e9 100644 --- a/packages/web/nghttp2/package.mk +++ b/packages/web/nghttp2/package.mk @@ -2,16 +2,19 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nghttp2" -PKG_VERSION="1.48.0" -PKG_SHA256="47d8f30ee4f1bc621566d10362ca1b3ac83a335c63da7144947c806772d016e4" +PKG_VERSION="1.49.0" +PKG_SHA256="b0cfd492bbf0b131c472e8f6501c9f4ee82b51b68130f47b278c0b7c9848a66e" PKG_LICENSE="MIT" PKG_SITE="http://www.linuxfromscratch.org/blfs/view/cvs/basicnet/nghttp2.html" PKG_URL="https://github.com/nghttp2/nghttp2/releases/download/v${PKG_VERSION}/nghttp2-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="nghttp2 is an implementation of HTTP/2 and its header compression algorithm, HPACK." -PKG_TOOLCHAIN="configure" -PKG_CONFIGURE_OPTS_TARGET="--enable-lib-only" +PKG_CMAKE_OPTS_TARGET="-DENABLE_DOC=OFF \ + -DENABLE_FAILMALLOC=OFF \ + -DENABLE_LIB_ONLY=ON \ + -DENABLE_SHARED_LIB=ON \ + -DENABLE_STATIC_LIB=OFF" post_makeinstall_target() { rm -r "${INSTALL}/usr/share" diff --git a/packages/x11/data/xkeyboard-config/package.mk b/packages/x11/data/xkeyboard-config/package.mk index aec5c7c580c..6a5341271b3 100644 --- a/packages/x11/data/xkeyboard-config/package.mk +++ b/packages/x11/data/xkeyboard-config/package.mk @@ -3,14 +3,13 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xkeyboard-config" -PKG_VERSION="2.34" -PKG_SHA256="b321d27686ee7e6610ffe7b56e28d5bbf60625a1f595124cd320c0caa717b8ce" +PKG_VERSION="2.36" +PKG_SHA256="1f1bb1292a161d520a3485d378609277d108cd07cde0327c16811ff54c3e1595" PKG_LICENSE="MIT" -PKG_SITE="http://www.X.org" -PKG_URL="http://www.x.org/releases/individual/data/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" +PKG_SITE="https://www.X.org" +PKG_URL="https://www.x.org/releases/individual/data/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_LONGDESC="X keyboard extension data files." -PKG_TOOLCHAIN="autotools" configure_package() { if [ "${DISPLAYSERVER}" = "x11" ]; then @@ -19,17 +18,13 @@ configure_package() { } pre_configure_target() { - PKG_CONFIGURE_OPTS_TARGET="--without-xsltproc \ - --enable-compat-rules \ - --disable-runtime-deps \ - --enable-nls \ - --disable-rpath \ - --datadir=/usr/lib \ - --with-gnu-ld" + PKG_MESON_OPTS_TARGET="-Dcompat-rules=true \ + -Ddatadir=lib" if [ "${DISPLAYSERVER}" = "x11" ]; then - PKG_CONFIGURE_OPTS_TARGET+=" XKBCOMP=/usr/bin/xkbcomp \ - --with-xkb-base=${XORG_PATH_XKB} \ - --with-xkb-rules-symlink=xorg" + PKG_MESON_OPTS_TARGET+=" -Dxkb-base=${XORG_PATH_XKB} \ + -Dxorg-rules-symlinks=true" + else + PKG_MESON_OPTS_TARGET+=" -Dxorg-rules-symlinks=false" fi } diff --git a/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0001-dont-require-util-macros.patch b/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0001-dont-require-util-macros.patch deleted file mode 100644 index a75bc13437c..00000000000 --- a/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0001-dont-require-util-macros.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff -Naur a/configure.ac b/configure.ac ---- a/configure.ac 2018-01-31 11:06:08.000000000 -0800 -+++ b/configure.ac 2018-12-05 16:32:04.016734637 -0800 -@@ -2,13 +2,6 @@ - AC_CONFIG_SRCDIR(rules/base.xml.in) - AM_INIT_AUTOMAKE([foreign dist-bzip2]) - --# Require X.Org macros 1.12 or later for XORG_WITH_XSLTPROC --m4_ifndef([XORG_MACROS_VERSION], -- [m4_fatal([must install xorg-macros 1.12 or later before -- running autoconf/autogen])]) --XORG_MACROS_VERSION(1.12) --XORG_MANPAGE_SECTIONS --XORG_WITH_XSLTPROC - AC_PROG_SED - - AC_SUBST(VERSION) -diff -Naur a/man/Makefile.am b/man/Makefile.am ---- a/man/Makefile.am 2018-01-31 11:06:08.000000000 -0800 -+++ b/man/Makefile.am 2018-12-05 16:35:35.787618428 -0800 -@@ -1,18 +1,2 @@ - EXTRA_DIST = man.xsl - --if HAVE_XSLTPROC --miscmandir = $(MISC_MAN_DIR) --miscman_PRE = xkeyboard-config.man --miscman_DATA = $(miscman_PRE:man=@MISC_MAN_SUFFIX@) --CLEANFILES = $(miscman_DATA) $(miscman_PRE) --SUFFIXES = .$(MISC_MAN_SUFFIX) .man --MAN_SUBSTS += -e 's|__xkb_base__|$(xkb_base)|g' -- --xkeyboard-config.man: $(top_srcdir)/rules/evdev.xml $(srcdir)/man.xsl -- $(XSLTPROC) -nonet $(srcdir)/man.xsl $(top_srcdir)/rules/evdev.xml > $@ -- --# First sed swaps @appmansuffix@ back to __appmansuffix__ for the MAN_SUBSTS --.man.$(MISC_MAN_SUFFIX): -- $(SED) -e 's|@\(\<[a-z_]*\>\)@|__\1__|g' < $< | $(SED) $(MAN_SUBSTS) > $@ -- --endif diff --git a/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-995.01-2.36-fix-xkb-base-path.patch b/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-995.01-2.36-fix-xkb-base-path.patch new file mode 100644 index 00000000000..ab2682ae1d0 --- /dev/null +++ b/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-995.01-2.36-fix-xkb-base-path.patch @@ -0,0 +1,15 @@ +--- /meson.build ++++ /meson.build +@@ -4,7 +4,10 @@ + meson_version: '>= 0.54.0') + + dir_data = join_paths(get_option('prefix'), get_option('datadir')) +-dir_xkb_base = join_paths(dir_data, 'X11', 'xkb') ++dir_xkb_base = get_option('xkb-base') ++if dir_xkb_base == '' ++ dir_xkb_base = join_paths(dir_data, 'X11', 'xkb') ++endif + dir_xkb_rules = join_paths(dir_xkb_base, 'rules') + dir_man7 = join_paths(get_option('prefix'), get_option('mandir'), 'man7') + dir_pkgconfig = join_paths(dir_data, 'pkgconfig') + diff --git a/packages/x11/lib/libXau/package.mk b/packages/x11/lib/libXau/package.mk index 8753221c267..e476e5e84af 100644 --- a/packages/x11/lib/libXau/package.mk +++ b/packages/x11/lib/libXau/package.mk @@ -3,11 +3,11 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libXau" -PKG_VERSION="1.0.9" -PKG_SHA256="ccf8cbf0dbf676faa2ea0a6d64bcc3b6746064722b606c8c52917ed00dcb73ec" +PKG_VERSION="1.0.10" +PKG_SHA256="8be6f292334d2f87e5b919c001e149a9fdc27005d6b3e053862ac6ebbf1a0c0a" PKG_LICENSE="OSS" -PKG_SITE="http://www.X.org" -PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.bz2" +PKG_SITE="https://www.X.org" +PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros xorgproto" PKG_LONGDESC="X authorization file management libary" PKG_BUILD_FLAGS="+pic" diff --git a/packages/x11/lib/libXfont2/package.mk b/packages/x11/lib/libXfont2/package.mk index 473d8c2d701..4a5ebbb1150 100644 --- a/packages/x11/lib/libXfont2/package.mk +++ b/packages/x11/lib/libXfont2/package.mk @@ -3,11 +3,11 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libXfont2" -PKG_VERSION="2.0.5" -PKG_SHA256="aa7c6f211cf7215c0ab4819ed893dc98034363d7b930b844bb43603c2e10b53e" +PKG_VERSION="2.0.6" +PKG_SHA256="74ca20017eb0fb3f56d8d5e60685f560fc85e5ff3d84c61c4cb891e40c27aef4" PKG_LICENSE="OSS" -PKG_SITE="http://www.X.org" -PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.bz2" +PKG_SITE="https://www.X.org" +PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros xtrans freetype libfontenc" PKG_LONGDESC="X font Library" diff --git a/packages/x11/lib/libfontenc/package.mk b/packages/x11/lib/libfontenc/package.mk index 42cc822e957..a3636661336 100644 --- a/packages/x11/lib/libfontenc/package.mk +++ b/packages/x11/lib/libfontenc/package.mk @@ -3,11 +3,11 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libfontenc" -PKG_VERSION="1.1.4" -PKG_SHA256="2cfcce810ddd48f2e5dc658d28c1808e86dcf303eaff16728b9aa3dbc0092079" +PKG_VERSION="1.1.6" +PKG_SHA256="ea8606ed5255dda8f570b7d1a74d59ee8d198675b2f114d07807431e6ba1d111" PKG_LICENSE="OSS" -PKG_SITE="http://www.X.org" -PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.bz2" +PKG_SITE="https://www.X.org" +PKG_URL="https://xorg.freedesktop.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros zlib font-util xorgproto" PKG_LONGDESC="Libfontenc is a library which helps font libraries portably determine and deal with different encodings of fonts." PKG_BUILD_FLAGS="+pic" diff --git a/packages/x11/lib/libxcvt/package.mk b/packages/x11/lib/libxcvt/package.mk index a2eb0da8bd9..9020f9b20f4 100644 --- a/packages/x11/lib/libxcvt/package.mk +++ b/packages/x11/lib/libxcvt/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libxcvt" -PKG_VERSION="0.1.1" -PKG_SHA256="27ebce180d355f94c1992930bedb40a36f6d7312ee50bf7f0acbcd22f33e8c29" +PKG_VERSION="0.1.2" +PKG_SHA256="0561690544796e25cfbd71806ba1b0d797ffe464e9796411123e79450f71db38" PKG_LICENSE="OSS" PKG_SITE="https://gitlab.freedesktop.org/xorg/lib/libxcvt" PKG_URL="https://www.x.org/archive/individual/lib/${PKG_NAME}-${PKG_VERSION}.tar.xz" diff --git a/packages/x11/proto/xorgproto/package.mk b/packages/x11/proto/xorgproto/package.mk index bf8f77f3f5d..8d1299e5fb1 100644 --- a/packages/x11/proto/xorgproto/package.mk +++ b/packages/x11/proto/xorgproto/package.mk @@ -2,14 +2,13 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xorgproto" -PKG_VERSION="2022.1" -PKG_SHA256="1d2dcc66963f234d2c1e1f8d98a0d3e8725149cdac0a263df4097593c48bc2a6" +PKG_VERSION="2022.2" +PKG_SHA256="5d13dbf2be08f95323985de53352c4f352713860457b95ccaf894a647ac06b9e" PKG_LICENSE="OSS" -PKG_SITE="http://www.X.org" -PKG_URL="https://xorg.freedesktop.org/archive/individual/proto/${PKG_NAME}-${PKG_VERSION}.tar.bz2" +PKG_SITE="https://www.X.org" +PKG_URL="https://xorg.freedesktop.org/archive/individual/proto/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_TARGET="toolchain util-macros" PKG_LONGDESC="combined X.Org X11 Protocol headers" -PKG_TOOLCHAIN="meson" PKG_MESON_OPTS_TARGET="-Dlegacy=false \ -Dpkgconfigdatadir=/usr/lib/pkgconfig" diff --git a/projects/Allwinner/linux/linux.aarch64.conf b/projects/Allwinner/linux/linux.aarch64.conf index 0ec974ea564..2c4e793a033 100644 --- a/projects/Allwinner/linux/linux.aarch64.conf +++ b/projects/Allwinner/linux/linux.aarch64.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.19.0-rc8 Kernel Configuration +# Linux/arm64 5.19.7-rc1 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.1.0 (GCC) 12.1.0" +CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=120100 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y @@ -346,6 +346,7 @@ CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set +# CONFIG_ARM64_ERRATUM_1742098 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y @@ -362,6 +363,7 @@ CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set @@ -613,6 +615,7 @@ CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -2076,7 +2079,7 @@ CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m @@ -4156,7 +4159,6 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set CONFIG_DRM_DISPLAY_CONNECTOR=y -# CONFIG_DRM_FSL_LDB is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set @@ -6531,7 +6533,7 @@ CONFIG_RANDSTRUCT_NONE=y # end of Kernel hardening options # end of Security options -CONFIG_XOR_BLOCKS=y +CONFIG_XOR_BLOCKS=m CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA=y CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA=y CONFIG_CRYPTO=y @@ -6622,7 +6624,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=m CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_CRC64_ROCKSOFT=y CONFIG_CRYPTO_GHASH=y diff --git a/projects/Allwinner/linux/linux.arm.conf b/projects/Allwinner/linux/linux.arm.conf index c46b0980884..26a20447aca 100644 --- a/projects/Allwinner/linux/linux.arm.conf +++ b/projects/Allwinner/linux/linux.arm.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.19.0-rc8 Kernel Configuration +# Linux/arm 5.19.2-rc1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="armv7ve-libreelec-linux-gnueabihf-gcc-12.1.0 (GCC) 12.1.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120100 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -1876,7 +1876,7 @@ CONFIG_USB_IPHETH=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m @@ -3855,7 +3855,6 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set CONFIG_DRM_DISPLAY_CONNECTOR=m -# CONFIG_DRM_FSL_LDB is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set @@ -6167,7 +6166,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=m CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set diff --git a/projects/Allwinner/patches/linux/0009-firmware-arm_scpi-Support-unidirectional-mailbox-cha.patch b/projects/Allwinner/patches/linux/0009-firmware-arm_scpi-Support-unidirectional-mailbox-cha.patch index 8b79ee99243..e09d6d234f0 100644 --- a/projects/Allwinner/patches/linux/0009-firmware-arm_scpi-Support-unidirectional-mailbox-cha.patch +++ b/projects/Allwinner/patches/linux/0009-firmware-arm_scpi-Support-unidirectional-mailbox-cha.patch @@ -55,13 +55,13 @@ Signed-off-by: Samuel Holland static int scpi_remove(struct platform_device *pdev) @@ -913,6 +919,7 @@ static int scpi_probe(struct platform_de - struct resource res; struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; + struct scpi_drvinfo *scpi_drvinfo; + bool use_mbox_names = false; - scpi_info = devm_kzalloc(dev, sizeof(*scpi_info), GFP_KERNEL); - if (!scpi_info) + scpi_drvinfo = devm_kzalloc(dev, sizeof(*scpi_drvinfo), GFP_KERNEL); + if (!scpi_drvinfo) @@ -926,6 +933,14 @@ static int scpi_probe(struct platform_de dev_err(dev, "no mboxes property in '%pOF'\n", np); return -ENODEV; diff --git a/projects/Allwinner/patches/linux/0036-wip-h3-h5-cvbs.patch b/projects/Allwinner/patches/linux/0036-wip-h3-h5-cvbs.patch index 9ec45ed5fe4..cee7200fe7a 100644 --- a/projects/Allwinner/patches/linux/0036-wip-h3-h5-cvbs.patch +++ b/projects/Allwinner/patches/linux/0036-wip-h3-h5-cvbs.patch @@ -1,19 +1,68 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From 24545292c40900c0871381b8697ade70aa9e3bdf Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Wed, 20 Jan 2021 22:15:36 +0100 Subject: [PATCH] wip h3/h5 cvbs --- - arch/arm/boot/dts/sunxi-h3-h5.dtsi | 111 ++++++++++++++++++++- - drivers/clk/sunxi-ng/ccu-sun8i-h3.c | 14 ++- - drivers/gpu/drm/sun4i/Makefile | 2 +- - drivers/gpu/drm/sun4i/sun8i_mixer.c | 42 +++++++- - drivers/gpu/drm/sun4i/sun8i_mixer.h | 5 +- - 6 files changed, 169 insertions(+), 9 deletions(-) + arch/arm/boot/dts/sun8i-h3.dtsi | 22 +++++ + arch/arm/boot/dts/sunxi-h3-h5.dtsi | 95 +++++++++++++++++++- + arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | 22 +++++ + drivers/clk/sunxi-ng/ccu-sun8i-h3.c | 14 ++- + drivers/gpu/drm/sun4i/Makefile | 2 +- + drivers/gpu/drm/sun4i/sun4i_tv.c | 35 +++++++- + drivers/gpu/drm/sun4i/sun8i_mixer.c | 44 ++++++++- + drivers/gpu/drm/sun4i/sun8i_mixer.h | 5 +- + 8 files changed, 227 insertions(+), 12 deletions(-) +diff --git a/arch/arm/boot/dts/sun8i-h3.dtsi b/arch/arm/boot/dts/sun8i-h3.dtsi +index 448dd325f8c3..d896dc5502f5 100644 +--- a/arch/arm/boot/dts/sun8i-h3.dtsi ++++ b/arch/arm/boot/dts/sun8i-h3.dtsi +@@ -252,6 +252,20 @@ ths: thermal-sensor@1c25000 { + nvmem-cell-names = "calibration"; + #thermal-sensor-cells = <0>; + }; ++ ++ tve: tv-encoder@1e00000 { ++ compatible = "allwinner,sun8i-h3-tv-encoder"; ++ reg = <0x01e00000 0x1000>; ++ clocks = <&ccu CLK_BUS_TVE>; ++ resets = <&ccu RST_BUS_TVE>; ++ status = "disabled"; ++ ++ port { ++ tve_in_tcon1: endpoint { ++ remote-endpoint = <&tcon1_out_tve>; ++ }; ++ }; ++ }; + }; + + thermal-zones { +@@ -299,6 +313,10 @@ &mbus { + compatible = "allwinner,sun8i-h3-mbus"; + }; + ++&mixer1 { ++ resets = <&display_clocks RST_WB>; ++}; ++ + &mmc0 { + compatible = "allwinner,sun7i-a20-mmc"; + clocks = <&ccu CLK_BUS_MMC0>, +@@ -346,3 +364,7 @@ &rtc { + &sid { + compatible = "allwinner,sun8i-h3-sid"; + }; ++ ++&tcon1_out_tve { ++ remote-endpoint = <&tve_in_tcon1>; ++}; +diff --git a/arch/arm/boot/dts/sunxi-h3-h5.dtsi b/arch/arm/boot/dts/sunxi-h3-h5.dtsi +index 3d37a6a586b6..152029413784 100644 --- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi +++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi -@@ -119,7 +119,7 @@ +@@ -119,7 +119,7 @@ osc32k: osc32k_clk { de: display-engine { compatible = "allwinner,sun8i-h3-display-engine"; @@ -22,7 +71,7 @@ Subject: [PATCH] wip h3/h5 cvbs status = "disabled"; }; -@@ -163,11 +163,50 @@ +@@ -163,11 +163,50 @@ ports { #size-cells = <0>; mixer0_out: port@1 { @@ -51,7 +100,7 @@ Subject: [PATCH] wip h3/h5 cvbs + <&display_clocks CLK_MIXER1>; + clock-names = "bus", + "mod"; -+ resets = <&display_clocks RST_WB>; ++ /* reset is added by SoC dtsi */ + + ports { + #address-cells = <1>; @@ -74,7 +123,7 @@ Subject: [PATCH] wip h3/h5 cvbs }; }; }; -@@ -196,11 +235,19 @@ +@@ -196,11 +235,19 @@ ports { #size-cells = <0>; tcon0_in: port@0 { @@ -95,7 +144,7 @@ Subject: [PATCH] wip h3/h5 cvbs }; tcon0_out: port@1 { -@@ -216,6 +263,49 @@ +@@ -216,6 +263,48 @@ tcon0_out_hdmi: endpoint@1 { }; }; @@ -136,7 +185,6 @@ Subject: [PATCH] wip h3/h5 cvbs + + tcon1_out_tve: endpoint@1 { + reg = <1>; -+ remote-endpoint = <&tve_in_tcon1>; + }; + }; + }; @@ -145,14 +193,18 @@ Subject: [PATCH] wip h3/h5 cvbs mmc0: mmc@1c0f000 { /* compatible and clocks are in per SoC .dtsi file */ reg = <0x01c0f000 0x1000>; -@@ -831,6 +921,21 @@ - status = "disabled"; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi +index 4f00ae227cce..d30c85948ac5 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi +@@ -197,6 +197,20 @@ ths: thermal-sensor@1c25000 { + nvmem-cell-names = "calibration"; + #thermal-sensor-cells = <1>; }; - -+ tve: tv-encoder@1e00000 { -+ compatible = "allwinner,sun8i-h3-tv-encoder", -+ "allwinner,sun4i-a10-tv-encoder"; -+ reg = <0x01e00000 0x1000>; ++ ++ tve: tv-encoder@1e40000 { ++ compatible = "allwinner,sun50i-h5-tv-encoder"; ++ reg = <0x01e40000 0x1000>; + clocks = <&ccu CLK_BUS_TVE>; + resets = <&ccu RST_BUS_TVE>; + status = "disabled"; @@ -163,13 +215,33 @@ Subject: [PATCH] wip h3/h5 cvbs + }; + }; + }; + }; + + thermal-zones { +@@ -250,6 +264,10 @@ &mbus { + compatible = "allwinner,sun50i-h5-mbus"; + }; + ++&mixer1 { ++ resets = <&display_clocks RST_MIXER1>; ++}; ++ + &mmc0 { + compatible = "allwinner,sun50i-h5-mmc", + "allwinner,sun50i-a64-mmc"; +@@ -285,3 +303,7 @@ &rtc { + &sid { + compatible = "allwinner,sun50i-h5-sid"; + }; + - hdmi: hdmi@1ee0000 { - #sound-dai-cells = <0>; - compatible = "allwinner,sun8i-h3-dw-hdmi", ++&tcon1_out_tve { ++ remote-endpoint = <&tve_in_tcon1>; ++}; +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c +index e058cf691aea..0b0df6d6bc9c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c -@@ -456,8 +456,18 @@ static SUNXI_CCU_M_WITH_MUX_GATE(tcon_cl +@@ -458,8 +458,18 @@ static SUNXI_CCU_M_WITH_MUX_GATE(tcon_clk, "tcon", tcon_parents, CLK_SET_RATE_PARENT); static const char * const tve_parents[] = { "pll-de", "pll-periph1" }; @@ -190,9 +262,11 @@ Subject: [PATCH] wip h3/h5 cvbs static const char * const deinterlace_parents[] = { "pll-periph0", "pll-periph1" }; static SUNXI_CCU_M_WITH_MUX_GATE(deinterlace_clk, "deinterlace", deinterlace_parents, +diff --git a/drivers/gpu/drm/sun4i/Makefile b/drivers/gpu/drm/sun4i/Makefile +index 0d04f2447b01..7b151994e904 100644 --- a/drivers/gpu/drm/sun4i/Makefile +++ b/drivers/gpu/drm/sun4i/Makefile -@@ -16,7 +16,7 @@ sun8i-drm-hdmi-y += sun8i_hdmi_phy_clk. +@@ -16,7 +16,7 @@ sun8i-drm-hdmi-y += sun8i_hdmi_phy_clk.o sun8i-mixer-y += sun8i_mixer.o sun8i_ui_layer.o \ sun8i_vi_layer.o sun8i_ui_scaler.o \ @@ -201,6 +275,97 @@ Subject: [PATCH] wip h3/h5 cvbs sun4i-tcon-y += sun4i_crtc.o sun4i-tcon-y += sun4i_dotclock.o +diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c b/drivers/gpu/drm/sun4i/sun4i_tv.c +index 94883abe0dfd..9c7090a0d52a 100644 +--- a/drivers/gpu/drm/sun4i/sun4i_tv.c ++++ b/drivers/gpu/drm/sun4i/sun4i_tv.c +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -167,6 +168,11 @@ struct tv_mode { + const struct resync_parameters *resync_params; + }; + ++struct sun4i_tv_quirks { ++ unsigned int calibration; ++ unsigned int unknown : 1; ++}; ++ + struct sun4i_tv { + struct drm_connector connector; + struct drm_encoder encoder; +@@ -527,7 +533,7 @@ static const struct regmap_config sun4i_tv_regmap_config = { + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, +- .max_register = SUN4I_TVE_WSS_DATA2_REG, ++ .max_register = 0x400, + .name = "tv-encoder", + }; + +@@ -537,13 +543,19 @@ static int sun4i_tv_bind(struct device *dev, struct device *master, + struct platform_device *pdev = to_platform_device(dev); + struct drm_device *drm = data; + struct sun4i_drv *drv = drm->dev_private; ++ const struct sun4i_tv_quirks *quirks; + struct sun4i_tv *tv; + void __iomem *regs; + int ret; + ++ quirks = of_device_get_match_data(dev); ++ if (!quirks) ++ return -EINVAL; ++ + tv = devm_kzalloc(dev, sizeof(*tv), GFP_KERNEL); + if (!tv) + return -ENOMEM; ++ + tv->drv = drv; + dev_set_drvdata(dev, tv); + +@@ -580,6 +592,11 @@ static int sun4i_tv_bind(struct device *dev, struct device *master, + } + clk_prepare_enable(tv->clk); + ++ if (quirks->calibration) ++ regmap_write(tv->regs, 0x304, quirks->calibration); ++ if (quirks->unknown) ++ regmap_write(tv->regs, 0x30c, 0x00101110); ++ + drm_encoder_helper_add(&tv->encoder, + &sun4i_tv_helper_funcs); + ret = drm_simple_encoder_init(drm, &tv->encoder, +@@ -648,8 +665,22 @@ static int sun4i_tv_remove(struct platform_device *pdev) + return 0; + } + ++static const struct sun4i_tv_quirks a10_quirks = { ++}; ++ ++static const struct sun4i_tv_quirks h3_quirks = { ++ .calibration = 0x02000c00, ++}; ++ ++static const struct sun4i_tv_quirks h5_quirks = { ++ .calibration = 0x02850000, ++ .unknown = 1, ++}; ++ + static const struct of_device_id sun4i_tv_of_table[] = { +- { .compatible = "allwinner,sun4i-a10-tv-encoder" }, ++ { .compatible = "allwinner,sun4i-a10-tv-encoder", .data = &a10_quirks }, ++ { .compatible = "allwinner,sun8i-h3-tv-encoder", .data = &h3_quirks }, ++ { .compatible = "allwinner,sun50i-h5-tv-encoder", .data = &h5_quirks }, + { } + }; + MODULE_DEVICE_TABLE(of, sun4i_tv_of_table); +diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c b/drivers/gpu/drm/sun4i/sun8i_mixer.c +index f5291170bf5e..490e8e74450f 100644 --- a/drivers/gpu/drm/sun4i/sun8i_mixer.c +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c @@ -32,6 +32,12 @@ struct de2_fmt_info { @@ -216,7 +381,7 @@ Subject: [PATCH] wip h3/h5 cvbs static const struct de2_fmt_info de2_formats[] = { { .drm_fmt = DRM_FORMAT_ARGB8888, -@@ -341,10 +347,29 @@ static void sun8i_mixer_mode_set(struct +@@ -327,10 +333,29 @@ static void sun8i_mixer_mode_set(struct sunxi_engine *engine, interlaced ? "on" : "off"); } @@ -249,7 +414,7 @@ Subject: [PATCH] wip h3/h5 cvbs }; static bool sun8i_mixer_volatile_reg(struct device *dev, unsigned int reg) -@@ -608,6 +633,15 @@ static const struct sun8i_mixer_cfg sun8 +@@ -600,6 +625,15 @@ static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = { .vi_num = 1, }; @@ -263,22 +428,24 @@ Subject: [PATCH] wip h3/h5 cvbs +}; + static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = { - .ccsc = 0, + .ccsc = CCSC_MIXER0_LAYOUT, .mod_rate = 297000000, -@@ -677,6 +711,10 @@ static const struct of_device_id sun8i_m +@@ -686,6 +720,10 @@ static const struct of_device_id sun8i_mixer_of_table[] = { + .compatible = "allwinner,sun8i-h3-de2-mixer-0", .data = &sun8i_h3_mixer0_cfg, }, - { ++ { + .compatible = "allwinner,sun8i-h3-de2-mixer-1", + .data = &sun8i_h3_mixer1_cfg, + }, -+ { + { .compatible = "allwinner,sun8i-r40-de2-mixer-0", .data = &sun8i_r40_mixer0_cfg, - }, +diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.h b/drivers/gpu/drm/sun4i/sun8i_mixer.h +index 85c94884fb9a..28cdaf0044d9 100644 --- a/drivers/gpu/drm/sun4i/sun8i_mixer.h +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.h -@@ -120,6 +120,10 @@ +@@ -118,6 +118,10 @@ /* format 20 is packed YVU444 10-bit */ /* format 21 is packed YUV444 10-bit */ @@ -289,7 +456,7 @@ Subject: [PATCH] wip h3/h5 cvbs /* * Sub-engines listed bellow are unused for now. The EN registers are here only * to be used to disable these sub-engines. -@@ -130,7 +134,6 @@ +@@ -128,7 +132,6 @@ #define SUN8I_MIXER_PEAK_EN 0xa6000 #define SUN8I_MIXER_ASE_EN 0xa8000 #define SUN8I_MIXER_FCC_EN 0xaa000 @@ -297,3 +464,6 @@ Subject: [PATCH] wip h3/h5 cvbs #define SUN50I_MIXER_FCE_EN 0x70000 #define SUN50I_MIXER_PEAK_EN 0x70800 +-- +2.37.3 + diff --git a/projects/Allwinner/patches/linux/0098-media-hantro-sunxi-Enable-10-bit-decoding.patch b/projects/Allwinner/patches/linux/0098-media-hantro-sunxi-Enable-10-bit-decoding.patch index e4057e3fe75..6065b8059bd 100644 --- a/projects/Allwinner/patches/linux/0098-media-hantro-sunxi-Enable-10-bit-decoding.patch +++ b/projects/Allwinner/patches/linux/0098-media-hantro-sunxi-Enable-10-bit-decoding.patch @@ -1,28 +1,39 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From e4b8d13f19b988a17de0226f3f8a7d03e72eac37 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec -Date: Sun, 27 Feb 2022 15:21:05 +0100 +Date: Wed, 6 Jul 2022 19:29:01 +0100 Subject: [PATCH] media: hantro: sunxi: Enable 10-bit decoding Now that infrastructure for 10-bit decoding exists, enable it for Allwinner H6. +Tested-by: Benjamin Gaignard Signed-off-by: Jernej Skrabec +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab --- - drivers/staging/media/hantro/sunxi_vpu_hw.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) + drivers/staging/media/hantro/sunxi_vpu_hw.c | 27 +++++++++++++++++++++ + 1 file changed, 27 insertions(+) diff --git a/drivers/staging/media/hantro/sunxi_vpu_hw.c b/drivers/staging/media/hantro/sunxi_vpu_hw.c -index c0edd5856a0c..8d8a8937d6aa 100644 +index fbeac81e59e133..02ce8b064a8f0c 100644 --- a/drivers/staging/media/hantro/sunxi_vpu_hw.c +++ b/drivers/staging/media/hantro/sunxi_vpu_hw.c -@@ -15,12 +15,23 @@ static const struct hantro_fmt sunxi_vpu_postproc_fmts[] = { - .codec_mode = HANTRO_MODE_NONE, - .postprocessed = true, +@@ -23,12 +23,39 @@ static const struct hantro_fmt sunxi_vpu_postproc_fmts[] = { + .step_height = 32, + }, }, + { + .fourcc = V4L2_PIX_FMT_P010, + .codec_mode = HANTRO_MODE_NONE, + .postprocessed = true, ++ .frmsize = { ++ .min_width = FMT_MIN_WIDTH, ++ .max_width = FMT_UHD_WIDTH, ++ .step_width = 32, ++ .min_height = FMT_MIN_HEIGHT, ++ .max_height = FMT_UHD_HEIGHT, ++ .step_height = 32, ++ }, + }, }; @@ -31,11 +42,19 @@ index c0edd5856a0c..8d8a8937d6aa 100644 .fourcc = V4L2_PIX_FMT_NV12_4L4, .codec_mode = HANTRO_MODE_NONE, + .match_depth = true, ++ .frmsize = { ++ .min_width = FMT_MIN_WIDTH, ++ .max_width = FMT_UHD_WIDTH, ++ .step_width = 32, ++ .min_height = FMT_MIN_HEIGHT, ++ .max_height = FMT_UHD_HEIGHT, ++ .step_height = 32, ++ }, + }, + { + .fourcc = V4L2_PIX_FMT_P010_4L4, + .codec_mode = HANTRO_MODE_NONE, + .match_depth = true, - }, - { - .fourcc = V4L2_PIX_FMT_VP9_FRAME, + .frmsize = { + .min_width = FMT_MIN_WIDTH, + .max_width = FMT_UHD_WIDTH, diff --git a/projects/Amlogic-ce/devices/Amlogic-ng/bootloader/dtb.conf b/projects/Amlogic-ce/devices/Amlogic-ng/bootloader/dtb.conf index 1ebacaba375..28570a87037 100644 --- a/projects/Amlogic-ce/devices/Amlogic-ng/bootloader/dtb.conf +++ b/projects/Amlogic-ce/devices/Amlogic-ng/bootloader/dtb.conf @@ -40,6 +40,10 @@ gxl_p212_1g_lepotato.dtb gxl_p212_2g_lepotato.dtb + + g12b_a311d_bananapi_m2s.dtb + g12b_s922x_bananapi_m2s.dtb + g12b_s922x_odroid_n2 fdtput -t s -a g12b_w400_a $BOOT_ROOT/dtb.img /dvb status okay diff --git a/projects/Amlogic-ce/devices/Amlogic-ng/filesystem/usr/lib/udev/hwdb.d/99-buzztv-bt-400-rf.hwdb b/projects/Amlogic-ce/devices/Amlogic-ng/filesystem/usr/lib/udev/hwdb.d/99-buzztv-bt-400-rf.hwdb new file mode 100644 index 00000000000..3f57587dcd4 --- /dev/null +++ b/projects/Amlogic-ce/devices/Amlogic-ng/filesystem/usr/lib/udev/hwdb.d/99-buzztv-bt-400-rf.hwdb @@ -0,0 +1,11 @@ +# BuzzTV BT-300/BT-400 smart remote +evdev:input:b0005v0957p1001* + KEYBOARD_KEY_c0040=c + KEYBOARD_KEY_c0041=enter + KEYBOARD_KEY_70040=z + KEYBOARD_KEY_70041=esc + KEYBOARD_KEY_70042=t + KEYBOARD_KEY_70043=e + KEYBOARD_KEY_70044=o + KEYBOARD_KEY_70045=volumeup + KEYBOARD_KEY_70069=volumedown diff --git a/projects/Amlogic-ce/devices/Amlogic-ng/linux/linux.aarch64.conf b/projects/Amlogic-ce/devices/Amlogic-ng/linux/linux.aarch64.conf index b3cb6a99a96..092c0e8a52d 100644 --- a/projects/Amlogic-ce/devices/Amlogic-ng/linux/linux.aarch64.conf +++ b/projects/Amlogic-ce/devices/Amlogic-ng/linux/linux.aarch64.conf @@ -2418,6 +2418,7 @@ CONFIG_MICROCHIP_PHY=m # CONFIG_NATIONAL_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y +CONFIG_MAXIO_PHY=y # CONFIG_SMSC_PHY is not set # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set diff --git a/projects/Amlogic-ce/devices/Amlogic-ng/options b/projects/Amlogic-ce/devices/Amlogic-ng/options index ac651ae6135..eea1d7df5d2 100644 --- a/projects/Amlogic-ce/devices/Amlogic-ng/options +++ b/projects/Amlogic-ce/devices/Amlogic-ng/options @@ -113,7 +113,7 @@ ADDITIONAL_DRIVERS+=" gpu-aml openvfd-driver wifi_dummy-aml media_modules-aml ap6xxx-aml ssv6xxx-aml mt7668-aml RTL8188FTV-aml RTL8189ES-aml RTL8189FS-aml RTL8723BS-aml RTL8814AU RTL8822BU-aml RTL8822BS-aml RTL8822CS-aml RTL8152-aml - RTL8821CS-aml qca9377-aml qca6174-aml smartchip uwe5631-aml" + RTL8821CS-aml RTL8852BS-aml qca9377-aml qca6174-aml smartchip uwe5631-aml" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, diff --git a/projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8852BS-aml/package.mk b/projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8852BS-aml/package.mk new file mode 100644 index 00000000000..75bb7c2b210 --- /dev/null +++ b/projects/Amlogic-ce/packages/linux-drivers/amlogic/RTL8852BS-aml/package.mk @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2022-present Team CoreELEC (https://coreelec.org) + +PKG_NAME="RTL8852BS-aml" +PKG_VERSION="dd202f37cbffb0e93ba15746d373a87228334e5f" +PKG_SHA256="0acc9c0eb4203e690b4254cd563526b7aabfc7d43ec85dc7f2f5ef54212e0b41" +PKG_ARCH="arm aarch64" +PKG_LICENSE="GPL" +PKG_SITE="https://github.com/Stane1983/rtl8852bs-aml" +PKG_URL="https://github.com/Stane1983/rtl8852bs-aml/archive/$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain linux" +PKG_NEED_UNPACK="${LINUX_DEPENDS}" +PKG_LONGDESC="Realtek RTL8852BS Linux driver" +PKG_IS_KERNEL_PKG="yes" +PKG_TOOLCHAIN="manual" + +post_unpack() { + sed -i 's/#define DEFAULT_RANDOM_MACADDR.*/#define DEFAULT_RANDOM_MACADDR 0/g' ${PKG_BUILD}/core/rtw_ieee80211.c +} + +make_target() { + kernel_make -C ${PKG_BUILD} \ + M=${PKG_BUILD} \ + KSRC=$(kernel_path) \ + CONFIG_POWER_SAVE=n \ + CONFIG_RTW_DEBUG=n \ + modules +} + +makeinstall_target() { + mkdir -p ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} + find ${PKG_BUILD}/ -name \*.ko -not -path '*/\.*' -exec cp {} ${INSTALL}/$(get_full_module_dir)/${PKG_NAME} \; +} diff --git a/projects/Amlogic-ce/packages/linux-drivers/amlogic/ap6xxx-aml/package.mk b/projects/Amlogic-ce/packages/linux-drivers/amlogic/ap6xxx-aml/package.mk index ae4410264de..005376ac40d 100644 --- a/projects/Amlogic-ce/packages/linux-drivers/amlogic/ap6xxx-aml/package.mk +++ b/projects/Amlogic-ce/packages/linux-drivers/amlogic/ap6xxx-aml/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="ap6xxx-aml" -PKG_VERSION="2b3ff5b064a65af0bad3d8fad15f41f0d16e856d" -PKG_SHA256="8d5c08396b2d78d9af6a2c93fa8a06cac30d88c4ba4f2f4b8ebe4ffff03720a7" +PKG_VERSION="91a6e2bd2ff5e52377190fea04a0433bdbe4e948" +PKG_SHA256="c1f96870858bd80adadb87a526286a2d82ed52da617b210af51db12def0d4725" PKG_ARCH="arm aarch64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/ap6xxx-aml" diff --git a/projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/system.d/sprd_sdio-firmware-aml.service b/projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/system.d/sprd_sdio-firmware-aml.service index 06be06fb4d8..c353fc7414f 100644 --- a/projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/system.d/sprd_sdio-firmware-aml.service +++ b/projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/system.d/sprd_sdio-firmware-aml.service @@ -1,5 +1,7 @@ [Unit] Description=Attach /dev/ttyBT0 to BlueZ stack using sprd type +ConditionPathExists=|!/sys/class/mmc_host/sdio/sdio:8800 +ConditionPathExists=|!/sys/class/mmc_host/mmc2/mmc2:8800 Wants=bluetooth.service Before=bluetooth.service After=dev-ttyBT0.device diff --git a/projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/udev.d/80-unisoc_sdio.rules b/projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/udev.d/80-unisoc_sdio.rules index 6f29c8eb963..58bb8073c91 100644 --- a/projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/udev.d/80-unisoc_sdio.rules +++ b/projects/Amlogic-ce/packages/linux-drivers/amlogic/uwe5631-aml/udev.d/80-unisoc_sdio.rules @@ -1,4 +1,5 @@ ### UniSOC UWE5631 and UWE5621 kernel modules ACTION=="add", ENV{SUBSYSTEM}=="sdio", ENV{OF_NAME}=="wifi", ENV{OF_COMPATIBLE_0}=="sprd,unisoc-wifi", \ - RUN{builtin}+="kmod load sprdwl_ng sprdbt_tty hci_uart" \ + ATTRS{vendor}=="0x0000", ATTRS{device}=="0x0000", \ + RUN{builtin}+="kmod load sprdwl_ng sprdbt_tty hci_uart", \ TAG+="systemd", ENV{SYSTEMD_WANTS}+="sprd_sdio-firmware-aml.service" diff --git a/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/package.mk b/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/package.mk index ddfa9f3e32b..fa9f50c787c 100644 --- a/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/package.mk +++ b/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2018-present Arthur Liberman (arthur_liberman@hotmail.com) PKG_NAME="openvfd-driver" -PKG_VERSION="766c6a948836bbf350bd90917fc925079e297e6e" -PKG_SHA256="99fcd3b5be248edd51c1cd2176f0debbaab079c6d7626c01295163a030fac2ea" +PKG_VERSION="62135111742d5a5e531cb5c044b19a1866bf52b0" +PKG_SHA256="c5f06ae3f25e1b3c8e6cb40ecac2a1d689aa83f482c232f5be181727bffe4cd6" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/arthur-liberman/linux_openvfd" PKG_URL="https://github.com/arthur-liberman/linux_openvfd/archive/$PKG_VERSION.tar.gz" diff --git a/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/scripts/openvfd-start b/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/scripts/openvfd-start index 05c070d5a61..14a649f32c4 100755 --- a/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/scripts/openvfd-start +++ b/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/scripts/openvfd-start @@ -1,5 +1,6 @@ #!/bin/sh +OSRELEASEFILE="/etc/os-release" USRCONFFILE="/storage/.config/vfd.conf" SYSCONFDIR="/etc/openvfd.conf.d" PROC_DT="/proc/device-tree" @@ -19,6 +20,11 @@ if [ "$(tr -d '\0' < $PROC_DT/openvfd/compatible)" = "open,vfd" ]; then else exit 0 fi + OS_SPLASH_OPT="" + if [ -f "$OSRELEASEFILE" ]; then + source "$OSRELEASEFILE" + OS_SPLASH_OPT="-s CE${VERSION_ID%%.*}" + fi /sbin/modprobe openvfd vfd_gpio_clk=${vfd_gpio_clk} \ vfd_gpio_dat=${vfd_gpio_dat} \ vfd_gpio_stb=${vfd_gpio_stb:-0,0,0xFF} \ @@ -29,5 +35,5 @@ if [ "$(tr -d '\0' < $PROC_DT/openvfd/compatible)" = "open,vfd" ]; then vfd_gpio_protocol=${vfd_gpio_protocol:-0,0} \ vfd_chars=${vfd_chars} vfd_dot_bits=${vfd_dot_bits} \ vfd_display_type=${vfd_display_type} - /usr/sbin/OpenVFDService ${clock_12h_format:+-12h} + /usr/sbin/OpenVFDService $OS_SPLASH_OPT ${clock_12h_format:+-12h} fi diff --git a/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/system.d/openvfd.service b/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/system.d/openvfd.service index 2ccdefacff8..cabf58cf6b7 100644 --- a/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/system.d/openvfd.service +++ b/projects/Amlogic-ce/packages/linux-drivers/openvfd-driver/system.d/openvfd.service @@ -1,7 +1,7 @@ [Unit] Description=OpenVFD Service ConditionPathExists=/proc/device-tree/openvfd/ -After=kodi-autostart.service +After=local-fs.target [Service] ExecStart=/usr/lib/coreelec/openvfd-start diff --git a/projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/package.mk b/projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/package.mk index 866a7ede7b0..98c8d9ce2dd 100644 --- a/projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/package.mk +++ b/projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="rtkbt-firmware-aml" -PKG_VERSION="763c7195bb0328b45a5679e212ab05150361cc3a" -PKG_SHA256="2996dd867990a14b8d431c789285363ff35f4f2304ce8c92db401122ec43db9a" +PKG_VERSION="4d95579f256383af2df39d796f38a91ee6ec0b80" +PKG_SHA256="7a2884532969f84596f469cde599b8ecc026e80263ae64c9faf0e22a0332f569" PKG_LICENSE="GPL" PKG_SITE="https://github.com/CoreELEC/rtkbt-firmware-aml" PKG_URL="https://github.com/CoreELEC/rtkbt-firmware-aml/archive/$PKG_VERSION.tar.gz" diff --git a/projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/udev.d/80-rtkbt-firmware-aml.rules b/projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/udev.d/80-rtkbt-firmware-aml.rules index e13046e7fd5..fd56b2a6b3e 100644 --- a/projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/udev.d/80-rtkbt-firmware-aml.rules +++ b/projects/Amlogic-ce/packages/linux-firmware/amlogic/rtkbt-firmware-aml/udev.d/80-rtkbt-firmware-aml.rules @@ -6,6 +6,7 @@ ACTION!="add", GOTO="end" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb723", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb822", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xc822", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" +SUBSYSTEMS=="sdio", ATTRS{vendor}=="0x024c", ATTRS{device}=="0xb852", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rtkbt-firmware-aml.service" GOTO="end" LABEL="end" diff --git a/projects/Amlogic-ce/packages/linux/package.mk b/projects/Amlogic-ce/packages/linux/package.mk index 2a98e9138d1..902fe0cdb2f 100644 --- a/projects/Amlogic-ce/packages/linux/package.mk +++ b/projects/Amlogic-ce/packages/linux/package.mk @@ -25,8 +25,8 @@ case "$LINUX" in PKG_BUILD_PERF="no" ;; amlogic-4.9) - PKG_VERSION="f1a3dba498163464f1612dab32ffc962ce10145c" - PKG_SHA256="b5bd4837e6c1a1e02463f996b87a6d39a2f414e6ea1c58db793e69f2d3520d9e" + PKG_VERSION="c916841ec732f6423c1770d0099e0f9fcae456d2" + PKG_SHA256="cfa0b1f96113fbc610b0bcddfa7fbf63df0ade68a2e80d5059309517dc1b5187" PKG_URL="https://github.com/CoreELEC/linux-amlogic/archive/$PKG_VERSION.tar.gz" PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET aml-dtbtools:host" diff --git a/projects/Amlogic-ce/packages/mediacenter/kodi/package.mk b/projects/Amlogic-ce/packages/mediacenter/kodi/package.mk index 3120b3c4539..821e5e7cb4a 100644 --- a/projects/Amlogic-ce/packages/mediacenter/kodi/package.mk +++ b/projects/Amlogic-ce/packages/mediacenter/kodi/package.mk @@ -4,12 +4,13 @@ # Copyright (C) 2020-present Team CoreELEC (https://coreelec.tv) PKG_NAME="kodi" -PKG_VERSION="88d56ddb992e3bb7a0c5ceabc0f07adef391bcf1" -PKG_SHA256="86eb13dc6151cc13beb8b8ab9c22548d1a868b38d96a3a74835774fa191d5259" +PKG_VERSION="1791c0e32448781207614cc83529f36ed3a66f00" +PKG_SHA256="d5270c3960387b97467921f3da122c900d870770de15579f7962ad232d94d4ed" PKG_LICENSE="GPL" PKG_SITE="http://www.kodi.tv" PKG_URL="https://github.com/CoreELEC/xbmc/archive/$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain JsonSchemaBuilder:host TexturePacker:host Python3 zlib systemd lzo pcre swig:host libass curl fontconfig fribidi tinyxml libjpeg-turbo freetype libcdio taglib libxml2 libxslt rapidjson sqlite ffmpeg crossguid libhdhomerun libfmt lirc libfstrcmp flatbuffers:host flatbuffers libudfread spdlog obu_util" +PKG_DEPENDS_HOST="toolchain" PKG_LONGDESC="A free and open source cross-platform media player." PKG_BUILD_FLAGS="+speed" @@ -180,12 +181,12 @@ configure_package() { if [ ! "$KODIPLAYER_DRIVER" = default ]; then PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET $KODIPLAYER_DRIVER libinput libxkbcommon" if [ "$OPENGLES_SUPPORT" = yes -a "$KODIPLAYER_DRIVER" = "$OPENGLES" ]; then - KODI_PLAYER="-DCORE_PLATFORM_NAME=gbm -DAPP_RENDER_SYSTEM=gles" + KODI_PLATFORM="-DCORE_PLATFORM_NAME=gbm -DAPP_RENDER_SYSTEM=gles" CFLAGS="$CFLAGS -DEGL_NO_X11" CXXFLAGS="$CXXFLAGS -DEGL_NO_X11" PKG_APPLIANCE_XML="$PKG_DIR/config/appliance-gbm.xml" elif [ "$KODIPLAYER_DRIVER" = libamcodec ]; then - KODI_PLAYER="-DCORE_PLATFORM_NAME=aml -DAPP_RENDER_SYSTEM=gles" + KODI_PLATFORM="-DCORE_PLATFORM_NAME=aml -DAPP_RENDER_SYSTEM=gles" PKG_APPLIANCE_XML_G12X="$PROJECT_DIR/$PROJECT/devices/$DEVICE/kodi/g12x/appliance.xml" PKG_APPLIANCE_XML_GXX="$PROJECT_DIR/$PROJECT/devices/$DEVICE/kodi/gxx/appliance.xml" fi @@ -225,6 +226,7 @@ configure_package() { $KODI_CEC \ $KODI_XORG \ $KODI_SAMBA \ + $KODI_PLATFORM \ $KODI_NFS \ $KODI_AVAHI \ $KODI_UPNP \ @@ -233,7 +235,6 @@ configure_package() { $KODI_AIRTUNES \ $KODI_OPTICAL \ $KODI_BLURAY \ - $KODI_PLAYER \ $KODI_ALSA \ $KODI_PULSEAUDIO" } @@ -252,6 +253,31 @@ prepare_libdvd_library() { fi } +configure_host() { + setup_toolchain target:cmake + cmake ${CMAKE_GENERATOR_NINJA} \ + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ + -DHEADERS_ONLY=ON \ + ${KODI_ARCH} \ + ${KODI_NEON} \ + ${KODI_PLATFORM} .. +} + +make_host() { + : +} + +makeinstall_host() { + DESTDIR=${SYSROOT_PREFIX} cmake -DCMAKE_INSTALL_COMPONENT="kodi-addon-dev" -P cmake_install.cmake + + # more binaddons cross compile badness meh + sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR ${SYSROOT_PREFIX}/usr/include/kodi:g" \ + -e "s:CMAKE_MODULE_PATH /usr/lib/kodi /usr/share/kodi/cmake:CMAKE_MODULE_PATH ${SYSROOT_PREFIX}/usr/share/kodi/cmake:g" \ + -i ${SYSROOT_PREFIX}/usr/lib/kodi/cmake/KodiConfig.cmake +} + pre_configure_target() { export LIBS="$LIBS -lncurses" diff --git a/projects/Amlogic-ce/packages/sysutils/tee_preload_fw/scripts/trusted-application-setup b/projects/Amlogic-ce/packages/sysutils/tee_preload_fw/scripts/trusted-application-setup index 37ef839f74f..95b97ec47d0 100755 --- a/projects/Amlogic-ce/packages/sysutils/tee_preload_fw/scripts/trusted-application-setup +++ b/projects/Amlogic-ce/packages/sysutils/tee_preload_fw/scripts/trusted-application-setup @@ -10,5 +10,5 @@ fi if [ -n "$SOC" ]; then mkdir -p /var/lib - ln -sf /usr/lib/ta/${SOC} /var/lib/teetz + ln -sfn /usr/lib/ta/${SOC} /var/lib/teetz fi diff --git a/projects/Amlogic-ce/packages/tools/rtk_hciattach/package.mk b/projects/Amlogic-ce/packages/tools/rtk_hciattach/package.mk index a7f7cc5088d..5dc548ebc72 100644 --- a/projects/Amlogic-ce/packages/tools/rtk_hciattach/package.mk +++ b/projects/Amlogic-ce/packages/tools/rtk_hciattach/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2018-present Team CoreELEC (https://coreelec.org) PKG_NAME="rtk_hciattach" -PKG_VERSION="58820c428d2ecae6aaf5e4f00997652b9479853a" -PKG_SHA256="20161cf3011f57dc9912db7270be1a83e543a61ea8757c23eaf983542fb021e0" +PKG_VERSION="3d0ed39cfdd24343715057e93134cd63b7321827" +PKG_SHA256="6c5908e4e07fe4a74c54f5b58f01bdbeffc2aa2f8b529c5f32ce897e087edf7a" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Caesar-github/rkwifibt" PKG_URL="https://github.com/Caesar-github/rkwifibt/archive/$PKG_VERSION.tar.gz" diff --git a/projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-change-location-of-btaddr-file.patch b/projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-change-location-of-btaddr-file.patch new file mode 100644 index 00000000000..8c25a67d2cd --- /dev/null +++ b/projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-change-location-of-btaddr-file.patch @@ -0,0 +1,25 @@ +From ca8ab97b2d72632858867110d76b1d06123485c9 Mon Sep 17 00:00:00 2001 +From: Stanislav Vlasic +Date: Mon, 15 Aug 2022 00:06:37 +0200 +Subject: [PATCH] Change location of btaddr file + +--- + realtek/rtk_hciattach/rtb_fwc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/rtb_fwc.c b/rtb_fwc.c +index 5e9e370..cac9309 100644 +--- a/rtb_fwc.c ++++ b/rtb_fwc.c +@@ -39,7 +39,7 @@ + #define FIRMWARE_DIRECTORY "/lib/firmware/rtlbt/" + #define BT_CONFIG_DIRECTORY "/lib/firmware/rtlbt/" + #define EXTRA_CONFIG_FILE "/opt/rtk_btconfig.txt" +-#define BT_ADDR_FILE "/opt/bdaddr" ++#define BT_ADDR_FILE "/storage/.config/btaddr" + #define BDADDR_STRING_LEN 17 + + struct list_head { +-- +2.37.2 + diff --git a/projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-dont-read-mac-from-vendor-storage.patch b/projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-dont-read-mac-from-vendor-storage.patch deleted file mode 100644 index 6f6883188f0..00000000000 --- a/projects/Amlogic-ce/packages/tools/rtk_hciattach/patches/rtk_hciattach-02-dont-read-mac-from-vendor-storage.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/rtb_fwc.c -+++ b/rtb_fwc.c -@@ -39,8 +39,8 @@ - #define BT_CONFIG_DIRECTORY "/lib/firmware/rtlbt/" - - #ifdef USE_CUSTOMER_ADDRESS --#define BT_ADDR_FROM_VENDOR_STORAGE --#define BT_ADDR_FILE "/opt/bdaddr" -+//#define BT_ADDR_FROM_VENDOR_STORAGE -+#define BT_ADDR_FILE "/storage/.config/btaddr" - static uint8_t customer_bdaddr = 0; - #endif - diff --git a/projects/Generic/linux/linux.x86_64.conf b/projects/Generic/linux/linux.x86_64.conf index 469108ddc14..2d231fb45be 100644 --- a/projects/Generic/linux/linux.x86_64.conf +++ b/projects/Generic/linux/linux.x86_64.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.19.0-rc8 Kernel Configuration +# Linux/x86 5.19.2-rc1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-libreelec-linux-gnu-gcc-12.1.0 (GCC) 12.1.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120100 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -422,7 +422,7 @@ CONFIG_ARCH_USES_PG_UNCACHED=y CONFIG_ARCH_RANDOM=y CONFIG_X86_UMIP=y CONFIG_CC_HAS_IBT=y -# CONFIG_X86_KERNEL_IBT is not set +CONFIG_X86_KERNEL_IBT=y CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -655,6 +655,7 @@ CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -2277,7 +2278,7 @@ CONFIG_USB_IPHETH=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set @@ -5671,6 +5672,7 @@ CONFIG_UIO=y # CONFIG_UIO_MF624 is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_PCI_LIB=y CONFIG_VIRTIO_PCI_LIB_LEGACY=y @@ -6419,8 +6421,7 @@ CONFIG_CRYPTO_CRC32=y # CONFIG_CRYPTO_CRC32_PCLMUL is not set CONFIG_CRYPTO_XXHASH=y CONFIG_CRYPTO_BLAKE2B=y -# CONFIG_CRYPTO_BLAKE2S is not set -CONFIG_CRYPTO_BLAKE2S_X86=m +CONFIG_CRYPTO_BLAKE2S_X86=y # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set @@ -6947,7 +6948,6 @@ CONFIG_STRICT_DEVMEM=y # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set # CONFIG_EARLY_PRINTK is not set # CONFIG_EFI_PGT_DUMP is not set diff --git a/projects/NXP/devices/iMX6/linux/linux.arm.conf b/projects/NXP/devices/iMX6/linux/linux.arm.conf index 3d63249a134..12af2541f4b 100644 --- a/projects/NXP/devices/iMX6/linux/linux.arm.conf +++ b/projects/NXP/devices/iMX6/linux/linux.arm.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.19.0-rc8 Kernel Configuration +# Linux/arm 5.19.2-rc1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="armv7a-libreelec-linux-gnueabihf-gcc-12.1.0 (GCC) 12.1.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120100 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -2039,7 +2039,7 @@ CONFIG_USB_NET_ZAURUS=y # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y # CONFIG_WLAN_VENDOR_ADMTEK is not set # CONFIG_WLAN_VENDOR_ATH is not set @@ -6621,7 +6621,6 @@ CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set diff --git a/projects/NXP/devices/iMX8/linux/linux.aarch64.conf b/projects/NXP/devices/iMX8/linux/linux.aarch64.conf index 8f8cf58d61a..dce9c2d1b43 100644 --- a/projects/NXP/devices/iMX8/linux/linux.aarch64.conf +++ b/projects/NXP/devices/iMX8/linux/linux.aarch64.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.19.0-rc8 Kernel Configuration +# Linux/arm64 5.19.7-rc1 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.1.0 (GCC) 12.1.0" +CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=120100 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y @@ -328,6 +328,7 @@ CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set +# CONFIG_ARM64_ERRATUM_1742098 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y @@ -345,6 +346,7 @@ CONFIG_ARM64_ERRATUM_1319367=y # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set @@ -588,6 +590,7 @@ CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -1959,7 +1962,7 @@ CONFIG_USB_IPHETH=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m @@ -6311,7 +6314,7 @@ CONFIG_RANDSTRUCT_NONE=y # end of Kernel hardening options # end of Security options -CONFIG_XOR_BLOCKS=y +CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # @@ -6399,7 +6402,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set diff --git a/projects/NXP/devices/iMX8/patches/linux/0041-drm-imx-dcss-add-component-framework-functionality.patch b/projects/NXP/devices/iMX8/patches/linux/0041-drm-imx-dcss-add-component-framework-functionality.patch index 38697f26b39..4b15c1da0a0 100644 --- a/projects/NXP/devices/iMX8/patches/linux/0041-drm-imx-dcss-add-component-framework-functionality.patch +++ b/projects/NXP/devices/iMX8/patches/linux/0041-drm-imx-dcss-add-component-framework-functionality.patch @@ -177,9 +177,9 @@ index 135a62366ab8..cafb09df6c75 100644 { struct dcss_kms_dev *kms; struct drm_device *drm; -@@ -148,19 +149,23 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) +@@ -148,13 +149,16 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) - drm->irq_enabled = true; + goto cleanup_mode_config; - ret = dcss_kms_bridge_connector_init(kms); + ret = dcss_crtc_init(crtc, drm); @@ -197,14 +197,6 @@ index 135a62366ab8..cafb09df6c75 100644 drm_mode_config_reset(drm); - drm_kms_helper_poll_init(drm); - -- drm_bridge_connector_enable_hpd(kms->connector); -+ if (!componentized) -+ drm_bridge_connector_enable_hpd(kms->connector); - - ret = drm_dev_register(drm, 0); - if (ret) @@ -171,7 +176,8 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) return kms; diff --git a/projects/Qualcomm/devices/Dragonboard/linux/linux.aarch64.conf b/projects/Qualcomm/devices/Dragonboard/linux/linux.aarch64.conf index cf04a5ef9eb..007bf2991cc 100644 --- a/projects/Qualcomm/devices/Dragonboard/linux/linux.aarch64.conf +++ b/projects/Qualcomm/devices/Dragonboard/linux/linux.aarch64.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.19.0-rc8 Kernel Configuration +# Linux/arm64 5.19.7-rc1 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.1.0 (GCC) 12.1.0" +CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=120100 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y @@ -339,6 +339,7 @@ CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set +# CONFIG_ARM64_ERRATUM_1742098 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y @@ -355,6 +356,7 @@ CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set @@ -644,6 +646,7 @@ CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -2507,7 +2510,7 @@ CONFIG_USB_NET_ZAURUS=y # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set @@ -4071,7 +4074,6 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set -# CONFIG_DRM_FSL_LDB is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set @@ -5365,11 +5367,11 @@ CONFIG_VFIO_PCI=y # CONFIG_VFIO_PLATFORM is not set # CONFIG_VFIO_MDEV is not set # CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_PCI_LIB=y CONFIG_VIRTIO_PCI_LIB_LEGACY=y CONFIG_VIRTIO_MENU=y -# CONFIG_VIRTIO_HARDEN_NOTIFICATION is not set CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_PCI_LEGACY=y CONFIG_VIRTIO_BALLOON=y @@ -6754,7 +6756,6 @@ CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set CONFIG_CRYPTO_XXHASH=y CONFIG_CRYPTO_BLAKE2B=y -# CONFIG_CRYPTO_BLAKE2S is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_CRC64_ROCKSOFT=y CONFIG_CRYPTO_GHASH=y diff --git a/projects/RPi/devices/RPi/linux/linux.arm.conf b/projects/RPi/devices/RPi/linux/linux.arm.conf index e4a403a2399..d5aaed8a03e 100644 --- a/projects/RPi/devices/RPi/linux/linux.arm.conf +++ b/projects/RPi/devices/RPi/linux/linux.arm.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.15.55 Kernel Configuration +# Linux/arm 5.15.61 Kernel Configuration # CONFIG_CC_VERSION_TEXT="arm-linux-gnueabihf-gcc (GCC) 13.0.0 20220604 (experimental) [master revision aec868578d8515763d75693c1fdfbc30ff0a1e68]" CONFIG_CC_IS_GCC=y @@ -481,7 +481,7 @@ CONFIG_ARM_CRYPTO=y CONFIG_CRYPTO_SHA1_ARM=m CONFIG_CRYPTO_SHA256_ARM=m # CONFIG_CRYPTO_SHA512_ARM is not set -CONFIG_CRYPTO_BLAKE2S_ARM=m +CONFIG_CRYPTO_BLAKE2S_ARM=y CONFIG_CRYPTO_AES_ARM=m CONFIG_CRYPTO_CHACHA20_NEON=m CONFIG_CRYPTO_POLY1305_ARM=m @@ -1558,7 +1558,7 @@ CONFIG_USB_IPHETH=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m @@ -3787,6 +3787,7 @@ CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO=m CONFIG_SND_PISOUND=m CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m CONFIG_SND_RPI_WM8804_SOUNDCARD=m +CONFIG_SND_DACBERRY400=m # CONFIG_SND_DESIGNWARE_I2S is not set # @@ -3950,7 +3951,8 @@ CONFIG_SND_SOC_TAS5713=m CONFIG_SND_SOC_TLV320AIC32X4=m CONFIG_SND_SOC_TLV320AIC32X4_I2C=m # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set +CONFIG_SND_SOC_TLV320AIC3X=m +CONFIG_SND_SOC_TLV320AIC3X_I2C=m # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set @@ -5288,7 +5290,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set diff --git a/projects/RPi/devices/RPi2/linux/linux.arm.conf b/projects/RPi/devices/RPi2/linux/linux.arm.conf index 31acf78bc16..7458200c799 100644 --- a/projects/RPi/devices/RPi2/linux/linux.arm.conf +++ b/projects/RPi/devices/RPi2/linux/linux.arm.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.15.55 Kernel Configuration +# Linux/arm 5.15.61 Kernel Configuration # CONFIG_CC_VERSION_TEXT="arm-linux-gnueabihf-gcc (GCC) 13.0.0 20220604 (experimental) [master revision aec868578d8515763d75693c1fdfbc30ff0a1e68]" CONFIG_CC_IS_GCC=y @@ -589,7 +589,7 @@ CONFIG_CRYPTO_SHA1_ARM_NEON=y # CONFIG_CRYPTO_SHA2_ARM_CE is not set CONFIG_CRYPTO_SHA256_ARM=m # CONFIG_CRYPTO_SHA512_ARM is not set -CONFIG_CRYPTO_BLAKE2S_ARM=m +CONFIG_CRYPTO_BLAKE2S_ARM=y # CONFIG_CRYPTO_BLAKE2B_NEON is not set CONFIG_CRYPTO_AES_ARM=m CONFIG_CRYPTO_AES_ARM_BS=m @@ -1689,7 +1689,7 @@ CONFIG_USB_IPHETH=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m @@ -3928,6 +3928,7 @@ CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO=m CONFIG_SND_PISOUND=m CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m CONFIG_SND_RPI_WM8804_SOUNDCARD=m +CONFIG_SND_DACBERRY400=m # CONFIG_SND_DESIGNWARE_I2S is not set # @@ -4091,7 +4092,8 @@ CONFIG_SND_SOC_TAS5713=m CONFIG_SND_SOC_TLV320AIC32X4=m CONFIG_SND_SOC_TLV320AIC32X4_I2C=m # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set +CONFIG_SND_SOC_TLV320AIC3X=m +CONFIG_SND_SOC_TLV320AIC3X_I2C=m # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set @@ -5439,7 +5441,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set diff --git a/projects/RPi/devices/RPi4/linux/linux.aarch64.conf b/projects/RPi/devices/RPi4/linux/linux.aarch64.conf index 0a80a2ce8ca..0a959c5dff0 100644 --- a/projects/RPi/devices/RPi4/linux/linux.aarch64.conf +++ b/projects/RPi/devices/RPi4/linux/linux.aarch64.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.15.55 Kernel Configuration +# Linux/arm64 5.15.61 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (GCC) 13.0.0 20220604 (experimental) [master revision aec868578d8515763d75693c1fdfbc30ff0a1e68]" CONFIG_CC_IS_GCC=y @@ -585,6 +585,7 @@ CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -1530,7 +1531,6 @@ CONFIG_GENERIC_ARCH_TOPOLOGY=y # end of ARM System Control and Management Interface Protocol # CONFIG_ARM_SCPI_PROTOCOL is not set -# CONFIG_ARM_SDE_INTERFACE is not set # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_DMIID=y # CONFIG_DMI_SYSFS is not set @@ -2134,7 +2134,7 @@ CONFIG_USB_IPHETH=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set @@ -4584,6 +4584,7 @@ CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO=m CONFIG_SND_PISOUND=m CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m CONFIG_SND_RPI_WM8804_SOUNDCARD=m +CONFIG_SND_DACBERRY400=m # CONFIG_SND_DESIGNWARE_I2S is not set # @@ -4747,7 +4748,8 @@ CONFIG_SND_SOC_TAS5713=m CONFIG_SND_SOC_TLV320AIC32X4=m CONFIG_SND_SOC_TLV320AIC32X4_I2C=m # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set +CONFIG_SND_SOC_TLV320AIC3X=m +CONFIG_SND_SOC_TLV320AIC3X_I2C=m # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set @@ -6151,7 +6153,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set @@ -6515,6 +6516,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # end of Lock Debugging (spinlocks, mutexes, etc...) CONFIG_TRACE_IRQFLAGS=y +CONFIG_TRACE_IRQFLAGS_NMI=y # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set diff --git a/projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch b/projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch deleted file mode 100644 index d1cdb48a67f..00000000000 --- a/projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch +++ /dev/null @@ -1,352 +0,0 @@ -From 6f5646c5059e1bd23ba5dd22c9c5a404b73e5635 Mon Sep 17 00:00:00 2001 -From: Dom Cobley -Date: Tue, 12 Apr 2022 12:20:53 +0100 -Subject: [PATCH 1/5] DRMObject: Rename GetPropertyValue to - GetPropertyEnumValue - -The naming of this function is problematic for adding a function that gets a property's value ---- - .../VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 5 +++-- - xbmc/windowing/gbm/drm/DRMAtomic.cpp | 2 +- - xbmc/windowing/gbm/drm/DRMObject.cpp | 4 ++-- - xbmc/windowing/gbm/drm/DRMObject.h | 4 ++-- - 4 files changed, 8 insertions(+), 7 deletions(-) - -diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -index a82da2225b7e..57d60f7437ae 100644 ---- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -@@ -165,11 +165,12 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) - - bool result; - uint64_t value; -- std::tie(result, value) = plane->GetPropertyValue("COLOR_ENCODING", GetColorEncoding(picture)); -+ std::tie(result, value) = -+ plane->GetPropertyEnumValue("COLOR_ENCODING", GetColorEncoding(picture)); - if (result) - m_DRM->AddProperty(plane, "COLOR_ENCODING", value); - -- std::tie(result, value) = plane->GetPropertyValue("COLOR_RANGE", GetColorRange(picture)); -+ std::tie(result, value) = plane->GetPropertyEnumValue("COLOR_RANGE", GetColorRange(picture)); - if (result) - m_DRM->AddProperty(plane, "COLOR_RANGE", value); - -diff --git a/xbmc/windowing/gbm/drm/DRMAtomic.cpp b/xbmc/windowing/gbm/drm/DRMAtomic.cpp -index 5d61a699d422..80abb02cd6ee 100644 ---- a/xbmc/windowing/gbm/drm/DRMAtomic.cpp -+++ b/xbmc/windowing/gbm/drm/DRMAtomic.cpp -@@ -48,7 +48,7 @@ bool CDRMAtomic::SetScalingFilter(CDRMObject* object, const char* name, const ch - { - bool result; - uint64_t value; -- std::tie(result, value) = m_gui_plane->GetPropertyValue(name, type); -+ std::tie(result, value) = m_gui_plane->GetPropertyEnumValue(name, type); - if (!result) - return false; - -diff --git a/xbmc/windowing/gbm/drm/DRMObject.cpp b/xbmc/windowing/gbm/drm/DRMObject.cpp -index 599bb61cd023..b61f41ed98f5 100644 ---- a/xbmc/windowing/gbm/drm/DRMObject.cpp -+++ b/xbmc/windowing/gbm/drm/DRMObject.cpp -@@ -81,8 +81,8 @@ bool CDRMObject::GetProperties(uint32_t id, uint32_t type) - } - - //! @todo: improve with c++17 --std::tuple CDRMObject::GetPropertyValue(const std::string& name, -- const std::string& valueName) const -+std::tuple CDRMObject::GetPropertyEnumValue(const std::string& name, -+ const std::string& valueName) const - { - auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), - [&name](const auto& prop) { return prop->name == name; }); -diff --git a/xbmc/windowing/gbm/drm/DRMObject.h b/xbmc/windowing/gbm/drm/DRMObject.h -index e2ae32652cae..65e6dddf424d 100644 ---- a/xbmc/windowing/gbm/drm/DRMObject.h -+++ b/xbmc/windowing/gbm/drm/DRMObject.h -@@ -34,8 +34,8 @@ class CDRMObject - - uint32_t GetId() const { return m_id; } - uint32_t GetPropertyId(const std::string& name) const; -- std::tuple GetPropertyValue(const std::string& name, -- const std::string& valueName) const; -+ std::tuple GetPropertyEnumValue(const std::string& name, -+ const std::string& valueName) const; - - bool SetProperty(const std::string& name, uint64_t value); - bool SupportsProperty(const std::string& name); - -From 20c4c0a93df8ce29ecbf668e04b5baa09f198621 Mon Sep 17 00:00:00 2001 -From: Dom Cobley -Date: Tue, 12 Apr 2022 20:13:07 +0100 -Subject: [PATCH 2/5] DRMObject: Add method to get current property value - ---- - xbmc/windowing/gbm/drm/DRMObject.cpp | 16 ++++++++++++++++ - xbmc/windowing/gbm/drm/DRMObject.h | 2 ++ - 2 files changed, 18 insertions(+) - -diff --git a/xbmc/windowing/gbm/drm/DRMObject.cpp b/xbmc/windowing/gbm/drm/DRMObject.cpp -index b61f41ed98f5..4c188c8298be 100644 ---- a/xbmc/windowing/gbm/drm/DRMObject.cpp -+++ b/xbmc/windowing/gbm/drm/DRMObject.cpp -@@ -74,8 +74,11 @@ bool CDRMObject::GetProperties(uint32_t id, uint32_t type) - m_type = type; - - for (uint32_t i = 0; i < m_props->count_props; i++) -+ { - m_propsInfo.emplace_back(std::unique_ptr( - drmModeGetProperty(m_fd, m_props->props[i]))); -+ m_propsValues.emplace_back(m_props->prop_values[i]); -+ } - - return true; - } -@@ -106,6 +109,19 @@ std::tuple CDRMObject::GetPropertyEnumValue(const std::string& n - return std::make_tuple(false, 0); - } - -+bool CDRMObject::GetPropertyValue(const std::string& name, uint64_t& val) const -+{ -+ auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), -+ [&name](auto& prop) { return prop->name == name; }); -+ -+ if (property == m_propsInfo.end()) -+ return false; -+ -+ val = m_propsValues[property - m_propsInfo.begin()]; -+ -+ return true; -+} -+ - bool CDRMObject::SetProperty(const std::string& name, uint64_t value) - { - auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), -diff --git a/xbmc/windowing/gbm/drm/DRMObject.h b/xbmc/windowing/gbm/drm/DRMObject.h -index 65e6dddf424d..cba849c4070d 100644 ---- a/xbmc/windowing/gbm/drm/DRMObject.h -+++ b/xbmc/windowing/gbm/drm/DRMObject.h -@@ -36,6 +36,7 @@ class CDRMObject - uint32_t GetPropertyId(const std::string& name) const; - std::tuple GetPropertyEnumValue(const std::string& name, - const std::string& valueName) const; -+ bool GetPropertyValue(const std::string& name, uint64_t& val) const; - - bool SetProperty(const std::string& name, uint64_t value); - bool SupportsProperty(const std::string& name); -@@ -58,6 +59,7 @@ class CDRMObject - }; - - std::vector> m_propsInfo; -+ std::vector m_propsValues; - - int m_fd{-1}; - - -From 10577c714984106ae00fdfb459d02faed8cbcbdd Mon Sep 17 00:00:00 2001 -From: Dom Cobley -Date: Mon, 11 Apr 2022 19:40:41 +0100 -Subject: [PATCH 3/5] DRMObject: Add GetPropertyRange accessor - ---- - xbmc/windowing/gbm/drm/DRMObject.cpp | 19 +++++++++++++++++++ - xbmc/windowing/gbm/drm/DRMObject.h | 1 + - 2 files changed, 20 insertions(+) - -diff --git a/xbmc/windowing/gbm/drm/DRMObject.cpp b/xbmc/windowing/gbm/drm/DRMObject.cpp -index 4c188c8298be..d08c57950024 100644 ---- a/xbmc/windowing/gbm/drm/DRMObject.cpp -+++ b/xbmc/windowing/gbm/drm/DRMObject.cpp -@@ -122,6 +122,25 @@ bool CDRMObject::GetPropertyValue(const std::string& name, uint64_t& val) const - return true; - } - -+bool CDRMObject::GetPropertyRange(const std::string& name, uint64_t& min, uint64_t& max) const -+{ -+ auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), -+ [&name](auto& prop) { return prop->name == name; }); -+ -+ if (property == m_propsInfo.end()) -+ return false; -+ -+ auto prop = property->get(); -+ -+ if (!static_cast(drm_property_type_is(prop, DRM_MODE_PROP_RANGE))) -+ return false; -+ -+ min = prop->values[0]; -+ max = prop->values[1]; -+ -+ return true; -+} -+ - bool CDRMObject::SetProperty(const std::string& name, uint64_t value) - { - auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), -diff --git a/xbmc/windowing/gbm/drm/DRMObject.h b/xbmc/windowing/gbm/drm/DRMObject.h -index cba849c4070d..875ab5afa437 100644 ---- a/xbmc/windowing/gbm/drm/DRMObject.h -+++ b/xbmc/windowing/gbm/drm/DRMObject.h -@@ -37,6 +37,7 @@ class CDRMObject - std::tuple GetPropertyEnumValue(const std::string& name, - const std::string& valueName) const; - bool GetPropertyValue(const std::string& name, uint64_t& val) const; -+ bool GetPropertyRange(const std::string& name, uint64_t& min, uint64_t& max) const; - - bool SetProperty(const std::string& name, uint64_t value); - bool SupportsProperty(const std::string& name); - -From b4677efb3809af8fe1fd9335bebfa791bba30966 Mon Sep 17 00:00:00 2001 -From: Lukas Rusak -Date: Mon, 29 Apr 2019 18:48:45 -0700 -Subject: [PATCH 4/5] CVideoLayerBridgeDRMPRIME: add colourspace connector - property - ---- - .../Buffers/VideoBufferDRMPRIME.cpp | 12 ++++++++++ - .../VideoPlayer/Buffers/VideoBufferDRMPRIME.h | 1 + - .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 23 ++++++++++++++++++- - 3 files changed, 35 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp -index b1c23ffc3dc5..a5fb7ddf44d7 100644 ---- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp -+++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp -@@ -20,6 +20,18 @@ extern "C" - namespace DRMPRIME - { - -+std::string GetColorimetry(const VideoPicture& picture) -+{ -+ switch (picture.color_space) -+ { -+ case AVCOL_SPC_BT2020_CL: -+ case AVCOL_SPC_BT2020_NCL: -+ return "BT2020_RGB"; -+ } -+ -+ return "Default"; -+} -+ - std::string GetColorEncoding(const VideoPicture& picture) - { - switch (picture.color_space) -diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h -index e77f75b58bff..4de9732308ca 100644 ---- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h -+++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h -@@ -34,6 +34,7 @@ enum hdmi_eotf - HDMI_EOTF_BT_2100_HLG, - }; - -+std::string GetColorimetry(const VideoPicture& picture); - std::string GetColorEncoding(const VideoPicture& picture); - std::string GetColorRange(const VideoPicture& picture); - uint8_t GetEOTF(const VideoPicture& picture); -diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -index 57d60f7437ae..56000cc774f3 100644 ---- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -@@ -35,8 +35,20 @@ void CVideoLayerBridgeDRMPRIME::Disable() - m_DRM->AddProperty(plane, "FB_ID", 0); - m_DRM->AddProperty(plane, "CRTC_ID", 0); - -- // disable HDR metadata - auto connector = m_DRM->GetConnector(); -+ -+ bool result; -+ uint64_t value; -+ std::tie(result, value) = connector->GetPropertyEnumValue("Colorspace", "Default"); -+ if (result) -+ { -+ CLog::Log(LOGDEBUG, -+ "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to Default ({})", -+ __FUNCTION__, result); -+ m_DRM->AddProperty(connector, "Colorspace", value); -+ } -+ -+ // disable HDR metadata - if (connector->SupportsProperty("HDR_OUTPUT_METADATA")) - { - m_DRM->AddProperty(connector, "HDR_OUTPUT_METADATA", 0); -@@ -175,6 +187,15 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) - m_DRM->AddProperty(plane, "COLOR_RANGE", value); - - auto connector = m_DRM->GetConnector(); -+ -+ std::tie(result, value) = connector->GetPropertyEnumValue("Colorspace", GetColorimetry(picture)); -+ if (result) -+ { -+ result = m_DRM->AddProperty(connector, "Colorspace", value); -+ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to {} ({})", -+ __FUNCTION__, GetColorimetry(picture), result); -+ } -+ - if (connector->SupportsProperty("HDR_OUTPUT_METADATA")) - { - m_hdr_metadata.metadata_type = HDMI_STATIC_METADATA_TYPE1; - -From 773e4c3debca042df9313de5c97b4b227a16a8d2 Mon Sep 17 00:00:00 2001 -From: Dom Cobley -Date: Fri, 3 Dec 2021 16:00:50 +0000 -Subject: [PATCH 5/5] CVideoLayerBridgeDRMPRIME: Set max bpc for high bit depth - videos - ---- - .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 26 +++++++++++++++++++ - .../HwDecRender/VideoLayerBridgeDRMPRIME.h | 1 + - 2 files changed, 27 insertions(+) - -diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -index 56000cc774f3..a43848e07989 100644 ---- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -@@ -38,6 +38,16 @@ void CVideoLayerBridgeDRMPRIME::Disable() - auto connector = m_DRM->GetConnector(); - - bool result; -+ -+ // reset max bpc back to default -+ if (m_previous_bpc) -+ { -+ result = m_DRM->AddProperty(connector, "max bpc", m_previous_bpc); -+ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, -+ m_previous_bpc, result); -+ m_previous_bpc = 0; -+ } -+ - uint64_t value; - std::tie(result, value) = connector->GetPropertyEnumValue("Colorspace", "Default"); - if (result) -@@ -188,6 +198,22 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) - - auto connector = m_DRM->GetConnector(); - -+ // set max bpc to allow the drm driver to choose a deep colour mode -+ if (picture.colorBits > 8 && connector->SupportsProperty("max bpc")) -+ { -+ uint64_t bpc = 12; -+ uint64_t min, max; -+ -+ if (connector->GetPropertyRange("max bpc", min, max) && bpc >= min && bpc <= max && -+ connector->GetPropertyValue("max bpc", m_previous_bpc)) -+ { -+ -+ result = m_DRM->AddProperty(connector, "max bpc", bpc); -+ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", -+ __FUNCTION__, bpc, result); -+ } -+ } -+ - std::tie(result, value) = connector->GetPropertyEnumValue("Colorspace", GetColorimetry(picture)); - if (result) - { -diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.h -index 3a46a91a13e0..0cdb8d760d25 100644 ---- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.h -+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.h -@@ -81,4 +81,5 @@ class CVideoLayerBridgeDRMPRIME : public KODI::WINDOWING::GBM::CVideoLayerBridge - - uint32_t m_hdr_blob_id = 0; - struct hdr_output_metadata m_hdr_metadata = {}; -+ uint64_t m_previous_bpc = 0; - }; diff --git a/projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch b/projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch new file mode 100644 index 00000000000..615c1f10470 --- /dev/null +++ b/projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch @@ -0,0 +1,46 @@ +From b9b55807dcacec91a6d991b9d113cf011aea83e1 Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Fri, 3 Dec 2021 16:00:50 +0000 +Subject: [PATCH] gbm: Set max bpc for high bit depth videos + +--- + .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +index b91a1705ac..726a5b79b7 100644 +--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +@@ -34,6 +34,14 @@ void CVideoLayerBridgeDRMPRIME::Disable() + { + // disable video plane + auto plane = m_DRM->GetVideoPlane(); ++ auto connector = m_DRM->GetConnector(); ++ ++ // reset max bpc back to default of 8 ++ int bpc = 8; ++ bool result = m_DRM->AddProperty(connector, "max bpc", bpc); ++ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", ++ __FUNCTION__, bpc, result); ++ + m_DRM->AddProperty(plane, "FB_ID", 0); + m_DRM->AddProperty(plane, "CRTC_ID", 0); + +@@ -175,6 +183,14 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) + std::tie(result, value) = plane->GetPropertyValue("COLOR_RANGE", GetColorRange(picture)); + if (result) + m_DRM->AddProperty(plane, "COLOR_RANGE", value); ++ ++ // set max bpc to allow the drm driver to choose a deep colour mode ++ int bpc = buffer->GetPicture().colorBits > 8 ? 12 : 8; ++ auto connector = m_DRM->GetConnector(); ++ result = m_DRM->AddProperty(connector, "max bpc", bpc); ++ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, ++ bpc, result); ++ + } + + void CVideoLayerBridgeDRMPRIME::SetVideoPlane(CVideoBufferDRMPRIME* buffer, const CRect& destRect) +-- +2.34.1 + diff --git a/projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch b/projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch new file mode 100644 index 00000000000..205b523c636 --- /dev/null +++ b/projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch @@ -0,0 +1,86 @@ +From 0137bf1b41b3f1bb08fb7fb78e0ae5266c4925da Mon Sep 17 00:00:00 2001 +From: Lukas Rusak +Date: Mon, 29 Apr 2019 18:48:45 -0700 +Subject: [PATCH] CVideoLayerBridgeDRMPRIME add colourspace connector property + +--- + .../Buffers/VideoBufferDRMPRIME.cpp | 12 ++++++++++++ + .../VideoPlayer/Buffers/VideoBufferDRMPRIME.h | 1 + + .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 19 +++++++++++++++++++ + 3 files changed, 32 insertions(+) + +diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp +index b1c23ffc3d..a5fb7ddf44 100644 +--- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp +@@ -20,6 +20,18 @@ extern "C" + namespace DRMPRIME + { + ++std::string GetColorimetry(const VideoPicture& picture) ++{ ++ switch (picture.color_space) ++ { ++ case AVCOL_SPC_BT2020_CL: ++ case AVCOL_SPC_BT2020_NCL: ++ return "BT2020_RGB"; ++ } ++ ++ return "Default"; ++} ++ + std::string GetColorEncoding(const VideoPicture& picture) + { + switch (picture.color_space) +diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h +index e77f75b58b..4de9732308 100644 +--- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h ++++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h +@@ -34,6 +34,7 @@ enum hdmi_eotf + HDMI_EOTF_BT_2100_HLG, + }; + ++std::string GetColorimetry(const VideoPicture& picture); + std::string GetColorEncoding(const VideoPicture& picture); + std::string GetColorRange(const VideoPicture& picture); + uint8_t GetEOTF(const VideoPicture& picture); +diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +index 726a5b79b7..09701cdbaa 100644 +--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +@@ -42,6 +42,16 @@ void CVideoLayerBridgeDRMPRIME::Disable() + CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", + __FUNCTION__, bpc, result); + ++ uint64_t value; ++ std::tie(result, value) = connector->GetPropertyValue("Colorspace", "Default"); ++ if (result) ++ { ++ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to Default", ++ __FUNCTION__); ++ m_DRM->AddProperty(connector, "Colorspace", value); ++ m_DRM->SetActive(true); ++ } ++ + m_DRM->AddProperty(plane, "FB_ID", 0); + m_DRM->AddProperty(plane, "CRTC_ID", 0); + +@@ -191,6 +201,15 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) + CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, + bpc, result); + ++ std::tie(result, value) = connector->GetPropertyValue("Colorspace", GetColorimetry(picture)); ++ if (result) ++ { ++ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to {}", ++ __FUNCTION__, GetColorimetry(picture)); ++ m_DRM->AddProperty(connector, "Colorspace", value); ++ m_DRM->SetActive(true); ++ } ++ + } + + void CVideoLayerBridgeDRMPRIME::SetVideoPlane(CVideoBufferDRMPRIME* buffer, const CRect& destRect) +-- +2.34.1 + diff --git a/projects/Rockchip/devices/GameForce/packages/kmscon/patches/kmscon-fixbuild.patch b/projects/Rockchip/devices/GameForce/packages/kmscon/patches/kmscon-fixbuild.patch deleted file mode 100644 index 6ce0eb198cd..00000000000 --- a/projects/Rockchip/devices/GameForce/packages/kmscon/patches/kmscon-fixbuild.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/src/pty.c -+++ b/src/pty.c -@@ -45,6 +45,7 @@ - #define LOG_SUBSYSTEM "pty" - - #define KMSCON_NREAD 16384 -+#define SIGUNUSED 31 - - struct kmscon_pty { - unsigned long ref; ---- a/src/uterm_vt.c -+++ b/src/uterm_vt.c -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/libtsm/package.mk b/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/libtsm/package.mk deleted file mode 100644 index 011f3d8bd1e..00000000000 --- a/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/libtsm/package.mk +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) - -PKG_NAME="libtsm" -PKG_VERSION="6d1cc890183fb6a433f4683aba98cdc8d6fe8549" -PKG_SHA256="25910f8c03cd305479b10f1ee04111b274ef7e0ff331fe8d35bee110535cfe15" -PKG_LICENSE="GPLv2+" -PKG_SITE="https://github.com/syuu1228/libtsm" -PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" -PKG_DEPENDS_TARGET="toolchain" -PKG_LONGDESC="Linux KMS/DRM based virtual Console Emulator" -PKG_TOOLCHAIN="autotools" - -#pre_configure_target() { - -#} - -#makeinstall_target() { -#} diff --git a/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/package.mk b/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/package.mk deleted file mode 100644 index c5cbc89ec0a..00000000000 --- a/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/package.mk +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) - -PKG_NAME="kmscon" -PKG_VERSION="0b3452719992f855b64fa21c9d7fbd6158a8d23a" -PKG_SHA256="6b7efdb4f9b6715208898ee4757364c04d1bb903182bba1667644dd68c11524d" -PKG_LICENSE="GPLv2+" -PKG_SITE="https://github.com/dvdhrm/kmscon" -PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" -PKG_DEPENDS_TARGET="toolchain libtsm libxkbcommon" -PKG_LONGDESC="Linux KMS/DRM based virtual Console Emulator" -PKG_TOOLCHAIN="autotools" - - -PKG_CONFIGURE_OPTS_TARGET=" --disable-debug --with-video=fbdev,drm2d,drm3d --disable-multi-seat --with-sessions=dummy,terminal" diff --git a/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/patches/kmscon-fixbuild.patch b/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/patches/kmscon-fixbuild.patch deleted file mode 100644 index 6ce0eb198cd..00000000000 --- a/projects/Rockchip/devices/OdroidGoAdvance/packages/kmscon/patches/kmscon-fixbuild.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/src/pty.c -+++ b/src/pty.c -@@ -45,6 +45,7 @@ - #define LOG_SUBSYSTEM "pty" - - #define KMSCON_NREAD 16384 -+#define SIGUNUSED 31 - - struct kmscon_pty { - unsigned long ref; ---- a/src/uterm_vt.c -+++ b/src/uterm_vt.c -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/projects/Rockchip/devices/OdroidM1/packages/kmscon/libtsm/package.mk b/projects/Rockchip/devices/OdroidM1/packages/kmscon/libtsm/package.mk deleted file mode 100644 index 011f3d8bd1e..00000000000 --- a/projects/Rockchip/devices/OdroidM1/packages/kmscon/libtsm/package.mk +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) - -PKG_NAME="libtsm" -PKG_VERSION="6d1cc890183fb6a433f4683aba98cdc8d6fe8549" -PKG_SHA256="25910f8c03cd305479b10f1ee04111b274ef7e0ff331fe8d35bee110535cfe15" -PKG_LICENSE="GPLv2+" -PKG_SITE="https://github.com/syuu1228/libtsm" -PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" -PKG_DEPENDS_TARGET="toolchain" -PKG_LONGDESC="Linux KMS/DRM based virtual Console Emulator" -PKG_TOOLCHAIN="autotools" - -#pre_configure_target() { - -#} - -#makeinstall_target() { -#} diff --git a/projects/Rockchip/devices/OdroidM1/packages/kmscon/package.mk b/projects/Rockchip/devices/OdroidM1/packages/kmscon/package.mk deleted file mode 100644 index c5cbc89ec0a..00000000000 --- a/projects/Rockchip/devices/OdroidM1/packages/kmscon/package.mk +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) - -PKG_NAME="kmscon" -PKG_VERSION="0b3452719992f855b64fa21c9d7fbd6158a8d23a" -PKG_SHA256="6b7efdb4f9b6715208898ee4757364c04d1bb903182bba1667644dd68c11524d" -PKG_LICENSE="GPLv2+" -PKG_SITE="https://github.com/dvdhrm/kmscon" -PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" -PKG_DEPENDS_TARGET="toolchain libtsm libxkbcommon" -PKG_LONGDESC="Linux KMS/DRM based virtual Console Emulator" -PKG_TOOLCHAIN="autotools" - - -PKG_CONFIGURE_OPTS_TARGET=" --disable-debug --with-video=fbdev,drm2d,drm3d --disable-multi-seat --with-sessions=dummy,terminal" diff --git a/projects/Rockchip/devices/OdroidM1/packages/kmscon/patches/kmscon-fixbuild.patch b/projects/Rockchip/devices/OdroidM1/packages/kmscon/patches/kmscon-fixbuild.patch deleted file mode 100644 index 6ce0eb198cd..00000000000 --- a/projects/Rockchip/devices/OdroidM1/packages/kmscon/patches/kmscon-fixbuild.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/src/pty.c -+++ b/src/pty.c -@@ -45,6 +45,7 @@ - #define LOG_SUBSYSTEM "pty" - - #define KMSCON_NREAD 16384 -+#define SIGUNUSED 31 - - struct kmscon_pty { - unsigned long ref; ---- a/src/uterm_vt.c -+++ b/src/uterm_vt.c -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf b/projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf index 5ce90699b5b..846516e46b0 100644 --- a/projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf +++ b/projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.19.0-rc8 Kernel Configuration +# Linux/arm 5.19.2-rc1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="armv7ve-libreelec-linux-gnueabihf-gcc-12.1.0 (GCC) 12.1.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120100 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -591,7 +591,7 @@ CONFIG_CRYPTO_SHA1_ARM_NEON=y # CONFIG_CRYPTO_SHA2_ARM_CE is not set CONFIG_CRYPTO_SHA256_ARM=y CONFIG_CRYPTO_SHA512_ARM=y -CONFIG_CRYPTO_BLAKE2S_ARM=m +CONFIG_CRYPTO_BLAKE2S_ARM=y CONFIG_CRYPTO_BLAKE2B_NEON=m CONFIG_CRYPTO_AES_ARM=y CONFIG_CRYPTO_AES_ARM_BS=y @@ -1684,7 +1684,7 @@ CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m @@ -3684,7 +3684,6 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_CROS_EC_ANX7688 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set -# CONFIG_DRM_FSL_LDB is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set @@ -4851,6 +4850,7 @@ CONFIG_DMABUF_HEAPS_CMA=y # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_MENU=y # CONFIG_VIRTIO_HARDEN_NOTIFICATION is not set @@ -6212,7 +6212,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -CONFIG_CRYPTO_BLAKE2S=m # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set @@ -6332,7 +6331,6 @@ CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA=m CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=y diff --git a/projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf b/projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf index 825c9d62a50..b91ed5200c9 100644 --- a/projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.19.0-rc8 Kernel Configuration +# Linux/arm64 5.19.7-rc1 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.1.0 (GCC) 12.1.0" +CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=120100 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y @@ -338,6 +338,7 @@ CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set +# CONFIG_ARM64_ERRATUM_1742098 is not set CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y @@ -354,6 +355,7 @@ CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set @@ -595,6 +597,7 @@ CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -1885,7 +1888,7 @@ CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_ATH_COMMON=m @@ -3759,7 +3762,6 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set -# CONFIG_DRM_FSL_LDB is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set @@ -4867,9 +4869,9 @@ CONFIG_VFIO_IOMMU_TYPE1=y # CONFIG_VFIO_PLATFORM is not set # CONFIG_VFIO_MDEV is not set # CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_MENU=y -# CONFIG_VIRTIO_HARDEN_NOTIFICATION is not set CONFIG_VIRTIO_BALLOON=y # CONFIG_VIRTIO_INPUT is not set CONFIG_VIRTIO_MMIO=y @@ -6155,7 +6157,7 @@ CONFIG_RANDSTRUCT_NONE=y # end of Kernel hardening options # end of Security options -CONFIG_XOR_BLOCKS=y +CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # @@ -6245,7 +6247,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -CONFIG_CRYPTO_BLAKE2S=m # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_POLY1305=m diff --git a/projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf b/projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf index ca752cabdd1..9f5e954b222 100644 --- a/projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.19.0-rc8 Kernel Configuration +# Linux/arm64 5.19.7-rc1 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.1.0 (GCC) 12.1.0" +CONFIG_CC_VERSION_TEXT="aarch64-none-elf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=120100 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y @@ -337,6 +337,7 @@ CONFIG_ARM64_ERRATUM_827319=y CONFIG_ARM64_ERRATUM_824069=y CONFIG_ARM64_ERRATUM_819472=y # CONFIG_ARM64_ERRATUM_832075 is not set +CONFIG_ARM64_ERRATUM_1742098=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y @@ -354,6 +355,7 @@ CONFIG_ARM64_ERRATUM_1319367=y # CONFIG_ARM64_ERRATUM_2077057 is not set # CONFIG_ARM64_ERRATUM_2054223 is not set # CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set @@ -595,6 +597,7 @@ CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -2214,7 +2217,7 @@ CONFIG_USB_NET_ZAURUS=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set @@ -4309,7 +4312,6 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set -# CONFIG_DRM_FSL_LDB is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set @@ -5562,9 +5564,9 @@ CONFIG_VFIO_PCI_INTX=y # CONFIG_VFIO_PLATFORM is not set # CONFIG_VFIO_MDEV is not set # CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_MENU=y -# CONFIG_VIRTIO_HARDEN_NOTIFICATION is not set # CONFIG_VIRTIO_PCI is not set CONFIG_VIRTIO_BALLOON=y # CONFIG_VIRTIO_INPUT is not set @@ -6867,7 +6869,7 @@ CONFIG_RANDSTRUCT_NONE=y # end of Kernel hardening options # end of Security options -CONFIG_XOR_BLOCKS=y +CONFIG_XOR_BLOCKS=m CONFIG_CRYPTO=y # @@ -6957,7 +6959,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -CONFIG_CRYPTO_BLAKE2S=m # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_POLY1305=m diff --git a/projects/Rockchip/devices/RK356x/packages/kmscon/libtsm/package.mk b/projects/Rockchip/devices/RK356x/packages/kmscon/libtsm/package.mk deleted file mode 100644 index 011f3d8bd1e..00000000000 --- a/projects/Rockchip/devices/RK356x/packages/kmscon/libtsm/package.mk +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) - -PKG_NAME="libtsm" -PKG_VERSION="6d1cc890183fb6a433f4683aba98cdc8d6fe8549" -PKG_SHA256="25910f8c03cd305479b10f1ee04111b274ef7e0ff331fe8d35bee110535cfe15" -PKG_LICENSE="GPLv2+" -PKG_SITE="https://github.com/syuu1228/libtsm" -PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" -PKG_DEPENDS_TARGET="toolchain" -PKG_LONGDESC="Linux KMS/DRM based virtual Console Emulator" -PKG_TOOLCHAIN="autotools" - -#pre_configure_target() { - -#} - -#makeinstall_target() { -#} diff --git a/projects/Rockchip/devices/RK356x/packages/kmscon/package.mk b/projects/Rockchip/devices/RK356x/packages/kmscon/package.mk deleted file mode 100644 index c5cbc89ec0a..00000000000 --- a/projects/Rockchip/devices/RK356x/packages/kmscon/package.mk +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) - -PKG_NAME="kmscon" -PKG_VERSION="0b3452719992f855b64fa21c9d7fbd6158a8d23a" -PKG_SHA256="6b7efdb4f9b6715208898ee4757364c04d1bb903182bba1667644dd68c11524d" -PKG_LICENSE="GPLv2+" -PKG_SITE="https://github.com/dvdhrm/kmscon" -PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" -PKG_DEPENDS_TARGET="toolchain libtsm libxkbcommon" -PKG_LONGDESC="Linux KMS/DRM based virtual Console Emulator" -PKG_TOOLCHAIN="autotools" - - -PKG_CONFIGURE_OPTS_TARGET=" --disable-debug --with-video=fbdev,drm2d,drm3d --disable-multi-seat --with-sessions=dummy,terminal" diff --git a/projects/Rockchip/devices/RK356x/packages/kmscon/patches/kmscon-fixbuild.patch b/projects/Rockchip/devices/RK356x/packages/kmscon/patches/kmscon-fixbuild.patch deleted file mode 100644 index 6ce0eb198cd..00000000000 --- a/projects/Rockchip/devices/RK356x/packages/kmscon/patches/kmscon-fixbuild.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/src/pty.c -+++ b/src/pty.c -@@ -45,6 +45,7 @@ - #define LOG_SUBSYSTEM "pty" - - #define KMSCON_NREAD 16384 -+#define SIGUNUSED 31 - - struct kmscon_pty { - unsigned long ref; ---- a/src/uterm_vt.c -+++ b/src/uterm_vt.c -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/projects/Rockchip/devices/GameForce/packages/kmscon/libtsm/package.mk b/projects/Rockchip/packages/kmscon/libtsm/package.mk similarity index 100% rename from projects/Rockchip/devices/GameForce/packages/kmscon/libtsm/package.mk rename to projects/Rockchip/packages/kmscon/libtsm/package.mk diff --git a/projects/Rockchip/devices/GameForce/packages/kmscon/package.mk b/projects/Rockchip/packages/kmscon/package.mk similarity index 100% rename from projects/Rockchip/devices/GameForce/packages/kmscon/package.mk rename to projects/Rockchip/packages/kmscon/package.mk diff --git a/projects/Rockchip/packages/kmscon/patches/kmscon-fixbuild.patch b/projects/Rockchip/packages/kmscon/patches/kmscon-fixbuild.patch new file mode 100644 index 00000000000..b7ff42d87dc --- /dev/null +++ b/projects/Rockchip/packages/kmscon/patches/kmscon-fixbuild.patch @@ -0,0 +1,32 @@ +--- a/src/pty.c ++++ b/src/pty.c +@@ -45,6 +45,7 @@ + #define LOG_SUBSYSTEM "pty" + + #define KMSCON_NREAD 16384 ++#define SIGUNUSED 31 + + struct kmscon_pty { + unsigned long ref; +--- a/src/uterm_vt.c ++++ b/src/uterm_vt.c +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + #include + #include + #include +--- a/configure.ac ++++ a/configure.ac +@@ -761,7 +761,7 @@ + + # check for offline man-pages stylesheet + AC_MSG_CHECKING([for docbook manpages stylesheet]) +-BUILD_MANPAGES_STYLESHEET="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl" ++BUILD_MANPAGES_STYLESHEET="https://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl" + AC_PATH_PROGS_FEATURE_CHECK([XSLTPROC_TMP], [xsltproc], + AS_IF([`"$ac_path_XSLTPROC_TMP" --nonet "$BUILD_MANPAGES_STYLESHEET" > /dev/null 2>&1`], + [BUILD_HAVE_MANPAGES_STYLESHEET=yes])) + diff --git a/projects/Rockchip/patches/linux/default/linux-2000-v4l2-wip-rkvdec-hevc.patch b/projects/Rockchip/patches/linux/default/linux-2000-v4l2-wip-rkvdec-hevc.patch index 1d31e882bda..5553b8009b3 100644 --- a/projects/Rockchip/patches/linux/default/linux-2000-v4l2-wip-rkvdec-hevc.patch +++ b/projects/Rockchip/patches/linux/default/linux-2000-v4l2-wip-rkvdec-hevc.patch @@ -2508,7 +2508,7 @@ index 000000000000..c3cceba837c2 + writel_relaxed(refer_addr | reg, + rkvdec->regs + RKVDEC_REG_H264_BASE_REFER(i)); + -+ reg = RKVDEC_POC_REFER(i < sl_params->num_active_dpb_entries ? dpb[i].pic_order_cnt[0] : 0); ++ reg = RKVDEC_POC_REFER(i < sl_params->num_active_dpb_entries ? dpb[i].pic_order_cnt_val : 0); + writel_relaxed(reg, + rkvdec->regs + RKVDEC_REG_H264_POC_REFER0(i)); + } @@ -2857,8 +2857,8 @@ index c3cceba837c2..5c341b5fa534 100644 writel_relaxed(refer_addr | reg, rkvdec->regs + RKVDEC_REG_H264_BASE_REFER(i)); -- reg = RKVDEC_POC_REFER(i < sl_params->num_active_dpb_entries ? dpb[i].pic_order_cnt[0] : 0); -+ reg = RKVDEC_POC_REFER(i < decode_params->num_active_dpb_entries ? dpb[i].pic_order_cnt[0] : 0); +- reg = RKVDEC_POC_REFER(i < sl_params->num_active_dpb_entries ? dpb[i].pic_order_cnt_val : 0); ++ reg = RKVDEC_POC_REFER(i < decode_params->num_active_dpb_entries ? dpb[i].pic_order_cnt_val : 0); writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_H264_POC_REFER0(i)); } @@ -3124,7 +3124,7 @@ index b5bb4c083dbc..8467084165df 100644 REF_PIC_LONG_TERM_L0(i)); WRITE_RPS(sl_params->ref_idx_l0[i], REF_PIC_IDX_L0(i)); + -+ if (dpb[sl_params->ref_idx_l0[i]].pic_order_cnt[0] > sl_params->slice_pic_order_cnt) ++ if (dpb[sl_params->ref_idx_l0[i]].pic_order_cnt_val > sl_params->slice_pic_order_cnt) + lowdelay = 0; + } @@ -3134,7 +3134,7 @@ index b5bb4c083dbc..8467084165df 100644 REF_PIC_LONG_TERM_L1(i)); WRITE_RPS(sl_params->ref_idx_l1[i], REF_PIC_IDX_L1(i)); + -+ if (dpb[sl_params->ref_idx_l1[i]].pic_order_cnt[0] > sl_params->slice_pic_order_cnt) ++ if (dpb[sl_params->ref_idx_l1[i]].pic_order_cnt_val > sl_params->slice_pic_order_cnt) + lowdelay = 0; } diff --git a/projects/Samsung/bootloader/release b/projects/Samsung/bootloader/release index aa0c91848b8..54a06c719b2 100644 --- a/projects/Samsung/bootloader/release +++ b/projects/Samsung/bootloader/release @@ -5,4 +5,4 @@ SRCDIR="$BUILD/image/system/usr/share/bootloader" DSTDIR="$RELEASE_DIR/3rdparty/bootloader" mkdir -p "$DSTDIR/dtb" - cp -a "$SRCDIR"/*xu4.dtb "$DSTDIR/dtb" + cp -a "$SRCDIR"/*xu{3,4}.dtb "$DSTDIR/dtb" diff --git a/projects/Samsung/devices/Exynos/options b/projects/Samsung/devices/Exynos/options index 8779965f1d2..b0ab2551dcd 100644 --- a/projects/Samsung/devices/Exynos/options +++ b/projects/Samsung/devices/Exynos/options @@ -13,10 +13,10 @@ esac # OpenGL-ES implementation to use - OPENGLES="libmali" + OPENGLES="mesa" # Graphic drivers to use - GRAPHIC_DRIVERS="mali" + GRAPHIC_DRIVERS="panfrost" # KODI Player implementation to use KODIPLAYER_DRIVER="$OPENGLES" diff --git a/projects/Samsung/filesystem/usr/bin/gputemp b/projects/Samsung/filesystem/usr/bin/gputemp new file mode 120000 index 00000000000..6476b954d2d --- /dev/null +++ b/projects/Samsung/filesystem/usr/bin/gputemp @@ -0,0 +1 @@ +cputemp \ No newline at end of file diff --git a/projects/Samsung/linux/linux.arm.conf b/projects/Samsung/linux/linux.arm.conf index be7568c2b5f..8aeaac6e663 100644 --- a/projects/Samsung/linux/linux.arm.conf +++ b/projects/Samsung/linux/linux.arm.conf @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.19.0 Kernel Configuration +# Linux/arm 5.19.4-rc1 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="armv7ve-libreelec-linux-gnueabihf-gcc-12.1.0 (GCC) 12.1.0" +CONFIG_CC_VERSION_TEXT="armv7ve-libreelec-linux-gnueabihf-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=120100 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -1514,7 +1514,7 @@ CONFIG_USB_IPHETH=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_RTL8153_ECM is not set +CONFIG_USB_RTL8153_ECM=y CONFIG_WLAN=y # CONFIG_WLAN_VENDOR_ADMTEK is not set CONFIG_ATH_COMMON=m @@ -2658,7 +2658,7 @@ CONFIG_MEDIA_CAMERA_SUPPORT=y # CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set # CONFIG_MEDIA_RADIO_SUPPORT is not set # CONFIG_MEDIA_SDR_SUPPORT is not set -# CONFIG_MEDIA_PLATFORM_SUPPORT is not set +CONFIG_MEDIA_PLATFORM_SUPPORT=y # CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types @@ -2672,6 +2672,7 @@ CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_V4L2_MEM2MEM_DEV=m # CONFIG_V4L2_FLASH_LED_CLASS is not set CONFIG_V4L2_FWNODE=m CONFIG_V4L2_ASYNC=m @@ -2761,9 +2762,108 @@ CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set +CONFIG_MEDIA_PLATFORM_DRIVERS=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_V4L_MEM2MEM_DRIVERS=y +# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set +# CONFIG_VIDEO_MUX is not set + +# +# Allegro DVT media platform drivers +# + +# +# Amlogic media platform drivers +# + +# +# Amphion drivers +# + +# +# Aspeed media platform drivers +# +# CONFIG_VIDEO_ASPEED is not set + +# +# Atmel media platform drivers +# + +# +# Cadence media platform drivers +# +# CONFIG_VIDEO_CADENCE_CSI2RX is not set +# CONFIG_VIDEO_CADENCE_CSI2TX is not set + +# +# Chips&Media media platform drivers +# + +# +# Intel media platform drivers +# + +# +# Marvell media platform drivers +# + +# +# Mediatek media platform drivers +# + +# +# NVidia media platform drivers +# + +# +# NXP media platform drivers +# + +# +# Qualcomm media platform drivers +# + +# +# Renesas media platform drivers +# + +# +# Rockchip media platform drivers +# + +# +# Samsung media platform drivers +# +CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC=m +# CONFIG_VIDEO_SAMSUNG_EXYNOS4_IS is not set +CONFIG_VIDEO_SAMSUNG_S5P_G2D=m +CONFIG_VIDEO_SAMSUNG_S5P_JPEG=m +CONFIG_VIDEO_SAMSUNG_S5P_MFC=m + +# +# STMicroelectronics media platform drivers +# + +# +# Sunxi media platform drivers +# + +# +# Texas Instruments drivers +# + +# +# VIA media platform drivers +# + +# +# Xilinx media platform drivers +# +# CONFIG_VIDEO_XILINX is not set CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers @@ -2986,6 +3086,8 @@ CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_DISPLAY_DP_HELPER=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DP_CEC is not set +CONFIG_DRM_GEM_SHMEM_HELPER=m +CONFIG_DRM_SCHED=m # # I2C encoder or helper chips @@ -3028,11 +3130,10 @@ CONFIG_DRM_EXYNOS_HDMI=y # # Sub-drivers # -# CONFIG_DRM_EXYNOS_G2D is not set -# CONFIG_DRM_EXYNOS_FIMC is not set +CONFIG_DRM_EXYNOS_IPP=y +CONFIG_DRM_EXYNOS_FIMC=y # CONFIG_DRM_EXYNOS_ROTATOR is not set -# CONFIG_DRM_EXYNOS_SCALER is not set -# CONFIG_DRM_EXYNOS_GSC is not set +CONFIG_DRM_EXYNOS_SCALER=y # CONFIG_DRM_UDL is not set # CONFIG_DRM_ARMADA is not set # CONFIG_DRM_RCAR_DW_HDMI is not set @@ -3129,7 +3230,6 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set -# CONFIG_DRM_FSL_LDB is not set # CONFIG_DRM_ITE_IT6505 is not set # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9211 is not set @@ -3183,7 +3283,7 @@ CONFIG_DRM_ANALOGIX_DP=y # CONFIG_DRM_PL111 is not set # CONFIG_DRM_TVE200 is not set # CONFIG_DRM_LIMA is not set -# CONFIG_DRM_PANFROST is not set +CONFIG_DRM_PANFROST=m # CONFIG_DRM_MCDE is not set # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_GUD is not set @@ -5464,7 +5564,6 @@ CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m -# CONFIG_CRYPTO_BLAKE2S is not set # CONFIG_CRYPTO_CRCT10DIF is not set CONFIG_CRYPTO_GHASH=y # CONFIG_CRYPTO_POLY1305 is not set diff --git a/projects/Samsung/options b/projects/Samsung/options index 73f1c0edc5f..f1ab3a31877 100644 --- a/projects/Samsung/options +++ b/projects/Samsung/options @@ -65,7 +65,7 @@ # additional packages to install: # Space separated list is supported, # e.g. ADDITIONAL_PACKAGES="PACKAGE1 PACKAGE2" - ADDITIONAL_PACKAGES="dtc" + ADDITIONAL_PACKAGES="dtc emmctool" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers diff --git a/projects/Samsung/patches/kodi/kodi-0001-LOCAL-WinSystemGbmGLESContext-wait-longer-for-vsync.patch b/projects/Samsung/patches/kodi/kodi-0001-LOCAL-WinSystemGbmGLESContext-wait-longer-for-vsync.patch new file mode 100644 index 00000000000..ee0c418dfa7 --- /dev/null +++ b/projects/Samsung/patches/kodi/kodi-0001-LOCAL-WinSystemGbmGLESContext-wait-longer-for-vsync.patch @@ -0,0 +1,28 @@ +From b89fb39cb0e28456016828f37ae4756bf66101b6 Mon Sep 17 00:00:00 2001 +From: Christian Hewitt +Date: Sun, 23 Jan 2022 07:38:32 +0000 +Subject: [PATCH 1/2] LOCAL: WinSystemGbmGLESContext: wait longer for vsync + +Waiting longer for vsync improves idle CPU consumption on ARM devices + +Signed-off-by: Christian Hewitt +--- + xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp b/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp +index 0d071c31f1..52ae4c1ef2 100644 +--- a/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp ++++ b/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp +@@ -149,7 +149,7 @@ void CWinSystemGbmGLESContext::PresentRender(bool rendered, bool videoLayer) + } + else + { +- KODI::TIME::Sleep(10ms); ++ KODI::TIME::Sleep(40ms); + } + } + +-- +2.17.1 + diff --git a/projects/Samsung/patches/kodi/kodi-0001-use-EGL_KHR_platform_gbm-not-EGL_MESA_platform_gbm.patch b/projects/Samsung/patches/kodi/kodi-0001-use-EGL_KHR_platform_gbm-not-EGL_MESA_platform_gbm.patch deleted file mode 100644 index c2f01dded9b..00000000000 --- a/projects/Samsung/patches/kodi/kodi-0001-use-EGL_KHR_platform_gbm-not-EGL_MESA_platform_gbm.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 786ec67197d42184be2fcdecc24112adbc0692b3 Mon Sep 17 00:00:00 2001 -From: Christian Hewitt -Date: Mon, 6 Jul 2020 06:56:46 +0000 -Subject: [PATCH] use EGL_KHR_platform_gbm not EGL_MESA_platform_gbm - ---- - xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp | 2 ++-- - xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp | 2 +- - 2 file changed, 3 insertion(+), 3 deletion(-) - -diff --git a/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp b/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp -index d8d775dcad..21efc02d34 100644 ---- a/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp -+++ b/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp -@@ -23,7 +23,7 @@ bool CWinSystemGbmEGLContext::InitWindowSystemEGL(EGLint renderableType, EGLint - return false; - } - -- if (!m_eglContext.CreatePlatformDisplay(m_GBM->GetDevice()->Get(), m_GBM->GetDevice()->Get())) -+ if (!m_eglContext.CreatePlatformDisplay(m_GBM->GetDevice()->Get(), reinterpret_cast(m_GBM->GetDevice()->Get()))) - { - return false; - } -@@ -87,7 +87,7 @@ - - if (!m_eglContext.CreatePlatformSurface( - m_GBM->GetDevice()->GetSurface()->Get(), -- reinterpret_cast(m_GBM->GetDevice()->GetSurface()->Get()))) -+ reinterpret_cast(m_GBM->GetDevice()->GetSurface()->Get()))) - { - return false; - } -diff --git a/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp b/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp -index cf293900ca..5b96ebaf21 100644 ---- a/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp -+++ b/xbmc/windowing/gbm/WinSystemGbmGLESContext.cpp -@@ -35,7 +35,7 @@ - using namespace KODI::WINDOWING::GBM; - - CWinSystemGbmGLESContext::CWinSystemGbmGLESContext() --: CWinSystemGbmEGLContext(EGL_PLATFORM_GBM_MESA, "EGL_MESA_platform_gbm") -+: CWinSystemGbmEGLContext(EGL_PLATFORM_GBM_MESA, "EGL_KHR_platform_gbm") - {} - - std::unique_ptr CWinSystemBase::CreateWinSystem() --- -2.17.1 diff --git a/projects/Samsung/patches/kodi/kodi-0002-LOCAL-changes-for-Odroid-XU3-XU4.patch b/projects/Samsung/patches/kodi/kodi-0002-LOCAL-changes-for-Odroid-XU3-XU4.patch new file mode 100644 index 00000000000..4b516659534 --- /dev/null +++ b/projects/Samsung/patches/kodi/kodi-0002-LOCAL-changes-for-Odroid-XU3-XU4.patch @@ -0,0 +1,264 @@ +From eb476ae718b8433402547bad0e3fa2ba69e1c1ee Mon Sep 17 00:00:00 2001 +From: Christian Hewitt +Date: Fri, 24 Jun 2022 18:04:13 +0000 +Subject: [PATCH 2/2] LOCAL: changes for Odroid XU3/XU4 + +--- + cmake/modules/FindGBM.cmake | 12 ++-- + system/settings/linux.xml | 2 +- + .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 66 +++++++++++++++++-- + .../DVDCodecs/Video/DVDVideoCodecFFmpeg.h | 1 + + xbmc/windowing/Resolution.cpp | 2 + + xbmc/windowing/gbm/GBMUtils.cpp | 28 ++++---- + xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp | 2 +- + xbmc/windowing/gbm/drm/DRMUtils.cpp | 2 +- + 8 files changed, 90 insertions(+), 25 deletions(-) + +diff --git a/cmake/modules/FindGBM.cmake b/cmake/modules/FindGBM.cmake +index 37a26a7bc4..53cc04663e 100644 +--- a/cmake/modules/FindGBM.cmake ++++ b/cmake/modules/FindGBM.cmake +@@ -51,12 +51,12 @@ if(GBM_FOUND) + set(GBM_LIBRARIES ${GBM_LIBRARY}) + set(GBM_INCLUDE_DIRS ${GBM_INCLUDE_DIR}) + set(GBM_DEFINITIONS -DHAVE_GBM=1) +- if(GBM_HAS_BO_MAP) +- list(APPEND GBM_DEFINITIONS -DHAS_GBM_BO_MAP=1) +- endif() +- if(GBM_HAS_MODIFIERS) +- list(APPEND GBM_DEFINITIONS -DHAS_GBM_MODIFIERS=1) +- endif() ++ #if(GBM_HAS_BO_MAP) ++ # list(APPEND GBM_DEFINITIONS -DHAS_GBM_BO_MAP=1) ++ #endif() ++ #if(GBM_HAS_MODIFIERS) ++ # list(APPEND GBM_DEFINITIONS -DHAS_GBM_MODIFIERS=1) ++ #endif() + if(NOT TARGET GBM::GBM) + add_library(GBM::GBM UNKNOWN IMPORTED) + set_target_properties(GBM::GBM PROPERTIES +diff --git a/system/settings/linux.xml b/system/settings/linux.xml +index 531974f3f4..6244ef7515 100644 +--- a/system/settings/linux.xml ++++ b/system/settings/linux.xml +@@ -177,7 +177,7 @@ + + + 3 +- true ++ false + + + +diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +index a7dc0890e8..ad8c41dcf0 100644 +--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ++++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +@@ -42,6 +42,16 @@ extern "C" { + #define RINT lrint + #endif + ++/* define the FFMPEG codecs to use */ ++#define MPEG2TS_FFMPEG_CODEC "mpeg2_v4l2m2m" ++#define H263_FFMPEG_CODEC "h263_v4l2m2m" ++#define H264_FFMPEG_CODEC "h264_v4l2m2m" ++#define MPEG4_FFMPEG_CODEC "mpeg4_v4l2m2m" ++#define MPEG1_FFMPEG_CODEC "mpeg1_v4l2m2m" ++#define MPEG2_FFMPEG_CODEC "mpeg2_v4l2m2m" ++#define VC1_FFMPEG_CODEC "vc1_v4l2m2m" ++#define VP8_FFMPEG_CODEC "vp8_v4l2m2m" ++ + enum DecoderState + { + STATE_NONE, +@@ -346,6 +356,41 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + pCodec = avcodec_find_decoder_by_name("av1"); + + if (!pCodec) ++ if(!m_useSoftDecoder) ++ { ++ switch(hints.codec) ++ { ++ case AV_CODEC_ID_MPEG4: ++ pCodec = avcodec_find_decoder_by_name(MPEG4_FFMPEG_CODEC); ++ break; ++ case AV_CODEC_ID_MPEG2TS: ++ pCodec = avcodec_find_decoder_by_name(MPEG2TS_FFMPEG_CODEC); ++ break; ++ case AV_CODEC_ID_H263: ++ pCodec = avcodec_find_decoder_by_name(H263_FFMPEG_CODEC); ++ break; ++ case AV_CODEC_ID_H264: ++ pCodec = avcodec_find_decoder_by_name(H264_FFMPEG_CODEC); ++ break; ++ case AV_CODEC_ID_MPEG1VIDEO: ++ pCodec = avcodec_find_decoder_by_name(MPEG1_FFMPEG_CODEC); ++ break; ++ case AV_CODEC_ID_MPEG2VIDEO: ++ pCodec = avcodec_find_decoder_by_name(MPEG2_FFMPEG_CODEC); ++ break; ++ case AV_CODEC_ID_VC1: ++ pCodec = avcodec_find_decoder_by_name(VC1_FFMPEG_CODEC); ++ break; ++ case AV_CODEC_ID_VP8: ++ pCodec = avcodec_find_decoder_by_name(VP8_FFMPEG_CODEC); ++ break; ++ default: ++ pCodec = avcodec_find_decoder(hints.codec); ++ break; ++ } ++ } ++ ++ if(pCodec == NULL) + pCodec = avcodec_find_decoder(hints.codec); + + if(pCodec == NULL) +@@ -446,7 +491,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + } + + UpdateName(); +- const char* pixFmtName = av_get_pix_fmt_name(m_pCodecContext->pix_fmt); ++ const char* pixFmtName = av_get_pix_fmt_name(GetFormat(m_pCodecContext, &m_pCodecContext->pix_fmt)); + m_processInfo.SetVideoDimensions(m_pCodecContext->coded_width, m_pCodecContext->coded_height); + m_processInfo.SetVideoPixelFormat(pixFmtName ? pixFmtName : ""); + +@@ -529,15 +574,22 @@ void CDVDVideoCodecFFmpeg::SetFilters() + + void CDVDVideoCodecFFmpeg::UpdateName() + { ++ bool isHW = false; + if(m_pCodecContext->codec->name) ++ { + m_name = std::string("ff-") + m_pCodecContext->codec->name; ++ if(strstr(m_pCodecContext->codec->name, "v4l2m2m") != NULL) ++ isHW = true; ++ } + else + m_name = "ffmpeg"; + + if(m_pHardware) ++ { + m_name += "-" + m_pHardware->Name(); +- +- m_processInfo.SetVideoDecoderName(m_name, m_pHardware ? true : false); ++ isHW = true; ++ } ++ m_processInfo.SetVideoDecoderName(m_name, isHW ? true : false); + + CLog::Log(LOGDEBUG, "CDVDVideoCodecFFmpeg - Updated codec: {}", m_name); + } +@@ -784,8 +836,14 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecFFmpeg::GetPicture(VideoPicture* pVideoPi + if (m_pDecodedFrame->interlaced_frame) + m_interlaced = true; + else ++ { + m_interlaced = false; +- ++ if (m_useSoftDecoder) ++ { ++ m_useSoftDecoder = false; ++ return VC_REOPEN; ++ } ++ } + if (!m_processInfo.GetVideoInterlaced() && m_interlaced) + m_processInfo.SetVideoInterlaced(m_interlaced); + +diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +index 86c83cd1a0..a5552d3350 100644 +--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ++++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +@@ -95,6 +95,7 @@ protected: + bool m_requestSkipDeint = false; + int m_codecControlFlags = 0; + bool m_interlaced = false; ++ bool m_useSoftDecoder = true; + double m_DAR = 1.0; + CDVDStreamInfo m_hints; + CDVDCodecOptions m_options; +diff --git a/xbmc/windowing/Resolution.cpp b/xbmc/windowing/Resolution.cpp +index 4dcd2480ff..78e37add98 100644 +--- a/xbmc/windowing/Resolution.cpp ++++ b/xbmc/windowing/Resolution.cpp +@@ -70,6 +70,8 @@ float RESOLUTION_INFO::DisplayRatio() const + + RESOLUTION CResolutionUtils::ChooseBestResolution(float fps, int width, int height, bool is3D) + { ++ fps = static_cast(std::round(fps)); ++ + RESOLUTION res = CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(); + float weight; + +diff --git a/xbmc/windowing/gbm/GBMUtils.cpp b/xbmc/windowing/gbm/GBMUtils.cpp +index 5267c93c8f..bc0a9b1c96 100644 +--- a/xbmc/windowing/gbm/GBMUtils.cpp ++++ b/xbmc/windowing/gbm/GBMUtils.cpp +@@ -74,24 +74,28 @@ CGBMUtils::CGBMDevice::CGBMSurface::CGBMSurface(gbm_surface* surface) : m_surfac + { + } + ++#define MAX_SURFACE_BUFFERS 3 + CGBMUtils::CGBMDevice::CGBMSurface::CGBMSurfaceBuffer* CGBMUtils::CGBMDevice::CGBMSurface:: + LockFrontBuffer() + { +- m_buffers.emplace(std::make_unique(m_surface)); +- +- if (!static_cast(gbm_surface_has_free_buffers(m_surface))) ++ /* Fix for ODROID XU4, gbm_surface_has_free_buffers doesn't seem to report if there ++ * are no buffers available instead GEM buffers are running out, so we manually empty ++ * the buffers here for a maximum of three ++ */ ++ std::call_once( ++ flag, [this]() { CLog::Log(LOGDEBUG, "CGBMUtils - using {} buffers", MAX_SURFACE_BUFFERS); }); ++ ++ if (m_buffers.size() >= MAX_SURFACE_BUFFERS) + { +- /* +- * We want to use call_once here because we want it to be logged the first time that +- * we have to release buffers. This means that the maximum amount of buffers had been reached. +- * For mesa this should be 4 buffers but it may vary across other implementations. +- */ +- std::call_once( +- flag, [this]() { CLog::Log(LOGDEBUG, "CGBMUtils - using {} buffers", m_buffers.size()); }); +- +- m_buffers.pop(); ++ while (!m_buffers.empty()) ++ { ++ m_buffers.front(); ++ m_buffers.pop(); ++ } + } + ++ m_buffers.emplace(std::make_unique(m_surface)); ++ + return m_buffers.back().get(); + } + +diff --git a/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp b/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp +index 83a59413f7..dbddbbbd55 100644 +--- a/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp ++++ b/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp +@@ -23,7 +23,7 @@ bool CWinSystemGbmEGLContext::InitWindowSystemEGL(EGLint renderableType, EGLint + return false; + } + +- if (!m_eglContext.CreatePlatformDisplay(m_GBM->GetDevice()->Get(), m_GBM->GetDevice()->Get())) ++ if (!m_eglContext.CreatePlatformDisplay(m_GBM->GetDevice()->Get(), reinterpret_cast(m_GBM->GetDevice()->Get()))) + { + return false; + } +diff --git a/xbmc/windowing/gbm/drm/DRMUtils.cpp b/xbmc/windowing/gbm/drm/DRMUtils.cpp +index b424dffe80..9924756b7a 100644 +--- a/xbmc/windowing/gbm/drm/DRMUtils.cpp ++++ b/xbmc/windowing/gbm/drm/DRMUtils.cpp +@@ -189,7 +189,7 @@ bool CDRMUtils::FindPlanes() + auto videoPlane = std::find_if(m_planes.begin(), m_planes.end(), [&i](auto& plane) { + if (plane->GetPossibleCrtcs() & (1 << i)) + { +- return plane->SupportsFormat(DRM_FORMAT_NV12); ++ return (plane->SupportsFormat(DRM_FORMAT_NV12) || plane->SupportsFormat(DRM_FORMAT_XRGB8888)); + } + return false; + }); +-- +2.17.1 + diff --git a/projects/Samsung/patches/linux/samsung-0001-HACK-drm-set-DRM_RENDER_ALLOW-flag-on-DRM_IOCTL_MODE.patch b/projects/Samsung/patches/linux/samsung-0001-HACK-drm-set-DRM_RENDER_ALLOW-flag-on-DRM_IOCTL_MODE.patch new file mode 100644 index 00000000000..db95f41eccb --- /dev/null +++ b/projects/Samsung/patches/linux/samsung-0001-HACK-drm-set-DRM_RENDER_ALLOW-flag-on-DRM_IOCTL_MODE.patch @@ -0,0 +1,34 @@ +From 009b15525e53e5d96dd75c43543b57f3505c7081 Mon Sep 17 00:00:00 2001 +From: Dongwon Kim +Date: Fri, 24 Jun 2022 12:48:38 +0000 +Subject: [PATCH 01/21] HACK: drm: set DRM_RENDER_ALLOW flag on + DRM_IOCTL_MODE_CREATE/DESTROY_DUMB ioctls + +Render clients should be able to create/destroy dumb object to import +and use it as render buffer in case the default DRM device is different +from the render device (i.e. kmsro). + +Signed-off-by: Dongwon Kim +--- + drivers/gpu/drm/drm_ioctl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c +index 51fcf1298023..8984c60037b2 100644 +--- a/drivers/gpu/drm/drm_ioctl.c ++++ b/drivers/gpu/drm/drm_ioctl.c +@@ -672,9 +672,9 @@ static const struct drm_ioctl_desc drm_ioctls[] = { + DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb_ioctl, 0), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER), +- DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, 0), ++ DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_RENDER_ALLOW), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, 0), +- DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, 0), ++ DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_RENDER_ALLOW), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, 0), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER), + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER), +-- +2.17.1 + diff --git a/projects/Samsung/patches/linux/samsung-0002-WIP-media-videobuf2-always-enable-V4L2_MEMORY_FLAG_N.patch b/projects/Samsung/patches/linux/samsung-0002-WIP-media-videobuf2-always-enable-V4L2_MEMORY_FLAG_N.patch new file mode 100644 index 00000000000..1d5beb8b997 --- /dev/null +++ b/projects/Samsung/patches/linux/samsung-0002-WIP-media-videobuf2-always-enable-V4L2_MEMORY_FLAG_N.patch @@ -0,0 +1,29 @@ +From 4aca48cc2517dcd5abab9b0cca22c65c54d75a03 Mon Sep 17 00:00:00 2001 +From: Pavel Golikov +Date: Fri, 24 Jun 2022 15:42:59 +0000 +Subject: [PATCH 02/21] WIP: media: videobuf2: always enable + V4L2_MEMORY_FLAG_NON_COHERENT + +Always enable V4L2_MEMORY_FLAG_NON_COHERENT for all V4L queues. + +Signed-off-by: Pavel Golikov +--- + drivers/media/common/videobuf2/videobuf2-v4l2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c +index 075d24ebf44c..ecbb5f7d3f23 100644 +--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c ++++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c +@@ -704,7 +704,7 @@ static void validate_memory_flags(struct vb2_queue *q, + *flags = 0; + } else { + /* Clear all unknown flags. */ +- *flags &= V4L2_MEMORY_FLAG_NON_COHERENT; ++ *flags |= V4L2_MEMORY_FLAG_NON_COHERENT; + } + } + +-- +2.17.1 + diff --git a/projects/Samsung/patches/linux/samsung-0003-WIP-iommu-io-pgtable-arm-Fix-coherency-support-for-M.patch b/projects/Samsung/patches/linux/samsung-0003-WIP-iommu-io-pgtable-arm-Fix-coherency-support-for-M.patch new file mode 100644 index 00000000000..0b69a600d4f --- /dev/null +++ b/projects/Samsung/patches/linux/samsung-0003-WIP-iommu-io-pgtable-arm-Fix-coherency-support-for-M.patch @@ -0,0 +1,37 @@ +From 530424bde16e74a8542d34709ac13be3c426afe1 Mon Sep 17 00:00:00 2001 +From: Pavel Golikov +Date: Fri, 24 Jun 2022 15:54:16 +0000 +Subject: [PATCH 03/21] WIP: iommu/io-pgtable-arm: Fix coherency support for + Mali LPAE + +Mali T628r0p1 which may be found in Samsung Exynos 5422 SOC is +definitely not dma coherent, and it is not happy with PTE_SH_OS bit set +by default in commit 728da60da7c1 ("iommu/io-pgtable-arm: Support +coherency for Mali LPAE"). Use PTE_SH_IS by default for non dma +coherent Mali GPUs. + +Signed-off-by: Pavel Golikov +--- + drivers/iommu/io-pgtable-arm.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c +index 94ff319ae8ac..9ac55085e141 100644 +--- a/drivers/iommu/io-pgtable-arm.c ++++ b/drivers/iommu/io-pgtable-arm.c +@@ -457,9 +457,10 @@ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data, + * "outside the GPU" (i.e. either the Inner or System domain in CPU + * terms, depending on coherency). + */ +- if (prot & IOMMU_CACHE && data->iop.fmt != ARM_MALI_LPAE) ++ if (prot & IOMMU_CACHE || ++ (data->iop.fmt == ARM_MALI_LPAE && !data->iop.cfg.coherent_walk)) + pte |= ARM_LPAE_PTE_SH_IS; +- else ++ else if (data->iop.fmt == ARM_MALI_LPAE) + pte |= ARM_LPAE_PTE_SH_OS; + + if (prot & IOMMU_NOEXEC) +-- +2.17.1 + diff --git a/projects/Samsung/patches/linux/samsung-0004-MEMEKA-media-s5p-jpeg-Enable-decoding-with-multiple-.patch b/projects/Samsung/patches/linux/samsung-0004-MEMEKA-media-s5p-jpeg-Enable-decoding-with-multiple-.patch deleted file mode 100644 index b6ebfbf0e74..00000000000 --- a/projects/Samsung/patches/linux/samsung-0004-MEMEKA-media-s5p-jpeg-Enable-decoding-with-multiple-.patch +++ /dev/null @@ -1,112 +0,0 @@ -From c1c6c93af475ebfa806760f8883b3f06c3c19bbe Mon Sep 17 00:00:00 2001 -From: memeka -Date: Thu, 24 Jan 2019 16:07:24 +1030 -Subject: [PATCH 04/25] MEMEKA: media: s5p-jpeg: Enable decoding with multiple - buffers - -Signed-off-by: memeka ---- - drivers/media/platform/s5p-jpeg/jpeg-core.c | 45 ++++++++++++++++----- - 1 file changed, 35 insertions(+), 10 deletions(-) - -diff --git a/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c b/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c -index 86bda3947110..3015a9c350f2 100644 ---- a/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c -+++ b/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c -@@ -1797,6 +1797,31 @@ static int exynos3250_jpeg_try_crop(struct s5p_jpeg_ctx *ctx, - * V4L2 controls - */ - -+static int vidioc_decoder_cmd(struct file *file, void *priv, -+ struct v4l2_decoder_cmd *cmd) -+{ -+ struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv); -+ struct vb2_queue *vq_src = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT); -+ struct vb2_v4l2_buffer *buf; -+ -+ switch (cmd->cmd) { -+ case V4L2_DEC_CMD_STOP: -+ if (cmd->flags != 0) -+ return -EINVAL; -+ if (!vb2_is_streaming(vq_src)) -+ return -EINVAL; -+ -+ buf = v4l2_m2m_last_src_buf(ctx->fh.m2m_ctx); -+ buf->flags |= V4L2_BUF_FLAG_LAST; -+ -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ - static int s5p_jpeg_g_selection(struct file *file, void *priv, - struct v4l2_selection *s) - { -@@ -1831,9 +1856,6 @@ static int s5p_jpeg_g_selection(struct file *file, void *priv, - return 0; - } - --/* -- * V4L2 controls -- */ - static int s5p_jpeg_s_selection(struct file *file, void *fh, - struct v4l2_selection *s) - { -@@ -2025,6 +2047,8 @@ static const struct v4l2_ioctl_ops s5p_jpeg_ioctl_ops = { - .vidioc_streamon = v4l2_m2m_ioctl_streamon, - .vidioc_streamoff = v4l2_m2m_ioctl_streamoff, - -+ .vidioc_decoder_cmd = vidioc_decoder_cmd, -+ - .vidioc_g_selection = s5p_jpeg_g_selection, - .vidioc_s_selection = s5p_jpeg_s_selection, - -@@ -2471,13 +2495,6 @@ static int s5p_jpeg_queue_setup(struct vb2_queue *vq, - - size = q_data->size; - -- /* -- * header is parsed during decoding and parsed information stored -- * in the context so we do not allow another buffer to overwrite it -- */ -- if (ctx->mode == S5P_JPEG_DECODE) -- count = 1; -- - *nbuffers = count; - *nplanes = 1; - sizes[0] = size; -@@ -2588,6 +2605,7 @@ static int s5p_jpeg_start_streaming(struct vb2_queue *q, unsigned int count) - static void s5p_jpeg_stop_streaming(struct vb2_queue *q) - { - struct s5p_jpeg_ctx *ctx = vb2_get_drv_priv(q); -+ struct vb2_v4l2_buffer *buf; - - /* - * STREAMOFF is an acknowledgment for resolution change event. -@@ -2600,6 +2618,11 @@ static void s5p_jpeg_stop_streaming(struct vb2_queue *q) - ctx->state = JPEGCTX_RUNNING; - } - -+ while ((buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx))) -+ v4l2_m2m_buf_done(buf, VB2_BUF_STATE_ERROR); -+ while ((buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx))) -+ v4l2_m2m_buf_done(buf, VB2_BUF_STATE_ERROR); -+ - pm_runtime_put(ctx->jpeg->dev); - } - -@@ -2839,6 +2862,8 @@ static irqreturn_t exynos3250_jpeg_irq(int irq, void *dev_id) - v4l2_m2m_buf_done(src_buf, state); - if (curr_ctx->mode == S5P_JPEG_ENCODE) - vb2_set_plane_payload(&dst_buf->vb2_buf, 0, payload_size); -+ if (src_buf->flags & V4L2_BUF_FLAG_LAST) -+ dst_buf->flags |= V4L2_BUF_FLAG_LAST; - v4l2_m2m_buf_done(dst_buf, state); - - curr_ctx->subsampling = --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0004-WIP-soc-samsung-pm_domains-Bring-back-old-driver-imp.patch b/projects/Samsung/patches/linux/samsung-0004-WIP-soc-samsung-pm_domains-Bring-back-old-driver-imp.patch new file mode 100644 index 00000000000..b15caee42a1 --- /dev/null +++ b/projects/Samsung/patches/linux/samsung-0004-WIP-soc-samsung-pm_domains-Bring-back-old-driver-imp.patch @@ -0,0 +1,169 @@ +From 77acb18b46a9464521f4f9af26f87d8a5f644515 Mon Sep 17 00:00:00 2001 +From: Pavel Golikov +Date: Fri, 24 Jun 2022 15:56:41 +0000 +Subject: [PATCH 04/21] WIP: soc: samsung: pm_domains: Bring back old driver + implementation + +Using new implementation decreases Mali GPU performance significantly +(with both KBase and Panfrost drivers). + +Signed-off-by: Pavel Golikov +--- + drivers/soc/samsung/pm_domains.c | 97 ++++++++++++++++---------------- + 1 file changed, 49 insertions(+), 48 deletions(-) + +diff --git a/drivers/soc/samsung/pm_domains.c b/drivers/soc/samsung/pm_domains.c +index d07f3c9d6903..1022d40eb700 100644 +--- a/drivers/soc/samsung/pm_domains.c ++++ b/drivers/soc/samsung/pm_domains.c +@@ -16,7 +16,7 @@ + #include + #include + #include +-#include ++#include + + struct exynos_pm_domain_config { + /* Value for LOCAL_PWR_CFG and STATUS fields for each domain */ +@@ -72,15 +72,15 @@ static int exynos_pd_power_off(struct generic_pm_domain *domain) + return exynos_pd_power(domain, false); + } + +-static const struct exynos_pm_domain_config exynos4210_cfg = { ++static const struct exynos_pm_domain_config exynos4210_cfg __initconst = { + .local_pwr_cfg = 0x7, + }; + +-static const struct exynos_pm_domain_config exynos5433_cfg = { ++static const struct exynos_pm_domain_config exynos5433_cfg __initconst = { + .local_pwr_cfg = 0xf, + }; + +-static const struct of_device_id exynos_pm_domain_of_match[] = { ++static const struct of_device_id exynos_pm_domain_of_match[] __initconst = { + { + .compatible = "samsung,exynos4210-pd", + .data = &exynos4210_cfg, +@@ -91,7 +91,7 @@ static const struct of_device_id exynos_pm_domain_of_match[] = { + { }, + }; + +-static const char *exynos_get_domain_name(struct device_node *node) ++static __init const char *exynos_get_domain_name(struct device_node *node) + { + const char *name; + +@@ -100,44 +100,60 @@ static const char *exynos_get_domain_name(struct device_node *node) + return kstrdup_const(name, GFP_KERNEL); + } + +-static int exynos_pd_probe(struct platform_device *pdev) ++static __init int exynos4_pm_init_power_domain(void) + { +- const struct exynos_pm_domain_config *pm_domain_cfg; +- struct device *dev = &pdev->dev; +- struct device_node *np = dev->of_node; +- struct of_phandle_args child, parent; +- struct exynos_pm_domain *pd; +- int on, ret; ++ struct device_node *np; ++ const struct of_device_id *match; + +- pm_domain_cfg = of_device_get_match_data(dev); +- pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); +- if (!pd) +- return -ENOMEM; ++ for_each_matching_node_and_match(np, exynos_pm_domain_of_match, &match) { ++ const struct exynos_pm_domain_config *pm_domain_cfg; ++ struct exynos_pm_domain *pd; ++ int on; + +- pd->pd.name = exynos_get_domain_name(np); +- if (!pd->pd.name) +- return -ENOMEM; ++ pm_domain_cfg = match->data; + +- pd->base = of_iomap(np, 0); +- if (!pd->base) { +- kfree_const(pd->pd.name); +- return -ENODEV; +- } ++ pd = kzalloc(sizeof(*pd), GFP_KERNEL); ++ if (!pd) { ++ of_node_put(np); ++ return -ENOMEM; ++ } ++ pd->pd.name = exynos_get_domain_name(np); ++ if (!pd->pd.name) { ++ kfree(pd); ++ of_node_put(np); ++ return -ENOMEM; ++ } + +- pd->pd.power_off = exynos_pd_power_off; +- pd->pd.power_on = exynos_pd_power_on; +- pd->local_pwr_cfg = pm_domain_cfg->local_pwr_cfg; ++ pd->base = of_iomap(np, 0); ++ if (!pd->base) { ++ pr_warn("%s: failed to map memory\n", __func__); ++ kfree_const(pd->pd.name); ++ kfree(pd); ++ continue; ++ } ++ ++ pd->pd.power_off = exynos_pd_power_off; ++ pd->pd.power_on = exynos_pd_power_on; ++ pd->local_pwr_cfg = pm_domain_cfg->local_pwr_cfg; + +- on = readl_relaxed(pd->base + 0x4) & pd->local_pwr_cfg; ++ on = readl_relaxed(pd->base + 0x4) & pd->local_pwr_cfg; ++ ++ pm_genpd_init(&pd->pd, NULL, !on); ++ of_genpd_add_provider_simple(np, &pd->pd); ++ } + +- pm_genpd_init(&pd->pd, NULL, !on); +- ret = of_genpd_add_provider_simple(np, &pd->pd); ++ /* Assign the child power domains to their parents */ ++ for_each_matching_node(np, exynos_pm_domain_of_match) { ++ struct of_phandle_args child, parent; + +- if (ret == 0 && of_parse_phandle_with_args(np, "power-domains", +- "#power-domain-cells", 0, &parent) == 0) { + child.np = np; + child.args_count = 0; + ++ if (of_parse_phandle_with_args(np, "power-domains", ++ "#power-domain-cells", 0, ++ &parent) != 0) ++ continue; ++ + if (of_genpd_add_subdomain(&parent, &child)) + pr_warn("%pOF failed to add subdomain: %pOF\n", + parent.np, child.np); +@@ -146,21 +162,6 @@ static int exynos_pd_probe(struct platform_device *pdev) + parent.np, child.np); + } + +- pm_runtime_enable(dev); +- return ret; +-} +- +-static struct platform_driver exynos_pd_driver = { +- .probe = exynos_pd_probe, +- .driver = { +- .name = "exynos-pd", +- .of_match_table = exynos_pm_domain_of_match, +- .suppress_bind_attrs = true, +- } +-}; +- +-static __init int exynos4_pm_init_power_domain(void) +-{ +- return platform_driver_register(&exynos_pd_driver); ++ return 0; + } + core_initcall(exynos4_pm_init_power_domain); +-- +2.17.1 + diff --git a/projects/Samsung/patches/linux/samsung-0025-WIP-ARM-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch b/projects/Samsung/patches/linux/samsung-0005-WIP-arm-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch similarity index 63% rename from projects/Samsung/patches/linux/samsung-0025-WIP-ARM-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch rename to projects/Samsung/patches/linux/samsung-0005-WIP-arm-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch index fd9a39b4f04..fc29377c665 100644 --- a/projects/Samsung/patches/linux/samsung-0025-WIP-ARM-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch +++ b/projects/Samsung/patches/linux/samsung-0005-WIP-arm-dts-exynos5422-HC1-XU3-XU4-model-name-is-ODR.patch @@ -1,39 +1,39 @@ -From ca94000c34d98c1bd83bdcabeee8cb79958c56e1 Mon Sep 17 00:00:00 2001 +From 34cfc53ec99e6e3356bb6e06ecd68faa4d2e4bac Mon Sep 17 00:00:00 2001 From: Christian Hewitt Date: Wed, 29 Apr 2020 10:37:08 +0000 -Subject: [PATCH 25/25] WIP: ARM: dts: exynos5422: HC1/XU3/XU4 model name is +Subject: [PATCH 05/21] WIP: arm: dts: exynos5422: HC1/XU3/XU4 model name is ODROID not Odroid Cosmetic change to model and audio card name for HC1/XU3/XU4 to -put ODROID in capitals (as per Hardkernel branding). Also fixup -some unneeded backslashes and wrap lines per kernel standards. +put ODROID in capitals (as per Hardkernel branding). Signed-off-by: Christian Hewitt --- - arch/arm/boot/dts/exynos5422-odroidhc1.dts | 4 ++-- + arch/arm/boot/dts/exynos5422-odroidhc1.dts | 5 ++--- arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi | 2 +- - arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts | 5 +++-- - arch/arm/boot/dts/exynos5422-odroidxu3.dts | 5 +++-- - arch/arm/boot/dts/exynos5422-odroidxu4.dts | 6 +++--- - 5 files changed, 12 insertions(+), 10 deletions(-) + arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts | 2 +- + arch/arm/boot/dts/exynos5422-odroidxu3.dts | 2 +- + arch/arm/boot/dts/exynos5422-odroidxu4.dts | 7 +++---- + 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/arch/arm/boot/dts/exynos5422-odroidhc1.dts b/arch/arm/boot/dts/exynos5422-odroidhc1.dts -index 812659260278..b90da73510cf 100644 +index d91f7fa2cf80..6550d59ce3d8 100644 --- a/arch/arm/boot/dts/exynos5422-odroidhc1.dts +++ b/arch/arm/boot/dts/exynos5422-odroidhc1.dts -@@ -11,8 +11,8 @@ +@@ -11,9 +11,8 @@ #include "exynos5422-odroid-core.dtsi" / { - model = "Hardkernel Odroid HC1"; - compatible = "hardkernel,odroid-hc1", "samsung,exynos5800", \ +- "samsung,exynos5"; + model = "Hardkernel ODROID HC1"; -+ compatible = "hardkernel,odroid-hc1", "samsung,exynos5800", - "samsung,exynos5"; ++ compatible = "hardkernel,odroid-hc1", "samsung,exynos5800", "samsung,exynos5"; - pwmleds { + led-controller { + compatible = "pwm-leds"; diff --git a/arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi b/arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi -index c3c2d85267da..26961dcea010 100644 +index 86b96f9706db..1a3940f2ead2 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi +++ b/arch/arm/boot/dts/exynos5422-odroidxu3-audio.dtsi @@ -13,7 +13,7 @@ @@ -46,53 +46,48 @@ index c3c2d85267da..26961dcea010 100644 samsung,audio-widgets = "Headphone", "Headphone Jack", diff --git a/arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts b/arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts -index 98feecad5489..d0084033199a 100644 +index e3154a1cae23..4d337f9e79b8 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts +++ b/arch/arm/boot/dts/exynos5422-odroidxu3-lite.dts -@@ -14,8 +14,9 @@ +@@ -14,7 +14,7 @@ #include "exynos54xx-odroidxu-leds.dtsi" / { - model = "Hardkernel Odroid XU3 Lite"; -- compatible = "hardkernel,odroid-xu3-lite", "samsung,exynos5800", "samsung,exynos5"; + model = "Hardkernel ODROID XU3 Lite"; -+ compatible = "hardkernel,odroid-xu3-lite", "samsung,exynos5800", -+ "samsung,exynos5"; + compatible = "hardkernel,odroid-xu3-lite", "samsung,exynos5800", "samsung,exynos5"; aliases { - ethernet = ðernet; diff --git a/arch/arm/boot/dts/exynos5422-odroidxu3.dts b/arch/arm/boot/dts/exynos5422-odroidxu3.dts -index db0bc17a667b..3ff7ec514e20 100644 +index a378d4937ff7..21cf909b9cc8 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu3.dts +++ b/arch/arm/boot/dts/exynos5422-odroidxu3.dts -@@ -13,8 +13,9 @@ +@@ -13,7 +13,7 @@ #include "exynos54xx-odroidxu-leds.dtsi" / { - model = "Hardkernel Odroid XU3"; -- compatible = "hardkernel,odroid-xu3", "samsung,exynos5800", "samsung,exynos5"; + model = "Hardkernel ODROID XU3"; -+ compatible = "hardkernel,odroid-xu3", "samsung,exynos5800", -+ "samsung,exynos5"; + compatible = "hardkernel,odroid-xu3", "samsung,exynos5800", "samsung,exynos5"; aliases { - ethernet = ðernet; diff --git a/arch/arm/boot/dts/exynos5422-odroidxu4.dts b/arch/arm/boot/dts/exynos5422-odroidxu4.dts -index 892d389d6d09..d2061b244537 100644 +index 1c24f9b35973..caf4f50e91df 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu4.dts +++ b/arch/arm/boot/dts/exynos5422-odroidxu4.dts -@@ -13,8 +13,8 @@ +@@ -13,9 +13,8 @@ #include "exynos5422-odroidxu3-common.dtsi" / { - model = "Hardkernel Odroid XU4"; - compatible = "hardkernel,odroid-xu4", "samsung,exynos5800", \ +- "samsung,exynos5"; + model = "Hardkernel ODROID XU4"; -+ compatible = "hardkernel,odroid-xu4", "samsung,exynos5800", - "samsung,exynos5"; ++ compatible = "hardkernel,odroid-xu4", "samsung,exynos5800", "samsung,exynos5"; - pwmleds { -@@ -31,7 +31,7 @@ + led-controller { + compatible = "pwm-leds"; +@@ -31,7 +30,7 @@ sound: sound { compatible = "samsung,odroid-xu3-audio"; diff --git a/projects/Samsung/patches/linux/samsung-0006-MEMEKA-videobuf2-dc-Move-vb2_dc_get_base_sgt-above-m.patch b/projects/Samsung/patches/linux/samsung-0006-MEMEKA-videobuf2-dc-Move-vb2_dc_get_base_sgt-above-m.patch deleted file mode 100644 index e7442bdc783..00000000000 --- a/projects/Samsung/patches/linux/samsung-0006-MEMEKA-videobuf2-dc-Move-vb2_dc_get_base_sgt-above-m.patch +++ /dev/null @@ -1,87 +0,0 @@ -From a47cabb4e0626125ea91fa25616e449705e1e783 Mon Sep 17 00:00:00 2001 -From: Thierry Escande -Date: Wed, 26 Oct 2016 10:52:05 +0200 -Subject: [PATCH 06/25] MEMEKA: videobuf2-dc: Move vb2_dc_get_base_sgt() above - mmap callbacks - -This patch moves vb2_dc_get_base_sgt() function above mmap buffers -callbacks, particularly vb2_dc_alloc() and vb2_dc_mmap() from where it -will be called for cacheable MMAP support introduced in the next patch. - -Signed-off-by: Thierry Escande -Signed-off-by: memeka ---- - .../common/videobuf2/videobuf2-dma-contig.c | 44 +++++++++---------- - 1 file changed, 22 insertions(+), 22 deletions(-) - -diff --git a/drivers/media/common/videobuf2/videobuf2-dma-contig.c b/drivers/media/common/videobuf2/videobuf2-dma-contig.c -index f4b4a7c135eb..8accf13fe439 100644 ---- a/drivers/media/common/videobuf2/videobuf2-dma-contig.c -+++ b/drivers/media/common/videobuf2/videobuf2-dma-contig.c -@@ -66,6 +66,31 @@ static unsigned long vb2_dc_get_contiguous_size(struct sg_table *sgt) - return size; - } - -+static struct sg_table *vb2_dc_get_base_sgt(struct vb2_dc_buf *buf) -+{ -+ int ret; -+ struct sg_table *sgt; -+ -+ if (buf->non_coherent_mem) -+ return buf->dma_sgt; -+ -+ sgt = kmalloc(sizeof(*sgt), GFP_KERNEL); -+ if (!sgt) { -+ dev_err(buf->dev, "failed to alloc sg table\n"); -+ return NULL; -+ } -+ -+ ret = dma_get_sgtable_attrs(buf->dev, sgt, buf->cookie, buf->dma_addr, -+ buf->size, buf->attrs); -+ if (ret < 0) { -+ dev_err(buf->dev, "failed to get scatterlist from DMA API\n"); -+ kfree(sgt); -+ return NULL; -+ } -+ -+ return sgt; -+} -+ - /*********************************************/ - /* callbacks for all buffers */ - /*********************************************/ -@@ -479,31 +504,6 @@ static const struct dma_buf_ops vb2_dc_dmabuf_ops = { - .release = vb2_dc_dmabuf_ops_release, - }; - --static struct sg_table *vb2_dc_get_base_sgt(struct vb2_dc_buf *buf) --{ -- int ret; -- struct sg_table *sgt; -- -- if (buf->non_coherent_mem) -- return buf->dma_sgt; -- -- sgt = kmalloc(sizeof(*sgt), GFP_KERNEL); -- if (!sgt) { -- dev_err(buf->dev, "failed to alloc sg table\n"); -- return NULL; -- } -- -- ret = dma_get_sgtable_attrs(buf->dev, sgt, buf->cookie, buf->dma_addr, -- buf->size, buf->attrs); -- if (ret < 0) { -- dev_err(buf->dev, "failed to get scatterlist from DMA API\n"); -- kfree(sgt); -- return NULL; -- } -- -- return sgt; --} -- - static struct dma_buf *vb2_dc_get_dmabuf(struct vb2_buffer *vb, - void *buf_priv, - unsigned long flags) --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0006-WIP-media-s5p-mfc-Allow-cache-hints-for-queues.patch b/projects/Samsung/patches/linux/samsung-0006-WIP-media-s5p-mfc-Allow-cache-hints-for-queues.patch new file mode 100644 index 00000000000..eb9cac26107 --- /dev/null +++ b/projects/Samsung/patches/linux/samsung-0006-WIP-media-s5p-mfc-Allow-cache-hints-for-queues.patch @@ -0,0 +1,36 @@ +From f07c3dc233b36997c3dcd679fa24fb4040a57d4f Mon Sep 17 00:00:00 2001 +From: Pavel Golikov +Date: Fri, 24 Jun 2022 15:56:05 +0000 +Subject: [PATCH 06/21] WIP: media: s5p-mfc: Allow cache hints for queues + +Passing V4L2_MEMORY_FLAG_NON_COHERENT from userspace significantly +improves video rendering performance on Exynos 5422 (Odroid XU4). + +Signed-off-by: Pavel Golikov +--- + drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c +index 761341934925..e33863d9ae2d 100644 +--- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c ++++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c +@@ -861,6 +861,7 @@ static int s5p_mfc_open(struct file *file) + q->dma_attrs = DMA_ATTR_ALLOC_SINGLE_PAGES; + q->mem_ops = &vb2_dma_contig_memops; + q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; ++ q->allow_cache_hints = 1; + ret = vb2_queue_init(q); + if (ret) { + mfc_err("Failed to initialize videobuf2 queue(capture)\n"); +@@ -896,6 +897,7 @@ static int s5p_mfc_open(struct file *file) + q->dma_attrs = DMA_ATTR_ALLOC_SINGLE_PAGES; + q->mem_ops = &vb2_dma_contig_memops; + q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; ++ q->allow_cache_hints = 1; + ret = vb2_queue_init(q); + if (ret) { + mfc_err("Failed to initialize videobuf2 queue(output)\n"); +-- +2.17.1 + diff --git a/projects/Samsung/patches/linux/samsung-0007-WIP-media-s5p-mfc-use-EAGAIN-not-EIO-for-MFCINST_ERR.patch b/projects/Samsung/patches/linux/samsung-0007-WIP-media-s5p-mfc-use-EAGAIN-not-EIO-for-MFCINST_ERR.patch new file mode 100644 index 00000000000..89c4291f187 --- /dev/null +++ b/projects/Samsung/patches/linux/samsung-0007-WIP-media-s5p-mfc-use-EAGAIN-not-EIO-for-MFCINST_ERR.patch @@ -0,0 +1,38 @@ +From a31044355812a2e9e0df4edd3a1c503c7c77eee0 Mon Sep 17 00:00:00 2001 +From: Christian Hewitt +Date: Tue, 28 Jun 2022 07:34:21 +0000 +Subject: [PATCH 07/21] WIP: media: s5p-mfc: use EAGAIN not EIO for + MFCINST_ERROR + +Patch from https://forum.odroid.com/viewtopic.php?p=319025&sid=1fbdb9d8f7ea0ebee30dc8824f76d308#p319025 + +Signed-off-by: Christian Hewitt +--- + drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c +index 268ffe4da53c..ff5756e446d6 100644 +--- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c ++++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c +@@ -632,7 +632,7 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf) + + if (ctx->state == MFCINST_ERROR) { + mfc_err("Call on QBUF after unrecoverable error\n"); +- return -EIO; ++ return -EAGAIN; + } + if (buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) + return vb2_qbuf(&ctx->vq_src, NULL, buf); +@@ -652,7 +652,7 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) + + if (ctx->state == MFCINST_ERROR) { + mfc_err_limited("Call on DQBUF after unrecoverable error\n"); +- return -EIO; ++ return -EAGAIN; + } + + switch (buf->type) { +-- +2.17.1 + diff --git a/projects/Samsung/patches/linux/samsung-0008-WIP-ARM-dma-mapping-implement-alloc_noncontiguous.patch b/projects/Samsung/patches/linux/samsung-0008-WIP-ARM-dma-mapping-implement-alloc_noncontiguous.patch new file mode 100644 index 00000000000..e13de2e8cd5 --- /dev/null +++ b/projects/Samsung/patches/linux/samsung-0008-WIP-ARM-dma-mapping-implement-alloc_noncontiguous.patch @@ -0,0 +1,93 @@ +From a3760f539508e81d47b21321aa42a09ce96555d3 Mon Sep 17 00:00:00 2001 +From: Pavel Golikov +Date: Fri, 24 Jun 2022 15:52:58 +0000 +Subject: [PATCH 08/21] WIP: ARM/dma-mapping: implement ->alloc_noncontiguous + +Implement support for allocating a non-contiguous DMA region. The +implementation is based on the ma-iommu driver. + +Signed-off-by: Pavel Golikov +--- + arch/arm/mm/dma-mapping.c | 59 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + +diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c +index 059cce018570..8f867cb9fe75 100644 +--- a/arch/arm/mm/dma-mapping.c ++++ b/arch/arm/mm/dma-mapping.c +@@ -1759,6 +1759,63 @@ static void arm_iommu_unmap_sg(struct device *dev, + __iommu_unmap_sg(dev, sg, nents, dir, attrs, false); + } + ++static struct sg_table *arm_iommu_alloc_noncontiguous(struct device *dev, ++ size_t size, enum dma_data_direction dir, gfp_t gfp, ++ unsigned long attrs) ++{ ++ struct dma_sgt_handle *sh; ++ int count; ++ ++ sh = kmalloc(sizeof(*sh), gfp); ++ if (!sh) ++ return NULL; ++ ++ size = PAGE_ALIGN(size); ++ count = size >> PAGE_SHIFT; ++ ++ /* ++ * Following is a work-around (a.k.a. hack) to prevent pages ++ * with __GFP_COMP being passed to split_page() which cannot ++ * handle them. The real problem is that this flag probably ++ * should be 0 on ARM as it is not supported on this ++ * platform; see CONFIG_HUGETLBFS. ++ */ ++ gfp &= ~(__GFP_COMP); ++ ++ sh->pages = __iommu_alloc_buffer(dev, size, gfp, attrs, false); ++ if (!sh->pages) ++ goto err_sh; ++ ++ if (sg_alloc_table_from_pages(&sh->sgt, sh->pages, count, 0, size, ++ GFP_KERNEL)) ++ goto err_buffer; ++ ++ if (__iommu_map_sg(dev, sh->sgt.sgl, sh->sgt.orig_nents, dir, attrs, ++ false) < 1) ++ goto err_free_sg; ++ ++ return &sh->sgt; ++ ++err_free_sg: ++ sg_free_table(&sh->sgt); ++err_buffer: ++ __iommu_free_buffer(dev, sh->pages, size, attrs); ++err_sh: ++ kfree(sh); ++ return NULL; ++} ++ ++static void arm_iommu_free_noncontiguous(struct device *dev, size_t size, ++ struct sg_table *sgt, enum dma_data_direction dir) ++{ ++ struct dma_sgt_handle *sh = sgt_handle(sgt); ++ ++ __iommu_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir, 0, false); ++ __iommu_free_buffer(dev, sh->pages, PAGE_ALIGN(size), 0); ++ sg_free_table(&sh->sgt); ++ kfree(sh); ++} ++ + /** + * arm_iommu_sync_sg_for_cpu + * @dev: valid struct device pointer +@@ -1996,6 +2053,8 @@ static const struct dma_map_ops iommu_ops = { + + .map_page = arm_iommu_map_page, + .unmap_page = arm_iommu_unmap_page, ++ .alloc_noncontiguous = arm_iommu_alloc_noncontiguous, ++ .free_noncontiguous = arm_iommu_free_noncontiguous, + .sync_single_for_cpu = arm_iommu_sync_single_for_cpu, + .sync_single_for_device = arm_iommu_sync_single_for_device, + +-- +2.17.1 + diff --git a/projects/Samsung/patches/linux/samsung-0002-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch b/projects/Samsung/patches/linux/samsung-0009-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch similarity index 74% rename from projects/Samsung/patches/linux/samsung-0002-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch rename to projects/Samsung/patches/linux/samsung-0009-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch index eada47c3b96..3a921fc7700 100644 --- a/projects/Samsung/patches/linux/samsung-0002-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch +++ b/projects/Samsung/patches/linux/samsung-0009-MEMEKA-ARM-dma-mapping-increase-DMA-coherent-pool-si.patch @@ -1,7 +1,7 @@ -From 4ebb0fa9bdf877355ceaabc6ede0960002ebbfb1 Mon Sep 17 00:00:00 2001 +From 3062d6e0008928c46388d6b118d4ae2137d5d0f4 Mon Sep 17 00:00:00 2001 From: memeka Date: Mon, 21 Oct 2019 10:58:47 +1030 -Subject: [PATCH 02/25] MEMEKA: ARM: dma-mapping: increase DMA coherent pool +Subject: [PATCH 09/21] MEMEKA: ARM: dma-mapping: increase DMA coherent pool size to 2M --- @@ -9,10 +9,10 @@ Subject: [PATCH 02/25] MEMEKA: ARM: dma-mapping: increase DMA coherent pool 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c -index 8a8949174b1c..80d4e66039ff 100644 +index 8f867cb9fe75..7493dcf0567a 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c -@@ -314,7 +314,7 @@ static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, +@@ -315,7 +315,7 @@ static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, pgprot_t prot, struct page **ret_page, const void *caller, bool want_vaddr); diff --git a/projects/Samsung/patches/linux/samsung-0003-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch b/projects/Samsung/patches/linux/samsung-0010-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch similarity index 91% rename from projects/Samsung/patches/linux/samsung-0003-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch rename to projects/Samsung/patches/linux/samsung-0010-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch index 78a26aec8b6..ce4b01beede 100644 --- a/projects/Samsung/patches/linux/samsung-0003-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch +++ b/projects/Samsung/patches/linux/samsung-0010-MEMEKA-drm-exynos-mixer-never-blend-the-base-layer.patch @@ -1,7 +1,7 @@ -From eba616b4f08a69c3398d6fd32d19a8896d36db50 Mon Sep 17 00:00:00 2001 +From 16718487d729416d1f6c371c1cb524f817f2d019 Mon Sep 17 00:00:00 2001 From: OtherCrashOverride Date: Sun, 9 Apr 2017 17:31:25 +0000 -Subject: [PATCH 03/25] MEMEKA: drm/exynos/mixer: never blend the base layer +Subject: [PATCH 10/21] MEMEKA: drm/exynos/mixer: never blend the base layer On Exynos there is a solid color plane that is logically below all the other display planes. This causes display artifacts due to alpha. The patch disables blending the base plane with @@ -14,7 +14,7 @@ Signed-off-by: memeka 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c -index 21b726baedea..c1a527fa1df8 100644 +index e5204be86093..430622e0d8d4 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -315,23 +315,26 @@ static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win, diff --git a/projects/Samsung/patches/linux/samsung-0005-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch b/projects/Samsung/patches/linux/samsung-0011-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch similarity index 64% rename from projects/Samsung/patches/linux/samsung-0005-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch rename to projects/Samsung/patches/linux/samsung-0011-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch index a56f880852a..923f994c2af 100644 --- a/projects/Samsung/patches/linux/samsung-0005-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch +++ b/projects/Samsung/patches/linux/samsung-0011-MEMEKA-media-exynos-gsc-fix-v4l2-SELECTION-api.patch @@ -1,18 +1,18 @@ -From 8ffeeccf93279efefc2a76aae04766b7ad6c0634 Mon Sep 17 00:00:00 2001 -From: memeka -Date: Tue, 10 Jul 2018 11:24:56 +0930 -Subject: [PATCH 05/25] MEMEKA: media: exynos-gsc: fix v4l2 SELECTION api +From 8078cb106c24c415f96c21f0a3e91b8d28741045 Mon Sep 17 00:00:00 2001 +From: Marian Mihailescu +Date: Fri, 24 Jun 2022 17:30:42 +0000 +Subject: [PATCH 11/21] MEMEKA: media: exynos-gsc: fix v4l2 SELECTION api -Signed-off-by: memeka +Signed-off-by: Marian Mihailescu --- - drivers/media/platform/exynos-gsc/gsc-core.h | 4 ++-- + drivers/media/platform/samsung/exynos-gsc/gsc-core.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/samsung/exynos-gsc/gsc-core.h b/drivers/media/platform/samsung/exynos-gsc/gsc-core.h -index 8e5a9acb78aa..235d687614f0 100644 +index e894e85e84a4..95fda27de0a3 100644 --- a/drivers/media/platform/samsung/exynos-gsc/gsc-core.h +++ b/drivers/media/platform/samsung/exynos-gsc/gsc-core.h -@@ -474,9 +474,9 @@ static inline struct gsc_frame *ctx_get_frame(struct gsc_ctx *ctx, +@@ -481,9 +481,9 @@ static inline struct gsc_frame *ctx_get_frame(struct gsc_ctx *ctx, { struct gsc_frame *frame; diff --git a/projects/Samsung/patches/linux/samsung-0010-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch b/projects/Samsung/patches/linux/samsung-0012-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch similarity index 73% rename from projects/Samsung/patches/linux/samsung-0010-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch rename to projects/Samsung/patches/linux/samsung-0012-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch index 2e910557ab6..acd6a896bca 100644 --- a/projects/Samsung/patches/linux/samsung-0010-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch +++ b/projects/Samsung/patches/linux/samsung-0012-MEMEKA-media-s5p-mfc-copy-timestamp-and-timecode-in-.patch @@ -1,19 +1,19 @@ -From beba0c663769d49b752c6b8f11f8341d56b16102 Mon Sep 17 00:00:00 2001 -From: memeka -Date: Tue, 10 Jul 2018 22:01:38 +0930 -Subject: [PATCH 10/25] MEMEKA: media: s5p-mfc: copy timestamp and timecode in +From ddff825a6c234556d761c8cb23d6c28c97d85339 Mon Sep 17 00:00:00 2001 +From: Marian Mihailescu +Date: Fri, 24 Jun 2022 17:36:37 +0000 +Subject: [PATCH 12/21] MEMEKA: media: s5p-mfc: copy timestamp and timecode in encoder output -Signed-off-by: memeka +Signed-off-by: Marian Mihailescu --- - drivers/media/platform/s5p-mfc/s5p_mfc_enc.c | 9 +++++++++ + drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c -index 912fe0c5ab18..d48e7b57d96a 100644 +index b65e506665af..d445466046eb 100644 --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c -@@ -1208,6 +1208,7 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) +@@ -1214,6 +1214,7 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) { struct s5p_mfc_dev *dev = ctx->dev; struct s5p_mfc_buf *mb_entry; @@ -21,7 +21,7 @@ index 912fe0c5ab18..d48e7b57d96a 100644 unsigned long enc_y_addr = 0, enc_c_addr = 0; unsigned long mb_y_addr, mb_c_addr; int slice_type; -@@ -1227,8 +1228,12 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) +@@ -1233,8 +1234,12 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) &mb_entry->b->vb2_buf, 0); mb_c_addr = vb2_dma_contig_plane_dma_addr( &mb_entry->b->vb2_buf, 1); @@ -34,7 +34,7 @@ index 912fe0c5ab18..d48e7b57d96a 100644 list_del(&mb_entry->list); ctx->src_queue_cnt--; vb2_buffer_done(&mb_entry->b->vb2_buf, -@@ -1241,8 +1246,12 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) +@@ -1247,8 +1252,12 @@ static int enc_post_frame_start(struct s5p_mfc_ctx *ctx) &mb_entry->b->vb2_buf, 0); mb_c_addr = vb2_dma_contig_plane_dma_addr( &mb_entry->b->vb2_buf, 1); diff --git a/projects/Samsung/patches/linux/samsung-0011-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch b/projects/Samsung/patches/linux/samsung-0013-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch similarity index 61% rename from projects/Samsung/patches/linux/samsung-0011-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch rename to projects/Samsung/patches/linux/samsung-0013-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch index 4cc901c41b8..f54741c06f6 100644 --- a/projects/Samsung/patches/linux/samsung-0011-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch +++ b/projects/Samsung/patches/linux/samsung-0013-MEMEKA-media-s5p-mfc-stop-streaming-before-releasing.patch @@ -1,21 +1,21 @@ -From 06d0e059b754aef63e8ca0d901d6759fb9ed15e7 Mon Sep 17 00:00:00 2001 -From: OtherCrashOverride -Date: Fri, 19 May 2017 12:59:51 +0000 -Subject: [PATCH 11/25] MEMEKA: media: s5p-mfc: stop streaming before releasing +From 30b928690575651687ae46f4bdbc946efd9cc0bd Mon Sep 17 00:00:00 2001 +From: Marian Mihailescu +Date: Fri, 24 Jun 2022 17:38:45 +0000 +Subject: [PATCH 13/21] MEMEKA: media: s5p-mfc: stop streaming before releasing queues If streaming is active when the MFC device is closed, it will generate an IOMMU page-fault. -Signed-off-by: memeka +Signed-off-by: Marian Mihailescu --- - drivers/media/platform/s5p-mfc/s5p_mfc.c | 5 +++++ + drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c -index 37f2113a00ec..8c39528be39e 100644 +index e33863d9ae2d..f9b4b506c04c 100644 --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c -@@ -941,6 +941,11 @@ static int s5p_mfc_release(struct file *file) +@@ -943,6 +943,11 @@ static int s5p_mfc_release(struct file *file) mfc_debug_enter(); if (dev) mutex_lock(&dev->mfc_mutex); diff --git a/projects/Samsung/patches/linux/samsung-0014-MEMEKA-thermal-exynos-add-support-for-8-trip-points-.patch b/projects/Samsung/patches/linux/samsung-0014-MEMEKA-thermal-exynos-add-support-for-8-trip-points-.patch deleted file mode 100644 index b839f8623ce..00000000000 --- a/projects/Samsung/patches/linux/samsung-0014-MEMEKA-thermal-exynos-add-support-for-8-trip-points-.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 20570c820357eb0cfee14342328a3e6920e8a320 Mon Sep 17 00:00:00 2001 -From: memeka -Date: Tue, 10 Jul 2018 22:13:03 +0930 -Subject: [PATCH 14/25] MEMEKA: thermal: exynos: add support for 8 trip points - on Exynos5422 TMU - -Signed-off-by: memeka ---- - drivers/thermal/samsung/exynos_tmu.c | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c -index e9a90bc23b11..b49df21fa0e7 100644 ---- a/drivers/thermal/samsung/exynos_tmu.c -+++ b/drivers/thermal/samsung/exynos_tmu.c -@@ -915,8 +915,6 @@ static int exynos_map_dt_data(struct platform_device *pdev) - case SOC_ARCH_EXYNOS4412: - case SOC_ARCH_EXYNOS5250: - case SOC_ARCH_EXYNOS5260: -- case SOC_ARCH_EXYNOS5420: -- case SOC_ARCH_EXYNOS5420_TRIMINFO: - data->tmu_set_trip_temp = exynos4412_tmu_set_trip_temp; - data->tmu_set_trip_hyst = exynos4412_tmu_set_trip_hyst; - data->tmu_initialize = exynos4412_tmu_initialize; -@@ -935,6 +933,22 @@ static int exynos_map_dt_data(struct platform_device *pdev) - data->min_efuse_value = 0; - data->max_efuse_value = 100; - break; -+ case SOC_ARCH_EXYNOS5420: -+ case SOC_ARCH_EXYNOS5420_TRIMINFO: -+ data->tmu_set_trip_temp = exynos4412_tmu_set_trip_temp; -+ data->tmu_set_trip_hyst = exynos4412_tmu_set_trip_hyst; -+ data->tmu_initialize = exynos4412_tmu_initialize; -+ data->tmu_control = exynos4210_tmu_control; -+ data->tmu_read = exynos4412_tmu_read; -+ data->tmu_set_emulation = exynos4412_tmu_set_emulation; -+ data->tmu_clear_irqs = exynos4210_tmu_clear_irqs; -+ data->ntrip = 8; -+ data->gain = 8; -+ data->reference_voltage = 16; -+ data->efuse_value = 55; -+ data->min_efuse_value = 16; -+ data->max_efuse_value = 76; -+ break; - case SOC_ARCH_EXYNOS5433: - data->tmu_set_trip_temp = exynos5433_tmu_set_trip_temp; - data->tmu_set_trip_hyst = exynos5433_tmu_set_trip_hyst; --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0015-MEMEKA-arm-dts-exynos5422-enable-Exynos5422-TMU.patch b/projects/Samsung/patches/linux/samsung-0015-MEMEKA-arm-dts-exynos5422-enable-Exynos5422-TMU.patch deleted file mode 100644 index 5d1f8d67f5a..00000000000 --- a/projects/Samsung/patches/linux/samsung-0015-MEMEKA-arm-dts-exynos5422-enable-Exynos5422-TMU.patch +++ /dev/null @@ -1,45 +0,0 @@ -From f8f90c73fe3c5b24c806ae17af657321afb47f4f Mon Sep 17 00:00:00 2001 -From: memeka -Date: Tue, 22 Jan 2019 11:55:07 +1030 -Subject: [PATCH 15/25] MEMEKA: arm: dts: exynos5422: enable Exynos5422 TMU - -Signed-off-by: memeka ---- - arch/arm/boot/dts/exynos5422-odroid-core.dtsi | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/arch/arm/boot/dts/exynos5422-odroid-core.dtsi b/arch/arm/boot/dts/exynos5422-odroid-core.dtsi -index ab27ff8bc3dc..4a4710efb429 100644 ---- a/arch/arm/boot/dts/exynos5422-odroid-core.dtsi -+++ b/arch/arm/boot/dts/exynos5422-odroid-core.dtsi -@@ -1030,22 +1030,27 @@ - - &tmu_cpu0 { - vtmu-supply = <&ldo7_reg>; -+ status = "okay"; - }; - - &tmu_cpu1 { - vtmu-supply = <&ldo7_reg>; -+ status = "okay"; - }; - - &tmu_cpu2 { - vtmu-supply = <&ldo7_reg>; -+ status = "okay"; - }; - - &tmu_cpu3 { - vtmu-supply = <&ldo7_reg>; -+ status = "okay"; - }; - - &tmu_gpu { - vtmu-supply = <&ldo7_reg>; -+ status = "okay"; - }; - - &gpu { --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0016-MEMEKA-thermal-add-irq-mode-configuration-for-trip-p.patch b/projects/Samsung/patches/linux/samsung-0016-MEMEKA-thermal-add-irq-mode-configuration-for-trip-p.patch deleted file mode 100644 index 29ad0e7c533..00000000000 --- a/projects/Samsung/patches/linux/samsung-0016-MEMEKA-thermal-add-irq-mode-configuration-for-trip-p.patch +++ /dev/null @@ -1,143 +0,0 @@ -From c6272f5973722d3d396e7123ebb3e1fcd35ba5cc Mon Sep 17 00:00:00 2001 -From: Lukasz Luba -Date: Wed, 7 Nov 2018 18:09:44 +0100 -Subject: [PATCH 16/25] MEMEKA: thermal: add irq-mode configuration for trip - point - -This patch adds support irq mode in trip point. -When that flag is set in DT, there is no need for polling -in thermal framework. Crossing the trip point will rise an IRQ. -The naming convention for tip point 'type' can be confussing -and 'passive' (whic is passive cooling) might be interpretted wrongly. - -This mechanism prevents from missue and adds explicit setting -for hardware which support interrupts for pre-configured temperature -threshold. - -Cc: Zhang Rui -Cc: Eduardo Valentin -Cc: Daniel Lezcano -Signed-off-by: Lukasz Luba -Signed-off-by: memeka ---- - drivers/thermal/thermal_of.c | 17 +++++++++++++++++ - drivers/thermal/thermal_core.c | 10 ++++++++-- - include/linux/thermal.h | 5 +++++ - 3 files changed, 30 insertions(+), 2 deletions(-) - -diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c -index 874a47d6923f..1549561e28b2 100644 ---- a/drivers/thermal/thermal_of.c -+++ b/drivers/thermal/thermal_of.c -@@ -315,6 +315,20 @@ static int of_thermal_get_trip_type(struct thermal_zone_device *tz, int trip, - return 0; - } - -+static int -+of_thermal_get_trip_irq_mode(struct thermal_zone_device *tz, int trip, -+ bool *mode) -+{ -+ struct __thermal_zone *data = tz->devdata; -+ -+ if (trip >= data->ntrips || trip < 0) -+ return -EDOM; -+ -+ *mode = data->trips[trip].irq_mode; -+ -+ return 0; -+} -+ - static int of_thermal_get_trip_temp(struct thermal_zone_device *tz, int trip, - int *temp) - { -@@ -397,6 +411,7 @@ static struct thermal_zone_device_ops of_thermal_ops = { - .set_mode = of_thermal_set_mode, - - .get_trip_type = of_thermal_get_trip_type, -+ .get_trip_irq_mode = of_thermal_get_trip_irq_mode, - .get_trip_temp = of_thermal_get_trip_temp, - .set_trip_temp = of_thermal_set_trip_temp, - .get_trip_hyst = of_thermal_get_trip_hyst, -@@ -860,6 +875,8 @@ static int thermal_of_populate_trip(struct device_node *np, - return ret; - } - -+ trip->irq_mode = of_property_read_bool(np, "irq-mode"); -+ - /* Required for cooling map matching */ - trip->np = np; - of_node_get(np); -diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c -index 9a321dc548c8..ef23a33d34b6 100644 ---- a/drivers/thermal/thermal_core.c -+++ b/drivers/thermal/thermal_core.c -@@ -410,7 +410,8 @@ static void handle_critical_trips(struct thermal_zone_device *tz, - static void handle_thermal_trip(struct thermal_zone_device *tz, int trip) - { - enum thermal_trip_type type; - int trip_temp, hyst = 0; -+ bool irq_mode = false; - - /* Ignore disabled trip points */ - if (test_bit(trip, &tz->trips_disabled)) -@@ -423,9 +424,14 @@ static void handle_thermal_trip(struct thermal_zone_device *tz, int trip) - handle_non_critical_trips(tz, trip); - /* - * Alright, we handled this trip successfully. -- * So, start monitoring again. -+ * So, start monitoring in polling mode if -+ * trip is not using irq HW support. - */ -- monitor_thermal_zone(tz); -+ if (tz->ops->get_trip_irq_mode) -+ tz->ops->get_trip_irq_mode(tz, trip, &irq_mode); -+ -+ if (!irq_mode) -+ monitor_thermal_zone(tz); - } - - static void update_temperature(struct thermal_zone_device *tz) -diff --git a/include/linux/thermal.h b/include/linux/thermal.h -index c91b1e344d56..c4ce2b875b73 100644 ---- a/include/linux/thermal.h -+++ b/include/linux/thermal.h -@@ -92,6 +92,7 @@ struct thermal_zone_device_ops { - enum thermal_device_mode); - int (*get_trip_type) (struct thermal_zone_device *, int, - enum thermal_trip_type *); -+ int (*get_trip_irq_mode) (struct thermal_zone_device *, int, bool *); - int (*get_trip_temp) (struct thermal_zone_device *, int, int *); - int (*set_trip_temp) (struct thermal_zone_device *, int, int); - int (*get_trip_hyst) (struct thermal_zone_device *, int, int *); -@@ -185,6 +186,7 @@ struct thermal_zone_device { - struct thermal_attr *trip_temp_attrs; - struct thermal_attr *trip_type_attrs; - struct thermal_attr *trip_hyst_attrs; -+ struct thermal_attr *trip_irq_mode_attrs; - enum thermal_device_mode mode; - void *devdata; - int trips; -diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h -index c91b1e344d56..c4ce2b875b73 100644 ---- a/drivers/thermal/thermal_core.h -+++ b/drivers/thermal/thermal_core.h -@@ -353,6 +355,8 @@ struct thermal_zone_of_device_ops { - * @temperature: temperature value in miliCelsius - * @hysteresis: relative hysteresis in miliCelsius - * @type: trip point type -+ * @irq_mode: to not use polling in framework set support of HW irq (which will -+ * be triggered when temperature reaches this level). - */ - - struct thermal_trip { -@@ -360,6 +364,7 @@ struct thermal_trip { - int temperature; - int hysteresis; - enum thermal_trip_type type; -+ bool irq_mode; - }; - - /* Function declarations */ --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0017-MEMEKA-thermal-add-new-sysfs-file-for-irq-mode.patch b/projects/Samsung/patches/linux/samsung-0017-MEMEKA-thermal-add-new-sysfs-file-for-irq-mode.patch deleted file mode 100644 index 11cb87208b3..00000000000 --- a/projects/Samsung/patches/linux/samsung-0017-MEMEKA-thermal-add-new-sysfs-file-for-irq-mode.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 61aea8433aba4b8b40dfc777b59afc157a8fd32a Mon Sep 17 00:00:00 2001 -From: Lukasz Luba -Date: Wed, 7 Nov 2018 18:09:45 +0100 -Subject: [PATCH 17/25] MEMEKA: thermal: add new sysfs file for irq-mode - -Patch adds show functions for irq-mode feature. -It allocates new attributes and extends the old list. - -Cc: Zhang Rui -Cc: Eduardo Valentin -Cc: Daniel Lezcano -Signed-off-by: Lukasz Luba -Signed-off-by: memeka ---- - drivers/thermal/thermal_sysfs.c | 53 +++++++++++++++++++++++++++++++-- - 1 file changed, 51 insertions(+), 2 deletions(-) - -diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c -index aa99edb4dff7..e3ede8af79cc 100644 ---- a/drivers/thermal/thermal_sysfs.c -+++ b/drivers/thermal/thermal_sysfs.c -@@ -21,6 +21,8 @@ - - #include "thermal_core.h" - -+#define TRIP_ATTR_NUM 4 -+ - /* sys I/F for thermal zone */ - - static ssize_t -@@ -166,6 +168,28 @@ trip_point_temp_show(struct device *dev, struct device_attribute *attr, - return sprintf(buf, "%d\n", temperature); - } - -+static ssize_t -+trip_point_irq_mode_show(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct thermal_zone_device *tz = to_thermal_zone(dev); -+ int trip, ret; -+ bool mode; -+ -+ if (!tz->ops->get_trip_irq_mode) -+ return -EPERM; -+ -+ if (sscanf(attr->attr.name, "trip_point_%d_irq", &trip) != 1) -+ return -EINVAL; -+ -+ ret = tz->ops->get_trip_irq_mode(tz, trip, &mode); -+ -+ if (ret) -+ return ret; -+ -+ return sprintf(buf, "%d\n", mode); -+} -+ - static ssize_t - trip_point_hyst_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -@@ -520,10 +544,19 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask) - if (!tz->trip_type_attrs) - return -ENOMEM; - -+ tz->trip_irq_mode_attrs = kcalloc(tz->trips, -+ sizeof(*tz->trip_irq_mode_attrs), -+ GFP_KERNEL); -+ if (!tz->trip_irq_mode_attrs) { -+ kfree(tz->trip_type_attrs); -+ return -ENOMEM; -+ } -+ - tz->trip_temp_attrs = kcalloc(tz->trips, sizeof(*tz->trip_temp_attrs), - GFP_KERNEL); - if (!tz->trip_temp_attrs) { - kfree(tz->trip_type_attrs); -+ kfree(tz->trip_irq_mode_attrs); - return -ENOMEM; - } - -@@ -533,14 +566,17 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask) - GFP_KERNEL); - if (!tz->trip_hyst_attrs) { - kfree(tz->trip_type_attrs); -+ kfree(tz->trip_irq_mode_attrs); - kfree(tz->trip_temp_attrs); - return -ENOMEM; - } - } - -- attrs = kcalloc(tz->trips * 3 + 1, sizeof(*attrs), GFP_KERNEL); -+ attrs = kcalloc(tz->trips * TRIP_ATTR_NUM + 1, sizeof(*attrs), -+ GFP_KERNEL); - if (!attrs) { - kfree(tz->trip_type_attrs); -+ kfree(tz->trip_irq_mode_attrs); - kfree(tz->trip_temp_attrs); - if (tz->ops->get_trip_hyst) - kfree(tz->trip_hyst_attrs); -@@ -559,6 +595,19 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask) - tz->trip_type_attrs[indx].attr.show = trip_point_type_show; - attrs[indx] = &tz->trip_type_attrs[indx].attr.attr; - -+ /* create trip irq_mode attribute */ -+ snprintf(tz->trip_irq_mode_attrs[indx].name, -+ THERMAL_NAME_LENGTH, "trip_point_%d_irq", indx); -+ -+ sysfs_attr_init(&tz->trip_irq_mode_attrs[indx].attr.attr); -+ tz->trip_irq_mode_attrs[indx].attr.attr.name = -+ tz->trip_irq_mode_attrs[indx].name; -+ tz->trip_irq_mode_attrs[indx].attr.attr.mode = S_IRUGO; -+ tz->trip_irq_mode_attrs[indx].attr.show = -+ trip_point_irq_mode_show; -+ attrs[indx + tz->trips * 3] = -+ &tz->trip_irq_mode_attrs[indx].attr.attr; -+ - /* create trip temp attribute */ - snprintf(tz->trip_temp_attrs[indx].name, THERMAL_NAME_LENGTH, - "trip_point_%d_temp", indx); -@@ -595,7 +644,7 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask) - attrs[indx + tz->trips * 2] = - &tz->trip_hyst_attrs[indx].attr.attr; - } -- attrs[tz->trips * 3] = NULL; -+ attrs[tz->trips * TRIP_ATTR_NUM] = NULL; - - tz->trips_attribute_group.attrs = attrs; - --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0018-MEMEKA-devfreq-exynos-bus-workaround-dev_pm_opp_set_.patch b/projects/Samsung/patches/linux/samsung-0018-MEMEKA-devfreq-exynos-bus-workaround-dev_pm_opp_set_.patch deleted file mode 100644 index 1ae578f966a..00000000000 --- a/projects/Samsung/patches/linux/samsung-0018-MEMEKA-devfreq-exynos-bus-workaround-dev_pm_opp_set_.patch +++ /dev/null @@ -1,68 +0,0 @@ -From c7eed0d079bb5febcb1f6a460ec9cba83bf579ea Mon Sep 17 00:00:00 2001 -From: "k.konieczny@partner.samsung.com" -Date: Tue, 8 Oct 2019 15:49:23 +0200 -Subject: [PATCH 18/25] MEMEKA: devfreq: exynos-bus: workaround - dev_pm_opp_set_rate() errors on Exynos5422/5800 SoCs - -Commit 4294a779bd8d ("PM / devfreq: exynos-bus: Convert to use -dev_pm_opp_set_rate()") introduced errors: -exynos-bus: new bus device registered: soc:bus_wcore ( 84000 KHz ~ 400000 KHz) -exynos-bus: new bus device registered: soc:bus_noc ( 67000 KHz ~ 100000 KHz) -exynos-bus: new bus device registered: soc:bus_fsys_apb (100000 KHz ~ 200000 KHz) -... -exynos-bus soc:bus_wcore: dev_pm_opp_set_rate: failed to find current OPP for freq 532000000 (-34) -exynos-bus soc:bus_noc: dev_pm_opp_set_rate: failed to find current OPP for freq 111000000 (-34) -exynos-bus soc:bus_fsys_apb: dev_pm_opp_set_rate: failed to find current OPP for freq 222000000 (-34) - -They are caused by incorrect PLL assigned to clock source, which results -in clock rate outside of OPP range. Add workaround for this in -exynos_bus_parse_of() by adjusting clock rate to those present in OPP. - -Fixes: 4294a779bd8d ("PM / devfreq: exynos-bus: Convert to use dev_pm_opp_set_rate()") -Reported-by: Krzysztof Kozlowski -Signed-off-by: Kamil Konieczny -Signed-off-by: memeka ---- - drivers/devfreq/exynos-bus.c | 14 +++++++++++--- - 1 file changed, 11 insertions(+), 3 deletions(-) - -diff --git a/drivers/devfreq/exynos-bus.c b/drivers/devfreq/exynos-bus.c -index 8fa8eb541373..5b167eadb21e 100644 ---- a/drivers/devfreq/exynos-bus.c -+++ b/drivers/devfreq/exynos-bus.c -@@ -243,7 +243,7 @@ static int exynos_bus_parse_of(struct device_node *np, - { - struct device *dev = bus->dev; - struct dev_pm_opp *opp; -- unsigned long rate; -+ unsigned long rate, opp_rate; - int ret; - - /* Get the clock to provide each bus with source clock */ -@@ -267,13 +267,21 @@ static int exynos_bus_parse_of(struct device_node *np, - } - - rate = clk_get_rate(bus->clk); -- -- opp = devfreq_recommended_opp(dev, &rate, 0); -+ opp_rate = rate; -+ opp = devfreq_recommended_opp(dev, &opp_rate, 0); - if (IS_ERR(opp)) { - dev_err(dev, "failed to find dev_pm_opp\n"); - ret = PTR_ERR(opp); - goto err_opp; - } -+ /* -+ * FIXME: U-boot leaves clock source at incorrect PLL, this results -+ * in clock rate outside defined OPP rate. Work around this bug by -+ * setting clock rate to recommended one. -+ */ -+ if (rate > opp_rate) -+ clk_set_rate(bus->clk, opp_rate); -+ - bus->curr_freq = dev_pm_opp_get_freq(opp); - dev_pm_opp_put(opp); - --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0019-MEMEKA-regulator-s2mps11-call-shutdown-function-to-p.patch b/projects/Samsung/patches/linux/samsung-0019-MEMEKA-regulator-s2mps11-call-shutdown-function-to-p.patch deleted file mode 100644 index 065a3885131..00000000000 --- a/projects/Samsung/patches/linux/samsung-0019-MEMEKA-regulator-s2mps11-call-shutdown-function-to-p.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 8ca78a11396a1d1f5d7aa49d3c3f2ecd89aa07bd Mon Sep 17 00:00:00 2001 -From: Anand Moon -Date: Sun, 12 Jul 2015 18:41:20 +0530 -Subject: [PATCH 19/25] MEMEKA: regulator: s2mps11: call shutdown function to - poweroff - -Added .shutdown function to s2mps11 to help poweroff the board successfully. -The device driver clears the register to turn off the PMIC. - -s2mps11-pmic: S2MPS11_REG_CTRL1 reg value 16:00000000000000000000000000010000 - -Console log. - - * Unmounting temporary filesystems... [ OK ] - * Deactivating swap... [ OK ] - * Unmounting local filesystems... [ OK ] - * Will now halt -[ 209.020280] reboot: Power down -[ 209.122039] Power down failed, please power off system manually. - -Change-Id: If6ea0dec154b00ceeaaddbac393c67dc35c26279 -Signed-off-by: Anand Moon -Signed-off-by: memeka -Signed-off-by: Marian Mihailescu ---- - drivers/regulator/s2mps11.c | 26 ++++++++++++++++++++++++++ - 1 file changed, 26 insertions(+) - -diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c -index 23d288278957..b3ee46955986 100644 ---- a/drivers/regulator/s2mps11.c -+++ b/drivers/regulator/s2mps11.c -@@ -1243,6 +1243,31 @@ static int s2mps11_pmic_probe(struct platform_device *pdev) - return ret; - } - -+static void s2mps11_pmic_shutdown(struct platform_device *pdev) -+{ -+ struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); -+ unsigned int reg_val, ret; -+ -+ ret = regmap_read(iodev->regmap_pmic, S2MPS11_REG_CTRL1, ®_val); -+ if (ret < 0) { -+ dev_crit(&pdev->dev, "could not read S2MPS11_REG_CTRL1 value\n"); -+ } else { -+ /* -+ * s2mps11-pmic: S2MPS11_REG_CTRL1 reg value -+ * is 00000000000000000000000000010000 -+ * clear the S2MPS11_REG_CTRL1 0x10 value to shutdown. -+ */ -+ if (reg_val & BIT(4)) { -+ ret = regmap_update_bits(iodev->regmap_pmic, -+ S2MPS11_REG_CTRL1, -+ BIT(4), BIT(0)); -+ if (ret) -+ dev_crit(&pdev->dev, -+ "could not write S2MPS11_REG_CTRL1 value\n"); -+ } -+ } -+} -+ - static const struct platform_device_id s2mps11_pmic_id[] = { - { "s2mps11-regulator", S2MPS11X}, - { "s2mps13-regulator", S2MPS13X}, -@@ -1258,6 +1283,7 @@ static struct platform_driver s2mps11_pmic_driver = { - .name = "s2mps11-pmic", - }, - .probe = s2mps11_pmic_probe, -+ .shutdown = s2mps11_pmic_shutdown, - .id_table = s2mps11_pmic_id, - }; - --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0020-MEMEKA-regulator-s2mps11-add-ethernet-power-reset-in.patch b/projects/Samsung/patches/linux/samsung-0020-MEMEKA-regulator-s2mps11-add-ethernet-power-reset-in.patch deleted file mode 100644 index 8fdbf2ba080..00000000000 --- a/projects/Samsung/patches/linux/samsung-0020-MEMEKA-regulator-s2mps11-add-ethernet-power-reset-in.patch +++ /dev/null @@ -1,92 +0,0 @@ -From 92384233014a73d60dcde47a0a73e090258c071a Mon Sep 17 00:00:00 2001 -From: memeka -Date: Fri, 18 Jan 2019 14:36:21 +1030 -Subject: [PATCH 20/25] MEMEKA: regulator: s2mps11: add ethernet power reset in - shutdown function - -Ethernet device cannot be detected on warm boot sometimes. This patch is -to add the power reset routines for ethernet device using PMIC. Then -ethernet device can be reset hardware-wise. - -Change-Id: Iffbe2966da7e4679f63b91ab79241167391792df -Signed-off-by: Brian Kim -Signed-off-by: Marian Mihailescu ---- - drivers/regulator/s2mps11.c | 54 +++++++++++++++++++++++++++++++++++++ - 1 file changed, 54 insertions(+) - -diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c -index b3ee46955986..5c4d4827a173 100644 ---- a/drivers/regulator/s2mps11.c -+++ b/drivers/regulator/s2mps11.c -@@ -1117,6 +1117,57 @@ static const struct regulator_desc s2mpu02_regulators[] = { - regulator_desc_s2mpu02_buck7(7), - }; - -+static int s2mps11_pmic_ethonoff(struct platform_device *pdev, bool onoff) -+{ -+ struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); -+ unsigned int reg_val = 0; -+ int ret = 0; -+ -+ ret = regmap_read(iodev->regmap_pmic, S2MPS11_REG_L15CTRL, ®_val); -+ if (ret) { -+ dev_err(&pdev->dev, "failed to read S2MPS11_REG_L15CTRL value\n"); -+ return ret; -+ } -+ -+ ret = regmap_read(iodev->regmap_pmic, S2MPS11_REG_L17CTRL, ®_val); -+ if (ret) { -+ dev_err(&pdev->dev, "failed to read S2MPS11_REG_L17CTRL value\n"); -+ return ret; -+ } -+ -+ if (onoff) { -+ /* ETH VDD0 ON */ -+ ret = regmap_update_bits(iodev->regmap_pmic, S2MPS11_REG_L15CTRL, 0xFF, 0x72); -+ if (ret) { -+ dev_err(&pdev->dev, "cannot update S2MPS11 LDO CTRL15 register\n"); -+ return ret; -+ } -+ -+ /* ETH VDD1 ON */ -+ ret = regmap_update_bits(iodev->regmap_pmic, S2MPS11_REG_L17CTRL, 0xFF, 0x72); -+ if (ret) { -+ dev_err(&pdev->dev, "cannot update S2MPS11 LDO CTRL17 register\n"); -+ return ret; -+ } -+ } else { -+ /* ETH VDD0 OFF */ -+ ret = regmap_update_bits(iodev->regmap_pmic, S2MPS11_REG_L15CTRL, 0x3F, 0x00); -+ if (ret) { -+ dev_err(&pdev->dev, "cannot update S2MPS11 LDO CTRL15 register\n"); -+ return ret; -+ } -+ -+ /* ETH VDD1 OFF */ -+ ret = regmap_update_bits(iodev->regmap_pmic, S2MPS11_REG_L17CTRL, 0x3F, 0x00); -+ if (ret) { -+ dev_err(&pdev->dev, "cannot update S2MPS11 LDO CTRL17 register\n"); -+ return ret; -+ } -+ } -+ -+ return ret; -+} -+ - static int s2mps11_pmic_probe(struct platform_device *pdev) - { - struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); -@@ -1266,6 +1317,9 @@ static void s2mps11_pmic_shutdown(struct platform_device *pdev) - "could not write S2MPS11_REG_CTRL1 value\n"); - } - } -+ s2mps11_pmic_ethonoff(pdev, false); -+ mdelay(10); -+ s2mps11_pmic_ethonoff(pdev, true); - } - - static const struct platform_device_id s2mps11_pmic_id[] = { --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0022-MEMEKA-ODROID-XU4-arm-Set-the-system-revision-inform.patch b/projects/Samsung/patches/linux/samsung-0022-MEMEKA-ODROID-XU4-arm-Set-the-system-revision-inform.patch deleted file mode 100644 index a042ff78181..00000000000 --- a/projects/Samsung/patches/linux/samsung-0022-MEMEKA-ODROID-XU4-arm-Set-the-system-revision-inform.patch +++ /dev/null @@ -1,31 +0,0 @@ -From c7f3cddf852d75a07df26f0997fc07b38f55d54d Mon Sep 17 00:00:00 2001 -From: Brian Kim -Date: Tue, 21 Nov 2017 18:44:03 +0900 -Subject: [PATCH 22/25] MEMEKA: ODROID-XU4: arm: Set the system revision - information - -wiringPi library refers to this information in '/proc/cpuinfo' file. - -Signed-off-by: Yang Deokgyu -Change-Id: I4a3368499cecf862eddb1430c6b436283f62d2c7 -Signed-off-by: Marian Mihailescu ---- - arch/arm/kernel/setup.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c -index d8e18cdd96d3..e302d6579c2a 100644 ---- a/arch/arm/kernel/setup.c -+++ b/arch/arm/kernel/setup.c -@@ -90,7 +90,7 @@ EXPORT_SYMBOL(cacheid); - - unsigned int __atags_pointer __initdata; - --unsigned int system_rev; -+unsigned int system_rev = 0x0100; - EXPORT_SYMBOL(system_rev); - - const char *system_serial; --- -2.17.1 - diff --git a/projects/Samsung/patches/linux/samsung-0023-MEMEKA-fix-ODROID-XU3-headphone-jack-volume.patch b/projects/Samsung/patches/linux/samsung-0023-MEMEKA-fix-ODROID-XU3-headphone-jack-volume.patch deleted file mode 100644 index 3448220e2e7..00000000000 --- a/projects/Samsung/patches/linux/samsung-0023-MEMEKA-fix-ODROID-XU3-headphone-jack-volume.patch +++ /dev/null @@ -1,25 +0,0 @@ -From d91b8b8c7d58e6a26eaddf3014239f79f5fe869b Mon Sep 17 00:00:00 2001 -From: MastaG -Date: Tue, 17 Dec 2019 09:33:19 +0100 -Subject: [PATCH 23/25] MEMEKA: fix ODROID-XU3 headphone-jack volume - ---- - sound/soc/codecs/max98090.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c -index 032adc14562d..6448a4186618 100644 ---- a/sound/soc/codecs/max98090.c -+++ b/sound/soc/codecs/max98090.c -@@ -651,7 +651,7 @@ static const struct snd_kcontrol_new max98090_snd_controls[] = { - - SOC_DOUBLE_R_TLV("Headphone Volume", M98090_REG_LEFT_HP_VOLUME, - M98090_REG_RIGHT_HP_VOLUME, M98090_HPVOLL_SHIFT, -- M98090_HPVOLL_NUM - 1, 0, max98090_hp_tlv), -+ M98090_HPVOLL_NUM - 1 + 24, 0, max98090_hp_tlv), - - SOC_DOUBLE_R_RANGE_TLV("Speaker Volume", - M98090_REG_LEFT_SPK_VOLUME, M98090_REG_RIGHT_SPK_VOLUME, --- -2.17.1 - diff --git a/projects/Samsung/patches/mesa/panfrost-0001-panfrost-enable-Mali-T628-support.patch b/projects/Samsung/patches/mesa/panfrost-0001-panfrost-enable-Mali-T628-support.patch new file mode 100644 index 00000000000..9d664ca9c8a --- /dev/null +++ b/projects/Samsung/patches/mesa/panfrost-0001-panfrost-enable-Mali-T628-support.patch @@ -0,0 +1,27 @@ +From 1e2e7b4c379f1df593269febb62ccbcdd7c892cb Mon Sep 17 00:00:00 2001 +From: Christian Hewitt +Date: Fri, 24 Jun 2022 14:03:01 +0000 +Subject: [PATCH] panfrost: enable Mali T628 support + +Add the T628 chip ID so panfrost runs. Support is experimental! + +Signed-off-by: Christian Hewitt +--- + src/panfrost/lib/pan_props.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/panfrost/lib/pan_props.c b/src/panfrost/lib/pan_props.c +index 693b475beb5..cdba8db319e 100644 +--- a/src/panfrost/lib/pan_props.c ++++ b/src/panfrost/lib/pan_props.c +@@ -53,6 +53,7 @@ + + /* Table of supported Mali GPUs */ + const struct panfrost_model panfrost_model_list[] = { ++ MODEL(0x620, "T620", "T62x", NO_ANISO, {}), + MODEL(0x720, "T720", "T72x", NO_ANISO, { .no_hierarchical_tiling = true }), + MODEL(0x750, "T760", "T76x", NO_ANISO, {}), + MODEL(0x820, "T820", "T82x", NO_ANISO, { .no_hierarchical_tiling = true }), +-- +2.17.1 + diff --git a/projects/Samsung/patches/u-boot/0001-add-xu4-defconfig.patch b/projects/Samsung/patches/u-boot/u-boot-0001-add-xu4-defconfig.patch similarity index 90% rename from projects/Samsung/patches/u-boot/0001-add-xu4-defconfig.patch rename to projects/Samsung/patches/u-boot/u-boot-0001-add-xu4-defconfig.patch index 26e3779dfff..7feda8d557a 100644 --- a/projects/Samsung/patches/u-boot/0001-add-xu4-defconfig.patch +++ b/projects/Samsung/patches/u-boot/u-boot-0001-add-xu4-defconfig.patch @@ -1,19 +1,19 @@ -From a0597efafeee67acd0ef763300957c765c64738d Mon Sep 17 00:00:00 2001 +From 2ef9471bc9bfe516649a7b3c3debd6c95d2290c4 Mon Sep 17 00:00:00 2001 From: chewitt Date: Mon, 27 Apr 2020 03:02:53 +0000 Subject: [PATCH] add xu4 defconfig --- - configs/odroid-xu4_defconfig | 66 ++++++++++++++++++++++++++++++++++++ - 1 file changed, 66 insertions(+) + configs/odroid-xu4_defconfig | 68 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 68 insertions(+) create mode 100644 configs/odroid-xu4_defconfig diff --git a/configs/odroid-xu4_defconfig b/configs/odroid-xu4_defconfig new file mode 100644 -index 0000000000..31d9e67805 +index 0000000000..097f03b243 --- /dev/null +++ b/configs/odroid-xu4_defconfig -@@ -0,0 +1,67 @@ +@@ -0,0 +1,68 @@ +CONFIG_ARM=y +CONFIG_ARCH_CPU_INIT=y +CONFIG_ARCH_EXYNOS=y @@ -61,6 +61,7 @@ index 0000000000..31d9e67805 +CONFIG_MTD=y +CONFIG_SMC911X=y +CONFIG_SMC911X_BASE=0x5000000 ++CONFIG_DM_ETH=y +CONFIG_DM_PMIC=y +CONFIG_PMIC_S2MPS11=y +CONFIG_DM_REGULATOR=y diff --git a/scripts/checkdeps b/scripts/checkdeps index 001977ffda9..d84f08406ad 100755 --- a/scripts/checkdeps +++ b/scripts/checkdeps @@ -166,14 +166,14 @@ case "${DISTRO}" in [XML::Parser]=XML-Parser ) ;; - arch) + arch|endeavouros) dep_map+=( [g++]=g++ [mkfontscale]=xorg-mkfontscale [mkfontdir]=xorg-mkfontdir [bdftopcf]=xorg-bdftopcf [xsltproc]=libxslt - [java]="java-runtime-common jdk8-openjdk" + [java]=jdk8-openjdk [python3]=python3 [rpcgen]=rpcsvc-proto ) @@ -269,7 +269,7 @@ if [ "${#need_map[@]}" -gt 0 ]; then mageia) get_yes_no && sudo urpmi "${need_map[@]}" ;; - arch) + arch|endeavouros) get_yes_no && sudo pacman -Sy "${need_map[@]}" ;; opensuse) diff --git a/scripts/extract b/scripts/extract index c02e260a2dc..fa4552b542a 100755 --- a/scripts/extract +++ b/scripts/extract @@ -60,7 +60,7 @@ case "${PKG_SOURCE_NAME}" in 7z x -o"${2}/${1}" "${FULL_SOURCE_PATH}" ;; *.zip) - unzip -q "${FULL_SOURCE_PATH}" -d "${2}" + unzip -o -q "${FULL_SOURCE_PATH}" -d "${2}" ;; *.diff | *.patch) patch -d "${2}" -p1 < "${FULL_SOURCE_PATH}" diff --git a/scripts/image b/scripts/image index 5649fba54b8..e6e378a580a 100755 --- a/scripts/image +++ b/scripts/image @@ -512,7 +512,7 @@ if [ "${1}" = "release" -o "${1}" = "mkimage" -o "${1}" = "noobs" ]; then fi fi -if [ -d "${BUILD}/qa_checks" -a -n "$(ls -1 ${BUILD}/qa_checks/)" ]; then +if [ -n "$(ls -1 ${BUILD}/qa_checks/ 2>/dev/null)" ]; then log_qa_check "qa_issues" "QA issues present, please fix!\n$(find ${BUILD}/qa_checks/* -type f ! -name qa_issues)\n" fi diff --git a/scripts/mkimage b/scripts/mkimage index a3351c7b7f6..351d484c4b6 100755 --- a/scripts/mkimage +++ b/scripts/mkimage @@ -18,10 +18,16 @@ if [ -z "${SYSTEM_SIZE}" -o -z "${SYSTEM_PART_START}" ]; then exit 1 fi -STORAGE_SIZE=32 # STORAGE_SIZE must be >= 32 ! +if [ "${BOOTLOADER}" = "syslinux" ]; then + DISK_GPT_PADDING=1 + DISK_LABEL=gpt +else + DISK_GPT_PADDING=0 + DISK_LABEL=msdos +fi +STORAGE_SIZE=32 # STORAGE_SIZE must be >= 32 ! DISK_START_PADDING=$(( (${SYSTEM_PART_START} + 2048 - 1) / 2048 )) -DISK_GPT_PADDING=1 DISK_SIZE=$(( ${DISK_START_PADDING} + ${SYSTEM_SIZE} + ${STORAGE_SIZE} + ${DISK_GPT_PADDING} )) DISK_BASENAME="${TARGET_IMG}/${IMAGE_NAME}" if [ -n "${SUBDEVICE}" ]; then @@ -54,12 +60,6 @@ trap cleanup SIGINT echo -e "\nimage: creating sparse file for disk image ${DISK##*/}..." dd if=/dev/zero of="${DISK}" bs=1M count=0 seek="${DISK_SIZE}" conv=fsync >"${SAVE_ERROR}" 2>&1 || show_error -if [ "${BOOTLOADER}" = "syslinux" ]; then - DISK_LABEL=gpt -else - DISK_LABEL=msdos -fi - # write a disklabel echo "image: creating ${DISK_LABEL} partition table..." parted -s "${DISK}" mklabel ${DISK_LABEL} diff --git a/scripts/uboot_helper b/scripts/uboot_helper index 59e8a357ed9..6178a98d5a2 100755 --- a/scripts/uboot_helper +++ b/scripts/uboot_helper @@ -373,6 +373,10 @@ devices = \ }, 'Samsung': { 'Exynos': { + 'odroid-xu3': { + 'dtb': 'exynos5422-odroidxu3.dtb', + 'config': 'odroid-xu3_defconfig' + }, 'odroid-xu4': { 'dtb': 'exynos5422-odroidxu4.dtb', 'config': 'odroid-xu4_defconfig' diff --git a/tools/ffmpeg/gen-patches.sh b/tools/ffmpeg/gen-patches.sh index c45d420617b..38e9056dabc 100755 --- a/tools/ffmpeg/gen-patches.sh +++ b/tools/ffmpeg/gen-patches.sh @@ -2,7 +2,7 @@ # base ffmpeg version KODI_FFMPEG_REPO="https://github.com/xbmc/FFmpeg" -KODI_FFMPEG_VERSION="4.4-N-Alpha1" +KODI_FFMPEG_VERSION="4.4.1-Nexus-Alpha1" ALL_FEATURE_SETS="v4l2-drmprime v4l2-request libreelec rpi" @@ -25,11 +25,11 @@ create_patch() { case "${FEATURE_SET}" in v4l2-drmprime) REPO="https://github.com/jernejsk/FFmpeg" - REFSPEC="v4l2-drmprime-v6" + REFSPEC="v4l2-drmprime-v6-4.4.1-Nexus-Alpha1" ;; v4l2-request) REPO="https://github.com/jernejsk/FFmpeg" - REFSPEC="v4l2-request-hwaccel-4.4" + REFSPEC="v4l2-request-hwaccel-4.4.1-Nexus-Alpha1" ;; libreelec) REPO="https://github.com/LibreELEC/FFmpeg" From 301ab79dafd4bce18f6c5388a1628b3fcda71897 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Mon, 10 Oct 2022 08:16:44 +1100 Subject: [PATCH 18/29] removed merge markers --- packages/sx05re/emuelec/bin/emuelec-utils | 23 ---- .../sx05re/emuelec/bin/emuelec_autostart.sh | 5 - packages/sx05re/emuelec/bin/emustation-config | 33 ----- packages/sx05re/emuelec/bin/joy_common.sh | 11 -- packages/sx05re/emuelec/bin/setres.sh | 117 ------------------ 5 files changed, 189 deletions(-) diff --git a/packages/sx05re/emuelec/bin/emuelec-utils b/packages/sx05re/emuelec/bin/emuelec-utils index b098e92c7bb..39806e66310 100755 --- a/packages/sx05re/emuelec/bin/emuelec-utils +++ b/packages/sx05re/emuelec/bin/emuelec-utils @@ -191,24 +191,6 @@ function resolutions() { RESOLUTIONS=() if [ -f "/storage/LEGACY_RESOLUTIONS" ]; then -<<<<<<< HEAD - # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode - N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" - - # Screen supported resolutions - SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/amhdmitx/amhdmitx0/rawedid | /usr/bin/edid-decode |/usr/bin/grep "@" | sed -E "s| {0,9}VIC {0,9}[0-9]{1,2}||" | /usr/bin/awk '{print $1}' | /usr/bin/sed 's/@/p/g'|/usr/bin/tr '[:upper:]' '[:lower:]'` - - for N2SP in $N2_SUPPORTED_RESOLUTIONS - do - for SSR in $SCREEN_SUPPORTED_RESOLUTIONS - do - if [ "$N2SP" = "$SSR" ] - then - RESOLUTIONS+=($N2SP) - fi - done - done -======= # N2 supported resolutions source : https://wiki.odroid.com/odroid-n2/application_note/software/set_display_mode N2_SUPPORTED_RESOLUTIONS="480x320p60hz 640x480p60hz 720x480p60hz 720x576p50hz 800x480p60hz 1024x600p60hz 1024x768p60hz 1280x1024p60hz 1280x720p50hz 1280x720p60hz 1280x800p60hz 1360x768p60hz 1440x900p60hz 1600x1200p60hz 1600x900p60hz 1680x1050p60hz 1920x1080p24hz 1920x1080p30hz 1920x1080p50hz 1920x1080p60hz 1920x1200p60hz 2560x1080p60hz 2560x1440p60hz 2560x1600p60hz 3440x1440p60hz 3840x2160p24hz 3840x2160p25hz 3840x2160p30hz 3840x2160p50hz 3840x2160p60hz" @@ -225,7 +207,6 @@ function resolutions() { fi done done ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 fi if [[ "$EE_PROJECT" == "Rockchip" ]]; then @@ -236,11 +217,7 @@ function resolutions() { done else # Screen supported resolutions -<<<<<<< HEAD - SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/cap | sed '/smpte/d' | sed '/pal/d' | sed '/ntsc/d' | sed 's/\*//' | grep -E '[0-9x]+[pi][56]0hz|cvbs'` -======= SCREEN_SUPPORTED_RESOLUTIONS=`/usr/bin/cat /sys/class/display/cap | sed '/smpte/d' | sed '/pal/d' | sed '/ntsc/d' | sed 's/\*//' | grep -E '[0-9x]+[pi][56]0hz|cvbs'` ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 for SSR in $SCREEN_SUPPORTED_RESOLUTIONS do RESOLUTIONS+=($SSR) diff --git a/packages/sx05re/emuelec/bin/emuelec_autostart.sh b/packages/sx05re/emuelec/bin/emuelec_autostart.sh index 689f426d378..3bf2623aab9 100755 --- a/packages/sx05re/emuelec/bin/emuelec_autostart.sh +++ b/packages/sx05re/emuelec/bin/emuelec_autostart.sh @@ -116,13 +116,8 @@ case "$DEFE" in ;; esac -<<<<<<< HEAD -FILE_MODE="/sys/class/display/mode" -[[ -f "$FILE_MODE" ]] && setres.sh -======= # Checks and sets the resolution for starting ES. check_res.sh ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 # Show splash creen show_splash.sh intro diff --git a/packages/sx05re/emuelec/bin/emustation-config b/packages/sx05re/emuelec/bin/emustation-config index 17f01c59a83..65a02a200c8 100755 --- a/packages/sx05re/emuelec/bin/emustation-config +++ b/packages/sx05re/emuelec/bin/emustation-config @@ -10,11 +10,6 @@ function check_pwd() { -<<<<<<< HEAD -CONFIG_FLASH="/flash/config.ini" -EE_CONF="${EE_DIR}/configs/emuelec.conf" -======= ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 ESSETTINGS="/storage/.config/emulationstation/es_settings.cfg" PWDFILE="${1}" @@ -288,35 +283,7 @@ fi emuelec-utils setauddev -<<<<<<< HEAD -DEFE="" - -# If the video-mode is contained in flash config. -if [ -s "${CONFIG_FLASH}" ]; then - CFG_VAL=$(get_config_value "$CONFIG_FLASH" "vout") - [ ! -z "$CFG_VAL" ] && DEFE="$CFG_VAL" && set_ee_setting ee_videomode $DEFE -fi - -# Otherwise retrieve via normal methods. -if [ -z "$DEFE" ]; then - if [ -s "/storage/.config/EE_VIDEO_MODE" ]; then - DEFE=$(cat /storage/.config/EE_VIDEO_MODE) && \ - set_ee_setting ee_videomode $DEFE && \ - mv /storage/.config/EE_VIDEO_MODE /storage/.config/EE_VIDEO_MODE_2 - fi -fi - -if [ -z "$DEFE" ]; then - # Set video mode, this has to be done before starting ES - DEFE=$(get_ee_setting ee_videomode) -fi - -# finally we correct the FB according to video mode -[[ ! -z "$DEFE" ]] && setres.sh ${DEFE} - -======= # Checks and sets the resolution for starting ES. check_res.sh ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 exit 0 diff --git a/packages/sx05re/emuelec/bin/joy_common.sh b/packages/sx05re/emuelec/bin/joy_common.sh index 975b111f180..c1ec64206b1 100644 --- a/packages/sx05re/emuelec/bin/joy_common.sh +++ b/packages/sx05re/emuelec/bin/joy_common.sh @@ -27,18 +27,10 @@ jc_get_players() { | grep -Ew -B 8 "B: KEY\=[0-9a-f ]+" > /tmp/input_devices # Determine how many gamepads/players are connected -<<<<<<< HEAD - JOYS=$(ls -A1 /dev/input/js* | sort ) - if [[ -f "/storage/.config/EE_JOY_ORDER_NEW" ]]; then - JOYS=$(cat /tmp/input_devices | grep -A2 "S: Sysfs=" \ - | awk '/^S:/ {s=$0} /^H:/ {print s "\t" $0}' | sort -t $'\t' -k2 \ - | sed 's,.*\(.\{4\}\)$,\1,' | sed 's/ //g') -======= JOYS=$(ls -ltr /dev/input/js* | awk '{print $8"\t"$9"\t"$10}' | sort \ | awk '{print $3}' | cut -d'/' -f4) if [[ -f "/storage/.config/JOY_LEGACY_ORDER" ]]; then JOYS=$(ls -A1 /dev/input/js*| sort | sed "s|/dev/input/||g") ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 fi declare -a PLAYER_CFGS=() @@ -135,7 +127,4 @@ jc_generate_guid() { echo "$v" } -<<<<<<< HEAD -======= ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 diff --git a/packages/sx05re/emuelec/bin/setres.sh b/packages/sx05re/emuelec/bin/setres.sh index 311c85f09c2..65ef5044414 100755 --- a/packages/sx05re/emuelec/bin/setres.sh +++ b/packages/sx05re/emuelec/bin/setres.sh @@ -14,33 +14,10 @@ # Source predefined functions and variables . /etc/profile -<<<<<<< HEAD -# arg1, 1 = Hides, 0 = Show. -show_buffer () -{ - echo $1 > /sys/class/graphics/fb0/blank - echo $1 > /sys/class/graphics/fb1/blank -} -======= ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 blank_buffer() { # Blank the buffer. -<<<<<<< HEAD - dd if=/dev/zero of=/dev/fb0 bs=10M > /dev/null 2>&1 -} - -# By initially setting with these values we can garuntee the file changes, and the mode corrects itself. -HACK_480_MODE="640x480p60hz" -HACK_576_MODE="1024x768p60hz" -HACK2_MODE="720p60hz" - -FILE_MODE="/sys/class/display/mode" -[[ ! -f "$FILE_MODE" ]] && exit 0; - -BPP=32 -======= echo 1 > /sys/class/graphics/fb1/blank dd if=/dev/zero of=/dev/fb1 bs=8M > /dev/null 2>&1 echo 0 > /sys/class/graphics/fb1/blank @@ -158,7 +135,6 @@ set_display_borders() { # smaller then the acual size of the screen display. PX2=$(( RW-PX-1 )) PY2=$(( RH-PY-1 )) ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 # If the real width and height are defined particularly for cvbs then use # the real values of the screen resolution not the display buffers resolution @@ -177,15 +153,8 @@ set_display_borders() { # Here we initialize any arguments and variables to be used in the script. # The Mode we want the display to change too. MODE=$1 -<<<<<<< HEAD -DEF_MODE=$(cat $FILE_MODE) - -# If the current display is the same as the change just exit. -[[ $MODE == "auto" ]] && exit 0; -======= FORCE_RUN=$2 ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 [[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix @@ -234,82 +203,6 @@ fi # *p* stand for progressive and *i* stand for interlaced. if [[ ! "$MODE" == *"x"* ]]; then case $MODE in -<<<<<<< HEAD - *p*) H=$(echo $MODE | cut -d'p' -f 1) ;; - *i*) H=$(echo $MODE | cut -d'i' -f 1) ;; - esac -fi - -# hides buffer -show_buffer 1 - -if [[ ! "$MODE" == "$DEF_MODE" ]]; then - case $MODE in - 480cvbs) - echo $HACK_480_MODE > "${FILE_MODE}" - echo 480cvbs > "${FILE_MODE}" - ;; - 576cvbs) - echo $HACK_576_MODE > "${FILE_MODE}" - echo 576cvbs > "${FILE_MODE}" - ;; - 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) - echo $MODE > "${FILE_MODE}" - ;; - *x*) - echo $HACK2_MODE > "${FILE_MODE}" - echo $MODE > "${FILE_MODE}" - ;; - esac -fi - -case $MODE in - 480cvbs) - fbset -fb /dev/fb0 -g 640 480 640 960 $BPP - echo 0 0 639 479 > /sys/class/graphics/fb0/free_scale_axis - echo 30 10 669 469 > /sys/class/graphics/fb0/window_axis - echo 640 > /sys/class/graphics/fb0/scale_width - echo 480 > /sys/class/graphics/fb0/scale_height - echo 0x10001 > /sys/class/graphics/fb0/free_scale - ;; - 576cvbs) - fbset -fb /dev/fb0 -g 1024 768 1024 1536 $BPP - echo 0 0 1023 767 > /sys/class/graphics/fb0/free_scale_axis - echo 35 20 680 565 > /sys/class/graphics/fb0/window_axis - echo 720 > /sys/class/graphics/fb0/scale_width - echo 576 > /sys/class/graphics/fb0/scale_height - echo 0x10001 > /sys/class/graphics/fb0/free_scale - ;; - 480p*|480i*|576p*|720p*|1080p*|1440p*|2160p*|576i*|720i*|1080i*|1440i*|2160i*) - W=$(( $H*16/9 )) - [[ "$MODE" == "480"* ]] && W=640 - DH=$(($H*2)) - W1=$(($W-1)) - H1=$(($H-1)) - fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - echo 0 > /sys/class/graphics/fb0/free_scale - echo 0 > /sys/class/graphics/fb0/freescale_mode - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis - echo 0 > /sys/class/graphics/fb1/free_scale - ;; - *x*) - W=$(echo $MODE | cut -d'x' -f 1) - H=$(echo $MODE | cut -d'x' -f 2 | cut -d'p' -f 1) - [ ! -n "$H" ] && H=$(echo $MODE | cut -d'x' -f 2 | cut -d'i' -f 1) - if [ -n "$W" ] && [ -n "$H" ]; then - DH=$(($H*2)) - W1=$(($W-1)) - H1=$(($H-1)) - fbset -fb /dev/fb0 -g $W $H $W $DH $BPP - echo 0 > /sys/class/graphics/fb0/free_scale - echo 0 > /sys/class/graphics/fb0/freescale_mode - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/free_scale_axis - echo 0 0 $W1 $H1 > /sys/class/graphics/fb0/window_axis - fi - ;; -esac -======= *p*) SH=$(echo $MODE | cut -d'p' -f 1) ;; *i*) SH=$(echo $MODE | cut -d'i' -f 1) ;; esac @@ -353,7 +246,6 @@ fi # Now that the primary buffer has been acquired we blank it again because the new # memory allocated, may contain garbage artifact data. ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 # Gets the default X, and Y position offsets for cvbs so the display can fit # inside the actual analog diplay resolution which is a bit smaller than the @@ -378,14 +270,6 @@ if [[ ! -z "${BORDER_VALS}" ]]; then fi fi -<<<<<<< HEAD -[[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix - -# End of reading the video output mode and setting it for emuelec to avoid video flicking. -# The codes can be simplified with "elseif" sentences. -# The codes for 480I and 576I are adjusted to avoid overscan. -# Force 720p50hz to 720p60hz and 1080i/p60hz to 1080i/p60hz since 50hz would make video very choppy. -======= # If border values have been supplied then we can check the offsets and the # width and height and make sure they are all valid and will not cause issues for # when we set the borders, and allow the primary display buffer to resize the screen. @@ -401,4 +285,3 @@ fi # buffer display is used, it's got the correct starting memory address. Note - # This only need appply to new generation devices. [[ "$EE_DEVICE" == "Amlogic-ng" ]] && fbfix ->>>>>>> 26a4f3d2f49f8f5542133a5bec74d2b667aadff7 From 27538bc3f033ca5a174808f49039f17eda860725 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Sun, 25 Dec 2022 00:03:56 +1100 Subject: [PATCH 19/29] initial commit. --- .../config/es_input.cfg | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/sx05re/emuelec-emulationstation/config/es_input.cfg b/packages/sx05re/emuelec-emulationstation/config/es_input.cfg index ba528b011fe..2fd8d5cfca2 100644 --- a/packages/sx05re/emuelec-emulationstation/config/es_input.cfg +++ b/packages/sx05re/emuelec-emulationstation/config/es_input.cfg @@ -3,32 +3,32 @@ bash /storage/.emulationstation/scripts/inputconfiguration.sh - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + From c8f98e1f7f3dda012aff8b9cab887e03757b3abd Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Sun, 25 Dec 2022 00:05:15 +1100 Subject: [PATCH 20/29] rm ws --- packages/sx05re/emuelec/bin/joy_common.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sx05re/emuelec/bin/joy_common.sh b/packages/sx05re/emuelec/bin/joy_common.sh index c1ec64206b1..c25e28b3d9b 100644 --- a/packages/sx05re/emuelec/bin/joy_common.sh +++ b/packages/sx05re/emuelec/bin/joy_common.sh @@ -127,4 +127,3 @@ jc_generate_guid() { echo "$v" } - From 46eb93c788ec6cc152c5adc8e39d9e4d6859d157 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Sun, 25 Dec 2022 00:06:07 +1100 Subject: [PATCH 21/29] ws fix --- .../config/es_input.cfg | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/sx05re/emuelec-emulationstation/config/es_input.cfg b/packages/sx05re/emuelec-emulationstation/config/es_input.cfg index 2fd8d5cfca2..cc87da41c68 100644 --- a/packages/sx05re/emuelec-emulationstation/config/es_input.cfg +++ b/packages/sx05re/emuelec-emulationstation/config/es_input.cfg @@ -4,31 +4,31 @@ bash /storage/.emulationstation/scripts/inputconfiguration.sh - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + From 14ef8d4eff9e5695e71269034b5ae0b22d2759f1 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Tue, 27 Dec 2022 18:49:27 +1100 Subject: [PATCH 22/29] PS3 controller assign fixes --- .../Sony PLAYSTATION(R)3 Controller.cfg | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg b/packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg index e9db80ed63d..737dae97d9f 100644 --- a/packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg +++ b/packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg @@ -1,37 +1,37 @@ input_device = "Sony PLAYSTATION(R)3 Controller" input_driver = "udev" -input_r_y_plus_axis = "+3" -input_l3_btn = "1" -input_r_x_minus_axis = "-2" -input_l_btn = "10" -input_load_state_btn = "10" -input_start_btn = "3" -input_exit_emulator_btn = "3" -input_l_y_minus_axis = "-1" -input_up_btn = "4" -input_r_y_minus_axis = "-3" -input_a_btn = "13" -input_b_btn = "14" -input_reset_btn = "14" -input_enable_hotkey_btn = "16" -input_down_btn = "6" +input_l_x_minus_axis = "-0" input_l_x_plus_axis = "+0" +input_l_y_minus_axis = "-1" input_l_y_plus_axis = "+1" -input_r_btn = "11" -input_save_state_btn = "11" -input_r2_btn = "9" +input_r_x_minus_axis = "-3" +input_r_x_plus_axis = "+3" +input_r_y_minus_axis = "-4" +input_r_y_plus_axis = "+4" +input_l_btn = "4" +input_l2_btn = "6" +input_l3_btn = "11" +input_r_btn = "5" +input_r2_btn = "7" +input_r3_btn = "12" +input_select_btn = "8" +input_start_btn = "9" +input_up_btn = "13" +input_down_btn = "14" +input_left_btn = "15" +input_right_btn = "16" +input_a_btn = "1" +input_b_btn = "0" +input_x_btn = "2" +input_y_btn = "3" +input_exit_emulator_btn = "9" +input_save_state_btn = "5" input_toggle_fast_forward_btn = "9" -input_r3_btn = "2" -input_fps_toggle_btn = "2" -input_right_btn = "5" -input_state_slot_increase_btn = "5" -input_x_btn = "12" -input_menu_toggle_btn = "12" -input_select_btn = "0" -input_l_x_minus_axis = "-0" -input_y_btn = "15" -input_left_btn = "7" -input_state_slot_decrease_btn = "7" -input_r_x_plus_axis = "+2" -input_l2_btn = "8" -input_rewind_btn = "8" +input_fps_toggle_btn = "7" +input_reset_btn = "0" +input_enable_hotkey_btn = "8" +input_rewind_btn = "6" +input_load_state_btn = "4" +input_menu_toggle_btn = "2" +input_state_slot_decrease_btn = "15" +input_state_slot_increase_btn = "16" From 74617bd9e4613ed1abf44269c1c4a68882969033 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Tue, 27 Dec 2022 18:53:23 +1100 Subject: [PATCH 23/29] assign fix --- .../Sony PLAYSTATION(R)3 Controller.cfg | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg b/packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg index 737dae97d9f..5635e35a8f2 100644 --- a/packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg +++ b/packages/sx05re/emuelec/gamepads/Sony PLAYSTATION(R)3 Controller.cfg @@ -1,37 +1,41 @@ input_device = "Sony PLAYSTATION(R)3 Controller" input_driver = "udev" -input_l_x_minus_axis = "-0" -input_l_x_plus_axis = "+0" -input_l_y_minus_axis = "-1" -input_l_y_plus_axis = "+1" +input_vendor_id = "1356" +input_product_id = "616" +input_r_y_plus_axis = "+4" +input_left_btn = "15" +input_state_slot_decrease_btn = "15" input_r_x_minus_axis = "-3" -input_r_x_plus_axis = "+3" +input_right_btn = "16" +input_state_slot_increase_btn = "16" +input_r_btn = "5" +input_save_state_btn = "5" +input_down_btn = "14" +input_volume_down_btn = "14" input_r_y_minus_axis = "-4" -input_r_y_plus_axis = "+4" input_l_btn = "4" -input_l2_btn = "6" -input_l3_btn = "11" -input_r_btn = "5" -input_r2_btn = "7" -input_r3_btn = "12" +input_load_state_btn = "4" +input_r_x_plus_axis = "+3" +input_y_btn = "3" +input_x_btn = "2" +input_menu_toggle_btn = "2" +input_b_btn = "0" +input_reset_btn = "0" +input_a_btn = "1" +input_up_btn = "13" +input_volume_up_btn = "13" input_select_btn = "8" +input_l3_btn = "11" input_start_btn = "9" -input_up_btn = "13" -input_down_btn = "14" -input_left_btn = "15" -input_right_btn = "16" -input_a_btn = "1" -input_b_btn = "0" -input_x_btn = "2" -input_y_btn = "3" input_exit_emulator_btn = "9" -input_save_state_btn = "5" -input_toggle_fast_forward_btn = "9" -input_fps_toggle_btn = "7" -input_reset_btn = "0" +input_l_x_plus_axis = "+0" +input_l_y_minus_axis = "-1" input_enable_hotkey_btn = "8" -input_rewind_btn = "6" -input_load_state_btn = "4" -input_menu_toggle_btn = "2" -input_state_slot_decrease_btn = "15" -input_state_slot_increase_btn = "16" +input_l2_axis = "+2" +input_rewind_axis = "+2" +input_r2_axis = "+5" +input_toggle_fast_forward_axis = "+5" +input_l_y_plus_axis = "+1" +input_r3_btn = "12" +input_fps_toggle_btn = "12" +input_l_x_minus_axis = "-0" From c7e545bf2726ad632ce38f79e39c58b51c3976b6 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Tue, 27 Dec 2022 19:01:42 +1100 Subject: [PATCH 24/29] gamecontrollerdb entry --- .../SDL_GameControllerDB/patches/add-emuelec-gamepads.patch | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch index 9beb7581c30..df12c3edade 100644 --- a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch +++ b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch @@ -1,10 +1,11 @@ --- a/gamecontrollerdb.txt +++ b/gamecontrollerdb.txt -@@ -1,5 +1,17 @@ +@@ -1,5 +1,18 @@ # Game Controller DB for SDL in 2.0.9 format # Source: https://github.com/gabomdq/SDL_GameControllerDB + +# EmuELEC extra gamepads ++050000004c0500006802000000800000,Sony PLAYSTATION(R)3 Controller,platform:Linux,dpleft:b15,rightx:a3,dpright:b16,rightshoulder:b5,dpdown:b14,righty:a4,leftshoulder:b4,y:b3,x:b2,b:b0,a:b1,dpup:b13,back:b8,leftstick:b11,start:b9,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b12,leftx:a0, +190000004b4800000010000000010000,GO-Advance Gamepad,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b10,start:b15,leftstick:b12,rightstick:b13,leftshoulder:b4,rightshoulder:b5,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,lefttrigger:b11,righttrigger:b14, +190000004b4800000010000001010000,GO-Advance Gamepad (rev 1.1),platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b13,start:b17,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,rightstick:b16,leftx:a0,lefty:a1, +190000004b4800000011000000010000,GO-Super Gamepad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b16,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b14,rightstick:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3, From a5053fc0aa7486880905a999a9772e6f014857fc Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Thu, 29 Dec 2022 09:16:45 +1100 Subject: [PATCH 25/29] revert gamecontrollerdb --- .../SDL_GameControllerDB/patches/add-emuelec-gamepads.patch | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch index df12c3edade..9beb7581c30 100644 --- a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch +++ b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch @@ -1,11 +1,10 @@ --- a/gamecontrollerdb.txt +++ b/gamecontrollerdb.txt -@@ -1,5 +1,18 @@ +@@ -1,5 +1,17 @@ # Game Controller DB for SDL in 2.0.9 format # Source: https://github.com/gabomdq/SDL_GameControllerDB + +# EmuELEC extra gamepads -+050000004c0500006802000000800000,Sony PLAYSTATION(R)3 Controller,platform:Linux,dpleft:b15,rightx:a3,dpright:b16,rightshoulder:b5,dpdown:b14,righty:a4,leftshoulder:b4,y:b3,x:b2,b:b0,a:b1,dpup:b13,back:b8,leftstick:b11,start:b9,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b12,leftx:a0, +190000004b4800000010000000010000,GO-Advance Gamepad,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b10,start:b15,leftstick:b12,rightstick:b13,leftshoulder:b4,rightshoulder:b5,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,lefttrigger:b11,righttrigger:b14, +190000004b4800000010000001010000,GO-Advance Gamepad (rev 1.1),platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b13,start:b17,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,rightstick:b16,leftx:a0,lefty:a1, +190000004b4800000011000000010000,GO-Super Gamepad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b16,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b14,rightstick:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3, From 4b2ad288c607a4130e971f5bc35db16690d77667 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Fri, 13 Jan 2023 23:13:23 +1100 Subject: [PATCH 26/29] revert gamecontrollerdb --- .../SDL_GameControllerDB/patches/add-emuelec-gamepads.patch | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch index df12c3edade..9beb7581c30 100644 --- a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch +++ b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch @@ -1,11 +1,10 @@ --- a/gamecontrollerdb.txt +++ b/gamecontrollerdb.txt -@@ -1,5 +1,18 @@ +@@ -1,5 +1,17 @@ # Game Controller DB for SDL in 2.0.9 format # Source: https://github.com/gabomdq/SDL_GameControllerDB + +# EmuELEC extra gamepads -+050000004c0500006802000000800000,Sony PLAYSTATION(R)3 Controller,platform:Linux,dpleft:b15,rightx:a3,dpright:b16,rightshoulder:b5,dpdown:b14,righty:a4,leftshoulder:b4,y:b3,x:b2,b:b0,a:b1,dpup:b13,back:b8,leftstick:b11,start:b9,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b12,leftx:a0, +190000004b4800000010000000010000,GO-Advance Gamepad,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b10,start:b15,leftstick:b12,rightstick:b13,leftshoulder:b4,rightshoulder:b5,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,lefttrigger:b11,righttrigger:b14, +190000004b4800000010000001010000,GO-Advance Gamepad (rev 1.1),platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b13,start:b17,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,rightstick:b16,leftx:a0,lefty:a1, +190000004b4800000011000000010000,GO-Super Gamepad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b16,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b14,rightstick:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3, From 07a1cdaa372b71c9b82dae061937b059c68fc5ed Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Fri, 13 Jan 2023 23:16:04 +1100 Subject: [PATCH 27/29] remove stale record in gcdb.txt --- packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk index 4fb42841cd6..ce832d03046 100644 --- a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk +++ b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk @@ -16,6 +16,7 @@ pre_configure_target() { sed -i "s/19000000010000000100000001010000,odroid/# 19000000010000000100000001010000,odroid/g" gamecontrollerdb.txt sed -i "s/19000000010000000200000011000000,odroid/# 19000000010000000200000011000000,odroid/g" gamecontrollerdb.txt sed -i "s/03000000d11800000094000011010000,Stadia Controller/# 03000000d11800000094000011010000,Stadia Controller/g" gamecontrollerdb.txt +sed -i "s/030000006d040000d2ca000011010000,Precision Controller/# 030000006d040000d2ca000011010000,Precision Controller/g" gamecontrollerdb.txt } makeinstall_target() { From 050d5ee16503482b9f1a1131b73bd506ee13ce50 Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Fri, 13 Jan 2023 23:18:52 +1100 Subject: [PATCH 28/29] added new record in patch file. --- .../SDL_GameControllerDB/patches/add-emuelec-gamepads.patch | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch index 9beb7581c30..df12c3edade 100644 --- a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch +++ b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch @@ -1,10 +1,11 @@ --- a/gamecontrollerdb.txt +++ b/gamecontrollerdb.txt -@@ -1,5 +1,17 @@ +@@ -1,5 +1,18 @@ # Game Controller DB for SDL in 2.0.9 format # Source: https://github.com/gabomdq/SDL_GameControllerDB + +# EmuELEC extra gamepads ++050000004c0500006802000000800000,Sony PLAYSTATION(R)3 Controller,platform:Linux,dpleft:b15,rightx:a3,dpright:b16,rightshoulder:b5,dpdown:b14,righty:a4,leftshoulder:b4,y:b3,x:b2,b:b0,a:b1,dpup:b13,back:b8,leftstick:b11,start:b9,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b12,leftx:a0, +190000004b4800000010000000010000,GO-Advance Gamepad,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b10,start:b15,leftstick:b12,rightstick:b13,leftshoulder:b4,rightshoulder:b5,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,lefttrigger:b11,righttrigger:b14, +190000004b4800000010000001010000,GO-Advance Gamepad (rev 1.1),platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b13,start:b17,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,rightstick:b16,leftx:a0,lefty:a1, +190000004b4800000011000000010000,GO-Super Gamepad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b16,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b14,rightstick:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3, From 76fd96222ffc174865eb5c7c426b3cbdb895594b Mon Sep 17 00:00:00 2001 From: Langerz82 Date: Fri, 13 Jan 2023 23:25:48 +1100 Subject: [PATCH 29/29] ps3 code fixes. --- packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk | 2 +- .../SDL_GameControllerDB/patches/add-emuelec-gamepads.patch | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk index ce832d03046..cb722f40fc4 100644 --- a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk +++ b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/package.mk @@ -16,7 +16,7 @@ pre_configure_target() { sed -i "s/19000000010000000100000001010000,odroid/# 19000000010000000100000001010000,odroid/g" gamecontrollerdb.txt sed -i "s/19000000010000000200000011000000,odroid/# 19000000010000000200000011000000,odroid/g" gamecontrollerdb.txt sed -i "s/03000000d11800000094000011010000,Stadia Controller/# 03000000d11800000094000011010000,Stadia Controller/g" gamecontrollerdb.txt -sed -i "s/030000006d040000d2ca000011010000,Precision Controller/# 030000006d040000d2ca000011010000,Precision Controller/g" gamecontrollerdb.txt +sed -i "s/030000004c0500006802000011810000,PS3 Controller/# 030000004c0500006802000011810000,PS3 Controller/g" gamecontrollerdb.txt } makeinstall_target() { diff --git a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch index df12c3edade..7f85d0735ab 100644 --- a/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch +++ b/packages/sx05re/tools/sysutils/SDL_GameControllerDB/patches/add-emuelec-gamepads.patch @@ -5,7 +5,7 @@ # Source: https://github.com/gabomdq/SDL_GameControllerDB + +# EmuELEC extra gamepads -+050000004c0500006802000000800000,Sony PLAYSTATION(R)3 Controller,platform:Linux,dpleft:b15,rightx:a3,dpright:b16,rightshoulder:b5,dpdown:b14,righty:a4,leftshoulder:b4,y:b3,x:b2,b:b0,a:b1,dpup:b13,back:b8,leftstick:b11,start:b9,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b12,leftx:a0, ++030000004c0500006802000011810000,Sony PLAYSTATION(R)3 Controller,platform:Linux,dpleft:b15,rightx:a3,dpright:b16,rightshoulder:b5,dpdown:b14,righty:a4,leftshoulder:b4,y:b3,x:b2,b:b0,a:b1,dpup:b13,back:b8,leftstick:b11,start:b9,lefty:a1,guide:b8,lefttrigger:a2,righttrigger:a5,rightstick:b12,leftx:a0, +190000004b4800000010000000010000,GO-Advance Gamepad,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b10,start:b15,leftstick:b12,rightstick:b13,leftshoulder:b4,rightshoulder:b5,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,lefttrigger:b11,righttrigger:b14, +190000004b4800000010000001010000,GO-Advance Gamepad (rev 1.1),platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b13,start:b17,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,rightstick:b16,leftx:a0,lefty:a1, +190000004b4800000011000000010000,GO-Super Gamepad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,guide:b16,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b14,rightstick:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3,