Wiznet makers

Lihan__

Published April 17, 2026 ©

67 UCC

8 WCC

3 VAR

0 Contests

0 Followers

0 Following

Original Link

edge bmd atem

no_std Rust library implementing Blackmagic ATEM UDP/BURP protocol for Embassy-based embedded systems. Enables MCUs with W5500 Ethernet to control professional

COMPONENTS
PROJECT DESCRIPTION

[English Version]

edge-bmd-atem — Controlling Professional Video Switchers from Embedded Rust

#W5500 #Rust #Embassy #ATEM #BlackmagicDesign #NoStd #EdgeNet #LiveProduction #VideoSwitcher


01 — What is this project?

ATEM Mini | Blackmagic Design
Blackmagic ATEM

Blackmagic Design ATEM switchers are the dominant professional video switchers in live production — broadcasts, concerts, churches, corporate events, esports. They are controlled over UDP port 9910 using a proprietary protocol called BURP (Blackmagic UDP Remote Protocol), which has been reverse-engineered by the open-source community.

Normally, controlling an ATEM requires a PC running Blackmagic's SDK or third-party software. This project brings ATEM control to embedded microcontrollers running Rust — no PC, no Linux, just a microcontroller with Ethernet connected to the same LAN as the ATEM switcher.

edge-bmd-atem is a #![no_std] Rust library that implements the ATEM UDP/BURP protocol for the Embassy async embedded runtime and edge-net networking stack. The repository includes a standalone Embassy firmware example explicitly targeting RP2040 + W5500 — confirmed directly in the commit: "Add standalone Embassy firmware at examples/rp2040_w5500 (DHCP, UDP handshake)."


02 — What is the ATEM protocol?

ATEM switchers expose a UDP-based control interface on port 9910. The protocol (sometimes called BURP — Blackmagic UDP Remote Protocol) is not officially documented by Blackmagic but has been thoroughly reverse-engineered.

The protocol structure:

ATEM Packet Header (12 bytes)
  ├─ Flags (2 bits)
  ├─ Packet Length
  ├─ Session ID
  ├─ Echo Data
  └─ Packet ID
 ATEM Commands (variable)
  ├─ Command length
  ├─ Command name (4 ASCII chars, e.g. "CPvI" = Cut Preview Input)
  └─ Command payload

A controller sends command packets; the ATEM responds with state updates. The connection uses a session/handshake mechanism — AtemSession::connect in this library handles that flow.


03 — Implemented ATEM BURP atoms

The second commit confirms the following ATEM command atoms are implemented in the library:

AtomFull nameAction
DAutDoTransitionAutoExecute Auto transition
DCutDoTransitionCutExecute Cut (immediate swap)
CTTpChangeTransitionNextSet transition style (Mix/Dip/Wipe/DVE/Sting)
CPvIChangePreviewInputSet preview bus input source
CPgIChangeProgramInputSet program bus input source
FtbAFadeToBlackAutoFade to black using configured FTB rate
FCutCutToBlackCut program to/from black

The RP2040 + W5500 example demonstrates a real control sequence:

  1. Connect to ATEM via DHCP on W5500
  2. Complete session handshake (InCm)
  3. Send CTTp to set transition style
  4. Optionally send CPvI / CPgI to change preview/program inputs
  5. Send periodic DAut (Auto transition every N seconds)
  6. Optionally send one-shot FtbA after a configurable delay

04 — System architecture

[Live Production Environment]
  ATEM Video Switcher (UDP port 9910)
        ↕  LAN / Ethernet
[MCU running Embassy + edge-net]
  ├─ edge-bmd-atem library
  │    ├─ AtemPacket::decode / write_into
  │    └─ AtemSession::connect
  ├─ W5500 Ethernet (via embassy-net + edge-nal)
  └─ Application logic
       (button triggers, automation, tally lights, etc.)

