The Raspberry Pi is at the time of this writing (November 2022) very difficult to get. And if you can get one, it sometimes comes at an absurd price. I've seen prices of €250+ for a Raspberry Pi 3B+!!! That's just pure theft and has nothing to do anymore with shortage of chips on the world market.
But I recently stumbled upon an alternative which is much cheaper and -maybe even more important - much more available. The name? Libre Computer.
It gets even better when I saw it has the exact same form factor as the Raspberry Pi! It also has the 40 pin header although the pins are not matching the pins of the Raspberry Pi and they seem to use an own wiring numbering. I'm still on the discovering tool, so I think I have to find it out myself.
There are 5 versions of the Libre Computer:
Tritium, based on a AllWinner SoC with a quad core ARM Cortex-A7 or quad core ARM Cortex-A53 CPU
The Tritium has 3 different flavours.
Le Potato, based on the AML (Am Logic) S905X SoC with a quad core ARM Cortex-A53 CPU running @ 1.51GHz and can have a max. of 2GB RAM
La Frite (what's in a name...), based also on the AML (Am Logic) Soc, but this time the S805C Soc with also a quad core Cortex-A53 CPU running @ 1.2GHz and can have a max. of 1GB RAM
Renegade, based on the RockChip RK3328 SoC with a quad core ARM Cortex-A53 CPU running @ 1.4GHz and can have a max. of 4GB RAM
Renegade Elite, based on the RockChip RK3399 SoC with a dual core ARM Cortex-A72 and a quad core ARM Cortex-A53 CPU and has 4GB of RAM. It's also the only one in the family that has USB 3.0 on board
The Renegade versions are the only ones that have USB 3.0 on board and have a gigabit ethernet connection.
You can see an overview of the different versions on the Libre Computer website.
To see a comparison between the different boards, visit this webpage.
The Libre Computer version "Le Potato" is the flagship. It's also the one I bought recently. See further.
It has the following specs (more detailed info can be found on the link given above):
Amlogic S905X SoC
4 ARM Cortex-A53 @ 1.512GHz
Cryptography Extension
2G + 3P ARM Mali-450 @ 750MHz
OpenGL ES 1.1 / 2.0
OpenVG 1.1
Amlogic Video Engine 10
Decoders
VP9 P2 4K60
H.265 MP10 @L5.1 4K60
H.264 HP @L5.1 4K30
JPEG / MJPEG
Encoders
H.264 1080P60
JPEG
Up to 2GB DDR3 SDRAM
4 USB 2.0 Type A
100 Mb Fast Ethernet
3.5mm TRRS AV Jack
HDMI 2.0
MicroUSB Power In
MicroSD Card Slot
eMMC Interface
IR Receiver
U-Boot Button
40 Pin Low Speed Header (PWM, I2C, SPI, GPIO)
Audio Headers (I2S, ADC, SPDIF)
UART Header
Yes, you read it right: up to 2GB of DDR3 SRAM, so double the size of a Raspberry Pi 3B+.
The only drawback: it has no WiFi or Bluetooth on board. But for me, I don't care since I don't use that anyway.
Price? Well, as of November 18th, 2022 it's only $US35 for the 2GB version! Unfortunately, it has to come from the US, so you also have to add shipment costs + VAT to it, making it still rather cheap: some $US55 for one board. But then you get 2GB of RAM, a faster running board, less power consumption compared to the Raspberry Pi 3B+ and so on.
Beware: there's a dedicated image availble for this SBC. You can't just flash the Raspbian Lite image to it, since it's another processor that is used on the SBC board.
For the rest, I hope it will be compatible to a certain (high) degree, but that's still to be found out.
Activating a functionality on a Libre Computer is slightly (well, a lot) different compared to a Raspberry Pi. While for the Raspberry Pi it's sufficient to add a dtoverlay line into the /boot/config.txt file to activate a functionality (e.g. I2C, or the I2C mux PCA9548), that's not working for Le Potato. The config file is something dedicated for the Raspberry Pi and doesn't work on any other SBC.
For example, if you run raspi-config on a Le Potato then you can activate e.g. I2C but nothing happens in the background. You might think I2C is activated, but it's not. When you search for an I2C device in the device directory /dev you won't find any!
No worries, though. There's also the possibility to activate things in Le Potato. Only, the way to reach the goal is different. Below is explained how you can achieve this for I2C (but other functionality like SPI should be similar).
LibreComputer has something called Libretech Wiring Tool, a GitHub repository which can be found here. This tool serves two goals:
Activating/installing device tree overlays through the tool ldto (libre device tree overlay)
Manipulating GPIO pins through the tool lgpio (libre general purpose input output)
The tools are installed in /opt/librecomputer/libretech-wiring-tool/ through a couple of links:
It all starts with /usr/bin where there's a ldto and lgpio:
ldto is linked to /etc/alternatives/ldto
lgpio is linked to /etc/alternatives/lgpio
In the /etc/alternatives directory there's again links to another destination:
ldto is linked to /opt/librecomputer/libretech-wiring-tool/ldto
lgpio is linked to /opt/librecomputer/libretech-wiring-tool/lgpio
That's the final destination. So, when running the command ldto or lgpio you end up in the /opt/librecomputer/libretech-wiring-tool directory.
How to (de)activate I2C DTs?
Run the command ldto list => an overview of possible DTOs will be shown
Choose a DTO, e.g. i2c-ao and load that one: sudo ldto enable i2c-ao
From here onwards, you should have an I2C device in the device tree: /dev/i2c-0 (should be detected by e.g. the i2cdetect -l command)
Same way of working is to be applied for the other DTOs.
To compile a device tree source into a device tree object, the following steps have to be taken:
Clone the Libre Wiring Tool on the Le Potato board:
git clone https://github.com/libre-computer-project/libretech-wiring-tool.git
Go to the directory libretech-wiring-tool and run the command make.
If you want a clean start, run make clean first.
This command will remove all .dbto files from the subdirectory ./libre-computer/<processor>/dt.
In case of Le Potato that is the subdirectory ./libre-computer/aml-s905x-cc/dt
Once all the DTS files are compiled into DTO files, they still have to be installed in the directory
/opt/librecomputer/libretech-wiring-tool/.
To accomplish this, the following command must be run: sudo make install
This will update all the .dtbo files into the beforementioned directory.
If the installation is done, you can again use ldto to see a list of updated/added devices.
Now that we know how the device tree works on a Le Potato and how to compile a DTS into a DTO, we can try to add the I2C mux PCA9548 to the system just like we can for the Raspberry Pi.
First, we have to create a DTS file for the PCA9548. We will name the file i2c-ao-pca9548.dts. The file should be put in the directory ./libre-computer/aml-s905x-cc/dt. This is a subdirectory of the libretech-wiring-tool Github repository already downloaded (see section above).
Below is the source file:
/*
* Author: Geert Vancompernolle
*/
/*
* Overlay to add the PCA9548 I2C mux (or equivalent) to the system giving the user an extra
* 8 I2C busses /dev/i2c-1 .. /dev/i2c-8.
* Default address of the I2C mux = 0x70 (all 3 address pins grounded).
*/
/dts-v1/;
/plugin/;
/{
compatible = "libretech,cc", "amlogic,s905x", "amlogic,meson-gxl";
fragment@1 {
target = <&i2c_AO>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
pca9548: mux@70 {
compatible = "nxp,pca9548";
reg = <0x70>;
#address-cells = <1>;
#size-cells = <0>;
i2c@0 {
#address-cells = <1>;
#size-cells = <0>;
reg = <0>;
};
i2c@1 {
#address-cells = <1>;
#size-cells = <0>;
reg = <1>;
};
i2c@2 {
#address-cells = <1>;
#size-cells = <0>;
reg = <2>;
};
i2c@3 {
#address-cells = <1>;
#size-cells = <0>;
reg = <3>;
};
i2c@4 {
#address-cells = <1>;
#size-cells = <0>;
reg = <4>;
};
i2c@5 {
#address-cells = <1>;
#size-cells = <0>;
reg = <5>;
};
i2c@6 {
#address-cells = <1>;
#size-cells = <0>;
reg = <6>;
};
i2c@7 {
#address-cells = <1>;
#size-cells = <0>;
reg = <7>;
};
};
};
};
__overrides__ {
addr = <&pca9548>,"reg:0";
bus = <&i2c_AO>,"reg:0";
};
};
This will create an I2C mux on address 0x70 and will activate the code which is standard available in the Linux kernel so that at start up the kernel will sense if there's such device connected to the I2C bus and will install the functionality of it so that we have an extra 8 (!!!) I2C busses available.
Once we have the file and we have not done it yet, we move it into the ./libre-computer/aml-s905x-cc/dt subdirectory of the libretech-wiring-tool we cloned from the GitHub web site.
Then run the command make from within the source root directory of the Libretech Wiring Tool directory. Once the make is finished, you should see an extra .dbto file added into the ./libre-computer/aml-s905x-cc/dt directory called i2c-ao-pca9548.dtbo. dtbo stands for device tree binary object, by the way.
The last step is to install all dtbo files using the command sudo make install.
Once the installation is done, run the command ldto list again and now you should see that the i2c-ao-pca9548 module is added to the list of modules.
To activate the module, run the command sudo ldto enable i2c-ao-pca9548. When you have an extra window open and run the command dmesg -w in there, you will/should see the following feedback:
[11187.388418] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /soc/bus@c8100000/i2c@500/status
[11187.396214] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/pca9548
[11187.408093] i2c i2c-0: Added multiplexed i2c bus 1
[11187.409717] i2c i2c-0: Added multiplexed i2c bus 2
[11187.415068] i2c i2c-0: Added multiplexed i2c bus 3
[11187.419424] i2c i2c-0: Added multiplexed i2c bus 4
[11187.424594] i2c i2c-0: Added multiplexed i2c bus 5
[11187.434363] i2c i2c-0: Added multiplexed i2c bus 6
[11187.439602] i2c i2c-0: Added multiplexed i2c bus 7
[11187.441331] i2c i2c-0: Added multiplexed i2c bus 8
[11187.445061] pca954x 0-0070: registered 8 multiplexed busses for I2C switch pca9548
Ignore the memory leak messages as they appear for almost each and every I2C related module.
If you run the command i2cdetect -l, the following output is shown:
pi@librecomputer:/opt/librecomputer/libretech-wiring-tool $ i2cdetect -l | sort
i2c-0 i2c Meson I2C adapter I2C adapter
i2c-1 i2c i2c-0-mux (chan_id 0) I2C adapter
i2c-2 i2c i2c-0-mux (chan_id 1) I2C adapter
i2c-3 i2c i2c-0-mux (chan_id 2) I2C adapter
i2c-4 i2c i2c-0-mux (chan_id 3) I2C adapter
i2c-5 i2c i2c-0-mux (chan_id 4) I2C adapter
i2c-6 i2c i2c-0-mux (chan_id 5) I2C adapter
i2c-7 i2c i2c-0-mux (chan_id 6) I2C adapter
i2c-8 i2c i2c-0-mux (chan_id 7) I2C adapter
So, indeed, 8 extra I2C busses!
If you have I2C devices connected to one or more of the I2C mux outputs, use the correct I2C bus to communicate with them. If you have, for instance, an IO expander connected to the SDA/SCL1 (the outputs on the PCA9548 start at 0 and end at 7) you have to access it using the /dev/i2c-2 bus.
From now on, you can attach multiple devices with same addresses on different I2C busses. It's just a matter of selecting the correct I2C output on the I2C mux.
I've added some more explanation this website.
Some useful directories (different setup compared to Raspberry Pi):
/sys/firmware/devicetree/base
In here, lots of information is divided in subdirectories. Some of the useful files/subdirectories are:
model: a file containing the name of the board
soc: a directory in which you can find more information about the different busses and their addresses. Example: bus@c8100000 where I2C is hooked upon (i2c@500 is a subdirectory into the bus@c8100000 subdirectory)
Below are some useful links to the Libre Computer website.
https://hub.libre.computer/t/raspbian-11-bullseye-for-libre-computer-boards/82: link to the different distros
https://hub.libre.computer/t/libre-computer-wiring-tool/40: link to the lgpio and ldto commands
https://hub.libre.computer/t/aml-s905x-cc-wiring-tool-overlays-description/62: link to all the existing device tree overlay modules
https://hub.libre.computer/t/aml-s905x-cc-overview-resources-and-guides/288: link to general information about the Le Potato board (AML-S905X)
https://github.com/libre-computer-project: link to the Libre Computer github repository where you can find all toolings and more
https://github.com/libre-computer-project/libretech-raspbian-portability: link to the tool to convert a genuine Raspberry Pi image to one more tailored to the Libre Computer alternative.
I recently wanted to install Home Automation on Le Potato. Home Automation does not have an own image supporting Le Potato. So, we must install HA ourselfs on the SBC.
In the past, Home Automation provided a Ubuntu distro but that's not the case anymore. The advantage was that SSH was installed and activated by default. That's not the case anymore with Debian, for security reasons (???...).
So, since I cannot connect headless to SSH from the very beginning, I had to connect through a serial port. Le Potato has serial communication on header 2J1 with the following 3 connections:
GND
RX
TX
To be able to connect those pins to a computer, you need a USB-to-UART cable/converter. Not an RS232 cable, since this is using high voltages (+/- 12V) which can destroy the UART on the SBC. And worst case: the whole SBC board!!!
I bought 5 USB-to-UART converters on Ali Express (this version) which converts serial signals to TTL level to avoid destruction of the SBC.
I receviced them recently. I tested one with the following connections:
Connect GND of converter to GND of SBC
Connect TX of converter to RX of SBC
Connect RX of converter to TX of SBC
leave the pins 3V3 and 5V of the converter unconnected
The following settings were used for my Putty serial communication:
Baud rate: 115200
Bits: 8
Stopbit: 1
Parity: None
Flow Control: None
Useful information on the Libre Computer website regarding UART connections can be found here.
Note: this is only needed if you installed the Debian distro!
After I set up the serial communication I was able to update Le Potato. However, it was not just "a walk in the park".
The following things had to be done:
Temporarily disable the Libre Computer repo:
Find the location of the Libre Computer repo list: ls /etc/apt/sources.list.d/
You should find the following file: libre-computer-deb.list
Rename the .list file:
sudo mv /etc/apt/sources.list.d/libre-computer-deb.list /etc/apt/sources.list.d/libre-computer-deb.list.bak
sudo apt update (this is updating the "pure" Debian sources now, since the ones from Libre Computer are temporarily opt out)
sudo apt install net-tools (this is to find the IP address later on, using the command ip a show <ip_interface_name>
sudo apt full-upgrade (this is updating the current repo to the latest state, this will take a while!)
sudo reboot (to take into account all updated packages)
After the reboot we have to install the SSH server: sudo apt install openssh-server -y
Then we have to start the service:
sudo systemctl start ssh
Make sure SSH starts automatically the moment Le Potato is powered
sudo systemctl enable ssh
Check if the SSH server is running
sudo systemctl status ssh
If all goes well, you should see something like this:
geertvc@potato:~$ systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-03-26 12:41:41 CET; 2h 43min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 490 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 539 (sshd)
Tasks: 1 (limit: 2001)
Memory: 4.9M
CPU: 526ms
CGroup: /system.slice/ssh.service
└─539 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
To be able to connect via SSH through Putty, we still need one more thing: the IP address of Le Potato.
To do this, run the following command: ip link show (to show the real name of the wired network iface). For Le Potato that will most probably be end0 (what's in a name, guys of Libre Computer???).
Since we now know the wired network iface name, we can run the command if a show end0. This way, we can see the current IP address assigned to Le Potato.
Open Putty and pass the IP address in the corresponding field. Try to connect to see if all works fine. It should...
From now on, you're able to connect through SSH using Putty!
According to Google Gemini (yes, I've also entered the AI realm...) there's no need anymore to use the Libre Computer stuff. Hence, I did the following extra steps at the end:
sudo rm -f /etc/apt/trusted.gpg.d/libre-computer-deb.asc
sudo rm -f /etc/apt/trusted.gpg.d/libre-computer.gpg
sudo rm -f /etc/apt/trusted.gpg.d/libre-computer*
sudo rm -f /etc/apt/sources.list.d/libre-computer-deb.list
sudo rm /etc/apt/sources.list.d/libre-computer.list
sudo apt update
Hostname can be easily adapted using the command sudo hostnamectl set-hostname <new_hostname>. To activate it, you have to reboot the SBC.
Since Debian 12 (bookworm) there's a much more convenient method to set the time zone, using timedatectl:
sudo timedatectl set-timezone Europe/Brussels
There's no need anymore to mess around with /etc/localtime and so on...
Using timedatectl one can check if the time zone change has been executed effectively. You should see something like this:
geertvc@potato:~$ timedatectl
Local time: Thu 2026-03-26 16:16:12 CET
Universal time: Thu 2026-03-26 15:16:12 UTC
RTC time: Thu 2026-03-26 15:16:12
Time zone: Europe/Brussels (CET, +0100)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
As you can see, even the NTP service has been activated.
If needed, you can still forcefully set the NTP server active using the command sudo timedatectl set-ntp true.
Cockpit allows you to view Le Potato on a web interface and maintain it as a server. To install, run sudo apt install cockpit -y. This will again take quite some time.
Once installed, go to your web browser and type in the following command: <ip_address>:9090.
Note however, when you open the web browser you will see at a certain moment that cockpit-pcp is not installed to manage history and so on. This will be seen in Overview -> Metrics and History. The following text will be shown:
Package cockpit-pcp is missing for metrics history
This is another package that has to be installed: sudo install cockpit-pcp -y. This also takes a lot of time to install, so be patient...
Once all is in place, you have beautiful graphs of CPU, MEM, Network,...
Home Assistant can be installed in two different ways if you're using a Raspberry Pi to install it on:
Download the Home Assistant image from the Raspberry Pi website.
I don't like this method since this image might contain more things than I want.
Download Raspberry Pi Lite image and then install Home Automation afterwards.
I haven't used any of the above mentioned methods. Why?
I haven't used a Raspberry Pi for this endeavour since I still had a few Libre Computer SBC's of type Le Potato laying around. Perfect SBC's to try to install HA separately, moreover since those SBC's have 2GB of RAM on board instead of the 1GB for the older Raspberry Pi's (3B+ and lower/older).
This is the approach I've taken so that I can install whatever I want on this image, next to Home Assistant.
Since I don't know a lot of HA, let alone knowing what is needed to get HA up and running, I looked on the inet and found a very useful installation guide made by Carter Roeser. You can find the article on his blog here.
Carter refers to Ubuntu not supported anymore by the HA team and he used Debian instead. Therefore, I also download the Debian image from the Libre Computer website for Le Potato. The distros for the AML-S905X-CC can be found here.
After downloading the image I used Win32DiskImager to flash the distro on an 8GB SD card (will use a larger one in the future, but I wanted to try it out first on an SD card with less memory that I had laying around.
After flashing the image, I first had to try to activate SSH on the distro, since Debian does not by default activate SSH. How this was all done, can be read in the sections above called Serial Communication and Activating SSH and connecting through Putty.
Once this was all in place, I followed very precise the blog made by Carter. But I also followed this blog by FullmetalBrackets because Carter assumes you have SSH up and running "by default" which is, again, true for the Ubuntu distro, but not for the Debian distro.
In short, those are the steps I followed, based on the installation guides by Carter:
sudo apt update
sudo apt upgrade
sudo apt install apparmor jq wget curl udisks2 libglib2.0-bin network-manager dbus systemd-journal-remote unzip -y
curl -fsSL get.docker.com | sh
With the following commands you have to see what is the latest version of the agent. As of this writing, it was 1.8.1:
wget https://github.com/home-assistant/os-agent/releases/download/1.8.1/os-agent_1.8.1_linux_aarch64.deb
sudo dpkg -i os-agent_1.8.1_linux_aarch64.deb
sudo BYPASS_OS_CHECK=true dpkg -i homeassistant-supervised.deb
When trying to run sudo BYPASS_OS_CHECK=true dpkg -i homeassistant-supervised.deb, I got other issues to resolve first:
sudo apt install cifs-utils => I had to run sudo apt --fix-broken install to fix the error I saw when installing cifs-utils.
sudo apt install nfs-common
When I initially started Le Potato, it got an address ending with .16. However, when HA started it all of a sudden changed to .17. No idea why...
When HA finally was up and running (it can take between 20-30 minutes before all is in place) I saw that there were two repairs to be done in the "Repair" section:
Deprecation note about the installation: since I don't use the "genuine" HA distro from the Raspberry Pi organisation (which I simply can't since I'm using another SBC from Libre Computer on which the Raspberry Pi images do not run), I get this repair message. Which I can't resolve, obviously.
There was a second warning telling met that AppArmor was not installed. This was absolutely not correct, since I installed apparmor in one of the above mentioned sudo apt install commands.
HOWEVER...
If you don't tell the kernel that it has to activate AppArmor during boot, the AppArmor feature is indeed not working! And that's where HA was pointing to...
To pass the necessary parameters to the kernel during startup, the parameters have to be added in a specific file. For many distro's, u-boot is used as a starting process. But for the Debian distro (and maybe many others too, like Ubuntu), grub is used.
So, to pass parameters to the kernel, I had to edit the file /etc/default/grub as sudo: sudo vi /etc/default/grub
In that file, there is a line like this: GRUB_CMDLINE_LINUX_DEFAULT="noquiet"
This is the line that has to be extended with the following info: apparmor=1 security=apparmor
So, finally, the line looks like this: GRUB_CMDLINE_LINUX_DEFAULT="noquiet apparmor=1 security=apparmor"
After applying the changes, you have to tell grub to take along those changes, using the command sudo update-grub
Doing this will result in grub creating a new configuration file. You have to issue a sudo reboot to restart the SBC and taking the changes into effect.
To check if AppArmor is now enabled after a restart, you can run the command sudo aa-status (or sudo /sbin/aa-status if /sbin is not in the path). As a result, you will see:
if the apparmor module is loaded
how many profiles are loaded and which profiles are in enforced mode
how many processes are loaded and which processes are in enforced mode
how many profiles/processes are in other modes (complain/mixed/kill/unconfined): in my case all were 0, which is great!
If aa-status is not installed (it normally should) you can check the value of /sys/module/apparmor/parameters/enabled (using cat): it should return a Y if all is fine.
It will take a very long time again for HA to start, since it has to check everything all over, but this time with AppArmor activated. You really have to be patient and wait untill all is done. Once the web iface of HA is up and running, you can see the progress by expanding the installation view. Again, it goes painfully slow!!!
There are some useful commands in HA that I learned from Gemini:
Forcefully restart HA Supervisor: sudo docker restart hassio_supervisor
See if all HA docker containers are running: sudo docker ps
Check the IP address to be sure the browser is looking at the correct place: ip a show end0 # or just ip a
Make sure the correct port is used: :8123
sudo docker logs homeassistant: to see for suspicious errors/logs/...
Look at Suberviser logs: sudo docker logs hassio_supervisor
Reach out a helping hand: sudo docker start homeassistant
In the output of sudo docker ps you see an observer running on port :4357. This is a handy tool to see what the status is at every moment of the HA Supervisor (connected or not) and also the Support and Health status.
Note that the Support status will show "Unsupported", since we're not using the HA distro, but a Debian disto on which we install HA...
To see the HA Observer state, open a web page with the same IP address of HA, but with port :4357.
You should see a small info box.
Look at the supervisor logs:
Through sudo docker logs hassio_supervisor
Through --tail: sudo docker logs hassio_supervisor --tail 50
Shows the last 50 lines of the log (and updates the lines if needed)
Sending the output to a file: sudo docker logs hassio_supervisor > supervisor_logs.txt 2>&1
This will create a file in which we can easily search for certain keywords. Always handy...
Note: the AppArmor remark should now be disappeared with the kernel start parameters we changed