Skip to content

Conversation

@petejohanson
Copy link
Contributor

@petejohanson petejohanson commented Jan 14, 2025

Opening this as a draft for now, pending more extensive testing, documentation, etc.

I've tested this with a very basic ZMK Uno setup, but nothing extensive dailying on a keyboard, etc.

Preview docs: https://deploy-preview-2766--zmk.netlify.app/docs/config/split#wired-splits

Has gotten a fair amount of testing at this point, so moving this out of Draft.

PR check-list

  • Branch has a clean commit history
  • Additional tests are included, if changing behaviors/core code that is testable.
  • Proper Copyright + License headers added to applicable files (Generally, we stick to "The ZMK Contributors" for copyrights to help avoid churn when files get edited)
  • Pre-commit used to check formatting of files, commit messages, etc.
  • Includes any necessary documentation changes.

Other To-Dos

  • Investigate report of stuck/broken taps on peripheral Cirque. Recovered by restarting left side only.
  • Address stack size issues for RP2040 exacerbated by this PR?

@petejohanson petejohanson added enhancement New feature or request split labels Jan 14, 2025
@petejohanson petejohanson self-assigned this Jan 14, 2025
@petejohanson petejohanson force-pushed the split/wired-split-first-pass branch 6 times, most recently from ffd742c to 47b7001 Compare January 17, 2025 22:07
@petejohanson petejohanson force-pushed the split/wired-split-first-pass branch from 45d95af to be7ded8 Compare January 21, 2025 23:52
@petejohanson petejohanson force-pushed the split/wired-split-first-pass branch from 3fea122 to 6baa960 Compare February 1, 2025 03:54
@caksoylar
Copy link
Contributor

Related: #1110.

@petejohanson petejohanson force-pushed the split/wired-split-first-pass branch 5 times, most recently from 64ce23f to acd57d2 Compare February 10, 2025 18:32
Copy link
Contributor

@nmunnich nmunnich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple of notes on the first commit. Haven't dealt with the split ble code bits enough to be a trustworthy reviewer there, but those bits look fine at a glance.

Not looked at the second commit at all.

}
}

