BKPT DEBUG & VIEWALYZER RS
Documentation
TRACE DOMAINS · PRACTICAL GUIDES

STM32WB55 BLE suite

One engineering reference for the nine companion descriptors that observe the STM32WB5MM-DK peer-to-peer BLE demo.

Download the complete suite · Domain catalog

Scope and compatibility

These files target the STM32WB55-based STM32WB5MM-DK demo with its single-link BLE observation ABI 1, matching Debug ELF and current Trace Domains v1 host. They do not acquire private CPU2 state or sniff radio traffic. Generic connection/GATT/journal concepts can be adapted to another producer, but require the same verified observation contract. IPCC fields are STM32WB-specific and the P2P profile uses ST application symbols. No broader target compatibility is claimed.

Each file remains separate to bound its input count. Install the files you need; no runtime file has been merged. The P2P Send action additionally requires command mailbox ABI 1 and a live BKPT Debug host with typed-actions-v1. Desktop and history views are read-only.

Files and sections

Reading the suite

Read availability and Present flags first. The observer retains four services, eight characteristics, 16 payload bytes per characteristic and 16 significant journal records. Polls may span several firmware generations; retained data can outlive a connection. A local stack success or application acknowledgement does not prove phone receipt. Registry overflow and truncation describe observation limits. The bundled ST P2P app registers one service and two characteristics, so GATT pages for slots 2–7 normally show unused entries.

All values are separately sampled firmware observations; the requested poll rates below are not guaranteed achieved rates. Unavailable or stale inputs are not zero. DWARF paths require the exact ELF. Unknown value codes remain numeric. Counters can reset with the application, and raw journal timestamps/sequences can wrap. Inspect retained records after halting only when a consistent multi-field snapshot is needed; a halt also interrupts BLE application handling.

A value is a raw code, count, handle or register word unless its explanation gives a scale; a table has a unit column only where the descriptor declares units. A wrapping counter accounts for rollover at its integer width; a reset can look like a wrap, and several wraps between two samples cannot be recovered. Only BLE overview declares automatic findings; the absence of a finding does not establish healthy operation.

BLE overview

com.bkpt.ble.overview · version 0.1.0 · API 1. Download · GitHub

Connection cards establish whether a live link exists. Command/error rows retain outcomes, while service tables describe only intercepted successful registrations, not CPU2's complete database.

61 inputs, 0 derived channels; requested polling 2 Hz per input.

BLE overview · Cards and tables

BLE overview · Connection

Single-link peripheral observation ABI 1. Connection intervals use 1.25 ms units; supervision timeout uses 10 ms units. Values persist until superseded; disconnected timing/PHY values describe the previous link.

CARD OR ROW READING AND SIGNIFICANCE
Advertising · ble.advertisingApplication advertising state updated after successful start/stop requests and connection events. It is not a measurement of packets transmitted over the air.
Connected · ble.connectedSingle-link connection observation: 1 after a successful connection event, 0 after successful disconnect. Polls can miss an entire short connection.
Connection handle (65535 = none) · ble.connection_handleCurrent connection handle; 65535 means none. Use it to distinguish a live link from retained timing/version fields.
Successful connections · ble.connectsSuccessful connection events since boot, a 32-bit count. No wrapping policy is declared for this display.
Disconnections · ble.disconnectsSuccessful disconnect events since boot, a 32-bit count. Compare its increase with the retained reason.
Last disconnect reason · ble.disconnect_reasonLast disconnect reason: 0 none, 8 supervision timeout, 19 remote user terminated, 22 local host terminated; other codes stay numeric. It is retained context and may describe an earlier link, not the current state.
Connection interval (1.25 ms units) · ble.interval_unitsNegotiated interval in 1.25 ms units: multiply by 1.25 for milliseconds. Retained after disconnect.
Peripheral latency (events) · ble.latencyNegotiated peripheral latency in connection events, not milliseconds. Retained after disconnect.
Supervision timeout (10 ms units) · ble.timeout_unitsSupervision timeout in 10 ms units: multiply by 10 for milliseconds. Retained after disconnect.
TX PHY · ble.tx_phyLast observed transmit PHY: 0 unknown, 1 1 Mbit/s, 2 2 Mbit/s, 3 coded. Not measured application throughput.
RX PHY · ble.rx_phyLast observed receive PHY using the same codes. Retained after disconnect; not RF-quality data.
ATT MTU (0 = no link) · ble.att_mtuObserved ATT MTU in bytes: initialized to 23 on connection, updated from the MTU response, cleared to 0 on disconnect. It is not notification payload length.
Link encrypted · ble.encryptedObserved encryption-enabled state, cleared on disconnect. This flag alone does not establish authentication strength or secure pairing.

