diff --git a/OpenRGB.cpp b/OpenRGB.cpp index d75dcf8c..4a6d1389 100644 --- a/OpenRGB.cpp +++ b/OpenRGB.cpp @@ -325,7 +325,7 @@ void DetectNZXTKrakenControllers(std::vector& rgb_controllers); void DetectRGBControllers(void) { - //DetectI2CBusses(); + DetectI2CBusses(); DetectAuraSMBusControllers(busses, rgb_controllers); DetectAuraGPUControllers(busses, rgb_controllers); diff --git a/i2c_smbus/i2c_smbus.cpp b/i2c_smbus/i2c_smbus.cpp index 982040b7..6bd43717 100644 --- a/i2c_smbus/i2c_smbus.cpp +++ b/i2c_smbus/i2c_smbus.cpp @@ -9,15 +9,33 @@ #include "i2c_smbus.h" #include +#ifdef WIN32 +#include +#else +#include + +static void Sleep(unsigned int milliseconds) +{ + usleep(1000 * milliseconds); +} +#endif + +i2c_smbus_interface::i2c_smbus_interface() +{ + i2c_smbus_done = true; + i2c_smbus_inuse = false; + i2c_smbus_thread = new std::thread(&i2c_smbus_interface::i2c_smbus_thread_function, this); +} + s32 i2c_smbus_interface::i2c_smbus_write_quick(u8 addr, u8 value) { - return i2c_smbus_xfer(addr, value, 0, I2C_SMBUS_QUICK, NULL); + return i2c_smbus_xfer_call(addr, value, 0, I2C_SMBUS_QUICK, NULL); } s32 i2c_smbus_interface::i2c_smbus_read_byte(u8 addr) { i2c_smbus_data data; - if (i2c_smbus_xfer(addr, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data)) + if (i2c_smbus_xfer_call(addr, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data)) { return -1; } @@ -29,13 +47,13 @@ s32 i2c_smbus_interface::i2c_smbus_read_byte(u8 addr) s32 i2c_smbus_interface::i2c_smbus_write_byte(u8 addr, u8 value) { - return i2c_smbus_xfer(addr, I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL); + return i2c_smbus_xfer_call(addr, I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL); } s32 i2c_smbus_interface::i2c_smbus_read_byte_data(u8 addr, u8 command) { i2c_smbus_data data; - if (i2c_smbus_xfer(addr, I2C_SMBUS_READ, command, I2C_SMBUS_BYTE_DATA, &data)) + if (i2c_smbus_xfer_call(addr, I2C_SMBUS_READ, command, I2C_SMBUS_BYTE_DATA, &data)) { return -1; } @@ -49,13 +67,13 @@ s32 i2c_smbus_interface::i2c_smbus_write_byte_data(u8 addr, u8 command, u8 value { i2c_smbus_data data; data.byte = value; - return i2c_smbus_xfer(addr, I2C_SMBUS_WRITE, command, I2C_SMBUS_BYTE_DATA, &data); + return i2c_smbus_xfer_call(addr, I2C_SMBUS_WRITE, command, I2C_SMBUS_BYTE_DATA, &data); } s32 i2c_smbus_interface::i2c_smbus_read_word_data(u8 addr, u8 command) { i2c_smbus_data data; - if (i2c_smbus_xfer(addr, I2C_SMBUS_READ, command, I2C_SMBUS_WORD_DATA, &data)) + if (i2c_smbus_xfer_call(addr, I2C_SMBUS_READ, command, I2C_SMBUS_WORD_DATA, &data)) { return -1; } @@ -69,13 +87,13 @@ s32 i2c_smbus_interface::i2c_smbus_write_word_data(u8 addr, u8 command, u16 valu { i2c_smbus_data data; data.word = value; - return i2c_smbus_xfer(addr, I2C_SMBUS_WRITE, command, I2C_SMBUS_WORD_DATA, &data); + return i2c_smbus_xfer_call(addr, I2C_SMBUS_WRITE, command, I2C_SMBUS_WORD_DATA, &data); } s32 i2c_smbus_interface::i2c_smbus_read_block_data(u8 addr, u8 command, u8 *values) { i2c_smbus_data data; - if (i2c_smbus_xfer(addr, I2C_SMBUS_READ, command, I2C_SMBUS_BLOCK_DATA, &data)) + if (i2c_smbus_xfer_call(addr, I2C_SMBUS_READ, command, I2C_SMBUS_BLOCK_DATA, &data)) { return -1; } @@ -95,7 +113,7 @@ s32 i2c_smbus_interface::i2c_smbus_write_block_data(u8 addr, u8 command, u8 leng } data.block[0] = length; memcpy(&data.block[1], values, length); - return i2c_smbus_xfer(addr, I2C_SMBUS_WRITE, command, I2C_SMBUS_BLOCK_DATA, &data); + return i2c_smbus_xfer_call(addr, I2C_SMBUS_WRITE, command, I2C_SMBUS_BLOCK_DATA, &data); } s32 i2c_smbus_interface::i2c_smbus_read_i2c_block_data(u8 addr, u8 command, u8 length, u8 *values) @@ -106,7 +124,7 @@ s32 i2c_smbus_interface::i2c_smbus_read_i2c_block_data(u8 addr, u8 command, u8 l length = I2C_SMBUS_BLOCK_MAX; } data.block[0] = length; - if (i2c_smbus_xfer(addr, I2C_SMBUS_READ, command, I2C_SMBUS_I2C_BLOCK_DATA, &data)) + if (i2c_smbus_xfer_call(addr, I2C_SMBUS_READ, command, I2C_SMBUS_I2C_BLOCK_DATA, &data)) { return -1; } @@ -126,5 +144,56 @@ s32 i2c_smbus_interface::i2c_smbus_write_i2c_block_data(u8 addr, u8 command, u8 } data.block[0] = length; memcpy(&data.block[1], values, length); - return i2c_smbus_xfer(addr, I2C_SMBUS_WRITE, command, I2C_SMBUS_I2C_BLOCK_DATA, &data); + return i2c_smbus_xfer_call(addr, I2C_SMBUS_WRITE, command, I2C_SMBUS_I2C_BLOCK_DATA, &data); } + +s32 i2c_smbus_interface::i2c_smbus_xfer_call(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) +{ + s32 ret_val = 0; + + printf("i2c smbus xfer call\r\n"); + while(i2c_smbus_inuse.load() == true || i2c_smbus_done.load() == false) + { + Sleep(1); + } + + i2c_smbus_inuse = true; + + i2c_addr = addr; + i2c_read_write = read_write; + i2c_command = command; + i2c_size = size; + i2c_data = data; + + i2c_smbus_done = false; + + while(i2c_smbus_done.load() == false) + { + Sleep(1); + } + + ret_val = i2c_ret; + + i2c_smbus_inuse = false; + + return(i2c_ret); +} + +void i2c_smbus_interface::i2c_smbus_thread_function() +{ + printf( "i2c thread function start\r\n" ); + + while(1) + { + while(i2c_smbus_inuse.load() == false || i2c_smbus_done.load() == true) + { + Sleep(1); + } + + printf("i2c xfer: addr %02X R/W %d command %02X size %02X dataptr %X\r\n", i2c_addr, i2c_read_write, i2c_command, i2c_size, i2c_data); + + i2c_ret = i2c_smbus_xfer(i2c_addr, i2c_read_write, i2c_command, i2c_size, i2c_data); + + i2c_smbus_done = true; + } +} \ No newline at end of file diff --git a/i2c_smbus/i2c_smbus.h b/i2c_smbus/i2c_smbus.h index 460e1327..386ac9cc 100644 --- a/i2c_smbus/i2c_smbus.h +++ b/i2c_smbus/i2c_smbus.h @@ -11,6 +11,9 @@ #ifndef I2C_SMBUS_H #define I2C_SMBUS_H +#include +#include + typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; @@ -54,8 +57,11 @@ class i2c_smbus_interface public: char device_name[512]; + i2c_smbus_interface(); virtual ~i2c_smbus_interface() = default; + void i2c_smbus_thread_function(); + //Functions derived from i2c-core.c s32 i2c_smbus_write_quick(u8 addr, u8 value); s32 i2c_smbus_read_byte(u8 addr); @@ -69,8 +75,23 @@ public: s32 i2c_smbus_read_i2c_block_data(u8 addr, u8 command, u8 length, u8 *values); s32 i2c_smbus_write_i2c_block_data(u8 addr, u8 command, u8 length, const u8 *values); + s32 i2c_smbus_xfer_call(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); + //Virtual function to be implemented by the driver virtual s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) = 0; + +private: + std::thread * i2c_smbus_thread; + + std::atomic i2c_smbus_done; + std::atomic i2c_smbus_inuse; + + u8 i2c_addr; + char i2c_read_write; + u16 i2c_command; + int i2c_size; + i2c_smbus_data* i2c_data; + s32 i2c_ret; }; #endif /* I2C_SMBUS_H */ diff --git a/qt/OpenRGBDialog2.cpp b/qt/OpenRGBDialog2.cpp index 2245fa08..94fb6ca1 100644 --- a/qt/OpenRGBDialog2.cpp +++ b/qt/OpenRGBDialog2.cpp @@ -202,7 +202,7 @@ OpenRGBDialog2::OpenRGBDialog2(std::vector& bus, std::vec /*-----------------------------------------------------*\ | Show the I2C Tools page only if enabled | \*-----------------------------------------------------*/ - if(false) //TODO: SMBus Tools enable flag + if(true) //TODO: SMBus Tools enable flag { OpenRGBSystemInfoPage *SMBusToolsPage = new OpenRGBSystemInfoPage(bus); ui->InformationTabBar->addTab(SMBusToolsPage, ""); @@ -234,7 +234,7 @@ OpenRGBDialog2::OpenRGBDialog2(std::vector& bus, std::vec SoftwareTabLabel->setIndent(20); SoftwareTabLabel->setGeometry(0, 0, 200, 20); - if(false) //TODO: SMBus Tools enable flag + if(true) //TODO: SMBus Tools enable flag { InformationTabBar->setTabButton(control.size() + 1, QTabBar::LeftSide, SoftwareTabLabel); }