VolvoRTI — Android Auto Retrofit for Volvo RTI

An integrated Android Auto retrofit system for the retracting Volvo Road and Traffic Information (RTI) navigation screen. Using a Raspberry Pi 4, custom microcontrollers, custom PCB routing, and 3D-printed mechanical enclosures, this project aims to replace the legacy navigation unit with a modern infotainment hub running LineageOS (Android).

Volvo RTI Retrofit Focused Screen Volvo Screen installation in progress

Warning

Status: This setup faces display quality limitations when driving the original Volvo LCD screen directly due to its low resolution (typically 400x234). Replacing the internal screen panel with a high-resolution LCD while retaining the retractable motor housing is highly recommended.


🛠️ System Architecture

The retrofit consists of three key layers working in unison: vehicle bus integration (LIN), screen power/command control (RTI Serial), and the core computer (Raspberry Pi 4).

graph TD
    %% Vehicles Inputs
    SWM[Steering Wheel Module - LIN Bus] -- "LIN Frame ID 0x20" --> ATtiny[ATtiny84 Steering Controller]
    CEM[Central Electronic Module - LIN] -- "LIN Keep-Alive Ping" --> ATtiny
    
    %% ATtiny Processing
    ATtiny -- "RC-6 MCE IR Protocol (Bit-banged)" --> Pi_IR[Raspberry Pi GPIO 24 / IR Input]
    
    %% Pi Processing
    subgraph Raspberry Pi 4 [Raspberry Pi 4 - LineageOS]
        Pi_IR --> KM[KeyMapper / Input Dispatcher]
        KM -- "Volume Up Trigger > 5s LIN Idle" --> SD[OS Shutdown Command]
        Hotspot[Init Services] -- "Auto-start on Boot" --> AP[Wi-Fi AP: VolvoC70_AndroidAuto]
    end
    
    %% Screen Control
    ATmega[Arduino Screen Controller] -- "2400 Baud Serial Control" --> Screen[Volvo RTI Retractable Screen]
    Pi_Video[Raspberry Pi HDMI] -- "VGA / RGBS Video Signal" --> VideoMux[Video Mux] --> Screen
    
    classDef hardware fill:#f9f,stroke:#333,stroke-width:2px;
    classDef software fill:#bbf,stroke:#333,stroke-width:2px;
    class SWM,CEM,ATtiny,ATmega,Screen,VideoMux hardware;
    class KM,SD,Hotspot,AP software;

📁 Repository Structure

  • 📁 Arduino/: Microcontroller firmware written for the Arduino ecosystem.
    • LIN_to_IR/: Decodes Steering Wheel Module (SWM) buttons from the LIN bus and outputs RC-6 Mode 6A IR commands to control Android. Monitors LIN inactivity to signal shutdown.
    • RTI_Control/: Drives the serial protocol of the Volvo retractable screen, sending commands to raise the screen, set brightness, and keep it active.
    • IR_remote_test/: Test firmware for verifying RC-6 IR signal generation.
  • 📁 Kicad/: Schematic, PCB layout, footprints, and Gerber files for a custom Raspberry Pi shield designed to host the MCP2004 LIN transceiver, video muxing, and power routing.
  • 📁 CAD/: SolidWorks 3D CAD design files (.SLDASM, .SLDPRT) and 3D-printable .STL files for the custom mechanical Pi enclosure (case_top & case_bottom).
  • 📁 Raspberry/: Configuration scripts and mapping files for LineageOS/Android, including custom ir-keytable mappings and key event hooks.
  • 📁 Photos/: High-quality hardware builds, installation logs, and system diagrams.

⚙️ Detailed Module Breakdown

1. Steering Wheel Integration (Arduino/LIN_to_IR)

The ATtiny84 intercepts steering wheel buttons from the Steering Wheel Module (SWM) on LIN frame 0x20. These button actions are translated into bit-banged RC-6 Mode 6A (MCE Remote) signals and fed directly to the Raspberry Pi.

Button Map & Command Codes

When buttons are pressed, the ATtiny transmits the corresponding Microsoft MCE remote scancodes:

Button LIN Frame Trigger Active Button Code MCE Scancode Action on LineageOS
UP d0 & 0x01 1 0x800f041e Navigate Up
DOWN d0 & 0x02 2 0x800f041f Navigate Down
LEFT d0 & 0x04 3 0x800f0420 Navigate Left
RIGHT d0 & 0x08 4 0x800f0421 Navigate Right
ENTER d1 & 0x08 5 0x800f0422 Select / OK
BACK d1 & 0x01 6 0x800f0423 Back / Exit
Volume Up (Shutdown) LIN Silent > 5s 7 0x800f0410 Trigger Soft Shutdown

Smart Power-down (Car-Off Detection)

To avoid battery drain, the system implements automated shutdown:

  • The ATtiny monitors LIN traffic. Since the car's Central Electronic Module (CEM) continuously polls the LIN bus when the ignition is on, active communication indicates the vehicle is running.
  • If no LIN serial data is detected for 5 seconds, the ATtiny assumes the car is off, changes state, and sends the MCE code 0x800f0410 (KEY_VOLUMEUP) 3 times to guarantee receipt.
  • Android intercepts this key and shuts down cleanly via the command line (reboot -p).

2. Retractable Screen Serial Driver (Arduino/RTI_Control)

The Volvo RTI screen requires continuous serial commands at 2400 baud over a single communication line to stay awake and raised. The screen controller script performs this keep-alive task.

  • Display Modes: Configurable via display mode hex codes (RGB: 0x40, PAL: 0x45, NTSC: 0x4C, Screen Off/Retract: 0x46).
  • Brightness Control: Employs a 16-level hex sequence (0x20 to 0x2F / 0x6E) to adjust the backlighting dynamically.

3. Raspberry Pi Customization (Raspberry)

Key Event Remapping

To receive the direct-wired IR signal from the ATtiny, the Pi utilizes ir-keytable with a custom mapping profile:

  • Configuration File: Raspberry/rc-rc6-mce.toml
  • Command KeyMapper Setup:
    # Enable accessibility service for KeyMapper
    adb shell settings put secure accessibility_enabled 1
    adb shell settings put secure enabled_accessibility_services io.github.sds100.keymapper/.system.accessibility.MyAccessibilityService
    
    # Map the Volume Up trigger to execute:
    reboot -p
    

Wi-Fi Hotspot Auto-start at Boot

To establish wireless Android Auto on boot, a custom init script starts the Wi-Fi hotspot automatically on startup:

  • Boot script (/system/bin/start_hotspot.sh):
    #!/system/bin/sh
    while [ "$(getprop sys.boot_completed)" != "1" ]; do
        sleep 1
    done
    sleep 5
    cmd wifi start-softap VolvoC70_AndroidAuto wpa2 123456789
    
  • Init configuration (/system/etc/init/start_hotspot.rc):
    service start_hotspot /system/bin/sh /system/bin/start_hotspot.sh
        class main
        user root
        group root system wifi
        oneshot
        disabled
    
    on property:sys.boot_completed=1
        start start_hotspot
    

System Overview Diagram

System Diagram

Prototype Hardware

PCB Front-side Build Pi Shield Assembled
S
Description
No description provided
Readme 104 MiB
Languages
ASL 98.6%
HTML 1.1%
C++ 0.2%