diff options
author | Luiz Ribeiro <luizribeiro@gmail.com> | 2017-05-28 18:40:03 +0200 |
---|---|---|
committer | Luiz Ribeiro <luizribeiro@gmail.com> | 2017-06-11 18:30:48 +0200 |
commit | 6037cede2ce66dd8ce4df82d6d9a347c1de3110a (patch) | |
tree | 34538431c8d23c3b814e41b6e429653e85b89d5b | |
parent | c22a400603bfafedefa04c430214965cd191663b (diff) | |
download | qmk_firmware-6037cede2ce66dd8ce4df82d6d9a347c1de3110a.tar.gz qmk_firmware-6037cede2ce66dd8ce4df82d6d9a347c1de3110a.tar.xz |
rgblight support for ps2avrGB
-rw-r--r-- | build_keyboard.mk | 4 | ||||
-rw-r--r-- | keyboards/ps2avrGB/config.h | 3 | ||||
-rw-r--r-- | keyboards/ps2avrGB/i2c.c | 104 | ||||
-rw-r--r-- | keyboards/ps2avrGB/i2c.h | 25 | ||||
-rw-r--r-- | keyboards/ps2avrGB/keymaps/default/keymap.c | 66 | ||||
-rw-r--r-- | keyboards/ps2avrGB/matrix.c | 2 | ||||
-rw-r--r-- | keyboards/ps2avrGB/ps2avrGB.c | 50 | ||||
-rw-r--r-- | keyboards/ps2avrGB/rules.mk | 6 |
8 files changed, 257 insertions, 3 deletions
diff --git a/build_keyboard.mk b/build_keyboard.mk index 9fa8c3126..dc9e5dad6 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -198,7 +198,9 @@ endif ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) OPT_DEFS += -DRGBLIGHT_ENABLE - SRC += $(QUANTUM_DIR)/light_ws2812.c +ifneq ($(strip $(DISABLE_WS2812)), yes) + SRC += $(QUANTUM_DIR)/light_ws2812.c +endif SRC += $(QUANTUM_DIR)/rgblight.c CIE1931_CURVE = yes LED_BREATHING_TABLE = yes diff --git a/keyboards/ps2avrGB/config.h b/keyboards/ps2avrGB/config.h index b5c696f3f..fc17b5d5e 100644 --- a/keyboards/ps2avrGB/config.h +++ b/keyboards/ps2avrGB/config.h @@ -29,6 +29,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define MATRIX_ROWS 8 #define MATRIX_COLS 15 +#define RGBLED_NUM 16 +#define RGBLIGHT_ANIMATIONS + #define NO_UART 1 #define BOOTLOADHID_BOOTLOADER 1 diff --git a/keyboards/ps2avrGB/i2c.c b/keyboards/ps2avrGB/i2c.c new file mode 100644 index 000000000..c27f3e3d1 --- /dev/null +++ b/keyboards/ps2avrGB/i2c.c @@ -0,0 +1,104 @@ +/* +Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <avr/io.h> +#include <util/twi.h> + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + // check if the start condition was successfully transmitted + if ((TWSR & 0xF8) != TW_START) { + return 1; + } + + // transmit address and wait + TWDR = address; + TWCR = (1<<TWINT) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + // check if the device has acknowledged the READ / WRITE mode + uint8_t twst = TW_STATUS & 0xF8; + if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) { + return 1; + } + + return 0; +} + +void i2c_stop(void) { + TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); +} + +uint8_t i2c_write(uint8_t data) { + TWDR = data; + + // transmit data and wait + TWCR = (1<<TWINT) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + if ((TWSR & 0xF8) != TW_MT_DATA_ACK) { + return 1; + } + + return 0; +} + +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) { + if (i2c_start(address)) { + return 1; + } + + for (uint16_t i = 0; i < length; i++) { + if (i2c_write(data[i])) { + return 1; + } + } + + i2c_stop(); + + return 0; +} diff --git a/keyboards/ps2avrGB/i2c.h b/keyboards/ps2avrGB/i2c.h new file mode 100644 index 000000000..27c9d3d05 --- /dev/null +++ b/keyboards/ps2avrGB/i2c.h @@ -0,0 +1,25 @@ +/* +Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef __I2C_H__ +#define __I2C_H__ + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + +#endif diff --git a/keyboards/ps2avrGB/keymaps/default/keymap.c b/keyboards/ps2avrGB/keymaps/default/keymap.c index 3e4cebc81..60929ac99 100644 --- a/keyboards/ps2avrGB/keymaps/default/keymap.c +++ b/keyboards/ps2avrGB/keymaps/default/keymap.c @@ -16,6 +16,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "ps2avrGB.h" +#include "action_layer.h" +#include "rgblight.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_KEYMAP( @@ -28,5 +30,69 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) }; +enum function_id { + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, +}; + const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(RGBLED_TOGGLE), + [1] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch (id) { + case RGBLED_TOGGLE: + if (record->event.pressed) { + rgblight_toggle(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + } }; diff --git a/keyboards/ps2avrGB/matrix.c b/keyboards/ps2avrGB/matrix.c index beaa54c40..140026013 100644 --- a/keyboards/ps2avrGB/matrix.c +++ b/keyboards/ps2avrGB/matrix.c @@ -93,6 +93,8 @@ uint8_t matrix_scan(void) { } } + matrix_scan_user(); + return 1; } diff --git a/keyboards/ps2avrGB/ps2avrGB.c b/keyboards/ps2avrGB/ps2avrGB.c index e69de29bb..89e437786 100644 --- a/keyboards/ps2avrGB/ps2avrGB.c +++ b/keyboards/ps2avrGB/ps2avrGB.c @@ -0,0 +1,50 @@ +/* +Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "ps2avrGB.h" +#include "rgblight.h" + +#include <avr/pgmspace.h> + +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +extern rgblight_config_t rgblight_config; + +void rgblight_set(void) { + uint8_t data[3 * RGBLED_NUM]; + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + if (rgblight_config.enable) { + data[3 * i] = led[i].g; + data[3 * i + 1] = led[i].r; + data[3 * i + 2] = led[i].b; + } else { + data[3 * i] = 0; + data[3 * i + 1] = 0; + data[3 * i + 2] = 0; + } + } + + i2c_init(); + i2c_send(0xb0, data, 48); +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { + rgblight_task(); +} diff --git a/keyboards/ps2avrGB/rules.mk b/keyboards/ps2avrGB/rules.mk index e2b5922ea..9fb27efed 100644 --- a/keyboards/ps2avrGB/rules.mk +++ b/keyboards/ps2avrGB/rules.mk @@ -20,7 +20,6 @@ PROTOCOL = VUSB # unsupported features for now NO_UART = yes NO_SUSPEND_POWER_DOWN = yes -BACKLIGHT_ENABLE = no # processor frequency F_CPU = 12000000 @@ -31,13 +30,16 @@ MOUSEKEY_ENABLE = yes EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes +BACKLIGHT_ENABLE = no +RGBLIGHT_ENABLE = yes +DISABLE_WS2812 = yes OPT_DEFS = -DDEBUG_LEVEL=0 OPT_DEFS += -DBOOTLOADER_SIZE=2048 # custom matrix setup CUSTOM_MATRIX = yes -SRC = matrix.c +SRC = matrix.c i2c.c # programming options PROGRAM_CMD = ./keyboards/ps2avrGB/program $(TARGET).hex |