Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
LibreELEC is a minimalist 'Just enough OS' Linux distribution for running Kodi. Our documentation can help you install and configure LibreELEC to run Kodi, or develop and build installation images using our buildsystem.
Documentation is authored and maintained by LibreELEC users. If you see something is incorrect or missing please click the GitBook link below to join our documentation team. The GitBook online app makes changing documentation simple, with your changes sent directly to our documentation repo on GitHub as a pull-request that project staff can review and merge.
https://app.gitbook.com/invite/-MLu6vC60WCTrc5ntH0o/-MLu6xOKP1FP_QoIzYwk
All content is licensed under the Creative Commons CC BY-NC-SA 4.0 license.
User support is managed through our forum: and the #libreelec IRC channel on Libera Chat. Start a forum thread to ask a question, and someone will reply. Please be patient and wait for answers, we are all unpaid volunteers with jobs and families!
For support on Kodi itself, please refer to the official and .
The “LibreELEC USB-SD Creator” app helps you select and download the latest LibreELEC image for your HTPC device and create bootable USB or SD Card media. The tool is available for current 64-bit Windows 10/11 versions, and macOS v14.x and newer.
Download Links:
Note: The Linux version of the app for Ubuntu and Debian derivatives is not currently available. Please see the note on Alternatives below.
Choose the LibreELEC image and the app will show the latest stable release, e.g.
Generic x86_64 - LibreELEC-Generic.x86_64-12.0.1.img.gz
RaspberryPi 2/3 - LibreELEC-RPi2.arm-12.0.1.img.gz
RaspberryPi 4 - LibreELEC-RPi4.arm-12.0.1.img.gz
RaspberryPi 5 - LibreELEC-RPi5.arm-12.0.1.img.gz
If you select the 'Show all' check-box the drop list includes older stable releases too.
After selecting the LibreELEC image and version click the Download button. This will prompt you to select a folder to download to. You can also select a previously downloaded image file on your machine for installation. Hit the Select file button and browse your computer for the .img.gz file, or drag/drop the file on the app GUI.
Select the USB stick or SD card to write the image onto. Click the refresh button if the removable device is not listed. Note: ALL DATA ON THE TARGET DEVICE WILL BE OVERWRITTEN so please ensure there is no important data on it!
After selecting an image and target device the Write button is available. Click it to write the image. Once the progress bar reaches 100% and shows Writing done! you can exit the app, eject the USB or SD media, and boot your device to install LibreELEC.
If you have problems with the app, please post in the .
Here are some alternative tools that can be used for creating LibreELEC boot media:
can create Raspberry Pi images using files from our servers
is popular but huge (almost the same size as our distro images!)
is a reliable tool for Windows OS devices
is available from most Linux OS command lines
If you experience problems and want to investigate yourself or ask others for help in the forum or the IRC channel, a log file (or files) and configuration data provides useful info.
Kodi has default and debug log modes. As you'd expect, debug logs show more detail and are more useful for staff and forum regulars to work with. If you are asked for a log - assume the request is for a debug log and for the entire log file, not just the small snippet you think is useful (often we need to see and understand the configuration too).
Enable 'debug logging' at Settings → System → Logging, then paste or copy/share the logs.
The settings add-on has a built-in "paste" function that grabs the current Kodi log file and other useful system configuration details and sends them to the pastebin service. It is an easy way for inexperienced (or command-line phobic) users to share logs.
Navigate to LibreELEC → System → scroll down to Paste system logs and press enter to submit them. Once the upload completes the GUI will show a short URL that you can copy and use in a forum post or while chatting to developers on IRC.
SSH into your LibreELEC machine and run the following command:
You will get a short URL back. That will look like this:
Copy and paste the URL link to a forum post or an IRC chat session, or review it yourself.
If Samba (SMB Sharing) is enabled you can collect the log file by accessing the Logfile folder over the network. This is a special folder. When you access the folder it triggers a task to collect the current Kodi log and system configuration, and package everything into a single zip file that can be copied back to your local machine or unpacked in the share. The auto-created files are named with date and time to make it easier to find the latest file. Inside the zip are multiple files. The main one project staff will be interested in is KODI.log
!! PLEASE DO NOT UPLOAD LOG/ZIP FILES TO THE FORUM !!
Instead, open KODI.log in a text editor and copy/paste the content to an internet "paste" service like then share the paste URL. This makes reviewing your log a "one click" exercise so more people are likely to review it, and it saves a ton of disk space on our forum server.
The "Kodi Log Uploader" add-on can be installed from the Kodi add-on repo. It will detect that is being used on LibreELEC to collect the correct log files, and it performs the same task as the paste function in the LibreELEC settings add-on. The main difference is that Kodi Log Uploader displays a QR code on-screen to make the process of copying the pastebin URL for use easier (for some). It also sends the log to the Team Kodi pastebin service, which uses highlighting to make reading the logfile easier for developers and forum staff.
Dragonboard 410c support exists in LibreELEC as open-source freedreno drivers provided a stable Linux reference implementation of stateful V4L2m2m uAPI usage, allowing Team Kodi developers to evolve support for GBM and EGL/DRMPRIME rendering with zero-copy hardware decoding, which is now the foundation for future support of Kodi on Linux.
Kodi runs well on the Dragonboard 410c due to mature support in the Linux kernel and ffmpeg, but it is a expensive board to purchase and rather fiddly to flash with a LibreELEC image, so is not hardware the project staff recommends. Device support remains in the buildsystem for occasional reference testing of changes and we do not provide release images.
It is technically possible to dual-boot LibreELEC alongside an existing Windows or Linux installation, but the installation process is complex and less experienced users are prone to mistakes that result in their main Desktop OS and personal data being wiped from the hard drive. LibreELEC installers assume a dedicated disk target and cannot install into a spare partition or free space on the same drive that boots the Desktop OS. For this reason the project staff do not encourage or support dual-boot configurations. If you choose to attempt one and things go wrong, you were warned!
pastekodiLibreELEC:~ # pastekodi
http://ix.io/2f5Updating LibreELEC is (mostly) simple and can be done automatically, manually from inside the Kodi GUI via the LibreELEC Settings add-on, by downloading an update file from our website and copying the file to a local Samba share, or by running a command from the SSH console. We publish two image file types:
LibreELEC-Project.arch-11.0.1.tar (update) files which are used for updates only.
LibreELEC-Project.arch-11.0.1.img.gz (update + image) files which are used for creating new USB/SD installation media but can also be used for updates.
We can update from both .tar and .img.gz files.
Auto-Update is enabled by default and tracks minor version updates, e.g. LibreELEC 11.0.0 will update to 11.0.1, 11.0.2, etc. as they are released. It will not perform major version updates as these involve Kodi add-on updates (broken add-ons are the main source of update issues) and user-experience changes we do not want to force onto users. If auto-update is enabled the latest update file will download in the background, then Kodi will prompt you to reboot and start the update process. If you prefer to manage system updates manually, auto-update can be disabled in the settings add-on.
Navigate to the Update section of the settings add-on, select the update channel (LibreELEC major version) and then the specific minor version to update to. The update file will start downloading, and once complete the system will reboot to perform the update.
Please see the following video
Using a file browser (explorer.exe, not a web browser) copy/paste an update file to the \\LIBREELEC\UPDATE Samba share on your LibreELEC device. Once the file transfer has completed, reboot LibreELEC to start the update process.
SSH into your LibreELEC device and navigate to the (hidden) update folder
Check to make sure there are no files in the folder
Download the update file (change the URL for the current release, etc.)
Once the download has completed, reboot to start the update process
Download the LibreELEC image or update file and copy it to a USB drive. Connect the USB drive to your HTPC and navigate to the /storage/.update/ update folder using Kodi File Manager (you will need to enable viewing of hidden files and folders in Kodi settings). Copy the update file from the USB drive to /storage/.update then reboot to start the update process.
Kodi does not support downgrading. If "updating" within the same LibreELEC/Kodi major release, e.g. LibreELEC 11.0.1 to 11.0.0, the downgrade will normally work. If downgrading to an older LibreELEC/Kodi major version e.g. LibreELEC 11.0.1 to 10.0.4, the downgrade process will complete but Kodi may not gracefully handle being restarted with configuration files and add-ons from the (newer) previous release. Always make a backup before upgrading so that you can clean install then restore the backup to effect a downgrade without problems.
In 2016 when we forked from OpenELEC the differences between projects were small and it was simple to migrate by using our update .tar file. Today there are some challenges:
LibreELEC images for Generic x86_64 hardware have grown to 240MB+ in size and most older OpenELEC installs have a small 230MB boot partition so LibreELEC files will not fit and the manual .tar update process will fail (gracefully). Raspberry Pi and similar images are smaller and will still fit, but read on:
Older Kodi add-ons are frequently incompatible with newer Kodi versions, causing crashes when the system restarts, and the bigger the version jump the more likely add-ons will cause problems. LibreELEC will detect when Kodi repeatedly fails to start and defaults to a "safe mode" configuration, but this normally requires you to access the SSH console to get back to a working setup.
Kodi does not self-manage media and add-on package caches so over-time filesystem litter accumulates. Starting over from a clean install removes all the not-needed junk resulting in a faster/lighter installation with an improved Kodi user experience.
To migrate essential Kodi data from the old installation before migrating (which is likely to fail) or making a clean installation, enable the SSH service in the Settings add-on, then log-in over SSH to stop Kodi and back-up the userdata folder:
Backup files are normally 1-2GB in size so move them off-box by copying to USB or moving them to /storage/backup which is accessible over the network via the \\LIBREELEC\BACKUP Samba share. After clean installing LibreELEC you can restore the backup:
The following video shows the migration process from OpenELEC v7.0 to LibreELEC v7.0 as it looked in 2016. The Kodi GUI now looks different (the skin changed) but the process remains the same:
Current iMX6 images support the ARMv7-A dual-lite and quad versions (ARM Cortex-A9) of the following boards:
Cubox-i
Wandboard
Udoo
Current iMX8 images are experimental and do not support a specific board.
Installation is done by writing the LibreELEC *.img file to an SD card. The boards have internal hardware identifiers so there is no need to edit extlinux.conf on the card. Selection of the correct device dtb is handled internally within U-Boot.
NOTE - **** It is not possible to update from older LibreELEC or OpenELEC imx6.arm images to LE 11.0 as the boot configuration for LE 11.0 is different and older kernels do not support zstd compression. If you attempt an upgrade, the boot configuration of the old installation will be broken. You are advised to clean install LE 11.0 and manually restore sources and library DB files. Backups can be taken and restored, but as there is now a long time gap since LE 8.2.5 (and OE 8.0.x) it is best to start over with a clean system.
cd /storage/.updatels -lawget http://releases.libreelec.tv/LibreELEC-RPi4.arm-11.0.1.img.gzrebootcd /storage/backup
systemctl stop kodi
tar -czf kodi_userdata.tar.gz /storage/.kodi/userdatasystemctl stop kodi
rm -rf /storage/.kodi
tar -xzf /storage/kodi_userdata.tar.gz
systemctl start kodiThe project builds an OVA version of the Generic (x86_64) imported which can be imported into current versions of vmware Workstation, Fusion (on Intel macOS hardware), and vSphere (ESXi). The OVA exists to support project team-member development activities, e.g. functional testing of userspace changes and the LibreELEC settings add-on without needing to use HTPC hardware.
We have never formally supported running LibreELEC in a hypervisor. This is mainly because none of the active project maintainers do this, so when software breakage to the OVA occurs the break often goes undiscovered and unfixed for many months (until the next time some development needing it takes place).
As we do not support the current VMware oriented OVA image, there are no plans to extend virtual image non-support to include Hyper-V, KVM, QEMU or any other hypervisors.
We use GitHub Actions to automate building of "nightly" development snapshots of the master and stable branches and the add-ons for testing. Images can be downloaded from https://test.libreelec.tv/.
Kodi includes a default font that supports a large number of languages in a reasonable file size. It does not support all languages as this would require a font file larger than a LibreELEC image!
If you see blank squares for titles and filenames instead of readable text - You need to add a custom Arial True-Type (.ttf) font that supports the missing language characters and glyphs.
In LibreELEC create /storage/.kodi/userspace/Fonts/ (note the capital F) and place an Arial based font in the folder, e.g. /storage/.kodi/userspace/Fonts/Arial.ttf - after rebooting or restarting Kodi the font can be selected in Kodi Settings > Interface > Skin > Fonts.
Odroid XU4 and XU3 boards can run the Exynos image which uses a current upstream Linux kernel with a mesa/panfrost open-source graphics pipeline and the latest Kodi version.
H264, H263, VP8 and other older codecs are supported. XU4/XU3 do not have HEVC or VP9 support and cannot handle software decoding those formats.
Note: The Samsung S5-MFP decoding drivers regressed after Linux 5.4 when a cleanup was done on the driver that removed functionality. The original plan was to restore function in later changes, but this never happened. Due to the age of the boards now, is unlikely to happen. You may find the Linux 5.4 kernel images in the HardKernel forums are more functional.
Exynos images are designed to boot and run from SD card, but can also boot from an eMMC module if upstream u-boot is installed to the /dev/mmcblk1boot0 or /dev/mmcblk1boot1 partitions. The boot process requires extlinux support so will not work with the older vendor u-boot versions that sometime ship pre-installed on XU4 eMMC modules.
cron can be used to schedule timed event execution of binaries and scripts, e.g. download of EPG guides on a repeating time interval (hourly, every 12 hours, etc.) or running a nightly backup script in the background at 2am.
Running crontab -e will open the root user crontab in nano allowing you to paste content your cron commands. Use ctrl+o to save the file and ctrl-x to exit nano.
For more info on cron commands, see: https://help.ubuntu.com/community/CronHowto
LibreELEC original code is licensed under the GPL v2.0
Only nightly releases are available right now. Use at your own risk!
Boards/STBs with less than 1GiB of RAM are not supported
OrangePi Win
Pine64
Pine64 LTS
Pine64 Plus
BananaPi M2+
Beelink X2
Libretech ALL-H3-CC (Tritium)
NanoPi M1
OrangePi PC 2
Beelink GS1
OrangePi 3
OrangePi 3 LTS
OrangePi Lite 2
BananaPi M2 Ultra
LibreELEC builds and hosts a number of Kodi binary add-ons to extend functionality, e.g.
Audio Encoders
Audio Decoders
Image Decoders
Inputstream parsers
PVR clients
Screensavers
Virtual Filesystems
Visualisations
We also provide a range of program/service add-ons, including:
.net Core Runtime
Adafruit Libraries
BTRFS Tools
DVB Tools
"Tools" add-ons bundle multiple binaries into a single add-on with a themed purpose to reduce repo maintenance. Look in the Kodi GUI and the info panel will tell you the list of binaries in each bundle.
LibreELEC displays the project logo as a background "splash" screen during boot. This can be changed to your own image by placing oemsplash.png in the boot partition.
Copy your splash image to the Downloads folder, then SSH into your LibreELEC box. Next we must remount the boot partition in read-write mode so we can make changes:
mount -o remount,rw /flashCopy your splash image to the boot partition, renaming it to oemsplash.png
cp /storage/downloads/yoursplash.png /flash/oemsplash.pngRemount the boot partition in read-only mode:
mount -o remount,ro /flashOn reboot you should see the new bootsplash.
Splash images must be a 32-bit png files with 1920 x 1080, 1280 x 720, or 1024 x 768 pixel dimensions. Images will be upscaled to the active display resolution, so it is best to use the largest resolution (but not 4k, as most boot firmware does not support 4k output). Most OS image editors do not support 32-bit png export, so we recommend the excellent and open-source editor for making boot splashes.
Linux kernel firmware files are normally installed in /usr/lib/firmware but in LibreELEC this directory is inside the read-only SYSTEM file preventing you from adding files. To allow user changes we support overlays. Copy firmware files and subfolders to /storage/.config/firmware and reboot. On boot the folders/files will be overlaid onto /usr/lib/firmware where kernel drivers expect to see them.
The following text from dmesg shows the kernel failing to load rtl8761a_config.binwhich is needed for a Bluetooth device to work:
This can be fixed by creating the overlay directories and downloading the missing firmware file from the linux-firmware repository, then rebooting.
Firmware files can also be copied via the local Samba/SMB shares, as shown below:
How to disable the internal screen and force external HDMI/DP/VGA output
LibreELEC images are targeted at common HTPC device hardware: typically small form-factor and single-board computer devices that are static/attached to a TV or AVR device. One characteristic of common target hardware is a single active display connection even if the hardware has several output connector options. Laptops are not target hardware devices for the project, but the "Generic" x86_64 image(s) boot and run on a wide range of x86_64 devices and some users recycle old laptops as their HTPC. Laptops normally support multiple active display outputs: the internal LCD screen plus one of the following:
HDMI
DisplayPort
VGA
Some laptops can disable the internal screen and force display to an external output using BIOS configuration. Some detect whether the laptop lid is open or closed, and when closed output is automatically directed to an active external connector. Others require run-time switching using keyboard function keys, e.g. Fn+F7 but this needs software support in the OS, and since we are intentionally minimalist LibreELEC does not have that support.
In most cases with multiple display outputs the internal display probes first and display output is directed there. In this scenario users need to manually edit kernel boot parameters to disable the internal display connector, allowing the external connector to be found and used instead.
Enable SSH services and SSH into the laptop, then identify output devices:
The above output shows two display "connectors" are active and connected:
eDP-1 = the internal screen
HDMI-A-1 = the external HDMI connector
NB: Some laptops may use "LVDS-1" for the internal screen, and "VGA-1" for the external connector.
Next we make the boot partition writeable so boot parameters can be edited:
Now we edit them in the nano text editor:
Connectors are disabled by adding video= options, e.g. video=eDP-1:d will disable the eDP-1 connector allowing HDMI-A-1 to be used instead. In the example below the APPEND line has been modified to disable the eDP-1 connector:
After adding the details for the connector, you need to disable, save (ctr+o) and exit (ctrl+x) then reboot to test the change. On restart, the external connector should be the only active connector and Kodi should appear on the external display device. As the output capabilities of the external connector will be different to the internal screen, you may need to adjust the Kodi desktop resolution in Kodi display settings to match e.g. 720p or 1080p output.
The build-system also builds a range of LibreELEC or Kodi binary add-ons. These follow the same basic build command syntax as an image build, e.g. to build Tvheadend 4.2
PROJECT=Generic ARCH=x86_64 scripts/create_addon tvheadend42To compile all game.libretro add-ons:
PROJECT=Generic ARCH=x86_64 scripts/create_addon game.*To compile all https://github.com/LibreELEC/LibreELEC.tv/tree/master/packages/mediacenter/kodi-binary-addons:
To compile all https://github.com/LibreELEC/LibreELEC.tv/tree/master/packages/addons:
To compile all add-ons:
It is also possible to exclude specific add-ons:
To log errors to the $BUILD/logs/ directory:
To show help and list all add-on building functions:
In LibreELEC 10.x and newer ARM SoC devices (Allwinner, Amlogic, NXP, Qualcomm, Rockchip, Samsung) use the ARMv7 or ARMv8 project. This project uses a minimal distro configuration (disabling most features) to reduce the overall time spent on building add-on dependencies.
In most Linux distros modules are blacklisted by creating /etc/modprobe.d/blacklist.conf which contains the name of the module. In LibreELEC /etc is inside the read-only SYSTEM file so we provide an alternate location /storage/.config/modprobe.d which is overlaid onto the normal /etc location during boot.
To blacklist the rc-pinnacle-pctv-hd module. Login to your LibreELEC box using SSH and confirm the module is loaded:
If the module is loaded, append the module name to blacklist.conf:
Now reboot to effect the change.
This approach to blacklisting only works with modules that are compiled with =m to create an independent module; meaning they are loaded via modprobe. If the module has been compiled directly into the kernel with =y modprobe is not used and this method has no effect. Drivers that are compiled-in are normally controlled via kernel boot params.
BananaPi M5 and M2S have an optional WiFi mezzanine board with an RTL8822CS chip providing 802.11 b/g/n/ac on 2.4GHz/5GHz channels and Bluetooth 5.0 connectivity. The board is not active unless enabled through a device tree modification.
On BPI-M5 create /storage/.config/autostart.sh with the following content:
On BPI-M2S create /storage/.config/autostart.sh with the following content:
Installing LibreELEC to internal eMMC storage
Create a bootable SD card using the AMLGX "box" image, then edit the uEnv.ini file in the root folder of the SD card and change @@DTB_NAME@@ to meson-gxbb-wetek-hub.dtb or meson-gxbb-wetek-play2.dtb then save/eject and boot the box using the SD card. If you have been booting from SD card before it should automatically detect the card and boot into LibreELEC. If you have been booting from eMMC you may need to select "boot from SD Card" during boot.
Once the box has booted into the "box" image you can download the latest WeTek "board" image and install LibreELEC to internal eMMC storage using emmctool. This permanently overwrites the Android vendor OS with LibreELEC.
Find the URL for the relevant board image on the
WARNING: Hyperion does not support the GBM/V4L2 video pipeline used in LibreELEC 10.x and 11.x: including all Raspberry Pi and Generic x86_64 (GBM) releases. Users with x86_64 hardware can update to the Generic_Legacy (X11) image. Users with Raspberry Pi hardware must use an external grabber hardware device or remain on older releases. Changes to add GBM support to Hyperion are tracked here: https://github.com/hyperion-project/hyperion.ng/pull/1422
is an open source project that provides an ambient lighting system, compatible with Kodi. Hyperion requires hardware and software configuration. This page describes the process to add Hyperion to Generic x86_64 and Raspberry Pi hardware. For software configuration please head over to .
To force-update an add-on repository:
Kodi
Add-ons
Box icon
If you run LibreELEC behind an inline proxy that intercepts TLS communications or access content from an TLS encrypted source that requires a self-signed certificate to be trusted, you need to add the private CA certificate to the OS trust chain.
This is done by creating /storage/.config/cacert.pem with the private CA certificate details and rebooting. On restart the ssl-config systemd service will append the private certificate to the OS default certificate file to create a combined file /run/libreelec/cacert.pem which is the symlink target for /etc/ssl/cacert.pem
The autostart.sh script runs at the start of userspace boot. It can be used to run commands before Kodi starts. It does not exist by default, but you can create it using nano.
You can place any commands in the script, but note they will block the boot process until they complete, so most uses of autostart.sh require you to "background" and delay the commands, e.g. the following script sleeps for 20 seconds and then runs a kodi-send command to update the video library.
No official Blu-ray player software exists for Linux, but open-source libraries allow Kodi (on LibreELEC) to play most Blu-ray discs once /storage/.config/aacs/KEYDB.cfg has been populated with a flat-file database of known encryption keys and certificates. To avoid legal issues with DMCA laws in the USA we cannot pre-configure a key database, so you must install this yourself.
Connect to your LibreELEC device via SSH, then run the following commands:
The current file contains PK, HC, VUK and UK data required for attempting disc decryption with more than 170,000 titles. Periodically running the commands will refresh the KEYDB.cfg file and add support for new Blu-ray discs.
WiFi networks with a hidden SSID are not visible to the connection manager (ConnMan) so cannot be selected in the LibreELEC settings add-on, and even if you manually configure a new ConnMan network profile via SSH, ConnMan cannot see the network to use the stored profile to connect.
LE10 and older use ConnMan to manage connections and wpa_supplicant to create the actual connection. LE11 also use ConnMan to manage connections, but switched from wpa_supplicant to iwd allowing a simple systemd service to be used for connecting to hidden networks.
Create /storage/.config/system.d/hidden-ssid.service with the following content:
Replace <PWD> with the WiFi passphrase and <SSID>
PROJECT=Generic ARCH=x86_64 scripts/create_addon binaryPROJECT=Generic ARCH=x86_64 scripts/create_addon officialPROJECT=Generic ARCH=x86_64 scripts/create_addon allPROJECT=Generic ARCH=x86_64 scripts/create_addon all -game.* -official -pvr.htsPROJECT=Generic ARCH=x86_64 scripts/create_addon all --write-logs=errorsOrangePi 2
OrangePi PC
OrangePi PC plus
OrangePi Plus/Plus 2
OrangePi Plus 2E
OrangePi One Plus
Pine H64
Tanix TX6
FFmpeg Tools
Game Tools
JRE for BD-J menus
Multimedia Tools
Network Tools
Raspberry Pi Tools
System Tools
VDR Configuration
PROJECT=RPi2 ARCH=arm make image
VMware (not Virtualbox)
PROJECT=Virtual ARCH=x86_64 make image
WeTek Play, WeTek OpenELEC
PROJECT=WeTek_Play ARCH=arm make image
WeTek Play 2
PROJECT=WeTek_Play_2 ARCH=aarch64 make image
WeTek Core
PROJECT=WeTek_Core ARCH=arm make image
WeTek Hub
PROJECT=WeTek_Hub ARCH=aarch64 make image
Official releases were built using Ubuntu 16.04 LTS.
Freescale iMX6
PROJECT=imx6 ARCH=arm make image
Generic (x86_64)
PROJECT=Generic ARCH=x86_64 make image
Odroid C2
PROJECT=Odroid_C2 ARCH=aarch64 make image
Raspberry Pi 0/1
PROJECT=RPi ARCH=arm make image
Raspberry Pi 2/3
PROJECT=Virtual ARCH=x86_64 make image
WeTek Play, WeTek OpenELEC
PROJECT=WeTek_Play ARCH=arm make image
WeTek Core
PROJECT=WeTek_Core ARCH=arm make image
Official releases were built using Ubuntu 14.04 and 16.04 LTS.
Freescale iMX6
PROJECT=imx6 ARCH=arm make image
Generic (x86_64)
PROJECT=Generic ARCH=x86_64 make image
Raspberry Pi 0/1
PROJECT=RPi ARCH=arm make image
Raspberry Pi 2/3
PROJECT=RPi2 ARCH=arm make image
VMware (not Virtualbox)
LibreELEC:~ # tail /sys/class/drm/*/status
==> /sys/class/drm/card1-eDP-1/status <==
connected
==> /sys/class/drm/card1-HDMI-A-1/status <==
connectedmount -o remount,rw /flashPROJECT=Generic ARCH=x86_64 scripts/create_addon --helpPROJECT=ARM ARCH=arm DEVICE=ARMv7 scripts/create_addon all
PROJECT=ARM ARCH=arm DEVICE=ARMv8 scripts/create_addon all
PROJECT=ARM ARCH=aarch64 DEVICE=ARMv8 scripts/create_addon alllsmodecho "blacklist rc-pinnacle-pctv-hd" >> /storage/.config/modprobe.d/blacklist.confmkdir -p /storage/.config/aacs
curl -k -L http://fvonline-db.bplaced.net/fv_download.php?reduced -o /storage/.config/aacs/keydb.zip
unzip /storage/.config/aacs/keydb.zip -d /storage/.config/aacs/
mv /storage/.config/aacs/keydb.cfg /storage/.config/aacs/KEYDB.cfg
rm /storage/.config/aacs/keydb.zipmount -o remount,rw /flash
fdtput -t s /flash/meson-sm1-bananapi-m5.dtb /soc/sd@ffe03000 status okay
fdtput -t s /flash/meson-sm1-bananapi-m5.dtb /soc/bus@ffd00000/serial@24000 status okay
mount -o remount,ro /flashmount -o remount,rw /flash
fdtput -t s /flash/meson-sm1-bananapi-m2s.dtb /soc/sd@ffe03000 status okay
fdtput -t s /flash/meson-sm1-bananapi-m2s.dtb /soc/bus@ffd00000/serial@24000 status okay
mount -o remount,ro /flashEnable SSH and login, then run the following commands to download the board image to /storage and run emmctool to write (w) the LibreELEC-AMLGX.arm-11.0.0-wetek-play2.img.gz image to eMMC:
The emmctool utility will write the board image to eMMC, expand the /storage partition to 100% size and change the partition labels to BOOT and DISK to avoid name-clashing with the default labels used in the SD card image (so you can boot from SD card if needed).
Once emmctool has finished, run shutdown and remove the SD card. Then cycle power to boot into LibreELEC running from the internal storage.
https://releases.libreelec.tv/LibreELEC-AMLGX.arm-11.0.0-wetek-play2.img.gzcd /storage
wget https://releases.libreelec.tv/LibreELEC-AMLGX.arm-11.0.0-wetek-play2.img.gz
emmctool w LibreELEC-AMLGX.arm-11.0.0-wetek-play2.img.gzFor a list of commands, see Build (Basics).
Limit CPU and RAM so your system remains responsive.
The autostop.sh script runs during the shutdown process, but before the network is shutdown. It does not exist by default, but you can create it using nano.
Like the autostart.sh script you can place any commands in the script, and they will block the shutdown process for up to 5 minutes and then will be terminated automatically.
autostop.sh is available as of LibreELEC 10.0.2 or LibreELEC 11 nightlies 2022-02-04.
The shutdown.sh script run during the shutdown process. It does not exist by default, but you can create it using nano.
Unlike the autostart.sh script the network stack will not be up when the script runs and the shutdown.sh script should follow the following template to ensure commands are executed during the correct event, i.e. you can run different commands for a reboot event to halt event, or put commands outside the case ... esac as a catch-all.
nano /storage/.config/autostart.shwlan0wlan1wlan2Next enable and start the systemd service:
Starting the service will initiate the connection and ifconfig should show an active NIC with an IP address. Ensure testing is done with Ethernet cables unplugged else the default traffic route will be on the eth0 Ethernet connection.
[Unit]
Description=Hidden SSID Connect Service
After=network-online.target connman.service iwd.service
Wants=network-online.target connman.service iwd.service
Before=kodi.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/iwctl --passphrase <PWD> station wlan0 connect-hidden <SSID>
ExecStop=/usr/bin/iwctl station wlan0 disconnect
[Install]
WantedBy=multi-user.targetsystemctl enable /storage/.config/system.d/hidden-ssid.service
systemctl start hidden-ssid.servicenano /flash/syslinux.cfgAPPEND boot=UUID=10B4-4A77 disk=UUID=93786be3-5652-e2f498d33733 quiet video=eDP-1:dLibreELEC:/ # dmesg | grep rtw
[ 8.547372] rtw_8822cs mmc2:0001:1: WOW Firmware version 9.9.4, H2C version 15
[ 8.548447] rtw_8822cs mmc2:0001:1: Firmware version 9.9.14, H2C version 15
LibreELEC:/ # dmesg | grep -i Blue
[ 8.099139] Bluetooth: Core ver 2.22
[ 8.099306] NET: Registered PF_BLUETOOTH protocol family
[ 8.099317] Bluetooth: HCI device and connection manager initialized
[ 8.099538] Bluetooth: HCI socket layer initialized
[ 8.099557] Bluetooth: L2CAP socket layer initialized
[ 8.099797] Bluetooth: SCO socket layer initialized
[ 8.272210] Bluetooth: HCI UART driver ver 2.3
[ 8.272242] Bluetooth: HCI UART protocol H4 registered
[ 8.272930] Bluetooth: HCI UART protocol Three-wire (H5) registered
[ 8.307537] Bluetooth: HCI UART protocol Broadcom registered
[ 8.316217] Bluetooth: HCI UART protocol QCA registered
[ 9.038966] Bluetooth: hci0: RTL: examining hci_ver=0a hci_rev=000c lmp_ver=0a lmp_subver=8822
[ 9.042736] Bluetooth: hci0: RTL: rom_version status=0 version=3
[ 9.042767] Bluetooth: hci0: RTL: loading rtl_bt/rtl8822cs_fw.bin
[ 9.053947] Bluetooth: hci0: RTL: loading rtl_bt/rtl8822cs_config.bin
[ 9.094258] Bluetooth: hci0: RTL: cfg_sz 33, total sz 36529
[ 9.518223] Bluetooth: hci0: RTL: fw version 0xffb8abd6
[ 9.574916] Bluetooth: MGMT ver 1.22# apply patches to make the image like in CI
sed -i -e "/^USER docker/i RUN ln -s /usr/bin/gcc-10 /usr/bin/cc" tools/docker/focal/Dockerfile
# per tools/docker/README.md
docker build --pull -t libreelec tools/docker/focaldocker run \
-it --rm \
--log-driver none \
-v `pwd`:/build -w /build \
-e PROJECT=Generic \
-e ARCH=x86_64 \
-e MTPROGRESS=yes \
libreelec CMDdocker run \
-it --rm \
--log-driver none \
-v `pwd`:/build -w /build \
`# setting these the same disables swapping` \
--memory "6g" --memory-swap "6g" \
`# uses all cpus, but will reserve cycles on each` \
`#--cpus "4"` \
`# limit to certain processors` \
--cpuset-cpus "0-3" \
-e PROJECT=Generic \
-e ARCH=x86_64 \
-e MTPROGRESS=yes \
libreelec CMD(
sleep 20
kodi-send --host=127.0.0.1 -a "UpdateLibrary(video)"
)&nano /storage/.config/autostop.shnano /storage/.config/shutdown.shcase "$1" in
halt)
# your commands here
;;
poweroff)
# your commands here
;;
reboot)
# your commands here
;;
esac
# your commands hereArduino (Uno, nano, etc)
WS2801 LED strand
5V power supply
Wire/Jumpers
Breadboard/Protoboard (optional)
Soldering iron (optional)
Follow the tutorial here https://learn.adafruit.com/adalight-diy-ambient-tv-lighting/overview.
In Hypercon you will need to enable:
Pi devices can drive an SPI output directly, and hyperion can output to an spidev device. You need:
Raspberry Pi
WS2801 LED strand
5V power supply
Wire/Jumpers
You can find the pinout here https://pinout.xyz. You will need to connect the following pins:
You need to enable SPI in the config.txt file:
Add the following line to the end of the file:
Then reboot. In Hypercon you will need to enable:
What has happened once you entered the save mode? Pretty simple. Once you end up in safe mode, we did a backup of your existing Kodi installation in a different folder. From a technical point of view we simply renamed the existing (and failing) /storage/.kodi folder to /storage/.kodi.FAILED and triggered a reboot after that. That will mean your next Kodi start will end up with a vanilla Kodi but with a special red background and a notification screen, that you now have entered the save mode. It will look like this:
First you should read the infos given from from the notification screen above and also probably make notes if you might think you can't remember them later. Once that is done, you should follow this section which is similar to the "first run wizard" and gives you specific options to either enter a hostname, enable Samba and/or SSH or setting up your network connection like shown in the screenshots below:
We recommend to enable both SSH and Samba as this might be necessary to debug why your Kodi ended up in the safe mode at all.
After you ended the wizard all your settings, add-ons, library and what not from the previous (failing) installation are stored inside the /storage/.kodi.FAILED folder. This folder can either be accessed by SSH or Samba as we also share this folder by default if it exists. Please read the following if you don't know how to access LibreELEC: Accessing LibreELEC
From now on, if you want to debug why Kodi entered the safe mode, we will completely focus to the /storage/.kodi.FAILED folder which contains all the necessary information we might need to see what happened.
So for providing the logfile via SSH use the following command:
pastebinit /storage/.kodi.FAILED/temp/kodi.log
or search via Samba for the ''Kodi-Failed'' folder and enter the ''temp''-subfolder to get the ''kodi.log'' logfile.
For the very best option, we recommend to use the log uploader option we built-in in LibreELEC.
After we might have found out what the problem might have caused and we also might have fixed it, you don't need to do anything else beside rebooting your machine. We will automatically restore the old (and probably fixed) installation and at the next boot you will directly boot into Kodi like you are used to.
Be aware, that if we haven't fixed anything, that you will again enter the safe mode to be able to fix your installation if Kodi crashes multiple times again.
Safe mode can be completely disabled using a flag file /storage/.config/safemode.disable .
Login via SSH and type touch /storage/.config/safemode.disable
As Kodi don't provide any help you have to manually remove the addon.
Login via SSH and type rm -rf /storage/.kodi.FAILED/addons/addon.name
left arrow for the side menu
Check for updates
the date at the bottom should change to the current time
[ 8.641489] Bluetooth: hci0: RTL: rtl: loading rtl_bt/rtl8761a_fw.bin
[ 9.241371] bluetooth hci0: Direct firmware load for rtl_bt/rtl8761a_fw.bin failed with error -2mkdir -p /storage/.config/firmware/rtl_bt
cd /storage/.config/firmware/rtl_bt
wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtl_bt/rtl8761a_fw.bin
Connecting to git.kernel.org (136.144.49.103:443)
saving to 'rtl8761a_fw.bin'
rtl8761a_fw.bin 100% |**********************************| 74488 0:00:00 ETA
'rtl8761a_fw.bin' saved
rebootAmlogic images based on the legacy Linux 3.14 kernel were dropped for this release, with development shifting to the mainline Linux kernel.
Allwinner A64
PROJECT=Allwinner ARCH=arm DEVICE=A64 make image
Allwinner H3
PROJECT=Allwinner ARCH=arm DEVICE=H3 make image
Allwinner H6
PROJECT=Allwinner ARCH=arm DEVICE=H6 make image
Generic Intel/AMD x86_64
To improve Jenkins/CI automation with ARM SoC projects that support multiple $DEVICE types make image will iterate through all board/u-boot configurations for the device defined in scripts/uboot_helper resulting in ~3-10 images in the target folder. To avoid this behaviour and build a single board-specific image UBOOT_SYSTEM=<board> can be appended to the build command, e.g. to build an Amlogic image for a LibreComputer LePotato board:
Several ARM SoC devices have a UBOOT_SYSTEM=box configuration which excludes u-boot and provides all device-trees, allowing the image to boot using the Android/BSP u-boot on eMMC/SPI.
Official releases were built using Ubuntu 18.04 LTS.
This article documents LibreELEC's insecurities: the services we run by default and the security design choices and compromises the OS makes. Where options exist, it also provides guidance or warnings to help you better-secure your LibreELEC installation.
LibreELEC is designed for home networks and the out-of-box configuration is a compromise of security, supportability, and usability. It should not be used in security-sensitive networks.
Avahi (Zeroconf) runs in the background to announce services like Kodi, Samba, SSH over mDNS to the local network to make connecting from mDNS-aware OS and client applications easier. The service list is updated automatically when individual services are enabled or disabled. Avahi can be disabled in the LibreELEC settings add-on.
Bluetooth is enabled by default if hardware is detected to facilitate connections from remote controls and keyboards, and the OS listens for connections and pairing requests. Devices like speakers normally pair automatically while keyboards, remote controls, and compute devices with input capabilities normally prompt for a PIN code (shown on the screen). Bluetooth services including OBEX file transfer can be disabled in the LibreELEC settings add-on.
In a conventional Linux distro users access the OS with a non-privileged user account and use sudoto elevate privileges to perform tasks as the rootuser. This provides security isolation between user and system processes, with the side benefit of preventing easy end-user access to disruptive configuration options that are easily changed or misconfigured resulting in complex support activity.
In LibreELEC there is a singlerootuser and most internal services run as the root user. This reduces distro maintenance and eliminates the need for sudo to provide a simple console experience for users with typically low or no Linux CLI experience. Although users have rootprivileges, most of the filesystem exists in a read-only state so there is limited scope for unskilled users to misconfigure the OS from its default known-good state.
As the default root/libreeleccredential is a well-known secret the first-run wizard prompts for it to be changed. It can also be changed from the console using passwd. It is not possible to add users, groups, or change the user:group context applications run under without creating a custom OS image with baked-in changes.
Users are strongly advised to change default credentials. The default root/libreelec and libreelec/libreelec have long been observed in common password dictionary lists that are available to anyone.
The OS is intended for use inside a home network behind a NAT router/firewall device. It embeds the iptables firewall but this is disabled by default. It can be enabled via the LibreELEC settings add-on, and we provide simple Home/Public options for inexperienced users to enable for essential protection. The "Home" option allows traffic from 192.168.x.x, 172.16.x.x, 10.x.x.x IP ranges (RFC1918) while the "Public" option blocks all traffic from all networks. The firewall automatically enables when custom iptables configuration is provided by the /storage/.config/iptables file.
Samba is enabled by default to facilitate end-user access to the \Logfiles share when installation completes but the system does not boot to the Kodi home screen. Accessing the\Logfilesshare auto-generates a zip archive containing logs and config info that can be downloaded and shared with project staff and end-users providing support assistance in the forum.
On successful boot the first-run wizard is shown and users can disable Samba. After the wizard has completed Samba services can be enabled/disabled or reconfigured via the LibreELEC settings add-on. Here you can enable authentication and change the default credential used to access the Samba server. You can also downgrade SMB protocol support to min/max SMBv1 to support legacy devices that cannot connect to an SMBv2/v3 capable server.
SSH services are disabled by default but can be enabled on successful boot in the first-run wizard. If you enable services you are prompted to change the default root/libreeleccredential. After the wizard has completed SSH services can be enabled/disabled or reconfigured via the LibreELEC settings add-on. Here you can reset the root password. The password can also be changed from the local console or SSH console using the standard Linux passwdtool.
For better security and convenience, add a public key to /storage/.ssh/authorized_keys and then disable password authentication in the LibreELEC settings add-on. You can replace the default 2048-bit RSA keys generated on first-boot and stored in the /storage/.ssh directory. New SSH keys must be secured with 600 permissions else the SSH daemon will not start.
Connecting to any commercial or private VPN server that provides a public IP address to the VPN tunnel network interface requires the server to block inbound connections or the to be enabled with either Home or Public profiles. Services like Samba and SSH listen on all available interfaces so the VPN connection exposes services to the public internet.
The WSDD2 service broadcasts information on Samba share to Windows OS devices to support auto-discovery in Explorer. It is started and stopped alongside the Samba service.
LibreComputer LaFrite (AML-S805X-AC) is an S805X (GXL) board with 512MB or 1GB of RAM and 16MB SPI boot flash. The board runs upstream U-Boot from SPI, and has no SD card slot, so you can boot the AMLGX box or lafrite images written to a USB stick or eMMC module. Default boot order is:
SPI (built-in)
EMMC (optional module)
USB (socket furthest from the GPIO header)
LibreComputer preinstalls their eMMC modules with Android, so if you power on the board with the module attached it will always boot into Android. To erase Android or overwrite with LibreELEC the board must first boot from USB without the module attached. Once in LibreELEC booted from USB, the module can be attached, detected, and erased or imaged with the lafrite image:
Power on the Board, and boot the AMLGX box image from USB
Attach the eMMC module, and from the SSH console:
Run emmctool d to detect the module
LibreComputer provides files for updating the SPI flash. LibreELEC does not need a minimum version to boot, but newer U-Boot firmware fixes some graphical on-screen glitches seen in the early boot stages. To update:
Download the latest aml-s805x-ac-spiflash.img and flash it to a USB stick
Connect the USB drive to the socket furthest from the GPIO header
Power on the board
Current U-Boot checks if the new image matches existing firmware, and when it does not (as it is newer) the firmware will be updated. When complete:
The debugging UART is accessible on the 40pin GPIO header:
TX (Green) on Pin 3
RX (Grey) on Pin 5
GND (Black) on Pin 6
The following table summarises LibreELEC support for HEVC media on different Raspberry Pi hardware generations:
Raspberry Pi 0/1
Raspberry Pi 4, 400, and 5 are the ONLY devices with native hardware decoding of HEVC content, and in LE10 and newer releases (LE11 for RPi5) we support 8/10/12-bit output for great results with 4K HDR material. Note that the original LE 9.2.9 release for RPi4/400 devices only supports 8-bit output for basic playback.
Older Raspberry Pi devices support only software decoded HEVC. In practice Raspberry Pi 3 devices running LE 9.2.x with mild overclocking can play lower-bitrate 1080p content without issues, but if media has higher bitrates and larger filesizes you should expect poor results. Raspberry Pi 2/1/0 models can normally manage 720p media but will struggle with 1080p.
LibreELEC 9.2.x runs best on older Raspberry Pi hardware because the video pipeline in Kodi v18 supports vendor proprietary hardware decoding methods (MMAL and OMXplayer) and custom optimisations for software-based HEVC decoding on Pi hardware. The optimisations for HEVC are very clever, but also require a large and invasive patch (more than 50,000 lines of additional code for FFMpeg). The complexity and Raspberry Pi specific nature of the optimisations has prevented them from being accepted upstream into FFMpeg, and few Linux distributions have allowed such a large patch into their codebase.
Kodi v19 (LibreELEC 10.x) also removed support for vendor proprietary hardware decoding methods (on Raspberry Pi, the MMAL and OMX decoders) to focus on a standards-based approach (V4L2, named for the Linux kernel 'Video for Linux v2' API used). LibreELEC 10.x also dropped support for Raspberry Pi Zero and other 512MB RAM devices as 1GB is now considered as the minimum RAM needed for a good Kodi experience. The Raspberry Pi Foundation have rewritten their video drivers and FFMpeg support to follow the common V4L2 frameworks. As their goal is to upstream all driver and player-app changes, allowing them to be included and used with all Linux distros, the rewrites do not include the custom HEVC optimisations that would never be accepted. This means HEVC support on Raspberry Pi 4, 400, and 5 hardware is excellent as these devices support native HEVC hardware decoding, and the newer drivers support 8/10/12-bit output for better 4K HDR, but playback on older Pi 0/1/2/3 devices will be challenging as FFMpeg software decoding is no longer as-optimised for Pi hardware, and users can expect SD media support only, not HD (720p and 1080p) support as seen with older LibreELEC releases.
In summary:
If you need HEVC support on older Raspberry Pi 0/1/2/3 hardware use LibreELEC 9.2.x and do not update to LibreELEC 10.x or newer releases.
If you have Raspberry Pi 4 or 400 hardware, use LibreELEC 10.x or newer to benefit from better HEVC and 4K HDR support. Raspberry Pi 5 devices require LE11.x or newer.
LibreELEC images for all Raspberry Pi boards ship pre-configured for HDMI output. Two simple changes are required to switch the image into Composite mode:
First, edit config.txt in the root folder of the SD card to comment out include distroconfig.txt and uncomment include distroconfig-composite.txt , e.g. the comments should look like this:
Second, edit cmdline.txt in the root folder of the SD card to configure PAL or NTSC output. This is done by appending a video=Composite-1 option to the line of boot params in the file. Append to the existing single line; do not add them on a new/separate line. The two options are:
video=Composite-1:720x576@50ie for PAL output
video=Composite-1:720x480@60ie for NTSC output
Boot after saving the changes and HDMI will be disabled and Composite enabled. You may also need to adjust audio output preferences in Kodi as the pre-configured default is for HDMI.
how to edit the website
sudo apt install ruby-full make gcc gpp build-essential zlib1g zlib1g-dev ruby-dev dh-autoreconf
sudo gem update
sudo gem install bundler
git clone https://github.com/LibreELEC/website.git
cd /path/to/git/website/
bundle install
Run the command from the cloned website folder.
bundle exec jekyll serve --livereload --unpublished --incremental
It is possible to run Ruby natively in Windows but this is difficult to do. So in our example we just run it at WSL and bypass all those problems.
Run the command from the cloned website folder.
bundle exec jekyll serve --force_polling --livereload --unpublished
After starting the server the website is autogenerated at every change excluding changes at _config.yml and packages.json that requires a restart of the server.
The website is now located at .
LibreELEC configures a set of default Samba (SMB) shares, which you can use to copy content to and from your system.
The default shares are listed in the /storage/.config/samba.conf.sample file, and if you want to modify the default shares, you can do that too!
On a Mac, while you're in Finder, select Go > Connect to Server..., the click 'Browse' and find the LIBREELEC server (the name of the server corresponds to the name you set in Kodi's settings). Alternatively, don't click 'Browse', just type in smb://LIBREELEC/ and press Enter.
On Windows, in Explorer, type in \\LIBREELEC and press Enter, and you should see a list of all the shares.
If you are prompted for a password, you should be able to log in as a 'Guest' instead, and have full access to the files on any of the shares.
Copy files into the shares as needed, and in Kodi's UI, you can that include the media you've copied across.
You can either create a fresh Samba config file, or copy the sample file and modify it to your liking:
After modifying the shares, restart Samba:
...or just reboot, and the new settings should take effect after a restart.
The sample configuration file is recreated on every reboot, so you should not modify that file. Because that file changes over time, you can also create your own samba.conf file, and .
On Raspberry Pi hardware, the config.txt file is used to configure boot and hardware configuration, similar to how the BIOS or UEFI are used on an PC.
There are two options for editing config.txt: over the network using SSH or removing the storage medium (SD card, USB drive) and editing the file directly on your computer.
The embedded Samba server in LibreELEC is enabled by default and provides CIFS/SMB shares that can be accessed from all modern OS to or collect for support or access the /storage/.config folder to make basic system changes. Samba starts with configuration from /storage/.config/samba.conf if it exists, else it starts with a default configuration from /etc/samba/smb.conf which is inside the read-only filesystem.
Samba services can be disabled from the LibreELEC settings addon.
Samba server configuration files do not configure the SMB client
Starting with LE10 Hyperion no longer works due to changes in the video pipeline. Consider hardware/external grabbers.
HyperCon is a graphical application which allows you to configure (an ambient lighting system) running on a remote LibreELEC device, from a Windows, macOS or Linux desktop. Hypercon is a Java application, and so requires you to have a working Java runtime environment (JRE) installed to run it. Java v1.7 or higher is required.
The latest version is here
In 2015 the OpenELEC project team had a falling out with project founder @sraue over change management practices and maintenance of project infrastructure. Despite many months of talking and trying to resolve our differences, it became clear the founders vision for his hobby did not match everyone else's vision of being a project, and in March 2016 the codebase was forked and the "LibreELEC" project was born. The meaning of "Libre" in our name is "freedom" (to run the project as we like) not the Libre-software meaning, although the core project team are strong advocates for open-source code and we strive to manage the project along open-source principles.
Since we are ourselves a fork, the project team have always encouraged others to fork and (re)use our codebase as this helps to shake out issues in our build-system, and over time increases the number of people who contribute changes to it.
The following are known forks of our codebase:
19 MOSI -> Data
23 SCLK -> Clock
25 GND -> Groundmount -o remount,rw /flash
nano /flash/config.txtdtparam=spi=onemmctool z to erase (zero) the moduleCopy the lafrite image to /storage/ on the USB stick
Run emmctool w /storage/LibreELEC-AMLGX.arm-11.0.0-lafrite.img.gz to write the lafrite image to the eMMC module.
Power off the board, remove the USB stick
Power on the board, and LibreELEC will boot to eMMC and resize /storage
Power off the board and remove the USB stick
PROJECT=Generic ARCH=x86_64 make image
Raspberry Pi 0/1
PROJECT=RPi ARCH=arm DEVICE=RPi make image
Raspberry Pi 2/3
PROJECT=RPi ARCH=arm DEVICE=RPi2 make image
Raspberry Pi 4
PROJECT=RPi ARCH=arm DEVICE=RPi4 make image
Rockchip MiQi
PROJECT=Rockchip ARCH=arm DEVICE=MiQi make image
Rockchip RK3328
PROJECT=Rockchip ARCH=arm DEVICE=RK3328 make image
Rockchip RK3399
PROJECT=Rockchip ARCH=arm DEVICE=RK3399 make image
Rockchip Tinkerboard/S
PROJECT=Rockchip ARCH=arm DEVICE=Tinkerboard make image
Not supported
Not supported
Raspberry Pi 2/3
Up to 1080p in Software
Up to SD in Software
Raspberry Pi 4 / 400
Up to 4K, basic HDR (8-bit)
Up to 4K, 8/10/12-bit HDR
Raspberry Pi 5
Not supported
Up to 4K, 8/10/12-bit HDR
cp /storage/.config/samba.conf.sample /storage/.config/samba.confconfig.txt is usually on the /boot partition in Raspberry Pi OS. In LibreELEC, the /flash boot partition is read-only by default, so we need to remount it in read-write mode:
We will use the nano text editor to modify the file. Save changes with ctrl+o and exit using ctrl+x:
After editing, set the /flash partition back to read-only mode:
Finally, reboot for the changes in config.txt to be applied:
Turn off the Raspberry Pi, remove the SD card or USB drive on which LibreELEC is installed, and use a card reader connected to your Windows, Linux, or macOS computer.
If using Windows, use a text editor capable of saving text files in Unix format, e.g. Notepad++ or Wordpad.exe (not Notepad.exe).
Raspberry Pi 0/1/2 cannot hardware-decode MPEG2/VC-1 media files without a license key that can be purchased from the Raspberry Pi Foundation. The hardware is too slow to software decode these formats without the keys.
Raspberry Pi 3 hardware has higher spec CPUs and is capable of software-decoding without the licenses, although purchasing them allows hardware-decoding and your device will run cooler.
Raspberry Pi 4 is capable of software decoding these formats and license keys are not available.
To purchase license keys you need the serial number of your Raspberry Pi. This can be read with the following command:
Edit config.txt as described above, uncommenting the license key lines by removing the # marks, and replacing 00000000 with the keys you received after purchasing:
Reboot and confirm the license keys are installed correctly by running these commands:
If the licenses are enabled you should see this:
If any key that you purchased shows disabled check that:
You entered the correct serial number
You added the licence key to config.txt correctly
You uncommented the lines in config.txt by removing the \# mark (and space)
You rebooted before testing
Raspberry Pi kernels use a board-specific device-tree file to describe the board's hardware and how things are connected. As the Raspberry Pi is designed to be extended with extra hardware via HATs and peripheral connectors the kernel also supports device-tree "overlay" files. When configured, these overlay "fragments" of device-tree content that describe the extra hardware on the board device-tree, and the kernel reads them as a single combined file.
Overlays can be found in /flash/overlays and they are configured in config.txt in the root folder of the SD card that you boot the Raspberry Pi from. The following are examples of common overlay changes.
On RPi 5, using Libreelec 12 and upwards, different audio interfaces are needed:
With kernels older than 6.1.77 on RPi 5, "slave" mode must be forced:
Override defaults for the gpio-ir module:
Please see the Raspberry Pi documentation for more details on overclocking.
This breaks the build and leads to unpredictable problems.
To disable that behaviour you need to create a file at your Ubuntu WSL /etc/wsl.conf and add these options to disable. Afterwards you need to reboot WSL or your system.
To interoperate with your Windows Desktop you want the git tree accessible from Windows. So you clone the Git Tree to a location at windows and try to use it at WSL.
For this example the Git Tree is cloned at D:\WSL\LE - /mnt/d/WSL/LE.
If you start building the build folder would be located at D:\WSL\LE\build.YOURPROJECT .
To change the path for the build files you need to add some options to the LibreELEC options file /home/YOURUSER/.libreelec/options .
After adding this line to the options file every build is now located at this folder.
The /home folder is located at the WSL ext4.vhdx and not at the native NTFS storage.
There are several ways in moving your WSL file, the easiest solution is the dedicated tool LxRunOffline . The version 3.5.0 is not supporting the current Windows Version so you need to use a more recent version or a development build.
lxrunoffline move -n Ubuntu-22.04 -d d:\wsl
AlpineWSL
Or you can use https://github.com/yuk7/AlpineWSL which creates ext4.vhdx on your wanted disk and automatically mounts it to WSL2 itself on startup. Advanced instructions: https://gist.github.com/onomatopellan/90024008a0d8c8a2ed6fa57e8b64df54
The OS automatically creates Samba shares for removable media devices like external USB drives that are connected at boot time. Share names are based on the disk label, e.g. /var/media/MyBook will result in the \\LIBREELEC\MYBOOK share being auto-created. If your disk does not have a label and has mounted using a hardware identifier, e.g. /var/media/sda1-ata-KINGSTON_SNV2S20 the best and correct way to change the share name is setting a label:
This will result in the auto-created SMB share \\LIBREELEC\KINGSTON which will be persistent.
Users often workaround unlabeled disks and resulting weird share names by creating custom shares. This works if you have one disk. If you have more than one disk boot time probe order is not guaranteed so /var/media/sda1-blah can change to /var/media/sdb1-blah breaking the shares. Using e2labelis the better solution.
Rename /storage/.config/samba.conf.sample to /storage/.config/samba.conf then edit samba.conf to make changes to the [global]section or add/remove shares, then reboot to restart the OS with the new Samba configuration. The format is simple to crib from the sample file, e.g. to add a new [Addons] share, append this to the conf:
To remove a share from the default list, comment it out, e.g. to remove [Emulators] change the conf file to look like this, then restart:
Samba can serve SMB shares compatible with Apple's Time Machine backup snapshot functionality in macOS. Time Machine capabilities are not enabled by default and require a custom samba.conf (as explained above) with the following options appended to the [global]section:
Note that fruit:model = Xserve is already defined in the default configuration. Some users prefer the appearance of the fruit:model = MacSamba icon for their shares.
Next add/append a TimeMachine share to the configuration file:
Time Machine provides a roll-up strategy for snapshots to reduce disk consumption, but you can force a specific space quota/restriction by uncommenting fruit:time machine max size and setting the size value. In the example above max size has been set to 250GB.
On Ubuntu/Debian systems
On Fedora/CentOS systems
To run Hypercon:
Download and install the correct 32-bit or 64-bit Java Runtime for your Windows OS version from the official Java download site https://www.java.com/. Open the .jar file as you would a regular .exe file and it should launch using Java (JRE). If not, right click and select “Open with” then “Java” listed in the list.
sudo apt-get install openjdk-7-jre
wget http://releases.libreelec.tv/hypercon-LE.jarPROJECT=Allwinner ARCH=arm DEVICE=A20 make image
Allwinner A64
PROJECT=Allwinner ARCH=arm DEVICE=A64 make image
Allwinner H3
PROJECT=Allwinner ARCH=arm DEVICE=H3 make image
Allwinner H5
PROJECT=Allwinner ARCH=arm DEVICE=H5 make image
Allwinner H6
PROJECT=Allwinner ARCH=arm DEVICE=H6 make image
The Virtual project was combined into the Generic image. Running make image will output an OVA file in addition to the normal .img.gz and .tar files.
Amlogic, Raspberry Pi, and Rockchip build projects require a DEVICE=<name> to be specified. For example, to build an Amlogic image for a LibreComputer LePotato board:
Official releases were built using Ubuntu 16.04 and 18.04 LTS.
Generic (x86_64)
PROJECT=Generic ARCH=x86_64 make image
Raspberry Pi 0/1
PROJECT=RPi ARCH=arm DEVICE=RPi make image
Raspberry Pi 2/3
PROJECT=RPi ARCH=arm DEVICE=RPi2 make image
Raspberry Pi 4
PROJECT=RPi ARCH=arm DEVICE=RPi4 make image
Allwinner A20
PROJECT=Amlogic ARCH=arm DEVICE=AMLGX UBOOT_SYSTEM=lepotato make image#include distroconfig.txt
include distroconfig-composite.txtsystemctl restart smbdmount -o remount,rw /flashnano /flash/config.txtmount -o remount,ro /flashrebootcat /proc/cpuinfodecode_MPG2=0x00000000
decode_WVC1=0x00000000vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1MPG2=enabled
WVC1=enableddtoverlay=hifiberry-dac
dtoverlay=hifiberry-dacplus
dtoverlay=hifiberry-digi
dtoverlay=hifiberry-amp
dtoverlay=iqaudio-dac
dtoverlay=iqaudio-dacplusdtoverlay=hifiberry-dacplus
dtoverlay=hifiberry-dacplus-std
dtoverlay=hifiberry-dacplus-prodtoverlay=hifiberry-dacplus,slavedtoverlay=gpio-irdtoverlay=gpio-ir,gpio_pin=25,gpio_pull=up,rc-map-name=rc-technisat-usb2dtparam=i2c1=on # for later RPi's
dtparam=i2c0=on # for early RPi's
dtparam=spi=onwsl@PC:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/snap/bin [interop]
enabled=false # enable launch of Windows binaries
appendWindowsPath=false # append Windows path to $PATH variableBUILD_DIR=/home/YOURUSER/LEbuild# e2label /dev/sda1 "KINGSTON"[Addons]
path = /storage/.kodi/addons
available = yes
browseable = yes
public = yes
writeable = yes public = yes
writeable = yes
#[Emulators]
# path = /storage/emulators
# available = yes
# browseable = yes
# public = yes
# writeable = yes
[Configfiles]
path = /storage/.config
available = yes# samba TimeMachine support
min protocol = SMB2
ea support = yes
vfs objects = catia fruit streams_xattr
delete veto files = true
fruit:metadata = stream
fruit:veto_appledouble = no
fruit:nfs_aces = no
fruit:posix_rename = yes
fruit:zero_file_id = yes
fruit:wipe_intentionally_left_blank_rfork = yes
fruit:delete_empty_adfiles = yes[TimeMachine]
path = /storage/timemachine/
fruit:time machine = yes
# fruit:time machine max size = 250GB
read only = no
guest ok = yesyum install java-1.7.0-openjdk*.
wget http://releases.libreelec.tv/hypercon-LE.jarjava -jar ./hypercon-LE.jarPROJECT=Amlogic ARCH=arm DEVICE=LePotato make imageRetro Gaming
RetroELEC
n/a
Retro Gaming
CoreELEC
Kodi
Lakka (Libretro)


This script uses the kodi-send tool to prevent Kodi from shutting down if there are active SSH, SAMBA, or NFS connections. The script checks every 60 seconds, and if at least one connection exists the command InhibitIdleShutdown(true) is sent to Kodi.
Create /storage/.config/prevent_idle.sh with the following content:
#!/bin/sh
IDLE_SHUTDOWN_ALLOWED_LAST_STATE=-1
while true
do
KODI_RUNNING=`ps -A | grep kodi.bin | grep -v grep | wc -l`
if [ 1 == $KODI_RUNNING ] ; then
SSH_ACTIVE=`netstat -tnpa | grep 'tcp.*:22.*ESTABLISHED.*' | wc -l`
NFS_ACTIVE=`netstat -tnpa | grep 'tcp.*:111.*ESTABLISHED.*' | wc -l`
SMB_ACTIVE=`netstat -tnpa | grep 'tcp.*:445.*ESTABLISHED.*' | wc -l`
[ $SSH_ACTIVE -gt 0 -o $NFS_ACTIVE -gt 0 -o $SMB_ACTIVE -gt 0 ] && IDLE_SHUTDOWN_ALLOWED=1 || IDLE_SHUTDOWN_ALLOWED=0
if [ $IDLE_SHUTDOWN_ALLOWED_LAST_STATE != $IDLE_SHUTDOWN_ALLOWED ] ; then
IDLE_SHUTDOWN_ALLOWED_LAST_STATE=$IDLE_SHUTDOWN_ALLOWED
kodi-send --action="AllowIdleShutdown"
if [ 0 == $IDLE_SHUTDOWN_ALLOWED ] ; then
kodi-send --action="InhibitIdleShutdown(false)"
else
kodi-send --action="InhibitIdleShutdown(true)"
fi
fi
fi
sleep 60
doneCall the script from /storage/.config/autostart.sh so it runs as a background task. It will continue to monitor the state of connections until the device is halted.
This script identifies your public IP address and updates a Dynamic DNS record.
Create /storage/.config/dynu_update.sh with the following content:
Call the script from /storage/.config/autostart.sh so it runs as a background task. It will continue to monitor the state of connections until the device is halted.
Note: If you set the refresh rate under 60 seconds the checkip.dyndns.org server will probably block your requests causing the script to fail.
Allwinner A64
PROJECT=Allwinner ARCH=arm DEVICE=A64 make image
Allwinner H3
PROJECT=Allwinner ARCH=arm DEVICE=H3 make image
Allwinner H5
PROJECT=Allwinner ARCH=arm DEVICE=H5 make image
Allwinner H6
PROJECT=Allwinner ARCH=arm DEVICE=H6 make image
To improve Jenkins/CI automation with ARM SoC $PROJECT(s) that support multiple $DEVICE types make image will iterate through all board/u-boot configurations defined in scripts/uboot_helper resulting in ~3-10 images in the target folder. To avoid this behaviour and build a single board-specific image UBOOT_SYSTEM=<board> can be appended to the build command, e.g. to build an Amlogic image for a LibreComputer LePotato board:
Several ARM SoC devices have a UBOOT_SYSTEM=box configuration which excludes u-boot and provides all device-trees, allowing the image to boot using the Android/BSP u-boot on emmc/spi.
Official releases were built using Ubuntu 18.04 and 20.04 LTS.
This page explains the configuration points:
Desktop Resolution
Modeline Whitelist
Adjust Refresh
LibreELEC images for Amlogic with modern Linux kernels use boot processes and device-tree files that are not compatible with older LibreELEC images (LE 9.x and earlier) that use Amlogic Linux 3.14 or 4.9 kernels. The change to boot processes means you cannot update from older releases and must make a new/clean installation.
There are two images supporting Amlogic Gen10+ (64-bit) SoCs and older Gen8 (32-bit) SoCs used in a range of Linux SBC and Android STB devices:
AMLGX supports the following 64-bit SoCs:
GXBB (S905)
Since Kodi v17 LCD/VFD displays are supported through the LCDProc add-on which must be installed from the Kodi add-on repo. See for documentation and for a sample file, and the .
The /storage/.kodi/userdata/LCD.xml file can be created to customise output to an LCD or VFD display. It contains "content" sections that describe how the display will look:
This is a human-readable summary of (and not a substitute for) the
You are free to:
Share — copy and redistribute the material in any medium or format
Adapt — remix, transform, and build upon the material
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
Deinterlacing
4K60 Support
HDR Questions
The primary impact of the Kodi desktop resolution is GUI performance, or how Kodi feels when you navigate around menus and libraries. Kodi leverages GPU hardware to accelerate rendering of GUI elements, but fanart and thumbnails are frequently adapted from original artwork on-the-fly as you scroll around, and even when all images have been pre-processed, they must still be read from disk caches before being displayed. Higher levels of CPU and I/O activity from larger artwork and media also mean higher power consumption from the HTPC device.
The second impact of the Kodi desktop resolution is how media is scaled. If "Adjust Refresh" is not enabled, Kodi will scale all media played up or down to the desktop resolution and refresh rate, which by default is 1080p @ 60 fps. Scaling SD and 720p media up to 1080p while adding extra frames to match 60fps is handled well, as Kodi simply needs to duplicate frames to reach the higher fps rate, and the simple scaling algorithms Kodi uses to reduce artefacts in the upscaled image move smaller amounts of data in/out of memory. Hardware as low-spec as the first generation Raspberry Pi can normally manage this well.
Scaling SD and 1080p media to 4K is a literally bigger challenge. Frame sizes for 4K media are 4x the size of 1080p so the amount of data being processed in/out of memory increases and the CPU resources needed also increase. Scaling 4K to 1080p is a larger challenge again. Source 4K media has huge frame sizes and sophisticated (down)scaling algorithms are required to create a lossy image without massive visual artefacts.
Higher-spec Intel CPU devices with recent Core i7 chips and SSD storage can normally run the Kodi GUI at 4K with 60fps refresh rates and scale media with reasonable quality, but older and lower-spec Intel CPU devices and anything running from a spinning HDD or removable USB/SD media will struggle with a 4K desktop. This also includes ARM SoC devices. They might be capable of displaying the Kodi desktop in 4K but the experience is poor since they don't have the memory bandwidth or CPU speeds to process the data volumes needed.
However, all 4K resolution TV's have dedicated scaling hardware with sophisticated algorithms to upscale 1080p images to the native 4K resolution of the screen. TVs do this better and much more efficiently than Kodi can scale images itself.
Recommendation: Keep the Desktop resolution at 1080p, with 60fps refresh rate. Allow Kodi to upscale SD media to HD, and let the TV handle 1080p upscaling to 4K
Most 4K televisions support a broad range of resolutions and refresh rates to support different media standards. In Linux each output format is known as a "modeline" and Kodi allows you to configure a list of allowed modes to use in combination with the "Adjust Refresh" option.
Some hardware supports 4096x2160 modes. Kodi evaluates the whitelist using the height (2160) and refresh rate, so if you include these in your whitelist selection Kodi will switch to them instead of 3840x2160 modes which are an exact or more accurate match with 4K streaming media. If you see black bars on the sides of 4K media while playing, remove 4096 modes from the whitelist.
Recommendation: Configure Kodi to allow the following modes, if available:
3840x2160 @ 60/59.94/50/30/29.97/25/24/23.976
1920x1080 @ 60/59.94/50/24/23.976
Kodi can either upscale media to match the desktop resolution and refresh rate, or switch to a resolution and rate that exactly or better matches the media. Switching to match the rate can eliminate or minimise the need for Kodi to make corrections (to keep things in-sync) by adding or dropping frames. Adding frames to the stream is generally harmless and rarely causes noticeable artefacts, but dropping frames causes skips, glitches and audio pops.
Kodi has three "Adjust Refresh" settings:
Off (scale media to the desktop resolution/rate)
On start/stop (change resolution/rate when playback starts and stops)
Always (change on start/stop and during playback if the media changes resolution/rate)
Recommendation: Set the Adjust Refresh setting to "On Start/Stop"
4K media is progressive so this is not a requirement for 4K or HDR playback, but many Kodi users have DVB setups where interlaced streams are common so we need to set the mode whitelist to support them. The challenge with interlaced media is:
Kodi cannot output interlaced frames, it always outputs progressive frames
Kodi cannot detect media is interlaced until you start playing it
Kodi converts interlaced media for progressive output by doubling the original refresh rate and rendering each half-frame in its own full frame, e.g. PAL 1080i @ 25fps media becomes 1080p @ 50fps, and NTSC 1080i @ 29.97 becomes 1080p @ 59.94fps. For this rate doubling to work, we need to ensure the whitelisted 1080p modes do not contain 1080p @ 25/29.97/30Hz rates, else Kodi will see an exact match against resolution and refresh rate and you will see high CPU loads and 50% of frames being dropped. If the modes are removed, Kodi will use 50Hz/59.94Hz rates, and if the media is interlaced, Kodi can still render 100% of the frames.
Recommendation: Remove 1080 @ 30, 29.97 and 25 fps rates from the Modelist
Successful 4K output at 60Hz depends on HDMI output capabilities from the HTPC device, certified cables that can provide the higher bandwidth required for higher bit-depth video and higher bit-rate audio, HDMI input ports on the TV or AVR that match the outputs from the HTPC, and media that aligns to the hardware capabilities. Common problems that we see include:
Some TV's and AVR's support different HDMI capabilities on different ports. Some support 4K60 4:2:2 (12-bit) input on specific ports, while other ports support 4K60 4:2:0 (8/10-bit) input.
Some TV's and AVR's require 4K60 4:2:2 capabilities to be enabled in TV settings else the port defaults to 4K60 4:2:0 input. There is no standardised naming among vendors so we have seen "Deep Colour" and "Enhanced HDMI" used to describe 4K60 4:2:2 support.
Raspberry Pi 4/5 boards notably do not support 4K60 4:2:0 output. If the TV or connected port only supports 4K60 4:2:0 input the 4K60 modes will (correctly) not be available.
Raspberry Pi 4 boards need configuration in /flash/config.txt to enable 4K @ 60/59.94/50 mode output. This is not enabled by default because it increases power consumption, and as most media uses 4K@30/23.976 most users do not need to enable 4K60 modes.
Raspberry Pi 5 devices support 4K60 output by default and do not require /flash/config.txt configuration. This is one reason why Raspberry Pi 5 boards require a higher rated PSU. If you do not need 4K60 output most 5V/3A PSU's used with RPi4 work fine with an RPi5 too.
4K @ 60/59.94/50 modes require an HDMI 2.0 cable that supports the much higher bandwidth needed. Suitable cables are normally sold as 4K@60 "certified" cables. Cheaper and lower-spec cables that support HDMI 1.4 modes (up to 4K@30) are a frequent cause of "I've enabled 4K@60 but have a blank screen" issue reports in the forums.
If you are unable to use 4K60 modes: please check cables, check port capabilities, and if using SBC boards; check the PSU can handle the needed current draw before reporting issues in the forums!
Broadcast and Internet media follow a multitude of formal standards for resolution, refresh-rate, bit-depth, video format and colour-space. HDR formats add static or dynamic metadata to the stream or even individual video frames to enhance how colours are displayed. Kodi on Linux can support static HDR formats like HLG and HDR10, but not dynamic (proprietary) formats like HDR10+ and Dolby Vision which do not have open-source implementations. Users should understand HDR is not a simple "My TV can do 4K" type standard. HDR is a collection of competing technical standards (format wars are in progress) and the number of variables that must be determined and processed to render something nice looking on screen is huge.
Kodi aims to hide the mind-bending complexity of choosing how HDR media will be displayed on screen by detecting what your HTPC device and TV support and what the media to be played requires, allowing the display pipeline to automatically configure itself for the best result; whether that is an exact match or the best compromise. Kodi and LibreELEC support for HDR formats is still in early stages.
Recommendation: There is nothing specific to configure for HDR itself (only 4K things) so sit back and enjoy that Kodi and LibreELEC developers are working to bring HDR support to your living room, for free. Please be patient, because it's a long and complicated task!
Here are some answers to common HDR questions:
Kodi does not support HDR to SDR conversion (tonemapping) on Linux. If you play HDR media on a TV that does not support HDR, it will often play but colours will be muted and washed out. In the future Kodi may support conversion, but it is not currently implemented.
Kodi has no way to present OSD menus in SDR when playing HDR media, so menus will have bright saturated colours. In the future, plane based tonemapping may be able to correct this, but it is not currently implemented and not all hardware supports multiple planes.
Kodi will attempt to output in the highest bit-depth supported by the display pipeline, e.g. on a Raspberry Pi 4 it will attempt 12-bit before falling back to 10-bit, then 8-bit. Not all 4K HDR capable hardware supports higher 12-bit and 10-bit depths.
Kodi supports Dolby Vision under Android (if the device is licensed for it) but not Linux. Dolby requires manufacturers to license their Intellectual Property and use integration libraries to decode the HDR metadata. Until FFMpeg comes up with a "clean room" reverse engineered open-source implementation, Kodi will not support it.
Raspberry Pi 2/3
PROJECT=RPi2 ARCH=arm make image
VMware (not Virtualbox)
PROJECT=Virtual ARCH=x86_64 make image
WeTek Play, WeTek OpenELEC
PROJECT=WeTek_Play ARCH=arm make image
WeTek Play 2
PROJECT=WeTek_Play_2 ARCH=aarch64 make image
WeTek Core
PROJECT=WeTek_Core ARCH=arm make image
WeTek Hub
PROJECT=WeTek_Hub ARCH=aarch64 make image
NonCommercial — You may not use the material for commercial purposes.
ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.



