Home

Tracer 9 GT+ software update file format

You can obtain software updates for your Yamaha Tracer from:
https://www.yamaha-motor.eu/kv/en/service-support/connectivity/ccu-updates/

This is a zip file, similar to a Java JAR.

After I updated my bike, 006-B3195-00.update.log was created, as well as an empty "006-B3195-00.stale.cookie" file. The USB key was mounted on /run/media/sda1. The "App" selection was greyed out until turned the bike off and on again.

It has a "manifest.xml" file with the SHA256 hash of the other files, and a "type" field, which is "rootfs" or "raw". If the type is "raw", it also has "device" and "offset" fields. The devices are "/dev/mmcblk0" and "/dev/mmcblk0boot0"
The "product" is "yamaha-lyww20" and lyww20 is Yamaha's part number for the Tracer 9 GT+
If you google this, you get "Garmin Communication Control Unit LYWW20" which apparently a "motorcycle link box" that does Bluetooth and Wi-Fi using a Marvell chipset

The "productNumber" is "006-B3195-00" which matches the filename, and the "type" is "FullSWUpdate"
The "newSwVersion" is what is displayed on the dash, and must be a number with 2 decimal places.
      <?xml version="1.0" ?>
      <manifest metadataVersion="4">
        <!--Update Metadata-->
        <updateInfo newSwVersion="2.40" product="yamaha-lyww20" productNumber="006-B3195-00" type="FullSWUpdate"/>
        <file name="gear-image-garmin-sta1295-lawrence-lyww20.ext4" sha256="a86f88cc1077c355fbd86835dbc0152d934194163de41c0a19f16466b526787c" type="rootfs"/>
        <file device="/dev/mmcblk0boot0" name="m3_xloader.bin.xl1" offset="0x00000000" sha256="7a38cf1ec39ff5d60a5c4ef36eceb704df062a0aeb855b4937f2d23b979be3b1" type="raw"/>
        <file device="/dev/mmcblk0boot0" name="m3_xloader.bin" offset="0x00000040" sha256="ae87bb60f833e8fcb4f26e3a34f4252f9eeb7275fd03151c7f8d728db2664fe8" type="raw"/>
        <file device="/dev/mmcblk0" name="garmin-sta1295-lawrence-lyww20-uboot-env.txt.bin" offset="0x00004400" sha256="63114772c52ff60e679ee30164747577567b98e0aca64fe1faa4d8008f16c7ab" type="raw"/>
        <file device="/dev/mmcblk0" name="m3_car_radio.bin.xl1" offset="0x0000c400" sha256="75470b52d0585065a0ba580fb3128000098ac3a284bfa45452a2ef57db0af969" type="raw"/>
        <file device="/dev/mmcblk0" name="m3_car_radio.bin" offset="0x0000c440" sha256="7630d9c47b06dc3f6d297646ff12e495069dea3e1f167ac9515a6bb1c987c23b" type="raw"/>
        <file device="/dev/mmcblk0" name="u-boot.bin.xl1" offset="0x0004c400" sha256="47de0c85d24a978e25086b898c472719f490132104d330b46301da17b1a60140" type="raw"/>
        <file device="/dev/mmcblk0" name="u-boot.bin" offset="0x0004c440" sha256="58082d7df1c31eda967d58a65f9e3153780ea3823c2cc8e5ea13292c5b903b88" type="raw"/>
        <file device="/dev/mmcblk0" name="splash.rgb.xl1" offset="0x000cc400" sha256="6270d2a99b6aeb474393de4486b5f39e7d72005ee60acd3283e694d95ef9e3a5" type="raw"/>
        <file device="/dev/mmcblk0" name="splash.rgb" offset="0x000cc440" sha256="83e10fa2327fabfd505e5c3079cadf9f5ef8ec36a5ef492c938d0c446ef1b388" type="raw"/>
      </manifest>
    
The garmin-sta1295-lawrence-lyww20-uboot-env.txt.bin file looks like a bootloader config file.
    console=console=tty0 consoleblank=0 console=ttyAMA3,115200n8
    loadaddr=A0000000
    loadzaddr=A1000000
    kernel_image=/boot/uImage
    verify=n
    boardname=sta1295-lawrence-lyww20
    fdtroot=/boot
    boardrev=0
    fdtfile=${fdtroot}/${boardname}.dtb
    partfile=bootpart
    mmcdev=1
    mmcbootpart=1:1
    mmcrootpartA=1:2
    mmcrootpartB=1:3
    mmcrootdevA=/dev/mmcblk0p2
    mmcrootdevB=/dev/mmcblk0p3
    mmcloadfdt=ext4load mmc ${mmcrootpart} ${fdtaddr} ${fdtfile}
    mmcload=ext4load mmc ${mmcrootpart} ${loadzaddr} ${kernel_image}
    mmcboot=echo Booting from MMC${mmcdev}...; run mmcargs; bootm ${loadzaddr} - ${fdtaddr}
    mmcselect=mw.l ${loadzaddr} 0 1; load mmc ${mmcbootpart} ${loadzaddr} ${partfile} 1; if itest.s *${loadzaddr} == B; then setenv mmcrootpart ${mmcrootpartB}; setenv mmcrootdev ${mmcrootdevB}; else setenv mmcrootpart ${mmcrootpartA}; setenv mmcrootdev ${mmcrootdevA}; fi;
    serial#=01010101
    genfdtfilename=setenv fdtfile $fdtroot/$boardname-rev$boardrev.dtb;
    bios_file=/lib/firmware/bios.bin
    sbios_file=/lib/firmware/s-bios.bin
    bios_addr=0xDFFD0000
    sbios_addr=0xDFFC0000
    bank=0
    commonargs=ro rootwait earlyprintk quiet elevator=noop coherent_pool=4M
    mmcargs=setenv bootargs ${console} root=${mmcrootdev} rootfstype=ext4 ${commonargs}
    bootcmd=run mmc_setup falcon_setup; fb; run normal_boot
    mmc_setup=mmc dev ${mmcdev}; run mmcselect
    normal_boot=run mmcload genfdtfilename mmcloadfdt mmcboot
    falcon_load=ext4load mmc ${mmcrootpart} ${bios_addr} ${bios_file}; ext4load mmc ${mmcrootpart} ${sbios_addr} ${sbios_file}
    falcon_setup=run falcon_load; biosinit ${bios_addr} ${sbios_addr} ${bank}
    fdtaddr=0xA0FE0000
    
One of the files is a Linux ext4 filesystem image. This can be mounted with
mount -o ro,loop gear-image-garmin-sta1295-lawrence-lyww20.ext4 /mnt/temp

This is an entire bootable Linux system, compiled for 32-bit Cortex-A7 ARM v7 hard-float processors (according to readelf -a /bin/bash) with systemd, wayland, and mosquitto

It seems to run a mosquitto MQTT message broker. I haven't been able to verify this.

It looks like it uses Wayland for the display, which is a successor to X11 (X Windows)

It has MiracleCast, which is probably how the Garmin navigation software displays on the bike. This is (rather hostile) open source, so I might be able to write something to display on the bike.

I was able to discover it has Gracenote media ID/metadata management software, and the FrogLogic Squish commercial cross-platform GUI and regression testing tool installed in /opt, neither of which are mentioned in the software licenses UI.

Interesting files:

/opt/garmin/share/keys/ConsumerAOEM_Yamaha_LYWW20_EXT.x509
This is the certificate that verifies the "manifest.sig" file in the update to ensure that it's been signed by Yamaha. It's mentioned in the update log. This "manifest.sig" file is checked by the bike and the update immedately fails if it doesn't match.
To confirm this, extract the public key from X.509 certificate:
openssl x509 -in /mnt/temp/opt/garmin/share/keys/ConsumerAOEM_Yamaha_LYWW20_EXT.x509 -noout -pubkey > ConsumerAOEM_Yamaha_LYWW20_EXT.pem
Then verify it:
openssl dgst -verify ConsumerAOEM_Yamaha_LYWW20_EXT.pem -keyform pem -sha256 -signature manifest.sig -binary manifest.xml
This prints "Verified OK"

If you wanted to sign a firmware file, it would probably be something like:
openssl dgst -sha256 -sign "your private key" -out manifest.sig manifest.xml
Of course, we don't have Yamaha's/Garmin's private key, so we can't sign firmware updates and have them accepted by the bike.

/etc/garmin-part-number
matches the manifest.xml productNumber

/etc/os-release
ID="gear"
NAME="Poky (Yocto Project Reference Distro)"
VERSION="2.2.4 (morty)"
VERSION_ID="2.2.4"
PRETTY_NAME="Poky (Yocto Project Reference Distro) 2.2.4 (morty)"

/opt/garmin/share/hmi_k2/eula/copyrights-en_US.txt
This is the same as the software licenses displayable through Applications ⇒ Settings ⇒ System ⇒ Legal ⇒ 3rd party licenses in the bike's user interface.