BLE overview · Command outcomes and observation health

Firmware-retained application observation. Polls may span updates; halt for a consistent snapshot. Not private CPU2 state or proof of radio delivery.

CARD OR ROW READING AND SIGNIFICANCE
Observation ABI · ble.abiFirmware observation contract version. This adapter uses 1; it is distinct from descriptor format compatibility.
Application uptime · ble.tick_msHAL_GetTick milliseconds refreshed by the application poll loop, stored in 32 bits and wrapping with the tick counter. Useful for checking that mirrors are being refreshed.
CPU2 ready event observed · ble.cpu2_readyA CPU2 ready event was observed. It does not prove successful BLE stack/application initialization.
Wireless version (major:minor:patch packed) · ble.stack_versionWireless stack version packed as major << 16, minor << 8, patch. Decode those bytes; it is not a decimal version number.
FUS version (major:minor:patch packed) · ble.fus_versionFUS version packed as major << 16, minor << 8, patch. Context for firmware compatibility; it is not a request to update FUS.
Wireless stack type · ble.stack_typeReported wireless stack type. This descriptor names value 1 as BLE full stack; other codes remain numeric.
HCI/ACI requests since boot · ble.commandsWrapped HCI/ACI requests since boot. Counts requests even when their outcome fails.
Command awaiting response · ble.command_pendingSet around hci_send_req and cleared on return. A sustained 1 suggests response processing is not completing; a single sample can be normal.
Last command · ble.last_opcodeMost recent HCI/ACI opcode, assembled from OGF and OCF. Match with last_status; fields may span different requests. Shown by name for 209 codes, listed in the JSON download.
Last command status · ble.last_statusMost recent command outcome: stack status byte, 256 transport failure, or 257 no response status. Zero means local command success, not remote receipt. Values.
Non-success command outcomes · ble.command_errorsCount of nonzero command outcomes, including transport/no-response cases. Inspect retained error fields before retrying.
Last failed command (retained) · ble.last_error_opcodeMost recent failed command, retained even after later success. It is not necessarily the currently pending command. Shown by name for 209 codes, listed in the JSON download.
Last error status (retained) · ble.last_error_statusStatus of that retained failure. It can remain nonzero throughout subsequent healthy operation. Values.
Asynchronous events since boot · ble.eventsAsynchronous application events observed since boot, including radio activity callbacks omitted from the journal. Not a packet count.
Rejected malformed application events · ble.malformed_eventsAttribute-modified events rejected by the adapter’s length checks. It is not a comprehensive radio/protocol error counter.
Observations omitted: registry full · ble.registry_overflowsSuccessful registrations omitted because the four-service/eight-characteristic observer registry was full. This is missing observation, not necessarily failed stack registration.
Payload observations longer than 16 bytes · ble.value_truncationsPayload observations longer than the 16-byte retention limit. The application/stack may have received the full value.
Registered services observed · ble.services_countSuccessfully registered services retained by the adapter, at most four. Internal GAP/GATT services are not enumerated.
Registered characteristics observed · ble.characteristics_countSuccessfully registered characteristics retained by the adapter, at most eight. Other APIs need observer hooks to be represented.
Journal slots overwritten since boot · ble.journal_overwrittenSignificant records written beyond the first 16, replacing older slots. This is expected rolling-history eviction, not proof of lost radio traffic.

BLE overview · Service slots 0–3

Present=0 means unused. These are successful application add-service calls, not an enumeration of CPU2's entire database; GAP/GATT built-ins are not intercepted. UUID words 3,2,1,0 form the 128-bit UUID in hexadecimal; type 1 uses word 0's low 16 bits. All 4 slots have these fields; N is the slot number, 0 to 3.

