Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds Planck Rev 7 & Updates rev6_drop to Matrix Lite Implementation #21175

Merged
merged 3 commits into from
Jun 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion keyboards/planck/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Planck
A compact 40% (12x4) ortholinear keyboard kit made and sold by OLKB and Massdrop. [More info on qmk.fm](http://qmk.fm/planck/)

Keyboard Maintainer: [Jack Humbert](https://github.com/jackhumbert)
Hardware Supported: Planck PCB rev1, rev2, rev3, rev4, rev5, rev6; Planck Light, Planck EZ
Hardware Supported: Planck PCB rev1, rev2, rev3, rev4, rev5, rev6, rev7; Planck Light, Planck EZ
Hardware Availability: [OLKB.com](https://olkb.com), [Massdrop](https://www.massdrop.com/buy/planck-mechanical-keyboard?mode=guest_open), [Ergodox (Planck EZ)](https://ergodox-ez.com/pages/planck)

Make example for this keyboard (after setting up your build environment):
Expand Down
159 changes: 31 additions & 128 deletions keyboards/planck/rev6_drop/matrix.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2018 Jack Humbert <jack.humb@gmail.com>
* Copyright 2018-2023 Jack Humbert <jack.humb@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
Expand All @@ -17,155 +17,58 @@

#include "quantum.h"

#ifndef DEBOUNCE
# define DEBOUNCE 5
#endif

/*
* col: { B11, B10, B2, B1, A7, B0 }
* row: { A10, A9, A8, B15, C13, C14, C15, A2 }
*/
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_COLS];
static bool debouncing = false;
static uint16_t debouncing_time = 0;

__attribute__((weak)) void matrix_init_user(void) {}
static pin_t matrix_row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
static pin_t matrix_col_pins[MATRIX_COLS] = MATRIX_COL_PINS;

__attribute__((weak)) void matrix_scan_user(void) {}
static matrix_row_t matrix_inverted[MATRIX_COLS];

__attribute__((weak)) void matrix_init_kb(void) {
matrix_init_user();
}
void matrix_init_custom(void) {
// actual matrix setup - cols
for (int i = 0; i < MATRIX_COLS; i++) {
setPinOutput(matrix_col_pins[i]);
}

__attribute__((weak)) void matrix_scan_kb(void) {
matrix_scan_user();
// rows
for (int i = 0; i < MATRIX_ROWS; i++) {
setPinInputLow(matrix_row_pins[i]);
}
}

void matrix_init(void) {
dprintf("matrix init\n");
// debug_matrix = true;
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
bool changed = false;

// actual matrix setup
palSetPadMode(GPIOB, 11, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 1, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOA, 7, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL);

palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, 9, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, 8, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOB, 15, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOC, 13, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOC, 14, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOC, 15, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_PULLDOWN);

memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t));
memset(matrix_debouncing, 0, MATRIX_COLS * sizeof(matrix_row_t));

matrix_init_kb();
}

