The Green Engineering Menu (GEM) exposes a comprehensive internal API
to every subsystem of the MMI3G head unit through a hierarchy of
36 Engineering Access Presentation Controllers. Each controller
wraps a specific domain (audio, navigation, Bluetooth, SWDL, FSC, etc.)
and provides requestReadInt, requestReadString, requestReadBuffer,
requestWriteInt, requestWriteString, and requestWriteBuffer
methods keyed by 64-bit DSI persistence addresses.
This document catalogs the controllers, their capabilities, and the
DSI constants that drive them. All data extracted from string analysis
of MMI3GApplication (10.7 MB SH4 ELF, build 9411, K0942_4 variant 41).
Source files: CEngineeringAccessPresCtrl*.cpp (35+ source files
compiled into the monolithic binary).
GEM Screen (ESD)
|
v
CEngineeringAccessPresCtrlBase <-- base class, queues requests
|
|-- CEngineeringAccessPresCtrlConfig <-- read/write persistence
|-- CEngineeringAccessPresCtrlFscs <-- FSC/activation codes
|-- CEngineeringAccessPresCtrlSWDL <-- firmware update control
|-- CEngineeringAccessPresCtrlNavi <-- navigation DSI values
|-- ... (36 controllers total)
|
v
DSI Proxy/Stub layer (requestReadInt/requestWriteInt with 64-bit keys)
|
v
QNX IPC to target service (SPH*, SG*, SC* adapters)
Each controller has a persistence path registered with the DSI
framework: project_presctrl_collect_persistence_CEngineeringAccessPresCtrl<Name>.
Log prefix convention:
!PPC:-- error#PPC:-- info / constructor tracePPC:-- normal operation
Source: CEngineeringAccessPresCtrlFscs.cpp
The FSC controller interfaces with the CryptoManager subsystem to query, import, and validate Feature Service Codes.
Key operations observed in strings:
set swid %.8x-- set the active SWID for FSC operationsThe status of %.8x is %d-- query activation status of a SWIDPublic Key Type %d-- query which RSA public key is activeFscResponse %d-- FSC validation resultCSPHCryptoManagerDiagnosisProxy-- interfaces with diagnosis layer
DSI update IDs:
UPD_ID_areFSCsSigned-- whether FSCs require signature validationUPD_ID_fscList-- list of all FSCs on the systemUPD_ID_illegalFSCs-- list of FSCs that failed validation
CryptoManager class hierarchy:
CCryptoManagerComp-- component shellCCryptoManagerImpl-- core implementationCCryptoManagerDiagnosisImpl-- diagnostic interfaceCCryptoManagerHMIImpl-- HMI interfaceCCMFSCFacade-- FSC facade patternCCMFscCheckJobPolicy-- FSC check policyCCMExceptionListCheckJobPolicy-- exception list checkCCMAccessSecSi-- Secure Silicon accessNDigitalRights-- namespace for digital rights managementTDigitalRightsSignatureCheckJob-- signature verification jobTDigitalRightsExceptionListCheckJob-- exception list check jobTDigitalRightsFscDetailsJob-- FSC detail query jobTDigitalRightsFileSystemCheckJob-- filesystem check job
HMI integration:
SPHCryptoManagerHMI::RQST_importFSCs-- import FSC files from mediaSPHCryptoManagerHMI::RQST_fscDetails-- query FSC detailsSPHCryptoManagerHMI::RPST_importFSCs-- response to importSPHCryptoManagerHMI::RPST_fscDetails-- response to details querySPHCryptoManagerHMI::ATST_fscList-- attribute: FSC listSecureCodeActivation.SPHCryptoManager-- service name
OTP (One-Time Programmable) fuse integration:
isSwidInOTP-- check if SWID is burned into OTPswid in OTP %.8x-- SWID found in OTPswid in OTP (static) %.8x-- static/factory SWID in OTP%d swids found in OTP-- count of OTP SWIDs
Some features may be hardware-locked via OTP fuses, not just software-gated via FSC files. The GEM can query which SWIDs are in OTP vs. filesystem-activated.
Source: CEngineeringAccessPresCtrlSWDL.cpp
Controls the firmware update subsystem from the GEM.
Operations:
requestReadInt key(%llx)-- read SWDL staterequestWriteInt key(%llx) value(%x)-- trigger SWDL operations
DSI update IDs:
UPD_ID_DomainStatus_SWDL-- SWDL domain statusUPD_ID_SWDLRunning-- whether SWDL is currently activeUPD_ID_SwdlActive-- SWDL active flag
Power management integration:
SPHPowerManagement::ATST_SwdlActive-- keeps system awake during flashCOnOffPresCtrlmonitors SWDL state to prevent shutdown during flash
SWDL implementation classes (from the SWDL subsystem, not the GEM controller):
CASWDLAccessSecSi.cpp-- Secure Silicon access during updateCASWDLAutoRun.cpp-- auto-run handler for media-triggered updatesCASWDLCheckedSocketStream.cpp-- verified network streamCASWDLClient.cpp-- SWDL clientCASWDLClientBaseHelper.cpp-- client helpersCASWDLCompatibilityManager.cpp-- version compatibility checksCASWDLEintrRetries-- interrupt retry handlingCASWDLFileAccesWorker-- file access worker threadCASWDLFileCopyManager-- file copy state machineCASWDLManagerStates-- overall SWDL state machineCASWDLRsuComMaster-- RSU communication masterCASWDLRsuComSlave-- RSU communication slaveCASWDLSvmManager-- SVM (ODIS) integrationCASWDownloadCtrlDataContainer-- central state container
Source: CEngineeringAccessPresCtrlSystem.cpp
Can read system values AND write files to the filesystem.
Operations:
requestReadInt key(%llx)-- read system valuesrequestReadString-- read strings (e.g.,HFP_PASS_KEY)requestReadBuffer-- read binary datarequestWriteString: The file %s could not be opened for write-- confirms file-write capability through the GEM
GEM screens can write arbitrary files to writable mount points
(/HBpersistence/, /mnt/efs-persist/, SD card). This is a
powerful primitive for custom app deployment.
Source: CEngineeringAccessPresCtrlConfig.cpp
Read/write the persistence database (per3) through GEM.
Operations:
requestReadInt key(%llx)-- read per3 intrequestReadString key(%llx)-- read per3 stringrequestWriteInt key(%llx) value(%x)-- write per3 intrequestWriteString key(%llx)-- write per3 string- Handles both IOC IDs and SIS IDs
Extensive read/write access to navigation subsystem:
- GPS satellite counts:
NUM_OF_LOCKED_SATELLITES,NUM_OF_PHASE_LOCKED_SATTELITES - GPS quality:
QUALITY_STATE_AGC_VALUE,QUALITY_STATE_GPS_NOISE - Database checking:
DATABASE_CHECKING,DATABASE_CRC_CHECKING - License info:
LICENSE_ACTIVATION_DATE,LICENSE_EXPIRATION_DATE,LICENSE_NUMBER - Connection state:
CONNECTION_LAST_DATE,CONNECTION_LAST_STATUS - PSD (Predictive Speed Data): 20+ dataset parameters for ADAS
- Consumer data deletion:
DELETE_CONSUMER_DATA
Complete DVD drive diagnostic interface:
- Temperature:
CURRENT_DRIVE_TEMPERATURE,MAX_DRIVE_TEMPERATURE - Disk state:
INSERTED_DISK_STATE,IS_DISK_IN_DRIVE - Region codes:
REGIONCODE_OF_INSERTED_DVD,REGION_CODE_ACTUAL - Drive commands:
EJECT, loader state - Media type detection: CD-Audio, DVD-Video, DVD-Audio, SVCD, VCD
- Playback states: playing, paused, stopped, seek
- Parental lock:
PML_STATUS - Test modes:
requestStartDVDTest,requestStopDVDTest
- Power control:
BT_ON_OFF_ACTUAL,BT_ON_OFF_STORED - A2DP streaming activation
- Sniff mode:
BT_SNIFF_MODE_ON_OFF - Autopairing and passkey
- Allocation table queries
- GSM power:
GSM_ON_OFF_ACTUAL - SIM card:
SIMID - eCall:
EMERGENCY_LED_ON_OFF,requestSetECallTestModePersistent - Handset counts:
NB_OF_CONNECTED_HUC - Call control:
UPD_ID_AcceptCall - File management: can delete files
- Temperature:
HDD_CURRENT_TEMPERATURE,HDD_MAX_TEMPERATURE - Parking mode control
- Media storage capacity
- HDD diagnostics
- Source switching with fade transitions
- Volume control:
UPD_ID_Volume - Entertainment connection management
- Mute:
LC_MUTE_ENT - Audio lowering reasons
WiFi diagnostics, IP diagnostics, WiFi state management.
HMI controls, jukebox reset, infotainment recorder.
Serial interface testing for ETC, iPod, VICS with per-interface statistics.
MOST bus allocation table, sync routing, service broker.
SD card device info, device search, media list integration.
| Controller | Strings | Domain |
|---|---|---|
| Usb | 9 | USB device management |
| Video | 8 | Video management |
| Mme | 14 | Media engine (play, DTCP) |
| MostCombi | 11 | MOST bus combination |
| MostCombiStats | 5 | MOST statistics |
| Cradle | 7 | Phone cradle |
| VWTouchData | 7 | VW touch panel |
| TraceScope | 8 | Trace level control |
| Sds | 17 | Speech dialogue |
| VersionInfos | 3 | Version queries |
| AmFmRadio | 4 | AM/FM tuner |
| Addressbook | 3 | Contacts |
| Dab | 3 | DAB digital radio |
| Tv | 3 | TV tuner |
| Sdars | 2 | SiriusXM satellite radio |
| Tim | 2 | TIM |
| Tmc | 2 | Traffic Message Channel |
| TunerAnnouncement | 1 | Radio announcements |
| RadioUnit | 5 | Radio hardware |
A requestTriggerDebugCommand handler exists across multiple subsystems.
Each takes a command ID + two parameters:
callBackTriggerDebugCommand - command: %d - param1: %d - param2: %d
Subsystems with debug command handlers:
- Key panel
- On/off control
- AM/FM tuner, DAB tuner, satellite tuner, TIM tuner
- Car facade, parking system
- HMI sync (rear display)
- System info
- Audio management
Three reboot levels:
| Trigger | Effect |
|---|---|
requestTriggerReboot %d |
Normal system reboot (parameter controls mode) |
requestTriggerRebootPanel |
Panel/display reboot only |
requestTriggerIocBoloReboot |
IOC bootloader reboot -- reboots the I/O Controller into bootloader mode for IOC firmware update |
| UPD_ID | Purpose |
|---|---|
isEngineeringMode |
Query: is engineering mode active? |
engineeringMenuState |
Current engineering menu state |
engineering |
Engineering mode flag |
diagnosticMode |
Diagnostic mode flag |
requestEnterEngineeringSession |
Enter engineering session |
requestExitEngineeringSession |
Exit engineering session |
Factory reset variants:
requestFactoryResetrequestResetFactorySettingsrequestResetToFactorySettingsrequestRestoreFactorySettingsrequestRevertToFactorySettingsrequestRevertCallstacksrequestSetAPSFactoryDefaultrequestInspectionReset
Total DSI API surface: 2,386 UPD_ID constants across all subsystems.
The SecSi module manages hardware security features.
Hardware sample to OTP offset mapping:
- E1 sample: no OTP offset (base)
- Other samples: offset 0x400
OTP operations:
- Read with retry
- Content dump and sanity check
- SWID enumeration from OTP fuses
Flash operations:
- Flash partition locking via
Locking down flash - Signals
SIGUSR2todevf-genericflash driver
Security logging:
/HBpersistence/FSC/Logs/Security_Exceptions.log
A built-in self-test exercises the entire DSI stack:
notification-id %d: starting selftest (all responses/notifications
with sample values are sent)...
Sends synthetic DSI notifications with sample data through all registered listeners. Useful for testing custom DSI clients without live vehicle data.
/dev/shmem/TelitAmsshd-- SSH daemon (Telit modem subsystem)172.16.250.248-- MMI network IP (per M.I.B documentation)
-
GEM screens can call any controller -- custom ESD screen definitions can invoke read/write on any of the 36 controllers using the appropriate 64-bit DSI key.
-
File write capability -- the System controller can write files to writable mount points, enabling GEM-triggered deployment.
-
FSC import from media --
SPHCryptoManagerHMI::RQST_importFSCsmeans FSC files can be imported from SD/USB through the GEM. -
SWDL from GEM -- the SWDL controller has write methods, suggesting firmware updates can be initiated from the engineering menu (confirmed by
03 Remove HBUPDATE.def from USB/04 Activate HBUPDATE.def on USBfound in PCM3Reload IFS2). -
Debug commands -- a generic
command + param1 + param2RPC interface across 11+ subsystems. -
IOC bootloader reboot -- enables IOC firmware updates without physical board access.
MMI3GApplicationbuild 9411 C1 D1-15515A, QNX 6.3.2- Source:
CEngineeringAccessPresCtrl*.cpp(529 strings, 36 controllers) - DSI interface specs:
research/DSI_ARCHITECTURE.md - GEM activation:
modules/gem-activator/ - Per3 addresses:
research/PER3_ADDRESS_MAP.md
DBGModeActive enables GEM on both platforms but through different mechanisms.
Native binary has checkDBGModeFile() that reads /HBpersistence/DBGModeActive on boot. Created/deleted by Engineeringmenu_step2 function. Fully traced via Ghidra.
The native binary does NOT contain DBGModeActive. The check is in the Java layer (AppDevelopment.jar):
Key classes:
- EngineeringInfoService: setPersistence(), storeInt(namespace, address, value)
- FakePersistence: enterGreenEngineeringMenu, writeInt(namespace, address, value)
- PersistenceAccessor: USEHBPERSISTENCE flag, DSIPersistence interface
DSI Persistence API for per3 read/write:
- writeInt(namespace=3, address, value) for per3 writes
- VCDS reads GEM state as module 5F, adaptation channel 6
System property de.audi.tghu.engineering.base_dir sets the ESD screen path. If overrideable, ESD files could load directly from SD card.