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

added support for Redragon K630 Single color LED version #21

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ You can very easily end up with a bricked device if the written firmware can't j
| -------- | --- | --- | --- | -------- | ------- |
| [NuPhy Air60 v1](https://nuphy.com/products/air60) | SH68F90A / BYK916 | ✅ | ✅ | 2.4G (BT WIP) | [Details](docs/keyboards/nuphy-air60.md) |
| E-YOOSO Z11 | SH68F90A / BYK901 | ✅ | ✅ | N/A | [Details](docs/keyboards/nuphy-air60.md) |
| [Redragon K630 NoRGB](https://www.redragonzone.com/products/redragon-k630-gaming-mechanical-keyboard) | SH68F90AU | ✅ | ✅ | N/A | [Details](docs/keyboards/redragon-k630-norgb.md)

## Developing

Expand Down
67 changes: 67 additions & 0 deletions docs/keyboards/redragon-k630-norgb.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Redragon K630 Single Color LED version

## Specs

- MCU: SH68F90AU
- Backlight: Single Color LEDs (Pink)
- Indicators: Single CAPS_LOCK LED
- Wireless: None

## Pictures

| PCB | MCU |
| --- | --- |
| ![k630-pcb](https://i.imgur.com/hNjuUHT.jpeg) | ![k630-mcu](https://i.imgur.com/Ei4BugB.jpeg) |

## SMK Supported Features

- [x] Key Scan
- [x] LED Matrix

## Code Options

This firmware requires the following (stock) code options that are programmed on the BYK901 (SH68F90A) in the E-YOOSO Z11

```
Code Option String: A4E063C00F000088
Code Option Number: 0x8800000fc063e0a4

Byte 0 - A4
OP_OSCDRIVE 2 - 4MHz crystal or 8~12MHz crystal with external capacitance(C1=C2)<20pF
OP_RST 1 - P0.2 used as IO pin
OP_WMT 0 - longest warm up time
OP_SCMEN 1 - Disable SCM
OP_OSCRFB 0 - 150K

Byte 1 - E0
OP_LVREN 1 - Enable LVR function
OP_LVRLEVEL 3 - 2.1V LVR level4
OP_SCM 0 - SCM is invalid in warm up period
OP_OSC2SEL 0 - OSC2 select 12M RC
OP_IOV1 0 - P7.1/P7.2/P7.3/P7.4 input/output level is VUSB(5V)
OP_IOV0 0 - P5.5/P5.6 input/output level is VUSB(5V)

Byte 2 - 63
OP_SCMSEL 3 - 8MHz
OP_OSC 3 - Oscillator1 is internal 128KHz RC, oscillator2 is internal 24MHz RC

Byte 3 - C0
OP_ISP 1 - Disable ISP function
OP_ISPPIN 1 - Enter ISP mode only when P6.3 and P6.4 are connected to GND, simultaneously
OP_WDT 0 - Enable WDT function
OP_WDTPD 0 - Disable WDT function in Power-Down mode

Byte 4 - 0F
OP_SINK1 3 - Port6[5:0] sink ability largest mode(380mA)
OP_SINK0 3 - P4.7/Port7[7:5] sink ability largest mode(50mA)

Byte 5 - 00
OP_BOPTP 0 - (1+21%)tr min
OP_BOPTN 0 - (1+21%)tf min

Byte 6 - 00
Unused

Byte 7 - 88
OP_ISPSIZE 8 - 0Bytes
```
1 change: 1 addition & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ parts = [
['example', 'sh68f90a', ['default'], {}],
['nuphy-air60', 'sh68f90a', ['default'], { 'vendor_id': '0x05ac', 'product_id': '0x024f', 'wireless': 'bk3632' }],
['eyooso-z11', 'sh68f90a', ['default'], { 'vendor_id': '0x258a', 'product_id': '0x002a' }],
['redragon-k630-norgb', 'sh68f90a', ['default'], { 'vendor_id': '0x258a', 'product_id': '0x002a' }],
]

# SMK
Expand Down
91 changes: 91 additions & 0 deletions src/keyboards/redragon-k630-norgb/kbdef.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#ifndef KBDEF_H
#define KBDEF_H

#include "sh68f90a.h"

#define MATRIX_ROWS 5
#define MATRIX_COLS 14

// Row Pin Bits
#define KB_R0_P7_1 _P7_1
#define KB_R1_P7_2 _P7_2
#define KB_R2_P7_3 _P7_3
#define KB_R3_P5_3 _P5_3
#define KB_R4_P5_4 _P5_4

// Row Pins
#define KB_R0 P7_1
#define KB_R1 P7_2
#define KB_R2 P7_3
#define KB_R3 P5_3
#define KB_R4 P5_4

// Column Pin Bits
#define KB_C0_P1_4 _P1_4
#define KB_C1_P1_5 _P1_5
#define KB_C2_P2_0 _P2_0
#define KB_C3_P2_1 _P2_1
#define KB_C4_P2_2 _P2_2
#define KB_C5_P2_3 _P2_3
#define KB_C6_P2_4 _P2_4
#define KB_C7_P2_5 _P2_5
#define KB_C8_P3_0 _P3_0
#define KB_C9_P3_1 _P3_1
#define KB_C10_P3_2 _P3_2
#define KB_C11_P3_3 _P3_3
#define KB_C12_P3_4 _P3_4
#define KB_C13_P3_5 _P3_5

// Column Pins
#define KB_C0 P1_4
#define KB_C1 P1_5
#define KB_C2 P2_0
#define KB_C3 P2_1
#define KB_C4 P2_2
#define KB_C5 P2_3
#define KB_C6 P2_4
#define KB_C7 P2_5
#define KB_C8 P3_0
#define KB_C9 P3_1
#define KB_C10 P3_2
#define KB_C11 P3_3
#define KB_C12 P3_4
#define KB_C13 P3_5

// LED PWM Registers
#define LED_PWM_C0 PWM24
#define LED_PWM_C1 PWM25
#define LED_PWM_C2 PWM10
#define LED_PWM_C3 PWM11
#define LED_PWM_C4 PWM12
#define LED_PWM_C5 PWM13
#define LED_PWM_C6 PWM14
#define LED_PWM_C7 PWM15
#define LED_PWM_C8 PWM00
#define LED_PWM_C9 PWM01
#define LED_PWM_C10 PWM02
#define LED_PWM_C11 PWM03
#define LED_PWM_C12 PWM04
#define LED_PWM_C13 PWM05

// LED Row Pin Bits
#define LED_R0_P6_1 _P6_1
#define LED_R1_P6_2 _P6_2
#define LED_R2_P6_3 _P6_3
#define LED_R3_P6_4 _P6_4
#define LED_R4_P6_5 _P6_5

// LED Row Pins
#define LED_R0 P6_1
#define LED_R1 P6_2
#define LED_R2 P6_3
#define LED_R3 P6_4
#define LED_R4 P6_5

// KC_CAPS LED Pin
#define LED_CAPS P0_3

// KC_CAPS LED Pin Bit
#define LED_CAPS_P0_3 _P0_3

#endif
125 changes: 125 additions & 0 deletions src/keyboards/redragon-k630-norgb/layouts/default/indicators.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#include "indicators.h"
#include "sh68f90a.h"
#include "kbdef.h"
#include "pwm.h"
#include <stdlib.h>

// TODO: move these defines out
#define PWM_CLK_DIV 0b010 // PWM_CLK = SYS_CLK / 4
#define PWM_SS_BIT (1 << 3)
#define PWM_MOD_BIT (1 << 4)
#define PWM_INT_ENABLE_BIT (1 << 6)
#define PWM_MODE_ENABLE_BIT (1 << 7)

void indicators_pwm_set_all_columns(uint16_t intensity);
void indicators_pwm_enable();
void indicators_pwm_disable();

void indicators_start()
{
indicators_pwm_enable();
}

void indicators_pre_update()
{
// set all rgb sinks to low (animation step will enable needed ones)
P6 &= ~(LED_R0_P6_1 | LED_R1_P6_2 | LED_R2_P6_3 | LED_R3_P6_4 | LED_R4_P6_5);

indicators_pwm_disable();
}

bool indicators_update_step(keyboard_state_t *keyboard, uint8_t current_step)
{
static uint16_t current_cycle = 0;

if (current_step == 0) {
if (current_cycle < 2048) {
current_cycle++;
} else {
current_cycle = 0;
}
}

uint16_t intensity = 0;

intensity = 1024 - (uint16_t)abs((int16_t)((current_cycle + 1024) % 2048) - 1024);

LED_CAPS = !(keyboard->led_state & (1 << 1));

// set pwm duty cycles to expected colors
indicators_pwm_set_all_columns(intensity);

return false;
}

void indicators_post_update()
{
// clear pwm isr flag
PWM00CON &= ~(1 << 5);

indicators_pwm_enable();
}

void indicators_pwm_set_all_columns(uint16_t intensity)
{
uint16_t adjusted = 0x0400 - intensity;

SET_PWM_DUTY_2(LED_PWM_C0, adjusted);
SET_PWM_DUTY_2(LED_PWM_C1, adjusted);
SET_PWM_DUTY_2(LED_PWM_C2, adjusted);
SET_PWM_DUTY_2(LED_PWM_C3, adjusted);
SET_PWM_DUTY_2(LED_PWM_C4, adjusted);
SET_PWM_DUTY_2(LED_PWM_C5, adjusted);
SET_PWM_DUTY_2(LED_PWM_C6, adjusted);
SET_PWM_DUTY_2(LED_PWM_C7, adjusted);
SET_PWM_DUTY_2(LED_PWM_C8, adjusted);
SET_PWM_DUTY_2(LED_PWM_C9, adjusted);
SET_PWM_DUTY_2(LED_PWM_C10, adjusted);
SET_PWM_DUTY_2(LED_PWM_C11, adjusted);
SET_PWM_DUTY_2(LED_PWM_C12, adjusted);
SET_PWM_DUTY_2(LED_PWM_C13, adjusted);
}

void indicators_pwm_enable()
{
// TODO: try abstracting individual banks away
PWM00CON = (uint8_t)(PWM_MODE_ENABLE_BIT | PWM_INT_ENABLE_BIT | PWM_SS_BIT | PWM_CLK_DIV);
PWM01CON = PWM_SS_BIT;
PWM02CON = PWM_SS_BIT;
PWM03CON = PWM_SS_BIT;
PWM04CON = PWM_SS_BIT;
PWM05CON = PWM_SS_BIT;

PWM10CON = (uint8_t)(PWM_MODE_ENABLE_BIT | PWM_SS_BIT | PWM_CLK_DIV);
PWM11CON = PWM_SS_BIT;
PWM12CON = PWM_SS_BIT;
PWM13CON = PWM_SS_BIT;
PWM14CON = PWM_SS_BIT;
PWM15CON = PWM_SS_BIT;

PWM20CON = (uint8_t)(PWM_MODE_ENABLE_BIT | PWM_SS_BIT | PWM_CLK_DIV);
PWM24CON = PWM_SS_BIT;
PWM25CON = PWM_SS_BIT;
}

void indicators_pwm_disable()
{
// TODO: try abstracting individual banks away
PWM00CON = (uint8_t)(PWM_CLK_DIV);
PWM01CON = 0;
PWM02CON = 0;
PWM03CON = 0;
PWM04CON = 0;
PWM05CON = 0;

PWM10CON = (uint8_t)(PWM_CLK_DIV);
PWM11CON = 0;
PWM12CON = 0;
PWM13CON = 0;
PWM14CON = 0;
PWM15CON = 0;

PWM20CON = (uint8_t)(PWM_CLK_DIV);
PWM24CON = 0;
PWM25CON = 0;
}
67 changes: 67 additions & 0 deletions src/keyboards/redragon-k630-norgb/layouts/default/layout.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include "kbdef.h"
#include "layout.h"
#include "user_layout.h"
#include "report.h"
#include <stdint.h>

// clang-format off

#define LAYOUT_60( \
K00_0, K01_0, K02_0, K03_0, K04_0, K05_0, K06_0, K07_0, K08_0, K09_0, K10_0, K11_0, K12_0, K13_0, \
K00_1, K01_1, K02_1, K03_1, K04_1, K05_1, K06_1, K07_1, K08_1, K09_1, K10_1, K11_1, K12_1, K13_1, \
K00_2, K01_2, K02_2, K03_2, K04_2, K05_2, K06_2, K07_2, K08_2, K09_2, K10_2, K11_2, K13_2, \
K00_3, K01_3, K02_3, K03_3, K04_3, K05_3, K06_3, K07_3, K08_3, K09_3, K10_3, K12_3, \
K00_4, K01_4, K02_4, K05_4, K08_4, K09_4, K10_4, K11_4 \
) { \
{ K00_0, K01_0, K02_0, K03_0, K04_0, K05_0, K06_0, K07_0, K08_0, K09_0, K10_0, K11_0, K12_0, K13_0 }, \
{ K00_1, K01_1, K02_1, K03_1, K04_1, K05_1, K06_1, K07_1, K08_1, K09_1, K10_1, K11_1, K12_1, K13_1 }, \
{ K00_2, K01_2, K02_2, K03_2, K04_2, K05_2, K06_2, K07_2, K08_2, K09_2, K10_2, K11_2, KC_NO, K13_2 }, \
{ K00_3, K01_3, K02_3, K03_3, K04_3, K05_3, K06_3, K07_3, K08_3, K09_3, K10_3, KC_NO, K12_3, KC_NO }, \
{ K00_4, K01_4, K02_4, KC_NO, KC_NO, K05_4, KC_NO, KC_NO, K08_4, K09_4, K10_4, K11_4, KC_NO, KC_NO } \
}

#define _BL 0
#define _FL 1

const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ESC│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
* │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
* │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │Ctrl│GUI │Alt │ │ Alt│ Fn │Menu│Ctrl│
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
[_BL] = LAYOUT_60(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_APP , KC_RCTL
),
/* Keymap _FL: (Base Layer) Function Layer
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ ` │ F1│ F2│ F3│ F4│ F5│ F6│ F7│ F8│ F9│F10│F11│F12│ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ │ │Up │ │ │ │ │ │ │ │Prt│Hme│END│ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
* │ │Lef│Dow│Rig│ │ │ │ │ │ │PUp│PDn│ │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
* │ │ │ │ │ │ │ │ │ │INS│DEL│ │
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
[_FL] = LAYOUT_60(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
_______, _______, KC_UP , _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END, _______,
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______
)
};
Loading