User Tools

Site Tools


doc:appunti:hardware:x96_mini

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:appunti:hardware:x96_mini [2022/01/28 13:12] – [Configure the remote control] niccolodoc:appunti:hardware:x96_mini [2023/10/22 23:32] (current) – [Ports and connectors] niccolo
Line 1: Line 1:
-====== Installing CoreELEC on the X96 Mini Android TV Box ======+====== Kodi CoreELEC on the X96 Mini Android TV Box ======
  
 +**How to install Kodi on the X96 mini TV Box**
 +
 +{{ .:amlogic:x96mini.jpg?direct&400|The X96 Mini Android TV-Box}}
 I bought this little device for about 27 EUR in January 2022 from Aliexpress, I wish to use it as a TV Box, getting media from the LAN or from an external hard disk atthached via USB. It is based on the **Amlogic S905W** chip, equipped with **1 Gb** of **RAM** and **16 Gb** of **flash** storage. I bought this little device for about 27 EUR in January 2022 from Aliexpress, I wish to use it as a TV Box, getting media from the LAN or from an external hard disk atthached via USB. It is based on the **Amlogic S905W** chip, equipped with **1 Gb** of **RAM** and **16 Gb** of **flash** storage.
  
Line 7: Line 10:
 It seems that the best combination of **Kodi** and **GNU/Linux** operating system for this device is the one offered by **[[https://coreelec.org/|CoreELEC]]**. It seems that the best combination of **Kodi** and **GNU/Linux** operating system for this device is the one offered by **[[https://coreelec.org/|CoreELEC]]**.
  
-From the download section I selected my options:+===== Download the appropriate version of CoreELEC ===== 
 + 
 +From the download section I selected the appropriate options of my X96 Mini:
  
 ^ Device       | X96 Mini  | ^ Device       | X96 Mini  |
Line 21: Line 26:
   - Copy the image over an SD card using the Linux command line tool **dd**: <code>dd if=CoreELEC-Amlogic-ng.arm-19.4-Matrix_rc2-Generic.img of=/dev/sdb bs=4M conv=fsync</code>   - Copy the image over an SD card using the Linux command line tool **dd**: <code>dd if=CoreELEC-Amlogic-ng.arm-19.4-Matrix_rc2-Generic.img of=/dev/sdb bs=4M conv=fsync</code>
   - Mount the first partition on the SD card and copy the file **device_trees/gxl_p281_1g.dtb** into the root directory, renaming it to **dtb.img**.   - Mount the first partition on the SD card and copy the file **device_trees/gxl_p281_1g.dtb** into the root directory, renaming it to **dtb.img**.
 +
 +====== Ports and connectors ======
 +
 +{{.:amlogic:x96mini-ports1.jpg?direct&400|Power, LAN, HDMI, Audio/Video and remote}}
 +{{.:amlogic:x96mini-ports2.jpg?direct&400|USB, SD card}}
 +
 +One USB port is **white** in color, so it should be an **USB 1.x**, the **black** USB port should be instead an **USB 2.0 Hi-Speed**. But measuring the read/write performance of an USB external disk, it turned out that both the ports are 2.0 Hi-Speed.
 +
  
 ====== First boot using the toothpick trick ====== ====== First boot using the toothpick trick ======
Line 34: Line 47:
 ====== Configure the remote control ====== ====== Configure the remote control ======
  
-The remote control provided with my device **does not work out-of-the-box** in CoreELEC. I created a custom remote control keymap with the following procedure.+The remote control provided with my device **does not work out-of-the-box** in CoreELEC. I created a custom remote control keymap for LIRC and customized the remote Kodi keymap. Now the remote control is fully functional, including **power off** (go in stand-by) and **power on** (resume from standy-by).
  
 Connect to the CoreELEC box via **SSH** and stop the Kodi and LIRC (Linux Infrared Remote Control) services: Connect to the CoreELEC box via **SSH** and stop the Kodi and LIRC (Linux Infrared Remote Control) services:
Line 107: Line 120:
 0x141 KEY_MUTE                  0x141 KEY_MUTE                 
 0x142 KEY_TEXT          # Backspace                        0x142 KEY_TEXT          # Backspace                       
 +</file>
 +
 +This table must be listed into the file **/storage/.config/rc_maps.cfg**:
 +
 +<file>
 +# driver        table   file
 +meson-ir        *       X96MINI_KODI
 </file> </file>
  
Line 155: Line 175:
  
   * **[[https://github.com/CoreELEC/remotes/wiki/02.-Amlogic:-Creating-remote.conf-from-scratch|Amlogic: Creating remote.conf from scratch]]**   * **[[https://github.com/CoreELEC/remotes/wiki/02.-Amlogic:-Creating-remote.conf-from-scratch|Amlogic: Creating remote.conf from scratch]]**
 +
 +====== Change SSH password and enable RSA keys ======
 +
 +From Kodi interface, **Settings** => **CoreELEC** => **Services** there is the **SSH** section, where you can change password or disable password logins if you have copied RSA keys into **/storage/.ssh/authorized_keys** (make it with **mode 0400**).
 +
 +To configure the SSH service you cannot edit the files into **/etc/ssh/**, beacuse they are on a read/only filesystem. There is the file **/storage/.cache/services/sshd.conf** where you can define the variable **SSH_ARGS** and pass some extra parameters to the sshd daemon (e.g. the TCP port, using the **-p** option).
 +
 +You can also customize the systemd service unit, just copy the system file and edit it:
 +
 +<code>
 +cp /usr/lib/systemd/system/sshd.service /storage/.config/system.d/
 +vi /storage/.config/system.d/sshd.service
 +</code>
 +
 +Shadow password (if changed) cannot be saved into /etc/shadow, because of read-only filesystem. Check instead **/storage/.cache/shadow**.
 +
 +====== Enable crontab ======
 +
 +From Kodi interface, **Settings** => **CoreELEC** => **Services** check **Enable Cron**.
 +
 +Then connect via SSH and create a directory where to store the scripts to be executed via cron, e.g. **/storage/bin/**. Then edit the crontab for the root user executing **crontab -e**. This example will run the script name **heartbeat** every 10 minutes:
 +
 +<file>
 +*/10 * * * *  /storage/bin/heartbeat
 +</file>
 +
 +The users' crontabs are saved into the **/storage/.cache/cron/crontabs/** directory.
 +
 +====== Backup of library and configuration ======
 +
 +From Kodi interface, **Settings** => **CoreELEC** => **System** => **Backup** there is the **Create System and Kodi Backup** item. With this you can create an archive containing all the CoreELEC settings and the Kodi library, including the thumbnails directory. The archive file will be stored into **/storage/backup/** and you need to copy it into a remote host if you want.
 +
 +The file is a **tar archive** of the following directories:
 +
 +  * /storage/.cache
 +  * /storage/.config
 +  * /storage/.kodi
 +  * /storage/.ssh
 +
 +====== Installing extra software with Entware ======
 +
 +**[[https://github.com/Entware/Entware/wiki|Entware]]** is a software repository for embedded devices which use the Linux kernel, primarily routers and network attached storages. All packages are compiled for use on **eight** of the **most commonly used architecture** toolchains.
 +
 +The architecture of the X96 Mini is **aarch64** as revealed by the command **uname -m** and the kernel is a **Linux 4.9** as revealed by **uname -a**. The **[[http://bin.entware.net/|Entware repository]]** provides the aarch64 architecture for kernel 3.10 into the **[[http://bin.entware.net/aarch64-k3.10/]]** directory, fortunately it seems that the //libc// library and some of the binares does run on the newer 4.9 kernel.
 +
 +The **CoreELEC** distribution does not inlcue any package manager, so we have to download and unpack the **Entware** packages manually. All the Entware software is packed to be installed into the **/opt/** hiearchy, which in CoreELEC is a symlink to the **/storage/.opt/**, i.e. into the SD card space.
 +
 +In this example we want to install the **base64** utility which we need to send some archives via an http connection. First of all we dowloaded the **libc_2.27-11_aarch64-3.10.ipk**, which contains the //libc// library, required to run almost all the Entware binaries. An ipk file is actually a tar.gz archive. This archive cotains some metadata into the **control.tar.gz** file (e.g. package version, dependencies, etc.) that we will not use because we don't have a package manager. We want instead to unpack the **data.tar.gz** file from the root directory; inspecting the archive you can see that all the content lies into the **/opt/** directory. Once installed the //libc//, we repeat the same installation with the 
 +**coreutils-base64_9.1-1_aarch64-3.10.ipk** package.
 +
 +Some packages requires a **postinst** script to be run in order to initialize some configuration files, the file is contained into the **control.tar.gz** archive. E.g. the **terminfo** package - which is required to run most of the fullscreen tools, with colors and cursors, like the Midnigth Commander - initializes the **/opt/etc/profile** adding a line like this:
 +
 +<file>
 +export TERMINFO=/opt/share/terminfo
 +</file>
 +
 +Finally you have to adjust your **PATH** and eventually the **LD_LIBRARY_PATH** environment variables to take into account the path of the newly installed binay packages. I added the following into my **/storage/.profile**:
 +
 +<file>
 +PATH='/opt/usr/local/bin:/opt/usr/local/sbin:/opt/bin:/opt/sbin:/usr/bin:/usr/sbin'
 +LD_LIBRARY_PATH='/opt/lib:/usr/lib'
 +</file>
 +
 +====== Connecting a 2.5" hard disk via the USB ======
 +
 +I connected an **external hard disk**; specifically it is a Toshiba MQ04UBF100, 2.5 inches hard drive, SATA 3.0, **1 Tb**, using an **USB 3.0** interface.
 +
 +At first I tried to power the hard disk directly from the USB port of the X96 mini, but it turned out that the USB port **does not provide enough power**. The hard disk suddendly and randomly **disconnect and re-connect** with no reason. Here it is the relevant kernel messages displayed by the **dmesg** tool:
 +
 +<code>
 +[  526.677574@2]- usb 1-2: USB disconnect, device number 2
 +[  526.678631@2]- blk_update_request: I/O error, dev sda, sector 903710960
 +...
 +[  526.942573@3]- EXT4-fs error (device sda1): ext4_journal_check_start:56: Detected aborted journal
 +[  526.942578@3]- EXT4-fs (sda1): Remounting filesystem read-only
 +[  526.942585@3]- EXT4-fs (sda1): previous I/O error to superblock detected
 +[  526.942612@3]d Buffer I/O error on dev sda1, logical block 0, lost sync page write
 +[  526.983449@2]- sd 0:0:0:0: [sda] Synchronizing SCSI cache
 +[  526.997855@2]- sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
 +[  527.796877@2]- usb 1-2: new high-speed USB device number 4 using xhci-hcd
 +[  527.938266@2]- usb 1-2: New USB device found, idVendor=0480, idProduct=0901
 +[  527.938278@2]- usb 1-2: New USB device strings: Mfr=2, Product=3, SerialNumber=1
 +[  527.938282@2]- usb 1-2: Product: External USB 3.0
 +</code>
 +
 +Typically a 2.5" drive requires about **1 A** at startup and about **500 mA** at read/write average. It is likely that the X96 Mini's circuitry provides USB ports with barely the minimum required by the USB 2.0 standard, which is **5 V, 500 mA**, regardless the rating of the power supply (mine was rated 4A).
 +
 +Fortunately there is a solution: to use an **externally powered USB hub**. I purchased a **4 ports USB 3.0 hub** with an USB Type-C connector to supply it with power. In this new configuration a **3 A** power supply provides the power to the USB hub. The external hard disk is connected to one of the 4 ports of the hub and it takes its power from this. The X96 Mini is connected to the hub cable through the USB A connector and it takes the power from the hub too. The original power supply is not longer required and **all the system is powered by only one power supply**.
 +
 +I measured the disk performance on both the two USB ports (the white one and the black one), they measured exactly the same transfer rate. For the test I used the **hdparm** tool:
 +
 +<code>
 +hdparm -t /dev/sda
 +</code>
 +
 +<code>
 +Timing buffered disk reads: 102 MB in  3.03 seconds =  33.71 MB/sec
 +</code>
 +
 +This is about **270 Mbit/s**, which is near the 280 Mbps of the USB 2.0 //High Speed// specifications. This means that both the USB ports are actually USB 2.0.
  
doc/appunti/hardware/x96_mini.1643371946.txt.gz · Last modified: 2022/01/28 13:12 by niccolo