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.

This commit is contained in:
Adam Honse
2020-08-26 19:06:23 -05:00
parent 9f584b1f76
commit e972335872
3 changed files with 181 additions and 92 deletions

View File

@@ -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);
}
}

View File

@@ -9,6 +9,7 @@
\*-----------------------------------------*/
#include "i2c_smbus.h"
#include <string>
#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();
};

View File

@@ -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();
}