Hyundai Motor Group (Hyundai, Kia, Genesis) head unit firmware updates on Linux using the nudl tool

Helmut Neukirchen, 15. October 2026

Original updater supports only Microsoft Windows and Apple Mac OS X

While the more modern Hyundai Motor Group (Hyundai, Kia, Genesis) vehicles can do over-the-air (OTA) updates of at least the head unit firmware (gives you, e.g., new map data for the navigation system, but occasionally also new features), they want you to have a subscription for that to cover the mobile data costs (for European models, the map alone is a hefty 17 GB transfer). But you can still do an old-school firmware update (also for the older vehicles that do not even have OTA) by downloading the update files from their server and then copying them on a USB key. However, HMG wants you to use their software that downloads their files and copies them on a USB key -- and that software does not run on Linux (and even navigating to their download page is already refused if your browser's User-Agent header says that your browser runs on Linux).

Nudl to the rescue

One of my blog readers pointed me to the nudl tool (thanks, Joachim):

The nudl tool runs on Linux, Windows, macOS and can download firmware updates for cars from Hyundai, Kia, Genesis: https://github.com/chenxiaolong/nudl. If you trust the supply chain, you can download a zip file from the Release page that contains a statically linked binary which runs with normal user permissions.

After unzipping, you can simply run the nudl binary. As the HMG server does some GeoIP, you will automatically get the correct firmware image for your region from the HMG update server.

For my EU Kia EV6 (but for other vehicles, e.g. Hyundai Ioniq 5, you would just need to change the parameters), I used:

./nudl list -b kia | grep EV6

As of 10/2026, this printed:

2025_26_EV6_GT_EUR               "2025-26 EV6 GT"          CV1GT26.EUR.ccNC.001.002.260312
2025_26_EV6_GT_EUR               "2025-26 EV6 GT"          CV1GT.ERT.ccNC_Lite.001.002.260312
2025_26_EV6_GT_EUR               "2025-26 EV6 GT"          CV1GT26.ERT.ccNC_Lite.001.002.260312
2025_26_EV6_GT_EUR               "2025-26 EV6 GT"          CV1GT.EUR.ccNC.001.002.260312
EV6_MY_22_EU                     "2022-24 EV6"             CV_E.EUR.S5W_L.001.001.260128
2025_26_EV6_EUR                  "2025-26 EV6 PE"          CV1MY26.EUR.ccNC.001.002.260312
2025_26_EV6_EUR                  "2025-26 EV6 PE"          CV1.EUR.ccNC.001.002.260312
2025_26_EV6_EUR                  "2025-26 EV6 PE"          CV1.ERT.ccNC_Lite.001.002.260312
2025_26_EV6_EUR                  "2025-26 EV6 PE"          CV1MY26.ERT.ccNC_Lite.001.002.260312

As my EV6 is model year 2022, i.e. MY22 with the old Standard Gen5W Navigation, the entry EV6_MY_22_EU is relevant for me. For extra thoroughness, you can double-check via:

./nudl list -b kia -m EV6_MY_22_EU

which correctly printed (note the 5W, meaning Generation 5 Wide Navigation, in the version number):
MODEL NAME VERSION
EV6_MY_22_EU "2022-24 EV6" CV_E.EUR.S5W_L.001.001.260128

(In addition, you can also double-check by comparing to the latest update available on the European KIA update server.)

I then created a directory with that version name and let nudl download into that directory using the -o parameter:

./nudl download -b kia -m EV6_MY_22_EU -o "CV_E.EUR.S5W_L.001.001.260128"

If your download was aborted, you can resume by just re-running the above command. If you then want to verify the checksums, point nudl to the directory that was used for that version:
./nudl verify -d "CV_E.EUR.S5W_L.001.001.260128"
Typically, that verification step is not really needed as the car itself also checks file integrity before installation.

Format USB key as exFAT

This is 25 GB of data, so have at least a 32 GB USB key (the newer ccNC-based head units might have even a 55 GB firmware update).

Also, USB keys tend to be slow, so this can take half an hour or more with a slow USB key: If you have multiple USB keys, check for reviews of their write speed. For example, I have one USB 3 key that takes 45 minutes for writing the 25 GB update files (that is slower than USB 2.0 speed) and another USB 3 key where that takes just 5 minutes.

The USB key needs to be formatted as exFAT (while some forum posts claim that FAT32 should be fine as well, the map data file alone is 17 GB and FAT32 has a maximum file size of 4 GB, so FAT32 will simply not work).

To format as exFAT, first check what device is assigned by Linux to your USB key:

lsblk

On my system, it is /dev/sda, so I use that below.

If the USB key is mounted, unmount it:
sudo umount /dev/sda

Wipe the old raw filesystem signature to prevent the car from getting confused by leftover superfloppy metadata:
sudo wipefs -a /dev/sda

Create an MBR partition table with a single exFAT partition:
printf "label: dos\ntype=7\n" | sudo sfdisk /dev/sda

Format that single partition (i.e. /dev/sda1) as exFAT (I named it KIAEV6):
sudo mkfs.exfat -n "KIAEV6" /dev/sda1

Copying files to USB key

Finally, copy the downloaded files directly from the directory (but without the directory itself) to the root directory of the USB key:

USB Drive/
├── .lge.upgrade.xml
├── .whatsnew.tar.gz
├── AppUpgrade
├── EV6_MY_22_EU.ver
└── HU/

(Note that you cannot simply ungzip/untar, e.g., the .whatsnew.tar.gz as all the files are encrypted. But there are tools for messing around with the firmware of Gen 5 and Gen 5 Wide head units. There is even a root exploit for Gen5W available that lets you modify the firmware. The less brave can inject via the ODB port a CAN bus signal to activate manual battery pre-condition. Do this all at your own risk!)

If you use cp for copying, you can also use the -v flag to see some sort of progress, i.e.: cp -av. Make sure to also copy the dot files: .lge.upgrade.xml .whatsnew.tar.gz

Next time, I will try to get even better progress:
rsync -rltvh --info=progress2 CV_E.EUR.S5W_L.001.001.260128/ /media/helmut/KIAEV6/

Finally, flush the buffers and unmount:

sync && sudo umount /dev/sda1

Update the car

Start the car and insert the USB key: while it will first complain that it did not find any media files, after a few seconds, it should find the update.

The update runs for half an hour or so (as the USB A port that needs to be used in the KIA EV6 is USB 2 speed, your USB key's speed does matter anymore and reading alone takes ca. 15 minutes -- only after that, decryption, checksum verification, and flashing to the head unit's eMMC memory take place).

Therefore, take care that your 12 V battery does not run empty (EV6 owners should be able to choose "Later" and then turn the car off; after that, the very same update dialogue should be shown again where you can then choose "Update Now" and leave the car and lock the doors. Combustion engine cars probably need to be driven while doing the update, i.e. navigation will not be usable during the update, but the rest of the car will work).

No VM needed anymore on Linux for running the updater

I had some older instructions involving running Microsoft Windows in a VM, but thanks to nudl, there is no need for a Windows VM anymore, as it has become much easier!