The MCU connects to the ATEM switcher via Ethernet. W5500 provides the physical Ethernet interface, managed by the Embassy async runtime. The edge-bmd-atem library sits on top, handling ATEM packet encoding/decoding and session management.


04 — Why W5500 + Embassy for this?

🔷 Live production requires deterministic, low-latency networking

A video switcher in a live broadcast cannot tolerate dropped commands or delayed responses. WiFi has variable latency and can drop packets. W5500 wired Ethernet provides stable, low-latency connectivity — critical when a button press needs to trigger a cut or transition in real time.

🔷 no_std + Embassy = MCU-native async networking

Embassy is the async embedded Rust runtime — it enables async/await programming on microcontrollers without an OS. edge-net provides a networking abstraction layer that works with Embassy. W5500 integrates into this stack via embassy-net and related crates.

The #![no_std] design means the library runs on any Embassy-compatible MCU — RP2040, STM32, nRF52, ESP32-S3 — as long as it has W5500 Ethernet attached.

🔷 ATEM protocol is UDP — W5500 handles it natively

The ATEM protocol uses UDP, not TCP. W5500's hardware socket abstraction handles UDP natively — sending and receiving UDP datagrams on port 9910 with minimal CPU overhead. The library's UdpSend, UdpReceive, and UdpReceiveBounded traits map directly to W5500's socket model.


05 — Key components

📦 edge-bmd-atem library

#![no_std] + alloc Rust crate. Three layers: UDP I/O traits (UdpSend, UdpReceive, UdpReceiveBounded), packet codec (AtemPacket::decode / write_into), and session helper (AtemSession::connect). Works with any edge-nal 0.6 compatible UDP stack.

⚡ Embassy async runtime

The leading async embedded Rust framework. Enables async/await on bare-metal MCUs without an OS. Handles task scheduling, timers, and I/O multiplexing. UdpReceiveBounded is typically implemented as select(recv, timer) — Embassy's select makes this clean and efficient.

🌐 edge-net / edge-nal

Networking abstraction layer for embedded Rust. Defines traits for UDP, TCP, and DNS that hardware drivers (W5500, WiFi chips) implement. This library targets edge-nal 0.6 — wrapping embassy-net types in a newtype and delegating is the recommended integration pattern.

🌐 WIZnet W5500

The Ethernet hardware. Provides UDP socket I/O to the Embassy + edge-net stack. When a command needs to be sent to the ATEM (change input, fire transition, set tally), the MCU writes to W5500's hardware socket buffer and the packet goes out over the LAN to the ATEM.


06 — Application scenarios

01. Custom ATEM hardware controller

Build a physical control surface with buttons, faders, and tally lights that controls an ATEM switcher directly from an MCU — no PC in the signal path. W5500 connects the controller to the production LAN. #LiveProduction #ATEM #HardwareController

02. Tally light system

ATEM switchers output tally information (which input is live, which is preview) via the same protocol. An MCU subscribed to ATEM state updates can drive tally lights on cameras, letting operators know which camera is live. #TallyLight #Broadcast #Camera

03. Broadcast automation

Trigger ATEM transitions and input switches based on external events — timecode signals, OSC messages, GPIO triggers, or serial commands. A small MCU with W5500 becomes a hardware automation device for live production workflows. #Automation #Broadcast #Timecode

04. Embedded streaming controller

Combine ATEM control with streaming management for a fully embedded production controller that handles input switching, transitions, and stream start/stop from a single MCU. #Streaming #Production #Embedded

05. Church / esports / event production

Venues that run ATEM switchers but don't want a full PC for automation can use an MCU controller. Lower cost, lower power, simpler deployment — a W5500 + MCU running this library handles what previously required a laptop. #Church #Esports #EventProduction


Conclusion

Professional video switcher control from a microcontroller — no PC, no Linux, just Embassy + W5500.

