Files
azeron-cyborg-linux/docs/protocol.md

6.0 KiB

Azeron Configuration Protocol Documentation

Overview

This document describes the USB configuration protocol for the Azeron Cyborg keypad (USB ID: 16d0:113c). The protocol has been reverse-engineered through USB traffic analysis and is now implemented in libazeron.

Protocol Status: Fully Reverse-Engineered
Implementation Status: Implemented in libazeron

USB Device Analysis

Device Descriptor Summary

  • Vendor ID: 0x16d0 (MCS)
  • Product ID: 0x113c (Azeron Keypad)
  • Configuration: 1 configuration, 5 interfaces
  • Power: 500mA (bus-powered)

Interface Breakdown

  1. Interface 0: Vendor-specific (0xFF)

    • Endpoints: 0x81 (IN), 0x01 (OUT)
    • Purpose: Unused for configuration
    • Status: Not utilized by Azeron software
  2. Interface 1: HID

    • Endpoint: 0x82 (IN)
    • Purpose: Main button input (30 buttons)
    • Packet size: 16 bytes
  3. Interface 2: HID Boot Mouse

    • Endpoint: 0x83 (IN)
    • Purpose: Mouse emulation
    • Packet size: 7 bytes
  4. Interface 3: HID

    • Endpoint: 0x84 (IN)
    • Purpose: Analog stick input
    • Packet size: 16 bytes
  5. Interface 4: HID with IN/OUT

    • Endpoints: 0x85 (IN), 0x06 (OUT)
    • Purpose: Configuration interface
    • Packet size: 64 bytes
    • Protocol: Custom HID reports

Configuration Protocol

Protocol Characteristics

  • Interface Used: Interface 4 (endpoints 0x06 OUT, 0x85 IN)
  • Transfer Type: Interrupt transfers (0x01)
  • Packet Format: Fixed 64-byte HID reports
  • Command Structure: Request-response pattern
  • Endianness: Little-endian for offsets and delays, Big-endian for Command IDs.

Packet Format

All configuration packets follow this structure:

Byte 0:    Flags/Type (0x00=request, 0x01=response)
Byte 1:    Reserved/Length (0x3a for config writes)
Bytes 2-3: Command ID (big-endian)
Bytes 4-5: Operation type and parameters
Bytes 6-63: Data payload (varies by command)

Command Reference (Cyborg Model)

0x122a - Get Status (Heartbeat)

Purpose: Periodic device status check. Returns current profile configuration.

  • Payload Index 0: Status (0x01 = Success)
  • Payload Index 1: Active Profile ID (0, 1, 2)
  • Payload Index 3: Joystick Mode
  • Payload Index 8: Stick Angle
  • Payload Index 10: Deadzone
  • Payload Index 11: Response Curve
  • Payload Index 12: Sensitivity
  • Payload Index 13: Inversion flags (Bit 0: X, Bit 1: Y)

0x2000 - Set Global Settings

Purpose: Configure timing delays for actions.

  • Bytes 54-55 (Payload): Long Press Delay (ms, little-endian, e.g., f401 = 500ms)
  • Bytes 56-57 (Payload): Double Press Delay (ms, little-endian, e.g., c800 = 200ms)

0x20F6 - Set Single Press

0x20F8 - Set Long Press

0x204A - Set Double Press

Purpose: Surgical update for a specific button action.

  • Byte 10 (Payload): Button ID (0-based)
  • Byte 22 (Payload): Key Type (0xf0 = Keyboard)
  • Byte 23 (Payload): Key Code (HID)

0x204B - Commit Button Changes

Purpose: Makes surgical updates (0x20F6/F8/4A) active.

0x26EC - Bulk Write Profile

Purpose: Writes a complete profile block.

  • Byte 3 (Payload): Joystick Mode (0x00=Analog, 0x01=WASD4, 0x02=WASD8, 0x03=Mouse)
  • Byte 8 (Payload): Stick Angle (0-255)
  • Byte 10 (Payload): Deadzone (0-100)

0x26ED - Commit Bulk Write

Purpose: Persists bulk changes to EEPROM.

Command Reference (Classic Model)

Note: These commands are used by older Azeron versions and may differ from Cyborg.

0x12C8 - Read Configuration

Purpose: Read full device configuration.

0x26FB - Read Configuration (Cyborg)

Purpose: Read specific memory blocks.

Button Mapping Reference

The Azeron Cyborg has 30 configurable buttons plus 1 analog joystick.

Button Numbering

Buttons are numbered 1-30 in the configuration data. Each button has 3 actions (Single, Long, Double), each 4 bytes.

  • Profile Offset 8-11: Button 1 Single
  • Profile Offset 12-15: Button 1 Long
  • Profile Offset 16-19: Button 1 Double
  • ... (continues linearly)

Key Type Codes

Code Type Description
0xf0 Keyboard Standard keyboard key
0xf1 Mouse Mouse button/wheel
0xf2 Gamepad Gamepad button/axis
0xf3 Macro Macro sequence
0xf4 Media Media control key
0xf5 Layer Layer switch

Analog Joystick Configuration

The analog joystick is configured separately from the 30 buttons.

Joystick Profile Data (Indices relative to payload start):

Index 3:  Joystick Mode (0x00=Analog, 0x01=WASD4, 0x02=WASD8, 0x03=Mouse)
Index 8:  Stick Angle (0-255)
Index 10: Dead zone (0-100%)
Index 11: Sensitivity curve (0=linear, 1=exponential, etc.)
Index 12: Sensitivity (0-100)
Index 13: Inversion flags (Bit 0: X, Bit 1: Y)

Profile Management

The device supports 3 profiles (Profile 0, 1, 2).

Active Profile Indication

The currently active profile is indicated in status responses:

  • Byte 1 of payload: Active profile number
  • LED color changes to profile-specific color

Implementation Checklist

  • Implement 64-byte HID report parser
  • Create command builder for 0x122a, 0x26FB, 0x26EC, 0x26ED
  • Parse button mapping data (30 buttons x 3 actions)
  • Parse joystick configuration (mode, angle, deadzone, etc)
  • Implement profile read/write/save operations
  • Add support for all key types (keyboard, mouse, gamepad)
  • Handle modifier flags
  • Create profile management functions
  • Add analog stick mode switching
  • Implement LED color control

Safety Notes

  • Always test with backup configurations
  • Be prepared to reset device to factory defaults
  • Don't send malformed packets to device
  • Monitor device temperature during testing
  • Stop if device behaves unexpectedly
  • Keep original configuration files as backup

Acknowledgments

Special thanks to the Azeron community for providing captures and testing assistance during the reverse engineering process.