Skip to content

Commit 9d0d65c

Browse files
meganukebmpGitLab
authored andcommitted
Commonize other RedDevil driver under one tree and detector as V1
1 parent 9a33c95 commit 9d0d65c

7 files changed

Lines changed: 252 additions & 267 deletions

File tree

Controllers/PowerColorGPUController/PowerColorGPUControllerDetect.cpp

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,51 @@
1111

1212
#include "Detector.h"
1313
#include "pci_ids.h"
14+
#include "PowerColorRedDevilV1Controller/RGBController_PowerColorRedDevilV1.h"
15+
#include "PowerColorRedDevilV1Controller/PowerColorRedDevilV1Controller.h"
1416
#include "PowerColorRedDevilV2Controller/RGBController_PowerColorRedDevilV2.h"
1517
#include "PowerColorRedDevilV2Controller/PowerColorRedDevilV2Controller.h"
1618

17-
#define RED_DEVIL_V1_MAGIC_ADDR 0x90
18-
1919
static const unsigned char magic_v1[3] = {0x01, 0x05, 0x00};
2020
static const unsigned char magic_v2[3] = {0x01, 0x32, 0x00};
2121

22+
/*---------------------------------------------------------*\
23+
| The controller reports a unique identifier for V1 and V2. |
24+
| Unfortunately they are on different addresses. Read it |
25+
| for good measure anyways. |
26+
\*---------------------------------------------------------*/
27+
28+
void DetectPowerColorRedDevilGPUControllersV1(i2c_smbus_interface* bus, uint8_t i2c_addr, const std::string& name)
29+
{
30+
unsigned char data[3];
31+
int ret = bus->i2c_smbus_read_i2c_block_data(i2c_addr, RED_DEVIL_V1_REG_MAGIC, 3, data);
32+
if(ret == 3 && memcmp(data, magic_v1, 3) == 0)
33+
{
34+
PowerColorRedDevilV2Controller* controller = new PowerColorRedDevilV2Controller(bus, i2c_addr, name);
35+
RGBController_PowerColorRedDevilV2* rgb_controller = new RGBController_PowerColorRedDevilV2(controller);
36+
37+
ResourceManager::get()->RegisterRGBController(rgb_controller);
38+
}
39+
}
40+
41+
2242
void DetectPowerColorRedDevilGPUControllersV2(i2c_smbus_interface* bus, uint8_t i2c_addr, const std::string& name)
2343
{
24-
/*---------------------------------------------------------*\
25-
| The controller reports a unique identifier for V1 and V2. |
26-
| Unfortunately they are on different addresses. Read it |
27-
| for good measure anyways. |
28-
\*---------------------------------------------------------*/
2944
unsigned char data[3];
3045
int ret = bus->i2c_smbus_read_i2c_block_data(i2c_addr, RED_DEVIL_V2_READ_REG_MAGIC, 3, data);
3146
if(ret == 3 && memcmp(data, magic_v2, 3) == 0)
3247
{
33-
PowerColorRedDevilV2Controller* controller = new PowerColorRedDevilV2Controller(bus, i2c_addr, name);
34-
RGBController_PowerColorRedDevilV2* rgb_controller = new RGBController_PowerColorRedDevilV2(controller);
48+
PowerColorRedDevilV1Controller* controller = new PowerColorRedDevilV1Controller(bus, i2c_addr, name);
49+
RGBController_PowerColorRedDevilV1* rgb_controller = new RGBController_PowerColorRedDevilV1(controller);
3550

3651
ResourceManager::get()->RegisterRGBController(rgb_controller);
3752
}
3853
}
3954

