diff --git a/scantool/scantool_850.c b/scantool/scantool_850.c index 1caa2fc..e424559 100644 --- a/scantool/scantool_850.c +++ b/scantool/scantool_850.c @@ -107,7 +107,7 @@ const struct cmd_tbl_entry v850_cmd_table[] = { cmd_850_readnv, 0, NULL}, { "id", "id", "Display ECU identification", cmd_850_id, 0, NULL}, - { "dtc", "dtc", "Retrieve DTCs", + { "dtc", "dtc [tips]", "Retrieve DTCs", cmd_850_dtc, 0, NULL}, { "cleardtc", "cleardtc", "Clear DTCs from ECU", cmd_850_cleardtc, 0, NULL}, @@ -231,7 +231,7 @@ static const char *current_ecu_desc(void) { * byte value. Optionally, also get a description of the DTC. * Returns a static buffer that will be reused on the next call. */ -static char *dtc_printable_by_raw(uint8_t addr, uint8_t raw, const char **desc) { +static char *dtc_printable_by_raw(uint8_t addr, uint8_t raw, const char **desc, const char **tips) { #define PRINTABLE_LEN 8 //including 0-termination static char printable[PRINTABLE_LEN]; static char *empty=""; @@ -239,9 +239,12 @@ static char *dtc_printable_by_raw(uint8_t addr, uint8_t raw, const char **desc) const struct dtc_table_entry *dtc_entry; const struct dtc_table_entry *dtc_map; const char *prefix; - uint16_t suffix; + int16_t suffix; prefix = "???"; + if (tips != NULL) { + *tips = NULL; + } ecu_entry = ecu_info_by_addr(addr); if (ecu_entry) { prefix = ecu_entry->dtc_prefix; @@ -254,10 +257,17 @@ static char *dtc_printable_by_raw(uint8_t addr, uint8_t raw, const char **desc) if (desc != NULL) { *desc = dtc_entry->desc; } + if (tips != NULL) { + *tips = dtc_entry->tips; + } if (suffix > 999) { suffix = 999; } - snprintf(printable, PRINTABLE_LEN, "%s-%03d", prefix, suffix); + if (suffix >= 0) { + snprintf(printable, PRINTABLE_LEN, "%s-%03d", prefix, suffix); + } else { + snprintf(printable, PRINTABLE_LEN, "%s-???", prefix); + } return printable; } } @@ -290,7 +300,7 @@ static const char *current_dtc_prefix(void) { /* * Get a DTC byte value by the printable designation. Returns 0xffff on - * failure. + * failure. Where multiple matching DTCs exist, returns the first. */ static uint16_t dtc_raw_by_printable(const char *printable) { char prefix[8]; @@ -963,7 +973,7 @@ static enum cli_retval read_family(int argc, char **argv, enum l7_namespace ns) dtc_printable_by_raw( global_l2_conn ->diag_l2_destaddr, - addr, NULL)); + addr, NULL, NULL)); } if (gotbytes == 0) { printf_livedata("%02X: no data", addr); @@ -1367,9 +1377,18 @@ static enum cli_retval cmd_850_dtc(int argc, UNUSED(char **argv)) { int i; int span; char *code; - const char *desc; + const char *desc, *tips; + bool unconfirmed = false; + bool have_tips = false; + bool show_tips = false; - if (!valid_arg_count(1, argc, 1)) { + if (!valid_arg_count(1, argc, 2)) { + return CMD_USAGE; + } + + if (argc == 2 && strcasecmp(argv[1], "tips") == 0) { + show_tips = true; + } else if (argc == 2) { return CMD_USAGE; } @@ -1398,8 +1417,29 @@ static enum cli_retval cmd_850_dtc(int argc, UNUSED(char **argv)) { printf("Stored DTCs:\n"); for (i=0; idiag_l2_destaddr, buf[i], &desc); + code = dtc_printable_by_raw(global_l2_conn->diag_l2_destaddr, buf[i], &desc, &tips); printf("%s (%02X) %s\n", code, buf[i], desc); + if (desc[0] != '\0' && desc[strlen(desc)-1] == '?') { + unconfirmed = true; + } + if (tips != NULL) { + have_tips = true; + if (show_tips) { + printf("%s\n", tips); + } + } + } + + if (unconfirmed) { + printf("Warning: descriptions and DTC suffixes for lines ending in ? are unconfirmed\n"); + } + + if (have_tips && !show_tips) { + printf("Tips are available for %s. Use \"dtc tips\" to show them.\n", (rv > span) ? "some of these DTCs" : "this DTC"); + } + + if (show_tips && !have_tips) { + printf("No tips are available for %s.\n", (rv > span) ? "these DTCs" : "this DTC"); } return CMD_OK; diff --git a/scantool/scantool_850/dtc.c b/scantool/scantool_850/dtc.c index 245c529..b8d9dc7 100644 --- a/scantool/scantool_850/dtc.c +++ b/scantool/scantool_850/dtc.c @@ -1,3 +1,30 @@ +/* + * freediag - Vehicle Diagnostic Utility + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + ************************************************************************* + * + * + * DTC tables for various Volvo vehicles + * + * Based on tables provided by Richard H. Jones and Aleksi Venäläinen + * + */ + #include #include "dtc.h" @@ -11,25 +38,1083 @@ const struct dtc_table_entry *dtctable_by_addr(uint8_t addr) { return NULL; } -static const struct dtc_table_entry aw50_dtc[] = { - {0x13, 332, "Torque converter lock-up solenoid open circuit", NULL}, - {0, 0, NULL, NULL}, +/* Antilock brakes (0x01) */ +static const struct dtc_table_entry dtc_list_abs[] = { + {0x05, 313, "Left Rear Wheel Sensor, open/short?", + "or bad ABS module solders or ignition switch"}, + {0x10, 311, "Left Front Wheel Sensor, open/short", + "or bad ABS module solders or ignition switch"}, + {0x11, 321, "Left Front Wheel Sensor, irregular > 25 mph", + "interference or excess oscillation > 40 km/h; or bad ABS module solders or ignition switch"}, + {0x12, -1, "Left Front Wheel Sensor?", + "or bad ABS module solders or ignition switch"}, + {0x13, 211, "Left Front Wheel Sensor, wrong wheel speed", + "signal absent yet circuit intact, or signal absent when moving off; or bad ABS module solders or ignition switch"}, + {0x14, 221, "Left Front Wheel Sensor, ABS control phase too long", + "signal absent in ABS function, yet circuit intact; or bad ABS module solders or ignition switch"}, + {0x15, -1, "Left Front Wheel Sensor?", + "or bad ABS module solders or ignition switch"}, + {0x20, 312, "Right Front Wheel Sensor, open/short", + "or bad ABS module solders or ignition switch"}, + {0x21, 322, "Right Front Wheel Sensor, irregular > 25 mph", + "interference or excess oscillation > 40 km/h; or bad ABS module solders or ignition switch"}, + {0x22, -1, "Right Front Wheel Sensor?", + "or bad ABS module solders or ignition switch"}, + {0x23, 212, "Right Front Wheel Sensor, wrong wheel speed", + "signal absent yet circuit intact, or signal absent when moving off; or bad ABS module solders or ignition switch"}, + {0x24, 222, "Right Front Wheel Sensor, ABS control phase too long", + "signal absent in ABS function, yet circuit intact; or bad ABS module solders or ignition switch"}, + {0x25, -1, "Right Front Wheel Sensor?", + "or bad ABS module solders or ignition switch"}, + {0x30, 313, "Left Rear Wheel Sensor, open/short", + "or bad ABS module solders or ignition switch"}, + {0x31, 323, "Left Rear Wheel Sensor, irregular > 25 mph", + "interference or excess oscillation > 40 km/h; or bad ABS module solders or ignition switch"}, + {0x32, -1, "Left Rear Wheel Sensor?", + "or bad ABS module solders or ignition switch"}, + {0x33, 213, "Left Rear Wheel Sensor, wrong wheel speed", + "signal absent yet circuit intact, or signal absent when moving off; or bad ABS module solders or ignition switch, or stuck emergency brake"}, + {0x34, 223, "Left Rear Wheel Sensor, ABS control phase too long", + "signal absent in ABS function, yet circuit intact; or bad ABS module solders or ignition switch"}, + {0x35, -1, "Left Rear Wheel Sensor?", + "or bad ABS module solders or ignition switch"}, + {0x40, 314, "Right Rear Wheel Sensor, open/short", + "or bad ABS module solders or ignition switch"}, + {0x41, 324, "Right Rear Wheel Sensor, irregular > 25 mph", + "interference or excess oscillation > 40 km/h; or bad ABS module solders or ignition switch"}, + {0x42, -1, "Right Rear Wheel Sensor?", + "or bad ABS module solders or ignition switch"}, + {0x43, 214, "Right Rear Wheel Sensor, wrong wheel speed", + "signal absent yet circuit intact, or signal absent when moving off; or bad ABS module solders or ignition switch, or stuck emergency brake"}, + {0x44, 224, "Right Rear Wheel Sensor, ABS control phase too long", + "signal absent in ABS function, yet circuit intact; or bad ABS module solders or ignition switch"}, + {0x45, -1, "Right Rear Wheel Sensor?", + "or bad ABS module solders or ignition switch"}, + {0x50, 411, "Left Front Wheel Inlet Valve, circuit open/short", + "bad wiring, hydraulic modulator, ABS module, or ignition switch"}, + {0x51, 413, "Right Front Wheel Inlet Valve, circuit open/short", + "bad wiring, hydraulic modulator, ABS module, or ignition switch"}, + {0x52, 421, "Rear Wheels Inlet Valve, circuit open/short", + "bad wiring, hydraulic modulator, ABS module, or ignition switch"}, + {0x54, 412, "Left Front Wheel Return Valve, circuit open/short", + "bad wiring, hydraulic modulator, ABS module, or ignition switch"}, + {0x55, 414, "Right Front Wheel Return Valve, circuit open/short", + "bad wiring, hydraulic modulator, ABS module, or ignition switch"}, + {0x56, 422, "Rear Wheels Return Valve, circuit open/short", + "bad wiring, hydraulic modulator, ABS module, or ignition switch"}, + {0x60, 423, "TRACS Valve, circuit open/short", + "bad wiring, hydraulic modulator, ABS module, or ignition switch"}, + {0x61, 424, "TRACS Pressure Switch, circuit open/short?", + "or bad wiring, hydraulic modulator, brake light switch, ABS module, ignition switch, or blown fuse 12 (STOP LAMPS)"}, + {0x64, 141, "Brake Pedal Sensor, short", + "or bad ABS module solders, wiring, brake pedal sensor, or ignition switch"}, + {0x65, 142, "Brake Light/Pedal Switch, open/short or adjustment", + "or brake light bulb, bad ABS module solders, wiring, or ignition switch"}, + {0x66, 144, "TRACS Disengaged to Avoid Front Brake Discs Overheating", NULL}, + {0x67, 143, "Missing or Faulty Vehicle Speed Signal from ABS module", + "or bad ABS module solders, ABS module memory fault, or otherwise faulty ABS module or ignition switch"}, + {0x70, 443, "Pump motor fault", + "or fuse 9 (ABS PUMP MOTOR), pump power plug not seated properly, bad wiring (eg, insulation that falls off, any short/open), bad ABS module solders, combination relay, hydraulic modulator, ignition switch\n\nAdvanced command(s) ABS tests may not be able to be used if this code has been set.\n\nS40/V40 with Chassis number up to 414999 has defective power supply cable if ABS-441 and ABS-443 has been detected at the same time.\n Cable Harness -1997 P/N 30618007\nCable Harness 98-1999 P/N 30889999"}, + {0x72, 431, "ABS Module, general hardware fault", + "or bad ABS module solders or ignition switch"}, + {0x75, 432, "ABS Module, general interference fault", + "or bad ABS module solders or ignition switch; see 'https://www.matthewsvolvosite.com/forums/viewtopic.php?f=1&t=78577&start=30#p428745'"}, + {0x77, 433, "Battery Voltage, too high", NULL}, + {0x80, 441, "ABS Microprocessors, redundant calculations mismatch", + "or fuse 14 (ABS MAIN SUPPLY), bad ABS module solders, wheel sensor wiring close to interference, ignition switch\nS40/V40 with Chassis number up to 414999 has defective power supply cable if ABS 441 and ABS 443 has been detected at the same time.\n Cable Harness up to 1997 P/N 30618007\nCable Harness 98 to 1999 P/N 30889999"}, + {0x81, 444, "ABS Module, internal valve reference voltage error or no power to hydraulic valves?", + "or bad wiring, bad ABS module solders, combination relay, hydraulic modulator, ignition switch, or bad ABS module"}, + {0x82, 442, "ABS Module, leakage current or Hydraulic Modulator Pump Pressure, too low?", + "or bad wiring, bad ABS module solders, combination relay, hydraulic modulator, ignition switch, or bad ABS module"}, + {0x83, 445, "ABS Module, either inlet or return valve circuit fault?", + "or bad wiring, bad ABS module solders, combination relay, hydraulic modulator, ignition switch, or bad ABS module"}, + {0, 0, NULL, NULL} }; -static const struct dtc_table_entry m44_old_dtc[] = { - {0x54, 445, "Pulsed secondary air injection system pump signal", NULL}, - {0, 0, NULL, NULL}, +/* 912-D fuel-driven heater (cold climate option) (0x18) */ +static const struct dtc_table_entry dtc_list_add[] = { + {0x31, 801, "Coolant Temperature Sensor, Signal too High", NULL}, + {0x32, 802, "Coolant Temperature Sensor, Signal too Low", NULL}, + {0x33, 803, "Coolant Temperature Sensor, Signal faulty", NULL}, + {0x34, 142, "Outside Temperature Sensor, Signal too High", NULL}, + {0x35, 143, "Outside Temperature Sensor, Signal too Low", NULL}, + {0x36, 811, "Flame Sensor, Signal too Low during run", NULL}, + {0x37, 899, "Factory set DTC, no fault with heater", NULL}, + {0x38, 812, "Flame Sensor, Signal too High during start", NULL}, + {0x39, 813, "Flame Sensor, Signal too High", NULL}, + {0x3A, 821, "Water Pump, Signal too High", NULL}, + {0x3B, 822, "Water Pump, Signal too Low", NULL}, + {0x3C, 814, "Combustion fan, Signal too High", NULL}, + {0x3D, 815, "Combustion fan, Signal too Low", NULL}, + {0x3E, 816, "Combustion fan, Faulty Signal", NULL}, + {0x3F, 825, "Fuel Pump, Signal too High", NULL}, + {0x40, 826, "Fuel Pump, Signal too Low", NULL}, + {0x41, 831, "Overheat Protection Thermostat, Signal too Low", NULL}, + {0x42, 841, "Power Supply, Short Circuit to Supply", NULL}, + {0x43, 842, "Power Supply, Open Circuit", NULL}, + {0x44, 851, "Blower Fan, Signal too High", NULL}, + {0x45, 852, "Blower Fan, Signal too Low", NULL}, + {0x46, 861, "Glow Plugs, Short or Open Circuit", NULL}, + {0x47, 843, "Control Module Power Supply, Signal too High", NULL}, + {0x48, 832, "Overheat Protection Thermostat, Faulty Signal", NULL}, + {0x49, 891, "Too many Unsuccessful Start Attempts", NULL}, + {0x4A, 113, "Control Module, Parameter Fault", NULL}, + {0x4B, 112, "Control Module, General Fault", NULL}, + {0x51, 898, "Factory set DTC, no fault with heater", NULL}, + {0, 0, NULL, NULL} +}; + +/* AW50-42 transmission (0x6e) */ +static const struct dtc_table_entry dtc_list_aw50[] = { + {0x02, 122, "Shift Solenoid S1 circuit, open", + "(P0750) eg, bad wiring or solenoid, poor terminal contact at TCM connector, bad TCM, or low/dirty fluid"}, + {0x03, 121, "Shift Solenoid S1 circuit, short to ground", + "(P0750) eg, bad wiring, solenoid, or TCM, or low/dirty fluid"}, + {0x08, 222, "Shift solenoid S2 circuit fault", + "(P0755) eg, bad wiring (see OTP Volvo 850 DVD/USB TP-4312031 p157), bad solenoid, poor terminal contact, bad TCM, or low/dirty fluid"}, + {0x09, 221, "Shift solenoid S2 circuit, short to ground", + "(P0755) eg, bad wiring or solenoid, or low/dirty fluid"}, + {0x0D, 123, "Line Pressure Solenoid STH circuit, short to supply", + "(P0745) eg, bad wiring or TCM, bad solenoid, or low/dirty fluid"}, + {0x0E, 132, "TCM Fault, amplifier STH short circuit", + "(P0745) eg, poor terminal contact at TCM connector, open circuit in TCM voltage supply or grounds, bad TCM, or low/dirty fluid"}, + {0x0F, 131, "Line Pressure Solenoid STH circuit, short to ground or open", + "eg, bad wiring, bad solenoid, poor terminal contact, bad TCM, or low/dirty fluid"}, + {0x12, 331, "Lock-up solenoid SL circuit, short to supply", + "(P0740 if USA/Canada model year >= 1997)"}, + {0x13, 332, "Lock-up solenoid SL, open circuit", + "(P0740 if USA/Canada model year >= 1997) open in signal cable, bad solenoid, open in power ground, poor terminal contact, bad TCM"}, + {0x14, 333, "Lock-up solenoid SL circuit, short to ground", + "(P0740 if USA/Canada model year >= 1997)"}, + {0x17, 213, "Throttle Position Sensor signal too high", + "(P0120) >5.4 V for ~10 sec; eg, TPS signal short to supply, TPS sensor circuit failure"}, + {0x18, 223, "Throttle Position Sensor signal too low", + "(P0120) <0.1 V for ~10 sec; or unplugged - no signal; eg, TPS disconnected, TPS signal short to ground, poor terminal contact, TPS sensor circuit failure\nAfter repairs must they be verified by:\n\n-Ignition on\n-Push down the accelerator pedal to wide open throttle (WOT) and keep it fully depressed.\n-Wait 15 seconds.\n Read off the status DTC.\n\n\nIf the fault is intermittent the indicator and warning lamp will go out after the ignition has been switched on and off a certain number of times. Up to five times.\n\n\n TCM may ask ECM to turn on MIL light."}, + {0x1C, 143, "Kickdown switch circuit, signal too low", + "see 'https://www.matthewsvolvosite.com/forums/viewtopic.php?f=1&t=71168&start=10#p485175' for possible sources"}, + {0x1F, 232, "Vehicle Speed Signal is missing or incorrect", + "(P0500) see OTP Volvo 850 DVD/USB TP-4312031 p32, p45, pp183-192, pp403-404 for details"}, + {0x23, 311, "Transmission RPM Sensor, no signal", + "(P0175) when vehicle speed > ~15 mph/~25 km/h; eg, open or short circuit from bad wiring, bad Transmission RPM Sensor, poor terminal contact"}, + {0x28, 321, "Gear 1 incorrect ratio", + "(P0731) see OTP Volvo 850 DVD/USB TP-4312031 p231 for possible causes"}, + {0x29, 322, "Gear 2 incorrect ratio / Alternatively, on earlier models: Gear Ratio Info Incorrect", + "(P0732/P0730) see OTP Volvo 850 DVD/USB TP-4312031 p231 for possible causes"}, + {0x2A, 323, "Gear 3 incorrect ratio / Alternatively, on earlier models: Lock-up slips or is not engaged", + "(P0733) see OTP Volvo 850 DVD/USB TP-4312031 p231 for possible causes"}, + {0x2B, 324, "Gear 4 incorrect ratio", + "(P0734) see OTP Volvo 850 DVD/USB TP-4312031 p231 for possible causes"}, + {0x2F, 341, "Lock-up function, slipping or not engaged", + "(P0740 if USA/Canada model year >= 1997) lock-up activated, yet >100 rpm difference between Engine RPM and Transmission RPM; TCM vs. ECM mismatch, poor terminal contact, mechanical fault in transmission"}, + {0x35, 114, "Mode Selector Switch, Signal too High", + "short circuit to supply, driving mode selector module, or cluster fault feeding transmission fault light; eg, poor terminal contact, open circuit or short circuit to supply, poor TCM connector terminal contact, driving mode selector module, or cluster fault feeding transmission fault light"}, + {0x36, 124, "Mode Selector Switch, faulty or short circuit to ground", + "eg, 'W' button depressed > 25 sec, controls sticking, loose parts, bad resistance, bad wiring"}, + {0x37, 122, "Shift Solenoid S1 circuit", NULL}, + {0x38, 123, "Line pressure solenoid STH circuit", NULL}, + {0x39, 313, "Gearshift Position Sensor, faulty signal", + "(P0705) eg, bad wiring, incorrect adjustment, bad gear-shift position sensor, or terminal contact resistance"}, + {0x3A, 131, "Line pressure solenoid STH", NULL}, + {0x3B, 132, "Control Module amp STH", NULL}, + {0x3C, 134, "engine load signal incorrect", + "missing Load Signal from ECM when Transmission Input RPM > 600 rpm; bad wiring, poor terminal contact"}, + {0x3D, 141, "Oil Temp Sensor", NULL}, + {0x3E, 142, "Oil Temp Sensor", NULL}, + {0x3F, 245, "Torque limiting request not acked by ECM", + "eg, open in signal cables TC1/TC2/TCM, short to ground or supply in signal cables TC1/TC2/TCM, terminal contact resistance"}, + {0x40, 213, "Throttle Position", NULL}, + {0x41, 221, "Shift solenoid S2 circuit", NULL}, + {0x42, 235, "ATF Temperature too high", + ">150 C for ~5 sec / >302 F for ~5 sec; Transmission warning light blinks until temp <140 C / <284 C"}, + {0x43, 141, "ATF Temperature Sensor signal too low", + "<0.2 V for 25 sec; eg, short to ground in signal circuit, bad ATF Temp Sensor, lock-up may fail"}, + {0x44, 142, "ATF Temperature Sensor signal too high", + "ATF Temp < -10 C when engine started and did not change after engine on for 10 min; eg, open in signal cable or ground lead, short to supply in signal cable, bad ATF Temp Sensor, bad resistance, etc"}, + {0x45, 235, "Oil Temperature", NULL}, + {0x46, -1, "Torque Reduction Signal too Low (V70) / Torque limiting circuit?", NULL}, + {0x47, -1, "Torque Reduction Signal too High (V70) / Transmission RPM signal missing or incorrect?", NULL}, + {0x48, -1, "Control Module Communication / Gear position sensor?", NULL}, + {0x49, 412, "Control Module memory fault", + "(P0601 if USA/Canada model year >= 1997) eg, low battery power, bad TCM"}, + /* 0x13 for AT-332 has been seen in the wild, 0x4E has not. + 0x4A throught 0x4F might be bogus, or they might be valid DTCs for + a less common variant of the TCM. */ + {0x4A, 322, "Gear 2 incorrect ratio", NULL}, + {0x4B, 323, "Gear 3 incorrect ratio", NULL}, + {0x4C, 324, "Gear 4 incorrect ratio", NULL}, + {0x4D, 331, "Lock-up solenoid SL circuit", NULL}, + {0x4E, 332, "Lock-up solenoid SL circuit", NULL}, + {0x4F, 333, "Lock-up solenoid SL circuit", NULL}, + {0x50, 411, "Control Module EEPROM fault", + "eg, low battery power, bad TCM"}, + {0x51, 421, "Battery Volts too low", + "no supply voltage to TCM #A10 for ~10 sec; eg, open in supply circuit, poor terminal contact, bad TCM"}, + {0x55, 511, "TCM-ECM Communication Fault", NULL}, + {0x60, 522, "TCM-ECM Communication Fault", NULL}, + {0x61, 523, "TCM-ECM Communication Fault", NULL}, + {0x62, 524, "TCM-ECM Communication Fault", NULL}, + {0x63, 525, "TCM-ECM Communication Fault", NULL}, + {0x64, 526, "TCM-ECM Communication Fault", NULL}, + {0xE0, 527, "TCM-ECM Communication Fault", NULL}, + {0, 0, NULL, NULL} +}; + +/* Cab Control Unit (convertible top) (0x42) */ +static const struct dtc_table_entry dtc_list_ccu[] = { + {0x03, 110, "Control Module, Internal Malfunction / Parameter faults, Intermittent fault", NULL}, + {0x04, 111, "Control Module, Internal Malfunction / Parameter faults, Permanent fault", NULL}, + {0x05, 120, "Convertible Top Position Sensor, Invalid Position", NULL}, + {0x06, 121, "Convertible Top Position Sensor, Angle fault", NULL}, + {0x07, 130, "Convertible Top Movement, Time Limit", + "Movement is too slow"}, + {0x08, 140, "Motor Relay, faulty signal", NULL}, + {0x09, 150, "Control Unit Power Supply, Signal too Low", + "Battery voltage is < 9V for more than 1 seconds"}, + {0x0A, 160, "Control Unit Power Supply, Signal too High", + "Battery voltage is > 16V for more than 1 seconds"}, + {0x0B, 170, "Control Unit Power Supply, Signal Missing", + "Battery voltage missing for power supply"}, + {0x10, 210, "Speed Signal, Signal missing", + "No speed signal to the control module 10 seconds after the ignition is turned on -- Comes from COMBI/CDM"}, + {0x13, 211, "Convertible Top Switch UP/DOWN, faulty signal", + "Both signals at the same time or if one becomes continuously low."}, + {0x14, 212, "Front Lock Micro Switch, faulty signal", + "wrong signal from microswitch, jammed or shorted"}, + {0x15, 213, "Front Latch Arm (rear) Micro Switch, faulty signal", + "wrong signal from microswitch, jammed or shorted"}, + {0x16, 214, "Front Latch Arm (front) Micro Switch, faulty signal", + "wrong signal from microswitch, jammed or shorted"}, + {0x17, 215, "Rear Latch Arm Micro Switch, faulty signal", + "if tension bow striker plate is down in the rear hatches but none microswitches indicate open"}, + {0x1A, 216, "Cover (latch) Micro Switch, faulty signal", + "wrong signal from microswitch, jammed or shorted"}, + {0x1B, 217, "Tension Bow Micro Switches, faulty signal", + "wrong signal from microswitch, jammed or shorted"}, + {0x20, 220, "Convertible Top Position Sensor, Signal too Low", NULL}, + {0x21, 221, "Convertible Top Position Sensor, Signal too High", NULL}, + {0x22, 222, "Rear Latch Arm Position Sensor, Signal too Low", NULL}, + {0x23, 223, "Rear Latch Arm Position Sensor, Signal too High", NULL}, + {0x30, 230, "Convertible Top Control Unit Outputs, Signal too High", + "Warning Signal Buzzer, Trunk lid inhibitor, Side Windows Down, Heated Rear Window."}, + {0x31, 231, "Air Conditioning Signal too Low", NULL}, + {0x32, 232, "Dashboard LED, Signal too Low", NULL}, + {0x40, 310, "Motors, Current too High", NULL}, + {0x41, 311, "Convertible Top, Closing, Current too High", NULL}, + {0x42, 312, "Convertible Top, Opening, Current too High", NULL}, + {0x43, 313, "Cover Closing, Current too High", + "Missing signal from microswitch of cover locking arm results motor running longer."}, + {0x44, 314, "Cover Opening, Current too High", + "Cover plate lock running against a mechanical stop"}, + {0x45, 315, "Rear Latch Arms, Closing, Current too High", + "Motors for real locking arms and tensioner rib/bow are activated at the same time"}, + {0x46, 316, "Rear Latch Arms, Opening, Current too High", NULL}, + {0x47, 317, "Front Lock, Closing, Current too High", NULL}, + {0x48, 318, "Front Lock, Opening, Current too High", + "Microswitch signal Front Latch Arm missing?"}, + {0x49, 319, "Tension Bow, Closing, Current too High", + "Rear Latch Arms Microswitch signal missing?"}, + {0x4A, 320, "Tension Bow, Opening, Current too High", + "Tensioner Rib/Bow Microswitch signal missing?"}, + {0, 0, NULL, NULL} +}; + +/* Combined instrument panel (0x51) */ +static const struct dtc_table_entry dtc_list_combi[] = { + {0x01, 222, "Vehicle Speed Signal too high", NULL}, + {0x02, 221, "Vehicle Speed Signal missing", NULL}, + {0x03, 114, "Fuel Level sensor stuck / signal constant for 94 miles", + "(P0500) usually due to bad ABS module solders"}, + {0x04, 112, "Fuel Level signal too low / short to ground", NULL}, + {0x05, 113, "Fuel Level signal too High / Low Fuel / short to supply", NULL}, + {0x06, 121, "Engine Coolant Temperature signal faulty", + "see http://www.volvotips.com/index.php/850-2/volvo-850-s70-v70-c70-service-repair-manual/volvo-850-instrument-panel-service-repair-manual/"}, + {0x07, 123, "48-pulse output Speed Signal too high / short to supply", NULL}, + {0x08, 143, "48-pulse output Speed Signal too low / short to ground", NULL}, + {0x09, 131, "12-pulse Speed Signal too high / short to supply", NULL}, + {0x0A, 141, "12-pulse Speed Signal too low / short to ground", NULL}, + {0x0B, 132, "Engine RPM signal missing", NULL}, + {0x0C, 124, "Engine RPM signal faulty", NULL}, + {0x0D, 211, "D+ alternator voltage signal too low / missing for >= 10 sec when > 1000 RPM", NULL}, + {0x0E, 133, "Fuel Level Signal To Trip Computer too high / short to supply", NULL}, + {0x0F, 142, "Ambient Temperature signal missing", + "Grey connector sensor at the bumper on 850"}, + {0x10, 231, "COMBI microprocessor internal fault", NULL}, + {0x11, 174, "Wide Disparity in Fuel Levels and/or Fuel Consumption signal missing", + "DTC rarely seen; (in 850 especially) DTC 11 Freeze Frame sometimes precedes a Low Fuel situation, occasionally follows a Fillup, and oftentimes persists after clearing COMBI DTCs"}, + {0x14, -1, "Fuel Consumption signal?", NULL}, + {0x15, -1, "Fuel Consumption signal?", NULL}, + {0x16, -1, "Fuel Consumption signal?", NULL}, + {0x17, -1, "Fuel Consumption signal?", NULL}, + {0x20, 232, "COMBI is not yet programmed", NULL}, + {0xF8, 231, "COMBI microprocessor internal fault", NULL}, + {0xF9, 113, "Fuel Level signal too High / Low Fuel / short to supply", NULL}, + {0xFA, 112, "Fuel Level signal too low / short to ground", NULL}, + {0xFB, 115, "Fuel Level Sensor Circuit Malfunction", NULL}, + {0xFC, 415, "Road Speed Signal missing or faulty", NULL}, + {0xFD, 414, "Road Speed Signal missing or faulty", NULL}, + {0, 0, NULL, NULL} +}; + +/* Denso EFI (0x7a) */ +/* Used in some vehicles such as '99 S70/V70 with B5254S engine */ +#if 0 +/* We currently can't handle two-byte DTCs. */ +static const struct dtc_table_entry dtc_list_denso[] = { + {0x1000, 1000, "Engine control module, internal fault", NULL}, + {0x100A, 100A, "Engine control module, internal fault. Faulty signal", NULL}, + {0x1100, 1100, "Outside temperature sensor", NULL}, + {0x110A, 110A, "Outside temperature sensor. Faulty signal", NULL}, + {0x1200, 1200, "Intake Air Temperature Sensor", NULL}, + {0x120A, 120A, "Intake air temperature sensor inlet. Faulty signal", NULL}, + {0x1300, 1300, "Mass air flow sensor", NULL}, + {0x130A, 130A, "Air flow. Faulty flow", NULL}, + {0x1400, 1400, "Manifold absolute pressure sensor", NULL}, + {0x140A, 140A, "Manifold absolute pressure sensor. Faulty signal", NULL}, + {0x150A, 150A, "Mass air flow sensor", NULL}, + {0x2000, 2000, "Engine coolant temperature sensor", NULL}, + {0x200A, 200A, "Engine coolant temperature sensor. Faulty signal", NULL}, + {0x200F, 200F, "Engine coolant temperature sensor. Faulty signal", NULL}, + {0x2100, 2100, "Front heated oxygen sensor", NULL}, + {0x210A, 210A, "Front heated oxygen sensor. Faulty signal", NULL}, + {0x210F, 210F, "Front heated oxygen sensor. Faulty signal", NULL}, + {0x2110, 2110, "Front heated oxygen sensor, heating", NULL}, + {0x2120, 2120, "Front heated oxygen sensor, control element", NULL}, + {0x2200, 2200, "Rear heated oxygen sensor", NULL}, + {0x220A, 220A, "Rear heated oxygen sensor. Faulty signal", NULL}, + {0x220F, 220F, "Rear heated oxygen sensor. Faulty signal", NULL}, + {0x2210, 2210, "Rear heated oxygen sensor, heating", NULL}, + {0x2300, 2300, "Injector cylinder 1. Faulty signal", NULL}, + {0x2310, 2310, "Injector cylinder 2. Faulty signal", NULL}, + {0x2320, 2320, "Injector cylinder 3. Faulty signal", NULL}, + {0x2330, 2330, "Injector cylinder 4. Faulty signal", NULL}, + {0x2340, 2340, "Injector cylinder 5. Faulty signal", NULL}, + {0x2400, 2400, "Fuel pump relay", NULL}, + {0x250A, 250A, "Long-term fuel trim", NULL}, + {0x3000, 3000, "Camshaft position sensor. Faulty signal", NULL}, + {0x300A, 300A, "Camshaft position sensor. Faulty signal", NULL}, + {0x3100, 3100, "Engine speed sensor. Faulty signal", NULL}, + {0x310A, 310A, "Engine speed sensor", NULL}, + {0x3200, 3200, "Ignition coil. Faulty signal", NULL}, + {0x3300, 3300, "Ignition coil cylinder 1. Faulty signal", NULL}, + {0x3310, 3310, "Ignition coil cylinder 2. Faulty signal", NULL}, + {0x3320, 3320, "Ignition coil cylinder 3. Faulty signal", NULL}, + {0x3330, 3330, "Ignition coil cylinder 4. Faulty signal", NULL}, + {0x3340, 3340, "Ignition coil cylinder 5. Faulty signal", NULL}, + {0x3400, 3400, "Knock sensor", NULL}, + {0x340A, 340A, "Knock sensor", NULL}, + {0x3502, 3502, "Misfire", NULL}, + {0x3503, 3503, "Misfire", NULL}, + {0x4000, 4000, "Canister purge valve", NULL}, + {0x4010, 4010, "EVAP canister shut-off valve. Faulty signal", NULL}, + {0x4020, 4020, "Fuel tank pressure sensor", NULL}, + {0x402A, 402A, "Fuel tank pressure sensor. Faulty signal", NULL}, + {0x4038, 4038, "Brake vacuum. Too low vacuum", NULL}, + {0x4050, 4050, "Fuel level sensor. Faulty signal", NULL}, + {0x405A, 405A, "Fuel level sensor. Faulty signal", NULL}, + {0x4201, 4201, "Three-way catalytic converter efficiency. Power deterioration", NULL}, + {0x4308, 4308, "Leak diagnostic", NULL}, + {0x5000, 5000, "Air conditioning pressure sensor", NULL}, + {0x500A, 500A, "Air conditioning pressure sensor. Faulty signal", NULL}, + {0x510D, 510D, "Vehicle speed signal. Faulty signal", NULL}, + {0x5200, 5200, "Starter motor signal", NULL}, + {0x530D, 530D, "Diagnostic trouble code in transmission control module. Faulty signal", NULL}, + {0x531D, 531D, "Diagnostic trouble code in combined instrument panel. Faulty signal", NULL}, + {0x532D, 532D, "MIL requested by throttle unit. Faulty signal", NULL}, + {0x6000, 6000, "Air conditioning relay", NULL}, + {0x6110, 6110, "Engine cooling fan relay, low speed", NULL}, + {0x6120, 6120, "Engine cooling fan relay, high speed", NULL}, + {0x6200, 6200, "AACV. Faulty signal", NULL}, + {0x6207, 6207, "AACV. Flow too low", NULL}, + {0x620A, 620A, "Idling speed", NULL}, + {0x6300, 6300, "ETS warning lamp. Signal too low", NULL}, + {0x6310, 6310, "ETS warning lamp. Signal too high", NULL}, + {0x6400, 6400, "Camshaft reset valve", NULL}, + {0x640A, 640A, "Camshaft reset valve. Faulty signal", NULL}, + {0x710A, 710A, "CAN communication. Faulty signal", NULL}, + {0x7110, 7110, "Engine control module, internal fault. Faulty signal", NULL}, + {0x7120, 7120, "Engine control module, internal fault. Faulty signal", NULL}, + {0x7140, 7140, "Engine control module, internal fault", NULL}, + {0x715D, 715D, "Engine control module, high temperature. Temperature too high", NULL}, + {0x716D, 716D, "Engine control module, high temperature. Temperature too high", NULL}, + {0x720A, 720A, "Immobilizer communication", NULL}, + {0x8000, 8000, "+30-supply to control module. Open-circuit", NULL}, + {0x8010, 8010, "Battery voltage", NULL}, + {0x820A, 820A, "System relay. Faulty signal", NULL}, + {0x8400, 8400, "5 volt power supply", NULL}, + {0x900E, 900E, "Engine control module, internal fault", NULL}, + {0x901A, 901A, "Engine control module communication. Faulty signal", NULL}, + {0x902A, 902A, "Communication with throttle unit. Faulty signal", NULL}, + {0x902B, 902B, "Communication with throttle unit", NULL}, + {0x903F, 903F, "Throttle position. Signal missing", NULL}, + {0x910E, 910E, "Throttle valve. Internal fault", NULL}, + {0x911A, 911A, "Throttle unit communication. Faulty communication", NULL}, + {0x912A, 912A, "Communication with the engine control module . Signal missing", NULL}, + {0x913F, 913F, "Throttle position. Non plausible request", NULL}, + {0x914F, 914F, "Throttle position sensor 1 and 2. Faulty signal", NULL}, + {0x9150, 9150, "Throttle position sensor 1. Faulty signal", NULL}, + {0x9160, 9160, "Throttle position sensor 2. Faulty signal", NULL}, + {0x917F, 917F, "Accelerator pedal position. Faulty signal", NULL}, + {0x9180, 9180, "Accelerator pedal position sensor. Faulty signal", NULL}, + {0x918F, 918F, "Accelerator pedal position sensor. Faulty signal", NULL}, + {0x9190, 9190, "Throttle position. Faulty current", NULL}, + {0x91A7, 91A7, "Throttle position. Faulty control", NULL}, + {0x91B7, 91B7, "Throttle position. Faulty position", NULL}, + {0x91CF, 91CF, "Brake pedal position. Faulty signal", NULL}, + {0x91DF, 91DF, "Brake pedal position. Faulty position", NULL}, + {0x91E0, 91E0, "Throttle valve. Too high supply voltage", NULL}, + {0x91F0, 91F0, "Throttle position. Faulty current", NULL}, + {0x9200, 9200, "Cruise control lever", NULL}, + {0x921F, 921F, "Clutch pedal position. Faulty position", NULL}, + {0x9300, 9300, "Clutch pedal position sensor", NULL}, + {0x930A, 930A, "Clutch pedal sensor. Faulty signal", NULL}, + {0x9400, 9400, "Brake pedal sensor", NULL}, + {0x941F, 941F, "Brake pedal position. Faulty signal", NULL}, + {0x950F, 950F, "Accelerator pedal position sensor. Faulty signal", NULL}, + {0x951F, 951F, "Accelerator pedal position sensor. Faulty signal", NULL}, + {0x9520, 9520, "Accelerator pedal position sensor", NULL}, + {0x9530, 9530, "Accelerator pedal position sensor", NULL}, + {0x9540, 9540, "Accelerator pedal sensor power supply", NULL}, + {0x980F, 980F, "Air flow. Faulty flow", NULL}, + {0xA02B, 02B, "Communication, control module for anti-lock brakes. Faulty signal", NULL}, + {0xA03B, 03B, "Communication, Central electronic module. Faulty signal", NULL}, + {0xD00E, 00E, "Front heated oxygen sensor. Faulty signal", NULL}, + {0xE000, 000, "Control module communication. Faulty communication", NULL}, + {0xE003, 003, "Configuration fault. Faulty configuration", NULL}, + {0, 0, NULL, NULL} +}; +#endif + +/* Dynamic Stability Assistance (0x02) */ +static const struct dtc_table_entry dtc_list_dsa[] = { + {0x01, 131, "Torque reduction signal, signal faulty", NULL}, + {0x02, 231, "Throttle position sensor signal, signal missing", NULL}, + {0x03, 232, "Throttle position sensor signal, signal faulty", NULL}, + {0x04, 233, "DTC stored in engine control module", NULL}, + {0x05, 221, "Load signal missing", + "DSA control module registers no pulses from engine control module for approx. 1.5 seconds. Possibility Open circuit, short circuit, contact resistance. DSA warning light and DSA is disengaged."}, + {0x06, 222, "Load signal, signal faulty", NULL}, + {0x07, 223, "Initiating engine control module, signal faulty", NULL}, + {0x08, 224, "DTC stored in engine control module", NULL}, + {0x09, 311, "Wheel speed signal left front wheel, signal faulty", NULL}, + {0x0A, 312, "Wheel speed signal right front wheel, signal faulty", NULL}, + {0x0B, 313, "Wheel speed signal left rear wheel, signal faulty", NULL}, + {0x0C, 314, "Wheel speed signal right rear wheel, signal faulty/missing from ABS control module", + "Signal is usually pulsed between 0V and battery voltage with freq. changes comparable to the wheel speed.\nFault code is registered at above speed 8km/h if the increase of speed of wheel is too great or too little or if other wheel is locked this can cause as well fault code. Notice code may be stored if power supply / ground terminal for ABS control module is defective."}, + {0x0D, 212, "Brake light switch, signal faulty", + "When Brake light switch is not activated the DSA/signal is grounded via brake light bulbs and when activated the switch (and bulbs) receive battery voltage. If ground is lost when engine is running or signal voltage is too low (compared to battery) when activated fault code is stored."}, + {0x0E, 211, "Brake light switch, signal too high", NULL}, + {0x0F, 121, "DSA switch, Signal too low", NULL}, + {0x10, 122, "DSA Warning lamp, signal faulty", NULL}, + {0x11, 112, "Control Module, EEPROM fault", NULL}, + {0, 0, NULL, NULL} +}; + +/* Electronic Climate Control (0x29) */ +static const struct dtc_table_entry dtc_list_ecc[] = { + {0x0A, 221, "Air distribution damper motor position sensor Signal Low", NULL}, + {0x0B, 222, "Air distribution damper motor position sensor Signal High", NULL}, + {0x13, 322, "Air distribution damper motor position, no position change", NULL}, + {0x1A, 432, "Blower Fan Switch, Signal too Low", NULL}, + {0x1B, 433, "Blower Fan Motor, Current too High", NULL}, + {0x1C, 411, "Blower fan motor power unit, Faulty Signal / seized or drawing excess current", + "or blower fan obstruction, or power stage surge protector problem"}, + {0x1F, 412, "Fan motor passenger comp temp sensor, Signal too Low / Short to Ground", NULL}, + {0x20, 121, "Outside Temperature Sensor, Signal too Low", NULL}, + {0x21, 122, "Outside Temperature Sensor, Signal too High", NULL}, + {0x22, 123, "Passenger compartment temperature sensor, Signal too Low", NULL}, + {0x23, 124, "Passenger compartment temperature sensor, Signal too High", NULL}, + {0x24, 135, "Engine Coolant Temperature Signal Missing", NULL}, + {0x25, 211, "Drivers side Temp damper motor position sensor Signal High", NULL}, + {0x26, 212, "Drivers side Temp damper motor position sensor Signal Low", NULL}, + {0x27, 231, "Passenger Side Temp damper motor position sensor Signal High", NULL}, + {0x28, 232, "Passenger Side Temp damper motor position sensor Signal Low", NULL}, + {0x29, 235, "Recirculation damper motor position sensor Signal High", NULL}, + {0x2A, 236, "Recirculation damper motor position sensor Signal Low", NULL}, + {0x2B, 311, "Drivers side Temp damper motor, open or short in pot circuit", NULL}, + {0x2C, 313, "Passenger side Temp damper motor, open or short in pot circuit", NULL}, + {0x2D, 317, "Air distribution damper motor, open or short in pot circuit", NULL}, + {0x2E, 315, "Recirculation damper motor, open or short in pot circuit", NULL}, + {0x2F, 312, "Drivers side temp damper motor, no position change", NULL}, + {0x30, 314, "Passenger side temp damper motor, no position change", + "see 'ac heater system auto.pdf'"}, + {0x31, 316, "Recirculation damper motor, no position change", NULL}, + {0x32, 143, "Passenger compartment temp selector Right, Signal Faulty", NULL}, + {0x33, 143, "Passenger compartment temp selector Left, Signal Faulty", NULL}, + {0x34, 431, "Blower Fan Switch, Signal too High", NULL}, + /* Until MY97 there were two interior temperature sensors and two sets + of blink codes 4-1-2, 4-1-3, 4-1-4 and 4-1-5, 4-1-6, 4-1-7. Starting + with MY98 there is only one interior temperature sensor. This is the + same year that the ECC gained D2 communication, so if we get + ECC-412, 413 or 414, this does not correspond to driver or passenger + side. */ + {0x35, 412, "Interior temperature sensor inlet fan, short to ground", + "see 'ac heater system auto.pdf'"}, + {0x36, 413, "Interior temperature sensor inlet fan, open circuit", + "see 'ac heater system auto.pdf'"}, + {0x37, 414, "Interior temperature sensor inlet fan, faulty signal", + "carefully clean out any lint from temp sensor fan(s)"}, + {0x38, 411, "Blower fan motor power unit, faulty signal", + "or blower fan obstruction, or power stage surge protector problem"}, + {0x3A, 420, "ECC Control Module, internal fault in memory circuits", NULL}, + {0x3B, 421, "ECC Control Module, internal fault in memory ROM circuits", NULL}, + {0x3C, 422, "Self-adjustment damper motors, Drivers temp failed", NULL}, + {0x3D, 423, "Self-adjustment damper motors, Passenger temp failed", NULL}, + {0x3E, 424, "Self-adjustment damper motors, Air distribution failed", NULL}, + {0x3F, 425, "Self-adjustment damper motors, Recirculation failed", NULL}, + {0x50, 441, "Program downloading, control module. Not Done", NULL}, + {0x51, 442, "Program downloading, control module. Faulty", NULL}, + {0, 0, NULL, NULL} +}; + +/* Siemens EMS2000 EFI (0x7a) */ +/* Used in some vehicles such as '00 S40 with B4204T2 engine */ +/* These have 3-digit codes that match up with other EFI modules, but some + documentation seems to identify these by raw hex values? */ +static const struct dtc_table_entry dtc_list_ems2k[] = { + {0x0A, 422, "Atmospheric pressure sensor, Signal Faulty", NULL}, + {0x0F, 122, "Intake Air Temperature Sensor Faulty", NULL}, + {0x12, 414, "Boost pressure flow too Low", NULL}, + {0x13, 121, "Mass Air Flow sensor, Signal Faulty", NULL}, + {0x15, 123, "Engine Coolant Temperature sensor, Signal Faulty", NULL}, + {0x16, 212, "Front Heated Oxygen sensor, Signal Faulty", NULL}, + {0x17, 435, "Front Heated Oxygen sensor, short-term fuel trim Signal Faulty", NULL}, + {0x18, 521, "Front Heated Oxygen sensor, preheating circuit Fault", NULL}, + {0x1A, 153, "Rear Heated Oxygen sensor, Signal Faulty", NULL}, + {0x1C, 522, "Rear Heated Oxygen sensor, preheating circuit Fault", NULL}, + {0x1E, 115, "Injector 1, signal faulty", NULL}, + {0x1F, 125, "Injector 2, signal faulty", NULL}, + {0x20, 135, "Injector 3, signal faulty", NULL}, + {0x21, 145, "Injector 4, signal faulty", NULL}, + {0x24, 222, "System Relay Control, Signal Faulty", NULL}, + {0x25, 512, "Short-term Fuel Trim, changes too quickly", NULL}, + {0x26, 232, "Long-term Fuel Trim idling speed", NULL}, + {0x27, 231, "Long-term Fuel Trim part load speed", NULL}, + {0x29, 153, "Rear Heated Oxygen sensor, Signal Faulty", NULL}, + {0x2A, 436, "Rear Heated Oxygen sensor compensation", NULL}, + {0x2B, 521, "Front Heated Oxygen sensor, preheating circuit Fault", NULL}, + {0x2C, 522, "Rear Heated Oxygen sensor, preheating circuit Fault", NULL}, + {0x2D, 242, "Turbocharger Control Valve, Signal Faulty", NULL}, + {0x32, 314, "Camshaft position Sensor, Signal Faulty", NULL}, + {0x38, 525, "Ignition Coil 1 circuit Faulty", NULL}, + {0x3A, 526, "Ignition Coil 2 circuit Faulty", NULL}, + {0x41, 143, "Knock Sensor signal faulty", NULL}, + {0x46, 543, "Misfire Emission level", NULL}, + {0x4D, 545, "Misfire with three-way Catalytic converter damage", NULL}, + {0x53, 214, "Engine Speed Sensor faulty", NULL}, + {0x5A, 443, "Three-way Catalytic converter effiency", NULL}, + {0x6B, 225, "Air Conditioning Pressure Sensor, Signal Faulty", NULL}, + {0x6F, 311, "Speedometer, Signal from ABS faulty", NULL}, + {0x70, 412, "Throttle Position signal to DSA faulty", NULL}, + {0x73, 411, "Throttle Position sensor, signal faulty", NULL}, + {0x76, 666, "DTC in automatic transmission control module", NULL}, + {0x78, 131, "Engine Speed Sensor, Signal faulty", NULL}, + {0x7D, 342, "Air Conditioning Relay, Signal faulty", NULL}, + {0x7F, 323, "Malfunction indicator lamp circuit fault", NULL}, + {0x82, 516, "Air Conditioning cooling fan circuit fault", NULL}, + {0x85, 514, "Engine cooling fan Low-speed, Signal", NULL}, + {0x87, 515, "Engine cooling fan High-speed, Signal", NULL}, + {0x8A, 226, "Idle Air Control Valve, Signal Faulty", NULL}, + {0x8C, 233, "Adaptive idle air trim outside limits", NULL}, + {0x91, 337, "Torque Limiting Signal from DSA faulty", NULL}, + {0x9A, 353, "Communication with Immobilizer, Faulty Signal", NULL}, + {0x9B, 353, "Communication with Immobilizer, Faulty Signal", NULL}, + {0xA3, 254, "System Relay Output, circuit faulty", NULL}, + {0xDC, 742, "Comms with Trans Control Module faulty", NULL}, + {0xDD, 742, "Comms with Trans Control Module faulty", NULL}, + {0xDE, 742, "Comms with Trans Control Module faulty", NULL}, + {0xE0, -1, "Comms with Trans Control Module faulty", NULL}, + {0xFE, 337, "Torque Limiting Signal from DSA faulty", NULL}, + {0, 0, NULL, NULL} +}; + +/* Immobilizer (0x41) */ +static const struct dtc_table_entry dtc_list_immo[] = { + {0x01, 112, "Internal EEPROM memory fault", NULL}, + {0x02, -1, "Comm fault with engine ECU", NULL}, + {0x03, -1, "No Contact with Antenna", + "Or wrong antenna. Ex. Immo2 on 850 has 8 Ohms, Immo3 on S/V40 has 3.3 Ohms, V70 has 5 Ohms as rough resistance measurement.\nAntenna is tuned inside IMMO with capacitors and resistors for antennas inductivity to create LC circuit.\nOther reasons:\nThe cable between control module Pin #9 or #10 is short to gnd or +12V."}, + {0x04, -1, "No Response from Key Transponder", NULL}, + {0x05, -1, "Key Code not in memory", NULL}, + {0x06, 223, "Comm fault from Transponder to IMMO Control Module", NULL}, + {0x07, 336, "Control circuit to VGLA, fault in VGLA or LED circuit", + "(P0600)"}, + {0x30, 334, "Control circuit to Indicator Lamp, fault in circuit", NULL}, + {0x31, 335, "Starter Motor Control circuit, fault in circuit", NULL}, + {0x32, 324, "VERLOG code missing or mismatch", + "ECM or CSM module coding"}, + {0x33, 325, "Faulty Comms with coded starter module (CSM)", NULL}, + {0x34, 121, "PIN programming failed", NULL}, + {0x35, 225, "Fault Programming Key Code / Key Code verification failed", NULL}, + {0x36, 132, "No Key Codes in EEPROM", + "Live data should say IMMO PROG as not NORM"}, + {0x37, 122, "Immobilizer not yet programmed", + "After entering the code this gets automatically erased"}, + {0x38, 999, "EEPROM error", NULL}, + {0x51, 311, "Comms with engine ECU, short to supply in comm link 2 or 4", NULL}, + {0x52, 312, "Comms with engine ECU, short to ground in comm link 2 or 4", NULL}, + {0x53, 214, "Comms from engine ECU, wrong MIN code", + "ie, Immobilizer is programmed for a different engine ECU"}, + {0x54, 321, "Initiating signal from ECM, missing", NULL}, + {0x55, 326, "Reply signal from engine control module", NULL}, + {0xF7, 333, "Control circuit to VGLA, fault in VGLA or LED circuit", NULL}, + {0xF8, 336, "Control circuit to VGLA, fault in VGLA or LED circuit", + "(P0600)"}, + {0, 0, NULL, NULL} }; -static const struct dtc_table_entry m44_dtc[] = { +/* Motronic M4.4 engine management (0x7a) */ +static const struct dtc_table_entry dtc_list_m44[] = { + {0x09, 415, "Boost Pressure sensor signal", NULL}, + {0x0A, 212, "HO2S sensor signal, front", NULL}, + {0x0C, 153, "HO2S sensor signal, rear", + "(P0136 - faulty, P0137 - low, or P0138 - high)"}, + {0x0D, 521, "Front HO2S, preheating", NULL}, + {0x0E, 522, "Rear HO2S, preheating malfunction", + "(P0141)"}, + {0x0F, 435, "Front HO2S slow response", NULL}, + {0x10, 436, "Rear HO2S compensation", + "(P0133) see 1st 3 items in Bing search for 'P0133 \"EFI-436\"' and 1st 3 items in Google search"}, + {0x11, 425, "Rear HO2S, control (or possibly Temperature warning, level 1)", NULL}, + {0x13, 343, "Fuel Pump Relay", NULL}, + {0x18, 211, "CO Potentiometer", NULL}, + {0x1A, 231, "Long term fuel trim, part load", + "(P0171 or P0172) defective MAF, fuel pressure high/low (P0171/P0172), elbow at intake manifold (hidden underneath coolant thermostat) or elbow at PTC or vacuum leaks (if P0172), see OTP Volvo 850 DVD, see 7-step checkup in section including '2-3-1 (Adaptive HO2S Control Lean At Part Load)' of 'http://www.volvotips.com/index.php/850-2/volvo-850-s70-v70-c70-service-repair-manual/volvo-850-diagnostics-with-codes-obd/'"}, + {0x1B, 232, "Long term fuel trim, idling", + "(P0172 or P0171) elbow at intake manifold (hidden underneath coolant thermostat) or elbow at PTC or vacuum leaks (if P0172), fuel pressure high/low (P0171/P0172), defective MAF, see OTP Volvo 850 DVD, see 10-step checkup in section '2-3-2 (Adaptive HO2S Control Provides Richer Mixture At Idle)' of 'http://www.volvotips.com/index.php/850-2/volvo-850-s70-v70-c70-service-repair-manual/volvo-850-diagnostics-with-codes-obd/'"}, + {0x1D, 666, "DTC in transmission CM", NULL}, + {0x28, 443, "Catalyst efficiency", NULL}, + /* EFI-542 and 544 are not listed in the Green Book. Checked manuals + TP-2308032, 2308201, 2308202, 2318031 and 2318201 */ + {0x31, 542, "Misfire, multiple cylinders?", NULL}, + {0x32, 451, "Misfire, cylinder 1", + "(P0301)"}, + {0x33, 452, "Misfire, cylinder 2", + "(P0302)"}, + {0x34, 453, "Misfire, cylinder 3", + "(P0303)"}, + {0x35, 454, "Misfire, cylinder 4", + "(P0304)"}, + {0x36, 455, "Misfire, cylinder 5", + "(P0305)"}, + /* Besides 850, M4.4 or M4.4.1 was also used in 1997 960 and some other + 960/S90/V90/C90 models. 960/S90/V90/C90 are 6-cylinder vehicles. */ + {0x37, 456, "Misfire, cylinder 6", + "(P0306)"}, + {0x39, 353, "Immobilizer", NULL}, + {0x3D, 544, "Misfire, multiple cylinders?", NULL}, + {0x3E, 543, "Misfire, at least one cylinder", + "(P0300)"}, + {0x3F, 551, "Misfire with catalyst damage, cylinder 1", + "(P0301)"}, + {0x40, 552, "Misfire with catalyst damage, cylinder 2", + "(P0302)"}, + {0x41, 553, "Misfire with catalyst damage, cylinder 3", + "(P0303)"}, + {0x42, 554, "Misfire with catalyst damage, cylinder 4", + "(P0304)"}, + {0x43, 555, "Misfire with catalyst damage, cylinder 5", + "(P0305)"}, + {0x44, 556, "Misfire with catalyst damage, cylinder 6", + "(P0306)"}, + {0x4B, 545, "Misfire with catalyst damage, at least one cylinder", + "(P0300)"}, + {0x4D, 444, "Acceleration sensor signal", + "(P1307 - low or P1308 - high) see OTP 850 DVD, TP-2318201, p149 and p268, for possible sources"}, + {0x50, 442, "Pulsed secondary air injection system flow fault", + "(P0410) see OTP 850 DVD, TP-2308202, p669 and p78 and p316"}, + {0x51, 448, "Pulsed secondary air injection system pump flow fault", + "(P0410) see OTP 850 DVD, TP-2308202, p669 and p78 and p361"}, + {0x53, 446, "Pulsed secondary air injection system valve leakage", + "(P0410) see OTP 850 DVD, TP-2308202, p669 and p78 and p344"}, + {0x54, 445, "Pulsed secondary air injection system pump signal", + "(P0410) see OTP 850 DVD, TP-2318201, p268 and p44"}, + {0x55, 447, "Pulsed secondary air injection system solenoid valve signal", + "(P0413 - missing or P0414 - low/high) see OTP 850 DVD, TP-2318201, p268 and p44"}, + {0x56, 241, "EGR system", NULL}, + {0x59, 413, "EGR temperature sensor signal", NULL}, + {0x5D, 315, "Canister purge valve leakage", NULL}, + {0x5E, 611, "Fuel Tank system, large leakage", + "(P0455) Pressure in fuel tank does not drop rapidly enough"}, + {0x5F, 614, "EVAP canister shut off valve flow fault", NULL}, + {0x60, 616, "EVAP canister shut off valve signal", NULL}, + {0x61, 612, "Fuel Tank system, small leakage", + "(P0442) While EVAP canister shut-off valve is closed, the canister purge valve is pulsed until reached specific vacuum and this vacuum level has not stayed long enough. Check fuel cap seated and sealed properly, leaking fuel tank, filler pipe, EVAP canister or its shut-off valve, lines connecting any of those, or bad fuel tank pressure sensor"}, + {0x62, 541, "Canister purge valve signal", NULL}, + {0x63, 621, "Fuel tank pressure sensor signal", NULL}, + {0x65, 112, "MFI Control Module fault", NULL}, + {0x67, 112, "Memory Fault (ROM) In Engine Control Module", NULL}, + {0x6B, 132, "Battery Voltage", NULL}, + {0x6D, 315, "Canister purge valve leakage", NULL}, + {0x6E, 131, "RPM sensor signal missing", + "on gearbox casing, also known as Crankshaft sensor, should get reading of 200 to 400 Ohms with multimeter. Two pole connector."}, + {0x6F, 214, "RPM sensor signal sporadic/faulty", + "on gearbox casing, also known as Crankshaft sensor, should get reading of 200 to 400 Ohms with multimeter. Two pole connector."}, + {0x70, 314, "Camshaft Position sensor signal", + "(P0340) next to distributor, cannot verify ohm readings as its all over place from 2k to millions of ohms. When cranking you should get 1.5 to 2hz reading. Dont unplug sensor needs power to work. see OTP 850 DVD, TP-2308202, p262 for possible sources"}, + {0x73, 121, "Mass Air Flow sensor signal", NULL}, + {0x75, 411, "Throttle Position sensor signal", NULL}, + {0x77, 422, "Atmospheric pressure sensor signal", NULL}, + {0x78, 311, "Engine RPM high for too long while no Vehicle Speed measured", + "(P0500) Speedometer signal faulty; short circuit, open circuit, contact resistance, or faulty speedometer, ABS, or COMBI; see OTP 850 DVD: TP-2308202, p253, p669; see www.volvopedia.de/index.php?title=EFI-311"}, + {0x79, 355, "Mass air flow sensor, faulty signal", NULL}, + {0x7A, 112, "Fault in Engine Control Module NTC switch", NULL}, + {0x7B, 123, "Engine Coolant Temperature sensor", + "(P0116 - faulty, P0117 - low, P0118 - high, or P0115 - missing) see OTP 850 DVD: TP-2308202, p107, p668; see 'http://www.volvopedia.de/index.php?title=EFI-123#Motronic_4.4'"}, + {0x7C, 251, "Ambient Temperature sensor signal", + "(P0111 - sporadic, P0112 - low, or P0113 - high) see OTP 850 DVD: TP-2318201, p105, p266"}, + {0x7F, 112, "Fault in Engine Control Module Temperature", NULL}, + {0x80, 432, "Temperature warning, level 1", NULL}, + {0x81, 513, "Temperature warning, level 2", NULL}, + {0x82, 225, "A/C pressure sensor signal", NULL}, + {0x96, 115, "Injector 1", NULL}, + {0x97, 125, "Injector 2", NULL}, + {0x98, 135, "Injector 3", NULL}, + {0x99, 145, "Injector 4", NULL}, + {0x9A, 155, "Injector 5", NULL}, + {0x9B, 165, "Injector 6", NULL}, + {0xA4, 335, "Communication failure between TCM and ECM", + "(P1618 - High or P1617 - Low/Missing/Faulty) check grounds 31/71, 31/32, 31/33; check TCM pin B15 to M44 pin B26 circuit & connections; see OTP 850 DVD: TP-2308032, pp275-280; TP-2318201, p43, p269"}, + {0xA8, 223, "Idle Air Control valve opening signal", NULL}, + {0xA9, 245, "IAC valve closing signal", NULL}, + {0xAA, 233, "Adaptive idle air trim", NULL}, + {0xB4, 531, "Power stage group A", NULL}, + {0xB5, 532, "Power stage group B", NULL}, + {0xB6, 533, "Power stage group C", NULL}, + {0xB7, 534, "Power stage group D", NULL}, + {0xB8, 536, "Power stage group E", NULL}, + {0xB9, 537, "Power stage group F?", NULL}, + {0xD2, 143, "Front knock sensor", NULL}, + {0xD3, 433, "Rear knock sensor", NULL}, + {0xDE, 112, "Fault in Engine Control Module Knock Control", NULL}, + {0xE1, 233, "Idle air trim", NULL}, + {0xE5, 416, "Boost pressure reduction from TCM", NULL}, + {0xE6, 414, "Boost pressure regulation", NULL}, + {0xED, 112, "Fault in Engine Control Module NTC switch", NULL}, + {0xEE, 432, "Temperature warning, level 1", NULL}, + {0xEF, 513, "Temperature warning, level 2", NULL}, + {0xF1, 154, "EGR system leakage", NULL}, + {0xF4, 535, "Turbocharger control valve signal", NULL}, + {0xFD, 514, "Engine coolant fan, low speed", NULL}, + {0xFE, 621, "Fuel tank pressure sensor signal", NULL}, + {0, 0, NULL, NULL} +}; + +/* Motronic M4.4 with KWP71 communication (0x10) */ +/* This should probably use the same dtc_list_m44 table, but until we verify + this, use a little stub table for KWP71. */ +static const struct dtc_table_entry dtc_list_m44old[] = { {0x54, 445, "Pulsed secondary air injection system pump signal", NULL}, - {0, 0, NULL, NULL}, + {0, 0, NULL, NULL} +}; + +/* MSA 15.7 engine management (diesel vehicles) (0x11) */ +static const struct dtc_table_entry dtc_list_msa[] = { + {0x00, 131, "Engine Speed signal", NULL}, + {0x01, 719, "Secondary Engine Speed signal", NULL}, + {0x02, 132, "Battery Voltage", NULL}, + {0x03, 711, "Needle Lift sensor signal", NULL}, + {0x04, 732, "Accelerator Pedal Position sensor signal", NULL}, + {0x05, 123, "Engine Coolant Temperature sensor signal", NULL}, + {0x06, 122, "Intake Air Temperature sensor signal", NULL}, + {0x08, 712, "Fuel Temperature sensor signal", NULL}, + {0x09, 415, "Boost Pressure sensor signal", NULL}, + {0x0A, 112, "Barometric Pressure signal", NULL}, + {0x0A, 112, "Fault in Engine Control Module Barometric Pressure signal", NULL}, + {0x0B, 121, "Mass Air Flow sensor signal", NULL}, + {0x0C, 743, "Cruise Control switch signal", NULL}, + {0x0D, 112, "Fault in Engine Control Module Reference Voltage", NULL}, + {0x0F, 112, "Fault in Engine Control Module", NULL}, + {0x10, 311, "Vehicle Speed signal discrepancy", + "neither cruise control nor A/C will activate, possibly due to VSS fault, COMBI->ECM fault, or COMBI fault"}, + {0x11, 235, "Exhaust gas recirculation controller signal", NULL}, + {0x12, 242, "Turbocharger Control Valve signal", NULL}, + {0x14, 515, "Engine Coolant Fan, high speed signal", NULL}, + {0x19, 713, "Injection Timing, Advance Control Valve signal", NULL}, + {0x1A, 323, "Malfunction Indicator Lamp circuit fault", NULL}, + {0x1B, 721, "Glowplug Indicator Lamp signal", NULL}, + {0x20, 714, "Fuel Shut-off Valve signal", NULL}, + {0x21, 730, "Brake Pedal Switch signal", NULL}, + {0x22, 731, "Clutch Switch signal", NULL}, + {0x23, 724, "Engine Coolant Heater Relay signal", NULL}, + {0x24, 112, "Memory Fault (ROM) In Engine Control Module", NULL}, + {0x26, 514, "Engine Coolant Fan, low speed signal", NULL}, + {0x2A, 725, "Main Relay signal", NULL}, + {0x2B, 715, "Fuel Regulation", + "EVRY mod?"}, + {0x2D, 726, "Terminal 15-supply to Engine Control Module", NULL}, + {0x2E, 716, "Fuel Quantity Actuator signal", + "EVRY mod? / change fuel filter"}, + {0x2F, 718, "Ignition Timing Control", NULL}, + {0x30, 335, "Communication failure between TCM and ECM", NULL}, + {0x31, 353, "Communication failure with Immobilizer", NULL}, + {0x32, 742, "Communication failure between TCM and ECM", NULL}, + {0x33, 225, "A/C Pressure sensor signal", NULL}, + {0x34, 717, "Fuel Quantity Regulator Position sensor signal", + "EVRY mod?"}, + {0x36, 732, "Accelerator pedal position sensor signal", NULL}, + {0xFE, 131, "Engine Speed signal", NULL}, + {0, 0, NULL, NULL} +}; + +/* Power Seat Left (0x2e) and Power Seat Right (0x2f) */ +static const struct dtc_table_entry dtc_list_ps[] = { + {0x01, 112, "Legroom Motor 1, Pot signal too high", NULL}, + {0x02, 121, "Backrest Motor 2, Pot signal too high", NULL}, + {0x03, 122, "Seat Rear Edge Motor 3, Pot signal too high", NULL}, + {0x04, 211, "Seat Front Edge Motor 4, Pot signal too high", NULL}, + {0x05, 212, "Legroom Motor 1, Pot signal too low", NULL}, + {0x06, 222, "Backrest Motor 2, Pot signal too low", NULL}, + {0x07, 223, "Seat Rear Edge Motor 3, Pot signal too low", NULL}, + {0x08, 312, "Seat Front Edge Motor 4, Pot signal too low", NULL}, + {0x09, 123, "Legroom Motor 1 Movement when not activated", NULL}, + {0x0A, 131, "Backrest Motor 2 Movement when not activated", NULL}, + {0x0B, 132, "Seat Rear Edge Motor 3 Movement when not activated", NULL}, + {0x0C, 133, "Seat Front Edge Motor 4 Movement when not activated", NULL}, + {0x0D, 143, "Legroom Motor 1 moves in wrong direction", NULL}, + {0x0E, 144, "Backrest Motor 2 moves in wrong direction", NULL}, + {0x0F, 214, "Seat Rear Edge Motor 3 moves in wrong direction", NULL}, + {0x10, 224, "Seat Front Edge Motor 4 moves in wrong direction", NULL}, + {0x11, 323, "Memory 1, Fault in stored memory position", + "try learn new position"}, + {0x12, 322, "Memory 2, Fault in stored memory position", + "try learn new position"}, + {0x13, 321, "Memory 3, Fault in stored memory position", + "try learn new position"}, + {0x14, 424, "Control Panel not connected (spurious; ignore)", NULL}, + {0x15, 421, "Fault in control module", NULL}, + {0x16, 422, "Battery Voltage too low", NULL}, + {0x17, 423, "Control Panel button activated too long", NULL}, + {0x18, 411, "Legroom Motor 1 not calibrated", NULL}, + {0x19, 412, "Backrest Motor 2 not calibrated", NULL}, + {0x1A, 413, "Seat Rear Edge Motor 3 not calibrated", NULL}, + {0x1B, 414, "Seat Front Edge Motor 4 not calibrated", NULL}, + {0x1C, 331, "Entry position not stored", NULL}, + {0x1D, 332, "Original position not stored", NULL}, + {0, 0, NULL, NULL} +}; + +/* Rollover Protection System (0x59) */ +static const struct dtc_table_entry dtc_list_rop[] = { + {0x01, 412, "Control Module, Internal Fault", NULL}, + {0x63, 413, "Transit Safety Catch On", NULL}, + {0x65, 427, "ROPS warning Lamp, Faulty Signal", NULL}, + {0x66, 428, "ROPS warning Lamp, Signal too High", NULL}, + {0x67, 429, "Battery Voltage Signal too Low", NULL}, + {0x68, 430, "Solenoids S1, S2, faulty Signal crash bow", NULL}, + {0x69, 431, "Left Solenoid S1, Signal too Low", NULL}, + {0x6A, 432, "Left Solenoid S1, Signal Missing", NULL}, + {0x6B, 433, "Left Solenoid S1, Signal too High", NULL}, + {0x6D, 441, "Right Solenoid S2, Signal too Low", NULL}, + {0x6E, 442, "Right Solenoid S2, Signal Missing", NULL}, + {0x6F, 443, "Right Solenoid S2, Signal too High", NULL}, + {0x71, 451, "Solenoids S1, S2, faulty counter Max No. of triggers Done", NULL}, + {0x78, 452, "Control Module, handling fault during Self Test", NULL}, + {0, 0, NULL, NULL} +}; + +/* Road Traffic Information (0x62) */ +static const struct dtc_table_entry dtc_list_rti[] = { + {0x10, 112, "Control Module, Internal Fault Memory circuits", NULL}, + {0x20, 113, "Control Module, Internal Fault, Internal comms", NULL}, + {0x30, 114, "Control Module, Internal Fault, Display screen comms", NULL}, + {0x40, 121, "CD-ROM player, temperature too high", NULL}, + {0x41, 122, "CD-ROM player, Internal Fault", NULL}, + {0x42, 123, "CD-ROM player, Fault in player circuits", NULL}, + {0x43, 125, "CD-ROM player, Fault in player circuits", NULL}, + {0x44, 124, "CD-ROM player, Fault in comms signal", NULL}, + {0x50, 115, "Control Module, Internal Fault, Internal Comms", NULL}, + {0x60, 131, "TMC receiver, faulty signal", NULL}, + {0x70, 141, "TMC/FM receiver, faulty signal", NULL}, + {0, 0, NULL, NULL} +}; + +/* Airbags and seatbelt tensioners (0x58) */ +static const struct dtc_table_entry dtc_list_srs[] = { + {0x01, 112, "Crash Sensor Module internal fault", NULL}, + {0x02, 211, "Driver Airbag short circuit", NULL}, + {0x03, 212, "Driver Airbag open circuit", NULL}, + {0x04, 213, "Driver Airbag short to ground", NULL}, + {0x05, 214, "Driver Airbag short to supply", NULL}, + {0x06, 221, "Passenger Airbag short circuit", NULL}, + {0x07, 222, "Passenger Airbag open circuit", NULL}, + {0x08, 223, "Passenger Airbag short to ground", NULL}, + {0x09, 224, "Passenger Airbag short to supply", NULL}, + {0x0A, 231, "Left Seat Belt Tensioner short circuit", NULL}, + {0x0B, 232, "Left Seat Belt Tensioner open circuit", NULL}, + {0x0C, 233, "Left Seat Belt Tensioner short circuit to ground", NULL}, + {0x0D, 234, "Left Seat Belt Tensioner short circuit to supply", NULL}, + {0x0E, 241, "Right Seat Belt Tensioner short circuit", NULL}, + {0x0F, 242, "Right Seat Belt Tensioner open circuit", NULL}, + {0x10, 243, "Right Seat Belt Tensioner short circuit to ground", NULL}, + {0x11, 244, "Right Seat Belt Tensioner short circuit to supply", NULL}, + {0x52, 127, "SRS Warning Light short circuit to ground or open circuit", NULL}, + {0x53, 128, "SRS Warning Light short circuit to supply", NULL}, + {0x65, 127, "SRS Warning Light short circuit to ground or open circuit", NULL}, + {0x66, 128, "SRS Warning Light short circuit to supply", NULL}, + {0x67, 129, "Battery Voltage signal too low", NULL}, + {0x68, 213, "Driver airbag short to ground", NULL}, + {0x69, 214, "Driver Airbag short to supply", NULL}, + {0x6A, 233, "Left Seat Belt Tensioner short circuit to ground", NULL}, + {0x6B, 234, "Left Seat Belt Tensioner short circuit to supply", NULL}, + {0x6C, 243, "Right Seat Belt Tensioner short circuit to ground", NULL}, + {0x6D, 244, "Right Seat Belt Tensioner short circuit to supply", NULL}, + {0x6E, 223, "Passenger Airbag short circuit to ground", NULL}, + {0x6F, 224, "Passenger Airbag short circuit to supply", NULL}, + {0x70, 313, "Left Rear Seat Belt Tensioner signal too low", NULL}, + {0x71, 314, "Left Rear Seat Belt Tensioner signal too high", NULL}, + {0x72, 323, "Right Rear Seat Belt Tensioner signal too low", NULL}, + {0x73, 324, "Right Rear Seat Belt Tensioner signal too high", NULL}, + {0x78, 211, "Driver Airbag short circuit", NULL}, + {0x79, 212, "Driver Airbag open circuit", NULL}, + {0x7A, 231, "Left Seat Belt Tensioner short circuit", NULL}, + {0x7B, 232, "Left Seat Belt Tensioner open circuit", NULL}, + {0x7C, 241, "Right Seat Belt Tensioner short circuit", NULL}, + {0x7D, 242, "Right Seat Belt Tensioner open circuit", NULL}, + {0x7E, 221, "Passenger Airbag short circuit", NULL}, + {0x7F, 222, "Passenger Airbag open circuit", NULL}, + {0x80, 311, "Left Rear Seat Belt Tensioner short circuit", NULL}, + {0x81, 312, "Left Rear Seat Belt Tensioner open circuit", NULL}, + {0x82, 321, "Right Rear Seat Belt Tensioner short circuit", NULL}, + {0x83, 322, "Right Rear Seat Belt Tensioner open circuit", NULL}, + {0x88, 210, "Not programmed for Driver Airbag, but airbag detected", NULL}, + {0x89, 230, "Not programmed for Left Seat Belt Tensioner, but tensioner detected", NULL}, + {0x8A, 240, "Not programmed for Right Seat Belt Tensioner, but tensioner detected", NULL}, + {0x8B, 220, "Not programmed for Passenger Airbag, but airbag detected", NULL}, + {0x8C, 310, "Unexpected Left Seat Belt Tensioner configuration", NULL}, + {0x8D, 320, "Unexpected Right Seat Belt Tensioner configuration", NULL}, + {0xC7, 114, "Three collisions registered", NULL}, + {0, 0, NULL, NULL} +}; + +/* MY99 and MY00 SRS modules are said to use two-byte DTCs. The applicable + modules are likely to be P/N 9472727 and 8622314, made by TEMIC. */ +#if 0 +/* We currently can't handle two-byte DTCs. */ +static const struct dtc_table_entry dtc_list_srs_temic[] = { + {0x0001, 112, "Crash Sensor Module internal fault", NULL}, + {0x0065, 127, "SRS Warning Light short circuit to ground or open circuit", NULL}, + {0x0066, 128, "SRS Warning Light short circuit to supply", NULL}, + {0x0067, 129, "Battery Voltage signal too low", NULL}, + {0x0068, 213, "Drivers airbag short circuit to ground", NULL}, + {0x0069, 214, "Driver Airbag short circuit to supply", NULL}, + {0x006A, 233, "Left Seat Belt Tensioner short circuit to ground", NULL}, + {0x006B, 234, "Left Seat Belt Tensioner short circuit to supply", NULL}, + {0x006C, 243, "Right Seat Belt Tensioner short circuit to ground", NULL}, + {0x006D, 244, "Right Seat Belt Tensioner short circuit to supply", NULL}, + {0x006E, 223, "Passenger Airbag short circuit to ground", NULL}, + {0x006F, 224, "Passenger Airbag short circuit to supply", NULL}, + {0x0070, 313, "Left Rear Seat Belt Tensioner signal too low", NULL}, + {0x0071, 314, "Left Rear Seat Belt Tensioner signal too high", NULL}, + {0x0072, 323, "Right Rear Seat Belt Tensioner signal too low", NULL}, + {0x0073, 324, "Right Rear Seat Belt Tensioner signal too high", NULL}, + {0x0074, 413, "SIPS-bag, left - Signal too low", NULL}, + {0x0075, 414, "SIPS-bag, left - Signal too high", NULL}, + {0x0076, 423, "SIPS-bag, right - Signal too low", NULL}, + {0x0077, 424, "SIPS-bag, right - Signal too high", NULL}, + {0x0078, 211, "Driver Airbag signal faulty", NULL}, + {0x0079, 212, "Drivers airbag open circuit", NULL}, + {0x007A, 231, "Left Seat Belt Tensioner short circuit", NULL}, + {0x007B, 232, "Left Seat Belt Tensioner open circuit", NULL}, + {0x007C, 241, "Right Seat Belt Tensioner short circuit", NULL}, + {0x007D, 242, "Right Seat Belt Tensioner open circuit", NULL}, + {0x007E, 221, "Passenger Airbag short circuit", NULL}, + {0x007F, 222, "Passenger Airbag open circuit", NULL}, + {0x0080, 311, "Left Rear Seat Belt Tensioner signal faulty", NULL}, + {0x0081, 312, "Left Rear Seat Belt Tensioner signal missing", NULL}, + {0x0082, 321, "Right Rear Seat Belt Tensioner signal faulty", NULL}, + {0x0083, 322, "Right Rear Seat Belt Tensioner signal missing", NULL}, + {0x0084, 411, "SIPS-bag, left - Faulty signal", NULL}, + {0x0085, 412, "SIPS-bag, left - Signal missing or faulty", NULL}, + {0x0086, 421, "SIPS-bag, right - Faulty signal", NULL}, + {0x0087, 422, "SIPS-bag, right - Signal missing or faulty", NULL}, + {0x0088, 210, "Driver Airbag fault", NULL}, + {0x0089, 230, "Left Seat Belt Tensioner fault", NULL}, + {0x008A, 240, "Right Seat Belt Tensioner fault", NULL}, + {0x008B, 220, "Passenger Airbag fault", NULL}, + {0x008C, 310, "Left Rear Seat Belt Tensioner fault", NULL}, + {0x008D, 320, "Right Rear Seat Belt Tensioner fault", NULL}, + {0x008E, 410, "SIPS-bag, left - Faulty signal", NULL}, + {0x008F, 420, "SIPS-bag, right - Faulty signal", NULL}, + {0x0090, 512, "Belt buckle, driver - faulty signal", NULL}, + {0x0091, 513, "Belt buckle, driver - faulty signal", NULL}, + {0x0092, 514, "Belt buckle, driver - Signal too high", NULL}, + {0x0093, 522, "Belt buckle, passenger - faulty signal", NULL}, + {0x0094, 523, "Belt buckle, passenger - faulty signal", NULL}, + {0x0095, 524, "Belt buckle, passenger - Signal too high", NULL}, + {0x0096, 510, "Belt buckle, driver - faulty signal", NULL}, + {0x0097, 520, "Belt buckle, passenger - faulty signal", NULL}, + {0x00A0, 605, "Side impact sensor, left - faulty signal", NULL}, + {0x00A1, 606, "Side impact sensor, left - signal missing", NULL}, + {0x00A2, 615, "Side impact sensor, right - faulty signal", NULL}, + {0x00A3, 616, "Side impact sensor, right - signal missing", NULL}, + {0x00A4, 610, "Side impact sensor, left - faulty signal", NULL}, + {0x00A5, 620, "Side impact sensor, right - faulty signal", NULL}, + {0x00B0, 731, "Switch, passenger airbag - faulty signal", NULL}, + {0x00B1, 732, "Switch, passenger airbag - signal missing or faulty", NULL}, + {0x00B2, 733, "Switch, passenger airbag - signal too low", NULL}, + {0x00B3, 730, "Switch, passenger airbag - system configuration", NULL}, + {0x00B9, 530, "Belt reminder - Signal too high", NULL}, + {0x00C5, 804, "Crash sensor - credibility test", NULL}, + {0x00C6, 800, "Hydraulic/mechanical fault - system configuration", NULL}, + {0x00C7, 114, "Control unit - too many collisions registered", NULL}, + {0, 0, NULL, NULL} +}; +#endif + +/* Alarm (0x2d) */ +static const struct dtc_table_entry dtc_list_vgla[] = { + {0x41, 114, "Control Module, Fault in EEPROM", NULL}, + {0x42, 512, "Drivers Door Lock Switch, Unlocking Signal too Low / Short to Ground", NULL}, + {0x43, 521, "Drivers Central Locking Switch, Signal too Low / Short to Ground", NULL}, + {0x49, 511, "Drivers Door Lock Switch, Locking Signal too Low / Short to Ground", NULL}, + {0x4A, 311, "Siren, Faulty Signal", NULL}, + {0x4C, 312, "Siren, Internal Battery Fault", NULL}, + {0x4D, 321, "Siren, Fault In the Power Supply", NULL}, + {0x4F, 415, "Left ultrasonic sensor, Signal Faulty", NULL}, + {0x51, 416, "Left ultrasonic sensor, internal Fault", NULL}, + {0x52, 531, "Courtesy Lighting, Signal too Low / Short to Ground", NULL}, + {0x54, 421, "Glass breakage Sensor, Signal Faulty, to control module", NULL}, + {0x55, 422, "Glass breakage Sensor, Signal Faulty, microphone circuit", NULL}, + {0x56, 451, "Movement Sensor, Faulty Signal", NULL}, + {0x57, 413, "Right ultrasonic sensor, Signal Faulty", NULL}, + {0x58, 414, "Right ultrasonic sensor, internal Fault", NULL}, + {0x59, 432, "Tilt sensor, Internal fault", NULL}, + {0x60, 456, "SRS signal, Signal too Low / Short to Ground", NULL}, + {0x61, 452, "ECC afterblow, Signal too High", NULL}, + {0x62, 610, "Speed Signal Faulty", NULL}, + {0x63, 441, "Resistive wire, Signal too High", NULL}, + {0x64, 541, "Ignition Switch, Signal too Low", NULL}, + {0x65, 431, "Tilt sensor, Signal too Low", NULL}, + {0x66, 454, "Immobilizer, Signal too Low", NULL}, + {0x67, 525, "Central Locking switch Passenger Door, Signal too Low", NULL}, + {0x69, 522, "Internal Tailgate/Trunk Control Switch, Signal too Low", NULL}, + {0x6A, 523, "External Tailgate/Trunk Lock Switch, Signal too Low", NULL}, + {0x6C, 524, "Fuel Filler Lock Switch, Signal too Low", NULL}, + {0x6D, 113, "Control Module, Control Module Not Programmed", NULL}, + {0x6E, 455, "Immobilizer, VGLA code Signal Faulty", NULL}, + {0, 0, NULL, NULL} }; const struct ecu_dtc_table_map_entry ecu_dtc_map[] = { - {0x6e, aw50_dtc}, - {0x10, m44_old_dtc}, - {0x7a, m44_dtc}, + {0x01, dtc_list_abs}, + {0x02, dtc_list_dsa}, + {0x10, dtc_list_m44old}, + {0x11, dtc_list_msa}, + {0x18, dtc_list_add}, + {0x29, dtc_list_ecc}, + {0x2d, dtc_list_vgla}, + {0x2e, dtc_list_ps}, + {0x2f, dtc_list_ps}, + {0x41, dtc_list_immo}, + {0x42, dtc_list_ccu}, + {0x51, dtc_list_combi}, + {0x58, dtc_list_srs}, + {0x59, dtc_list_rop}, + {0x62, dtc_list_rti}, + {0x6e, dtc_list_aw50}, + /* To handle EMS2000 and Denso, we'll have to use a smarter method to + identify the ECU. But for now, just assume that 0x10 and 0x7A are + always Motronic M4.4 */ + {0x7a, dtc_list_m44}, {0, NULL}, }; - diff --git a/scantool/scantool_850/dtc.h b/scantool/scantool_850/dtc.h index 1837ad4..41f6949 100644 --- a/scantool/scantool_850/dtc.h +++ b/scantool/scantool_850/dtc.h @@ -5,7 +5,7 @@ struct dtc_table_entry { uint8_t raw_value; - uint16_t dtc_suffix; + int16_t dtc_suffix; const char *desc; const char *tips; }; diff --git a/scantool/scantool_850/makedtc.sh b/scantool/scantool_850/makedtc.sh new file mode 100644 index 0000000..0de7950 --- /dev/null +++ b/scantool/scantool_850/makedtc.sh @@ -0,0 +1,66 @@ +#!/bin/sh + +# An equivalent to this script was used to massage and merge the available +# DTC lists into a starting point for dtc.c. + +# Make a copy of Aleksi's table +cp DTC_List_850OBDII_D2.txt dtc.txt +# split lines that have two dtc.contains predicates +sed -i 's/^\(.*)\) *||* *\(dtc[^)]*\))\(.*\)/\1\3\nif (\2)\3/' dtc.txt +# EFI-742 has three of them, so do it again +sed -i 's/^\(.*)\) *||* *\(dtc[^)]*\))\(.*\)/\1\3\nif (\2)\3/' dtc.txt +# where dtc.contains line has an (a), (b), etc suffix, fold that into the string name +sed -i 's/\(-...\).*(\(.\))/\1\2/' dtc.txt +# adjust the string names for the multiple ecus with address 7A +sed -i '/EMS2000/,/####/s/EFI-/V_EFI-/' dtc.txt +sed -i '/M4.4/,/####/s/\(EFI-[0-9a-z]*\)/\1_7A/' dtc.txt +# based on the dtc.contains lines, create a space-delimited file mapping ecu name / dtc number to string name +# CCU and Denso don't have dtc.contains lines, so those are omitted from dtcx.txt and will be added to dtcy.txt separately +sed -n '/^01 - ABS/,/####/{/if/{s,.*("\([^"]*\).*//\([^-]*\)-\([0-9A-Za-z_]*\).*,abs \1 \2\3,;p}}' dtc.txt > dtcx.txt +sed -n '/^02 - DSA/,/####/{/if/{s,.*("\([^"]*\).*//\([^-]*\)-\([0-9A-Za-z_]*\).*,dsa \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^11 - MSA/,/####/{/if/{s,.*("\([^"]*\).*//\([^-]*\)-\([0-9A-Za-z_]*\).*,msa \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^18 - Add/,/####/{/if/{s,.*("\([^"]*\).*//\([^-]*\)-\([0-9A-Za-z_]*\).*,add \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^29 - ECC/,/####/{/if/{s,.*("\([^"]*\).*//\([^-]*\)-\([0-9A-Za-z_]*\).*,ecc \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^2D - VGLA/,/####/{/if/{s,.*("\([^"]*\).*//\([^-]*\)-\([0-9A-Za-z_]*\).*,vgla \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^2. - PS/,/####/{/if/{s,.*("\([^"]*\).*//\([^-]*\)-\([0-9A-Za-z_]*\).*,ps \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^41 - IMMO/,/####/{/if/{s,.*("\([^"]*\).*//\([^-]*\)-\([0-9A-Za-z_]*\).*,immo \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^51 - COMBI/,/####/{/if/{s,.*("\([^"]*\).*// *\([^-]*\)-\([0-9A-Za-z_]*\).*,combi \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^SRS.*96/,/^SRS.*99/{/if/{s,.*("\([^"]*\).*// *\([^-]*\)-\([0-9A-Za-z_]*\).*,srs \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^SRS.*99/,/####/{/if/{s,.*("\([^"]*\).*// *\([^-]*\)-\([0-9A-Za-z_]*\).*,srs_temic \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^ROP/,/####/{/if/{s,.*("\([^"]*\).*// *\([^-]*\)-\([0-9A-Za-z_]*\).*,rop \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^62 - RTI/,/####/{/if/{s,.*("\([^"]*\).*// *\([^-]*\)-\([0-9A-Za-z_]*\).*,rti \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^6E - Auto/,/####/{/if/{s,.*("\([^"]*\).*// *\([^-]*\)-\([0-9A-Za-z_]*\).*,aw50 \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^7A - EMS/,/####/{/if/{s,.*("\([^"]*\).*// *\([^-]*\)-\([0-9A-Za-z_]*\).*,ems2k \1 \2\3,;p}}' dtc.txt >> dtcx.txt +sed -n '/^7A - Mot/,/####/{/if/{s,.*("\([^"]*\).*// *\([^-]*\)-\([0-9A-Za-z_]*\).*,m44 \1 \2\3,;p}}' dtc.txt >> dtcx.txt +# look up the strings from dtcx.txt and generate dtcy.txt with the string names replaced by string text +(while read table value string; do printf %s "$table $value "; sed -n "//{s,.*\">\\(.*\\) dtcy.txt +# add the CCU and Denso dtcs +sed -n '/^42 - CCU/,/^51 - COMBI/{/CCU-/{s/^\(..\).*\(CCU-.*\)/ccu \1 \2/; s/\.$//; p}}' dtc.txt >> dtcy.txt +sed -n '/B5244S2/,${/ECM-/{s/^ECM-\(....\),* \(.*\)/denso \1 ECM-\1 \2/;p}}' dtc.txt >> dtcy.txt +# Make a copy of Richard's table +cp export_2024-04-06_frobbed.txt dtc2.txt +# replace addresses with symbolic names +sed -i 's/^01/abs/' dtc2.txt +sed -i 's/^11/msa/' dtc2.txt +sed -i 's/^29/ecc/' dtc2.txt +sed -i 's/^2D/vgla/' dtc2.txt +sed -i 's/^2[EF]/ps/' dtc2.txt +sed -i 's/^41/immo/' dtc2.txt +sed -i 's/^51/combi/' dtc2.txt +sed -i 's/^58/srs/' dtc2.txt +sed -i 's/^6E/aw50/' dtc2.txt +sed -i 's/^7A/m44/' dtc2.txt +# remove trailing periods from descriptions, where present +sed -i 's/\.$//' dtc2.txt +# merge Richard's list with Aleksi's, retaining only one copy of duplicated entries +cat dtc2.txt dtcy.txt | sort | uniq > merged.txt +# make a list with the tips removed +sed 's/\\n.*//; s/\[[^]]*]//g; s/([^)]*)//g; s/ */ /g; s/ $//' merged.txt | uniq > notips.txt +# make a list with only the tips +sed -n '/\\n/{s/^\([^ ]* [^ ]* [^ ]* \)[^\\]*\\n\(.*\)/\1\2/;p }' < merged.txt > tips.txt +sed 's/\\n.*//' merged.txt | ruby -ne 'p=$_[/^[^ ]+ [^ ]+ [^ ]+ /]; $_.scan(/\[([^\]]*)\]/).each {|x| puts p+x[0]}' >> tips.txt +sed 's/\\n.*//; s/\[[^]]*]//g;' merged.txt | ruby -ne 'p=$_[/^[^ ]+ [^ ]+ [^ ]+ /]; $_.scan(/\(([^)]*)\)/).each {|x| puts p+x[0]}' >> tips.txt +# eliminate extra copies of duplicated tips +sort tips.txt | uniq > tipsuniq.txt +# convert the no-tips list to C source code +ruby -ne 'BEGIN{lastecu="";firstecu=true;};END{puts "\t{0, 0, NULL, NULL}\n};"};(ecu,hex,str,desc)=$_.chomp.split(" ",4);suf=str[/[-A-Z]+(.*)/,1];print "\t{0, 0, NULL, NULL}\n};\n\n" if !firstecu && ecu!=lastecu;firstecu=false;puts "static const struct dtc_table_entry dtc_list_#{ecu}[] = {" if ecu!=lastecu;lastecu=ecu;puts "\t{0x#{hex}, #{suf}, \"#{desc}\", NULL},"' notips.txt > foo.c diff --git a/tests/l7_850_01.db b/tests/l7_850_01.db index eb62246..c213184 100644 --- a/tests/l7_850_01.db +++ b/tests/l7_850_01.db @@ -51,11 +51,42 @@ RQ 0x83 0x6E 0x13 0xAE 0x01 # routineNotCompleteOrServiceInProgress before final response. Actual TCM does # this for clearing DTCs but not for retrieving them. RP 0x84 0x13 0x6E 0x7E 0xAE 0x23 cks1 -# One DTC: AT-124 (39) Mode Selector Switch -RP 0x84 0x13 0x6E 0xEE 0x01 0x39 cks1 +# Three DTCs: AT-122 (02) Shift Solenoid S1 circuit open, AT-??? (48), +# and invalid DTC 0xFF +RP 0x84 0x13 0x6E 0xEE 0x01 0x02 0x48 0xFF cks1 # Clear DTCs RQ 0x83 0x6E 0x13 0xAF 0x01 # routineNotCompleteOrServiceInProgress, then success RP 0x84 0x13 0x6E 0x7E 0xAF 0x23 cks1 RP 0x83 0x13 0x6E 0xEF 0x01 cks1 + +#### Immobilizer #### + +# TesterPresent +RQ 0x82 0x41 0x13 0xA1 +RP 0x82 0x13 0x41 0xE1 cks1 + +# StopDiagnosticSession +RQ 0x82 0x41 0x13 0xA0 +RP 0x82 0x13 0x41 0xE0 cks1 + +# Retrieve DTCs +RQ 0x83 0x41 0x13 0xAE 0x01 +# One DTC: IMM-??? (03) No Contact with Antenna +RP 0x84 0x13 0x41 0xEE 0x01 0x03 cks1 + +#### Non-existent address 0x20 #### + +# TesterPresent +RQ 0x82 0x20 0x13 0xA1 +RP 0x82 0x13 0x20 0xE1 cks1 + +# StopDiagnosticSession +RQ 0x82 0x20 0x13 0xA0 +RP 0x82 0x13 0x20 0xE0 cks1 + +# Retrieve DTCs +RQ 0x83 0x20 0x13 0xAE 0x01 +# One DTC: 0x01 +RP 0x84 0x13 0x20 0xEE 0x01 0x01 cks1 diff --git a/tests/l7_850_01.ini b/tests/l7_850_01.ini index 129a595..f32c84f 100644 --- a/tests/l7_850_01.ini +++ b/tests/l7_850_01.ini @@ -11,4 +11,10 @@ disconnect connect aw50 dtc disconnect +connect immo +dtc +disconnect +connect 0x20 +dtc +disconnect quit \ No newline at end of file diff --git a/tests/l7_850_01.stdo_p b/tests/l7_850_01.stdo_p index 58bb3a0..5509426 100644 --- a/tests/l7_850_01.stdo_p +++ b/tests/l7_850_01.stdo_p @@ -1 +1,3 @@ -Pong.*03: A9 A9.*11\.9.*P1234.*ABC.*4321.*XYZ.*No stored DTC.*Stored DTC \ No newline at end of file +Pong.*03: A9 A9.*11\.9.*P1234.*ABC.*4321.*XYZ.*No stored DTC.*Stored DTC.*AT-122 \(02\) Shift Solenoid S1.*AT-\?\?\? \(FF\) +Warning.*IMM-\?\?\? \(03\) No Contact.*\?\?\?-\?\?\? \(01\) +Disco \ No newline at end of file