Skip to main content
The I-Bus API provides functions for communicating with BMW vehicle modules over the I-Bus protocol.

Data structures

IBus_t

Main I-Bus context structure that manages communication state.
uart
UART_t
UART communication interface
rxBuffer
uint8_t[255]
Receive buffer for incoming I-Bus messages
txBuffer
uint8_t[24][47]
Transmit buffer queue for outgoing messages
ignitionStatus
uint8_t
Current ignition status (KLR, KL15, KL50, etc.)
vehicleType
uint8_t
Detected vehicle type (E38/E39/E52/E53, E46, E8X, R50)
gtVersion
uint8_t
Graphics driver version (MKI, MKII, MKIII, MKIV)
moduleStatus
IBusModuleStatus_t
Bitfield tracking which modules are present on the bus
ambientTemperature
signed char
Ambient temperature in Celsius
coolantTemperature
uint8_t
Engine coolant temperature
oilTemperature
uint8_t
Engine oil temperature
gearPosition
uint8_t
Current gear position
vehicleRange
uint16_t
Remaining vehicle range in km

IBusModuleStatus_t

Tracks which modules are present on the I-Bus based on observed traffic.
BMBT
uint8_t (1 bit)
Board Monitor (on-board monitor)
DSP
uint8_t (1 bit)
Digital Sound Processor
GT
uint8_t (1 bit)
Graphics driver (navigation system)
IKE
uint8_t (1 bit)
Instrument cluster electronics
LCM
uint8_t (1 bit)
Light control module
MID
uint8_t (1 bit)
Multi-info display
NAV
uint8_t (1 bit)
Navigation module
RAD
uint8_t (1 bit)
Radio module
PDC
uint8_t (1 bit)
Park distance control
GM
uint8_t (1 bit)
General module (body control)

IBusDateTime_t

Date and time structure for OBC and GPS timestamps.
year
uint16_t
Year
month
uint8_t
Month (1-12)
day
uint8_t
Day of month (1-31)
hour
uint8_t
Hour (0-23)
min
uint8_t
Minute (0-59)
sec
uint8_t
Second (0-59)

Core functions

IBusInit

IBus_t IBusInit();
Initializes the I-Bus context and UART communication.
Returns
IBus_t
Initialized I-Bus context structure

IBusProcess

void IBusProcess(IBus_t *ibus);
Processes incoming I-Bus messages and manages transmit queue. Should be called regularly in the main loop.
ibus
IBus_t *
required
Pointer to I-Bus context

IBusSendCommand

void IBusSendCommand(
    IBus_t *ibus,
    const uint8_t src,
    const uint8_t dst,
    const uint8_t *data,
    const size_t dataLength
);
Sends a command on the I-Bus.
ibus
IBus_t *
required
Pointer to I-Bus context
src
uint8_t
required
Source device address (e.g., IBUS_DEVICE_CDC)
dst
uint8_t
required
Destination device address (e.g., IBUS_DEVICE_RAD)
data
const uint8_t *
required
Pointer to data buffer
dataLength
size_t
required
Length of data in bytes

Display functions

IBusCommandGTWriteIndex

void IBusCommandGTWriteIndex(IBus_t *ibus, uint8_t index, char *text);
Writes text to a specific menu index on the navigation display.
ibus
IBus_t *
required
Pointer to I-Bus context
index
uint8_t
required
Menu index (0-7)
text
char *
required
Text to display (max 14 characters for MKIII)

IBusCommandGTWriteIndexTitle

void IBusCommandGTWriteIndexTitle(IBus_t *ibus, char *text);
Writes title text for index menu on navigation display.
ibus
IBus_t *
required
Pointer to I-Bus context
text
char *
required
Title text (max 16 characters for MKIII)

IBusCommandGTWriteZone

void IBusCommandGTWriteZone(IBus_t *ibus, uint8_t zone, char *text);
Writes text to a specific zone on the navigation display.
ibus
IBus_t *
required
Pointer to I-Bus context
zone
uint8_t
required
Display zone identifier
text
char *
required
Text to display

IBusCommandMIDDisplayText

void IBusCommandMIDDisplayText(IBus_t *ibus, char *text);
Displays text on the Multi-Info Display (MID).
ibus
IBus_t *
required
Pointer to I-Bus context
text
char *
required
Text to display (max 24 characters)

IBusCommandIKEOBCControl

