Convert Corsair Vengeance RGB (non-Pro) controller to use DRAM SPD detector

This commit is contained in:
Adam Honse 2025-07-02 21:59:39 -05:00
parent e4c43548eb
commit ec34b23688
3 changed files with 37 additions and 30 deletions

View file

@ -56,40 +56,41 @@ bool TestForCorsairVengeanceController(i2c_smbus_interface* bus, unsigned char a
* * * *
* Detect Corsair controllers on the enumerated I2C busses. * * Detect Corsair controllers on the enumerated I2C busses. *
* * * *
* bus - pointer to i2c_smbus_interface where Aura device is connected * * bus - pointer to i2c_smbus_interface where device is connected *
* dev - I2C address of Aura device * * slots - list of SPD entries with matching JEDEC ID *
* * * *
\******************************************************************************************/ \******************************************************************************************/
void DetectCorsairVengeanceControllers(std::vector<i2c_smbus_interface*> &busses) void DetectCorsairVengeanceControllers(i2c_smbus_interface* bus, std::vector<SPDWrapper*> &slots)
{ {
for(unsigned int bus = 0; bus < busses.size(); bus++) for(SPDWrapper *slot : slots)
{ {
IF_DRAM_SMBUS(busses[bus]->pci_vendor, busses[bus]->pci_device) /*-------------------------------------------------*\
| Test first address range 0x58-0x5F |
\*-------------------------------------------------*/
unsigned char address = slot->address() + 8;
if(TestForCorsairVengeanceController(bus, address))
{ {
for(unsigned char addr = 0x58; addr <= 0x5F; addr++) CorsairVengeanceController* new_controller = new CorsairVengeanceController(bus, address);
{ RGBController_CorsairVengeance* new_rgbcontroller = new RGBController_CorsairVengeance(new_controller);
if(TestForCorsairVengeanceController(busses[bus], addr))
{
CorsairVengeanceController* new_controller = new CorsairVengeanceController(busses[bus], addr);
RGBController_CorsairVengeance* new_rgbcontroller = new RGBController_CorsairVengeance(new_controller);
ResourceManager::get()->RegisterRGBController(new_rgbcontroller); ResourceManager::get()->RegisterRGBController(new_rgbcontroller);
} }
}
for(unsigned char addr = 0x18; addr <= 0x1F; addr++)
{
if(TestForCorsairVengeanceController(busses[bus], addr))
{
CorsairVengeanceController* new_controller = new CorsairVengeanceController(busses[bus], addr);
RGBController_CorsairVengeance* new_rgbcontroller = new RGBController_CorsairVengeance(new_controller);
ResourceManager::get()->RegisterRGBController(new_rgbcontroller); /*-------------------------------------------------*\
} | Test second address range 0x18-0x1F |
} \*-------------------------------------------------*/
address = slot->address() - 0x40 + 8;
if(TestForCorsairVengeanceController(bus, address))
{
CorsairVengeanceController* new_controller = new CorsairVengeanceController(bus, address);
RGBController_CorsairVengeance* new_rgbcontroller = new RGBController_CorsairVengeance(new_controller);
ResourceManager::get()->RegisterRGBController(new_rgbcontroller);
} }
} }
} /* DetectCorsairVengeanceControllers() */ } /* DetectCorsairVengeanceControllers() */
REGISTER_I2C_DETECTOR("Corsair Vengeance", DetectCorsairVengeanceControllers); REGISTER_I2C_DIMM_DETECTOR("Corsair Vengeance RGB DRAM", DetectCorsairVengeanceControllers, JEDEC_CORSAIR, SPD_DDR4_SDRAM);

View file

@ -15,7 +15,7 @@ SPDWrapper::SPDWrapper(const SPDWrapper &wrapper)
{ {
this->accessor = wrapper.accessor->copy(); this->accessor = wrapper.accessor->copy();
} }
this->address = wrapper.address; this->addr = wrapper.addr;
this->mem_type = wrapper.mem_type; this->mem_type = wrapper.mem_type;
/*-----------------------------------------------------*\ /*-----------------------------------------------------*\
@ -35,13 +35,13 @@ SPDWrapper::SPDWrapper(const SPDWrapper &wrapper)
SPDWrapper::SPDWrapper(const SPDDetector &detector) SPDWrapper::SPDWrapper(const SPDDetector &detector)
{ {
this->address = detector.spd_address(); this->addr = detector.spd_address();
this->mem_type = detector.memory_type(); this->mem_type = detector.memory_type();
/*-----------------------------------------------------*\ /*-----------------------------------------------------*\
| Allocate a new accessor | | Allocate a new accessor |
\*-----------------------------------------------------*/ \*-----------------------------------------------------*/
this->accessor = SPDAccessor::for_memory_type(this->mem_type, detector.smbus(), this->address); this->accessor = SPDAccessor::for_memory_type(this->mem_type, detector.smbus(), this->addr);
/*-----------------------------------------------------*\ /*-----------------------------------------------------*\
| Read the JEDEC ID and cache its value | | Read the JEDEC ID and cache its value |
@ -68,9 +68,14 @@ SPDMemoryType SPDWrapper::memory_type()
return mem_type; return mem_type;
} }
uint8_t SPDWrapper::address()
{
return this->addr;
}
int SPDWrapper::index() int SPDWrapper::index()
{ {
return this->address - 0x50; return this->addr - 0x50;
} }
uint16_t SPDWrapper::jedec_id() uint16_t SPDWrapper::jedec_id()

View file

@ -20,6 +20,7 @@ class SPDWrapper
SPDWrapper(const SPDDetector &detector); SPDWrapper(const SPDDetector &detector);
~SPDWrapper(); ~SPDWrapper();
uint8_t address();
SPDMemoryType memory_type(); SPDMemoryType memory_type();
int index(); int index();
uint16_t jedec_id(); uint16_t jedec_id();
@ -27,7 +28,7 @@ class SPDWrapper
private: private:
SPDAccessor *accessor = nullptr; SPDAccessor *accessor = nullptr;
uint8_t address; uint8_t addr;
uint16_t jedec_id_val; uint16_t jedec_id_val;
SPDMemoryType mem_type; SPDMemoryType mem_type;
}; };