From e9723358728eeb9f3165ae888ce4ef61d5e20862 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Wed, 26 Aug 2020 19:06:23 -0500 Subject: [PATCH] Move speed setting to mode function, add struct to hold board information, remove firmware version from name string and add it to firmware version field. --- .../PolychromeController.cpp | 74 ++++--- .../PolychromeController.h | 17 +- RGBController/RGBController_Polychrome.cpp | 182 +++++++++++++----- 3 files changed, 181 insertions(+), 92 deletions(-) diff --git a/Controllers/PolychromeController/PolychromeController.cpp b/Controllers/PolychromeController/PolychromeController.cpp index ccf086de..dba8008e 100644 --- a/Controllers/PolychromeController/PolychromeController.cpp +++ b/Controllers/PolychromeController/PolychromeController.cpp @@ -14,8 +14,8 @@ PolychromeController::PolychromeController(i2c_smbus_interface* bus, polychrome_ { this->bus = bus; this->dev = dev; - - unsigned short fw_version = GetFirmwareVersion(); + + unsigned short fw_version = ReadFirmwareVersion(); unsigned char major_version = fw_version >> 8; unsigned char minor_version = fw_version & 0xFF; @@ -27,13 +27,13 @@ PolychromeController::PolychromeController(i2c_smbus_interface* bus, polychrome_ \*-----------------------------------------------------*/ if((major_version < 0x03) && (major_version > 0x00)) { - snprintf(device_name, 32, "ASRock ASR LED FW %d.%02d", major_version, minor_version); + device_name = "ASRock ASR LED"; led_count = 1; asr_led = true; } else if(major_version == 0x03) { - snprintf(device_name, 32, "ASRock Polychrome FW %d.%02d", major_version, minor_version); + device_name = "ASRock Polychrome"; led_count = 1; asr_led = false; } @@ -49,12 +49,21 @@ PolychromeController::~PolychromeController() } -char* PolychromeController::GetDeviceName() +std::string PolychromeController::GetDeviceName() { return(device_name); } -unsigned short PolychromeController::GetFirmwareVersion() +std::string PolychromeController::GetFirmwareVersion() +{ + unsigned short fw_version = ReadFirmwareVersion(); + unsigned char major_version = fw_version >> 8; + unsigned char minor_version = fw_version & 0xFF; + + return(std::to_string(major_version) + "." + std::to_string(minor_version)); +} + +unsigned short PolychromeController::ReadFirmwareVersion() { // The firmware register holds two bytes, so the first read should return 2 // If not, report invalid firmware revision FFFF @@ -86,11 +95,10 @@ bool PolychromeController::IsAsrLed() return(asr_led); } -void PolychromeController::SetColorsAndSpeed(unsigned char led, unsigned char red, unsigned char green, unsigned char blue, unsigned char speed) +void PolychromeController::SetColorsAndSpeed(unsigned char led, unsigned char red, unsigned char green, unsigned char blue) { - unsigned char color_speed_pkt[4] = { red, green, blue, speed }; - unsigned char select_zone_pkt[1] = { led }; - unsigned char select_all_pkt[1] = { 0x00 }; + unsigned char color_speed_pkt[4] = { red, green, blue, active_speed }; + unsigned char select_led_pkt[1] = { led }; if (asr_led) { @@ -119,7 +127,7 @@ void PolychromeController::SetColorsAndSpeed(unsigned char led, unsigned char re \*-----------------------------------------------------*/ case ASRLED_MODE_RANDOM: case ASRLED_MODE_WAVE: - bus->i2c_smbus_write_block_data(dev, active_mode, 1, &speed); + bus->i2c_smbus_write_block_data(dev, active_mode, 1, &active_speed); break; /*-----------------------------------------------------*\ @@ -132,18 +140,35 @@ void PolychromeController::SetColorsAndSpeed(unsigned char led, unsigned char re else { /*-----------------------------------------------------*\ - | Select zone | + | Select LED | \*-----------------------------------------------------*/ - bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_ZONE_SELECT, 1, select_zone_pkt); - /*-----------------------------------------------------*\ - | Select all zones for now | - \*-----------------------------------------------------*/ - bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_ZONE_SELECT_ALL, 1, select_all_pkt); + bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_LED_SELECT, 1, select_led_pkt); /*-----------------------------------------------------*\ | Polychrome firmware always writes color to fixed reg | \*-----------------------------------------------------*/ bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_COLOR, 3, color_speed_pkt); + } +} + +void PolychromeController::SetMode(unsigned char mode, unsigned char speed) +{ + unsigned char led_count_pkt[1] = { 0x00 }; + active_mode = mode; + active_speed = speed; + + if(asr_led) + { + bus->i2c_smbus_write_block_data(dev, ASRLED_REG_MODE, 1, &active_mode); + } + else + { + bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_MODE, 1, &active_mode); + + /*-----------------------------------------------------*\ + | Select a single LED | + \*-----------------------------------------------------*/ + bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_LED_COUNT, 0, led_count_pkt); switch(active_mode) { @@ -161,20 +186,5 @@ void PolychromeController::SetColorsAndSpeed(unsigned char led, unsigned char re bus->i2c_smbus_write_block_data(dev, active_mode, 1, &speed); break; } - - } -} - -void PolychromeController::SetMode(unsigned char mode) -{ - active_mode = mode; - - if (asr_led) - { - bus->i2c_smbus_write_block_data(dev, ASRLED_REG_MODE, 1, &active_mode); - } - else - { - bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_MODE, 1, &active_mode); } } diff --git a/Controllers/PolychromeController/PolychromeController.h b/Controllers/PolychromeController/PolychromeController.h index 3337c3cd..18fb738f 100644 --- a/Controllers/PolychromeController/PolychromeController.h +++ b/Controllers/PolychromeController/PolychromeController.h @@ -9,6 +9,7 @@ \*-----------------------------------------*/ #include "i2c_smbus.h" +#include #pragma once @@ -45,8 +46,8 @@ enum { POLYCHROME_REG_FIRMWARE_VER = 0x00, /* Firmware version Major.Minor */ POLYCHROME_REG_MODE = 0x30, /* Mode selection register */ - POLYCHROME_REG_ZONE_SELECT = 0x31, /* Zone selection register */ - POLYCHROME_REG_ZONE_SELECT_ALL = 0x32, /* Zone select all register */ + POLYCHROME_REG_LED_SELECT = 0x31, /* LED selection register */ + POLYCHROME_REG_LED_COUNT = 0x32, /* Additional LED count register */ POLYCHROME_REG_COLOR = 0x34, /* Color register: Red, Green, Blue */ }; @@ -83,20 +84,22 @@ public: PolychromeController(i2c_smbus_interface* bus, polychrome_dev_id dev); ~PolychromeController(); - char* GetDeviceName(); + std::string GetDeviceName(); + std::string GetFirmwareVersion(); unsigned int GetLEDCount(); unsigned int GetMode(); bool IsAsrLed(); - void SetColorsAndSpeed(unsigned char led, unsigned char red, unsigned char green, unsigned char blue, unsigned char speed); - void SetMode(unsigned char mode); - unsigned short GetFirmwareVersion(); + void SetColorsAndSpeed(unsigned char led, unsigned char red, unsigned char green, unsigned char blue); + void SetMode(unsigned char mode, unsigned char speed); private: bool asr_led; - char device_name[32]; + std::string device_name; unsigned int led_count; unsigned char active_mode; + unsigned char active_speed; i2c_smbus_interface* bus; polychrome_dev_id dev; + unsigned short ReadFirmwareVersion(); }; diff --git a/RGBController/RGBController_Polychrome.cpp b/RGBController/RGBController_Polychrome.cpp index 7ee665bc..f070d1b4 100644 --- a/RGBController/RGBController_Polychrome.cpp +++ b/RGBController/RGBController_Polychrome.cpp @@ -9,54 +9,129 @@ #include "RGBController_Polychrome.h" -static const char* polychrome_zone_names[] = +#define ASROCK_MAX_ZONES 4 +#define ASROCK_MAX_LEDS 22 + +typedef struct { - "AMD FAN LED Header", - "RGB LED 1 Header", - "PCH", - "IO Cover", + const char* zone_names[ASROCK_MAX_ZONES]; + const zone_type zone_types[ASROCK_MAX_ZONES]; + const int zone_sizes[ASROCK_MAX_ZONES]; + const char* led_names[ASROCK_MAX_LEDS]; +} asrock_layout; + +static const asrock_layout ASRock_B450_Steel_Legend = +{ + /*---------------------------------------------------------*\ + | zone_names | + \*---------------------------------------------------------*/ + { + "AMD FAN LED Header", + "RGB LED 1 Header", + "PCH", + "IO Cover", + }, + /*---------------------------------------------------------*\ + | zone_types | + \*---------------------------------------------------------*/ + { + ZONE_TYPE_SINGLE, + ZONE_TYPE_SINGLE, + ZONE_TYPE_LINEAR, + ZONE_TYPE_LINEAR, + }, + /*---------------------------------------------------------*\ + | zone_sizes | + \*---------------------------------------------------------*/ + { + 1, + 1, + 10, + 10, + }, + /*---------------------------------------------------------*\ + | led_names | + \*---------------------------------------------------------*/ + { + "AMD FAN LED Header", + "RGB LED 1 Header", + "PCH 0", + "PCH 1", + "PCH 2", + "PCH 3", + "PCH 4", + "PCH 5", + "PCH 6", + "PCH 7", + "PCH 8", + "PCH 9", + "IO Cover 0", + "IO Cover 1", + "IO Cover 2", + "IO Cover 3", + "IO Cover 4", + "IO Cover 5", + "IO Cover 6", + "IO Cover 7", + "IO Cover 8", + "IO Cover 9", + } }; -static const zone_type polychrome_zone_types[] = +static const asrock_layout ASRock_B450M_Steel_Legend = { - ZONE_TYPE_SINGLE, - ZONE_TYPE_SINGLE, - ZONE_TYPE_LINEAR, - ZONE_TYPE_LINEAR, -}; - -static const int polychrome_zone_sizes[] = -{ - 1, - 1, - 10, - 10, -}; - -static const char* polychrome_led_names[] = -{ - "AMD FAN LED Header", - "RGB LED 1 Header", - "PCH 0", - "PCH 1", - "PCH 2", - "PCH 3", - "PCH 4", - "PCH 5", - "PCH 6", - "PCH 7", - "PCH 8", - "PCH 9", - "IO Cover 0", - "IO Cover 1", - "IO Cover 2", - "IO Cover 3", - "IO Cover 4", - "IO Cover 5", - "IO Cover 6", - "IO Cover 7", - "IO Cover 8", - "IO Cover 9", + /*---------------------------------------------------------*\ + | zone_names | + \*---------------------------------------------------------*/ + { + "AMD FAN LED Header", + "RGB LED 1 Header", + "PCH", + "IO Cover", + }, + /*---------------------------------------------------------*\ + | zone_types | + \*---------------------------------------------------------*/ + { + ZONE_TYPE_SINGLE, + ZONE_TYPE_SINGLE, + ZONE_TYPE_LINEAR, + ZONE_TYPE_LINEAR, + }, + /*---------------------------------------------------------*\ + | zone_sizes | + \*---------------------------------------------------------*/ + { + 1, + 1, + 8, + 10, + }, + /*---------------------------------------------------------*\ + | led_names | + \*---------------------------------------------------------*/ + { + "AMD FAN LED Header", + "RGB LED 1 Header", + "PCH 0", + "PCH 1", + "PCH 2", + "PCH 3", + "PCH 4", + "PCH 5", + "PCH 6", + "PCH 7", + "IO Cover 0", + "IO Cover 1", + "IO Cover 2", + "IO Cover 3", + "IO Cover 4", + "IO Cover 5", + "IO Cover 6", + "IO Cover 7", + "IO Cover 8", + "IO Cover 9", + } }; RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychrome_ptr) @@ -64,8 +139,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr polychrome = polychrome_ptr; name = polychrome->GetDeviceName(); + version = polychrome->GetFirmwareVersion(); type = DEVICE_TYPE_MOTHERBOARD; - description = "ASRock Polychrome Device"; + description = "ASRock ASR LED/Polychrome Device"; if(polychrome->IsAsrLed()) { @@ -289,11 +365,11 @@ void RGBController_Polychrome::SetupZones() /*---------------------------------------------------------*\ | Set zone name to channel name | \*---------------------------------------------------------*/ - new_zone->name = polychrome_zone_names[i]; - new_zone->type = polychrome_zone_types[i]; - new_zone->leds_min = polychrome_zone_sizes[i]; - new_zone->leds_max = polychrome_zone_sizes[i]; - new_zone->leds_count = polychrome_zone_sizes[i]; + new_zone->name = ASRock_B450_Steel_Legend.zone_names[i]; + new_zone->type = ASRock_B450_Steel_Legend.zone_types[i]; + new_zone->leds_min = ASRock_B450_Steel_Legend.zone_sizes[i]; + new_zone->leds_max = ASRock_B450_Steel_Legend.zone_sizes[i]; + new_zone->leds_count = ASRock_B450_Steel_Legend.zone_sizes[i]; new_zone->matrix_map = NULL; /*---------------------------------------------------------*\ @@ -315,7 +391,7 @@ void RGBController_Polychrome::SetupZones() \*---------------------------------------------------------*/ led* new_led = new led(); - new_led->name = polychrome_led_names[led_count]; + new_led->name = ASRock_B450_Steel_Legend.led_names[led_count]; /*---------------------------------------------------------*\ | Push new LED to LEDs vector | @@ -355,7 +431,7 @@ void RGBController_Polychrome::UpdateSingleLED(int led) unsigned char grn = RGBGetGValue(colors[led]); unsigned char blu = RGBGetBValue(colors[led]); - polychrome->SetColorsAndSpeed(led, red, grn, blu, modes[active_mode].speed); + polychrome->SetColorsAndSpeed(led, red, grn, blu); } void RGBController_Polychrome::SetCustomMode() @@ -365,7 +441,7 @@ void RGBController_Polychrome::SetCustomMode() void RGBController_Polychrome::DeviceUpdateMode() { - polychrome->SetMode(modes[active_mode].value); + polychrome->SetMode(modes[active_mode].value, modes[active_mode].speed); DeviceUpdateLEDs(); }