Files
OpenRGB/Controllers/EVGASMBusController/EVGAACX30SMBusController.cpp
2024-05-22 20:50:16 +00:00

110 lines
3.2 KiB
C++

/*---------------------------------------------------------*\
| EVGAACX30SMBusController.cpp |
| |
| Driver for SMBus EVGA ACX 30 motherboards |
| |
| Balázs Triszka (balika011) 21 May 2024 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-only |
\*---------------------------------------------------------*/
#include "EVGAACX30SMBusController.h"
#include "dmiinfo.h"
#include "LogManager.h"
using namespace std::chrono_literals;
EVGAACX30SMBusController::EVGAACX30SMBusController(i2c_smbus_interface *bus, uint8_t dev)
{
this->bus = bus;
this->dev = dev;
DMIInfo dmi;
device_name = "EVGA " + dmi.getMainboard();
}
EVGAACX30SMBusController::~EVGAACX30SMBusController()
{
}
std::string EVGAACX30SMBusController::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 EVGAACX30SMBusController::GetDeviceName()
{
return(device_name);
}
std::string EVGAACX30SMBusController::GetFirmwareVersion()
{
uint16_t version = bus->i2c_smbus_read_byte_data(dev, ACX30_REG_VER_HIGH) << 8 | bus->i2c_smbus_read_byte_data(dev, ACX30_REG_VER_LOW);
uint8_t ptype = bus->i2c_smbus_read_byte_data(dev, ACX30_REG_PTYPE);
char ver[9];
snprintf(ver, 9, "0x%X", version);
char pt[9];
snprintf(pt, 9, "0x%X", ptype);
std::string return_string;
return_string.append(ver);
return_string.append(", ptype ");
return_string.append(pt);
return return_string;
}
uint8_t EVGAACX30SMBusController::GetMode()
{
return bus->i2c_smbus_read_byte_data(dev, ACX30_REG_MODE);
}
void EVGAACX30SMBusController::Unlock()
{
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_CONTROL, 0xE5);
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_CONTROL, 0xE9);
bus->i2c_smbus_read_byte_data(dev, ACX30_REG_CONTROL);
}
void EVGAACX30SMBusController::Lock()
{
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_CONTROL, 0xE0);
bus->i2c_smbus_read_byte_data(dev, ACX30_REG_CONTROL);
}
void EVGAACX30SMBusController::SetColors(uint8_t red, uint8_t green, uint8_t blue)
{
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_RED, red);
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_GREEN, green);
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_BLUE, blue);
}
void EVGAACX30SMBusController::SetMode(uint8_t mode)
{
if (mode == ACX30_MODE_OFF)
{
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_21, 0xE7);
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_22, 0xCE);
}
else
{
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_21, 0xE5);
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_22, 0xE7);
}
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_MODE, mode);
}
void EVGAACX30SMBusController::SetSpeed(uint8_t speed)
{
bus->i2c_smbus_write_byte_data(dev, ACX30_REG_SPEED, speed);
}