diff --git a/i2c_smbus/i2c_smbus_i801.cpp b/i2c_smbus/i2c_smbus_i801.cpp index dade359c..c321f459 100644 --- a/i2c_smbus/i2c_smbus_i801.cpp +++ b/i2c_smbus/i2c_smbus_i801.cpp @@ -9,8 +9,9 @@ \*-----------------------------------------*/ #include "i2c_smbus_i801.h" +#include "ResourceManager.h" + #ifdef _WIN32 -#include #include "OlsApi.h" #elif _MACOSX_X86_X64 #include "macUSPCIOAccess.h" @@ -20,6 +21,33 @@ using namespace std::chrono_literals; +i2c_smbus_i801::i2c_smbus_i801() +{ +#ifdef _WIN32 + json drivers_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Drivers"); + + bool shared_smbus_access = true; + if(drivers_settings.contains("shared_smbus_access")) + { + shared_smbus_access = drivers_settings["shared_smbus_access"].get(); + } + if(shared_smbus_access) + { + global_smbus_access_handle = CreateMutexA(NULL, FALSE, GLOBAL_SMBUS_MUTEX_NAME); + } +#endif +} + +i2c_smbus_i801::~i2c_smbus_i801() +{ +#ifdef _WIN32 + if(global_smbus_access_handle != NULL) + { + CloseHandle(global_smbus_access_handle); + } +#endif +} + /* Return negative errno on error. */ s32 i2c_smbus_i801::i801_access(u16 addr, char read_write, u8 command, int size, i2c_smbus_data *data) { @@ -486,7 +514,23 @@ int i2c_smbus_i801::i801_wait_intr() s32 i2c_smbus_i801::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) { - return i801_access(addr, read_write, command, size, data); +#ifdef _WIN32 + if(global_smbus_access_handle != NULL) + { + WaitForSingleObject(global_smbus_access_handle, INFINITE); + } +#endif + + s32 result = i801_access(addr, read_write, command, size, data); + +#ifdef _WIN32 + if(global_smbus_access_handle != NULL) + { + ReleaseMutex(global_smbus_access_handle); + } +#endif + + return result; } s32 i2c_smbus_i801::i2c_xfer(u8 addr, char read_write, int* size, u8* data) diff --git a/i2c_smbus/i2c_smbus_i801.h b/i2c_smbus/i2c_smbus_i801.h index d6cfe9c1..80d7cb2e 100644 --- a/i2c_smbus/i2c_smbus_i801.h +++ b/i2c_smbus/i2c_smbus_i801.h @@ -10,6 +10,10 @@ #include "i2c_smbus.h" +#ifdef _WIN32 +#include +#endif + #pragma once /* BIT shifting macro */ @@ -81,10 +85,16 @@ #define SMBHSTCFG 0x040 #define SMBHSTCFG_HST_EN BIT(0) +#ifdef _WIN32 +#define GLOBAL_SMBUS_MUTEX_NAME "Global\\Access_SMBUS.HTP.Method" +#endif + class i2c_smbus_i801 : public i2c_smbus_interface { public: u16 i801_smba = 0xF000; + i2c_smbus_i801(); + ~i2c_smbus_i801(); private: s32 i801_access(u16 addr, char read_write, u8 command, int size, i2c_smbus_data *data); @@ -97,4 +107,8 @@ private: int i801_wait_intr(); s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); -}; \ No newline at end of file + +#ifdef _WIN32 + HANDLE global_smbus_access_handle = NULL; +#endif +}; diff --git a/i2c_smbus/i2c_smbus_nct6775.cpp b/i2c_smbus/i2c_smbus_nct6775.cpp index 23c47916..03950231 100644 --- a/i2c_smbus/i2c_smbus_nct6775.cpp +++ b/i2c_smbus/i2c_smbus_nct6775.cpp @@ -7,12 +7,35 @@ \*-----------------------------------------*/ #include "i2c_smbus_nct6775.h" -#include #include "OlsApi.h" #include "LogManager.h" +#include "ResourceManager.h" using namespace std::chrono_literals; +i2c_smbus_nct6775::i2c_smbus_nct6775() +{ + json drivers_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Drivers"); + + bool shared_smbus_access = true; + if(drivers_settings.contains("shared_smbus_access")) + { + shared_smbus_access = drivers_settings["shared_smbus_access"].get(); + } + if(shared_smbus_access) + { + global_smbus_access_handle = CreateMutexA(NULL, FALSE, GLOBAL_SMBUS_MUTEX_NAME); + } +} + +i2c_smbus_nct6775::~i2c_smbus_nct6775() +{ + if(global_smbus_access_handle != NULL) + { + CloseHandle(global_smbus_access_handle); + } +} + s32 i2c_smbus_nct6775::nct6775_access(u16 addr, char read_write, u8 command, int size, i2c_smbus_data *data) { int i, len, status, cnt; @@ -186,7 +209,19 @@ s32 i2c_smbus_nct6775::nct6775_access(u16 addr, char read_write, u8 command, int s32 i2c_smbus_nct6775::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) { - return nct6775_access(addr, read_write, command, size, data); + if(global_smbus_access_handle != NULL) + { + WaitForSingleObject(global_smbus_access_handle, INFINITE); + } + + s32 result = nct6775_access(addr, read_write, command, size, data); + + if(global_smbus_access_handle != NULL) + { + ReleaseMutex(global_smbus_access_handle); + } + + return result; } s32 i2c_smbus_nct6775::i2c_xfer(u8 addr, char read_write, int* size, u8* data) diff --git a/i2c_smbus/i2c_smbus_nct6775.h b/i2c_smbus/i2c_smbus_nct6775.h index a9af8fb7..872d65f2 100644 --- a/i2c_smbus/i2c_smbus_nct6775.h +++ b/i2c_smbus/i2c_smbus_nct6775.h @@ -7,6 +7,7 @@ \*-----------------------------------------*/ #include "i2c_smbus.h" +#include #pragma once @@ -44,15 +45,19 @@ /* Other settings */ #define NCT6775_MAX_RETRIES 400 +#define GLOBAL_SMBUS_MUTEX_NAME "Global\\Access_SMBUS.HTP.Method" class i2c_smbus_nct6775: public i2c_smbus_interface { public: u16 nct6775_smba = 0x0290; + i2c_smbus_nct6775(); + ~i2c_smbus_nct6775(); private: s32 nct6775_access(u16 addr, char read_write, u8 command, int size, i2c_smbus_data *data); s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); + HANDLE global_smbus_access_handle = NULL; }; diff --git a/i2c_smbus/i2c_smbus_piix4.cpp b/i2c_smbus/i2c_smbus_piix4.cpp index fe2cf875..9818c301 100644 --- a/i2c_smbus/i2c_smbus_piix4.cpp +++ b/i2c_smbus/i2c_smbus_piix4.cpp @@ -16,13 +16,12 @@ i2c_smbus_piix4::i2c_smbus_piix4() { json drivers_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Drivers"); - bool amd_smbus_reduce_cpu = false; + bool amd_smbus_reduce_cpu = false; if(drivers_settings.contains("amd_smbus_reduce_cpu")) { amd_smbus_reduce_cpu = drivers_settings["amd_smbus_reduce_cpu"].get(); } - if(amd_smbus_reduce_cpu) { delay_timer = CreateWaitableTimerExW(NULL, NULL, CREATE_WAITABLE_TIMER_MANUAL_RESET | CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS); @@ -31,6 +30,16 @@ i2c_smbus_piix4::i2c_smbus_piix4() delay_timer = CreateWaitableTimer(NULL, TRUE, NULL); // create regular timer instead } } + + bool shared_smbus_access = true; + if(drivers_settings.contains("shared_smbus_access")) + { + shared_smbus_access = drivers_settings["shared_smbus_access"].get(); + } + if(shared_smbus_access) + { + global_smbus_access_handle = CreateMutexA(NULL, FALSE, GLOBAL_SMBUS_MUTEX_NAME); + } } i2c_smbus_piix4::~i2c_smbus_piix4() @@ -39,6 +48,11 @@ i2c_smbus_piix4::~i2c_smbus_piix4() { CloseHandle(delay_timer); } + + if(global_smbus_access_handle != NULL) + { + CloseHandle(global_smbus_access_handle); + } } //Logic adapted from piix4_transaction() in i2c-piix4.c @@ -221,7 +235,19 @@ s32 i2c_smbus_piix4::piix4_access(u16 addr, char read_write, u8 command, int siz s32 i2c_smbus_piix4::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) { - return piix4_access(addr, read_write, command, size, data); + if(global_smbus_access_handle != NULL) + { + WaitForSingleObject(global_smbus_access_handle, INFINITE); + } + + s32 result = piix4_access(addr, read_write, command, size, data); + + if(global_smbus_access_handle != NULL) + { + ReleaseMutex(global_smbus_access_handle); + } + + return result; } s32 i2c_smbus_piix4::i2c_xfer(u8 addr, char read_write, int* size, u8* data) diff --git a/i2c_smbus/i2c_smbus_piix4.h b/i2c_smbus/i2c_smbus_piix4.h index 091da1ef..71bb1be7 100644 --- a/i2c_smbus/i2c_smbus_piix4.h +++ b/i2c_smbus/i2c_smbus_piix4.h @@ -37,6 +37,8 @@ #define PIIX4_WORD_DATA 0x0C #define PIIX4_BLOCK_DATA 0x14 +#define GLOBAL_SMBUS_MUTEX_NAME "Global\\Access_SMBUS.HTP.Method" + class i2c_smbus_piix4 : public i2c_smbus_interface { public: @@ -50,4 +52,5 @@ private: s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); HANDLE delay_timer; + HANDLE global_smbus_access_handle = NULL; }; diff --git a/qt/OpenRGBSettingsPage.cpp b/qt/OpenRGBSettingsPage.cpp index 41bda7a7..bc332da0 100644 --- a/qt/OpenRGBSettingsPage.cpp +++ b/qt/OpenRGBSettingsPage.cpp @@ -92,9 +92,19 @@ OpenRGBSettingsPage::OpenRGBSettingsPage(QWidget *parent) : { ui->CheckboxAMDSMBusReduceCPU->setChecked(drivers_settings["amd_smbus_reduce_cpu"]); } + + if(drivers_settings.contains("shared_smbus_access")) + { + ui->CheckboxSharedSMBusAccess->setChecked(drivers_settings["shared_smbus_access"]); + } + else + { + ui->CheckboxSharedSMBusAccess->setChecked(true); + } #else ui->DriversSettingsLabel->hide(); ui->CheckboxAMDSMBusReduceCPU->hide(); + ui->CheckboxSharedSMBusAccess->hide(); #endif UpdateProfiles(); @@ -672,3 +682,12 @@ void Ui::OpenRGBSettingsPage::on_CheckboxAMDSMBusReduceCPU_clicked() SaveSettings(); } +void Ui::OpenRGBSettingsPage::on_CheckboxSharedSMBusAccess_clicked() +{ + json drivers_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Drivers"); + drivers_settings["shared_smbus_access"] = ui->CheckboxSharedSMBusAccess->isChecked(); + ResourceManager::get()->GetSettingsManager()->SetSettings("Drivers", drivers_settings); + SaveSettings(); +} + + diff --git a/qt/OpenRGBSettingsPage.h b/qt/OpenRGBSettingsPage.h index 02060f07..e5832719 100644 --- a/qt/OpenRGBSettingsPage.h +++ b/qt/OpenRGBSettingsPage.h @@ -60,6 +60,7 @@ private slots: void on_OpenSettingsFolderButton_clicked(); void on_CheckboxLogConsole_clicked(); void on_CheckboxAMDSMBusReduceCPU_clicked(); + void on_CheckboxSharedSMBusAccess_clicked(); void on_CheckboxSetOnExit_clicked(bool checked); void on_ComboBoxExitProfile_currentTextChanged(const QString exit_profile_name); diff --git a/qt/OpenRGBSettingsPage.ui b/qt/OpenRGBSettingsPage.ui index a35dbcd5..4c50898f 100644 --- a/qt/OpenRGBSettingsPage.ui +++ b/qt/OpenRGBSettingsPage.ui @@ -29,17 +29,24 @@ - -67 - -258 - 465 - 724 + 0 + 0 + 408 + 556 - - + + - Start At Login + Log Manager Settings: + + + + + + + User Interface Settings: @@ -50,20 +57,33 @@ - - + + - - + + + + + - Enable Log Console (restart required) + Run zone checks on rescan - + - Start at Login Status + Set Profile on Exit + + + + + + + + + + Start Minimized @@ -75,54 +95,47 @@ - + - Custom Arguments + Start Client - + Start Server - - + + + + + - Theme (restart required) + Set Server Host - - + + - Log Manager Settings: + Enable Log Console (restart required) + + + + + + + Start At Login Settings: - - - - Start Minimized - - - - - - - User Interface Settings: - - - - - - 90000 @@ -135,13 +148,6 @@ - - - - Set Server Port - - - @@ -149,17 +155,45 @@ - - + + - Start At Login Settings: + Greyscale Tray Icon - - - + + + Start at Login Status + + + + + + + Theme (restart required) + + + + + + + Start At Login + + + + + + + + + + Set Server Port + + + + Qt::Vertical @@ -175,27 +209,6 @@ - - - - Load Window Geometry - - - - - - - Start Client - - - - - - - Run zone checks on rescan - - - @@ -203,40 +216,34 @@ - + Load Profile - - - - - + + - Greyscale Tray Icon + Load Window Geometry - - + + - Set Profile on Exit + Custom Arguments - - + + - Set Server Host + Shared SMBus Access (restart required) - - -