40-
REGISTER_I2C_PCI_DETECTOR("PowerColor Red Devil RX9070XT", DetectPowerColorRedDevilGPUControllersV2, AMD_GPU_VEN, AMD_NAVI48_DEV, POWERCOLOR_SUB_VEN, POWERCOLOR_RED_DEVIL_RX9070XT_SUB_DEV, 0x22);
55+
REGISTER_I2C_PCI_DETECTOR("PowerColor Red Devil RX5700", DetectPowerColorRedDevilGPUControllersV1, AMD_GPU_VEN, AMD_NAVI10_DEV, POWERCOLOR_SUB_VEN, POWERCOLOR_RED_DEVIL_RX5700_SUB_DEV, 0x22);
56+
REGISTER_I2C_PCI_DETECTOR("PowerColor Red Devil RX5700XT", DetectPowerColorRedDevilGPUControllersV1, AMD_GPU_VEN, AMD_NAVI10_DEV, POWERCOLOR_SUB_VEN, POWERCOLOR_RED_DEVIL_RX5700XT_SUB_DEV, 0x22);
57+
REGISTER_I2C_PCI_DETECTOR("PowerColor Red Devil RX6750XT", DetectPowerColorRedDevilGPUControllersV1, AMD_GPU_VEN, AMD_NAVI22_DEV, POWERCOLOR_SUB_VEN, POWERCOLOR_RED_DEVIL_RX6750XT_SUB_DEV, 0x22);
58+
REGISTER_I2C_PCI_DETECTOR("PowerColor Red Devil RX6800XT", DetectPowerColorRedDevilGPUControllersV1, AMD_GPU_VEN, AMD_NAVI21_DEV1, POWERCOLOR_SUB_VEN, POWERCOLOR_RED_DEVIL_RX6800XT_SUB_DEV, 0x22);
59+
REGISTER_I2C_PCI_DETECTOR("PowerColor Red Devil RX6900XT Ultimate", DetectPowerColorRedDevilGPUControllersV1, AMD_GPU_VEN, AMD_NAVI21_DEV2, POWERCOLOR_SUB_VEN, POWERCOLOR_RED_DEVIL_RX6900XT_ULTIMATE_SUB_DEV, 0x22);
60+
61+
REGISTER_I2C_PCI_DETECTOR("PowerColor Red Devil RX9070XT", DetectPowerColorRedDevilGPUControllersV2, AMD_GPU_VEN, AMD_NAVI48_DEV, POWERCOLOR_SUB_VEN, POWERCOLOR_RED_DEVIL_RX9070XT_SUB_DEV, 0x22);

Controllers/PowerColorRedDevilGPUController/PowerColorRedDevilGPUController.cpp renamed to Controllers/PowerColorGPUController/PowerColorRedDevilV1Controller/PowerColorRedDevilV1Controller.cpp

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*---------------------------------------------------------*\
2-
| PowerColorRedDevilGPUController.cpp |
2+
| PowerColorRedDevilV1Controller.cpp |
33
| |
44
| Driver for PowerColor Red Devil GPU |
55
| |
@@ -10,11 +10,11 @@
1010
\*---------------------------------------------------------*/
1111

1212
#include "pci_ids.h"
13-
#include "PowerColorRedDevilGPUController.h"
13+
#include "PowerColorRedDevilV1Controller.h"
1414

1515
using namespace std::chrono_literals;
1616

17-
RedDevilGPUController::RedDevilGPUController(i2c_smbus_interface* bus, red_devil_dev_id dev, std::string dev_name)
17+
PowerColorRedDevilV1Controller::PowerColorRedDevilV1Controller(i2c_smbus_interface* bus, red_devil_v1_dev_id dev, std::string dev_name)
1818
{
1919
this->bus = bus;
2020
this->dev = dev;
@@ -26,12 +26,12 @@ RedDevilGPUController::RedDevilGPUController(i2c_smbus_interface* bus, red_devil
2626
}
2727
}
2828

29-
RedDevilGPUController::~RedDevilGPUController()
29+
PowerColorRedDevilV1Controller::~PowerColorRedDevilV1Controller()
3030
{
3131

3232
}
3333

34-
std::string RedDevilGPUController::GetDeviceLocation()
34+
std::string PowerColorRedDevilV1Controller::GetDeviceLocation()
3535
{
3636
std::string return_string(bus->device_name);
3737
char addr[5];
@@ -41,14 +41,14 @@ std::string RedDevilGPUController::GetDeviceLocation()
4141
return("I2C:" + return_string);
4242
}
4343

44-
std::string RedDevilGPUController::GetDeviceName()
44+
std::string PowerColorRedDevilV1Controller::GetDeviceName()
4545
{
4646
return(name);
4747
}
4848

49-
void RedDevilGPUController::SetLEDColor(int led, RGBColor color)
49+
void PowerColorRedDevilV1Controller::SetLEDColor(int led, RGBColor color)
5050
{
51-
if(led > RED_DEVIL_GPU_LED_MAX_COUNT)
51+
if(led > RED_DEVIL_V1_LED_MAX_COUNT)
5252
{
5353
return;
5454
}
@@ -60,22 +60,22 @@ void RedDevilGPUController::SetLEDColor(int led, RGBColor color)
6060
(unsigned char)RGBGetBValue(color),
6161
};
6262

63-
RegisterWrite(RED_DEVIL_GPU_REG_LED_1 + led, data);
63+
RegisterWrite(RED_DEVIL_V1_REG_LED_1 + led, data);
6464
}
6565

66-
RGBColor RedDevilGPUController::GetLEDColor(int led)
66+
RGBColor PowerColorRedDevilV1Controller::GetLEDColor(int led)
6767
{
68-
if(led > RED_DEVIL_GPU_LED_MAX_COUNT)
68+
if(led > RED_DEVIL_V1_LED_MAX_COUNT)
6969
{
7070
return RGBColor(0);
7171
}
7272

7373
unsigned char data[3] = {0};
74-
RegisterRead(RED_DEVIL_GPU_REG_LED_1 + RED_DEVIL_GPU_READ_OFFSET, data);
74+
RegisterRead(RED_DEVIL_V1_REG_LED_1 + RED_DEVIL_V1_READ_OFFSET, data);
7575
return ToRGBColor(data[0], data[1], data[2]);
7676
}
7777

78-
void RedDevilGPUController::SetLEDColorAll(RGBColor color)
78+
void PowerColorRedDevilV1Controller::SetLEDColorAll(RGBColor color)
7979
{
8080
unsigned char data[3] =
8181
{
@@ -84,10 +84,10 @@ void RedDevilGPUController::SetLEDColorAll(RGBColor color)
8484
(unsigned char)RGBGetBValue(color),
8585
};
8686

87-
RegisterWrite(RED_DEVIL_GPU_REG_LED_ALL, data);
87+
RegisterWrite(RED_DEVIL_V1_REG_LED_ALL, data);
8888
}
8989

90-
void RedDevilGPUController::SetModeColor(RGBColor color)
90+
void PowerColorRedDevilV1Controller::SetModeColor(RGBColor color)
9191
{
9292
unsigned char data[3] =
9393
{
@@ -96,52 +96,52 @@ void RedDevilGPUController::SetModeColor(RGBColor color)
9696
(unsigned char)RGBGetBValue(color),
9797
};
9898

99-
RegisterWrite(RED_DEVIL_GPU_REG_MODE_COLOR, data);
99+
RegisterWrite(RED_DEVIL_V1_REG_MODE_COLOR, data);
100100
}
101101

102-
RGBColor RedDevilGPUController::GetModeColor()
102+
RGBColor PowerColorRedDevilV1Controller::GetModeColor()
103103
{
104104
unsigned char data[3] = {0};
105-
RegisterRead(RED_DEVIL_GPU_REG_MODE_COLOR + RED_DEVIL_GPU_READ_OFFSET, data);
105+
RegisterRead(RED_DEVIL_V1_REG_MODE_COLOR + RED_DEVIL_V1_READ_OFFSET, data);
106106
return ToRGBColor(data[0], data[1], data[2]);
107107
}
108108

109-
void RedDevilGPUController::SetMode(red_devil_mode_config config)
109+
void PowerColorRedDevilV1Controller::SetMode(red_devil_v1_mode config)
110110
{
111-
if(config.mode == RED_DEVIL_GPU_MODE_MB_SYNC)
111+
if(config.mode == RED_DEVIL_V1_MODE_MB_SYNC)
112112
{
113113
unsigned char data[3] = {1, 0, 1};
114-
RegisterWrite(RED_DEVIL_GPU_REG_MB_SYNC, data);
114+
RegisterWrite(RED_DEVIL_V1_REG_MB_SYNC, data);
115115
}
116116
else
117117
{
118118
unsigned char data[3] = {0};
119-
RegisterWrite(RED_DEVIL_GPU_REG_MB_SYNC, data);
120-
RegisterWrite(RED_DEVIL_GPU_REG_MODE, (unsigned char *)&config);
119+
RegisterWrite(RED_DEVIL_V1_REG_MB_SYNC, data);
120+
RegisterWrite(RED_DEVIL_V1_REG_MODE, (unsigned char *)&config);
121121
}
122122
}
123123

124-
red_devil_mode_config RedDevilGPUController::GetMode()
124+
red_devil_v1_mode PowerColorRedDevilV1Controller::GetMode()
125125
{
126126
unsigned char data[3] = {0};
127-
RegisterRead(RED_DEVIL_GPU_REG_MB_SYNC + RED_DEVIL_GPU_READ_OFFSET, data);
127+
RegisterRead(RED_DEVIL_V1_REG_MB_SYNC + RED_DEVIL_V1_READ_OFFSET, data);
128128
if(data[0] != 0 && this->has_sync_mode)
129129
{
130-
return red_devil_mode_config{RED_DEVIL_GPU_MODE_MB_SYNC, 0, 0};
130+
return red_devil_v1_mode{RED_DEVIL_V1_MODE_MB_SYNC, 0, 0};
131131
}
132132

133-
RegisterRead(RED_DEVIL_GPU_REG_MODE + RED_DEVIL_GPU_READ_OFFSET, data);
134-
return red_devil_mode_config{data[0], data[1], data[2]};
133+
RegisterRead(RED_DEVIL_V1_REG_MODE + RED_DEVIL_V1_READ_OFFSET, data);
134+
return red_devil_v1_mode{data[0], data[1], data[2]};
135135
}
136136

137-
int RedDevilGPUController::RegisterRead(unsigned char reg, unsigned char *data)
137+
int PowerColorRedDevilV1Controller::RegisterRead(unsigned char reg, unsigned char *data)
138138
{
139139
int ret = bus->i2c_smbus_read_i2c_block_data(dev, reg, 3, data);
140140
std::this_thread::sleep_for(32ms);
141141
return ret;
142142
}
143143

