The upgrade scripts goes in a tarball with local.conf at the top level. log.txt shows what happens when the package is installed. The script build.sh is used to create the binary update package used by mlinux-firmware-update. The tree is a follows: upgrade-4.0.0-4.0.1/ ├── install_list.txt ├── local.conf └── repo ├── arm926ejste │ ├── bluez5_5.47-m3.0_arm926ejste.ipk │ ├── bluez5-noinst-tools_5.47-m3.0_arm926ejste.ipk │ ├── bluez5-obex_5.47-m3.0_arm926ejste.ipk │ ├── bluez5-pand_5.47-m3.0_arm926ejste.ipk │ ├── bluez5-rfcomm_5.47-m3.0_arm926ejste.ipk │ ├── bluez5-testtools_5.47-m3.0_arm926ejste.ipk │ ├── libasound-module-bluez_5.47-m3.0_arm926ejste.ipk │ ├── libmts-io0_1.0.8-r0.0_arm926ejste.ipk │ ├── lora-network-server_2.0.19-r4.0_arm926ejste.ipk │ ├── Packages │ ├── Packages.gz │ ├── Packages.stamps │ └── python-pybluez_0.22-r0.0_arm926ejste.ipk ├── mtcap │ ├── mlinux-version_4.0.1_ea6ba1e5fb287003fea33522af39a771102713b2-r2.0_mtcap.ipk │ ├── mts-id-eeprom_0.3.8-r1.0.0_mtcap.ipk │ ├── Packages │ ├── Packages.gz │ └── Packages.stamps ├── mtcdt │ ├── mlinux-version_4.0.1_ea6ba1e5fb287003fea33522af39a771102713b2-r2.0_mtcdt.ipk │ ├── mts-id-eeprom_0.3.8-r1.0.0_mtcdt.ipk │ ├── Packages │ ├── Packages.gz │ └── Packages.stamps └── Packages If one puts the packages in a build tree at build/tmp/deploy/ipk, and run bitbake package-index, the Packages* files are refreshed. In this example, all MTCDT-like models as of today are supported. That is MTCDT, MTCDTIP, MTCDTIPHP, and MTCAP are supported in this update. install_list.txt would be a list of extra packages to install. We should probably have a remove_list.txt for cases where packages are obsolete.