diff --git a/README.md b/README.md index c83490d..1b26083 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docs/keyboards/redragon-k630-norgb.md b/docs/keyboards/redragon-k630-norgb.md new file mode 100644 index 0000000..e1973a5 --- /dev/null +++ b/docs/keyboards/redragon-k630-norgb.md @@ -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 +``` diff --git a/meson.build b/meson.build index 8d3db12..bd93333 100644 --- a/meson.build +++ b/meson.build @@ -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 diff --git a/src/keyboards/redragon-k630-norgb/kbdef.h b/src/keyboards/redragon-k630-norgb/kbdef.h new file mode 100644 index 0000000..c1b7717 --- /dev/null +++ b/src/keyboards/redragon-k630-norgb/kbdef.h @@ -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 diff --git a/src/keyboards/redragon-k630-norgb/layouts/default/indicators.c b/src/keyboards/redragon-k630-norgb/layouts/default/indicators.c new file mode 100644 index 0000000..962125c --- /dev/null +++ b/src/keyboards/redragon-k630-norgb/layouts/default/indicators.c @@ -0,0 +1,125 @@ +#include "indicators.h" +#include "sh68f90a.h" +#include "kbdef.h" +#include "pwm.h" +#include + +// 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; +} diff --git a/src/keyboards/redragon-k630-norgb/layouts/default/layout.c b/src/keyboards/redragon-k630-norgb/layouts/default/layout.c new file mode 100644 index 0000000..52caf4a --- /dev/null +++ b/src/keyboards/redragon-k630-norgb/layouts/default/layout.c @@ -0,0 +1,67 @@ +#include "kbdef.h" +#include "layout.h" +#include "user_layout.h" +#include "report.h" +#include + +// 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, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/src/keyboards/redragon-k630-norgb/user_init.c b/src/keyboards/redragon-k630-norgb/user_init.c new file mode 100644 index 0000000..8362f4e --- /dev/null +++ b/src/keyboards/redragon-k630-norgb/user_init.c @@ -0,0 +1,78 @@ +#include "kbdef.h" +#include "user_init.h" +#include "pwm.h" + +// TODO: move these defines out +#define PWM_PERD 0x0400 // 1024 / PWM_CLK ~= 43 us + +#define PWM_DUTY1 (uint16_t) PWM_PERD +#define PWM_DUTY2 (uint16_t)0 + +#define PWM_PERDH_INIT ((uint8_t)(PWM_PERD >> 8)) +#define PWM_PERDL_INIT ((uint8_t)(PWM_PERD)) + +void user_gpio_init(); +void user_pwm_init(); + +void user_init() +{ + user_gpio_init(); + user_pwm_init(); + + IEN1 |= (1 << 1); // EPWM0 +} + +void user_gpio_init() +{ + // configure driving capabilities + DRVCON = 0x05; // allow P1 to be changed + P1DRV = 0x00; // 25mA + + DRVCON = 0x45; // allow P2 to be changed + P2DRV = 0x00; // 25mA + + DRVCON = 0x85; // allow P3 to be changed + P3DRV = 0x00; // 25mA + + DRVCON = 0; + + P0CR = (uint8_t)(LED_CAPS_P0_3); + P1CR = (uint8_t)(KB_C0_P1_4 | KB_C1_P1_5); + P2CR = (uint8_t)(KB_C2_P2_0 | KB_C3_P2_1 | KB_C4_P2_2 | KB_C5_P2_3 | KB_C6_P2_4 | KB_C7_P2_5); + P3CR = (uint8_t)(KB_C8_P3_0 | KB_C9_P3_1 | KB_C10_P3_2 | KB_C11_P3_3 | KB_C12_P3_4 | KB_C13_P3_5); + P6CR = (uint8_t)(LED_R0_P6_1 | LED_R1_P6_2 | LED_R2_P6_3 | LED_R3_P6_4 | LED_R4_P6_5); + + P5PCR = (uint8_t)(KB_R3_P5_3 | KB_R4_P5_4); + // P6PCR = (uint8_t)(LED_R0_P6_1 | LED_R1_P6_2 | LED_R2_P6_3 | LED_R3_P6_4 | LED_R4_P6_5); + P7PCR = (uint8_t)(KB_R0_P7_1 | KB_R1_P7_2 | KB_R2_P7_3); + + P0 = (uint8_t)(LED_CAPS_P0_3); + P6 = (uint8_t)(LED_R0_P6_1 | LED_R1_P6_2 | LED_R2_P6_3 | LED_R3_P6_4 | LED_R4_P6_5); +} + +void user_pwm_init() +{ + PWM0PERDH = PWM_PERDH_INIT; + PWM0PERDL = PWM_PERDL_INIT; + + PWM1PERDH = PWM_PERDH_INIT; + PWM1PERDL = PWM_PERDL_INIT; + + PWM2PERDH = PWM_PERDH_INIT; + PWM2PERDL = PWM_PERDL_INIT; + + SET_PWM_DUTY(LED_PWM_C0, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C1, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C2, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C3, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C4, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C5, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C6, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C7, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C8, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C9, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C10, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C11, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C12, PWM_DUTY1, PWM_DUTY2); + SET_PWM_DUTY(LED_PWM_C13, PWM_DUTY1, PWM_DUTY2); +} diff --git a/src/keyboards/redragon-k630-norgb/user_matrix.c b/src/keyboards/redragon-k630-norgb/user_matrix.c new file mode 100644 index 0000000..369e4e8 --- /dev/null +++ b/src/keyboards/redragon-k630-norgb/user_matrix.c @@ -0,0 +1,89 @@ +#include "kbdef.h" +#include "user_matrix.h" + +void user_matrix_pre_scan(uint8_t col) +{ + // set all columns to high + P1 |= (uint8_t)(KB_C0_P1_4 | KB_C1_P1_5); + P2 |= (uint8_t)(KB_C2_P2_0 | KB_C3_P2_1 | KB_C4_P2_2 | KB_C5_P2_3 | KB_C6_P2_4 | KB_C7_P2_5); + P3 |= (uint8_t)(KB_C8_P3_0 | KB_C9_P3_1 | KB_C10_P3_2 | KB_C11_P3_3 | KB_C12_P3_4 | KB_C13_P3_5); + + // set current (!) column to low + switch (col) { + case 0: + KB_C0 = 0; + break; + + case 1: + KB_C1 = 0; + break; + + case 2: + KB_C2 = 0; + break; + + case 3: + KB_C3 = 0; + break; + + case 4: + KB_C4 = 0; + break; + + case 5: + KB_C5 = 0; + break; + + case 6: + KB_C6 = 0; + break; + + case 7: + KB_C7 = 0; + break; + + case 8: + KB_C8 = 0; + break; + + case 9: + KB_C9 = 0; + break; + + case 10: + KB_C10 = 0; + break; + + case 11: + KB_C11 = 0; + break; + + case 12: + KB_C12 = 0; + break; + + case 13: + KB_C13 = 0; + break; + } +} + +uint8_t user_matrix_scan_col(uint8_t col) +{ + col; + // grab key for the column state + // P7_1 - R0 + // P7_2 - R1 + // P7_3 - R2 + // P5_3 - R3 + // P5_4 - R4 + return (((P7 >> 1) & 0x07) | (P5 & 0x18)) | 0xe0; +} + +void user_matrix_post_scan() +{ + // set all columns down to low + P1 &= (uint8_t) ~(KB_C0_P1_4 | KB_C1_P1_5); + P2 &= (uint8_t) ~(KB_C2_P2_0 | KB_C3_P2_1 | KB_C4_P2_2 | KB_C5_P2_3 | KB_C6_P2_4 | KB_C7_P2_5); + P3 &= (uint8_t) ~(KB_C8_P3_0 | KB_C9_P3_1 | KB_C10_P3_2 | KB_C11_P3_3 | KB_C12_P3_4 | KB_C13_P3_5); +}