Some thoughts on Amlogic – Part 2

I’m not really sure where to start with this one. Amlogic seems to be doing some funny stuff, both with software and hardware.

Hardware

I thought that I will start with history of Amlogic SoC-s for STB-s or OTT devices or whatever you want to call them but then I figured that mixing that with what I want to say won’t be good and probably would be too long to read.

Instead of that I will focus on last generation of Amlogic STB system on chips (S9 family). First SoC of that family (S905) was available in 2015. That was 2 years ago. Since then we had couple hardware revisions of S905. S905 SoC is 64-Bit quad core ARM Cortex A53 system on chip with integrated Mali 450 GPU, USB 2.0, internal Ethernet PHY (10/100 Mbps) with support for external Ethernet up to 1 Gbps. It implements HDMI 2.0 IP with maximum output resolution 4K at 60Hz and hardware h265 (HEVC) video decoder. Originally SoC was clocked and advertised as 2.0 GHz chip but in later SDK releases for platform it was down-clocked to 1.5 GHz (however, on Amlogic’s openlinux website it’s still stated that it is 2.0 GHz SoC) However, it was lacking VP9 hardware decoding capability. After that S905X was introduced with VP9 hardware decoding which implemented support only for internal Ethernet (10/100) but it was compatible for Android TV certification process (since Android TV requires SoC to support VP9 decoding among other features).

After that, S912 was introduced, Octa core Cortex A53 SoC with Mali T820 GPU, clocked at 1.5 GHz which had Gbit Ethernet support and VP9 hardware decoding.

When I first saw specifications of S912 it looked very promising. But that excitement faded with time. But more on that later.

Couple weeks ago I read that there’s new Amlogic SoC called S805X. I thought it was joke but it seems it is not. As stated on Amlogic’s Android 7.1 SDK releases page, it exists. I tried to get some more info on that chip but only I got is that it is S905X SoC with video output limited to 1080p (?!).

Couple days ago I saw article on CNX Software titled – Tanix TX3 Mini TV Box is Powered by Amlogic S905W SoC. Once again, it’s joke or typo, right? Never heard of S905W yet it exists and this time specs says that video codecs supported are: 4K@30fps H.265, MPEG1/2/4, H.264, HD AVC/VC-1, RM/RMVB, Xvid/DivX3/4/5/6 , RealVideo8/9/10. So basically you have HDMI 2.0 capable of 4k@60Hz but you limited 4K decoding to 30fps?!

This is frustrating, just getting all the info to put in post. There are some other SoC-s like S905L, S905D… and maybe there will be S905Z in future with I don’t know…. Mali 400 GPU that was used in earlier generations? Who knows…

Now I want to say something about software, more precisely Android 7.1 SDKs released (officially) by Amlogic.

Android 7.1 SDKs

This part was actually reason why I wanted to write article but in meantime I decided to add some hardware info and confusion 🙂

Back in March I wrote Amlogic Nougat small review and thoughts post. But now it’s more exciting…. We have some new bugs and some bugs that brought back to life! Awsome….

On Android 7.1 SDK releases page you can see versions that are official so you can follow story I’m going to tell you.

Story:

There was SDK release 2017-06-19 which was decent release. HDMI passtrough was working fine (tested), even HDMI self adoption as they call it was working not only with native VideoPlayer app but with all apps (Kodi, YouTube for Android TV…). What is not fixed and no documentation provided is IR remote issue where IR codes are HARDCODED in kernel device tree include. All of it is described in my post from March but to sum it up, they hardcoded infra-red remote codes into kernel’s device tree include files (yes, for each platform one file. One for GXB, one for GXL, one for GXM and so on).

After that SDK release, as you can see on SDK releases page, new release was made, dated 2017-08-04. That release states that it’s patch for 2017-06-19 release.

Changes in 2017-08-04 version (both versions tested on S912 board):

  • IR issue still not fixed
  • SoC gets extremely hot for no obvious reasons in almost idle state (I’m talking about approximately 20 degrees Celsius difference)
  • HDMI passtrough is not working anymore (but Amlogic engineer I talked to claims that it passed QA on q201 board (S912 board, same as mine). Even shows me small cropped screenshot where someone reported that it passed QA)
  • Google’s ExoPlayer is not working – crash on any attempt of video playback – also happens in latest Android 6.0 SDK (response from engineer that I quote: we test it by the android 7 release. it is in common use)
  • And finally… HDMI self adoption is not working. This is kind of hilarious, I will put below images of sample video results (ffprobe on my laptop and fps calculation on Amlogic S912 device together with current refresh rate on TV). Basically what happens, screen ‘switches’ to refresh rate closest to fps of video, except it doesn’t do that…. It just flickers.

Here is ffprobe of tested video:

And here is Putty output of 2 sysfs nodes when same video is playing in native VideoPlayer app and HDMI self adoption is turned on:

I also said that I will write why S912 excitement started to fade for me…

