Skip to content

ford: add 2025 F-150 Lightning fingerprint (ABS TL38, radar RB5T)#130

Merged
alan-polk merged 2 commits into
BluePilotDev:bp-devfrom
dirkpetersen:ford-lightning-2025-fingerprint
May 25, 2026
Merged

ford: add 2025 F-150 Lightning fingerprint (ABS TL38, radar RB5T)#130
alan-polk merged 2 commits into
BluePilotDev:bp-devfrom
dirkpetersen:ford-lightning-2025-fingerprint

Conversation

@dirkpetersen
Copy link
Copy Markdown
Contributor

@dirkpetersen dirkpetersen commented May 24, 2026

Summary

  • Adds two new FW strings to FORD_F_150_LIGHTNING_MK1 for the 2025 model year
  • Updates CarDocs year range from 2022-23 to 2022-25
  • Marks Ecu.eps non-essential for MK1 so the 2025 Lightning auto-detects despite an EPS query quirk

New firmware versions (VIN 1FT6W3L78SWG0XXXX, built April 2025)

ECU Address 2022–23 2025
ABS 0x760 PL38-2D053-AA / RL38-2D053-BD TL38-2D053-AD ← new
fwdRadar 0x764 ML3T-14D049-AL RB5T-14D049-AB ← new
EPS 0x730 RL38-14D003-AA unchanged ✓
fwdCamera 0x706 RJ6T-14H102-BBC unchanged ✓

Why non_essential_ecus={Ecu.eps: [MK1]} is required

The first commit (FW strings + year docs) was sufficient on devices that already had a cached CarParamsPersistent from a previously successful fingerprint. On a fresh CarParamsCache wipe — or on any other 2025 Lightning Flash being fingerprinted for the first time — the result is carFingerprint='MOCK' / dashcamOnly=True despite the patched fingerprints.py containing both new FW strings.

The 2025 Lightning's EPS ECU at 0x730 responds to Mazda's UDS query but not to Ford's auxiliary=True (bus 0) query. openpilot's brand-tagging logic records the Mazda response with brand='mazda' and the Ford logging-only response with logging=True. build_fw_dict(filter_brand='ford') keeps only Ford-tagged entries with logging=False, so the Ford matcher never sees an EPS FW string for matching. MK1's exact-match check fails on the EPS line and openpilot falls back to MOCK.

Verified on the actual 31-FW set captured from a 2025 Lightning Flash:

ecu=abs       0x760 ford  False  TL38-2D053-AD    ← matching-eligible ✓
ecu=fwdCamera 0x706 ford  False  RJ6T-14H102-BBC  ← matching-eligible ✓
ecu=fwdRadar  0x764 ford  False  RB5T-14D049-AB   ← matching-eligible ✓
ecu=eps       0x730 ford  True   RL38-14D003-AA   ← LOGGING ONLY, filtered out
ecu=eps       0x730 mazda False  RL38-14D003-AA   ← Mazda's response, wrong brand

With this patch:

match_fw_to_car(<31-FW set>, "1FT6W3L78SWG05094")
  → {CAR.FORD_F_150_LIGHTNING_MK1}   exact=True

Without this patch (just the FW strings): set(), falls back to MOCK.

False-match safety

With EPS marked non-essential, the matcher uses abs + fwdCamera + fwdRadar for MK1. Verified unique:

  • TL38-2D053-AD (ABS): only in MK1 (added by this PR)
  • RB5T-14D049-AB (radar): only in MK1 (added by this PR)
  • RJ6T-14H102-BBC (camera): also in F-150 MK14, but MK14's ABS list (ML34/NL34/PL34/PL3V) is disjoint from MK1's so no false-match risk

So non_essential_ecus={Ecu.eps: [MK1]} does NOT create cross-platform ambiguity. Other Ford platforms (MK14 / Mustang / Edge / etc.) keep EPS as essential and are unaffected.

Test plan

  • match_fw_to_car on the actual 2025 Lightning Flash's 31-FW dump returns {FORD_F_150_LIGHTNING_MK1} with exact=True
  • Same matcher returns set() (i.e. fingerprinting fails → MOCK) without the non_essential_ecus line
  • Verified on-device: 2025 Lightning Flash (131 kWh battery, Co-Pilot360 Assist 2.0). Same platform as 2022–23, only ABS and radar firmware updated.
  • No false matches against the 11 other Ford platforms — the new FW strings (TL38, RB5T) are MK1-unique.

New FW strings found on 2025 Lightning Flash (131 kWh, built April 2025):
- ABS 0x760: TL38-2D053-AD (was PL38/RL38 on 2022-23)
- fwdRadar 0x764: RB5T-14D049-AB (was ML3T on 2022-23)
- EPS and fwdCamera unchanged from existing MK1 entries

Updates CarDocs year range to 2022-25.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
The 2025 F-150 Lightning Flash's EPS ECU at 0x730 responds to Mazda's UDS
query (which targets the same OBD-II address) but does NOT respond to
Ford's own auxiliary=True (bus 0) query in FW_QUERY_CONFIG. openpilot's
brand-tagging logic records the Mazda response with brand='mazda' and the
Ford logging-only response with logging=True. build_fw_dict(filter_brand='ford')
keeps only Ford-tagged entries with logging=False, so it never sees an
EPS FW string for matching. Without an EPS entry, MK1's exact-match check
fails on the eps line, and openpilot falls back to MOCK / dashcam mode
on first fingerprint attempt — even though the patched fingerprints.py
correctly contains TL38-2D053-AD and RB5T-14D049-AB.

Adding MK1 to non_essential_ecus[Ecu.eps] tells the matcher to skip the
EPS check for MK1 when no Ford-tagged matching-eligible EPS FW is present.
The 3 ECUs that DO respond cleanly to Ford's auxiliary query (abs at 0x760,
fwdCamera at 0x706, fwdRadar at 0x764) are sufficient to uniquely identify
MK1:
  - TL38-2D053-AD (ABS):    unique to MK1
  - RB5T-14D049-AB (radar): unique to MK1
  - RJ6T-14H102-BBC (cam):  also in F-150 MK14, but MK14's ABS list is
                            disjoint from MK1's so no false-match risk

Verified: with this patch applied, match_fw_to_car on the actual 31-FW
set returned by a 2025 Lightning Flash returns
{CAR.FORD_F_150_LIGHTNING_MK1} exact=True. Without the patch, it returns
the empty set.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@alan-polk alan-polk merged commit 3706b56 into BluePilotDev:bp-dev May 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants