From b17b6340bd3a3aecb4779c2c1fa4c3eab33c287f Mon Sep 17 00:00:00 2001 From: TheRogueZeta <6479694-TheRogueZeta@users.noreply.gitlab.com> Date: Sun, 6 Jun 2021 22:30:49 -0700 Subject: [PATCH] Test to see if Patriot Viper DRAM modules exist before performing writes Amended to use read check as quick check doesn't work for SPD addresses by Adam Honse --- .../PatriotViperControllerDetect.cpp | 48 ++++++++++++------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/Controllers/PatriotViperController/PatriotViperControllerDetect.cpp b/Controllers/PatriotViperController/PatriotViperControllerDetect.cpp index 8908f687..9f837eca 100644 --- a/Controllers/PatriotViperController/PatriotViperControllerDetect.cpp +++ b/Controllers/PatriotViperController/PatriotViperControllerDetect.cpp @@ -37,32 +37,44 @@ void DetectPatriotViperControllers(std::vector &busses) // Test for Patriot Viper RGB SPD at slot_addr // This test was copied from Viper RGB software // Tests SPD addresses in order: 0x00, 0x40, 0x41, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68 - busses[bus]->i2c_smbus_write_byte_data(0x36, 0x00, 0xFF); + bool pass = false; - std::this_thread::sleep_for(1ms); + int res = busses[bus]->i2c_smbus_read_byte(slot_addr); - if(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x00) == 0x23) + if (res >= 0) { - busses[bus]->i2c_smbus_write_byte_data(0x37, 0x00, 0xFF); + pass = true; + } + + if(pass) + { + busses[bus]->i2c_smbus_write_byte_data(0x36, 0x00, 0xFF); std::this_thread::sleep_for(1ms); - if((busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x40) == 0x85) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x41) == 0x02) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x61) == 0x4D) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x62) == 0x49) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x63) == 0x43) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x64) == 0x53) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x65) == 0x59) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x66) == 0x53) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x67) == 0x5f) - &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x68) == 0x44)) + if(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x00) == 0x23) { - slots_valid |= (1 << (slot_addr - 0x50)); - } - } + busses[bus]->i2c_smbus_write_byte_data(0x37, 0x00, 0xFF); - std::this_thread::sleep_for(1ms); + std::this_thread::sleep_for(1ms); + + if((busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x40) == 0x85) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x41) == 0x02) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x61) == 0x4D) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x62) == 0x49) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x63) == 0x43) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x64) == 0x53) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x65) == 0x59) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x66) == 0x53) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x67) == 0x5f) + &&(busses[bus]->i2c_smbus_read_byte_data(slot_addr, 0x68) == 0x44)) + { + slots_valid |= (1 << (slot_addr - 0x50)); + } + } + + std::this_thread::sleep_for(1ms); + } } if(slots_valid != 0)