Well, it is simple. I agree that S912 is not bad SoC at all. Problem is with Linux support for it. Fact that S912 is using Mali T820 GPU and that there are no any Linux userspace libraries available (and probably won’t be) you have only option to use it as Android device. Another fact is that Amlogic hired BayLibre to bring Amlogic GX support to mainline Linux kernel. CNX posted that Shenzhen Wesion company who is behind Khadas VIM development board is working on VIM2 board which will be based on S912 SoC. So, my question is, what is point of development board with features like HDMI output, DVB bus… when you are limited to Linux console and basic framebuffer device without any kind of hardware acceleration (again because there is no Mali T820 Linux support available).

Aside from development boards, there are open source projects like LibreELEC that would love to port Just enough OS for Kodi to S912 devices but they can’t.

Another thing is, Amlogic is stuck in past. They are utilizing USB 2.0 for years, they do not have SATA controller, not to mention PCIe. Take Rockchip for example. They have all of that. They are opening their sources They announced their new official wiki pages with all resources, they host their sources and Mali blobs on their official Github pages. Rockchip is integrated in some of Chromebooks. From that perspective, Amlogic is years behind Rockchip.

Few years ago I had very different opinion when someone would ask me to compare Amlogic and Rockchip. But not anymore. Same goes for Allwinner.

Amlogic, please wake up!

Amlogic Nougat small review and thoughts

General

I’d just like to make it clear that all mentioned here is my opinion and mine only. This post will be combined technical and user perspective review of Amlogic Nougat 7.1.1 SDK release 2017-02-22.

Few technical details about this SDK:

  • Original Amlogic source is based on AOSP Nougat branch android-7.1.1_r6 (NMF26Q) which I bumped to android-7.1.1_r26 (NOF27C).
  • Kernel used with this SDK is still version 3.14.29
  • Compared to Marshmallow SDKs, Nougat can be built with as 64 bit Android OS
  • Mali T820 kernel and userspace libraries are still r11p0
  • Internal storage partitions are changed in size, so in 99% of cases I am pretty sure current devices that are on market will not receive Nougat update (at least not 64 bit version). For example, system partition (where Android is actually installed) is now 2 GB in size by default (defined in kernel) while on previous versions (I am sure for Lollipop and Marshmallow was 1 GB). 64 bit version of Nougat running on my test device takes approximately 1.5 GB of space on system partition.
  • There is work to be done and some ‘crazy’ stuff to be sorted out, especially one in particular which I noticed today and it’s connected to IR remote support (more about that at end of post)

UI, design flaws, bugs

Launcher

Nothing new here. It’s not changed since Lollipop release as far as I can remember. Each tile opens it’s own section, you can add or remove apps on bottom… Usual stuff

Settings (new)

I don’t have any notes what to write here but I believe I will spent most of my time writing about Settings. You will see why in what’s following.

So, on screenshot above you can see that settings are now Nougat style (some of you might be familiar with it if you were using Nexus Player with Nougat or similar device). You open this right hand settings view by clicking on Settings tile in Amlogic launcher. Keep in mind that this is only place from where you can open this. If you are using 3rd party launcher or stock Android launcher or whatever, you will not be able to open settings because there is no icon in app drawer which you can click to open it (like you had in Marshmallow, 2 Settings apps, one with tiles and one normal Android Settings app which you can see on phones or tablets).

From my perspective it can and should be done differently.

Settings (new) design failures

As I said, this my opinion. I will put few more screenshots of settings then I will write something about it.

    

    

    

So, from first three images we can see some consistency in following new design of settings app. Another 3 are just almost copy/paste from Marshmallow and just made to work. I am not designer, but this looks just wrong…

Settings (new) – bluetoothremote

I will put it here just to show how it looks. What it does – beats me. Maybe someone in comments will be able to demystify this for me.

    

I did not get any documentation on this feature. When you select Upgrade bluetoothremote from settings you get 2nd screen. Before I paired my BT headset this list was empty. And when I tried to pair my OnePlus 3 phone with box it could not see it. So, what it does – I don’t know 🙂

Settings (normal)

First, pictures:

    

There is not much to say here. Normal Android settings app opens, but as soon as you click on one of items (in this case About media box) app crashes which is visible on 2nd image. And yes, this normal settings app you can start from app drawer (list).

Web browser

Picture again:

Also, not much to say here. However this is not Amlogic’s fault. As I understand, Nougat does not come with default Browser app like we knew it before. Instead it comes with Browser2 which is basically WebView component tester. So if you want to browse on this, you will most probably have to install either Chrome or Firefox or whatever to normally browse web 🙂

Media playback

I am not much of tester when it comes to media, codec testing, but I can say that I did not come to any issues with video playback. If you want some extensive tests on that you’ll have to wait CNX to get one of boxes with Nougat installed 🙂

Crazy stuff to be sorted out – IR remote

I came across very interesting issue. I prepared my Nougat build with my IR remote codes (I took short way – I copied it from Marshmallow tree). It’s simple, Amlogic always used remote.conf which is placed inside /system/etc folder.

