We are glad to deliver the latest Android 11 2.2.0 release for all our i.MX 8M-based Nitrogen platforms:
- Nitrogen8M (and SOM)
- Nitrogen8M Mini (and SOM)
- Nitrogen8M Nano (and SOM)
- Nitrogen8M Plus SOM
For the impatient
You can download the Android 11 images from here:
- For Nitrogen8M (+SoM) platforms:
- For Nitrogen8M Mini (+SoM) platforms:
- For Nitrogen8M Nano (+SoM) platforms:
- For Nitrogen8M Plus SoM platforms:
Update 20220331 changelog:
- Update kernel to 5.10.104 stable release (Dirty Pipe fix)
- Add Wi-Fi regulatory support (regdb)
- Add U-Boot environment tools
Update 20211125 changelog:
- Improve Wi-Fi performances
- Fix i.MX 8M Plus suspend / resume
Update 20211109 changelog:
- Fixed BT5.0 initialization
- Added new display support for 8MP
Flashing using fastboot
.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 r11*nitrogen8*.zip -d r11-nitrogen8 ~/$ cd r11-nitrogen8 ~/r11-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:
~/r11-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:\r11-nitrogen8> device\boundary\scripts\flash_fastboot.bat nitrogen8m
We recommend updating U-Boot once the image is flashed:
=> run upgradeu
This section will only describe the changes / features made since last release.
Android 11 OS updates
Google provides a list of notable changes for developers:
- Code based upon
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
Note that this feature only works on userdebug builds, user builds are enforced at all time.
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
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.
Also, it uses the exact partitioning as previous releases to simplify the update from Android 10.
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.
Moreover this release allows 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 /sdcard/update.zip $ adb shell 'am start -n com.fsl.android.ota/.OtaAppActivity --es OTA file:///sdcard/update.zip'
You will eventually see your platform reboot into recovery partition and apply the update.
NXP updated a few things in this release, some of them are worth noting:
- Now using the external camera framework
- Library now located under
- Library now located under
- Update manifest & kernel matrix target level to 5
- Better compatibility with future releases
- Might require changes to your custom code to match this version
- New CameraXBasic to showcase ISP features
- Only available for 8MP platforms
Linux Kernel 5.10.x
This Android release is based on a 5.10.x kernel. It therefore benefits from all our latest drivers/fixes as well as newest Vivante graphics libraries (v6.4.3.p2).
This release uses U-Boot 2020.10 like the previous version:
- A board can reboot to fastboot from fastboot (useful during flashing process):
$ fastboot reboot bootloader
- Also you can now flash U-Boot over fastboot as well:
$ fastboot flash bootloader flash.bin
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 HAL version
- This releases offers continuous autofocus support for our cameras
- Support for our 802.11b/g/n/ac + BT5.0 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
- SD card support as external storage
- Camera settings flexibility
- Our release allows changing the camera configuration by setting a property
- Example with Basler + OV5640 setup for 8MP:
adb shell setprop persist.vendor.camera.config imx8mp-basler-ov5640
- Up to date kernel stable release
- While NXP kernel is based upon 5.10.35 kernel, we provide latest updates up to 5.10.72
- This includes many 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:
Otherwise, for those already familiar with our releases, here is a condensed version to get the Android 11 source code:
~/$ mkdir myandroid ~/$ cd myandroid ~/myandroid$ repo init -u https://github.com/boundarydevices/android-manifest.git \ -b boundary-android-11.0.0_2.2.0 ~/myandroid$ repo sync ~/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 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.