This project extends the work of opiopan on the SimHID G1000, a hardware replica of the Garmin G1000 for flight simulators.
G1000 Joy is an alternative firmware that allows the device to function as a standard HID joystick, enabling compatibility with multiple flight simulators and 3rd-party applications across different operating systems.
A pre-built firmware binary is available and recommended for ease of use:
Download Latest Release
- CMake ≥ 3.22
- ARM GCC toolchain (
arm-none-eabi)
# Start from the project root
mkdir build && cd build
# Configure the project
cmake ..
# Build the firmware
cmake --build . -- -j$(nproc)# From inside the build directory
arm-none-eabi-objcopy -O binary g1000_joy.elf g1000_joy.binOnce compiling is finished, the following firmware binary files are available.
build/g1000_joy.elf: ELF format binarybuild/g1000_joy.bin: raw binary
You can flash the SimHID G1000 via the debug port or USB. Flashing via STM32CubeProg is recommended. Alternatively, dfu-util can be used.
dfu-util
- Hold the AUX button on the right side of the device.
- (Re)connect the device via USB while holding the button.
- Release the button once the device enumerates as a DFU device.
dfu-util -d 0483:df11 -a 0 -s 0x8000000 -D build/g1000_joy.binPower cycle the device by disconnecting the USB cable to run the new firmware.
Example configs and scripts are available in the examples folder
| Button # | SimHID Name | Description |
|---|---|---|
| 1 | SW1.down | NAV_SWITCH |
| 2 | SW2.down | AP_MASTER |
| 3 | SW3.down | AP_FD |
| 4 | SW4.down | AP_HDG |
| 5 | SW5.down | AP_ALT |
| 6 | SW6.down | AP_NAV |
| 7 | SW7.down | AP_VNV |
| 8 | SW8.down | AP_APR |
| 9 | SW9.down | AP_BC |
| 10 | SW10.down | AP_VS |
| 11 | SW11.down | AP_NOSE_UP |
| 12 | SW12.down | AP_FLC |
| 13 | SW13.down | AP_NOSE_DN |
| 14 | SW14.down | SOFTKEY_1 |
| 15 | SW15.down | SOFTKEY_2 |
| 16 | SW16.down | SOFTKEY_3 |
| 17 | SW17.down | SOFTKEY_4 |
| 18 | SW18.down | SOFTKEY_5 |
| 19 | SW19.down | SOFTKEY_6 |
| 20 | SW20.down | SOFTKEY_7 |
| 21 | SW21.down | SOFTKEY_8 |
| 22 | SW22.down | SOFTKEY_9 |
| 23 | SW23.down | SOFTKEY_10 |
| 24 | SW24.down | SOFTKEY_11 |
| 25 | SW25.down | SOFTKEY_12 |
| 26 | SW26.down | COM_SWITCH |
| 27 | SW27.down | DCT |
| 28 | SW28.down | MENU |
| 29 | SW29.down | FPL |
| 30 | SW30.down | PROC |
| 31 | SW31.down | CLR |
| 32 | SW32.down | ENT |
| 33 | EC1.increment | VOL_1_INC |
| 34 | EC1.decrement | VOL_1_DEC |
| 35 | EC1P.down | VOL_1_PUSH |
| 36 | EC2X.increment | NAV_SMALL_INC |
| 37 | EC2X.decrement | NAV_SMALL_DEC |
| 38 | EC2Y.increment | NAV_LARGE_INC |
| 39 | EC2Y.decrement | NAV_LARGE_DEC |
| 40 | EC2P.down | NAV_PUSH |
| 41 | EC3.increment | HDG_BUG_INC |
| 42 | EC3.decrement | HDG_BUG_DEC |
| 43 | EC3P.down | HDG_BUG_PUSH |
| 44 | EC4X.increment | ALT_SMALL_INC |
| 45 | EC4X.decrement | ALT_SMALL_DEC |
| 46 | EC4Y.increment | ALT_LARGE_INC |
| 47 | EC4Y.decrement | ALT_LARGE_DEC |
| 49 | EC5.increment | VOL_2_INC |
| 50 | EC5.decrement | VOL_2_DEC |
| 51 | EC5.down | VOL_2_PUSH |
| 52 | EC6X.increment | COM_SMALL_INC |
| 53 | EC6X.decrement | COM_SMALL_DEC |
| 54 | EC6Y.increment | COM_LARGE_INC |
| 55 | EC6Y.decrement | COM_LARGE_DEC |
| 56 | EC6P.down | COM_PUSH |
| 57 | EC7X.increment | CRS_INC |
| 58 | EC7X.decrement | CRS_DEC |
| 59 | EC7Y.increment | BARO_INC |
| 60 | EC7Y.decrement | BARO_DEC |
| 61 | EC7P.down | CRS_PUSH |
| 62 | EC8.increment | RANGE_INC |
| 63 | EC8.decrement | RANGE_DEC |
| 64 | EC8P.down | JOYSTICK_PUSH |
| 65 | EC8U.down | JOYSTICK_UP |
| 66 | EC8D.down | JOYSTICK_DOWN |
| 67 | EC8R.down | JOYSTICK_RIGHT |
| 68 | EC8L.down | JOYSTICK_LEFT |
| 69 | EC9X.increment | FMS_UPPER_INC |
| 70 | EC9X.decrement | FMS_UPPER_DEC |
| 71 | EC9Y.increment | FMS_LOWER_INC |
| 72 | EC9Y.decrement | FMS_LOWER_DEC |
| 73 | EC9P.down | FMS_UPPER_PUSH |
| 74 | AUX1U.down | AUX1_UP |
| 75 | AUX1P.down | AUX1_PUSH |
| 76 | AUX1D.down | AUX1_DOWN |
| 77 | AUX2U.down | AUX2_UP |
| 78 | AUX2P.down | AUX2_PUSH |
| 79 | AUX2D.down | AUX2_DOWN |