The ATEM UDP/BURP protocol is reverse-engineered territory. edge-bmd-atem packages that reverse-engineered protocol knowledge into a clean, #![no_std] Rust library that runs on any Embassy-capable MCU with W5500 Ethernet.

The result: a microcontroller that connects to the same LAN as an ATEM switcher can control it in real time — switching inputs, firing transitions, reading tally state — with deterministic W5500 UDP socket performance and zero OS overhead.

  • #![no_std] — runs on bare-metal MCUs
  • ✅ Embassy async runtime compatible
  • ✅ edge-nal 0.6 UDP trait abstraction
  • ✅ ATEM packet codec (AtemPacket::decode / write_into)
  • ✅ Session handshake management (AtemSession::connect)
  • ✅ W5500 Ethernet for stable LAN connectivity
  • ✅ Apache-2.0 licensed

Q&A

Q. What is Blackmagic ATEM? A series of professional video switchers made by Blackmagic Design. Used in live broadcasts, concert productions, esports events, houses of worship, and corporate events to switch between multiple video sources in real time. The ATEM Mini (entry-level) starts around $300; the ATEM Constellation 8K (high-end) runs tens of thousands of dollars.

Q. What is BURP? Blackmagic UDP Remote Protocol — the informal name for the ATEM control protocol. It runs over UDP port 9910 and has been reverse-engineered by the community (notably Skaarhoj and the openswitcher.org project). Blackmagic does not officially document it, though they publish an SDK for Windows/Mac.

Q. What is Embassy? An async embedded Rust framework. It enables async/await programming on microcontrollers without an operating system. It handles cooperative multitasking, hardware abstraction, and I/O multiplexing. Combined with W5500 Ethernet, it provides a complete embedded networking stack in pure Rust.

Q. Why UDP instead of TCP for ATEM control? Blackmagic designed the ATEM protocol as UDP for low latency. The protocol implements its own session management and reliability on top of UDP (similar to how QUIC or RTP work). The AtemSession handles handshake and packet acknowledgment at the application layer.

Q. What MCUs work with this library? Any Embassy-compatible MCU with W5500 Ethernet attached: RP2040 (Raspberry Pi Pico), STM32 family, nRF52 series, ESP32-S3, and others. The #![no_std] design means the library itself has no platform dependency — only the Embassy + edge-nal integration layer needs to be ported.



[한글 버전]

edge-bmd-atem — 임베디드 Rust로 전문 영상 스위처 제어하기

#W5500 #Rust #Embassy #ATEM #BlackmagicDesign #NoStd #EdgeNet #라이브프로덕션 #영상스위처


01 — 이 프로젝트는 무엇인가?

ATEM Mini | Blackmagic Design
Blackmagic ATEM

Blackmagic Design ATEM 스위처는 라이브 프로덕션 — 방송, 콘서트, 교회, 기업 행사, e스포츠 — 에서 지배적인 전문 영상 스위처입니다. UDP 포트 9910에서 BURP(Blackmagic UDP Remote Protocol)라는 독점 프로토콜로 제어하며, 오픈소스 커뮤니티가 역공학으로 분석했습니다.

보통 ATEM 제어에는 Blackmagic SDK나 서드파티 소프트웨어를 실행하는 PC가 필요합니다. 이 프로젝트는 ATEM 제어를 Rust로 동작하는 임베디드 마이크로컨트롤러로 가져옵니다 — PC 없음, Linux 없음, 그냥 이더넷이 달린 MCU만으로 ATEM 스위처와 같은 LAN에 연결합니다.

edge-bmd-atem은 Embassy 비동기 임베디드 런타임과 edge-net 네트워킹 스택을 위한 ATEM UDP/BURP 프로토콜을 구현한 #![no_std] Rust 라이브러리입니다. 레포지토리에는 RP2040 + W5500을 명시적으로 타겟으로 한 독립형 Embassy 펌웨어 예제가 포함되어 있습니다 — 커밋에 직접 확인됩니다: "Add standalone Embassy firmware at examples/rp2040_w5500 (DHCP, UDP handshake)."


