diff --git a/Controllers/MSIRGBController/MSIRGBController.cpp b/Controllers/MSIRGBController/MSIRGBController.cpp index 506460f0..2c3dba38 100644 --- a/Controllers/MSIRGBController/MSIRGBController.cpp +++ b/Controllers/MSIRGBController/MSIRGBController.cpp @@ -13,42 +13,9 @@ #include "dependencies/dmiinfo.h" #include "super_io.h" -#define NUM_INVERTED_DEVICES (sizeof(inverted_devices) / sizeof(inverted_devices[0])) - -/*-------------------------------------------------------------------------*\ -| This is a list of DMI info for boards which need the inversion flag set | -\*-------------------------------------------------------------------------*/ -static const char * inverted_devices[21] = -{ - "7B89", - "7B90", - "7B19", - "7C02", - "7B75", - "7B22", - "7B23", - "7B24", - "7B27", - "7B30", - "7B31", - "7B51", - "7C04", - "7C00", - "7B98", - "7C22", - "7C24", - "7C01", - "7C39", - "7B86", - "7B87" -}; - -MSIRGBController::MSIRGBController(int sioaddr) +MSIRGBController::MSIRGBController(int sioaddr, bool invert) { msi_sioaddr = sioaddr; - DMIInfo board; - - std::string board_dmi = board.getMainboard(); /*-----------------------------------------------------*\ | This setup step isn't well documented | @@ -89,16 +56,12 @@ MSIRGBController::MSIRGBController(int sioaddr) \*--------------------------------------------------------------*/ unsigned char ff_val = 0b11100010; - for(unsigned int i = 0; i < NUM_INVERTED_DEVICES; i++) + if (invert) { - if (board_dmi.find(std::string(inverted_devices[i])) != std::string::npos) - { - ff_val |= 0b00011100; - break; - } + ff_val |= 0b00011100; } + superio_outb(msi_sioaddr, MSI_SIO_RGB_REG_CFG_3, ff_val); - /*-----------------------------------------------------------*\ | This seems to be related to some rainbow mode. Deactivated | \*-----------------------------------------------------------*/ diff --git a/Controllers/MSIRGBController/MSIRGBController.h b/Controllers/MSIRGBController/MSIRGBController.h index 7b117931..f6d3b13e 100644 --- a/Controllers/MSIRGBController/MSIRGBController.h +++ b/Controllers/MSIRGBController/MSIRGBController.h @@ -40,7 +40,7 @@ enum class MSIRGBController { public: - MSIRGBController(int sioaddr); + MSIRGBController(int sioaddr, bool invert); ~MSIRGBController(); std::string GetDeviceName(); diff --git a/Controllers/MSIRGBController/MSIRGBControllerDetect.cpp b/Controllers/MSIRGBController/MSIRGBControllerDetect.cpp index d886d0cf..aeca5108 100644 --- a/Controllers/MSIRGBController/MSIRGBControllerDetect.cpp +++ b/Controllers/MSIRGBController/MSIRGBControllerDetect.cpp @@ -3,6 +3,7 @@ #include "RGBController.h" #include "RGBController_MSIRGB.h" #include "super_io.h" +#include "dependencies/dmiinfo.h" #include #include #include @@ -15,9 +16,76 @@ * * \******************************************************************************************/ +#define NUM_COMPATIBLE_DEVICES (sizeof(compatible_devices) / sizeof(compatible_devices[0])) + +typedef struct +{ + const char* name; + bool invert; +} msi_device; + +msi_device compatible_devices[] = +{ + {"7A40", false}, + {"7A39", false}, + {"7A38", false}, + {"7B79", false}, + {"7B73", false}, + {"7B61", false}, + {"7B54", false}, + {"7B49", false}, + {"7B48", false}, + {"7B45", false}, + {"7B44", false}, + {"7A59", false}, + {"7A57", false}, + {"7A68", false}, + {"7B40", false}, + {"7A94", false}, + {"7B09", false}, + {"7B06", false}, + {"7A58", false}, + {"7A62", false}, + {"7A69", false}, + {"7A70", false}, + {"7A72", false}, + {"7A78", false}, + {"7A79", false}, + {"7B89", true }, + {"7B90", true }, + {"7B19", true }, + {"7C02", true }, + {"7B75", true }, + {"7B22", true }, + {"7B23", true }, + {"7B24", true }, + {"7B27", true }, + {"7B30", true }, + {"7B31", true }, + {"7B51", true }, + {"7C04", true }, + {"7C00", true }, + {"7B98", true }, + {"7C22", true }, + {"7C24", true }, + {"7C01", true }, + {"7C39", true }, + {"7B86", true }, + {"7B87", true }, +}; + void DetectMSIRGBControllers(std::vector &rgb_controllers) { int sio_addrs[2] = {0x2E, 0x4E}; + + DMIInfo board; + std::string board_dmi = board.getMainboard(); + std::string manufacturer = board.getManufacturer(); + + if (manufacturer != "Micro-Star International Co., Ltd.") + { + return; + } for(int sioaddr_idx = 0; sioaddr_idx < 2; sioaddr_idx++) { @@ -31,10 +99,17 @@ void DetectMSIRGBControllers(std::vector &rgb_controllers) { case SIO_NCT6795_ID: case SIO_NCT6797_ID: - MSIRGBController* new_msi = new MSIRGBController(sioaddr); - RGBController_MSIRGB* new_rgb = new RGBController_MSIRGB(new_msi); + for(unsigned int i = 0; i < NUM_COMPATIBLE_DEVICES; i++) + { + if (board_dmi.find(std::string(compatible_devices[i].name)) != std::string::npos) + { + MSIRGBController* new_msi = new MSIRGBController(sioaddr, compatible_devices[i].invert); + RGBController_MSIRGB* new_rgb = new RGBController_MSIRGB(new_msi); - rgb_controllers.push_back(new_rgb); + rgb_controllers.push_back(new_rgb); + break; + } + } break; } }