Handle all SMBus controller activity on a separate thread to avoid corrupting the SMBus data
This commit is contained in:
parent
04b87ce2eb
commit
bfe03b0564
4 changed files with 104 additions and 14 deletions
|
|
@ -325,7 +325,7 @@ void DetectNZXTKrakenControllers(std::vector<RGBController*>& rgb_controllers);
|
|||
|
||||
void DetectRGBControllers(void)
|
||||
{
|
||||
//DetectI2CBusses();
|
||||
DetectI2CBusses();
|
||||
|
||||
DetectAuraSMBusControllers(busses, rgb_controllers);
|
||||
DetectAuraGPUControllers(busses, rgb_controllers);
|
||||
|
|
|
|||
|
|
@ -9,15 +9,33 @@
|
|||
#include "i2c_smbus.h"
|
||||
#include <string.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <Windows.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -11,6 +11,9 @@
|
|||
#ifndef I2C_SMBUS_H
|
||||
#define I2C_SMBUS_H
|
||||
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
|
||||
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<bool> i2c_smbus_done;
|
||||
std::atomic<bool> 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 */
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ OpenRGBDialog2::OpenRGBDialog2(std::vector<i2c_smbus_interface *>& 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<i2c_smbus_interface *>& 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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue