| ECU | MCU | Core | Flash | CAN Protocol | Algo | BAM | JTAG | Kernel | Status |
|---|---|---|---|---|---|---|---|---|---|
| E92 | MPC5674F | e200z7 | 4 MB | GMLanMPC5XXX | 2B:0x201 / 5B:0x92 | ✓ | ✓ | ✓ | Verified |
| E80 | MPC5676R | e200z7 | 6 MB | GMLanGen6 | 5B:0x28 | ✓ | ✓ | — | Verified |
| E82 | MPC5676R | e200z7 | 6 MB+ | GMLanGen5 | 5B:0x81 | — | — | — | Verified |
| E84 | MPC5676R | e200z7 | 6 MB | GMLanGen5 | 5B:0x85 | — | — | — | Verified |
| E83 | MPC5565 | e200z6 | 2 MB | GMLanMPC5XXX | 5B:0xB2 / 2B:0xDE | — | ✓ | — | Verified |
| E78 | MPC5566 | e200z6 | 3 MB | HS-CAN / BAM | — | ✓ | ✓ | — | Verified |
| E39/E39A | MPC5566 | e200z6 | 3 MB | GMLanMPC5XXX | 5B:0xB2 / 2B:0xDC | ✓ | — | — | Verified |
| T87A | SPC564A80 | e200z4 | 4 MB | GMLanMPC5XXX | 5B:0x87 / 2B:0x87 | ✓ | ✓ | — | Verified |
| T87 | SPC564A80 | e200z4 | 4 MB | GMLanMPC5XX | 2B:0x57 | ✓ | — | — | Verified |
| T93 | Unknown | Unknown | 4 MB+ | HS-CAN + CAN FD? | 2B:0x5D | ? | — | — | Partial |
| E38 | MPC561 | MPC500 | 2 MB ext | GMLanMPC5XX | 2B:0x92 | — | BDM | — | Verified |
| E67 | MPC565 | MPC500 | 2 MB ext | GMLanMPC5XX | 2B:0x89 | — | BDM | — | Verified |
| E69 | MPC55xx? | — | 2 MB | — | — | — | BDM | — | Partial |
| E90 | MPC5676R? | — | 8 MB | GMLanGen6 | 5B:0x28 | — | — | — | Partial |
| T43 | MPC55xx? | — | 2 MB | GMLanMPC5XX | 2B:0x84 | — | — | — | Partial |
| E40 | MC68376 | CPU32 (68K) | 1 MB ext | GMLanMPC5XX | 2B:0x68 | — | BDM | — | Partial |
| T42 | MC683xx? | CPU32 | 1 MB | GMLanMPC5XX | 2B:0x73 | MVP | — | — | Unknown |
| Method | Variant | Protocol | Kernel | Algo |
|---|---|---|---|---|
| HS-CAN | Early (pre-2017) | GMLanMPC5XXX | E92Kernel.dat | 2-byte algo 513 |
| HS-CAN | Late / E92A (2017+) | GMLanMPC5XXX | E92Kernel.dat | 5-byte algo 146 (AES-128) |
| BAM | Both | MPC5XXXBam | MPC5674BAM.dat | — |
| JTAG | Both | e200z7, IR=5 | — | — |
E92ID classifies an attached E92 as Early or Late from two signals: the OEM part-number cluster (a fixed list of 14 Early PNs and 8 Late PNs maintained in firmware) and VIN position 10 (model year). AUTH uses the result to route 5-byte seeds to algo 146 on Late, and refuses $27 02 on UNKNOWN to protect the MEC counter from a wrong-algo attempt. VINWRITE on E92 short-circuits with cal-reflash guidance — VIN lives in calibration on this family, not as a writable DID.
$11 01 reset exit.
Auth: Late E92A bench-verified 2026-04-25 — algo 146 unlocks via firmware (seed=8785EEC106 → key=08B3B3656D, ECU returned $67 02).
Early bench-verified 2026-04-25 — algo 513 unlocks on a 2016 unit ($27 01/03 returns 2-byte seed, 660B aliased across both levels).
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanGen6 | E80Kernel.dat | 5-byte 0x28 |
| BAM | MPC5XXXBam | MPC5676BAM.dat | — |
| JTAG | e200z7, IR=5 | — | — |
| Region | Start | End | Size | Notes |
|---|---|---|---|---|
| EEPROM | 0x00000000 | 0x0001FFFF | 128 KB | — |
| Boot | 0x00020000 | 0x0003FFFF | 128 KB | Protected |
| Flash | 0x00040000 | 0x05C3FFFF | ~5.75 MB | — |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanGen5 | E82Kernel.dat | 5-byte 0x81 |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanGen5 | E84Kernel.dat | 5-byte 0x85 |
| Region | Start | End | Size |
|---|---|---|---|
| Boot | 0x00000000 | 0x0001FFFF | 128 KB |
| Firmware | 0x00020000 | 0x001FFFFF | 1.875 MB |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanMPC5XXX | E83kernel.dat | 5-byte 0xB2 / 2-byte 0xDE |
| JTAG | e200z6, IR=5 | — | — |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| BAM | MPC5XXXBam | MPC5566BAM.dat | — |
| HS-CAN | — | — | — |
| JTAG | e200z6, IR=5 | — | — |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| BAM | MPC5XXXBam | MPC5566BAM.dat | — |
| HS-CAN (E39A) | GMLanMPC5XXX | E39Akernel.dat | 5-byte 0xB2 / 2-byte 0xDC |
| Region | Start | End | Size | Notes |
|---|---|---|---|---|
| Boot | 0x000000 | 0x01FFFF | 128 KB | Protected |
| BootBlock | 0x020000 | 0x03FFFF | 128 KB | Key @ 0x28710 |
| Flash1 | 0x040000 | 0x07FFFF | 256 KB | — |
| Trans | 0x080000 | 0x17FFFF | 1 MB | Key @ 0x80010 |
| OS | 0x180000 | 0x2FFFFF | 1.5 MB | — |
| Empty | 0x300000 | 0x3FFFFF | 1 MB | Unused |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanMPC5XXX | T87kernel.dat | 5-byte 0x87 / 2-byte 0x87 |
| BAM | MPC5XXXBoot | — | — |
| JTAG | e200z4, IR=5 | — | PW: A72483DBE61FC095 |
tools/t87a_patch.py — see the
T87A Unlock Recipe for the patch map and CRC/Wordsum recalculation.
Cross-OS safety: HSWRITE compares source-bin OS PN at flash offset 0x014638 against live TCM OSID via Mode 9 PID 4 before any kernel load — aborts with banner on mismatch (prevents the cross-OS boot-anchor brick).
| OS Version | Mode | Status | Notes |
|---|---|---|---|
| 24293216 | BAM | Verified | Read + write (2026-04-22) |
| 24286985 | HS-CAN | Verified | 5-patch unlock (HPT lock check at 0x034A70 + bypass patches) |
| other 836-family OSes | HS-CAN / BAM | Untested | Same patch map expected; cross-OS gate will refuse mismatched bins |
$6C per-module size-field encoding fix landed (M0 LMSR 0x011000 / M1 LMSR 0x021000 / HSR 0x031000)| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| BAM | MPC5XXXBoot | T87kernel.dat | 2-byte 0x57 (algo 87) |
| HS-CAN | GMLanMPC5XX | T87kernel.dat | 2-byte 0x57 |
| Region | Start | End | Size | Notes |
|---|---|---|---|---|
| Boot | 0x000000 | 0x00FFFF | 64 KB | Key @ 0xC1CC |
| SystemOS | 0x010000 | 0x1FFFFF | ~1.94 MB | — |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanMPC5XX | E38kernel.dat | 2-byte 0x92 (algo 402) |
| BDM | BDMPPC, MPC55X | — | — |
0x003FC400 falls squarely within MPC565 internal SRAM (0x003F8000–0x0040BFFF).
This was previously flagged as "not in MPC5565 SRAM" — correct, because the E67 is NOT MPC5565.
The MPC5xx (MPC500 core) has SRAM at an entirely different address than MPC55xx (e200 core, SRAM @ 0x40000000).
| Region | Start | End | Size | Notes |
|---|---|---|---|---|
| Boot | 0x000000 | 0x00FFFF | 64 KB | Key @ 0xC0B8 |
| SystemOS | 0x010000 | 0x1FFFFF | ~1.94 MB | — |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanMPC5XX | E67kernel.dat | 2-byte 0x89 (algo 393) |
| BDM | BDMPPC, MPC55X | — | — |
| Slave | GMLanSlave | E67slave.dat | 2-byte 0x89 |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanGen6 | E80Kernel.dat | 5-byte 0x28 |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanMPC5XX | T43Kernel.dat | 2-byte 0x84 |
| Method | Protocol | Notes |
|---|---|---|
| HS-CAN | 500 kbps initial | HPT starts here, then switches speed (CAN FD?) |
| BAM | UNKNOWN | USBJTAG config exists but board differs from T87A — BAM unverified |
| JTAG | — | No JTAG port visible on PCB, chips unlabeled |
| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanMPC5XX | E40Kernel.dat | 2-byte 0x68 (algo 104) |
| BDM | 68K BDM (NOT BDMPPC) | — | — |
| Slave | GMLan68K | — | — |
0xFF9000 places execution in the SRAM region typical of MC683xx-family parts; 1 MB internal flash matches the MC68377 variant. MC68376 (used by E40) is the next closest candidate. Exact MCU still pending physical confirmation (board photo or BDM IDCODE).| Method | Protocol | Kernel | Algo |
|---|---|---|---|
| HS-CAN | GMLanMPC5XX | T42Kernel.dat (clean-room MVP) | 2-byte algo 371 (0x73) |
$1A 55 → $5A 55 F L A S H) bench-verified on HS-CAN.
Kernel uploads via $34 RequestDownload + $36 TransferData (1012 B payload, no $37; bootloader auto-jumps).
Five test variants A–E (T42READ A … T42READ E) provide rapid bench iteration of session/heartbeat/probe variations. Flash-read loop is the next milestone.
0xFF9000) and 1 MB flash size align with MC68377; MCU still unconfirmed without a board photo or BDM IDCODE.0x73) and GMLanMPC5XX protocol match published config data.