From 6269d9c144d79ef414b5e8b2c4adc3584cd40ee4 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Mon, 12 May 2025 17:41:32 -0500 Subject: [PATCH] Update PawnIO SMBus driver to use standardized API between all drivers, add NCT6793 driver, and remove WinRing0 SMBus drivers --- .../ENESMBusControllerDetect.cpp | 2 +- OpenRGB.pro | 1 + dependencies/PawnIO/modules/LpcIO.bin | Bin 27228 -> 17172 bytes dependencies/PawnIO/modules/SmbusI801.bin | Bin 39836 -> 40788 bytes dependencies/PawnIO/modules/SmbusNCT6793.bin | Bin 0 -> 17548 bytes dependencies/PawnIO/modules/SmbusPIIX4.bin | Bin 35036 -> 37260 bytes i2c_smbus/MacOS/i2c_smbus_nct6775.cpp | 10 +- i2c_smbus/Windows/i2c_smbus_pawnio.cpp | 422 +++++------------- i2c_tools/i2c_tools.cpp | 3 + i2c_tools/i2c_tools.h | 9 +- pci_ids/pci_ids.h | 1 + .../OpenRGBSystemInfoPage.cpp | 5 + 12 files changed, 126 insertions(+), 327 deletions(-) create mode 100644 dependencies/PawnIO/modules/SmbusNCT6793.bin diff --git a/Controllers/ENESMBusController/ENESMBusControllerDetect.cpp b/Controllers/ENESMBusController/ENESMBusControllerDetect.cpp index 9bb3e7384..b43a1932b 100644 --- a/Controllers/ENESMBusController/ENESMBusControllerDetect.cpp +++ b/Controllers/ENESMBusController/ENESMBusControllerDetect.cpp @@ -277,7 +277,7 @@ void DetectENESMBusMotherboardControllers(std::vector &bus // Add ENE (ASUS Aura) motherboard controllers IF_MOBO_SMBUS(busses[bus]->pci_vendor, busses[bus]->pci_device) { - if(busses[bus]->pci_subsystem_vendor == ASUS_SUB_VEN || busses[bus]->pci_subsystem_vendor == 0) + if(busses[bus]->pci_subsystem_vendor == ASUS_SUB_VEN || busses[bus]->pci_subsystem_vendor == 0 || busses[bus]->pci_subsystem_vendor == 0xFFFF) { for (unsigned int address_list_idx = 0; address_list_idx < AURA_MOBO_ADDRESS_COUNT; address_list_idx++) { diff --git a/OpenRGB.pro b/OpenRGB.pro index 6d44deffc..86b64c977 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -431,6 +431,7 @@ win32:contains(QMAKE_TARGET.arch, x86_64) { copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/PawnIO/PawnIOLib.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/PawnIO/modules/SmbusPIIX4.bin )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/PawnIO/modules/SmbusI801.bin )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) + copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/PawnIO/modules/SmbusNCT6793.bin )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/PawnIO/modules/LpcIO.bin )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) first.depends = $(first) copydata export(first.depends) diff --git a/dependencies/PawnIO/modules/LpcIO.bin b/dependencies/PawnIO/modules/LpcIO.bin index 886f11843388ba6609a2bcc0aae3dd46eaa6b354..478fb9946ea603101f00e88f2d32bd03a17034c7 100644 GIT binary patch delta 2358 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 = 0; - bus->pci_device = 0; - bus->pci_subsystem_vendor = 0; - bus->pci_subsystem_device = 0; + bus->pci_vendor = 0xFFFF; + bus->pci_device = 0xFFFF; + bus->pci_subsystem_vendor = 0xFFFF; + bus->pci_subsystem_device = 0xFFFF; // Set logical device register to get SMBus base address superio_outb(sioaddr, SIO_REG_LOGDEV, SIO_LOGDEV_SMBUS); diff --git a/i2c_smbus/Windows/i2c_smbus_pawnio.cpp b/i2c_smbus/Windows/i2c_smbus_pawnio.cpp index 3a1200e09..61f5835af 100644 --- a/i2c_smbus/Windows/i2c_smbus_pawnio.cpp +++ b/i2c_smbus/Windows/i2c_smbus_pawnio.cpp @@ -22,11 +22,52 @@ std::unordered_map i2c_smbus_pawnio::using_handle; i2c_smbus_pawnio::i2c_smbus_pawnio(HANDLE handle, std::string name) { + /*-----------------------------------------------------*\ + | Store bus information | + | TODO: Remove name field once all drivers use the same | + | ioctl names | + \*-----------------------------------------------------*/ + this->handle = handle; + this->name = name; + /*-----------------------------------------------------*\ | Get driver settings | \*-----------------------------------------------------*/ json drivers_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Drivers"); + /*-----------------------------------------------------*\ + | Get bus information | + \*-----------------------------------------------------*/ + const SIZE_T in_size = 1; + ULONG64 in[in_size] = {0}; + const SIZE_T out_size = 3; + ULONG64 out[out_size]; + SIZE_T return_size; + HRESULT status; + + status = pawnio_execute(handle, "ioctl_identity", in, in_size, out, out_size, &return_size); + + if(!status) + { + this->pci_vendor = (out[2] & 0x000000000000FFFF); + this->pci_device = (out[2] & 0x00000000FFFF0000) >> 16; + this->pci_subsystem_vendor = (out[2] & 0x0000FFFF0000FFFF) >> 32; + this->pci_subsystem_device = (out[2] & 0xFFFF000000000000) >> 48; + + char name_str[9]; + name_str[0] = (out[0] & 0x00000000000000FF); + name_str[1] = (out[0] & 0x000000000000FF00) >> 8; + name_str[2] = (out[0] & 0x0000000000FF0000) >> 16; + name_str[3] = (out[0] & 0x00000000FF000000) >> 24; + name_str[4] = (out[0] & 0x000000FF00000000) >> 32; + name_str[5] = (out[0] & 0x0000FF0000000000) >> 40; + name_str[6] = (out[0] & 0x00FF000000000000) >> 48; + name_str[7] = (out[0] & 0xFF00000000000000) >> 56; + name_str[8] = 0; + + strncpy( this->device_name, name_str, 512 ); + } + /*-----------------------------------------------------*\ | Get shared SMBus access setting | \*-----------------------------------------------------*/ @@ -45,14 +86,6 @@ i2c_smbus_pawnio::i2c_smbus_pawnio(HANDLE handle, std::string name) global_smbus_access_handle = CreateMutexA(NULL, FALSE, GLOBAL_SMBUS_MUTEX_NAME); } - /*-----------------------------------------------------*\ - | Store bus information | - | TODO: Remove name field once all drivers use the same | - | ioctl names | - \*-----------------------------------------------------*/ - this->handle = handle; - this->name = name; - using_handle[name]++; } @@ -75,207 +108,52 @@ i2c_smbus_pawnio::~i2c_smbus_pawnio() } } -s32 i2c_smbus_pawnio::pawnio_read(u8 addr, char /*read_write*/, u8 command, int size, i2c_smbus_data* data) -{ - SIZE_T return_size; - - switch(size) - { - case I2C_SMBUS_BYTE: - { - const SIZE_T in_size = 1; - ULONG64 in[in_size] = {addr}; - const SIZE_T out_size = 1; - ULONG64 out[out_size]; - - /*---------------------------------------------*\ - | Execute PawnIO read_byte ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_read_byte").c_str(), in, in_size, out, out_size, &return_size); - data->byte = (u8)out[0]; - - return(status ? -EIO : 0); - } - - case I2C_SMBUS_BYTE_DATA: - { - const SIZE_T in_size = 2; - ULONG64 in[in_size] = {addr, command}; - const SIZE_T out_size = 1; - ULONG64 out[out_size]; - - /*---------------------------------------------*\ - | Execute PawnIO read_byte_data ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_read_byte_data").c_str(), in, in_size, out, out_size, &return_size); - data->byte = (u8)out[0]; - - return(status ? -EIO : 0); - } - - case I2C_SMBUS_WORD_DATA: - { - const SIZE_T in_size = 2; - ULONG64 in[in_size] = {addr, command}; - const SIZE_T out_size = 1; - ULONG64 out[out_size]; - - /*---------------------------------------------*\ - | Execute PawnIO read_word_data ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_read_word_data").c_str(), in, in_size, out, out_size, &return_size); - data->word = (u16)out[0]; - - return(status ? -EIO : 0); - } - - case I2C_SMBUS_BLOCK_DATA: - { - const SIZE_T in_size = 2; - ULONG64 in[in_size] = {addr, command}; - - /*---------------------------------------------*\ - | Calculate output data buffer size | - | Pawn only deals with 64-bit cells, divide by | - | 8 to convert bytes to qwords. | - | The first cell is also the length. | - \*---------------------------------------------*/ - const SIZE_T out_size = 1 + (I2C_SMBUS_BLOCK_MAX / 8); - ULONG64 out[out_size]; - - /*---------------------------------------------*\ - | Execute PawnIO read_block_data ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_read_block_data").c_str(), in, in_size, out, out_size, &return_size); - - if(status) - { - return(-EIO); - } - - if(out[0] == 0 || out[0] > I2C_SMBUS_BLOCK_MAX) - { - return(-EPROTO); - } - - /*---------------------------------------------*\ - | Unpack bytes from 64bit Pawn cells | - \*---------------------------------------------*/ - u8 *out_bytes = (u8*)(&out[1]); - memcpy(&data->block[1], out_bytes, out[0]); - - return(0); - } - - default: - return(-EOPNOTSUPP); - } -} - -s32 i2c_smbus_pawnio::pawnio_write(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) -{ - SIZE_T return_size; - - switch(size) - { - case I2C_SMBUS_QUICK: - { - const SIZE_T in_size = 2; - ULONG64 in[in_size] = {addr, (u8)read_write}; - - /*---------------------------------------------*\ - | Execute PawnIO write_quick ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_write_quick").c_str(), in, in_size, NULL, 0, &return_size); - - return(status ? -EIO : 0); - } - - case I2C_SMBUS_BYTE: - { - const SIZE_T in_size = 2; - ULONG64 in[in_size] = {addr, data->byte}; - - /*---------------------------------------------*\ - | Execute PawnIO write_byte ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_write_byte").c_str(), in, in_size, NULL, 0, &return_size); - - return(status ? -EIO : 0); - } - - case I2C_SMBUS_BYTE_DATA: - { - const SIZE_T in_size = 3; - ULONG64 in[in_size] = {addr, command, data->byte}; - - /*---------------------------------------------*\ - | Execute PawnIO write_byte_data ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_write_byte_data").c_str(), in, in_size, NULL, 0, &return_size); - - return(status ? -EIO : 0); - } - - case I2C_SMBUS_WORD_DATA: - { - const SIZE_T in_size = 3; - ULONG64 in[in_size] = {addr, command, data->word}; - - /*---------------------------------------------*\ - | Execute PawnIO write_word_data ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_write_word_data").c_str(), in, in_size, NULL, 0, &return_size); - - return(status ? -EIO : 0); - } - - case I2C_SMBUS_BLOCK_DATA: - { - SIZE_T len = data->block[0]; - if(len == 0 || len > I2C_SMBUS_BLOCK_MAX) - { - return -EINVAL; - } - const SIZE_T in_size = 3 + (I2C_SMBUS_BLOCK_MAX/8); - ULONG64 in[3 + (I2C_SMBUS_BLOCK_MAX/8)] = {addr, command, len}; - - /*---------------------------------------------*\ - | Pack bytes into 64bit Pawn cells | - \*---------------------------------------------*/ - u8 *in_bytes = (u8*)&in[3]; - memcpy(in_bytes, &data->block[1], len); - - /*---------------------------------------------*\ - | Execute PawnIO write_block_data ioctl | - \*---------------------------------------------*/ - HRESULT status = pawnio_execute(handle, ("ioctl_" + name + "_write_block_data").c_str(), in, in_size, NULL, 0, &return_size); - - return(status ? -EIO : 0); - } - - default: - return(-EOPNOTSUPP); - } -} - s32 i2c_smbus_pawnio::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) { + /*-----------------------------------------------------*\ + | Lock SMBus mutex | + \*-----------------------------------------------------*/ if(global_smbus_access_handle != NULL) { WaitForSingleObject(global_smbus_access_handle, INFINITE); } - int status = -ENXIO; + /*-----------------------------------------------------*\ + | Pack input data | + \*-----------------------------------------------------*/ + const SIZE_T in_size = 9; + ULONG64 in[in_size]; + const SIZE_T out_size = 5; + ULONG64 out[out_size]; + SIZE_T return_size; + HRESULT status; - if(read_write && size != I2C_SMBUS_QUICK) { - status = pawnio_read(addr, read_write, command, size, data); - } - else + in[0] = addr; + in[1] = read_write; + in[2] = command; + in[3] = size; + + if(data != NULL) { - status = pawnio_write(addr, read_write, command, size, data); + memcpy( &in[4], data, sizeof(i2c_smbus_data)); } + /*-----------------------------------------------------*\ + | Perform SMBus transfer | + \*-----------------------------------------------------*/ + status = pawnio_execute(handle, "ioctl_smbus_xfer", in, in_size, out, out_size, &return_size); + + /*-----------------------------------------------------*\ + | Unpack output data | + \*-----------------------------------------------------*/ + if(data != NULL) + { + memcpy( data, &out[0], sizeof(i2c_smbus_data)); + } + + /*-----------------------------------------------------*\ + | Unlock SMBus mutex | + \*-----------------------------------------------------*/ if(global_smbus_access_handle != NULL) { ReleaseMutex(global_smbus_access_handle); @@ -289,7 +167,6 @@ s32 i2c_smbus_pawnio::i2c_xfer(u8 /*addr*/, char /*read_write*/, int* /*size*/, return(-1); } -// TODO: Find a better place for this function HRESULT i2c_smbus_pawnio::start_pawnio(std::string filename, PHANDLE phandle) { char exePath[MAX_PATH]; @@ -415,141 +292,52 @@ bool i2c_smbus_pawnio_detect() } i2c_smbus_interface * bus; - HRESULT hres; - Wmi wmi; HANDLE pawnio_handle; /*-----------------------------------------------------*\ - | Query WMI for Win32_PnPSignedDriver entries with | - | names matching "SMBUS" or "SM BUS". These devices | - | may be browsed under Device Manager -> System Devices | + | Try to load Intel (i801) SMBus driver | \*-----------------------------------------------------*/ - std::vector q_res_PnPSignedDriver; - hres = wmi.query("SELECT * FROM Win32_PnPSignedDriver WHERE Description LIKE '%SMBUS%' OR Description LIKE '%SM BUS%'", q_res_PnPSignedDriver); - - if(hres) + if(i2c_smbus_pawnio::start_pawnio("SmbusI801.bin", &pawnio_handle) == S_OK) { - LOG_INFO("WMI query failed, I2C bus detection aborted"); - return(false); + bus = new i2c_smbus_pawnio(pawnio_handle, "i801"); + ResourceManager::get()->RegisterI2CBus(bus); } /*-----------------------------------------------------*\ - | For each detected SMBus adapter, try enumerating it | - | as either AMD (piix4) or Intel (i801) | + | Try to load AMD (PIIX4) SMBus driver - primary bus | \*-----------------------------------------------------*/ - for(QueryObj &i : q_res_PnPSignedDriver) + if(i2c_smbus_pawnio::start_pawnio("SmbusPIIX4.bin", &pawnio_handle) == S_OK) { /*-------------------------------------------------*\ - | Intel SMBus controllers do show I/O resources in | - | Device Manager. Analysis of many Intel boards | - | has shown that Intel SMBus adapter I/O space | - | varies between boards. We can query | - | Win32_PnPAllocatedResource entries and look up | - | the PCI device ID to find the allocated I/O space.| - | | - | Intel SMBus adapters use the i801 driver | + | Select port 0 | \*-------------------------------------------------*/ - if((i["Manufacturer"].find("Intel") != std::string::npos) - || (i["Manufacturer"].find("INTEL") != std::string::npos)) - { - std::string pnp_str = i["DeviceID"]; + piix4_port_sel(pawnio_handle, 0); - std::size_t ven_loc = pnp_str.find("VEN_"); - std::size_t dev_loc = pnp_str.find("DEV_"); - std::size_t sub_loc = pnp_str.find("SUBSYS_"); + bus = new i2c_smbus_pawnio(pawnio_handle, "piix4"); + ResourceManager::get()->RegisterI2CBus(bus); + } - std::string ven_str = pnp_str.substr(ven_loc + 4, 4); - std::string dev_str = pnp_str.substr(dev_loc + 4, 4); - std::string sbv_str = pnp_str.substr(sub_loc + 11, 4); - std::string sbd_str = pnp_str.substr(sub_loc + 7, 4); - - int ven_id = (int)std::stoul(ven_str, nullptr, 16); - int dev_id = (int)std::stoul(dev_str, nullptr, 16); - int sbv_id = (int)std::stoul(sbv_str, nullptr, 16); - int sbd_id = (int)std::stoul(sbd_str, nullptr, 16); - - /*---------------------------------------------*\ - | Create bus | - \*---------------------------------------------*/ - if(i2c_smbus_pawnio::start_pawnio("SmbusI801.bin", &pawnio_handle) != S_OK) - { - return(false); - } - - bus = new i2c_smbus_pawnio(pawnio_handle, "i801"); - bus->pci_vendor = ven_id; - bus->pci_device = dev_id; - bus->pci_subsystem_vendor = sbv_id; - bus->pci_subsystem_device = sbd_id; - strncpy(bus->device_name, i["Description"].c_str(), sizeof bus->device_name); - ResourceManager::get()->RegisterI2CBus(bus); - } - - /*-------------------------------------------------*\ - | AMD SMBus adapters use the PIIX4 driver | + /*-----------------------------------------------------*\ + | Try to load AMD (PIIX4 SMBus driver - secondary bus | + \*-----------------------------------------------------*/ + if(i2c_smbus_pawnio::start_pawnio("SmbusPIIX4.bin", &pawnio_handle) == S_OK) + { + /*--------------------------------------------------*\ + | Select port 1 | \*-------------------------------------------------*/ - else if(i["Manufacturer"].find("Advanced Micro Devices, Inc") != std::string::npos) - { - std::string pnp_str = i["DeviceID"]; + piix4_port_sel(pawnio_handle, 1); - std::size_t ven_loc = pnp_str.find("VEN_"); - std::size_t dev_loc = pnp_str.find("DEV_"); - std::size_t sub_loc = pnp_str.find("SUBSYS_"); + bus = new i2c_smbus_pawnio(pawnio_handle, "piix4"); + ResourceManager::get()->RegisterI2CBus(bus); + } - std::string ven_str = pnp_str.substr(ven_loc + 4, 4); - std::string dev_str = pnp_str.substr(dev_loc + 4, 4); - std::string sbv_str = pnp_str.substr(sub_loc + 11, 4); - std::string sbd_str = pnp_str.substr(sub_loc + 7, 4); - - int ven_id = (int)std::stoul(ven_str, nullptr, 16); - int dev_id = (int)std::stoul(dev_str, nullptr, 16); - int sbv_id = (int)std::stoul(sbv_str, nullptr, 16); - int sbd_id = (int)std::stoul(sbd_str, nullptr, 16); - - /*---------------------------------------------*\ - | Create primary bus | - \*---------------------------------------------*/ - if(i2c_smbus_pawnio::start_pawnio("SmbusPIIX4.bin", &pawnio_handle) != S_OK) - { - return(false); - } - - /*---------------------------------------------*\ - | Select port 0 | - \*---------------------------------------------*/ - piix4_port_sel(pawnio_handle, 0); - - bus = new i2c_smbus_pawnio(pawnio_handle, "piix4"); - bus->pci_vendor = ven_id; - bus->pci_device = dev_id; - bus->pci_subsystem_vendor = sbv_id; - bus->pci_subsystem_device = sbd_id; - strncpy(bus->device_name, i["Description"].c_str(), sizeof bus->device_name); - strncat(bus->device_name, " port 0", sizeof bus->device_name); - ResourceManager::get()->RegisterI2CBus(bus); - - /*---------------------------------------------*\ - | Create secondary bus | - \*---------------------------------------------*/ - if(i2c_smbus_pawnio::start_pawnio("SmbusPIIX4.bin", &pawnio_handle) != S_OK) - { - return(false); - } - - /*---------------------------------------------*\ - | Select port 1 | - \*---------------------------------------------*/ - piix4_port_sel(pawnio_handle, 1); - - bus = new i2c_smbus_pawnio(pawnio_handle, "piix4"); - bus->pci_vendor = ven_id; - bus->pci_device = dev_id; - bus->pci_subsystem_vendor = sbv_id; - bus->pci_subsystem_device = sbd_id; - strncpy(bus->device_name, i["Description"].c_str(), sizeof bus->device_name); - strncat(bus->device_name, " port 1", sizeof bus->device_name); - ResourceManager::get()->RegisterI2CBus(bus); - } + /*-----------------------------------------------------*\ + | Try to load Nuvoton (NCT6793) SMBus driver | + \*-----------------------------------------------------*/ + if(i2c_smbus_pawnio::start_pawnio("SmbusNCT6793.bin", &pawnio_handle) == S_OK) + { + bus = new i2c_smbus_pawnio(pawnio_handle, "NCT6793"); + ResourceManager::get()->RegisterI2CBus(bus); } return(true); diff --git a/i2c_tools/i2c_tools.cpp b/i2c_tools/i2c_tools.cpp index bf8e75079..cc4fa619b 100644 --- a/i2c_tools/i2c_tools.cpp +++ b/i2c_tools/i2c_tools.cpp @@ -62,6 +62,9 @@ std::string i2c_detect(i2c_smbus_interface * bus, int mode) case MODE_READ: res = bus->i2c_smbus_read_byte(slave_addr); break; + case MODE_READ_DATA: + res = bus->i2c_smbus_read_byte_data(slave_addr, 0); + break; default: if ((i + j >= 0x30 && i + j <= 0x37) || (i + j >= 0x50 && i + j <= 0x5F)) diff --git a/i2c_tools/i2c_tools.h b/i2c_tools/i2c_tools.h index 91ea6fd55..fe86e9af6 100644 --- a/i2c_tools/i2c_tools.h +++ b/i2c_tools/i2c_tools.h @@ -11,10 +11,11 @@ #include #include "i2c_smbus.h" -#define MODE_AUTO 0 -#define MODE_QUICK 1 -#define MODE_READ 2 -#define MODE_FUNC 3 +#define MODE_AUTO 0 +#define MODE_QUICK 1 +#define MODE_READ 2 +#define MODE_READ_DATA 3 +#define MODE_FUNC 4 std::string i2c_detect(i2c_smbus_interface * bus, int mode); diff --git a/pci_ids/pci_ids.h b/pci_ids/pci_ids.h index cd38a2c89..6363b42d9 100644 --- a/pci_ids/pci_ids.h +++ b/pci_ids/pci_ids.h @@ -966,6 +966,7 @@ #define IF_MOBO_SMBUS(ven, dev) \ if((ven == 0) || \ + ((ven == 0xFFFF) && (dev == 0xFFFF)) || \ ((ven == AMD_VEN) && (dev == AMD_FCH_SMBUS_DEV)) || \ ((ven == INTEL_VEN) && (dev == INTEL_ICH10_SMBUS_DEV)) || \ ((ven == INTEL_VEN) && (dev == INTEL_SUNRISE_POINT_H_SMBUS_DEV)) || \ diff --git a/qt/OpenRGBSystemInfoPage/OpenRGBSystemInfoPage.cpp b/qt/OpenRGBSystemInfoPage/OpenRGBSystemInfoPage.cpp index f3cd7a10b..a52e3668a 100644 --- a/qt/OpenRGBSystemInfoPage/OpenRGBSystemInfoPage.cpp +++ b/qt/OpenRGBSystemInfoPage/OpenRGBSystemInfoPage.cpp @@ -46,6 +46,7 @@ OpenRGBSystemInfoPage::OpenRGBSystemInfoPage(std::vector& ui->SMBusDetectionModeBox->addItem("Auto"); ui->SMBusDetectionModeBox->addItem("Quick"); ui->SMBusDetectionModeBox->addItem("Read"); + ui->SMBusDetectionModeBox->addItem("Read Data"); ui->SMBusDetectionModeBox->setCurrentIndex(0); } @@ -104,6 +105,10 @@ void OpenRGBSystemInfoPage::on_DetectButton_clicked() case 2: ui->SMBusDataText->setPlainText(i2c_detect(bus, MODE_READ).c_str()); break; + + case 3: + ui->SMBusDataText->setPlainText(i2c_detect(bus, MODE_READ_DATA).c_str()); + break; } } }