Mer/Documentation/BME Protocol

This documentation is entirely for the purpose of implementing software gathering battery information on Nokia Internet Tablets, not alteration of battery management state.

Existing code:

General protocol:

  • UNIX socket connection to /tmp/.bmesrv
  • Client: send('BMentity')
  • Server: send('\n')

After handshake:

typedef struct {
    uint16      type, subtype;
} BMEHeader;

types so far (NAME, (type, subtype)):

Contents

EM_BATTERY_INFO_REQ (0x06, 0x00)

typedef struct {
    BMEHeader header;
    u_int32_t flags;   // Set to 0xFFFFFFFF to get all data
} BME_EM_BATTERY_INFO_Req;

struct emsg_battery_info_reply {
    uint32      a;
    uint32      flags;
    uint16      c;
    uint16      d;
    uint16      temp;   // Battery temperature measured in Kelvin 
    uint16      f;
    uint16      g;
    uint16      h;
    uint16      i;
    uint16      j;
    uint16      k;
    uint16      l;
};

Some BULK0 message (0x42, 0x00)

typedef struct {
    BMEHeader header;
    u_int32_t flags;   // Set to 0xFFFFFFFF to get all data
} BME_EM_BULK_Req;

struct emsg_bme_bulk_reply {
   uint32     unknown1;
   uint32     unknown2;
   uint32     unknown3;
   uint16     sw_status; // Battery monitor SW status
   uint16     instaneous_battery_voltage; // Instantaneous battery voltage (mV)
   uint16      // Remaining standby time to battery low (mins)
   uint16     unknown4;
   uint16     unknown5;
   uint16     unknown6;
   uint16     // Battery monitor check voltage (mV)
   uint16     // Battery low warning interval counter
   uint16     // Double median filtered battery voltage
   uint16     // Initial battery monitor voltage (mV)
   uint16     // Time per battery bar (mins)
   uint16     // DMF voltage sampled at first battery low (mV)
   uint32     // Average phone current (uA)
   uint16     // Most recent battery charge condition (mAh)
   uint16     // Lowest TX-Off voltage (mV)
   uint16     // Lowest TX-On voltage (mV)
   uint16     // Largest TX-Off/On voltage difference (mV)
   uint8      // Battery bar level log mask
   uint8      // Previous battery bar level
   uint8      // Battery low reason
   uint8      // CS state information 
   uint16     // Number of battery bars
   uint16     // Battery type
   uint16     // Temperature, in kelvin
   uint16     // Battery capacity 
   uint16     // Battery impedance (mOhm)
   uint16     // Present value of v_bat_full_level
   uint16     // Present value of v_bat_low_ths_mv
   uint16     unknown7;
   uint16     unknown8;
   uint16     unknown9;
   uint16     // Load current estimated by Batmon4 (uA)
   uint16     unknown10;
};

Some BULK1 message (0x43, 0x00)

typedef struct {
    BMEHeader header;
    u_int32_t flags;   // Set to 0xFFFFFFFF to get all data
} BME_EM_BULK1_Req;

struct emsg_bme_bulk1_reply {
   uint32     unknown1;
   uint32     unknown2;
   uint32     unknown3;
   uint16     // Elapsed model time (min)
   uint16     // Tx-Off battery voltage (mV)
   uint16     // Tx-On battery voltage (mV)
   uint8      // Battery power state
   uint8      //  Batmon4 internal flags2
   uint8      // Batmon4 internal flags3
   uint8      // Charging method
   uint16     // Present Phi value (mV)
   uint16     // Present Delta Phi value (mV)
   uint8      // Charging mode 
   uint8      // Previous charging mode 
   uint8      // Charger type
   uint8      // Previous charger type
   uint16     // Instantaneous battery voltage (mV)
   uint8      // Number of charger checks (0-9) ?
   uint8      // Charger recognition state
   uint16     unknown4;
   uint16     // Instantaneous charger current (mA)
   uint16     unknown5;
   uint16     // Charging time (min)
   uint16     // Average Vchar (mV)
   uint16     // Equivalent DC charger current (mA) 
   uint8      // Battery full flag (0 or 1)
   uint8      // HW Cha PWM value L ??
   uint8      // Cha PWM value L ??
   uint8      unknown6;
   uint16     // Open switch battery voltage (mV)
   uint16     // Closed switch battery voltage (mV)
   uint16     unknown7;
};

Some BULK2 message (0x44, 0x00)

typedef struct {
    BMEHeader header;
    u_int32_t flags;   // Set to 0xFFFFFFFF to get all data
} BME_EM_BULK2_Req;

struct emsg_bme_bulk2_reply {
   uint32     unknown1;
   uint32     unknown2;
   uint32     unknown3;
   uint16     // Conf. battery footprint
   uint16     // Conf. minimum standby current (mA)
   uint16     // Conf. Batmon battery low voltage (Safety level) 
   uint16     // Conf. Batmon battery low voltage (Empty)
   uint16     // Configured number of battery bars
   uint16     unknown4;
};