Skip to content

Firmware Embedded Java Application Layer

Kristiyan edited this page Oct 3, 2026 · 22 revisions

The embedded Java application layer — where Bluetooth, climate, and the real UI actually live

Part of Firmware Reversing. Resolves a question this wiki had open for a while: why do well-documented real RNS-510 features (Bluetooth hands-free, steering-wheel/MFSW integration, climate-control display, parking sensors) never appear anywhere in the native PowerPC C++ symbol/EH-descriptor table, no matter how it's searched?

The answer: they're not native code at all — they're Java

A direct raw-byte string search across the complete 85.6MB FHDD6.FLI (not just the 24MB native-code region this wiki otherwise focuses on) for Bluetooth/climate/parking-sensor keywords immediately surfaced literal Java class-path strings — class$vdo$most$dev$app$phon..., Lvdo/dvc/pdc/impl/parrot/CT... — not native symbols. Pulling every Lvdo/.../Lwdg/...-style Java class signature out of the whole file found 2,806 distinct class paths, archived in full at references/java_classpaths_2806.txt. This is a real, substantial, previously entirely unexplored embedded Java application layer — not a handful of stray classes.

Confirms the specific features directly:

  • Bluetooth: SC_bluetooth_audio_EUR, BluetoothCon, BapPhoneListener (ties to the already-documented real BAP MOST-bus protocol — see HOST BSP and Vehicle Coding), HFP_ON/HFP_OFF (real Bluetooth Hands-Free Profile states), handsfreeOnOff, setRingerVolume, m_pairingTimer/m_pairingState. Lvdo/dvc/pdc/impl/parrot/CT... names Parrot — the real French automotive Bluetooth hands-free module supplier — as the actual vendor behind this subsystem.
  • Climate control: wdg.climate.ClimateZone, climateECUServiceableError/Status, notifyClimateECUServiceable, getClimateECUServiceable, solarRoofConfig/solarRoofError.
  • Parking sensors: OPSControlTracker (OPS = Optical Parking System), m_pdcDeffectMode (PDC = Park Distance Control, the real automotive term), matching the vdo/dvc/pdc Java package.
  • A separate, lower-level SPP (Serial Port Profile) init log ("SPP init: no reactor assigned", "SSP: Startup V%2.2f") — C-style error-message phrasing, plausibly a native shim underneath the Java Bluetooth stack rather than part of it; not resolved further.

This is a real, substantial Java application platform, not a thin shim

Clustering all 2,806 class paths by their 3rd-level package reveals a complete architecture — this is the real, user-facing application:

Package Classes Role
vdo/rns/app 370 The main RNS application itself
vdo/nav/api 362 Navigation API
vdo/rns/uii 160 RNS UI implementation
vdo/uis/wdg 105 UI widgets
vdo/most/dev 94 MOST-bus device layer
vdo/jam/dev 93 "JAM" device layer (plausibly Java Application Manager)
vdo/nav/cfc 86 Navigation "Cfc" classes — see below
vdo/app/mm, vdo/svc/mm 82, 75 Multimedia
vdo/nav/ctrl 64 Navigation control
vdo/bsl/util 62 "BSL" utility layer
vdo/mm/cp2, vdo/mex/mm 58, 50 Media/codec
vdo/nav/tri 53 Plausibly trip computer
vdo/app/mediaplayer 34 Media player
vdo/s2i/pim 29 PIM (phone contacts/calendar) — "s2i" plausibly smartphone-to-infotainment sync
vdo/mm/tv 28 TV tuner
vdo/rns/speech, vdo/speech/asr 19, 12 Speech/voice, incl. real ASR (Automatic Speech Recognition)
vdo/dvc/pdc 15 Park Distance Control
vdo/mm/dab 13 DAB radio
vdo/svc/fm 18 FM radio
vdo/sf/diag 19 Diagnostics

Also present: a real standard Java class library subset — java.awt (a full GUI toolkit: Container, GridLayout, event listeners), javax.speech (Central, EngineCentral, recognition.Recognizer, synthesis — a real, standard Java Speech API implementation), javax.media (Codec, Renderer, PlugIn, DataSource), javax.microedition.pim/io (J2ME-style mobile APIs). This strongly suggests a CDC/J2ME-class embedded JVM with a fairly complete AWT + Speech + Media API surface, not a minimal/stripped runtime.

The app framework has a real session/factory architecture: vdo/app/fwk includes AppFactoryAbstract, ApplicationInterface, LaunchableApplication, AppContext, UserContext, and a session factory with a genuine internal codename, SalsaSessionFactory — worth remembering as a project/platform codename if it recurs elsewhere.

A naming-convention link to the native C++ layer: vdo/nav/cfc (86 Java classes) uses the exact same Cfc prefix this whole wiki's native C++ work has run into constantly (CfcTypeCoordinate, CfcMapViewProxy, CfcTypeRoadClassStatistic, dozens more). This is very likely not a coincidence — plausibly the Java layer has classes that mirror, wrap, or call into (via JNI or a similar bridge) the native Cfc* C++ classes this project has been cataloguing all session, consistent with "Cfc" being a cross-language internal framework convention (plausibly "Common Framework Classes" or similar), not something scoped to one language layer. Not independently confirmed — a concrete lead for a future session.

What this means for the rest of this project

The native PowerPC C++ code this wiki has spent this whole project reverse-engineering (dbal, navicore, TMC, weather, SDARS persistence, the EH/exception-handling mechanism, etc.) is real and substantial, but it is a lower-level data/service layer, not the user-facing application itself — the actual UI, navigation display logic, media playback, Bluetooth/phone handling, voice/speech, and climate/parking-sensor integration all live in this separate, much larger (2,806+ classes) embedded Java layer this project has never examined. This also retroactively explains the "Java-class content" region found during the 9MB+ wall investigation (see Firmware Reversing) — that was only one narrow ~4.24MB slice of a much bigger, pervasive Java presence spanning tens of megabytes across the whole 85.6MB file (class-path string hits were found from file offset ~1MB out to ~82MB in this session's search).

Not yet attempted: actually extracting real Java class files (vs. just their name strings) and decompiling them — this firmware almost certainly contains standard Java .class/bytecode structures (magic number CAFEBABE) somewhere in these same regions, which would be vastly easier to decompile than the native PowerPC code this project has spent so much effort on (real, mature Java decompilers exist and work directly on bytecode). A concrete, high-value next step for a future session: search for the CAFEBABE class-file magic number directly, and/or check whether 24MB-85.6MB's already-known "VxWorks kernel" characterization is actually (at least partly) this JVM and its class data.

Reproducing this work

import re

with open("FHDD6.FLI", "rb") as f:
    data = f.read()

# Real Java class-path signatures (JVM constant-pool UTF8 entries referencing
# class names) live as plain ASCII throughout the whole 85.6MB file, not just
# the 24MB native-code region.
pat = re.compile(rb"L(vdo|wdg)/[A-Za-z0-9_/]{3,80}")
classpaths = {m.group(0) for m in pat.finditer(data)}
# 2,806 distinct paths found this session; see references/java_classpaths_2806.txt

Clone this wiki locally