Android 10 update release for Nitrogen8 family

Published on November 19, 2020

We are glad to deliver the latest Android 10 2.5.0 release for all our i.MX 8M-based Nitrogen platforms: Android 10


For the impatient

You can download the Android 10 images from here: Update 20210126 changelog:
  • Merge Linux 5.4.90 stable fixes
  • Fix suspend/resume issues
Update 20210111 changelog:
  • Fix rfkill for WiFi / BT
  • Fix U-Boot Fastboot for Mini/Nano
Update 20201224 changelog:
  • Merge Linux 5.4.80 stable fixes
  • Update U-Boot and ATF to latest rev
  • Remove extraneous Camera app

Flashing using fastboot

The .zip archives include all the files to be flashed using fastboot. Note that fastboot will only flash to your eMMC device, for SD card, please check next section. First you need to enter fastboot mode from U-Boot prompt: => fastboot 0 Once the platform is in fastboot mode, you simply need to call the flashing script: ~/$ unzip q10*nitrogen8*.zip -d q10-nitrogen8 ~/$ cd q10-nitrogen8 ~/q10-nitrogen8$ ./device/boundary/scripts/flash_fastboot.sh Since our i.MX 8 platforms might come with different eMMC sizes, you can select which size you want to use at flashing time. If you don't provide that argument, the "default" size of 8GB will be flashed. But if you have a recent board, it will most likely include 16GB of eMMC, here is the command to use its full size: ~/q10-nitrogen8$ ./device/boundary/scripts/flash_fastboot.sh -s 16 Note that you can also use fastboot from a Windows Host PC, see following blog post to learn how: C:\q10-nitrogen8> device\boundary\scripts\flash_fastboot.bat nitrogen8m

Flashing using Etcher / dd

If you cannot use the fastboot tool, you can still flash the 16GB prebuilt image file for your platform (.img.gz). For Linux users you can simply use the following command: ~$ zcat q10*nitrogen8*.img.gz | sudo dd of=/dev/sdX bs=1M For Windows and Linux users who would rather use a UI, we recommend using Balena Etcher tool: NB: the first boot from SD card can be quite long as it creates and formats missing userdata partition. Please be patient, all subsequent boots will be faster.

Updating U-Boot

We recommend updating U-Boot once the image is flashed: => run upgradeu

What's new?

This section will only describe the changes / features made since last release.

Android 10 OS updates

Google provides a list of notable changes for developers:
  • Updated code base from android-10.0.0_r14 (Nov. 2019) to android-10.0.0_r41 (Aug. 2020)

SELinux

As usual, this release comes with SELinux enabled and enforced. If you are using the userdebug build, you can still switch to permissive mode by setting 1 variable in U-Boot: => setenv selinux permissive => saveenv Note that this feature only works on userdebug builds, user builds are enforced at all time.

AVB2.0

Same as our previous release, this one supports Android Verified Boot 2.0! So I can't make any modification now? No, there's a way to disable verity for userdebug builds: $ adb root $ adb disable-verity $ adb reboot At this point you will be able to modify every partition (you can even use adb sync) However it goes without saying that this disablement isn't possible on user builds.

non-A/B OTA updates

This release also uses a  non-A/B partitioning which allows to save some space and keep the most space for your applications. However it has been reported to us that the previous release had issues building / applying OTA packages which is now fixed. In order to build an OTA package, you can simply enter this make command (once the env is setup properly): $ make otapackage Then, you can setup ota.conf to reflect your HTTP server settings if you plan on hosting your own updates. Or this release also brings a way for you to push an update using ADB and then kick the OTA app to do the necessary checks and reboot the platform as needed: $ adb push $OUT/nitrogen8m-ota-*.zip /data/data/com.fsl.android.ota/cache/update.zip $ adb shell 'am start -n com.fsl.android.ota/.OtaAppActivity --es OTA file:///data/data/com.fsl.android.ota/cache/update.zip' You should then see your platform reboot into recovery partition and apply the update.

NXP changes

NXP updated a few things in this release, two of those are very important to us:
  • 4k performances for i.MX 8M Quad have been greatly improved
    • First releases were lacking tiling support which is now included
  • Display rotation with G2D HWcomposer is now fixed

Linux Kernel 5.4.x

This Android release is based on a 5.4.x kernel. It therefore benefits from all our latest drivers/fixes as well as newest Vivante graphics libraries (v6.4.3.p0).

U-Boot 2020.10

We are glad to use U-Boot 2020.10 for this release as it brings a few enhancements:
  • A board can now reboot to fastboot from fastboot (useful during flashing process): $ fastboot reboot bootloader
  • You can now flash U-Boot over fastboot as well: $ fastboot flash bootloader flash.bin
  • This bootloader will soon be able to display a splash screen on MIPI displays!

Boundary Devices additions

Just like our previous releases, this one includes unique features that only Boundary Devices provides:
  • Dynamic display support
    • Our U-Boot version still detects the connected displays automatically (MIPI-DSI + HDMI)
    • You can see our list of supported MIPI-DSI displays from our website here
  • Optimized Camera HALv3 version
    • This releases offers continuous autofocus support for our cameras
  • Support for our 802.11b/g/n/ac + BT4.1 Silex Module
  • Display rotation setting from U-Boot
=> setenv hwrotation 270 => saveenv => reset
  • Variety of accessories
    • All our accessories like OV5640 cameras are all supported
    • 8M Plus platform also supports Basler daA3840 camera
  • Up to date kernel stable release
    • While NXP kernel is based upon 5.4.47 kernel, we provide latest updates up to 5.4.77
    • This includes 3800+ bug/CVE fixes that makes your device much more secure

Source code access

For the newcomers, please make sure to read our "Android Getting Started Guide" since it contains all the information you need to download, build and flash an Android image. Since AOSP requirement is still to use Ubuntu Xenial (16.04) to build the OS, many might find it useful to use Docker, we provide a dockerfile if needed: For those already familiar with our releases, here is a condensed version to get the Android 10 source code: ~/$ mkdir myandroid ~/$ cd myandroid ~/myandroid$ repo init -u https://github.com/boundarydevices/android-manifest.git \ -b boundary-android-10.0.0_2.5.0 ~/myandroid$ repo sync ~/myandroid$ export TEMPORARY_DISABLE_PATH_RESTRICTIONS=true ~/myandroid$ source build/envsetup.sh ~/myandroid$ lunch ... choose nitrogen8m / nitrogen8mm / nitrogen8mn / nitrogen8mp from the list of boards ~/myandroid$ ./imx-make.sh -j12 As you can see, we use a special make script instead of the regular make command. The reason is that in order to have as few AOSP changes as possible, NXP created a separate script in order to kernel the build dependencies that are the kernel, dtbo, u-boot images. One could also use the following approach to only build the dependencies with that script and then use standard Android build: ~/myandroid$ ./imx-make.sh kernel bootloader -j12 ~/myandroid$ make -j12 There's also one variable (TEMPORARY_DISABLE_PATH_RESTRICTIONS) that needs to be set as Android build now forbids the use of mke2fs which is required for our preboot partition. We suggest setting this inside your .bashrc or .profile user file.   As always, let us know your experiences (both good and bad) when you test out this image.