User Tools

Site Tools


doc:appunti:hardware:x96_mini

This is an old revision of the document!


Installing CoreELEC on 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.

The device is shipped with Android 9 and some apps installed on it. Among the installed apps you can find Kodi 18, Youtube, Netflix, etc. I want a better control of the hardware and of the operating system and I need only the Kodi app, so I decided to install a Kodi distribution on the SD card. Fortunately this device can boot from the SD card, leaving the original operating system on the flash memory untouched.

It seems that the best combination of Kodi and GNU/Linux operating system for this device is the one offered by CoreELEC.

From the download section I selected my options:

Device X96 Mini
RAM Variant 1G
DTB gxl_p281_1g
SoC S905W

SD card preparation

I used mu GNU/Linux computer to prepare a 16 Gb micro SD card.

  1. Donwload the image CoreELEC-Amlogic-ng.arm-19.4-Matrix_rc2-Generic.img.gz and gunzip it.
  2. Copy the image over an SD card using the Linux command line tool dd:
    dd if=CoreELEC-Amlogic-ng.arm-19.4-Matrix_rc2-Generic.img of=/dev/sdb bs=4M conv=fsync
  3. 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.

First boot using the toothpick trick

The X96 Mini, like many other Amlogic devices, have an hidden reset button inside the AV jack. Get a wood toothpick, make it a bit rounded removing the tip and insert it into the AV jack, you should feel the click of the button. Do some experimentation with the device turned off until you are sure you can press it correctly.

  1. Remove the power jack from the device.
  2. Connect the HDMI cable to the TV.
  3. Press the reset button with the toothpick and keep it pressed.
  4. Connect the power jack, still keeping the reset button pressed.
  5. Wait some seconds until you see the CoreELEC screen. On the top-left corner you can see some writings about the ongoing writing process; you can release the reset button.

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 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:

systemctl stop kodi
systemctl stop eventlircd

Check if the remote is generating some events detected by the GNU/Linux LIRC subsystem: run the following command:

ir-keytable -p NEC,RC-5,RC-6,JVC,SONY -t

Press some keys on the remote; this is an example of the output when pressing the OK key on the remote:

CoreELEC:~ # ir-keytable -p NEC,RC-5,RC-6,JVC,SONY -t
Protocols changed to rc-5 jvc sony nec rc-6 
Testing events. Please, press CTRL-C to abort.
496.280087: event type EV_MSC(0x04): scancode = 0x113
496.280087: event type EV_SYN(0x00).

It turned out that my remote is using the NEC protocol (just experiment with the -p option above).

To get a list of valid button names run the command:

irrecord --list-namespace

Now it is possible to create a map from scancodes to button names; I created the file /storage/.config/rc_keymaps/X96MINI_KODI with the following map:

# table X96MINI_KODI, type: NEC
0x140 KEY_POWER
0x144 KEY_VIDEO         # KD Button
# Media center keys
0x155 KEY_PREVIOUS
0x15a KEY_PLAYPAUSE
0x152 KEY_STOP
0x154 KEY_NEXT
# Color buttons
0x143 KEY_RED           # SETUP
0x10f KEY_GREEN         # APP
0x110 KEY_VOLUMEDOWN
0x118 KEY_VOLUMEUP
# Arrows keypad
0x151 KEY_LEFT
0x150 KEY_RIGHT
0x116 KEY_UP
0x11a KEY_DOWN
0x113 KEY_ENTER
# Extra buttons
0x111 KEY_HOME
0x119 KEY_ESC
0x14c KEY_CONTEXT_MENU
0x100 KEY_INFO          # Mouse
# Numeric keypad
0x101 KEY_0
0x14e KEY_1
0x10d KEY_2
0x10c KEY_3
0x14a KEY_4
0x109 KEY_5         
0x108 KEY_6                    
0x146 KEY_7                    
0x105 KEY_8         
0x104 KEY_9                    
0x141 KEY_MUTE                 
0x142 KEY_TEXT          # Backspace                       

This table must be listed into the file /storage/.config/rc_maps.cfg:

# driver        table   file
meson-ir        *       X96MINI_KODI

To load the new key table:

ir-keytable -a /storage/.config/rc_maps.cfg -s rc0

Using ir-keytable again, you can verify that the key name is now associated witht the scancode, e.g. pressing the left key you should get:

CoreELEC:~ # ir-keytable -p NEC -t
Protocols changed to nec 
Testing events. Please, press CTRL-C to abort.
9641.553993: event type EV_MSC(0x04): scancode = 0x151
9641.553993: event type EV_KEY(0x01) key_down: KEY_LEFT(0x0069)
9641.553993: event type EV_SYN(0x00).
9641.565262: event type EV_MSC(0x04): scancode = 0x151
9641.565262: event type EV_SYN(0x00).
9641.692059: event type EV_MSC(0x04): scancode = 0x151
9641.692059: event type EV_SYN(0x00).
9641.948038: event type EV_KEY(0x01) key_up: KEY_LEFT(0x0069)
9641.948038: event type EV_SYN(0x00).

Finally you can restart LIRC and Kodi services:

systemctl start eventlircd
systemctl start kodi

Every key on my remote was properly mapped from a LIRC button name to a Kodi action, except the backpasce key (scancode 0x142). The problem is that Kodi LIRC map convert the KEY_BACKSPACE into the back action, which is the same as KEY_ESC. See the file /usr/share/kodi/system/Lircmap.xml.

So I decided to associate the scancode 0x142 to the unused KEY_TEXT button, which in turn is associated to the teletex LIRC event. Then I created a custom Kodi remote keymap, to associate that remote event to the Backspace Kodi action. This is the file /storage/.kodi/userdata/keymaps/remote.xml:

<keymap>
  <global>
    <remote>
      <teletext>BackSpace</teletext>
    </remote>
  </global>
</keymap>

Enable crontab

From Kodi interface, SettingsCoreELECServices 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:

*/10 * * * *  /storage/bin/heartbeat

The users' crontabs are saved into the /storage/.cache/cron/crontabs/ directory.

Change SSH password and enable RSA keys

From Kodi interface, SettingsCoreELECServices 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:

cp /usr/lib/systemd/system/sshd.service /storage/.config/system.d/
vi /storage/.config/system.d/sshd.service

Shadow password (if changed) cannot be saved into /etc/shadow, because of read-only filesystem. Check instead /storage/.cache/shadow.

Backup of library and configuration

From Kodi interface, SettingsCoreELECSystemBackup 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
doc/appunti/hardware/x96_mini.1643703535.txt.gz · Last modified: 2022/02/01 09:18 by niccolo