uint8_t matrix_scan(void) {
// actual matrix
for (int col = 0; col < MATRIX_COLS; col++) {
matrix_row_t data = 0;

// strobe col { B11, B10, B2, B1, A7, B0 }
switch (col) {
case 0:
palSetPad(GPIOB, 11);
break;
case 1:
palSetPad(GPIOB, 10);
break;
case 2:
palSetPad(GPIOB, 2);
break;
case 3:
palSetPad(GPIOB, 1);
break;
case 4:
palSetPad(GPIOA, 7);
break;
case 5:
palSetPad(GPIOB, 0);
break;
}
// strobe col
writePinHigh(matrix_col_pins[col]);

// need wait to settle pin state
wait_us(20);

// read row data { A10, A9, A8, B15, C13, C14, C15, A2 }
data = ((palReadPad(GPIOA, 10) << 0) | (palReadPad(GPIOA, 9) << 1) | (palReadPad(GPIOA, 8) << 2) | (palReadPad(GPIOB, 15) << 3) | (palReadPad(GPIOC, 13) << 4) | (palReadPad(GPIOC, 14) << 5) | (palReadPad(GPIOC, 15) << 6) | (palReadPad(GPIOA, 2) << 7));

// unstrobe col { B11, B10, B2, B1, A7, B0 }
switch (col) {
case 0:
palClearPad(GPIOB, 11);
break;
case 1:
palClearPad(GPIOB, 10);
break;
case 2:
palClearPad(GPIOB, 2);
break;
case 3:
palClearPad(GPIOB, 1);
break;
case 4:
palClearPad(GPIOA, 7);
break;
case 5:
palClearPad(GPIOB, 0);
break;
// read row data
for (int row = 0; row < MATRIX_ROWS; row++) {
data |= (readPin(matrix_row_pins[row]) << row);
}

if (matrix_debouncing[col] != data) {
matrix_debouncing[col] = data;
debouncing = true;
debouncing_time = timer_read();
}
}
// unstrobe col
writePinLow(matrix_col_pins[col]);

if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
for (int row = 0; row < MATRIX_ROWS; row++) {
matrix[row] = 0;
for (int col = 0; col < MATRIX_COLS; col++) {
matrix[row] |= ((matrix_debouncing[col] & (1 << row) ? 1 : 0) << col);
}
if (matrix_inverted[col] != data) {
matrix_inverted[col] = data;
}
debouncing = false;
}

matrix_scan_kb();

return 1;
}

bool matrix_is_on(uint8_t row, uint8_t col) {
return (matrix[row] & (1 << col));
}

matrix_row_t matrix_get_row(uint8_t row) {
return matrix[row];
}

void matrix_print(void) {
dprintf("\nr/c 01234567\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
dprintf("%X0: ", row);
matrix_row_t data = matrix_get_row(row);
for (int row = 0; row < MATRIX_ROWS; row++) {
matrix_row_t old = current_matrix[row];
current_matrix[row] = 0;
for (int col = 0; col < MATRIX_COLS; col++) {
if (data & (1 << col))
dprintf("1");
else
dprintf("0");
current_matrix[row] |= ((matrix_inverted[col] & (1 << row) ? 1 : 0) << col);
}
dprintf("\n");
changed |= old != current_matrix[row];
}

return changed;
}
2 changes: 1 addition & 1 deletion keyboards/planck/rev6_drop/rules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ NKRO_ENABLE = yes # Enable N-Key Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
AUDIO_ENABLE = yes # Audio output
CUSTOM_MATRIX = yes
CUSTOM_MATRIX = lite
# Do not enable RGB_MATRIX_ENABLE together with RGBLIGHT_ENABLE
RGB_MATRIX_ENABLE = no
ENCODER_ENABLE = yes
Expand Down
29 changes: 29 additions & 0 deletions keyboards/planck/rev7/chconf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/* Copyright 2020 QMK
*
* 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/>.
*/

/*
* This file was auto-generated by:
* `qmk chibios-confmigrate -i keyboards/planck/rev6/chconf.h -r platforms/chibios/QMK_PROTON_C/configs/chconf.h`
*/

#pragma once

#define CH_CFG_ST_RESOLUTION 16

#define CH_CFG_ST_FREQUENCY 10000

#include_next <chconf.h>

53 changes: 53 additions & 0 deletions keyboards/planck/rev7/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright 2023 Jack Humbert <jack.humb@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/>.
*/

#pragma once

#define DIP_SWITCH_PINS \
{ B14, A15, A0, B9 }

#define MUSIC_MAP
#undef AUDIO_VOICES
#undef AUDIO_PIN
#define AUDIO_PIN A5
#define AUDIO_PIN_ALT A4
#define AUDIO_PIN_ALT_AS_NEGATIVE

#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
#define WS2812_DMA_CHANNEL 2

#define RGB_DISABLE_WHEN_USB_SUSPENDED

/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/

/* disable debug print */
//#define NO_DEBUG

/* disable print */
//#define NO_PRINT

/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT

24 changes: 24 additions & 0 deletions keyboards/planck/rev7/halconf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/* Copyright 2020 QMK
*
* 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 3 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 <https://www.gnu.org/licenses/>.
*/
#pragma once

#define HAL_USE_PWM TRUE
#define HAL_USE_GPT TRUE
jackhumbert marked this conversation as resolved.
Show resolved Hide resolved
#define HAL_USE_DAC TRUE
#define HAL_USE_I2C TRUE
#define HAL_USE_WDG TRUE

#include_next <halconf.h>
Loading