VKBDevCfg // Explained

Pilot's guide // using the vendor tool

VKBDevCfg Explained

VKB makes excellent flight-sim hardware and then ships it with a configuration program that was clearly written by the same person who names sticks Gladiator EVO. This page is an attempt to make it legible.

Built on the “VKBDevCfg Basics” walkthrough by DCS Tutorial and VKB's NJoy32 User Guide v2.19; credits and links at the bottom.

#What this program is

VKBDevCfg is the Windows program that configures VKB joysticks, throttles and grips. It decides which physical button becomes which button in your flight sim, what colour an LED is, how an axis behaves, and what a thumb button does when you hold a shift key. It also flashes firmware onto the stick and calibrates its axes.

It does three jobs

Configure the stick · flash firmware · run self-tests and calibration.

It has two halves

A small toolbar across the top, and a large tabbed work area underneath.

It only talks to one stick at a time

You pick a device at the top, then everything below applies to that device.

#What to download

VKB's site is vkbsimcontrollers.com/pages/downloads. Three downloads matter:

Get thisWhat it isDo you need it?
VKBDevCfg-CThe configuration program itself.Yes — this is the tool.
ZBootloader2Flashes firmware onto the microcontroller.Yes, if you ever need to update or recover.
v2_20_C (firmware pack)The actual firmware images, one .vkb file per stick model.Yes — ZBootloader flashes from these.
VKB_BtnTester / VKB_JoyTesterMinimal standalone test programs.Optional, but handy for proving a stick works before you blame the config tool.
Tip

Extract the firmware pack into its own folder. It is ~66 files split by generation and model, and you want to go straight to your stick. Naming is consistent: __BlackMamba_v2_20_C.vkb, __KingCobra_v2_20_C.vkb, and so on.

#Unlocking the full UI

VKBDevCfg hides part of its own interface: macros, LEDs, the virtual mouse and several options. A text file the program creates for itself, zconfig.ini, switches them on.

The procedure

  1. Open VKBDevCfg once, then close it. On first run it writes zconfig.ini into its own folder, next to the executable. If the file never appears, the program did not actually launch.
  2. Open zconfig.ini in a plain text editor. Keep it plain text.
  3. Add the lines below under the matching [User] and [Common] sections. The program does not create them for you.
  4. Save, and restart VKBDevCfg.
; under [User]
User=Developer
PartialWrite=1
PartialCalibration=1

; under [Common]
Use matrix=1
Test Misc Enabled=1

Spell the keys exactly, spaces included. Those five are the ones most people want; the full list of keys the manual documents (Appendix I plus the chapters on writing parameters and calibration) is:

SectionParameterEffect
[User]User=DeveloperUnlocks Macros, LEDs and virtual mouse, which are hidden from normal users entirely.
[User]PartialWrite=1Adds Partial Write: pressing Set shows a dialog where you tick which parameter groups to send, instead of pushing everything.
[User]PartialCalibration=1Adds Partial Calibration: pick exactly which axes to calibrate.
[User]ForcedWriteID=1Lets you load a profile saved for a different firmware version.
[User]Profile N= <name>Named profiles. Repeat with N = 1, 2, 3… then enter the ID in the Profile ID field.
[Common]Use matrix=1Adds the Row / Col / Base fields on Global → External.
[Common]Test Misc Enabled=1Enables the Miscellaneous test sub-tab: MARS sensors and the LED tester.
[Common]PageControlTop=1/0Put the tab strip at the top or the bottom of the window.
[Common]SwapPL=1Swap the axes panels so Physical is above Logical.
[Common]Release_DI=1Keeps button and axis testing live after parameters are activated. Set to 0 if testing misbehaves.

#Firmware updates

Firmware is the code running on the stick's microcontroller. It is how you get bug fixes and new features: optional on a brand new device, increasingly important on an older one.

Via ZBootloader

  1. Run ZBootloader2.
  2. It lists every VKB device it can see. Double-click yours.
  3. Point it at the .vkb file for your exact model, in the folder you extracted the firmware pack into.
  4. Confirm it shows the version you expect — the version number is printed next to the file.
  5. Click Flash. It takes roughly 30 seconds, then closes itself.
