add support for manli RTX 4090 gallardo issue #4168
parent
7a4eb4ddf8
commit
555fb7b042
@ -0,0 +1,125 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| ManliGPUController.cpp |
|
||||
| |
|
||||
| Driver for Manli GPU RGB controllers |
|
||||
| |
|
||||
| Based on ZotacV2GPUController |
|
||||
| Adapted for Manli RTX 4090 Gallardo |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "ManliGPUController.h"
|
||||
|
||||
ManliGPUController::ManliGPUController(i2c_smbus_interface* bus, u8 dev, std::string dev_name)
|
||||
{
|
||||
this->bus = bus;
|
||||
this->dev = dev;
|
||||
this->name = dev_name;
|
||||
|
||||
if(dev)
|
||||
{
|
||||
ReadVersion();
|
||||
}
|
||||
}
|
||||
|
||||
ManliGPUController::~ManliGPUController()
|
||||
{
|
||||
}
|
||||
|
||||
std::string ManliGPUController::GetDeviceLocation()
|
||||
{
|
||||
std::string return_string(bus->device_name);
|
||||
char addr[5];
|
||||
snprintf(addr, 5, "0x%02X", dev);
|
||||
return_string.append(", address ");
|
||||
return_string.append(addr);
|
||||
return ("I2C: " + return_string);
|
||||
}
|
||||
|
||||
std::string ManliGPUController::GetName()
|
||||
{
|
||||
return(name);
|
||||
}
|
||||
|
||||
std::string ManliGPUController::GetVersion()
|
||||
{
|
||||
return(version);
|
||||
}
|
||||
|
||||
bool ManliGPUController::ReadVersion()
|
||||
{
|
||||
u8 data_pkt[] = { MANLI_GPU_REG_RGB, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
if(bus->i2c_write_block(dev, sizeof(data_pkt), data_pkt) < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
u8 rdata_pkt[I2C_SMBUS_BLOCK_MAX] = { 0x00 };
|
||||
int rdata_len = sizeof(rdata_pkt);
|
||||
if(bus->i2c_read_block(dev, &rdata_len, rdata_pkt) < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
version = std::string((char*)rdata_pkt);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ManliGPUController::TurnOnOff(bool on)
|
||||
{
|
||||
ManliGPUZone zoneConfig;
|
||||
return SendCommand(on, zoneConfig);
|
||||
}
|
||||
|
||||
bool ManliGPUController::SetMode(ManliGPUZone zoneConfig)
|
||||
{
|
||||
return SendCommand(true, zoneConfig);
|
||||
}
|
||||
|
||||
bool ManliGPUController::SendCommand(bool on, ManliGPUZone zoneConfig)
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| Color Cycle: Uses breathing mode (0x01) with flag 0x07 |
|
||||
| This cycles through colors with brightness and speed |
|
||||
\*---------------------------------------------------------*/
|
||||
if(zoneConfig.mode == MANLI_GPU_MODE_COLOR_CYCLE)
|
||||
{
|
||||
u8 data_pkt[30] = { 0x00 };
|
||||
data_pkt[0] = on ? (u8)0x01 : (u8)0x00;
|
||||
data_pkt[6] = 0x01; // mode = breathing
|
||||
data_pkt[7] = 0x00; // R
|
||||
data_pkt[8] = 0x00; // G
|
||||
data_pkt[9] = 0x00; // B
|
||||
data_pkt[10] = (u8)zoneConfig.speed;
|
||||
data_pkt[11] = (u8)zoneConfig.brightness;
|
||||
data_pkt[13] = 0x07; // color cycle flag
|
||||
|
||||
if(bus->i2c_smbus_write_i2c_block_data(dev, MANLI_GPU_REG_RGB, sizeof(data_pkt), data_pkt) < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/*---------------------------------------------------------*\
|
||||
| Standard modes (Static, Breathing, Wave, Strobing, Rainbow)|
|
||||
\*---------------------------------------------------------*/
|
||||
else
|
||||
{
|
||||
u8 data_pkt[30] = { 0x00 };
|
||||
data_pkt[0] = on ? (u8)0x01 : (u8)0x00;
|
||||
data_pkt[6] = (u8)zoneConfig.mode;
|
||||
data_pkt[7] = (u8)RGBGetRValue(zoneConfig.color1);
|
||||
data_pkt[8] = (u8)RGBGetGValue(zoneConfig.color1);
|
||||
data_pkt[9] = (u8)RGBGetBValue(zoneConfig.color1);
|
||||
data_pkt[10] = (u8)zoneConfig.speed;
|
||||
data_pkt[11] = (u8)zoneConfig.brightness;
|
||||
|
||||
if(bus->i2c_smbus_write_i2c_block_data(dev, MANLI_GPU_REG_RGB, sizeof(data_pkt), data_pkt) < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| ManliGPUController.h |
|
||||
| |
|
||||
| Driver for Manli GPU RGB controllers |
|
||||
| |
|
||||
| Based on ZotacV2GPUController |
|
||||
| Adapted for Manli RTX 4090 Gallardo |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include "i2c_smbus.h"
|
||||
#include "RGBController.h"
|
||||
|
||||
enum
|
||||
{
|
||||
MANLI_GPU_REG_RGB = 0xA0,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MANLI_GPU_MODE_STATIC = 0x00, // Static color
|
||||
MANLI_GPU_MODE_BREATHING = 0x01, // Breathing effect
|
||||
MANLI_GPU_MODE_WAVE = 0x02, // Wave effect (no brightness - HW limitation)
|
||||
MANLI_GPU_MODE_STROBING = 0x03, // Strobing effect
|
||||
MANLI_GPU_MODE_RAINBOW = 0x08, // Rainbow effect (no brightness - HW limitation)
|
||||
MANLI_GPU_MODE_COLOR_CYCLE = 0x10, // Color Cycle (breathing + flag 0x07)
|
||||
};
|
||||
|
||||
struct ManliGPUConfig
|
||||
{
|
||||
int numberOfZones = 0;
|
||||
bool supportsExternalLEDStrip = false;
|
||||
};
|
||||
|
||||
struct ManliGPUZone
|
||||
{
|
||||
int mode = 0;
|
||||
RGBColor color1 = ToRGBColor(0, 0, 0);
|
||||
unsigned int speed = 0;
|
||||
unsigned int brightness = 0;
|
||||
};
|
||||
|
||||
class ManliGPUController
|
||||
{
|
||||
public:
|
||||
ManliGPUController(i2c_smbus_interface* bus, u8 dev, std::string dev_name);
|
||||
~ManliGPUController();
|
||||
|
||||
std::string GetDeviceLocation();
|
||||
std::string GetName();
|
||||
std::string GetVersion();
|
||||
|
||||
bool TurnOnOff(bool on);
|
||||
bool SetMode(ManliGPUZone zoneConfig);
|
||||
|
||||
private:
|
||||
i2c_smbus_interface* bus;
|
||||
u8 dev;
|
||||
std::string name;
|
||||
std::string version;
|
||||
|
||||
bool ReadVersion();
|
||||
bool SendCommand(bool on, ManliGPUZone zoneConfig);
|
||||
};
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| ManliGPUControllerDetect.cpp |
|
||||
| |
|
||||
| Detector for Manli GPU |
|
||||
| |
|
||||
| Based on ZotacV2GPUControllerDetect |
|
||||
| Adapted for Manli RTX 4090 Gallardo |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "Detector.h"
|
||||
#include "ManliGPUController.h"
|
||||
#include "RGBController_ManliGPU.h"
|
||||
#include "i2c_smbus.h"
|
||||
#include "pci_ids.h"
|
||||
#include "LogManager.h"
|
||||
|
||||
/******************************************************************************************\
|
||||
* *
|
||||
* DetectManliGPUControllers *
|
||||
* *
|
||||
* Detect Manli GPU RGB controllers on the enumerated I2C busses *
|
||||
* at address 0x49. *
|
||||
* *
|
||||
* bus - pointer to i2c_smbus_interface where RGB device is connected *
|
||||
* dev - I2C address of RGB device *
|
||||
* *
|
||||
\******************************************************************************************/
|
||||
|
||||
void DetectManliGPUControllers(i2c_smbus_interface* bus, u8 i2c_addr, const std::string& name)
|
||||
{
|
||||
u8 data_pkt[] = { MANLI_GPU_REG_RGB, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
if(bus->i2c_write_block(i2c_addr, sizeof(data_pkt), data_pkt) < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
u8 rdata_pkt[I2C_SMBUS_BLOCK_MAX] = { 0x00 };
|
||||
int rdata_len = sizeof(rdata_pkt);
|
||||
|
||||
if(bus->i2c_read_block(i2c_addr, &rdata_len, rdata_pkt) >= 0)
|
||||
{
|
||||
ManliGPUController* controller = new ManliGPUController(bus, i2c_addr, name);
|
||||
RGBController_ManliGPU* rgb_controller = new RGBController_ManliGPU(controller);
|
||||
|
||||
if(rgb_controller->config.numberOfZones > 0)
|
||||
{
|
||||
ResourceManager::get()->RegisterRGBController(rgb_controller);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_ERROR("[%s] RGB controller not registered - invalid zone count: %d", name.c_str(), rgb_controller->config.numberOfZones);
|
||||
delete rgb_controller;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
REGISTER_I2C_PCI_DETECTOR("MANLI GeForce RTX 4090 Gallardo", DetectManliGPUControllers, NVIDIA_VEN, NVIDIA_RTX4090_DEV, NVIDIA_SUB_VEN, MANLI_RTX4090_GALLARDO_SUB_DEV, 0x49);
|
||||
|
||||
@ -0,0 +1,201 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_ManliGPU.cpp |
|
||||
| |
|
||||
| RGBController for Manli GPU |
|
||||
| |
|
||||
| Based on RGBController_ZotacV2GPU |
|
||||
| Adapted for Manli RTX 4090 Gallardo |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include <map>
|
||||
#include "RGBController_ManliGPU.h"
|
||||
|
||||
std::map<std::string, ManliGPUConfig> MANLI_GPU_CONFIG =
|
||||
{
|
||||
{ "N675M-1018", { 1, false } }, // MANLI GeForce RTX 4090 Gallardo
|
||||
};
|
||||
|
||||
/**------------------------------------------------------------------*\
|
||||
@name Manli GPU
|
||||
@category GPU
|
||||
@type I2C
|
||||
@save :robot:
|
||||
@direct :x:
|
||||
@effects :white_check_mark:
|
||||
@detectors DetectManliGPUControllers
|
||||
@comment
|
||||
Manli GPU RGB controllers use I2C communication at address 0x49.
|
||||
Supported modes: Static, Breathing, Wave, Strobing, Rainbow, Color Cycle.
|
||||
\*-------------------------------------------------------------------*/
|
||||
|
||||
RGBController_ManliGPU::RGBController_ManliGPU(ManliGPUController* controller_ptr)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
|
||||
name = controller->GetName();
|
||||
vendor = "MANLI";
|
||||
description = "MANLI RGB GPU Device (" + controller->GetVersion() + ")";
|
||||
location = controller->GetDeviceLocation();
|
||||
type = DEVICE_TYPE_GPU;
|
||||
|
||||
if(MANLI_GPU_CONFIG.count(controller->GetVersion()) > 0)
|
||||
{
|
||||
config = MANLI_GPU_CONFIG.at(controller->GetVersion());
|
||||
}
|
||||
else
|
||||
{
|
||||
config = { 0, false };
|
||||
}
|
||||
|
||||
version += std::to_string(config.numberOfZones) + " zones";
|
||||
|
||||
mode STATIC;
|
||||
STATIC.name = "Static";
|
||||
STATIC.value = MANLI_GPU_MODE_STATIC;
|
||||
STATIC.flags = MODE_FLAG_AUTOMATIC_SAVE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
|
||||
STATIC.brightness_min = 0;
|
||||
STATIC.brightness_max = 100;
|
||||
STATIC.brightness = 100;
|
||||
STATIC.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
STATIC.colors_min = 1;
|
||||
STATIC.colors_max = 1;
|
||||
STATIC.colors.resize(1);
|
||||
STATIC.colors[0] = ToRGBColor(0, 0, 255);
|
||||
modes.push_back(STATIC);
|
||||
|
||||
mode BREATHING;
|
||||
BREATHING.name = "Breathing";
|
||||
BREATHING.value = MANLI_GPU_MODE_BREATHING;
|
||||
BREATHING.flags = MODE_FLAG_AUTOMATIC_SAVE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
|
||||
BREATHING.brightness_min = 0;
|
||||
BREATHING.brightness_max = 100;
|
||||
BREATHING.brightness = 100;
|
||||
BREATHING.speed_min = 0;
|
||||
BREATHING.speed_max = 100;
|
||||
BREATHING.speed = 50;
|
||||
BREATHING.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
BREATHING.colors_min = 1;
|
||||
BREATHING.colors_max = 1;
|
||||
BREATHING.colors.resize(1);
|
||||
BREATHING.colors[0] = ToRGBColor(0, 0, 255);
|
||||
modes.push_back(BREATHING);
|
||||
|
||||
mode WAVE;
|
||||
WAVE.name = "Wave";
|
||||
WAVE.value = MANLI_GPU_MODE_WAVE;
|
||||
WAVE.flags = MODE_FLAG_AUTOMATIC_SAVE | MODE_FLAG_HAS_SPEED; // No brightness - HW limitation
|
||||
WAVE.speed_min = 0;
|
||||
WAVE.speed_max = 100;
|
||||
WAVE.speed = 50;
|
||||
WAVE.color_mode = MODE_COLORS_NONE;
|
||||
modes.push_back(WAVE);
|
||||
|
||||
mode STROBING;
|
||||
STROBING.name = "Strobing";
|
||||
STROBING.value = MANLI_GPU_MODE_STROBING;
|
||||
STROBING.flags = MODE_FLAG_AUTOMATIC_SAVE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
|
||||
STROBING.brightness_min = 0;
|
||||
STROBING.brightness_max = 100;
|
||||
STROBING.brightness = 100;
|
||||
STROBING.speed_min = 0;
|
||||
STROBING.speed_max = 100;
|
||||
STROBING.speed = 50;
|
||||
STROBING.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
STROBING.colors_min = 1;
|
||||
STROBING.colors_max = 1;
|
||||
STROBING.colors.resize(1);
|
||||
STROBING.colors[0] = ToRGBColor(0, 0, 255);
|
||||
modes.push_back(STROBING);
|
||||
|
||||
mode RAINBOW;
|
||||
RAINBOW.name = "Rainbow";
|
||||
RAINBOW.value = MANLI_GPU_MODE_RAINBOW;
|
||||
RAINBOW.flags = MODE_FLAG_AUTOMATIC_SAVE | MODE_FLAG_HAS_SPEED;
|
||||
RAINBOW.speed_min = 0;
|
||||
RAINBOW.speed_max = 100;
|
||||
RAINBOW.speed = 50;
|
||||
RAINBOW.color_mode = MODE_COLORS_NONE;
|
||||
modes.push_back(RAINBOW);
|
||||
|
||||
mode COLOR_CYCLE;
|
||||
COLOR_CYCLE.name = "Color Cycle";
|
||||
COLOR_CYCLE.value = MANLI_GPU_MODE_COLOR_CYCLE;
|
||||
COLOR_CYCLE.flags = MODE_FLAG_AUTOMATIC_SAVE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
||||
COLOR_CYCLE.brightness_min = 0;
|
||||
COLOR_CYCLE.brightness_max = 100;
|
||||
COLOR_CYCLE.brightness = 100;
|
||||
COLOR_CYCLE.speed_min = 0;
|
||||
COLOR_CYCLE.speed_max = 100;
|
||||
COLOR_CYCLE.speed = 50;
|
||||
COLOR_CYCLE.color_mode = MODE_COLORS_NONE;
|
||||
modes.push_back(COLOR_CYCLE);
|
||||
|
||||
SetupZones();
|
||||
}
|
||||
|
||||
RGBController_ManliGPU::~RGBController_ManliGPU()
|
||||
{
|
||||
delete controller;
|
||||
}
|
||||
|
||||
void RGBController_ManliGPU::SetupZones()
|
||||
{
|
||||
led new_led;
|
||||
new_led.name = "GPU LED";
|
||||
leds.push_back(new_led);
|
||||
|
||||
zone new_zone;
|
||||
new_zone.name = "GPU Zone";
|
||||
new_zone.type = ZONE_TYPE_SINGLE;
|
||||
new_zone.leds_min = 1;
|
||||
new_zone.leds_max = 1;
|
||||
new_zone.leds_count = 1;
|
||||
new_zone.matrix_map = NULL;
|
||||
zones.push_back(new_zone);
|
||||
|
||||
SetupColors();
|
||||
}
|
||||
|
||||
void RGBController_ManliGPU::ResizeZone(int /*zone*/, int /*new_size*/)
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| This device does not support resizing zones |
|
||||
\*---------------------------------------------------------*/
|
||||
}
|
||||
|
||||
void RGBController_ManliGPU::DeviceUpdateLEDs()
|
||||
{
|
||||
DeviceUpdateMode();
|
||||
}
|
||||
|
||||
void RGBController_ManliGPU::UpdateZoneLEDs(int /*zone*/)
|
||||
{
|
||||
DeviceUpdateMode();
|
||||
}
|
||||
|
||||
void RGBController_ManliGPU::UpdateSingleLED(int /*led*/)
|
||||
{
|
||||
DeviceUpdateMode();
|
||||
}
|
||||
|
||||
void RGBController_ManliGPU::DeviceUpdateMode()
|
||||
{
|
||||
ManliGPUZone zoneConfig;
|
||||
zoneConfig.mode = modes[active_mode].value;
|
||||
zoneConfig.speed = modes[active_mode].speed;
|
||||
zoneConfig.brightness = modes[active_mode].brightness;
|
||||
|
||||
if(modes[active_mode].colors.size() >= 1)
|
||||
{
|
||||
zoneConfig.color1 = modes[active_mode].colors[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
zoneConfig.color1 = ToRGBColor(0, 0, 0);
|
||||
}
|
||||
|
||||
controller->SetMode(zoneConfig);
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_ManliGPU.h |
|
||||
| |
|
||||
| RGBController for Manli GPU |
|
||||
| |
|
||||
| Based on RGBController_ZotacV2GPU |
|
||||
| Adapted for Manli RTX 4090 Gallardo |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "RGBController.h"
|
||||
#include "ManliGPUController.h"
|
||||
|
||||
class RGBController_ManliGPU : public RGBController
|
||||
{
|
||||
public:
|
||||
RGBController_ManliGPU(ManliGPUController* controller_ptr);
|
||||
~RGBController_ManliGPU();
|
||||
|
||||
void SetupZones();
|
||||
|
||||
void ResizeZone(int zone, int new_size);
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
void UpdateZoneLEDs(int zone);
|
||||
void UpdateSingleLED(int led);
|
||||
|
||||
void DeviceUpdateMode();
|
||||
|
||||
ManliGPUConfig config;
|
||||
|
||||
private:
|
||||
ManliGPUController* controller;
|
||||
};
|
||||
|
||||
Loading…
Reference in New Issue