GM ALDL Protocol
Assembly Line Diagnostic Link — GM proprietary pre-OBD-II diagnostic system with deep protocol-level technical details.
What is ALDL?
ALDL (Assembly Line Diagnostic Link, also ALCL — Assembly Line Communications Link) is GM's proprietary on-board diagnostics system. Originally designed for factory assembly line testing, it uses a custom serial protocol that varies between ECU models — each ECU/memcal combination produces a different data stream format.
160 Baud ALDL — Signal-Level Protocol
The 160 baud stream is NOT standard RS-232. It uses a proprietary pulse-width encoding where each bit is represented by voltage transitions within a fixed 6.25 ms bit time. The data line idles HIGH (0V or 5V/12V depending on ECU).
Bit Timing (per bit = 6.25 ms)
Phase Time Description ────────────────────────────────────────────────── T0 → T1 0.5 ms Start delay (rising edge) T1 → T3 4.75 ms Data valid window Logic 1: Line stays HIGH (no transition) Logic 0: Line driven LOW then back HIGH T3 → T4 1.0 ms Stop time (line driven low) ────────────────────────────────────────────────── T0 → T4 6.25 ms Total bit time (160 baud) Sample point: Between T1-T3 (1.5-2.3 ms into bit)
Key difference from RS-232: In standard serial, a logic 1 is represented by voltage level. In ALDL 160 baud, a logic 1 means NO transition occurs (line stays high), while a logic 0 means the line transitions low then back high within the bit time. This is why you cannot connect ALDL directly to a UART — the encoding is incompatible.
Data Byte Format
Each byte = 9 bits total: ┌─────┬────┬────┬────┬────┬────┬────┬────┬────┐ │ P │ b7 │ b6 │ b5 │ b4 │ b3 │ b2 │ b1 │ b0 │ │start│ MSB LSB │stop│ └─────┴────────────────────────────────────┘ P = Start bit (always 0 — line transitions low) Byte time = 9 × 6.25ms = 56.25 ms Transmission order: MSB first
Frame Structure
Frame = SYNC character + 20-25 data bytes SYNC = 0xFF (11111111) — 9 consecutive logic-1 bits This unique pattern cannot occur in normal data because start bits are always 0. Frame timing (20-byte example): 21 bytes × 9 bits × 6.25 ms = 1,181 ms + inter-frame delay ≈ 1.25 seconds total refresh Data content varies by ECU/memcal — GM has NO standard frame format. Each ECM defines its own byte assignments.
Voltage Levels
ECU Type Idle Voltage Low Voltage Notes
──────────────────────────────────────────────────────
12V systems +12V (battery) 0V Early VN/VP Commodore
(CEL = 12V) CEL OFF when CEL ON when
line is HIGH line is LOW
5V systems +5V (TTL) 0V US models 1987+
(CEL separate) CEL on CEL on
separate pin separate pin160 Baud Data Definitions (1986 VN Commodore)
Byte Name Description Scaling ────────────────────────────────────────────────────────── 1 MW2 Mode Word 2 Bitfield 2 PROMIDA PROM ID (MSB) Raw 3 PROMIDB PROM ID (LSB) Raw 4 ISSPMP IAC motor position Raw 5 COOLDEGA Coolant temperature °C = (n×0.75) − 40 6 FILTMPH Vehicle speed MPH 7 AD-MAP MAP sensor voltage 0-255 = 0-5.00V 8 NTRPMX Engine RPM RPM = n × 25 9 ADTHROT TPS voltage 0-255 = 0-5.00V 10 INJFLOW Injector flow rate 100 = 8.3 g/h 11 MAT Manifold air temp °C = (n×0.75) − 40 12 MALFFLG1 Malfunction flag word 1 Bitfield 13 MALFFLG2 Malfunction flag word 2 Bitfield 14 MALFFLG3 Malfunction flag word 3 Bitfield 15 BLM Block Learn Multiplier Fuel trim 16 ADO2AF Oxygen sensor voltage 0-255 = 0-5.00V 17 MCUINST MCU input status Bitfield 18 ADBAT Battery voltage Volts × 10 19 INTEGR Integrator Fuel integrator 20 OUTPUT Output word Bitfield
MALFFLG1 Bit Definitions
Bit Code Fault ────────────────────────────── 0 24 Vehicle speed sensor 1 23 MAT sensor low 2 22 Throttle position low 3 21 Throttle position high 4 15 Coolant sensor low temp 5 14 Coolant sensor high temp 6 13 Oxygen sensor 7 12 No reference pulse (not running)
Mode Selection (Resistor-Based)
The ECU reads the resistance between Pin B (diagnostic) and Pin A (ground) to determine which mode to enter. This is measured by the ECU's internal A/D converter.
Resistance Mode ALDL Output ───────────────────────────────────────────────────── > 20KΩ Normal No diagnostic data 10KΩ ALDL mode 160 baud sensor data 3.9KΩ Backup mode Limited data stream ≤ 500Ω Factory test Full diagnostic data PWM vehicles (shorting Pin B to A): 0.5 second time frame, ground time determines mode: 0-35.7 ms Normal 35.8-107.1 ms ALDL Mode 1 107.2-178.6ms ALDL Mode 2 ... up to Mode 6 + Diagnostic Mode
8192 Baud ALDL — Bidirectional Protocol
The 8192 baud system uses standard RS-232-like serial encoding (UART compatible) at 8192 baud. Unlike 160 baud, this is bidirectional — the scan tool can send commands to the ECU. The physical layer uses 5V TTL levels.
8192 Baud Data Stream (1986 TPI 5.0/5.7L)
Byte Name Description Scaling ────────────────────────────────────────────────────────── 1 PROMIDA PROM ID (MSB) Raw 2 PROMID+1 PROM ID (LSB) Raw 3 MALFFLG1 Malfunction word 1 Bitfield 4 MALFFLG2 Malfunction word 2 Bitfield 5 MALFFLG3 Malfunction word 3 Bitfield 6 MALFFLG4 Malfunction word 4 Bitfield 7 MALFFLG5 Malfunction word 5 Bitfield 8 COOLDEGA Coolant temperature °C = (n×0.75)−40 9 COOLTSU Coolant temp at start Same as byte 8 10 ADTHROT TPS (A/D counts) % = n/2.56 11 NTRPMX Engine RPM (MSB) 16-bit word 12 NEWRFPER Ref pulse period (MSB) 16-bit word 13 NEWRFPER+1 Ref pulse period (LSB) 16-bit word 14 FILTMPH Vehicle speed MPH (MSB) 16-bit word 15 FILTMPH+1 Vehicle speed MPH (LSB) MPH + MPH/256 16 ATIO RPM/MPH ratio Raw 17 ADO2AF O2 sensor voltage 0-255 = 0-5V 18 ALDLCNTR Fuel correction 6.25ms units 19 ADMAT Manifold air temp °C = (n×0.75)−40 20 FLTLV8 Calculated load (MSB) 16-bit LV8 21 FLTLV8+1 Calculated load (LSB) LV8 + LV8/256 22 SAP Spark advance (MSB) deg×2.8444 23 SAP+1 Spark advance (LSB) ±32768 range 24 OBINJ Injector pulse width (MSB) 0.0153ms/count 25 OBINJ+1 Injector pulse width (LSB) 0-65536 range 26 FAVAL Fuel/air ratio (MSB) 6553.6/E 27 FAVAL+1 Fuel/air ratio (LSB) E = A/F ratio 28 ACUMFUEL Accumulated fuel (MSB) Running total 29 ACUMFUEL+1 Accumulated fuel (LSB) Running total 30 TIME Engine run time (MSB) Seconds 31 TIME+1 Engine run time (LSB) 0-65536 secs 32 EGRDC EGR duty cycle % 33 PURGDC Purge duty cycle % 34 FANDC Cooling fan duty cycle % 35 ADBAT Battery voltage 0.1V/bit 36 PPSW Fuel pump power status Bitfield 37 DISPFLOW MAF value (MSB) g/sec 38 DISPFLOW+1 MAF value (LSB) g/sec + frac 39 AIRFLOW Unlimited MAF g/sec
Hardware Interfaces
Simple 160 Baud Interface (1 Transistor)
The simplest ALDL reader uses a single PNP transistor (BC557 or 2N2907) as a level converter between ALDL voltage levels and RS-232 CTS input.
Circuit: ALDL Data → PNP Transistor → PC Serial CTS ALDL Pin E (data) ──→ Emitter (PNP transistor) ALDL Pin A (GND) ──→ Collector + LED + R → PC CTS (pin 8) PC DTR (pin 4) ──→ Provides bias voltage PC GND (pin 5) ──→ ALDL Pin A How it works: 1. ALDL HIGH (12V/5V): Transistor OFF → CTS reads LOW (RS232 = 0) 2. ALDL LOW (0V): Transistor ON → CTS reads HIGH (RS232 = 1) 3. Software measures time between CTS transitions to decode bits Software: ALDLLOG.exe (DOS) or WinALDL (Windows) Bit rate: Set serial port to 1600 baud or higher Sample point: Detect transitions, reconstruct 160 baud data
8192 Baud Interface (MAX232)
For bidirectional 8192 baud communication, use a MAX232 level converter IC. This converts 5V TTL to proper RS-232 voltage levels and combines TX/RX data lines through a diode/resistor network.
ALDL Pin E (160 baud) → CTS (PC serial, no switching needed)
ALDL Pin M (8192 baud) → MAX232 T1IN → T1OUT → PC RX
PC TX → MAX232 R1IN → R1OUT → ALDL Pin M
ALDL Pin B (diag) → MAX232 T2IN → T2OUT → ALDL Pin M
(for mode selection via PC)
The MAX232 handles:
- Bidirectional 8192 baud data (TX/RX on same wire)
- Mode selection (pulling Pin B to ground via PC)
- No mechanical switching requiredArduino/ESP32 Interface (Modern)
Arduino ALDL Reader (160 baud): - Connect ALDL Pin E to Arduino digital pin (with voltage divider for 12V) - Connect ALDL Pin A to Arduino GND - Use micros() to measure time between transitions - Decode bit timing: if gap > 4ms = logic 1, else logic 0 - Reconstruct bytes from 9-bit frames (start + 8 data) - Output via Serial to PC Arduino ALDL Reader (8192 baud): - Connect ALDL Pin M to Arduino SoftwareSerial RX - Set baud rate to 8192 (non-standard — SoftwareSerial supports it) - Send commands, receive responses - Parse 64-byte data frames ESP32/Teensy: - Hardware serial at 8192 baud - Bluetooth output for wireless monitoring - Real-time data display on phone app
Common GM ECUs
ECU Model Baud Voltage Vehicles ────────────────────────────────────────────────── 1227040 160 5V TBI trucks (87-91) 1227289 160 5V TBI cars (87-91) 1227727 160 12V TPI Camaro/Firebird 1227808 160 12V VN/VP Commodore (AU) 1227808 8192 5V TPI 5.0/5.7L (86+) 16167197 8192 5V LT1 (93-97) 16197427 8192 5V Vortec trucks (96-97) 12200411 8192 5V Gen III LS1 (97+) All use 12-pin ALDL connector (Delco #12020043) Pin A = GND, Pin B = Diagnostic, Pin E = 160 baud Pin H = +12V ignition, Pin M = 8192 baud (if equipped)
ALDL vs OBD-II
Feature ALDL OBD-II
──────────────────────────────────────────────────
Baud rate 160 / 8192 9600-500000
Encoding Custom pulse-width Standard UART/CAN
Connector 5/6/10/12-pin 16-pin SAE J1962
Protocols GM-proprietary J1850/ISO/CAN
DTCs Flashing CEL Standard P-codes
LiveData ECU-specific PIDs Standard PIDs
Scan tools GM Tech 1/2 only Universal
Direction 160: RX only Bidirectional
8192: Bidirectional
ECU definition Required per ECU Standardized
Connectors vary by model/year Always SAE J1962