From b8eb4e9bcb07dcd03ade62ec35ae2d2148ca1a9a Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sat, 14 Dec 2019 11:15:55 -0600 Subject: [PATCH] Initial work on ASRock Polychrome/ASR LED interface. Does not function yet. --- .../PolychromeController.cpp | 95 +++++++++++++++++++ .../PolychromeController.h | 86 +++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 Controllers/PolychromeController/PolychromeController.cpp create mode 100644 Controllers/PolychromeController/PolychromeController.h diff --git a/Controllers/PolychromeController/PolychromeController.cpp b/Controllers/PolychromeController/PolychromeController.cpp new file mode 100644 index 00000000..f0b56244 --- /dev/null +++ b/Controllers/PolychromeController/PolychromeController.cpp @@ -0,0 +1,95 @@ +/*-----------------------------------------*\ +| PolychromeController.cpp | +| | +| Driver for for ASRock ASR LED and | +| Polychrome RGB lighting controller | +| | +| Adam Honse (CalcProgrammer1) 12/14/2019 | +\*-----------------------------------------*/ + +#include "PolychromeController.h" +#include + +PolychromeController::PolychromeController(i2c_smbus_interface* bus, polychrome_dev_id dev) +{ + this->bus = bus; + this->dev = dev; + + switch (GetFirmwareVersion()) + { + case FIRMWARE_VER_1_PT_10: + led_count = 1; + strcpy(device_name, "ASRock ASR LED FW 1.10"); + break; + + case FIRMWARE_VER_2_PT_00: + led_count = 1; + strcpy(device_name, "ASRock Polychrome FW 2.00"); + break; + + case FIRMWARE_VER_3_PT_00: + led_count = 1; + strcpy(device_name, "ASRock Polychrome FW 3.00"); + break; + } +} + +PolychromeController::~PolychromeController() +{ + +} + +char* PolychromeController::GetDeviceName() +{ + return(device_name); +} + +unsigned short PolychromeController::GetFirmwareVersion() +{ + // The firmware register holds two bytes, so the first read should return 2 + // If not, report invalid firmware revision FFFF + if (bus->i2c_smbus_read_byte_data(dev, POLYCHROME_REG_FIRMWARE_VER) == 0x02) + { + unsigned char major = bus->i2c_smbus_read_byte(dev); + unsigned char minor = bus->i2c_smbus_read_byte(dev); + + return((major << 8) | minor); + } + else + { + return(0xFFFF); + } +} + +unsigned int PolychromeController::GetLEDCount() +{ + return(led_count); +} + +void PolychromeController::SetAllColors(unsigned char red, unsigned char green, unsigned char blue) +{ + unsigned char* colors = new unsigned char[led_count * 3]; + + for (int i = 0; i < (led_count * 3); i += 3) + { + colors[i + 0] = red; + colors[i + 1] = blue; + colors[i + 2] = green; + } + + delete colors; +} + +void PolychromeController::SetLEDColor(unsigned int led, unsigned char red, unsigned char green, unsigned char blue) +{ + unsigned char colors[3] = { red, blue, green }; +} + +void PolychromeController::SetMode(unsigned char mode) +{ + // For ASR LED protocol + //placeholder// + + // For Polychrome protocol + bus->i2c_smbus_write_byte_data(dev, POLYCHROME_REG_MODE, mode); +} \ No newline at end of file diff --git a/Controllers/PolychromeController/PolychromeController.h b/Controllers/PolychromeController/PolychromeController.h new file mode 100644 index 00000000..87eeb1bd --- /dev/null +++ b/Controllers/PolychromeController/PolychromeController.h @@ -0,0 +1,86 @@ +/*-----------------------------------------*\ +| PolychromeController.h | +| | +| Definitions and types for ASRock | +| ASR LED and Polychrome RGB lighting | +| controller | +| | +| Adam Honse (CalcProgrammer1) 12/13/2019 | +\*-----------------------------------------*/ + +#include "i2c_smbus.h" + +#pragma once + +typedef unsigned char polychrome_dev_id; + +enum +{ + FIRMWARE_VER_1_PT_10 = 0x010A, /* Firmware nu51_1.10 */ + FIRMWARE_VER_2_PT_00 = 0x0200, /* Firmware nu51_2.00 */ + FIRMWARE_VER_3_PT_00 = 0x0300, /* Firmware nu51_3.00 */ +}; + +enum +{ + ASRLED_REG_FIRMWARE_VER = 0x00, /* Firmware version Major.Minor */ + ASRLED_REG_MODE = 0x30, /* Mode selection register */ +}; + +enum +{ + ASRLED_MODE_OFF = 0x10, /* OFF mode */ + ASRLED_MODE_STATIC = 0x11, /* Static color mode */ + ASRLED_MODE_BREATHING = 0x12, /* Breathing effect mode */ + ASRLED_MODE_FLASHING = 0x13, /* Flashing effect mode */ + ASRLED_MODE_SPECTRUM_CYCLE = 0x14, /* Spectrum Cycle effect mode */ + ASRLED_MODE_RANDOM = 0x15, /* Random effect mode */ + ASRLED_MODE_MUSIC = 0x17, /* Music effect mode */ + ASRLED_MODE_WAVE = 0x18, /* Wave effect mode */ +}; + +enum +{ + POLYCHROME_REG_FIRMWARE_VER = 0x00, /* Firmware version Major.Minor */ + POLYCHROME_REG_MODE = 0x30, /* Mode selection register */ + POLYCHROME_REG_COLOR = 0x34, /* Color register: Red, Green, Blue */ +}; + +enum +{ + POLYCHROME_MODE_OFF = 0x10, /* OFF mode */ + POLYCHROME_MODE_STATIC = 0x11, /* Static color mode */ + POLYCHROME_MODE_BREATHING = 0x12, /* Breating effect mode */ + POLYCHROME_MODE_FLASHING = 0x13, /* Flashing effect mode */ + POLYCHROME_MODE_SPECTRUM_CYCLE = 0x14, /* Spectrum Cycle effect mode */ + POLYCHROME_MODE_RANDOM = 0x15, /* Random effect mode */ + POLYCHROME_MODE_WAVE = 0x17, /* Wave effect mode */ + POLYCHROME_MODE_SPRING = 0x18, /* Spring effect mode */ + POLYCHROME_MODE_STACK = 0x19, /* Stack effect mode */ + POLYCHROME_MODE_CRAM = 0x1A, /* Cram effect mode */ + POLYCHROME_MODE_SCAN = 0x1B, /* Scan effect mode */ + POLYCHROME_MODE_NEON = 0x1C, /* Neon effect mode */ + POLYCHROME_MODE_WATER = 0x1D, /* Water effect mode */ + POLYCHROME_MODE_RAINBOW = 0x1E, /* Rainbow effect mode */ +}; + +class PolychromeController +{ +public: + PolychromeController(i2c_smbus_interface* bus, polychrome_dev_id dev); + ~PolychromeController(); + + char* GetDeviceName(); + unsigned int GetLEDCount(); + void SetAllColors(unsigned char red, unsigned char green, unsigned char blue); + void SetLEDColor(unsigned int led, unsigned char red, unsigned char green, unsigned char blue); + void SetMode(unsigned char mode); + unsigned short GetFirmwareVersion(); + +private: + char device_name[32]; + unsigned int led_count; + i2c_smbus_interface* bus; + polychrome_dev_id dev; + +}; \ No newline at end of file