From inside VKBDevCfg

Tools → Bootloader launches ZBootloader, so you do not have to run it separately. It is mostly useful for recovery.

VKBDevCfg shows the firmware version on your stick next to the device name in the blue bar at the top, so you can check whether an update is warranted before you flash anything.

Match the model, not the family

The firmware pack contains separate images per model and per hardware generation (1stGen/, …). Flashing the wrong image is the most destructive thing you can do with this toolchain. Check the filename against the model in VKBDevCfg's device list.

Firmware and saved profiles

A saved profile has to match the firmware version, and some firmware versions reset the stick's parameters to defaults. Save your configuration before flashing. To load a profile from a different version anyway, see ForcedWriteID under Unlocking the full UI.

#How it works

The program feels confusing because it makes you configure several different layers of “button” and “axis” separately. Once you see the layers, the rest follows.

The thing that changes everything

The stick does the processing; the program only edits settings. Shift hierarchies, relative axes, curve equalisation, macro timing and LED priority all run in firmware on the device. VKBDevCfg pushes a block of parameters into the stick and pulls it back out. That is why the tool is a plain grid of cells, and why a software remapper on the PC cannot reproduce the behaviour.

The unit is the “line”

“Button” is shorthand. The manual counts lines: every pair of contacts is one.

“Every pair of button contacts is represented as single line. So simple button occupies one line, toggle switch On–Off–On — two lines, 4-way HAT — 4. Njoy32 controller can process up to 128 lines.”

Lines are numbered by wiring and grouped eight to a register, Reg#1 … Reg#16. That is why the physical grid has 128 cells.

Four layers

Layer 1

Physical line

The wired contact or sensor. Numbers 1–128, fixed by the hardware: “the switch on pin 10 of my grip”. Test → Buttons / POVs shows you these numbers.

→
Layer 2

Physical function

What the line is: Button, ButAlt, Shift, SubShift, Toggle, Encoder, POV, Tempo, Generator… 26 types.

→
Layer 3

Logical line

The number Windows sees: “button 37 in DirectInput”. Defaults to the same number as the physical line. Any physical line can be mapped to any logical line.

→
Layer 4

Logical function

What the game receives: press, hat, keystroke, mouse, macro, media, system. 11 types.

You set each layer on its own, which is what makes the tool feel arbitrary. Not every physical function reaches layer 4: Shift has no logical function. It is a modifier, not an output.

The most common misunderstanding

People look for “where do I set button 5” and find nothing, because button 5 is a logical button and the thing they pressed is physical button 12. Know which layer you are in before you change a number.

Occupancy

Logical line numbers must be unique. The manual: “This number must NOT be the same with existing physical button line.” You can use an occupied number if you also reassign the button that holds it, for example moving a trigger from line 17 to line 1. The Virtual layer dialog shows occupied numbers in red and free ones in black.

Axes use the same split

Physical axes are raw sensor values straight off the gimbal. Logical axes are what Windows reports. Each logical axis names the physical axis feeding it (its Source), and one physical axis can feed several logical axes. On a default stick they match one to one, so leave them alone unless something is wrong. A controller handles at most eight axes.

Two gates on every axis: En and Vs

En (enabled) makes the stick compute the axis. Vs (visible) makes it show up in Windows. To use an axis in a game, tick both. An axis that is enabled but not visible still works inside the stick, driving Axes → Buttons, comparators or an LED gauge; that is how you turn axis movement into button presses without exposing the axis. Forgetting one box is the classic mistake.

Virtual controllers

Windows accepts at most 8 axes per controller. With more, enable virtual controllers (1–8) and assign each axis to one. Windows then sees each as a separate stick. The tool makes you do the assignment by hand.

Virtual buttons: the shifter example

A virtual button is a logical button with no switch behind it, triggered only by the firmware. It is how one physical input fans out into several logical buttons under different conditions.

  1. Your trigger is physical button 10. By default it drives logical button 10.
  2. You want trigger alone → logical button 79, and trigger + shift → logical button 80.
  3. Logical button 79 takes the trigger as its source. Logical button 80 has no switch left to drive it, so it is assigned to a virtual button.

One live configuration

The stick holds a single configuration; there are no slots. Get reads all of it whichever tab you are on. Your per-game profiles are .cfg files on the PC, not on the stick. See Get / Set / Save / Load.

#Anatomy of the window

Once you have picked a device, the window splits into two regions that people routinely confuse.

Top — the toolbar

Device selection, plus three tabs: Action, Tools, Settings. You use these constantly.

Bottom — the work area

Tabs for Test, Global, Profile and Macro. This is where the configuration lives.

Pick your device first

At the very top is a blue box listing every connected VKB device. Click yours; the app takes a second or two to read it, then shows its firmware version. Everything below applies only to the device you picked. With a stick and a throttle plugged in, you must switch between them.

#Get / Set / Save / Load

These four buttons cause more confusion than anything else in the program.

ButtonWhat it doesWhen you use it
Set Writes the settings currently shown in the software into the physical stick. After every change you want to keep. Changes in the UI are otherwise just a draft.
Get Reads the settings out of the stick back into the software. When what you see disagrees with what the stick is doing, e.g. after plugging in a stick configured on another machine.
Save Saves the current configuration to a file of your choosing. To keep a separate setup per game.
Load Loads a previously saved configuration file into the software. To switch between those per-game setups.
The single most common mistake

Changing a setting in the UI does nothing to the stick until you press Set. You change an LED to purple, look down at the stick, see it still yellow, and conclude the software is broken. It is not; you have not written the change down.

Per-game profiles

DCS, Microsoft Flight Simulator and Elite Dangerous all want different bindings, and the stick stores only one configuration, so keep one .cfg file per game:

  1. Configure everything for DCS. Save → name it DCS.cfg.
  2. Reconfigure for Elite Dangerous. Save → Elite.cfg.
  3. Before playing, Load the right file, then press Set to push it into the stick.

You can also drag a .cfg file from Explorer onto the VKBDevCfg window to load it.

Tip

Turn on Settings → Set After Load and loading a file writes it to the stick immediately. One less step, one less way to be confused.

#Top bar reference

Three tabs. Only some of what is on them matters day to day.

Action

ControlWhat it does
Device readoutShows which microcontroller is inside your stick (e.g. “VKB NJoy 32”). Purely informational.
RestartDisconnects and reconnects the controller. The first thing to try when a stick misbehaves or goes unresponsive.
GetPull settings out of the stick. See above.
SetPush settings into the stick. See above.
Save / LoadPer-game configuration files.
The daily drivers

Restart, Get, Set, Save, Load. You may never touch the rest of this tab.

#Test tab

For verifying hardware. It is read-mostly, so it is the safest place to poke around and the first place to look when something seems broken.

Info

Model name, version, firmware version. Nothing to configure. Use it to confirm you are editing the right device and running the firmware you think you are.

#Global tab

Settings that apply to the whole device rather than to one axis or button.

Common

  • Button count — how many buttons the device exposes to Windows.
  • POV / hat count — how many hat switches. Setting this to zero makes the hats disappear from Windows entirely.
  • Timing — debounce and timing behaviour per button.
  • Keyboard — enables a virtual keyboard, so a stick button can emit a keystroke. Tick Map, then choose Classic or Modified (Off disables it). A separate “HID Keyboard Device” then appears in Windows.
  • Mouse — the same idea for a virtual mouse: Off, Relative, Absolute or R+A. A mouse left always on can drift the cursor from small axis jitter.
Advice

Leave most of these at their defaults. They are easy to break and hard to diagnose.

#Profile tab

You will spend most of your time here. Axes, buttons, POVs and logical functions all live on it.

Axes — physical

Configuration of the raw axis signals, before they become logical axes.

SettingEffect
Sensor typeHow the sensor is read. Leave at default; changing it breaks the axis.
Virtual trimmerEnables a software trimmer for the axis.
Auto calibrationWhether the axis self-calibrates.
InvertFlips the axis direction.
Bias, %Shifts the centre point. The main fine-tuning control for “my axis is centred 2% off”.
Low / High limitsClamps the usable travel at each end.
Dynamic filteringSmoothing applied to the signal.
The most common fix

“My axis is slightly off-centre” is a bias problem, not a calibration problem. Adjust bias before you re-run calibration.

#Macro tab

A macro is a named sequence of actions: button presses, keystrokes and so on. The tab is hidden until you unlock the full UI. Two things to set up, in this order.

1. Define what the macro does

  1. Go to the Macro tab and select a macro number, e.g. macro 5.
  2. Add entries, e.g. “mouse right button” and the keyboard A key.
  3. Adjust timing in the same panel.
  4. Click Set.

2. Point a button at it

  1. Find the logical button you want to trigger it, e.g. logical button 80.
  2. In Buttons → Logical layer, set its action to Macro.
  3. Choose the macro number, e.g. macro 5. Tick Repeat if the macro should repeat while the button stays held.

Define the macro before you assign it, as the manual instructs. Pressing the stick button then replays the whole sequence.

Two arrays

The tab has Macros Array 1 and Macros Array 2 groups for working on ranges of macros: clear, fill, and Copy 1 to 2. Copying overwrites the current macro assignments.

#Recipes

Change an LED's colour

  1. Select your device in the blue bar at the top.
  2. Global → LEDs.
  3. Pick an event — usually Event 0 for the idle state.
  4. Choose the LED, set the mode, then pick the colour.
  5. Press Set. Look at the physical stick — it has changed.

Find out which physical button a switch is

  1. Test → Buttons / POVs.
  2. Press the switch on your stick.
  3. Read the number that lights up. Write it down.

Remap a button

  1. Find its physical number (recipe above).
  2. Profile → Buttons → Physical layer. Click that row.
  3. Set the function type — usually leave as Button.
  4. Set which logical button it drives — leave as Auto unless you have a reason.
  5. In the Logical layer, find that logical button and set what it does.
  6. Press Set.

Make a switch act as Shift

  1. Profile → Buttons → Physical layer.
  2. Find the switch's physical number and set its type to Shift.
  3. Press Set.
  4. Holding it should now modify what your other buttons do. Verify on the physical stick.

Set up a throttle-shift layer

  1. Make your shifter a Shift physical button.
  2. In the physical layer, set your trigger to drive logical button 79.
  3. Assign logical button 80 to a virtual button; it has no physical switch of its own.
  4. In the logical layer, give buttons 79 and 80 different actions.
  5. Set. Trigger alone → 79. Trigger + shift → 80.

Fix a stick that has gone unresponsive

  1. Press Restart in the Action tab. This is the cheap fix.
  2. Still stuck? Replug the USB cable.
  3. Still stuck? Tools → Default resets everything to factory settings. This loses your configuration, so save it first if you have one.
  4. Still stuck? Tools → Bootloader and reflash the firmware.

Keep separate setups per game

  1. Configure for game A. Save → GameA.cfg.
  2. Configure for game B. Save → GameB.cfg.
  3. Before playing, Load the right file.
  4. Press Set, or turn on Settings → Set After Load and skip it.

#Gotchas

The things that reliably waste people's time.

You forgot Set

Nothing you change in the UI reaches the hardware until you press Set. By far the most common confusion.

Physical ≠ logical

You are editing a logical button; the switch you pressed is a physical button. They are different numberings connected by a table you must set deliberately.

Two layers on the Buttons screen

Set what the switch does on the physical layer and what the game receives on the logical layer. Doing only one changes nothing.

Axis enabled but not visible

An axis needs both En and Vs ticked before a game will see it.

Curve without EQ

Editing a response curve and seeing no effect almost always means EQ is unticked.

Not every LED is RGB

The software lets you pick a colour for a fixed-colour LED; nothing will change.

Only one device at a time

Configuration applies to whichever device you selected in the blue bar. Re-select when you switch between a stick and a throttle.

zconfig.ini is plain text

If an editor mangles it, you lose your settings and the hidden UI. Keep a copy.

It crashes, sometimes

The software has been reported to crash at random. Expect the occasional reset and keep your config files.

#Beyond the basics

VKBDevCfg is a ~23 MB C++Builder application whose binary embeds 69 form definitions: roughly 50 are VKB's own windows and dialogs, about 16 belong to the bundled FastReport library. Across them sit thousands of controls. Decompiling the current build to map its UI surfaces a long tail of features beyond the tabs above.

FeatureWhat it appears to be
Visual DiagramAn eye icon in the main window that opens a graphical view of your device. Likely a much clearer way to understand the physical→logical mapping than a grid of cells.
Visual MappingRelated — a visual representation of button assignments.
Curve WizardA guided tool for building response curves.
NXT SEM Axes WizardA wizard for generating axis definitions on NXT-series sticks.
Create MobiFlight Connector JSONExports a MobiFlight connector file — this stick can drive a physical cockpit panel.
Comparators / DetentsSwitch a line on when an axis is past one threshold, or between two. The way to build detent-style buttons.
Functional generatorInjects synthetic axis motion — for testing software, not the stick.
Script / Script TestAppears to be scripted automation of the config process. The manual does not document it.
Find && Auto ConfigAutomatic configuration discovery.
Global SHIFTs / SubSHIFTsUp to two global shifts and seven SubShifts: modifier layers beyond the single Shift button type.
MultiDevice, Master / Slave SettingsCoordinating several VKB devices as one system.
Virtual BUS over USBLinks devices into that network over USB (via Z-Link2) instead of a cable.
Trackers / Gyro / CompassHead-tracking and sensor support.
Get/Set Feature, HID Set 1 / 2Direct access to the device's HID feature reports — the raw protocol, exposed in the UI.
Led Gauge, System LEDs color inversionShows axis positions on a row of LEDs, plus global LED behaviour.
Raw Axes Data / Axis DataLow-level axis telemetry viewers.
Macros Array 1 / 2Group operations on ranges of macros, such as copy 1 to 2.
How this was determined

Every label above is read from the application's compiled-in form definitions. It says what exists, not necessarily what each item does. The vendor manual remains the authority on behaviour.

If you only explore one thing

Try Visual Diagram early. If it does what the name suggests, it may be the best answer to “how do I actually understand this program”.

#Glossary

TermMeaning
LineOne pair of contacts. A button is one line, a hat four. The stick handles up to 128.
Physical button / axisThe raw hardware input, as wired and numbered by VKB.
Logical button / axisThe numbered input that Windows and your sim actually see.
Virtual buttonA logical button with no physical switch, triggered by firmware logic. Lets one physical input produce several logical outputs.
En / VsPer-axis checkboxes: Enabled (the stick computes the axis) and Visible (Windows sees it). Both are needed to use the axis in a game.
Virtual controllerAn extra controller Windows sees, used to get past the limit of 8 axes per controller.
BiasOffset applied to an axis centre. The fix for a slightly off-centre axis.
CalibrationOne-time procedure that learns each axis's true extremes.
POV / HatThe directional pad. 4-way, 6-way or 8-way.
Event (LED)The condition that changes an LED's colour or state.
EQThe flag that makes a response curve permanently active.
Zone (Axes→Buttons)A range of axis travel that fires a button.
Partial WriteLetting you choose which categories of settings to push to the stick.
Auto mapping“Physical button N drives logical button N.”
zconfig.iniThe text config file that unlocks the hidden parts of the UI.
MicrocontrollerThe chip inside the stick. NJoy 32, for example.
FirmwareThe software running on that microcontroller. Flashed with ZBootloader.

#Sources and credit

This guide grew out of “VKBDevCfg Basics” by DCS Tutorial (27 June 2022), a patient half-hour walkthrough of the whole program and still the best introduction there is. Watch it alongside this page; the chapters below jump to the matching moment. The model and the settings were then checked against VKB's NJoy32 Configuration Utility User Guide v2.19 (August 2023, 163 pages) from their downloads page, and against the application itself.

TimeTopic
0:01Intro & what you need
0:21Downloading the software
1:50Unlocking the full UI — zconfig.ini
3:17Firmware update
5:01The window: two halves
5:21Action tab
7:54Tools tab
9:26Settings tab
11:14Top bar summary
11:30The five bottom tabs
11:45Test → Info
11:58Test → Axes / Misc
13:44Global tab
15:06Global → External
15:27Global → LEDs
17:08Profile tab
17:15Axes
18:16Response curve
19:34Logical axes
20:44Axes → buttons
21:25Buttons
26:21POVs
27:17Boolean
27:58Macros
29:04Wrap-up

Watch the original video