> For the complete documentation index, see [llms.txt](https://docs.cubepilot.org/user-guides/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cubepilot.org/user-guides/herelink/herelink-user-guides/oem-image-setup.md).

# OEM Image Setup

## **Linux**

**Prerequisites：**

Android-tools：<https://developer.android.com/studio/releases/platform-tools>

**Step**

* Download and unzip following files:
* simg2img]\(<https://herelinkfw.cubepilot.org/tools/simg2img\\_linux.zip>)
* img2simg]\(<https://herelinkfw.cubepilot.org/tools/img2simg\\_linux.zip>)
* Remote Unit: [oem\_ru\_base.img](https://herelinkfw.cubepilot.org/tools/oem_ru_base.img)
* Air Unit: [oem\_au\_base.img](https://herelinkfw.cubepilot.org/tools/oem_au_base.img)
* Ensure that you select the base image depending upon which unit you are modifying.
* Download and extract zips into same directory.
* Now to generate ext4fs image from the sparse image (.img) downloaded above do `./simg2img_mac oem_au_base.img raw_oem_au_base.img`
* Create a mount point directory using `mkdir oem`
* Mount the image using `mount raw_oem_au_base.img oem`
* Now you should be able to modify files inside the mount directory.
* You need to use `sudo` to be able to do any writes the files inside the mount point.
* Once you have made your changes, you need to unmount your drive using command `sudo umount oem`
* Afterwards convert the ext4fs image back to android sparse image using command `./img2simg raw_oem_au_base.img oem_au.img`
* Now you may flash this image into Herelink Air Unit, by putting it under bootloader using command `adb reboot bootloader`
* And finally to flash to image run command `fastboot flash oem oem_au.img`
* Check example below for a sample modification.

## **MacOS**

**Prerequisites：**

Homebrew：<https://brew.sh/>

Android：<https://developer.android.com/studio/releases/platform-tools>

**Step**

* Setup osxfuse in your system using `brew cask install osxfuse`, this will require rebooting your system proceed and do that。
* Follow the steps [here](https://github.com/alperakcan/fuse-ext2#macos) to install fuse-ext2. This will allow you to mount ext4fs we will be generating.

  <https://github.com/alperakcan/fuse-ext2#macos>
* Download and unzip following files:
  * simg2img：<https://herelinkfw.cubepilot.org/tools/simg2img\\_mac.zip>
  * img2simg：<https://herelinkfw.cubepilot.org/tools/img2simg\\_mac.zip>
  * Remote Unit：<https://herelinkfw.cubepilot.org/tools/oem\\_ru\\_base.img>
  * Air Unit：<https://herelinkfw.cubepilot.org/tools/oem\\_au\\_base.img>
* Ensure that you select the base image depending upon which unit you are modifying.
* Download and extract zips into same directory.
* Now to generate ext4fs image from the sparse image (.img) downloaded above do

  `./simg2img_mac oem_au_base.img raw_oem_au_base.img`
* Create a mount point directory using

  `mkdir oem`
* Mount the image using
* `fuse-ext2 raw_oem_au_base.img oem -o rw+`
* Now you should be able to modify files inside the mount directory.
* You need to use `sudo` to be able to do any writes the files inside the mount point.
* Once you have made your changes, you need to unmount your drive using command

  `sudo umount oem`
* Afterwards convert the ext4fs image back to android sparse image using command

  `./img2simg raw_oem_au_base.img oem_au.img`
* Now you may flash this image into Herelink Air Unit, by putting it under bootloader using command

`adb reboot bootloader`

* And finally to flash to image run command：

  `fastboot flash oem oem_au.img`

**Example：**

* In the following example we change the system\_id used by herelink air unit for board specific messages.
* Most config files are located in you unit at `/system/etc`in the following example we will pull config using command `adb pull /system/etc/system-control.telepathy-air.conf`
* Once pulled the file will contain information like bellow:

`# module on/off`

`board_control_enabled = true`

`d2d_tracker_enabled = true`

`camera_control_enabled = true`

`# board control`

`board_system_id = 42`

`# camera control`

`video_stream_ip_address = 192.168.0.10`

`camera_system_id = 42`

`support_multiple_camera = true`

`support_camera_capture = false`

* You can change the value of `board_system_id` and `camera_system_id` fields as per your requirement in your favourite editor.
* Once done save this file and exit editor.
* Create a folder inside oem image called `etc` using command `sudo mkdir oem/etc`
* Copy file using command `sudo cp system-control.telepathy-air.conf oem/etc/`
* Continue to unmount the image and flashing into the unit as described in above steps.

### **Example App Change**

* In the following example we override the installed QGroundcontrol App.
* A new OEM app can be installed under /oem/app//.apk
* For installing your custom version of QGroundcontrol, ensure that you started with <https://github.com/cubepilot/qgroundcontrol-herelink> as your base.
* After building the project, create a folder `QgroundControl`
* Copy .apk file `cp -r build-qgroundcontrol-Android_for_armeabi_v7a_Clang_Qt_5_11_0_for_Android_armv72_fd6ff4-Debug/android-build/build/outputs/apk/android-build-debug.apk QGroundControl/QGroundControl.apk`
* Also create a lib directory `QGroundControl/lib`
* Copy libraries `cp -r build-qgroundcontrol-Android_for_armeabi_v7a_Clang_Qt_5_11_0_for_Android_armv72_fd6ff4-Debug/android-build/libs/armeabi-v7a/ QGroundControl/lib/arm/`
* Finally move QgroundControl directory to oem image `sudo cp -r QGroundControl oem/app/QGroundControl`
* Do ensure you have already created app directory inside oem image if not already done `sudo mkdir oem/app`
* Continue to unmount the image and flashing into the unit as described in above steps.

### **Extra OEM Files：**

* On boot several files are setup for use, and you can override these files
* These files can exist in (searched in this order)

`/data/oem/etc - user default - wiped on factory reset`

`/oem/etc - oem default`

`/system/etc - system default`

* files that can be overridden (optimus is the internal GCS name, telepathy-air is the air unit (ro.product.device))

`lampsignal-telepathy-air.json`

`rc_service_config_optimus.ini`

`mavlink-router.optimus.conf`

`system-control.optimus.conf`