02 — ATEM 프로토콜이란?

ATEM 스위처는 포트 9910에서 UDP 기반 제어 인터페이스를 제공합니다. 프로토콜은 Blackmagic이 공식 문서화하지 않았지만 커뮤니티가 철저히 역공학으로 분석했습니다.

프로토콜 구조:

 
ATEM 패킷 헤더 (12바이트)
  ├─ 플래그 (2비트)
  ├─ 패킷 길이
  ├─ 세션 ID
  ├─ 에코 데이터
  └─ 패킷 ID
 ATEM 커맨드 (가변)
  ├─ 커맨드 길이
  ├─ 커맨드 이름 (4 ASCII 문자, 예: "CPvI" = Cut Preview Input)
  └─ 커맨드 페이로드

컨트롤러가 커맨드 패킷을 보내면 ATEM이 상태 업데이트로 응답합니다. 연결은 세션/핸드셰이크 메커니즘을 사용합니다 — 이 라이브러리의 AtemSession::connect가 그 흐름을 처리합니다.


03 — 구현된 ATEM BURP 커맨드

두 번째 커밋에서 라이브러리에 구현된 ATEM 커맨드 atom 목록이 확인됩니다:

Atom전체 이름동작
DAutDoTransitionAutoAuto 트랜지션 실행
DCutDoTransitionCutCut 실행 (즉시 전환)
CTTpChangeTransitionNext트랜지션 스타일 설정 (Mix/Dip/Wipe/DVE/Sting)
CPvIChangePreviewInput프리뷰 버스 입력 소스 변경
CPgIChangeProgramInput프로그램 버스 입력 소스 변경
FtbAFadeToBlackAuto설정된 FTB 속도로 페이드 투 블랙
FCutCutToBlack프로그램을 블랙으로/에서 컷

RP2040 + W5500 예제는 실제 제어 시퀀스를 보여줍니다:

  1. W5500 DHCP로 ATEM에 연결
  2. 세션 핸드셰이크 완료 (InCm)
  3. CTTp로 트랜지션 스타일 설정
  4. 선택적으로 CPvI / CPgI로 프리뷰/프로그램 입력 변경
  5. 주기적 DAut 전송 (N초마다 Auto 트랜지션)
  6. 선택적으로 설정 가능한 딜레이 후 원샷 FtbA 전송

04 — 시스템 구조

[라이브 프로덕션 환경]
  ATEM 영상 스위처 (UDP 포트 9910)
        ↕  LAN / 이더넷
[Embassy + edge-net으로 동작하는 MCU]
  ├─ edge-bmd-atem 라이브러리
  │    ├─ AtemPacket::decode / write_into
  │    └─ AtemSession::connect
  ├─ W5500 이더넷 (embassy-net + edge-nal 통해)
  └─ 애플리케이션 로직
       (버튼 트리거, 자동화, 탈리 라이트 등)

MCU가 이더넷으로 ATEM 스위처에 연결합니다. W5500이 물리적 이더넷 인터페이스를 제공하고 Embassy 비동기 런타임이 관리합니다. edge-bmd-atem 라이브러리가 그 위에서 ATEM 패킷 인코딩/디코딩과 세션 관리를 처리합니다.


04 — 왜 W5500 + Embassy인가?

🔷 라이브 프로덕션은 결정론적, 저지연 네트워킹이 필요하다

라이브 방송의 영상 스위처는 드롭된 커맨드나 지연된 응답을 허용할 수 없습니다. WiFi는 가변 지연이 있고 패킷을 드롭할 수 있습니다. W5500 유선 이더넷이 안정적이고 저지연 연결을 제공합니다 — 버튼 누름이 실시간으로 컷이나 트랜지션을 트리거해야 할 때 결정적입니다.

🔷 no_std + Embassy = MCU 네이티브 비동기 네트워킹