CARD OR ROW READING AND SIGNIFICANCE
Present · ble.services.N.present1 marks a populated service slot; 0 means unused. Ignore the rest of an unused slot.
Service handle · ble.services.N.handleHandle returned by a successful application add-service call. It identifies the local service, not a remote device.
UUID type (1=16 bit, 2=128 bit) · ble.services.N.uuid_typeUUID type: 1 is 16-bit, 2 is 128-bit. Type determines how many words are meaningful.
UUID / UUID word 0 (least-significant first) · ble.services.N.uuid.0One raw UUID word. For 128-bit UUIDs concatenate hexadecimal words 3,2,1,0, each padded to eight digits; for type 1 use word 0’s low 16 bits.
UUID / UUID word 1 (least-significant first) · ble.services.N.uuid.1Same as the row above.
UUID / UUID word 2 (least-significant first) · ble.services.N.uuid.2Same as the row above.
UUID / UUID word 3 (least-significant first) · ble.services.N.uuid.3Same as the row above.

BLE overview · Sampled inputs

Every input is read from firmware at the member path its channel name spells out: ble.* from ble_observer (u32). For example, ble.services.N.uuid.0 reads ble_observer.services[N].uuid[0].

wrapping counters: ble.commands, ble.command_errors, ble.events, ble.malformed_events, ble.registry_overflows, ble.value_truncations.

BLE overview · Findings

BLE overview · A command returned non-success

warning · command-errors. ble.command_errors increases between valid samples.

The retained command error count increased. Inspect the retained opcode/status and journal; an accepted GATT update is not remote delivery.

Evidence: ble.command_errors.

BLE overview · Observation registry capacity exceeded

warning · registry-full. ble.registry_overflows increases between valid samples.

The firmware omitted an object because its fixed registry is full. Increase adapter capacity and generate matching bounded descriptor pages.

Evidence: ble.registry_overflows.

BLE overview · Command response still pending

warning · command-pending. ble.command_pending ≥ 1 for 2000 ms of observations.

A command has remained pending across at least two seconds of running samples. Inspect shared transport flags and application execution. Halting pauses observations.

Evidence: ble.command_pending.

BLE GATT slots 0–7

4 files that differ only in the slots they cover, each version 0.1.0 · API 1.

JSON DOWNLOAD SLOTS DESCRIPTOR SOURCE
ble-gatt-1.vadomain0–1com.bkpt.ble.gatt-1GitHub
ble-gatt-2.vadomain2–3com.bkpt.ble.gatt-2GitHub
ble-gatt-3.vadomain4–5com.bkpt.ble.gatt-3GitHub
ble-gatt-4.vadomain6–7com.bkpt.ble.gatt-4GitHub

Each GATT file covers two physical characteristic slots. Read Present and Value source before interpreting payload words. Slots 0–1 serve the supplied P2P application; later slots require additional registrations.

Each file: 48 inputs, 10 derived channels; requested polling 1 Hz per input.

BLE GATT slots 0–7 · Cards and tables

BLE GATT slots 0–7 · Characteristic slots 0–7

Present=0 means unused. Handles, UUIDs and properties come from successful registration. Value origin=0 means no observed value. Payload is the retained 16-byte prefix in four little-endian words. Values and counters are application observations; update success does not prove client receipt. CCCD is for the single current connection. All 8 slots have these fields; N is the slot number, 0 to 7.

