buildroot-external-boundary
===========================

Buildroot external layer for Boundary Devices platforms and modules.
Contains support for BD-SDMAC Wi-Fi/BT module as well as some demo configurations.

Configurations details
----------------------

Here are some details about the configurations available:
* `nitrogen8m_qt5_gst1_defconfig`:
  * For i.MX 8MQ based [Nitrogen8M][nitrogen8m], [Nitrogen8M SOM][nitrogen8m-som]
  * Qt5 modules (+ Cinematic Experience demo)
  * GStreamer1.0 with all its plugins
  * NXP proprietary packages (VPU, GPU, SDMA)
  * NXP-based kernel (5.4.x_2.3.0_ga)
  * [BD-SDMAC][bd-sdmac] WiFi/BT modules support
  * Miscellaneous tools (adbd, CAN, I2C, IIO, etc...)
* `nitrogen8mm_qt5_gst1_defconfig`:
  * For i.MX 8M Mini based [Nitrogen8M Mini][nitrogen8mm], [Nitrogen8M Mini SOM][nitrogen8mm-som]
  * Same set of packages as `nitrogen8m_qt5_gst1_defconfig`
* `nitrogen8mn_qt5_gst1_defconfig`:
  * For i.MX 8M Nano based [Nitrogen8M Nano][nitrogen8mn], [Nitrogen8M Nano SOM][nitrogen8mn-som]
  * Same set of packages as `nitrogen8m_qt5_gst1_defconfig`
* `nitrogen8ulp_qt5_gst1_defconfig`:
  * For i.MX 8ULP based [Nitrogen8ULP SOM][nitrogen8ulp]
  * Same set of packages as `nitrogen8m_qt5_gst1_defconfig`
* `nitrogen93_gst1_defconfig`:
  * For i.MX 93 based [Nitrogen93 SMARC][nitrogen93smarc]
  * Same set of packages as `nitrogen8m_qt5_gst1_defconfig`, except without Qt5 modules
* `nitrogen8mp_qt5_gst1_defconfig`:
  * For i.MX 8M Plus based [Nitrogen8M Plus SOM][nitrogen8mp-som]
  * Same set of packages as `nitrogen8m_qt5_gst1_defconfig`
* `nitrogen6x_qt5_gst1_defconfig`:
  * For [BD-SL-i.MX6 (SABRE Lite)][sabrelite], [Nitrogen6X][nitrogen6x], [Nitrogen6X SOM v2][nitrogen6x-somv2], [Nitrogen6 Lite][nitrogen6-lite], [Nitrogen6 MAX][nitrogen6-max], [Nitrogen6 VM][nitrogen6-vm]
  * TiWi-BLE and Murata WiFi/BT modules support
  * Same set of packages as `nitrogen8m_qt5_gst1_defconfig`
* `nitrogen6sx_qt5_gst1_defconfig`:
  * For [Nitrogen6_SoloX][nitrogen6-sx]
  * Same set of packages as `nitrogen6x_qt5_gst1_defconfig`
* `nitrogen7_gst1_defconfig`:
  * For [Nitrogen7][nitrogen7]
  * Same set of packages as `nitrogen6x_qt5_gst1_defconfig` minus Qt5
* `nitrogen6x_qt5_gst1_mainline_defconfig`:
  * For [BD-SL-i.MX6 (SABRE Lite)][sabrelite], [Nitrogen6X][nitrogen6x], [Nitrogen6X SOM v2][nitrogen6x-somv2], [Nitrogen6 Lite][nitrogen6-lite], [Nitrogen6 MAX][nitrogen6-max]
  * Same set of packages as `nitrogen6x_qt5_gst1_defconfig`
  * Mainline kernel

Build procedure
---------------

This procedure requires you to [have the repo tool installed on your system][repo].

1. Download the latest Buildroot and BD external trees:
```
$ repo init -u https://github.com/boundarydevices/buildroot-manifest -b master
$ repo sync -c
```

2. Create an output folder for your build:
```
$ make BR2_EXTERNAL=$PWD/buildroot-external-boundary/ -C buildroot/ \
  O=$PWD/output nitrogen8m_qt5_gst1_defconfig
$ cd output
```

3. Build the image:
```
$ make
```

4. Your rootfs image is ready!
```
$ ls -l images/sdcard.img
```

5. Create the SDK for this image (optional):
```
$ make sdk
```

Flashing procedure
------------------

You can simply use `dd` to flash an SD card:
```
$ sudo dd if=images/sdcard.img of=/dev/sdX bs=1M
```

If you want to flash the eMMC on your board, you can use the U-Boot UMS gadget as explained in [this blog post][emmc-flashing].
```
=> ums 0 mmc 1
```

Using the image
---------------

### Login information
The login for this image is `root` with no password.
```
Welcome to Buildroot
buildroot login: root
#
```

### GPU testing

##### NXP proprietary driver
If the configuration/platform supports 3D GPU, the Vivante example can be tested:
```
# cd /usr/share/examples/viv_samples/vdk/
# ./tutorial7
fps: 496.61
```

##### Mainline driver (etnaviv)
If the configuration/platform supports 3D GPU, make sure to try `kmscube`:
```
# kmscube -D /dev/dri/card1
```

### Qt5 demo
If the configuration includes Qt5 support, the Cinematic demo can be tested.