Embassy는 비동기 임베디드 Rust 런타임 — OS 없이 마이크로컨트롤러에서 async/await 프로그래밍을 가능하게 합니다. edge-net이 Embassy와 함께 동작하는 네트워킹 추상화 레이어를 제공합니다. W5500이 embassy-net과 관련 크레이트를 통해 이 스택에 통합됩니다.

#![no_std] 설계로 라이브러리가 W5500 이더넷이 연결된 모든 Embassy 호환 MCU에서 동작합니다 — RP2040, STM32, nRF52, ESP32-S3 등.

🔷 ATEM 프로토콜은 UDP — W5500이 네이티브로 처리

ATEM 프로토콜은 TCP가 아닌 UDP를 사용합니다. W5500의 하드웨어 소켓 추상화가 UDP를 네이티브로 처리합니다 — 포트 9910에서 최소 CPU 오버헤드로 UDP 데이터그램을 송수신합니다. 라이브러리의 UdpSend, UdpReceive, UdpReceiveBounded 트레이트가 W5500의 소켓 모델에 직접 매핑됩니다.


05 — 핵심 구성 요소

📦 edge-bmd-atem 라이브러리

#![no_std] + alloc Rust 크레이트. 세 레이어: UDP I/O 트레이트(UdpSend, UdpReceive, UdpReceiveBounded), 패킷 코덱(AtemPacket::decode / write_into), 세션 헬퍼(AtemSession::connect). edge-nal 0.6 호환 UDP 스택이면 모두 동작합니다.

⚡ Embassy 비동기 런타임

선도적인 비동기 임베디드 Rust 프레임워크. OS 없이 베어메탈 MCU에서 async/await를 가능하게 합니다. UdpReceiveBounded는 보통 select(recv, timer)로 구현합니다 — Embassy의 select가 이를 깔끔하고 효율적으로 만듭니다.

🌐 edge-net / edge-nal

임베디드 Rust용 네트워킹 추상화 레이어. 하드웨어 드라이버(W5500, WiFi 칩)가 구현하는 UDP, TCP, DNS 트레이트를 정의합니다. 이 라이브러리는 edge-nal 0.6을 대상으로 합니다 — embassy-net 타입을 뉴타입으로 감싸고 위임하는 방식이 권장 통합 패턴입니다.

🌐 WIZnet W5500

이더넷 하드웨어. Embassy + edge-net 스택에 UDP 소켓 I/O를 제공합니다. ATEM에 커맨드를 보내야 할 때(입력 전환, 트랜지션 실행, 탈리 설정), MCU가 W5500의 하드웨어 소켓 버퍼에 쓰면 패킷이 LAN을 통해 ATEM으로 전달됩니다.


06 — 응용 시나리오

01. 커스텀 ATEM 하드웨어 컨트롤러

버튼, 페이더, 탈리 라이트가 달린 물리적 컨트롤 서페이스를 만들어 MCU에서 직접 ATEM 스위처를 제어합니다 — 신호 경로에 PC 없음. W5500이 컨트롤러를 프로덕션 LAN에 연결합니다. #라이브프로덕션 #ATEM #하드웨어컨트롤러

02. 탈리 라이트 시스템

ATEM 스위처는 동일한 프로토콜로 탈리 정보(어느 입력이 라이브인지, 어느 것이 프리뷰인지)를 출력합니다. ATEM 상태 업데이트를 구독하는 MCU가 카메라의 탈리 라이트를 구동해 어느 카메라가 라이브인지 오퍼레이터에게 알려줄 수 있습니다. #탈리라이트 #방송 #카메라

03. 방송 자동화

외부 이벤트 — 타임코드 신호, OSC 메시지, GPIO 트리거, 시리얼 커맨드 — 를 기반으로 ATEM 트랜지션과 입력 전환을 트리거합니다. W5500이 달린 소형 MCU가 라이브 프로덕션 워크플로를 위한 하드웨어 자동화 기기가 됩니다. #자동화 #방송 #타임코드