CARD OR ROW READING AND SIGNIFICANCE
Present · ble.characteristics.N.present1 means a successfully registered characteristic occupies the slot; 0 means unused. Do not interpret other fields of an unused slot.
Parent service handle · ble.characteristics.N.serviceParent local service handle; match it to the service registry in Overview.
Identity / Characteristic declaration handle · ble.characteristics.N.declarationCharacteristic declaration handle returned by the registration API.
Identity / Value handle · ble.characteristics.N.value_handleLocal value handle, declaration + 1 in this adapter. Remote writes are matched against this handle.
Identity / CCCD handle (0 = none) · ble.characteristics.N.cccd_handleLocal client-configuration handle, declaration + 2 for notify/indicate characteristics in this adapter; 0 means none. This layout is adapter-specific.
Identity / UUID type · ble.characteristics.N.uuid_type1 is a 16-bit UUID, 2 a 128-bit UUID. Use the corresponding UUID words.
Properties / Property bitmask · ble.characteristics.N.propertiesRaw characteristic property bitmask from successful registration. The derived booleans decode only the named bits, not every possible property.
Value / Maximum value bytes · ble.characteristics.N.max_lengthMaximum bytes declared at registration. It is not the length of the retained payload.
Value / Last observed payload bytes · ble.characteristics.N.lengthLength of the latest observed update/write fragment before truncation. With offset-origin 3 it is fragment length, not total characteristic length.
Value / Retained prefix bytes · ble.characteristics.N.capturedBytes actually retained in the four payload words, at most 16. Ignore zero padding beyond this count.
Value / Value source · ble.characteristics.N.value_origin0 unobserved; 1 accepted local update; 2 remote write callback; 3 nonzero-offset fragment, not a complete value. A displayed zero word is not evidence of an observed zero value when origin is 0.
Subscription / Client subscription · ble.characteristics.N.cccdSubscription for the single current link: 0 disabled, 1 notifications, 2 indications, 3 both. Cleared on disconnect.
Activity / Remote value writes observed · ble.characteristics.N.writesRemote value-write callbacks observed. This does not include CCCD writes, which update subscription state separately.
Activity / Local update requests · ble.characteristics.N.updatesLocal update API calls for this registered characteristic, including failed calls.
Activity / Local updates accepted · ble.characteristics.N.update_okLocal update calls accepted by the stack. Compare with updates/last_status; acceptance does not prove radio delivery or client consumption.
Activity / Last local update status · ble.characteristics.N.last_statusMost recent local update result. It describes update calls, not the success of every remote write or notification. Values.
Identity / UUID / UUID word 0 (least-significant first) · ble.characteristics.N.uuid.0Raw UUID word: concatenate hexadecimal words 3,2,1,0 for 128 bits; type 1 uses low 16 bits of word 0.
Identity / UUID / UUID word 1 (least-significant first) · ble.characteristics.N.uuid.1Same as the row above.
Identity / UUID / UUID word 2 (least-significant first) · ble.characteristics.N.uuid.2Same as the row above.
Identity / UUID / UUID word 3 (least-significant first) · ble.characteristics.N.uuid.3Same as the row above.
Value / Payload / Payload bytes 0-3 (little-endian word) · ble.characteristics.N.value.0Four payload bytes packed little-endian in one 32-bit word. Reconstruct bytes least-significant first and honor captured length/origin; the bytes have no generic physical unit.
Value / Payload / Payload bytes 4-7 (little-endian word) · ble.characteristics.N.value.1Same as the row above.
Value / Payload / Payload bytes 8-11 (little-endian word) · ble.characteristics.N.value.2Same as the row above.
Value / Payload / Payload bytes 12-15 (little-endian word) · ble.characteristics.N.value.3Same as the row above.
Properties / Readable · ble.characteristics.N.property.1One decoded property bit: bit 1 readable, 2 write without response, 3 write with response, 4 notifiable, 5 indicatable. No/Yes describes capability, not current subscription or observed traffic.
Properties / Write without response · ble.characteristics.N.property.2Same as the row above.
Properties / Write with response · ble.characteristics.N.property.3Same as the row above.
Properties / Notifiable · ble.characteristics.N.property.4Same as the row above.
Properties / Indicatable · ble.characteristics.N.property.5Same as the row above.

BLE GATT slots 0–7 · Sampled inputs

Every input is read from firmware at the member path its channel name spells out: ble.* from ble_observer (u32). For example, ble.characteristics.N.uuid.0 reads ble_observer.characteristics[N].uuid[0].

wrapping counters: ble.characteristics.N.writes, ble.characteristics.N.updates, ble.characteristics.N.update_ok.

Derived from ble.characteristics.N.properties: ble.characteristics.N.property.1 is bit 1, ble.characteristics.N.property.2 is bit 2, ble.characteristics.N.property.3 is bit 3, ble.characteristics.N.property.4 is bit 4, ble.characteristics.N.property.5 is bit 5.

BLE ST peer-to-peer profile

com.bkpt.ble.profile.st-p2p · version 0.2.0 · API 1. Download · GitHub