##### i.MX 8M (Quad, Mini, Nano)
Then the demo can be started:
```
# CinematicExperience-demo -platform wayland
```

##### i.MX 6/7 (Quad, Dual, Solo)
The NXP proprietary drivers require to setup the following variables:
```
# export FB_MULTI_BUFFER=3
# export QT_QPA_EGLFS_INTEGRATION=eglfs_viv
```

Then the demo can be started:
```
# CinematicExperience-demo -platform eglfs
```

### Gstreamer demo

If the configuration includes GStreamer support, the following pipelines can be tested:

##### i.MX 8M (Quad, Mini, Nano)
* VPU testing
```
# wget http://linode.boundarydevices.com/videos/trailer_1080p_h264_mp3.avi -P /root/
# gst-launch-1.0 filesrc location=/root/trailer_1080p_h264_mp3.avi ! \
  decodebin ! waylandsink
```
* Camera (MIPI) Streaming
```
# gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720 ! \
  waylandsink
```

##### i.MX 6/7 (Quad, Dual, Solo) NXP-based kernel
* VPU testing
```
# wget http://linode.boundarydevices.com/videos/trailer_1080p_h264_mp3.avi -P /root/
# gst-launch-1.0 playbin uri=file:///root/trailer_1080p_h264_mp3.avi
# gst-launch-1.0 filesrc location=/root/trailer_1080p_h264_mp3.avi ! \
  avidemux ! decodebin ! imxeglvivsink
```
* Camera (MIPI) Streaming to display using 3D GPU:
```
# gst-launch-1.0 imxv4l2videosrc device=/dev/video1 ! imxeglvivsink
```
* Camera (Parallel) Streaming to display using IPU:
```
# gst-launch-1.0 imxv4l2videosrc device=/dev/video0 ! \
  imxipuvideosink use-vsync=true
```
* Camera Streaming to display using PXP (i.MX7 / i.MX6SX):
```
# gst-launch-1.0 imxv4l2videosrc device=/dev/video1 ! \
  imxpxpvideosink use-vsync=true
```

##### i.MX 6/7 (Quad, Dual, Solo) Mainline kernel
```
# wget http://linode.boundarydevices.com/videos/trailer_1080p_h264_mp3.avi -P /root/
# gst-launch-1.0 filesrc location=/root/trailer_1080p_h264_mp3.avi ! avidemux ! \
  decodebin ! kmssink name=imx-drm sync=0
```

[bd-sdmac]: https://boundarydevices.com/product/bd_sdmac_wifi/ "BD-SDMAC WiFi/BT module"
[emmc-flashing]:https://boundarydevices.com/programming-emmc-on-i-mx-platforms "Programming eMMC on i.MX"
[nitrogen6x]:http://boundarydevices.com/nitrogen6x-board-imx6-arm-cortex-a9-sbc "Nitrogen6X product page"
[nitrogen6x-som]:http://boundarydevices.com/products/nitrogen6x-som "Nitrogen6X SOM product page"
[nitrogen6x-somv2]:http://boundarydevices.com/product/nit6x-som-v2/ "Nitrogen6X SOM v2 product page"
[nitrogen6-lite]:http://boundarydevices.com/products/nitrogen6_lite "Nitrogen6_Lite product page"
[nitrogen6-max]:http://boundarydevices.com/product/nitrogen6max "Nitrogen6_MAX product page"
[nitrogen6-vm]:http://boundarydevices.com/product/nitrogen6_vm_imx6 "Nitrogen6_VM product page"
[nitrogen6-sx]:http://boundarydevices.com/product/nit6_solox-imx6 "Nit6_SoloX product page"
[nitrogen7]:https://boundarydevices.com/product/nitrogen7 "Nitrogen7 product page"
[nitrogen8m]:https://boundarydevices.com/wiki/nitrogen8m-sbc "Nitrogen8M product page"
[nitrogen8m-som]:https://boundarydevices.com/wiki/nitrogen8m-som "Nitrogen8M SOM product page"
[nitrogen8mm]:https://boundarydevices.com/wiki/nitrogen8m-mini-sbc "Nitrogen8M_Mini product page"
[nitrogen8mm-som]:https://boundarydevices.com/wiki/Nitrogen8M_Mini-SOM "Nitrogen8M_Mini SOM product page"
[nitrogen8mn]:https://boundarydevices.com/wiki/nitrogen8m-nano-sbc "Nitrogen8M Nano product page"
[nitrogen8mn-som]:https://boundarydevices.com/wiki/nitrogen8m-nano-som "Nitrogen8M Nano SOM product page"
[nitrogen8mp-som]:https://boundarydevices.com/wiki/nitrogen8m-plus-som "Nitrogen8M Plus SOM product page"
[nitrogen8ulp]:https://www.ezurio.com/system-on-module/nxp-imx8/nitrogen8ulp-som "Nitrogen8ULP SOM product page"
[nitrogen93smarc]:https://www.ezurio.com/system-on-module/nxp-imx9/nitrogen93-smarc "Nitrogen93 SMARC product page"
[private-git]:https://boundarydevices.com/private-git-access/ "Private Git server access"
[sabrelite]:http://boundarydevices.com/sabre-lite-imx6-sbc "SABRE Lite product page"
[repo]:https://source.android.com/setup/develop#installing-repo "Installing repo"