int zmk_split_central_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
int zmk_split_central_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding,
int zmk_split_central_invoke_behavior(uint8_t target, struct zmk_behavior_binding *binding,

Minor suggestion, but I just remembered thinking the other day that this name for this variable (and similar variables in functions around the transport) would be nicer. Feel free to ignore and hit resolve.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm on the fence on this one... It requires just a tad bit more mental load to understand source/target are the same thing, just from different perspectives, but I can see where you are coming from. Leaving unresolved for now to sleep on it. Thanks.

@petejohanson petejohanson force-pushed the split/wired-split-first-pass branch 3 times, most recently from b365a19 to c10e8fe Compare February 14, 2025 22:51
@petejohanson petejohanson marked this pull request as ready for review February 14, 2025 22:56
@petejohanson petejohanson requested review from a team as code owners February 14, 2025 22:56
@petejohanson
Copy link
Contributor Author

Ok, taking this out of draft at this point, since it's gotten a fair amount of use and testing by myself and a few others. I just pushed some of the initial docs work as well, which needs review still.

Copy link
Contributor

@nmunnich nmunnich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor comments on the docs.

@petejohanson petejohanson force-pushed the split/wired-split-first-pass branch from f165bbd to c72ec43 Compare February 21, 2025 18:30
Copy link
Contributor

@nmunnich nmunnich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Last pair of minor queries from me. I think it's unlikely I'll notice any further things from looking at it more.

I will say I don't think this should be merged until we've had another release, which I consider #2729 to be a prerequisite for.

Copy link

@paulshir paulshir left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving comments here as opposed to discord as it's easier to point to the issues. Tested and debugged the latest changes in polling mode with a rpi pico. Events and commands working with the changes I commented on here.

@petejohanson petejohanson force-pushed the split/wired-split-first-pass branch from c00c7c6 to 4843ce1 Compare March 2, 2025 17:34
petejohanson and others added 4 commits March 17, 2025 19:21
Extract central/peripheral code to allow for plugging in alternate
transports, instead of tying all split logic to BT.
* Depends on full-duplex hardware UART for communication.
* Supports all existing central commands/peripheral events, including
  sensors/inputs from peripherals.
* Only one wired split peripheral supported (for now)
* Relies on chosen `zmk,split-uart` referencing the UART device.
Migrate split to its own dedicated config file, and add details
on wired split config.

Co-authored-by: Nicolas Munnich <[email protected]>
Move the system work queue stack size override on RP2040 ouf of
a `ZMK_BLE` conditional so it is properly applied generally for that
SoC.
@petejohanson petejohanson force-pushed the split/wired-split-first-pass branch from 8636724 to 6f7f599 Compare March 18, 2025 01:21
@petejohanson petejohanson merged commit 147c340 into zmkfirmware:main Mar 18, 2025
54 checks passed
@FearlessSpiff
Copy link
Contributor

FearlessSpiff commented Mar 18, 2025

This broke my unibody board. Had to fall back to 5ba7e26 for it to work again.
Unfortunatley I can't share my repo as I have other things there I need to fix first. Maybe it's just me?!

It was not even working over USB. Got some errors in dmesg when connecting it.

@nmunnich
Copy link
Contributor

This broke my unibody board. Had to fall back to 5ba7e26 for it to work again. Unfortunatley I can't share my repo as I have other things there I need to fix first. Maybe it's just me?!

It was not even working over USB. Got some errors in dmesg when connecting it.

Could you provide some details such as a repo link so that we can investigate?

@FearlessSpiff
Copy link
Contributor

I would love to but I pushed some "private" stuff which I first have to get rid of somehow.

@petejohanson
Copy link
Contributor Author

This broke my unibody board. Had to fall back to 5ba7e26 for it to work again. Unfortunatley I can't share my repo as I have other things there I need to fix first. Maybe it's just me?!

It was not even working over USB. Got some errors in dmesg when connecting it.

Can you share any high level details? What controller, etc?

@FearlessSpiff
Copy link
Contributor

FearlessSpiff commented Mar 18, 2025

Ok. Fixed it. I am using a Nicenano V2 and a cirque trackpad. But I removed all it's (trackpad) config when I looked for the problem. So here's the repo which works when using a commit before this one: https://github.com/FearlessSpiff/raveniung-zmk-config

Also what gets built with the actions is not working. So that's why I used a build locally.

And here is what dmesg told me:

 8511.628105] usb 7-1: device descriptor read/64, error -110
[ 8511.844931] usb 7-1: new full-speed USB device number 8 using xhci_hcd

@petejohanson
Copy link
Contributor Author

Ok. Fixed it. I am using a Nicenano V2 and a cirque trackpad. But I removed all it's (trackpad) config when I looked for the problem. So here's the repo which works when using a commit before this one: https://github.com/FearlessSpiff/raveniung-zmk-config

Just to be sure I understand here... Did this work on latest main if you remove the cirque bits?

Also what gets built with the actions is not working. So that's why I used a build locally.

And here is what dmesg told me:

 8511.628105] usb 7-1: device descriptor read/64, error -110
[ 8511.844931] usb 7-1: new full-speed USB device number 8 using xhci_hcd

I assume it's also not advertising/connecting over BT?

@FearlessSpiff
Copy link
Contributor

FearlessSpiff commented Mar 18, 2025

Ok. Fixed it. I am using a Nicenano V2 and a cirque trackpad. But I removed all it's (trackpad) config when I looked for the problem. So here's the repo which works when using a commit before this one: https://github.com/FearlessSpiff/raveniung-zmk-config

Just to be sure I understand here... Did this work on latest main if you remove the cirque bits?

No, it didn't. Sorry to be unclear. I also needed to go back from this change to make it work.

Also what gets built with the actions is not working. So that's why I used a build locally.
And here is what dmesg told me:

 8511.628105] usb 7-1: device descriptor read/64, error -110
[ 8511.844931] usb 7-1: new full-speed USB device number 8 using xhci_hcd

I assume it's also not advertising/connecting over BT?

Correct. Looked for it but there is no BT advertisement.

@petejohanson
Copy link
Contributor Author

@FearlessSpiff Reproduced here, and I just opened #2884 to fix this. Will merge as soon as the tests are all green. Sorry for the disruption.

@FearlessSpiff
Copy link
Contributor

Saw that #2884 got merged and can confirm it is working again for me. Thanks.

4pplet added a commit to 4pplet/zmk that referenced this pull request Apr 2, 2025
commit 905323e
Author: 4pplet <[email protected]>
Date:   Wed Apr 2 20:58:52 2025 +0200

    Update cyber60_rev_b.dts

