Introduction

Select Monitor Adapter
Subaru Diagnostic Ports
How to build a PC adapter
Protocol
Software
Troubleshooting
Eavesdropping

Engine Control Unit (ECU)
Description
Reading Error Codes
Reverse Engineering
Modifying
ROM images

Transmission Control Unit (TCU)
Description
Reading Error Codes
Reverse Engineering
Power Mode
Modifying
ROM images

Other Control Units
Air Conditioning Unit
4WS Control Unit
Cruise Control Unit

OBD2 Information
Select Monitor Cartridge

Downloads
Links to other sites

Custom TCU Development



This page contains a sample of some of the information that we have discovered from looking at the ECU code. For more detailed information, click on the Analysis link in the ECU ROM images section.


Subaru EG33 ECU Parameter addresses

Thanks to TomsSVX for extracting these addresses using his Select Monitor and an Eavesdrop Cable. These are the addresses that should be entered into your datalogging software.

ModeAddressParameterFormula
F008C3D-8C3FROM ID NUMBER "YEAR"See "ROM Images"
F01102FBATTERY VOLTAGEvolts=value*0.08
F021071VEHICLE SPEED (mph)mph=value*1.25
F031071VEHICLE SPEED (km/h)km/h=value*2
F04106FENGINE SPEEDrpm=value*25
F051185WATER TEMP (F)tempF=(value-82)*9/5
F061185WATER TEMP (C)tempC=value-50
F0710A2IGNITION TIMINGadvance=value
F081283AIRFLOW SENSORairflow%=(value*100)/255
F091282LOAD DATAload=value
F10128CTHROTTLE POSITION SENSORthrottle%=(value*100)/255
F111280INJECTOR PULSE WIDTHmsec=value*256/1000
F12129DBY-PASS AIR CONTROLduty%=(value*100)/255
F13129102 RIGHT HANDmV=value*5000/512
F14129202 LEFT HANDmV=value*5000/512
F1512B002 R MAXmV=value*5000/256
F1612B102 R MINmV=value*5000/256
F1712B202 L MAXmV=value*5000/256
F1812B302 L MINmV=value*5000/256
F191097AFR CORRECTION 1afc=value-128
F20109FAFR CORRECTION 2afc=value-128
F2112A7KNOCK CORRECTIONcorrection=value
F2212A5CANISTER PURGE CONTROLduty%=(value*100)/255
F23125FATMOSPHERIC PRESSURE 
FB01026-1029DIAG. READSee "Reading Error Codes"
FB112B9-12BCDIAG. MEMORYSee "Reading Error Codes"

Fuel and Timing Maps

The fuel map is 16x16 bytes at 8120. The X axis (load) is at 8110 and the Y axis (rpm) is at 8100. The lookup is done by a subroutine at 913D that interpolates between the points on the graph.

0x8120Load 
RPM
 060A0C101214171A1F2126282B2D3237
08(400)89898989848280807F7F808080808080
0C(600)82828282828280807F7F808080808080
10(800)828282828281817F7F7F808080808080
18(1200)8383828181807F7E7E7F808080808080
20(1600)84848280807F7E7E7F7F7F8080808080
28(2000)8282808080808080807F7F7F80808080
30(2400)828280808081818180807F7F7F808080
38(2800)828280808081818080807F7F7F808080
40(3200)82828282828282828180808080808080
48(3600)82828383838383828181808080808080
50(4000)82828282828281807F80808080808080
58(4400)82828181818181818080808080808080
60(4800)83838282828281818181808080808080
68(5200)848483828181818180807F7F80808080
70(5600)84848482818181818080808080808080
78(6000)84848482828281818080808081818181

The base timing map is 16x16 bytes at 8500 with X axis at 84E0 and Y axis at 84D0. The lookup is done by the same subroutine at 913D and the data interpolated as before.

0x8500Load 
RPM
 080C0F1114181C202225292C30363A40
0C(600)14141414130E08000000000000000000
10(800)17191917130E09040200000000000000
18(1200)1B1E22201D18130E0B08050403000000
20(1600)23282A26221D1814120F0C0A08050300
28(2000)25282B292724201B1814110F0C080602
30(2400)2A2D302C2B2826211E1A14120F0A0805
38(2800)303232322F2B2A24211D1916130F0C09
40(3200)3232323232312E2926221D1A16120F0C
48(3600)3232323232312E2A2825201C1914110E
50(4000)323232302F2D2C2A2826241F1A161411
58(4400)32302E2D2C29262322201E1C19161411
60(4800)32302E2D2B2927252422201E1B171411
68(5200)32312F2E2B2928262624211E1B161411
70(5600)3232312D282625242322211E1914120E
78(6000)3232312F2D2928262525231F1C181612
80(6400)323232323232302E2C2925221F1B1815

The advance map is at 8E20. It uses the same axes as the 8500 map and the lookup is done by the same subroutine at 913D. These values are added to the base timing to get the maximum advance.

0x8E20Load 
RPM
 080C0F1114181C202225292C30363A40
0C(600)000000000103070D0C0B0A0807050301
10(800)000000000105090D0E0F0F0D0C0A0907
18(1200)000000000002060A0B0D0F0E0E0F0D0B
20(1600)00000000000307090A0C0E0F0F101112
28(2000)0000000000000206080B0C0D0F101113
30(2400)000000000000000406090D0E10121213
38(2800)000000000000000506080A0B0D0F1011
40(3200)0000000000000002030507080A0E0F10
48(3600)000000000000000001020507090D0F11
50(4000)000000000000000000010305090B0B0C
58(4400)0000000000000000010204050709090B
60(4800)0000000000000000000102030508090B
68(5200)000000000000000000010305070B0C0F
70(5600)00000000000000000000000206090A0C
78(6000)000000000000000000000104070A0B0E
80(6400)000000000000000000000406080B0C0E

The above maps and graphs are from a JDM SVX. For comparison, here are the maps from USDM and UK cars. It can be seen that the USA and UK maps are very similar but not identical, while the JDM maps are markedly different.