From 01c51fec6a0a8a51fbe14c3f43c7d8dd10b2d5d7 Mon Sep 17 00:00:00 2001 From: chewitt Date: Sat, 5 Aug 2017 09:29:14 +0100 Subject: [PATCH 01/11] slice: add projects for Slice and Slice3 --- projects/Slice/config/distroconfig.txt | 23 +++ projects/Slice/config/slice-overlay.dts | 172 ++++++++++++++++++ projects/Slice/config/ws2812-overlay.dts | 33 ++++ .../Slice/filesystem/usr/config/autostart.sh | 2 + .../Slice/filesystem/usr/config/shutdown.sh | 19 ++ .../lib/systemd/system/serial-console.service | 23 +++ .../usr/share/alsa/cards/snd_slice.conf | 25 +++ projects/Slice/initramfs/platform_init | 28 +++ projects/Slice/kodi/advancedsettings.xml | 12 ++ projects/Slice/linux | 1 + projects/Slice/options | 143 +++++++++++++++ .../kodi/kodi-000-revert-pr11222.patch | 102 +++++++++++ .../patches/kodi/kodi-001-backport.patch | 1 + .../patches/kodi/kodi-004-keyboard.patch | 45 +++++ .../kodi/kodi-999.99-sysinfo-battery.patch | 10 + .../patches/linux/linux-01-RPi_support.patch | 1 + .../linux/linux-04-rtc-pcf8523-c.patch | 17 ++ .../patches/linux/linux-05-cs4265-c.patch | 45 +++++ projects/Slice3/config/distroconfig.txt | 23 +++ projects/Slice3/config/slice-overlay.dts | 172 ++++++++++++++++++ projects/Slice3/config/ws2812-overlay.dts | 33 ++++ .../Slice3/filesystem/usr/config/autostart.sh | 2 + .../Slice3/filesystem/usr/config/shutdown.sh | 19 ++ .../lib/systemd/system/serial-console.service | 23 +++ .../usr/share/alsa/cards/snd_slice.conf | 25 +++ projects/Slice3/initramfs/platform_init | 28 +++ projects/Slice3/kodi/advancedsettings.xml | 12 ++ projects/Slice3/linux | 1 + projects/Slice3/options | 139 ++++++++++++++ .../kodi/kodi-000-revert-pr11222.patch | 102 +++++++++++ .../patches/kodi/kodi-001-backport.patch | 1 + .../patches/kodi/kodi-004-keyboard.patch | 45 +++++ .../kodi/kodi-999.99-sysinfo-battery.patch | 10 + .../patches/linux/linux-01-RPi_support.patch | 1 + .../linux/linux-04-rtc-pcf8523-c.patch | 17 ++ .../patches/linux/linux-05-cs4265-c.patch | 45 +++++ 36 files changed, 1400 insertions(+) create mode 100644 projects/Slice/config/distroconfig.txt create mode 100644 projects/Slice/config/slice-overlay.dts create mode 100644 projects/Slice/config/ws2812-overlay.dts create mode 100644 projects/Slice/filesystem/usr/config/autostart.sh create mode 100644 projects/Slice/filesystem/usr/config/shutdown.sh create mode 100644 projects/Slice/filesystem/usr/lib/systemd/system/serial-console.service create mode 100644 projects/Slice/filesystem/usr/share/alsa/cards/snd_slice.conf create mode 100755 projects/Slice/initramfs/platform_init create mode 100644 projects/Slice/kodi/advancedsettings.xml create mode 120000 projects/Slice/linux create mode 100644 projects/Slice/options create mode 100644 projects/Slice/patches/kodi/kodi-000-revert-pr11222.patch create mode 120000 projects/Slice/patches/kodi/kodi-001-backport.patch create mode 100644 projects/Slice/patches/kodi/kodi-004-keyboard.patch create mode 100644 projects/Slice/patches/kodi/kodi-999.99-sysinfo-battery.patch create mode 120000 projects/Slice/patches/linux/linux-01-RPi_support.patch create mode 100644 projects/Slice/patches/linux/linux-04-rtc-pcf8523-c.patch create mode 100644 projects/Slice/patches/linux/linux-05-cs4265-c.patch create mode 100644 projects/Slice3/config/distroconfig.txt create mode 100644 projects/Slice3/config/slice-overlay.dts create mode 100644 projects/Slice3/config/ws2812-overlay.dts create mode 100644 projects/Slice3/filesystem/usr/config/autostart.sh create mode 100644 projects/Slice3/filesystem/usr/config/shutdown.sh create mode 100644 projects/Slice3/filesystem/usr/lib/systemd/system/serial-console.service create mode 100644 projects/Slice3/filesystem/usr/share/alsa/cards/snd_slice.conf create mode 100755 projects/Slice3/initramfs/platform_init create mode 100644 projects/Slice3/kodi/advancedsettings.xml create mode 120000 projects/Slice3/linux create mode 100644 projects/Slice3/options create mode 100644 projects/Slice3/patches/kodi/kodi-000-revert-pr11222.patch create mode 120000 projects/Slice3/patches/kodi/kodi-001-backport.patch create mode 100644 projects/Slice3/patches/kodi/kodi-004-keyboard.patch create mode 100644 projects/Slice3/patches/kodi/kodi-999.99-sysinfo-battery.patch create mode 120000 projects/Slice3/patches/linux/linux-01-RPi_support.patch create mode 100644 projects/Slice3/patches/linux/linux-04-rtc-pcf8523-c.patch create mode 100644 projects/Slice3/patches/linux/linux-05-cs4265-c.patch diff --git a/projects/Slice/config/distroconfig.txt b/projects/Slice/config/distroconfig.txt new file mode 100644 index 0000000000..6473369b91 --- /dev/null +++ b/projects/Slice/config/distroconfig.txt @@ -0,0 +1,23 @@ +################################################################################ +# This file is part of LibreELEC - http://www.libreelec.tv +# Copyright (C) 2016 Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +# WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! + +dtoverlay=slice +dtoverlay=ws2812 +dtoverlay=mmc diff --git a/projects/Slice/config/slice-overlay.dts b/projects/Slice/config/slice-overlay.dts new file mode 100644 index 0000000000..7f0a4d2f3b --- /dev/null +++ b/projects/Slice/config/slice-overlay.dts @@ -0,0 +1,172 @@ +// Definitions for Slice hardware +/dts-v1/; +/plugin/; + +#include "dt-bindings/clock/bcm2835.h" + +/ { + compatible = "brcm,bcm2708"; + + // + // Set up GPIOs: + // I2C1 on GPIO44,45 + // LIRC input/output on GPIO4 and 37 (NB GPIO4 NC on Slice) + // I2S on GPIO28-31 + // + fragment@0 { + target = <&gpio>; + __overlay__ { + i2c1_pins: i2c1 { + brcm,pins = <44 45>; + brcm,function = <6>; /* alt2 */ + }; + lirc_pins: lirc_pins { + brcm,pins = <4 37>; // + brcm,function = <1 0>; // out in + brcm,pull = <0 1>; // off down + }; + i2s_pins: i2s { + brcm,pins = <28 29 30 31>; + brcm,function = <6>; /* alt2 */ + }; + ws2812_pins: ws2812 { + brcm,pins = <40>; + brcm,function = <4>; /* alt0 */ + }; + }; + }; + + // + // I2C at 100KHz + // + fragment@1 { + target = <&i2c1>; + __overlay__ { + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_pins>; + clock-frequency = <100000>; + }; + }; + + // + // Add devices to I2C1 Bus: + // PCF8523 RTC device + // CS4265 Audio CODEC + // + fragment@2 { + target = <&i2c1>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pcf8523@68 { + compatible = "nxp,pcf8523"; + reg = <0x68>; + nxp,xtalcap-7pf; /* set crystal load to 7pf */ + status = "okay"; + }; + cs4265@4e { + #sound-dai-cells = <0>; + compatible = "cirrus,cs4265"; + reg = <0x4e>; + cs4265-reset-gpios = <&gpio 33 0>; /* AUD_RST_N on GPIO33 */ + cirrus,no-s16le; /* remove S16LE support to workaround I2S controller issue */ + status = "okay"; + }; + }; + }; + + // + // LIRC + // + fragment@3 { + target-path = "/"; + __overlay__ { + lirc_rpi: lirc_rpi { + compatible = "rpi,lirc-rpi"; + pinctrl-names = "default"; + pinctrl-0 = <&lirc_pins>; + status = "okay"; + + // Override autodetection of IR receiver circuit + // (0 = active high, 1 = active low, -1 = no override ) + rpi,sense = <0xffffffff>; + + // Software carrier + // (0 = off, 1 = on) + rpi,softcarrier = <1>; + + // Invert output + // (0 = off, 1 = on) + rpi,invert = <0>; + + // Enable debugging messages + // (0 = off, 1 = on) + rpi,debug = <0>; + }; + }; + }; + + // + // Audio driver + // + fragment@4 { + #address-cells = <1>; + #size-cells = <1>; + target = <&sound>; + __overlay__ { + compatible = "fiveninjas,slice"; + clocks = <&cprman BCM2835_CLOCK_GP0>; + clock-names = "gp0"; + pinctrl-names = "default"; + i2s-controller = <&i2s>; + status = "okay"; + }; + }; + + // + // Enable I2S + // + fragment@5 { + target = <&i2s>; + __overlay__ { + pinctrl-names = "default"; + pinctrl-0 = <&i2s_pins>; + brcm,enable-mmap; + status = "okay"; + }; + }; + + // + // WS2812B LEDs driver + // + fragment@6 { + target = <&soc>; + __overlay__ { + #address-cells = <1>; + #size-cells = <1>; + ws2812: ws2812 { + compatible = "rpi,ws2812"; + pinctrl-names = "default"; + pinctrl-0 = <&ws2812_pins>; + reg = <0x7e20c000 0x100>; /* PWM */ + dmas = <&dma 5>; + dma-names = "pwm_dma"; + led-en-gpios = <&gpio 43 0>; + rpi,invert = <1>; + rpi,num_leds = <25>; + status = "okay"; + }; + }; + }; + + // + // Disable standard audio + // + fragment@7 { + target = <&audio>; + __overlay__ { + status = "disabled"; + }; + }; +}; diff --git a/projects/Slice/config/ws2812-overlay.dts b/projects/Slice/config/ws2812-overlay.dts new file mode 100644 index 0000000000..38ac74dffa --- /dev/null +++ b/projects/Slice/config/ws2812-overlay.dts @@ -0,0 +1,33 @@ +/dts-v1/; +/plugin/; + +/ { + compatible = "brcm,bcm2708"; + + fragment@0 { + target = <&soc>; + __overlay__ { + #address-cells = <1>; + #size-cells = <1>; + + ws2812: ws2812 { + compatible = "rpi,ws2812"; + reg = <0x7e20c000 0x100>; /* PWM */ + dmas = <&dma 5>; + dma-names = "pwm_dma"; + led-en-gpios = <&gpio 43 0>; + + rpi,invert = <1>; + rpi,num_leds = <25>; + + status = "okay"; + + }; + }; + }; + + __overrides__ { + invert = <&ws2812>,"rpi,invert:0"; + num_leds = <&ws2812>,"rpi,num_leds:0"; + }; +}; diff --git a/projects/Slice/filesystem/usr/config/autostart.sh b/projects/Slice/filesystem/usr/config/autostart.sh new file mode 100644 index 0000000000..0b6166972b --- /dev/null +++ b/projects/Slice/filesystem/usr/config/autostart.sh @@ -0,0 +1,2 @@ +#!/bin/bash +hdparm -S60 /dev/sda diff --git a/projects/Slice/filesystem/usr/config/shutdown.sh b/projects/Slice/filesystem/usr/config/shutdown.sh new file mode 100644 index 0000000000..2c597f1186 --- /dev/null +++ b/projects/Slice/filesystem/usr/config/shutdown.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +LEDDIR="/usr/share/kodi/addons/service.slice/resources/media/ledpatterns" + +case "$1" in + halt) + hdparm -y /dev/sda + led_png $LEDDIR/shutdown.png + ;; + poweroff) + hdparm -y /dev/sda + led_png $LEDDIR/shutdown.png + ;; + reboot) + led_png $LEDDIR/shutdown.png + ;; + *) + ;; +esac diff --git a/projects/Slice/filesystem/usr/lib/systemd/system/serial-console.service b/projects/Slice/filesystem/usr/lib/systemd/system/serial-console.service new file mode 100644 index 0000000000..196e8c4a97 --- /dev/null +++ b/projects/Slice/filesystem/usr/lib/systemd/system/serial-console.service @@ -0,0 +1,23 @@ +[Unit] +Description=Debug Shell on /dev/console +DefaultDependencies=no +ConditionKernelCommandLine=console + +[Service] +WorkingDirectory=/storage +Environment="ENV=/etc/profile" +ExecStartPre=/bin/sh -c 'echo -en "\033[?25h"' +ExecStart=/bin/sh +Restart=always +RestartSec=0 +StandardInput=tty +TTYPath=/dev/console +TTYReset=yes +TTYVHangup=yes +KillMode=process +IgnoreSIGPIPE=no +# bash ignores SIGTERM +KillSignal=SIGHUP + +[Install] +WantedBy=sysinit.target diff --git a/projects/Slice/filesystem/usr/share/alsa/cards/snd_slice.conf b/projects/Slice/filesystem/usr/share/alsa/cards/snd_slice.conf new file mode 100644 index 0000000000..298f43d8e7 --- /dev/null +++ b/projects/Slice/filesystem/usr/share/alsa/cards/snd_slice.conf @@ -0,0 +1,25 @@ + + +snd_slice.pcm.iec958.0 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { + type string + } + @args.AES0 { + type integer + } + @args.AES1 { + type integer + } + @args.AES2 { + type integer + } + @args.AES3 { + type integer + } + type hooks + slave.pcm { + type hw + card $CARD + } +} diff --git a/projects/Slice/initramfs/platform_init b/projects/Slice/initramfs/platform_init new file mode 100755 index 0000000000..e3e2e7d50a --- /dev/null +++ b/projects/Slice/initramfs/platform_init @@ -0,0 +1,28 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2015 Stephan Raue (stephan@openelec.tv) +# +# OpenELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# OpenELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC. If not, see . +################################################################################ + +# Enable io_is_busy for improved sdhost performance - essentially, equivalent of force_turbo=1 but for mmc +echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + +# Configure frequency scaling properties - should improve performance a little (turbo, in most cases) +echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor +echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold +echo 100000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate +echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor diff --git a/projects/Slice/kodi/advancedsettings.xml b/projects/Slice/kodi/advancedsettings.xml new file mode 100644 index 0000000000..00ed0dda87 --- /dev/null +++ b/projects/Slice/kodi/advancedsettings.xml @@ -0,0 +1,12 @@ + + + false + 1 + + 720 + 540 + + + 30 + + diff --git a/projects/Slice/linux b/projects/Slice/linux new file mode 120000 index 0000000000..588bc44b88 --- /dev/null +++ b/projects/Slice/linux @@ -0,0 +1 @@ +../RPi/linux \ No newline at end of file diff --git a/projects/Slice/options b/projects/Slice/options new file mode 100644 index 0000000000..645e538609 --- /dev/null +++ b/projects/Slice/options @@ -0,0 +1,143 @@ +################################################################################ +# setup system defaults +################################################################################ + + # The TARGET_CPU variable controls which processor should be targeted for + # generated code. + case $TARGET_ARCH in + arm) + # TARGET_CPU: + # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d + # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c + # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t + # arm720t arm740t strongarm strongarm110 strongarm1100 + # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t + # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi + # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e + # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s + # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 + # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. + TARGET_CPU="arm1176jzf-s" + + # TARGET_FLOAT: + # Specifies which floating-point ABI to use. Permissible values are: + # soft softfp hard + TARGET_FLOAT="hard" + + # TARGET_FPU: + # This specifies what floating point hardware (or hardware emulation) is + # available on the target. Permissible names are: + # fpa fpe2 fpe3 maverick vfp vfpv3 vfpv3-fp16 vfpv3-d16 vfpv3-d16-fp16 + # vfpv3xd vfpv3xd-fp16 neon neon-fp16 vfpv4 vfpv4-d16 fpv4-sp-d16 + # neon-vfpv4. + TARGET_FPU="vfp" + ;; + esac + + # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) + BOOTLOADER="bcm2835-bootloader" + + # u-boot version to use (default) + UBOOT_VERSION="default" + + # Configuration for u-boot + UBOOT_CONFIG="" + + # Target Configfile for u-boot + UBOOT_CONFIGFILE="" + + # Kernel target + KERNEL_TARGET="zImage" + + # Kernel extra targets to build + KERNEL_UBOOT_EXTRA_TARGET="" + + # Additional kernel make parameters (for example to specify the u-boot loadaddress) + KERNEL_MAKE_EXTRACMD="dtbs overlays/slice.dtbo overlays/ws2812.dtbo" + + # Kernel to use. values can be: + # default: default mainline kernel + LINUX="default-rpi" + + # NOOBS supported hex versions (legacy) + NOOBS_HEX="2,3,4,5,6,7,8,9,d,e,f,10,11,12,14,19,0092,0093" + + # NOOBS supported model versions + NOOBS_SUPPORTED_MODELS='"Pi Model","Pi Compute Module","Pi Zero"' + +################################################################################ +# setup build defaults +################################################################################ + + # Project CFLAGS + PROJECT_CFLAGS="" + + # SquashFS compression method (gzip / lzo / xz) + SQUASHFS_COMPRESSION="lzo" + + +################################################################################ +# setup project defaults +################################################################################ + + # build and install ALSA Audio support (yes / no) + ALSA_SUPPORT="yes" + + # OpenGL(X) implementation to use (no / mesa) + OPENGL="no" + + # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q) + OPENGLES="bcm2835-driver" + + # include uvesafb support (yes / no) + UVESAFB_SUPPORT="no" + + # Displayserver to use (x11 / no) + DISPLAYSERVER="no" + + # Windowmanager to use (ratpoison / fluxbox / none) + WINDOWMANAGER="none" + + # Xorg Graphic drivers to use (all / i915,i965,r200,r300,r600,nvidia) + # Space separated list is supported, + # e.g. GRAPHIC_DRIVERS="i915 i965 r300 r600 radeonsi nvidia" + GRAPHIC_DRIVERS="" + + # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) + KODIPLAYER_DRIVER="bcm2835-driver" + + # Modules to install in initramfs for early boot + INITRAMFS_MODULES="" + + # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) + # Space separated list is supported, + # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" + FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware-rpi slice-firmware" + + # build and install ATV IR remote support (yes / no) + ATVCLIENT_SUPPORT="no" + + # build with swap support (yes / no) + SWAP_SUPPORT="yes" + + # swap support enabled per default (yes / no) + SWAP_ENABLED_DEFAULT="no" + + # swapfile size if SWAP_SUPPORT=yes in MB + SWAPFILESIZE="128" + + # build with installer (yes / no) + INSTALLER_SUPPORT="no" + + # build debug with valgrind (yes / no) + # Not available for armv6. Increases image size significantly + VALGRIND="no" + + # kernel image name + KERNEL_NAME="kernel.img" + + # additional drivers to install: + # for a list of additinoal drivers see packages/linux-drivers + # Space separated list is supported, + # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" + ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS media_build rpi-cirrus-config slice-drivers" diff --git a/projects/Slice/patches/kodi/kodi-000-revert-pr11222.patch b/projects/Slice/patches/kodi/kodi-000-revert-pr11222.patch new file mode 100644 index 0000000000..491bc0b868 --- /dev/null +++ b/projects/Slice/patches/kodi/kodi-000-revert-pr11222.patch @@ -0,0 +1,102 @@ +From 073c2c6a118a03b70a29fd302e48f1f75bc7e5bc Mon Sep 17 00:00:00 2001 +From: MilhouseVH +Date: Wed, 24 May 2017 19:17:24 +0100 +Subject: [PATCH] Revert "PR11222" + +This reverts commit 6cc9ab253753aeb62b01d3e654bbfa77a7f22a42. +--- + .../resource.language.en_gb/resources/strings.po | 15 -------------- + system/peripherals.xml | 4 +--- + xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 23 +++++++--------------- + 3 files changed, 8 insertions(+), 34 deletions(-) + +diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po +index 6443f3d..e0060d1 100644 +--- a/addons/resource.language.en_gb/resources/strings.po ++++ b/addons/resource.language.en_gb/resources/strings.po +@@ -19745,18 +19745,3 @@ msgstr "" + msgctxt "#39010" + msgid "Select sort method" + msgstr "" +- +-#: system/peripherals.xml +-msgctxt "#38050" +-msgid "Remote button press delay before repeating (ms)" +-msgstr "" +- +-#: system/peripherals.xml +-msgctxt "#38051" +-msgid "Remote button press repeat rate (ms)" +-msgstr "" +- +-#: system/peripherals.xml +-msgctxt "#38052" +-msgid "Remote button press release time (ms)" +-msgstr "" +diff --git a/system/peripherals.xml b/system/peripherals.xml +index 02b1a9e..d5704b2 100644 +--- a/system/peripherals.xml ++++ b/system/peripherals.xml +@@ -31,9 +31,7 @@ + + + +- +- +- ++ + + + +diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp +index d04a632..d032ffd 100644 +--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ++++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp +@@ -803,10 +803,7 @@ void CPeripheralCecAdapter::PushCecKeypress(const CecButtonPress &key) + CLog::Log(LOGDEBUG, "%s - received key %2x duration %d", __FUNCTION__, key.iButton, key.iDuration); + + CSingleLock lock(m_critSection); +- // avoid the queue getting too long +- if (m_configuration.iButtonRepeatRateMs && m_buttonQueue.size() > 5) +- return; +- if (m_configuration.iButtonRepeatRateMs == 0 && key.iDuration > 0) ++ if (key.iDuration > 0) + { + if (m_currentButton.iButton == key.iButton && m_currentButton.iDuration == 0) + { +@@ -1299,15 +1296,6 @@ void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configu + m_configuration.bActivateSource = config.bActivateSource; + bChanged |= SetSetting("activate_source", m_configuration.bActivateSource == 1); + +- m_configuration.iDoubleTapTimeoutMs = config.iDoubleTapTimeoutMs; +- bChanged |= SetSetting("double_tap_timeout_ms", (int)m_configuration.iDoubleTapTimeoutMs); +- +- m_configuration.iButtonRepeatRateMs = config.iButtonRepeatRateMs; +- bChanged |= SetSetting("button_repeat_rate_ms", (int)m_configuration.iButtonRepeatRateMs); +- +- m_configuration.iButtonReleaseDelayMs = config.iButtonReleaseDelayMs; +- bChanged |= SetSetting("button_release_delay_ms", (int)m_configuration.iButtonReleaseDelayMs); +- + m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; + + m_configuration.iFirmwareVersion = config.iFirmwareVersion; +@@ -1403,10 +1391,13 @@ void CPeripheralCecAdapter::SetConfigurationFromSettings(void) + m_configuration.bPowerOffOnStandby = iStandbyAction == LOCALISED_ID_SUSPEND ? 1 : 0; + m_bShutdownOnStandby = iStandbyAction == LOCALISED_ID_POWEROFF; + +- // double tap prevention timeout in ms ++#if defined(CEC_DOUBLE_TAP_TIMEOUT_MS_OLD) ++ // double tap prevention timeout in ms. libCEC uses 50ms units for this in 2.2.0, so divide by 50 ++ m_configuration.iDoubleTapTimeout50Ms = GetSettingInt("double_tap_timeout_ms") / 50; ++#else ++ // backwards compatibility. will be removed once the next major release of libCEC is out + m_configuration.iDoubleTapTimeoutMs = GetSettingInt("double_tap_timeout_ms"); +- m_configuration.iButtonRepeatRateMs = GetSettingInt("button_repeat_rate_ms"); +- m_configuration.iButtonReleaseDelayMs = GetSettingInt("button_release_delay_ms"); ++#endif + + if (GetSettingBool("pause_playback_on_deactivate")) + { +-- +2.7.4 + diff --git a/projects/Slice/patches/kodi/kodi-001-backport.patch b/projects/Slice/patches/kodi/kodi-001-backport.patch new file mode 120000 index 0000000000..d83be26793 --- /dev/null +++ b/projects/Slice/patches/kodi/kodi-001-backport.patch @@ -0,0 +1 @@ +../../../RPi/patches/kodi/kodi-001-backport.patch \ No newline at end of file diff --git a/projects/Slice/patches/kodi/kodi-004-keyboard.patch b/projects/Slice/patches/kodi/kodi-004-keyboard.patch new file mode 100644 index 0000000000..d5434ebf74 --- /dev/null +++ b/projects/Slice/patches/kodi/kodi-004-keyboard.patch @@ -0,0 +1,45 @@ +--- a/system/keymaps/keyboard.xml 2016-09-17 16:35:20.000000000 +0100 ++++ b/system/keymaps/keyboard.xml 2016-10-01 19:31:07.928719606 +0100 +@@ -56,7 +56,7 @@ + Menu + ContextMenu + Menu +- Pause ++ PlayPause + Stop + SkipNext + SkipPrevious +@@ -321,8 +321,8 @@ + NextSubtitle + StepBack + StepForward +- ChapterOrBigStepForward +- ChapterOrBigStepBack ++ VolumeUp ++ VolumeDown + AudioNextLanguage + NextSubtitle + AudioDelay +@@ -425,8 +425,8 @@ + StepForward + Rewind + FastForward +- SkipNext +- SkipPrevious ++ VolumeUp ++ VolumeDown + PlayerProcessInfo + LockPreset + FullScreen +@@ -632,8 +632,8 @@ + + StepBack + StepForward +- Up +- Down ++ VolumeUp ++ VolumeDown + OSD + OSD + ActivateWindow(PVROSDChannels) + diff --git a/projects/Slice/patches/kodi/kodi-999.99-sysinfo-battery.patch b/projects/Slice/patches/kodi/kodi-999.99-sysinfo-battery.patch new file mode 100644 index 0000000000..cd4d881ee9 --- /dev/null +++ b/projects/Slice/patches/kodi/kodi-999.99-sysinfo-battery.patch @@ -0,0 +1,10 @@ +--- a/xbmc/windows/GUIWindowSystemInfo.cpp 2013-02-21 22:09:04.765734381 +0400 ++++ b/xbmc/windows/GUIWindowSystemInfo.cpp 2013-02-22 16:12:57.942164800 +0400 +@@ -100,7 +100,6 @@ + #endif + SetControlLabel(i++, "%s: %s", 12390, SYSTEM_UPTIME); + SetControlLabel(i++, "%s: %s", 12394, SYSTEM_TOTALUPTIME); +- SetControlLabel(i++, "%s: %s", 12395, SYSTEM_BATTERY_LEVEL); + } + else if (m_section == CONTROL_BT_STORAGE) + { diff --git a/projects/Slice/patches/linux/linux-01-RPi_support.patch b/projects/Slice/patches/linux/linux-01-RPi_support.patch new file mode 120000 index 0000000000..1642b276b2 --- /dev/null +++ b/projects/Slice/patches/linux/linux-01-RPi_support.patch @@ -0,0 +1 @@ +../../../RPi/patches/linux/linux-01-RPi_support.patch \ No newline at end of file diff --git a/projects/Slice/patches/linux/linux-04-rtc-pcf8523-c.patch b/projects/Slice/patches/linux/linux-04-rtc-pcf8523-c.patch new file mode 100644 index 0000000000..da7593ed7e --- /dev/null +++ b/projects/Slice/patches/linux/linux-04-rtc-pcf8523-c.patch @@ -0,0 +1,17 @@ +--- a/drivers/rtc/rtc-pcf8523.c 2016-10-01 10:16:30.259771931 +0100 ++++ b/drivers/rtc/rtc-pcf8523.c 2016-10-01 10:21:29.762638800 +0100 +@@ -291,7 +291,13 @@ static int pcf8523_probe(struct i2c_clie + if (!pcf) + return -ENOMEM; + +- err = pcf8523_select_capacitance(client, true); ++ if (of_property_read_bool(client->dev.of_node, "nxp,xtalcap-7pf")) { ++ printk(KERN_ERR "PCF8523 - set 7pF crystal load"); ++ err = pcf8523_select_capacitance(client, false); ++ } else { ++ printk(KERN_ERR "PCF8523 - set 12pF crystal load"); ++ err = pcf8523_select_capacitance(client, true); ++ } + if (err < 0) + return err; + diff --git a/projects/Slice/patches/linux/linux-05-cs4265-c.patch b/projects/Slice/patches/linux/linux-05-cs4265-c.patch new file mode 100644 index 0000000000..a3487ac222 --- /dev/null +++ b/projects/Slice/patches/linux/linux-05-cs4265-c.patch @@ -0,0 +1,45 @@ +--- linux-4.4-rc7-old/sound/soc/codecs/cs4265.c 2016-01-13 20:56:05.637652775 +0000 ++++ linux-4.4-rc7/sound/soc/codecs/cs4265.c 2016-01-17 11:21:16.977652775 +0000 +@@ -157,7 +157,7 @@ + SOC_SINGLE("Validity Bit Control Switch", CS4265_SPDIF_CTL2, + 3, 1, 0), + SOC_ENUM("SPDIF Mono/Stereo", spdif_mono_stereo_enum), +- SOC_SINGLE("MMTLR Data Switch", 0, ++ SOC_SINGLE("MMTLR Data Switch", CS4265_SPDIF_CTL2, + 1, 1, 0), + SOC_ENUM("Mono Channel Select", spdif_mono_select_enum), + SND_SOC_BYTES("C Data Buffer", CS4265_C_DATA_BUFF, 24), +@@ -199,8 +199,6 @@ + SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_IN("DIN2", NULL, 0, + SND_SOC_NOPM, 0, 0), +- SND_SOC_DAPM_AIF_IN("TXIN", NULL, 0, +- CS4265_SPDIF_CTL2, 5, 1), + + SND_SOC_DAPM_OUTPUT("LINEOUTL"), + SND_SOC_DAPM_OUTPUT("LINEOUTR"), +@@ -384,7 +382,6 @@ + static int cs4265_digital_mute(struct snd_soc_dai *dai, int mute) + { + struct snd_soc_codec *codec = dai->codec; +- + if (mute) { + snd_soc_update_bits(codec, CS4265_DAC_CTL, + CS4265_DAC_CTL_MUTE, +@@ -410,7 +407,7 @@ + struct snd_soc_codec *codec = dai->codec; + struct cs4265_private *cs4265 = snd_soc_codec_get_drvdata(codec); + int index; +- ++printk(KERN_ERR "cs4265_pcm_hw_params: format = 0x%x, width = %d\n", cs4265->format, params_width(params)); + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE && + ((cs4265->format & SND_SOC_DAIFMT_FORMAT_MASK) + == SND_SOC_DAIFMT_RIGHT_J)) +@@ -469,6 +466,7 @@ + static int cs4265_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) + { ++printk(KERN_ERR "set_bias_level %d\n", level); + switch (level) { + case SND_SOC_BIAS_ON: + break; diff --git a/projects/Slice3/config/distroconfig.txt b/projects/Slice3/config/distroconfig.txt new file mode 100644 index 0000000000..6473369b91 --- /dev/null +++ b/projects/Slice3/config/distroconfig.txt @@ -0,0 +1,23 @@ +################################################################################ +# This file is part of LibreELEC - http://www.libreelec.tv +# Copyright (C) 2016 Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +# WARNING: DO NOT EDIT THIS FILE - IT WILL BE OVERWRITTEN WHEN UPGRADING! + +dtoverlay=slice +dtoverlay=ws2812 +dtoverlay=mmc diff --git a/projects/Slice3/config/slice-overlay.dts b/projects/Slice3/config/slice-overlay.dts new file mode 100644 index 0000000000..7f0a4d2f3b --- /dev/null +++ b/projects/Slice3/config/slice-overlay.dts @@ -0,0 +1,172 @@ +// Definitions for Slice hardware +/dts-v1/; +/plugin/; + +#include "dt-bindings/clock/bcm2835.h" + +/ { + compatible = "brcm,bcm2708"; + + // + // Set up GPIOs: + // I2C1 on GPIO44,45 + // LIRC input/output on GPIO4 and 37 (NB GPIO4 NC on Slice) + // I2S on GPIO28-31 + // + fragment@0 { + target = <&gpio>; + __overlay__ { + i2c1_pins: i2c1 { + brcm,pins = <44 45>; + brcm,function = <6>; /* alt2 */ + }; + lirc_pins: lirc_pins { + brcm,pins = <4 37>; // + brcm,function = <1 0>; // out in + brcm,pull = <0 1>; // off down + }; + i2s_pins: i2s { + brcm,pins = <28 29 30 31>; + brcm,function = <6>; /* alt2 */ + }; + ws2812_pins: ws2812 { + brcm,pins = <40>; + brcm,function = <4>; /* alt0 */ + }; + }; + }; + + // + // I2C at 100KHz + // + fragment@1 { + target = <&i2c1>; + __overlay__ { + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_pins>; + clock-frequency = <100000>; + }; + }; + + // + // Add devices to I2C1 Bus: + // PCF8523 RTC device + // CS4265 Audio CODEC + // + fragment@2 { + target = <&i2c1>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pcf8523@68 { + compatible = "nxp,pcf8523"; + reg = <0x68>; + nxp,xtalcap-7pf; /* set crystal load to 7pf */ + status = "okay"; + }; + cs4265@4e { + #sound-dai-cells = <0>; + compatible = "cirrus,cs4265"; + reg = <0x4e>; + cs4265-reset-gpios = <&gpio 33 0>; /* AUD_RST_N on GPIO33 */ + cirrus,no-s16le; /* remove S16LE support to workaround I2S controller issue */ + status = "okay"; + }; + }; + }; + + // + // LIRC + // + fragment@3 { + target-path = "/"; + __overlay__ { + lirc_rpi: lirc_rpi { + compatible = "rpi,lirc-rpi"; + pinctrl-names = "default"; + pinctrl-0 = <&lirc_pins>; + status = "okay"; + + // Override autodetection of IR receiver circuit + // (0 = active high, 1 = active low, -1 = no override ) + rpi,sense = <0xffffffff>; + + // Software carrier + // (0 = off, 1 = on) + rpi,softcarrier = <1>; + + // Invert output + // (0 = off, 1 = on) + rpi,invert = <0>; + + // Enable debugging messages + // (0 = off, 1 = on) + rpi,debug = <0>; + }; + }; + }; + + // + // Audio driver + // + fragment@4 { + #address-cells = <1>; + #size-cells = <1>; + target = <&sound>; + __overlay__ { + compatible = "fiveninjas,slice"; + clocks = <&cprman BCM2835_CLOCK_GP0>; + clock-names = "gp0"; + pinctrl-names = "default"; + i2s-controller = <&i2s>; + status = "okay"; + }; + }; + + // + // Enable I2S + // + fragment@5 { + target = <&i2s>; + __overlay__ { + pinctrl-names = "default"; + pinctrl-0 = <&i2s_pins>; + brcm,enable-mmap; + status = "okay"; + }; + }; + + // + // WS2812B LEDs driver + // + fragment@6 { + target = <&soc>; + __overlay__ { + #address-cells = <1>; + #size-cells = <1>; + ws2812: ws2812 { + compatible = "rpi,ws2812"; + pinctrl-names = "default"; + pinctrl-0 = <&ws2812_pins>; + reg = <0x7e20c000 0x100>; /* PWM */ + dmas = <&dma 5>; + dma-names = "pwm_dma"; + led-en-gpios = <&gpio 43 0>; + rpi,invert = <1>; + rpi,num_leds = <25>; + status = "okay"; + }; + }; + }; + + // + // Disable standard audio + // + fragment@7 { + target = <&audio>; + __overlay__ { + status = "disabled"; + }; + }; +}; diff --git a/projects/Slice3/config/ws2812-overlay.dts b/projects/Slice3/config/ws2812-overlay.dts new file mode 100644 index 0000000000..38ac74dffa --- /dev/null +++ b/projects/Slice3/config/ws2812-overlay.dts @@ -0,0 +1,33 @@ +/dts-v1/; +/plugin/; + +/ { + compatible = "brcm,bcm2708"; + + fragment@0 { + target = <&soc>; + __overlay__ { + #address-cells = <1>; + #size-cells = <1>; + + ws2812: ws2812 { + compatible = "rpi,ws2812"; + reg = <0x7e20c000 0x100>; /* PWM */ + dmas = <&dma 5>; + dma-names = "pwm_dma"; + led-en-gpios = <&gpio 43 0>; + + rpi,invert = <1>; + rpi,num_leds = <25>; + + status = "okay"; + + }; + }; + }; + + __overrides__ { + invert = <&ws2812>,"rpi,invert:0"; + num_leds = <&ws2812>,"rpi,num_leds:0"; + }; +}; diff --git a/projects/Slice3/filesystem/usr/config/autostart.sh b/projects/Slice3/filesystem/usr/config/autostart.sh new file mode 100644 index 0000000000..0b6166972b --- /dev/null +++ b/projects/Slice3/filesystem/usr/config/autostart.sh @@ -0,0 +1,2 @@ +#!/bin/bash +hdparm -S60 /dev/sda diff --git a/projects/Slice3/filesystem/usr/config/shutdown.sh b/projects/Slice3/filesystem/usr/config/shutdown.sh new file mode 100644 index 0000000000..2c597f1186 --- /dev/null +++ b/projects/Slice3/filesystem/usr/config/shutdown.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +LEDDIR="/usr/share/kodi/addons/service.slice/resources/media/ledpatterns" + +case "$1" in + halt) + hdparm -y /dev/sda + led_png $LEDDIR/shutdown.png + ;; + poweroff) + hdparm -y /dev/sda + led_png $LEDDIR/shutdown.png + ;; + reboot) + led_png $LEDDIR/shutdown.png + ;; + *) + ;; +esac diff --git a/projects/Slice3/filesystem/usr/lib/systemd/system/serial-console.service b/projects/Slice3/filesystem/usr/lib/systemd/system/serial-console.service new file mode 100644 index 0000000000..196e8c4a97 --- /dev/null +++ b/projects/Slice3/filesystem/usr/lib/systemd/system/serial-console.service @@ -0,0 +1,23 @@ +[Unit] +Description=Debug Shell on /dev/console +DefaultDependencies=no +ConditionKernelCommandLine=console + +[Service] +WorkingDirectory=/storage +Environment="ENV=/etc/profile" +ExecStartPre=/bin/sh -c 'echo -en "\033[?25h"' +ExecStart=/bin/sh +Restart=always +RestartSec=0 +StandardInput=tty +TTYPath=/dev/console +TTYReset=yes +TTYVHangup=yes +KillMode=process +IgnoreSIGPIPE=no +# bash ignores SIGTERM +KillSignal=SIGHUP + +[Install] +WantedBy=sysinit.target diff --git a/projects/Slice3/filesystem/usr/share/alsa/cards/snd_slice.conf b/projects/Slice3/filesystem/usr/share/alsa/cards/snd_slice.conf new file mode 100644 index 0000000000..298f43d8e7 --- /dev/null +++ b/projects/Slice3/filesystem/usr/share/alsa/cards/snd_slice.conf @@ -0,0 +1,25 @@ + + +snd_slice.pcm.iec958.0 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { + type string + } + @args.AES0 { + type integer + } + @args.AES1 { + type integer + } + @args.AES2 { + type integer + } + @args.AES3 { + type integer + } + type hooks + slave.pcm { + type hw + card $CARD + } +} diff --git a/projects/Slice3/initramfs/platform_init b/projects/Slice3/initramfs/platform_init new file mode 100755 index 0000000000..e3e2e7d50a --- /dev/null +++ b/projects/Slice3/initramfs/platform_init @@ -0,0 +1,28 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2015 Stephan Raue (stephan@openelec.tv) +# +# OpenELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# OpenELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC. If not, see . +################################################################################ + +# Enable io_is_busy for improved sdhost performance - essentially, equivalent of force_turbo=1 but for mmc +echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + +# Configure frequency scaling properties - should improve performance a little (turbo, in most cases) +echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor +echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold +echo 100000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate +echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor diff --git a/projects/Slice3/kodi/advancedsettings.xml b/projects/Slice3/kodi/advancedsettings.xml new file mode 100644 index 0000000000..00ed0dda87 --- /dev/null +++ b/projects/Slice3/kodi/advancedsettings.xml @@ -0,0 +1,12 @@ + + + false + 1 + + 720 + 540 + + + 30 + + diff --git a/projects/Slice3/linux b/projects/Slice3/linux new file mode 120000 index 0000000000..e48fcfd9f8 --- /dev/null +++ b/projects/Slice3/linux @@ -0,0 +1 @@ +../RPi2/linux \ No newline at end of file diff --git a/projects/Slice3/options b/projects/Slice3/options new file mode 100644 index 0000000000..fc543279b1 --- /dev/null +++ b/projects/Slice3/options @@ -0,0 +1,139 @@ +################################################################################ +# setup system defaults +################################################################################ + + # The TARGET_CPU variable controls which processor should be targeted for + # generated code. + case $TARGET_ARCH in + arm) + # TARGET_CPU: + # arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm7m arm7d + # arm7dm arm7di arm7dmi arm70 arm700 arm700i arm710 arm710c + # arm7100 arm720 arm7500 arm7500fe arm7tdmi arm7tdmi-s arm710t + # arm720t arm740t strongarm strongarm110 strongarm1100 + # strongarm1110 arm8 arm810 arm9 arm9e arm920 arm920t arm922t + # arm946e-s arm966e-s arm968e-s arm926ej-s arm940t arm9tdmi + # arm10tdmi arm1020t arm1026ej-s arm10e arm1020e arm1022e + # arm1136j-s arm1136jf-s mpcore mpcorenovfp arm1156t2-s + # arm1176jz-s arm1176jzf-s cortex-a8 cortex-a9 cortex-r4 + # cortex-r4f cortex-m3 cortex-m1 xscale iwmmxt iwmmxt2 ep9312. + TARGET_CPU="cortex-a7" + + # TARGET_FLOAT: + # Specifies which floating-point ABI to use. Permissible values are: + # soft softfp hard + TARGET_FLOAT="hard" + + # TARGET_FPU: + # This specifies what floating point hardware (or hardware emulation) is + # available on the target. Permissible names are: + # fpa fpe2 fpe3 maverick vfp vfpv3 vfpv3-fp16 vfpv3-d16 vfpv3-d16-fp16 + # vfpv3xd vfpv3xd-fp16 neon neon-fp16 vfpv4 vfpv4-d16 fpv4-sp-d16 + # neon-vfpv4. + TARGET_FPU="neon-vfpv4" + ;; + esac + + # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) + BOOTLOADER="bcm2835-bootloader" + + # u-boot version to use (default) + UBOOT_VERSION="default" + + # Configuration for u-boot + UBOOT_CONFIG="" + + # Target Configfile for u-boot + UBOOT_CONFIGFILE="" + + # Kernel target + KERNEL_TARGET="zImage" + + # Kernel extra targets to build + KERNEL_UBOOT_EXTRA_TARGET="" + + # Additional kernel make parameters (for example to specify the u-boot loadaddress) + KERNEL_MAKE_EXTRACMD="dtbs overlays/slice.dtbo overlays/ws2812.dtbo" + + # Kernel to use. values can be: + # default: default mainline kernel + LINUX="default-rpi" + + # NOOBS supported hex versions (legacy) + NOOBS_HEX="1040,1041,2082" + + # NOOBS supported model versions + NOOBS_SUPPORTED_MODELS='"Pi 2","Pi 3"' + +################################################################################ +# setup build defaults +################################################################################ + + # Project CFLAGS + PROJECT_CFLAGS="" + + # SquashFS compression method (gzip / lzo / xz) + SQUASHFS_COMPRESSION="lzo" + + +################################################################################ +# setup project defaults +################################################################################ + + # build and install ALSA Audio support (yes / no) + ALSA_SUPPORT="yes" + + # OpenGL(X) implementation to use (no / mesa) + OPENGL="no" + + # OpenGL-ES implementation to use (no / bcm2835-driver / gpu-viv-bin-mx6q) + OPENGLES="bcm2835-driver" + + # include uvesafb support (yes / no) + UVESAFB_SUPPORT="no" + + # Displayserver to use (x11 / no) + DISPLAYSERVER="no" + + # Windowmanager to use (ratpoison / fluxbox / none) + WINDOWMANAGER="none" + + # Xorg Graphic drivers to use (all / i915,i965,r200,r300,r600,nvidia) + # Space separated list is supported, + # e.g. GRAPHIC_DRIVERS="i915 i965 r300 r600 radeonsi nvidia" + GRAPHIC_DRIVERS="" + + # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) + KODIPLAYER_DRIVER="bcm2835-driver" + + # Modules to install in initramfs for early boot + INITRAMFS_MODULES="" + + # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) + # Space separated list is supported, + # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" + FIRMWARE="misc-firmware wlan-firmware dvb-firmware brcmfmac_sdio-firmware-rpi slice-firmware" + + # build and install ATV IR remote support (yes / no) + ATVCLIENT_SUPPORT="no" + + # build with swap support (yes / no) + SWAP_SUPPORT="yes" + + # swap support enabled per default (yes / no) + SWAP_ENABLED_DEFAULT="no" + + # swapfile size if SWAP_SUPPORT=yes in MB + SWAPFILESIZE="128" + + # build with installer (yes / no) + INSTALLER_SUPPORT="no" + + # kernel image name + KERNEL_NAME="kernel.img" + + # additional drivers to install: + # for a list of additinoal drivers see packages/linux-drivers + # Space separated list is supported, + # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" + ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS media_build rpi-cirrus-config slice-drivers" diff --git a/projects/Slice3/patches/kodi/kodi-000-revert-pr11222.patch b/projects/Slice3/patches/kodi/kodi-000-revert-pr11222.patch new file mode 100644 index 0000000000..491bc0b868 --- /dev/null +++ b/projects/Slice3/patches/kodi/kodi-000-revert-pr11222.patch @@ -0,0 +1,102 @@ +From 073c2c6a118a03b70a29fd302e48f1f75bc7e5bc Mon Sep 17 00:00:00 2001 +From: MilhouseVH +Date: Wed, 24 May 2017 19:17:24 +0100 +Subject: [PATCH] Revert "PR11222" + +This reverts commit 6cc9ab253753aeb62b01d3e654bbfa77a7f22a42. +--- + .../resource.language.en_gb/resources/strings.po | 15 -------------- + system/peripherals.xml | 4 +--- + xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 23 +++++++--------------- + 3 files changed, 8 insertions(+), 34 deletions(-) + +diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po +index 6443f3d..e0060d1 100644 +--- a/addons/resource.language.en_gb/resources/strings.po ++++ b/addons/resource.language.en_gb/resources/strings.po +@@ -19745,18 +19745,3 @@ msgstr "" + msgctxt "#39010" + msgid "Select sort method" + msgstr "" +- +-#: system/peripherals.xml +-msgctxt "#38050" +-msgid "Remote button press delay before repeating (ms)" +-msgstr "" +- +-#: system/peripherals.xml +-msgctxt "#38051" +-msgid "Remote button press repeat rate (ms)" +-msgstr "" +- +-#: system/peripherals.xml +-msgctxt "#38052" +-msgid "Remote button press release time (ms)" +-msgstr "" +diff --git a/system/peripherals.xml b/system/peripherals.xml +index 02b1a9e..d5704b2 100644 +--- a/system/peripherals.xml ++++ b/system/peripherals.xml +@@ -31,9 +31,7 @@ + + + +- +- +- ++ + + + +diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp +index d04a632..d032ffd 100644 +--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ++++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp +@@ -803,10 +803,7 @@ void CPeripheralCecAdapter::PushCecKeypress(const CecButtonPress &key) + CLog::Log(LOGDEBUG, "%s - received key %2x duration %d", __FUNCTION__, key.iButton, key.iDuration); + + CSingleLock lock(m_critSection); +- // avoid the queue getting too long +- if (m_configuration.iButtonRepeatRateMs && m_buttonQueue.size() > 5) +- return; +- if (m_configuration.iButtonRepeatRateMs == 0 && key.iDuration > 0) ++ if (key.iDuration > 0) + { + if (m_currentButton.iButton == key.iButton && m_currentButton.iDuration == 0) + { +@@ -1299,15 +1296,6 @@ void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configu + m_configuration.bActivateSource = config.bActivateSource; + bChanged |= SetSetting("activate_source", m_configuration.bActivateSource == 1); + +- m_configuration.iDoubleTapTimeoutMs = config.iDoubleTapTimeoutMs; +- bChanged |= SetSetting("double_tap_timeout_ms", (int)m_configuration.iDoubleTapTimeoutMs); +- +- m_configuration.iButtonRepeatRateMs = config.iButtonRepeatRateMs; +- bChanged |= SetSetting("button_repeat_rate_ms", (int)m_configuration.iButtonRepeatRateMs); +- +- m_configuration.iButtonReleaseDelayMs = config.iButtonReleaseDelayMs; +- bChanged |= SetSetting("button_release_delay_ms", (int)m_configuration.iButtonReleaseDelayMs); +- + m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; + + m_configuration.iFirmwareVersion = config.iFirmwareVersion; +@@ -1403,10 +1391,13 @@ void CPeripheralCecAdapter::SetConfigurationFromSettings(void) + m_configuration.bPowerOffOnStandby = iStandbyAction == LOCALISED_ID_SUSPEND ? 1 : 0; + m_bShutdownOnStandby = iStandbyAction == LOCALISED_ID_POWEROFF; + +- // double tap prevention timeout in ms ++#if defined(CEC_DOUBLE_TAP_TIMEOUT_MS_OLD) ++ // double tap prevention timeout in ms. libCEC uses 50ms units for this in 2.2.0, so divide by 50 ++ m_configuration.iDoubleTapTimeout50Ms = GetSettingInt("double_tap_timeout_ms") / 50; ++#else ++ // backwards compatibility. will be removed once the next major release of libCEC is out + m_configuration.iDoubleTapTimeoutMs = GetSettingInt("double_tap_timeout_ms"); +- m_configuration.iButtonRepeatRateMs = GetSettingInt("button_repeat_rate_ms"); +- m_configuration.iButtonReleaseDelayMs = GetSettingInt("button_release_delay_ms"); ++#endif + + if (GetSettingBool("pause_playback_on_deactivate")) + { +-- +2.7.4 + diff --git a/projects/Slice3/patches/kodi/kodi-001-backport.patch b/projects/Slice3/patches/kodi/kodi-001-backport.patch new file mode 120000 index 0000000000..7a787944f5 --- /dev/null +++ b/projects/Slice3/patches/kodi/kodi-001-backport.patch @@ -0,0 +1 @@ +../../../RPi2/patches/kodi/kodi-001-backport.patch \ No newline at end of file diff --git a/projects/Slice3/patches/kodi/kodi-004-keyboard.patch b/projects/Slice3/patches/kodi/kodi-004-keyboard.patch new file mode 100644 index 0000000000..d5434ebf74 --- /dev/null +++ b/projects/Slice3/patches/kodi/kodi-004-keyboard.patch @@ -0,0 +1,45 @@ +--- a/system/keymaps/keyboard.xml 2016-09-17 16:35:20.000000000 +0100 ++++ b/system/keymaps/keyboard.xml 2016-10-01 19:31:07.928719606 +0100 +@@ -56,7 +56,7 @@ + Menu + ContextMenu + Menu +- Pause ++ PlayPause + Stop + SkipNext + SkipPrevious +@@ -321,8 +321,8 @@ + NextSubtitle + StepBack + StepForward +- ChapterOrBigStepForward +- ChapterOrBigStepBack ++ VolumeUp ++ VolumeDown + AudioNextLanguage + NextSubtitle + AudioDelay +@@ -425,8 +425,8 @@ + StepForward + Rewind + FastForward +- SkipNext +- SkipPrevious ++ VolumeUp ++ VolumeDown + PlayerProcessInfo + LockPreset + FullScreen +@@ -632,8 +632,8 @@ + + StepBack + StepForward +- Up +- Down ++ VolumeUp ++ VolumeDown + OSD + OSD + ActivateWindow(PVROSDChannels) + diff --git a/projects/Slice3/patches/kodi/kodi-999.99-sysinfo-battery.patch b/projects/Slice3/patches/kodi/kodi-999.99-sysinfo-battery.patch new file mode 100644 index 0000000000..cd4d881ee9 --- /dev/null +++ b/projects/Slice3/patches/kodi/kodi-999.99-sysinfo-battery.patch @@ -0,0 +1,10 @@ +--- a/xbmc/windows/GUIWindowSystemInfo.cpp 2013-02-21 22:09:04.765734381 +0400 ++++ b/xbmc/windows/GUIWindowSystemInfo.cpp 2013-02-22 16:12:57.942164800 +0400 +@@ -100,7 +100,6 @@ + #endif + SetControlLabel(i++, "%s: %s", 12390, SYSTEM_UPTIME); + SetControlLabel(i++, "%s: %s", 12394, SYSTEM_TOTALUPTIME); +- SetControlLabel(i++, "%s: %s", 12395, SYSTEM_BATTERY_LEVEL); + } + else if (m_section == CONTROL_BT_STORAGE) + { diff --git a/projects/Slice3/patches/linux/linux-01-RPi_support.patch b/projects/Slice3/patches/linux/linux-01-RPi_support.patch new file mode 120000 index 0000000000..b6884c169a --- /dev/null +++ b/projects/Slice3/patches/linux/linux-01-RPi_support.patch @@ -0,0 +1 @@ +../../../RPi2/patches/linux/linux-01-RPi_support.patch \ No newline at end of file diff --git a/projects/Slice3/patches/linux/linux-04-rtc-pcf8523-c.patch b/projects/Slice3/patches/linux/linux-04-rtc-pcf8523-c.patch new file mode 100644 index 0000000000..da7593ed7e --- /dev/null +++ b/projects/Slice3/patches/linux/linux-04-rtc-pcf8523-c.patch @@ -0,0 +1,17 @@ +--- a/drivers/rtc/rtc-pcf8523.c 2016-10-01 10:16:30.259771931 +0100 ++++ b/drivers/rtc/rtc-pcf8523.c 2016-10-01 10:21:29.762638800 +0100 +@@ -291,7 +291,13 @@ static int pcf8523_probe(struct i2c_clie + if (!pcf) + return -ENOMEM; + +- err = pcf8523_select_capacitance(client, true); ++ if (of_property_read_bool(client->dev.of_node, "nxp,xtalcap-7pf")) { ++ printk(KERN_ERR "PCF8523 - set 7pF crystal load"); ++ err = pcf8523_select_capacitance(client, false); ++ } else { ++ printk(KERN_ERR "PCF8523 - set 12pF crystal load"); ++ err = pcf8523_select_capacitance(client, true); ++ } + if (err < 0) + return err; + diff --git a/projects/Slice3/patches/linux/linux-05-cs4265-c.patch b/projects/Slice3/patches/linux/linux-05-cs4265-c.patch new file mode 100644 index 0000000000..a3487ac222 --- /dev/null +++ b/projects/Slice3/patches/linux/linux-05-cs4265-c.patch @@ -0,0 +1,45 @@ +--- linux-4.4-rc7-old/sound/soc/codecs/cs4265.c 2016-01-13 20:56:05.637652775 +0000 ++++ linux-4.4-rc7/sound/soc/codecs/cs4265.c 2016-01-17 11:21:16.977652775 +0000 +@@ -157,7 +157,7 @@ + SOC_SINGLE("Validity Bit Control Switch", CS4265_SPDIF_CTL2, + 3, 1, 0), + SOC_ENUM("SPDIF Mono/Stereo", spdif_mono_stereo_enum), +- SOC_SINGLE("MMTLR Data Switch", 0, ++ SOC_SINGLE("MMTLR Data Switch", CS4265_SPDIF_CTL2, + 1, 1, 0), + SOC_ENUM("Mono Channel Select", spdif_mono_select_enum), + SND_SOC_BYTES("C Data Buffer", CS4265_C_DATA_BUFF, 24), +@@ -199,8 +199,6 @@ + SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_IN("DIN2", NULL, 0, + SND_SOC_NOPM, 0, 0), +- SND_SOC_DAPM_AIF_IN("TXIN", NULL, 0, +- CS4265_SPDIF_CTL2, 5, 1), + + SND_SOC_DAPM_OUTPUT("LINEOUTL"), + SND_SOC_DAPM_OUTPUT("LINEOUTR"), +@@ -384,7 +382,6 @@ + static int cs4265_digital_mute(struct snd_soc_dai *dai, int mute) + { + struct snd_soc_codec *codec = dai->codec; +- + if (mute) { + snd_soc_update_bits(codec, CS4265_DAC_CTL, + CS4265_DAC_CTL_MUTE, +@@ -410,7 +407,7 @@ + struct snd_soc_codec *codec = dai->codec; + struct cs4265_private *cs4265 = snd_soc_codec_get_drvdata(codec); + int index; +- ++printk(KERN_ERR "cs4265_pcm_hw_params: format = 0x%x, width = %d\n", cs4265->format, params_width(params)); + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE && + ((cs4265->format & SND_SOC_DAIFMT_FORMAT_MASK) + == SND_SOC_DAIFMT_RIGHT_J)) +@@ -469,6 +466,7 @@ + static int cs4265_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) + { ++printk(KERN_ERR "set_bias_level %d\n", level); + switch (level) { + case SND_SOC_BIAS_ON: + break; From c10ee861b839e70101a87cdbb8155d7ae78a900c Mon Sep 17 00:00:00 2001 From: chewitt Date: Sun, 6 Aug 2017 07:45:27 +0100 Subject: [PATCH 02/11] slice: add slice-firmware package --- .../linux-firmware/slice-firmware/package.mk | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 packages/linux-firmware/slice-firmware/package.mk diff --git a/packages/linux-firmware/slice-firmware/package.mk b/packages/linux-firmware/slice-firmware/package.mk new file mode 100644 index 0000000000..b602eefe75 --- /dev/null +++ b/packages/linux-firmware/slice-firmware/package.mk @@ -0,0 +1,44 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +PKG_NAME="slice-firmware" +PKG_VERSION="0f463cc" +PKG_ARCH="arm" +PKG_LICENSE="GPL" +PKG_SITE="https://github.com/FiveNinjas/slice-firmware" +PKG_URL="https://github.com/libreelec/slice-firmware/archive/$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain dtc" +PKG_SECTION="linux-firmware" +PKG_SHORTDESC="BCM270x firmware related stuff for Slice" +PKG_LONGDESC="BCM270x firmware related stuff for Slice" + +PKG_IS_ADDON="no" +PKG_AUTORECONF="no" + +make_target() { + if [ "$PROJECT" = "Slice3" ]; then + $(kernel_path)/scripts/dtc/dtc -O dtb -I dts -o dt-blob.bin slice3-dt-blob.dts + elif [ "$PROJECT" = "Slice" ]; then + $(kernel_path)/scripts/dtc/dtc -O dtb -I dts -o dt-blob.bin slice-dt-blob.dts + fi +} + +makeinstall_target() { + mkdir -p $INSTALL/usr/share/bootloader/ + cp -a $PKG_BUILD/dt-blob.bin $INSTALL/usr/share/bootloader/ +} From 0783480fa983c6cdf73a9d816b10a9a12003e91c Mon Sep 17 00:00:00 2001 From: chewitt Date: Sat, 5 Aug 2017 10:21:58 +0100 Subject: [PATCH 03/11] slice: add slice-driver package --- .../linux-drivers/slice-drivers/package.mk | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 packages/linux-drivers/slice-drivers/package.mk diff --git a/packages/linux-drivers/slice-drivers/package.mk b/packages/linux-drivers/slice-drivers/package.mk new file mode 100644 index 0000000000..5c9e366231 --- /dev/null +++ b/packages/linux-drivers/slice-drivers/package.mk @@ -0,0 +1,45 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +PKG_NAME="slice-drivers" +PKG_VERSION="d02f3e7" +PKG_ARCH="arm" +PKG_LICENSE="GPL" +PKG_SITE="https://github.com/LibreELEC/slice-drivers" +PKG_URL="https://github.com/LibreELEC/slice-drivers/archive/$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain linux" +PKG_NEED_UNPACK="$LINUX_DEPENDS" +PKG_SECTION="driver" +PKG_SHORTDESC="linux kernel modules for the Slice box" +PKG_LONGDESC="linux kernel modules for the Slice box" + +PKG_IS_ADDON="no" +PKG_AUTORECONF="no" + +pre_make_target() { + unset LDFLAGS +} + +make_target() { + make KDIR=$(kernel_path) +} + +makeinstall_target() { + mkdir -p $INSTALL/usr/lib/modules/$(get_module_dir)/$PKG_NAME + cp *.ko $INSTALL/usr/lib/modules/$(get_module_dir)/$PKG_NAME +} From 351652bba3e5e831e7588eca77fd5328957d3d67 Mon Sep 17 00:00:00 2001 From: chewitt Date: Sat, 5 Aug 2017 09:29:49 +0100 Subject: [PATCH 04/11] slice: add led_tools package --- packages/tools/led_tools/package.mk | 44 +++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 packages/tools/led_tools/package.mk diff --git a/packages/tools/led_tools/package.mk b/packages/tools/led_tools/package.mk new file mode 100644 index 0000000000..b6750e6e0d --- /dev/null +++ b/packages/tools/led_tools/package.mk @@ -0,0 +1,44 @@ +############################################################################### +# This file is part of LibreELEC - https://LibreELEC.tv +# Copyright (C) 2014 Gordon Hollingworth (gordon@fiveninjas.com) +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +PKG_NAME="led_tools" +PKG_VERSION="0.1" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.fiveninjas.com" +PKG_URL="http://updates.fiveninjas.com/src/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain zlib libpng slice-addon" +PKG_DEPENDS_HOST="toolchain" +PKG_SECTION="tools" +PKG_SHORTDESC="led_tools" +PKG_LONGDESC="LED tools, these are a set of tools to control the LEDs on Slice" + +PKG_IS_ADDON="no" +PKG_AUTORECONF="no" + +make_target() { + make CC="$CC" \ + CFLAGS="$CFLAGS" \ + LDFLAGS="$LDFLAGS" +} + +makeinstall_target() { + mkdir -p $INSTALL/usr/bin + cp led_png $INSTALL/usr/bin +} From bc86ad98dba3c744b48247a1649f9ea2e7f58638 Mon Sep 17 00:00:00 2001 From: chewitt Date: Sat, 5 Aug 2017 09:30:59 +0100 Subject: [PATCH 05/11] slice: add slice.service addon --- packages/addons/service/slice/changelog.txt | 5 + packages/addons/service/slice/icon/icon.png | Bin 0 -> 25063 bytes packages/addons/service/slice/package.mk | 47 ++++ .../addons/service/slice/source/default.py | 237 ++++++++++++++++++ .../resources/media/ledpatterns/ffwd.png | Bin 0 -> 235 bytes .../resources/media/ledpatterns/pause.png | Bin 0 -> 247 bytes .../resources/media/ledpatterns/play.png | Bin 0 -> 250 bytes .../resources/media/ledpatterns/quit.png | Bin 0 -> 2530 bytes .../resources/media/ledpatterns/rew.png | Bin 0 -> 242 bytes .../resources/media/ledpatterns/shutdown.png | Bin 0 -> 4338 bytes .../resources/media/ledpatterns/skipf.png | Bin 0 -> 229 bytes .../resources/media/ledpatterns/skipr.png | Bin 0 -> 228 bytes .../resources/media/ledpatterns/sleep.png | Bin 0 -> 1342 bytes .../resources/media/ledpatterns/startup.png | Bin 0 -> 22721 bytes .../resources/media/ledpatterns/stop.png | Bin 0 -> 1329 bytes .../resources/media/ledpatterns/wake.png | Bin 0 -> 2543 bytes 16 files changed, 289 insertions(+) create mode 100644 packages/addons/service/slice/changelog.txt create mode 100644 packages/addons/service/slice/icon/icon.png create mode 100644 packages/addons/service/slice/package.mk create mode 100644 packages/addons/service/slice/source/default.py create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/ffwd.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/pause.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/play.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/quit.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/rew.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/shutdown.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/skipf.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/skipr.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/sleep.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/startup.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/stop.png create mode 100644 packages/addons/service/slice/source/resources/media/ledpatterns/wake.png diff --git a/packages/addons/service/slice/changelog.txt b/packages/addons/service/slice/changelog.txt new file mode 100644 index 0000000000..c88e23ed43 --- /dev/null +++ b/packages/addons/service/slice/changelog.txt @@ -0,0 +1,5 @@ +101 +- Fix sleep.png so all LED's turn off + +100 +- Initial release diff --git a/packages/addons/service/slice/icon/icon.png b/packages/addons/service/slice/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d669c45ed6e7814c5374d4031efbd46ebc07737f GIT binary patch literal 25063 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 D1oI2V literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/package.mk b/packages/addons/service/slice/package.mk new file mode 100644 index 0000000000..844191aa92 --- /dev/null +++ b/packages/addons/service/slice/package.mk @@ -0,0 +1,47 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +PKG_NAME="slice" +PKG_VERSION="0" +PKG_REV="101" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="" +PKG_URL="" +PKG_DEPENDS_TARGET="toolchain" +PKG_SECTION="service" +PKG_SHORTDESC="Controls the LED lights on the Slice box using Kodi actions" +PKG_LONGDESC="Controls the LED lights on the Slice box using Kodi actions" +PKG_AUTORECONF="no" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="Slice" +PKG_ADDON_PROJECTS="Slice Slice3" +PKG_ADDON_TYPE="xbmc.service" + +make_target() { + : +} + +makeinstall_target() { + : +} + +addon() { + : +} diff --git a/packages/addons/service/slice/source/default.py b/packages/addons/service/slice/source/default.py new file mode 100644 index 0000000000..214b03a18a --- /dev/null +++ b/packages/addons/service/slice/source/default.py @@ -0,0 +1,237 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +from PIL import Image + +import os +import threading +import time +import Queue +import xbmc +import xbmcaddon + +''' +ffwd.png +pause.png +play.png +quit.png +rew.png +shutdown.png +skipf.png +skipr.png +sleep.png +startup.png +stop.png +wake.png +''' + +__addon__ = xbmcaddon.Addon() +__path__ = __addon__.getAddonInfo('path') + +class PNGPatternPlayer(threading.Thread): + + def __init__(self): + threading.Thread.__init__(self) + self.path = __path__ + "/resources/media/ledpatterns" + self.patterns = Queue.Queue() + self.responses = Queue.Queue() + self.stopped = False + self.memo = {} + self.start() + + def setPath(self, path): + if self.path != path: + self.path = path + self.memo = {} + + def clearPattern(self): + with open('/dev/ws2812', 'wb') as f: + f.write(bytearray(25)) + + def playPattern(self, file, delay): + xbmc.log('playing pattern: %s' % file, xbmc.LOGNOTICE) + + 'get pixel data from a cache if available, otherwise load and calculate' + if file not in self.memo: + image = Image.open(file) + pixels = image.load() + width, height = image.size + data = [] + + for y in range(height): + x_pixels = [] + for x in range(width): + pixel = [] + r, g, b, a = pixels[x, y] + pixel.append(hex(r)[2:].zfill(2)) + pixel.append(hex(g)[2:].zfill(2)) + pixel.append(hex(b)[2:].zfill(2)) + pixel.append(hex(a)[2:].zfill(2)) + x_pixels.append(''.join(str(e) for e in pixel)) + data.append(' '.join(str(e) for e in x_pixels)) + + self.memo[file] = data + + for hexline in self.memo[file]: + if not self.stopped: + with open('/dev/ws2812', 'wb') as f: + f.write(bytearray.fromhex(hexline)) + time.sleep(delay) + else: + break + + def play(self, file, repeat=False, delay=0.030, wait=None): + self.stopped = True + + if wait is not None: + # wait up to specified time if this pattern is to be processed synchronously + self.patterns.put((file, repeat, delay, True)) + try: + result = self.responses.get(block=True, timeout=wait) + except Queue.Empty: + pass + else: + self.patterns.put((file, repeat, delay, False)) + + def stop(wait=None): + self.play(None, wait=wait) + + def run(self): + repeat = False + + while True: + try: + (file, repeat, delay, wait) = self.patterns.get(block=True, timeout=0 if repeat and not self.stopped else None) + + self.stopped = False + + if file is not None: + self.playPattern("%s/%s.png" % (self.path, file), delay) + else: + self.clearPattern() + + if wait: + self.responses.put(True) + + # Queue will be empty if we're repeating the last pattern and there is no new work + except Queue.Empty: + self.playPattern("%s/%s.png" % (self.path, file), delay) + +class SlicePlayer(xbmc.Player): + + def __init__(self, *args, **kwargs): + xbmc.Player.__init__(self) + + 'maps kodi player speed to delay in seconds' + self.speed_map = { 1: 0.060, + 2: 0.040, + 4: 0.035, + 8: 0.030, + 16: 0.025, + 32: 0.015, + } + + self.speed = 1 + patterns.play('startup', False, 0.02) + + def onPlayBackEnded(self): + 'Will be called when Kodi stops playing a file' + + patterns.play('stop') + + def onPlayBackPaused(self): + 'Will be called when user pauses a playing file' + + patterns.play('pause') + + def onPlayBackResumed(self): + 'Will be called when user resumes a paused file' + + patterns.play('play') + + def onPlayBackSeek(self, iTime, seekOffset): + 'Will be called when user seeks to a time' + + # todo: not working + + xbmc.log('time offset: %d' % iTime, xbmc.LOGNOTICE) + xbmc.log('seek offset: %d' % seekOffset, xbmc.LOGNOTICE) + + if seekOffset > 0: + patterns.play('skipf') + else: + patterns.play('skipr') + + def onPlayBackSeekChapter(self, chapter): + 'Will be called when user performs a chapter seek' + pass + + def onPlayBackSpeedChanged(self, speed): + 'Will be called when players speed changes. (eg. user FF/RW)' + + xbmc.log('seek speed: %d' % speed, xbmc.LOGNOTICE) + + self.speed = speed + + if self.speed != 1: + patterns.play('ffwd' if self.speed > 0 else 'rew', True, self.speed_map[self.speed]) + else: + patterns.stop() + #OR: patterns.play('play') ??? + + def onPlayBackStarted(self): + 'Will be called when Kodi starts playing a file' + + patterns.play('play') + + def onPlayBackStopped(self): + 'Will be called when user stops Kodi playing a file' + + patterns.play('stop') + +class SliceMonitor(xbmc.Monitor): + + def __init__(self, *args, **kwargs): + xbmc.Monitor.__init__(self) + + def onScreensaverActivated(self): + 'Will be called when screensaver kicks in' + + patterns.play('sleep') + + def onScreensaverDeactivated(self): + 'Will be called when screensaver goes off' + + patterns.play('wake') + + def onSettingsChanged(self): + 'Will be called when addon settings are changed' + + # meh + +if (__name__ == "__main__"): + patterns = PNGPatternPlayer() + player = SlicePlayer() + monitor = SliceMonitor() + + monitor.waitForAbort() + patterns.play('shutdown', wait=5.0) + + del SliceMonitor + del SlicePlayer + del PNGPatternPlayer \ No newline at end of file diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/ffwd.png b/packages/addons/service/slice/source/resources/media/ledpatterns/ffwd.png new file mode 100644 index 0000000000000000000000000000000000000000..5bee66fb5cfc8218fc77a18194cd492b884d4178 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMQ!3HD+(^8%SDVB6cUq=Rpjs4tz5?O(K&H|6f zVg?4jgCNYfV`BDOprBNVYeY$Kep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nv5 zo-U3d7XDj%8Mzn~Iaq3E`G0=COr~5Uw`3+4v*{G)EM=urXS`fYE1t~VG(-RE)4w7| z<~bMUh`1VRY)%fSQ#ra|&W;|(ohlN|MW+*Ugxvr1^v++Dlk_84M8vpX{{E%oZ~Ek) bI^JSfB_?ZD`cbqEXeEQEtDnm{r-UW|3P4S; literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/pause.png b/packages/addons/service/slice/source/resources/media/ledpatterns/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..60a480f1047a84c6bf5feb263913dc6bae8c33be GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMQ!3HD+(^8%SDVB6cUq=Rpjs4tz5?O(K&H|6f zVg?4j10c+pb*+;VC@59p8c`CQpH@;6t+$9cg)rXSZznZD{glC2O4^Z*9)o694sQ?`Jwt?X|&~Vb{L9 sOc%b)6JU6`H|W11mdKI;Vst0ND0eL;wH) literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/quit.png b/packages/addons/service/slice/source/resources/media/ledpatterns/quit.png new file mode 100644 index 0000000000000000000000000000000000000000..667ada77e62bca01dc3275a4efa48a80a0ae0ca0 GIT binary patch literal 2530 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 guq=t@ne(6j1;Y;4k07*qoM6N<$f>UXGq5uE@ literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/skipf.png b/packages/addons/service/slice/source/resources/media/ledpatterns/skipf.png new file mode 100644 index 0000000000000000000000000000000000000000..2018e325eb8d9ab8e119776ba7db38e6da5ad2af GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMI!3HF6S#5U!QY`6?zK#qG8~eHcB(eheoCO|{ z#XvRtL735kHCP2GC{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)WP*tL* zi(`m||JL)~d<_Z$EEnyh+#f$%s~51?^~bqIVl9br6LPfEwN+o+94%2?YVfAFC9!47 zw!|%eZX3CIXZt2^S##CE&AaOLu@@gRe0${1h8@kQ*edVlynC17t~+->FJ1A3*-LAG Ve%aQBmq5!HJYD@<);T3K0RWJlPlf;h literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/skipr.png b/packages/addons/service/slice/source/resources/media/ledpatterns/skipr.png new file mode 100644 index 0000000000000000000000000000000000000000..9292082b82fafe00c00691e39fd387b616217220 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMI!3HF6S#5U!QY`6?zK#qG8~eHcB(eheoCO|{ z#XvRtK$!8B)5ZfpL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3Q$0figD*u3fvOTb zT^vI!{I_0k_HNvGrg9r0B1PkW@YaraaU&na4uQhFzw`dzbF+J5!i`%RoV3`P6% U+ikvu0PSM%boFyt=akR{03?A<)c^nh literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/sleep.png b/packages/addons/service/slice/source/resources/media/ledpatterns/sleep.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a6af639d297bc5fa2068f11848f0c92ff4a951 GIT binary patch literal 1342 zcmeAS@N?(olHy`uVBq!ia0vp^l0dA&!3HF2cqa-lFfe*&hD4M^`1)8S=jZArrsOB3 z>Q&?x0Oc7NZ0suv5|gu2OB9k)(=+pImEP~(ucVNfVyhHx>TBRz;GCL~=}}db8eHWU zl3bOYY?-2DZ^va*VFffGH?<^Dp&~aYuh^=>Rtapb6_5=Q)>l#hD=EpgRdNJbs1V^B zpx~Tel&WB=XQrEMXl$WiZmDNzYH49)qN8ABU}&aqV5x6tqHADiWngJ#V5k5EN_Jcd zHbp6ERzWUqP|JWkTcwPWk^(Dz{qpj1y>er{{GxPyLrY6beFGzXBO_g)3ffijpdD3#N;K*mpn|z-BuUEUha-#0dDLR2l z7a~iXm#EzSs3aG%(nC;1@7J9?1}2U8J4#>Q*J;WSal%d zlTl~aG)Lu*h9mqgPtI?zE^&GKgi$W%fsNnag*>}9*hz)&7w@N3GoXnTZ8*sWTn_<`>dOAXVFi_RicZur-%wg zm#k6P(Q#RrbJeUyh9^x~B_Y)lWM7Egu-x|P6H^4^e#ZN6;-W58^y=KW9e=N`(__z+ zIKLRKK=%WMFU4*!otIcAe1XAxP2G{_QfCW#?flvV1QaGYuIf>nptbNNi;QEOWAy{p zADo}w{6Fu&`{``0Hk0WS29_mR3ak@)mO0F6=+!G=lXNJTJIFu5^u;Zu#|%1a;?G^y zQsK>DzLK%caqTn(uX7reZWjzUvd;5qkUwy&p7Zpa_htGG+a^SdcP%j6F_q25_3vTf z53gq2VXyqcQOA@$;ctsK`}cKBFV_fc-TG8b+=h2nONHUegh{e5x?LCAS!7SpZILtQ z|8z0XReBEV1;@Cmy;rWa3+ZQzzH_c9)9F_`a*QQ~d)M}I(qY&^S!0Nt%6Z@+9{aaWcO7_g-cM zW(dB#v-_P?^vP{8!V7UgHj%&9ruk*_s(Hy(>sKo0 zuHV>tEhs|#-AS3r?;OwX^B3`%Z+Y}yLUR9GOVbSZ9fyu2*zbJ$e`3JFV=Ze%ENnM? z6ye*ef45yyZHHgv4mGo;A7tU%q(8 kw3Gef-}i0#J4yJ-{$O?W)#cXb?t_XwPgg&ebxsLQ07)q_C;$Ke literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/startup.png b/packages/addons/service/slice/source/resources/media/ledpatterns/startup.png new file mode 100644 index 0000000000000000000000000000000000000000..282954b4a8ea89865c9f15a2ba9fe0b3c8eca59b GIT binary patch literal 22721 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 M07*qoM6N<$f)!G%?EnA( literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/stop.png b/packages/addons/service/slice/source/resources/media/ledpatterns/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..e02589b8136cc15de486d0fedd700f36485685d4 GIT binary patch literal 1329 zcmV-11P000pP1^@s6D7ps@00004XF*Lt007wQ z^&Awc0000WV@Og>004&%004{)008-u004yL004V}008TC002L<001Ibb!%Rn000B< zX+uL$Nkc;*P;zf(X>4Tx07%D;Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p z=|UR0&DbiW$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YY zXp{DWs&KBaQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4 zrh87hTrL7G#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx z-0?i(9WEw_SYddU<1E8793KxjQ|c&UmW!mTC> zk>?{om1c9SUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$ zj$aOQ5Y{cTROCL1M7^NKKL&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*Mp zVGd>OdF6n^am1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4 ze9&3ow|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}J zoR}5UAd7p&5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+ zoNL9T1Aits?sKNIwvGaN)^WO$I z^cUV)HzL_|1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~ z_yl0%<7V@pN2bPDNB8b~7$DE-^4L^m3s9004zaL_t(IPrZ&o4!|G? z!1lB~Z9jKngy<|$5;BusDpId{$`7E-24yxV7jA&&98gZk!UqV1P#R;P3L_Xo+3*5N zAcV3#)JPRB8rg(UTHqw2A==YHX}>#(=q&B&ploQw3+de^AfPn7P#_?noESqRhXDcQ nf-L+(a}Fr8L75H8M6U7zW8dXMNKhyO00000NkvXXu0mjfq^)Ko literal 0 HcmV?d00001 diff --git a/packages/addons/service/slice/source/resources/media/ledpatterns/wake.png b/packages/addons/service/slice/source/resources/media/ledpatterns/wake.png new file mode 100644 index 0000000000000000000000000000000000000000..31944073b0969e3935cfc2dc9bd980f2c9b1e4e4 GIT binary patch literal 2543 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 FV1g8Q( Date: Sat, 5 Aug 2017 09:30:35 +0100 Subject: [PATCH 06/11] slice: add slice.service to image --- packages/tools/slice-addon/package.mk | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 packages/tools/slice-addon/package.mk diff --git a/packages/tools/slice-addon/package.mk b/packages/tools/slice-addon/package.mk new file mode 100644 index 0000000000..237acd7f6c --- /dev/null +++ b/packages/tools/slice-addon/package.mk @@ -0,0 +1,43 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +PKG_NAME="slice-addon" +PKG_VERSION="1.0" +PKG_REV="101" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="" +PKG_URL="" +PKG_DEPENDS_TARGET="" +PKG_SHORTDESC="Controls the LED lights on the Slice box using Kodi actions" +PKG_LONGDESC="Controls the LED lights on the Slice box using Kodi actions" +PKG_AUTORECONF="no" + +PKG_IS_ADDON="no" + +make_target() { +( + cd $ROOT + scripts/create_addon slice +) +} + +makeinstall_target() { + mkdir -p $INSTALL/usr/share/kodi/addons + cp -R $BUILD/$ADDONS/slice/service.slice $INSTALL/usr/share/kodi/addons +} From b261cb3effa0a7dde36c277231db81e942fe18c9 Mon Sep 17 00:00:00 2001 From: chewitt Date: Sat, 5 Aug 2017 09:33:26 +0100 Subject: [PATCH 07/11] kodi: add slice options --- packages/mediacenter/kodi/package.mk | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/mediacenter/kodi/package.mk b/packages/mediacenter/kodi/package.mk index 192f7a31ad..edfea75cd2 100644 --- a/packages/mediacenter/kodi/package.mk +++ b/packages/mediacenter/kodi/package.mk @@ -188,6 +188,10 @@ else KODI_ARCH="-DWITH_ARCH=$TARGET_ARCH" fi +if [ "$PROJECT" = "Slice" -o "$PROJECT" = "Slice3" ]; then + PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET led_tools" +fi + if [ ! "$KODIPLAYER_DRIVER" = default ]; then PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET $KODIPLAYER_DRIVER" if [ "$KODIPLAYER_DRIVER" = bcm2835-driver ]; then @@ -333,6 +337,9 @@ post_makeinstall_target() { xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "os.openelec.tv" $ADDON_MANIFEST xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "repository.libreelec.tv" $ADDON_MANIFEST xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "service.libreelec.settings" $ADDON_MANIFEST + if [ "$PROJECT" = "Slice" -o "$PROJECT" = "Slice3" ]; then + xmlstarlet ed -L --subnode "/addons" -t elem -n "addon" -v "service.slice" $ADDON_MANIFEST + fi # more binaddons cross compile badness meh sed -e "s:INCLUDE_DIR /usr/include/kodi:INCLUDE_DIR $SYSROOT_PREFIX/usr/include/kodi:g" \ From 39f48f39754d2f8cb6c635dbb6c6d6dcff999c41 Mon Sep 17 00:00:00 2001 From: chewitt Date: Sun, 6 Aug 2017 08:31:52 +0100 Subject: [PATCH 08/11] linux: enable CS4265 driver for slice --- projects/RPi/linux/linux.arm.conf | 2 +- projects/RPi2/linux/linux.arm.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/RPi/linux/linux.arm.conf b/projects/RPi/linux/linux.arm.conf index c3ab9f4c7a..8c1b666cae 100644 --- a/projects/RPi/linux/linux.arm.conf +++ b/projects/RPi/linux/linux.arm.conf @@ -2846,7 +2846,7 @@ CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_CS42L52 is not set # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set -# CONFIG_SND_SOC_CS4265 is not set +CONFIG_SND_SOC_CS4265=m # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS4271_SPI is not set diff --git a/projects/RPi2/linux/linux.arm.conf b/projects/RPi2/linux/linux.arm.conf index 8cc691ae8b..356a29d284 100644 --- a/projects/RPi2/linux/linux.arm.conf +++ b/projects/RPi2/linux/linux.arm.conf @@ -2939,7 +2939,7 @@ CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_CS42L52 is not set # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set -# CONFIG_SND_SOC_CS4265 is not set +CONFIG_SND_SOC_CS4265=m # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS4271_SPI is not set From 319bb26d4e7e0ba69bcfe93b2140afec9df192fe Mon Sep 17 00:00:00 2001 From: chewitt Date: Sat, 5 Aug 2017 10:20:53 +0100 Subject: [PATCH 09/11] linux: backport project/device overlays dts support --- packages/linux/package.mk | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/linux/package.mk b/packages/linux/package.mk index 609149c294..42032e84fc 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -135,6 +135,16 @@ post_patch() { sed -i -e "s|^CONFIG_ISCSI_IBFT_FIND=.*$|# CONFIG_ISCSI_IBFT_FIND is not set|" $PKG_BUILD/.config sed -i -e "s|^CONFIG_ISCSI_IBFT=.*$|# CONFIG_ISCSI_IBFT is not set|" $PKG_BUILD/.config fi + + # install extra dts files + for f in $PROJECT_DIR/$PROJECT/config/*-overlay.dts; do + [ -f "$f" ] && cp -v $f $PKG_BUILD/arch/$TARGET_KERNEL_ARCH/boot/dts/overlays || true + done + if [ -n "$DEVICE" ]; then + for f in $PROJECT_DIR/$PROJECT/devices/$DEVICE/config/*-overlay.dts; do + [ -f "$f" ] && cp -v $f $PKG_BUILD/arch/$TARGET_KERNEL_ARCH/boot/dts/overlays || true + done + fi } makeinstall_host() { From 763d8e0821451e822e903989965cba51cebdedaa Mon Sep 17 00:00:00 2001 From: chewitt Date: Sun, 6 Aug 2017 04:24:25 +0100 Subject: [PATCH 10/11] bcm2835-bootloader: compile dt-blob.bin for slice and cleanup scripts --- packages/tools/bcm2835-bootloader/package.mk | 18 +++++++++++------- packages/tools/bcm2835-bootloader/release | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/tools/bcm2835-bootloader/package.mk b/packages/tools/bcm2835-bootloader/package.mk index d9615ccc71..49c28979d3 100644 --- a/packages/tools/bcm2835-bootloader/package.mk +++ b/packages/tools/bcm2835-bootloader/package.mk @@ -31,10 +31,7 @@ PKG_IS_ADDON="no" PKG_AUTORECONF="no" make_target() { - if [ -f $DISTRO_DIR/$DISTRO/config/dt-blob.dts ]; then - echo Compiling device tree blob - $(kernel_path)/scripts/dtc/dtc -O dtb -o dt-blob.bin $DISTRO_DIR/$DISTRO/config/dt-blob.dts - fi + : } makeinstall_target() { @@ -43,17 +40,24 @@ makeinstall_target() { cp -PRv bootcode.bin $INSTALL/usr/share/bootloader cp -PRv fixup_x.dat $INSTALL/usr/share/bootloader/fixup.dat cp -PRv start_x.elf $INSTALL/usr/share/bootloader/start.elf - [ -f dt-blob.bin ] && cp -PRv dt-blob.bin $INSTALL/usr/share/bootloader/dt-blob.bin cp -PRv $PKG_DIR/scripts/update.sh $INSTALL/usr/share/bootloader - if [ -f $DISTRO_DIR/$DISTRO/config/distroconfig.txt ]; then + if [ -f $PROJECT_DIR/$PROJECT/devices/$DEVICE/config/distroconfig.txt ]; then + cp -PRv $PROJECT_DIR/$PROJECT/devices/$DEVICE/config/distroconfig.txt $INSTALL/usr/share/bootloader + elif [ -f $PROJECT_DIR/$PROJECT/config/distroconfig.txt ]; then + cp -PRv $PROJECT_DIR/$PROJECT/config/distroconfig.txt $INSTALL/usr/share/bootloader + elif [ -f $DISTRO_DIR/$DISTRO/config/distroconfig.txt ]; then cp -PRv $DISTRO_DIR/$DISTRO/config/distroconfig.txt $INSTALL/usr/share/bootloader else cp -PRv $PKG_DIR/files/3rdparty/bootloader/distroconfig.txt $INSTALL/usr/share/bootloader fi - if [ -f $DISTRO_DIR/$DISTRO/config/config.txt ]; then + if [ -f $PROJECT_DIR/$PROJECT/devices/$DEVICE/config/config.txt ]; then + cp -PRv $PROJECT_DIR/$PROJECT/devices/$DEVICE/config/config.txt $INSTALL/usr/share/bootloader + elif [ -f $PROJECT_DIR/$PROJECT/config/config.txt ]; then + cp -PRv $PROJECT_DIR/$PROJECT/config/config.txt $INSTALL/usr/share/bootloader + elif [ -f $DISTRO_DIR/$DISTRO/config/config.txt ]; then cp -PRv $DISTRO_DIR/$DISTRO/config/config.txt $INSTALL/usr/share/bootloader else cp -PRv $PKG_DIR/files/3rdparty/bootloader/config.txt $INSTALL/usr/share/bootloader diff --git a/packages/tools/bcm2835-bootloader/release b/packages/tools/bcm2835-bootloader/release index 577d4b473b..f48d63f226 100755 --- a/packages/tools/bcm2835-bootloader/release +++ b/packages/tools/bcm2835-bootloader/release @@ -25,7 +25,7 @@ mkdir -p $RELEASE_DIR/3rdparty/bootloader cp -PR $BUILD/bcm2835-bootloader-*/bootcode.bin $RELEASE_DIR/3rdparty/bootloader/ cp -PR $BUILD/bcm2835-bootloader-*/fixup_x.dat $RELEASE_DIR/3rdparty/bootloader/fixup.dat cp -PR $BUILD/bcm2835-bootloader-*/start_x.elf $RELEASE_DIR/3rdparty/bootloader/start.elf - [ -f $BUILD/bcm2835-bootloader-*/dt-blob.bin ] && cp -PR $BUILD/bcm2835-bootloader-*/dt-blob.bin $RELEASE_DIR/3rdparty/bootloader/ + [ -f $BUILD/slice-firmware-*/dt-blob.bin ] && cp -PR $BUILD/slice-firmware-*/dt-blob.bin $RELEASE_DIR/3rdparty/bootloader/ cp -PR $INSTALL/usr/share/bootloader/*.dtb $RELEASE_DIR/3rdparty/bootloader/ cp -PR $INSTALL/usr/share/bootloader/overlays $RELEASE_DIR/3rdparty/bootloader/ cp -PR $INSTALL/usr/share/bootloader/config.txt $RELEASE_DIR/3rdparty/bootloader/ From 37f98b5239664e9de7049268c2c36850d006f2bb Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Tue, 22 Aug 2017 10:44:54 -0700 Subject: [PATCH 11/11] service.slice: fix rew not playing --- packages/addons/service/slice/changelog.txt | 4 ++ packages/addons/service/slice/package.mk | 2 +- .../addons/service/slice/source/default.py | 42 ++++++++++++------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/packages/addons/service/slice/changelog.txt b/packages/addons/service/slice/changelog.txt index c88e23ed43..b8fc44b6fe 100644 --- a/packages/addons/service/slice/changelog.txt +++ b/packages/addons/service/slice/changelog.txt @@ -1,3 +1,7 @@ +102 +- Fix rew pattern not working +- Change logging to use LOGDEBUG + 101 - Fix sleep.png so all LED's turn off diff --git a/packages/addons/service/slice/package.mk b/packages/addons/service/slice/package.mk index 844191aa92..0ff3cc5e25 100644 --- a/packages/addons/service/slice/package.mk +++ b/packages/addons/service/slice/package.mk @@ -18,7 +18,7 @@ PKG_NAME="slice" PKG_VERSION="0" -PKG_REV="101" +PKG_REV="102" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="" diff --git a/packages/addons/service/slice/source/default.py b/packages/addons/service/slice/source/default.py index 214b03a18a..02a55c5b93 100644 --- a/packages/addons/service/slice/source/default.py +++ b/packages/addons/service/slice/source/default.py @@ -61,10 +61,12 @@ class PNGPatternPlayer(threading.Thread): def clearPattern(self): with open('/dev/ws2812', 'wb') as f: - f.write(bytearray(25)) + 'write null multiple times as the LEDs can get locked up with fast operations' + for n in range(5): + f.write(bytearray(25)) def playPattern(self, file, delay): - xbmc.log('playing pattern: %s' % file, xbmc.LOGNOTICE) + xbmc.log('playing pattern: %s' % file, xbmc.LOGDEBUG) 'get pixel data from a cache if available, otherwise load and calculate' if file not in self.memo: @@ -108,7 +110,7 @@ class PNGPatternPlayer(threading.Thread): else: self.patterns.put((file, repeat, delay, False)) - def stop(wait=None): + def stop(self, wait=None): self.play(None, wait=wait) def run(self): @@ -138,16 +140,24 @@ class SlicePlayer(xbmc.Player): xbmc.Player.__init__(self) 'maps kodi player speed to delay in seconds' - self.speed_map = { 1: 0.060, - 2: 0.040, - 4: 0.035, - 8: 0.030, - 16: 0.025, - 32: 0.015, + self.speed_map = {-32: 0.015, + -16: 0.025, + -8: 0.030, + -4: 0.035, + -2: 0.040, + -1: 0.060, + 0: 0.000, + 1: 0.060, + 2: 0.040, + 4: 0.035, + 8: 0.030, + 16: 0.025, + 32: 0.015, } self.speed = 1 patterns.play('startup', False, 0.02) + xbmc.log('service.slice add-on started', xbmc.LOGNOTICE) def onPlayBackEnded(self): 'Will be called when Kodi stops playing a file' @@ -169,8 +179,8 @@ class SlicePlayer(xbmc.Player): # todo: not working - xbmc.log('time offset: %d' % iTime, xbmc.LOGNOTICE) - xbmc.log('seek offset: %d' % seekOffset, xbmc.LOGNOTICE) + xbmc.log('time offset: %d' % iTime, xbmc.LOGDEBUG) + xbmc.log('seek offset: %d' % seekOffset, xbmc.LOGDEBUG) if seekOffset > 0: patterns.play('skipf') @@ -184,15 +194,17 @@ class SlicePlayer(xbmc.Player): def onPlayBackSpeedChanged(self, speed): 'Will be called when players speed changes. (eg. user FF/RW)' - xbmc.log('seek speed: %d' % speed, xbmc.LOGNOTICE) + xbmc.log('seek speed: %d' % speed, xbmc.LOGDEBUG) self.speed = speed if self.speed != 1: - patterns.play('ffwd' if self.speed > 0 else 'rew', True, self.speed_map[self.speed]) + if self.speed < 0: + patterns.play('rew', True, self.speed_map[self.speed]) + elif self.speed > 0: + patterns.play('ffwd', True, self.speed_map[self.speed]) else: patterns.stop() - #OR: patterns.play('play') ??? def onPlayBackStarted(self): 'Will be called when Kodi starts playing a file' @@ -234,4 +246,4 @@ if (__name__ == "__main__"): del SliceMonitor del SlicePlayer - del PNGPatternPlayer \ No newline at end of file + del PNGPatternPlayer