Skip to content
BMW DME / Part VIII / 17 C167CR & TriCore TC1796/TC298 Disassembly,…
Source
DOC 37 § 17
Contents
Infineon C167CR Register & Memory Segmentation Architecture and 1 more
Systems covered
`MS43`, `MSD80`
Size
0 tables · 2 code/diagrams · ~519 words

Infineon C167CR Register & Memory Segmentation Architecture

Reverse engineering BMW firmware requires mastery of two dominant automotive microcontroller architectures: the 16-bit Infineon C167CR (Era 2) and the 32-bit unified TriCore TC1796 / AURIX TC298 (Era 3 & 4).

17.1 Infineon C167CR Register & Memory Segmentation Architecture#

The C167CR-LM (clocked at 24 ext{ MHz} in MS43) utilizes a 16-bit core with 24-bit segmented addressing, providing an addressable physical space of 16 ext{ Megabytes}:

  • Segmented Memory Model: Addresses are divided into 64 ext{ KB} segments (Segment 0 = 0x000000 - 0x00FFFF, Segment 7 = 0x070000 - 0x07FFFF).
    • DPP0 (SFR 0xFE00): Points to Flash Program Constants.
    • DPP1 (SFR 0xFE02): Points to Extended Calibration Maps.
    • DPP2 (SFR 0xFE04): Points to Internal Dual-Port SRAM (0xFA00 - 0xFDFF).
    • DPP3 (SFR 0xFE06): Points to Special Function Registers (SFRs) and System Stack.
  • Data Page Pointers (DPP0 - DPP3): Because 16-bit pointers can only span 16 ext{ KB} data pages, four 10-bit Data Page Pointers select which 16 ext{ KB} physical memory block is active:
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐  
│                   INFINEON C167CR MEMORY SEGMENTATION & DPP ADDRESS TRANSLATION                   │  
├──────────────────────────────────────────────────────────────────────────────────────────────────┤  
│                                                                                                  │  
│   16-Bit Near Address: [ Page Selector: 2 Bits ] [ 14-Bit Offset: 0x0000 to 0x3FFF ]             │  
│                                    │                                                             │  
│                                    ▼                                                             │  
│                  Selects DPP0, DPP1, DPP2, or DPP3 (10 Bits)                                     │  
│                                    │                                                             │  
│                                    ▼                                                             │  
│   24-Bit Physical Address: [ DPPx Base Address: 10 Bits ] [ 14-Bit Offset ] ──► 16 MB Range     │  
└──────────────────────────────────────────────────────────────────────────────────────────────────┘  
C167CR Assembly Disassembly Example (MS43 Ignition Angle Fetch):#
; ==============================================================================  
; Routine: Sub_Fetch_Ignition_Advance_98RON  
; Input: R12 = Engine Speed (RPM), R13 = Relative Load (mg/stroke)  
; Output: R4 = Base Ignition Advance (Degrees)  
; ==============================================================================  
sub_5B210:  
    MOV     R1, #0x7048          ; Load Base Address of ip_iga_ron_98_pl (Page 0x1C)  
    MOV     DPP1, #0x001C        ; Set DPP1 to point to 64 KB Calibration Block (0x70000)  
    EXTP    DPP1, #1             ; Extend next instruction to utilize DPP1 page  
    MOV     R2, [R1]             ; Read Number of Columns (16)  
    CALLA   cc_UC, Map_Interp_2D ; Branch to 2D Surface Bilinear Interpolator  
    MOV     R4, R14              ; Return Interpolated Raw Advance Word in R4  
    RETS                         ; Return from Subroutine  

17.2 TriCore TC1796 32-Bit RISC/DSP Architecture (MSD80 / EDC17)#

The Infineon TriCore architecture merges a 32-bit RISC processing core, digital signal processor (DSP), and autonomous micro-controller onto a single chip:

  • Context Save Areas (CSA): Rather than pushing registers onto an external memory stack during interrupts, the TC1796 contains a dedicated high-speed hardware link list of 64-byte Context Save Areas in internal SRAM:
  • Code Cave Hooking on MSD80: Calibrators add custom logic (e.g. 2-step rev limiters) by overwriting unused padding bytes at 0x001FE000 and inserting a 32-bit direct jump: ``assembly J 0x801FE000 ; Jump absolute to custom code cave in cached flash segment ``