Publish LumaOps source
This commit is contained in:
@@ -0,0 +1,523 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_RealtekARGB.cpp |
|
||||
| |
|
||||
| RGBController for Realtek USB ARGB ICs |
|
||||
| |
|
||||
| Jerry Fan (JerryFan0612) 13 Mar 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "RGBController_RealtekARGB.h"
|
||||
|
||||
/**------------------------------------------------------------------*\
|
||||
@name Realtek ARGB Device
|
||||
@category LEDStrip
|
||||
@type USB
|
||||
@save :x:
|
||||
@direct :rotating_light:
|
||||
@effects :white_check_mark:
|
||||
@detectors RealtekARGBControllerDetect
|
||||
@comment
|
||||
\*-------------------------------------------------------------------*/
|
||||
|
||||
RGBController_RealtekARGB::RGBController_RealtekARGB(RealtekARGBController* controller_ptr)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
name = controller_ptr->get_dev_name();
|
||||
vendor = controller_ptr->get_manu_name();
|
||||
location = controller_ptr->get_dev_loc();
|
||||
serial = controller_ptr->get_sn();
|
||||
version = controller_ptr->get_fw_ver();
|
||||
description = vendor + "ARGB Device";
|
||||
type = DEVICE_TYPE_LEDSTRIP;
|
||||
std::fill(std::begin(ready_to_reboot), std::end(ready_to_reboot), false);
|
||||
|
||||
SetupModes();
|
||||
SetupZones();
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::SetupModes()
|
||||
{
|
||||
int brightness = controller->get_argb_brightness(0) >> 8;
|
||||
|
||||
mode Direct;
|
||||
Direct.name = "Direct";
|
||||
Direct.value = REALTEK_ARGB_EFF_NULL;
|
||||
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
|
||||
Direct.color_mode = MODE_COLORS_PER_LED;
|
||||
Direct.brightness_min = 0;
|
||||
Direct.brightness_max = 255;
|
||||
Direct.brightness = brightness;
|
||||
modes.push_back(Direct);
|
||||
|
||||
mode Static;
|
||||
Static.name = "Static";
|
||||
Static.value = REALTEK_ARGB_EFF_ALWAYS_ON;
|
||||
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
|
||||
Static.colors_min = 1;
|
||||
Static.colors_max = 1;
|
||||
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Static.colors.resize(1);
|
||||
Static.brightness_min = 0;
|
||||
Static.brightness_max = 255;
|
||||
Static.brightness = brightness;
|
||||
modes.push_back(Static);
|
||||
|
||||
mode Blink;
|
||||
Blink.name = "Blink";
|
||||
Blink.value = REALTEK_ARGB_EFF_BLINK;
|
||||
Blink.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
Blink.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
Blink.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
Blink.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
Blink.colors_min = 1;
|
||||
Blink.colors_max = 2;
|
||||
Blink.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Blink.colors.resize(2);
|
||||
Blink.brightness_min = 0;
|
||||
Blink.brightness_max = 255;
|
||||
Blink.brightness = brightness;
|
||||
modes.push_back(Blink);
|
||||
|
||||
mode Breathing;
|
||||
Breathing.name = "Breathing";
|
||||
Breathing.value = REALTEK_ARGB_EFF_BREATH;
|
||||
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
Breathing.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
Breathing.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
Breathing.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
Breathing.colors_min = 1;
|
||||
Breathing.colors_max = 2;
|
||||
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Breathing.colors.resize(2);
|
||||
Breathing.brightness_min = 0;
|
||||
Breathing.brightness_max = 255;
|
||||
Breathing.brightness = brightness;
|
||||
modes.push_back(Breathing);
|
||||
|
||||
mode Spectrum;
|
||||
Spectrum.name = "Spectrum";
|
||||
Spectrum.value = REALTEK_ARGB_EFF_SPECTRUM;
|
||||
Spectrum.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
Spectrum.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
Spectrum.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
Spectrum.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
Spectrum.color_mode = MODE_COLORS_NONE;
|
||||
Spectrum.brightness_min = 0;
|
||||
Spectrum.brightness_max = 255;
|
||||
Spectrum.brightness = brightness;
|
||||
modes.push_back(Spectrum);
|
||||
|
||||
mode Scroll;
|
||||
Scroll.name = "Scroll";
|
||||
Scroll.value = REALTEK_ARGB_EFF_SCROLL;
|
||||
Scroll.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
Scroll.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
Scroll.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
Scroll.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
Scroll.colors_min = 1;
|
||||
Scroll.colors_max = 2;
|
||||
Scroll.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Scroll.colors.resize(2);
|
||||
Scroll.brightness_min = 0;
|
||||
Scroll.brightness_max = 255;
|
||||
Scroll.brightness = brightness;
|
||||
modes.push_back(Scroll);
|
||||
|
||||
mode RainbowScroll;
|
||||
RainbowScroll.name = "Rainbow Scroll";
|
||||
RainbowScroll.value = REALTEK_ARGB_EFF_RAINBOW_SCROLL;
|
||||
RainbowScroll.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
RainbowScroll.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
RainbowScroll.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
RainbowScroll.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
RainbowScroll.color_mode = MODE_COLORS_NONE;
|
||||
RainbowScroll.brightness_min = 0;
|
||||
RainbowScroll.brightness_max = 255;
|
||||
RainbowScroll.brightness = brightness;
|
||||
modes.push_back(RainbowScroll);
|
||||
|
||||
mode RunningWater;
|
||||
RunningWater.name = "Running Water";
|
||||
RunningWater.value = REALTEK_ARGB_EFF_RUNNING_WATER;
|
||||
RunningWater.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
RunningWater.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
RunningWater.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
RunningWater.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
RunningWater.colors_min = 1;
|
||||
RunningWater.colors_max = 2;
|
||||
RunningWater.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
RunningWater.colors.resize(2);
|
||||
RunningWater.brightness_min = 0;
|
||||
RunningWater.brightness_max = 255;
|
||||
RunningWater.brightness = brightness;
|
||||
modes.push_back(RunningWater);
|
||||
|
||||
mode Sliding;
|
||||
Sliding.name = "Sliding";
|
||||
Sliding.value = REALTEK_ARGB_EFF_SLIDING;
|
||||
Sliding.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
|
||||
Sliding.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
Sliding.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
Sliding.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
Sliding.colors_min = 1;
|
||||
Sliding.colors_max = 2;
|
||||
Sliding.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Sliding.colors.resize(2);
|
||||
Sliding.brightness_min = 0;
|
||||
Sliding.brightness_max = 255;
|
||||
Sliding.brightness = brightness;
|
||||
modes.push_back(Sliding);
|
||||
|
||||
mode WideSliding;
|
||||
WideSliding.name = "Wide Sliding";
|
||||
WideSliding.value = REALTEK_ARGB_EFF_WIDE_SLIDING;
|
||||
WideSliding.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
|
||||
WideSliding.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
WideSliding.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
WideSliding.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
WideSliding.colors_min = 1;
|
||||
WideSliding.colors_max = 2;
|
||||
WideSliding.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
WideSliding.colors.resize(2);
|
||||
WideSliding.brightness_min = 0;
|
||||
WideSliding.brightness_max = 255;
|
||||
WideSliding.brightness = brightness;
|
||||
modes.push_back(WideSliding);
|
||||
|
||||
mode RainbowSliding;
|
||||
RainbowSliding.name = "Rainbow Sliding";
|
||||
RainbowSliding.value = REALTEK_ARGB_EFF_RAINBOW_SLIDING;
|
||||
RainbowSliding.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
|
||||
RainbowSliding.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
RainbowSliding.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
RainbowSliding.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
RainbowSliding.color_mode = MODE_COLORS_NONE;
|
||||
RainbowSliding.brightness_min = 0;
|
||||
RainbowSliding.brightness_max = 255;
|
||||
RainbowSliding.brightness = brightness;
|
||||
modes.push_back(RainbowSliding);
|
||||
|
||||
mode RainbowFadeSliding;
|
||||
RainbowFadeSliding.name = "Rainbow Fade Sliding";
|
||||
RainbowFadeSliding.value = REALTEK_ARGB_EFF_RAINBOW_FADE_SLIDING;
|
||||
RainbowFadeSliding.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
RainbowFadeSliding.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
RainbowFadeSliding.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
RainbowFadeSliding.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
RainbowFadeSliding.color_mode = MODE_COLORS_NONE;
|
||||
RainbowFadeSliding.brightness_min = 0;
|
||||
RainbowFadeSliding.brightness_max = 255;
|
||||
RainbowFadeSliding.brightness = brightness;
|
||||
modes.push_back(RainbowFadeSliding);
|
||||
|
||||
mode NewtonCradle;
|
||||
NewtonCradle.name = "Newton Cradle";
|
||||
NewtonCradle.value = REALTEK_ARGB_EFF_NEWTON_CRADLE;
|
||||
NewtonCradle.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
NewtonCradle.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
NewtonCradle.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
NewtonCradle.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
NewtonCradle.colors_min = 1;
|
||||
NewtonCradle.colors_max = 2;
|
||||
NewtonCradle.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
NewtonCradle.colors.resize(2);
|
||||
NewtonCradle.brightness_min = 0;
|
||||
NewtonCradle.brightness_max = 255;
|
||||
NewtonCradle.brightness = brightness;
|
||||
modes.push_back(NewtonCradle);
|
||||
|
||||
mode Meteor;
|
||||
Meteor.name = "Meteor";
|
||||
Meteor.value = REALTEK_ARGB_EFF_METEOR;
|
||||
Meteor.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
Meteor.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
Meteor.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
Meteor.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
Meteor.colors_min = 1;
|
||||
Meteor.colors_max = 2;
|
||||
Meteor.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Meteor.colors.resize(2);
|
||||
Meteor.brightness_min = 0;
|
||||
Meteor.brightness_max = 255;
|
||||
Meteor.brightness = brightness;
|
||||
modes.push_back(Meteor);
|
||||
|
||||
mode ZigZag;
|
||||
ZigZag.name = "ZigZag";
|
||||
ZigZag.value = REALTEK_ARGB_EFF_ZIGZAG;
|
||||
ZigZag.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_RANDOM_COLOR;
|
||||
ZigZag.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
ZigZag.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
ZigZag.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
ZigZag.colors_min = 1;
|
||||
ZigZag.colors_max = 2;
|
||||
ZigZag.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
ZigZag.colors.resize(2);
|
||||
ZigZag.brightness_min = 0;
|
||||
ZigZag.brightness_max = 255;
|
||||
ZigZag.brightness = brightness;
|
||||
modes.push_back(ZigZag);
|
||||
|
||||
mode StarryNight;
|
||||
StarryNight.name = "Starry Night";
|
||||
StarryNight.value = REALTEK_ARGB_EFF_STARRY_NIGHT;
|
||||
StarryNight.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_RANDOM_COLOR;
|
||||
StarryNight.speed_min = REALTEK_ARGB_SPEED_MIN;
|
||||
StarryNight.speed_max = REALTEK_ARGB_SPEED_MAX;
|
||||
StarryNight.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
StarryNight.colors_min = 1;
|
||||
StarryNight.colors_max = 1;
|
||||
StarryNight.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
StarryNight.colors.resize(1);
|
||||
StarryNight.brightness_min = 0;
|
||||
StarryNight.brightness_max = 255;
|
||||
StarryNight.brightness = brightness;
|
||||
modes.push_back(StarryNight);
|
||||
|
||||
mode Stack;
|
||||
Stack.name = "Stack";
|
||||
Stack.value = REALTEK_ARGB_EFF_STACK;
|
||||
Stack.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
|
||||
Stack.colors_min = 1;
|
||||
Stack.colors_max = 2;
|
||||
Stack.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Stack.colors.resize(2);
|
||||
Stack.brightness_min = 0;
|
||||
Stack.brightness_max = 255;
|
||||
Stack.brightness = brightness;
|
||||
modes.push_back(Stack);
|
||||
}
|
||||
|
||||
RGBController_RealtekARGB::~RGBController_RealtekARGB()
|
||||
{
|
||||
delete controller;
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::SetupZones()
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| Only set LED count on the first run |
|
||||
\*-------------------------------------------------*/
|
||||
bool first_run = false;
|
||||
int idx = 0;
|
||||
int argb_num = 0;
|
||||
int fix_grps = 0;
|
||||
int num_fixgrp = 0;
|
||||
int argb_num_fixgrp = 0;
|
||||
|
||||
if(zones.size() == 0)
|
||||
{
|
||||
first_run = true;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Clear any existing color/LED configuration |
|
||||
\*-------------------------------------------------*/
|
||||
leds.clear();
|
||||
colors.clear();
|
||||
valid_grp.clear();
|
||||
fix_grps = controller->get_fix_grps();
|
||||
|
||||
for(int grp_num = 0; grp_num < REALTEK_ARGB_NUM_ARGB_GRP; grp_num++)
|
||||
{
|
||||
if(controller->get_zone_enable(grp_num))
|
||||
{
|
||||
valid_grp.push_back(grp_num);
|
||||
if(fix_grps & (0x1 << grp_num))
|
||||
{
|
||||
num_fixgrp++;
|
||||
argb_num_fixgrp += controller->get_argb_num(grp_num);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Set zones and leds |
|
||||
\*-------------------------------------------------*/
|
||||
zones.resize(valid_grp.size());
|
||||
for(int grp_num : valid_grp)
|
||||
{
|
||||
argb_num = controller->get_argb_num(grp_num);
|
||||
zones[idx].name = "strip " + std::to_string(idx + 1);
|
||||
zones[idx].type = ZONE_TYPE_LINEAR;
|
||||
if(fix_grps & (0x1 << grp_num))
|
||||
{
|
||||
zones[idx].leds_count = argb_num;
|
||||
zones[idx].leds_min = argb_num;
|
||||
zones[idx].leds_max = argb_num;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(first_run)
|
||||
{
|
||||
zones[idx].leds_count = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
zones[idx].leds_count = argb_num;
|
||||
}
|
||||
|
||||
zones[idx].leds_min = 0;
|
||||
zones[idx].leds_max = (REALTEK_ARGB_MAX - argb_num_fixgrp) / ((int)valid_grp.size() - num_fixgrp);
|
||||
}
|
||||
zones[idx].matrix_map = NULL;
|
||||
for(unsigned int led_idx = 0; led_idx < zones[idx].leds_count; led_idx++)
|
||||
{
|
||||
led myled;
|
||||
myled.name = zones[idx].name + " led_";
|
||||
myled.name.append(std::to_string(led_idx + 1));
|
||||
leds.push_back(myled);
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
SetupColors();
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::ResizeZone(int zone, int new_size)
|
||||
{
|
||||
int fix_grps = controller->get_fix_grps();
|
||||
int orig_num = controller->get_argb_num(valid_grp[zone]);
|
||||
bool need_reboot = true;
|
||||
|
||||
if((size_t) zone >= zones.size())
|
||||
{
|
||||
return;
|
||||
}
|
||||
if((new_size == orig_num) && zones[zone].leds_count)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(((unsigned int)new_size >= zones[zone].leds_min) && ((unsigned int)new_size <= zones[zone].leds_max))
|
||||
{
|
||||
int total_argb_num = 0;
|
||||
std::vector<RGBColor> rtk_colors(orig_num, 0);
|
||||
for(int grp_num = 0; grp_num < REALTEK_ARGB_NUM_ARGB_GRP; grp_num++)
|
||||
{
|
||||
if(grp_num == valid_grp[zone])
|
||||
{
|
||||
total_argb_num += new_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
total_argb_num += controller->get_argb_num(grp_num);
|
||||
}
|
||||
}
|
||||
if(total_argb_num > REALTEK_ARGB_MAX)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
controller->set_argb_direct(valid_grp[zone], rtk_colors, 0xFF);
|
||||
controller->set_argb_num(valid_grp[zone], new_size);
|
||||
ready_to_reboot[valid_grp[zone]] = true;
|
||||
|
||||
for(int grp_num = 0; grp_num < REALTEK_ARGB_NUM_ARGB_GRP; grp_num++)
|
||||
{
|
||||
if(!ready_to_reboot[grp_num] && !(fix_grps & (0x1 << grp_num)))
|
||||
{
|
||||
need_reboot = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(need_reboot)
|
||||
{
|
||||
controller->device_reboot();
|
||||
controller->device_rescan_trigger();
|
||||
}
|
||||
SetupZones();
|
||||
}
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::DeviceUpdateLEDs()
|
||||
{
|
||||
for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++)
|
||||
{
|
||||
if(zones[zone_idx].leds_count > 0)
|
||||
{
|
||||
UpdateZoneLEDs((int)zone_idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::UpdateZoneLEDs(int zone)
|
||||
{
|
||||
unsigned short brightness = 0xFF;
|
||||
mode& curr_mode = modes[active_mode];
|
||||
std::vector<RGBColor> color_buf;
|
||||
|
||||
if(curr_mode.color_mode == MODE_COLORS_PER_LED &&
|
||||
curr_mode.value == REALTEK_ARGB_EFF_NULL) //direct mode
|
||||
{
|
||||
if(curr_mode.flags & MODE_FLAG_HAS_BRIGHTNESS)
|
||||
{
|
||||
brightness = curr_mode.brightness;
|
||||
}
|
||||
|
||||
color_buf.resize(zones[zone].leds_count);
|
||||
for(unsigned int i = 0; i < zones[zone].leds_count; i++)
|
||||
color_buf[i] = zones[zone].colors[i];
|
||||
controller->set_argb_direct(valid_grp[zone], color_buf, brightness);
|
||||
}
|
||||
else
|
||||
{
|
||||
UpdateSingleLED(zone);
|
||||
}
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::UpdateSingleLED(int zone)
|
||||
{
|
||||
mode& curr_mode = modes[active_mode];
|
||||
std::vector<RGBColor> rtk_colors = curr_mode.colors;
|
||||
struct RealtekARGBControllerSetEffParam param;
|
||||
|
||||
param.speed = REALTEK_ARGB_SPEED_NORMAL;
|
||||
param.brightness = 0xFF;
|
||||
param.dir = 0;
|
||||
param.random_color = 0;
|
||||
|
||||
if(curr_mode.flags & MODE_FLAG_HAS_SPEED)
|
||||
{
|
||||
param.speed = curr_mode.speed;
|
||||
}
|
||||
if(curr_mode.flags & MODE_FLAG_HAS_BRIGHTNESS)
|
||||
{
|
||||
param.brightness = curr_mode.brightness;
|
||||
}
|
||||
if(curr_mode.flags & MODE_FLAG_HAS_DIRECTION_LR)
|
||||
{
|
||||
if(curr_mode.direction == MODE_DIRECTION_RIGHT)
|
||||
{
|
||||
param.dir = 1;
|
||||
}
|
||||
}
|
||||
if(curr_mode.flags & MODE_FLAG_HAS_RANDOM_COLOR)
|
||||
{
|
||||
if(curr_mode.color_mode == MODE_COLORS_RANDOM)
|
||||
{
|
||||
param.random_color = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(curr_mode.color_mode == MODE_COLORS_PER_LED)
|
||||
{
|
||||
rtk_colors = colors;
|
||||
}
|
||||
else if(curr_mode.color_mode == MODE_COLORS_NONE)
|
||||
{
|
||||
rtk_colors.clear();
|
||||
}
|
||||
|
||||
controller->set_argb_effect(valid_grp[zone], curr_mode.value, rtk_colors, ¶m);
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::DeviceUpdateMode()
|
||||
{
|
||||
if(modes[active_mode].value != REALTEK_ARGB_EFF_NULL)
|
||||
{
|
||||
DeviceUpdateLEDs();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_RealtekARGB.h |
|
||||
| |
|
||||
| RGBController for Realtek USB ARGB ICs |
|
||||
| |
|
||||
| Jerry Fan (JerryFan0612) 13 Mar 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "RGBController.h"
|
||||
#include "RealtekARGBController.h"
|
||||
|
||||
class RGBController_RealtekARGB : public RGBController
|
||||
{
|
||||
public:
|
||||
RGBController_RealtekARGB(RealtekARGBController* controller_ptr);
|
||||
~RGBController_RealtekARGB();
|
||||
|
||||
void SetupModes();
|
||||
|
||||
void SetupZones();
|
||||
void ResizeZone(int zone, int new_size);
|
||||
void DeviceUpdateLEDs();
|
||||
void UpdateZoneLEDs(int zone);
|
||||
void UpdateSingleLED(int zone);
|
||||
void DeviceUpdateMode();
|
||||
|
||||
private:
|
||||
RealtekARGBController* controller;
|
||||
std::vector<int> valid_grp;
|
||||
bool ready_to_reboot[REALTEK_ARGB_NUM_ARGB_GRP] = {false};
|
||||
};
|
||||
@@ -0,0 +1,715 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RealtekARGBController.cpp |
|
||||
| |
|
||||
| Controller for Realtek USB ARGB ICs |
|
||||
| |
|
||||
| Jerry Fan (JerryFan0612) 13 Mar 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "RealtekARGBController.h"
|
||||
#include "MathUtils.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
static const unsigned char hid_set_packet[] =
|
||||
{
|
||||
0x56, 0x53, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xE3,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
static const unsigned char hid_get_packet[] =
|
||||
{
|
||||
0x56, 0x53, 0x42, 0x43, 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0xE2,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
static const unsigned char hid_end_packet[] =
|
||||
{
|
||||
0x58, 0x53, 0x42, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
RealtekARGBController::RealtekARGBController(hid_device* dev, hid_device_info* info)
|
||||
{
|
||||
hdev = dev;
|
||||
hidinfo = info;
|
||||
for(int i = 0; i < REALTEK_ARGB_NUM_ARGB_GRP; i++)
|
||||
{
|
||||
argbctl_data[i] = (unsigned char*)calloc(REALTEK_ARGB_CTL_DATA_SIZE, 1);
|
||||
memset(argbctl_data[i], 0, REALTEK_ARGB_CTL_DATA_SIZE);
|
||||
prev_bright[i] = 0xFFFF;
|
||||
}
|
||||
device_init();
|
||||
|
||||
keepalive_thread_run = false;
|
||||
keepalive_thread = NULL;
|
||||
}
|
||||
|
||||
RealtekARGBController::~RealtekARGBController()
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Close keepalive thread |
|
||||
\*-----------------------------------------------------*/
|
||||
if(keepalive_thread != NULL)
|
||||
{
|
||||
keepalive_thread_run = false;
|
||||
keepalive_thread->join();
|
||||
delete keepalive_thread;
|
||||
}
|
||||
|
||||
if(hdev)
|
||||
{
|
||||
for(int i = 0; i < REALTEK_ARGB_NUM_ARGB_GRP; i++)
|
||||
{
|
||||
int ret = set_appctl(i, REALTEK_ARGB_LED_CTL_FW);
|
||||
if(!ret)
|
||||
{
|
||||
appctl[i] = REALTEK_ARGB_LED_CTL_FW;
|
||||
}
|
||||
}
|
||||
hid_close(hdev);
|
||||
hdev = NULL;
|
||||
}
|
||||
memset(argbctl_hdr, 0, REALTEK_ARGB_CTL_HDR_SIZE);
|
||||
for(int i = 0; i < REALTEK_ARGB_NUM_ARGB_GRP; i++)
|
||||
free(argbctl_data[i]);
|
||||
}
|
||||
|
||||
void RealtekARGBController::KeepaliveThreadFunction()
|
||||
{
|
||||
/*-----------------------------------------------------------------*\
|
||||
| One shot thread to rescan device |
|
||||
\*-----------------------------------------------------------------*/
|
||||
while(keepalive_thread_run.load())
|
||||
{
|
||||
std::this_thread::sleep_for(2s);
|
||||
device_rescan();
|
||||
keepalive_thread_run = false;
|
||||
}
|
||||
}
|
||||
|
||||
int RealtekARGBController::usb_hid_ioctl(unsigned char* usb_buf, unsigned char* data, int data_len,
|
||||
unsigned int offset, unsigned char is_in)
|
||||
{
|
||||
int id;
|
||||
int ret = 0;
|
||||
int buf_len = usb_hid_get_report(data_len, &id);
|
||||
|
||||
if(hdev == NULL)
|
||||
{
|
||||
free(usb_buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!is_in && data_len)
|
||||
{
|
||||
usb_buf[0x04] = data[0];
|
||||
}
|
||||
memcpy(&usb_buf[0x08], &data_len, sizeof(data_len));
|
||||
memcpy(&usb_buf[0x1B], &data_len, sizeof(data_len));
|
||||
ret = hid_send_feature_report(hdev, usb_buf, sizeof(hid_get_packet));
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, data, data_len);
|
||||
usb_buf[0x00] = id;
|
||||
if(is_in)
|
||||
{
|
||||
ret = hid_get_feature_report(hdev, usb_buf, buf_len);
|
||||
memcpy(data, usb_buf + offset, data_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = hid_send_feature_report(hdev, usb_buf, buf_len);
|
||||
}
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_end_packet, sizeof(hid_end_packet));
|
||||
ret = hid_get_feature_report(hdev, usb_buf, sizeof(hid_end_packet));
|
||||
free(usb_buf);
|
||||
return (ret > 0) ? 0 : ret;
|
||||
}
|
||||
|
||||
int RealtekARGBController::usb_hid_get_report(int data_len, int* id)
|
||||
{
|
||||
int retlen = 0;
|
||||
|
||||
if(data_len <= REALTEK_ARGB_HID_DATALEN_CH2)
|
||||
{
|
||||
*id = REALTEK_ARGB_HID_ID_DATA_CH2;
|
||||
retlen = REALTEK_ARGB_HID_DATALEN_CH2;
|
||||
}
|
||||
else if(data_len <= REALTEK_ARGB_HID_DATALEN_CH3)
|
||||
{
|
||||
*id = REALTEK_ARGB_HID_ID_DATA_CH3;
|
||||
retlen = REALTEK_ARGB_HID_DATALEN_CH3;
|
||||
}
|
||||
else if(data_len <= REALTEK_ARGB_HID_DATALEN_CH4)
|
||||
{
|
||||
*id = REALTEK_ARGB_HID_ID_DATA_CH4;
|
||||
retlen = REALTEK_ARGB_HID_DATALEN_CH4;
|
||||
}
|
||||
else if(data_len <= REALTEK_ARGB_HID_DATALEN_CH5)
|
||||
{
|
||||
*id = REALTEK_ARGB_HID_ID_DATA_CH5;
|
||||
retlen = REALTEK_ARGB_HID_DATALEN_CH5;
|
||||
}
|
||||
else
|
||||
{
|
||||
*id = REALTEK_ARGB_HID_ID_DATA_CH1;
|
||||
retlen = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
}
|
||||
return retlen;
|
||||
}
|
||||
|
||||
void RealtekARGBController::device_init()
|
||||
{
|
||||
set_write_unlock();
|
||||
get_argbctl_hdr();
|
||||
get_argbctl_data();
|
||||
for(int i = 0; i < REALTEK_ARGB_NUM_ARGB_GRP; i++)
|
||||
{
|
||||
int ret = set_appctl(i, REALTEK_ARGB_LED_CTL_FW);
|
||||
if(!ret)
|
||||
{
|
||||
appctl[i] = REALTEK_ARGB_LED_CTL_FW;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_write_unlock()
|
||||
{
|
||||
int ret = 0;
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
int data_len = 96;
|
||||
unsigned int addr = 0xAC004000;
|
||||
unsigned char* data = (unsigned char*)calloc(data_len, 1);
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_ioctl function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_get_packet, sizeof(hid_get_packet));
|
||||
usb_buf[0x13] = 0x92;
|
||||
memcpy(&usb_buf[0x17], &addr, sizeof(addr));
|
||||
ret = usb_hid_ioctl(usb_buf, data, data_len, 0, true);
|
||||
free(data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
unsigned char RealtekARGBController::get_support_openrgb()
|
||||
{
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned char is_support = 0;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_ioctl function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_get_packet, sizeof(hid_get_packet));
|
||||
usb_buf[0x13] = 0xCC;
|
||||
usb_buf[0x14] = 0x04;
|
||||
usb_buf[0x15] = REALTEK_ARGB_SYNC_METHOD_OPENRGB;
|
||||
if(usb_hid_ioctl(usb_buf, &is_support, sizeof(is_support), 0, true))
|
||||
{
|
||||
is_support = 0;
|
||||
}
|
||||
return is_support;
|
||||
}
|
||||
|
||||
std::string RealtekARGBController::get_manu_name()
|
||||
{
|
||||
return StringUtils::wchar_to_char(hidinfo->manufacturer_string);
|
||||
}
|
||||
|
||||
std::string RealtekARGBController::get_product_name()
|
||||
{
|
||||
return StringUtils::wchar_to_char(hidinfo->product_string);
|
||||
}
|
||||
|
||||
std::string RealtekARGBController::get_sn()
|
||||
{
|
||||
return StringUtils::wchar_to_char(hidinfo->serial_number);
|
||||
}
|
||||
|
||||
std::string RealtekARGBController::get_dev_loc()
|
||||
{
|
||||
return hidinfo->path;
|
||||
}
|
||||
|
||||
std::string RealtekARGBController::get_fw_ver()
|
||||
{
|
||||
std::string ver = "";
|
||||
struct RealtekARGBControllerFWVersion fw_ver;
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_ioctl function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_get_packet, sizeof(hid_get_packet));
|
||||
usb_buf[0x13] = 0xA5;
|
||||
if(!usb_hid_ioctl(usb_buf, (unsigned char*)&fw_ver, sizeof(fw_ver), 0, true))
|
||||
{
|
||||
ver += std::to_string(fw_ver.fw_major_ver) + "." +
|
||||
std::to_string(fw_ver.fw_minor_ver) + "." +
|
||||
std::to_string(fw_ver.fw_extra_ver) + "." +
|
||||
std::to_string(fw_ver.fw_build_date);
|
||||
}
|
||||
return ver;
|
||||
}
|
||||
|
||||
std::string RealtekARGBController::get_ic_uuid()
|
||||
{
|
||||
unsigned int uuid = 0;
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_ioctl function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_get_packet, sizeof(hid_get_packet));
|
||||
usb_buf[0x13] = 0xC3;
|
||||
usb_hid_ioctl(usb_buf, (unsigned char*)&uuid, sizeof(uuid), 0, true);
|
||||
|
||||
return StringUtils::u32int_to_hexString(uuid);
|
||||
}
|
||||
|
||||
std::string RealtekARGBController::get_dev_name()
|
||||
{
|
||||
bool got_custled = false;
|
||||
std::string devname = get_product_name();
|
||||
|
||||
if(custled[0])
|
||||
{
|
||||
got_custled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!get_custled(custled, sizeof(custled)))
|
||||
{
|
||||
got_custled = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(got_custled)
|
||||
{
|
||||
if(custled[6] == REALTEK_ARGB_CUST_DEVNAME_MANU_UUID)
|
||||
{
|
||||
devname = get_manu_name() + get_ic_uuid();
|
||||
}
|
||||
}
|
||||
return devname;
|
||||
}
|
||||
|
||||
int RealtekARGBController::get_fix_grps()
|
||||
{
|
||||
bool got_custled = false;
|
||||
static int fix_grps = 0;
|
||||
|
||||
if(custled[0])
|
||||
{
|
||||
got_custled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!get_custled(custled, sizeof(custled)))
|
||||
{
|
||||
got_custled = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(got_custled)
|
||||
{
|
||||
fix_grps = custled[4];
|
||||
}
|
||||
return fix_grps;
|
||||
}
|
||||
|
||||
bool RealtekARGBController::get_zone_enable(int grp_num)
|
||||
{
|
||||
bool got_custled = false;
|
||||
bool en = false;
|
||||
|
||||
if(custled[0])
|
||||
{
|
||||
got_custled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!get_custled(custled, sizeof(custled)))
|
||||
{
|
||||
got_custled = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(got_custled)
|
||||
{
|
||||
en = (custled[5] & (0x1 << grp_num)) ? true : false;
|
||||
}
|
||||
return en;
|
||||
}
|
||||
|
||||
int RealtekARGBController::get_argb_num(int grp_num)
|
||||
{
|
||||
int num_rgb = 0;
|
||||
memcpy(&num_rgb, &argbctl_hdr[32 + grp_num * 2], 2);
|
||||
|
||||
return num_rgb;
|
||||
}
|
||||
|
||||
int RealtekARGBController::get_argb_brightness(int grp_num)
|
||||
{
|
||||
int bright = 0;
|
||||
memcpy(&bright, &argbctl_hdr[42 + grp_num * 2], 2);
|
||||
|
||||
return bright;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_argb_brightness(int grp_num, unsigned short bright)
|
||||
{
|
||||
memcpy(&argbctl_hdr[42 + grp_num * sizeof(bright)], &bright, sizeof(bright));
|
||||
set_argbctl_hdr();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_appctl(unsigned char grp_num, unsigned char ctl_sts)
|
||||
{
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_ioctl function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_set_packet, sizeof(hid_set_packet));
|
||||
usb_buf[0x13] = 0x4C;
|
||||
usb_buf[0x14] = 0x01;
|
||||
usb_buf[0x15] = ctl_sts;
|
||||
usb_buf[0x16] = grp_num;
|
||||
return usb_hid_ioctl(usb_buf, &ctl_sts, sizeof(ctl_sts), 0, false);
|
||||
}
|
||||
|
||||
int RealtekARGBController::get_custled(unsigned char* cust, unsigned int cust_len)
|
||||
{
|
||||
int ret = 0;
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned int addr = 0xAC004000;
|
||||
unsigned int offset = 0x800;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len + offset, 1);// will release in usb_hid_ioctl function
|
||||
unsigned char* data = (unsigned char*)calloc(buf_len, 1);
|
||||
|
||||
memset(data, 0x00, buf_len);
|
||||
memset(usb_buf, 0x00, buf_len + offset);
|
||||
memcpy(usb_buf, hid_get_packet, sizeof(hid_get_packet));
|
||||
usb_buf[0x13] = 0x92;
|
||||
memcpy(&usb_buf[0x17], &addr, sizeof(addr));
|
||||
ret = usb_hid_ioctl(usb_buf, data, buf_len, offset, true);
|
||||
if(!ret)
|
||||
{
|
||||
memcpy(cust, &data[70], cust_len);
|
||||
}
|
||||
free(data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int RealtekARGBController::get_argbctl_hdr()
|
||||
{
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_ioctl function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_get_packet, sizeof(hid_get_packet));
|
||||
usb_buf[0x13] = 0xCC;
|
||||
usb_buf[0x14] = 0x02;
|
||||
return usb_hid_ioctl(usb_buf, argbctl_hdr, REALTEK_ARGB_CTL_HDR_SIZE, 0, true);
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_argbctl_hdr()
|
||||
{
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_send/usb_hid_get function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_set_packet, sizeof(hid_set_packet));
|
||||
usb_buf[0x13] = 0x4C;
|
||||
usb_buf[0x14] = 0x02;
|
||||
return usb_hid_ioctl(usb_buf, argbctl_hdr, REALTEK_ARGB_CTL_HDR_SIZE, 0, false);
|
||||
}
|
||||
|
||||
int RealtekARGBController::get_argbctl_data()
|
||||
{
|
||||
int ret = 0;
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
int offset = REALTEK_ARGB_CTL_HDR_SIZE;
|
||||
unsigned char* usb_buf;
|
||||
|
||||
for(int i = 0; i < REALTEK_ARGB_NUM_ARGB_GRP; i++)
|
||||
{
|
||||
usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_send/usb_hid_get function
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_get_packet, sizeof(hid_get_packet));
|
||||
usb_buf[0x13] = 0xCC;
|
||||
usb_buf[0x14] = 0x02;
|
||||
memcpy(&usb_buf[0x17], &offset, sizeof(offset));
|
||||
ret = usb_hid_ioctl(usb_buf, argbctl_data[i], REALTEK_ARGB_CTL_DATA_SIZE, 0, true);
|
||||
offset += REALTEK_ARGB_CTL_DATA_SIZE;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_argbctl_data(unsigned char grp_num)
|
||||
{
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
int offset = REALTEK_ARGB_CTL_HDR_SIZE + REALTEK_ARGB_CTL_DATA_SIZE * grp_num;
|
||||
unsigned char* usb_buf;
|
||||
|
||||
usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_send/usb_hid_get function
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_set_packet, sizeof(hid_set_packet));
|
||||
usb_buf[0x13] = 0x4C;
|
||||
usb_buf[0x14] = 0x02;
|
||||
memcpy(&usb_buf[0x17], &offset, sizeof(offset));
|
||||
return usb_hid_ioctl(usb_buf, argbctl_data[grp_num], REALTEK_ARGB_CTL_DATA_SIZE, 0, false);
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_eff_id(unsigned char grp_num, unsigned short effid)
|
||||
{
|
||||
memcpy(argbctl_data[grp_num], &effid, sizeof(effid));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_p_color(unsigned char grp_num, RGBColor color)
|
||||
{
|
||||
memcpy(argbctl_data[grp_num] + 8, &color, sizeof(color));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_s_color(unsigned char grp_num, RGBColor color)
|
||||
{
|
||||
memcpy(argbctl_data[grp_num] + 12, &color, sizeof(color));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_cycle(unsigned char grp_num, unsigned short cycle)
|
||||
{
|
||||
memcpy(argbctl_data[grp_num] + 2, &cycle, sizeof(cycle));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_ramp(unsigned char grp_num, unsigned short ramp)
|
||||
{
|
||||
memcpy(argbctl_data[grp_num] + 4, &ramp, sizeof(ramp));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_stable(unsigned char grp_num, unsigned short stable)
|
||||
{
|
||||
memcpy(argbctl_data[grp_num] + 6, &stable, sizeof(stable));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_subcmd(unsigned char grp_num, int subcmd)
|
||||
{
|
||||
memcpy(argbctl_data[grp_num] + 16, &subcmd, sizeof(subcmd));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_direct(unsigned char* color, int color_num, unsigned char grp_num)
|
||||
{
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
int data_len = color_num * REALTEK_ARGB_COLOR_DEPTH;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_ioctl function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_set_packet, sizeof(hid_set_packet));
|
||||
usb_buf[0x13] = 0x4C;
|
||||
usb_buf[0x14] = 0x03;
|
||||
usb_buf[0x15] = REALTEK_ARGB_SYNC_METHOD_OPENRGB;
|
||||
usb_buf[0x16] = grp_num;
|
||||
memcpy(&usb_buf[0x17], &color_num, sizeof(color_num));
|
||||
return usb_hid_ioctl(usb_buf, color, data_len, 0, false);
|
||||
}
|
||||
|
||||
int RealtekARGBController::get_flash_argbctl_hdr(unsigned char* data)
|
||||
{
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned int addr = 0xAC000000;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_send/usb_hid_get function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_get_packet, sizeof(hid_get_packet));
|
||||
usb_buf[0x13] = 0x92;
|
||||
memcpy(&usb_buf[0x17], &addr, sizeof(addr));
|
||||
return usb_hid_ioctl(usb_buf, data, buf_len, 0, true);
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_flash_argbctl_hdr(unsigned int offset, unsigned int data_len)
|
||||
{
|
||||
int ret = 0;
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
unsigned int addr = 0xAC000000;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_send/usb_hid_get function
|
||||
unsigned char* data = (unsigned char*)calloc(buf_len, 1);
|
||||
memset(data, 0, buf_len);
|
||||
|
||||
ret = get_flash_argbctl_hdr(data);
|
||||
if(!ret)
|
||||
{
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_set_packet, sizeof(hid_set_packet));
|
||||
usb_buf[0x13] = 0x10;
|
||||
memcpy(&usb_buf[0x17], &addr, sizeof(addr));
|
||||
ret = usb_hid_ioctl(usb_buf, (unsigned char*)&addr, sizeof(addr), 0, false);
|
||||
|
||||
usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_send/usb_hid_get function
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_set_packet, sizeof(hid_set_packet));
|
||||
usb_buf[0x13] = 0x11;
|
||||
memcpy(data + offset, argbctl_hdr + offset, data_len);
|
||||
ret = usb_hid_ioctl(usb_buf, data, buf_len, 0, false);
|
||||
}
|
||||
free(data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_argb_direct(int grp_num, std::vector<RGBColor> color_buf, unsigned short brightness)
|
||||
{
|
||||
int ret = -1;
|
||||
size_t color_num = color_buf.size();
|
||||
size_t buf_len = color_num * REALTEK_ARGB_COLOR_DEPTH;
|
||||
unsigned char* buf;
|
||||
std::lock_guard<std::mutex> lock(my_mutex);
|
||||
|
||||
if(color_num == 0)
|
||||
{
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if(appctl[grp_num] != REALTEK_ARGB_LED_CTL_APP)
|
||||
{
|
||||
ret = set_appctl(grp_num, REALTEK_ARGB_LED_CTL_APP);
|
||||
if(ret)
|
||||
{
|
||||
goto exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
appctl[grp_num] = REALTEK_ARGB_LED_CTL_APP;
|
||||
}
|
||||
}
|
||||
|
||||
if(prev_bright[grp_num] != brightness)
|
||||
{
|
||||
prev_bright[grp_num] = brightness;
|
||||
ret = set_argb_brightness(grp_num, brightness << 8);
|
||||
if(ret)
|
||||
{
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
buf = (uint8_t*)malloc(buf_len);
|
||||
memset(buf, 0, buf_len);
|
||||
for(size_t i = 0; i < color_num; i++)
|
||||
{
|
||||
buf[i * REALTEK_ARGB_COLOR_DEPTH + 0] = RGBGetRValue(color_buf[i]);
|
||||
buf[i * REALTEK_ARGB_COLOR_DEPTH + 1] = RGBGetGValue(color_buf[i]);
|
||||
buf[i * REALTEK_ARGB_COLOR_DEPTH + 2] = RGBGetBValue(color_buf[i]);
|
||||
}
|
||||
ret = set_direct(buf, (int)color_num, grp_num);
|
||||
free(buf);
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_argb_effect(int grp_num, uint8_t mode, std::vector<RGBColor> color_buf, struct RealtekARGBControllerSetEffParam* param)
|
||||
{
|
||||
int ret = -1;
|
||||
int cycle = MathUtils::IntInterpolate(REALTEK_ARGB_CYCLE_MAX, REALTEK_ARGB_CYCLE_MIN, 0, REALTEK_ARGB_SPEED_MAX, param->speed);
|
||||
std::lock_guard<std::mutex> lock(my_mutex);
|
||||
|
||||
if(mode == REALTEK_ARGB_EFF_ALWAYS_ON || mode == REALTEK_ARGB_EFF_STACK)
|
||||
{
|
||||
cycle = 0;
|
||||
}
|
||||
|
||||
if(color_buf.size() >= 1)
|
||||
{
|
||||
set_p_color(grp_num, color_buf[0]);
|
||||
}
|
||||
if(color_buf.size() >= 2)
|
||||
{
|
||||
set_s_color(grp_num, color_buf[1]);
|
||||
}
|
||||
|
||||
set_eff_id(grp_num, mode);
|
||||
set_cycle(grp_num, cycle);
|
||||
set_ramp(grp_num, 0);
|
||||
set_stable(grp_num, 0);
|
||||
set_subcmd(grp_num, (param->dir || param->random_color) ? 0x1 : 0x0);
|
||||
set_argb_brightness(grp_num, param->brightness << 8);
|
||||
set_argbctl_data(grp_num);
|
||||
|
||||
ret = set_appctl(grp_num, REALTEK_ARGB_LED_CTL_FW);
|
||||
if(!ret)
|
||||
{
|
||||
appctl[grp_num] = REALTEK_ARGB_LED_CTL_FW;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int RealtekARGBController::set_argb_num(int grp_num, unsigned short new_num)
|
||||
{
|
||||
memcpy(&argbctl_hdr[32 + grp_num * sizeof(new_num)], &new_num, sizeof(new_num));
|
||||
set_flash_argbctl_hdr(32 + grp_num * sizeof(new_num), sizeof(new_num));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RealtekARGBController::device_reboot()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(my_mutex);
|
||||
int ret = 0;
|
||||
int buf_len = REALTEK_ARGB_HID_DATALEN_CH1;
|
||||
int reboot_type = 1;
|
||||
unsigned char* usb_buf = (unsigned char*)calloc(buf_len, 1);// will release in usb_hid_send/usb_hid_get function
|
||||
|
||||
memset(usb_buf, 0x00, buf_len);
|
||||
memcpy(usb_buf, hid_set_packet, sizeof(hid_set_packet));
|
||||
usb_buf[0x13] = 0x30;
|
||||
usb_buf[0x14] = reboot_type;
|
||||
ret = usb_hid_ioctl(usb_buf, (unsigned char*)&reboot_type, sizeof(reboot_type), 0, false);
|
||||
|
||||
hid_close(hdev);
|
||||
hdev = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void RealtekARGBController::device_rescan_trigger()
|
||||
{
|
||||
keepalive_thread_run = true;
|
||||
keepalive_thread = new std::thread(&RealtekARGBController::KeepaliveThreadFunction, this);
|
||||
}
|
||||
|
||||
void RealtekARGBController::device_rescan()
|
||||
{
|
||||
hid_device_info* info_full = hid_enumerate(REALTEK_ARGB_VID, REALTEK_ARGB_PID);
|
||||
hid_device_info* info_temp = info_full;
|
||||
|
||||
while(info_temp)
|
||||
{
|
||||
if(info_temp->vendor_id == REALTEK_ARGB_VID &&
|
||||
info_temp->product_id == REALTEK_ARGB_PID &&
|
||||
info_temp->usage == REALTEK_ARGB_HID2SCSI_USAGE &&
|
||||
info_temp->usage_page == REALTEK_ARGB_HID2SCSI_PG)
|
||||
{
|
||||
hid_device* dev_temp = hid_open_path(info_temp->path);
|
||||
if(dev_temp)
|
||||
{
|
||||
hdev = dev_temp;
|
||||
if(get_support_openrgb())
|
||||
{
|
||||
device_init();
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
hid_close(hdev);
|
||||
hdev = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
info_temp = info_temp->next;
|
||||
}
|
||||
hid_free_enumeration(info_full);
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RealtekARGBController.h |
|
||||
| |
|
||||
| Controller for Realtek USB ARGB ICs |
|
||||
| |
|
||||
| Jerry Fan (JerryFan0612) 13 Mar 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
#include <thread>
|
||||
#include <hidapi.h>
|
||||
|
||||
#include "RGBController.h"
|
||||
|
||||
#define REALTEK_ARGB_VID 0x0BDA
|
||||
#define REALTEK_ARGB_PID 0x9209
|
||||
#define REALTEK_ARGB_HID2SCSI_PG 0xFF00
|
||||
#define REALTEK_ARGB_HID2SCSI_USAGE 0x0001
|
||||
|
||||
#define REALTEK_ARGB_NUM_ARGB_GRP 5
|
||||
#define REALTEK_ARGB_BRINTF_TYPE_HID 1
|
||||
#define REALTEK_ARGB_SYNC_METHOD_OPENRGB 6
|
||||
#define REALTEK_ARGB_COLOR_DEPTH 3
|
||||
#define REALTEK_ARGB_MAX 400
|
||||
|
||||
#define REALTEK_ARGB_CTL_HDR_SIZE 80
|
||||
#define REALTEK_ARGB_CTL_DATA_SIZE 96
|
||||
|
||||
#define REALTEK_ARGB_HID_DATALEN_CH1 4096
|
||||
#define REALTEK_ARGB_HID_DATALEN_CH2 64
|
||||
#define REALTEK_ARGB_HID_DATALEN_CH3 512
|
||||
#define REALTEK_ARGB_HID_DATALEN_CH4 1200
|
||||
#define REALTEK_ARGB_HID_DATALEN_CH5 2048
|
||||
|
||||
#define REALTEK_ARGB_HID_ID_DATA_CH1 0x57
|
||||
#define REALTEK_ARGB_HID_ID_DATA_CH2 0x59
|
||||
#define REALTEK_ARGB_HID_ID_DATA_CH3 0x5A
|
||||
#define REALTEK_ARGB_HID_ID_DATA_CH4 0x5B
|
||||
#define REALTEK_ARGB_HID_ID_DATA_CH5 0x5C
|
||||
|
||||
enum REALTEK_ARGB_LED_CTL
|
||||
{
|
||||
REALTEK_ARGB_LED_CTL_FW,
|
||||
REALTEK_ARGB_LED_CTL_APP,
|
||||
REALTEK_ARGB_LED_CTL_LAMP,
|
||||
};
|
||||
|
||||
enum REALTEK_ARGB_EFFECT_ID
|
||||
{
|
||||
REALTEK_ARGB_EFF_NULL,
|
||||
REALTEK_ARGB_EFF_ALWAYS_ON,
|
||||
REALTEK_ARGB_EFF_BLINK,
|
||||
REALTEK_ARGB_EFF_BREATH,
|
||||
REALTEK_ARGB_EFF_SPECTRUM,
|
||||
REALTEK_ARGB_EFF_SCROLL,
|
||||
REALTEK_ARGB_EFF_RAINBOW_SCROLL,
|
||||
REALTEK_ARGB_EFF_RUNNING_WATER,
|
||||
REALTEK_ARGB_EFF_SLIDING,
|
||||
REALTEK_ARGB_EFF_NEWTON_CRADLE,
|
||||
REALTEK_ARGB_EFF_METEOR,
|
||||
REALTEK_ARGB_EFF_RAINBOW_SLIDING,
|
||||
REALTEK_ARGB_EFF_RAINBOW_FADE_SLIDING,
|
||||
REALTEK_ARGB_EFF_WIDE_SLIDING,
|
||||
REALTEK_ARGB_EFF_DOT_MATRIX, // reserved: Not supported by OpenRGB
|
||||
REALTEK_ARGB_EFF_DOT_MATRIX_BREATH, // reserved: Not supported by OpenRGB
|
||||
REALTEK_ARGB_EFF_ZIGZAG,
|
||||
REALTEK_ARGB_EFF_STARRY_NIGHT,
|
||||
REALTEK_ARGB_EFF_STACK,
|
||||
};
|
||||
|
||||
enum REALTEK_ARGB_SPEED
|
||||
{
|
||||
REALTEK_ARGB_SPEED_MIN = 1,
|
||||
REALTEK_ARGB_SPEED_NORMAL = 50,
|
||||
REALTEK_ARGB_SPEED_MAX = 100,
|
||||
};
|
||||
|
||||
enum REALTEK_ARGB_CYCLE_MS
|
||||
{
|
||||
REALTEK_ARGB_CYCLE_MIN = 200,
|
||||
REALTEK_ARGB_CYCLE_NORMAL = 2000,
|
||||
REALTEK_ARGB_CYCLE_MAX = 10000,
|
||||
};
|
||||
|
||||
enum REALTEK_ARGB_CUST_DEVNAME
|
||||
{
|
||||
REALTEK_ARGB_CUST_DEVNAME_NULL = 0x0,
|
||||
REALTEK_ARGB_CUST_DEVNAME_MANU_UUID = 0x1,
|
||||
};
|
||||
|
||||
struct RealtekARGBControllerSetEffParam
|
||||
{
|
||||
unsigned int speed;
|
||||
unsigned short brightness;
|
||||
unsigned char dir;
|
||||
unsigned char random_color;
|
||||
};
|
||||
|
||||
struct RealtekARGBControllerFWVersion
|
||||
{
|
||||
unsigned int fw_major_ver;
|
||||
unsigned int fw_minor_ver;
|
||||
unsigned int fw_extra_ver;
|
||||
unsigned int fw_build_ver;
|
||||
unsigned int fw_build_date;
|
||||
};
|
||||
|
||||
class RealtekARGBController
|
||||
{
|
||||
public:
|
||||
RealtekARGBController(hid_device* dev, hid_device_info* info);
|
||||
~RealtekARGBController();
|
||||
|
||||
unsigned char get_support_openrgb();
|
||||
std::string get_manu_name();
|
||||
std::string get_product_name();
|
||||
std::string get_sn();
|
||||
std::string get_dev_loc();
|
||||
std::string get_fw_ver();
|
||||
std::string get_ic_uuid();
|
||||
std::string get_dev_name();
|
||||
int get_fix_grps();
|
||||
bool get_zone_enable(int grp_num);
|
||||
int get_argb_num(int grp_num);
|
||||
int get_argb_brightness(int grp_num);
|
||||
int set_argb_brightness(int grp_num, unsigned short bright);
|
||||
|
||||
int set_argb_direct(int grp_num, std::vector<RGBColor> color_buf, unsigned short brightness);
|
||||
int set_argb_effect(int grp_num, uint8_t mode, std::vector<RGBColor> color_buf, struct RealtekARGBControllerSetEffParam* param);
|
||||
int set_argb_num(int grp_num, unsigned short new_num);
|
||||
int device_reboot();
|
||||
void device_rescan_trigger();
|
||||
private:
|
||||
hid_device* hdev;
|
||||
std::mutex my_mutex;
|
||||
unsigned char argbctl_hdr[REALTEK_ARGB_CTL_HDR_SIZE] = {0};
|
||||
unsigned char* argbctl_data[REALTEK_ARGB_NUM_ARGB_GRP] = {0};
|
||||
hid_device_info* hidinfo = NULL;
|
||||
int appctl[REALTEK_ARGB_NUM_ARGB_GRP] = {REALTEK_ARGB_LED_CTL_FW};
|
||||
unsigned short prev_bright[REALTEK_ARGB_NUM_ARGB_GRP] = {0};
|
||||
std::atomic<bool> keepalive_thread_run;
|
||||
std::thread* keepalive_thread;
|
||||
unsigned char custled[16] = {0};
|
||||
|
||||
void KeepaliveThreadFunction();
|
||||
|
||||
int usb_hid_ioctl(unsigned char* usb_buf, unsigned char* data, int data_len,
|
||||
unsigned int offset, unsigned char is_in);
|
||||
int usb_hid_get_report(int data_len, int* id);
|
||||
|
||||
void device_init();
|
||||
int set_write_unlock();
|
||||
int set_appctl(unsigned char grp_num, unsigned char ctl_sts);
|
||||
int set_argbctl_data(unsigned char* data, int data_len, int offset);
|
||||
int get_custled(unsigned char* cust, unsigned int cust_len);
|
||||
int get_argbctl_hdr();
|
||||
int set_argbctl_hdr();
|
||||
int get_argbctl_data();
|
||||
int set_argbctl_data(unsigned char grp_num);
|
||||
int set_eff_id(unsigned char grp_num, unsigned short effid);
|
||||
int set_p_color(unsigned char grp_num, RGBColor color);
|
||||
int set_s_color(unsigned char grp_num, RGBColor color);
|
||||
int set_cycle(unsigned char grp_num, unsigned short cycle);
|
||||
int set_ramp(unsigned char grp_num, unsigned short ramp);
|
||||
int set_stable(unsigned char grp_num, unsigned short stable);
|
||||
int set_subcmd(unsigned char grp_num, int subcmd);
|
||||
int set_direct(unsigned char* color, int color_num, unsigned char grp_num);
|
||||
|
||||
int get_flash_argbctl_hdr(unsigned char* data);
|
||||
int set_flash_argbctl_hdr(unsigned int offset, unsigned int data_len);
|
||||
|
||||
void device_rescan();
|
||||
};
|
||||
@@ -0,0 +1,52 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RealtekARGBControllerDetect.cpp |
|
||||
| |
|
||||
| Detector for Realtek USB ARGB ICs |
|
||||
| |
|
||||
| Jerry Fan (JerryFan0612) 13 Mar 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "Detector.h"
|
||||
#include "RGBController.h"
|
||||
#include "RGBController_RealtekARGB.h"
|
||||
|
||||
/******************************************************************************************\
|
||||
* *
|
||||
* DetectRealtekARGBControllers *
|
||||
* *
|
||||
* Tests the USB address to see if an Realtek ARGB controller exists there *
|
||||
* *
|
||||
\******************************************************************************************/
|
||||
void DetectRealtekARGBControllers(hid_device_info* info, const std::string& /*name*/)
|
||||
{
|
||||
RealtekARGBController* controller = NULL;
|
||||
RGBController_RealtekARGB* rgb_controller = NULL;
|
||||
hid_device* dev = hid_open_path(info->path);
|
||||
|
||||
if(dev)
|
||||
{
|
||||
controller = new RealtekARGBController(dev, info);
|
||||
if(controller->get_support_openrgb())
|
||||
{
|
||||
rgb_controller = new RGBController_RealtekARGB(controller);
|
||||
if(rgb_controller->type != DEVICE_TYPE_UNKNOWN)
|
||||
{
|
||||
ResourceManager::get()->RegisterRGBController(rgb_controller);
|
||||
}
|
||||
else
|
||||
{
|
||||
delete rgb_controller;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
delete controller;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
REGISTER_HID_DETECTOR_PU("RTL9209", DetectRealtekARGBControllers, REALTEK_ARGB_VID, REALTEK_ARGB_PID, REALTEK_ARGB_HID2SCSI_PG, REALTEK_ARGB_HID2SCSI_USAGE);
|
||||
Reference in New Issue
Block a user