/*---------------------------------------------------------*\
| QMKKeychronControllerDetect.cpp                           |
|                                                           |
|   Detector for Keychron QMK-based keyboards               |
|                                                           |
|   Amadej Kastelic                             21 Jun 2026 |
|   Adam Honse <calcprogrammer1@gmail.com>      22 Jun 2026 |
|                                                           |
|   This file is part of the OpenRGB project                |
|   SPDX-License-Identifier: GPL-2.0-or-later               |
\*---------------------------------------------------------*/

#include "Detector.h"
#include "QMKKeychronController.h"
#include "RGBController_QMKKeychron.h"

void DetectQMKKeychronControllers(hid_device_info *info, const std::string&)
{
    hid_device *dev = hid_open_path(info->path);

    if(dev)
    {
        QMKKeychronController* controller = new QMKKeychronController(dev, info->path);

        if(controller->GetSupported())
        {
            RGBController_QMKKeychron* rgb_controller = new RGBController_QMKKeychron(controller);
            ResourceManager::get()->RegisterRGBController(rgb_controller);
        }
        else
        {
            delete controller;
        }
    }
}

REGISTER_HID_DETECTOR_IPU("Keychron C1 Pro",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C1_PRO_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C1 Pro 8K", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C1_PRO_8K_ANSI_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C1 Pro 8K", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C1_PRO_8K_ISO_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C1 Pro 8K", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C1_PRO_8K_JIS_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C1 Pro V2", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C1_PRO_V2_ANSI_RGB_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C2 Pro",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C2_PRO_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C2 Pro 8K", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C2_PRO_8K_ANSI_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C2 Pro 8K", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C2_PRO_8K_ISO_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C2 Pro V2", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C2_PRO_V2_ANSI_RGB_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C3 Pro",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C3_PRO_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C3 Pro 8K", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C3_PRO_8K_ANSI_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C3 Pro 8K", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C3_PRO_8K_ISO_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron C3 Pro 8K", DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_C3_PRO_8K_JIS_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K0 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K0_MAX_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K1_MAX_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K1_MAX_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K1_MAX_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K1 V6",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K1_V6_ANSI_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K1 V6",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K1_V6_ISO_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K1 V6",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K1_V6_JIS_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_HE_ANSI_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_HE_ISO_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_HE_JIS_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_MAX_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_MAX_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_MAX_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_V3_ANSI_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_V3_ISO_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K2 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K2_V3_JIS_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K3 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K3_MAX_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K3 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K3_MAX_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K3 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K3_MAX_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K3 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K3_V3_ANSI_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K3 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K3_V3_ISO_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K3 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K3_V3_JIS_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_HE_ANSI_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_HE_ISO_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_HE_JIS_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_MAX_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_MAX_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_MAX_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_V3_ANSI_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_V3_ISO_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K4 V3",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K4_V3_JIS_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K5_MAX_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K5_MAX_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K5_MAX_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K5_MAX_JIS_V2_RGB_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K5 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K5_V2_ANSI_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K5 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K5_V2_ISO_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K5 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K5_V2_JIS_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K6 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K6_HE_ANSI_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K7 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K7_MAX_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K7 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K7_MAX_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K7 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K7_MAX_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K7 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K7_MAX_JIS_V2_RGB_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_HE_ANSI_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_HE_ISO_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_HE_JIS_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_MAX_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_MAX_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_MAX_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 Pro",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_PRO_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 Pro",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_PRO_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 Pro",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_PRO_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_V2_ANSI_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_V2_ISO_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K8 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K8_V2_JIS_RGB_PID,                 1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K9 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K9_MAX_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K10 HE",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K10_HE_ANSI_PID,                   1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K10 HE",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K10_HE_ISO_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K10 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K10_MAX_ANSI_RGB_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K10 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K10_MAX_ISO_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K10 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K10_MAX_JIS_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K10 V2",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K10_V2_ANSI_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K10 V2",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K10_V2_ISO_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K10 V2",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K10_V2_JIS_RGB_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K11 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K11_MAX_ANSI_ENCODER_RGB_PID,      1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K11 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K11_MAX_ISO_ENCODER_RGB_PID,       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K11 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K11_MAX_JIS_ENCODER_RGB_PID,       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K13 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K13_MAX_ANSI_RGB_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K13 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K13_MAX_ISO_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K13 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K13_MAX_JIS_RGB_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K15 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K15_MAX_ANSI_ENCODER_RGB_PID,      1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K15 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K15_MAX_ISO_ENCODER_RGB_PID,       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K17 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K17_MAX_ANSI_ENCODER_RGB_PID,      1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K17 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K17_MAX_ISO_ENCODER_RGB_PID,       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron K17 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_K17_MAX_JIS_ENCODER_RGB_PID,       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q0",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q0_BASE_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q0 Plus",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q0_PLUS_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q0 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q0_MAX_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_HE_ANSI_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_HE_ISO_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_HE_JIS_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_MAX_JIS_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V1",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V1_ANSI_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V1",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V1_ANSI_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V1",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V1_ISO_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V1",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V1_ISO_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V2_ANSI_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V2_ANSI_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V2_ISO_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V2_ISO_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V2_JIS_PID,                     1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q1 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q1_V2_JIS_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_JIS_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_JIS_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_HE_ANSI_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q2 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q2_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_JIS_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_JIS_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_HE_ANSI_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_HE_ISO_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_HE_JIS_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q3 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q3_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q4",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q4_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q4",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q4_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q4 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q4_HE_ANSI_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_HE_ANSI_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_HE_ISO_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_HE_JIS_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q5_MAX_JIS_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_HE_ANSI_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_HE_ISO_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6 HE",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_HE_JIS_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q6 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q6_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q7",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q7_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q7",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q7_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q8",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q8_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q8",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q8_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q8",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q8_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q8",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q8_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q8 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q8_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q9",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q9_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q9",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q9_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q9",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q9_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q9",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q9_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q9 Plus",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q9_PLUS_ANSI_ENCODER_PID,          1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q10",       DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q10_ANSI_ENCODER_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q10",       DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q10_ISO_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q10 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q10_MAX_ANSI_ENCODER_PID,          1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q10 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q10_MAX_ISO_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q11",       DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q11_ANSI_ENCODER_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q11",       DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q11_ISO_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q12",       DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q12_ANSI_ENCODER_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q12",       DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q12_ISO_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q12 HE",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q12_HE_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q12 HE",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q12_HE_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q12 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q12_MAX_ANSI_ENCODER_PID,          1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q12 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q12_MAX_ISO_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q13 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q13_MAX_ANSI_ENCODER_PID,          1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q13 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q13_MAX_JIS_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q14 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q14_MAX_ANSI_ENCODER_PID,          1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q15 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q15_MAX_ANSI_ENCODER_PID,          1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q60 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q60_MAX_ANSI_PID,                  1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron Q65 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_Q65_MAX_ANSI_ENCODER_PID,          1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron S1",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_S1_ANSI_RGB_PID,                   1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_ABNT2_ENCODER_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_JIS_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_JIS_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_8K_ANSI_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V1 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V1_MAX_JIS_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_ABNT2_ENCODER_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_JIS_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_JIS_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V2 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V2_MAX_JIS_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_ABNT2_ENCODER_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_JIS_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_JIS_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V3 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V3_MAX_JIS_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V4",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V4_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V4",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V4_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V4 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V4_MAX_ANSI_PID,                   1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V4 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V4_MAX_ISO_PID,                    1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V5",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V5_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V5",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V5_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V5",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V5_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V5",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V5_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V5_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V5_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V5 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V5_MAX_JIS_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_ABNT2_ENCODER_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_MAX_JIS_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V6 V2",     DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V6_V2_ISO_ENCODER_PID,             1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V7",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V7_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V7",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V7_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V8",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V8_ANSI_PID,                       1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V8",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V8_ANSI_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V8",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V8_ISO_PID,                        1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V8",        DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V8_ISO_ENCODER_PID,                1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V8 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V8_MAX_ANSI_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V8 Max",    DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V8_MAX_ISO_ENCODER_PID,            1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V10",       DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V10_ANSI_ENCODER_PID,              1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V10",       DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V10_ISO_ENCODER_PID,               1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V10 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V10_MAX_ANSI_ENCODER_PID,          1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
REGISTER_HID_DETECTOR_IPU("Keychron V10 Max",   DetectQMKKeychronControllers,   KEYCHRON_VID,   KEYCHRON_V10_MAX_ISO_ENCODER_PID,           1,  KEYCHRON_QMK_USAGE_PAGE,    KEYCHRON_QMK_USAGE);
