mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2025-12-31 03:07:49 -05:00
274 lines
7.4 KiB
C++
274 lines
7.4 KiB
C++
/*-----------------------------------------*\
|
|
| AuraController.cpp |
|
|
| |
|
|
| Driver for ASUS Aura RGB lighting |
|
|
| controller |
|
|
| |
|
|
| Adam Honse (CalcProgrammer1) 8/19/2018 |
|
|
\*-----------------------------------------*/
|
|
|
|
#include "AuraController.h"
|
|
#include <cstring>
|
|
|
|
AuraController::AuraController(i2c_smbus_interface* bus, aura_dev_id dev)
|
|
{
|
|
this->bus = bus;
|
|
this->dev = dev;
|
|
|
|
AuraUpdateDeviceName();
|
|
|
|
// Read the device configuration table
|
|
for (int i = 0; i < 64; i++)
|
|
{
|
|
config_table[i] = AuraRegisterRead(AURA_REG_CONFIG_TABLE + i);
|
|
}
|
|
|
|
// Read LED count from configuration table
|
|
led_count = config_table[AURA_CONFIG_LED_COUNT];
|
|
|
|
// LED-0116 - First generation motherboard controller
|
|
if (strcmp(device_name, "LED-0116") == 0)
|
|
{
|
|
direct_reg = AURA_REG_COLORS_DIRECT;
|
|
effect_reg = AURA_REG_COLORS_EFFECT;
|
|
channel_cfg = AURA_CONFIG_CHANNEL_V1;
|
|
}
|
|
// DIMM_LED-0102 - First generation DRAM controller (Trident Z RGB)
|
|
else if (strcmp(device_name, "DIMM_LED-0102") == 0)
|
|
{
|
|
direct_reg = AURA_REG_COLORS_DIRECT;
|
|
effect_reg = AURA_REG_COLORS_EFFECT;
|
|
channel_cfg = AURA_CONFIG_CHANNEL_V1;
|
|
}
|
|
// AUDA0-E6K5-0101 - Second generation DRAM controller (Geil Super Luce)
|
|
else if (strcmp(device_name, "AUDA0-E6K5-0101") == 0)
|
|
{
|
|
direct_reg = AURA_REG_COLORS_DIRECT_V2;
|
|
effect_reg = AURA_REG_COLORS_EFFECT_V2;
|
|
channel_cfg = AURA_CONFIG_CHANNEL_V2;
|
|
}
|
|
// AUMA0-E6K5-0106 - Second generation motherboard controller
|
|
else if (strcmp(device_name, "AUMA0-E6K5-0106") == 0)
|
|
{
|
|
direct_reg = AURA_REG_COLORS_DIRECT_V2;
|
|
effect_reg = AURA_REG_COLORS_EFFECT_V2;
|
|
channel_cfg = AURA_CONFIG_CHANNEL_V2;
|
|
}
|
|
// AUMA0-E6K5-0105 - Second generation motherboard controller
|
|
else if (strcmp(device_name, "AUMA0-E6K5-0105") == 0)
|
|
{
|
|
direct_reg = AURA_REG_COLORS_DIRECT_V2;
|
|
effect_reg = AURA_REG_COLORS_EFFECT_V2;
|
|
channel_cfg = AURA_CONFIG_CHANNEL_V2;
|
|
}
|
|
// AUMA0-E6K5-0104 - Second generation motherboard controller
|
|
else if (strcmp(device_name, "AUMA0-E6K5-0104") == 0)
|
|
{
|
|
direct_reg = AURA_REG_COLORS_DIRECT_V2;
|
|
effect_reg = AURA_REG_COLORS_EFFECT_V2;
|
|
channel_cfg = AURA_CONFIG_CHANNEL_V2;
|
|
}
|
|
// Assume first generation controller if string does not match
|
|
else
|
|
{
|
|
direct_reg = AURA_REG_COLORS_DIRECT;
|
|
effect_reg = AURA_REG_COLORS_EFFECT;
|
|
channel_cfg = AURA_CONFIG_CHANNEL_V1;
|
|
}
|
|
}
|
|
|
|
AuraController::~AuraController()
|
|
{
|
|
|
|
}
|
|
|
|
std::string AuraController::GetDeviceName()
|
|
{
|
|
return(device_name);
|
|
}
|
|
|
|
std::string AuraController::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(return_string);
|
|
}
|
|
|
|
unsigned char AuraController::GetChannel(unsigned int led)
|
|
{
|
|
return(config_table[channel_cfg + led]);
|
|
}
|
|
|
|
const char * AuraController::GetChannelName(unsigned int led)
|
|
{
|
|
switch (config_table[channel_cfg + led])
|
|
{
|
|
case (unsigned char)AURA_LED_CHANNEL_AUDIO:
|
|
return(aura_channels[0]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_BACKPLATE:
|
|
return(aura_channels[1]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_BACK_IO:
|
|
return(aura_channels[2]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_CENTER:
|
|
return(aura_channels[3]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_CENTER_START:
|
|
return(aura_channels[4]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_DRAM:
|
|
return(aura_channels[5]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_PCIE:
|
|
return(aura_channels[6]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_RGB_HEADER:
|
|
return(aura_channels[7]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_RGB_HEADER_2:
|
|
return(aura_channels[8]);
|
|
break;
|
|
|
|
case (unsigned char)AURA_LED_CHANNEL_RGB_HEADER_3:
|
|
return(aura_channels[9]);
|
|
break;
|
|
|
|
default:
|
|
return(aura_channels[10]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
unsigned int AuraController::GetLEDCount()
|
|
{
|
|
return(led_count);
|
|
}
|
|
|
|
unsigned char AuraController::GetLEDRed(unsigned int led)
|
|
{
|
|
return(AuraRegisterRead(direct_reg + ( 3 * led )));
|
|
}
|
|
|
|
unsigned char AuraController::GetLEDGreen(unsigned int led)
|
|
{
|
|
return(AuraRegisterRead(direct_reg + ( 3 * led ) + 2));
|
|
}
|
|
|
|
unsigned char AuraController::GetLEDBlue(unsigned int led)
|
|
{
|
|
return(AuraRegisterRead(direct_reg + ( 3 * led ) + 1));
|
|
}
|
|
|
|
void AuraController::SetAllColorsDirect(unsigned char red, unsigned char green, unsigned char blue)
|
|
{
|
|
unsigned char* colors = new unsigned char[led_count * 3];
|
|
|
|
for (unsigned int i = 0; i < (led_count * 3); i += 3)
|
|
{
|
|
colors[i + 0] = red;
|
|
colors[i + 1] = blue;
|
|
colors[i + 2] = green;
|
|
}
|
|
|
|
AuraRegisterWriteBlock(direct_reg, colors, led_count * 3);
|
|
|
|
delete colors;
|
|
}
|
|
|
|
void AuraController::SetAllColorsEffect(unsigned char red, unsigned char green, unsigned char blue)
|
|
{
|
|
unsigned char* colors = new unsigned char[led_count * 3];
|
|
|
|
for (unsigned int i = 0; i < (led_count * 3); i += 3)
|
|
{
|
|
colors[i + 0] = red;
|
|
colors[i + 1] = blue;
|
|
colors[i + 2] = green;
|
|
}
|
|
|
|
AuraRegisterWriteBlock(effect_reg, colors, led_count * 3);
|
|
|
|
AuraRegisterWrite(AURA_REG_APPLY, AURA_APPLY_VAL);
|
|
|
|
delete[] colors;
|
|
}
|
|
|
|
void AuraController::SetDirect(unsigned char direct)
|
|
{
|
|
AuraRegisterWrite(AURA_REG_DIRECT, direct);
|
|
AuraRegisterWrite(AURA_REG_APPLY, AURA_APPLY_VAL);
|
|
}
|
|
|
|
void AuraController::SetLEDColorDirect(unsigned int led, unsigned char red, unsigned char green, unsigned char blue)
|
|
{
|
|
unsigned char colors[3] = { red, blue, green };
|
|
|
|
AuraRegisterWriteBlock(direct_reg + ( 3 * led ), colors, 3);
|
|
}
|
|
|
|
void AuraController::SetLEDColorEffect(unsigned int led, unsigned char red, unsigned char green, unsigned char blue)
|
|
{
|
|
unsigned char colors[3] = { red, blue, green };
|
|
|
|
AuraRegisterWriteBlock(effect_reg + (3 * led), colors, 3);
|
|
|
|
AuraRegisterWrite(AURA_REG_APPLY, AURA_APPLY_VAL);
|
|
}
|
|
|
|
void AuraController::SetMode(unsigned char mode)
|
|
{
|
|
AuraRegisterWrite(AURA_REG_MODE, mode);
|
|
AuraRegisterWrite(AURA_REG_APPLY, AURA_APPLY_VAL);
|
|
}
|
|
|
|
void AuraController::AuraUpdateDeviceName()
|
|
{
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
device_name[i] = AuraRegisterRead(AURA_REG_DEVICE_NAME + i);
|
|
}
|
|
}
|
|
|
|
unsigned char AuraController::AuraRegisterRead(aura_register reg)
|
|
{
|
|
//Write Aura register
|
|
bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF));
|
|
|
|
//Read Aura value
|
|
return(bus->i2c_smbus_read_byte_data(dev, 0x81));
|
|
|
|
}
|
|
|
|
void AuraController::AuraRegisterWrite(aura_register reg, unsigned char val)
|
|
{
|
|
//Write Aura register
|
|
bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF));
|
|
|
|
//Write Aura value
|
|
bus->i2c_smbus_write_byte_data(dev, 0x01, val);
|
|
|
|
}
|
|
|
|
void AuraController::AuraRegisterWriteBlock(aura_register reg, unsigned char * data, unsigned char sz)
|
|
{
|
|
//Write Aura register
|
|
bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF));
|
|
|
|
//Write Aura block data
|
|
bus->i2c_smbus_write_block_data(dev, 0x03, sz, data);
|
|
|
|
}
|