commit 8f6beeb
Author: 4pplet <[email protected]>
Date:   Wed Apr 2 20:35:59 2025 +0200

    remove archives

commit fd86837
Author: 4pplet <[email protected]>
Date:   Wed Apr 2 20:35:13 2025 +0200

    studio support and new default behaviour

    - adding studio support for rev b-e
    - updating led and buzzer code

    changing default behaviour:
    - sleep on by default (45min)
    - buzzer disabled by default

commit acd53d4
Merge: a3c49e4 1c76bcb
Author: 4pplet <[email protected]>
Date:   Sun Mar 30 10:07:14 2025 +0200

    Merge remote-tracking branch 'upstream/main' into rev_e

commit a3c49e4
Merge: 214e1e4 d733fba
Author: 4pplet <[email protected]>
Date:   Fri Mar 28 15:09:28 2025 +0100

    Merge remote-tracking branch 'upstream/main' into rev_e

commit 1c76bcb
Author: Nicolas Munnich <[email protected]>
Date:   Tue Mar 25 19:20:50 2025 +0100

    blog: Add meeting notes from February (zmkfirmware#2890)

    Co-authored-by: Cem Aksoylar <[email protected]>

commit d733fba
Author: Cem Aksoylar <[email protected]>
Date:   Tue Mar 25 06:35:38 2025 -0700

    docs: Document missing user-defined input processors (zmkfirmware#2895)

commit 49f86f7
Author: Nicolas Munnich <[email protected]>
Date:   Mon Mar 24 02:12:50 2025 +0100

    docs: Update hold-tap page (zmkfirmware#2888)

    Co-authored-by: Cem Aksoylar <[email protected]>

commit 5bb39ec
Author: Pete Johanson <[email protected]>
Date:   Tue Mar 18 16:49:59 2025 -0600

    fix(split): Conditionally build all split code (zmkfirmware#2884)

    Don't add the split CMake subdirectory unless the feature is enabled.

commit 147c340
Author: Pete Johanson <[email protected]>
Date:   Tue Mar 18 00:48:32 2025 -0600

    Feature: Full-Duplex Wired Split (zmkfirmware#2766)

    refactor(split): Refactor split code for extension

    Extract central/peripheral code to allow for plugging in alternate
    transports, instead of tying all split logic to BT.

    feat(split): Add full-duplex wired split support

    * Depends on full-duplex hardware UART for communication.
    * Supports all existing central commands/peripheral events, including
      sensors/inputs from peripherals.
    * Only one wired split peripheral supported (for now)
    * Relies on chosen `zmk,split-uart` referencing the UART device.

    docs: Add wired split config docs.

    Migrate split to its own dedicated config file, and add details
    on wired split config.

    Co-authored-by: Nicolas Munnich <[email protected]>

    fix: Properly override stack size on RP2040

    Move the system work queue stack size override on RP2040 ouf of
    a `ZMK_BLE` conditional so it is properly applied generally for that
    SoC.

    ---------

    Co-authored-by: Nicolas Munnich <[email protected]>

commit 5ba7e26
Author: Genteure <[email protected]>
Date:   Tue Mar 18 06:15:57 2025 +0800

    docs: update name of XIAO boards (zmkfirmware#2869)

commit bffbccc
Author: Cem Aksoylar <[email protected]>
Date:   Sun Mar 16 20:47:42 2025 -0700

    chore(deps): npm update on docs (zmkfirmware#2878)

commit b366df8
Author: Cem Aksoylar <[email protected]>
Date:   Sun Mar 16 20:14:48 2025 -0700

    docs: Fix powershell tab in user setup (zmkfirmware#2879)

commit 4da89bd
Author: JJGadgets <[email protected]>
Date:   Sat Mar 15 14:25:01 2025 +0800

    fix(ci): pin tj-actions/changed-files due to compromise (zmkfirmware#2874)

    Ideally it's be swapped out for an alternative but for now this is to mitigate.

commit 214e1e4
Author: 4pplet <[email protected]>
Date:   Tue Mar 11 22:39:10 2025 +0100

    initial commit

commit 5d99204
Author: idesignstuff <[email protected]>
Date:   Mon Mar 10 23:52:30 2025 -0500

    Update container.mdx for clarity about ZMK repo folder location (zmkfirmware#2868)

commit f5a838b
Author: Cem Aksoylar <[email protected]>
Date:   Sun Mar 9 14:59:57 2025 -0700

    docs: Fix wakeup-source property location for composite kscan (zmkfirmware#2861)

commit eb170c9
Author: Allister MacLeod <[email protected]>
Date:   Fri Mar 7 21:22:25 2025 -0500

    feat(shields): Add physical layouts for tester_xiao and tester_pro_micro (zmkfirmware#2852)

    feat(shields): Add tester_xiao layouts

    Added two layouts for the XIAO tester shield:

     - Keys arranged to match the XIAO pinout, viewed from the front
     - Single row of eleven keys

    These layouts are abstractions since the tester_xiao shield may be
    used in a situation where the "keys" are actually jumper wires on a
    breadboard or the like.

    feat(shields): Add tester_pro_micro layouts

    Added two layouts for the Pro Micro tester shield:

     - Keys arranged to match the Pro Micro pinout, viewed from the front
     - Single row of eighteen keys

commit 241ff39
Author: Pete Johanson <[email protected]>
Date:   Sun Mar 2 07:45:12 2025 -0700

    chore(main): release 0.2.1 (zmkfirmware#2851)

commit f20e6ea
Author: Pete Johanson <[email protected]>
Date:   Sun Mar 2 06:49:07 2025 -0700

    fix(behaviors): Proper comma separated device list (zmkfirmware#2850)

    Properly generate the comma separated list of devs in caps word/
    key repeat.

commit fadafc7
Author: Pete Johanson <[email protected]>
Date:   Sat Mar 1 11:29:58 2025 -0700

    chore(main): release 0.2.0 (zmkfirmware#2693)

commit 1e3e62c
Author: Pete Johanson <[email protected]>
Date:   Fri Feb 28 18:37:55 2025 -0700

    fix(pointing): Temp layer threading protection. (zmkfirmware#2729)

    fix(pointing): Temp layer threading protection.

    Ensure all layer operations occur on the system work queue thread.

    Fixes: zmkfirmware#2719

    fix(pointing): Handle layer events to disable events

    Make the temp layer input processor propely handle layers getting
    deactivated externally before the temp layer timeout.

    Co-authored-by: Nicolas Munnich <[email protected]>

commit 21f54e7
Author: Pete Johanson <[email protected]>
Date:   Wed Feb 26 15:54:29 2025 -0700

    refactor(behaviors): Remove unneeded init funcs. (zmkfirmware#2843)

    Initialization functions are optional for Zephyr drivers, so remove
    all our superfluous empty init functions.

commit 7186528
Author: Cem Aksoylar <[email protected]>
Date:   Wed Feb 26 14:54:08 2025 -0800

    fix(behaviors): Make multiple sticky keys work on same key position (zmkfirmware#2758)

    test(behaviors): Add same position sticky key tests

    fix(behaviors): Make multiple sticky keys work on same key position

    refactor(behaviors): Remove unused param2 in sticky keys

commit 9406d39
Author: Pete Johanson <[email protected]>
Date:   Wed Feb 26 15:01:04 2025 -0700

    refactor(behaviors): Small caps word RAM reduction. (zmkfirmware#2842)

    Don't use lazy initialized in-memory array of devices.

commit 82216be
Author: Nicolas Munnich <[email protected]>
Date:   Wed Feb 26 21:16:50 2025 +0100

    chore: Add a deprecation warning to config/boards (zmkfirmware#2811)

commit ea267b0
Author: Xudong Zheng <[email protected]>
Date:   Wed Feb 26 13:29:30 2025 -0500

    fix(ble): enforce maximum length for dynamic device name (zmkfirmware#2784)

commit 2fe55c4
Author: Pete Johanson <[email protected]>
Date:   Wed Feb 26 11:17:23 2025 -0700

    refactor(behaviors): Minor RAM usage tweaks (zmkfirmware#2839)

    Follow up cleanup of some config structs not marked as const.

commit d2eb6de
Author: Cem Aksoylar <[email protected]>
Date:   Tue Feb 25 16:31:57 2025 -0800

    docs: Add query strings to tabs (zmkfirmware#2840)

commit 209085d
Author: Pete Johanson <[email protected]>
Date:   Tue Feb 25 12:12:27 2025 -0700

    refactor(behaviors): Add max-held tap-dance config (zmkfirmware#2838)

    refactor(behaviors): Add max-held tap-dance config

    Add new `CONFIG_ZMK_BEHAVIOR_TAP_DANCE_MAX_HELD` config for reducing RAM
    usage on more constrained devices.

    refactor(behaviors): Move defaults to Kconfig.defaults

commit 18d0d2f
Author: Pete Johanson <[email protected]>
Date:   Tue Feb 25 11:38:51 2025 -0700

    refactor(combos): Reduce combo RAM usage (zmkfirmware#2837)

    Properly mark combo configs as `const` so they are place in flash,
    not RAM.

commit 8575fc8
Author: Cem Aksoylar <[email protected]>
Date:   Mon Feb 17 15:59:54 2025 -0800

    docs: Inline simple physical layout info in new shield guide (zmkfirmware#2827)

    docs: Inline simple physical layouts in new shield guide

    docs: Fix broken anchor in module creation

    docs: Make physical layout transform label consistent and comment

commit 9d234cb
Author: Cem Aksoylar <[email protected]>
Date:   Mon Feb 17 11:55:42 2025 -0800

    docs: Make default keymap in new shield guide complete (zmkfirmware#2825)

    Co-authored-by: Nicolas Munnich <[email protected]>

commit e8ec9b6
Author: Nicolas Munnich <[email protected]>
Date:   Mon Feb 17 20:44:42 2025 +0100

    docs: Add "planned: import/export keymap" to the studio features page (zmkfirmware#2821)

commit d0d3134
Author: Nicolas Munnich <[email protected]>
Date:   Mon Feb 17 10:16:36 2025 +0100

    docs: Improved some links to modules (zmkfirmware#2822)

    Co-authored-by: Cem Aksoylar <[email protected]>

commit 5926269
Author: Nicolas Munnich <[email protected]>
Date:   Mon Feb 17 05:12:31 2025 +0100

    docs: Add KiCAD note and titles to physical layouts page (zmkfirmware#2823)

    docs: Note that Nick Coutsos' tool can import from KiCAD

    docs: Add titles to some code blocks in physical layouts

commit eeb8a00
Author: Nicolas Munnich <[email protected]>
Date:   Sat Feb 15 01:32:18 2025 +0100

    docs: Add a page on module creation (zmkfirmware#2456)

    Co-authored-by: Cem Aksoylar <[email protected]>
BionicRiddle pushed a commit to BionicRiddle/zmk that referenced this pull request Apr 17, 2025
refactor(split): Refactor split code for extension

Extract central/peripheral code to allow for plugging in alternate
transports, instead of tying all split logic to BT.

feat(split): Add full-duplex wired split support

* Depends on full-duplex hardware UART for communication.
* Supports all existing central commands/peripheral events, including
  sensors/inputs from peripherals.
* Only one wired split peripheral supported (for now)
* Relies on chosen `zmk,split-uart` referencing the UART device.

docs: Add wired split config docs.

Migrate split to its own dedicated config file, and add details
on wired split config.

Co-authored-by: Nicolas Munnich <[email protected]>

fix: Properly override stack size on RP2040

Move the system work queue stack size override on RP2040 ouf of
a `ZMK_BLE` conditional so it is properly applied generally for that
SoC.

---------

Co-authored-by: Nicolas Munnich <[email protected]>
jrsharp pushed a commit to jrsharp/zmk that referenced this pull request Nov 4, 2025
refactor(split): Refactor split code for extension

Extract central/peripheral code to allow for plugging in alternate
transports, instead of tying all split logic to BT.

feat(split): Add full-duplex wired split support

* Depends on full-duplex hardware UART for communication.
* Supports all existing central commands/peripheral events, including
  sensors/inputs from peripherals.
* Only one wired split peripheral supported (for now)
* Relies on chosen `zmk,split-uart` referencing the UART device.

docs: Add wired split config docs.

Migrate split to its own dedicated config file, and add details
on wired split config.

Co-authored-by: Nicolas Munnich <[email protected]>

fix: Properly override stack size on RP2040

Move the system work queue stack size override on RP2040 ouf of
a `ZMK_BLE` conditional so it is properly applied generally for that
SoC.

---------

Co-authored-by: Nicolas Munnich <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request split

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants