Announcement

Collapse
No announcement yet.

Changing Odometer Display (Miles ↔ KM) on BMW E36 VDO Cluster (HW 7.1 / SW 24)

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Changing Odometer Display (Miles ↔ KM) on BMW E36 VDO Cluster (HW 7.1 / SW 24)

    I wanted to share my findings after trying to change the odometer display from miles to kilometers on a VDO cluster from a BMW E36 M3 (US) (HW 7.1 / SW 24).
    Cluster identified as BMW part number 88 311 221, VDO reference 110.008.463/179.



    Initial Attempts (NCS Expert / DIS)

    I started with NCS Expert, using the profile KMB_E36.C27. While the cluster can be read and coded, the miles/kilometers setting does not appear to be exposed as a standard coding parameter and seems to be stored in the manufacturer data.

    I also tried using DIS v44, including changing the vehicle coding from USA to Canada, expecting it to switch the odometer to kilometers.

    • This had no effect on the odometer units



    Attempt 1: Swapping Partial EEPROM Data

    To begin experimenting, I first needed access to the cluster’s EEPROM. I got a cheap CH341A programmer, and after some wiring modifications, I was able to successfully read the 93C46 EEPROM on the cluster. This allowed me to dump the original data and work directly with the contents instead of relying on coding tools.

    With the EEPROM dump available, I then tried copying partial sections from EU cluster dumps (not full dumps, in order to retain my original mileage and VIN).


    This partially worked, but caused multiple inconsistencies:

    • My car is a US-spec M3

    • EU clusters differ in several ways:
    • Speedometer scaling (km/h vs mph variants)
    • Tachometer/redline scaling
    • Gauge layout differences:
    • US M3 → fuel consumption gauge
    • EU M3 → oil temperature gauge

    Because of these differences, using EU data resulted in:

    • Incorrect scaling

    • Mismatched gauges

    • General inconsistencies


    During this process, I also noticed that the unit display is tied to the internal EEPROM, not the coding plug.



    EEPROM Dump & Analysis

    After comparing multiple dumps, I identified a consistent 16-byte manufacturer data block:

    • Bytes 5–6 are always 1A 11 (useful as a signature)

    • The last byte (byte 16) is a checksum

    • The checksum is a simple XOR of the first 15 bytes

    (See screenshot below)
    Click image for larger version

Name:	Screenshot 2026-04-09 121424.jpg
Views:	39
Size:	116.9 KB
ID:	351104


    Locating the Unit (Miles/KM) Bit

    Within this 16-byte block:

    • The 4th byte contains configuration flags

    • Bit 5 controls miles vs kilometers


    Example:

    • Original: 0x62 → 0110 0010

    • Toggle bit 5 → 0100 0010

    • Result: 0x42



    Updating the Checksum

    After modifying the data:

    • Recalculate the checksum (last byte of the 16-byte block)

    • Checksum = XOR of bytes 1–15

    This step is required.


    Once everything is updated:

    1. Write the modified EEPROM back to the cluster

    2. The display will now show km instead of miles (or vice versa)


    Important: Odometer Value Adjustment

    After switching between miles and kilometers:

    • The cluster does not automatically convert the stored mileage value

    • The numeric value will remain the same, even though the displayed unit changes


    This means the displayed distance will no longer be accurate relative to the new unit.


    To correct this, the mileage must be adjusted in both:

    • Internal EEPROM

    • Coding plug (external EEPROM)



    I can’t confirm this applies to all clusters, but for my VDO cluster with HW 7.1 / SW 24 it worked as described.

    Hope this helps someone.
Working...
X