/*-----------------------------------------*\ | AuraController.cpp | | | | Driver for ASUS Aura RGB lighting | | controller | | | | Adam Honse (CalcProgrammer1) 8/19/2018 | \*-----------------------------------------*/ #include "AuraController.h" #include 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); }