Summary
DHD RM420-027 documents the External Control Protocol (ECP) used to control DHD DSP frames (RM4200D, 52/XR, 52/XS/XC/XD series) via RS-232, RS-422, or TCP/IP. Each frame carries a 16-byte block containing a 29-bit command ID (low 20 bits per command, high 4 bits zero-padded) and up to 8 data bytes; response is via separate block. ECP is deprecated as of firmware 10.2 for new 3rd-gen core integrations (XC3/XD3/XS3) — Control API preferred for new projects.
Transport
# ECP runs on either serial (RS-232/RS-422) or TCP. Per source both listed.
protocols:
- tcp
- serial
addressing:
port: 2008 # stated verbatim: "TCP Connection, IP Address, Port 2008"
serial:
baud_rate: 38400 # stated verbatim: "38400, 8, N, 1 no protocol"
data_bits: 8
parity: none
stop_bits: 1
flow_control: none # stated: "no protocol" interpreted as no hardware-flow handshake
auth:
type: none # inferred: no auth procedure in source
Traits
- routable # inferred from routing command examples (0x01F5xxxx)
- levelable # inferred from fader/gain/level command examples
- queryable # inferred from request/notification variants
Actions
# Block frame: 16-byte packet. Bytes 0..3 carry0,0,0,Length(0..8). Bytes 4..7 carry ID28..ID0.
# Bytes 8..15 carry D0..D7. Bytes 16..18 reserved (U0,U1,U2) and zero on send.
# Below uses compact text form `ID,Length,D0..Dn` for readability; build16-byte MSB-first blocks on send.
- id: set_output_routing_16bit_request_all
label: Set Output Routing (16-bit) - Request All Crosspoints
kind: query
command: "01F50000,0"
params: []
- id: set_output_routing_16bit_request_one
label: Set Output Routing (16-bit) - Request One Crosspoint
kind: query
command: "01F50000,2,OutputHi,OutputLo"
params:
- name: OutputHi
type: byte
description: Slot number hi-byte (0x00..0x1E)
- name: OutputLo
type: byte
description: Output number within slot (bit 7 = 0x80 marks outputs)
- id: set_output_routing_16bit_set
label: Set Output Routing (16-bit) - Set Crosspoint
kind: action
command: "01F50000,4,OutputHi,OutputLo,InputHi,InputLo"
params:
- name: OutputHi
type: byte
description: Output slot hi - name: OutputLo
type: byte
description: Output number within slot
- name: InputHi
type: byte
description: Input slot hi or0x40..0x7F for summation/special
- name: InputLo
type: byte
description: Input number,0xFFFF = Mute
- id: set_output_routing_32bit_notify_off
label: Set Output Routing (32-bit) - Deactivate Crosspoint Notification
kind: action
command: "01F50000,1,0x00"
params: []
- id: set_output_routing_32bit_notify_on
label: Set Output Routing (32-bit) - Activate Crosspoint Notification (TCP only)
kind: action
command: "01F50000,1,0x01"
params: []
- id: set_output_routing_32bit_request_one
label: Set Output Routing (32-bit) - Request One Crosspoint
kind: query
command: "01F50000,5,OutputID0,OutputID1,OutputID2,OutputID3"
params:
- name: OutputID0..3
type: byte
description: 32-bit AudioID of output (MSB first)
- id: set_output_routing_32bit_set
label: Set Output Routing (32-bit) - Set Crosspoint
kind: action
command: "01F50000,8,OutputID0,OutputID1,OutputID2,OutputID3,InputID0,InputID1,InputID2,InputID3"
params:
- name: OutputID
type: byte
description: 32-bit AudioID, MSB first
- name: InputID
type: byte
description: 32-bit AudioID; 0x00000000 = Mute
- id: set_arbitration_request
label: Set Arbitration - Request Owner of Audio ID
kind: query
command: "01F90000,4,AudioID0,AudioID1,AudioID2,AudioID3"
params:
- name: AudioID
type: byte
description: 32-bit Output/Input Audio ID- id: set_arbitration_set
label: Set Arbitration - Set Owner Device ID
kind: action
command: "01F90000,5,AudioID0,AudioID1,AudioID2,AudioID3,DeviceID"
params:
- name: AudioID
type: byte
description: 32-bit Audio ID
- name: DeviceID
type: byte
description: 0x00 = no owner, 0x40..0x60 = owning device ID
- id: set_monitor_channel_request
label: Set Monitor Channel - Request Current Inputs
kind: query
command: "11000000,3,InputHi,InputLo,Number"
params:
- name: InputHi
type: byte
description: Set 0x00 on request
- name: InputLo
type: byte
description: Set 0x00 on request
- name: Number
type: byte
description: Monitor selector number (0..5 fw05, 0..199 fw06+)
- id: set_monitor_channel_set
label: Set Monitor Channel - Set Inputs
kind: action
command: "11000000,6,InputHiL,InputLoL,Number,0,InputHiR,InputLoR"
params:
- name: InputHiL/InputLoL
type: byte
description: 16-bit audio address for left
- name: Number
type: byte
description: Monitor selector number
- name: InputHiR/InputLoR
type: byte
description: 16-bit audio address for right
- id: switch_fader_channel_on_off
label: Switch Fader/Channel On/Off
kind: action
command: "11020000,3,FaderHi,FaderLo,On"
params:
- name: FaderHi
type: byte
description: 0x00..0x03 = Virtual Mixer 1..4 (LogicFader); 0x10 = Channel number mode
- name: FaderLo
type: byte
description: LogicFader no. (0x00..0x2F) or Channel no. (1..150)
- name: On
type: byte
description: 1 = on, 0 = off
- id: set_fader_notification_off
label: Set Fader Level - Deactivate Notification
kind: action
command: "11030000,1,0x00"
params: []
- id: set_fader_notification_on
label: Set Fader Level - Activate Fader Value Notification
kind: action
command: "11030000,1,0x01"
params: []
- id: set_fader_request
label: Set Fader Level - Request
kind: query
command: "11030000,2,FaderHi,FaderLo"
params:
- name: FaderHi
type: byte
description: Virtual Mixer index - name: FaderLo
type: byte
description: LogicFader or Channel number
- id: set_fader_set
label: Set Fader Level - Set
kind: action
command: "11030000,4,FaderHi,FaderLo,LevelHi,LevelLo"
params:
- name: FaderHi
type: byte
description: Virtual Mixer index
- name: FaderLo
type: byte
description: Fader
- name: LevelHi/LevelLo
type: byte
description: 0x8000..0x7FFF = -327.68..327.67 dB
- id: set_fader_set_timed
label: Set Fader Level - Set Within Time
kind: action
command: "11030000,7,FaderHi,FaderLo,LevelHi,LevelLo,TimeHi,TimeLo,Type"
params:
- name: FaderHi/FaderLo
type: byte
description: Fader identifier
- name: LevelHi/LevelLo
type: byte
description: Target level dB
- name: TimeHi/TimeLo
type: byte
description: 0x0000..0x2000 ms
- name: Type
type: byte
description: 0 = level linear fade, 1 = fader linear fade
- id: set_fader_access_request
label: Set Fader Access - Request Status
kind: query
command: "11040000,0"
params: []
- id: set_fader_access_set
label: Set Fader Access - Set Access
kind: action
command: "11040000,7,FaderHi,FaderLo,On,Type,ChannelHi,ChannelLo,AccGroup"
params:
- name: FaderHi
type: byte
description: Virtual Mixer index
- name: FaderLo
type: byte
description: Fader
- name: On
type: byte
description: 0/1 - name: Type
type: byte
description: 0 = GAIN, 1 = PAN/BAL, 2 = INPUTSELECT
- name: ChannelHi/ChannelLo
type: byte
description: Channel number (used in answer)
- name: AccGroup
type: byte
description: Acc-Group 1..6 (used in answer)
- id: set_channel_input_number_request_all
label: Set Channel Input Number - Request All
kind: query
command: "110D0000,0"
params: []
- id: set_channel_input_number_request_one
label: Set Channel Input Number - Request Input for Fader
kind: query
command: "110D0000,2,FaderHi,FaderLo"
params:
- name: FaderHi
type: byte
description: Virtual Mixer
- name: FaderLo
type: byte
description: Fader number
- id: set_channel_input_number_set
label: Set Channel Input Number - Set (Input Select)
kind: action
command: "110D0000,4,FaderHi,FaderLo,ChannelHi,ChannelLo"
params:
- name: FaderHi/FaderLo
type: byte
description: Fader identifier
- name: ChannelHi/ChannelLo
type: byte
description: Channel number 1..250
- id: set_internal_logic_request
label: Set Internal Logic State - Request
kind: query
command: "110E0000,2,LogicIDHi,LogicIDLo"
params:
- name: LogicIDHi/LogicIDLo
type: byte
description: 16-bit Logic ID
- id: set_internal_logic_set
label: Set Internal Logic State - Set
kind: action
command: "110E0000,3,LogicIDHi,LogicIDLo,On"
params:
- name: LogicIDHi/LogicIDLo
type: byte
description: 16-bit Logic ID
- name: On
type: byte
description: 0 = off, 1 = on
- id: set_monitor_level_request
label: Set Monitor Level - Request
kind: query
command: "11100000,2,PotHi,PotLo"
params:
- name: PotHi/PotLo
type: byte
description: Potentiometer 1..120 (0x0000..0x0077)
- id: set_monitor_level_set
label: Set Monitor Level - Set Instant
kind: action
command: "11100000,4,PotHi,PotLo,LevelHi,LevelLo"
params:
- name: PotHi/PotLo
type: byte
description: Potentiometer 1..120
- name: LevelHi/LevelLo
type: byte
description: 0x8000..0x7FFF = dB
- id: set_monitor_level_set_timed
label: Set Monitor Level - Set Within Time
kind: action
command: "11100000,7,PotHi,PotLo,LevelHi,LevelLo,TimeHi,TimeLo,Type"
params:
- name: PotHi/PotLo
type: byte
description: Potentiometer 1..120
- name: LevelHi/LevelLo
type: byte
description: Target dB
- name: TimeHi/TimeLo
type: byte
description:0..0x2000 ms
- name: Type
type: byte
description: 0 = level linear fade, 1 = fader linear fade
- id: set_display_label_restore
label: Set Display/Channel Label - Restore Original
kind: action
command: "11140000,2,ChannelHi,ChannelLo"
params:
- name: ChannelHi/ChannelLo
type: byte
description: Channel 1..250 or 0x8001..0x800C central panel
- id: set_display_label_request
label: Set Display/Channel Label - Request
kind: query
command: "11140000,3,ChannelHi,ChannelLo,DisplayNr"
params:
- name: ChannelHi/ChannelLo
type: byte
description: Channel or panel - name: DisplayNr
type: byte
description: Display segment (each 4 chars)
- id: set_display_label_set
label: Set Display/Channel Label - Set
kind: action
command: "11140000,8,ChannelHi,ChannelLo,DisplayNr,0,ASCII1,ASCII2,ASCII3,ASCII4"
params:
- name: ChannelHi/ChannelLo
type: byte
description: Channel or panel
- name: DisplayNr
type: byte
description: 0..0x7F
- name: ASCII1..ASCII4
type: byte
description: 0x00..0x7F characters
- id: set_pfl_switch_off_all
label: Set PFL - Switch Off All
kind: action
command: "11160000,0"
params: []
- id: set_pfl_switch_off_all_virtual_mixer
label: Set PFL - Switch Off All on Virtual Mixer (fw06+)
kind: action
command: "11160000,1,FaderHi"
params:
- name: FaderHi
type: byte
description: Virtual Mixer 1..4
- id: set_pfl_request
label: Set PFL - Request State
kind: query
command: "11160000,2,FaderHi,FaderLo"
params:
- name: FaderHi
type: byte
description: Virtual Mixer or 0x10 for channel
- name: FaderLo
type: byte
description: LogicFader or Channel- id: set_pfl_set
label: Set PFL - Set On/Off
kind: action
command: "11160000,4,FaderHi,FaderLo,On,AutoMute"
params:
- name: FaderHi
type: byte
description: Virtual Mixer or 0x10 channel
- name: FaderLo
type: byte
description: LogicFader or Channel
- name: On
type: byte
description: 1 = PFL on, 0 = off
- name: AutoMute
type: byte
description: 1 = switch other PFLs off
- id: loadsave_load_channel_snapshot
label: Load/Save - Load Channel Snapshot
kind: action
command: "111C0000,4,0x00,SnapshotNr,MixerID,FaderChannel"
params:
- name: SnapshotNr
type: byte
description: 0..250 channel snapshot
- name: MixerID
type: byte
description: Virtual Mixer 1..4 or 0x10 channel
- name: FaderChannel
type: byte
description: Fader 0..47 or Channel 0..250
- id: loadsave_save_channel_snapshot
label: Load/Save - Save Channel Snapshot
kind: action
command: "111C0000,4,0x01,SnapshotNr,MixerID,FaderChannel"
params:
- name: SnapshotNr
type: byte
description: 0..250
- name: MixerID
type: byte
description: Virtual Mixer 1..4 or 0x10 channel
- name: FaderChannel
type: byte
description: Fader 0..47 or Channel 0..250
- id: loadsave_load_mixer_snapshot
label: Load/Save - Load Mixer Snapshot
kind: action
command: "111C0000,3,0x0A,MixerID,FaderChannel"
params:
- name: MixerID
type: byte
description: Virtual Mixer 1..4 or 0x10 channel
- name: FaderChannel
type: byte
description: Fader or Channel
- id: loadsave_save_mixer_snapshot
label: Load/Save - Save Mixer Snapshot
kind: action
command: "111C0000,3,0x0B,MixerID,FaderChannel"
params:
- name: MixerID
type: byte
description: Virtual Mixer 1..4 or 0x10 channel
- name: FaderChannel
type: byte
description: Fader or Channel
- id: set_io_gain_16bit_request
label: Set IO Gain (16-bit) - Request
kind: query
command: "112D0000,2,IOHi,IOLo"
params:
- name: IOHi/IOLo
type: byte
description: Physical I/O address (output 0x0180..0x1EFF, input 0x0100..0x1E7F, summation0x4000..0x7FFF, 0xFFFF = Mute)
- id: set_io_gain_16bit_set
label: Set IO Gain (16-bit) - Set
kind: action
command: "112D0000,4,IOHi,IOLo,ValueHi,ValueLo"
params:
- name: IOHi/IOLo
type: byte
description: Physical I/O address
- name: ValueHi/ValueLo
type: byte
description: Gain 0x8000..0x7FFF (-327.68..327.67 dB)
- id: set_io_gain_32bit_request
label: Set IO Gain (32-bit) - Request
kind: query
command: "112D0000,4,AudioID0,AudioID1,AudioID2,AudioID3"
params:
- name: AudioID
type: byte
description: 32-bit Audio ID
- id: set_io_gain_32bit_set
label: Set IO Gain (32-bit) - Set
kind: action
command: "112D0000,6,AudioID0,AudioID1,AudioID2,AudioID3,ValueHi,ValueLo"
params:
- name: AudioID
type: byte
description: 32-bit Audio ID
- name: ValueHi/ValueLo
type: byte
description: Gain in dB
- id: metering_set_notification
label: Metering - Activate/Deactivate Notification
kind: action
command: "111D0000,2,Leveldetect,ON"
params:
- name: Leveldetect
type: byte
description: 1..30 position in TB8 configuration
- name: ON
type: byte
description: 0 deactivate, 1 activate
- id: get_set_param_cf_input_request
label: Get/Set Parameter - CleanFeed Input Request
kind: query
command: "11810000,4,ChannelHi,ChannelLo,0x00,0x24"
params:
- name: ChannelHi/ChannelLo
type: byte
description: Channel 1..250
- name: CFIn Prefix
type: byte
description: Mandatory 0x0024
- id: get_set_param_cf_input_set
label: Get/Set Parameter - CleanFeed Input Set
kind: action
command: "11810000,8,ChannelHi,ChannelLo,0x00,0x24,P0,P1,P2,P3"
params:
- name: ChannelHi/ChannelLo
type: byte
description: Channel 1..250
- name: P0..P3
type: byte
description: 32-bit CFIn parameter; bits 7..0 = gain 0xD8..0x0F (-40..+15 dB)
- id: get_set_param_cf_output_request
label: Get/Set Parameter - CleanFeed Output Request
kind: query
command: "11810000,4,ChannelHi,ChannelLo,0x00,0x25"
params:
- name: ChannelHi/ChannelLo
type: byte
description: Channel 1..250
- name: CFOut Prefix
type: byte
description: Mandatory 0x0025
- id: get_set_param_cf_output_set
label: Get/Set Parameter - CleanFeed Output Set
kind: action
command: "11810000,8,ChannelHi,ChannelLo,0x00,0x25,P0,P1,P2,P3"
params:
- name: ChannelHi/ChannelLo
type: byte
description: Channel 1..250
- name: P0..P3
type: byte
description: 32-bit CFOut parameter; bits 18 N-Mix, 17 AltSrc, 16 Mute, 15..8 AltSrc pos, 7..0 gain 0xD2..0x0A (-30..+10 dB)
Feedbacks
# ECP responses are returned as separate 16-byte blocks with the same command ID.
# The following are recognized unsolicited/response payloads.
- id: crosspoint_notification_16bit
label: Crosspoint Notification (16-bit)
type: object
description: |
Block of length 4 in response to routing change or to a 32-bit notification activation.
D0..D1 = Output, D2..D3 = Input (per16-bit AudioID scheme).
- id: fader_value_notification
label: Fader Value Notification
type: object
description: |
Length 4 datagram sent when fader notification activated. FaderHi 0x00..0x03.
D0 = FaderHi, D1 = FaderLo, D2..D3 = signed fader level.
- id: arbitration_status
label: Arbitration Status
type: object
description: |
Length 5: D0..D3 = AudioID, D4 = owning DeviceID (0x00 = no owner, 0x40..0x60 = owning device).
- id: metering_value_notification
label: Metering Value Notification
type: object
description: |
Length 6. D0 = Leveldetect index, D1 = Correlation -100..0..100 (-1.00..1.00),
D2..D3 = LevelL dB, D4..D5 = LevelR dB (signed short).
- id: motorfader_touched
label: Motorfader Touched (unsolicited)
type: object
description: |
Length 2. D0 = ChannelNr 0x01..0xFA, D1 = 1 touched / 0 released.
Emitted by device when motorized faders touched.
- id: ack_nak
label: Serial ACK/NAK
type: enum
values: [ack, nak]
description: ACK=0x06, NAK=0x05 per serial block protocol. Must be received within 80 ms.
- id: param_value_information_cf_input
label: CF Input Parameter Value Information
type: object
description: Length 8 with CFIn prefix 0x0024 and32-bit parameter value.
- id: param_value_information_cf_output
label: CF Output Parameter Value Information
type: object
description: Length 8 with CFOut prefix 0x0025 and 32-bit parameter value.
Variables
# Continuously settable parameter commands already enumerated as actions.
# No additional standalone settable variables beyond those.
Events
# Cross-reference to unsolicited/notification feedbacks above.
- id: crosspoint_change
description: Triggered on internal routing change when 32-bit notification activated (TCP only).
- id: fader_value_change
description: Triggered when fader value changes and notification activated.
- id: meter_level_change
description: Triggered when metering level changes and notification activated.
- id: motorfader_touch
description: Triggered when user touches motorized fader (if installed).
Macros
# No multi-step sequences described explicitly in source.
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source notes arbitration ownership not enforced by firmware ("routings are always possible even if an Device ID is set"); IO Gain changes "valid until restart" - these are advisory, not safety interlock procedures.
Notes
- ECP deprecated from firmware 10.2; Control API recommended for XC3/XD3/XS3 generations.
- 32-bit routing (0x01F5xxxx len 8) recommended on 52/XS/XC/XD/XS2/XC2/XD2 hardware; 16-bit form acceptable for older RM4200D/XR.
- 32-bit AudioID format differs between RM4200D/XR (Version 1) and 52/XS/XC/XD (Version 2). AudioIDs must be exported from project TB5/TB8 configuration.
- Serial block: STX=0x02, EOT=0x08, DLE=0x0A, ACK=0x06, NAK=0x05. Bytes 0x00..0x1F escaped as DLE,(byte+0x20). Checksum = iterative (Byte XOR 0xAA), shifted left 1 each step, 8-bit.
- IP block always 16 bytes; data MSB-first (Motorola format). Reserved U0/U1/U2 bytes zero on transmit.
- Up to 10 TCP sockets per device (max 4 on RM420-850 fw05.05.27..05.06.01; max 5 until fw 7.04.06).
- Notification/activation commands are TCP-only (crosspoint notification).
Provenance
source_domains:
- developer.dhd.audio
source_urls:
- https://developer.dhd.audio/docs/API/ECP/
- https://developer.dhd.audio/docs/API/ECP/commands
- https://developer.dhd.audio/docs/API/ECP/communication
- https://developer.dhd.audio/
retrieved_at: 2026-08-18T00:04:37.967Z
last_checked_at: 2026-08-19T09:18:57.686Z
Verification Summary
verdict: verified
checked_at: 2026-08-19T09:18:57.686Z
matched_actions: 45
action_count: 45
confidence: medium
summary: "All 45 spec actions map to verbatim source commands with matching ID, length, and parameter shape; transport is verbatim. (3 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "source states ECP availability per firmware version but does not state firmware version of this RM420-027 device itself."
- "source notes arbitration ownership not enforced by firmware (\"routings are always possible even if an Device ID is set\"); IO Gain changes \"valid until restart\" - these are advisory, not safety interlock procedures."
- "firmware version of the RM420-027 instance; electrical specs of RS-232/RS-422 interfaces (per source, see module documentation)."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0