# 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`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.cubepilot.org/user-guides/herelink/herelink-user-guides/oem-image-setup.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
