aboutsummaryrefslogtreecommitdiff
path: root/keyboards/splitkb
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/splitkb')
-rw-r--r--keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json33
-rw-r--r--keyboards/splitkb/elora/rev1/halconf.h2
-rw-r--r--keyboards/splitkb/elora/rev1/myriad.c124
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/info.json60
-rw-r--r--keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json43
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/keymaps/default/readme.md87
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/readme.md31
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/rev2/config.h32
-rw-r--r--keyboards/splitkb/halcyon/corne/rev2/halconf.h11
-rwxr-xr-xkeyboards/splitkb/halcyon/corne/rev2/keyboard.json156
-rw-r--r--keyboards/splitkb/halcyon/corne/rev2/mcuconf.h14
-rw-r--r--keyboards/splitkb/halcyon/corne/rev2/rev2.c28
-rw-r--r--keyboards/splitkb/halcyon/elora/rev2/halconf.h3
-rwxr-xr-xkeyboards/splitkb/halcyon/ferris/info.json52
-rw-r--r--keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json69
-rw-r--r--keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md142
-rwxr-xr-xkeyboards/splitkb/halcyon/ferris/readme.md31
-rwxr-xr-xkeyboards/splitkb/halcyon/ferris/rev1/config.h32
-rw-r--r--keyboards/splitkb/halcyon/ferris/rev1/halconf.h11
-rwxr-xr-xkeyboards/splitkb/halcyon/ferris/rev1/keyboard.json142
-rw-r--r--keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h14
-rw-r--r--keyboards/splitkb/halcyon/kyria/rev4/halconf.h3
-rwxr-xr-xkeyboards/splitkb/halcyon/lily58/info.json73
-rw-r--r--keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json47
-rw-r--r--keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md88
-rwxr-xr-xkeyboards/splitkb/halcyon/lily58/readme.md31
-rwxr-xr-xkeyboards/splitkb/halcyon/lily58/rev2/config.h32
-rw-r--r--keyboards/splitkb/halcyon/lily58/rev2/halconf.h11
-rwxr-xr-xkeyboards/splitkb/halcyon/lily58/rev2/keyboard.json170
-rw-r--r--keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h14
-rw-r--r--keyboards/splitkb/halcyon/lily58/rev2/rev2.c28
31 files changed, 1533 insertions, 81 deletions
diff --git a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json
index 1d308d531f..885faaf858 100644
--- a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json
+++ b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json
@@ -54,31 +54,16 @@
]
],
"config": {
- "features": {
- "oled": true,
- "rgb_matrix": true,
- "rgblight": false
+ "mousekey": {
+ "interval": 16,
+ "time_to_max": 40,
+ "delay": 100,
+ "wheel_delay": 100
},
- "encoder": {
- "enabled": true
- },
- "rgblight": {
- "hue_steps": 8,
- "saturation_steps": 8,
- "brightness_steps": 8,
- "sleep": true
+ "tapping": {
+ "term": 200,
+ "permissive_hold": true,
+ "force_hold": true
}
- },
- "mouse_key": {
- "enabled": true,
- "interval": 16,
- "time_to_max": 40,
- "delay": 100,
- "wheel_delay": 100
- },
- "tapping": {
- "term": 200,
- "permissive_hold": true,
- "force_hold": true
}
}
diff --git a/keyboards/splitkb/elora/rev1/halconf.h b/keyboards/splitkb/elora/rev1/halconf.h
index 9798aa34f9..4a2cc2c514 100644
--- a/keyboards/splitkb/elora/rev1/halconf.h
+++ b/keyboards/splitkb/elora/rev1/halconf.h
@@ -6,8 +6,6 @@
#define HAL_USE_SIO TRUE
#define HAL_USE_I2C TRUE
#define HAL_USE_SPI TRUE
-#define SPI_USE_WAIT TRUE
-#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
#define HAL_USE_ADC TRUE
#include_next <halconf.h>
diff --git a/keyboards/splitkb/elora/rev1/myriad.c b/keyboards/splitkb/elora/rev1/myriad.c
index 8bb6054df9..0263821b81 100644
--- a/keyboards/splitkb/elora/rev1/myriad.c
+++ b/keyboards/splitkb/elora/rev1/myriad.c
@@ -9,10 +9,10 @@
#include "analog.h"
typedef struct __attribute__((__packed__)) {
- char magic_numbers[3];
- uint8_t version_major;
- uint8_t version_minor;
- uint8_t version_patch;
+ char magic_numbers[3];
+ uint8_t version_major;
+ uint8_t version_minor;
+ uint8_t version_patch;
uint32_t checksum;
uint16_t payload_length;
} myriad_header_t;
@@ -20,34 +20,36 @@ typedef struct __attribute__((__packed__)) {
typedef struct __attribute__((__packed__)) {
uint16_t vendor_id;
uint16_t product_id;
- uint8_t revision;
+ uint8_t revision;
} identity_record_t;
static bool myriad_reader(uint8_t *data, uint16_t length) {
- const uint8_t eeprom_address = 0x50; // 1010 000 - NOT shifted for R/W bit
- const uint16_t i2c_timeout = 100; // in milliseconds
+ const uint8_t eeprom_address = 0x50; // 1010 000 - NOT shifted for R/W bit
+ const uint16_t i2c_timeout = 100; // in milliseconds
- uint8_t num_pages = (length / 256) + 1;
+ uint8_t num_pages = (length / 256) + 1;
uint8_t last_page_size = length % 256;
for (int i = 0; i < num_pages; i++) {
- uint8_t reg = 0; // We always start on a page boundary, so this is always zero
+ uint8_t reg = 0; // We always start on a page boundary, so this is always zero
uint16_t read_length;
if (i == num_pages - 1) {
read_length = last_page_size;
} else {
read_length = 256;
}
- i2c_status_t s = i2c_read_register((eeprom_address + i) << 1, reg, &(data[i*256]), read_length, i2c_timeout);
- if (s != I2C_STATUS_SUCCESS) { return false; }
+ i2c_status_t s = i2c_read_register((eeprom_address + i) << 1, reg, &(data[i * 256]), read_length, i2c_timeout);
+ if (s != I2C_STATUS_SUCCESS) {
+ return false;
+ }
}
return true;
}
static bool verify_header(myriad_header_t *header) {
- char magic_numbers[] = {'M', 'Y', 'R'};
- uint8_t version_major = 1;
- uint16_t version_minor = 0;
+ char magic_numbers[] = {'M', 'Y', 'R'};
+ uint8_t version_major = 1;
+ uint16_t version_minor = 0;
for (int i = 0; i < sizeof(magic_numbers); i++) {
// Check that the header starts with 'MYR', indicating that this is indeed a Myriad card.
@@ -82,16 +84,15 @@ static bool verify_checksum(uint8_t *data, uint16_t length, uint32_t checksum) {
const uint32_t MOD_ADLER = 65521;
uint32_t a = 1, b = 0;
- size_t index;
-
+ size_t index;
+
// Process each byte of the data in order
- for (index = 0; index < length; ++index)
- {
+ for (index = 0; index < length; ++index) {
a = (a + data[index]) % MOD_ADLER;
b = (b + a) % MOD_ADLER;
}
uint32_t calculated = ((b << 16) | a);
-
+
return calculated == checksum;
}
@@ -108,9 +109,9 @@ static int16_t locate_entry(uint8_t entry_type, uint8_t entry_data_length, uint8
while (offset < maximum) {
if (data[offset] == entry_type) {
// Type matches!
- if (data[offset+1] == entry_data_length) {
+ if (data[offset + 1] == entry_data_length) {
// We found what we are looking for, so return payload reference.
- return offset+2;
+ return offset + 2;
} else {
// The entry is the wrong length?
return -2;
@@ -118,7 +119,7 @@ static int16_t locate_entry(uint8_t entry_type, uint8_t entry_data_length, uint8
} else {
// No type match, so skip this one
// We skip the type byte, the length byte, and any potential data (with length stored in the length byte)
- offset += 2 + data[offset+1];
+ offset += 2 + data[offset + 1];
}
}
@@ -127,13 +128,15 @@ static int16_t locate_entry(uint8_t entry_type, uint8_t entry_data_length, uint8
}
static bool read_card_identity(uint8_t *data, uint16_t length, identity_record_t *record) {
- const uint8_t identity_type = 0x01;
+ const uint8_t identity_type = 0x01;
const uint8_t entry_data_length = sizeof(identity_record_t);
- int16_t result = locate_entry(identity_type, entry_data_length, data, 0, length);
- if (result < 0) { return false; }
+ int16_t result = locate_entry(identity_type, entry_data_length, data, 0, length);
+ if (result < 0) {
+ return false;
+ }
for (int i = 0; i < sizeof(identity_record_t); i++) {
- ((uint8_t*)record)[i] = data[result + i];
+ ((uint8_t *)record)[i] = data[result + i];
}
return true;
}
@@ -141,27 +144,37 @@ static bool read_card_identity(uint8_t *data, uint16_t length, identity_record_t
static myriad_card_t _detect_myriad(void) {
gpio_set_pin_input(MYRIAD_PRESENT);
wait_ms(100);
- // The pin has an external pull-up, and a Myriad card shorts it to ground.
- #ifndef MYRIAD_OVERRIDE_PRESENCE
+// The pin has an external pull-up, and a Myriad card shorts it to ground.
+#ifndef MYRIAD_OVERRIDE_PRESENCE
if (gpio_read_pin(MYRIAD_PRESENT)) {
return NONE;
}
- #endif
+#endif
// Attempt to read header
myriad_header_t header;
- if (!myriad_reader((uint8_t*)&header, sizeof(header))) { return INVALID; }
- if (!verify_header(&header)) { return INVALID; }
+ if (!myriad_reader((uint8_t *)&header, sizeof(header))) {
+ return INVALID;
+ }
+ if (!verify_header(&header)) {
+ return INVALID;
+ }
// Now that we have determined that the header is valid
// and we know the payload length, read the entire thing
- uint8_t data[2048]; // Guaranteed to be large enough.
- uint16_t data_size = sizeof(header)+header.payload_length;
- if (!myriad_reader(data, data_size)) { return INVALID; }
- if (!verify_checksum(data, data_size, header.checksum)) { return INVALID; }
+ uint8_t data[2048]; // Guaranteed to be large enough.
+ uint16_t data_size = sizeof(header) + header.payload_length;
+ if (!myriad_reader(data, data_size)) {
+ return INVALID;
+ }
+ if (!verify_checksum(data, data_size, header.checksum)) {
+ return INVALID;
+ }
identity_record_t identity;
- if (!read_card_identity(data, data_size, &identity)) { return INVALID; }
+ if (!read_card_identity(data, data_size, &identity)) {
+ return INVALID;
+ }
if (identity.vendor_id == 0x0001 && identity.product_id == 0x0001) {
return SKB_ENCODER;
@@ -201,7 +214,7 @@ static void myr_encoder_init(void) {
}
static uint16_t myr_joystick_timer;
-static void myr_joystick_init(void) {
+static void myr_joystick_init(void) {
gpio_set_pin_input_high(MYRIAD_GPIO1); // Press
myr_joystick_timer = timer_read();
@@ -235,7 +248,7 @@ static myriad_card_t myriad_card_init(void) {
bool myriad_hook_matrix(matrix_row_t current_matrix[]) {
myriad_card_t card = myriad_card_init();
- uint8_t word = 0;
+ uint8_t word = 0;
if (card == SKB_SWITCHES) {
word |= ((!gpio_read_pin(MYRIAD_GPIO3)) & 1) << 0;
@@ -252,7 +265,7 @@ bool myriad_hook_matrix(matrix_row_t current_matrix[]) {
// 5 bytes of on-board keys, so we are the 6th
bool matrix_has_changed = current_matrix[5] ^ word;
- current_matrix[5] = word;
+ current_matrix[5] = word;
return matrix_has_changed;
}
@@ -261,16 +274,20 @@ static pin_t encoders_pad_a[NUM_ENCODERS_MAX_PER_SIDE];
static pin_t encoders_pad_b[NUM_ENCODERS_MAX_PER_SIDE];
uint8_t myriad_hook_encoder(uint8_t index, bool pad_b) {
- if (myriad_card_init() != SKB_ENCODER) { return 0; }
+ if (myriad_card_init() != SKB_ENCODER) {
+ return 0;
+ }
// 3 onboard encoders, so we are number 4
- pin_t pin = pad_b ? encoders_pad_b[index] : encoders_pad_a[index];
+ pin_t pin = pad_b ? encoders_pad_b[index] : encoders_pad_a[index];
encoders_pad_a[3] = MYRIAD_GPIO2;
encoders_pad_b[3] = MYRIAD_GPIO3;
return gpio_read_pin(pin) ? 1 : 0;
}
report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) {
- if (myriad_card_init() != SKB_JOYSTICK) { return mouse_report; }
+ if (myriad_card_init() != SKB_JOYSTICK) {
+ return mouse_report;
+ }
if (timer_elapsed(myr_joystick_timer) < 10) {
wait_ms(2);
@@ -286,10 +303,10 @@ report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) {
// Create a dead zone in the middle where the mouse doesn't move
const int16_t dead_zone = 10;
- if ((y < 0 && y > -1*dead_zone) || (y > 0 && y < dead_zone)) {
+ if ((y < 0 && y > -1 * dead_zone) || (y > 0 && y < dead_zone)) {
y = 0;
}
- if ((x < 0 && x > -1*dead_zone) || (x > 0 && x < dead_zone)) {
+ if ((x < 0 && x > -1 * dead_zone) || (x > 0 && x < dead_zone)) {
x = 0;
}
@@ -298,10 +315,18 @@ report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) {
y = abs(y) * y / 5000;
// Clamp final value to make sure we don't under/overflow
- if (y < -127) { y = -127; }
- if (y > 127) { y = 127; }
- if (x < -127) { x = -127; }
- if (x > 127) { x = 127; }
+ if (y < -127) {
+ y = -127;
+ }
+ if (y > 127) {
+ y = 127;
+ }
+ if (x < -127) {
+ x = -127;
+ }
+ if (x > 127) {
+ x = 127;
+ }
mouse_report.x = x;
mouse_report.y = y;
@@ -309,7 +334,8 @@ report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) {
return mouse_report;
}
-void pointing_device_driver_init(void) {
+bool pointing_device_driver_init(void) {
gpio_set_pin_input(MYRIAD_ADC1); // Y
gpio_set_pin_input(MYRIAD_ADC2); // X
+ return true;
} \ No newline at end of file
diff --git a/keyboards/splitkb/halcyon/corne/info.json b/keyboards/splitkb/halcyon/corne/info.json
new file mode 100755
index 0000000000..8b3325910d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/info.json
@@ -0,0 +1,60 @@
+{
+ "manufacturer": "splitkb.com",
+ "maintainer": "splitkb.com",
+ "url": "https://splitkb.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x8D1D"
+ },
+ "layout_aliases": {
+ "LAYOUT": "LAYOUT_split_3x6_3"
+ },
+ "layouts": {
+ "LAYOUT_split_3x6_3": {
+ "layout": [
+ {"label": "L06", "matrix": [0, 0], "x": 0, "y": 0.3},
+ {"label": "L05", "matrix": [0, 1], "x": 1, "y": 0.3},
+ {"label": "L04", "matrix": [0, 2], "x": 2, "y": 0.1},
+ {"label": "L03", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "L02", "matrix": [0, 4], "x": 4, "y": 0.1},
+ {"label": "L01", "matrix": [0, 5], "x": 5, "y": 0.2},
+ {"label": "R01", "matrix": [4, 5], "x": 9, "y": 0.2},
+ {"label": "R02", "matrix": [4, 4], "x": 10, "y": 0.1},
+ {"label": "R03", "matrix": [4, 3], "x": 11, "y": 0},
+ {"label": "R04", "matrix": [4, 2], "x": 12, "y": 0.1},
+ {"label": "R05", "matrix": [4, 1], "x": 13, "y": 0.3},
+ {"label": "R06", "matrix": [4, 0], "x": 14, "y": 0.3},
+ {"label": "L12", "matrix": [1, 0], "x": 0, "y": 1.3},
+ {"label": "L11", "matrix": [1, 1], "x": 1, "y": 1.3},
+ {"label": "L10", "matrix": [1, 2], "x": 2, "y": 1.1},
+ {"label": "L09", "matrix": [1, 3], "x": 3, "y": 1},
+ {"label": "L08", "matrix": [1, 4], "x": 4, "y": 1.1},
+ {"label": "L07", "matrix": [1, 5], "x": 5, "y": 1.2},
+ {"label": "R07", "matrix": [5, 5], "x": 9, "y": 1.2},
+ {"label": "R08", "matrix": [5, 4], "x": 10, "y": 1.1},
+ {"label": "R09", "matrix": [5, 3], "x": 11, "y": 1},
+ {"label": "R10", "matrix": [5, 2], "x": 12, "y": 1.1},
+ {"label": "R11", "matrix": [5, 1], "x": 13, "y": 1.3},
+ {"label": "R12", "matrix": [5, 0], "x": 14, "y": 1.3},
+ {"label": "L18", "matrix": [2, 0], "x": 0, "y": 2.3},
+ {"label": "L17", "matrix": [2, 1], "x": 1, "y": 2.3},
+ {"label": "L16", "matrix": [2, 2], "x": 2, "y": 2.1},
+ {"label": "L15", "matrix": [2, 3], "x": 3, "y": 2},
+ {"label": "L14", "matrix": [2, 4], "x": 4, "y": 2.1},
+ {"label": "L13", "matrix": [2, 5], "x": 5, "y": 2.2},
+ {"label": "R13", "matrix": [6, 5], "x": 9, "y": 2.2},
+ {"label": "R14", "matrix": [6, 4], "x": 10, "y": 2.1},
+ {"label": "R15", "matrix": [6, 3], "x": 11, "y": 2},
+ {"label": "R16", "matrix": [6, 2], "x": 12, "y": 2.1},
+ {"label": "R17", "matrix": [6, 1], "x": 13, "y": 2.3},
+ {"label": "R18", "matrix": [6, 0], "x": 14, "y": 2.3},
+ {"label": "L21", "matrix": [3, 3], "x": 4, "y": 3.7},
+ {"label": "L20", "matrix": [3, 4], "x": 5, "y": 3.7},
+ {"label": "L19", "matrix": [3, 5], "w": 1.5, "x": 6, "y": 3.2},
+ {"label": "R19", "matrix": [7, 5], "w": 1.5, "x": 8, "y": 3.2},
+ {"label": "R20", "matrix": [7, 4], "x": 9, "y": 3.7},
+ {"label": "R21", "matrix": [7, 3], "x": 10, "y": 3.7}
+ ]
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json
new file mode 100644
index 0000000000..ab42d0731c
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json
@@ -0,0 +1,43 @@
+{
+ "keyboard": "splitkb/halcyon/corne/rev2",
+ "keymap": "default",
+ "version": 1,
+ "layout": "LAYOUT_split_3x6_3",
+ "layers": [
+ [
+ "KC_TAB" , "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P" , "KC_BSPC" ,
+ "KC_LCTL" , "KC_A" , "KC_S" , "KC_D" , "KC_F" , "KC_G" , "KC_H" , "KC_J" , "KC_K" , "KC_L" , "KC_SCLN" , "KC_QUOT" ,
+ "KC_LSFT" , "KC_Z" , "KC_X" , "KC_C" , "KC_V" , "KC_B" , "KC_N" , "KC_M" , "KC_COMM" , "KC_DOT" , "KC_SLSH" , "KC_ESC" ,
+ "KC_LGUI" , "MO(1)" , "KC_SPC" , "KC_ENT" , "MO(2)" , "KC_RALT"
+ ],
+ [
+ "KC_TAB" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "KC_BSPC" ,
+ "KC_LCTL" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_LEFT" , "KC_DOWN" , "KC_UP" , "KC_RIGHT", "XXXXXXX" , "XXXXXXX" ,
+ "KC_LSFT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" ,
+ "KC_LGUI" , "_______" , "KC_SPC" , "KC_ENT" , "MO(3)" , "KC_RALT"
+ ],
+ [
+ "KC_TAB" , "KC_EXLM" , "KC_AT" , "KC_HASH" , "KC_DLR" , "KC_PERC" , "KC_CIRC" , "KC_AMPR" , "KC_ASTR" , "KC_LPRN" , "KC_RPRN" , "KC_BSPC" ,
+ "KC_LCTL" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_MINS" , "KC_EQL" , "KC_LBRC" , "KC_RBRC" , "KC_BSLS" , "KC_GRV" ,
+ "KC_LSFT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_UNDS" , "KC_PLUS" , "KC_LCBR" , "KC_RCBR" , "KC_PIPE" , "KC_TILD" ,
+ "KC_LGUI" , "MO(3)" , "KC_SPC" , "KC_ENT" , "_______" , "KC_RALT"
+ ],
+ [
+ "QK_BOOT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" ,
+ "RM_TOGG" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" ,
+ "RM_NEXT" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" ,
+ "KC_LGUI" , "_______" , "KC_SPC" , "KC_ENT" , "_______" , "KC_RALT"
+ ]
+ ],
+ "config": {
+ "features": {
+ "encoder_map": true
+ }
+ },
+ "encoders": [
+ [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}, {"ccw": "KC_PGUP", "cw": "KC_PGDN"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}]
+ ]
+}
diff --git a/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md b/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md
new file mode 100755
index 0000000000..8e44629494
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md
@@ -0,0 +1,87 @@
+# Halcyon Corne's Default Keymap
+_This keymap is a copy of the [Corne default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/crkbd/keymaps/default)_
+
+A simple default keymap for the Halcyon Corne
+============================================
+
+Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user. We hope this keymap serves as a good starting point for your own - although it should be fairly usable out-of-the-box.
+
+What do all these layers do?
+----------------------------
+
+### Layer 0: Base layer
+
+![Layer 0](https://i.imgur.com/Ri5cTHqh.png)
+
+This is where your basic letters live.
+
+The homing thumb fingers are used to access the different layers.
+
+* The homing left thumb finger gives access to the Numbers (or lower) layer
+* The homing right thumb finger gives access to the Symbols (or raise) layer
+* Pressing both homing thumb fingers gives access to the Adjust layer
+
+### Layer 1: Lower
+
+![Layer 1](https://i.imgur.com/9h6ZRQLh.png)
+
+The Lower layer gives access to your number keys on the top row. It also exposes the arrow keys in the usual Vim-style layout.
+
+### Layer 2: Raise
+
+![Layer 2](https://i.imgur.com/U1pf7pJh.png)
+
+The Raise layer gives access to the symbols. In addition to shifted number keys on the top row, the right hand also exposes the remaining symbol keys, both as shifted and non-shifted variants.
+
+### Layer 3: Adjust
+
+![Layer 3](https://i.imgur.com/A6z1DCbh.png)
+
+The Adjust layer exposes RGB adjustment keys on the left hand.
+
+Where is the keymap.c?
+----------------------
+
+The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system.
+
+This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface.
+
+How do I edit and update the keymap?
+------------------------------------
+
+The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard.
+
+To edit it, you may:
+* Edit it directly from a text editor.
+* Edit it from the QMK Configurator.
+
+If you decide to use the latter workflow, here are the steps to follow:
+
+* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/corne/rev2/LAYOUT_split_3x5_3), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it).
+* Browse to the location of your keymap (for example, `<your qmk repo>/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json`)
+* Perform any modification to the keymap in the web UI
+* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it)
+* Replace your original keymap with the one you just downloaded
+
+I want to do more than the JSON format supports!
+-------------------------------------------------
+
+While the `json` format is easy to use, it does lack certain functionality - most notably custom OLED or encoder behaviour.
+
+To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation.
+
+First, from the root of your qmk repo, move to your keymap folder
+
+```bash
+cd ./keyboards/splitkb/halcyon/corne/keymaps/my_personal_keymap
+```
+
+Next, convert your `keymap.json` to a `keymap.c`
+
+```bash
+qmk json2c -o keymap.c keymap.json
+```
+
+
+You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both!
+**If a JSON file is present, the C file is ignored.**
diff --git a/keyboards/splitkb/halcyon/corne/readme.md b/keyboards/splitkb/halcyon/corne/readme.md
new file mode 100755
index 0000000000..b859da2edd
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/readme.md
@@ -0,0 +1,31 @@
+# Halcyon Corne
+
+![splitkb/halcyon/corne](https://i.imgur.com/Cpo2dM8.png)
+
+The Halcyon Corne rev2 is the second Corne revision and the third keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights:
+
+- Halcyon keyboards come preassembled! You won't need a soldering iron.
+- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules.
+- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases.
+- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C.
+- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO!
+- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing.
+
+* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com)
+* Hardware Availability: [splitkb.com](https://splitkb.com).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitkb/halcyon/corne/rev2:default
+
+The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive.
+
+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).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port.
+* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available.
diff --git a/keyboards/splitkb/halcyon/corne/rev2/config.h b/keyboards/splitkb/halcyon/corne/rev2/config.h
new file mode 100755
index 0000000000..b5cd6f95f2
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/config.h
@@ -0,0 +1,32 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Make it easier to enter the bootloader
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+// UART1, communication between the two halves
+#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+#define SERIAL_USART_TX_PIN GP28 // USART TX pin
+#define SERIAL_USART_RX_PIN GP29 // USART RX pin
+#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver
+
+// VBUS detection
+#define USB_VBUS_PIN GP1
+
+//// VIK
+
+// GPIO1 = GP27
+// GPIO2 = GP26
+// CS = GP13
+
+#define I2C_DRIVER I2C0
+#define I2C1_SDA_PIN GP16
+#define I2C1_SCL_PIN GP17
+
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP14
+#define SPI_MOSI_PIN GP15
+#define SPI_MISO_PIN GP12
diff --git a/keyboards/splitkb/halcyon/corne/rev2/halconf.h b/keyboards/splitkb/halcyon/corne/rev2/halconf.h
new file mode 100644
index 0000000000..a6937ddf9d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/halconf.h
@@ -0,0 +1,11 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+//// VIK
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/splitkb/halcyon/corne/rev2/keyboard.json b/keyboards/splitkb/halcyon/corne/rev2/keyboard.json
new file mode 100755
index 0000000000..33e8e7a907
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/keyboard.json
@@ -0,0 +1,156 @@
+{
+ "keyboard_name": "Halcyon Corne rev2",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP24", "pin_b": "GP23", "resolution": 2}
+ ]
+ },
+ "features": {
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP9", "GP4", "GP7", "GP6", "GP5", "GP10"],
+ "rows": ["GP20", "GP25", "GP11", "GP8"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"x": 93, "y": 17, "flags": 2},
+ {"x": 59, "y": 3, "flags": 2},
+ {"x": 25, "y": 7, "flags": 2},
+ {"x": 29, "y": 49, "flags": 2},
+ {"x": 70, "y": 51, "flags": 2},
+ {"x": 104, "y": 55, "flags": 2},
+ {"matrix": [3, 2], "x": 95, "y": 63, "flags": 4},
+ {"matrix": [3, 1], "x": 80, "y": 58, "flags": 4},
+ {"matrix": [3, 0], "x": 60, "y": 55, "flags": 4},
+ {"matrix": [2, 5], "x": 85, "y": 39, "flags": 4},
+ {"matrix": [2, 4], "x": 68, "y": 37, "flags": 4},
+ {"matrix": [2, 3], "x": 50, "y": 35, "flags": 4},
+ {"matrix": [2, 2], "x": 33, "y": 37, "flags": 4},
+ {"matrix": [2, 1], "x": 16, "y": 42, "flags": 4},
+ {"matrix": [1, 5], "x": 85, "y": 21, "flags": 4},
+ {"matrix": [1, 4], "x": 68, "y": 19, "flags": 4},
+ {"matrix": [1, 3], "x": 50, "y": 13, "flags": 4},
+ {"matrix": [1, 2], "x": 33, "y": 20, "flags": 4},
+ {"matrix": [1, 1], "x": 16, "y": 24, "flags": 4},
+ {"matrix": [0, 5], "x": 85, "y": 4, "flags": 4},
+ {"matrix": [0, 4], "x": 68, "y": 2, "flags": 4},
+ {"matrix": [0, 3], "x": 50, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 33, "y": 3, "flags": 4},
+ {"matrix": [0, 1], "x": 16, "y": 7, "flags": 4},
+ {"matrix": [0, 0], "x": 0, "y": 7, "flags": 4},
+ {"matrix": [1, 0], "x": 0, "y": 24, "flags": 4},
+ {"matrix": [2, 0], "x": 0, "y": 41, "flags": 4},
+ {"x": 131, "y": 17, "flags": 2},
+ {"x": 165, "y": 3, "flags": 2},
+ {"x": 199, "y": 7, "flags": 2},
+ {"x": 195, "y": 49, "flags": 2},
+ {"x": 154, "y": 51, "flags": 2},
+ {"x": 120, "y": 55, "flags": 2},
+ {"matrix": [7, 2], "x": 129, "y": 63, "flags": 4},
+ {"matrix": [7, 1], "x": 144, "y": 58, "flags": 4},
+ {"matrix": [7, 0], "x": 164, "y": 55, "flags": 4},
+ {"matrix": [6, 5], "x": 139, "y": 39, "flags": 4},
+ {"matrix": [6, 4], "x": 156, "y": 37, "flags": 4},
+ {"matrix": [6, 3], "x": 174, "y": 35, "flags": 4},
+ {"matrix": [6, 2], "x": 191, "y": 37, "flags": 4},
+ {"matrix": [6, 1], "x": 208, "y": 42, "flags": 4},
+ {"matrix": [5, 5], "x": 139, "y": 21, "flags": 4},
+ {"matrix": [5, 4], "x": 156, "y": 19, "flags": 4},
+ {"matrix": [5, 3], "x": 174, "y": 13, "flags": 4},
+ {"matrix": [5, 2], "x": 191, "y": 20, "flags": 4},
+ {"matrix": [5, 1], "x": 208, "y": 24, "flags": 4},
+ {"matrix": [4, 5], "x": 139, "y": 4, "flags": 4},
+ {"matrix": [4, 4], "x": 156, "y": 2, "flags": 4},
+ {"matrix": [4, 3], "x": 174, "y": 0, "flags": 4},
+ {"matrix": [4, 2], "x": 191, "y": 3, "flags": 4},
+ {"matrix": [4, 1], "x": 208, "y": 7, "flags": 4},
+ {"matrix": [4, 0], "x": 224, "y": 7, "flags": 4},
+ {"matrix": [5, 0], "x": 224, "y": 24, "flags": 4},
+ {"matrix": [6, 0], "x": 224, "y": 41, "flags": 4}
+ ],
+ "max_brightness": 128,
+ "sleep": true,
+ "split_count": [27, 27]
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP19"
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP5", "GP9", "GP7", "GP20", "GP25", "GP4"],
+ "rows": ["GP6", "GP10", "GP11", "GP8"]
+ }
+ },
+ "serial": {
+ "driver": "vendor"
+ },
+ "transport": {
+ "sync": {
+ "matrix_state": true
+ }
+ }
+ },
+ "usb": {
+ "pid": "0x3A07"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP3"
+ }
+}
diff --git a/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h b/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h
new file mode 100644
index 0000000000..126697a4a0
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h
@@ -0,0 +1,14 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+//// VIK
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/splitkb/halcyon/corne/rev2/rev2.c b/keyboards/splitkb/halcyon/corne/rev2/rev2.c
new file mode 100644
index 0000000000..e0a64ae9a4
--- /dev/null
+++ b/keyboards/splitkb/halcyon/corne/rev2/rev2.c
@@ -0,0 +1,28 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+ if (!encoder_update_user(index, clockwise)) {
+ return false;
+ }
+ if (index == 0) {
+ // Volume control
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 1) {
+ // Page up/Page down
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ }
+ return false;
+}
+#endif
diff --git a/keyboards/splitkb/halcyon/elora/rev2/halconf.h b/keyboards/splitkb/halcyon/elora/rev2/halconf.h
index fd95e15f83..a6937ddf9d 100644
--- a/keyboards/splitkb/halcyon/elora/rev2/halconf.h
+++ b/keyboards/splitkb/halcyon/elora/rev2/halconf.h
@@ -6,9 +6,6 @@
//// VIK
#define HAL_USE_I2C TRUE
-
#define HAL_USE_SPI TRUE
-#define SPI_USE_WAIT TRUE
-#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
#include_next <halconf.h>
diff --git a/keyboards/splitkb/halcyon/ferris/info.json b/keyboards/splitkb/halcyon/ferris/info.json
new file mode 100755
index 0000000000..66d69f717c
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/info.json
@@ -0,0 +1,52 @@
+{
+ "manufacturer": "splitkb.com",
+ "maintainer": "splitkb.com",
+ "url": "https://splitkb.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x8D1D"
+ },
+ "layout_aliases": {
+ "LAYOUT": "LAYOUT_split_3x5_2"
+ },
+ "layouts": {
+ "LAYOUT_split_3x5_2": {
+ "layout": [
+ {"label": "L01", "matrix": [0, 4], "x": 0, "y": 0.93},
+ {"label": "L02", "matrix": [0, 3], "x": 1, "y": 0.31},
+ {"label": "L03", "matrix": [0, 2], "x": 2, "y": 0},
+ {"label": "L04", "matrix": [0, 1], "x": 3, "y": 0.28},
+ {"label": "L05", "matrix": [0, 0], "x": 4, "y": 0.42},
+ {"label": "R05", "matrix": [4, 0], "x": 7, "y": 0.42},
+ {"label": "R04", "matrix": [4, 1], "x": 8, "y": 0.28},
+ {"label": "R03", "matrix": [4, 2], "x": 9, "y": 0},
+ {"label": "R02", "matrix": [4, 3], "x": 10, "y": 0.31},
+ {"label": "R01", "matrix": [4, 4], "x": 11, "y": 0.93},
+ {"label": "L06", "matrix": [1, 4], "x": 0, "y": 1.93},
+ {"label": "L07", "matrix": [1, 3], "x": 1, "y": 1.31},
+ {"label": "L08", "matrix": [1, 2], "x": 2, "y": 1},
+ {"label": "L09", "matrix": [1, 1], "x": 3, "y": 1.28},
+ {"label": "L10", "matrix": [1, 0], "x": 4, "y": 1.42},
+ {"label": "R10", "matrix": [5, 0], "x": 7, "y": 1.42},
+ {"label": "R09", "matrix": [5, 1], "x": 8, "y": 1.28},
+ {"label": "R08", "matrix": [5, 2], "x": 9, "y": 1},
+ {"label": "R07", "matrix": [5, 3], "x": 10, "y": 1.31},
+ {"label": "R06", "matrix": [5, 4], "x": 11, "y": 1.93},
+ {"label": "L11", "matrix": [2, 4], "x": 0, "y": 2.93},
+ {"label": "L12", "matrix": [2, 3], "x": 1, "y": 2.31},
+ {"label": "L13", "matrix": [2, 2], "x": 2, "y": 2},
+ {"label": "L14", "matrix": [2, 1], "x": 3, "y": 2.28},
+ {"label": "L15", "matrix": [2, 0], "x": 4, "y": 2.42},
+ {"label": "R15", "matrix": [6, 0], "x": 7, "y": 2.42},
+ {"label": "R14", "matrix": [6, 1], "x": 8, "y": 2.28},
+ {"label": "R13", "matrix": [6, 2], "x": 9, "y": 2},
+ {"label": "R12", "matrix": [6, 3], "x": 10, "y": 2.31},
+ {"label": "R11", "matrix": [6, 4], "x": 11, "y": 2.93},
+ {"label": "L16", "matrix": [3, 1], "x": 3.5, "y": 3.75},
+ {"label": "L17", "matrix": [3, 0], "x": 4.5, "y": 4},
+ {"label": "R17", "matrix": [7, 0], "x": 6.5, "y": 4},
+ {"label": "R16", "matrix": [7, 1], "x": 7.5, "y": 3.75}
+ ]
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json
new file mode 100644
index 0000000000..95748c743f
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json
@@ -0,0 +1,69 @@
+{
+ "keyboard": "splitkb/halcyon/ferris/rev1",
+ "keymap": "default",
+ "version": 1,
+ "layout": "LAYOUT",
+ "layers": [
+ [
+ "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P",
+ "LSFT_T(KC_A)", "LT(5,KC_S)" , "LT(1,KC_D)" , "LT(3,KC_F)" , "KC_G" , "KC_H" , "LT(4,KC_J)" , "LT(2,KC_K)" , "LT(6,KC_L)" , "LSFT_T(KC_SCLN)",
+ "KC_Z" , "LCTL_T(KC_X)", "LALT_T(KC_C)" , "KC_V" , "KC_B" , "KC_N" , "KC_M" , "LALT_T(KC_COMM)", "LCTL_T(KC_DOT)", "KC_SLSH",
+ "KC_P0" , "KC_BSPC" , "LT(7,KC_SPC)" , "KC_P1"
+ ],
+ [
+ "RM_TOGG" , "RM_NEXT" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "RM_SPDU" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS",
+ "KC_TRNS" , "KC_BTN2" , "KC_NO" , "KC_BTN1" , "KC_TRNS" , "KC_TRNS" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R",
+ "KC_TRNS" , "RM_PREV" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "RM_SPDD" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS"
+ ],
+ [
+ "KC_TRNS" , "KC_TRNS" , "KC_PGUP" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_LEFT" , "KC_UP" , "KC_DOWN" , "KC_RGHT" , "KC_TRNS" , "KC_TRNS" , "KC_LGUI" , "KC_NO" , "LCTL(KC_LALT)" , "LCA(KC_LSFT)",
+ "KC_TRNS" , "KC_HOME" , "KC_PGDN" , "KC_END" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS"
+ ],
+ [
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_UNDS" , "KC_PIPE" , "KC_QUOT" , "KC_TRNS",
+ "KC_CIRC" , "KC_ASTR" , "KC_AMPR" , "KC_NO" , "KC_TRNS" , "KC_HASH" , "KC_TILD" , "KC_SLSH" , "KC_DQUO" , "KC_DLR",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_MINS" , "KC_BSLS" , "KC_GRV" , "KC_TRNS",
+ "RM_PREV" , "KC_TRNS" , "KC_TRNS" , "RM_NEXT"
+ ],
+ [
+ "KC_TRNS" , "KC_COLN" , "KC_LT" , "KC_GT" , "KC_SCLN" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_LCBR" , "KC_RCBR" , "KC_LPRN" , "KC_RPRN" , "KC_AT" , "KC_TRNS" , "KC_NO" , "KC_EQL" , "KC_PLUS" , "KC_PERC",
+ "KC_TRNS" , "KC_EXLM" , "KC_LBRC" , "KC_RBRC" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_VOLD" , "KC_TRNS" , "KC_TRNS" , "KC_VOLU"
+ ],
+ [
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10",
+ "KC_TRNS" , "KC_NO" , "LCTL(KC_LALT)" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F4" , "KC_F5" , "KC_F6" , "KC_F11",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F1" , "KC_F2" , "KC_F3" , "KC_F12",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS"
+ ],
+ [
+ "KC_PSLS" , "KC_7" , "KC_8" , "KC_9" , "KC_PPLS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_0" , "KC_1" , "KC_2" , "KC_3" , "KC_PMNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_NO" , "KC_TRNS",
+ "KC_PAST" , "KC_4" , "KC_5" , "KC_6" , "KC_PEQL" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS"
+ ],
+ [
+ "KC_TRNS" , "KC_TRNS" , "KC_COLN" , "KC_ESC" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_DEL",
+ "KC_TRNS" , "KC_PERC" , "KC_SLSH" , "KC_ENT" , "KC_TRNS" , "DF(1)" , "KC_LGUI" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS",
+ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_EXLM" , "KC_TRNS" , "DF(0)" , "KC_TRNS" , "RALT_T(KC_COMM)", "RCTL_T(KC_DOT)", "QK_BOOT",
+ "KC_TRNS" , "KC_TAB" , "KC_NO" , "KC_TRNS"
+ ]
+ ],
+ "config": {
+ "mousekey": {
+ "interval": 16,
+ "time_to_max": 40,
+ "delay": 100,
+ "wheel_delay": 100
+ },
+ "tapping": {
+ "term": 200,
+ "permissive_hold": true,
+ "force_hold": true
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md b/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md
new file mode 100644
index 0000000000..dcdc6b3aa1
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md
@@ -0,0 +1,142 @@
+# Halcyon Ferris's Default Keymap
+_This keymap is a copy of the [Ferris default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ferris/keymaps/default), with the addition of RGB modifier keys._
+
+A usable default keymap for the Ferris keyboard
+===============================================
+
+Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user.
+
+This keymap makes heavy use of keys behaving differently when tapped and held, so that all the keys one may need remain accessible despite the low number of thumb keys.
+
+It comes with a number of layers to give access to most of the keys one may need on a keyboard. It is not meant to be the best possible keymap, but rather a good base on which to build a keymap that works for you.
+
+This is not the only way to make 34 keys a comfortable typing experience, but it is one way to do so. If you don't already know of a better way, this may be as good a starting point as any :)
+
+Note that this keymap was built from the perspective that it is OK to take a steep learning curve if it results in a keymap that is easier to use in the long run. This means that it may take more effort to learn this keymap than some alternatives. "Easy to use" was assessed against the workflow of the author, so your mileage may vary on some of the details.
+
+What do all these layers do?
+----------------------------
+
+### Layer 0: Base layer
+
+![Layer 0](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer0.png)
+
+On tapping the keys, our base layer is qwerty with space on the right homing thumb and backspace on the left homing thumb.
+
+In this layer, the non-homing-thumb positions have 0 and 1. I recommend modifying this to some frequently accessed shortcut such as copy/paste, previous/next tab or anything that makes most sense in your own workflow. O and 1 are place-holders and make it easy to troubleshoot that all keys are working properly before soldering in the switches.
+The reason I recommend convenience shortcuts instead of more commonly used keys like tab or meta is that unhoming of the thumbs was a frequent source of typos for me when I used more than one thumb key frequently in the context of typing.
+
+Despite being missing on this layer, "meta", "tab", "esc" and such are accessible from any other layer: see Layer 7.
+
+The behaviour of some keys differ when held:
+* Both homing pinkies behave as shift.
+* Both bottom-row ring fingers behave as ctrl.
+* Both bottom-row middle fingers behave as alt.
+
+* The homing left ring finger gives access to the Function keys layer
+* The homing right ring finger gives access to the Numbers layer
+* The homing left middle finger gives access to the Mouse layer
+* The homing right middle finger gives access to the Navigation layer
+* The homing left index finger gives access to the Right symbols layer
+* The homing right index finger gives access to the Left symbols layer
+* The homing right thumb gives access to the Always accessible layer
+
+### Layer 1: Mouse
+
+![Layer 1](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer1.png)
+
+Layer 1 is a mouse layer: it can be used one-handed or two-handed. The most common way to use it is two handed, with left and right click on the homerow of the left hand and directions on the homerow of the right hand.
+Scrolling is available on the right hand with mid finger up and down for vertical scroll and index and ring finger down for horizontal scroll.
+On the right hand, left click and right click are also available with index and ring finger up to allow one handed operation. This can be particularly handy when enabling the mouse layer permanently (no need to hold the left middle finger), which can be done from Layer 7.
+
+**Addition**: The Halcyon Ferris allows the RGB settings to be modified on this layer. This is an extra feature over the default Ferris keymap.
+
+### Layer 2: Navigation
+
+![Layer 2](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer2.png)
+
+The navigation layer somewhat mirrors the mouse layer. It is accessed by holding the right middle finger and gives access to arrow keys on the left homerow. Page up and down, Home and End mirror the vertical scrolling and horizontal scrolling on the mouse layer.
+
+On the right hand, in addition to ctrl and alt which are available through transparency, ctrl + alt, ctrl + alt + shift and meta are accessible on the homerow to enable common shortcuts in some window managers. This part is quite workflow dependent, so make sure to adapt it to your own workflow as appropriate.
+
+### Layer 3: Right symbols
+
+![Layer 3](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer3.png)
+
+When holding down the left index, one may access about half of the symbols. The pinkies store `^` and `$` symbols that represent begin and end in vim. The left homerow hosts `*` and `&`, symbols which are related in the way that they represent some form of indirection in programming languages such as rust. On the right hand, most symbols used when navigating the command line are stored together, organized by columns of related symbols.
+
+### Layer 4: Left symbols
+
+![Layer 4](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer4.png)
+
+When holding down the right index, one may access the other symbols. On the left hand, most of the different brackets are laid out. The most frequent ones (round brackets and curly brackets) get a spot on the homerow. The rest of the layer hosts the remaining symbols that are easier to access here than on any other layers.
+
+### Layer 5: Function keys
+
+![Layer 5](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer5.png)
+
+By holding down the left ring finger, one may access the function keys, roughly in a numpad layout.
+This means that alt+F4 is easy to type, with F4 being on the homerow.
+There is a shortcut for ctrl+alt on the left hand to enable convenient switching between virtual terminals on Linux.
+
+### Layer 6: Numbers
+
+![Layer 6](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer6.png)
+
+The number layer is accessed by holding the right ring finger. It hosts the numbers and some duplicated symbols that are commonly accessed next to numbers, such as mathematical operators.
+The number are layed out similarly to a numpad, but with the middle row and the homerow swapped so that the most used numbers: 0, 1, 2 and 3 are all available in homing positions.
+
+### Layer 7: Always accessible
+
+![Layer 7](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer7.png)
+
+Layer 7 is accessed by holding the right homing thumb down. Because this position is left transparent from every other layer, this layer is always accessible.
+It gives access to some essential keys that would typically be accessed on a thumb cluster or pinkies, such as meta, enter, tab, esc and delete.
+
+As the layer hosting esc, we duplicated some symbols here to allow for fast navigation in vim. For instance, esc, :, w, q can be done in a single roll.
+
+Where is the keymap.c?
+----------------------
+
+The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system.
+
+This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface.
+
+How do I edit and update the keymap?
+------------------------------------
+
+The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard.
+
+To edit it, you may:
+* Edit it directly from a text editor.
+* Edit it from the QMK Configurator.
+
+If you decide to use the latter workflow, here are the steps to follow:
+
+* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/ferris/rev1/LAYOUT_split_3x5_2), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it).
+* Browse to the location of your keymap (for example, `<your qmk repo>/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json`)
+* Perform any modification to the keymap in the web UI
+* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it)
+* Replace your original keymap with the one you just downloaded
+
+I want to do more than the JSON format supports!
+-------------------------------------------------
+
+While the `json` format is easy to use, it does lack certain functionality.
+
+To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation.
+
+First, from the root of your qmk repo, move to your keymap folder
+
+```bash
+cd ./keyboards/splitkb/halcyon/ferris/keymaps/my_personal_keymap
+```
+
+Next, convert your `keymap.json` to a `keymap.c`
+
+```bash
+qmk json2c -o keymap.c keymap.json
+```
+
+You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both!
+**If a JSON file is present, the C file is ignored.**
diff --git a/keyboards/splitkb/halcyon/ferris/readme.md b/keyboards/splitkb/halcyon/ferris/readme.md
new file mode 100755
index 0000000000..c19a8b16db
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/readme.md
@@ -0,0 +1,31 @@
+# Halcyon Ferris
+
+![splitkb/halcyon/ferris](https://i.imgur.com/TlgU8iR.png)
+
+The Halcyon Ferris rev1 is the first Ferris revision and the fifth keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights:
+
+- Halcyon keyboards come preassembled! You won't need a soldering iron.
+- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules.
+- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases.
+- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C.
+- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO!
+- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing.
+
+* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com)
+* Hardware Availability: [splitkb.com](https://splitkb.com).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitkb/halcyon/ferris/rev1:default
+
+The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive.
+
+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).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port.
+* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available.
diff --git a/keyboards/splitkb/halcyon/ferris/rev1/config.h b/keyboards/splitkb/halcyon/ferris/rev1/config.h
new file mode 100755
index 0000000000..b5cd6f95f2
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/rev1/config.h
@@ -0,0 +1,32 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Make it easier to enter the bootloader
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+// UART1, communication between the two halves
+#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+#define SERIAL_USART_TX_PIN GP28 // USART TX pin
+#define SERIAL_USART_RX_PIN GP29 // USART RX pin
+#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver
+
+// VBUS detection
+#define USB_VBUS_PIN GP1
+
+//// VIK
+
+// GPIO1 = GP27
+// GPIO2 = GP26
+// CS = GP13
+
+#define I2C_DRIVER I2C0
+#define I2C1_SDA_PIN GP16
+#define I2C1_SCL_PIN GP17
+
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP14
+#define SPI_MOSI_PIN GP15
+#define SPI_MISO_PIN GP12
diff --git a/keyboards/splitkb/halcyon/ferris/rev1/halconf.h b/keyboards/splitkb/halcyon/ferris/rev1/halconf.h
new file mode 100644
index 0000000000..a6937ddf9d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/rev1/halconf.h
@@ -0,0 +1,11 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+//// VIK
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json b/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json
new file mode 100755
index 0000000000..4cd0b23f4c
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json
@@ -0,0 +1,142 @@
+{
+ "keyboard_name": "Halcyon Ferris rev1",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP8", "GP6", "GP5", "GP9", "GP4"],
+ "rows": ["GP10", "GP25", "GP7", "GP11"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"flags": 2, "x": 71, "y": 15},
+ {"flags": 2, "x": 51, "y": 8},
+ {"flags": 2, "x": 10, "y": 13},
+ {"flags": 2, "x": 10, "y": 42},
+ {"flags": 2, "x": 41, "y": 45},
+ {"flags": 2, "x": 76, "y": 50},
+ {"flags": 4, "matrix": [0, 4], "x": 0, "y": 15},
+ {"flags": 4, "matrix": [0, 3], "x": 20, "y": 5},
+ {"flags": 4, "matrix": [0, 2], "x": 41, "y": 0},
+ {"flags": 4, "matrix": [0, 1], "x": 61, "y": 4},
+ {"flags": 4, "matrix": [0, 0], "x": 81, "y": 7},
+ {"flags": 4, "matrix": [1, 4], "x": 0, "y": 31},
+ {"flags": 4, "matrix": [1, 3], "x": 20, "y": 21},
+ {"flags": 4, "matrix": [1, 2], "x": 41, "y": 16},
+ {"flags": 4, "matrix": [1, 1], "x": 61, "y": 20},
+ {"flags": 4, "matrix": [1, 0], "x": 81, "y": 23},
+ {"flags": 4, "matrix": [2, 4], "x": 0, "y": 47},
+ {"flags": 4, "matrix": [2, 3], "x": 20, "y": 37},
+ {"flags": 4, "matrix": [2, 2], "x": 41, "y": 32},
+ {"flags": 4, "matrix": [2, 1], "x": 61, "y": 36},
+ {"flags": 4, "matrix": [2, 0], "x": 81, "y": 39},
+ {"flags": 4, "matrix": [3, 1], "x": 71, "y": 60},
+ {"flags": 4, "matrix": [3, 0], "x": 92, "y": 64},
+ {"flags": 2, "x": 150, "y": 15},
+ {"flags": 2, "x": 190, "y": 8},
+ {"flags": 2, "x": 210, "y": 13},
+ {"flags": 2, "x": 220, "y": 42},
+ {"flags": 2, "x": 183, "y": 45},
+ {"flags": 2, "x": 155, "y": 50},
+ {"flags": 4, "matrix": [4, 0], "x": 143, "y": 7},
+ {"flags": 4, "matrix": [4, 1], "x": 163, "y": 4},
+ {"flags": 4, "matrix": [4, 2], "x": 183, "y": 0},
+ {"flags": 4, "matrix": [4, 3], "x": 204, "y": 5},
+ {"flags": 4, "matrix": [4, 4], "x": 224, "y": 15},
+ {"flags": 4, "matrix": [5, 0], "x": 143, "y": 23},
+ {"flags": 4, "matrix": [5, 1], "x": 163, "y": 20},
+ {"flags": 4, "matrix": [5, 2], "x": 183, "y": 16},
+ {"flags": 4, "matrix": [5, 3], "x": 204, "y": 21},
+ {"flags": 4, "matrix": [5, 4], "x": 224, "y": 31},
+ {"flags": 4, "matrix": [6, 0], "x": 143, "y": 39},
+ {"flags": 4, "matrix": [6, 1], "x": 163, "y": 36},
+ {"flags": 4, "matrix": [6, 2], "x": 183, "y": 32},
+ {"flags": 4, "matrix": [6, 3], "x": 204, "y": 37},
+ {"flags": 4, "matrix": [6, 4], "x": 224, "y": 47},
+ {"flags": 4, "matrix": [7, 0], "x": 132, "y": 64},
+ {"flags": 4, "matrix": [7, 1], "x": 153, "y": 60}
+ ],
+ "max_brightness": 128,
+ "sleep": true,
+ "split_count": [23, 23]
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP20"
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP8", "GP25", "GP7", "GP4", "GP9"],
+ "rows": ["GP6", "GP5", "GP10", "GP11"]
+ }
+ },
+ "serial": {
+ "driver": "vendor"
+ },
+ "transport": {
+ "sync": {
+ "matrix_state": true
+ }
+ }
+ },
+ "usb": {
+ "pid": "0xE050"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP3"
+ }
+}
diff --git a/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h b/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h
new file mode 100644
index 0000000000..126697a4a0
--- /dev/null
+++ b/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h
@@ -0,0 +1,14 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+//// VIK
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/splitkb/halcyon/kyria/rev4/halconf.h b/keyboards/splitkb/halcyon/kyria/rev4/halconf.h
index 1050ebf313..6d2db1bbd2 100644
--- a/keyboards/splitkb/halcyon/kyria/rev4/halconf.h
+++ b/keyboards/splitkb/halcyon/kyria/rev4/halconf.h
@@ -6,9 +6,6 @@
//// VIK
#define HAL_USE_I2C TRUE
-
#define HAL_USE_SPI TRUE
-#define SPI_USE_WAIT TRUE
-#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
#include_next <halconf.h> \ No newline at end of file
diff --git a/keyboards/splitkb/halcyon/lily58/info.json b/keyboards/splitkb/halcyon/lily58/info.json
new file mode 100755
index 0000000000..178527f838
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/info.json
@@ -0,0 +1,73 @@
+{
+ "manufacturer": "splitkb.com",
+ "maintainer": "splitkb.com",
+ "url": "https://splitkb.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x8D1D"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label": "L01", "matrix": [0, 0], "x": 0, "y": 0.5},
+ {"label": "L02", "matrix": [0, 1], "x": 1, "y": 0.375},
+ {"label": "L03", "matrix": [0, 2], "x": 2, "y": 0.125},
+ {"label": "L04", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "L05", "matrix": [0, 4], "x": 4, "y": 0.125},
+ {"label": "L06", "matrix": [0, 5], "x": 5, "y": 0.25},
+ {"label": "R06", "matrix": [5, 5], "x": 10.5, "y": 0.25},
+ {"label": "R05", "matrix": [5, 4], "x": 11.5, "y": 0.125},
+ {"label": "R04", "matrix": [5, 3], "x": 12.5, "y": 0},
+ {"label": "R03", "matrix": [5, 2], "x": 13.5, "y": 0.125},
+ {"label": "R02", "matrix": [5, 1], "x": 14.5, "y": 0.375},
+ {"label": "R01", "matrix": [5, 0], "x": 15.5, "y": 0.5},
+ {"label": "L07", "matrix": [1, 0], "x": 0, "y": 1.5},
+ {"label": "L08", "matrix": [1, 1], "x": 1, "y": 1.375},
+ {"label": "L09", "matrix": [1, 2], "x": 2, "y": 1.125},
+ {"label": "L10", "matrix": [1, 3], "x": 3, "y": 1},
+ {"label": "L11", "matrix": [1, 4], "x": 4, "y": 1.125},
+ {"label": "L12", "matrix": [1, 5], "x": 5, "y": 1.25},
+ {"label": "R12", "matrix": [6, 5], "x": 10.5, "y": 1.25},
+ {"label": "R11", "matrix": [6, 4], "x": 11.5, "y": 1.125},
+ {"label": "R10", "matrix": [6, 3], "x": 12.5, "y": 1},
+ {"label": "R09", "matrix": [6, 2], "x": 13.5, "y": 1.125},
+ {"label": "R08", "matrix": [6, 1], "x": 14.5, "y": 1.375},
+ {"label": "R07", "matrix": [6, 0], "x": 15.5, "y": 1.5},
+ {"label": "L13", "matrix": [2, 0], "x": 0, "y": 2.5},
+ {"label": "L14", "matrix": [2, 1], "x": 1, "y": 2.375},
+ {"label": "L15", "matrix": [2, 2], "x": 2, "y": 2.125},
+ {"label": "L16", "matrix": [2, 3], "x": 3, "y": 2},
+ {"label": "L17", "matrix": [2, 4], "x": 4, "y": 2.125},
+ {"label": "L18", "matrix": [2, 5], "x": 5, "y": 2.25},
+ {"label": "R18", "matrix": [7, 5], "x": 10.5, "y": 2.25},
+ {"label": "R17", "matrix": [7, 4], "x": 11.5, "y": 2.125},
+ {"label": "R16", "matrix": [7, 3], "x": 12.5, "y": 2},
+ {"label": "R15", "matrix": [7, 2], "x": 13.5, "y": 2.125},
+ {"label": "R14", "matrix": [7, 1], "x": 14.5, "y": 2.375},
+ {"label": "R13", "matrix": [7, 0], "x": 15.5, "y": 2.5},
+ {"label": "L20", "matrix": [3, 0], "x": 0, "y": 3.5},
+ {"label": "L21", "matrix": [3, 1], "x": 1, "y": 3.375},
+ {"label": "L22", "matrix": [3, 2], "x": 2, "y": 3.125},
+ {"label": "L23", "matrix": [3, 3], "x": 3, "y": 3},
+ {"label": "L24", "matrix": [3, 4], "x": 4, "y": 3.125},
+ {"label": "L25", "matrix": [3, 5], "x": 5, "y": 3.25},
+ {"label": "L19", "matrix": [4, 1], "x": 6, "y": 2.75},
+ {"label": "R19", "matrix": [9, 1], "x": 9.5, "y": 2.75},
+ {"label": "R25", "matrix": [8, 5], "x": 10.5, "y": 3.25},
+ {"label": "R24", "matrix": [8, 4], "x": 11.5, "y": 3.125},
+ {"label": "R23", "matrix": [8, 3], "x": 12.5, "y": 3},
+ {"label": "R22", "matrix": [8, 2], "x": 13.5, "y": 3.125},
+ {"label": "R21", "matrix": [8, 1], "x": 14.5, "y": 3.375},
+ {"label": "R20", "matrix": [8, 0], "x": 15.5, "y": 3.5},
+ {"label": "L26", "matrix": [4, 2], "x": 2.5, "y": 4.15},
+ {"label": "L27", "matrix": [4, 3], "x": 3.5, "y": 4.15},
+ {"label": "L28", "matrix": [4, 4], "x": 4.5, "y": 4.25},
+ {"label": "L29", "matrix": [4, 5], "x": 6, "y": 4.25},
+ {"label": "R29", "matrix": [9, 5], "x": 9.5, "y": 4.25},
+ {"label": "R28", "matrix": [9, 4], "x": 11, "y": 4.25},
+ {"label": "R27", "matrix": [9, 3], "x": 12, "y": 4.15},
+ {"label": "R26", "matrix": [9, 2], "x": 13, "y": 4.15}
+ ]
+ }
+ }
+}
diff --git a/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json
new file mode 100644
index 0000000000..05c4d89bcc
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json
@@ -0,0 +1,47 @@
+{
+ "keyboard": "splitkb/halcyon/lily58/rev2",
+ "keymap": "default",
+ "version": 1,
+ "layout": "LAYOUT",
+ "layers": [
+ [
+ "KC_ESC" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "KC_GRV" ,
+ "KC_TAB" , "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P" , "KC_MINS",
+ "KC_LCTL", "KC_A" , "KC_S" , "KC_D" , "KC_F" , "KC_G" , "KC_H" , "KC_J" , "KC_K" , "KC_L" , "KC_SCLN", "KC_QUOT",
+ "KC_LSFT", "KC_Z" , "KC_X" , "KC_C" , "KC_V" , "KC_B" , "KC_LBRC", "KC_RBRC", "KC_N" , "KC_M" , "KC_COMM", "KC_DOT" , "KC_SLSH", "KC_RSFT",
+ "KC_LALT", "KC_LGUI", "MO(1)" , "KC_SPC" , "KC_ENT" , "MO(2)" , "KC_BSPC", "KC_RGUI"
+ ],
+ [
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______",
+ "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_GRV" , "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "KC_TILD",
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "XXXXXXX", "KC_UNDS", "KC_PLUS", "KC_LCBR", "KC_RCBR", "KC_PIPE",
+ "_______", "_______", "_______", "_______", "_______", "MO(3)" , "_______", "_______"
+ ],
+ [
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______",
+ "KC_GRV" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "_______",
+ "KC_F1" , "KC_F2" , "KC_F3" , "KC_F4" , "KC_F5" , "KC_F6" , "XXXXXXX", "KC_LEFT", "KC_DOWN", "KC_UP" , "KC_RGHT", "XXXXXXX",
+ "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10" , "KC_F11" , "KC_F12" , "_______", "_______", "KC_PLUS", "KC_MINS", "KC_EQL" , "KC_LBRC", "KC_RBRC", "KC_BSLS",
+ "_______", "_______", "MO(3)" , "_______", "_______", "_______", "_______", "_______"
+ ],
+ [
+ "QK_BOOT", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX",
+ "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX",
+ "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RM_TOGG", "RM_HUEU", "RM_SATU", "RM_VALU",
+ "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RM_NEXT", "RM_HUED", "RM_SATD", "RM_VALD",
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______"
+ ]
+ ],
+ "config": {
+ "features": {
+ "encoder_map": true
+ }
+ },
+ "encoders": [
+ [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}, {"ccw": "KC_PGUP", "cw": "KC_PGDN"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}],
+ [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}]
+ ]
+}
diff --git a/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md b/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md
new file mode 100644
index 0000000000..d186641d1c
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md
@@ -0,0 +1,88 @@
+# Halcyon Lily58's Default Keymap
+_This keymap is a copy of the [Lily58 default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/lily58/keymaps/default), with slight modifications._
+
+A simple default keymap for the Halcyon Lily58
+=============================================
+
+Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user. We hope this keymap serves as a good starting point for your own - although it should be fairly usable out-of-the-box.
+
+What do all these layers do?
+----------------------------
+
+### Layer 0: Base layer
+
+![Layer 0](https://i.imgur.com/sq8Rql7h.png)
+
+This is where your basic letters live.
+
+The homing thumb fingers are used to access the different layers.
+
+* The homing left thumb finger gives access to the Symbols (or lower) layer
+* The homing right thumb finger gives access to the Navigation (or raise) layer
+* Pressing both homing thumb fingers gives access to the Adjust layer
+
+### Layer 1: Lower
+
+![Layer 1](https://i.imgur.com/baSE2OJh.png)
+
+The Lower layer gives access to the F keys on the second row, and shifted number keys on the home row. It also provides some shifted symbol keys.
+
+### Layer 2: Raise
+
+![Layer 2](https://i.imgur.com/CRnDa6Nh.png)
+
+The Raise layer gives access the arrow keys on the right hand, in addition to some unshifted symbols. The left hand provides an alternative set of F keys, while the second row provides an alternative set of number keys.
+
+### Layer 3: Adjust
+
+![Layer 3](https://i.imgur.com/QbCiTcyh.png)
+
+The Adjust layer exposes RGB adjustment keys on the right hand.
+
+Where is the keymap.c?
+----------------------
+
+The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system.
+
+This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface.
+
+How do I edit and update the keymap?
+------------------------------------
+
+The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard.
+
+To edit it, you may:
+* Edit it directly from a text editor.
+* Edit it from the QMK Configurator.
+
+If you decide to use the latter workflow, here are the steps to follow:
+
+* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/lily58/rev2/LAYOUT), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it).
+* Browse to the location of your keymap (for example, `<your qmk repo>/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json`)
+* Perform any modification to the keymap in the web UI
+* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it)
+* Replace your original keymap with the one you just downloaded
+
+_**Note:** At the time of writing (the 24th of October 2022), not every feature used in the default keymap is supported by the QMK Configurator. You cannot yet upload the default `keymap.json` due to a file format mismatch - use the "Load Default" button to load the default keymap instead. Additionally, custom configuration options are still being worked on: if your keymap depends on them, please compile your firmware offline for now._
+
+I want to do more than the JSON format supports!
+-------------------------------------------------
+
+While the `json` format is easy to use, it does lack certain functionality - most notably custom OLED or encoder behaviour.
+
+To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation.
+
+First, from the root of your qmk repo, move to your keymap folder
+
+```bash
+cd ./keyboards/splitkb/halcyon/lily58/keymaps/my_personal_keymap
+```
+
+Next, convert your `keymap.json` to a `keymap.c`
+
+```bash
+qmk json2c -o keymap.c keymap.json
+```
+
+You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both!
+**If a JSON file is present, the C file is ignored.**
diff --git a/keyboards/splitkb/halcyon/lily58/readme.md b/keyboards/splitkb/halcyon/lily58/readme.md
new file mode 100755
index 0000000000..ec200fda15
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/readme.md
@@ -0,0 +1,31 @@
+# Halcyon Lily58
+
+![splitkb/halcyon/lily58](https://i.imgur.com/q7VIrbz.png)
+
+The Halcyon Lily58 rev2 is the second Lily58 revision and the fourth keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights:
+
+- Halcyon keyboards come preassembled! You won't need a soldering iron.
+- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules.
+- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases.
+- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C.
+- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO!
+- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing.
+
+* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com)
+* Hardware Availability: [splitkb.com](https://splitkb.com).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitkb/halcyon/lily58/rev2:default
+
+The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive.
+
+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).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port.
+* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available.
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/config.h b/keyboards/splitkb/halcyon/lily58/rev2/config.h
new file mode 100755
index 0000000000..b5cd6f95f2
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/config.h
@@ -0,0 +1,32 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// Make it easier to enter the bootloader
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+// UART1, communication between the two halves
+#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+#define SERIAL_USART_TX_PIN GP28 // USART TX pin
+#define SERIAL_USART_RX_PIN GP29 // USART RX pin
+#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver
+
+// VBUS detection
+#define USB_VBUS_PIN GP1
+
+//// VIK
+
+// GPIO1 = GP27
+// GPIO2 = GP26
+// CS = GP13
+
+#define I2C_DRIVER I2C0
+#define I2C1_SDA_PIN GP16
+#define I2C1_SCL_PIN GP17
+
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP14
+#define SPI_MOSI_PIN GP15
+#define SPI_MISO_PIN GP12
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/halconf.h b/keyboards/splitkb/halcyon/lily58/rev2/halconf.h
new file mode 100644
index 0000000000..a6937ddf9d
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/halconf.h
@@ -0,0 +1,11 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+//// VIK
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json b/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json
new file mode 100755
index 0000000000..76bb538388
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json
@@ -0,0 +1,170 @@
+{
+ "keyboard_name": "Halcyon Lily58 rev2",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP23", "pin_b": "GP22", "resolution": 2}
+ ]
+ },
+ "features": {
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP8", "GP11", "GP7", "GP6", "GP5", "GP10"],
+ "rows": ["GP19", "GP20", "GP25", "GP4", "GP9"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"x": 51, "y": 13, "flags": 2},
+ {"x": 22, "y": 18, "flags": 2},
+ {"x": 22, "y": 53, "flags": 2},
+ {"x": 58, "y": 60, "flags": 2},
+ {"x": 87, "y": 56, "flags": 2},
+ {"matrix": [0, 0], "x": 0, "y": 8, "flags": 4},
+ {"matrix": [0, 1], "x": 14, "y": 6, "flags": 4},
+ {"matrix": [0, 2], "x": 29, "y": 2, "flags": 4},
+ {"matrix": [0, 3], "x": 43, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 58, "y": 2, "flags": 4},
+ {"matrix": [0, 5], "x": 72, "y": 4, "flags": 4},
+ {"matrix": [1, 0], "x": 0, "y": 23, "flags": 4},
+ {"matrix": [1, 1], "x": 14, "y": 21, "flags": 4},
+ {"matrix": [1, 2], "x": 29, "y": 17, "flags": 4},
+ {"matrix": [1, 3], "x": 43, "y": 15, "flags": 4},
+ {"matrix": [1, 4], "x": 58, "y": 17, "flags": 4},
+ {"matrix": [1, 5], "x": 72, "y": 19, "flags": 4},
+ {"matrix": [2, 0], "x": 0, "y": 38, "flags": 4},
+ {"matrix": [2, 1], "x": 14, "y": 36, "flags": 4},
+ {"matrix": [2, 2], "x": 29, "y": 32, "flags": 4},
+ {"matrix": [2, 3], "x": 43, "y": 30, "flags": 4},
+ {"matrix": [2, 4], "x": 58, "y": 32, "flags": 4},
+ {"matrix": [2, 5], "x": 72, "y": 34, "flags": 4},
+ {"matrix": [3, 0], "x": 0, "y": 53, "flags": 4},
+ {"matrix": [3, 1], "x": 14, "y": 51, "flags": 4},
+ {"matrix": [3, 2], "x": 29, "y": 47, "flags": 4},
+ {"matrix": [3, 3], "x": 43, "y": 45, "flags": 4},
+ {"matrix": [3, 4], "x": 58, "y": 47, "flags": 4},
+ {"matrix": [3, 5], "x": 72, "y": 49, "flags": 4},
+ {"matrix": [4, 1], "x": 87, "y": 41, "flags": 4},
+ {"matrix": [4, 2], "x": 36, "y": 62, "flags": 4},
+ {"matrix": [4, 3], "x": 51, "y": 62, "flags": 4},
+ {"matrix": [4, 4], "x": 65, "y": 64, "flags": 4},
+ {"matrix": [4, 5], "x": 87, "y": 64, "flags": 4},
+ {"x": 173, "y": 13, "flags": 2},
+ {"x": 202, "y": 18, "flags": 2},
+ {"x": 202, "y": 53, "flags": 2},
+ {"x": 166, "y": 60, "flags": 2},
+ {"x": 137, "y": 56, "flags": 2},
+ {"matrix": [5, 5], "x": 152, "y": 4, "flags": 4},
+ {"matrix": [5, 4], "x": 166, "y": 2, "flags": 4},
+ {"matrix": [5, 3], "x": 181, "y": 0, "flags": 4},
+ {"matrix": [5, 2], "x": 195, "y": 2, "flags": 4},
+ {"matrix": [5, 1], "x": 210, "y": 6, "flags": 4},
+ {"matrix": [5, 0], "x": 224, "y": 8, "flags": 4},
+ {"matrix": [6, 5], "x": 152, "y": 19, "flags": 4},
+ {"matrix": [6, 4], "x": 166, "y": 17, "flags": 4},
+ {"matrix": [6, 3], "x": 181, "y": 15, "flags": 4},
+ {"matrix": [6, 2], "x": 195, "y": 17, "flags": 4},
+ {"matrix": [6, 1], "x": 210, "y": 21, "flags": 4},
+ {"matrix": [6, 0], "x": 224, "y": 23, "flags": 4},
+ {"matrix": [7, 5], "x": 152, "y": 34, "flags": 4},
+ {"matrix": [7, 4], "x": 166, "y": 32, "flags": 4},
+ {"matrix": [7, 3], "x": 181, "y": 30, "flags": 4},
+ {"matrix": [7, 2], "x": 195, "y": 32, "flags": 4},
+ {"matrix": [7, 1], "x": 210, "y": 36, "flags": 4},
+ {"matrix": [7, 0], "x": 224, "y": 38, "flags": 4},
+ {"matrix": [9, 1], "x": 137, "y": 41, "flags": 4},
+ {"matrix": [8, 5], "x": 152, "y": 49, "flags": 4},
+ {"matrix": [8, 4], "x": 166, "y": 47, "flags": 4},
+ {"matrix": [8, 3], "x": 181, "y": 45, "flags": 4},
+ {"matrix": [8, 2], "x": 195, "y": 47, "flags": 4},
+ {"matrix": [8, 1], "x": 210, "y": 51, "flags": 4},
+ {"matrix": [8, 0], "x": 224, "y": 53, "flags": 4},
+ {"matrix": [9, 5], "x": 137, "y": 64, "flags": 4},
+ {"matrix": [9, 4], "x": 159, "y": 64, "flags": 4},
+ {"matrix": [9, 3], "x": 173, "y": 62, "flags": 4},
+ {"matrix": [9, 2], "x": 188, "y": 62, "flags": 4}
+ ],
+ "max_brightness": 128,
+ "sleep": true,
+ "split_count": [34, 34]
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP24"
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP4", "GP9", "GP10", "GP5", "GP6", "GP8"],
+ "rows": ["GP19", "GP20", "GP25", "GP7", "GP11"]
+ }
+ },
+ "serial": {
+ "driver": "vendor"
+ },
+ "transport": {
+ "sync": {
+ "matrix_state": true
+ }
+ }
+ },
+ "usb": {
+ "pid": "0xEA1D"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP3"
+ }
+}
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h b/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h
new file mode 100644
index 0000000000..126697a4a0
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h
@@ -0,0 +1,14 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+//// VIK
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/splitkb/halcyon/lily58/rev2/rev2.c b/keyboards/splitkb/halcyon/lily58/rev2/rev2.c
new file mode 100644
index 0000000000..e0a64ae9a4
--- /dev/null
+++ b/keyboards/splitkb/halcyon/lily58/rev2/rev2.c
@@ -0,0 +1,28 @@
+// Copyright 2025 splitkb.com ([email protected])
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+ if (!encoder_update_user(index, clockwise)) {
+ return false;
+ }
+ if (index == 0) {
+ // Volume control
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 1) {
+ // Page up/Page down
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ }
+ return false;
+}
+#endif