void IBusCommandIKEOBCControl(IBus_t *ibus, uint8_t property, uint8_t value);
Sends a control command to the instrument cluster’s on-board computer.
ibus
IBus_t *
required
Pointer to I-Bus context
property
uint8_t
required
Property to control (time, date, temperature, etc.)
value
uint8_t
required
Value to set

CDC (CD changer) functions

IBusCommandCDCAnnounce

void IBusCommandCDCAnnounce(IBus_t *ibus);
Announces the CD changer presence on the I-Bus. BlueBus uses the CDC address (0x18).
ibus
IBus_t *
required
Pointer to I-Bus context

IBusCommandCDCStatus

void IBusCommandCDCStatus(
    IBus_t *ibus,
    uint8_t status,
    uint8_t function,
    uint8_t disc,
    uint8_t track
);
Sends CD changer status update to the radio.
ibus
IBus_t *
required
Pointer to I-Bus context
status
uint8_t
required
Playback status (stop, pause, playing, fast forward, fast reverse)
function
uint8_t
required
Current function mode (playing, scan, random)
disc
uint8_t
required
Current disc number (1-6)
track
uint8_t
required
Current track number

Vehicle status functions

IBusCommandIKEGetIgnitionStatus

void IBusCommandIKEGetIgnitionStatus(IBus_t *ibus);
Requests the current ignition status from the instrument cluster.
ibus
IBus_t *
required
Pointer to I-Bus context

IBusCommandIKEGetVehicleConfig

void IBusCommandIKEGetVehicleConfig(IBus_t *ibus);
Requests vehicle configuration from the instrument cluster.
ibus
IBus_t *
required
Pointer to I-Bus context

IBusCommandLMGetRedundantData

void IBusCommandLMGetRedundantData(IBus_t *ibus);
Requests redundant data from the light control module (dimmer, photo sensor values).
ibus
IBus_t *
required
Pointer to I-Bus context

Utility functions

IBusGetNavType

uint8_t IBusGetNavType(uint8_t *message);
Extracts navigation system type from diagnostic identity response.
message
uint8_t *
required
I-Bus diagnostic response message
Returns
uint8_t
Navigation type: IBUS_GT_MKI, IBUS_GT_MKII, IBUS_GT_MKIII, IBUS_GT_MKIV, etc.

IBusGetVehicleType

uint8_t IBusGetVehicleType(uint8_t *message);
Extracts vehicle type from IKE vehicle configuration response.
message
uint8_t *
required
IKE vehicle config response message
Returns
uint8_t
Vehicle type: IBUS_VEHICLE_TYPE_E38_E39_E52_E53, IBUS_VEHICLE_TYPE_E46, etc.

IBusGetDateTimeAsEpoch

uint32_t IBusGetDateTimeAsEpoch(IBusDateTime_t *dateTime);
Converts IBusDateTime_t to Unix epoch timestamp.
dateTime
IBusDateTime_t *
required
Date and time structure
Returns
uint32_t
Unix epoch timestamp (seconds since Jan 1, 1970)

IBusGetEpochAsDateTime

IBusDateTime_t IBusGetEpochAsDateTime(uint32_t epoch);
Converts Unix epoch timestamp to IBusDateTime_t.
epoch
uint32_t
required
Unix epoch timestamp
Returns
IBusDateTime_t
Converted date and time structure

Device addresses

Common I-Bus device addresses used in commands:
  • IBUS_DEVICE_GM (0x00) - Body module
  • IBUS_DEVICE_CDC (0x18) - CD changer
  • IBUS_DEVICE_GT (0x3B) - Graphics driver (navigation)
  • IBUS_DEVICE_DIA (0x3F) - Diagnostic
  • IBUS_DEVICE_MFL (0x50) - Multi-function steering wheel
  • IBUS_DEVICE_RAD (0x68) - Radio
  • IBUS_DEVICE_DSP (0x6A) - DSP
  • IBUS_DEVICE_IKE (0x80) - Instrument cluster electronics
  • IBUS_DEVICE_GLO (0xBF) - Global broadcast
  • IBUS_DEVICE_MID (0xC0) - Multi-info display
  • IBUS_DEVICE_LCM (0xD0) - Light control module
  • IBUS_DEVICE_BMBT (0xF0) - On-board monitor
  • IBUS_DEVICE_BLUEBUS - Alias for CDC (0x18)

Build docs developers (and LLMs) love