diff options
| author | Luiz Ribeiro <luizribeiro@gmail.com> | 2017-05-28 12:40:03 -0400 | 
|---|---|---|
| committer | Luiz Ribeiro <luizribeiro@gmail.com> | 2017-06-11 12:30:48 -0400 | 
| commit | 6037cede2ce66dd8ce4df82d6d9a347c1de3110a (patch) | |
| tree | 34538431c8d23c3b814e41b6e429653e85b89d5b | |
| parent | c22a400603bfafedefa04c430214965cd191663b (diff) | |
| download | firmware-6037cede2ce66dd8ce4df82d6d9a347c1de3110a.tar.gz firmware-6037cede2ce66dd8ce4df82d6d9a347c1de3110a.tar.bz2 firmware-6037cede2ce66dd8ce4df82d6d9a347c1de3110a.zip | |
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 | 