144-
int RedDevilGPUController::RegisterWrite(unsigned char reg, unsigned char *data)
144+
int PowerColorRedDevilV1Controller::RegisterWrite(unsigned char reg, unsigned char *data)
145145
{
146146
int ret = bus->i2c_smbus_write_i2c_block_data(dev, reg, 3, data);
147147
std::this_thread::sleep_for(32ms);
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*---------------------------------------------------------*\
2+
| PowerColorRedDevilV1Controller.h |
3+
| |
4+
| Driver for PowerColor Red Devil GPU |
5+
| |
6+
| Jana Rettig (SapphicKitten) 14 Jan 2023 |
7+
| |
8+
| This file is part of the OpenRGB project |
9+
| SPDX-License-Identifier: GPL-2.0-only |
10+
\*---------------------------------------------------------*/
11+
12+
#include <string>
13+
#include "i2c_smbus.h"
14+
#include "RGBController.h"
15+
16+
#pragma once
17+
18+
#define RED_DEVIL_V1_READ_OFFSET 0x80
19+
#define RED_DEVIL_V1_LED_MAX_COUNT 12
20+
21+
typedef unsigned char red_devil_v1_dev_id;
22+
23+
struct red_devil_v1_mode
24+
{
25+
unsigned char mode;
26+
unsigned char brightness;
27+
unsigned char speed;
28+
};
29+
30+
enum
31+
{
32+
RED_DEVIL_V1_REG_MODE = 0x01,
33+
RED_DEVIL_V1_REG_LED_1 = 0x02,
34+
RED_DEVIL_V1_REG_LED_2 = 0x03,
35+
RED_DEVIL_V1_REG_LED_3 = 0x04,
36+
RED_DEVIL_V1_REG_LED_4 = 0x05,
37+
RED_DEVIL_V1_REG_LED_5 = 0x06,
38+
RED_DEVIL_V1_REG_LED_6 = 0x07,
39+
RED_DEVIL_V1_REG_LED_7 = 0x08,
40+
RED_DEVIL_V1_REG_LED_8 = 0x09,
41+
RED_DEVIL_V1_REG_LED_9 = 0x0A,
42+
RED_DEVIL_V1_REG_LED_10 = 0x0B,
43+
RED_DEVIL_V1_REG_LED_11 = 0x0C,
44+
RED_DEVIL_V1_REG_LED_12 = 0x0D, // Unused for now, acts like any other led reg
45+
RED_DEVIL_V1_REG_LED_ALL = 0x0E,
46+
RED_DEVIL_V1_REG_MODE_COLOR = 0x0F,
47+
RED_DEVIL_V1_REG_UNKNOWN_1 = 0x10, // Never seen writes to this, reads 0x01 0x05 0x00. Maybe Version?
48+
RED_DEVIL_V1_REG_UNKNOWN_2 = 0x11, // DevilZone writes to this sometimes. No observable change
49+
RED_DEVIL_V1_REG_MB_SYNC = 0x12, // Unused on NAVI 1X cards. Disables controller and allows LEDs to be controlled by external source via ARGB header
50+
RED_DEVIL_V1_REG_MAGIC = 0x90
51+
};
52+
53+
enum
54+
{
55+
RED_DEVIL_V1_MODE_OFF = 0x00,
56+
RED_DEVIL_V1_MODE_STATIC = 0x01,
57+
RED_DEVIL_V1_MODE_BREATHING = 0x02,
58+
RED_DEVIL_V1_MODE_NEON = 0x03,
59+
RED_DEVIL_V1_MODE_BLINK = 0x04,
60+
RED_DEVIL_V1_MODE_DOUBLE_BLINK = 0x05,
61+
RED_DEVIL_V1_MODE_COLOR_SHIFT = 0x06,
62+
RED_DEVIL_V1_MODE_METEOR = 0x07,
63+
RED_DEVIL_V1_MODE_RIPPLE = 0x08,
64+
RED_DEVIL_V1_MODE_SEVEN_COLORS = 0x09,
65+
RED_DEVIL_V1_MODE_MB_SYNC = 0xFF
66+
};
67+
68+
enum
69+
{
70+
RED_DEVIL_V1_BRIGHTNESS_MIN = 0x00,
71+
RED_DEVIL_V1_BRIGHTNESS_MAX = 0xFF,
72+
};
73+
74+
enum
75+
{
76+
RED_DEVIL_V1_SPEED_SLOWEST = 0x64,
77+
RED_DEVIL_V1_SPEED_DEFAULT = 0x32,
78+
RED_DEVIL_V1_SPEED_FASTEST = 0x00
79+
};
80+
81+
class PowerColorRedDevilV1Controller
82+
{
83+
public:
84+
PowerColorRedDevilV1Controller(i2c_smbus_interface* bus, red_devil_v1_dev_id dev, std::string dev_name);
85+
~PowerColorRedDevilV1Controller();
86+
87+
std::string GetDeviceLocation();
88+
std::string GetDeviceName();
89+
90+
void SetLEDColor(int led, RGBColor color);
91+
RGBColor GetLEDColor(int led);
92+
93+
void SetLEDColorAll(RGBColor color);
94+
95+
void SetModeColor(RGBColor color);
96+
RGBColor GetModeColor();
97+
98+
void SetMode(red_devil_v1_mode config);
99+
red_devil_v1_mode GetMode();
100+
101+
int RegisterRead(unsigned char reg, unsigned char *data);
102+
int RegisterWrite(unsigned char reg, unsigned char *data);
103+
104+
bool has_sync_mode = false;
105+
106+
private:
107+
i2c_smbus_interface* bus;
108+
red_devil_v1_dev_id dev;
109+
std::string name;
110+
};

0 commit comments

Comments
 (0)