Skip to content

zoompilotjetlinkwiki

How zoompilot identifies your car

zoompilot identifies the car at startup to pick its measurements and features. On a Mazda it also checks for a compatible Mazda EPS (2022+), including a swapped one.

  1. Part firmware. zoompilot reads the firmware versions of the car's ECUs. A match to one known model settles it.
  2. VIN. If not, it reads the VIN. The WMI (characters 1 to 3), model line (4 and 5) and model year (10) must all name one model. An ambiguous VIN gives no match.
  3. Export cars. JM0 VINs (Australia, New Zealand) have no model year. For these only, two parts must agree: a compatible Mazda EPS (2022+), and an engine computer whose firmware names exactly one model.

The VIN step matters most after a motor swap, because a donor EPS reports another model's firmware.

compatible eps

If the EPS firmware is one of three known versions, the car has a compatible Mazda EPS (2022+), whatever the model or year. If the EPS does not answer, zoompilot assumes the factory motor: compatible on the CX-5 2022–25 and CX-8 2023.

Torque limit, steering tune and steering delay are the same on every Mazda EPS. A compatible one changes only:

  • Minimum steering speed. It steers down to a stop. An older one stops below 28 mph (45 km/h) and returns above 32 mph (52 km/h).
  • Experimental speed control. Alpha Longitudinal is offered only with a compatible motor and a supported radar.
  • Steering dropouts. A block leaves steering on instead of turning it off.
  • Speed-band starting values (below).

eps swap

  • What it unlocks. Steering down to a stop, and eligibility for Alpha Longitudinal. The CX-5 2012–16 and CX-9 2016–20 also need zoompilot to detect the G46L radar.
  • What it does not do. It does not raise the torque limit or turn Alpha Longitudinal on. That stays off until you enable it, and it disables Mazda's AEB and FCW while on.
  • Check the part, not the year. Model year alone does not confirm a donor part: some 2022–25 CX-5s report older firmware that does not count.
  • Starting values. Base steering values still come from your car's model. The speed bands start from the CX-5 2022–25's learned values on a swapped CX-5 2012–21, CX-9 2016–20, Mazda 3 or Mazda 6. A CX-9 2021+ starts from values learned on a swapped CX-9. Self-tune then learns your car.

This wiki gives no mechanical, wiring or alignment instructions. Ask in Discord about your car and donor part, with its firmware version.

what you'll notice

  • No Mazda is dashcam-only. Every recognised Mazda uses the same EPS hardware, and zoompilot's limits are measured on it. An older motor keeps its 28 mph (45 km/h) floor.
  • CX-8. The CX-8 2023 has no VIN code zoompilot reads, so zoompilot recognises it by firmware alone.
  • JM0 cars. Their clusters show the set speed slightly high. zoompilot uses the number your cluster shows.
  • Wrong car. Turn steering off and share a drive.
  • Settings → Vehicle. Leave it on automatic. A forced selection applies that model's measurements to your car and unlocks nothing: the EPS check still reads your motor.
VIN codes
Value What it means
JM1 Japan-built cars: Mazda 3, Mazda 6.
JM3 Japan-built crossovers for North America.
JM7 Japan-built crossovers for export markets. Same model and year codes as JM3.
3MZ Mexico-built Mazda 3.
JM0 Australia and New Zealand exports. No model year, so only the swap check applies.
Model Model line Years (code) WMIs
CX-5 KE 2012–16 (C to G) JM3, JM7
CX-5 KF 2017–21 (H to M) JM3, JM7
CX-5 KF 2022–25 (N to S) JM3, JM7
CX-9 TC 2016–20 (G to L) JM3, JM7
CX-9 TC 2021–23 (M, N, P), export 2025 (S) JM3, JM7
Mazda 3 BN 2017–18 (H, J) JM1, 3MZ
Mazda 6 GL 2017–21 (H to M) JM1

vin decoder

Enter a VIN or its first 10 characters. Decoding runs in your browser; the VIN never leaves this page.

For developers
  • Brand matcher: opendbc_repo/opendbc/car/mazda/values.py, platform_from_vin and match_fw_to_car_fuzzy. It runs after upstream's exact and generic fuzzy firmware match (opendbc/car/fw_versions.py, match_fw_to_car).
  • Platform table: MazdaPlatformConfig.wmis, chassis_codes, years per CAR entry. MAZDA_CX8_2023 has none.
  • EPS check: CarInterface._get_params in interface.py. STEER_TO_ZERO_EPS_FW = KBST-3210X-A-00, KSD5-3210X-C-00, K0A1-3210X-A-00. Unread EPS falls back to STEER_TO_ZERO_PLATFORMS = {MAZDA_CX5_2022, MAZDA_CX8_2023}. Otherwise minSteerSpeed = LKAS_LIMITS.DISABLE_SPEED (45 kph) and MazdaFlags.LEGACY_FW_EPS.
  • MazdaSafetyFlags.EPS_HW is set on every Mazda: panda's MAZDA_EPS_HW_STEERING_LIMITS (1200, 12/12) apply to both firmwares. steerActuatorDelay = 0.14 for all.
  • alphaLongitudinalAvailable = steer_to_zero and (Bus.radar in DBC[candidate] or g46l_radar). MAZDA_CX5_KE and MAZDA_CX9 have no radar bus.
  • Non-delivery latch: STEER_UNDELIVERED_FRAMES = 20, alert after 80 more frames above STEER_UNDELIVERED_ALERT_MIN_SPEED (12 mph); steerTempUnavailable becomes steerTempUnavailableSilent (sunnypilot/selfdrive/car/car_specific.py).
  • Speed bands: torque_data/speed_dependent.toml, requires_steer_to_zero read by get_speed_dep_config_for_car (opendbc/sunnypilot/car/lateral_tune.py). Base values: params.toml via substitute.toml (MAZDA_CX9_2021), TORQUE_TUNES for MAZDA_CX5_2022.
  • JM0: MazdaFlagsSP.OCEANIA_CLUSTER, cluster speed = held / 0.98 + 1 km/h. A selected platform that disagrees with the VIN logs platformBundleVinMismatch.
  • Engineering record: https://github.com/zoompilot/zoompilot/blob/develop/docs/zoompilot/mazda-fingerprinting.md. Measurements and route data live in the private zoompilot-research repository.

This is experimental software. You drive the car, follow the law, and carry all the risk. Read the safety page first.

zoom-zoom-zoom · by Zeph Leggett