Field Guide · term

Also known as: CSBK, common signalling block, dPMR CSBK

The dPMR CSBK (Common Signalling Block) is the 80-bit control-channel unit a dPMR Mode-3 trunked system transmits between voice grants — the same role the CSBK plays in DMR.1 It is the message that registers radios, grants voice and data calls onto traffic channels, and keeps the system coordinated. After FEC removal the block resolves into six fixed fields: a message type, a small flags field, a source and a destination address, service info, and a 16-bit opcode-specific tail.2

type 5 flags 3 Source ID 24 Destination ID 24 service 8 opcode-specific 16 (e.g. channel #) 80 bits total · flags = group / emergency / encrypted
The dPMR CSBK packs six fields into 80 bits: the message type names the function, the flags mark group/emergency/encrypted calls, the source and destination carry 24-bit radio addresses, and the opcode-specific tail carries the granted channel number on a voice allocation.

Field layout

The 80 bits are read MSB-first as ten bytes with the fields packed across byte boundaries:

Bits Width Field Contents
0–4 5 Message type opcode (see below)
5–7 3 Flags group / emergency / encrypted
8–31 24 Source ID calling subscriber radio ID
32–55 24 Destination ID callee — group or subscriber
56–63 8 Service info priority / payload type
64–79 16 Opcode-specific channel number, status, …

The three flag bits are 0x4 group call, 0x2 emergency, and 0x1 encrypted. The source and destination are 24-bit addresses — the destination is a talkgroup on a group call and a subscriber on a unit-to-unit call, distinguished by the group flag. On a voice allocation, the 16-bit opcode-specific field carries the physical channel number the radios retune to, which the band-plan resolver turns into a frequency.

Message types

The 5-bit message type opens every CSBK. GopherTrunk enumerates the subset the trunking state machine acts on:

Opcode Name Purpose
0x01 RegistrationRequest radio registers to the system
0x02 RegistrationResponse system acknowledges registration
0x03 VoiceServiceAllocation group voice channel grant
0x04 IndividualVoiceAllocation unit-to-unit voice grant
0x05 DataServiceAllocation data channel grant
0x06 ServiceRequest subscriber requests a service
0x07 StandingServiceStatus periodic site broadcast
0x0F Release tear down / release
0x1F Idle control-channel filler

A VoiceServiceAllocation or IndividualVoiceAllocation is the channel grant the engine follows to a traffic channel; StandingServiceStatus is the broadcast that lets the state machine declare the control channel locked and learn the system identifier; Release and Idle are absorbed silently. GopherTrunk can run in a strict mode that drops any CSBK whose 5-bit type falls outside this documented set, so a corrupted block does not masquerade as a grant.

Relevance to SDR

internal/radio/dpmr/csbk.go parses the 80 bits into a typed CSBKCSBKFromBits packs the bit slice, ParseCSBK unpacks the fields, and the IsGroup / IsEmergency / IsEncrypted accessors read the flags — while internal/radio/dpmr/opcodes.go holds the MessageType enum and the AsVoiceGrant / AsSiteBroadcast helpers that turn a CSBK into a structured grant or site broadcast. Those grants are what the trunking engine emits on the event bus with Protocol = "dpmr", driving the “see grant → retune → follow” loop. Vendor extensions repurpose the service-info and trailing fields, so the source flags that live captures should be cross-checked against the deployment before those two fields are trusted; the message type, addresses, and flags, however, are the stable core the state machine depends on.

Sources

  1. dPMR — Wikipedia, on the ETSI dPMR standard and its Mode 3 trunking signalling. 

  2. Trunked radio system — Wikipedia, on control-channel signalling and channel grants in trunked systems. 

See also