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
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 CSBK — CSBKFromBits 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
-
dPMR — Wikipedia, on the ETSI dPMR standard and its Mode 3 trunking signalling. ↩
-
Trunked radio system — Wikipedia, on control-channel signalling and channel grants in trunked systems. ↩