sw-announce-android

We are pleased to announce our Android 15 1.2.0 Release for all our NXP i.MX-based Nitrogen Platforms!

For the impatient

You can download the prebuilt images from here:

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.

First you need to connect your Host PC to the target using micro-USB or TypeC USB cable depending on the platform.

Then you can enter fastboot mode from U-Boot prompt over the serial connection:

=> fastboot 0

Once the platform is in fastboot mode, you simply need to call the flashing script:

~/$ unzip v15*nitrogen*.zip -d v15-nitrogen
~/$ cd v15-nitrogen
~/v15-nitrogen$ ./device/ezurio/scripts/flash_fastboot.sh

Since our i.MX platforms might come with different eMMC sizes, you can select the size you want to use at flashing time.

If you don’t provide that argument, the “default” size of 16GB will be flashed, otherwise you need to use the -s option:

~/v15-nitrogen$ ./device/ezurio/scripts/flash_fastboot.sh -s 8

Note that you can also use fastboot from a Windows Host PC, see following blog post to learn how:

What’s new?

Android 15 OS updates

Google provides a list of notable changes for developers:

a15_version

Code based upon the android-15.0.0_r14 tag which includes all the security patches up until February 2025!

SELinux

As usual, this release comes with SELinux enabled and enforced.

If you are using the userdebug build, you can switch to permissive mode by setting 1 variable in U-Boot:

=> setenv selinux permissive
=> saveenv

AVB2.0

The image also 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. However, it goes without saying that this disablement isn’t possible on user builds.

Non-A/B OTA updates

This release uses a non-A/B partitioning which allows to save some space and keep the most space for your applications.

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 server settings if you plan on hosting your own updates.

Linux Kernel 6.6.x

This Android release is based on a 6.6.58 kernel from NXP.

Also, our number of patches has been drastically reduced in order to keep it closer to NXP release and make modification easier for customers.

i.MX 95 support

This release is the first to support our new Nitrogen95 SMARC module!

Even though this release is still considered Beta as it is meant for the A1 version of the SoC, all features are already supported.

The overall BSP architecture is identical to other platforms. The main difference is that Nitrogen95 uses device tree overlays to select which features to enable.

Index Name
1 imx95-nitrogen-smarc-csi0-pivariety
2 imx95-nitrogen-smarc-csi0-tevs
3 imx95-nitrogen-smarc-csi1-pivariety
4 imx95-nitrogen-smarc-csi1-tevs
5 imx95-nitrogen-smarc-dsi
6 imx95-nitrogen-smarc-lvds0
7 imx95-nitrogen-smarc-lvds1
8 imx95-nitrogen-smarc-nx611

By default the image enables the LVDS1 & NX611 features. This can be chosen by setting adtbo_idx in U-Boot, below is an example to use DSI instead of LVDS1:

=> setenv adtbo_idx "5 8"
=> saveenv

Ezurio additions

Just like our previous releases, this one includes unique features that only Ezurio provides:

  • Dynamic display support
    • Our U-Boot version still detects the connected displays automatically
    • You can see our list of supported displays from our website here
  • Display rotation support
    • Possible via a simple env variable in U-Boot:
      => setenv hwrotation 270
      => saveenv
      => reset
      
  • USB Camera support with custom properties
    • USB cameras are declared as EXTERNAL in Android, we offer a way for them to appear as BACK/FRONT cameras:
      # setprop persist.vendor.cam.ext.facing 0
      
  • Extended camera sensors support
    • OV5640 support for all boards
    • Arducam xISP support for all boards
    • Basler daA3840 raw camera support (8MP)
    • Sony imx219 raw camera support (8MP)
    • Custom camera layout settings for maximum flexibility:
      $ adb shell setprop persist.vendor.camera.config imx8mp-basler-ov5640
      
  • Unparalleled Wi-Fi / BT driver support
    • Backports modules integration, including latest security fixes
    • Sona NX611 Wi-Fi 6 + BT5.4 support
    • Sona IF573 Wi-Fi 6E + BT5.4 support
    • Serling LWB5+ Wi-Fi 5 + BT5.0 support
    • BD-SDMAC Wi-Fi 5 + BT5.0 support

a15_wifi6_nx611

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 old Ubuntu releases to build the OS, many might find it useful to use Docker.

For those we provide a dockerfile below:

Otherwise, for those already familiar with our releases, here is a condensed version to get the Android 15 source code:

~/$ mkdir myandroid
~/$ cd myandroid
~/myandroid$ repo init -u https://github.com/boundarydevices/android-manifest.git \
       -b imx-android-15 -m ezurio-imx-android-15.0.0_1.2.0.xml
~/myandroid$ repo sync
~/myandroid$ source build/envsetup.sh
~/myandroid$ lunch
... choose nitrogen8m / nitrogen8mm / nitrogen8mp / nitrogen95 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 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

As always, let us know your experiences (both good and bad) when you test out this image.