The P2P service UUID is 0000fe40-cc7a-482a-984a-7f2ed5b3e58f, LED FE41 and button FE42 in their full ST UUIDs. Values contain device selection (1 here) then state. Little-endian word 257 means bytes 01 01, word 1 means 01 00. The LED characteristic does not notify, so a client may need a fresh read. Missing profile symbols affect this profile without making generic GATT observations valid or invalid.

8 inputs, 0 derived channels; requested polling 2 Hz per input.

BLE ST peer-to-peer profile · Cards and tables

BLE ST peer-to-peer profile · LED and button

Optional profile decoder for ST's P2P application context. Missing P2P symbols make this profile unavailable while the generic GATT domains still work. LED is applied application state; button is local state even when notifications are disabled.

CARD OR ROW READING AND SIGNIFICANCE
Button notifications enabled · p2p.Notification_StatusApplication flag for button notifications enabled by the client. A local button toggle can still occur with notifications disabled.
Blue LED state · p2p.LedControl.Led1Applied application LED state: 0 Off, 1 On. The Send action routes through the application’s real GATT/LED handler. Explicit action: set_led; see Actions below.
Button toggle value · p2p.ButtonControl.ButtonStatusLocal button toggle value, alternating 0/1. It is not a count and does not prove a phone received a notification.
Button actions since boot · ble.button_pressesButton actions handled since boot, including the application’s supported simulated button path. It is not exclusively a physical switch count.
Button actions without subscription · ble.notifications_skippedButton actions handled without a subscription. This is deliberate suppression, not a radio-delivery failure count.

BLE ST peer-to-peer profile · Application commands

Send calls the application's LED handler and updates the readable P2P LED characteristic. An acknowledgement is a local application result; it does not prove phone receipt.

CARD OR ROW READING AND SIGNIFICANCE
Published request · command.request_seqPublished mailbox request sequence. A draft choice does not advance it; host publication is the command commit point.
Completed request · command.response_seqLast completed mailbox request sequence. Compare with request sequence and fresh application result; the host also matches a nonce internally.
Application result · command.statusApplication result for the completed request: 0 accepted; 65537 malformed request; 65538 application not ready; 65539 unsupported operation/value. Other values can be returned BLE stack statuses; this card leaves them numeric.

BLE ST peer-to-peer profile · Sampled inputs

Every input is read from firmware at the member path its channel name spells out: p2p.* from P2P_Server_App_Context (u8), ble.* from ble_observer (u32), command.* from domain_command (u32). For example, p2p.LedControl.Led1 reads P2P_Server_App_Context.LedControl.Led1.

wrapping counters: ble.button_presses, ble.notifications_skipped.

BLE ST peer-to-peer profile · Actions

The Blue LED draft offers Off (0) or On (1), encoded as one u8. Only explicit Send publishes operation 1 to domain_command; selecting a draft does not write. Firmware validates the mailbox and operation, updates the actual GATT value and applies the LED state, then publishes its result. The host waits up to 3000 ms for matching completion. Rejection/unknown completion is not success, and the host does not automatically retry. Acknowledgement proves local handling, not physical LED verification or phone receipt.

BLE ST peer-to-peer profile · Blue LED

set_led; completion: application.

{
  "input": {
    "ty": "u8",
    "choices": [
      {
        "value": "0",
        "label": "Off"
      },
      {
        "value": "1",
        "label": "On"
      }
    ]
  },
  "target": {
    "kind": "mailbox",
    "symbol": "domain_command",
    "operation": 1,
    "timeout_ms": 3000
  }
}

BLE STM32WB shared transport

com.bkpt.ble.stm32wb-transport · version 0.1.0 · API 1. Download · GitHub

Three application-copied IPCC registers help correlate a pending command with inter-core transport flags. They measure neither queue depth nor RF activity; the descriptor provides raw words without per-bit decoding.

3 inputs, 0 derived channels; requested polling 2 Hz per input.

BLE STM32WB shared transport · Cards and tables

BLE STM32WB shared transport · IPCC status samples

Application-copied read-only IPCC status and mask registers. Transient flags between samples may be missed; these are not queue lengths. CPU2 private radio/GATT state is inaccessible.

