[Keyboard] Add Big Knob board (#22292)
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>master
parent
c4a2bea0e6
commit
e2d6187339
|
@ -0,0 +1,97 @@
|
||||||
|
// Copyright 2023 jpe230 (@jpe230)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "qp.h"
|
||||||
|
#include "qp_comms.h"
|
||||||
|
#include "qp_st77xx_opcodes.h"
|
||||||
|
#include "gfx/logo.qgf.h"
|
||||||
|
|
||||||
|
painter_device_t lcd;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Init board:
|
||||||
|
// - Draw logo
|
||||||
|
|
||||||
|
void keyboard_post_init_kb(void) {
|
||||||
|
backlight_set(BACKLIGHT_DEFAULT_LEVEL);
|
||||||
|
|
||||||
|
wait_ms(LCD_WAIT_TIME);
|
||||||
|
|
||||||
|
// Initialise the LCD
|
||||||
|
lcd = qp_st7735_make_spi_device(LCD_HEIGHT, LCD_WIDTH, LCD_CS_PIN, LCD_DC_PIN, LCD_RST_PIN, LCD_SPI_DIVISOR, 0);
|
||||||
|
qp_init(lcd, LCD_ROTATION);
|
||||||
|
|
||||||
|
// Invert Colour
|
||||||
|
#ifdef LCD_INVERT_COLOUR
|
||||||
|
qp_comms_start(lcd);
|
||||||
|
qp_comms_command(lcd, ST77XX_CMD_INVERT_ON);
|
||||||
|
qp_comms_stop(lcd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Apply Offset
|
||||||
|
qp_set_viewport_offsets(lcd, LCD_OFFSET_X, LCD_OFFSET_Y);
|
||||||
|
|
||||||
|
// Turn on the LCD and clear the display
|
||||||
|
qp_power(lcd, true);
|
||||||
|
qp_rect(lcd, 0, 0, LCD_WIDTH, LCD_HEIGHT, HSV_BLACK, true);
|
||||||
|
|
||||||
|
// Show logo
|
||||||
|
painter_image_handle_t logo_image = qp_load_image_mem(gfx_logo);
|
||||||
|
qp_drawimage(lcd, 0, 0, logo_image);
|
||||||
|
|
||||||
|
keyboard_post_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Lights handling:
|
||||||
|
// - Turn off backlight (screen) after timeout or suspend
|
||||||
|
// - Turn off rgblight after timeout or suspend
|
||||||
|
|
||||||
|
bool lights_off = false;
|
||||||
|
|
||||||
|
__attribute__((weak)) void lights_wakeup_user(void) {};
|
||||||
|
__attribute__((weak)) void lights_suspend_user(void) {};
|
||||||
|
|
||||||
|
void backlight_wakeup(void) {
|
||||||
|
backlight_set(BACKLIGHT_DEFAULT_LEVEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void backlight_suspend(void) {
|
||||||
|
backlight_set(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lights_wakeup(void) {
|
||||||
|
lights_off = false;
|
||||||
|
rgblight_wakeup();
|
||||||
|
backlight_wakeup();
|
||||||
|
lights_wakeup_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lights_suspend(void) {
|
||||||
|
lights_off = true;
|
||||||
|
lights_suspend_user();
|
||||||
|
rgblight_suspend();
|
||||||
|
backlight_suspend();
|
||||||
|
}
|
||||||
|
|
||||||
|
void housekeeping_task_kb(void) {
|
||||||
|
if ( lights_off && last_input_activity_elapsed() <= LIGHTS_TIMEOUT)
|
||||||
|
{
|
||||||
|
lights_wakeup();
|
||||||
|
}
|
||||||
|
if (!lights_off && last_input_activity_elapsed() > LIGHTS_TIMEOUT) {
|
||||||
|
lights_suspend();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void suspend_power_down_kb(void) {
|
||||||
|
lights_suspend();
|
||||||
|
qp_power(lcd, false);
|
||||||
|
suspend_power_down_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void suspend_wakeup_init_kb(void) {
|
||||||
|
qp_power(lcd, true);
|
||||||
|
lights_wakeup();
|
||||||
|
suspend_wakeup_init_user();
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Copyright 2023 jpe230 (@jpe230)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// SPI pins
|
||||||
|
#define SPI_DRIVER SPID0
|
||||||
|
#define SPI_SCK_PIN GP22
|
||||||
|
#define SPI_MOSI_PIN GP23
|
||||||
|
#define SPI_MISO_PIN GP20 // Unused
|
||||||
|
|
||||||
|
// LCD Configuration
|
||||||
|
#define LCD_RST_PIN GP21
|
||||||
|
#define LCD_CS_PIN GP8
|
||||||
|
#define LCD_DC_PIN GP9
|
||||||
|
#define LCD_BLK_PIN GP7
|
||||||
|
#define LCD_SPI_DIVISOR 4
|
||||||
|
#define LCD_WAIT_TIME 150
|
||||||
|
#define LCD_WIDTH 160
|
||||||
|
#define LCD_HEIGHT 80
|
||||||
|
#define LCD_ROTATION QP_ROTATION_270
|
||||||
|
#define LCD_OFFSET_X 1
|
||||||
|
#define LCD_OFFSET_Y 26
|
||||||
|
#define LCD_INVERT_COLOUR
|
||||||
|
|
||||||
|
// QP Configuration
|
||||||
|
#define QUANTUM_PAINTER_SUPPORTS_NATIVE_COLORS TRUE
|
||||||
|
#define ST7735_NO_AUTOMATIC_VIEWPORT_OFFSETS
|
||||||
|
|
||||||
|
// Backlight configuration
|
||||||
|
#define BACKLIGHT_PWM_DRIVER PWMD3
|
||||||
|
#define BACKLIGHT_PWM_CHANNEL 2
|
||||||
|
#define BACKLIGHT_DEFAULT_LEVEL 6
|
||||||
|
|
||||||
|
// Timeout configuration
|
||||||
|
#define QUANTUM_PAINTER_DISPLAY_TIMEOUT 10000
|
||||||
|
#define LIGHTS_TIMEOUT QUANTUM_PAINTER_DISPLAY_TIMEOUT
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,11 @@
|
||||||
|
// Copyright 2023 jpe230 (@jpe230)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
// This file was auto-generated by `qmk painter-convert-graphics -i logo.png -f rgb565`
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <qp.h>
|
||||||
|
|
||||||
|
extern const uint32_t gfx_logo_length;
|
||||||
|
extern const uint8_t gfx_logo[24769];
|
|
@ -0,0 +1,12 @@
|
||||||
|
// Copyright 2023 jpe230 (@jpe230)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
|
|
||||||
|
#undef HAL_USE_SPI
|
||||||
|
#define HAL_USE_SPI TRUE
|
||||||
|
|
||||||
|
#undef HAL_USE_PWM
|
||||||
|
#define HAL_USE_PWM TRUE
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"manufacturer": "jpe230",
|
||||||
|
"keyboard_name": "big_knob",
|
||||||
|
"maintainer": "jpe230",
|
||||||
|
"bootloader": "rp2040",
|
||||||
|
"processor": "RP2040",
|
||||||
|
"url": "https://github.com/Jpe230/big_knob",
|
||||||
|
"usb": {
|
||||||
|
"device_version": "1.0.0",
|
||||||
|
"vid": "0xE230",
|
||||||
|
"pid": "0x1337"
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"rgblight": true,
|
||||||
|
"bootmagic": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"mousekey": true,
|
||||||
|
"encoder": true,
|
||||||
|
"backlight": true
|
||||||
|
},
|
||||||
|
"matrix_pins": {
|
||||||
|
"direct": [
|
||||||
|
["GP1"]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"encoder": {
|
||||||
|
"rotary": [
|
||||||
|
{"pin_a": "GP2", "pin_b": "GP3"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"backlight": {
|
||||||
|
"pin": "GP7",
|
||||||
|
"levels": 7,
|
||||||
|
"breathing": false
|
||||||
|
},
|
||||||
|
"rgblight": {
|
||||||
|
"driver": "ws2812",
|
||||||
|
"led_count": 10,
|
||||||
|
"max_brightness": 200,
|
||||||
|
"sleep": true,
|
||||||
|
"animations": {
|
||||||
|
"breathing": true,
|
||||||
|
"rainbow_mood": true,
|
||||||
|
"rainbow_swirl": true,
|
||||||
|
"snake": true,
|
||||||
|
"knight": true,
|
||||||
|
"christmas": true,
|
||||||
|
"static_gradient": true,
|
||||||
|
"rgb_test": true,
|
||||||
|
"alternating": true,
|
||||||
|
"twinkle": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ws2812": {
|
||||||
|
"pin": "GP0",
|
||||||
|
"driver": "vendor"
|
||||||
|
},
|
||||||
|
"community_layouts": ["ortho_1x1"],
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT_ortho_1x1": {
|
||||||
|
"layout": [
|
||||||
|
{"matrix": [0, 0], "x": 0, "y": 0}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright 2023 jpe230 (@jpe230)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[0] = LAYOUT_ortho_1x1(
|
||||||
|
KC_MUTE
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef ENCODER_MAP_ENABLE
|
||||||
|
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||||
|
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
|
||||||
|
};
|
||||||
|
#endif
|
|
@ -0,0 +1 @@
|
||||||
|
ENCODER_MAP_ENABLE = yes
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright 2023 jpe230 (@jpe230)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[0] = LAYOUT_ortho_1x1(
|
||||||
|
KC_MUTE
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef ENCODER_MAP_ENABLE
|
||||||
|
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||||
|
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
|
||||||
|
};
|
||||||
|
#endif
|
|
@ -0,0 +1,2 @@
|
||||||
|
ENCODER_MAP_ENABLE = yes
|
||||||
|
VIA_ENABLE = yes
|
|
@ -0,0 +1,12 @@
|
||||||
|
// Copyright 2023 jpe230 (@jpe230)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
|
#undef RP_SPI_USE_SPI0
|
||||||
|
#define RP_SPI_USE_SPI0 TRUE
|
||||||
|
|
||||||
|
#undef RP_PWM_USE_PWM3
|
||||||
|
#define RP_PWM_USE_PWM3 TRUE
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Big Knob
|
||||||
|
|
||||||
|
![big_knob](https://i.imgur.com/KLS0O7Zh.png)
|
||||||
|
|
||||||
|
A 3D printed single encoder volume knob with a SPI Screen.
|
||||||
|
|
||||||
|
* Keyboard Maintainer: [jpe230](https://github.com/jpe230)
|
||||||
|
* Hardware Supported: Big Knob PCB, Sparkfun ProMicro RP2040 (*See notes*)
|
||||||
|
* Hardware Availability: <https://github.com/Jpe230/big_knob>
|
||||||
|
## Features
|
||||||
|
|
||||||
|
The Big Knob was designed to be easy to assemble:
|
||||||
|
* Designed to be used with a RP2040 board (*See notes*)
|
||||||
|
* ST7735 0.96 inch color display
|
||||||
|
* RGBLight
|
||||||
|
* Easy to 3D print
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
You can use any compatible RP2040 board (I.E.: KB2040, Elite Pi, etc), but you will need to modify the pin definition to match you board
|
||||||
|
|
||||||
|
## Flashing
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
qmk compile -kb jpe230/big_knob -km default
|
||||||
|
|
||||||
|
Flashing example for this keyboard:
|
||||||
|
|
||||||
|
qmk flash -kb jpe230/big_knob -km default
|
||||||
|
|
||||||
|
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
||||||
|
|
||||||
|
## Building Instructions
|
||||||
|
|
||||||
|
You can find the required materials and the instructions to build your own Big Knob in the [project repo](https://github.com/Jpe230/big_knob)
|
||||||
|
|
||||||
|
## Bootloader
|
||||||
|
|
||||||
|
Enter the bootloader in 3 ways:
|
||||||
|
|
||||||
|
* **Bootmagic reset**: Hold down the encoder buitton and plug in the keyboard
|
||||||
|
* **Physical reset button**: Briefly press the reset button on the front of the RP2040 board
|
||||||
|
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
|
|
@ -0,0 +1,3 @@
|
||||||
|
QUANTUM_PAINTER_ENABLE = yes
|
||||||
|
QUANTUM_PAINTER_DRIVERS += st7735_spi
|
||||||
|
SRC += gfx/logo.qgf.c
|
Loading…
Reference in New Issue