From 9f653577cd878ec80c06d525cec383c613caecf4 Mon Sep 17 00:00:00 2001 From: Fan Yu Date: Tue, 3 Oct 2023 04:11:01 +0000 Subject: [PATCH] Initial commit for PNY_RTX_4090_XLR8_SUB_DEV --- .../PNYLovelaceGPUController.cpp | 71 +++++++ .../PNYLovelaceGPUController.h | 50 +++++ .../PNYLovelaceGPUControllerDetect.cpp | 38 ++++ .../RGBController_PNYLovelaceGPU.cpp | 198 ++++++++++++++++++ .../RGBController_PNYLovelaceGPU.h | 31 +++ OpenRGB.pro | 6 + pci_ids/pci_ids.h | 1 + 7 files changed, 395 insertions(+) create mode 100644 Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.cpp create mode 100644 Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.h create mode 100644 Controllers/PNYLovelaceGPUController/PNYLovelaceGPUControllerDetect.cpp create mode 100644 Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.cpp create mode 100644 Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.h diff --git a/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.cpp b/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.cpp new file mode 100644 index 00000000..a96eacd0 --- /dev/null +++ b/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.cpp @@ -0,0 +1,71 @@ +/*-----------------------------------------*\ +| PNYLovelaceGPUController.cpp | +| | +| Driver for PNY GPU RGB (Lovelace) | +| lighting controller | +| | +| yufan 10/1/2023 | +\*-----------------------------------------*/ + +#include "PNYLovelaceGPUController.h" + +PNYLovelaceGPUController::PNYLovelaceGPUController(i2c_smbus_interface* bus, pny_dev_id dev) +{ + this->bus = bus; + this->dev = dev; +} + +PNYLovelaceGPUController::~PNYLovelaceGPUController() +{ + +} + +std::string PNYLovelaceGPUController::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); +} + +void PNYLovelaceGPUController::SetOff() +{ + unsigned char data[7] = {}; + bus->i2c_smbus_write_i2c_block_data(dev, PNY_GPU_REG_LIGHTING, sizeof(data), data); +} + +void PNYLovelaceGPUController::SetDirect(unsigned char led, unsigned char red, unsigned char green, unsigned char blue) +{ + unsigned char data[7] = {PNY_GPU_MODE_STATIC, 0xFF, led, 0x00, red, green, blue}; + bus->i2c_smbus_write_i2c_block_data(dev, PNY_GPU_REG_LIGHTING, sizeof(data), data); +} + +void PNYLovelaceGPUController::SetCycle(unsigned char speed, unsigned char brightness) +{ + speed = 0xB2 - speed; + unsigned char data[7] = {PNY_GPU_MODE_CYCLE, brightness, speed, 0x00, 0xAA, 0x00, 0x00}; + bus->i2c_smbus_write_i2c_block_data(dev, PNY_GPU_REG_LIGHTING, sizeof(data), data); +} + +void PNYLovelaceGPUController::SetBreath(unsigned char speed, unsigned char red, unsigned char green, unsigned char blue) +{ + speed = 0x19 - speed; + unsigned char data[7] = {PNY_GPU_MODE_BREATH, 0xFF, speed, 0x01, red, green, blue}; + bus->i2c_smbus_write_i2c_block_data(dev, PNY_GPU_REG_LIGHTING, sizeof(data), data); +} + +void PNYLovelaceGPUController::SetWave(unsigned char speed, unsigned char brightness) +{ + speed = 0xBF - speed; + unsigned char data[7] = {PNY_GPU_MODE_WAVE, brightness, speed, 0x00, 0xAA, 0x00, 0x00}; + bus->i2c_smbus_write_i2c_block_data(dev, PNY_GPU_REG_LIGHTING, sizeof(data), data); +} + +void PNYLovelaceGPUController::SetFlash(unsigned char speed, unsigned char brightness, unsigned char red, unsigned char green, unsigned char blue) +{ + speed = 0x4D - speed; + unsigned char data[7] = {PNY_GPU_MODE_FLASH, brightness, speed, 0x00, red, green, blue}; + bus->i2c_smbus_write_i2c_block_data(dev, PNY_GPU_REG_LIGHTING, sizeof(data), data); +} diff --git a/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.h b/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.h new file mode 100644 index 00000000..f106a098 --- /dev/null +++ b/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.h @@ -0,0 +1,50 @@ +/*-----------------------------------------*\ +| PNYLovelaceGPUController.h | +| | +| Definitions and types for PNY GPU RGB | +| (Lovelace) lighting controller | +| | +| yufan 10/1/2023 | +\*-----------------------------------------*/ + +#include +#include "i2c_smbus.h" + +#pragma once + +typedef unsigned char pny_dev_id; + +enum +{ + PNY_GPU_MODE_OFF = 0x00, + PNY_GPU_MODE_BREATH = 0x02, + PNY_GPU_MODE_CYCLE = 0x03, + PNY_GPU_MODE_WAVE = 0x04, + PNY_GPU_MODE_FLASH = 0x05, + PNY_GPU_MODE_STATIC = 0x06, +}; + +enum +{ + PNY_GPU_REG_LIGHTING = 0x02, +}; + +class PNYLovelaceGPUController +{ +public: + PNYLovelaceGPUController(i2c_smbus_interface* bus, pny_dev_id dev); + ~PNYLovelaceGPUController(); + + std::string GetDeviceLocation(); + void SetOff(); + void SetBreath(unsigned char speed, unsigned char red, unsigned char green, unsigned char blue); + void SetCycle(unsigned char speed, unsigned char brightness); + void SetWave(unsigned char speed, unsigned char brightness); + void SetFlash(unsigned char speed, unsigned char brightness, unsigned char red, unsigned char green, unsigned char blue); + void SetDirect(unsigned char led, unsigned char red, unsigned char green, unsigned char blue); + +private: + i2c_smbus_interface* bus; + pny_dev_id dev; +}; + diff --git a/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUControllerDetect.cpp b/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUControllerDetect.cpp new file mode 100644 index 00000000..5440d100 --- /dev/null +++ b/Controllers/PNYLovelaceGPUController/PNYLovelaceGPUControllerDetect.cpp @@ -0,0 +1,38 @@ +#include "Detector.h" +#include "LogManager.h" +#include "PNYLovelaceGPUController.h" +#include "RGBController.h" +#include "RGBController_PNYLovelaceGPU.h" +#include "i2c_smbus.h" +#include "pci_ids.h" +#include +#include +#include + +/******************************************************************************************\ + * * + * DetectPNYLovelaceGPUControllers * + * * + * Detect PNY 40xx GPU controllers on the enumerated I2C busses at address 0x60. * + * * + * bus - pointer to i2c_smbus_interface where PNY GPU device is connected * + * dev - I2C address of PNY GPU device * + * * +\******************************************************************************************/ + +void DetectPNYLovelaceGPUControllers(i2c_smbus_interface* bus, uint8_t i2c_addr, const std::string& name) +{ + if(bus->port_id != 1) + { + return; + } + + PNYLovelaceGPUController* controller = new PNYLovelaceGPUController(bus, i2c_addr); + RGBController_PNYLovelaceGPU* rgb_controller = new RGBController_PNYLovelaceGPU(controller); + rgb_controller->name = name; + rgb_controller->vendor = name.substr(0, name.find(' ')); + + ResourceManager::get()->RegisterRGBController(rgb_controller); +} /* DetectPNYLovelaceGPUControllers() */ + +REGISTER_I2C_PCI_DETECTOR("PNY 4090 XLR8", DetectPNYLovelaceGPUControllers, NVIDIA_VEN, NVIDIA_RTX4090_DEV, PNY_SUB_VEN, PNY_RTX_4090_XLR8_SUB_DEV, 0x60); diff --git a/Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.cpp b/Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.cpp new file mode 100644 index 00000000..2bca8089 --- /dev/null +++ b/Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.cpp @@ -0,0 +1,198 @@ +/*-----------------------------------------*\ +| RGBController_PNYLovelaceGPU.cpp | +| | +| Generic RGB Interface for OpenRGB PNY | +| GPU (Lovelace) Driver | +| | +| yufan 10/1/2023 | +\*-----------------------------------------*/ + +#include "RGBController_PNYLovelaceGPU.h" + +/**------------------------------------------------------------------*\ + @name PNY GPU 40xx + @category GPU + @type I2C + @save :x: + @direct :white_check_mark: + @effects :white_check_mark: + @detectors DetectPNYLovelaceGPUControllers + @comment +\*-------------------------------------------------------------------*/ + +RGBController_PNYLovelaceGPU::RGBController_PNYLovelaceGPU(PNYLovelaceGPUController* controller_ptr) +{ + controller = controller_ptr; + + name = "PNY GPU"; + vendor = "PNY"; + description = "PNY RGB GPU Device"; + location = controller->GetDeviceLocation(); + + type = DEVICE_TYPE_GPU; + + mode Off; + Off.name = "Off"; + Off.value = PNY_GPU_MODE_OFF; + Off.flags = 0; + Off.color_mode = MODE_COLORS_NONE; + modes.push_back(Off); + + mode Direct; + Direct.name = "Direct"; + Direct.value = PNY_GPU_MODE_STATIC; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Direct); + + mode Cycle; + Cycle.name = "Cycle"; + Cycle.value = PNY_GPU_MODE_CYCLE; + Cycle.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS; + Cycle.speed = 0x89; + Cycle.speed_min = 0; + Cycle.speed_max = 0xB2; + Cycle.brightness = 0xFF; + Cycle.brightness_min = 0; + Cycle.brightness_max = 0xFF; + Cycle.color_mode = MODE_COLORS_NONE; + modes.push_back(Cycle); + + mode Breath; + Breath.name = "Breath"; + Breath.value = PNY_GPU_MODE_BREATH; + Breath.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Breath.speed = 0x09; + Breath.speed_min = 0; + Breath.speed_max = 0x19; + Breath.colors_min = 1; + Breath.colors_max = 1; + Breath.colors.resize(1); + Breath.color_mode = MODE_COLORS_MODE_SPECIFIC; + modes.push_back(Breath); + + mode Wave; + Wave.name = "Wave"; + Wave.value = PNY_GPU_MODE_WAVE; + Wave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS; + Wave.speed = 0x60; + Wave.speed_min = 0; + Wave.speed_max = 0xBF; + Wave.brightness = 0xFF; + Wave.brightness_min = 0; + Wave.brightness_max = 0xFF; + Wave.color_mode = MODE_COLORS_NONE; + modes.push_back(Wave); + + mode Flash; + Flash.name = "Flash"; + Flash.value = PNY_GPU_MODE_FLASH; + Flash.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Flash.speed = 0x27; + Flash.speed_min = 0; + Flash.speed_max = 0x4D; + Flash.brightness = 0xFF; + Flash.brightness_min = 0; + Flash.brightness_max = 0xFF; + Flash.colors_min = 1; + Flash.colors_max = 1; + Flash.colors.resize(1); + Flash.color_mode = MODE_COLORS_MODE_SPECIFIC; + modes.push_back(Flash); + + SetupZones(); + + // Initialize active mode + active_mode = 0; +} + +void RGBController_PNYLovelaceGPU::SetupZones() +{ + /*---------------------------------------------------------*\ + | This device only has 3 LED, so create a single zone. | + \*---------------------------------------------------------*/ + zone* new_zone = new zone(); + + new_zone->name = "GPU Zone"; + new_zone->type = ZONE_TYPE_SINGLE; + new_zone->leds_min = 1; + new_zone->leds_max = 3; + new_zone->leds_count = 3; + new_zone->matrix_map = NULL; + + led* new_led = new led(); + new_led->name = "Fan LED"; + leds.push_back(*new_led); + + new_led = new led(); + new_led->name = "Right LED"; + leds.push_back(*new_led); + + new_led = new led(); + new_led->name = "Left LED"; + leds.push_back(*new_led); + + zones.push_back(*new_zone); + SetupColors(); +} + +void RGBController_PNYLovelaceGPU::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_PNYLovelaceGPU::DeviceUpdateLEDs() +{ + DeviceUpdateMode(); +} + +void RGBController_PNYLovelaceGPU::UpdateZoneLEDs(int /*zone*/) +{ + DeviceUpdateMode(); +} + +void RGBController_PNYLovelaceGPU::UpdateSingleLED(int /*led*/) +{ + DeviceUpdateMode(); +} + +void RGBController_PNYLovelaceGPU::DeviceUpdateMode() +{ + switch(modes[active_mode].value) + { + case PNY_GPU_MODE_OFF: + controller->SetOff(); + break; + + case PNY_GPU_MODE_STATIC: + for (int i = 0; i < 3; i++) + { + RGBColor color = GetLED(i); + controller->SetDirect(i, RGBGetRValue(color), RGBGetGValue(color), RGBGetBValue(color)); + } + break; + case PNY_GPU_MODE_CYCLE: + controller->SetCycle(modes[active_mode].speed, modes[active_mode].brightness); + break; + case PNY_GPU_MODE_BREATH: + { + RGBColor color = modes[active_mode].colors[0]; + controller->SetBreath(modes[active_mode].speed, RGBGetRValue(color), RGBGetGValue(color), RGBGetBValue(color)); + break; + } + case PNY_GPU_MODE_WAVE: + controller->SetWave(modes[active_mode].speed, modes[active_mode].brightness); + break; + case PNY_GPU_MODE_FLASH: + { + RGBColor color = modes[active_mode].colors[0]; + controller->SetFlash(modes[active_mode].speed, modes[active_mode].brightness, + RGBGetRValue(color), RGBGetGValue(color), RGBGetBValue(color)); + break; + } + default: + break; + } +} diff --git a/Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.h b/Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.h new file mode 100644 index 00000000..6eb8a9fc --- /dev/null +++ b/Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.h @@ -0,0 +1,31 @@ +/*-----------------------------------------*\ +| RGBController_PNYLovelaceGPU.h | +| | +| Generic RGB Interface for OpenRGB | +| PNY GPU RGB (Lovelace) Driver | +| | +| yufan 10/1/2023 | +\*-----------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "PNYLovelaceGPUController.h" + +class RGBController_PNYLovelaceGPU : public RGBController +{ +public: + RGBController_PNYLovelaceGPU(PNYLovelaceGPUController* controller_ptr); + + void SetupZones(); + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void DeviceUpdateMode(); + +private: + PNYLovelaceGPUController* controller; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 581d50e2..8124d9a6 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -203,6 +203,7 @@ INCLUDEPATH += Controllers/PhilipsHueController/ \ Controllers/PhilipsWizController/ \ Controllers/PNYGPUController/ \ + Controllers/PNYLovelaceGPUController/ \ Controllers/QMKOpenRGBController/ \ Controllers/RazerController/ \ Controllers/RedragonController/ \ @@ -682,6 +683,8 @@ HEADERS += Controllers/PhilipsWizController/RGBController_PhilipsWiz.h \ Controllers/PNYGPUController/PNYGPUController.h \ Controllers/PNYGPUController/RGBController_PNYGPU.h \ + Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.h \ + Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.h \ Controllers/QMKOpenRGBController/QMKOpenRGBController.h \ Controllers/QMKOpenRGBController/QMKOpenRGBRev9Controller.h \ Controllers/QMKOpenRGBController/QMKOpenRGBRevBController.h \ @@ -1390,6 +1393,9 @@ SOURCES += Controllers/PNYGPUController/PNYGPUController.cpp \ Controllers/PNYGPUController/PNYGPUControllerDetect.cpp \ Controllers/PNYGPUController/RGBController_PNYGPU.cpp \ + Controllers/PNYLovelaceGPUController/PNYLovelaceGPUController.cpp \ + Controllers/PNYLovelaceGPUController/PNYLovelaceGPUControllerDetect.cpp \ + Controllers/PNYLovelaceGPUController/RGBController_PNYLovelaceGPU.cpp \ Controllers/QMKOpenRGBController/QMKOpenRGBControllerDetect.cpp \ Controllers/QMKOpenRGBController/QMKOpenRGBRev9Controller.cpp \ Controllers/QMKOpenRGBController/QMKOpenRGBRevBController.cpp \ diff --git a/pci_ids/pci_ids.h b/pci_ids/pci_ids.h index e82061d6..8897f337 100644 --- a/pci_ids/pci_ids.h +++ b/pci_ids/pci_ids.h @@ -599,6 +599,7 @@ #define PNY_RTX_3090_XLR8_REVEL_EPIC_X_SUB_DEV 0x136A #define PNY_RTX_3060TI_XLR8_REVEL_EPIC_X_SUB_DEV 0x1389 #define PNY_RTX_2060_XLR8_OC_SUB_DEV 0x1363 +#define PNY_RTX_4090_XLR8_SUB_DEV 0x13AE /*-----------------------------------------------------*\ | Palit Sub-Device IDs |