And that didn’t work. So two reasons crossed my mind:

  • I built Android as 64 bit OS which means remotecfg binary is also built as 64 bit binary. During my earlier work with 64 bit Linux based OS on S905 I had issue with that binary causing segmentation fault and fixed that issue on Linux. So even before building Nougat I checked remotecfg source to see if Amlogic fixed issue they had and I saw they did not, so I applied my patch there.
    Conclusion – remotecfg binary is not issue, it does not crash
  • Another thing that crossed my mind is that maybe Amlogic changed structure of remote.conf file (which they did in Marshmallow I think, to support multiple remotes). That check also came back as not causing issue.

So, I went back to check on debug port (UART) what is going on and on each press of button on remote I would get output:

And no, it is not typo 🙂

After that, I tried to find cur_custom string in remotecfg sources without luck. Then I went to check kernel side (IR remote driver). Indeed, kernel was throwing that error.

Digging little deeper I ended in looking at kernel device trees for Amlogic boards. What I found was… horrible is the word?

If you are familiar with kernel structure, device trees and stuff this will make sense to you. If not, well…. they blew it.

Kernel device tree is basically DTS file which includes some other platform related DTSI files. And in THAT DTSI files I found HARDCODED key mappings for exactly 3 remotes. Here is how it looks like:

Honestly, I’m pretty shocked by that. To include something like that in device tree for particular board (eg. gxm_q200_2g.dts) – well, ok. Not ok, but at least it’s not hardcoded to all device trees which include eg. mesongxm.dtsi.

If some of things will be fixed/changed from Amlogic side I don’t know. I hope if someone from Amlogic reads this post things may change to better.

As for me and my work, I’m not relying on all Amlogic changes they make and as I said in beginning – I made my private GIT server with my repositories and I bumped Android version. Btw, bumping Android version has nothing to do with bugs or issues mentioned here.

How to create Amlogic recovery SD card from Linux

Amlogic recovery SD card is used when device is bricked, when bootloader does not exist on boot device (SPI chip or NAND) or it is corrupted.

Linux (any distribution) is most convenient OS for creating that kind of card. Basically, card is created that way that first 3 cylinders on card are reserved for bootloader. FAT32 partition follows (starts on sector 3 to the end of sdcard).

Let’s say we want to create recovery card for MX board. MX uses u-boot.img as bootloader name. We will asume that our device is bricked and needs complete firmware reinstall.
So, we need: u-boot.img for that device and rest of firmware (update.zip and recovery.img which is recovery kernel + tools, usually Android recovery system).

We will asume this:
Our sdcard is: /dev/sdb
First partition: /dev/sdb1
Mountpoint for sdcard: /home/stane/recoverysd

First we will unmount our sdcard if it is mounted

Next we will raw copy u-boot.img from our current folder to sdcard (not partition!)

Now we have to delete all existing partitions on sdcard and create only one that will start from 3rd cylinder. Most newer Linux distros uses also newer version of fdisk utility which consider cylinders for display/entry unit as deprecated, so before any action you have to enable it by issuing “u” in fdisk and pressing enter key.

So, lets start with fdisk. We will start it with following command:

in fdisk, as I said earlier we will first issue u command and hit enter which will result with message: Changing display/entry units to cylinders (DEPRECATED!)
Just ignore it and contine.

Next step is to delete all existing partitions from our sdcard. Hit d command and after that hit p command to see current partition status on your sdcard.
Repeat this step until all partitions are deleted.

After issuing p output should look like this:

with no partitions listed.
When we cleared our partition layout, its time to create new one.

To do that, issue n command and create primary partition (by selecting p option on next menu).
When fdisk asks for partition number, leave empty (1st is by default) and continue.
Now comes our cylinder part. Fdisk will ask you for First cylinder. Put there 3 and continue.
Next, it will ask for last cylinder. Leave default value (just press enter).

Ok, partition is created, but its raw for now. We have to assign filesystem to it (which will be FAT32). So, issue t command and after that b command (b is code for FAT32 partition type).

When done, with these steps, issue w command which will write changes to sdcard and will exit fdisk.

Ok, now we have to format our newly created partition which we will do with issuing command:

When partition is formatted, you have two options. Either you will re-insert your card to cardreader, or you will mount it manually to folder from which we unmounted it.

If you choose second option, issue command as follows:

When mounted, copy all your firmware files to sdcard and properly unmount it and eject from your cardreader. You can unmount it within your Linux distro file manager or with command:

Now your recovery sdcard is ready to use.

When you finished with recovery of your box, you’ll probably want to back your card to normal (because using it in another box, might brick it).

We are going to do that by raw copying few kilobytes of zeros to start of sdcard (after we unmounted it) with following command:

After procedure is finished, start fdisk as before (which will warn you that your drive/card is corrupted) and just issue w command. Fdisk will write changes to sdcard and exit.

After that, start fdisk again and create your new partition (none exists anymore) as you did before, just use default values. After that, format the file system on your sdcard and thats it.

Hope it helped someone 🙂