CARD OR ROW READING AND SIGNIFICANCE
M4 to M0+ channel flags · ble.ipcc_c1_statusFirmware copy of IPCC C1TOC2SR (M4 to M0+ channel flags). Transient flags can disappear between updates; this is not queue depth.
M0+ to M4 channel flags · ble.ipcc_c2_statusFirmware copy of IPCC C2TOC1SR (M0+ to M4 channel flags). Use as transport context, not a packet/RF metric.
M4 interrupt mask · ble.ipcc_c1_maskFirmware copy of IPCC C1MR, the M4 interrupt mask. It is a raw mask; the descriptor declares no per-bit decoding or fault threshold.

BLE STM32WB shared transport · Sampled inputs

Every input is read from firmware at the member path its channel name spells out: ble.* from ble_observer (u32). For example, ble.ipcc_c1_status reads ble_observer.ipcc_c1_status.

BLE activity slots 0–15

2 files that differ only in the slots they cover, each version 0.1.0 · API 1.

JSON DOWNLOAD SLOTS DESCRIPTOR SOURCE
ble-journal-1.vadomain0–7com.bkpt.ble.journal-1GitHub
ble-journal-2.vadomain8–15com.bkpt.ble.journal-2GitHub

Each journal file exposes eight physical slots of the shared 16-record journal. The journal is a retained window, not a complete event log. Order by sequence; unused/in-progress sequence zero is not an event.

Each file: 48 inputs, 0 derived channels; requested polling 1 Hz per input.

BLE activity slots 0–15 · Cards and tables

BLE activity slots 0–15 · Journal slots 0–15

Physical ring slots, not sorted rows. Sort mentally by sequence; sequence 0 is unused/in-progress. Last 16 significant observations are retained. Radio-activity callbacks only increment the event counter. Halt for a consistent journal; polling does not capture every entry. All 16 slots have these fields; N is the slot number, 0 to 15.

CARD OR ROW READING AND SIGNIFICANCE
Sequence · ble.journal.N.sequencePublication sequence of this physical ring slot. Zero means unused or currently being written. Order nonzero records by sequence; slots are not chronological rows.
Firmware time (ms) · ble.journal.N.tick_msHAL_GetTick timestamp in milliseconds recorded when the event is retained. It wraps at 32 bits and is not host wall-clock time.
Kind · ble.journal.N.kind0 unused, 1 command outcome, 2 asynchronous event. It selects how code/status should be interpreted.
Opcode / encoded event code · ble.journal.N.codeFor commands, (OGF << 10) | OCF. For ordinary events, HCI event code; LE meta events use (event << 8) | subevent; vendor events use 0xFF0000 | 16-bit subevent. This field stays numeric in this descriptor.
Command status (events use 0) · ble.journal.N.statusCommand outcome status; asynchronous records use 0 as a placeholder. Event status 0 does not prove the event represents a successful operation. Values.
Connection handle · ble.journal.N.handleConnection handle retained at recording time, or 65535 for none. A disconnect record can therefore show none after cleanup.

BLE activity slots 0–15 · Sampled inputs

Every input is read from firmware at the member path its channel name spells out: ble.* from ble_observer (u32). For example, ble.journal.N.sequence reads ble_observer.journal[N].sequence.

Value lookups

Shared by the linked fields throughout the suite. Unlisted codes remain numeric and must not be treated as success.

Last command status values

RAW VALUE DECODED LABEL
0Success
89Dev in blacklist
90Csrk not found
91Irk not found
92Dev not found
94Dev not bonded
96Invalid handle
97Out of handle
98Invalid operation
100Insufficient resources
101Sec permission error
112Address not resolved
130No valid slot
131Scan window short
132New interval failed
133Interval too large
134Length failed
145Failed
146Invalid params
147Busy
149Pending
151Error
152Out of memory
255Timeout
256Transport failure
257No response status

Source verification and contributions

Verified against observation ABI 1 in ble_observer.h, API wrappers/event decoding/poll copies in ble_observer.c, version/advertising producers in app_entry.c and app_ble.c, the pinned ST BLE status/opcode headers, and descriptor-driven card/enum rendering. Action semantics were checked in domain_command.c and P2PS_APP_Command.

Contribute a correction or an adapted domain. The nine individual downloads are exact copies of the canonical definitions; the ZIP contains those same files.