04. 교회 / e스포츠 / 이벤트 프로덕션

ATEM 스위처를 운영하지만 자동화를 위한 풀 PC를 원하지 않는 현장이 MCU 컨트롤러를 사용할 수 있습니다. 더 낮은 비용, 낮은 전력, 간단한 배포 — 이 라이브러리를 실행하는 W5500 + MCU가 이전에 노트북이 필요했던 것을 처리합니다. #교회 #이스포츠 #이벤트프로덕션


결론

전문 영상 스위처 제어를 마이크로컨트롤러에서 — PC 없음, Linux 없음, Embassy + W5500만.

ATEM UDP/BURP 프로토콜은 역공학 영역입니다. edge-bmd-atem은 그 역공학 프로토콜 지식을 W5500 이더넷이 달린 모든 Embassy 가능 MCU에서 동작하는 깔끔한 #![no_std] Rust 라이브러리로 패키징했습니다.

결과: ATEM 스위처와 동일한 LAN에 연결된 마이크로컨트롤러가 실시간으로 제어할 수 있습니다 — 입력 전환, 트랜지션 실행, 탈리 상태 읽기 — 결정론적 W5500 UDP 소켓 성능과 OS 오버헤드 없이.

  • #![no_std] — 베어메탈 MCU에서 동작
  • ✅ Embassy 비동기 런타임 호환
  • ✅ edge-nal 0.6 UDP 트레이트 추상화
  • ✅ ATEM 패킷 코덱 (AtemPacket::decode / write_into)
  • ✅ 세션 핸드셰이크 관리 (AtemSession::connect)
  • ✅ 안정적인 LAN 연결을 위한 W5500 이더넷
  • ✅ Apache-2.0 라이선스

Q&A

Q. Blackmagic ATEM이란 무엇인가요? Blackmagic Design이 만든 전문 영상 스위처 시리즈입니다. 라이브 방송, 콘서트 프로덕션, e스포츠 이벤트, 교회, 기업 행사에서 여러 영상 소스를 실시간으로 전환하는 데 사용됩니다. ATEM Mini(입문형)는 약 $300부터 시작하고 ATEM Constellation 8K(고급형)는 수만 달러입니다.

Q. BURP란 무엇인가요? Blackmagic UDP Remote Protocol — ATEM 제어 프로토콜의 비공식 이름입니다. UDP 포트 9910에서 동작하며 커뮤니티(특히 Skaarhoj와 openswitcher.org 프로젝트)가 역공학으로 분석했습니다. Blackmagic이 공식 문서화하지 않지만 Windows/Mac용 SDK는 제공합니다.

Q. Embassy란 무엇인가요? 비동기 임베디드 Rust 프레임워크입니다. 운영체제 없이 마이크로컨트롤러에서 async/await 프로그래밍을 가능하게 합니다. 협력적 멀티태스킹, 하드웨어 추상화, I/O 멀티플렉싱을 처리합니다. W5500 이더넷과 결합하면 순수 Rust로 완전한 임베디드 네트워킹 스택을 제공합니다.

Q. ATEM 제어에 TCP 대신 왜 UDP를 쓰나요? Blackmagic이 저지연을 위해 ATEM 프로토콜을 UDP로 설계했습니다. 프로토콜은 UDP 위에 자체 세션 관리와 신뢰성을 구현합니다(QUIC나 RTP처럼). AtemSession이 애플리케이션 레이어에서 핸드셰이크와 패킷 확인 응답을 처리합니다.

Q. 어떤 MCU에서 동작하나요? W5500 이더넷이 연결된 모든 Embassy 호환 MCU: RP2040(Raspberry Pi Pico), STM32 패밀리, nRF52 시리즈, ESP32-S3 등. #![no_std] 설계로 라이브러리 자체에 플랫폼 의존성이 없습니다 

Documents
Comments Write