From 82c02b48aa6a2dda2087706dbedd45a81d1d8fa1 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sun, 21 Nov 2021 22:34:18 -0600 Subject: [PATCH] Implement ENESMBusInterface to abstract away the specific I2C/SMBus interface implementation used by the ENE SMBus controller. This will allow for alternative interfaces such as NVMe controllers (XPG Spectrix S40G) and USB Mass Storage controllers (ROG Arion SSD enclosure). --- .../ENESMBusController/ENESMBusController.cpp | 35 +++++--------- .../ENESMBusController/ENESMBusController.h | 9 ++-- .../ENESMBusControllerDetect.cpp | 20 +++++--- .../ENESMBusInterface/ENESMBusInterface.h | 23 +++++++++ .../ENESMBusInterface_i2c_smbus.cpp | 47 +++++++++++++++++++ .../ENESMBusInterface_i2c_smbus.h | 28 +++++++++++ OpenRGB.pro | 4 ++ 7 files changed, 130 insertions(+), 36 deletions(-) create mode 100644 Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface.h create mode 100644 Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.cpp create mode 100644 Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.h diff --git a/Controllers/ENESMBusController/ENESMBusController.cpp b/Controllers/ENESMBusController/ENESMBusController.cpp index 7f3895e2..13052521 100644 --- a/Controllers/ENESMBusController/ENESMBusController.cpp +++ b/Controllers/ENESMBusController/ENESMBusController.cpp @@ -29,10 +29,10 @@ static const char* ene_channels[] = /* ENE channel strings "Unknown", }; -ENESMBusController::ENESMBusController(i2c_smbus_interface* bus, ene_dev_id dev) +ENESMBusController::ENESMBusController(ENESMBusInterface* interface, ene_dev_id dev) { - this->bus = bus; - this->dev = dev; + this->interface = interface; + this->dev = dev; UpdateDeviceName(); @@ -143,7 +143,7 @@ ENESMBusController::ENESMBusController(i2c_smbus_interface* bus, ene_dev_id dev) ENESMBusController::~ENESMBusController() { - + delete interface; } std::string ENESMBusController::GetDeviceName() @@ -153,12 +153,14 @@ std::string ENESMBusController::GetDeviceName() std::string ENESMBusController::GetDeviceLocation() { - std::string return_string(bus->device_name); + std::string return_string = interface->GetLocation(); + char addr[5]; snprintf(addr, 5, "0x%02X", dev); return_string.append(", address "); return_string.append(addr); - return("I2C: " + return_string); + + return(return_string); } unsigned char ENESMBusController::GetChannel(unsigned int led) @@ -330,30 +332,15 @@ void ENESMBusController::UpdateDeviceName() unsigned char ENESMBusController::ENERegisterRead(ene_register reg) { - //Write ENE register - bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF)); - - //Read ENE value - return(bus->i2c_smbus_read_byte_data(dev, 0x81)); - + return(interface->ENERegisterRead(dev, reg)); } void ENESMBusController::ENERegisterWrite(ene_register reg, unsigned char val) { - //Write ENE register - bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF)); - - //Write ENE value - bus->i2c_smbus_write_byte_data(dev, 0x01, val); - + interface->ENERegisterWrite(dev, reg, val); } void ENESMBusController::ENERegisterWriteBlock(ene_register reg, unsigned char * data, unsigned char sz) { - //Write ENE register - bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF)); - - //Write ENE block data - bus->i2c_smbus_write_block_data(dev, 0x03, sz, data); - + interface->ENERegisterWriteBlock(dev, reg, data, sz); } diff --git a/Controllers/ENESMBusController/ENESMBusController.h b/Controllers/ENESMBusController/ENESMBusController.h index 7ce2d587..e8540053 100644 --- a/Controllers/ENESMBusController/ENESMBusController.h +++ b/Controllers/ENESMBusController/ENESMBusController.h @@ -11,13 +11,10 @@ \*-----------------------------------------*/ #include -#include "i2c_smbus.h" +#include "ENESMBusInterface.h" #pragma once -typedef unsigned char ene_dev_id; -typedef unsigned short ene_register; - #define ENE_APPLY_VAL 0x01 /* Value for Apply Changes Register */ #define ENE_SAVE_VAL 0xAA /* Value for Save Changes */ @@ -99,7 +96,7 @@ enum class ENESMBusController { public: - ENESMBusController(i2c_smbus_interface* bus, ene_dev_id dev); + ENESMBusController(ENESMBusInterface* interface, ene_dev_id dev); ~ENESMBusController(); std::string GetDeviceName(); @@ -134,7 +131,7 @@ private: ene_register direct_reg; ene_register effect_reg; unsigned char channel_cfg; - i2c_smbus_interface * bus; + ENESMBusInterface* interface; ene_dev_id dev; }; diff --git a/Controllers/ENESMBusController/ENESMBusControllerDetect.cpp b/Controllers/ENESMBusController/ENESMBusControllerDetect.cpp index 02fdd97a..f1ad8122 100644 --- a/Controllers/ENESMBusController/ENESMBusControllerDetect.cpp +++ b/Controllers/ENESMBusController/ENESMBusControllerDetect.cpp @@ -1,5 +1,6 @@ #include "Detector.h" #include "ENESMBusController.h" +#include "ENESMBusInterface_i2c_smbus.h" #include "LogManager.h" #include "RGBController.h" #include "RGBController_ENESMBus.h" @@ -258,8 +259,10 @@ void DetectENESMBusDRAMControllers(std::vector &busses) { if (TestForENESMBusController(busses[bus], ene_ram_addresses[address_list_idx])) { - ENESMBusController* controller = new ENESMBusController(busses[bus], ene_ram_addresses[address_list_idx]); - RGBController_ENESMBus* rgb_controller = new RGBController_ENESMBus(controller); + ENESMBusInterface_i2c_smbus* interface = new ENESMBusInterface_i2c_smbus(busses[bus]); + ENESMBusController* controller = new ENESMBusController(interface, ene_ram_addresses[address_list_idx]); + RGBController_ENESMBus* rgb_controller = new RGBController_ENESMBus(controller); + ResourceManager::get()->RegisterRGBController(rgb_controller); } @@ -296,9 +299,13 @@ void DetectENESMBusMotherboardControllers(std::vector &bus if (TestForENESMBusController(busses[bus], aura_mobo_addresses[address_list_idx])) { DMIInfo dmi; - ENESMBusController* controller = new ENESMBusController(busses[bus], aura_mobo_addresses[address_list_idx]); - RGBController_ENESMBus* rgb_controller = new RGBController_ENESMBus(controller); + + ENESMBusInterface_i2c_smbus* interface = new ENESMBusInterface_i2c_smbus(busses[bus]); + ENESMBusController* controller = new ENESMBusController(interface, aura_mobo_addresses[address_list_idx]); + RGBController_ENESMBus* rgb_controller = new RGBController_ENESMBus(controller); + rgb_controller->name = "ASUS " + dmi.getMainboard(); + ResourceManager::get()->RegisterRGBController(rgb_controller); } @@ -338,8 +345,9 @@ void DetectENESMBusGPUControllers(std::vector &busses) if(TestForENESMBusController(busses[bus], device_list[dev_idx].controller_address)) { - ENESMBusController* controller = new ENESMBusController(busses[bus], device_list[dev_idx].controller_address); - RGBController_ENESMBus* rgb_controller = new RGBController_ENESMBus(controller); + ENESMBusInterface_i2c_smbus* interface = new ENESMBusInterface_i2c_smbus(busses[bus]); + ENESMBusController* controller = new ENESMBusController(interface, device_list[dev_idx].controller_address); + RGBController_ENESMBus* rgb_controller = new RGBController_ENESMBus(controller); rgb_controller->name = device_list[dev_idx].name; rgb_controller->type = DEVICE_TYPE_GPU; diff --git a/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface.h b/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface.h new file mode 100644 index 00000000..bbdc8f49 --- /dev/null +++ b/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface.h @@ -0,0 +1,23 @@ +/*-----------------------------------------*\ +| ENESMBusInterface.h | +| | +| Definitions and types for ENE interface | +| | +| Adam Honse (CalcProgrammer1) 11/21/2021 | +\*-----------------------------------------*/ + +#include + +#pragma once + +typedef unsigned short ene_register; +typedef unsigned char ene_dev_id; + +class ENESMBusInterface +{ +public: + virtual std::string GetLocation() = 0; + virtual unsigned char ENERegisterRead(ene_dev_id dev, ene_register reg) = 0; + virtual void ENERegisterWrite(ene_dev_id dev, ene_register reg, unsigned char val) = 0; + virtual void ENERegisterWriteBlock(ene_dev_id dev, ene_register reg, unsigned char * data, unsigned char sz) = 0; +}; \ No newline at end of file diff --git a/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.cpp b/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.cpp new file mode 100644 index 00000000..db81db8b --- /dev/null +++ b/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.cpp @@ -0,0 +1,47 @@ +/*-----------------------------------------*\ +| ENESMBusInterface_i2c_smbus.cpp | +| | +| Code for ENE I2C/SMBus interface | +| | +| Adam Honse (CalcProgrammer1) 11/21/2021 | +\*-----------------------------------------*/ + +#include "ENESMBusInterface_i2c_smbus.h" + +ENESMBusInterface_i2c_smbus::ENESMBusInterface_i2c_smbus(i2c_smbus_interface* bus) +{ + this->bus = bus; +} + +std::string ENESMBusInterface_i2c_smbus::GetLocation() +{ + std::string return_string(bus->device_name); + return("I2C: " + return_string); +} + +unsigned char ENESMBusInterface_i2c_smbus::ENERegisterRead(ene_dev_id dev, ene_register reg) +{ + //Write ENE register + bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF)); + + //Read ENE value + return(bus->i2c_smbus_read_byte_data(dev, 0x81)); +} + +void ENESMBusInterface_i2c_smbus::ENERegisterWrite(ene_dev_id dev, ene_register reg, unsigned char val) +{ + //Write ENE register + bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF)); + + //Write ENE value + bus->i2c_smbus_write_byte_data(dev, 0x01, val); +} + +void ENESMBusInterface_i2c_smbus::ENERegisterWriteBlock(ene_dev_id dev, ene_register reg, unsigned char * data, unsigned char sz) +{ + //Write ENE register + bus->i2c_smbus_write_word_data(dev, 0x00, ((reg << 8) & 0xFF00) | ((reg >> 8) & 0x00FF)); + + //Write ENE block data + bus->i2c_smbus_write_block_data(dev, 0x03, sz, data); +} \ No newline at end of file diff --git a/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.h b/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.h new file mode 100644 index 00000000..cf2cd40d --- /dev/null +++ b/Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.h @@ -0,0 +1,28 @@ +/*-----------------------------------------*\ +| ENESMBusInterface_i2c_smbus.h | +| | +| Definitions and types for ENE I2C/SMBus | +| interface | +| | +| Adam Honse (CalcProgrammer1) 11/21/2021 | +\*-----------------------------------------*/ + +#include "ENESMBusInterface.h" +#include "i2c_smbus.h" + +#pragma once + +class ENESMBusInterface_i2c_smbus : public ENESMBusInterface +{ +public: + ENESMBusInterface_i2c_smbus(i2c_smbus_interface* bus); + + std::string GetLocation(); + + unsigned char ENERegisterRead(ene_dev_id dev, ene_register reg); + void ENERegisterWrite(ene_dev_id dev, ene_register reg, unsigned char val); + void ENERegisterWriteBlock(ene_dev_id dev, ene_register reg, unsigned char * data, unsigned char sz); + +private: + i2c_smbus_interface * bus; +}; \ No newline at end of file diff --git a/OpenRGB.pro b/OpenRGB.pro index 874c85e8..259858f5 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -97,6 +97,7 @@ INCLUDEPATH += Controllers/E131Controller/ \ Controllers/EKController/ \ Controllers/ENESMBusController/ \ + Controllers/ENESMBusController/ENESMBusInterface \ Controllers/EspurnaController/ \ Controllers/EVGAGPUController/ \ Controllers/EVisionKeyboardController/ \ @@ -285,6 +286,8 @@ HEADERS += Controllers/EKController/RGBController_EKController.h \ Controllers/ENESMBusController/ENESMBusController.h \ Controllers/ENESMBusController/RGBController_ENESMBus.h \ + Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface.h \ + Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.h \ Controllers/EspurnaController/EspurnaController.h \ Controllers/EspurnaController/RGBController_Espurna.h \ Controllers/EVGAGPUController/EVGAGP102Controller.h \ @@ -661,6 +664,7 @@ SOURCES += Controllers/ENESMBusController/ENESMBusController.cpp \ Controllers/ENESMBusController/ENESMBusControllerDetect.cpp \ Controllers/ENESMBusController/RGBController_ENESMBus.cpp \ + Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.cpp \ Controllers/EspurnaController/EspurnaController.cpp \ Controllers/EspurnaController/EspurnaControllerDetect.cpp \ Controllers/EspurnaController/RGBController_Espurna.cpp \