aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/jj40/backlight.c213
-rw-r--r--keyboards/jj40/backlight_custom.h15
-rw-r--r--keyboards/jj40/breathing_custom.h140
-rw-r--r--keyboards/jj40/config.h40
-rw-r--r--keyboards/jj40/i2c.c104
-rw-r--r--keyboards/jj40/i2c.h25
-rw-r--r--keyboards/jj40/jj40.c61
-rw-r--r--keyboards/jj40/jj40.h86
-rw-r--r--keyboards/jj40/keymaps/default/keymap.c59
-rw-r--r--keyboards/jj40/matrix.c112
-rw-r--r--keyboards/jj40/rules.mk44
-rw-r--r--quantum/quantum.c7
12 files changed, 143 insertions, 763 deletions
diff --git a/keyboards/jj40/backlight.c b/keyboards/jj40/backlight.c
deleted file mode 100644
index fbd241fa9..000000000
--- a/keyboards/jj40/backlight.c
+++ /dev/null
@@ -1,213 +0,0 @@
1/**
2 * Backlighting code for PS2AVRGB boards (ATMEGA32A)
3 * Kenneth A. (github.com/krusli | krusli.me)
4 */
5
6#include "backlight.h"
7#include "quantum.h"
8
9#include <avr/pgmspace.h>
10#include <avr/interrupt.h>
11
12#include "backlight_custom.h"
13#include "breathing_custom.h"
14
15// DEBUG
16#include <stdlib.h>
17#include <stdio.h>
18
19// Port D: digital pins of the AVR chipset
20#define NUMLOCK_PORT (1 << 0) // D0
21#define CAPSLOCK_PORT (1 << 1) // D1
22#define BACKLIGHT_PORT (1 << 4) // D4
23#define SCROLLLOCK_PORT (1 << 6) // D6
24
25#define TIMER_CLK_DIV64 0x03 ///< Timer clocked at F_CPU/64
26#define TIMER1PRESCALE TIMER_CLK_DIV64 ///< timer 1 prescaler default
27
28#define TIMER_PRESCALE_MASK 0x07 ///< Timer Prescaler Bit-Mask
29
30#define PWM_MAX 0xFF
31#define TIMER_TOP 255 // 8 bit PWM
32
33extern backlight_config_t backlight_config;
34
35/**
36 * References
37 * Port Registers: https://www.arduino.cc/en/Reference/PortManipulation
38 * TCCR1A: https://electronics.stackexchange.com/questions/92350/what-is-the-difference-between-tccr1a-and-tccr1b
39 * Timers: http://www.avrbeginners.net/architecture/timers/timers.html
40 * 16-bit timer setup: http://sculland.com/ATmega168/Interrupts-And-Timers/16-Bit-Timer-Setup/
41 * PS2AVRGB firmware: https://github.com/showjean/ps2avrU/tree/master/firmware
42 */
43
44// @Override
45// turn LEDs on and off depending on USB caps/num/scroll lock states.
46__attribute__ ((weak))
47void led_set_user(uint8_t usb_led) {
48 if (usb_led & (1 << USB_LED_NUM_LOCK)) {
49 // turn on
50 DDRD |= NUMLOCK_PORT;
51 PORTD |= NUMLOCK_PORT;
52 } else {
53 // turn off
54 DDRD &= ~NUMLOCK_PORT;
55 PORTD &= ~NUMLOCK_PORT;
56 }
57
58 if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
59 DDRD |= CAPSLOCK_PORT;
60 PORTD |= CAPSLOCK_PORT;
61 } else {
62 DDRD &= ~CAPSLOCK_PORT;
63 PORTD &= ~CAPSLOCK_PORT;
64 }
65
66 if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
67 DDRD |= SCROLLLOCK_PORT;
68 PORTD |= SCROLLLOCK_PORT;
69 } else {
70 DDRD &= ~SCROLLLOCK_PORT;
71 PORTD &= ~SCROLLLOCK_PORT;
72 }
73}
74
75#ifdef BACKLIGHT_ENABLE
76
77// sets up Timer 1 for 8-bit PWM
78void timer1PWMSetup(void) { // NOTE ONLY CALL THIS ONCE
79 // default 8 bit mode
80 TCCR1A &= ~(1 << 1); // cbi(TCCR1A,PWM11); <- set PWM11 bit to HIGH
81 TCCR1A |= (1 << 0); // sbi(TCCR1A,PWM10); <- set PWM10 bit to LOW
82
83 // clear output compare value A
84 // outb(OCR1AH, 0);
85 // outb(OCR1AL, 0);
86
87 // clear output comparator registers for B
88 OCR1BH = 0; // outb(OCR1BH, 0);
89 OCR1BL = 0; // outb(OCR1BL, 0);
90}
91
92bool is_init = false;
93void timer1Init(void) {
94 // timer1SetPrescaler(TIMER1PRESCALE)
95 // set to DIV/64
96 (TCCR1B) = ((TCCR1B) & ~TIMER_PRESCALE_MASK) | TIMER1PRESCALE;
97
98 // reset TCNT1
99 TCNT1H = 0; // outb(TCNT1H, 0);
100 TCNT1L = 0; // outb(TCNT1L, 0);
101
102 // TOIE1: Timer Overflow Interrupt Enable (Timer 1);
103 TIMSK |= _BV(TOIE1); // sbi(TIMSK, TOIE1);
104
105 is_init = true;
106}
107
108void timer1UnInit(void) {
109 // set prescaler back to NONE
110 (TCCR1B) = ((TCCR1B) & ~TIMER_PRESCALE_MASK) | 0x00; // TIMERRTC_CLK_STOP
111
112 // disable timer overflow interrupt
113 TIMSK &= ~_BV(TOIE1); // overflow bit?
114
115 setPWM(0);
116
117 is_init = false;
118}
119
120
121// handle TCNT1 overflow
122//! Interrupt handler for tcnt1 overflow interrupt
123ISR(TIMER1_OVF_vect, ISR_NOBLOCK)
124{
125 // sei();
126 // handle breathing here
127 #ifdef BACKLIGHT_BREATHING
128 if (is_breathing()) {
129 custom_breathing_handler();
130 }
131 #endif
132
133 // TODO call user defined function
134}
135
136// enable timer 1 PWM
137// timer1PWMBOn()
138void timer1PWMBEnable(void) {
139 // turn on channel B (OC1B) PWM output
140 // set OC1B as non-inverted PWM
141 TCCR1A |= _BV(COM1B1);
142 TCCR1A &= ~_BV(COM1B0);
143}
144
145// disable timer 1 PWM
146// timer1PWMBOff()
147void timer1PWMBDisable(void) {
148 TCCR1A &= ~_BV(COM1B1);
149 TCCR1A &= ~_BV(COM1B0);
150}
151
152void enableBacklight(void) {
153 DDRD |= BACKLIGHT_PORT; // set digital pin 4 as output
154 PORTD |= BACKLIGHT_PORT; // set digital pin 4 to high
155}
156
157void disableBacklight(void) {
158 // DDRD &= ~BACKLIGHT_PORT; // set digital pin 4 as input
159 PORTD &= ~BACKLIGHT_PORT; // set digital pin 4 to low
160}
161
162void startPWM(void) {
163 timer1Init();
164 timer1PWMBEnable();
165 enableBacklight();
166}
167
168void stopPWM(void) {
169 timer1UnInit();
170 disableBacklight();
171 timer1PWMBDisable();
172}
173
174void b_led_init_ports(void) {
175 /* turn backlight on/off depending on user preference */
176 #if BACKLIGHT_ON_STATE == 0
177 // DDRx register: sets the direction of Port D
178 // DDRD &= ~BACKLIGHT_PORT; // set digital pin 4 as input
179 PORTD &= ~BACKLIGHT_PORT; // set digital pin 4 to low
180 #else
181 DDRD |= BACKLIGHT_PORT; // set digital pin 4 as output
182 PORTD |= BACKLIGHT_PORT; // set digital pin 4 to high
183 #endif
184
185 timer1PWMSetup();
186 startPWM();
187
188 #ifdef BACKLIGHT_BREATHING
189 breathing_enable();
190 #endif
191}
192
193void b_led_set(uint8_t level) {
194 if (level > BACKLIGHT_LEVELS) {
195 level = BACKLIGHT_LEVELS;
196 }
197
198 setPWM((int)(TIMER_TOP * (float) level / BACKLIGHT_LEVELS));
199}
200
201// called every matrix scan
202void b_led_task(void) {
203 // do nothing for now
204}
205
206void setPWM(uint16_t xValue) {
207 if (xValue > TIMER_TOP) {
208 xValue = TIMER_TOP;
209 }
210 OCR1B = xValue; // timer1PWMBSet(xValue);
211}
212
213#endif // BACKLIGHT_ENABLE
diff --git a/keyboards/jj40/backlight_custom.h b/keyboards/jj40/backlight_custom.h
deleted file mode 100644
index 7210be840..000000000
--- a/keyboards/jj40/backlight_custom.h
+++ /dev/null
@@ -1,15 +0,0 @@
1/**
2 * Backlighting code for PS2AVRGB boards (ATMEGA32A)
3 * Kenneth A. (github.com/krusli | krusli.me)
4 */
5
6#ifndef BACKLIGHT_CUSTOM_H
7#define BACKLIGHT_CUSTOM_H
8
9#include <avr/pgmspace.h>
10void b_led_init_ports(void);
11void b_led_set(uint8_t level);
12void b_led_task(void);
13void setPWM(uint16_t xValue);
14
15#endif // BACKLIGHT_CUSTOM_H
diff --git a/keyboards/jj40/breathing_custom.h b/keyboards/jj40/breathing_custom.h
deleted file mode 100644
index 71416b1b4..000000000
--- a/keyboards/jj40/breathing_custom.h
+++ /dev/null
@@ -1,140 +0,0 @@
1/**
2 * Breathing effect code for PS2AVRGB boards (ATMEGA32A)
3 * Works in conjunction with `backlight.c`.
4 *
5 * Code adapted from `quantum.c` to register with the existing TIMER1 overflow
6 * handler in `backlight.c` instead of setting up its own timer.
7 * Kenneth A. (github.com/krusli | krusli.me)
8 */
9
10#ifdef BACKLIGHT_ENABLE
11#ifdef BACKLIGHT_BREATHING
12
13#include "backlight_custom.h"
14
15#ifndef BREATHING_PERIOD
16#define BREATHING_PERIOD 6
17#endif
18
19#define breathing_min() do {breathing_counter = 0;} while (0)
20#define breathing_max() do {breathing_counter = breathing_period * 244 / 2;} while (0)
21
22// TODO make this share code with quantum.c
23
24#define BREATHING_NO_HALT 0
25#define BREATHING_HALT_OFF 1
26#define BREATHING_HALT_ON 2
27#define BREATHING_STEPS 128
28
29static uint8_t breathing_period = BREATHING_PERIOD;
30static uint8_t breathing_halt = BREATHING_NO_HALT;
31static uint16_t breathing_counter = 0;
32
33static bool breathing = false;
34
35bool is_breathing(void) {
36 return breathing;
37}
38
39// See http://jared.geek.nz/2013/feb/linear-led-pwm
40static uint16_t cie_lightness(uint16_t v) {
41 if (v <= 5243) // if below 8% of max
42 return v / 9; // same as dividing by 900%
43 else {
44 uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare
45 // to get a useful result with integer division, we shift left in the expression above
46 // and revert what we've done again after squaring.
47 y = y * y * y >> 8;
48 if (y > 0xFFFFUL) // prevent overflow
49 return 0xFFFFU;
50 else
51 return (uint16_t) y;
52 }
53}
54
55void breathing_enable(void) {
56 breathing = true;
57 breathing_counter = 0;
58 breathing_halt = BREATHING_NO_HALT;
59 // interrupt already registered
60}
61
62void breathing_pulse(void) {
63 if (get_backlight_level() == 0)
64 breathing_min();
65 else
66 breathing_max();
67 breathing_halt = BREATHING_HALT_ON;
68 // breathing_interrupt_enable();
69 breathing = true;
70}
71
72void breathing_disable(void) {
73 breathing = false;
74 // backlight_set(get_backlight_level());
75 b_led_set(get_backlight_level()); // custom implementation of backlight_set()
76}
77
78void breathing_self_disable(void)
79{
80 if (get_backlight_level() == 0)
81 breathing_halt = BREATHING_HALT_OFF;
82 else
83 breathing_halt = BREATHING_HALT_ON;
84}
85
86void breathing_toggle(void) {
87 if (is_breathing())
88 breathing_disable();
89 else
90 breathing_enable();
91}
92
93void breathing_period_set(uint8_t value)
94{
95 if (!value)
96 value = 1;
97 breathing_period = value;
98}
99
100void breathing_period_default(void) {
101 breathing_period_set(BREATHING_PERIOD);
102}
103
104void breathing_period_inc(void)
105{
106 breathing_period_set(breathing_period+1);
107}
108
109void breathing_period_dec(void)
110{
111 breathing_period_set(breathing_period-1);
112}
113
114/* To generate breathing curve in python:
115 * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)]
116 */
117static const uint8_t breathing_table[BREATHING_STEPS] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 17, 20, 24, 28, 32, 36, 41, 46, 51, 57, 63, 70, 76, 83, 91, 98, 106, 113, 121, 129, 138, 146, 154, 162, 170, 178, 185, 193, 200, 207, 213, 220, 225, 231, 235, 240, 244, 247, 250, 252, 253, 254, 255, 254, 253, 252, 250, 247, 244, 240, 235, 231, 225, 220, 213, 207, 200, 193, 185, 178, 170, 162, 154, 146, 138, 129, 121, 113, 106, 98, 91, 83, 76, 70, 63, 57, 51, 46, 41, 36, 32, 28, 24, 20, 17, 15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
118
119// Use this before the cie_lightness function.
120static inline uint16_t scale_backlight(uint16_t v) {
121 return v / BACKLIGHT_LEVELS * get_backlight_level();
122}
123
124void custom_breathing_handler(void) {
125 uint16_t interval = (uint16_t) breathing_period * 244 / BREATHING_STEPS;
126 // resetting after one period to prevent ugly reset at overflow.
127 breathing_counter = (breathing_counter + 1) % (breathing_period * 244);
128 uint8_t index = breathing_counter / interval % BREATHING_STEPS;
129
130 if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) ||
131 ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1)))
132 {
133 // breathing_interrupt_disable();
134 }
135
136 setPWM(cie_lightness(scale_backlight((uint16_t) pgm_read_byte(&breathing_table[index]) * 0x0101U)));
137}
138
139#endif // BACKLIGHT_BREATHING
140#endif // BACKLIGHT_ENABLE
diff --git a/keyboards/jj40/config.h b/keyboards/jj40/config.h
index 67561b0b2..e88147ac8 100644
--- a/keyboards/jj40/config.h
+++ b/keyboards/jj40/config.h
@@ -1,51 +1,55 @@
1/* 1/*
2Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com> 2Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
3
4This program is free software: you can redistribute it and/or modify 3This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by 4it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or 5the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version. 6(at your option) any later version.
8
9This program is distributed in the hope that it will be useful, 7This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of 8but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details. 10GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License 11You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>. 12along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/ 13*/
17 14
18#include "config_common.h" 15#pragma once
19 16
20#ifndef CONFIG_H 17#include "config_common.h"
21#define CONFIG_H
22 18
23#define VENDOR_ID 0x20A0 19#define VENDOR_ID 0x20A0
24#define PRODUCT_ID 0x422D 20#define PRODUCT_ID 0x422D
25// TODO: share these strings with usbconfig.h 21// TODO: share these strings with usbconfig.h
26// Edit usbconfig.h to change these. 22// Edit usbconfig.h to change these.
27#define MANUFACTURER winkeyless.kr 23#define MANUFACTURER Kprepublic
28#define PRODUCT jj40 24#define PRODUCT jj40
29 25
30/* matrix size */ 26/* matrix size */
31#define MATRIX_ROWS 8 27#define MATRIX_ROWS 4
32#define MATRIX_COLS 15 28#define MATRIX_COLS 12
29#define MATRIX_ROW_PINS { B0, B1, B3, B4 }
30#define MATRIX_COL_PINS { C4, C5, C6, C7, A4, A5, A6, A7, A3, A2, A1, A0 }
33 31
34/* COL2ROW or ROW2COL */ 32/* COL2ROW or ROW2COL */
35#define DIODE_DIRECTION COL2ROW 33#define DIODE_DIRECTION COL2ROW
36 34
35#define BACKLIGHT_PIN D4
37#define BACKLIGHT_LEVELS 12 36#define BACKLIGHT_LEVELS 12
38// #define BACKLIGHT_BREATHING // works, but BL_TOGG might not work 37// #define BACKLIGHT_BREATHING // Requires #4324 to enable hardware pwm for atmega32a
39
40#define TAPPING_TOGGLE 3
41
42#define NO_UART 1
43 38
44/* RGB underglow */ 39/* RGB underglow */
45// The RGB_DI_PIN value seems to be shared between all PS2AVRGB boards. 40// NOTE: for PS2AVRGB boards, underglow commands are sent via I2C to 0xB0.
46// The same pin is used on the JJ40, at least.
47#define RGBLED_NUM 5 41#define RGBLED_NUM 5
48#define RGB_DI_PIN E2 // NOTE: for PS2AVRGB boards, underglow commands are sent via I2C to 0xB0.
49#define RGBLIGHT_ANIMATIONS 42#define RGBLIGHT_ANIMATIONS
50 43
51#endif 44/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
45#define DEBOUNCING_DELAY 5
46
47#define NO_UART 1
48
49/* key combination for magic key command */
50/* defined by default; to change, uncomment and set to the combination you want */
51// #define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
52
53/* Bootmagic Lite key configuration */
54// #define BOOTMAGIC_LITE_ROW 0
55// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/jj40/i2c.c b/keyboards/jj40/i2c.c
deleted file mode 100644
index c27f3e3d1..000000000
--- a/keyboards/jj40/i2c.c
+++ /dev/null
@@ -1,104 +0,0 @@
1/*
2Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#include <avr/io.h>
19#include <util/twi.h>
20
21#include "i2c.h"
22
23void i2c_set_bitrate(uint16_t bitrate_khz) {
24 uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz);
25 if (bitrate_div >= 16) {
26 bitrate_div = (bitrate_div - 16) / 2;
27 }
28 TWBR = bitrate_div;
29}
30
31void i2c_init(void) {
32 // set pull-up resistors on I2C bus pins
33 PORTC |= 0b11;
34
35 i2c_set_bitrate(400);
36
37 // enable TWI (two-wire interface)
38 TWCR |= (1 << TWEN);
39
40 // enable TWI interrupt and slave address ACK
41 TWCR |= (1 << TWIE);
42 TWCR |= (1 << TWEA);
43}
44
45uint8_t i2c_start(uint8_t address) {
46 // reset TWI control register
47 TWCR = 0;
48
49 // begin transmission and wait for it to end
50 TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
51 while (!(TWCR & (1<<TWINT)));
52
53 // check if the start condition was successfully transmitted
54 if ((TWSR & 0xF8) != TW_START) {
55 return 1;
56 }
57
58 // transmit address and wait
59 TWDR = address;
60 TWCR = (1<<TWINT) | (1<<TWEN);
61 while (!(TWCR & (1<<TWINT)));
62
63 // check if the device has acknowledged the READ / WRITE mode
64 uint8_t twst = TW_STATUS & 0xF8;
65 if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
66 return 1;
67 }
68
69 return 0;
70}
71
72void i2c_stop(void) {
73 TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
74}
75
76uint8_t i2c_write(uint8_t data) {
77 TWDR = data;
78
79 // transmit data and wait
80 TWCR = (1<<TWINT) | (1<<TWEN);
81 while (!(TWCR & (1<<TWINT)));
82
83 if ((TWSR & 0xF8) != TW_MT_DATA_ACK) {
84 return 1;
85 }
86
87 return 0;
88}
89
90uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) {
91 if (i2c_start(address)) {
92 return 1;
93 }
94
95 for (uint16_t i = 0; i < length; i++) {
96 if (i2c_write(data[i])) {
97 return 1;
98 }
99 }
100
101 i2c_stop();
102
103 return 0;
104}
diff --git a/keyboards/jj40/i2c.h b/keyboards/jj40/i2c.h
deleted file mode 100644
index 27c9d3d05..000000000
--- a/keyboards/jj40/i2c.h
+++ /dev/null
@@ -1,25 +0,0 @@
1/*
2Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#ifndef __I2C_H__
19#define __I2C_H__
20
21void i2c_init(void);
22void i2c_set_bitrate(uint16_t bitrate_khz);
23uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
24
25#endif
diff --git a/keyboards/jj40/jj40.c b/keyboards/jj40/jj40.c
index 51f5295f4..26cfa6c06 100644
--- a/keyboards/jj40/jj40.c
+++ b/keyboards/jj40/jj40.c
@@ -18,53 +18,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
18 18
19#include "jj40.h" 19#include "jj40.h"
20 20
21#include <avr/pgmspace.h> 21#ifdef RGBLIGHT_ENABLE
22
23#include "action_layer.h"
24#include "quantum.h"
25 22
26#include "i2c.h" 23#include <string.h>
24#include "i2c_master.h"
25#include "rgblight.h"
27 26
28#include "backlight.h" 27extern rgblight_config_t rgblight_config;
29#include "backlight_custom.h"
30 28
31// for keyboard subdirectory level init functions
32// @Override
33void matrix_init_kb(void) { 29void matrix_init_kb(void) {
30 i2c_init();
34 // call user level keymaps, if any 31 // call user level keymaps, if any
35 matrix_init_user(); 32 matrix_init_user();
36} 33}
37
38#ifdef BACKLIGHT_ENABLE
39/// Overrides functions in `quantum.c`
40void backlight_init_ports(void) {
41 b_led_init_ports();
42}
43
44void backlight_task(void) {
45 b_led_task();
46}
47
48void backlight_set(uint8_t level) {
49 b_led_set(level);
50}
51#endif
52
53#ifdef RGBLIGHT_ENABLE
54extern rgblight_config_t rgblight_config;
55
56// custom RGB driver 34// custom RGB driver
57void rgblight_set(void) { 35void rgblight_set(void) {
58 if (!rgblight_config.enable) { 36 if (!rgblight_config.enable) {
59 for (uint8_t i=0; i<RGBLED_NUM; i++) { 37 memset(led, 0, 3 * RGBLED_NUM);
60 led[i].r = 0;
61 led[i].g = 0;
62 led[i].b = 0;
63 }
64 } 38 }
65 39
66 i2c_init(); 40 i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
67 i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
68} 41}
69 42
70bool rgb_init = false; 43bool rgb_init = false;
@@ -72,26 +45,12 @@ bool rgb_init = false;
72void matrix_scan_kb(void) { 45void matrix_scan_kb(void) {
73 // if LEDs were previously on before poweroff, turn them back on 46 // if LEDs were previously on before poweroff, turn them back on
74 if (rgb_init == false && rgblight_config.enable) { 47 if (rgb_init == false && rgblight_config.enable) {
75 i2c_init(); 48 i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
76 i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
77 rgb_init = true; 49 rgb_init = true;
78 } 50 }
79 51
80 rgblight_task(); 52 rgblight_task();
81#else
82void matrix_scan_kb(void) {
83#endif
84 matrix_scan_user(); 53 matrix_scan_user();
85 /* Nothing else for now. */
86}
87
88__attribute__((weak)) // overridable
89void matrix_init_user(void) {
90
91} 54}
92 55
93 56#endif
94__attribute__((weak)) // overridable
95void matrix_scan_user(void) {
96
97}
diff --git a/keyboards/jj40/jj40.h b/keyboards/jj40/jj40.h
index 731f2ff45..fce68eda5 100644
--- a/keyboards/jj40/jj40.h
+++ b/keyboards/jj40/jj40.h
@@ -15,80 +15,68 @@ You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>. 15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/ 16*/
17 17
18#ifndef KEYMAP_COMMON_H 18#pragma once
19#define KEYMAP_COMMON_H
20 19
21#include "quantum.h" 20#include "quantum.h"
22#include "quantum_keycodes.h"
23#include "keycode.h"
24#include "action.h"
25
26void matrix_init_user(void); // TODO port this to other PS2AVRGB boards
27
28#define XXX KC_NO
29 21
22#define ___ KC_NO
30 23
31#define LAYOUT_ortho_4x12( \ 24#define LAYOUT_ortho_4x12( \
32 K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ 25 K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
33 K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ 26 K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
34 K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ 27 K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
35 K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312 \ 28 K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B \
36) \ 29) \
37{ \ 30{ \
38 { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ 31 { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
39 { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ 32 { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \
40 { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ 33 { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
41 { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ 34 { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B } \
42 { K312, K311, K310, K39, K35, K36, K37, K38, K34, K33, K32, K31 } \
43} 35}
44 36
45 37
46#define LAYOUT_planck_mit( \ 38#define LAYOUT_planck_mit( \
47 K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ 39 K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
48 K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ 40 K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
49 K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ 41 K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
50 K31, K32, K33, K34, K35, K3X, K38, K39, K310, K311, K312 \ 42 K30, K31, K32, K33, K34, K3X, K37, K38, K39, K3A, K3B \
51) \ 43) \
52{ \ 44{ \
53 { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ 45 { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
54 { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ 46 { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \
55 { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ 47 { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
56 { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ 48 { K30, K31, K32, K33, K34, K3X, ___, K37, K38, K39, K3A, K3B } \
57 { K312, K311, K310, K39, K35, K3X, XXX, K38, K34, K33, K32, K31 } \
58} 49}
59 50
60 51
61#define LAYOUT_planck_1x2uR( \ 52#define LAYOUT_planck_1x2uR( \
62 K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ 53 K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
63 K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ 54 K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
64 K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ 55 K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
65 K31, K32, K33, K34, K35, K36, K3X, K39, K310, K311, K312 \ 56 K30, K31, K32, K33, K34, K35, K3X, K38, K39, K3A, K3B \
66) \ 57) \
67{ \ 58{ \
68 { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ 59 { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
69 { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ 60 { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \
70 { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ 61 { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
71 { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ 62 { K30, K31, K32, K33, K34, K35, K3X, ___, K38, K39, K3A, K3B } \
72 { K312, K311, K310, K39, K35, K36, K3X, XXX, K34, K33, K32, K31 } \
73} 63}
74 64
75 65
76#define LAYOUT_kc( \ 66#define LAYOUT_kc( \
77 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ 67 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
78 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ 68 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
79 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ 69 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
80 k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \ 70 k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \
81 ) \ 71) \
82 LAYOUT_ortho_4x12( \ 72LAYOUT_ortho_4x12( \
83 KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b, \ 73 KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b, \
84 KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b, \ 74 KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b, \
85 KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b, \ 75 KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b, \
86 KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b \ 76 KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b \
87) 77)
88 78
89 79
90#define LAYOUT LAYOUT_planck_mit 80#define LAYOUT LAYOUT_planck_mit
91
92#define LAYOUT_kc_ortho_4x12 LAYOUT_kc 81#define LAYOUT_kc_ortho_4x12 LAYOUT_kc
93 82#define KC_LAYOUT_ortho_4x12 LAYOUT_kc
94#endif
diff --git a/keyboards/jj40/keymaps/default/keymap.c b/keyboards/jj40/keymaps/default/keymap.c
index d84b01b15..47c6bada6 100644
--- a/keyboards/jj40/keymaps/default/keymap.c
+++ b/keyboards/jj40/keymaps/default/keymap.c
@@ -1,16 +1,30 @@
1/* Copyright 2019
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
1#include QMK_KEYBOARD_H 16#include QMK_KEYBOARD_H
2 17
3 18enum layers {
4#define _QWERTY 0 19 _QWERTY = 0,
5#define _LOWER 1 20 _LOWER,
6#define _RAISE 2 21 _RAISE,
7 22 _ADJUST,
8enum custom_keycodes {
9 QWERTY = SAFE_RANGE,
10 LOWER,
11 RAISE,
12}; 23};
13 24
25#define LOWER MO(_LOWER)
26#define RAISE MO(_RAISE)
27
14const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 28const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
15/* Qwerty 29/* Qwerty
16 * ,-----------------------------------------------------------------------------------. 30 * ,-----------------------------------------------------------------------------------.
@@ -27,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
27 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ 41 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
28 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ 42 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
29 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ 43 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
30 _______, KC_LCTL, KC_LALT, KC_LGUI, MO(_LOWER), KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ 44 _______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
31), 45),
32 46
33/* Lower 47/* Lower
@@ -64,10 +78,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
64 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ 78 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
65 _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ 79 _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \
66 _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ 80 _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
81),
82
83/* Adjust (Lower + Raise)
84 * ,-----------------------------------------------------------------------------------.
85 * | | Reset| | | | | | | | | | Del |
86 * |------+------+------+------+------+-------------+------+------+------+------+------|
87 * | | | | | | | | | | | | |
88 * |------+------+------+------+------+------|------+------+------+------+------+------|
89 * | | | | | | | | | | | | |
90 * |------+------+------+------+------+------+------+------+------+------+------+------|
91 * | | | | | | | | | | | |
92 * `-----------------------------------------------------------------------------------'
93 */
94[_ADJUST] = LAYOUT_ortho_4x12( \
95 _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
96 _______, _______, BL_TOGG, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, \
97 _______, _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, \
98 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
67) 99)
68}; 100};
69 101
70// Loop 102uint32_t layer_state_set_user(uint32_t state) {
71void matrix_scan_user(void) { 103 return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
72 // Empty 104}
73};
diff --git a/keyboards/jj40/matrix.c b/keyboards/jj40/matrix.c
deleted file mode 100644
index 245813dfd..000000000
--- a/keyboards/jj40/matrix.c
+++ /dev/null
@@ -1,112 +0,0 @@
1/*
2Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#include <avr/io.h>
19#include <util/delay.h>
20
21#include "matrix.h"
22
23#ifndef DEBOUNCE
24# define DEBOUNCE 5
25#endif
26
27static uint8_t debouncing = DEBOUNCE;
28
29static matrix_row_t matrix[MATRIX_ROWS];
30static matrix_row_t matrix_debouncing[MATRIX_ROWS];
31
32void matrix_set_row_status(uint8_t row);
33uint8_t bit_reverse(uint8_t x);
34
35void matrix_init(void) {
36 // all outputs for rows high
37 DDRB = 0xFF;
38 PORTB = 0xFF;
39 // all inputs for columns
40 DDRA = 0x00;
41 DDRC &= ~(0x111111<<2);
42 DDRD &= ~(1<<PIND7);
43 // all columns are pulled-up
44 PORTA = 0xFF;
45 PORTC |= (0b111111<<2);
46 PORTD |= (1<<PIND7);
47
48 // initialize matrix state: all keys off
49 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
50 matrix[row] = 0x00;
51 matrix_debouncing[row] = 0x00;
52 }
53
54 matrix_init_quantum();
55}
56
57uint8_t matrix_scan(void) {
58 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
59 matrix_set_row_status(row);
60 _delay_us(5);
61
62 matrix_row_t cols = (
63 // cols 0..7, PORTA 0 -> 7
64 (~PINA) & 0xFF
65 ) | (
66 // cols 8..13, PORTC 7 -> 0
67 bit_reverse((~PINC) & 0xFF) << 8
68 ) | (
69 // col 14, PORTD 7
70 ((~PIND) & (1 << PIND7)) << 7
71 );
72
73 if (matrix_debouncing[row] != cols) {
74 matrix_debouncing[row] = cols;
75 debouncing = DEBOUNCE;
76 }
77 }
78
79 if (debouncing) {
80 if (--debouncing) {
81 _delay_ms(1);
82 } else {
83 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
84 matrix[i] = matrix_debouncing[i];
85 }
86 }
87 }
88
89 matrix_scan_quantum();
90
91 return 1;
92}
93
94// declarations
95void matrix_set_row_status(uint8_t row) {
96 DDRB = (1 << row);
97 PORTB = ~(1 << row);
98}
99
100uint8_t bit_reverse(uint8_t x) {
101 x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
102 x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
103 x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
104 return x;
105}
106
107inline matrix_row_t matrix_get_row(uint8_t row) {
108 return matrix[row];
109}
110
111void matrix_print(void) {
112}
diff --git a/keyboards/jj40/rules.mk b/keyboards/jj40/rules.mk
index 697e17a01..3e496f97e 100644
--- a/keyboards/jj40/rules.mk
+++ b/keyboards/jj40/rules.mk
@@ -30,29 +30,29 @@ F_CPU = 12000000
30# automatically (+60). See bootloader.mk for all options. 30# automatically (+60). See bootloader.mk for all options.
31BOOTLOADER = bootloadHID 31BOOTLOADER = bootloadHID
32 32
33# build options 33# Build Options
34BOOTMAGIC_ENABLE = no 34# change yes to no to disable
35MOUSEKEY_ENABLE = no 35#
36EXTRAKEY_ENABLE = yes 36BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
37CONSOLE_ENABLE = no 37MOUSEKEY_ENABLE = no # Mouse keys(+4700)
38COMMAND_ENABLE = yes 38EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
39 39CONSOLE_ENABLE = no # Console for debug(+400)
40BACKLIGHT_ENABLE = yes 40COMMAND_ENABLE = no # Commands for debug and configuration
41BACKLIGHT_CUSTOM_DRIVER = yes
42
43RGBLIGHT_ENABLE = yes
44RGBLIGHT_CUSTOM_DRIVER = yes
45
46KEY_LOCK_ENABLE = yes
47
48# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE 41# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
49SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend 42SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
50 43# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
51OPT_DEFS = -DDEBUG_LEVEL=0 44NKRO_ENABLE = no # USB Nkey Rollover
52 45BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
53# custom matrix setup 46RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
54CUSTOM_MATRIX = yes 47RGBLIGHT_CUSTOM_DRIVER = yes
55SRC = matrix.c i2c.c backlight.c 48MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
49UNICODE_ENABLE = no # Unicode
50BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
51AUDIO_ENABLE = no # Audio output on port C6
52FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
53HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
54
55SRC += i2c_master.c
56 56
57# programming options 57# programming options
58PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex 58PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex
diff --git a/quantum/quantum.c b/quantum/quantum.c
index a62368ded..a4ccccd00 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -1125,6 +1125,13 @@ static const uint8_t backlight_pin = BACKLIGHT_PIN;
1125# define COMxx1 COM1A1 1125# define COMxx1 COM1A1
1126# define OCRxx OCR3A 1126# define OCRxx OCR3A
1127# define ICRx ICR3 1127# define ICRx ICR3
1128#elif defined(__AVR_ATmega32A__) && BACKLIGHT_PIN == D4
1129# define TCCRxA TCCR1A
1130# define TCCRxB TCCR1B
1131# define COMxx1 COM1B1
1132# define OCRxx OCR1B
1133# define ICRx ICR1
1134# define TIMSK1 TIMSK
1128#else 1135#else
1129# define NO_HARDWARE_PWM 1136# define NO_HARDWARE_PWM
1130#endif 1137#endif