|
|
|
@ -21,25 +21,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
i2c_smbus_interface::i2c_smbus_interface()
|
|
|
|
i2c_smbus_interface::i2c_smbus_interface()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
i2c_smbus_start = false;
|
|
|
|
|
|
|
|
i2c_smbus_done = false;
|
|
|
|
|
|
|
|
this->port_id = -1;
|
|
|
|
this->port_id = -1;
|
|
|
|
this->pci_device = -1;
|
|
|
|
this->pci_device = -1;
|
|
|
|
this->pci_vendor = -1;
|
|
|
|
this->pci_vendor = -1;
|
|
|
|
this->pci_subsystem_device = -1;
|
|
|
|
this->pci_subsystem_device = -1;
|
|
|
|
this->pci_subsystem_vendor = -1;
|
|
|
|
this->pci_subsystem_vendor = -1;
|
|
|
|
this->bus_id = -1;
|
|
|
|
this->bus_id = -1;
|
|
|
|
i2c_smbus_thread_running = true;
|
|
|
|
|
|
|
|
i2c_smbus_thread = new std::thread(&i2c_smbus_interface::i2c_smbus_thread_function, this);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
i2c_smbus_interface::~i2c_smbus_interface()
|
|
|
|
i2c_smbus_interface::~i2c_smbus_interface()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
i2c_smbus_thread_running = false;
|
|
|
|
|
|
|
|
i2c_smbus_start = true;
|
|
|
|
|
|
|
|
i2c_smbus_start_cv.notify_all();
|
|
|
|
|
|
|
|
i2c_smbus_thread->join();
|
|
|
|
|
|
|
|
delete i2c_smbus_thread;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
s32 i2c_smbus_interface::i2c_smbus_write_quick(u8 addr, u8 value)
|
|
|
|
s32 i2c_smbus_interface::i2c_smbus_write_quick(u8 addr, u8 value)
|
|
|
|
@ -166,22 +157,7 @@ s32 i2c_smbus_interface::i2c_smbus_xfer_call(u8 addr, char read_write, u8 comman
|
|
|
|
{
|
|
|
|
{
|
|
|
|
i2c_smbus_xfer_mutex.lock();
|
|
|
|
i2c_smbus_xfer_mutex.lock();
|
|
|
|
|
|
|
|
|
|
|
|
i2c_addr = addr;
|
|
|
|
s32 i2c_ret = i2c_smbus_xfer(addr, read_write, command, size, data);
|
|
|
|
i2c_read_write = read_write;
|
|
|
|
|
|
|
|
i2c_command = command;
|
|
|
|
|
|
|
|
i2c_size_smbus = size;
|
|
|
|
|
|
|
|
i2c_data_smbus = data;
|
|
|
|
|
|
|
|
smbus_xfer = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::unique_lock<std::mutex> start_lock(i2c_smbus_start_mutex);
|
|
|
|
|
|
|
|
i2c_smbus_start = true;
|
|
|
|
|
|
|
|
i2c_smbus_start_cv.notify_all();
|
|
|
|
|
|
|
|
start_lock.unlock();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::unique_lock<std::mutex> done_lock(i2c_smbus_done_mutex);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i2c_smbus_done_cv.wait(done_lock, [this]{ return i2c_smbus_done.load(); });
|
|
|
|
|
|
|
|
i2c_smbus_done = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i2c_smbus_xfer_mutex.unlock();
|
|
|
|
i2c_smbus_xfer_mutex.unlock();
|
|
|
|
|
|
|
|
|
|
|
|
@ -192,21 +168,7 @@ s32 i2c_smbus_interface::i2c_xfer_call(u8 addr, char read_write, int* size, u8 *
|
|
|
|
{
|
|
|
|
{
|
|
|
|
i2c_smbus_xfer_mutex.lock();
|
|
|
|
i2c_smbus_xfer_mutex.lock();
|
|
|
|
|
|
|
|
|
|
|
|
i2c_addr = addr;
|
|
|
|
s32 i2c_ret = i2c_xfer(addr, read_write, size, data);
|
|
|
|
i2c_read_write = read_write;
|
|
|
|
|
|
|
|
i2c_size = size;
|
|
|
|
|
|
|
|
i2c_data = data;
|
|
|
|
|
|
|
|
smbus_xfer = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::unique_lock<std::mutex> start_lock(i2c_smbus_start_mutex);
|
|
|
|
|
|
|
|
i2c_smbus_start = true;
|
|
|
|
|
|
|
|
i2c_smbus_start_cv.notify_all();
|
|
|
|
|
|
|
|
start_lock.unlock();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::unique_lock<std::mutex> done_lock(i2c_smbus_done_mutex);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i2c_smbus_done_cv.wait(done_lock, [this]{ return i2c_smbus_done.load(); });
|
|
|
|
|
|
|
|
i2c_smbus_done = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i2c_smbus_xfer_mutex.unlock();
|
|
|
|
i2c_smbus_xfer_mutex.unlock();
|
|
|
|
|
|
|
|
|
|
|
|
@ -222,33 +184,3 @@ s32 i2c_smbus_interface::i2c_write_block(u8 addr, int size, u8 *data)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return i2c_xfer_call(addr, I2C_SMBUS_WRITE, &size, data);
|
|
|
|
return i2c_xfer_call(addr, I2C_SMBUS_WRITE, &size, data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void i2c_smbus_interface::i2c_smbus_thread_function()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
while(1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
std::unique_lock<std::mutex> start_lock(i2c_smbus_start_mutex);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i2c_smbus_start_cv.wait(start_lock, [this]{ return i2c_smbus_start.load(); });
|
|
|
|
|
|
|
|
i2c_smbus_start = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!i2c_smbus_thread_running.load())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(smbus_xfer)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
i2c_ret = i2c_smbus_xfer(i2c_addr, i2c_read_write, i2c_command, i2c_size_smbus, i2c_data_smbus);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
i2c_ret = i2c_xfer(i2c_addr, i2c_read_write, i2c_size, i2c_data);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::unique_lock<std::mutex> done_lock(i2c_smbus_done_mutex);
|
|
|
|
|
|
|
|
i2c_smbus_done = true;
|
|
|
|
|
|
|
|
i2c_smbus_done_cv.notify_all();
|
|
|
|
|
|
|
|
done_lock.unlock();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|