(
/usr/bin/bash /storage/.config/prevent_idle.sh
)&(
/usr/bin/bash /storage/.config/dynu_update.sh
)&Amlogic GXBB/GXL/GXM/G12/SM1
PROJECT=Amlogic ARCH=arm DEVICE=AMLGX make image
Generic Intel/AMD x86_64
PROJECT=Generic ARCH=x86_64 make image
NXP/Freescale iMX.6
PROJECT=NXP ARCH=arm DEVICE=iMX6 make image
NXP/Freescale iMX.8
PROJECT=NXP ARCH=arm DEVICE=iMX8 make image
Qualcomm DragonBoard
PROJECT=Qualcomm ARCH=arm DEVICE=Dragonboard make image
Raspberry Pi 2/3
PROJECT=RPi ARCH=arm DEVICE=RPi2 make image
Raspberry Pi 4
PROJECT=RPi ARCH=arm DEVICE=RPi4 make image
Samsung Exynos
PROJECT=Samsung ARCH=arm DEVICE=Exynos make image
Rockchip RK3328
PROJECT=Rockchip ARCH=arm DEVICE=RK3328 make image
Rockchip RK3288
PROJECT=Rockchip ARCH=arm DEVICE=RK3288 make image
Rockchip RK3399
PROJECT=Rockchip ARCH=arm DEVICE=RK3399 make image
GXM (S912)
G12A (S905X2/D2/Y2)
G12B (S922X/A311D)
SM1 (S905X3/D3)
AMLMX supports the following 32-bit SoCs:
Meson 8 (S805)
Meson 8b (S802)
Meson 8m2 (S812)
WeTek Play(1) aka WeTek OpenELEC uses Meson 6 (8726MX) hardware. There is little support for Meson 6 hardware in the upstream kernel and low probability of support evolving to the point where modern-kernel LibreELEC images are viable. Support ends with LibreELEC 9.0.
AMLGX and AMLMX provide a "box" image for use with devices that run Amlogic (aka Vendor or Legacy) boot firmware (U-Boot 2015.01 with Amlogic and manufacturer customisations) and "board" images using modern boot firmware (mainline U-Boot) specific to a single SBC board or STB device. The image type can be identified by the filename -suffix:
LibreELEC-AMLGX.arm-11.0.0-box.img.gz is the AMLGX "box" image
LibreELEC-AMLGX.arm-11.0.0-khadas-vim3.img.gz is a "board" image for VIM3
LibreELEC-AMLMX.arm-11.0.0-box.img.gz is a "box" image for Meson 8 devices
Box images support SBC and STB devices with Android or "vendor" boot firmware running on the internal eMMC storage. LibreELEC is installed by triggering "recovery" mode boot in the Amlogic U-Boot firmware. Recovery mode searches for some standard files on SD and USB media. LibreELEC provides files tweaked to boot and run LibreELEC instead of recovering the device. Once recovery mode is activated the device will search and find LibreELEC on each boot; until Android recovery completes (which never happens).
As box images can be used on many devices you must configure the device-tree file to use first. This is done by editing uEnv.ini in the root folder of the SD card. Change @@DTB_NAME@@ to the name of the .dtb file to use. Current supported device-tree files are in the dtb folder.
For example, here is the default uEnv.ini file:
To boot a Beelink GT-King box change @@DTB_NAME@@ to meson-g12b-gtking.dtb
Once the device-tree name is set you can insert the SD card in the box and power on. Some box devices detect the presence of the SD card automatically. Others may need recovery mode to be triggered using a reset button on the device. Common locations for the button are:
Visible button marked "reset" or "recovery" or "power" button
Visible pin-hole on the underside of the case
Hidden button visible through ventilation holes in the case
Hidden at the end of the 3.5mm audio jack
In most cases you will need a small pin, unfolded paper-clip, or toothpick to press the reset button with - hence the install process is often referred to as the "toothpick method" in forum posts. Press and hold the button, then power-on the box. After 5-7 seconds release the button to interrupt boot and start the recovery process. Due to differences in box speeds and vendor U-Boot the exact timing for button release varies and you will need to experiment to find the timing that works for your box. It is possible to see U-Boot output and remove the guesswork by attaching a UART serial cable to the board, although most set-top box devices will need connector pins soldering to the board as manufacturers omit them to save manufacturing costs.
These images are built for Single Board Computer (SBC) devices which boot modern U-Boot via an SD card or removable eMMC module. Installation is normally simple requiring you to write the image to the SD card or eMMC module and boot the device. If the board has eMMC storage soldered (not on a removable module) it may be necessary to boot from the "box" image first. Once booted to a box image on SD card (so eMMC is not in use) you can write the correct board image to eMMC (overwriting Android or other factory-installed images) using dd to write the image. You can use the emmctool command to help that process (see below).
If you are searching for an Android firmware image to recover/restore a set-top box please be advised that the project cannot help you. We have no interest in Android and Android images and do not have a secret stash of vendor firmware files. Please contact the original manufacturer of your box, or use their support forum, or (often best) search Android focussed community forums like 4pda.
The sole exceptions are the WeTek Hub and Play2 devices: we have the original Android firmware update files and raw 'dd' images of the internal storage of the boxes.
Community images using Amlogic Linux 3.14/4.9 kernels often include the installtointernal script to reconfigure the factory boot process and run LibreELEC from internal eMMC storage. We do not provide or support this script. There are two main reasons:
Amlogic uses a proprietary partitioning scheme that relocates partition data structures to non-standard locations. This is supported in Amlogic Linux kernels and Amlogic-modified versions of tools like parted, fdisk and fsck used to create and manage filesystems. It is not supported in modern upstream Linux kernels or modern versions of filesystem tools. This means the Linux kernel used in AMLGX images cannot read the offset partition data to mount (and repurpose) Android partitions as a persistent /storage area.
The script causes a high volume of support issues. When the script fails to modify the boot process or create partitions correctly the user ends up with a "bricked" box. Amlogic builds several factory-restore mechanisms into their software that mean it is always possible to recover the box, but this normally requires the user to find the correct Android image for the device and reflash it with a Windows OS tool that often has issues. Our forum staff are all volunteers who give time to the project for fun. Helping a never-ending stream of pissed-off inexperienced users recover bricked boxes is not fun, nor do we have a collection of Android images to use, so we actively discourage the existence and use of this script.
In short: It was technically possible (but heavily discouraged) to use installtointernal with older LibreELEC images. It is NOT POSSIBLE to use installtointernal with AMLGX and running the script will either fail, or fail and break boot. To run LibreELEC from eMMC storage please purchase a supported "board" device.
In the AMLGX image there is an eMMC helper script called emmctool that supports a range of useful functions for backup/write/erase (and more) for eMMC storage. See:
The emmctool helper supports a limited range of SBC boards with eMMC modules. On a generic Android device it will output the (i) info only.
Allwinner H5
PROJECT=Allwinner ARCH=aarch64 DEVICE=H5 make image
Allwinner H6
PROJECT=Allwinner ARCH=aarch64 DEVICE=H6 make image
Allwinner R40
PROJECT=Allwinner ARCH=arm DEVICE=R40 make image
Amlogic GXBB/GXL/GXM/G12/SM1
PROJECT=Amlogic ARCH=aarch64 DEVICE=AMLGX make image
Generic x86_64 GBM
PROJECT=Generic DEVICE=Generic ARCH=x86_64 make image
Generic x86_64 X11 (legacy)
PROJECT=Generic DEVICE=Generic-legacy ARCH=x86_64 make image
NXP/Freescale iMX.6
PROJECT=NXP ARCH=arm DEVICE=iMX6 make image
NXP/Freescale iMX.8
PROJECT=NXP ARCH=aarch64 DEVICE=iMX8 make image
Qualcomm DragonBoard
PROJECT=Qualcomm ARCH=aarch64 DEVICE=Dragonboard make image
Raspberry Pi 2/3
PROJECT=RPi ARCH=arm DEVICE=RPi2 make image
Raspberry Pi 4
PROJECT=RPi ARCH=aarch64 DEVICE=RPi4 make image
Raspberry Pi 5
PROJECT=RPi ARCH=aarch64 DEVICE=RPi5 make image
Samsung Exynos
PROJECT=Samsung ARCH=arm DEVICE=Exynos make image
Rockchip RK3328
PROJECT=Rockchip ARCH=arm DEVICE=RK3328 make image
Rockchip RK3288
PROJECT=Rockchip ARCH=arm DEVICE=RK3288 make image
Rockchip RK3399
PROJECT=Rockchip ARCH=arm DEVICE=RK3399 make image
To improve GHA/CI automation with ARM SoC $PROJECT(s) that support multiple $DEVICE types make image will iterate through all board/u-boot configurations defined in scripts/uboot_helper resulting in ~3-10 images in the target folder. To avoid this behaviour and build a single board-specific image UBOOT_SYSTEM=<board> can be appended to the build command, e.g. to build an Amlogic image for a LibreComputer LePotato board:
Several ARM SoC devices have a UBOOT_SYSTEM=box configuration which excludes u-boot and provides all device-trees, allowing the image to boot using the Android/BSP u-boot on emmc/spi.
Official releases were built using Ubuntu 22.04 LTS.
Allwinner A64
PROJECT=Allwinner ARCH=aarch64 DEVICE=A64 make image
Allwinner H3
PROJECT=Allwinner ARCH=arm DEVICE=H3 make image
Allwinner H5
PROJECT=Allwinner ARCH=arm DEVICE=H5 make image
Allwinner H6
PROJECT=Allwinner ARCH=arm DEVICE=H6 make image
Amlogic GXBB/GXL/GXM/G12/SM1
PROJECT=Amlogic ARCH=arm DEVICE=AMLGX make image
Generic x86_64 GBM
PROJECT=Generic DEVICE=Generic ARCH=x86_64 make image
Generic x86_64 X11 (legacy)
PROJECT=Generic DEVICE=Generic-legacy ARCH=x86_64 make image
NXP/Freescale iMX.6
PROJECT=NXP ARCH=arm DEVICE=iMX6 make image
NXP/Freescale iMX.8
PROJECT=NXP ARCH=arm DEVICE=iMX8 make image
Qualcomm DragonBoard
PROJECT=Qualcomm ARCH=arm DEVICE=Dragonboard make image
Raspberry Pi 2/3
PROJECT=RPi ARCH=arm DEVICE=RPi2 make image
Raspberry Pi 4
PROJECT=RPi ARCH=arm DEVICE=RPi4 make image
Raspberry Pi 5
PROJECT=RPi ARCH=arm DEVICE=RPi5 make image
Samsung Exynos
PROJECT=Samsung ARCH=arm DEVICE=Exynos make image
Rockchip RK3328
PROJECT=Rockchip ARCH=arm DEVICE=RK3328 make image
Rockchip RK3288
PROJECT=Rockchip ARCH=arm DEVICE=RK3288 make image
Rockchip RK3399
PROJECT=Rockchip ARCH=arm DEVICE=RK3399 make image
To improve GHA/CI automation with ARM SoC $PROJECT(s) that support multiple $DEVICE types make image will iterate through all board/u-boot configurations defined in scripts/uboot_helper resulting in ~3-10 images in the target folder. To avoid this behaviour and build a single board-specific image UBOOT_SYSTEM=<board> can be appended to the build command, e.g. to build an Amlogic image for a LibreComputer LePotato board:
Several ARM SoC devices have a UBOOT_SYSTEM=box configuration which excludes u-boot and provides all device-trees, allowing the image to boot using the Android/BSP u-boot on emmc/spi.
Official releases were built using Ubuntu 22.04 LTS.
Allwinner A64
PROJECT=Allwinner ARCH=arm DEVICE=A64 make image
Allwinner H3
PROJECT=Allwinner ARCH=arm DEVICE=H3 make image
#!/bin/sh
DYNU_USERNAME="username"
DYNU_PASSWORD="password-hash"
DYNU_HOSTNAME="example.dynu.com"
REFRESH_RATE=60
PUBLIC_IP=0.0.0.0
test_ip ()
{
if [ -n $2 ] ; then
if [ $1 != $2 ] ; then
update_ip $2
echo $2
else
echo $1
fi
fi
}
update_ip ()
{
DYNU_WGET="https://api.dynu.com/nic/update?hostname=$DYNU_HOSTNAME&myip=$1&username=$DYNU_USERNAME&password=$DYNU_PASSWORD"
DYNU_UPDATE=`wget $DYNU_WGET -O - -q ; echo`
(>&2 echo "$DYNU_UPDATE")
}
while true; do
PUBLIC_IP_TEST=`wget http://ipecho.net/plain -O - -q ; echo`
echo $PUBLIC_IP - $PUBLIC_IP_TEST
PUBLIC_IP="$(test_ip $PUBLIC_IP $PUBLIC_IP_TEST)"
sleep $(REFRESH_RATE)
PUBLIC_IP_TEST=`curl -s checkip.dyndns.org | sed 's#.*Address: \(.*\)</b.*#\1#'`
echo $PUBLIC_IP - $PUBLIC_IP_TEST
sleep $(REFRESH_RATE)
PUBLIC_IP_TEST=`curl -s ifconfig.co`
echo $PUBLIC_IP - $PUBLIC_IP_TEST
PUBLIC_IP="$(test_ip $PUBLIC_IP $PUBLIC_IP_TEST)"
sleep $(REFRESH_RATE)
donePROJECT=Amlogic ARCH=arm DEVICE=AMLGX UBOOT_SYSTEM=lepotato make imagedtb_name=/amlogic/@@DTB_NAME@@
bootargs=boot=UUID=2306-0801 disk=UUID=8268da37-3a8d-4f6d-aba0-08918faded56 quiet systemd.debug_shell=ttyAML0 console=ttyAML0,115200n8 console=tty0dtb_name=/amlogic/meson-g12b-gtking.dtb
bootargs=boot=UUID=2306-0801 disk=UUID=8268da37-3a8d-4f6d-aba0-08918faded56 quiet systemd.debug_shell=ttyAML0 console=ttyAML0,115200n8 console=tty0LibreELEC:~ # emmctool
info: boot device is /dev/mmcblk0, U-Boot version is 2021.04
info: emmc device is /dev/mmcblk1
Model: MMC 8WPD3R (sd/mmc)
Disk /dev/mmcblk1: 7818MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 17.4kB 7818MB 7818MB ext4 EMMC_STORAGE
usage: emmctool (w)rite <filename> : write <filename>.img/.img.gz to the eMMC module
(b)backup <filename> : dump the emmc partition to an .img.gz file
(d)etect : detect an eMMC module attached after boot
(i)nfo : show info about the eMMC module
(l)abels : change eMMC disk labels to /
(r)esize : resize the storage partition to 100%
(s)storage : convert emmc for use as /storage (boot from sdcard)
(z)ero : zero (erase/wipe) the eMMC module
(h)elp : displays this help messagePROJECT=Amlogic ARCH=aarch64 DEVICE=AMLGX UBOOT_SYSTEM=lepotato make imagePROJECT=Amlogic ARCH=arm DEVICE=AMLGX UBOOT_SYSTEM=lepotato make image<Navigation> is used for navigation in menus
<Music> is used when listening to music
<Video> is used when watching videos
<Tvshow> is used when watching videos classified as TV shows
<General> is used when there is no activity
Each section contains <line> items representing one physical line on the display. Lines scroll horizontally if display text is longer than display width. The display cannot scroll vertically so if you configure five lines on a four line display the fifth line will not show. If there is no value for an Infolabel the line on the LCD/VFD display will be empty and the next line is displayed to avoid empty lines on the display. The file also contains display properties, e.g.
<disableonplay>video</disableonplay> disables the display during video playback
<disableonplay>music</disableonplay> disables the display during music playback
<disableonplay>video,music</disableonplay> disables the display for video and music
For example, the following configuration:
Will output on the display like this:
Please see Infolabels and Line Tags for more info on how Kodi processes the <line> items. The $LOCALIZE[[ID]] variable does a lookup in the Language File and displays the text corresponding to the [[ID]] on the LCD/VDF display.
In addition to normal InfoLabels, LCD InfoLabels display values without additional text. This helps configuration display more information in one line at the same time and to avoid scrolling of the specified line.
LCD.PlayIcon
Displays the Play / Stop / Pause / FF / REW Icon
LCD.ProgressBar
Displays a progress bar of the currently played item
LCD.CPUTemperature
Displays the CPU temperature value with no extra text
LCD.GPUTemperature
Displays the GPU temperature value with no extra text
LCD.HDDTemperature
Displays the HDD temperature value with no extra text
The LCD.Time InfoLabels can be displayed while Kodi is in screensaver mode or if the visualisation is started by the screensaver. In all other cases the play and progress icons are shown, which may give unexpected results.
Pulseaudio is used for routing audio to a Bluetooth device. With additional configuration it can also be used to receive audio and stream to multi-device (multi-room) configurations.
The tutorials on this page are basically using four commands:
pactl load-module <name> to load a pulseaudio module (not all are loaded by default)
pactl set-default-sink to set the pulseaudio output device
pactl set-default-source to set the pulseaudio input device
pactl info to check the current sink/source configuration
Sample pactl info output:
This is the default configuration. Simply pair a Bluetooth audio device in the LibreELEC settings add-on and change the Kodi output device (in Kodi settings) to Bluetooth Audio.
This allows you to stream Bluetooth audio from a smartphone or other Bluetooth device. Before you start, pair the device in the LibreELEC settings add-on.
Stop Kodi (else it holds onto the audio device):
Load the pulseaudio udev module:
List the names of pulseaudio output devices using the pactl utility:
For example:
Configure the pulseaudio output device:
Use pactl to find your Bluetooth audio device:
For example:
Configure the pulseaudio source device:
Restart Kodi:
Select the audio output device in Kodi if you want audio from your device, and from playing files in Kodi.
This requires another computer or device running pulseaudio, e.g. an MPD music player or another LibreELEC device.
On the pulseaudio target device, ensure the native-protocol-tcp and zeroconf-publish modules are loaded:
On the pulseaudio source (LibreELEC) device, stop Kodi and find the output device:
For example:
On the pulseaudio source, configure the pulseaudio output device:
Restart Kodi:
You can now select the default pulseaudio output device in Kodi settings. Audio will be broadcast on the network and other pulseaudio devices can select it as their audio source.
This requires another pulseaudio device in the network, e.g. an MPD player or another LibreELEC device.
Stop Kodi else it will hold onto the audio output device:
Load the pulseaudio udev module:
Use pactl to list pulseaudio output devices:
For example:
Configure the pulseaudio output device:
On the source pulseaudio device, load the native-protocol-tcp and zeroconf-discover modules:
On the target device, use pactl to list available input devices:
For example:
Configure the pulseaudio input device:
Restart Kodi:
Custom pulseaudio configuration is stored in /storage/.config/pulse-daemon.conf.d as /etc/pulse is inside the read-only filesystem. Files must have a .conf extension. The file daemon.conf is processed first, followed by other files in alphabetical order so if the same option is set in multiple files, the last one to be read will be used. If files have the same name as a default (embedded) file they override (replace) the embedded file.
To make custom configurations persistent, we must override /etc/pulse/default.pa which is read on startup. Create /storage/.config/pulse-daemon.conf.d/custom.conf and set the following to override the startup script file location:
Now create /storage/.config/pulse-daemon.conf.d/custom.pa to extend the default startup script:
Create /storage/.config/pulse-daemon.conf.d/custom.conf with your custom options, e.g.
To see the available resample methods:
For example:
The LibreELEC “build-system” is a collection of scripts that simplify the complex task of cross-compiling hundreds of inter-dependent source packages into a working LibreELEC image with a few simple commands. It is the "secret sauce" of the project, as it allows users of all experience levels to tinker and experiment with the distro. Forking our codebase and experimenting is encouraged!
The team currently builds official releases, and nightly images in Ubuntu LTS 22.04 Docker containers at the teams https://github.com/LibreELEC/actions CI/CD. It is possible to use other Linux distributions (Arch, Debian, Fedora, Gentoo, Manjaro, etc.) but Ubuntu is the most-used and proven. If you plan to build on an existing Linux desktop we recommend building in a Docker container to isolate the build folders from the rest of the OS (Dockerfiles can be found in the tools folder of the main LibreELEC git repo, see Build (Docker) for more info). Another option is building in a Virtual Machine, e.g. Oracle Virtualbox ($free) or vmware Workstation.
Note: If you want to compile older LibreELEC releases you will need to use an era-appropriate Ubuntu LTS release, e.g. LibreELEC 7.0 will need Ubuntu 14.04 or 16.04.
Image build times depend on CPU and I/O performance so the more CPU cores you have or can allocate, the faster your build times will be. For example:
Approx. 3 hours build time:
2x Core i3 CPU
4GB RAM (with swap enabled)
50GB HDD
Approx. 1.5 hours build time:
4x Core i7 CPU
8GB RAM
100GB SSD
Approx. 30 mins build time:
32x Core AMD Threadripper2
64GB RAM
1TB NVME SSD
Testing with large CPU counts shows build times continue to decrease as CPU count increases (as you'd expect) although over ~16x CPUs the gains per-CPU reduce, and overall build times are limited by the inherently sequential nature of the initial stages of building (creating the cross-compile toolchain). The current build record is ~22 mins (64x CPUs, build folders on a ramdisk).
Before you can build, it is important to update the OS and install build dependencies:
Note: The first time the build-system runs it will validate and prompt you to install any missing package dependencies.
Use git to clone the LibreELEC sources to your user folder:
After cloning you are now at the current HEAD position of the master development branch. To compile a specific LibreELEC release we need to checkout the specific version tag or githash associated with the release, e.g. to build the LibreELEC 11.0.1 release we checkout the 11.0.1 tag:
You can also build at a specific point in the git revision history identified by a commit githash:
You are now in the root folder of the build-system and ready to build!
The first time the build-system runs it will download and cache package sources, but there are ~260-380 packages to cache (depending on the build PROJECT) and some sources are large, and others are download from super-slow servers. To download sources in advance of building, use download-tool, e.g.
As a normal user (not as root, and not using sudo) run a build command, e.g.
This will compile the Generic build PROJECT for the x86_64 arch, and make image will generate an .img.gz file that can be written to USB/SD media for installation, and a .tar file that can update an existing installation (.img.gz files can also be used for updates, but .tar files are faster).
It is not uncommon for first-time builds to take 6-8 hours due to the number of sources that must be downloaded. Once the build completes the finished image files will be in the ~/LibreELEC.tv/target/ directory.
After completing your first build, you probably want to make some nip-tuck changes and then rebuild the image to include them. If you re-run the same build command the build-system will detect most changes and will clean and rebuild only the packages that have been changed. This means a "respin" with minor changes often takes only 1-2 minutes. As a general rule you can keep rebuilding (respinning) unless there are changes to the "toolchain" packages. If these are changed, you will need to clean or remove the build folders and make a "clean build" again.
If you see strange or transient compilation errors, start by cleaning the sources for the failing package and clear the compiler cache (ccache), e.g. to clean the linux package:
You can also remove all build directories (keeping ccache):
Or just for one project:
To remove everything and ccache:
Or just for one project:
PXE booting with SYSTEM and /storage mounted via NFS is supported on Generic x86_64 and current Raspberry Pi devices (Pi 4 and newer). Older Raspberry Pi devices can also be booted over the network, but they require a different procedure. In the following writeup the server is Ubuntu 18.04 LTS.
In Ubuntu we need to install and configure DHCP, TFTP, and NFS services:
Edit /etc/dhcp/dhcpd.conf and change the DHCP range if needed. Create entries in the host section for your client(s):
Edit /etc/default/isc-dhcp-server to set the interface name handling DHCP requests:
Create the directories that will contain your /storage userdata and TFTP boot files, e.g.
Download the LibreELEC image for your device. On x86 systems, copy the KERNEL and SYSTEM files into the /mnt/tftpboot directory:
On a Raspberry Pi, just copy all files into the /mnt/tftpboot directory:
Then add the following lines to the /etc/exports file:
Create directories for the TFTP bootfiles. In this example they are served from a different disk:
You may also want to copy the KERNEL and SYSTEM files to /mnt/tftpboot
Add the following lines to /etc/default/tftpd-hpa and save the file:
Create /mnt/tftpboot/pxelinux.cfg/default (or instead of default use the MAC-Address of your device in the format 90-91-92-93-94-95) and insert the following:
Replace 192.168.0.1 with the NFS server IP address. The overlay parameter is not required if you only intend to boot one system. LibreELEC is now configured to boot using TFTP and NFS!
Today many server use NFSv4 while the kernel still default to NFSv3. In such a case set the correct NFS dialect via the vers= option:
Valid nfs versions are 2 3 4 4.0 4.1 4.2.
If using the default Ubuntu firewall (UFW) add the following rules to allow ports for TFTP (69) and ONRPC (111):
Clients normally connect to the NFS server on random ports, so it the firewall is active "mountd" needs to be told to use a fixed port allowed through the firewall, or boot will hang.
Edit /etc/default/nfs-kernel-server and replace the current RPCMOUNTDOPTS line. In the example below 8765 is a randomly chosen port:
Create a matching firewall rule to allow the port:
And finally, start services:
Release management is as simple as plan, build, test, prepare and deploy.
LibreELEC is made up of over 800 packages which are in themselves developed by many other teams and groups across the Internet. These packages are maintained in the packages directory. An example of a package is Linux which has its main LibreELEC makefile as packages/linux/package.mk, or Kodi packages/mediacenter/kodi/package.mk.
The project team and Contributors prepare and regularly update the code that makes up the LibreELEC distribution. This is done by "bumping" the PKG_VERSION in the package.mk file and updating the other variables, code, patches and dependencies that make up the distribution. These are then rolled up into a and submitted as a change.
The update-scan tool has been developed to check PKG_VERSION of packages against release monitoring sites. This tool currently uses Anitya from with the following distribution
An example of the output from update-scan is below:
The tool provides a report at the end of the currency of the packages in the current checked out LibreELEC code.
Packages are ignored if either the PKG_VERSION or PKG_URL __ are empty or hosted by LibreELEC.
For packages not known at the tracker - this means that the package is either not release monitored or not configured for release monitoring at .
The following image shows the Projects of LibreELEC monitored by release-monitoring.
Adding a project to the distro can be made by logging in using your Fedora ID.
Search for the project that you have developed the package.mk for and you want release-monitoring to monitor. In the example - we have added the distro LibreELEC to aixlog.
Click the Add new distribution mapping button within the Project (aixlog example.)
You need to choose LibreELEC from the Distribution drop down. Then click + Add mapping to project.
Most community/user developers have simple git goals, for example:
Changing the Linux kernel defconfig to enable a driver
Bumping the version for a software or binary add-on package
Contributing to project documentation!
The awesome folks at maintain a range of popular Docker containers installable as Kodi add-ons. After installing the Docker add-on (from the LibreELEC add-on repo) you can install the LinuxServer repo add-on (from the LibreELEC add-on repo) and then install container add-ons from within the Kodi GUI. To make maintenance easier LinuxServer add-ons are designed to pull the latest Docker image automatically on Kodi startup to keep the containers fresh.
It is also possible to install Docker containers manually from the SSH console using docker pull commands. This allows you to install a container from any public container repository. This is also how you can access the full .
<Music>
<line>$INFO[[LCD.PlayIcon]] $INFO[[Player.Time]]/$INFO[[Player.Duration]]</line>
<line>$INFO[[MusicPlayer.Title]]</line>
<line>$INFO[[MusicPlayer.Artist]]</line>
<line>$INFO[[MusicPlayer.Album]] ($INFO[[MusicPlayer.Year]])</line>
</Music>> 00:42/3:20
Gold Digger
Kanye West feat. Jamie Foxx
Late Registration (2005)sudo apt install isc-dhcp-server tftpd-hpa nfs-kernel-serverLCD.FanSpeed
Displays the Fan Speed value with no extra text
LCD.Date
Displays the current Date with no additional text
LCD.FreeSpace(Drive)
Displays the value for remaining free space on Drive (C/E/F/G) with no additional text
LCD.Time21, LCD.Time22
Displays the time in 2×1 sized characters
LCD.TimeWide21, LCD.TimeWide22
Displays the time in 2×2 sized characters
LCD.Time41, LCD.Time42, LCD.Time43, LCD.Time44
Displays the time in 4×3 sized characters

The goal of this page is to explain essential git workflow and terms. Git is mind-bendingly complicated clever and there are hundreds of tricks to learn, but the basics are logical and quite simple to pick-up. One of the good things about git is; everyone is still learning! and everyone remembers what it was like to be a git n00b at the beginning. If you need to ask questions, ask them, as people are happy to coach.
The project maintains its primary git repository (repo) at https://github.com/LibreELEC/LibreELEC.tv/. The repo hosts the master development branch where the next release takes shape, and stable release branches, e.g. libreelec-12.0 and libreelec-11.0 that accumulate release-specific changes (commits) over time.
To self-build an image and test something you can simply git clone our sources and start building, but if you want to maintain personal customisations and changes over time it's better to fork our sources to your own git repo. Having your own fork makes the process of storing, sustaining, and sharing your changes easier. Forking is done online by visiting the LibreELEC repo and then pressing the fork button (top right of the screen). GitHub will make a copy of our sources under your own user account. Now instead of cloning OUR sources you git clone a copy of YOUR sources to your local hard-drive.
Like ours, your fork will have a master branch and release branches like libreelec-12.0 which contain a sequence of commits. When you clone your repo to your local drive, git automatically creates references to your copy on GitHub which is the origin of your local sources. To update your local branches with changes from our upstream branches, we will define a remote repo. You can add many remote(s), but we will add just one:
One of the most important principles of git is NEVER WORK IN THE MASTER BRANCH !!. To make a one-time change then build an image it's fine, but if you make changes in branches that we maintain (upstream) it becomes complicated to maintain your local (downstream) changes. It's best to keep your changes in a separate "topic" branch. To create a new topic branch, you checkout a new branch from the one you want to modify. For example, to modify the libreelec-12.0 branch, we switch to it, then create the "mychanges" topic branch:
In git-speak when you save your work you commit changes to the working (topic) branch. The mantra for committing is "commit early, commit often" because it's always simple to combine (squash) commits together at a later stage, but hard to split a large commit into many smaller pieces. Commits can document changes to a single file or a collection of files, with a readable "commit message" that describes the changes. LibreELEC has a "house style" for commit messages: tag: summary of changes made where tag is the name of the package being changed or a functional area of the build system and summary of changes made explains in brief what the change does. It helps to make them descriptive so you can read the git log later and understand which commit changed something. For example, if we enable an extra driver or module in the Linux kernel:
Make changes and save the file:
Most users will make changes first, then build and test them, then commit the changes.
Over time staff and users contribute changes to our upstream branches and your local fork falls behind. To update your "mychanges" topic branch you must first commit any unsaved changes, then switch back to the branch it was based upon, e.g. the libreelec-12.0 branch:
Next we need to fetch the latest changes from the upstream branch to our local cache, then reset the local copy of the branch to match the upstream one:
Now the local libreelec-12.0 branch contains the latest changes we can change back to our mychanges topic branch and rebase the branch. Rebasing re-applies the single or handful of changes that you made (and committed) to the branch you are rebasing against, e.g.
If you look at the log of commits you will see the mychanges branch matches the upstream libreelec-12.0 branch, with your local changes applied on top.
This is the git trick that everyone needs to learn. It is often the "Eureka!" moment that moves a user from novice to normal. Interactive rebasing allows you to (re)edit, remove, and reorder the sequence of commits in the branch. The reasons you will want/need to do this are dropping a change, grouping commits together so the sequence is easier to understand, to edit (reword) one or more commit messages, or to combine (squash or fixup) multiple small changes into a single larger commit. Interactive rebasing is done to a specific number of commits measured from the top (HEAD) of the branch, e.g. to rebase the last five changes:
The list of commits will open in a text editor, e.g. "nano" and you can cut (ctrl+k) and paste (ctrl+u) the commits to reorder them. For example, lets say we have the following list which shows which commits are being pick(ed) to the branch:
It would be more logical to group all the file A and file B commits like this:
The next logical step might be to combine the changes so there are only two commits; one for changes to file A and one for changes to file B. This is done by changing pick to squash or fixup which combine commits. In the sequence below, the first commit is at the top, and we want to combine the next two minor changes into it. If you squashcommits you will be asked to edit the commit messages (choose which of the commits should be used for the message) while fixup combines the lower (second) commit into the upper (first) commit and uses the first commit message without prompting. For example:
Once you save (ctrl+o) and exit edit mode (ctrl+x) the reordering and squash/fixup changes are applied, leaving you with two commits for "fix typos in file A" and "add new file B" in the branch. It is a good habit to squash and rebase frequently to keep your changes logically grouped and in a minimum number of commits. This is important if you want to send your changes upstream in a "pull request" to our repo. Project staff want to review a small and logical set of changes, not the monster list of nip-tuck changes you needed to figure out what changes were needed.
Another good habit is pushing your local changes back to your origin branch on GitHub. If something gets messed up in your local branch (and when you are starting out with git, stuff will get messed up!) you can always reset your local branch to the previous known-good state stored on GitHub. Pushing the changes is simple:
If you have rebased the mychanges branch the branch history will have different references and a force-push will be needed:
There are also no restrictions on the number of branches you can make. So fork branches and push them upstream. It's better to fork and store changes and then tidy things up occasionally than lose changes and have to repeat/reinvent them.
If your changes might benefit the project and you'd like to see them included upstream in our repo so you don't need to maintain them in your downstream fork, you'll need to submit a pull request (referred to as a PR.) This is done in the GitHub interface. You need to push your changes to your origin branch, and then when you view the code on GitHub, select the "pull request" button. You'll be prompted to select the repo/branch to send the request to, e.g. LibreELEC.tv/master and you'll give the request a name and description. If your pull request modifies code, please include a good description of the problem that your changes solve or what the feature is that you added, and (important!) the testing you conducted. So called "blind requests" where there is no evidence of testing and no meaningful explanation of the change, are rarely merged (or merged quickly) into our codebase.
Note: All functional changes should be submitted to the master branch first, even if the target for your changes is the current stable release branch. This way the branches remain in sync, and we don't have orphaned features.
LibreELEC-Generic.x86_64-11.0.1.img.gz has x86_64 userspace
LibreELEC-RPi4.arm-11.0.1.img.gz has arm userspace
LibreELEC-RPi4.aarch64-12.0-nightly-20230310.img.gz has aarch64 userspace
Userspace CPU arch can also be read from the /etc/os-release file in the filesystem, e.g.
Docker containers may also use different arch naming, e.g.
The arm arch may be referred to as linux/arm and linux/arm/v7
The aarch64 arch may be referred to as linux/arm64 and linux/arm64/v8
The x86_64 arch may be referred to as amd64
LibreELEC 12 will switch most ARM SoC devices capable of running a 64-bit kernel from arm to aarch64 userspace. This will require affected users to remove arm containers before they update and redeploy arm64 versions post-update.
LibreELEC:~ # pactl info
Server String: /var/run/pulse/native
Library Protocol Version: 31
Server Protocol Version: 31
Is Local: yes
Client Index: 41
Tile Size: 65472
User Name: root
Host Name: LibreELEC
Server Name: pulseaudio
Default Sample Specification: s16le 2ch 44100Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.platform-aml_m8_snd.45.analog-stereo
Default Source: alsa_input.platform-aml_m8_snd.45.analog-stereosystemctl stop kodipactl load-module module-udev-detectpactl list short sinks1 alsa_output.platform-aml_m8_snd.45.analog-stereo module-alsa-card.c s32le 2ch 44100Hz SUSPENDEDpactl set-default-sink alsa_output.platform-aml_m8_snd.45.analog-stereopactl list short sources12 bluez_source.B8_53_AC_01_8F_E7 module-bluez5-device.c s16le 2ch 44100Hz SUSPENDEDpactl set-default-source bluez_source.B8_53_AC_01_8F_E7systemctl start kodipactl load-module module-native-protocol-tcp auth-anonymous=1
pactl load-module module-zeroconf-publishsystemctl stop kodi
pactl list short sinks39 module-tunnel-sink server=[[192.168.1.70]]:4713 sink=alsa_output.pci-0000_00_08.0.analog-stereo format=s16le channels=2 rate=44100 sink_name=tunnel.lukas-macbook-pro.local.alsa_output.pci-0000_00_08.0.analog-stereo channel_map=front-left,front-rightpactl set-default-sink tunnel.lukas-macbook-pro.local.alsa_output.pci-0000_00_08.0.analog-stereosystemctl start kodisystemctl stop kodipactl load-module module-udev-detectpactl list short sinks1 alsa_output.platform-aml_m8_snd.45.analog-stereo module-alsa-card.c s32le 2ch 44100Hz SUSPENDEDpactl set-default-sink alsa_output.platform-aml_m8_snd.45.analog-stereopactl load-module module-native-protocol-tcp auth-anonymous=1
pactl load-module module-zeroconf-discoverpactl list short sources38 module-tunnel-source server=[[192.168.1.70]]:4713 source=alsa_input.pci-0000_00_08.0.analog-stereo format=s16le channels=2 rate=44100 source_name=tunnel.lukas-macbook-pro.local.alsa_input.pci-0000_00_08.0.analog-stereo channel_map=front-left,front-rightpactl set-default-source tunnel.lukas-macbook-pro.local.alsa_input.pci-0000_00_08.0.analog-stereosystemctl start kodidefault-script-file = /storage/.config/pulse-daemon.conf.d/custom.pa#!/usr/bin/pulseaudio -nF
.fail
.include /etc/pulse/default.pa
# extend default startup script here e.g.
load-module module-rtp-recv latency_msec=250 sap_address=0.0.0.0resample-method = soxr-vhq
default-sample-format = s16le
default-sample-rate = 44100pulseaudio --dump-resample-methodstrivial
ffmpeg
auto
copy
peaks
soxr-mq
soxr-hq
soxr-vhqsudo apt update
sudo apt upgrade
sudo apt install bc curl g++ gcc git gperf make openjdk-11-jre-headless rsync unzip xfonts-utils xsltproc xz-utils zipcd ~
git clone https://github.com/LibreELEC/LibreELEC.tv.git
cd LibreELEC.tvgit checkout 12.0.2git checkout f3fdd11916f8a47dc5a11c3a4c99cb7c7ffac78bPROJECT=Generic ARCH=x86_64 tools/download-toolPROJECT=Generic ARCH=x86_64 make imagePROJECT=Generic ARCH=x86_64 scripts/clean linuxmake cleanPROJECT=Generic ARCH=x86_64 make cleanmake distcleanPROJECT=Generic ARCH=x86_64 make distcleanauthoritative;
allow booting;
allow bootp;
ddns-update-style none;
default-lease-time 86400;
max-lease-time 86400;
subnet 192.168.0.0 netmask 255.255.255.0
{
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option domain-name-servers 192.168.0.2, 192.168.0.1;
option routers 192.168.0.1;
range 192.168.0.10 192.168.0.200;
next-server 192.168.0.2;
filename "/pxelinux.0";
host <name>
{
hardware ethernet 00:0a:0b:0c:0d:0e;
fixed-address 192.168.0.5;
}
}INTERFACES="eth0"sudo mkdir /mnt/media/storage
sudo mkdir -m777 /mnt/tftpbootsudo cp KERNEL /mnt/tftpboot
sudo cp SYSTEM /mnt/tftpbootsudo cp * /mnt/tftpboot/mnt/media/storage 192.168.0.2/255.255.255.0(no_root_squash,rw,async,no_subtree_check)
/mnt/tftpboot 192.168.0.2/255.255.255.0(no_root_squash,rw,async,no_subtree_check)sudo mkdir /mnt/tftpboot/pxelinux.cfg
sudo cp -p /usr/lib/syslinux/pxelinux.0 /mnt/tftpbootRUN_DAEMON="yes"
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/mnt/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"DEFAULT LibreELEC
PROMPT 0
LABEL LibreELEC
kernel /KERNEL
append ip=dhcp boot=NFS=192.168.0.2:/mnt/tftpboot disk=NFS=192.168.0.2:/mnt/media/storage APPEND ip=dhcp boot=NFS=192.168.0.1:/mnt/store/libreelec,vers=4.2 disk=NFS=192.168.0.1:/mnt/store/libreelec/storage,vers=4.2 overlaysudo ufw allow proto udp from 192.168.0.0/24 to any port 69
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 111RPCMOUNTDOPTS="-p 8765"sudo ufw allow proto tcp from 192.168.0.0/24 to any port 8765sudo service isc-dhcp-server start
sudo service nfs-kernel-server start
sudo service tftpd-hpa startgit clone https://github.com/username/LibreELEC.tv
cd LibreELEC.tvgit remote add upstream https://github.com/LibreELEC/LibreELEC.tv.gitgit checkout libreelec-12.0
git checkout -b mychangesnano projects/Generic/linux/linux.x86_64.confgit add projects/Generic/linux/linux.x86_64.conf
git commit -m "linux: enable RTL8822CE wireless driver"git checkout libreelec-12.0git fetch upstream libreelec-12.0
git reset --hard upstream/libreelec-12.0git checkout mychanges
git rebase libreelec-12.0git log --pretty=onelinegit rebase -i HEAD~5pick 73d9356c36 fix typos in file A
pick 29de6de78b add new file B
pick be444ce9e7 more typos in A
pick cf7149bc7e more typos in A
pick 750b824c04 changes to file Bpick 73d9356c36 fix typos in file A
pick be444ce9e7 more typos in A
pick cf7149bc7e more typos in A
pick 29de6de78b add new file B
pick 750b824c04 changes to file Bpick 73d9356c36 fix typos in file A
fixup be444ce9e7 more typos in A
fixup cf7149bc7e more typos in A
pick 29de6de78b add new file B
fixup 750b824c04 changes to file Bgit push origin mychangesgit push -f origin mychangesRPi4:~ # cat /etc/os-release
NAME="LibreELEC"
VERSION="11.0.3"
ID="libreelec"
VERSION_ID="11.0"
PRETTY_NAME="LibreELEC (official): 11.0.3"
HOME_URL="https://libreelec.tv"
BUG_REPORT_URL="https://github.com/LibreELEC/LibreELEC.tv"
BUILD_ID="1189cdb0f43e6f4208f747d54fefb70478ebee9d"
LIBREELEC_ARCH="RPi4.arm" <= This contains the userspace CPU arch
LIBREELEC_BUILD="official"
LIBREELEC_PROJECT="RPi"
LIBREELEC_DEVICE="RPi4"LibreELEC can be configured as a WireGuard VPN client allowing you to accessing media in a remote location or tunnel traffic to avoid local inspection of network activity. This guide assumes configuration of a single WireGuard tunnel that is persistent, i.e. activated on device boot so that Kodi network traffic is routed through the WireGuard VPN tunnel.
WireGuard tunnels are managed by a ConnMan VPN plugin (connman-vpn.service) that acts as a companion to the network connection manager daemon (connman.service). The VPN plugin watches /storage/.config/wireguard/*.config and defines ConnMan services from auto-discovered configuration files. Once a valid WireGuard .config has been imported it can be connected manually using connmanctl from the SSH console or scripted from a systemd service that runs on boot. Connections can also be managed using the network 'Connections' tab in the LibreELEC settings add-on which controls ConnMan via d-bus.
ConnMan uses its own configuration file format (see below) so you cannot import/use the files exported from WireGuard server tools and third-party VPN services - the format is different. Those files will contain everything you need, but you must manually transpose the information into the ConnMan format:
Name = AnythingYouLike Host = IP of the WireGuard server (IP, not FQDN) WireGuard.Address = The internal IP of the client node, e.g. a /24 address WireGuard.ListenPort = The client listen port (optional) WireGuard.PrivateKey = The client private key WireGuard.PublicKey = The server public key WireGuard.PresharedKey = The server pre-shared key (optional) WireGuard.DNS = Nameserver to be used with the connection (optional) WireGuard.AllowedIPs = Subnets accessed via the tunnel, 0.0.0.0/0 is "route all traffic" WireGuard.EndpointPort = The server ListenPort WireGuard.PersistentKeepalive = Periodic keepalive in seconds (optional)
Hostmust be an IP address not a qualified domain name. If you need to handle a VPN server that has a dynamic not static address, an external script (scheduled via cron or a systemd timer) must be used to detect the IP change, update the .config file used by the ConnMan VPN manager, and restart of the WireGuard connection systemd service.
If you need to create some, run wg-keygen from the SSH console and /storage/.cache/wireguard will contain new publickey, privatekey, and preshared files with keys inside. Most users will not need to generate WireGuard keys as they will be in the configuration file provided by a VPN service provider.
Once you have saved a configuration file, check it is valid:
In the above example vpn_185_210_30_121 was created (vpn_host) as the ConnMan service name. Test the service will connect using:
ConnMan will create a new network interface, so ifconfig will show wg0 or sometimes a higher number like wg1 or wg2:
You should be able to ping the remote (server) side of the WireGuard VPN tunnel. In our example this is 10.2.0.1:
The routing table will show normal traffic routed to the wg0 interface:
To disconnect the ConnMan service:
Check ifconfig again and the WireGuard interface will be gone.
Create a systemd wireguard.service file to start the connection automatically on boot, after the network starts, and before Kodi is launched. The sample wireguard.service file looks like:
Copy the sample wireguard.service file to /storage/.config/system.d/wireguard.service
Replace vpn_service_name_goes_here with your service name, e.g. vpn_185_210_30_121 using nano. Use ctrl+o to save changes and ctrl+x to exit nano:
Now we can enable and start the service:
Check the WireGuard tunnel is active using "ifconfig" and "ping" and if all is good, reboot to test the WireGuard tunnel comes up automatically on boot.
ConnMan configures wg0 to route all traffic over the WireGuard tunnel by default, no matter what WireGuard.AllowedIPs configuration is set. To route only specific networks via the tunnel the ConnMan service order (which influences routing order) must be changed.
In the example below note thesleep and connmanctl move-after and route add commands used in the following tweaked systemd service file:
The following forum thread has tips and examples:
Big thanks! to ConnMan maintainer Daniel Wagner (wagi) who worked with LibreELEC staff to implement WireGuard support in ConnMan (he wrote the code, we abused tested it).
Kodi can natively mount SMB, NFS, SFTP, WebDAV (and more) remote filesystems (shares) to read media for playback, but many applications that write content, e.g. TVHeadend storing TV recordings, must write to "local" storage. Remote SMB and NFS shares can be "mounted" to the local filesystem using kernel mounts configured through systemd .mount files.
The following NAS configuration is used in the examples below:
NAS IP: 192.168.1.222
Username: nasuser1
To provide a better download experience and offload bandwidth and hosting charges from the project, our main downloads (releases and installers) are distributed over a global network of volunteer mirror servers. The project is always interested in adding new mirrors to our pool, and we welcome offers of assistance!
If you would like to help, you should:
Be an experienced provider of mirroring services
Be able to sync with a frequency between 1-12 hours
$ tools/update-scan
Github api usage activated
Updates found:
Package | LE git master | upstream location
--------------------------------------------------------------
Pillow | 8.4.0 | 9.0.1
Python3 | 3.8.12 | 3.11.0a5
RPi.GPIO | 0.7.1a4 | 0.7.0
.
.
.Current 449:
Jinja2 Mako MarkupSafe ...
Ignored 84:
adafruit-libraries alsa ...
Packages not known at tracker 23:
RTL8192CU configtools dvb-latest edid-decode firmware-dragonboard \
firmware-imx gcc-riscv64-unknown-linux-gnu getscancodes \
gnulib jdk-aarch64-zulu jdk-arm-zulu jdk-x86_64-zulu kmscube \
lan951x-led-ctl media_tree oscam szap-s2 t2scan tune-s2 unfsd \
vdr-plugin-dummydevice vdr-plugin-wirbelscancontrol vdr-plugin-wirbelscan





Password: 123nas
Share name: recordings
Full address to share: \\192.168.1.222\recordings
Connect to your LibreELEC HTPC with SSH.
mkdir /storage/recordings
IMPORTANT: The filename uses hyphens to separate elements of the filesystem path to the share mount-point, e.g. /storage/recordings will be storage-recordings.mount and sub folders, e.g. /storage/recordings/tv would be storage-recordings-tv.mount
Create the .mount file:
nano /storage/.config/system.d/storage-recordings.mount
Below is an example of the mount definition file for a Samba share:
Address of your share. Remember to always use / slashes:
What=//192.168.1.222/recordings
Path where the Share should be mounted:
Where=/storage/recordings
Options:
Options=username=nasuser1,password=123nas,rw,vers=2.1
username= Username of your network share
password Password of your network share
rw Read/write access
vers=2.1 Version of the Samba protocol, 2.1 is supported since Windows 7 several other versions are supported too
Finally we need to enable the mountpoint.
systemctl enable storage-recordings.mount
Reboot your system to check if the mount works.
Get status and error messages from the mount point:
systemctl status storage-recordings.mount
Remove mount point and disable it:
systemctl disable storage-recordings.mount
Connect to your LibreELEC HTPC with SSH.
mkdir /storage/recordings
Important: you need to set the filename for the definition file according to the folder where you want to mount your share . In our case: storage-recordings.mount represents the path -> /storage/recordings. If you add a subfolder: storage-recordings-tv.mount represents the path -> /storage/recordings/tv.
nano /storage/.config/system.d/storage-recordings.mount
Contents of the definition file for a NFS share:
Address of your share;
What=192.168.1.222:/usr/data2/video
Path where the share should be mounted:
Where=/storage/recordings
Options: At this section you are able to define specific NFS options, such as the NFS version. In the example below we set Type for an NFSv3 share.
Type=nfs
To use an NFSv4 share:
Type=nfs4
systemctl start storage-recordings.mount
Note: That's only a test and the mount won't be available after a reboot. To make it available after boot you have to "enable" the service first.
If the previous test worked, enable the service via:
systemctl enable storage-recordings.mount
Reboot your system to see if the mount is available after boot.
Get status and error messages from the mount point:
systemctl status storage-recordings.mount
Remove mount point and disable it:
systemctl disable storage-recordings.mount
TimeCapsule devices share files using an Apple dialect of SMB that is not compatible with the Samba smbclient Kodi uses to connect to SMB shares. To access media on a TimeCapsule you can follow the steps described above for connecting to Samba shares with a systemd storage mount, but with one difference: the Options configuration must force SMB v1.0 and legacy NTLM authentication or the mount will fail. See below:
SMB v1.0 is widely considered to be insecure, but TimeCapsules no longer receive software updates and there is no alternative; SMB v2/v3 are not supported.
In some edge cases where the remote filesystem may be unavailable when LibreElec boots or the remote filesystem has a chance of disconnecting, an automount is an easy way to mount without the risk of failure and with the option to attempt to connect/reconnect with no extra effort.
It is basically a safe way to retry mounting the remote filesystem.
Because we enable the automount service, we can disable the mount service. Which in turn allows the system to boot without errors, even if the network share is not available (it will still show the files as missing until the share is available, but this is expected). What the automount does is try to connect to the network share when the local mount path is accessed by the filesystem. So when trying to play media from the mount path, or trying to update the library (assuming the mount path is in your media library).
Follow the relevant instructions above to create a systemd .mount definition file for your network share.
IMPORTANT: It is recommended to follow the instructions above completely and add the mounted path to your library in Kodi before proceeding with the instructions below.
If you've already enabled the mount service in systemd, disable it to prevent errors on boot when the network share is unavailable.
systemctl disable storage-recordings.mount
Filename restrictions are the same as for the .mount definition file. Meaning that if your .mount file is named storage-recordings.mount your automount file should be named storage-recordings.automount.
nano /storage/.config/system.d/storage-recordings.automount
Contents of the automount definition file:
Path of the mount in question:
Where=/storage/recordings
Idle timeout (time before systemd should unmount the network share, 0 means disabled):
TimeoutIdleSec=0
systemctl enable storage-recordings.automount
systemctl daemon-reload
If you have already added the mount path to your library in Kodi, you can test the automount by trying to access the folder inside Kodi. If all went well, the network share will mount as soon as you attempt to access it's mount path.
If the network share is available when LibreElec is starting up, it will be mounted during the boot process.
Get status and error messages from the automount (great for seeing when a mount was attempted):
systemctl status storage-recordings.automount
IMPORTANT: Running the above command will NOT show mount errors, to see mount errors you will still need to run systemctl status on the .mount service (systemctl status storage-recordings.mount).
Disable the automount:
systemctl disable storage-recordings.automount
[provider_wireguard]
Type = WireGuard
Name = WireGuard (Home)
Host = 185.210.30.121
WireGuard.Address = 10.2.0.2/24
WireGuard.ListenPort = 51820
WireGuard.PrivateKey = qKIj010hDdWSjQQyVCnEgthLXusBgm3I6HWrJUaJymc=
WireGuard.PublicKey = zzqUfWGIil6QxrAGz77HE5BGUEdD2PgHYnCg3CDKagE=
WireGuard.PresharedKey = DfEYeVs04HS9XhKGM4/ZXHG3Qc4MFK2AJd8XouYDbRQ=
WireGuard.DNS = 8.8.8.8, 1.1.1.1
WireGuard.AllowedIPs = 0.0.0.0/0
WireGuard.EndpointPort = 51820
WireGuard.PersistentKeepalive = 25RPi4:~ # connmanctl services
* R home vpn_185_210_30_121
*AO Wired ethernet_dca622135939_cableRPi4:~ # connmanctl connect vpn_185_210_30_121RPi4:~ # ifconfig
eth0 Link encap:Ethernet HWaddr DC:A6:32:13:26:3b
inet addr:192.168.10.25 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3136938 errors:0 dropped:40816 overruns:0 frame:0
TX packets:242506 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:310409413 (296.0 MiB) TX bytes:22433323 (21.3 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:6109 errors:0 dropped:0 overruns:0 frame:0
TX packets:6109 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:415013 (405.2 KiB) TX bytes:415013 (405.2 KiB)
wg0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.2.0.2 P-t-P:10.2.0.2 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MTU:1420 Metric:1
RX packets:13744 errors:0 dropped:0 overruns:0 frame:0
TX packets:11080 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13775220 (13.1 MiB) TX bytes:1232552 (1.1 MiB)RPi4:~ # ping 10.2.0.1
PING 10.2.0.1 (10.2.0.1): 56 data bytes
64 bytes from 10.2.0.1: seq=0 ttl=64 time=147.936 ms
64 bytes from 10.2.0.1: seq=1 ttl=64 time=147.955 msRPi4:~ # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default * 0.0.0.0 U 0 0 0 wg0
1.1.1.1 * 255.255.255.255 UH 0 0 0 wg0
8.8.8.8 * 255.255.255.255 UH 0 0 0 wg0
10.2.0.0 * 255.255.255.0 U 0 0 0 wg0
192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
192.168.10.1 * 255.255.255.255 UH 0 0 0 eth0
185.210.30.121 192.168.10.1 255.255.255.255 UGH 0 0 0 eth0RPi4:~ # connmanctl disconnect vpn_185_210_30_121[Unit]
Description=WireGuard VPN Service
After=network-online.target nss-lookup.target wait-time-sync.service connman-vpn.service
Before=kodi.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/connmanctl connect vpn_service_name_goes_here
ExecStop=/usr/bin/connmanctl disconnect vpn_service_name_goes_here
[Install]
WantedBy=multi-user.targetcp /storage/.config/system.d/wireguard.service.sample /storage/.config/system.d/wireguard.servicenano /storage/.config/system.d/wireguard.serviceRPi4:~ # systemctl enable /storage/.config/system.d/wireguard.service
Created symlink /storage/.config/system.d/multi-user.target.wants/wireguard.service → /storage/.config/system.d/wireguard.service.
RPi4:~ # systemctl start wireguard.service[Unit]
Description=WireGuard VPN Service
After=network-online.target nss-lookup.target wait-time-sync.service connman-vpn.service
Before=kodi.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/bin/sleep 5
ExecStart=/usr/bin/connmanctl connect vpn_service_name
ExecStartPost=/usr/bin/connmanctl move-after vpn_service_name ethernet_b827eb10c45a_cable
ExecStartPost=/usr/bin/connmanctl move-after vpn_service_name ethernet_b827eb10c45a_cable
ExecStartPost=/usr/sbin/route add -net 192.168.2.0 netmask 255.255.255.0 gw 10.0.0.2
ExecStartPost=/usr/sbin/route add 64.109.130.11/32 via 192.168.0.1 dev eth0
ExecStop=/usr/bin/connmanctl disconnect vpn_service_name
[Install]
WantedBy=multi-user.target[Unit]
Description=cifs mount script
Requires=network-online.service
After=network-online.service
Before=kodi.service
[Mount]
What=//192.168.1.222/recordings
Where=/storage/recordings
Options=username=nasuser1,password=123nas,rw,vers=2.1
Type=cifs
[Install]
WantedBy=multi-user.target[Unit]
Description=test nfs mount script
Requires=network-online.service
After=network-online.service
Before=kodi.service
[Mount]
What=192.168.1.222:/usr/data2/video
Where=/storage/recordings
Options=
Type=nfs
[Install]
WantedBy=multi-user.targetOptions=username=MyUser,password=MyPass,sec=ntlm,vers=1.0[Unit]
Description=test automount for recordings
[Automount]
Where=/storage/recordings
TimeoutIdleSec=0
[Install]
WantedBy=multi-user.targetBe able to mirror for a long term period (years)
The majority of existing mirrors are Telco's, ISP's or Universities, and whilst this is not a fixed requirement, they are our preferred mirror partners as we need to trust the provider.
If you meet the criteria above please drop an email with the offer to [email protected]
Australia
Digital Pacific
Belgium
Belnet
Bulgaria
Burgaslan
Czech Republic
Karneval
Mirrorbits supports detailed statistics on downloads and available mirrors. This information can be accessed by appending ?mirrorstats or ?mirrorlist to the download URL, e.g.
Global mirror statistics can be found here: https://releases.libreelec.tv/mirrorstats
To change the order of turning on your devices (normally your HTPC has to be powered on last) or to use your LibreELEC device without the TV turned on, you need to dump/save the EDID information from your TV (or AVR).
In the steps below we will explain how this can be done:
Note: Your devices should all be turned on and you should have a screen and audio working. Otherwise the EDID information isn't provided properly and this How-To won't work.
In the sections below we explain different ways to dump and use the EDID information. We also provide a script which performs the specific steps for the various devices automatically.
rsync://releases.libreelec.tv/releasesFrance
Reloumirrors
Germany
Friedrich-Alexander Universität
Germany
Heiko Richter
Germany
RWTH Aachen University
Greece
University of Crete
Netherlands
NLUUG
Netherlands
Serverion
Netherlands
WeAreTriple
Netherlands
Weppel
Portugal
University of Porto
Sweden
University of Umea
United Kingdom
UK2.net
United Kingdom
University of Warwick
United States
Limestone Networks
United States
Georgia Tech
THREADCOUNT
#,#%
100%
Maximum number of packages to build concurrently. On an 8-core system, 50% would build up to 4 packages at a time.
ONELOG
yes,no
no
If yes, packages will not create individual logs in ${THREAD_CONTROL}/logs. If THREADCOUNT is 1 the default becomes ONELOG=yes in which case use ONELOG=no to ensure individual logs are created for each package.
LOGCOMBINE
always,never,fail
always
Determine under what circumstances package logs are written to stdout. Using never and fail can slightly reduce IO.
MTBOOKENDS
yes,no
yes
Adds <<< and >>> tags to the combined log output (to facilitate searching).
DISABLE_COLORS
yes,no
no
Control whether build system output is colored or not.
MTCOLORS
always,never,auto
auto
If DISABLE_COLORS=yes this option controls how scripts/pkgbuilder.py progress and status information is colored. auto will disable colors when output is being redirected to a file (ie. not a terminal).
MTVERBOSE
yes,no
no
Output additional job state information to stderr during the build.
MTPROGRESS
yes,no
no
Output real-time load, memory and in-progress job information to stderr at 1-second intervals
MTDEBUG
yes,no
no
Output detailed debug information to ${THREAD_CONTROL}/debug.log
MTADDONBUILD
yes,no
no
If no, the build will end after the first failure. When building add-ons, we typically ignore individual package failures and continue building until all packages have been built (or failed).
MTIMMEDIATE
yes,no
no
When MTADDONBUILD=no and a package fails, the build can finish after all currently building packages have completed, or it can terminate those packages immediately. Allowing packages that are currently building to finish building can save time when restarting the build.
MTINTERVAL
#
60
System load information is captured at regular intervals in ${THREAD_CONTROL}/loadstats.
AUTOREMOVE
yes,no
no
Remove source code directories during the build once the source code directory is not required.
Options can be specified on the command line, or added to persistent "options" files located under the root folder of the buildsystem, e.g. ~/LibreELEC.tv/.libreelec/options or the users home folder, e.g. ~/.libreelec/options - if both files exist, home folder options trump root folder options. The following gives a fairly clean and comprehensive output while still allowing command-line overrides:
If you are building and sharing images via the LibreELEC forums it is good to include a custom "builder" name with your images. This allows the team to count the number of active installs using your images (we can share this info on request). Builder name also populates into /etc/os-release and logfiles, which helps forum staff supporting users differentiate between official releases and community created images. It is also possible to set custom versioning. e.g.
It is also possible to set persistent BUILDER_NAME and BUILDER_VERSION in "options" files.
The build-system automatically strips debug symbols from most packages. To disable this and include debug symbols and common debugging packages in the image, enable DEBUG, e.g.
To also include valgrind:
Note: The resulting image will be considerably larger than normal. The default boot partition is 512MB, but debug images may exceed this and require a 1GB partition.
To build using package source tarballs from a private GitHub repository the package.mk must be modified to use token authentication else wget requests made by the buildsystem are anonymous and package downloads will fail.
First obtain a personal access token from https://github.com/settings/tokens and add the token to the file .libreelec/options in the root folder of the buildsystem as shown below:
Now modify the package.mk for the package to include additional authentication data. In the example below we are downloading an archive using a githash for PKG_VERSION and with the PKG_SHA256 check disabled. The WGET_OPT line has been added, and the format of the URL used in PKG_URL has been tweaked to include ${TOKEN}:@ between URI and domain:
Should you need to use more than one token, create TOKEN2 and TOKEN3 etc. in the options file and reference them as variables in the package.mk files that require them.
LOGCOMBINE=${LOGCOMBINE:-never}
MTPROGRESS=${MTPROGRESS:-yes}
MTIMMEDIATE=${MTIMMEDIATE:-no}PROJECT=Generic ARCH=x86_64 BUILDER_NAME=yourname BUILDER_VERSION=123 make imagePROJECT=Generic ARCH=x86_64 DEBUG=yes make imagePROJECT=Generic ARCH=x86_64 DEBUG=yes VALGRIND=yes make imageTOKEN="ghp_aZBfIlA07M32p0Cy7i5hlaSzeZMZO40GuL7b"PKG_VERSION="501631d21b37c858f32a0f0d10237b14d1cd2224"
PKG_SHA256=""
WGET_OPT="--auth-no-challenge --header='Accept:application/octet-stream'"
PKG_URL="https://${TOKEN}:@github.com/LibreELEC/kernel/archive/${PKG_VERSION}.tar.gz"
PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz"Note: This script will also only work for Intel or nVidia based GPUs. AMD/ATI GPU's are not supported.
To use the getedid script you need to have SSH access to your LibreELEC machine.
Once you are in, just type in
to see which options are available. It will look like this.
The available options are create, gpu, delete and help. These are explained below.
This will show a help message and a little explanation for the specific options.
This will check which GPU you are using and you will either get "Intel", "NVidia" or "GPU is not supported" after running that command.
This will do all needed steps which are needed to dump the EDID for the GPU you are using. It first checks if the GPU is supported, then it checks if you already have done changes to the files which the script needs to change, too. If you already have done some changes to those files, the script will stop and you should dump the EDID manually. Those steps are explained in the other tabs. The reason for that is, that we can't know what you already have changed and therefore the script might do something horrible wrong and we don't want to break your system. As you already know how to edit those files it should not be that hard to do that again.
If the files are like they should be from a vanilla installation, the script does its thing and will do everything which is necessary and reboot your machine after everything is done as expected.
After that you shouldn't take care about the ordering how to turn on your devices, anymore. Your HTPC should also be turned on as the first device in the chain now.
This will delete all the created files from getedid create if you have used it before. After using getedid delete the default configuration is restored. No unneeded files on it, everything is like a vanilla installation and you have to take care about the ordering how to turn on your devices again.
For the source of that script please look at: https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/sysutils/busybox/scripts/getedid
First, you have to SSH in your LibreELEC machine. Then enter the following command.
Look for the connected device:
The information we need HDMI-A-2 is connected.
Now we will create a copy of the EDID binary data and put it where it needs to go. Change the cat command to match the active HDMI/DP port. For the possibility to copy and paste the correct commands, change the tabs below to the matching port.
HDMI-A-1
HDMI-A-2
Next a cpio archive file will be created which will be loaded at boot.
Now mount the boot partition as "RW" and move the file to it
After the file is moved to the correct place, we have to add some boot parameters. For this we have edit either the "extlinux.conf" or the "syslinux.cfg" file in your /flash/ directory. Use this command to check which one is available.
Search for "extlinux.conf" or "syslinux.cfg" and edit it. Only one of them is available.
syslinux.cfg
extlinux.conf
Note: If you are not using LibreELEC 9.0 or newer please use nano -w instead of nano
Add to the APPEND line the following things.
HDMI-A-1
The APPEND line should look this like this after (everything in a single line):
HDMI-A-2
The APPEND line should look this like this after (everything in a single line).
Last step is to reboot the device.
If you boot your nVidia GPU based LibreELEC box before the TV/AVR and you see a black screen on boot - follow this guide to create an edid.bin file that tricks Xorg into thinking the TV/AVR are powered on at boot time.
Note: This example will NOT work on Intel or AMD GPU's.
Open an SSH session to your LibreELEC machine. Once logged into the console we need to work out the DFP number.
You should see message like the following:
Note the DFP number - in this example it is "DFP-0" but yours may be different.
To extract EDID data we need we need to place Xorg into debug mode. First we stop Xorg.
Next we clone the xorg.conf to the config override location in /storage/.config.
Then we edit the file with sed to enable debug mode.
The device section in the modified file should look something like this.
Now restart Xorg.
Extract the RAW binary EDID information from the debug /var/log/Xog.0.log to a file.
The command should output something like.
Now we edit /storage/.config/xorg.conf - set ModeDebug back to False (edit the word true to false) and uncomment the following lines.
Make sure you change the DFP number to match the one we found earlier. In the end your config will look something like.
Finally we stop/restart xorg.service to disable debug mode and use the new edid.bin file.
If all has gone to plan Xorg now detects the EDID file and the order of powering on equipment no longer matters!
Amlogic legacy kernel devices (using 3.10, 3.14 kernels) do not capture "edid.bin" files like Intel and nVidia devices, but a similar process can capture, store and force the resolutions of a device. Connect your HTPC device directly to the HDMI source that you want to capture EDID information from, then login over SSH and run the following command.
This stores a list of the supported resolutions. It looks like
To remove or add specific resolutions, e.g. if 1080p24hz is missing, edit disp_cap.
Ctrl+o to save, Ctrl+x to exit the nano editor. Next restart Kodi by rebooting the box or running.
The getedid script can be used as described for Generic x86_64.



The LibreELEC "Generic" image supports a (very) broad range of x86_64 compatible hardware using AMD, Intel, and nVidia GPU hardware. The GPU in a device determines what media can be played using hardware decoding and modern features like HDR, and the CPU determines if any unsupported codecs can be software decoded for playback by ffmpeg.
HDR support in the Linux kernel, in Kodi, and in LibreELEC is ongoing "work in progress" that continues to evolve. HDR depends on a combination of the media format and colourspace properties, GPU hardware, HDMI output, and TV panel capabilities. Most users wrongly view HDR support like codec support, but it is significantly more complicated. Few people outside the broadcast media industry truly understand how it works (in theory and in practice) but we are fortunate to have users with that professional background providing testing and insightful feedback to the team as progress is made.
As GPU hardware is one of the major variables, please read the AMD, Intel, and nVidia GPU sections below for further information relevant to HDR support on that GPU type:
getedidtail /sys/class/drm/*/status==> /sys/class/drm/card0-HDMI-A-2/status <==
connectedmkdir -p /storage/.config/firmware/edidcat /sys/class/drm/card0-HDMI-A-1/edid > /storage/.config/firmware/edid/edid.bincat /sys/class/drm/card0-HDMI-A-2/edid > /storage/.config/firmware/edid/edid.bincd ~
mkdir -p cpio/lib/firmware/edid
cp .config/firmware/edid/edid.bin cpio/lib/firmware/edid/
cd cpio/
find . -print | cpio -ov -H newc > ../edid.cpiomount -o remount,rw /flash
mv ../edid.cpio /flash/ls /flash/nano /flash/syslinux.cfgnano /flash/extlinux.confinitrd=/edid.cpio drm.edid_firmware=edid/edid.bin video=HDMI-A-1:DAPPEND boot=LABEL=System disk=LABEL=Storage ssh quiet initrd=/edid.cpio drm.edid_firmware=edid/edid.bin video=HDMI-A-1:Dinitrd=/edid.cpio drm.edid_firmware=edid/edid.bin video=HDMI-A-2:DAPPEND boot=LABEL=System disk=LABEL=Storage ssh quiet drm.edid_firmware=edid/edid.bin video=HDMI-A-2:Drebootgrep ": connected" /var/log/Xorg.0.log | head -n 1 [3241512.110] (--) NVIDIA(0): SAMSUNG (DFP-0): connectedsystemctl stop xorg.servicecp /etc/X11/xorg-nvidia.conf /storage/.config/xorg.confsed -i 's/"ModeDebug" "false"/"ModeDebug" "true"/g' /storage/.config/xorg.confSection "Device"
Identifier "nvidia"
Driver "nvidia"
Option "DynamicTwinView" "False"
Option "NoFlip" "false"
Option "NoLogo" "true"
Option "ConnectToAcpid" "0"
Option "FlatPanelProperties" "Scaling = Native"
Option "ModeValidation" "NoVesaModes, NoXServerModes"
Option "HWCursor" "false"
Option "ModeDebug" "true"
EndSectionsystemctl start xorg.servicenvidia-xconfig --extract-edids-from-file=/var/log/Xorg.0.log --extract-edids-output-file=/storage/.config/edid.binFound 1 EDID in "/var/log/Xorg.0.log".
Wrote EDID for "ONK TX-NR616 (DFP-0)" to "/storage/.config/edid.bin" (256 bytes).Option "ConnectedMonitor" "DFP-0"
Option "CustomEDID" "DFP-0:/storage/.config/edid.bin"
Option "IgnoreEDID" "false"
Option "UseEDID" "true"Section "Device"
Identifier "nvidia"
Driver "nvidia"
Option "DynamicTwinView" "False"
Option "NoFlip" "false"
Option "NoLogo" "true"
Option "ConnectToAcpid" "0"
Option "FlatPanelProperties" "Scaling = Native"
Option "ModeValidation" "NoVesaModes, NoXServerModes"
Option "HWCursor" "false"
Option "ModeDebug" "false"
Option "ConnectedMonitor" "DFP-0"
Option "CustomEDID" "DFP-0:/storage/.config/edid.bin"
Option "IgnoreEDID" "false"
Option "UseEDID" "true"
EndSection
Section "Screen"
Identifier "screen"
Device "nvidia"
DefaultDepth 24
Option "ColorRange" "Full"
# Option "ColorRange" "Limited"
# Option "ColorSpace" "RGB"
SubSection "Display"
Depth 24
EndSubSection
EndSection
Section "Extensions"
Option "Composite" "false"
EndSectionsystemctl restart xorg.servicecat /sys/class/amhdmitx/amhdmitx0/disp_cap > /storage/.kodi/userdata/disp_cap480p60hz
480p_rpt
576p50hz
720p60hz
1080i60hz
1080p60hz
720p50hz
1080i50hz
1080p30hz
1080p50hz
1080p25hz
1080p24hz
2160p30hz
2160p25hz
2160p24hz
smpte24hz
smpte25hz
smpte30hz
smpte50hz
smpte60hz
smpte50hz420
smpte60hz420
2160p50hz
2160p60hz
2160p50hz420
2160p60hz420nano /storage/.kodi/userdata/disp_capsystemctl restart kodi
Intel NUC and similar-sized Intel GPU devices are popular for building an HTPC device around since they combine well supported upstream GPU drivers with entry level Celeron and Core i3 chips to intermediate Core i5 and high-end Core i7 CPUs.
Modern Intel GPUs have been shipping since "Nehalem" in 2010, and over time the number of different CPU and GPU generations and codenames have multiplied, making it confusing to figure out what media features a device can support. The following table is based on public sources like Wikipedia, and it indicates hardware features, which do not always translate into what Linux and Kodi currently support in software:
Gen1
Nehalem
i965
Yes
No
No
Gen6 CPUs (Skylake) have HDMI 1.4b and DisplayPort 1.2 connectors. HDMI can run at max 1920x1200@60 resolution, while DP can run at max 3840x2160@60 resolution.
Gen7 and Gen8 CPUs use an LSPCON chip for HDMI 2.0 output. HDR is supported only when the HDMI output is connected to an HDMI 2.0 port on the TV. Users with Intel NUC devices are recommended to run the latest Intel firmware for their device. Lots of bugs in original/factory LSPCON firmwares have been fixed.
Linux supports LSPCON chips for HDR from Linux 5.12 onwards
Linux has full support for Tiger-Lake CPUs from Linux 5.12 onwards
Intel GPUs are known as Integrated graphics processors (IGPs) and are embedded within the CPU core. Each CPU generation uses a single GPU generation but the generation ID's do not match, e.g. Gen10 CPUs have Gen11 GPUs.
LibreELEC 10.0 shipped with Linux 5.10 kernel support and Xorg graphics, so it does not have support for HDR or Gen11 hardware. Community created LibreELEC 10.0 images with newer Linux kernels supporting Gen11 hardware andGBM graphics with experimental HDR patches can be downloaded from the LibreELEC forums. LibreELEC 11.0 use GBM graphics, include Kodi 20.0 support for HDR, and an updated kernel supporting Gen11, Gen12 hardware.
AMD GPUs are a popular option for users building custom HTPCs from motherboards without onboard Intel graphics. LibreELEC embeds two AMD drivers: radeon is used with older cards, and amdgpu is used with newer cards (starting from the 'Southern Islands' family).
Determining media features (H264, HEVC, AV1, 4K, 4K60, HDR, etc.) is complicated due to the sheer number of different AMD cards available. Each new GPU generation ships with low-end cards limited in capabilities, and high-end cards with multiple connectors. Media features like 4K and HDR also have a dependency on connectors (HDMI or DisplayPort) and the standards the connectors support. For example, some cards support HDMI 1.4b and a max resolution of up to 3840x2160@30 with 8-bit HDR output, while cards with DisplayPort 1.4 or HDMI 2.0 may support up to 3840x2160@60 with 10-bit output.
The most accurate source of information is https://www.x.org/wiki/RadeonFeature
LibreELEC v7.x - v10.x include two different nVidia GPU drivers; a "legacy" driver (340.xx) and the latest stable driver. The drivers provide OpenGL support via Xorg so Kodi can display a GUI on-screen, and Kodi supportsVDPAU hardware decoding of H264 and some older SD era media codecs for efficient playback. Newer nVidia cards support 4K resolutions and NVDEC hardware decoding, but Kodi does not support NVDEC, and while Kodi can output 4K, nVidia VDPAU drivers have no support for HEVC or VP9 (the formats used with most 4K media) and there is no support for HDR. It is no surprise that project active-install stats show most nVidia installs are using the legacy nVidia driver, and the number of installs continues to decline over time: which means LibreELEC users are replacing older nVidia devices with something that does not use an nVidia GPU. This trend is not new and influences our technical decisions:
LibreELEC v11.x has switched "Generic" from Xorg OpenGL graphics to the Mesa OpenGL and the same DRM PRIME video stack used with ARM SoC devices.
A "Generic_Legacy" image using Xorg is available, but if "GBM" image development continues to progress well our intention is to drop the legacy image in the future (and with it, nVidia support). In lieu of this:
The team does not recommend users purchase nVidia hardware for use with Kodi
LibreELEC v11.x "GBM" images are built with Mesa nouveau OpenGL support so nVidia users who upgrade will see Kodi on-screen. However nouveau has no ability to "reclock" modern nVidia GPUs so the card runs at its lowest clock frequency and performance is bad (too bad to be useful). This issue is caused by nVidia requiring the use of signed (closed-source) firmware to interact with newer card generations, and it is a problem with all modern nVidia cards and all Linux distributions. It means the nouveau driver only works with very old nVidia cards, and is not a long-term solution for nVidia support in LibreELEC.
Update (Oct 2021): nVidia has announced the latest drivers support GBM and Mesa. This will allow Kodi to render the GUI via Mesa OpenGL. It removes one technical blocker to LibreELEC supporting newer nVidia devices in future releases. However, it is not the only blocker. The latest driver uses NVDEC for hardware decoding so either Kodi would need to add support for NVDEC or nVidia would need to support VAAPI which is used by Intel and AMD. In theory NVDEC is not a big technical challenge to implement, but Team Kodi has an established policy of refusing to include more/new proprietary hardware-decoding APIs that complicate code maintenance. So far nobody on the current Kodi staff has volunteered to implement NVDEC support and run the gauntlet of getting it accepted and merged. Even if an attempt was successful (which is unlikely) it would not benefit the majority of LibreELEC users with older nVidia cards which still depend upon the legacy driver and VDPAU decoding. So the latest drivers and NVDEC support are not the long-term solution for nVidia support in LibreELEC either.
NB: If (when) LibreELEC drops support for Xorg and nVidia users, it does not mean Kodi has dropped support. nVidia users can continue to use their nVidia card with Xorg and any desktop Linux distro that supports Kodi (Arch, Debian, Ubuntu, etc.) - although the long-term trend with desktop distros is to move away from Xorg to Wayland (which depends on Mesa) so the trend there is against nVidia too. In lieu of this, we say again:
The team does not recommend users purchase nVidia hardware for use with Kodi
Despite the range of devices that Generic x86_64 images can run on, team development and testing has always been focused on current and recent hardware packaged for use as HTPC devices. Users frequently mistake the minimalist nature of LibreELEC as perfect for recycling an older device (laptops with a broken screen are a recurring theme) into a media player. You might be able to boot LibreELEC, but we are often missing hardware drivers for old hardware and the overall playback performance (and power consumption) of first generation Raspberry Pi boards is often way (way) better. As a general rule, project staff view any hardware over 7-8 years old as legacy hardware. If you do need to use legacy hardware; use an era-appropriate LibreELEC (or OpenELEC) image.
Support for i386 hardware was dropped between OpenELEC v5.x and v6.x in 2015 due to low numbers of users, and LibreELEC has no interest in resurrecting support. It is still technically possible to hack/restore i386 support into our buildsystem and self-build an i386 image since we support 32-bit ARM SoC devices and use 32-bit userspace with 64-bit ARM SoCs so most packages in are still 32-bit compilable with little or no tweaking. However, there are still a few packages that do need tweaking to restore i386 support, and there is no HOWTO guide that you can follow. Some users enjoy the intellectual challenge of figuring out how to restore i386 support, but i386 hardware is super low-spec for modern Kodi use and our recommendation is to invest in a Raspberry Pi board instead of spending tens or hundreds of hours on codebase archaeology. An inexpensive Pi board will give a better overall result, costs less to run, and be zero hassle to maintain over time.
No
No
Gen2
Sandy-bridge
i965
Yes
No
No
No
No
Gen3
Ivy-Bridge
i965
Yes
No
No
No
No
Gen4
Haswell
i965
Yes
No
No
No
No
Gen5
Broadwell, Braswell
i915
Yes
No
No
No
No
Gen6
Skylake
i915
Yes
Yes
No
DP
No
Gen7
Kaby-lake, Apollo-lake
i915
Yes
Yes
No
Yes
HDMI
Gen8
Coffee-lake, Kaby-lake refresh, Whiskey-lake
i915
Yes
Yes
No
Yes
HDMI
Gen9
Coffee-lake refresh
i915
Yes
Yes
No
Yes
HDMI
Gen10
Comet-lake, Ice-lake, Amber-lake
i915
Yes
Yes
No
Yes
Yes
Gen11
Rocket-lake, Tiger-lake
i915
Yes
Yes
Yes
Yes
Yes
Gen12
Alder-lake
i915
Yes
Yes
Yes
Yes
Yes
Gen13
Raptor-lake
i915
Yes
Yes
Yes
Yes
Yes
12.0.2
Stable
12.0.1
Stable
12.0.0
Stable
11.0.3
Stable
11.0.2
Not released (skipped)
-
11.0.1
Stable
11.0.0
Stable
10.0.0
Stable
9.2.8
Hotfix
9.2.7
Hotfix
9.2.6
Stable
9.2.5
Hotfix
9.0.2
Stable
9.0.1
Stable
9.0.0
Stable
8.95.003
Beta
8.2.5
Stable
8.2.4
Stable
8.2.3
Stable
8.2.2
Stable
8.0.2
Stable
8.0.1
Stable
8.0.0
Stable
7.95.3
Beta
7.0.3
Stable
7.0.2
Stable
7.0.1
Stable
7.0.0
Stable
LibreELEC releases start at 7.0.0 after the project forked from OpenELEC. The team chose to continue the existing numbering scheme.

9.2.4
Stable
9.2.3
Stable
9.2.2
Hotfix
9.2.1
Stable
9.2.0
Stable
9.1.502
Beta
9.1.501
Beta
9.1.002
Alpha
9.1.001
Alpha
8.95.002
Beta
8.95.001
Beta
8.90.009
Alpha
8.90.008
Alpha
8.90.007
Alpha
8.90.006
Alpha
8.90.005
Alpha
8.90.004
Alpha
8.90.003
Alpha
8.2.1
Stable
8.2.0
Stable
8.1.2
Beta
8.1.1
Beta
8.1.0
Beta
7.95.2
Beta
7.95.1
Beta
7.90.010
Alpha
7.90.009
Alpha
7.90.008
Alpha
7.90.007
Alpha
7.90.006
Alpha

Modern Linux kernels (used in LibreELEC) have built-in support for IR remotes. IR signals are decoded by the kernel and programs see button presses from IR remotes in the same way as key presses from a keyboard, as Linux input events. This supersedes the older LIRC approach where a separate program, lircd, decodes IR signals and programs obtain button presses from a socket as LIRC events.
However, Kodi's remote handling was built for LIRC so LibreELEC runs the eventlircd service in the background to translate Linux input events into LIRC events. So "under the hood" the kernel scheme is being used, but remote buttons are still handled as LIRC events in Kodi.
Kodi translates the received LIRC events to Kodi button names via Lircmap.xml and then buttons are mapped to Kodi actions via remote.xml and keyboard.xml files. This wiki page describes LibreELEC configuration. Information on Kodi configuration is available in the and wiki pages.
Note that LIRC requires compatible hardware to decode IR signals. An in-depth discussion of IR decoder hardware is outside the scope of this document. On a Raspberry Pi, LibreELEC can use the GPIO pins to communicate with a hardware IR receiver diode, as long as config.txt has been suitably modified to enable GPIO support.
Like most modern Linux distros LibreELEC uses ir-keytable to configure Infra-Red remotes. Each IR receiver kernel driver installs a default keytable which specifies the IR protocol to use, e.g. RC5, RC6, NEC, and the scancode to Linux keycode mappings.
Most universal receivers work with the rc-rc6-mce table so RC6 MCE remotes can be used without further configuration. Drivers for DVB devices sold with a remote usually install their own keytable, e.g. the Hauppauge remote that came with a Hauppauge DVB stick.
After the kernel driver is loaded ir-keytable -a is automatically run to change the kernel default configuration. First /etc/rc_maps.cfg determines which keytable to load. Then the corresponding keytable file from /usr/lib/udev/rc_keymaps is used to configure the remote control driver.
As most of the LibreELEC filesystem is read-only, we use a system of boot-time file overrides to read user-created configuration from the persistent /storage area:
/storage/.config/rc_maps.cfg overrides /etc/rc_maps.cfg
/storage/.config/rc_maps.cfg.sample has simple examples
/storage/.config/rc_keymaps overrides /usr/lib/udev/rc_keymaps
The default libreelec_multi keytable allows us to support Xbox 360/One remotes "out of box" in addition to MCE/RC6 remotes. This is configured via the following change:
While most IR receivers can be used with a large variety of remotes the answer to “Can I use remote X with IR receiver Y?” depends on many factors:
Some IR receivers cannot be configured and you can only use the remote they came with.
Some receivers only support a subset of protocols, e.g. only RC5, not RC6.
If a remote uses a protocol not supported by the IR receiver, or a protocol not supported by the Linux kernel, the last option is the RAW (lirc) protocol which allows userspace LIRC to be configured though a custom lirc.conf file.
LibreELEC ships with 100+ remote keytable files so there is a good chance of finding an existing remote configuration that works, or a partially working keytable that can be used as a starting point for adding the missing buttons (see the "Advanced" section).
Look at the keytable files in /usr/lib/udev/rc_keymaps/
If one of the filenames suggests it could match your remote, try using it
If it doesn't work, keep trying..
To test a different keytable file run ir-keytable -c -w /path/to/keytable-file e.g.
If the output ends with these lines the protocol is not supported by the IR receiver:
If the keytable loaded without errors try pressing the up, down, left, right and OK buttons to see if GUI navigation in Kodi works?
If you find a working keytable make the config persistent by creating /storage/.config/rc_maps.cfg with the name of the keytable, e.g. if the samsung keytable works, create rc_maps.cfg with:
Then run ir-keytable -a /storage/.config/rc_maps.cfg and the output should look like:
Test the buttons work again, and if all is okay, you can reboot.
If you cannot find a working keymap or the current keymap has missing buttons you can create your own. Since LibreELEC 10.x the keytable file is plain text file in toml markup format. The first section describes the name of the keymap (free text, but avoid special characters and spaces) and the remote protocol and variant. This is followed by lines that map the remote scancode to a Linux keycode. A typical keytable file in toml format looks like this:
To capture the keycodes you must stop Kodi and eventlircd first, or these services capture IR input and you will see no output from ir-keytable:
Next we have to identify the IR protocol. If you found a partially working keytable file (with the protocol listed in the header) you can skip this step. First we run ir-keytable to find out which protocols the receiver driver supports. Look at the Supported protocols: line, e.g.
Run ir-keytable -p PROTOCOL -t and press buttons on the remote. If you discover the correct protocol you will see EV_MSC events and the scancode of the button pressed, e.g.
If you see no events stop ir-keytable with CTRL-C and try another protocol from the list. You can ignore lirc as this is not a real protocol.
Once you find the correct IR protocol create /storage/.config/rc_keymaps/custom_remote and set the header file. In the example above the protocol is rc-5 so we set:
If you found a partially working keytable, clone it and then edit the header to say custom_remote:
Next we capture the scancodes and document the keycode mapping. Some users find it easiest to open two SSH connections; one to see ir-keytable scancode output in, and one so they can copy/paste scancodes directly into the custom_remote keytable file, e.g. in one open the nano editor:
And in the second run ir-keytable -t to find out the scancode of each button. For each button do the following:
Press a button and note the scancode (the 0x… value after scancode:)
Add a new line with the scancode (including 0x).
Add the Linux keycode in "quoted" format and separated with a blank.
You can get a list of all supported Linux keycodes via irrecord -l | grep ^KEY but it is easiest to use keycodes listed in the <remote device=“devinput”> section of /usr/share/kodi/system/Lircmap.xml else you must also create a Kodi lircmap.xml with Linux keycode to action mappings.
The table below has a selection of common keycodes:
Once you are finished with the keytable, save the file, stop ir-keytable -t with CTRL-C and then restart it with the keytable file:
Now run ir-keytable -t and press buttons. In addition to EV_MSC scancode events you should now see EV_KEY events, e.g.
If the test is successful, make the keytable persistent by creating /storage/.config/rc_maps.cfg with the following content:
Reboot and you should have a working remote in Kodi.
Check the obvious. Batteries run down and either stop the remote from working or reduce the working range. Try using the remote in-front of the receiver. You can also try pointing the IR transmitter at the sensor of a digital camera or smartphone in a dark room. If the IR transmitter works you should see it light up the camera/smartphone screen.
If the remote is sending signals, there are several steps until a button press on your remote triggers an action in Kodi. Use this guide to check each step and trace the problem:
To check if the IR receiver driver is loaded run ir-keytable. If you see the error message /sys/class/rc/: No such file or directory no driver is loaded.
To check if the IR receiver is receiving any signals, see if ir-keytable shows lirc as a supported protocol. If yes, run ir-ctl -r to show raw, undecoded signals from the receiver. If IR reception works you will see lots of pulse and space lines when pressing a button. Note: On kernels before 4.3 lirc may be listed in Supported protocols but not in Enabled protocols. In this case run ir-keytable -p lirc to enable it first (remembering this will disable other decoders).
To check if lircd is running run ir-keytable. If only lirc shows up in Enabled protocols: lircd is running. When it starts it disables all other protocols). You can also run ps | grep /usr/sbin/lircd to check for /usr/sbin/lircd and /usr/sbin/lircd-uinput processes. If you see them LIRC enabled. If LIRC is enabled, disable it in LibreELEC Settings > Services and reboot.
To check if the correct keytable is loaded run ir-keytable -r to show the current keytable and protocol. Compare this to the header in /storage/.config/rc_keymaps/custom_remote and check /storage/.config/rc_maps.cfg references the correct keytable name.
To check if IR decoding works correctly stop Kodi and eventlircd:
Then run ir-keytable -t and press buttons on the remote. You should see EV_MSC events with the scancode and EV_KEY events with the Linux keycode, e.g.
If you only get EV_MSC but no EV_KEY events, verify if the correct keytable is configured.
After this test, restart eventlircd and Kodi (or reboot):
To check if eventlircd translates the input events to LIRC events run irw to show the translated LIRC events Kodi sees. When pressing a button you should see messages like this:
To check if Kodi receives the translated LIRC events enable debug logging in System Settings > Logging then watch the logfile:
When you press a button you should see log entries with LIRC: Update like this:
The LIRC line indicates Kodi received the LIRC event. The OnKey: line shows the action generated after applying Lircmap.xml and remote.xml. If you see LIRC lines but incorrect actions, check your Kodi Lircmap.xml and remote.xml config files are correct.
USB data transfers can interfere with GPIO IR receivers on Raspberry Pi 0/1/2/3 hardware, and since Ethernet is internally connected via USB playing large movies from a NAS can exhibit the problem. This is a known issue: and there is nothing we can do. Common workarounds are to use a USB IR receiver like or CEC.
Most remotes are now supported by the Linux kernel but "LIRC" (the userspace lircd daemon and tools) is still useful for handling unusual remotes with odd protocols and no kernel drivers. Since LibreELEC 8.2.0 LIRC is disabled by default, but can be enabled in LibreELEC Settings > Services > Lirc. Configuration is handled in (almost) the same way as most desktop Linux distros:
The /etc/lirc/lirc_options.conf file configures the default LIRC driver and /dev/lirc0.
The /etc/lirc/lircd.conf file includes remote configs for MCE, Xbox 360, Xbox One, and a few others.
The embedded files can be overridden at boot time by creating /storage/.config/lircd.conf and /storage/.config/lirc_options.conf with needed changes.
In LibreELEC lircd-uinput reads decoded LIRC events from /run/lirc/lircd.socket and translates these to Linux input events via the Linux uinput driver. The Linux input events from lircd-uinput are then picked up by eventlircd and fed to Kodi as LIRC events via the /run/lirc/lircd socket.
It might seem odd to translate between LIRC, Linux input and (again) LIRC events, but Kodi can only receive LIRC events on a single LIRC socket, and this allows eventlircd to collect all remote events and feed them to Kodi so we can support LIRC-decoded and kernel-decoded remotes without needing user input or complex scripts to change the configuration.
To use LIRC with an IR receiver that supports in-kernel decoding it's best to disable ir-keytable auto configuration with an empty rc_maps.cfg file:
Although lircd disables all remote protocols (and thus in-kernel decoding) on startup ir-keytable auto-configuration runs in parallel, and if it happens to run after lircd starts it can re-enable in-kernel decoding. This causes duplicate decoding as both lircd and kernel will receive and process the IR signals. This issue is often intermittent since it depends on the timing of lircd start. Sometimes lircd will run after ir-keytable and in-kernel decoding is disabled as expected.
Note: If you stop or disable LIRC in LibreELEC Settings you will need too reboot or set ir-keytable manually from the SSH console. Disabling LIRC does not automatically re-enable in-kernel decoding.
Older LibreELEC releases used atvclient to support the Apple IR sensor and send LIRC events to Kodi. Since 9.2.0 we use the native Linux kernel driver for the IR sensor, which sends normal HID events. Create a custom keymap in /storage/.kodi/userdata/keymaps/keymap.xml with the following content to map a White or Silver remote:
/etc/rc_maps.cfg uses the libreelec_multi keytable instead of rc6_mce
KEY_ZOOM
KEY_2
KEY_DOWN
KEY_REWIND
KEY_ANGLE
KEY_3
KEY_OK
KEY_VOLUMEUP
KEY_MUTE
KEY_4
KEY_ENTER
KEY_VOLUMEDOWN
KEY_POWER
KEY_5
KEY_SELECT
KEY_CHANNELUP
KEY_SLEEP
KEY_6
KEY_DELETE
KEY_CHANNELDOWN
KEY_WAKEUP
KEY_7
KEY_ESC
KEY_PAGEUP
KEY_EJECTCD
KEY_8
KEY_MEDIA
KEY_PAGEDOWN
KEY_EJECTCLOSECD
KEY_9
KEY_HOME
KEY_NEXT
KEY_DVD
KEY_0
KEY_EXIT
KEY_NEXTSONG
KEY_MENU
KEY_NUMERIC_STAR
KEY_BACK
KEY_PREVIOUS
KEY_VIDEO
KEY_NUMERIC_POUND
KEY_BACKSPACE
KEY_PREVIOUSSONG
KEY_AUDIO
KEY_RED
KEY_ESC
KEY_EPG
KEY_MP3
KEY_GREEN
KEY_RECORD
KEY_TITLE
KEY_CAMERA
KEY_BLUE
KEY_PLAY
KEY_TV2
KEY_IMAGES
KEY PVR
KEY_PLAYPAUSE
KEY_CONTEXT_MENU
KEY_TUNER
KEY_RADIO
KEY_PAUSE
KEY_SUBTITLE
KEY_TV
KEY_STOP
KEY_LANGUAGE
KEY_PVR
KEY_LEFT
KEY_STOPCD
KEY_INFO
KEY_TEXT
KEY_RIGHT
KEY_FASTFORWARD
KEY_PROPS
KEY_1
KEY_UP
KEY_FORWARD
# use combined multi-table on MCE receivers
#* rc-rc6-mce rc6_mce
* rc-rc6-mce libreelec_multiLibreELEC:~ # ir-keytable -c -w /usr/lib/udev/rc_keymaps/samsung
Read samsung table
Old keytable cleared
Wrote 30 keycode(s) to driver
Protocols changed to necInvalid protocols selected
Couldn't change the IR protocols* * samsungLibreELEC:~ # ir-keytable -a /storage/.config/rc_maps.cfg
Old keytable cleared
Wrote 30 keycode(s) to driver
Protocols changed to nec[[protocols]]
name = "khadas"
protocol = "nec"
variant = "nec"
[protocols.scancodes]
0x14 = "KEY_POWER"
0x03 = "KEY_UP"
0x02 = "KEY_DOWN"
0x0e = "KEY_LEFT"
0x1a = "KEY_RIGHT"
0x07 = "KEY_OK"
0x01 = "KEY_BACK"
0x5b = "KEY_MUTE"
0x13 = "KEY_MENU"
0x58 = "KEY_VOLUMEDOWN"
0x0b = "KEY_VOLUMEUP"
0x48 = "KEY_HOME"systemctl stop kodi
systemctl stop eventlircdLibreELEC:~ # ir-keytable
Found /sys/class/rc/rc0/ (/dev/input/event1) with:
Driver gpio-rc-recv, table rc-rc6-mce
Supported protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp
Enabled protocols: lirc nec rc-6
Name: gpio_ir_recv
bus: 25, vendor/product: 0001:0001, version: 0x0100
Repeat delay = 500 ms, repeat period = 125 msLibreELEC:~ # ir-keytable -p rc-5 -t
Protocols changed to rc-5
Testing events. Please, press CTRL-C to abort.
1503592437.660155: event type EV_MSC(0x04): scancode = 0x101a
1503592437.660155: event type EV_SYN(0x00).
1503592437.774129: event type EV_MSC(0x04): scancode = 0x101a
1503592437.774129: event type EV_SYN(0x00).
1503592437.921009: event type EV_MSC(0x04): scancode = 0x101a# table custom_remote, type: rc-5cp /usr/lib/udev/rc_keymaps/samsung /storage/.config/rc_keymaps/custom_remotenano /storage/.config/rc_keymaps/custom_remoteLibreELEC:~ # ir-keytable -c -w /storage/.config/rc_keymaps/custom_remote
Read justboom table
Old keytable cleared
Wrote 12 keycode(s) to driver
Protocols changed to rc-5LibreELEC:~ # ir-keytable -t
Testing events. Please, press CTRL-C to abort.
1503599395.150849: event type EV_MSC(0x04): scancode = 0x1019
1503599395.150849: event type EV_KEY(0x01) key_down: KEY_VOLUMEUP(0x0073)
1503599395.150849: event type EV_SYN(0x00).
1503599395.264827: event type EV_MSC(0x04): scancode = 0x1019
1503599395.264827: event type EV_SYN(0x00).
1503599395.413668: event type EV_MSC(0x04): scancode = 0x1019
1503599395.413668: event type EV_SYN(0x00).
1503599395.673626: event type EV_KEY(0x01) key_up: KEY_VOLUMEUP(0x0073)
1503599395.673626: event type EV_SYN(0x00).* * custom_remotesystemctl stop kodi
systemctl stop eventlircdLibreELEC:~ # ir-keytable -t
Testing events. Please, press CTRL-C to abort.
1503599395.150849: event type EV_MSC(0x04): scancode = 0x1019
1503599395.150849: event type EV_KEY(0x01) key_down: KEY_VOLUMEUP(0x0073)systemctl start eventlircd
systemctl start kodiLibreELEC:~ # irw
72 0 KEY_VOLUMEDOWN devinput
72 1 KEY_VOLUMEDOWN devinput
72 2 KEY_VOLUMEDOWN devinputtail -f /storage/.kodi/temp/kodi.log21:55:33.891 T:1945866240 DEBUG: LIRC: Update - NEW at 60659:6c 0 KEY_DOWN devinput (KEY_DOWN)
21:55:33.891 T:1945866240 DEBUG: OnKey: 167 (0xa7, obc88) pressed, action is Downtouch /storage/.config/rc_maps.cfg<keymap>
<global>
<keyboard>
<browser_back>Left</browser_back>
<browser_forward>Right</browser_forward>
<volume_up>Up</volume_up>
<volume_down>Down</volume_down>
<key id="61952">Back</key>
</keyboard>
</global>
<Visualisation>
<keyboard>
<volume_up>VolumeUp</volume_up>
<volume_down>VolumeDown</volume_down>
</keyboard>
</Visualisation>
<FullscreenVideo>
<keyboard>
<volume_up>VolumeUp</volume_up>
<volume_down>VolumeDown</volume_down>
</keyboard>
</FullscreenVideo>
</keymap>